/* Mapbox GL JS is licensed under the 3-Clause BSD License. Full text of license: https://github.com/mapbox/mapbox-gl-js/blob/v1.3.2/LICENSE.txt */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.mapboxgl = factory()); }(this, function () { 'use strict'; /* eslint-disable */ var shared, worker, mapboxgl; // define gets called three times: one for each chunk. we rely on the order // they're imported to know which is which function define(_, chunk) { if (!shared) { shared = chunk; } else if (!worker) { worker = chunk; } else { var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);' var sharedChunk = {}; shared(sharedChunk); mapboxgl = chunk(sharedChunk); mapboxgl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' })); } } define(['exports'], function (exports) { 'use strict'; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function commonjsRequire () { throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); } function unwrapExports (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } function getCjsExportFromNamespace (n) { return n && n['default'] || n; } /* object-assign (c) Sindre Sorhus @license MIT */ 'use strict'; /* eslint-disable no-unused-vars */ var getOwnPropertySymbols = Object.getOwnPropertySymbols; var hasOwnProperty = Object.prototype.hasOwnProperty; var propIsEnumerable = Object.prototype.propertyIsEnumerable; function toObject(val) { if (val === null || val === undefined) { throw new TypeError('Object.assign cannot be called with null or undefined'); } return Object(val); } function shouldUseNative() { try { if (!Object.assign) { return false; } // Detect buggy property enumeration order in older V8 versions. // https://bugs.chromium.org/p/v8/issues/detail?id=4118 var test1 = new String('abc'); // eslint-disable-line no-new-wrappers test1[5] = 'de'; if (Object.getOwnPropertyNames(test1)[0] === '5') { return false; } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 var test2 = {}; for (var i = 0; i < 10; i++) { test2['_' + String.fromCharCode(i)] = i; } var order2 = Object.getOwnPropertyNames(test2).map(function (n) { return test2[n]; }); if (order2.join('') !== '0123456789') { return false; } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 var test3 = {}; 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { test3[letter] = letter; }); if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { return false; } return true; } catch (err) { // We don't expect any of the above to throw, but better to be safe. return false; } } var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { var arguments$1 = arguments; var from; var to = toObject(target); var symbols; for (var s = 1; s < arguments.length; s++) { from = Object(arguments$1[s]); for (var key in from) { if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } if (getOwnPropertySymbols) { symbols = getOwnPropertySymbols(from); for (var i = 0; i < symbols.length; i++) { if (propIsEnumerable.call(from, symbols[i])) { to[symbols[i]] = from[symbols[i]]; } } } } return to; }; var isBufferBrowser = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; }; var inherits_browser = createCommonjsModule(function (module) { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor; var TempCtor = function () {}; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; }; } }); var util = createCommonjsModule(function (module, exports) { // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { var arguments$1 = arguments; if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments$1[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') { return '%'; } if (i >= len) { return x; } switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) { debugEnviron = process.env.NODE_DEBUG || ''; } set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) { ctx.depth = arguments[2]; } if (arguments.length >= 4) { ctx.colors = arguments[3]; } if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) { ctx.showHidden = false; } if (isUndefined(ctx.depth)) { ctx.depth = 2; } if (isUndefined(ctx.colors)) { ctx.colors = false; } if (isUndefined(ctx.customInspect)) { ctx.customInspect = true; } if (ctx.colors) { ctx.stylize = stylizeWithColor; } return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) { return ctx.stylize('undefined', 'undefined'); } if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) { return ctx.stylize('' + value, 'number'); } if (isBoolean(value)) { return ctx.stylize('' + value, 'boolean'); } // For some reason typeof null is "object", so special case here. if (isNull(value)) { return ctx.stylize('null', 'null'); } } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) { numLinesEst++; } return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = isBufferBrowser; function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = inherits_browser; exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) { return origin; } var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }); var util_1 = util.format; var util_2 = util.deprecate; var util_3 = util.debuglog; var util_4 = util.inspect; var util_5 = util.isArray; var util_6 = util.isBoolean; var util_7 = util.isNull; var util_8 = util.isNullOrUndefined; var util_9 = util.isNumber; var util_10 = util.isString; var util_11 = util.isSymbol; var util_12 = util.isUndefined; var util_13 = util.isRegExp; var util_14 = util.isObject; var util_15 = util.isDate; var util_16 = util.isError; var util_17 = util.isFunction; var util_18 = util.isPrimitive; var util_19 = util.isBuffer; var util_20 = util.log; var util_21 = util.inherits; var util_22 = util._extend; var assert_1 = createCommonjsModule(function (module) { 'use strict'; // compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js // original notice: /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ function compare(a, b) { if (a === b) { return 0; } var x = a.length; var y = b.length; for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i]; y = b[i]; break; } } if (x < y) { return -1; } if (y < x) { return 1; } return 0; } function isBuffer(b) { if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { return global.Buffer.isBuffer(b); } return !!(b != null && b._isBuffer); } // based on node assert, original notice: // NB: The URL to the CommonJS spec is kept just for tradition. // node-assert has evolved a lot since then, both in API and behavior. // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the 'Software'), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. var hasOwn = Object.prototype.hasOwnProperty; var pSlice = Array.prototype.slice; var functionsHaveNames = (function () { return function foo() {}.name === 'foo'; }()); function pToString (obj) { return Object.prototype.toString.call(obj); } function isView(arrbuf) { if (isBuffer(arrbuf)) { return false; } if (typeof global.ArrayBuffer !== 'function') { return false; } if (typeof ArrayBuffer.isView === 'function') { return ArrayBuffer.isView(arrbuf); } if (!arrbuf) { return false; } if (arrbuf instanceof DataView) { return true; } if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { return true; } return false; } // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. var assert = module.exports = ok; // 2. The AssertionError is defined in assert. // new assert.AssertionError({ message: message, // actual: actual, // expected: expected }) var regex = /\s*function\s+([^\(\s]*)\s*/; // based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js function getName(func) { if (!util.isFunction(func)) { return; } if (functionsHaveNames) { return func.name; } var str = func.toString(); var match = str.match(regex); return match && match[1]; } assert.AssertionError = function AssertionError(options) { this.name = 'AssertionError'; this.actual = options.actual; this.expected = options.expected; this.operator = options.operator; if (options.message) { this.message = options.message; this.generatedMessage = false; } else { this.message = getMessage(this); this.generatedMessage = true; } var stackStartFunction = options.stackStartFunction || fail; if (Error.captureStackTrace) { Error.captureStackTrace(this, stackStartFunction); } else { // non v8 browsers so we can have a stacktrace var err = new Error(); if (err.stack) { var out = err.stack; // try to strip useless frames var fn_name = getName(stackStartFunction); var idx = out.indexOf('\n' + fn_name); if (idx >= 0) { // once we have located the function frame // we need to strip out everything before it (and its line) var next_line = out.indexOf('\n', idx + 1); out = out.substring(next_line + 1); } this.stack = out; } } }; // assert.AssertionError instanceof Error util.inherits(assert.AssertionError, Error); function truncate(s, n) { if (typeof s === 'string') { return s.length < n ? s : s.slice(0, n); } else { return s; } } function inspect(something) { if (functionsHaveNames || !util.isFunction(something)) { return util.inspect(something); } var rawname = getName(something); var name = rawname ? ': ' + rawname : ''; return '[Function' + name + ']'; } function getMessage(self) { return truncate(inspect(self.actual), 128) + ' ' + self.operator + ' ' + truncate(inspect(self.expected), 128); } // At present only the three keys mentioned above are used and // understood by the spec. Implementations or sub modules can pass // other keys to the AssertionError's constructor - they will be // ignored. // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. function fail(actual, expected, message, operator, stackStartFunction) { throw new assert.AssertionError({ message: message, actual: actual, expected: expected, operator: operator, stackStartFunction: stackStartFunction }); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, !!guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. function ok(value, message) { if (!value) { fail(value, true, message, '==', assert.ok); } } assert.ok = ok; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); assert.equal = function equal(actual, expected, message) { if (actual != expected) { fail(actual, expected, message, '==', assert.equal); } }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); assert.notEqual = function notEqual(actual, expected, message) { if (actual == expected) { fail(actual, expected, message, '!=', assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); assert.deepEqual = function deepEqual(actual, expected, message) { if (!_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'deepEqual', assert.deepEqual); } }; assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { if (!_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); } }; function _deepEqual(actual, expected, strict, memos) { // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (isBuffer(actual) && isBuffer(expected)) { return compare(actual, expected) === 0; // 7.2. If the expected value is a Date object, the actual value is // equivalent if it is also a Date object that refers to the same time. } else if (util.isDate(actual) && util.isDate(expected)) { return actual.getTime() === expected.getTime(); // 7.3 If the expected value is a RegExp object, the actual value is // equivalent if it is also a RegExp object with the same source and // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). } else if (util.isRegExp(actual) && util.isRegExp(expected)) { return actual.source === expected.source && actual.global === expected.global && actual.multiline === expected.multiline && actual.lastIndex === expected.lastIndex && actual.ignoreCase === expected.ignoreCase; // 7.4. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if ((actual === null || typeof actual !== 'object') && (expected === null || typeof expected !== 'object')) { return strict ? actual === expected : actual == expected; // If both values are instances of typed arrays, wrap their underlying // ArrayBuffers in a Buffer each to increase performance // This optimization requires the arrays to have the same type as checked by // Object.prototype.toString (aka pToString). Never perform binary // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their // bit patterns are not identical. } else if (isView(actual) && isView(expected) && pToString(actual) === pToString(expected) && !(actual instanceof Float32Array || actual instanceof Float64Array)) { return compare(new Uint8Array(actual.buffer), new Uint8Array(expected.buffer)) === 0; // 7.5 For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else if (isBuffer(actual) !== isBuffer(expected)) { return false; } else { memos = memos || {actual: [], expected: []}; var actualIndex = memos.actual.indexOf(actual); if (actualIndex !== -1) { if (actualIndex === memos.expected.indexOf(expected)) { return true; } } memos.actual.push(actual); memos.expected.push(expected); return objEquiv(actual, expected, strict, memos); } } function isArguments(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } function objEquiv(a, b, strict, actualVisitedObjects) { if (a === null || a === undefined || b === null || b === undefined) { return false; } // if one is a primitive, the other must be same if (util.isPrimitive(a) || util.isPrimitive(b)) { return a === b; } if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) { return false; } var aIsArgs = isArguments(a); var bIsArgs = isArguments(b); if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) { return false; } if (aIsArgs) { a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b, strict); } var ka = objectKeys(a); var kb = objectKeys(b); var key, i; // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length !== kb.length) { return false; } //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] !== kb[i]) { return false; } } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) { return false; } } return true; } // 8. The non-equivalence assertion tests for any deep inequality. // assert.notDeepEqual(actual, expected, message_opt); assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if (_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); } }; assert.notDeepStrictEqual = notDeepStrictEqual; function notDeepStrictEqual(actual, expected, message) { if (_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); } } // 9. The strict equality assertion tests strict equality, as determined by ===. // assert.strictEqual(actual, expected, message_opt); assert.strictEqual = function strictEqual(actual, expected, message) { if (actual !== expected) { fail(actual, expected, message, '===', assert.strictEqual); } }; // 10. The strict non-equality assertion tests for strict inequality, as // determined by !==. assert.notStrictEqual(actual, expected, message_opt); assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (actual === expected) { fail(actual, expected, message, '!==', assert.notStrictEqual); } }; function expectedException(actual, expected) { if (!actual || !expected) { return false; } if (Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); } try { if (actual instanceof expected) { return true; } } catch (e) { // Ignore. The instanceof check doesn't work for arrow functions. } if (Error.isPrototypeOf(expected)) { return false; } return expected.call({}, actual) === true; } function _tryBlock(block) { var error; try { block(); } catch (e) { error = e; } return error; } function _throws(shouldThrow, block, expected, message) { var actual; if (typeof block !== 'function') { throw new TypeError('"block" argument must be a function'); } if (typeof expected === 'string') { message = expected; expected = null; } actual = _tryBlock(block); message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + (message ? ' ' + message : '.'); if (shouldThrow && !actual) { fail(actual, expected, 'Missing expected exception' + message); } var userProvidedMessage = typeof message === 'string'; var isUnwantedException = !shouldThrow && util.isError(actual); var isUnexpectedException = !shouldThrow && actual && !expected; if ((isUnwantedException && userProvidedMessage && expectedException(actual, expected)) || isUnexpectedException) { fail(actual, expected, 'Got unwanted exception' + message); } if ((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) { throw actual; } } // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); assert.throws = function(block, /*optional*/error, /*optional*/message) { _throws(true, block, error, message); }; // EXTENSION! This is annoying to write outside this module. assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { _throws(false, block, error, message); }; assert.ifError = function(err) { if (err) { throw err; } }; // Expose a strict only variant of assert function strict(value, message) { if (!value) { fail(value, true, message, '==', strict); } } assert.strict = objectAssign(strict, assert, { equal: assert.strictEqual, deepEqual: assert.deepStrictEqual, notEqual: assert.notStrictEqual, notDeepEqual: assert.notDeepStrictEqual }); assert.strict.strict = assert.strict; var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { if (hasOwn.call(obj, key)) { keys.push(key); } } return keys; }; }); var name = "mapbox-gl"; var description = "A WebGL interactive maps library"; var version = "1.3.2"; var main = "dist/mapbox-gl.js"; var style = "dist/mapbox-gl.css"; var license = "SEE LICENSE IN LICENSE.txt"; var repository = { type: "git", url: "git://github.com/mapbox/mapbox-gl-js.git" }; var engines = { node: ">=6.4.0" }; var dependencies = { "@mapbox/geojson-rewind": "^0.4.0", "@mapbox/geojson-types": "^1.0.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/mapbox-gl-supported": "^1.4.0", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^1.1.0", "@mapbox/unitbezier": "^0.0.0", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", csscolorparser: "~1.0.2", earcut: "^2.1.5", "geojson-vt": "^3.2.1", "gl-matrix": "^3.0.0", "grid-index": "^1.1.0", minimist: "0.0.8", "murmurhash-js": "^1.0.0", pbf: "^3.0.5", potpack: "^1.0.1", quickselect: "^2.0.0", rw: "^1.3.3", supercluster: "^6.0.1", tinyqueue: "^2.0.0", "vt-pbf": "^3.1.1" }; var devDependencies = { "@mapbox/flow-remove-types": "^1.3.0-await.upstream.2", "@mapbox/gazetteer": "^3.1.2", "@mapbox/mapbox-gl-rtl-text": "^0.2.1", "@mapbox/mapbox-gl-test-suite": "file:test/integration", "@octokit/rest": "^15.15.1", "babel-eslint": "^10.0.1", browserify: "^16.2.3", d3: "^4.12.0", documentation: "~12.1.1", ejs: "^2.5.7", eslint: "^5.15.3", "eslint-config-mourner": "^3.0.0", "eslint-plugin-flowtype": "^3.9.1", "eslint-plugin-html": "^5.0.5", "eslint-plugin-import": "^2.16.0", "eslint-plugin-react": "^7.12.4", esm: "~3.0.84", "flow-bin": "^0.100.0", gl: "~4.3.3", glob: "^7.1.4", "is-builtin-module": "^3.0.0", jsdom: "^13.0.0", "json-stringify-pretty-compact": "^2.0.0", jsonwebtoken: "^8.3.0", "mock-geolocation": "^1.0.11", "npm-run-all": "^4.1.5", nyc: "^13.3.0", pirates: "^4.0.1", pngjs: "^3.4.0", "postcss-cli": "^6.1.2", "postcss-inline-svg": "^3.1.1", "pretty-bytes": "^5.1.0", react: "^16.8.6", "react-dom": "^16.8.6", request: "^2.88.0", rollup: "^1.16.4", "rollup-plugin-buble": "^0.19.8", "rollup-plugin-commonjs": "^10.0.1", "rollup-plugin-json": "^4.0.0", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-replace": "^2.2.0", "rollup-plugin-sourcemaps": "^0.4.2", "rollup-plugin-terser": "^5.0.0", "rollup-plugin-unassert": "^0.3.0", sinon: "^7.3.2", st: "^1.2.2", stylelint: "^9.10.1", "stylelint-config-standard": "^18.2.0", tap: "~12.4.1" }; 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 esm = true; var scripts = { "build-dev": "rollup -c --environment BUILD:dev", "watch-dev": "rollup -c --environment BUILD:dev --watch", "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-flow-types": "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-docs": "run-s build-prod-min build-css build-docs && NODE_OPTIONS=\"--max_old_space_size=2048\" DEPLOY_ENV=local batfish start", lint: "eslint --cache --ignore-path .gitignore src test bench debug/*.html", "lint-docs": "documentation lint src/index.js", "lint-css": "stylelint 'src/css/mapbox-gl.css'", test: "run-s lint lint-css lint-docs 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-render": "node --max-old-space-size=2048 test/render.test.js", "test-query": "node test/query.test.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 build-flow-types build-dev build-prod-min build-prod build-csp build-css build-style-spec test-build", codegen: "build/run-node build/generate-style-code.js && build/run-node build/generate-struct-arrays.js" }; var files = [ "build/", "dist/", "flow-typed/", "src/", ".flowconfig" ]; var _package = { name: name, description: description, version: version, main: main, style: style, license: license, repository: repository, engines: engines, dependencies: dependencies, devDependencies: devDependencies, browser: browser, esm: esm, 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. * * 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; }; // // /** * Deeply compares two object literals. * * @private */ function deepEqual(a , b ) { if (Array.isArray(a)) { if (!Array.isArray(b) || a.length !== b.length) { return false; } for (var i = 0; i < a.length; i++) { if (!deepEqual(a[i], b[i])) { return false; } } return true; } if (typeof a === 'object' && a !== null && b !== null) { if (!(typeof b === 'object')) { return false; } var keys = Object.keys(a); if (keys.length !== Object.keys(b).length) { return false; } for (var key in a) { if (!deepEqual(a[key], b[key])) { return false; } } return true; } return a === b; } // /** * @module 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; } var t2 = t * t, t3 = t2 * t; return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); } /** * Given given (x, y), (x1, y1) control points for a bezier curve, * return a function that interpolates along that curve. * * @param p1x control point 1 x coordinate * @param p1y control point 1 y coordinate * @param p2x control point 2 x coordinate * @param p2y control point 2 y coordinate * @private */ function bezier(p1x , p1y , p2x , p2y ) { var bezier = new unitbezier(p1x, p1y, p2x, p2y); return function(t ) { return bezier.solve(t); }; } /** * A default bezier-curve powered easing function with * control points (0.25, 0.1) and (0.25, 1) * * @private */ var ease = bezier(0.25, 0.1, 0.25, 1); /** * constrain n to the given range via min + max * * @param n value * @param min the minimum value to be returned * @param max the maximum value to be returned * @returns the clamped value * @private */ function clamp(n , min , max ) { return Math.min(max, Math.max(min, n)); } /** * constrain n to the given range, excluding the minimum, via modular arithmetic * * @param n value * @param min the minimum value to be returned, exclusive * @param max the maximum value to be returned, inclusive * @returns constrained number * @private */ function wrap(n , min , max ) { var d = max - min; var w = ((n - min) % d + d) % d + min; return (w === min) ? max : w; } /* * Call an asynchronous function on an array of arguments, * calling `callback` with the completed results of all calls. * * @param array input to each call of the async function. * @param fn an async function with signature (data, callback) * @param callback a callback run after all async work is done. * called with an array, containing the results of each async call. * @private */ function asyncAll ( array , fn , callback ) { if (!array.length) { return callback(null, []); } var remaining = array.length; var results = new Array(array.length); var error = null; array.forEach(function (item, i) { fn(item, function (err, result) { if (err) { error = err; } results[i] = ((result ) ); // https://github.com/facebook/flow/issues/2123 if (--remaining === 0) { callback(error, results); } }); }); } /* * Polyfill for Object.values. Not fully spec compliant, but we don't * need it to be. * * @private */ function values (obj ) { var result = []; for (var k in obj) { result.push(obj[k]); } return result; } /* * Compute the difference between the keys in one object and the keys * in another object. * * @returns keys difference * @private */ function keysDifference (obj , other ) { var difference = []; for (var i in obj) { if (!(i in other)) { difference.push(i); } } return difference; } /** * Given a destination object and optionally many source objects, * copy all properties from the source objects into the destination. * The last source object given overrides properties from previous * source objects. * * @param dest destination object * @param sources sources from which properties are pulled * @private */ function extend(dest ) { var sources = [], len = arguments.length - 1; while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ]; for (var i = 0, list = sources; i < list.length; i += 1) { var src = list[i]; for (var k in src) { dest[k] = src[k]; } } return dest; } /** * Given an object and a number of properties as strings, return version * of that object with only those properties. * * @param src the object * @param properties an array of property names chosen * to appear on the resulting object. * @returns object with limited properties. * @example * var foo = { name: 'Charlie', age: 10 }; * var justName = pick(foo, ['name']); * // justName = { name: 'Charlie' } * @private */ function pick(src , properties ) { var result = {}; for (var i = 0; i < properties.length; i++) { var k = properties[i]; if (k in src) { result[k] = src[k]; } } return result; } var id = 1; /** * Return a unique numeric id, starting at 1 and incrementing with * each call. * * @returns unique numeric id. * @private */ function uniqueId() { return id++; } /** * 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); } return b(); } /** * 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; } /** * 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(function (fn) { if (!context[fn]) { return; } context[fn] = context[fn].bind(context); }); } /** * Determine if a string ends with a particular substring * * @private */ function endsWith(string , suffix ) { return string.indexOf(suffix, string.length - suffix.length) !== -1; } /** * Create an object by mapping all the values of an existing object while * preserving their keys. * * @private */ function mapObject(input , iterator , context ) { var output = {}; for (var key in input) { output[key] = iterator.call(context || this, input[key], key, input); } return output; } /** * Create an object by filtering out values of an existing object. * * @private */ function filterObject(input , iterator , context ) { var output = {}; for (var 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 (input ) { if (Array.isArray(input)) { return input.map(clone); } else if (typeof input === 'object' && input) { return ((mapObject(input, clone) ) ); } else { return input; } } /** * Check if two arrays have at least one common element. * * @private */ function arraysIntersect (a , b ) { for (var l = 0; l < a.length; l++) { if (b.indexOf(a[l]) >= 0) { return true; } } return false; } /** * Print a warning message to the console and ensure duplicate warning messages * are not printed. * * @private */ var warnOnceHistory = {}; 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; } } /** * 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); } /** * 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 ) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1 = (void 0), p2 = (void 0); i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; } /** * Detects closed polygons, first + last point are equal * * @private * @param points array of points * @return true if the points are a closed polygon */ 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; } var p1 = points[0]; var p2 = points[points.length - 1]; if (Math.abs(p1.x - p2.x) > 0 || Math.abs(p1.y - p2.y) > 0) { return false; } // polygon simplification can produce polygons with zero area and more than 3 points return Math.abs(calculateSignedArea(points)) > 0.01; } /** * Converts spherical coordinates to cartesian coordinates. * * @private * @param spherical Spherical coordinates, in [radial, azimuthal, polar] * @return cartesian coordinates in [x, y, z] */ function sphericalToCartesian(ref ) { var r = ref[0]; var azimuthal = ref[1]; var polar = ref[2]; // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2): // correct for that here azimuthal += 90; // Convert azimuthal and polar angles to radians azimuthal *= Math.PI / 180; polar *= Math.PI / 180; return { x: r * Math.cos(azimuthal) * Math.sin(polar), y: r * Math.sin(azimuthal) * Math.sin(polar), z: r * Math.cos(polar) }; } /** * Parses data from 'Cache-Control' headers. * * @private * @param cacheControl Value of 'Cache-Control' header * @return object containing parsed header info. */ function parseCacheControl(cacheControl ) { // Taken from [Wreck](https://github.com/hapijs/wreck) var re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; var header = {}; cacheControl.replace(re, function ($0, $1, $2, $3) { var value = $2 || $3; header[$1] = value ? value.toLowerCase() : true; return ''; }); if (header['max-age']) { var maxAge = parseInt(header['max-age'], 10); if (isNaN(maxAge)) { delete header['max-age']; } else { header['max-age'] = maxAge; } } return header; } function storageAvailable(type ) { try { var storage = self[type]; storage.setItem('_mapbox_test_', 1); storage.removeItem('_mapbox_test_'); return true; } catch (e) { return false; } } // 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 self.btoa( encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line } ) ); } // Unicode compliant decoder for base64-encoded strings function b64DecodeUnicode(str ) { return decodeURIComponent(self.atob(str).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line }).join('')); } // strict var now = self.performance && self.performance.now ? self.performance.now.bind(self.performance) : Date.now.bind(Date); var raf = self.requestAnimationFrame || self.mozRequestAnimationFrame || self.webkitRequestAnimationFrame || self.msRequestAnimationFrame; var cancel = self.cancelAnimationFrame || self.mozCancelAnimationFrame || self.webkitCancelAnimationFrame || self.msCancelAnimationFrame; var linkEl; var reducedMotionQuery ; /** * @private */ var exported = { /** * Provides a function that outputs milliseconds: either performance.now() * or a fallback to Date.now() */ now: now, frame: function frame(fn ) { var frame = raf(fn); return { cancel: function () { return cancel(frame); } }; }, getImageData: function getImageData(img ) { var canvas = self.document.createElement('canvas'); var context = canvas.getContext('2d'); if (!context) { throw new Error('failed to create canvas 2d context'); } canvas.width = img.width; canvas.height = img.height; context.drawImage(img, 0, 0, img.width, img.height); return context.getImageData(0, 0, img.width, img.height); }, resolveURL: function resolveURL(path ) { if (!linkEl) { linkEl = self.document.createElement('a'); } linkEl.href = path; return linkEl.href; }, hardwareConcurrency: self.navigator.hardwareConcurrency || 4, get devicePixelRatio() { return self.devicePixelRatio; }, get prefersReducedMotion() { if (!self.matchMedia) { return false; } //Lazily initialize media query if (reducedMotionQuery == null) { reducedMotionQuery = self.matchMedia('(prefers-reduced-motion: reduce)'); } return reducedMotionQuery.matches; }, }; // strict var config = { API_URL: 'https://api.mapbox.com', 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; } }, FEEDBACK_URL: 'https://apps.mapbox.com/feedback', REQUIRE_ACCESS_TOKEN: true, ACCESS_TOKEN: null, MAX_PARALLEL_IMAGE_REQUESTS: 16 }; // strict var exported$1 = { supported: false, testSupport: testSupport }; var glForTesting; var webpCheckComplete = false; var webpImgTest; var webpImgTestOnloadComplete = false; if (self.document) { webpImgTest = self.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='; } function testSupport(gl ) { if (webpCheckComplete || !webpImgTest) { return; } // 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 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 var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); 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); webpCheckComplete = true; } // /***** START WARNING - IF YOU USE THIS CODE WITH MAPBOX MAPPING APIS, REMOVAL OR * MODIFICATION OF THE FOLLOWING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ****** * The following code is used to access Mapbox's Mapping APIs. Removal or modification * of this code when used with Mapbox's Mapping APIs 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/ ******************************************************************************/ var SKU_ID = '01'; function createSkuToken() { // SKU_ID and TOKEN_VERSION are specified by an internal schema and should not change var TOKEN_VERSION = '1'; var base62chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // sessionRandomizer is a randomized 10-digit base-62 number var sessionRandomizer = ''; for (var i = 0; i < 10; i++) { sessionRandomizer += base62chars[Math.floor(Math.random() * 62)]; } var expiration = 12 * 60 * 60 * 1000; // 12 hours var token = [TOKEN_VERSION, SKU_ID, sessionRandomizer].join(''); var tokenExpiresAt = Date.now() + expiration; return { token: token, tokenExpiresAt: tokenExpiresAt }; } /***** END WARNING - REMOVAL OR MODIFICATION OF THE PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ // var RequestManager = function RequestManager(transformRequestFn , customAccessToken ) { this._transformRequestFn = transformRequestFn; this._customAccessToken = customAccessToken; this._createSkuToken(); }; RequestManager.prototype._createSkuToken = function _createSkuToken () { var skuToken = createSkuToken(); this._skuToken = skuToken.token; this._skuTokenExpiresAt = skuToken.tokenExpiresAt; }; RequestManager.prototype._isSkuTokenExpired = function _isSkuTokenExpired () { return Date.now() > this._skuTokenExpiresAt; }; RequestManager.prototype.transformRequest = function transformRequest (url , type ) { if (this._transformRequestFn) { return this._transformRequestFn(url, type) || {url: url}; } return {url: url}; }; RequestManager.prototype.normalizeStyleURL = function normalizeStyleURL (url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/styles/v1" + (urlObject.path); return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); }; RequestManager.prototype.normalizeGlyphsURL = function normalizeGlyphsURL (url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/fonts/v1" + (urlObject.path); return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); }; RequestManager.prototype.normalizeSourceURL = function normalizeSourceURL (url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/v4/" + (urlObject.authority) + ".json"; // TileJSON requests need a secure flag appended to their URLs so // that the server knows to send SSL-ified resource references. urlObject.params.push('secure'); return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); }; RequestManager.prototype.normalizeSpriteURL = function normalizeSpriteURL (url , format , extension , accessToken ) { var urlObject = parseUrl(url); if (!isMapboxURL(url)) { urlObject.path += "" + format + extension; return formatUrl(urlObject); } urlObject.path = "/styles/v1" + (urlObject.path) + "/sprite" + format + extension; return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); }; RequestManager.prototype.normalizeTileURL = function normalizeTileURL (tileURL , sourceURL , tileSize ) { if (this._isSkuTokenExpired()) { this._createSkuToken(); } if (!sourceURL || !isMapboxURL(sourceURL)) { return tileURL; } var urlObject = parseUrl(tileURL); var imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/; var tileURLAPIPrefixRe = /^.+\/v4\//; // The v4 mapbox tile API supports 512x512 image tiles only when @2x // is appended to the tile URL. If `tileSize: 512` is specified for // a Mapbox raster source force the @2x suffix even if a non hidpi device. var suffix = exported.devicePixelRatio >= 2 || tileSize === 512 ? '@2x' : ''; var extension = exported$1.supported ? '.webp' : '$1'; urlObject.path = urlObject.path.replace(imageExtensionRe, ("" + suffix + extension)); urlObject.path = urlObject.path.replace(tileURLAPIPrefixRe, '/'); urlObject.path = "/v4" + (urlObject.path); if (config.REQUIRE_ACCESS_TOKEN && (config.ACCESS_TOKEN || this._customAccessToken) && this._skuToken) { urlObject.params.push(("sku=" + (this._skuToken))); } return this._makeAPIURL(urlObject, this._customAccessToken); }; RequestManager.prototype.canonicalizeTileURL = function canonicalizeTileURL (url ) { var version = "/v4/"; // matches any file extension specified by a dot and one or more alphanumeric characters var extensionRe = /\.[\w]+$/; var urlObject = parseUrl(url); // Make sure that we are dealing with a valid Mapbox tile URL. // Has to begin with /v4/, with a valid filename + extension if (!urlObject.path.match(/(^\/v4\/)/) || !urlObject.path.match(extensionRe)) { // Not a proper Mapbox tile URL. return url; } // Reassemble the canonical URL from the parts we've parsed before. var result = "mapbox://tiles/"; result += urlObject.path.replace(version, ''); // Append the query string, minus the access token parameter. var params = urlObject.params.filter(function (p) { return !p.match(/^access_token=/); }); if (params.length) { result += "?" + (params.join('&')); } return result; }; RequestManager.prototype.canonicalizeTileset = function canonicalizeTileset (tileJSON , sourceURL ) { if (!isMapboxURL(sourceURL)) { return tileJSON.tiles || []; } var canonical = []; for (var i = 0, list = tileJSON.tiles; i < list.length; i += 1) { var url = list[i]; var canonicalUrl = this.canonicalizeTileURL(url); canonical.push(canonicalUrl); } return canonical; }; RequestManager.prototype._makeAPIURL = function _makeAPIURL (urlObject , accessToken ) { var help = 'See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; var apiUrlObject = parseUrl(config.API_URL); urlObject.protocol = apiUrlObject.protocol; urlObject.authority = apiUrlObject.authority; if (apiUrlObject.path !== '/') { urlObject.path = "" + (apiUrlObject.path) + (urlObject.path); } if (!config.REQUIRE_ACCESS_TOKEN) { return formatUrl(urlObject); } accessToken = accessToken || config.ACCESS_TOKEN; if (!accessToken) { throw new Error(("An API access token is required to use Mapbox GL. " + help)); } if (accessToken[0] === 's') { throw new Error(("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). " + help)); } urlObject.params = urlObject.params.filter(function (d) { return d.indexOf('access_token') === -1; }); urlObject.params.push(("access_token=" + accessToken)); return formatUrl(urlObject); }; function isMapboxURL(url ) { return url.indexOf('mapbox:') === 0; } var mapboxHTTPURLRe = /^((https?:)?\/\/)?([^\/]+\.)?mapbox\.c(n|om)(\/|\?|$)/i; function isMapboxHTTPURL(url ) { return mapboxHTTPURLRe.test(url); } function hasCacheDefeatingSku(url ) { return url.indexOf('sku=') > 0 && isMapboxHTTPURL(url); } var urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/; function parseUrl(url ) { var parts = url.match(urlRe); if (!parts) { throw new Error('Unable to parse URL object'); } return { protocol: parts[1], authority: parts[2], path: parts[3] || '/', params: parts[4] ? parts[4].split('&') : [] }; } function formatUrl(obj ) { var params = obj.params.length ? ("?" + (obj.params.join('&'))) : ''; return ((obj.protocol) + "://" + (obj.authority) + (obj.path) + params); } var telemEventKey = 'mapbox.eventData'; function parseAccessToken(accessToken ) { if (!accessToken) { return null; } var parts = accessToken.split('.'); if (!parts || parts.length !== 3) { return null; } try { var jsonData = JSON.parse(b64DecodeUnicode(parts[1])); return jsonData; } catch (e) { return null; } } var TelemetryEvent = function TelemetryEvent(type ) { this.type = type; this.anonId = null; this.eventData = {}; this.queue = []; this.pendingRequest = null; }; TelemetryEvent.prototype.getStorageKey = function getStorageKey (domain ) { var tokenData = parseAccessToken(config.ACCESS_TOKEN); var u = ''; if (tokenData && tokenData['u']) { u = b64EncodeUnicode(tokenData['u']); } else { u = config.ACCESS_TOKEN || ''; } return domain ? (telemEventKey + "." + domain + ":" + u) : (telemEventKey + ":" + u); }; TelemetryEvent.prototype.fetchEventData = function fetchEventData () { var isLocalStorageAvailable = storageAvailable('localStorage'); var storageKey = this.getStorageKey(); var uuidKey = this.getStorageKey('uuid'); if (isLocalStorageAvailable) { //Retrieve cached data try { var data = self.localStorage.getItem(storageKey); if (data) { this.eventData = JSON.parse(data); } var uuid = self.localStorage.getItem(uuidKey); if (uuid) { this.anonId = uuid; } } catch (e) { warnOnce('Unable to read from LocalStorage'); } } }; TelemetryEvent.prototype.saveEventData = function saveEventData () { var isLocalStorageAvailable = storageAvailable('localStorage'); var storageKey = this.getStorageKey(); var uuidKey = this.getStorageKey('uuid'); if (isLocalStorageAvailable) { try { self.localStorage.setItem(uuidKey, this.anonId); if (Object.keys(this.eventData).length >= 1) { self.localStorage.setItem(storageKey, JSON.stringify(this.eventData)); } } catch (e) { warnOnce('Unable to write to LocalStorage'); } } }; TelemetryEvent.prototype.processRequests = function processRequests (_ ) {}; /* * 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 */ TelemetryEvent.prototype.postEvent = function postEvent (timestamp , additionalPayload , callback , customAccessToken ) { var this$1 = this; if (!config.EVENTS_URL) { return; } var eventsUrlObject = parseUrl(config.EVENTS_URL); eventsUrlObject.params.push(("access_token=" + (customAccessToken || config.ACCESS_TOKEN || ''))); var payload = { event: this.type, created: new Date(timestamp).toISOString(), sdkIdentifier: 'mapbox-gl-js', sdkVersion: version, skuId: SKU_ID, userId: this.anonId }; var finalPayload = additionalPayload ? extend(payload, additionalPayload) : payload; var request = { url: formatUrl(eventsUrlObject), headers: { 'Content-Type': 'text/plain' //Skip the pre-flight OPTIONS request }, body: JSON.stringify([finalPayload]) }; this.pendingRequest = postData(request, function (error) { this$1.pendingRequest = null; callback(error); this$1.saveEventData(); this$1.processRequests(customAccessToken); }); }; TelemetryEvent.prototype.queueRequest = function queueRequest (event , customAccessToken ) { this.queue.push(event); this.processRequests(customAccessToken); }; var MapLoadEvent = /*@__PURE__*/(function (TelemetryEvent) { function MapLoadEvent() { TelemetryEvent.call(this, 'map.load'); this.success = {}; this.skuToken = ''; } if ( TelemetryEvent ) MapLoadEvent.__proto__ = TelemetryEvent; MapLoadEvent.prototype = Object.create( TelemetryEvent && TelemetryEvent.prototype ); MapLoadEvent.prototype.constructor = MapLoadEvent; MapLoadEvent.prototype.postMapLoadEvent = function postMapLoadEvent (tileUrls , mapId , skuToken , customAccessToken ) { //Enabled only when Mapbox Access Token is set and a source uses // mapbox tiles. this.skuToken = skuToken; if (config.EVENTS_URL && customAccessToken || config.ACCESS_TOKEN && Array.isArray(tileUrls) && tileUrls.some(function (url) { return isMapboxURL(url) || isMapboxHTTPURL(url); })) { this.queueRequest({id: mapId, timestamp: Date.now()}, customAccessToken); } }; MapLoadEvent.prototype.processRequests = function processRequests (customAccessToken ) { var this$1 = this; if (this.pendingRequest || this.queue.length === 0) { return; } var ref = this.queue.shift(); var id = ref.id; var timestamp = ref.timestamp; // Only one load event should fire per map if (id && this.success[id]) { return; } if (!this.anonId) { this.fetchEventData(); } if (!validateUuid(this.anonId)) { this.anonId = uuid(); } this.postEvent(timestamp, {skuToken: this.skuToken}, function (err) { if (!err) { if (id) { this$1.success[id] = true; } } }, customAccessToken); }; return MapLoadEvent; }(TelemetryEvent)); var TurnstileEvent = /*@__PURE__*/(function (TelemetryEvent) { function TurnstileEvent(customAccessToken ) { TelemetryEvent.call(this, 'appUserTurnstile'); this._customAccessToken = customAccessToken; } if ( TelemetryEvent ) TurnstileEvent.__proto__ = TelemetryEvent; TurnstileEvent.prototype = Object.create( TelemetryEvent && TelemetryEvent.prototype ); TurnstileEvent.prototype.constructor = TurnstileEvent; TurnstileEvent.prototype.postTurnstileEvent = function 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(function (url) { return isMapboxURL(url) || isMapboxHTTPURL(url); })) { this.queueRequest(Date.now(), customAccessToken); } }; TurnstileEvent.prototype.processRequests = function processRequests (customAccessToken ) { var this$1 = this; if (this.pendingRequest || this.queue.length === 0) { return; } if (!this.anonId || !this.eventData.lastSuccess || !this.eventData.tokenU) { //Retrieve cached data this.fetchEventData(); } var tokenData = parseAccessToken(config.ACCESS_TOKEN); var tokenU = tokenData ? tokenData['u'] : config.ACCESS_TOKEN; //Reset event data cache if the access token owner changed. var dueForEvent = tokenU !== this.eventData.tokenU; if (!validateUuid(this.anonId)) { this.anonId = uuid(); dueForEvent = true; } var nextUpdate = this.queue.shift(); // Record turnstile event once per calendar day. if (this.eventData.lastSuccess) { var lastUpdate = new Date(this.eventData.lastSuccess); var nextDate = new Date(nextUpdate); var daysElapsed = (nextUpdate - this.eventData.lastSuccess) / (24 * 60 * 60 * 1000); dueForEvent = dueForEvent || daysElapsed >= 1 || daysElapsed < -1 || lastUpdate.getDate() !== nextDate.getDate(); } else { dueForEvent = true; } if (!dueForEvent) { return this.processRequests(); } this.postEvent(nextUpdate, {"enabled.telemetry": false}, function (err) { if (!err) { this$1.eventData.lastSuccess = nextUpdate; this$1.eventData.tokenU = tokenU; } }, customAccessToken); }; return TurnstileEvent; }(TelemetryEvent)); var turnstileEvent_ = new TurnstileEvent(); var postTurnstileEvent = turnstileEvent_.postTurnstileEvent.bind(turnstileEvent_); var mapLoadEvent_ = new MapLoadEvent(); var postMapLoadEvent = mapLoadEvent_.postMapLoadEvent.bind(mapLoadEvent_); /***** END WARNING - REMOVAL OR MODIFICATION OF THE PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ // var CACHE_NAME = 'mapbox-tiles'; var cacheLimit = 500; // 50MB / (100KB/tile) ~= 500 tiles var cacheCheckThreshold = 50; var MIN_TIME_UNTIL_EXPIRY = 1000 * 60 * 7; // 7 minutes. Skip caching tiles with a short enough max age. var 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; } } if (responseConstructorSupportsReadableStream) { callback(response.body); } else { response.blob().then(callback); } } function cachePut(request , response , requestTime ) { if (!self.caches) { return; } var options = { status: response.status, statusText: response.statusText, headers: new self.Headers() }; response.headers.forEach(function (v, k) { return options.headers.set(k, v); }); var 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()); } var timeUntilExpiry = new Date(options.headers.get('Expires')).getTime() - requestTime; if (timeUntilExpiry < MIN_TIME_UNTIL_EXPIRY) { return; } prepareBody(response, function (body) { var clonedResponse = new self.Response(body, options); self.caches.open(CACHE_NAME) .then(function (cache) { return cache.put(stripQueryParameters(request.url), clonedResponse); }) .catch(function (e) { return warnOnce(e.message); }); }); } function stripQueryParameters(url ) { var start = url.indexOf('?'); return start < 0 ? url : url.slice(0, start); } function cacheGet(request , callback ) { if (!self.caches) { return callback(null); } var strippedURL = stripQueryParameters(request.url); self.caches.open(CACHE_NAME) .then(function (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(function (response) { var 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); } function isFresh(response) { if (!response) { return false; } var expires = new Date(response.headers.get('Expires')); var cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); return expires > Date.now() && !cacheControl['no-cache']; } // `Infinity` triggers a cache check after the first tile is loaded // so that a check is run at least once on each page load. var 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; } } // runs on worker, see above comment function enforceCacheSizeLimit(limit ) { if (!self.caches) { return; } self.caches.open(CACHE_NAME) .then(function (cache) { cache.keys().then(function (keys) { for (var i = 0; i < keys.length - limit; i++) { cache.delete(keys[i]); } }); }); } function clearTileCache(callback ) { var promise = self.caches.delete(CACHE_NAME); if (callback) { promise.catch(callback).then(function () { return callback(); }); } } function setCacheLimits(limit , checkThreshold ) { cacheLimit = limit; cacheCheckThreshold = checkThreshold; } // /** * The type of a resource. * @private * @readonly * @enum {string} */ var ResourceType = { Unknown: 'Unknown', Style: 'Style', Source: 'Source', Tile: 'Tile', Glyphs: 'Glyphs', SpriteImage: 'SpriteImage', SpriteJSON: 'SpriteJSON', Image: 'Image' }; if (typeof Object.freeze == 'function') { Object.freeze(ResourceType); } /** * A `RequestParameters` object to be returned from Map.options.transformRequest callbacks. * @typedef {Object} RequestParameters * @property {string} url The URL to be requested. * @property {Object} headers The headers to be sent with the request. * @property {string} credentials `'same-origin'|'include'` Use 'include' to send cookies with cross-origin requests. */ var AJAXError = /*@__PURE__*/(function (Error) { function AJAXError(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'; } Error.call(this, message); this.status = status; this.url = url; // work around for https://github.com/Rich-Harris/buble/issues/40 this.name = this.constructor.name; this.message = message; } if ( Error ) AJAXError.__proto__ = Error; AJAXError.prototype = Object.create( Error && Error.prototype ); AJAXError.prototype.constructor = AJAXError; AJAXError.prototype.toString = function toString () { return ((this.name) + ": " + (this.message) + " (" + (this.status) + "): " + (this.url)); }; return AJAXError; }(Error)); function isWorker() { return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope; } // 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, WorkerGlobalScope */ var getReferrer = isWorker() ? function () { return self.worker && self.worker.referrer; } : function () { return (self.location.protocol === 'blob:' ? self.parent : self).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. var isFileURL = function (url) { return /^file:/.test(url) || (/^file:/.test(getReferrer()) && !/^\w+:/.test(url)); }; function makeFetchRequest(requestParameters , callback ) { var controller = new self.AbortController(); var request = new self.Request(requestParameters.url, { method: requestParameters.method || 'GET', body: requestParameters.body, credentials: requestParameters.credentials, headers: requestParameters.headers, referrer: getReferrer(), signal: controller.signal }); var complete = false; var aborted = false; var cacheIgnoringSearch = hasCacheDefeatingSku(request.url); if (requestParameters.type === 'json') { request.headers.set('Accept', 'application/json'); } var validateOrFetch = function (err, cachedResponse, responseIsFresh) { if (aborted) { return; } 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); } } if (cachedResponse && responseIsFresh) { return finishRequest(cachedResponse); } if (cachedResponse) { // We can't do revalidation with 'If-None-Match' because then the // request doesn't have simple cors headers. } var requestTime = Date.now(); self.fetch(request).then(function (response) { if (response.ok) { var cacheableResponse = cacheIgnoringSearch ? response.clone() : null; return finishRequest(response, cacheableResponse, requestTime); } else { return callback(new AJAXError(response.statusText, response.status, requestParameters.url)); } }).catch(function (error) { if (error.code === 20) { // silence expected AbortError return; } callback(new Error(error.message)); }); }; var finishRequest = function (response, cacheableResponse, requestTime) { ( requestParameters.type === 'arrayBuffer' ? response.arrayBuffer() : requestParameters.type === 'json' ? response.json() : response.text() ).then(function (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(function (err) { return callback(new Error(err.message)); }); }; if (cacheIgnoringSearch) { cacheGet(request, validateOrFetch); } else { validateOrFetch(null, null); } return { cancel: function () { aborted = true; if (!complete) { controller.abort(); } }}; } function makeXMLHttpRequest(requestParameters , callback ) { var xhr = new self.XMLHttpRequest(); xhr.open(requestParameters.method || 'GET', requestParameters.url, true); if (requestParameters.type === 'arrayBuffer') { xhr.responseType = 'arraybuffer'; } for (var 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 = function () { callback(new Error(xhr.statusText)); }; xhr.onload = function () { if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) { var 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: function () { return xhr.abort(); } }; } var makeRequest = function(requestParameters , callback ) { // We're trying to use the Fetch API if possible. However, in some situations we can't use it: // - IE11 doesn't support it at all. In this case, we dispatch the request to the main thread so // that we can get an accruate referrer header. // - Safari exposes window.AbortController, but it doesn't work actually abort any requests in // some versions (see https://bugs.webkit.org/show_bug.cgi?id=174980#c2) // - 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 (self.fetch && self.Request && self.AbortController && self.Request.prototype.hasOwnProperty('signal')) { return makeFetchRequest(requestParameters, callback); } if (isWorker() && self.worker && self.worker.actor) { return self.worker.actor.send('getResource', requestParameters, callback); } } return makeXMLHttpRequest(requestParameters, callback); }; var getJSON = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, { type: 'json' }), callback); }; var getArrayBuffer = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, { type: 'arrayBuffer' }), callback); }; var postData = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, { method: 'POST' }), callback); }; function sameOrigin(url) { var a = self.document.createElement('a'); a.href = url; return a.protocol === self.document.location.protocol && a.host === self.document.location.host; } var transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; var imageQueue, numImageRequests; var resetImageRequestQueue = function () { imageQueue = []; numImageRequests = 0; }; resetImageRequestQueue(); var getImage = function(requestParameters , callback ) { // limit concurrent image loads to help with raster sources performance on big screens if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) { var queued = { requestParameters: requestParameters, callback: callback, cancelled: false, cancel: function cancel() { this.cancelled = true; } }; imageQueue.push(queued); return queued; } numImageRequests++; var advanced = false; var advanceImageRequestQueue = function () { if (advanced) { return; } advanced = true; numImageRequests--; assert_1(numImageRequests >= 0); while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { // eslint-disable-line var request = imageQueue.shift(); var requestParameters = request.requestParameters; var callback = request.callback; var cancelled = request.cancelled; if (!cancelled) { request.cancel = getImage(requestParameters, callback).cancel; } } }; // request the image with XHR to work around caching issues // see https://github.com/mapbox/mapbox-gl-js/issues/1470 var request = getArrayBuffer(requestParameters, function (err , data , cacheControl , expires ) { advanceImageRequestQueue(); if (err) { callback(err); } else if (data) { var img = new self.Image(); var URL = self.URL || self.webkitURL; img.onload = function () { callback(null, img); URL.revokeObjectURL(img.src); }; img.onerror = function () { return 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.')); }; var blob = new self.Blob([new Uint8Array(data)], { type: 'image/png' }); (img ).cacheControl = cacheControl; (img ).expires = expires; img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; } }); return { cancel: function () { request.cancel(); advanceImageRequestQueue(); } }; }; var getVideo = function(urls , callback ) { var video = self.document.createElement('video'); video.muted = true; video.onloadstart = function() { callback(null, video); }; for (var i = 0; i < urls.length; i++) { var s = self.document.createElement('source'); if (!sameOrigin(urls[i])) { video.crossOrigin = 'Anonymous'; } s.src = urls[i]; video.appendChild(s); } return { cancel: function () {} }; }; // function _addEventListener(type , listener , listenerList ) { var listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1; if (!listenerExists) { listenerList[type] = listenerList[type] || []; listenerList[type].push(listener); } } function _removeEventListener(type , listener , listenerList ) { if (listenerList && listenerList[type]) { var index = listenerList[type].indexOf(listener); if (index !== -1) { listenerList[type].splice(index, 1); } } } var Event = function Event(type , data) { if ( data === void 0 ) data = {}; extend(this, data); this.type = type; }; var ErrorEvent = /*@__PURE__*/(function (Event) { function ErrorEvent(error , data) { if ( data === void 0 ) data = {}; Event.call(this, 'error', extend({error: error}, data)); } if ( Event ) ErrorEvent.__proto__ = Event; ErrorEvent.prototype = Object.create( Event && Event.prototype ); ErrorEvent.prototype.constructor = ErrorEvent; return ErrorEvent; }(Event)); /** * Methods mixed in to other classes for event capabilities. * * @mixin Evented */ var Evented = function Evented () {}; Evented.prototype.on = function on (type , listener ) { this._listeners = this._listeners || {}; _addEventListener(type, listener, this._listeners); return this; }; /** * Removes a previously registered event listener. * * @param {string} type The event type to remove listeners for. * @param {Function} listener The listener function to remove. * @returns {Object} `this` */ Evented.prototype.off = function off (type , listener ) { _removeEventListener(type, listener, this._listeners); _removeEventListener(type, listener, this._oneTimeListeners); return this; }; /** * Adds a listener that will be called only once to a specified event type. * * The listener will be called first time the event fires after the listener is registered. * * @param {string} type The event type to listen for. * @param {Function} listener The function to be called when the event is fired the first time. * @returns {Object} `this` */ Evented.prototype.once = function once (type , listener ) { this._oneTimeListeners = this._oneTimeListeners || {}; _addEventListener(type, listener, this._oneTimeListeners); return this; }; Evented.prototype.fire = function 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 || {}); } var type = event.type; if (this.listens(type)) { (event ).target = this; // make sure adding or removing listeners inside other listeners won't cause an infinite loop var listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; for (var i = 0, list = listeners; i < list.length; i += 1) { var listener = list[i]; listener.call(this, event); } var oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : []; for (var i$1 = 0, list$1 = oneTimeListeners; i$1 < list$1.length; i$1 += 1) { var listener$1 = list$1[i$1]; _removeEventListener(type, listener$1, this._oneTimeListeners); listener$1.call(this, event); } var parent = this._eventedParent; if (parent) { extend( event, typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData ); parent.fire(event); } // 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); } return this; }; /** * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type. * * @param {string} type The event type * @returns {boolean} `true` if there is at least one registered listener for specified event type, `false` otherwise * @private */ Evented.prototype.listens = function listens (type ) { return ( (this._listeners && this._listeners[type] && this._listeners[type].length > 0) || (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) || (this._eventedParent && this._eventedParent.listens(type)) ); }; /** * Bubble all events fired by this instance of Evented to this parent instance of Evented. * * @private * @returns {Object} `this` * @private */ Evented.prototype.setEventedParent = function setEventedParent (parent , data ) { this._eventedParent = parent; this._eventedParentData = data; return this; }; var $version = 8; var $root = { version: { required: true, type: "enum", values: [ 8 ] }, name: { type: "string" }, metadata: { type: "*" }, center: { type: "array", value: "number" }, zoom: { type: "number" }, bearing: { type: "number", "default": 0, period: 360, units: "degrees" }, pitch: { type: "number", "default": 0, units: "degrees" }, light: { type: "light" }, sources: { required: true, type: "sources" }, sprite: { type: "string" }, glyphs: { type: "string" }, transition: { type: "transition" }, layers: { required: true, type: "array", value: "layer" } }; var sources = { "*": { type: "source" } }; var source = [ "source_vector", "source_raster", "source_raster_dem", "source_geojson", "source_video", "source_image" ]; var 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" }, "*": { type: "*" } }; var 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" }, "*": { type: "*" } }; var 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" }, "*": { type: "*" } }; var 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 }, tolerance: { type: "number", "default": 0.375 }, cluster: { type: "boolean", "default": false }, clusterRadius: { type: "number", "default": 50, minimum: 0 }, clusterMaxZoom: { type: "number" }, clusterProperties: { type: "*" }, lineMetrics: { type: "boolean", "default": false }, generateId: { type: "boolean", "default": false } }; var 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" } } }; var 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" } } }; var layer = { id: { type: "string", required: true }, type: { type: "enum", values: { fill: { }, line: { }, symbol: { }, circle: { }, heatmap: { }, "fill-extrusion": { }, raster: { }, hillshade: { }, background: { } }, required: true }, metadata: { type: "*" }, source: { type: "string" }, "source-layer": { type: "string" }, minzoom: { type: "number", minimum: 0, maximum: 24 }, maxzoom: { type: "number", minimum: 0, maximum: 24 }, filter: { type: "filter" }, layout: { type: "layout" }, paint: { type: "paint" } }; var layout = [ "layout_fill", "layout_line", "layout_circle", "layout_heatmap", "layout_fill-extrusion", "layout_symbol", "layout_raster", "layout_hillshade", "layout_background" ]; var layout_background = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var 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" } }; var 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" } }; var layout_heatmap = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_line = { "line-cap": { type: "enum", values: { butt: { }, round: { }, square: { } }, "default": "butt", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "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" } }; var 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: "string", 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" ], 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" ] }, "property-type": "data-constant" }, "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", { "symbol-placement": [ "point" ] } ], 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" }, { "!": "text-variable-anchor" } ], 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" } }; var layout_raster = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_hillshade = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var filter = { type: "array", value: "*" }; var filter_operator = { type: "enum", values: { "==": { }, "!=": { }, ">": { }, ">=": { }, "<": { }, "<=": { }, "in": { }, "!in": { }, all: { }, any: { }, none: { }, has: { }, "!has": { } } }; var geometry_type = { type: "enum", values: { Point: { }, LineString: { }, Polygon: { } } }; var function_stop = { type: "array", minimum: 0, maximum: 22, value: [ "number", "color" ], length: 2 }; var expression = { type: "array", value: "*", minimum: 1 }; var expression_name = { type: "enum", values: { "let": { group: "Variable binding" }, "var": { group: "Variable binding" }, literal: { group: "Types" }, array: { group: "Types" }, at: { group: "Lookup" }, "case": { group: "Decision" }, match: { group: "Decision" }, coalesce: { group: "Decision" }, step: { group: "Ramps, scales, curves" }, interpolate: { group: "Ramps, scales, curves" }, "interpolate-hcl": { group: "Ramps, scales, curves" }, "interpolate-lab": { group: "Ramps, scales, curves" }, ln2: { group: "Math" }, pi: { group: "Math" }, e: { group: "Math" }, "typeof": { group: "Types" }, string: { group: "Types" }, number: { group: "Types" }, boolean: { group: "Types" }, object: { group: "Types" }, collator: { group: "Types" }, format: { group: "Types" }, "number-format": { group: "Types" }, "to-string": { group: "Types" }, "to-number": { group: "Types" }, "to-boolean": { group: "Types" }, "to-rgba": { group: "Color" }, "to-color": { group: "Types" }, rgb: { group: "Color" }, rgba: { group: "Color" }, get: { group: "Lookup" }, has: { group: "Lookup" }, length: { group: "Lookup" }, properties: { group: "Feature data" }, "feature-state": { group: "Feature data" }, "geometry-type": { group: "Feature data" }, id: { group: "Feature data" }, zoom: { group: "Zoom" }, "heatmap-density": { group: "Heatmap" }, "line-progress": { group: "Feature data" }, accumulated: { group: "Feature data" }, "+": { group: "Math" }, "*": { group: "Math" }, "-": { group: "Math" }, "/": { group: "Math" }, "%": { group: "Math" }, "^": { group: "Math" }, sqrt: { group: "Math" }, log10: { group: "Math" }, ln: { group: "Math" }, log2: { group: "Math" }, sin: { group: "Math" }, cos: { group: "Math" }, tan: { group: "Math" }, asin: { group: "Math" }, acos: { group: "Math" }, atan: { group: "Math" }, min: { group: "Math" }, max: { group: "Math" }, round: { group: "Math" }, abs: { group: "Math" }, ceil: { group: "Math" }, floor: { group: "Math" }, "==": { group: "Decision" }, "!=": { group: "Decision" }, ">": { group: "Decision" }, "<": { group: "Decision" }, ">=": { group: "Decision" }, "<=": { group: "Decision" }, all: { group: "Decision" }, any: { group: "Decision" }, "!": { group: "Decision" }, "is-supported-script": { group: "String" }, upcase: { group: "String" }, downcase: { group: "String" }, concat: { group: "String" }, "resolved-locale": { group: "String" } } }; var 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 } }; var paint = [ "paint_fill", "paint_line", "paint_circle", "paint_heatmap", "paint_fill-extrusion", "paint_symbol", "paint_raster", "paint_hillshade", "paint_background" ]; var 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: "string", transition: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "cross-faded-data-driven" } }; var 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" ] }, "property-type": "cross-faded" }, "line-pattern": { type: "string", transition: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "cross-faded-data-driven" }, "line-gradient": { type: "color", transition: false, requires: [ { "!": "line-dasharray" }, { "!": "line-pattern" }, { source: "geojson", has: { lineMetrics: true } } ], expression: { interpolated: true, parameters: [ "line-progress" ] }, "property-type": "color-ramp" } }; var 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" } }; var 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" } }; var 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" } }; var 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" } }; var 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" } }; var 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: "string", 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" } }; var transition = { duration: { type: "number", "default": 300, minimum: 0, units: "milliseconds" }, delay: { type: "number", "default": 0, minimum: 0, units: "milliseconds" } }; var spec = { $version: $version, $root: $root, sources: sources, source: source, source_vector: source_vector, source_raster: source_raster, source_raster_dem: source_raster_dem, source_geojson: source_geojson, source_video: source_video, source_image: source_image, layer: layer, layout: layout, layout_background: layout_background, layout_fill: layout_fill, layout_circle: layout_circle, layout_heatmap: layout_heatmap, "layout_fill-extrusion": { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }, layout_line: layout_line, layout_symbol: layout_symbol, layout_raster: layout_raster, layout_hillshade: layout_hillshade, filter: filter, filter_operator: filter_operator, geometry_type: geometry_type, "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: function_stop, expression: expression, expression_name: expression_name, light: light, paint: paint, paint_fill: paint_fill, "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: "string", 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: paint_line, paint_circle: paint_circle, paint_heatmap: paint_heatmap, paint_symbol: paint_symbol, paint_raster: paint_raster, paint_hillshade: paint_hillshade, paint_background: paint_background, transition: transition, "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" } } }; var ValidationError = function ValidationError(key, value, message, identifier) { this.message = (key ? (key + ": ") : '') + message; if (identifier) { this.identifier = identifier; } if (value !== null && value !== undefined && value.__line__) { this.line = value.__line__; } }; function validateConstants(options) { var key = options.key; var constants = options.value; if (constants) { return [new ValidationError(key, constants, 'constants have been deprecated as of v8')]; } else { return []; } } function extend$1 (output) { var inputs = [], len = arguments.length - 1; while ( len-- > 0 ) inputs[ len ] = arguments[ len + 1 ]; for (var i = 0, list = inputs; i < list.length; i += 1) { var input = list[i]; for (var k in input) { output[k] = input[k]; } } return output; } function isPrimitive(value) { return value instanceof Number || value instanceof String || value instanceof Boolean; } // Turn jsonlint-lines-primitives objects into primitive objects function unbundle(value) { if (isPrimitive(value)) { return value.valueOf(); } else { return value; } } function deepUnbundle(value) { if (Array.isArray(value)) { return value.map(deepUnbundle); } else if (value instanceof Object && !isPrimitive(value)) { var unbundledValue = {}; for (var key in value) { unbundledValue[key] = deepUnbundle(value[key]); } return unbundledValue; } return unbundle(value); } // var ParsingError = /*@__PURE__*/(function (Error) { function ParsingError(key , message ) { Error.call(this, message); this.message = message; this.key = key; } if ( Error ) ParsingError.__proto__ = Error; ParsingError.prototype = Object.create( Error && Error.prototype ); ParsingError.prototype.constructor = ParsingError; return ParsingError; }(Error)); // /** * Tracks `let` bindings during expression parsing. * @private */ var Scope = function Scope(parent , bindings) { if ( bindings === void 0 ) bindings = []; this.parent = parent; this.bindings = {}; for (var i = 0, list = bindings; i < list.length; i += 1) { var ref = list[i]; var name = ref[0]; var expression = ref[1]; this.bindings[name] = expression; } }; Scope.prototype.concat = function concat (bindings ) { return new Scope(this, bindings); }; Scope.prototype.get = function get (name ) { if (this.bindings[name]) { return this.bindings[name]; } if (this.parent) { return this.parent.get(name); } throw new Error((name + " not found in scope.")); }; Scope.prototype.has = function has (name ) { if (this.bindings[name]) { return true; } return this.parent ? this.parent.has(name) : false; }; // var NullType = { kind: 'null' }; var NumberType = { kind: 'number' }; var StringType = { kind: 'string' }; var BooleanType = { kind: 'boolean' }; var ColorType = { kind: 'color' }; var ObjectType = { kind: 'object' }; var ValueType = { kind: 'value' }; var ErrorType = { kind: 'error' }; var CollatorType = { kind: 'collator' }; var FormattedType = { kind: 'formatted' }; function array(itemType , N ) { return { kind: 'array', itemType: itemType, N: N }; } function toString(type ) { if (type.kind === 'array') { var itemType = toString(type.itemType); return typeof type.N === 'number' ? ("array<" + itemType + ", " + (type.N) + ">") : type.itemType.kind === 'value' ? 'array' : ("array<" + itemType + ">"); } else { return type.kind; } } var valueMemberTypes = [ NullType, NumberType, StringType, BooleanType, ColorType, FormattedType, ObjectType, array(ValueType) ]; /** * Returns null if `t` is a subtype of `expected`; otherwise returns an * error message. * @private */ function checkSubtype(expected , t ) { if (t.kind === 'error') { // Error is a subtype of every type return null; } else if (expected.kind === 'array') { if (t.kind === 'array' && ((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 (var i = 0, list = valueMemberTypes; i < list.length; i += 1) { var memberType = list[i]; if (!checkSubtype(memberType, t)) { return null; } } } return ("Expected " + (toString(expected)) + " but found " + (toString(t)) + " instead."); } 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) { } }); var csscolorparser_1 = csscolorparser.parseCSSColor; // /** * An RGBA color value. Create instances from color strings using the static * method `Color.parse`. The constructor accepts RGB channel values in the range * `[0, 1]`, premultiplied by A. * * @param {number} r The red channel. * @param {number} g The green channel. * @param {number} b The blue channel. * @param {number} a The alpha channel. * @private */ var Color = function Color(r , g , b , a) { if ( a === void 0 ) a = 1; this.r = r; this.g = g; this.b = b; this.a = a; }; /** * Parses valid CSS color strings and returns a `Color` instance. * @returns A `Color` instance, or `undefined` if the input is not a valid color string. */ Color.parse = function parse (input ) { if (!input) { return undefined; } if (input instanceof Color) { return input; } if (typeof input !== 'string') { return undefined; } var rgba = csscolorparser_1(input); if (!rgba) { return undefined; } return new Color( rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3] ); }; /** * Returns an RGBA string representing the color value. * * @returns An RGBA string. * @example * var purple = new Color.parse('purple'); * purple.toString; // = "rgba(128,0,128,1)" * var translucentGreen = new Color.parse('rgba(26, 207, 26, .73)'); * translucentGreen.toString(); // = "rgba(26,207,26,0.73)" */ Color.prototype.toString = function toString () { var ref = this.toArray(); var r = ref[0]; var g = ref[1]; var b = ref[2]; var a = ref[3]; return ("rgba(" + (Math.round(r)) + "," + (Math.round(g)) + "," + (Math.round(b)) + "," + a + ")"); }; Color.prototype.toArray = function toArray () { var ref = this; var r = ref.r; var g = ref.g; var b = ref.b; var a = ref.a; return a === 0 ? [0, 0, 0, 0] : [ r * 255 / a, g * 255 / a, b * 255 / a, a ]; }; 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); // // Flow type declarations for Intl cribbed from // https://github.com/facebook/flow/issues/1270 var Collator = function Collator(caseSensitive , diacriticSensitive , locale ) { if (caseSensitive) { this.sensitivity = diacriticSensitive ? 'variant' : 'case'; } else { this.sensitivity = diacriticSensitive ? 'accent' : 'base'; } this.locale = locale; this.collator = new Intl.Collator(this.locale ? this.locale : [], { sensitivity: this.sensitivity, usage: 'search' }); }; Collator.prototype.compare = function compare (lhs , rhs ) { return this.collator.compare(lhs, rhs); }; Collator.prototype.resolvedLocale = function 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; }; // var FormattedSection = function FormattedSection(text , scale , fontStack , textColor ) { this.text = text; this.scale = scale; this.fontStack = fontStack; this.textColor = textColor; }; var Formatted = function Formatted(sections ) { this.sections = sections; }; Formatted.fromString = function fromString (unformatted ) { return new Formatted([new FormattedSection(unformatted, null, null, null)]); }; Formatted.prototype.toString = function toString () { return this.sections.map(function (section) { return section.text; }).join(''); }; Formatted.prototype.serialize = function serialize () { var serialized = ["format"]; for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; serialized.push(section.text); var 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; }; // function validateRGBA(r , g , b , a ) { if (!( typeof r === 'number' && r >= 0 && r <= 255 && typeof g === 'number' && g >= 0 && g <= 255 && typeof b === 'number' && b >= 0 && b <= 255 )) { var value = typeof a === 'number' ? [r, g, b, a] : [r, g, b]; return ("Invalid rgba value [" + (value.join(', ')) + "]: 'r', 'g', and 'b' must be between 0 and 255."); } if (!( typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1) )) { return ("Invalid rgba value [" + ([r, g, b, a].join(', ')) + "]: 'a' must be between 0 and 1."); } return null; } function isValue(mixed ) { if (mixed === null) { return true; } else if (typeof mixed === 'string') { return true; } else if (typeof mixed === 'boolean') { return true; } else if (typeof mixed === 'number') { return true; } else if (mixed instanceof Color) { return true; } else if (mixed instanceof Collator) { return true; } else if (mixed instanceof Formatted) { return true; } else if (Array.isArray(mixed)) { for (var i = 0, list = mixed; i < list.length; i += 1) { var item = list[i]; if (!isValue(item)) { return false; } } return true; } else if (typeof mixed === 'object') { for (var key in mixed) { if (!isValue(mixed[key])) { return false; } } return true; } else { return false; } } function typeOf(value ) { if (value === null) { return NullType; } else if (typeof value === 'string') { return StringType; } else if (typeof value === 'boolean') { return BooleanType; } else if (typeof value === 'number') { return NumberType; } else if (value instanceof Color) { return ColorType; } else if (value instanceof Collator) { return CollatorType; } else if (value instanceof Formatted) { return FormattedType; } else if (Array.isArray(value)) { var length = value.length; var itemType ; for (var i = 0, list = value; i < list.length; i += 1) { var item = list[i]; var t = typeOf(item); if (!itemType) { itemType = t; } else if (itemType === t) { continue; } else { itemType = ValueType; break; } } return array(itemType || ValueType, length); } else { assert_1(typeof value === 'object'); return ObjectType; } } function toString$1(value ) { var 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) { return value.toString(); } else { return JSON.stringify(value); } } // var Literal = function Literal(type , value ) { this.type = type; this.value = value; }; Literal.parse = function parse (args , context ) { if (args.length !== 2) { return context.error(("'literal' expression requires exactly one argument, but found " + (args.length - 1) + " instead.")); } if (!isValue(args[1])) { return context.error("invalid value"); } var value = (args[1] ); var type = typeOf(value); // special case: infer the item type if possible for zero-length arrays var expected = context.expectedType; if ( type.kind === 'array' && type.N === 0 && expected && expected.kind === 'array' && (typeof expected.N !== 'number' || expected.N === 0) ) { type = expected; } return new Literal(type, value); }; Literal.prototype.evaluate = function evaluate () { return this.value; }; Literal.prototype.eachChild = function eachChild () {}; Literal.prototype.possibleOutputs = function possibleOutputs () { return [this.value]; }; Literal.prototype.serialize = function 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 ); } }; // var RuntimeError = function RuntimeError(message ) { this.name = 'ExpressionEvaluationError'; this.message = message; }; RuntimeError.prototype.toJSON = function toJSON () { return this.message; }; // var types = { string: StringType, number: NumberType, boolean: BooleanType, object: ObjectType }; var Assertion = function Assertion(type , args ) { this.type = type; this.args = args; }; Assertion.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var i = 1; var type; var name = (args[0] ); if (name === 'array') { var itemType; if (args.length > 2) { var type$1 = args[1]; if (typeof type$1 !== 'string' || !(type$1 in types) || type$1 === 'object') { return context.error('The item type argument of "array" must be one of string, number, boolean', 1); } itemType = types[type$1]; i++; } else { itemType = ValueType; } var 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++; } type = array(itemType, N); } else { assert_1(types[name], name); type = types[name]; } var parsed = []; for (; i < args.length; i++) { var input = context.parse(args[i], i, ValueType); if (!input) { return null; } parsed.push(input); } return new Assertion(type, parsed); }; Assertion.prototype.evaluate = function evaluate (ctx ) { for (var i = 0; i < this.args.length; i++) { var value = this.args[i].evaluate(ctx); var 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; }; Assertion.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Assertion.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); }; Assertion.prototype.serialize = function serialize () { var type = this.type; var serialized = [type.kind]; if (type.kind === 'array') { var itemType = type.itemType; if (itemType.kind === 'string' || itemType.kind === 'number' || itemType.kind === 'boolean') { serialized.push(itemType.kind); var N = type.N; if (typeof N === 'number' || this.args.length > 1) { serialized.push(N); } } } return serialized.concat(this.args.map(function (arg) { return arg.serialize(); })); }; // var FormatExpression = function FormatExpression(sections ) { this.type = FormattedType; this.sections = sections; }; FormatExpression.parse = function parse (args , context ) { if (args.length < 3) { return context.error("Expected at least two arguments."); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } var sections = []; for (var i = 1; i < args.length - 1; i += 2) { var text = context.parse(args[i], 1, ValueType); if (!text) { return null; } var kind = text.type.kind; if (kind !== 'string' && kind !== 'value' && kind !== 'null') { return context.error("Formatted text type must be 'string', 'value', or 'null'."); } var options = (args[i + 1] ); if (typeof options !== "object" || Array.isArray(options)) { return context.error("Format options argument must be an object."); } var scale = null; if (options['font-scale']) { scale = context.parse(options['font-scale'], 1, NumberType); if (!scale) { return null; } } var font = null; if (options['text-font']) { font = context.parse(options['text-font'], 1, array(StringType)); if (!font) { return null; } } var textColor = null; if (options['text-color']) { textColor = context.parse(options['text-color'], 1, ColorType); if (!textColor) { return null; } } sections.push({text: text, scale: scale, font: font, textColor: textColor}); } return new FormatExpression(sections); }; FormatExpression.prototype.evaluate = function evaluate (ctx ) { return new Formatted( this.sections.map(function (section) { return new FormattedSection( toString$1(section.text.evaluate(ctx)), section.scale ? section.scale.evaluate(ctx) : null, section.font ? section.font.evaluate(ctx).join(',') : null, section.textColor ? section.textColor.evaluate(ctx) : null ); } ) ); }; FormatExpression.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; fn(section.text); if (section.scale) { fn(section.scale); } if (section.font) { fn(section.font); } if (section.textColor) { fn(section.textColor); } } }; FormatExpression.prototype.possibleOutputs = function possibleOutputs () { // Technically the combinatoric set of all children // Usually, this.text will be undefined anyway return [undefined]; }; FormatExpression.prototype.serialize = function serialize () { var serialized = ["format"]; for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; serialized.push(section.text.serialize()); var 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; }; // var 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 */ var Coercion = function Coercion(type , args ) { this.type = type; this.args = args; }; Coercion.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var name = (args[0] ); assert_1(types$1[name], name); if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) { return context.error("Expected one argument."); } var type = types$1[name]; var parsed = []; for (var i = 1; i < args.length; i++) { var input = context.parse(args[i], i, ValueType); if (!input) { return null; } parsed.push(input); } return new Coercion(type, parsed); }; Coercion.prototype.evaluate = function evaluate (ctx ) { if (this.type.kind === 'boolean') { return Boolean(this.args[0].evaluate(ctx)); } else if (this.type.kind === 'color') { var input; var error; for (var i = 0, list = this.args; i < list.length; i += 1) { var arg = list[i]; input = arg.evaluate(ctx); error = null; if (input instanceof Color) { return input; } else if (typeof input === 'string') { var c = ctx.parseColor(input); if (c) { return c; } } else if (Array.isArray(input)) { if (input.length < 3 || input.length > 4) { error = "Invalid rbga value " + (JSON.stringify(input)) + ": expected an array containing either three or four numeric values."; } else { error = validateRGBA(input[0], input[1], input[2], input[3]); } if (!error) { return new Color((input[0] ) / 255, (input[1] ) / 255, (input[2] ) / 255, (input[3] )); } } } throw new RuntimeError(error || ("Could not parse color from value '" + (typeof input === 'string' ? input : String(JSON.stringify(input))) + "'")); } else if (this.type.kind === 'number') { var value = null; for (var i$1 = 0, list$1 = this.args; i$1 < list$1.length; i$1 += 1) { var arg$1 = list$1[i$1]; value = arg$1.evaluate(ctx); if (value === null) { return 0; } var 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 { return toString$1(this.args[0].evaluate(ctx)); } }; Coercion.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Coercion.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); }; Coercion.prototype.serialize = function serialize () { if (this.type.kind === 'formatted') { return new FormatExpression([{text: this.args[0], scale: null, font: null, textColor: null}]).serialize(); } var serialized = [("to-" + (this.type.kind))]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; var EvaluationContext = function EvaluationContext() { this.globals = (null ); this.feature = null; this.featureState = null; this.formattedSection = null; this._parseColorCache = {}; }; EvaluationContext.prototype.id = function id () { return this.feature && 'id' in this.feature ? this.feature.id : null; }; EvaluationContext.prototype.geometryType = function geometryType () { return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null; }; EvaluationContext.prototype.properties = function properties () { return this.feature && this.feature.properties || {}; }; EvaluationContext.prototype.parseColor = function parseColor (input ) { var cached = this._parseColorCache[input]; if (!cached) { cached = this._parseColorCache[input] = Color.parse(input); } return cached; }; // var CompoundExpression = function CompoundExpression(name , type , evaluate , args ) { this.name = name; this.type = type; this._evaluate = evaluate; this.args = args; }; CompoundExpression.prototype.evaluate = function evaluate (ctx ) { return this._evaluate(ctx, this.args); }; CompoundExpression.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; CompoundExpression.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; CompoundExpression.prototype.serialize = function serialize () { return [this.name].concat(this.args.map(function (arg) { return arg.serialize(); })); }; CompoundExpression.parse = function parse (args , context ) { var ref$1; var op = (args[0] ); var definition = CompoundExpression.definitions[op]; if (!definition) { return context.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0); } // Now check argument types against each signature var type = Array.isArray(definition) ? definition[0] : definition.type; var availableOverloads = Array.isArray(definition) ? [[definition[1], definition[2]]] : definition.overloads; var overloads = availableOverloads.filter(function (ref) { var signature = ref[0]; return ( !Array.isArray(signature) || // varags signature.length === args.length - 1 // correct param count ); }); var signatureContext = (null ); for (var i$3 = 0, list = overloads; i$3 < list.length; i$3 += 1) { // Use a fresh context for each attempted signature so that, if // we eventually succeed, we haven't polluted `context.errors`. var ref = list[i$3]; var params = ref[0]; var evaluate = ref[1]; signatureContext = new ParsingContext(context.registry, context.path, null, context.scope); // First parse all the args, potentially coercing to the // types expected by this overload. var parsedArgs = []; var argParseFailed = false; for (var i = 1; i < args.length; i++) { var arg = args[i]; var expectedType = Array.isArray(params) ? params[i - 1] : params.type; var 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 (var i$1 = 0; i$1 < parsedArgs.length; i$1++) { var expected = Array.isArray(params) ? params[i$1] : params.type; var arg$1 = parsedArgs[i$1]; signatureContext.concat(i$1 + 1).checkSubtype(expected, arg$1.type); } if (signatureContext.errors.length === 0) { return new CompoundExpression(op, type, evaluate, parsedArgs); } } assert_1(!signatureContext || signatureContext.errors.length > 0); if (overloads.length === 1) { (ref$1 = context.errors).push.apply(ref$1, signatureContext.errors); } else { var expected$1 = overloads.length ? overloads : availableOverloads; var signatures = expected$1 .map(function (ref) { var params = ref[0]; return stringifySignature(params); }) .join(' | '); var actualTypes = []; // For error message, re-parse arguments without trying to // apply any coercions for (var i$2 = 1; i$2 < args.length; i$2++) { var parsed$1 = context.parse(args[i$2], 1 + actualTypes.length); if (!parsed$1) { return null; } actualTypes.push(toString(parsed$1.type)); } context.error(("Expected arguments of type " + signatures + ", but found (" + (actualTypes.join(', ')) + ") instead.")); } return null; }; CompoundExpression.register = function register ( registry , definitions ) { assert_1(!CompoundExpression.definitions); CompoundExpression.definitions = definitions; for (var name in definitions) { registry[name] = CompoundExpression; } }; function stringifySignature(signature ) { if (Array.isArray(signature)) { return ("(" + (signature.map(toString).join(', ')) + ")"); } else { return ("(" + (toString(signature.type)) + "...)"); } } // var CollatorExpression = function CollatorExpression(caseSensitive , diacriticSensitive , locale ) { this.type = CollatorType; this.locale = locale; this.caseSensitive = caseSensitive; this.diacriticSensitive = diacriticSensitive; }; CollatorExpression.parse = function parse (args , context ) { if (args.length !== 2) { return context.error("Expected one argument."); } var options = (args[1] ); if (typeof options !== "object" || Array.isArray(options)) { return context.error("Collator options argument must be an object."); } var caseSensitive = context.parse( options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType); if (!caseSensitive) { return null; } var diacriticSensitive = context.parse( options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType); if (!diacriticSensitive) { return null; } var locale = null; if (options['locale']) { locale = context.parse(options['locale'], 1, StringType); if (!locale) { return null; } } return new CollatorExpression(caseSensitive, diacriticSensitive, locale); }; CollatorExpression.prototype.evaluate = function evaluate (ctx ) { return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null); }; CollatorExpression.prototype.eachChild = function eachChild (fn ) { fn(this.caseSensitive); fn(this.diacriticSensitive); if (this.locale) { fn(this.locale); } }; CollatorExpression.prototype.possibleOutputs = function possibleOutputs () { // Technically the set of possible outputs is the combinatoric set of Collators produced // by all possibleOutputs of locale/caseSensitive/diacriticSensitive // But for the primary use of Collators in comparison operators, we ignore the Collator's // possibleOutputs anyway, so we can get away with leaving this undefined for now. return [undefined]; }; CollatorExpression.prototype.serialize = function serialize () { var options = {}; options['case-sensitive'] = this.caseSensitive.serialize(); options['diacritic-sensitive'] = this.diacriticSensitive.serialize(); if (this.locale) { options['locale'] = this.locale.serialize(); } return ["collator", options]; }; // 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; } } var result = true; e.eachChild(function (arg) { if (result && !isFeatureConstant(arg)) { result = false; } }); return result; } function isStateConstant(e ) { if (e instanceof CompoundExpression) { if (e.name === 'feature-state') { return false; } } var result = true; e.eachChild(function (arg) { if (result && !isStateConstant(arg)) { result = false; } }); return result; } function isGlobalPropertyConstant(e , properties ) { if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { return false; } var result = true; e.eachChild(function (arg) { if (result && !isGlobalPropertyConstant(arg, properties)) { result = false; } }); return result; } // var Var = function Var(name , boundExpression ) { this.type = boundExpression.type; this.name = name; this.boundExpression = boundExpression; }; Var.parse = function parse (args , context ) { if (args.length !== 2 || typeof args[1] !== 'string') { return context.error("'var' expression requires exactly one string literal argument."); } var name = args[1]; if (!context.scope.has(name)) { return context.error(("Unknown variable \"" + name + "\". Make sure \"" + name + "\" has been bound in an enclosing \"let\" expression before using it."), 1); } return new Var(name, context.scope.get(name)); }; Var.prototype.evaluate = function evaluate (ctx ) { return this.boundExpression.evaluate(ctx); }; Var.prototype.eachChild = function eachChild () {}; Var.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; Var.prototype.serialize = function serialize () { return ["var", this.name]; }; // /** * State associated parsing at a given point in an expression tree. * @private */ var ParsingContext = function ParsingContext( registry , path, expectedType , scope, errors ) { if ( path === void 0 ) path = []; if ( scope === void 0 ) scope = new Scope(); if ( errors === void 0 ) errors = []; this.registry = registry; this.path = path; this.key = path.map(function (part) { return ("[" + part + "]"); }).join(''); this.scope = scope; this.errors = errors; this.expectedType = expectedType; }; /** * @param expr the JSON expression to parse * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed * @param options * @param options.omitTypeAnnotations set true to omit inferred type annotations. Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation. * @private */ ParsingContext.prototype.parse = function parse ( expr , index , expectedType , bindings , options ) { if ( options === void 0 ) options = {}; if (index) { return this.concat(index, expectedType, bindings)._parse(expr, options); } return this._parse(expr, options); }; ParsingContext.prototype._parse = function _parse (expr , options ) { if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') { expr = ['literal', expr]; } 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\", []]."); } var 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; } var Expr = this.registry[op]; if (Expr) { var parsed = Expr.parse(expr, this); if (!parsed) { return null; } if (this.expectedType) { var expected = this.expectedType; var 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') && (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. if (!(parsed instanceof Literal) && isConstant(parsed)) { var 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.")); } }; /** * Returns a copy of this context suitable for parsing the subexpression at * index `index`, optionally appending to 'let' binding map. * * Note that `errors` property, intended for collecting errors while * parsing, is copied by reference rather than cloned. * @private */ ParsingContext.prototype.concat = function concat (index , expectedType , bindings ) { var path = typeof index === 'number' ? this.path.concat(index) : this.path; var scope = bindings ? this.scope.concat(bindings) : this.scope; return new ParsingContext( this.registry, path, expectedType || null, scope, this.errors ); }; /** * Push a parsing (or type checking) error into the `this.errors` * @param error The message * @param keys Optionally specify the source of the error at a child * of the current expression at `this.key`. * @private */ ParsingContext.prototype.error = function error (error$1 ) { var keys = [], len = arguments.length - 1; while ( len-- > 0 ) keys[ len ] = arguments[ len + 1 ]; var key = "" + (this.key) + (keys.map(function (k) { return ("[" + k + "]"); }).join('')); this.errors.push(new ParsingError(key, error$1)); }; /** * Returns null if `t` is a subtype of `expected`; otherwise returns an * error message and also pushes it to `this.errors`. */ ParsingContext.prototype.checkSubtype = function checkSubtype$1 (expected , t ) { var error = checkSubtype(expected, t); if (error) { this.error(error); } return error; }; 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; } var isTypeAnnotation = expression instanceof Coercion || expression instanceof Assertion; var childrenConstant = true; expression.eachChild(function (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. // 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; } return isFeatureConstant(expression) && isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'accumulated', 'is-supported-script']); } // /** * Returns the index of the last stop <= input, or 0 if it doesn't exist. * @private */ function findStopLessThanOrEqualTo(stops , input ) { var lastIndex = stops.length - 1; var lowerIndex = 0; var upperIndex = lastIndex; var currentIndex = 0; var 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 0; } // var Step = function Step(type , input , stops ) { this.type = type; this.input = input; this.labels = []; this.outputs = []; for (var i = 0, list = stops; i < list.length; i += 1) { var ref = list[i]; var label = ref[0]; var expression = ref[1]; this.labels.push(label); this.outputs.push(expression); } }; Step.parse = function parse (args , context ) { if (args.length - 1 < 4) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } var input = context.parse(args[1], 1, NumberType); if (!input) { return null; } var stops = []; var outputType = (null ); if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } for (var i = 1; i < args.length; i += 2) { var label = i === 1 ? -Infinity : args[i]; var value = args[i + 1]; var labelKey = i; var valueKey = i + 1; if (typeof label !== 'number') { return context.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); } if (stops.length && stops[stops.length - 1][0] >= label) { return context.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.', labelKey); } var parsed = context.parse(value, valueKey, outputType); if (!parsed) { return null; } outputType = outputType || parsed.type; stops.push([label, parsed]); } return new Step(outputType, input, stops); }; Step.prototype.evaluate = function evaluate (ctx ) { var labels = this.labels; var outputs = this.outputs; if (labels.length === 1) { return outputs[0].evaluate(ctx); } var value = ((this.input.evaluate(ctx) ) ); if (value <= labels[0]) { return outputs[0].evaluate(ctx); } var stopCount = labels.length; if (value >= labels[stopCount - 1]) { return outputs[stopCount - 1].evaluate(ctx); } var index = findStopLessThanOrEqualTo(labels, value); return outputs[index].evaluate(ctx); }; Step.prototype.eachChild = function eachChild (fn ) { fn(this.input); for (var i = 0, list = this.outputs; i < list.length; i += 1) { var expression = list[i]; fn(expression); } }; Step.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.outputs.map(function (output) { return output.possibleOutputs(); })); }; Step.prototype.serialize = function serialize () { var serialized = ["step", this.input.serialize()]; for (var i = 0; i < this.labels.length; i++) { if (i > 0) { serialized.push(this.labels[i]); } serialized.push(this.outputs[i].serialize()); } return serialized; }; // function number(a , b , t ) { return (a * (1 - t)) + (b * t); } function color(from , to , t ) { return new Color( number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t) ); } function array$1(from , to , t ) { return from.map(function (d, i) { return number(d, to[i], t); }); } var interpolate = /*#__PURE__*/Object.freeze({ number: number, color: color, array: array$1 }); // // Constants var Xn = 0.950470, // D65 standard referent Yn = 1, Zn = 1.088830, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1, deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI; // Utilities function xyz2lab(t) { return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; } function lab2xyz(t) { return t > t1 ? t * t * t : t2 * (t - t0); } function xyz2rgb(x) { return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); } function rgb2xyz(x) { x /= 255; return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); } // LAB function rgbToLab(rgbColor ) { var b = rgb2xyz(rgbColor.r), a = rgb2xyz(rgbColor.g), l = rgb2xyz(rgbColor.b), x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); return { l: 116 * y - 16, a: 500 * (x - y), b: 200 * (y - z), alpha: rgbColor.a }; } function labToRgb(labColor ) { var y = (labColor.l + 16) / 116, x = isNaN(labColor.a) ? y : y + labColor.a / 500, z = isNaN(labColor.b) ? y : y - labColor.b / 200; y = Yn * lab2xyz(y); x = Xn * lab2xyz(x); z = Zn * lab2xyz(z); return new Color( xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha ); } function interpolateLab(from , to , t ) { return { l: 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) }; } // HCL function rgbToHcl(rgbColor ) { var ref = rgbToLab(rgbColor); var l = ref.l; var a = ref.a; var b = ref.b; var h = Math.atan2(b, a) * rad2deg; return { h: h < 0 ? h + 360 : h, c: Math.sqrt(a * a + b * b), l: l, alpha: rgbColor.a }; } function hclToRgb(hclColor ) { var h = hclColor.h * deg2rad, c = hclColor.c, l = hclColor.l; return labToRgb({ l: l, a: Math.cos(h) * c, b: Math.sin(h) * c, alpha: hclColor.alpha }); } function interpolateHue(a , b , t ) { var d = b - a; return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d); } function interpolateHcl(from , to , t ) { return { h: interpolateHue(from.h, to.h, t), c: number(from.c, to.c, t), l: number(from.l, to.l, t), alpha: number(from.alpha, to.alpha, t) }; } var lab = { forward: rgbToLab, reverse: labToRgb, interpolate: interpolateLab }; var hcl = { forward: rgbToHcl, reverse: hclToRgb, interpolate: interpolateHcl }; var colorSpaces = /*#__PURE__*/Object.freeze({ lab: lab, hcl: hcl }); // var Interpolate = function Interpolate(type , operator , interpolation , input , stops ) { this.type = type; this.operator = operator; this.interpolation = interpolation; this.input = input; this.labels = []; this.outputs = []; for (var i = 0, list = stops; i < list.length; i += 1) { var ref = list[i]; var label = ref[0]; var expression = ref[1]; this.labels.push(label); this.outputs.push(expression); } }; Interpolate.interpolationFactor = function interpolationFactor (interpolation , input , lower , upper ) { var t = 0; if (interpolation.name === 'exponential') { t = exponentialInterpolation(input, interpolation.base, lower, upper); } else if (interpolation.name === 'linear') { t = exponentialInterpolation(input, 1, lower, upper); } else if (interpolation.name === 'cubic-bezier') { var c = interpolation.controlPoints; var ub = new unitbezier(c[0], c[1], c[2], c[3]); t = ub.solve(exponentialInterpolation(input, 1, lower, upper)); } return t; }; Interpolate.parse = function parse (args , context ) { var operator = args[0]; var interpolation = args[1]; var input = args[2]; var rest = args.slice(3); if (!Array.isArray(interpolation) || interpolation.length === 0) { return context.error("Expected an interpolation type expression.", 1); } if (interpolation[0] === 'linear') { interpolation = { name: 'linear' }; } else if (interpolation[0] === 'exponential') { var base = interpolation[1]; if (typeof base !== 'number') { return context.error("Exponential interpolation requires a numeric base.", 1, 1); } interpolation = { name: 'exponential', base: base }; } else if (interpolation[0] === 'cubic-bezier') { var controlPoints = interpolation.slice(1); if ( controlPoints.length !== 4 || controlPoints.some(function (t) { return typeof t !== 'number' || t < 0 || t > 1; }) ) { return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1); } interpolation = { name: 'cubic-bezier', controlPoints: (controlPoints ) }; } else { return context.error(("Unknown interpolation type " + (String(interpolation[0]))), 1, 0); } if (args.length - 1 < 4) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } input = context.parse(input, 2, NumberType); if (!input) { return null; } var stops = []; var outputType = (null ); if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') { outputType = ColorType; } else if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } for (var i = 0; i < rest.length; i += 2) { var label = rest[i]; var value = rest[i + 1]; var labelKey = i + 3; var valueKey = i + 4; if (typeof label !== 'number') { return context.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); } if (stops.length && stops[stops.length - 1][0] >= label) { return context.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.', labelKey); } var parsed = context.parse(value, valueKey, outputType); if (!parsed) { return null; } outputType = outputType || parsed.type; stops.push([label, parsed]); } if (outputType.kind !== 'number' && outputType.kind !== 'color' && !( outputType.kind === 'array' && outputType.itemType.kind === 'number' && typeof outputType.N === 'number' ) ) { return context.error(("Type " + (toString(outputType)) + " is not interpolatable.")); } return new Interpolate(outputType, (operator ), interpolation, input, stops); }; Interpolate.prototype.evaluate = function evaluate (ctx ) { var labels = this.labels; var outputs = this.outputs; if (labels.length === 1) { return outputs[0].evaluate(ctx); } var value = ((this.input.evaluate(ctx) ) ); if (value <= labels[0]) { return outputs[0].evaluate(ctx); } var stopCount = labels.length; if (value >= labels[stopCount - 1]) { return outputs[stopCount - 1].evaluate(ctx); } var index = findStopLessThanOrEqualTo(labels, value); var lower = labels[index]; var upper = labels[index + 1]; var t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper); var outputLower = outputs[index].evaluate(ctx); var outputUpper = outputs[index + 1].evaluate(ctx); 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)); } }; Interpolate.prototype.eachChild = function eachChild (fn ) { fn(this.input); for (var i = 0, list = this.outputs; i < list.length; i += 1) { var expression = list[i]; fn(expression); } }; Interpolate.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.outputs.map(function (output) { return output.possibleOutputs(); })); }; Interpolate.prototype.serialize = function serialize () { var 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); } var serialized = [this.operator, interpolation, this.input.serialize()]; for (var i = 0; i < this.labels.length; i++) { serialized.push( this.labels[i], this.outputs[i].serialize() ); } 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 exponentialInterpolation(input, base, lowerValue, upperValue) { var difference = upperValue - lowerValue; var progress = input - lowerValue; if (difference === 0) { return 0; } else if (base === 1) { return progress / difference; } else { return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } // var Coalesce = function Coalesce(type , args ) { this.type = type; this.args = args; }; Coalesce.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expectected at least one argument."); } var outputType = (null ); var expectedType = context.expectedType; if (expectedType && expectedType.kind !== 'value') { outputType = expectedType; } var parsedArgs = []; for (var i = 0, list = args.slice(1); i < list.length; i += 1) { var arg = list[i]; var parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {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. var needsAnnotation = expectedType && parsedArgs.some(function (arg) { return checkSubtype(expectedType, arg.type); }); return needsAnnotation ? new Coalesce(ValueType, parsedArgs) : new Coalesce((outputType ), parsedArgs); }; Coalesce.prototype.evaluate = function evaluate (ctx ) { var result = null; for (var i = 0, list = this.args; i < list.length; i += 1) { var arg = list[i]; result = arg.evaluate(ctx); if (result !== null) { break; } } return result; }; Coalesce.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Coalesce.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); }; Coalesce.prototype.serialize = function serialize () { var serialized = ["coalesce"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var Let = function Let(bindings , result ) { this.type = result.type; this.bindings = [].concat(bindings); this.result = result; }; Let.prototype.evaluate = function evaluate (ctx ) { return this.result.evaluate(ctx); }; Let.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.bindings; i < list.length; i += 1) { var binding = list[i]; fn(binding[1]); } fn(this.result); }; Let.parse = function parse (args , context ) { if (args.length < 4) { return context.error(("Expected at least 3 arguments, but found " + (args.length - 1) + " instead.")); } var bindings = []; for (var i = 1; i < args.length - 1; i += 2) { var name = args[i]; if (typeof name !== 'string') { return context.error(("Expected string, but found " + (typeof name) + " instead."), i); } if (/[^a-zA-Z0-9_]/.test(name)) { return context.error("Variable names must contain only alphanumeric characters or '_'.", i); } var value = context.parse(args[i + 1], i + 1); if (!value) { return null; } bindings.push([name, value]); } var result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings); if (!result) { return null; } return new Let(bindings, result); }; Let.prototype.possibleOutputs = function possibleOutputs () { return this.result.possibleOutputs(); }; Let.prototype.serialize = function serialize () { var serialized = ["let"]; for (var i = 0, list = this.bindings; i < list.length; i += 1) { var ref = list[i]; var name = ref[0]; var expr = ref[1]; serialized.push(name, expr.serialize()); } serialized.push(this.result.serialize()); return serialized; }; // var At = function At(type , index , input ) { this.type = type; this.index = index; this.input = input; }; At.parse = function parse (args , context ) { if (args.length !== 3) { return context.error(("Expected 2 arguments, but found " + (args.length - 1) + " instead.")); } var index = context.parse(args[1], 1, NumberType); var input = context.parse(args[2], 2, array(context.expectedType || ValueType)); if (!index || !input) { return null; } var t = (input.type ); return new At(t.itemType, index, input); }; At.prototype.evaluate = function evaluate (ctx ) { var index = ((this.index.evaluate(ctx) ) ); var array = ((this.input.evaluate(ctx) ) ); if (index < 0) { throw new RuntimeError(("Array index out of bounds: " + index + " < 0.")); } if (index >= array.length) { throw new RuntimeError(("Array index out of bounds: " + index + " > " + (array.length - 1) + ".")); } if (index !== Math.floor(index)) { throw new RuntimeError(("Array index must be an integer, but found " + index + " instead.")); } return array[index]; }; At.prototype.eachChild = function eachChild (fn ) { fn(this.index); fn(this.input); }; At.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; At.prototype.serialize = function serialize () { return ["at", this.index.serialize(), this.input.serialize()]; }; // // Map input label values to output expression index var Match = function Match(inputType , outputType , input , cases , outputs , otherwise ) { this.inputType = inputType; this.type = outputType; this.input = input; this.cases = cases; this.outputs = outputs; this.otherwise = otherwise; }; Match.parse = function parse (args , context ) { if (args.length < 5) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if (args.length % 2 !== 1) { return context.error("Expected an even number of arguments."); } var inputType; var outputType; if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } var cases = {}; var outputs = []; for (var i = 2; i < args.length - 1; i += 2) { var labels = args[i]; var value = args[i + 1]; if (!Array.isArray(labels)) { labels = [labels]; } var labelContext = context.concat(i); if (labels.length === 0) { return labelContext.error('Expected at least one branch label.'); } for (var i$1 = 0, list = labels; i$1 < list.length; i$1 += 1) { var label = list[i$1]; if (typeof label !== 'number' && typeof label !== 'string') { return labelContext.error("Branch labels must be numbers or strings."); } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) { return labelContext.error(("Branch labels must be integers no larger than " + (Number.MAX_SAFE_INTEGER) + ".")); } else if (typeof label === 'number' && Math.floor(label) !== label) { return labelContext.error("Numeric branch labels must be integer values."); } else if (!inputType) { inputType = typeOf(label); } else if (labelContext.checkSubtype(inputType, typeOf(label))) { return null; } if (typeof cases[String(label)] !== 'undefined') { return labelContext.error('Branch labels must be unique.'); } cases[String(label)] = outputs.length; } var result = context.parse(value, i, outputType); if (!result) { return null; } outputType = outputType || result.type; outputs.push(result); } var input = context.parse(args[1], 1, ValueType); if (!input) { return null; } var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); if (!otherwise) { return null; } assert_1(inputType && outputType); if (input.type.kind !== 'value' && context.concat(1).checkSubtype((inputType ), input.type)) { return null; } return new Match((inputType ), (outputType ), input, cases, outputs, otherwise); }; Match.prototype.evaluate = function evaluate (ctx ) { var input = (this.input.evaluate(ctx) ); var output = (typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise; return output.evaluate(ctx); }; Match.prototype.eachChild = function eachChild (fn ) { fn(this.input); this.outputs.forEach(fn); fn(this.otherwise); }; Match.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []) .concat.apply(ref, this.outputs.map(function (out) { return out.possibleOutputs(); })) .concat(this.otherwise.possibleOutputs()); }; Match.prototype.serialize = function serialize () { var this$1 = this; var serialized = ["match", this.input.serialize()]; // Sort so serialization has an arbitrary defined order, even though // branch order doesn't affect evaluation var sortedLabels = Object.keys(this.cases).sort(); // Group branches by unique match expression to support condensed // serializations of the form [case1, case2, ...] -> matchExpression var groupedByOutput = []; var outputLookup = {}; // lookup index into groupedByOutput for a given output expression for (var i = 0, list = sortedLabels; i < list.length; i += 1) { var label = list[i]; var 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); } } var coerceLabel = function (label) { return this$1.inputType.kind === 'number' ? Number(label) : label; }; for (var i$1 = 0, list$1 = groupedByOutput; i$1 < list$1.length; i$1 += 1) { var ref = list$1[i$1]; var outputIndex = ref[0]; var labels = ref[1]; 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$1].serialize()); } serialized.push(this.otherwise.serialize()); return serialized; }; // var Case = function Case(type , branches , otherwise ) { this.type = type; this.branches = branches; this.otherwise = otherwise; }; Case.parse = function parse (args , context ) { if (args.length < 4) { return context.error(("Expected at least 3 arguments, but found only " + (args.length - 1) + ".")); } if (args.length % 2 !== 0) { return context.error("Expected an odd number of arguments."); } var outputType ; if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } var branches = []; for (var i = 1; i < args.length - 1; i += 2) { var test = context.parse(args[i], i, BooleanType); if (!test) { return null; } var result = context.parse(args[i + 1], i + 1, outputType); if (!result) { return null; } branches.push([test, result]); outputType = outputType || result.type; } var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); if (!otherwise) { return null; } assert_1(outputType); return new Case((outputType ), branches, otherwise); }; Case.prototype.evaluate = function evaluate (ctx ) { for (var i = 0, list = this.branches; i < list.length; i += 1) { var ref = list[i]; var test = ref[0]; var expression = ref[1]; if (test.evaluate(ctx)) { return expression.evaluate(ctx); } } return this.otherwise.evaluate(ctx); }; Case.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.branches; i < list.length; i += 1) { var ref = list[i]; var test = ref[0]; var expression = ref[1]; fn(test); fn(expression); } fn(this.otherwise); }; Case.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []) .concat.apply(ref, this.branches.map(function (ref) { var _ = ref[0]; var out = ref[1]; return out.possibleOutputs(); })) .concat(this.otherwise.possibleOutputs()); }; Case.prototype.serialize = function serialize () { var serialized = ["case"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // 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; } /** * 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) { var isOrderComparison = op !== '==' && op !== '!='; return /*@__PURE__*/(function () { function Comparison(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'; } Comparison.parse = function parse (args , context ) { if (args.length !== 3 && args.length !== 4) { return context.error("Expected two or three arguments."); } var op = (args[0] ); var 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)) + "'.")); } var 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]); } } var 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); }; Comparison.prototype.evaluate = function evaluate (ctx ) { var lhs = this.lhs.evaluate(ctx); var rhs = this.rhs.evaluate(ctx); if (isOrderComparison && this.hasUntypedArgument) { var lt = typeOf(lhs); var 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) { var lt$1 = typeOf(lhs); var rt$1 = typeOf(rhs); if (lt$1.kind !== 'string' || rt$1.kind !== 'string') { return compareBasic(ctx, lhs, rhs); } } return this.collator ? compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) : compareBasic(ctx, lhs, rhs); }; Comparison.prototype.eachChild = function eachChild (fn ) { fn(this.lhs); fn(this.rhs); if (this.collator) { fn(this.collator); } }; Comparison.prototype.possibleOutputs = function possibleOutputs () { return [true, false]; }; Comparison.prototype.serialize = function serialize () { var serialized = [op]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; return Comparison; }()); } var Equals = makeComparison('==', eq, eqCollate); var NotEquals = makeComparison('!=', neq, neqCollate); var LessThan = makeComparison('<', lt, ltCollate); var GreaterThan = makeComparison('>', gt, gtCollate); var LessThanOrEqual = makeComparison('<=', lteq, lteqCollate); var GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate); // var NumberFormat = function NumberFormat(number , locale , currency , minFractionDigits , maxFractionDigits ) { this.type = StringType; this.number = number; this.locale = locale; this.currency = currency; this.minFractionDigits = minFractionDigits; this.maxFractionDigits = maxFractionDigits; }; NumberFormat.parse = function parse (args , context ) { if (args.length !== 3) { return context.error("Expected two arguments."); } var number = context.parse(args[1], 1, NumberType); if (!number) { return null; } var options = (args[2] ); if (typeof options !== "object" || Array.isArray(options)) { return context.error("NumberFormat options argument must be an object."); } var locale = null; if (options['locale']) { locale = context.parse(options['locale'], 1, StringType); if (!locale) { return null; } } var currency = null; if (options['currency']) { currency = context.parse(options['currency'], 1, StringType); if (!currency) { return null; } } var minFractionDigits = null; if (options['min-fraction-digits']) { minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType); if (!minFractionDigits) { return null; } } var maxFractionDigits = null; if (options['max-fraction-digits']) { maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType); if (!maxFractionDigits) { return null; } } return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits); }; NumberFormat.prototype.evaluate = function 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)); }; NumberFormat.prototype.eachChild = function 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); } }; NumberFormat.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; NumberFormat.prototype.serialize = function serialize () { var 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]; }; // var Length = function Length(input ) { this.type = NumberType; this.input = input; }; Length.parse = function parse (args , context ) { if (args.length !== 2) { return context.error(("Expected 1 argument, but found " + (args.length - 1) + " instead.")); } var 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(input.type)) + " instead.")); } return new Length(input); }; Length.prototype.evaluate = function evaluate (ctx ) { var 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.")); } }; Length.prototype.eachChild = function eachChild (fn ) { fn(this.input); }; Length.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; Length.prototype.serialize = function serialize () { var serialized = ["length"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var expressions = { // special forms '==': Equals, '!=': NotEquals, '>': GreaterThan, '<': LessThan, '>=': GreaterThanOrEqual, '<=': LessThanOrEqual, 'array': Assertion, 'at': At, 'boolean': Assertion, 'case': Case, 'coalesce': Coalesce, 'collator': CollatorExpression, 'format': FormatExpression, 'interpolate': Interpolate, 'interpolate-hcl': Interpolate, 'interpolate-lab': Interpolate, 'length': Length, 'let': Let, 'literal': Literal, 'match': Match, 'number': Assertion, 'number-format': NumberFormat, 'object': Assertion, 'step': Step, 'string': Assertion, 'to-boolean': Coercion, 'to-color': Coercion, 'to-number': Coercion, 'to-string': Coercion, 'var': Var }; function rgba(ctx, ref) { var r = ref[0]; var g = ref[1]; var b = ref[2]; var a = ref[3]; r = r.evaluate(ctx); g = g.evaluate(ctx); b = b.evaluate(ctx); var alpha = a ? a.evaluate(ctx) : 1; var error = validateRGBA(r, g, b, alpha); if (error) { throw new RuntimeError(error); } return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha); } function has(key, obj) { return key in obj; } function get(key, obj) { var v = obj[key]; return typeof v === 'undefined' ? null : v; } function binarySearch(v, a, i, j) { while (i <= j) { var m = (i + j) >> 1; if (a[m] === v) { return true; } if (a[m] > v) { j = m - 1; } else { i = m + 1; } } return false; } function varargs(type ) { return { type: type }; } CompoundExpression.register(expressions, { 'error': [ ErrorType, [StringType], function (ctx, ref) { var v = ref[0]; throw new RuntimeError(v.evaluate(ctx)); } ], 'typeof': [ StringType, [ValueType], function (ctx, ref) { var v = ref[0]; return toString(typeOf(v.evaluate(ctx))); } ], 'to-rgba': [ array(NumberType, 4), [ColorType], function (ctx, ref) { var v = ref[0]; return v.evaluate(ctx).toArray(); } ], 'rgb': [ ColorType, [NumberType, NumberType, NumberType], rgba ], 'rgba': [ ColorType, [NumberType, NumberType, NumberType, NumberType], rgba ], 'has': { type: BooleanType, overloads: [ [ [StringType], function (ctx, ref) { var key = ref[0]; return has(key.evaluate(ctx), ctx.properties()); } ], [ [StringType, ObjectType], function (ctx, ref) { var key = ref[0]; var obj = ref[1]; return has(key.evaluate(ctx), obj.evaluate(ctx)); } ] ] }, 'get': { type: ValueType, overloads: [ [ [StringType], function (ctx, ref) { var key = ref[0]; return get(key.evaluate(ctx), ctx.properties()); } ], [ [StringType, ObjectType], function (ctx, ref) { var key = ref[0]; var obj = ref[1]; return get(key.evaluate(ctx), obj.evaluate(ctx)); } ] ] }, 'feature-state': [ ValueType, [StringType], function (ctx, ref) { var key = ref[0]; return get(key.evaluate(ctx), ctx.featureState || {}); } ], 'properties': [ ObjectType, [], function (ctx) { return ctx.properties(); } ], 'geometry-type': [ StringType, [], function (ctx) { return ctx.geometryType(); } ], 'id': [ ValueType, [], function (ctx) { return ctx.id(); } ], 'zoom': [ NumberType, [], function (ctx) { return ctx.globals.zoom; } ], 'heatmap-density': [ NumberType, [], function (ctx) { return ctx.globals.heatmapDensity || 0; } ], 'line-progress': [ NumberType, [], function (ctx) { return ctx.globals.lineProgress || 0; } ], 'accumulated': [ ValueType, [], function (ctx) { return ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated; } ], '+': [ NumberType, varargs(NumberType), function (ctx, args) { var result = 0; for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; result += arg.evaluate(ctx); } return result; } ], '*': [ NumberType, varargs(NumberType), function (ctx, args) { var result = 1; for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; result *= arg.evaluate(ctx); } return result; } ], '-': { type: NumberType, overloads: [ [ [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) - b.evaluate(ctx); } ], [ [NumberType], function (ctx, ref) { var a = ref[0]; return -a.evaluate(ctx); } ] ] }, '/': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) / b.evaluate(ctx); } ], '%': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) % b.evaluate(ctx); } ], 'ln2': [ NumberType, [], function () { return Math.LN2; } ], 'pi': [ NumberType, [], function () { return Math.PI; } ], 'e': [ NumberType, [], function () { return Math.E; } ], '^': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var b = ref[0]; var e = ref[1]; return Math.pow(b.evaluate(ctx), e.evaluate(ctx)); } ], 'sqrt': [ NumberType, [NumberType], function (ctx, ref) { var x = ref[0]; return Math.sqrt(x.evaluate(ctx)); } ], 'log10': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)) / Math.LN10; } ], 'ln': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)); } ], 'log2': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)) / Math.LN2; } ], 'sin': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.sin(n.evaluate(ctx)); } ], 'cos': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.cos(n.evaluate(ctx)); } ], 'tan': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.tan(n.evaluate(ctx)); } ], 'asin': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.asin(n.evaluate(ctx)); } ], 'acos': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.acos(n.evaluate(ctx)); } ], 'atan': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.atan(n.evaluate(ctx)); } ], 'min': [ NumberType, varargs(NumberType), function (ctx, args) { return Math.min.apply(Math, args.map(function (arg) { return arg.evaluate(ctx); })); } ], 'max': [ NumberType, varargs(NumberType), function (ctx, args) { return Math.max.apply(Math, args.map(function (arg) { return arg.evaluate(ctx); })); } ], 'abs': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.abs(n.evaluate(ctx)); } ], 'round': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; var 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], function (ctx, ref) { var n = ref[0]; return Math.floor(n.evaluate(ctx)); } ], 'ceil': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.ceil(n.evaluate(ctx)); } ], 'filter-==': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; return ctx.properties()[(k ).value] === (v ).value; } ], 'filter-id-==': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; return ctx.id() === (v ).value; } ], 'filter-type-==': [ BooleanType, [StringType], function (ctx, ref) { var v = ref[0]; return ctx.geometryType() === (v ).value; } ], 'filter-<': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a < b; } ], 'filter-id-<': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a < b; } ], 'filter->': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a > b; } ], 'filter-id->': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a > b; } ], 'filter-<=': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a <= b; } ], 'filter-id-<=': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a <= b; } ], 'filter->=': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a >= b; } ], 'filter-id->=': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a >= b; } ], 'filter-has': [ BooleanType, [ValueType], function (ctx, ref) { var k = ref[0]; return (k ).value in ctx.properties(); } ], 'filter-has-id': [ BooleanType, [], function (ctx) { return ctx.id() !== null; } ], 'filter-type-in': [ BooleanType, [array(StringType)], function (ctx, ref) { var v = ref[0]; return (v ).value.indexOf(ctx.geometryType()) >= 0; } ], 'filter-id-in': [ BooleanType, [array(ValueType)], function (ctx, ref) { var v = ref[0]; return (v ).value.indexOf(ctx.id()) >= 0; } ], 'filter-in-small': [ BooleanType, [StringType, array(ValueType)], // assumes v is an array literal function (ctx, ref) { var k = ref[0]; var v = ref[1]; return (v ).value.indexOf(ctx.properties()[(k ).value]) >= 0; } ], 'filter-in-large': [ BooleanType, [StringType, array(ValueType)], // assumes v is a array literal with values sorted in ascending order and of a single type function (ctx, ref) { var k = ref[0]; var v = ref[1]; return binarySearch(ctx.properties()[(k ).value], (v ).value, 0, (v ).value.length - 1); } ], 'all': { type: BooleanType, overloads: [ [ [BooleanType, BooleanType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) && b.evaluate(ctx); } ], [ varargs(BooleanType), function (ctx, args) { for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; if (!arg.evaluate(ctx)) { return false; } } return true; } ] ] }, 'any': { type: BooleanType, overloads: [ [ [BooleanType, BooleanType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) || b.evaluate(ctx); } ], [ varargs(BooleanType), function (ctx, args) { for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; if (arg.evaluate(ctx)) { return true; } } return false; } ] ] }, '!': [ BooleanType, [BooleanType], function (ctx, ref) { var b = ref[0]; return !b.evaluate(ctx); } ], 'is-supported-script': [ BooleanType, [StringType], // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant function (ctx, ref) { var s = ref[0]; var isSupportedScript = ctx.globals && ctx.globals.isSupportedScript; if (isSupportedScript) { return isSupportedScript(s.evaluate(ctx)); } return true; } ], 'upcase': [ StringType, [StringType], function (ctx, ref) { var s = ref[0]; return s.evaluate(ctx).toUpperCase(); } ], 'downcase': [ StringType, [StringType], function (ctx, ref) { var s = ref[0]; return s.evaluate(ctx).toLowerCase(); } ], 'concat': [ StringType, varargs(ValueType), function (ctx, args) { return args.map(function (arg) { return toString$1(arg.evaluate(ctx)); }).join(''); } ], 'resolved-locale': [ StringType, [CollatorType], function (ctx, ref) { var collator = ref[0]; return collator.evaluate(ctx).resolvedLocale(); } ] }); // /** * A type used for returning and propagating errors. The first element of the union * represents success and contains a value, and the second represents an error and * contains an error value. * @private */ function success (value ) { return { result: 'success', value: value }; } function error (value ) { return { result: 'error', value: value }; } // function supportsPropertyExpression(spec ) { return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven'; } function supportsZoomExpression(spec ) { return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1; } function supportsInterpolation(spec ) { return !!spec.expression && spec.expression.interpolated; } 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; } } function isFunction(value) { return typeof value === 'object' && value !== null && !Array.isArray(value); } function identityFunction(x) { return x; } function createFunction(parameters, propertySpec) { var isColor = propertySpec.type === 'color'; var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object'; var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined; var zoomDependent = zoomAndFeatureDependent || !featureDependent; var type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval'); if (isColor) { parameters = extend$1({}, parameters); if (parameters.stops) { parameters.stops = parameters.stops.map(function (stop) { return [stop[0], Color.parse(stop[1])]; }); } if (parameters.default) { parameters.default = Color.parse(parameters.default); } else { parameters.default = Color.parse(propertySpec.default); } } if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { // eslint-disable-line import/namespace throw new Error(("Unknown color space: " + (parameters.colorSpace))); } var innerFun; var hashedStops; var categoricalKeyType; if (type === 'exponential') { innerFun = evaluateExponentialFunction; } else if (type === 'interval') { innerFun = evaluateIntervalFunction; } else if (type === 'categorical') { innerFun = evaluateCategoricalFunction; // For categorical functions, generate an Object as a hashmap of the stops for fast searching hashedStops = Object.create(null); for (var i = 0, list = parameters.stops; i < list.length; i += 1) { var stop = list[i]; hashedStops[stop[0]] = stop[1]; } // Infer key type based on first stop key-- used to encforce strict type checking later categoricalKeyType = typeof parameters.stops[0][0]; } else if (type === 'identity') { innerFun = evaluateIdentityFunction; } else { throw new Error(("Unknown function type \"" + type + "\"")); } if (zoomAndFeatureDependent) { var featureFunctions = {}; var zoomStops = []; for (var s = 0; s < parameters.stops.length; s++) { var stop$1 = parameters.stops[s]; var zoom = stop$1[0].zoom; if (featureFunctions[zoom] === undefined) { featureFunctions[zoom] = { zoom: zoom, type: parameters.type, property: parameters.property, default: parameters.default, stops: [] }; zoomStops.push(zoom); } featureFunctions[zoom].stops.push([stop$1[0].value, stop$1[1]]); } var featureFunctionStops = []; for (var i$1 = 0, list$1 = zoomStops; i$1 < list$1.length; i$1 += 1) { var z = list$1[i$1]; featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]); } var interpolationType = {name: 'linear'}; return { kind: 'composite', interpolationType: interpolationType, interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType), zoomStops: featureFunctionStops.map(function (s) { return s[0]; }), evaluate: function evaluate(ref, properties) { var zoom = ref.zoom; return evaluateExponentialFunction({ stops: featureFunctionStops, base: parameters.base }, propertySpec, zoom).evaluate(zoom, properties); } }; } else if (zoomDependent) { var interpolationType$1 = type === 'exponential' ? {name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1} : null; return { kind: 'camera', interpolationType: interpolationType$1, interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType$1), zoomStops: parameters.stops.map(function (s) { return s[0]; }), evaluate: function (ref) { var zoom = ref.zoom; return innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType); } }; } else { return { kind: 'source', evaluate: function evaluate(_, feature) { var value = feature && feature.properties ? feature.properties[parameters.property] : undefined; if (value === undefined) { return coalesce(parameters.default, propertySpec.default); } return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType); } }; } } function coalesce(a, b, c) { if (a !== undefined) { return a; } if (b !== undefined) { return b; } if (c !== undefined) { return c; } } function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) { var evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input return coalesce(evaluated, parameters.default, propertySpec.default); } function evaluateIntervalFunction(parameters, propertySpec, input) { // Edge cases if (getType(input) !== 'number') { return coalesce(parameters.default, propertySpec.default); } var n = parameters.stops.length; if (n === 1) { return parameters.stops[0][1]; } if (input <= parameters.stops[0][0]) { return parameters.stops[0][1]; } if (input >= parameters.stops[n - 1][0]) { return parameters.stops[n - 1][1]; } var index = findStopLessThanOrEqualTo(parameters.stops.map(function (stop) { return stop[0]; }), input); return parameters.stops[index][1]; } function evaluateExponentialFunction(parameters, propertySpec, input) { var base = parameters.base !== undefined ? parameters.base : 1; // Edge cases if (getType(input) !== 'number') { return coalesce(parameters.default, propertySpec.default); } var n = parameters.stops.length; if (n === 1) { return parameters.stops[0][1]; } if (input <= parameters.stops[0][0]) { return parameters.stops[0][1]; } if (input >= parameters.stops[n - 1][0]) { return parameters.stops[n - 1][1]; } var index = findStopLessThanOrEqualTo(parameters.stops.map(function (stop) { return stop[0]; }), input); var t = interpolationFactor( input, base, parameters.stops[index][0], parameters.stops[index + 1][0]); var outputLower = parameters.stops[index][1]; var outputUpper = parameters.stops[index + 1][1]; var interp = interpolate[propertySpec.type] || identityFunction; // eslint-disable-line import/namespace if (parameters.colorSpace && parameters.colorSpace !== 'rgb') { var colorspace = colorSpaces[parameters.colorSpace]; // eslint-disable-line import/namespace interp = function (a, b) { return colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t)); }; } if (typeof outputLower.evaluate === 'function') { return { evaluate: function evaluate() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var evaluatedLower = outputLower.evaluate.apply(undefined, args); var evaluatedUpper = outputUpper.evaluate.apply(undefined, args); // Special case for fill-outline-color, which has no spec default. if (evaluatedLower === undefined || evaluatedUpper === undefined) { return undefined; } return interp(evaluatedLower, evaluatedUpper, t); } }; } return interp(outputLower, outputUpper, t); } function evaluateIdentityFunction(parameters, propertySpec, input) { if (propertySpec.type === 'color') { input = Color.parse(input); } else if (propertySpec.type === 'formatted') { input = Formatted.fromString(input.toString()); } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) { input = undefined; } return coalesce(input, parameters.default, propertySpec.default); } /** * Returns a ratio that can be used to interpolate between exponential function * stops. * * How it works: * Two consecutive stop values define a (scaled and shifted) exponential * function `f(x) = a * base^x + b`, where `base` is the user-specified base, * and `a` and `b` are constants affording sufficient degrees of freedom to fit * the function to the given stops. * * Here's a bit of algebra that lets us compute `f(x)` directly from the stop * values without explicitly solving for `a` and `b`: * * First stop value: `f(x0) = y0 = a * base^x0 + b` * Second stop value: `f(x1) = y1 = a * base^x1 + b` * => `y1 - y0 = a(base^x1 - base^x0)` * => `a = (y1 - y0)/(base^x1 - base^x0)` * * Desired value: `f(x) = y = a * base^x + b` * => `f(x) = y0 + a * (base^x - base^x0)` * * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a * little algebra: * ``` * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0) * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0) * ``` * * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as * an interpolation factor between the two stops' output values. * * (Note: a slightly different form for `ratio`, * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer * expensive `Math.pow()` operations.) * * @private */ function interpolationFactor(input, base, lowerValue, upperValue) { var difference = upperValue - lowerValue; var progress = input - lowerValue; if (difference === 0) { return 0; } else if (base === 1) { return progress / difference; } else { return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } // var StyleExpression = function StyleExpression(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; }; StyleExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState , formattedSection ) { this._evaluator.globals = globals; this._evaluator.feature = feature; this._evaluator.featureState = featureState; this._evaluator.formattedSection = formattedSection; return this.expression.evaluate(this._evaluator); }; StyleExpression.prototype.evaluate = function evaluate (globals , feature , featureState , formattedSection ) { this._evaluator.globals = globals; this._evaluator.feature = feature || null; this._evaluator.featureState = featureState || null; this._evaluator.formattedSection = formattedSection || null; try { var val = this.expression.evaluate(this._evaluator); if (val === null || val === undefined) { return this._defaultValue; } if (this._enumValues && !(val in this._enumValues)) { throw new RuntimeError(("Expected value to be one of " + (Object.keys(this._enumValues).map(function (v) { return JSON.stringify(v); }).join(', ')) + ", but found " + (JSON.stringify(val)) + " instead.")); } return val; } catch (e) { if (!this._warningHistory[e.message]) { this._warningHistory[e.message] = true; if (typeof console !== 'undefined') { console.warn(e.message); } } return this._defaultValue; } }; 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 ) { var parser = new ParsingContext(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined); // For string-valued properties, coerce to string at the top level rather than asserting. var 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); } return success(new StyleExpression(parsed, propertySpec)); } var ZoomConstantExpression = function ZoomConstantExpression(kind , expression ) { this.kind = kind; this._styleExpression = expression; this.isStateDependent = kind !== ('constant' ) && !isStateConstant(expression.expression); }; ZoomConstantExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState , formattedSection ) { return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, formattedSection); }; ZoomConstantExpression.prototype.evaluate = function evaluate (globals , feature , featureState , formattedSection ) { return this._styleExpression.evaluate(globals, feature, featureState, formattedSection); }; var ZoomDependentExpression = function ZoomDependentExpression(kind , expression , zoomStops , interpolationType ) { this.kind = kind; this.zoomStops = zoomStops; this._styleExpression = expression; this.isStateDependent = kind !== ('camera' ) && !isStateConstant(expression.expression); this.interpolationType = interpolationType; }; ZoomDependentExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState , formattedSection ) { return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, formattedSection); }; ZoomDependentExpression.prototype.evaluate = function evaluate (globals , feature , featureState , formattedSection ) { return this._styleExpression.evaluate(globals, feature, featureState, formattedSection); }; ZoomDependentExpression.prototype.interpolationFactor = function interpolationFactor (input , lower , upper ) { if (this.interpolationType) { return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper); } else { return 0; } }; function createPropertyExpression(expression , propertySpec ) { expression = createExpression(expression, propertySpec); if (expression.result === 'error') { return expression; } var parsed = expression.value.expression; var isFeatureConstant$1 = isFeatureConstant(parsed); if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) { return error([new ParsingError('', 'data expressions not supported')]); } var isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom']); if (!isZoomConstant && !supportsZoomExpression(propertySpec)) { return error([new ParsingError('', 'zoom expressions not supported')]); } var zoomCurve = findZoomCurve(parsed); if (!zoomCurve && !isZoomConstant) { return error([new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]); } else if (zoomCurve instanceof ParsingError) { return error([zoomCurve]); } else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) { return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]); } if (!zoomCurve) { return success(isFeatureConstant$1 ? (new ZoomConstantExpression('constant', expression.value) ) : (new ZoomConstantExpression('source', expression.value) )); } var interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined; return success(isFeatureConstant$1 ? (new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) ) : (new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType) )); } // serialization wrapper for old-style stop functions normalized to the // expression interface var StylePropertyFunction = function StylePropertyFunction(parameters , specification ) { this._parameters = parameters; this._specification = specification; extend$1(this, createFunction(this._parameters, this._specification)); }; StylePropertyFunction.deserialize = function deserialize (serialized ) { return ((new StylePropertyFunction(serialized._parameters, serialized._specification)) ); }; StylePropertyFunction.serialize = function serialize (input ) { return { _parameters: input._parameters, _specification: input._specification }; }; function normalizePropertyExpression (value , specification ) { if (isFunction(value)) { return (new StylePropertyFunction(value, specification) ); } else if (isExpression(value)) { var expression = createPropertyExpression(value, specification); if (expression.result === 'error') { // this should have been caught in validation throw new Error(expression.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } return expression.value; } else { var constant = value; if (typeof value === 'string' && specification.type === 'color') { constant = Color.parse(value); } return { kind: 'constant', evaluate: function () { return constant; } }; } } // Zoom-dependent expressions may only use ["zoom"] as the input to a top-level "step" or "interpolate" // expression (collectively referred to as a "curve"). The curve may be wrapped in one or more "let" or // "coalesce" expressions. function findZoomCurve(expression ) { var result = null; if (expression instanceof Let) { result = findZoomCurve(expression.result); } else if (expression instanceof Coalesce) { for (var i = 0, list = expression.args; i < list.length; i += 1) { var arg = list[i]; result = findZoomCurve(arg); if (result) { break; } } } else if ((expression instanceof Step || expression instanceof Interpolate) && expression.input instanceof CompoundExpression && expression.input.name === 'zoom') { result = expression; } if (result instanceof ParsingError) { return result; } expression.eachChild(function (child) { var childResult = findZoomCurve(child); if (childResult instanceof ParsingError) { result = childResult; } else if (!result && childResult) { result = new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'); } else if (result && childResult && result !== childResult) { result = new ParsingError('', 'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'); } }); return result; } function getExpectedType(spec ) { var types = { color: ColorType, string: StringType, number: NumberType, enum: StringType, boolean: BooleanType, formatted: FormattedType }; 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 validateObject(options) { var key = options.key; var object = options.value; var elementSpecs = options.valueSpec || {}; var elementValidators = options.objectElementValidators || {}; var style = options.style; var styleSpec = options.styleSpec; var errors = []; var type = getType(object); if (type !== 'object') { return [new ValidationError(key, object, ("object expected, " + type + " found"))]; } for (var objectKey in object) { var elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint' var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*']; var validateElement = (void 0); if (elementValidators[elementSpecKey]) { validateElement = elementValidators[elementSpecKey]; } else if (elementSpecs[elementSpecKey]) { validateElement = validate; } else if (elementValidators['*']) { validateElement = elementValidators['*']; } else if (elementSpecs['*']) { validateElement = validate; } else { errors.push(new ValidationError(key, object[objectKey], ("unknown property \"" + objectKey + "\""))); continue; } errors = errors.concat(validateElement({ key: (key ? (key + ".") : key) + objectKey, value: object[objectKey], valueSpec: elementSpec, style: style, styleSpec: styleSpec, object: object, objectKey: objectKey }, object)); } for (var elementSpecKey$1 in elementSpecs) { // Don't check `required` when there's a custom validator for that property. if (elementValidators[elementSpecKey$1]) { continue; } if (elementSpecs[elementSpecKey$1].required && elementSpecs[elementSpecKey$1]['default'] === undefined && object[elementSpecKey$1] === undefined) { errors.push(new ValidationError(key, object, ("missing required property \"" + elementSpecKey$1 + "\""))); } } return errors; } function validateArray(options) { var array = options.value; var arraySpec = options.valueSpec; var style = options.style; var styleSpec = options.styleSpec; var key = options.key; var validateArrayElement = options.arrayElementValidator || validate; if (getType(array) !== 'array') { return [new ValidationError(key, array, ("array expected, " + (getType(array)) + " found"))]; } if (arraySpec.length && array.length !== arraySpec.length) { return [new ValidationError(key, array, ("array length " + (arraySpec.length) + " expected, length " + (array.length) + " found"))]; } if (arraySpec['min-length'] && array.length < arraySpec['min-length']) { return [new ValidationError(key, array, ("array length at least " + (arraySpec['min-length']) + " expected, length " + (array.length) + " found"))]; } var arrayElementSpec = { "type": arraySpec.value, "values": arraySpec.values }; if (styleSpec.$version < 7) { arrayElementSpec.function = arraySpec.function; } if (getType(arraySpec.value) === 'object') { arrayElementSpec = arraySpec.value; } var errors = []; for (var i = 0; i < array.length; i++) { errors = errors.concat(validateArrayElement({ array: array, arrayIndex: i, value: array[i], valueSpec: arrayElementSpec, style: style, styleSpec: styleSpec, key: (key + "[" + i + "]") })); } return errors; } function validateNumber(options) { var key = options.key; var value = options.value; var valueSpec = options.valueSpec; var type = getType(value); if (type !== 'number') { return [new ValidationError(key, value, ("number expected, " + type + " found"))]; } if ('minimum' in valueSpec && value < valueSpec.minimum) { return [new ValidationError(key, value, (value + " is less than the minimum value " + (valueSpec.minimum)))]; } if ('maximum' in valueSpec && value > valueSpec.maximum) { return [new ValidationError(key, value, (value + " is greater than the maximum value " + (valueSpec.maximum)))]; } return []; } function validateFunction(options) { var functionValueSpec = options.valueSpec; var functionType = unbundle(options.value.type); var stopKeyType; var stopDomainValues = {}; var previousStopDomainValue; var previousStopDomainZoom; var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined; var isPropertyFunction = !isZoomFunction; var isZoomAndPropertyFunction = getType(options.value.stops) === 'array' && getType(options.value.stops[0]) === 'array' && getType(options.value.stops[0][0]) === 'object'; var errors = validateObject({ key: options.key, value: options.value, valueSpec: options.styleSpec.function, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { stops: validateFunctionStops, default: validateFunctionDefault } }); if (functionType === 'identity' && isZoomFunction) { errors.push(new ValidationError(options.key, options.value, 'missing required property "property"')); } if (functionType !== 'identity' && !options.value.stops) { errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"')); } if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) { errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported')); } 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')); } } if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) { errors.push(new ValidationError(options.key, options.value, '"property" property is required')); } return errors; function validateFunctionStops(options) { if (functionType === 'identity') { return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')]; } var errors = []; var value = options.value; errors = errors.concat(validateArray({ key: options.key, value: value, valueSpec: options.valueSpec, style: options.style, styleSpec: options.styleSpec, arrayElementValidator: validateFunctionStop })); if (getType(value) === 'array' && value.length === 0) { errors.push(new ValidationError(options.key, value, 'array must have at least one stop')); } return errors; } function validateFunctionStop(options) { var errors = []; var value = options.value; var key = options.key; if (getType(value) !== 'array') { return [new ValidationError(key, value, ("array expected, " + (getType(value)) + " found"))]; } if (value.length !== 2) { return [new ValidationError(key, value, ("array length 2 expected, length " + (value.length) + " found"))]; } if (isZoomAndPropertyFunction) { if (getType(value[0]) !== 'object') { return [new ValidationError(key, value, ("object expected, " + (getType(value[0])) + " found"))]; } if (value[0].zoom === undefined) { return [new ValidationError(key, value, 'object stop key must have zoom')]; } if (value[0].value === undefined) { return [new ValidationError(key, value, 'object stop key must have value')]; } if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) { return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')]; } if (unbundle(value[0].zoom) !== previousStopDomainZoom) { previousStopDomainZoom = unbundle(value[0].zoom); previousStopDomainValue = undefined; stopDomainValues = {}; } errors = errors.concat(validateObject({ key: (key + "[0]"), value: value[0], valueSpec: { zoom: {} }, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue } })); } else { errors = errors.concat(validateStopDomainValue({ key: (key + "[0]"), value: value[0], valueSpec: {}, style: options.style, styleSpec: options.styleSpec }, value)); } if (isExpression(deepUnbundle(value[1]))) { return errors.concat([new ValidationError((key + "[1]"), value[1], 'expressions are not allowed in function stops.')]); } return errors.concat(validate({ key: (key + "[1]"), value: value[1], valueSpec: functionValueSpec, style: options.style, styleSpec: options.styleSpec })); } function validateStopDomainValue(options, stop) { var type = getType(options.value); var value = unbundle(options.value); var reportValue = options.value !== null ? options.value : stop; if (!stopKeyType) { stopKeyType = type; } else if (type !== stopKeyType) { return [new ValidationError(options.key, reportValue, (type + " stop domain type must match previous stop domain type " + stopKeyType))]; } if (type !== 'number' && type !== 'string' && type !== 'boolean') { return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')]; } if (type !== 'number' && functionType !== 'categorical') { var message = "number expected, " + type + " found"; if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) { message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.'; } return [new ValidationError(options.key, reportValue, message)]; } if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) { return [new ValidationError(options.key, reportValue, ("integer expected, found " + value))]; } if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) { return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')]; } else { previousStopDomainValue = value; } if (functionType === 'categorical' && value in stopDomainValues) { return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')]; } else { stopDomainValues[value] = true; } return []; } function validateFunctionDefault(options) { return validate({ key: options.key, value: options.value, valueSpec: functionValueSpec, style: options.style, styleSpec: options.styleSpec }); } } // function validateExpression(options ) { var expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec); if (expression.result === 'error') { return expression.value.map(function (error) { return new ValidationError(("" + (options.key) + (error.key)), options.value, error.message); }); } var expressionObj = (expression.value ).expression || (expression.value )._styleExpression.expression; if (options.expressionContext === 'property' && (options.propertyKey === 'text-font') && expressionObj.possibleOutputs().indexOf(undefined) !== -1) { return [new ValidationError(options.key, options.value, ("Invalid data expression for \"" + (options.propertyKey) + "\". Output values must be contained as literals within the expression."))]; } 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.')]; } if (options.expressionContext === 'filter' && !isStateConstant(expressionObj)) { return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with filters.')]; } 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.')]; } } return []; } function validateBoolean(options) { var value = options.value; var key = options.key; var type = getType(value); if (type !== 'boolean') { return [new ValidationError(key, value, ("boolean expected, " + type + " found"))]; } return []; } function validateColor(options) { var key = options.key; var value = options.value; var type = getType(value); if (type !== 'string') { return [new ValidationError(key, value, ("color expected, " + type + " found"))]; } if (csscolorparser_1(value) === null) { return [new ValidationError(key, value, ("color expected, \"" + value + "\" found"))]; } return []; } function validateEnum(options) { var key = options.key; var value = options.value; var valueSpec = options.valueSpec; var errors = []; if (Array.isArray(valueSpec.values)) { // <=v7 if (valueSpec.values.indexOf(unbundle(value)) === -1) { errors.push(new ValidationError(key, value, ("expected one of [" + (valueSpec.values.join(', ')) + "], " + (JSON.stringify(value)) + " found"))); } } else { // >=v8 if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) { errors.push(new ValidationError(key, value, ("expected one of [" + (Object.keys(valueSpec.values).join(', ')) + "], " + (JSON.stringify(value)) + " found"))); } } return errors; } // function isExpressionFilter(filter ) { if (filter === true || filter === false) { return true; } if (!Array.isArray(filter) || filter.length === 0) { return false; } switch (filter[0]) { case 'has': return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type'; case 'in': case '!in': case '!has': case 'none': return false; case '==': case '!=': case '>': case '>=': case '<': case '<=': return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2])); case 'any': case 'all': for (var i = 0, list = filter.slice(1); i < list.length; i += 1) { var f = list[i]; if (!isExpressionFilter(f) && typeof f !== 'boolean') { return false; } } return true; default: return true; } } var filterSpec = { 'type': 'boolean', 'default': false, 'transition': false, 'property-type': 'data-driven', 'expression': { 'interpolated': false, 'parameters': ['zoom', 'feature'] } }; /** * Given a filter expressed as nested arrays, return a new function * that evaluates whether a given feature (with a .properties or .tags property) * passes its test. * * @private * @param {Array} filter mapbox gl filter * @returns {Function} filter-evaluating function */ function createFilter(filter ) { if (filter === null || filter === undefined) { return function () { return true; }; } if (!isExpressionFilter(filter)) { filter = convertFilter(filter); } var compiled = createExpression(filter, filterSpec); if (compiled.result === 'error') { throw new Error(compiled.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } else { return function (globalProperties , feature ) { return compiled.value.evaluate(globalProperties, feature); }; } } // Comparison function to sort numbers and strings function compare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } function convertFilter(filter ) { if (!filter) { return true; } var op = filter[0]; if (filter.length <= 1) { return (op !== 'any'); } var converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') : op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) : op === '<' || op === '>' || op === '<=' || op === '>=' ? convertComparisonOp(filter[1], filter[2], op) : op === 'any' ? convertDisjunctionOp(filter.slice(1)) : op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) : op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) : op === 'in' ? convertInOp(filter[1], filter.slice(2)) : op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) : op === 'has' ? convertHasOp(filter[1]) : op === '!has' ? convertNegation(convertHasOp(filter[1])) : true; return converted; } function convertComparisonOp(property , value , op ) { switch (property) { case '$type': return [("filter-type-" + op), value]; case '$id': return [("filter-id-" + op), value]; default: return [("filter-" + op), property, value]; } } function convertDisjunctionOp(filters ) { return ['any'].concat(filters.map(convertFilter)); } function convertInOp(property , values ) { if (values.length === 0) { return false; } switch (property) { case '$type': return ["filter-type-in", ['literal', values]]; case '$id': return ["filter-id-in", ['literal', values]]; default: if (values.length > 200 && !values.some(function (v) { return typeof v !== typeof values[0]; })) { return ['filter-in-large', property, ['literal', values.sort(compare)]]; } else { return ['filter-in-small', property, ['literal', values]]; } } } function convertHasOp(property ) { switch (property) { case '$type': return true; case '$id': return ["filter-has-id"]; default: return ["filter-has", property]; } } function convertNegation(filter ) { return ['!', filter]; } function validateFilter(options) { if (isExpressionFilter(deepUnbundle(options.value))) { return validateExpression(extend$1({}, options, { expressionContext: 'filter', valueSpec: { value: 'boolean' } })); } else { return validateNonExpressionFilter(options); } } function validateNonExpressionFilter(options) { var value = options.value; var key = options.key; if (getType(value) !== 'array') { return [new ValidationError(key, value, ("array expected, " + (getType(value)) + " found"))]; } var styleSpec = options.styleSpec; var type; var errors = []; if (value.length < 1) { return [new ValidationError(key, value, 'filter array must have at least 1 element')]; } errors = errors.concat(validateEnum({ key: (key + "[0]"), value: value[0], valueSpec: styleSpec.filter_operator, style: options.style, styleSpec: options.styleSpec })); switch (unbundle(value[0])) { case '<': case '<=': case '>': case '>=': if (value.length >= 2 && unbundle(value[1]) === '$type') { errors.push(new ValidationError(key, value, ("\"$type\" cannot be use with operator \"" + (value[0]) + "\""))); } /* falls through */ case '==': case '!=': if (value.length !== 3) { errors.push(new ValidationError(key, value, ("filter array for operator \"" + (value[0]) + "\" must have 3 elements"))); } /* falls through */ case 'in': case '!in': if (value.length >= 2) { type = getType(value[1]); if (type !== 'string') { errors.push(new ValidationError((key + "[1]"), value[1], ("string expected, " + type + " found"))); } } for (var i = 2; i < value.length; i++) { type = getType(value[i]); if (unbundle(value[1]) === '$type') { errors = errors.concat(validateEnum({ key: (key + "[" + i + "]"), value: value[i], valueSpec: styleSpec.geometry_type, style: options.style, styleSpec: options.styleSpec })); } else if (type !== 'string' && type !== 'number' && type !== 'boolean') { errors.push(new ValidationError((key + "[" + i + "]"), value[i], ("string, number, or boolean expected, " + type + " found"))); } } break; case 'any': case 'all': case 'none': for (var i$1 = 1; i$1 < value.length; i$1++) { errors = errors.concat(validateNonExpressionFilter({ key: (key + "[" + i$1 + "]"), value: value[i$1], style: options.style, styleSpec: options.styleSpec })); } break; case 'has': case '!has': type = getType(value[1]); if (value.length !== 2) { errors.push(new ValidationError(key, value, ("filter array for \"" + (value[0]) + "\" operator must have 2 elements"))); } else if (type !== 'string') { errors.push(new ValidationError((key + "[1]"), value[1], ("string expected, " + type + " found"))); } break; } return errors; } function validateProperty(options, propertyType) { var key = options.key; var style = options.style; var styleSpec = options.styleSpec; var value = options.value; var propertyKey = options.objectKey; var layerSpec = styleSpec[(propertyType + "_" + (options.layerType))]; if (!layerSpec) { return []; } var transitionMatch = propertyKey.match(/^(.*)-transition$/); if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) { return validate({ key: key, value: value, valueSpec: styleSpec.transition, style: style, styleSpec: styleSpec }); } var valueSpec = options.valueSpec || layerSpec[propertyKey]; if (!valueSpec) { return [new ValidationError(key, value, ("unknown property \"" + propertyKey + "\""))]; } var tokenMatch; if (getType(value) === 'string' && 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])) + " }`.")]; } var errors = []; if (options.layerType === 'symbol') { if (propertyKey === 'text-field' && style && !style.glyphs) { errors.push(new ValidationError(key, value, 'use of "text-field" requires a style "glyphs" property')); } if (propertyKey === 'text-font' && isFunction(deepUnbundle(value)) && unbundle(value.type) === 'identity') { errors.push(new ValidationError(key, value, '"text-font" does not support identity functions')); } } return errors.concat(validate({ key: options.key, value: value, valueSpec: valueSpec, style: style, styleSpec: styleSpec, expressionContext: 'property', propertyType: propertyType, propertyKey: propertyKey })); } function validatePaintProperty(options) { return validateProperty(options, 'paint'); } function validateLayoutProperty(options) { return validateProperty(options, 'layout'); } function validateLayer(options) { var errors = []; var layer = options.value; var key = options.key; var style = options.style; var styleSpec = options.styleSpec; if (!layer.type && !layer.ref) { errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required')); } var type = unbundle(layer.type); var ref = unbundle(layer.ref); if (layer.id) { var layerId = unbundle(layer.id); for (var i = 0; i < options.arrayIndex; i++) { var otherLayer = style.layers[i]; if (unbundle(otherLayer.id) === layerId) { errors.push(new ValidationError(key, layer.id, ("duplicate layer id \"" + (layer.id) + "\", previously used at line " + (otherLayer.id.__line__)))); } } } if ('ref' in layer) { ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) { if (p in layer) { errors.push(new ValidationError(key, layer[p], ("\"" + p + "\" is prohibited for ref layers"))); } }); var parent; style.layers.forEach(function (layer) { if (unbundle(layer.id) === ref) { parent = layer; } }); if (!parent) { errors.push(new ValidationError(key, layer.ref, ("ref layer \"" + ref + "\" not found"))); } else if (parent.ref) { errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer')); } else { type = unbundle(parent.type); } } else if (type !== 'background') { if (!layer.source) { errors.push(new ValidationError(key, layer, 'missing required property "source"')); } else { var source = style.sources && style.sources[layer.source]; var sourceType = source && unbundle(source.type); if (!source) { errors.push(new ValidationError(key, layer.source, ("source \"" + (layer.source) + "\" not found"))); } else if (sourceType === 'vector' && type === 'raster') { errors.push(new ValidationError(key, layer.source, ("layer \"" + (layer.id) + "\" requires a raster source"))); } else if (sourceType === 'raster' && type !== 'raster') { errors.push(new ValidationError(key, layer.source, ("layer \"" + (layer.id) + "\" requires a vector source"))); } else if (sourceType === 'vector' && !layer['source-layer']) { errors.push(new ValidationError(key, layer, ("layer \"" + (layer.id) + "\" must specify a \"source-layer\""))); } else if (sourceType === 'raster-dem' && type !== 'hillshade') { errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \'hillshade\'.')); } 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."))); } } } errors = errors.concat(validateObject({ key: key, value: layer, valueSpec: styleSpec.layer, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _() { return []; }, // We don't want to enforce the spec's `"requires": true` for backward compatibility with refs; // the actual requirement is validated above. See https://github.com/mapbox/mapbox-gl-js/issues/5772. type: function type() { return validate({ key: (key + ".type"), value: layer.type, valueSpec: styleSpec.layer.type, style: options.style, styleSpec: options.styleSpec, object: layer, objectKey: 'type' }); }, filter: validateFilter, layout: function layout(options) { return validateObject({ layer: layer, key: options.key, value: options.value, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _(options) { return validateLayoutProperty(extend$1({layerType: type}, options)); } } }); }, paint: function paint(options) { return validateObject({ layer: layer, key: options.key, value: options.value, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _(options) { return validatePaintProperty(extend$1({layerType: type}, options)); } } }); } } })); return errors; } function validateSource(options) { var value = options.value; var key = options.key; var styleSpec = options.styleSpec; var style = options.style; if (!value.type) { return [new ValidationError(key, value, '"type" is required')]; } var type = unbundle(value.type); var errors; switch (type) { case 'vector': case 'raster': case 'raster-dem': errors = validateObject({ key: key, value: value, valueSpec: styleSpec[("source_" + (type.replace('-', '_')))], style: options.style, styleSpec: styleSpec }); return errors; case 'geojson': errors = validateObject({ key: key, value: value, valueSpec: styleSpec.source_geojson, style: style, styleSpec: styleSpec }); if (value.cluster) { for (var prop in value.clusterProperties) { var ref = value.clusterProperties[prop]; var operator = ref[0]; var mapExpr = ref[1]; var reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator; errors.push.apply(errors, validateExpression({ key: (key + "." + prop + ".map"), value: mapExpr, expressionContext: 'cluster-map' })); errors.push.apply(errors, validateExpression({ key: (key + "." + prop + ".reduce"), value: reduceExpr, expressionContext: 'cluster-reduce' })); } } return errors; case 'video': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_video, style: style, styleSpec: styleSpec }); case 'image': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_image, style: style, styleSpec: styleSpec }); case 'canvas': return [new ValidationError(key, null, "Please use runtime APIs to add canvas sources, rather than including them in stylesheets.", 'source.canvas')]; default: return validateEnum({ key: (key + ".type"), value: value.type, valueSpec: {values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']}, style: style, styleSpec: styleSpec }); } } function validateLight(options) { var light = options.value; var styleSpec = options.styleSpec; var lightSpec = styleSpec.light; var style = options.style; var errors = []; var rootType = getType(light); if (light === undefined) { return errors; } else if (rootType !== 'object') { errors = errors.concat([new ValidationError('light', light, ("object expected, " + rootType + " found"))]); return errors; } for (var key in light) { var transitionMatch = key.match(/^(.*)-transition$/); if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) { errors = errors.concat(validate({ key: key, value: light[key], valueSpec: styleSpec.transition, style: style, styleSpec: styleSpec })); } else if (lightSpec[key]) { errors = errors.concat(validate({ key: key, value: light[key], valueSpec: lightSpec[key], style: style, styleSpec: styleSpec })); } else { errors = errors.concat([new ValidationError(key, light[key], ("unknown property \"" + key + "\""))]); } } return errors; } function validateString(options) { var value = options.value; var key = options.key; var type = getType(value); if (type !== 'string') { return [new ValidationError(key, value, ("string expected, " + type + " found"))]; } return []; } // function validateFormatted(options ) { if (validateString(options).length === 0) { return []; } return validateExpression(options); } var VALIDATORS = { '*': function _() { 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, 'string': validateString, 'formatted': validateFormatted }; // 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. function validate(options) { var value = options.value; var valueSpec = options.valueSpec; var styleSpec = options.styleSpec; if (valueSpec.expression && isFunction(unbundle(value))) { return validateFunction(options); } else if (valueSpec.expression && isExpression(deepUnbundle(value))) { return validateExpression(options); } else if (valueSpec.type && VALIDATORS[valueSpec.type]) { return VALIDATORS[valueSpec.type](options); } else { var valid = validateObject(extend$1({}, options, { valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec })); return valid; } } function validateGlyphsURL(options) { var value = options.value; var key = options.key; var errors = validateString(options); if (errors.length) { return errors; } if (value.indexOf('{fontstack}') === -1) { errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token')); } if (value.indexOf('{range}') === -1) { errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token')); } return errors; } /** * Validate a Mapbox GL style against the style specification. This entrypoint, * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as * small a browserify bundle as possible by omitting unnecessary functionality * and legacy style specifications. * * @private * @param {Object} style The style to be validated. * @param {Object} [styleSpec] The style specification to validate against. * If omitted, the latest style spec is used. * @returns {Array} * @example * var validate = require('mapbox-gl-style-spec/lib/validate_style.min'); * var errors = validate(style); */ function validateStyleMin(style, styleSpec) { styleSpec = styleSpec || spec; var errors = []; errors = errors.concat(validate({ key: '', value: style, valueSpec: styleSpec.$root, styleSpec: styleSpec, style: style, objectElementValidators: { glyphs: validateGlyphsURL, '*': function _() { return []; } } })); if (style.constants) { errors = errors.concat(validateConstants({ key: 'constants', value: style.constants, style: style, styleSpec: styleSpec })); } return sortErrors(errors); } validateStyleMin.source = wrapCleanErrors(validateSource); validateStyleMin.light = wrapCleanErrors(validateLight); validateStyleMin.layer = wrapCleanErrors(validateLayer); validateStyleMin.filter = wrapCleanErrors(validateFilter); validateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty); validateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty); function sortErrors(errors) { return [].concat(errors).sort(function (a, b) { return a.line - b.line; }); } function wrapCleanErrors(inner) { return function() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return sortErrors(inner.apply(this, args)); }; } // var validateStyle = (validateStyleMin ); var validateSource$1 = validateStyle.source; var validateLight$1 = validateStyle.light; var validateFilter$1 = validateStyle.filter; var validatePaintProperty$1 = validateStyle.paintProperty; var validateLayoutProperty$1 = validateStyle.layoutProperty; function emitValidationErrors(emitter , errors ) { var hasErrors = false; if (errors && errors.length) { for (var i = 0, list = errors; i < list.length; i += 1) { var error = list[i]; emitter.fire(new ErrorEvent(new Error(error.message))); hasErrors = true; } } return hasErrors; } 'use strict'; var gridIndex = GridIndex; var NUM_PARAMS = 3; function GridIndex(extent, n, padding) { var cells = this.cells = []; if (extent instanceof ArrayBuffer) { this.arrayBuffer = extent; var array = new Int32Array(this.arrayBuffer); extent = array[0]; n = array[1]; padding = array[2]; this.d = n + 2 * padding; for (var k = 0; k < this.d * this.d; k++) { var start = array[NUM_PARAMS + k]; var end = array[NUM_PARAMS + k + 1]; cells.push(start === end ? null : array.subarray(start, end)); } var keysOffset = array[NUM_PARAMS + cells.length]; var bboxesOffset = array[NUM_PARAMS + cells.length + 1]; this.keys = array.subarray(keysOffset, bboxesOffset); this.bboxes = array.subarray(bboxesOffset); this.insert = this._insertReadonly; } else { this.d = n + 2 * padding; for (var i = 0; i < this.d * this.d; i++) { cells.push([]); } this.keys = []; this.bboxes = []; } this.n = n; this.extent = extent; this.padding = padding; this.scale = n / extent; this.uid = 0; var p = (padding / n) * extent; this.min = -p; this.max = extent + p; } GridIndex.prototype.insert = function(key, x1, y1, x2, y2) { this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++); this.keys.push(key); this.bboxes.push(x1); this.bboxes.push(y1); this.bboxes.push(x2); this.bboxes.push(y2); }; GridIndex.prototype._insertReadonly = function() { throw 'Cannot insert into a GridIndex created from an ArrayBuffer.'; }; GridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) { this.cells[cellIndex].push(uid); }; GridIndex.prototype.query = function(x1, y1, x2, y2, 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); } else { var result = []; var seenUids = {}; this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest); return result; } }; 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; } } } } }; 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; } } } }; 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; }; // var ImageData = self.ImageData; // eslint-disable-line var registry = {}; /** * Register the given class as serializable. * * @param options * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties) * @param options.shallow List of properties that should be serialized by a simple shallow copy, rather than by a recursive call to serialize(). * * @private */ function register (name , klass , options) { if ( options === void 0 ) options = {}; assert_1(!registry[name], (name + " is already registered.")); (Object.defineProperty )(klass, '_classRegistryKey', { value: name, writeable: false }); registry[name] = { klass: klass, omit: options.omit || [], shallow: options.shallow || [] }; } register('Object', Object); gridIndex.serialize = function serialize(grid , transferables ) { var buffer = grid.toArrayBuffer(); if (transferables) { transferables.push(buffer); } return {buffer: buffer}; }; gridIndex.deserialize = function deserialize(serialized ) { return new gridIndex(serialized.buffer); }; register('Grid', gridIndex); register('Color', Color); register('Error', Error); register('StylePropertyFunction', StylePropertyFunction); register('StyleExpression', StyleExpression, {omit: ['_evaluator']}); register('ZoomDependentExpression', ZoomDependentExpression); register('ZoomConstantExpression', ZoomConstantExpression); register('CompoundExpression', CompoundExpression, {omit: ['_evaluate']}); for (var name$1 in expressions) { if ((expressions[name$1] )._classRegistryKey) { continue; } register(("Expression_" + name$1), expressions[name$1]); } /** * Serialize the given object for transfer to or from a web worker. * * For non-builtin types, recursively serialize each property (possibly * omitting certain properties - see register()), and package the result along * with the constructor's `name` so that the appropriate constructor can be * looked up in `deserialize()`. * * If a `transferables` array is provided, add any transferable objects (i.e., * any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed, * this should happen in the client code, before using serialize().) * * @private */ function serialize(input , transferables ) { if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp) { return input; } if (input instanceof ArrayBuffer) { if (transferables) { transferables.push(input); } return input; } if (ArrayBuffer.isView(input)) { var view = (input ); if (transferables) { transferables.push(view.buffer); } return view; } if (input instanceof ImageData) { if (transferables) { transferables.push(input.data.buffer); } return input; } if (Array.isArray(input)) { var serialized = []; for (var i = 0, list = input; i < list.length; i += 1) { var item = list[i]; serialized.push(serialize(item, transferables)); } return serialized; } if (typeof input === 'object') { var klass = (input.constructor ); var name = klass._classRegistryKey; if (!name) { throw new Error("can't serialize object of unregistered class"); } assert_1(registry[name]); var 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 (!klass.serialize) { for (var key in input) { // any cast due to https://github.com/facebook/flow/issues/5393 if (!(input ).hasOwnProperty(key)) { continue; } if (registry[name].omit.indexOf(key) >= 0) { continue; } var property = (input )[key]; properties[key] = registry[name].shallow.indexOf(key) >= 0 ? property : serialize(property, transferables); } 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 (name !== 'Object') { properties.$name = name; } return properties; } throw new Error(("can't serialize object of type " + (typeof input))); } function deserialize(input ) { if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp || input instanceof ArrayBuffer || ArrayBuffer.isView(input) || input instanceof ImageData) { return input; } if (Array.isArray(input)) { return input.map(deserialize); } if (typeof input === 'object') { var name = (input ).$name || 'Object'; var ref = registry[name]; var klass = ref.klass; if (!klass) { throw new Error(("can't deserialize unregistered class " + name)); } if (klass.deserialize) { return (klass.deserialize )(input); } var result = Object.create(klass.prototype); for (var i = 0, list = Object.keys(input); i < list.length; i += 1) { var key = list[i]; if (key === '$name') { continue; } var value = (input )[key]; result[key] = registry[name].shallow.indexOf(key) >= 0 ? value : deserialize(value); } return result; } throw new Error(("can't deserialize object of type " + (typeof input))); } // var ZoomHistory = function ZoomHistory() { this.first = true; }; ZoomHistory.prototype.update = function update (z , now ) { var floorZ = Math.floor(z); if (this.first) { this.first = false; this.lastIntegerZoom = floorZ; this.lastIntegerZoomTime = 0; this.lastZoom = z; this.lastFloorZoom = floorZ; return true; } if (this.lastFloorZoom > floorZ) { this.lastIntegerZoom = floorZ + 1; this.lastIntegerZoomTime = now; } else if (this.lastFloorZoom < floorZ) { this.lastIntegerZoom = floorZ; this.lastIntegerZoomTime = now; } if (z !== this.lastZoom) { this.lastZoom = z; this.lastFloorZoom = floorZ; return true; } return false; }; // // The following table comes from . // Keep it synchronized with . var unicodeBlockLookup = { // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F, 'Latin-1 Supplement': function (char) { return char >= 0x0080 && char <= 0x00FF; }, // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F, // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F, // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF, // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF, // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F, // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF, // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF, // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F, // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F, //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF, 'Arabic': function (char) { return char >= 0x0600 && char <= 0x06FF; }, //'Syriac': (char) => char >= 0x0700 && char <= 0x074F, 'Arabic Supplement': function (char) { return char >= 0x0750 && char <= 0x077F; }, // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF, // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF, // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F, // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F, // 'Syriac Supplement': (char) => char >= 0x0860 && char <= 0x086F, 'Arabic Extended-A': function (char) { return char >= 0x08A0 && char <= 0x08FF; }, // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F, // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF, // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F, // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF, // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F, // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF, // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F, // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF, // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F, // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF, // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F, // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF, // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF, // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F, // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF, 'Hangul Jamo': function (char) { return char >= 0x1100 && char <= 0x11FF; }, // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F, // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F, // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF, 'Unified Canadian Aboriginal Syllabics': function (char) { return char >= 0x1400 && char <= 0x167F; }, // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F, // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF, // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F, // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F, // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F, // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F, 'Khmer': function (char) { return char >= 0x1780 && char <= 0x17FF; }, // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF, 'Unified Canadian Aboriginal Syllabics Extended': function (char) { return char >= 0x18B0 && char <= 0x18FF; }, // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F, // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F, // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF, // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF, // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F, // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF, // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF, // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F, // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF, // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF, // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F, // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F, // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F, // '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': function (char) { return char >= 0x2000 && char <= 0x206F; }, // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F, // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF, // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF, 'Letterlike Symbols': function (char) { return char >= 0x2100 && char <= 0x214F; }, 'Number Forms': function (char) { return char >= 0x2150 && char <= 0x218F; }, // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF, // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF, 'Miscellaneous Technical': function (char) { return char >= 0x2300 && char <= 0x23FF; }, 'Control Pictures': function (char) { return char >= 0x2400 && char <= 0x243F; }, 'Optical Character Recognition': function (char) { return char >= 0x2440 && char <= 0x245F; }, 'Enclosed Alphanumerics': function (char) { return char >= 0x2460 && char <= 0x24FF; }, // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F, // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F, 'Geometric Shapes': function (char) { return char >= 0x25A0 && char <= 0x25FF; }, 'Miscellaneous Symbols': function (char) { return char >= 0x2600 && char <= 0x26FF; }, // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF, // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF, // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF, // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF, // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F, // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF, // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF, 'Miscellaneous Symbols and Arrows': function (char) { return char >= 0x2B00 && char <= 0x2BFF; }, // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F, // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F, // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF, // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F, // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F, // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF, // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF, // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F, 'CJK Radicals Supplement': function (char) { return char >= 0x2E80 && char <= 0x2EFF; }, 'Kangxi Radicals': function (char) { return char >= 0x2F00 && char <= 0x2FDF; }, 'Ideographic Description Characters': function (char) { return char >= 0x2FF0 && char <= 0x2FFF; }, 'CJK Symbols and Punctuation': function (char) { return char >= 0x3000 && char <= 0x303F; }, 'Hiragana': function (char) { return char >= 0x3040 && char <= 0x309F; }, 'Katakana': function (char) { return char >= 0x30A0 && char <= 0x30FF; }, 'Bopomofo': function (char) { return char >= 0x3100 && char <= 0x312F; }, 'Hangul Compatibility Jamo': function (char) { return char >= 0x3130 && char <= 0x318F; }, 'Kanbun': function (char) { return char >= 0x3190 && char <= 0x319F; }, 'Bopomofo Extended': function (char) { return char >= 0x31A0 && char <= 0x31BF; }, 'CJK Strokes': function (char) { return char >= 0x31C0 && char <= 0x31EF; }, 'Katakana Phonetic Extensions': function (char) { return char >= 0x31F0 && char <= 0x31FF; }, 'Enclosed CJK Letters and Months': function (char) { return char >= 0x3200 && char <= 0x32FF; }, 'CJK Compatibility': function (char) { return char >= 0x3300 && char <= 0x33FF; }, 'CJK Unified Ideographs Extension A': function (char) { return char >= 0x3400 && char <= 0x4DBF; }, 'Yijing Hexagram Symbols': function (char) { return char >= 0x4DC0 && char <= 0x4DFF; }, 'CJK Unified Ideographs': function (char) { return char >= 0x4E00 && char <= 0x9FFF; }, 'Yi Syllables': function (char) { return char >= 0xA000 && char <= 0xA48F; }, 'Yi Radicals': function (char) { return char >= 0xA490 && char <= 0xA4CF; }, // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF, // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F, // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F, // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF, // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F, // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF, // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F, // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F, // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F, // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF, // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF, // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F, // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F, 'Hangul Jamo Extended-A': function (char) { return char >= 0xA960 && char <= 0xA97F; }, // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF, // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF, // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F, // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F, // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF, // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF, // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F, // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F, // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF, // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF, 'Hangul Syllables': function (char) { return char >= 0xAC00 && char <= 0xD7AF; }, 'Hangul Jamo Extended-B': function (char) { return char >= 0xD7B0 && char <= 0xD7FF; }, // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F, // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF, // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF, 'Private Use Area': function (char) { return char >= 0xE000 && char <= 0xF8FF; }, 'CJK Compatibility Ideographs': function (char) { return char >= 0xF900 && char <= 0xFAFF; }, // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F, 'Arabic Presentation Forms-A': function (char) { return char >= 0xFB50 && char <= 0xFDFF; }, // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F, 'Vertical Forms': function (char) { return char >= 0xFE10 && char <= 0xFE1F; }, // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F, 'CJK Compatibility Forms': function (char) { return char >= 0xFE30 && char <= 0xFE4F; }, 'Small Form Variants': function (char) { return char >= 0xFE50 && char <= 0xFE6F; }, 'Arabic Presentation Forms-B': function (char) { return char >= 0xFE70 && char <= 0xFEFF; }, 'Halfwidth and Fullwidth Forms': function (char) { return char >= 0xFF00 && char <= 0xFFEF; } // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF, // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F, // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF, // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F, // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F, // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF, // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF, // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F, // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF, // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF, // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F, // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F, // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F, // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F, // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF, // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F, // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F, // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF, // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF, // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F, // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F, // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F, // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F, // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F, // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F, // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF, // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF, // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F, // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F, // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F, // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF, // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F, // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F, // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F, // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF, // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F, // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F, // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F, // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF, // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F, // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF, // '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 allowsIdeographicBreaking(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!charAllowsIdeographicBreaking(char.charCodeAt(0))) { return false; } } return true; } function allowsVerticalWritingMode(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (charHasUprightVerticalOrientation(char.charCodeAt(0))) { return true; } } return false; } function allowsLetterSpacing(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; 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; } return true; } function charAllowsIdeographicBreaking(char ) { // Return early for characters outside all ideographic ranges. if (char < 0x2E80) { return false; } 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; } 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. // Blocks in the Unicode supplementary planes are excluded from this module due // to . /** * Returns true if the given Unicode codepoint identifies a character with * upright orientation. * * A character has upright orientation if it is drawn upright (unrotated) * whether the line is oriented horizontally or vertically, even if both * adjacent characters can be rotated. For example, a Chinese character is * always drawn upright. An uprightly oriented character causes an adjacent * “neutral” character to be drawn upright as well. * @private */ function charHasUprightVerticalOrientation(char ) { if (char === 0x02EA /* modifier letter yin departing tone mark */ || char === 0x02EB /* modifier letter yang departing tone mark */) { return true; } // Return early for characters outside all ranges whose characters remain // upright in vertical writing mode. if (char < 0x1100) { return false; } if (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; } } 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; } } 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; } 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; } } 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; } 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 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 && ((char >= 0x0590 && char <= 0x08FF) || unicodeBlockLookup['Arabic Presentation Forms-A'](char) || unicodeBlockLookup['Arabic Presentation Forms-B'](char))) { // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts 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 isStringInSupportedScript(chars , canRenderRTL ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) { return false; } } return true; } // var pluginRequested = false; var pluginURL = null; var foregroundLoadComplete = false; var evented = new Evented(); var _completionCallback; var registerForPluginAvailability = function( callback ) { if (pluginURL) { callback({ pluginURL: pluginURL, completionCallback: _completionCallback}); } else { evented.once('pluginAvailable', callback); } return callback; }; var clearRTLTextPlugin = function() { pluginRequested = false; pluginURL = null; }; var setRTLTextPlugin = function(url , callback ) { if (pluginRequested) { throw new Error('setRTLTextPlugin cannot be called multiple times.'); } pluginRequested = true; pluginURL = exported.resolveURL(url); _completionCallback = function (error ) { if (error) { // Clear loaded state to allow retries clearRTLTextPlugin(); if (callback) { callback(error); } } else { // Called once for each worker foregroundLoadComplete = true; } }; evented.fire(new Event('pluginAvailable', { pluginURL: pluginURL, completionCallback: _completionCallback })); }; var plugin = { applyArabicShaping: null, processBidirectionalText: null, processStyledBidirectionalText: null, isLoaded: function isLoaded() { return foregroundLoadComplete || // Foreground: loaded if the completion callback returned successfully plugin.applyArabicShaping != null; // Background: loaded if the plugin functions have been compiled } }; // var EvaluationParameters = function EvaluationParameters(zoom , options ) { this.zoom = zoom; if (options) { this.now = options.now; this.fadeDuration = options.fadeDuration; this.zoomHistory = options.zoomHistory; this.transition = options.transition; } else { this.now = 0; this.fadeDuration = 0; this.zoomHistory = new ZoomHistory(); this.transition = {}; } }; EvaluationParameters.prototype.isSupportedScript = function isSupportedScript (str ) { return isStringInSupportedScript(str, plugin.isLoaded()); }; EvaluationParameters.prototype.crossFadingFactor = function crossFadingFactor () { if (this.fadeDuration === 0) { return 1; } else { return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1); } }; EvaluationParameters.prototype.getCrossfadeParameters = function getCrossfadeParameters () { var z = this.zoom; var fraction = z - Math.floor(z); var 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 }; }; // /** * Implements a number of classes that define state and behavior for paint and layout properties, most * importantly their respective evaluation chains: * * Transitionable paint property value * → Transitioning paint property value * → Possibly evaluated paint property value * → Fully evaluated paint property value * * Layout property value * → Possibly evaluated layout property value * → Fully evaluated layout property value * * @module * @private */ /** * Implementations of the `Property` interface: * * * Hold metadata about a property that's independent of any specific value: stuff like the type of the value, * the default value, etc. This comes from the style specification JSON. * * Define behavior that needs to be polymorphic across different properties: "possibly evaluating" * an input value (see below), and interpolating between two possibly-evaluted values. * * The type `T` is the fully-evaluated value type (e.g. `number`, `string`, `Color`). * The type `R` is the intermediate "possibly evaluated" value type. See below. * * There are two main implementations of the interface -- one for properties that allow data-driven values, * and one for properties that don't. There are a few "special case" implementations as well: one for properties * which cross-fade between two values rather than interpolating, one for `heatmap-color` and `line-gradient`, * and one for `light-position`. * * @private */ /** * `PropertyValue` represents the value part of a property key-value unit. It's used to represent both * paint and layout property values, and regardless of whether or not their property supports data-driven * expressions. * * `PropertyValue` stores the raw input value as seen in a style or a runtime styling API call, i.e. one of the * following: * * * A constant value of the type appropriate for the property * * A function which produces a value of that type (but functions are quasi-deprecated in favor of expressions) * * An expression which produces a value of that type * * "undefined"/"not present", in which case the property is assumed to take on its default value. * * In addition to storing the original input value, `PropertyValue` also stores a normalized representation, * effectively treating functions as if they are expressions, and constant or default values as if they are * (constant) expressions. * * @private */ var PropertyValue = function PropertyValue(property , value ) { this.property = property; this.value = value; this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification); }; PropertyValue.prototype.isDataDriven = function isDataDriven () { return this.expression.kind === 'source' || this.expression.kind === 'composite'; }; PropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { return this.property.possiblyEvaluate(this, parameters); }; // ------- Transitionable ------- /** * Paint properties are _transitionable_: they can change in a fluid manner, interpolating or cross-fading between * old and new value. The duration of the transition, and the delay before it begins, is configurable. * * `TransitionablePropertyValue` is a compositional class that stores both the property value and that transition * configuration. * * A `TransitionablePropertyValue` can calculate the next step in the evaluation chain for paint property values: * `TransitioningPropertyValue`. * * @private */ var TransitionablePropertyValue = function TransitionablePropertyValue(property ) { this.property = property; this.value = new PropertyValue(property, undefined); }; TransitionablePropertyValue.prototype.transitioned = function transitioned (parameters , prior ) { return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define extend({}, parameters.transition, this.transition), parameters.now); }; TransitionablePropertyValue.prototype.untransitioned = function untransitioned () { return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `TransitionablePropertyValue`. * * @private */ /** * `Transitionable` stores a map of all (property name, `TransitionablePropertyValue`) pairs for paint properties of a * given layer type. It can calculate the `TransitioningPropertyValue`s for all of them at once, producing a * `Transitioning` instance for the same set of properties. * * @private */ var Transitionable = function Transitionable(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultTransitionablePropertyValues) ); }; Transitionable.prototype.getValue = function getValue (name ) { return clone(this._values[name].value.value); }; Transitionable.prototype.setValue = function setValue (name , value ) { if (!this._values.hasOwnProperty(name)) { this._values[name] = new TransitionablePropertyValue(this._values[name].property); } // Note that we do not _remove_ an own property in the case where a value is being reset // to the default: the transition might still be non-default. this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); }; Transitionable.prototype.getTransition = function getTransition (name ) { return clone(this._values[name].transition); }; Transitionable.prototype.setTransition = function setTransition (name , value ) { if (!this._values.hasOwnProperty(name)) { this._values[name] = new TransitionablePropertyValue(this._values[name].property); } this._values[name].transition = clone(value) || undefined; }; Transitionable.prototype.serialize = function serialize () { var result = {}; for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; var value = this.getValue(property); if (value !== undefined) { result[property] = value; } var transition = this.getTransition(property); if (transition !== undefined) { result[(property + "-transition")] = transition; } } return result; }; Transitionable.prototype.transitioned = function transitioned (parameters , prior ) { var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].transitioned(parameters, prior._values[property]); } return result; }; Transitionable.prototype.untransitioned = function untransitioned () { var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].untransitioned(); } return result; }; // ------- Transitioning ------- /** * `TransitioningPropertyValue` implements the first of two intermediate steps in the evaluation chain of a paint * property value. In this step, transitions between old and new values are handled: as long as the transition is in * progress, `TransitioningPropertyValue` maintains a reference to the prior value, and interpolates between it and * the new value based on the current time and the configured transition duration and delay. The product is the next * step in the evaluation chain: the "possibly evaluated" result type `R`. See below for more on this concept. * * @private */ var TransitioningPropertyValue = function TransitioningPropertyValue(property , value , prior , transition , now ) { this.property = property; this.value = value; this.begin = now + transition.delay || 0; this.end = this.begin + transition.duration || 0; if (property.specification.transition && (transition.delay || transition.duration)) { this.prior = prior; } }; TransitioningPropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var now = parameters.now || 0; var finalValue = this.value.possiblyEvaluate(parameters); var prior = this.prior; if (!prior) { // No prior value. return finalValue; } else if (now > this.end) { // Transition from prior value is now complete. this.prior = null; return finalValue; } else if (this.value.isDataDriven()) { // Transitions to data-driven properties are not supported. // We snap immediately to the data-driven value so that, when we perform layout, // we see the data-driven function and can use it to populate vertex buffers. this.prior = null; return finalValue; } else if (now < this.begin) { // Transition hasn't started yet. return prior.possiblyEvaluate(parameters); } else { // Interpolate between recursively-calculated prior value and final. var t = (now - this.begin) / (this.end - this.begin); return this.property.interpolate(prior.possiblyEvaluate(parameters), finalValue, easeCubicInOut(t)); } }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `TransitioningPropertyValue`. * * @private */ /** * `Transitioning` stores a map of all (property name, `TransitioningPropertyValue`) pairs for paint properties of a * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a * `PossiblyEvaluated` instance for the same set of properties. * * @private */ var Transitioning = function Transitioning(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultTransitioningPropertyValues) ); }; Transitioning.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].possiblyEvaluate(parameters); } return result; }; Transitioning.prototype.hasTransition = function hasTransition () { for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; if (this._values[property].prior) { return true; } } return false; }; // ------- Layout ------- /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `PropertyValue`. * * @private */ /** * Because layout properties are not transitionable, they have a simpler representation and evaluation chain than * paint properties: `PropertyValue`s are possibly evaluated, producing possibly evaluated values, which are then * fully evaluated. * * `Layout` stores a map of all (property name, `PropertyValue`) pairs for layout properties of a * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a * `PossiblyEvaluated` instance for the same set of properties. * * @private */ var Layout = function Layout(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultPropertyValues) ); }; Layout.prototype.getValue = function getValue (name ) { return clone(this._values[name].value); }; Layout.prototype.setValue = function setValue (name , value ) { this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); }; Layout.prototype.serialize = function serialize () { var result = {}; for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; var value = this.getValue(property); if (value !== undefined) { result[property] = value; } } return result; }; Layout.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].possiblyEvaluate(parameters); } return result; }; // ------- PossiblyEvaluated ------- /** * "Possibly evaluated value" is an intermediate stage in the evaluation chain for both paint and layout property * values. The purpose of this stage is to optimize away unnecessary recalculations for data-driven properties. Code * which uses data-driven property values must assume that the value is dependent on feature data, and request that it * be evaluated for each feature. But when that property value is in fact a constant or camera function, the calculation * will not actually depend on the feature, and we can benefit from returning the prior result of having done the * evaluation once, ahead of time, in an intermediate step whose inputs are just the value and "global" parameters * such as current zoom level. * * `PossiblyEvaluatedValue` represents the three possible outcomes of this step: if the input value was a constant or * camera expression, then the "possibly evaluated" result is a constant value. Otherwise, the input value was either * a source or composite expression, and we must defer final evaluation until supplied a feature. We separate * the source and composite cases because they are handled differently when generating GL attributes, buffers, and * uniforms. * * Note that `PossiblyEvaluatedValue` (and `PossiblyEvaluatedPropertyValue`, below) are _not_ used for properties that * do not allow data-driven values. For such properties, we know that the "possibly evaluated" result is always a constant * scalar value. See below. * * @private */ /** * `PossiblyEvaluatedPropertyValue` is used for data-driven paint and layout property values. It holds a * `PossiblyEvaluatedValue` and the `GlobalProperties` that were used to generate it. You're not allowed to supply * a different set of `GlobalProperties` when performing the final evaluation because they would be ignored in the * case where the input value was a constant or camera function. * * @private */ var PossiblyEvaluatedPropertyValue = function PossiblyEvaluatedPropertyValue(property , value , parameters ) { this.property = property; this.value = value; this.parameters = parameters; }; PossiblyEvaluatedPropertyValue.prototype.isConstant = function isConstant () { return this.value.kind === 'constant'; }; PossiblyEvaluatedPropertyValue.prototype.constantOr = function constantOr (value ) { if (this.value.kind === 'constant') { return this.value.value; } else { return value; } }; PossiblyEvaluatedPropertyValue.prototype.evaluate = function evaluate (feature , featureState ) { return this.property.evaluate(this.value, this.parameters, feature, featureState); }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys, and values of type `R`. * * For properties that don't allow data-driven values, `R` is a scalar type such as `number`, `string`, or `Color`. * For data-driven properties, it is `PossiblyEvaluatedPropertyValue`. Critically, the type definitions are set up * in a way that allows flow to know which of these two cases applies for any given property name, and if you attempt * to use a `PossiblyEvaluatedPropertyValue` as if it was a scalar, or vice versa, you will get a type error. (However, * there's at least one case in which flow fails to produce a type error that you should be aware of: in a context such * as `layer.paint.get('foo-opacity') === 0`, if `foo-opacity` is data-driven, than the left-hand side is of type * `PossiblyEvaluatedPropertyValue`, but flow will not complain about comparing this to a number using `===`. * See https://github.com/facebook/flow/issues/2359.) * * There's also a third, special case possiblity for `R`: for cross-faded properties, it's `?CrossFaded`. * * @private */ /** * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a * given layer type. * @private */ var PossiblyEvaluated = function PossiblyEvaluated(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultPossiblyEvaluatedValues) ); }; PossiblyEvaluated.prototype.get = function get (name ) { return this._values[name]; }; /** * An implementation of `Property` for properties that do not permit data-driven (source or composite) expressions. * This restriction allows us to declare statically that the result of possibly evaluating this kind of property * is in fact always the scalar type `T`, and can be used without further evaluating the value on a per-feature basis. * * @private */ var DataConstantProperty = function DataConstantProperty(specification ) { this.specification = specification; }; DataConstantProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { assert_1(!value.isDataDriven()); return value.expression.evaluate(parameters); }; DataConstantProperty.prototype.interpolate = function interpolate$1 (a , b , t ) { var interp = (interpolate )[this.specification.type]; if (interp) { return interp(a, b, t); } else { return a; } }; /** * An implementation of `Property` for properties that permit data-driven (source or composite) expressions. * The result of possibly evaluating this kind of property is `PossiblyEvaluatedPropertyValue`; obtaining * a scalar value `T` requires further evaluation on a per-feature basis. * * @private */ var DataDrivenProperty = function DataDrivenProperty(specification , overrides ) { this.specification = specification; this.overrides = overrides; }; DataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { if (value.expression.kind === 'constant' || value.expression.kind === 'camera') { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: value.expression.evaluate(parameters)}, parameters); } else { return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); } }; DataDrivenProperty.prototype.interpolate = function interpolate$2 (a , b , t ) { // If either possibly-evaluated value is non-constant, give up: we aren't able to interpolate data-driven values. if (a.value.kind !== 'constant' || b.value.kind !== 'constant') { return a; } // Special case hack solely for fill-outline-color. 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); } var 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; } }; DataDrivenProperty.prototype.evaluate = function evaluate (value , parameters , feature , featureState ) { if (value.kind === 'constant') { return value.value; } else { return value.evaluate(parameters, feature, featureState); } }; /** * An implementation of `Property` for data driven `line-pattern` which are transitioned by cross-fading * rather than interpolation. * * @private */ var CrossFadedDataDrivenProperty = /*@__PURE__*/(function (DataDrivenProperty) { function CrossFadedDataDrivenProperty () { DataDrivenProperty.apply(this, arguments); } if ( DataDrivenProperty ) CrossFadedDataDrivenProperty.__proto__ = DataDrivenProperty; CrossFadedDataDrivenProperty.prototype = Object.create( DataDrivenProperty && DataDrivenProperty.prototype ); CrossFadedDataDrivenProperty.prototype.constructor = CrossFadedDataDrivenProperty; CrossFadedDataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { if (value.value === undefined) { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: undefined}, parameters); } else if (value.expression.kind === 'constant') { var constantValue = value.expression.evaluate(parameters); var constant = this._calculate(constantValue, constantValue, constantValue, parameters); return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: constant}, parameters); } else if (value.expression.kind === 'camera') { var 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); } }; CrossFadedDataDrivenProperty.prototype.evaluate = function evaluate (value , globals , feature , featureState ) { if (value.kind === 'source') { var constant = value.evaluate(globals, feature, featureState); 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; } }; CrossFadedDataDrivenProperty.prototype._calculate = function _calculate (min , mid , max , parameters ) { var z = parameters.zoom; return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid } : { from: max, to: mid }; }; CrossFadedDataDrivenProperty.prototype.interpolate = function interpolate (a ) { return a; }; return CrossFadedDataDrivenProperty; }(DataDrivenProperty)); /** * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading * rather than interpolation. * * @private */ var CrossFadedProperty = function CrossFadedProperty(specification ) { this.specification = specification; }; CrossFadedProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { if (value.value === undefined) { return undefined; } else if (value.expression.kind === 'constant') { var constant = value.expression.evaluate(parameters); return this._calculate(constant, constant, constant, parameters); } else { assert_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); } }; CrossFadedProperty.prototype._calculate = function _calculate (min , mid , max , parameters ) { var z = parameters.zoom; return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid } : { from: max, to: mid }; }; CrossFadedProperty.prototype.interpolate = function 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 */ var ColorRampProperty = function ColorRampProperty(specification ) { this.specification = specification; }; ColorRampProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { return !!value.expression.evaluate(parameters); }; ColorRampProperty.prototype.interpolate = function 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 */ var Properties = function Properties(properties ) { this.properties = properties; this.defaultPropertyValues = ({} ); this.defaultTransitionablePropertyValues = ({} ); this.defaultTransitioningPropertyValues = ({} ); this.defaultPossiblyEvaluatedValues = ({} ); this.overridableProperties = ([] ); for (var property in properties) { var prop = properties[property]; if (prop.specification.overridable) { this.overridableProperties.push(property); } var defaultPropertyValue = this.defaultPropertyValues[property] = new PropertyValue(prop, undefined); var defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] = new TransitionablePropertyValue(prop); this.defaultTransitioningPropertyValues[property] = defaultTransitionablePropertyValue.untransitioned(); this.defaultPossiblyEvaluatedValues[property] = defaultPropertyValue.possiblyEvaluate(({} )); } }; register('DataDrivenProperty', DataDrivenProperty); register('DataConstantProperty', DataConstantProperty); register('CrossFadedDataDrivenProperty', CrossFadedDataDrivenProperty); register('CrossFadedProperty', CrossFadedProperty); register('ColorRampProperty', ColorRampProperty); // var TRANSITION_SUFFIX = '-transition'; var StyleLayer = /*@__PURE__*/(function (Evented) { function StyleLayer(layer , properties ) { Evented.call(this); this.id = layer.id; this.type = layer.type; this._featureFilter = function () { return true; }; if (layer.type === 'custom') { return; } layer = ((layer ) ); this.metadata = layer.metadata; this.minzoom = layer.minzoom; this.maxzoom = layer.maxzoom; if (layer.type !== 'background') { this.source = layer.source; this.sourceLayer = layer['source-layer']; this.filter = layer.filter; } if (properties.layout) { this._unevaluatedLayout = new Layout(properties.layout); } if (properties.paint) { this._transitionablePaint = new Transitionable(properties.paint); for (var property in layer.paint) { this.setPaintProperty(property, layer.paint[property], {validate: false}); } for (var property$1 in layer.layout) { this.setLayoutProperty(property$1, layer.layout[property$1], {validate: false}); } this._transitioningPaint = this._transitionablePaint.untransitioned(); } } if ( Evented ) StyleLayer.__proto__ = Evented; StyleLayer.prototype = Object.create( Evented && Evented.prototype ); StyleLayer.prototype.constructor = StyleLayer; StyleLayer.prototype.getCrossfadeParameters = function getCrossfadeParameters () { return this._crossfadeParameters; }; StyleLayer.prototype.getLayoutProperty = function getLayoutProperty (name ) { if (name === 'visibility') { return this.visibility; } return this._unevaluatedLayout.getValue(name); }; StyleLayer.prototype.setLayoutProperty = function setLayoutProperty (name , value , options) { if ( options === void 0 ) options = {}; if (value !== null && value !== undefined) { var key = "layers." + (this.id) + ".layout." + name; if (this._validate(validateLayoutProperty$1, key, name, value, options)) { return; } } if (name === 'visibility') { this.visibility = value; return; } this._unevaluatedLayout.setValue(name, value); }; StyleLayer.prototype.getPaintProperty = function getPaintProperty (name ) { if (endsWith(name, TRANSITION_SUFFIX)) { return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length)); } else { return this._transitionablePaint.getValue(name); } }; StyleLayer.prototype.setPaintProperty = function setPaintProperty (name , value , options) { if ( options === void 0 ) options = {}; if (value !== null && value !== undefined) { var key = "layers." + (this.id) + ".paint." + name; if (this._validate(validatePaintProperty$1, key, name, value, options)) { return false; } } if (endsWith(name, TRANSITION_SUFFIX)) { this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), (value ) || undefined); return false; } else { var transitionable = this._transitionablePaint._values[name]; var isCrossFadedProperty = transitionable.property.specification["property-type"] === 'cross-faded-data-driven'; var wasDataDriven = transitionable.value.isDataDriven(); var oldValue = transitionable.value; this._transitionablePaint.setValue(name, value); this._handleSpecialPaintPropertyUpdate(name); var newValue = this._transitionablePaint._values[name].value; var isDataDriven = newValue.isDataDriven(); // 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); } }; StyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (_ ) { // No-op; can be overridden by derived classes. }; // eslint-disable-next-line no-unused-vars StyleLayer.prototype._handleOverridablePaintPropertyUpdate = function _handleOverridablePaintPropertyUpdate (name , oldValue , newValue ) { // No-op; can be overridden by derived classes. return false; }; StyleLayer.prototype.isHidden = function isHidden (zoom ) { if (this.minzoom && zoom < this.minzoom) { return true; } if (this.maxzoom && zoom >= this.maxzoom) { return true; } return this.visibility === 'none'; }; StyleLayer.prototype.updateTransitions = function updateTransitions (parameters ) { this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint); }; StyleLayer.prototype.hasTransition = function hasTransition () { return this._transitioningPaint.hasTransition(); }; StyleLayer.prototype.recalculate = function recalculate (parameters ) { if (parameters.getCrossfadeParameters) { this._crossfadeParameters = parameters.getCrossfadeParameters(); } if (this._unevaluatedLayout) { (this ).layout = this._unevaluatedLayout.possiblyEvaluate(parameters); } (this ).paint = this._transitioningPaint.possiblyEvaluate(parameters); }; StyleLayer.prototype.serialize = function serialize () { var output = { 'id': this.id, 'type': this.type, 'source': this.source, 'source-layer': this.sourceLayer, 'metadata': this.metadata, 'minzoom': this.minzoom, 'maxzoom': this.maxzoom, 'filter': this.filter, 'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(), 'paint': this._transitionablePaint && this._transitionablePaint.serialize() }; if (this.visibility) { output.layout = output.layout || {}; output.layout.visibility = this.visibility; } return filterObject(output, function (value, key) { return value !== undefined && !(key === 'layout' && !Object.keys(value).length) && !(key === 'paint' && !Object.keys(value).length); }); }; StyleLayer.prototype._validate = function _validate (validate , key , name , value , options) { if ( options === void 0 ) options = {}; if (options && options.validate === false) { return false; } return emitValidationErrors(this, validate.call(validateStyle, { key: key, layerType: this.type, objectKey: name, value: value, styleSpec: spec, // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 style: {glyphs: true, sprite: true} })); }; StyleLayer.prototype.is3D = function is3D () { return false; }; StyleLayer.prototype.isTileClipped = function isTileClipped () { return false; }; StyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return false; }; StyleLayer.prototype.resize = function resize () { // noop }; StyleLayer.prototype.isStateDependent = function isStateDependent () { for (var property in (this ).paint._values) { var value = (this ).paint.get(property); if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { continue; } if ((value.value.kind === 'source' || value.value.kind === 'composite') && value.value.isStateDependent) { return true; } } return false; }; return StyleLayer; }(Evented)); // var viewTypes = { 'Int8': Int8Array, 'Uint8': Uint8Array, 'Int16': Int16Array, 'Uint16': Uint16Array, 'Int32': Int32Array, 'Uint32': Uint32Array, 'Float32': Float32Array }; /** * @private */ var Struct = function Struct(structArray , index ) { (this )._structArray = structArray; this._pos1 = index * this.size; this._pos2 = this._pos1 / 2; this._pos4 = this._pos1 / 4; this._pos8 = this._pos1 / 8; }; var DEFAULT_CAPACITY = 128; var RESIZE_MULTIPLIER = 5; /** * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` * making it behave like an array of typed structs. * * Conceptually, a StructArray is comprised of elements, i.e., instances of its * associated struct type. Each particular struct type, together with an * alignment size, determines the memory layout of a StructArray whose elements * are of that type. Thus, for each such layout that we need, we have * a corrseponding StructArrayLayout class, inheriting from StructArray and * implementing `emplaceBack()` and `_refreshViews()`. * * In some cases, where we need to access particular elements of a StructArray, * we implement a more specific subclass that inherits from one of the * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured * object whose properties are proxies into the underlying memory space for the * i-th element. This affords the convience of working with (seemingly) plain * Javascript objects without the overhead of serializing/deserializing them * into ArrayBuffers for efficient web worker transfer. * * @private */ var StructArray = function StructArray() { this.isTransferred = false; this.capacity = -1; this.resize(0); }; /** * Serialize a StructArray instance.Serializes both the raw data and the * metadata needed to reconstruct the StructArray base class during * deserialization. */ StructArray.serialize = function serialize (array , transferables ) { assert_1(!array.isTransferred); array._trim(); if (transferables) { array.isTransferred = true; transferables.push(array.arrayBuffer); } return { length: array.length, arrayBuffer: array.arrayBuffer, }; }; StructArray.deserialize = function deserialize (input ) { var structArray = Object.create(this.prototype); structArray.arrayBuffer = input.arrayBuffer; structArray.length = input.length; structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement; structArray._refreshViews(); return structArray; }; /** * Resize the array to discard unused capacity. */ StructArray.prototype._trim = function _trim () { if (this.length !== this.capacity) { this.capacity = this.length; this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement); this._refreshViews(); } }; /** * Resets the the length of the array to 0 without de-allocating capcacity. */ StructArray.prototype.clear = function clear () { this.length = 0; }; /** * Resize the array. * If `n` is greater than the current length then additional elements with undefined values are added. * If `n` is less than the current length then the array will be reduced to the first `n` elements. * @param {number} n The new size of the array. */ StructArray.prototype.resize = function resize (n ) { assert_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. */ StructArray.prototype.reserve = function reserve (n ) { if (n > this.capacity) { this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY); this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement); var oldUint8Array = this.uint8; this._refreshViews(); if (oldUint8Array) { this.uint8.set(oldUint8Array); } } }; /** * Create TypedArray views for the current ArrayBuffer. */ StructArray.prototype._refreshViews = function _refreshViews () { throw new Error('_refreshViews() must be implemented by each concrete StructArray layout'); }; /** * Given a list of member fields, create a full StructArrayLayout, in * particular calculating the correct byte offset for each field. This data * is used at build time to generate StructArrayLayout_*#emplaceBack() and * other accessors, and at runtime for binding vertex buffer attributes. * * @private */ function createLayout( members , alignment ) { if ( alignment === void 0 ) alignment = 1; var offset = 0; var maxSize = 0; var layoutMembers = members.map(function (member) { assert_1(member.name.length); var typeSize = sizeOf(member.type); var memberOffset = offset = align(offset, Math.max(alignment, typeSize)); var components = member.components || 1; maxSize = Math.max(maxSize, typeSize); offset += typeSize * components; return { name: member.name, type: member.type, components: components, offset: memberOffset, }; }); var size = align(offset, Math.max(maxSize, alignment)); return { members: layoutMembers, size: size, alignment: alignment }; } function sizeOf(type ) { return viewTypes[type].BYTES_PER_ELEMENT; } function align(offset , size ) { return Math.ceil(offset / size) * size; } // This file is generated. Edit build/generate-struct-arrays.js, then run `yarn run codegen`. /** * Implementation of the StructArray layout: * [0]: Int16[2] * * @private */ var StructArrayLayout2i4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4.__proto__ = StructArray; StructArrayLayout2i4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4.prototype.constructor = StructArrayLayout2i4; StructArrayLayout2i4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2i4.prototype.emplace = function emplace (i , v0 , v1 ) { var o2 = i * 2; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; return i; }; return StructArrayLayout2i4; }(StructArray)); StructArrayLayout2i4.prototype.bytesPerElement = 4; register('StructArrayLayout2i4', StructArrayLayout2i4); /** * Implementation of the StructArray layout: * [0]: Int16[4] * * @private */ var StructArrayLayout4i8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4i8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i8.__proto__ = StructArray; StructArrayLayout4i8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i8.prototype.constructor = StructArrayLayout4i8; StructArrayLayout4i8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout4i8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout4i8.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o2 = i * 4; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; return i; }; return StructArrayLayout4i8; }(StructArray)); StructArrayLayout4i8.prototype.bytesPerElement = 8; register('StructArrayLayout4i8', StructArrayLayout4i8); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Int16[4] * * @private */ var StructArrayLayout2i4i12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i4i12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4i12.__proto__ = StructArray; StructArrayLayout2i4i12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4i12.prototype.constructor = StructArrayLayout2i4i12; StructArrayLayout2i4i12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4i12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5); }; StructArrayLayout2i4i12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 ) { var o2 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; return i; }; return StructArrayLayout2i4i12; }(StructArray)); StructArrayLayout2i4i12.prototype.bytesPerElement = 12; register('StructArrayLayout2i4i12', StructArrayLayout2i4i12); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Uint8[4] * * @private */ var StructArrayLayout2i4ub8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i4ub8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4ub8.__proto__ = StructArray; StructArrayLayout2i4ub8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4ub8.prototype.constructor = StructArrayLayout2i4ub8; StructArrayLayout2i4ub8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4ub8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5); }; StructArrayLayout2i4ub8.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 ) { var o2 = i * 4; var o1 = i * 8; 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; return i; }; return StructArrayLayout2i4ub8; }(StructArray)); StructArrayLayout2i4ub8.prototype.bytesPerElement = 8; register('StructArrayLayout2i4ub8', StructArrayLayout2i4ub8); /** * Implementation of the StructArray layout: * [0]: Uint16[8] * * @private */ var StructArrayLayout8ui16 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout8ui16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout8ui16.__proto__ = StructArray; StructArrayLayout8ui16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout8ui16.prototype.constructor = StructArrayLayout8ui16; StructArrayLayout8ui16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout8ui16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7); }; StructArrayLayout8ui16.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var 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 StructArrayLayout8ui16; }(StructArray)); StructArrayLayout8ui16.prototype.bytesPerElement = 16; register('StructArrayLayout8ui16', StructArrayLayout8ui16); /** * Implementation of the StructArray layout: * [0]: Int16[4] * [8]: Uint16[4] * * @private */ var StructArrayLayout4i4ui16 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4i4ui16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i4ui16.__proto__ = StructArray; StructArrayLayout4i4ui16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i4ui16.prototype.constructor = StructArrayLayout4i4ui16; StructArrayLayout4i4ui16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout4i4ui16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7); }; StructArrayLayout4i4ui16.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var o2 = i * 8; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.uint16[o2 + 4] = v4; this.uint16[o2 + 5] = v5; this.uint16[o2 + 6] = v6; this.uint16[o2 + 7] = v7; return i; }; return StructArrayLayout4i4ui16; }(StructArray)); StructArrayLayout4i4ui16.prototype.bytesPerElement = 16; register('StructArrayLayout4i4ui16', StructArrayLayout4i4ui16); /** * Implementation of the StructArray layout: * [0]: Float32[3] * * @private */ var StructArrayLayout3f12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3f12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3f12.__proto__ = StructArray; StructArrayLayout3f12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3f12.prototype.constructor = StructArrayLayout3f12; StructArrayLayout3f12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout3f12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3f12.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o4 = i * 3; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; return i; }; return StructArrayLayout3f12; }(StructArray)); StructArrayLayout3f12.prototype.bytesPerElement = 12; register('StructArrayLayout3f12', StructArrayLayout3f12); /** * Implementation of the StructArray layout: * [0]: Uint32[1] * * @private */ var StructArrayLayout1ul4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ul4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ul4.__proto__ = StructArray; StructArrayLayout1ul4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ul4.prototype.constructor = StructArrayLayout1ul4; StructArrayLayout1ul4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); }; StructArrayLayout1ul4.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1ul4.prototype.emplace = function emplace (i , v0 ) { var o4 = i * 1; this.uint32[o4 + 0] = v0; return i; }; return StructArrayLayout1ul4; }(StructArray)); StructArrayLayout1ul4.prototype.bytesPerElement = 4; register('StructArrayLayout1ul4', StructArrayLayout1ul4); /** * Implementation of the StructArray layout: * [0]: Int16[6] * [12]: Uint32[1] * [16]: Uint16[2] * [20]: Int16[2] * * @private */ var StructArrayLayout6i1ul2ui2i24 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout6i1ul2ui2i24 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout6i1ul2ui2i24.__proto__ = StructArray; StructArrayLayout6i1ul2ui2i24.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout6i1ul2ui2i24.prototype.constructor = StructArrayLayout6i1ul2ui2i24; StructArrayLayout6i1ul2ui2i24.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout6i1ul2ui2i24.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10); }; StructArrayLayout6i1ul2ui2i24.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 ) { var o2 = i * 12; var o4 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; this.uint32[o4 + 3] = v6; this.uint16[o2 + 8] = v7; this.uint16[o2 + 9] = v8; this.int16[o2 + 10] = v9; this.int16[o2 + 11] = v10; return i; }; return StructArrayLayout6i1ul2ui2i24; }(StructArray)); StructArrayLayout6i1ul2ui2i24.prototype.bytesPerElement = 24; register('StructArrayLayout6i1ul2ui2i24', StructArrayLayout6i1ul2ui2i24); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Int16[2] * [8]: Int16[2] * * @private */ var StructArrayLayout2i2i2i12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i2i2i12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i2i2i12.__proto__ = StructArray; StructArrayLayout2i2i2i12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i2i2i12.prototype.constructor = StructArrayLayout2i2i2i12; StructArrayLayout2i2i2i12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i2i2i12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5); }; StructArrayLayout2i2i2i12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 ) { var o2 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; return i; }; return StructArrayLayout2i2i2i12; }(StructArray)); StructArrayLayout2i2i2i12.prototype.bytesPerElement = 12; register('StructArrayLayout2i2i2i12', StructArrayLayout2i2i2i12); /** * Implementation of the StructArray layout: * [0]: Uint8[2] * [4]: Float32[2] * * @private */ var StructArrayLayout2ub2f12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2ub2f12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2ub2f12.__proto__ = StructArray; StructArrayLayout2ub2f12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2ub2f12.prototype.constructor = StructArrayLayout2ub2f12; StructArrayLayout2ub2f12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2ub2f12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout2ub2f12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o1 = i * 12; var 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; }; return StructArrayLayout2ub2f12; }(StructArray)); StructArrayLayout2ub2f12.prototype.bytesPerElement = 12; register('StructArrayLayout2ub2f12', StructArrayLayout2ub2f12); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Uint16[2] * [8]: Uint32[3] * [20]: Uint16[3] * [28]: Float32[2] * [36]: Uint8[3] * [40]: Uint32[1] * * @private */ var StructArrayLayout2i2ui3ul3ui2f3ub1ul44 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i2ui3ul3ui2f3ub1ul44 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i2ui3ul3ui2f3ub1ul44.__proto__ = StructArray; StructArrayLayout2i2ui3ul3ui2f3ub1ul44.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i2ui3ul3ui2f3ub1ul44.prototype.constructor = StructArrayLayout2i2ui3ul3ui2f3ub1ul44; StructArrayLayout2i2ui3ul3ui2f3ub1ul44.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2i2ui3ul3ui2f3ub1ul44.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 ) { var 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); }; StructArrayLayout2i2ui3ul3ui2f3ub1ul44.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 ) { var o2 = i * 22; var o4 = i * 11; var o1 = i * 44; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; this.uint16[o2 + 3] = v3; this.uint32[o4 + 2] = v4; this.uint32[o4 + 3] = v5; this.uint32[o4 + 4] = v6; this.uint16[o2 + 10] = v7; this.uint16[o2 + 11] = v8; this.uint16[o2 + 12] = v9; this.float32[o4 + 7] = v10; this.float32[o4 + 8] = v11; this.uint8[o1 + 36] = v12; this.uint8[o1 + 37] = v13; this.uint8[o1 + 38] = v14; this.uint32[o4 + 10] = v15; return i; }; return StructArrayLayout2i2ui3ul3ui2f3ub1ul44; }(StructArray)); StructArrayLayout2i2ui3ul3ui2f3ub1ul44.prototype.bytesPerElement = 44; register('StructArrayLayout2i2ui3ul3ui2f3ub1ul44', StructArrayLayout2i2ui3ul3ui2f3ub1ul44); /** * Implementation of the StructArray layout: * [0]: Int16[6] * [12]: Uint16[11] * [36]: Uint32[1] * [40]: Float32[2] * * @private */ var StructArrayLayout6i11ui1ul2f48 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout6i11ui1ul2f48 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout6i11ui1ul2f48.__proto__ = StructArray; StructArrayLayout6i11ui1ul2f48.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout6i11ui1ul2f48.prototype.constructor = StructArrayLayout6i11ui1ul2f48; StructArrayLayout6i11ui1ul2f48.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout6i11ui1ul2f48.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 ) { var 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); }; StructArrayLayout6i11ui1ul2f48.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 ) { var o2 = i * 24; var o4 = i * 12; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; this.uint16[o2 + 6] = v6; this.uint16[o2 + 7] = v7; this.uint16[o2 + 8] = v8; this.uint16[o2 + 9] = v9; this.uint16[o2 + 10] = v10; this.uint16[o2 + 11] = v11; this.uint16[o2 + 12] = v12; this.uint16[o2 + 13] = v13; this.uint16[o2 + 14] = v14; this.uint16[o2 + 15] = v15; this.uint16[o2 + 16] = v16; this.uint32[o4 + 9] = v17; this.float32[o4 + 10] = v18; this.float32[o4 + 11] = v19; return i; }; return StructArrayLayout6i11ui1ul2f48; }(StructArray)); StructArrayLayout6i11ui1ul2f48.prototype.bytesPerElement = 48; register('StructArrayLayout6i11ui1ul2f48', StructArrayLayout6i11ui1ul2f48); /** * Implementation of the StructArray layout: * [0]: Float32[1] * * @private */ var StructArrayLayout1f4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1f4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1f4.__proto__ = StructArray; StructArrayLayout1f4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1f4.prototype.constructor = StructArrayLayout1f4; StructArrayLayout1f4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout1f4.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1f4.prototype.emplace = function emplace (i , v0 ) { var o4 = i * 1; this.float32[o4 + 0] = v0; return i; }; return StructArrayLayout1f4; }(StructArray)); StructArrayLayout1f4.prototype.bytesPerElement = 4; register('StructArrayLayout1f4', StructArrayLayout1f4); /** * Implementation of the StructArray layout: * [0]: Int16[3] * * @private */ var StructArrayLayout3i6 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3i6 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3i6.__proto__ = StructArray; StructArrayLayout3i6.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3i6.prototype.constructor = StructArrayLayout3i6; StructArrayLayout3i6.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout3i6.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3i6.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o2 = i * 3; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; return i; }; return StructArrayLayout3i6; }(StructArray)); StructArrayLayout3i6.prototype.bytesPerElement = 6; register('StructArrayLayout3i6', StructArrayLayout3i6); /** * Implementation of the StructArray layout: * [0]: Uint32[1] * [4]: Uint16[2] * * @private */ var StructArrayLayout1ul2ui8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ul2ui8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ul2ui8.__proto__ = StructArray; StructArrayLayout1ul2ui8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ul2ui8.prototype.constructor = StructArrayLayout1ul2ui8; StructArrayLayout1ul2ui8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout1ul2ui8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout1ul2ui8.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o4 = i * 2; var o2 = i * 4; this.uint32[o4 + 0] = v0; this.uint16[o2 + 2] = v1; this.uint16[o2 + 3] = v2; return i; }; return StructArrayLayout1ul2ui8; }(StructArray)); StructArrayLayout1ul2ui8.prototype.bytesPerElement = 8; register('StructArrayLayout1ul2ui8', StructArrayLayout1ul2ui8); /** * Implementation of the StructArray layout: * [0]: Uint16[3] * * @private */ var StructArrayLayout3ui6 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3ui6 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3ui6.__proto__ = StructArray; StructArrayLayout3ui6.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3ui6.prototype.constructor = StructArrayLayout3ui6; StructArrayLayout3ui6.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout3ui6.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3ui6.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o2 = i * 3; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; return i; }; return StructArrayLayout3ui6; }(StructArray)); StructArrayLayout3ui6.prototype.bytesPerElement = 6; register('StructArrayLayout3ui6', StructArrayLayout3ui6); /** * Implementation of the StructArray layout: * [0]: Uint16[2] * * @private */ var StructArrayLayout2ui4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2ui4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2ui4.__proto__ = StructArray; StructArrayLayout2ui4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2ui4.prototype.constructor = StructArrayLayout2ui4; StructArrayLayout2ui4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout2ui4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2ui4.prototype.emplace = function emplace (i , v0 , v1 ) { var o2 = i * 2; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; return i; }; return StructArrayLayout2ui4; }(StructArray)); StructArrayLayout2ui4.prototype.bytesPerElement = 4; register('StructArrayLayout2ui4', StructArrayLayout2ui4); /** * Implementation of the StructArray layout: * [0]: Uint16[1] * * @private */ var StructArrayLayout1ui2 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ui2 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ui2.__proto__ = StructArray; StructArrayLayout1ui2.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ui2.prototype.constructor = StructArrayLayout1ui2; StructArrayLayout1ui2.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout1ui2.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1ui2.prototype.emplace = function emplace (i , v0 ) { var o2 = i * 1; this.uint16[o2 + 0] = v0; return i; }; return StructArrayLayout1ui2; }(StructArray)); StructArrayLayout1ui2.prototype.bytesPerElement = 2; register('StructArrayLayout1ui2', StructArrayLayout1ui2); /** * Implementation of the StructArray layout: * [0]: Float32[2] * * @private */ var StructArrayLayout2f8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2f8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2f8.__proto__ = StructArray; StructArrayLayout2f8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2f8.prototype.constructor = StructArrayLayout2f8; StructArrayLayout2f8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2f8.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2f8.prototype.emplace = function emplace (i , v0 , v1 ) { var o4 = i * 2; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; return i; }; return StructArrayLayout2f8; }(StructArray)); StructArrayLayout2f8.prototype.bytesPerElement = 8; register('StructArrayLayout2f8', StructArrayLayout2f8); /** * Implementation of the StructArray layout: * [0]: Float32[4] * * @private */ var StructArrayLayout4f16 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4f16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4f16.__proto__ = StructArray; StructArrayLayout4f16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4f16.prototype.constructor = StructArrayLayout4f16; StructArrayLayout4f16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout4f16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout4f16.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o4 = i * 4; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; this.float32[o4 + 3] = v3; return i; }; return StructArrayLayout4f16; }(StructArray)); StructArrayLayout4f16.prototype.bytesPerElement = 16; register('StructArrayLayout4f16', StructArrayLayout4f16); var CollisionBoxStruct = /*@__PURE__*/(function (Struct) { function CollisionBoxStruct () { Struct.apply(this, arguments); } if ( Struct ) CollisionBoxStruct.__proto__ = Struct; CollisionBoxStruct.prototype = Object.create( Struct && Struct.prototype ); CollisionBoxStruct.prototype.constructor = CollisionBoxStruct; var prototypeAccessors = { anchorPointX: { configurable: true },anchorPointY: { configurable: true },x1: { configurable: true },y1: { configurable: true },x2: { configurable: true },y2: { configurable: true },featureIndex: { configurable: true },sourceLayerIndex: { configurable: true },bucketIndex: { configurable: true },radius: { configurable: true },signedDistanceFromAnchor: { configurable: true },anchorPoint: { configurable: true } }; prototypeAccessors.anchorPointX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors.anchorPointX.set = function (x ) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors.anchorPointY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors.anchorPointY.set = function (x ) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors.x1.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors.x1.set = function (x ) { this._structArray.int16[this._pos2 + 2] = x; }; prototypeAccessors.y1.get = function () { return this._structArray.int16[this._pos2 + 3]; }; prototypeAccessors.y1.set = function (x ) { this._structArray.int16[this._pos2 + 3] = x; }; prototypeAccessors.x2.get = function () { return this._structArray.int16[this._pos2 + 4]; }; prototypeAccessors.x2.set = function (x ) { this._structArray.int16[this._pos2 + 4] = x; }; prototypeAccessors.y2.get = function () { return this._structArray.int16[this._pos2 + 5]; }; prototypeAccessors.y2.set = function (x ) { this._structArray.int16[this._pos2 + 5] = x; }; prototypeAccessors.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 3]; }; prototypeAccessors.featureIndex.set = function (x ) { this._structArray.uint32[this._pos4 + 3] = x; }; prototypeAccessors.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 8]; }; prototypeAccessors.sourceLayerIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 8] = x; }; prototypeAccessors.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 9]; }; prototypeAccessors.bucketIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 9] = x; }; prototypeAccessors.radius.get = function () { return this._structArray.int16[this._pos2 + 10]; }; prototypeAccessors.radius.set = function (x ) { this._structArray.int16[this._pos2 + 10] = x; }; prototypeAccessors.signedDistanceFromAnchor.get = function () { return this._structArray.int16[this._pos2 + 11]; }; prototypeAccessors.signedDistanceFromAnchor.set = function (x ) { this._structArray.int16[this._pos2 + 11] = x; }; prototypeAccessors.anchorPoint.get = function () { return new pointGeometry(this.anchorPointX, this.anchorPointY); }; Object.defineProperties( CollisionBoxStruct.prototype, prototypeAccessors ); return CollisionBoxStruct; }(Struct)); CollisionBoxStruct.prototype.size = 24; /** * @private */ var CollisionBoxArray = /*@__PURE__*/(function (StructArrayLayout6i1ul2ui2i24) { function CollisionBoxArray () { StructArrayLayout6i1ul2ui2i24.apply(this, arguments); } if ( StructArrayLayout6i1ul2ui2i24 ) CollisionBoxArray.__proto__ = StructArrayLayout6i1ul2ui2i24; CollisionBoxArray.prototype = Object.create( StructArrayLayout6i1ul2ui2i24 && StructArrayLayout6i1ul2ui2i24.prototype ); CollisionBoxArray.prototype.constructor = CollisionBoxArray; CollisionBoxArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new CollisionBoxStruct(this, index); }; return CollisionBoxArray; }(StructArrayLayout6i1ul2ui2i24)); register('CollisionBoxArray', CollisionBoxArray); var PlacedSymbolStruct = /*@__PURE__*/(function (Struct) { function PlacedSymbolStruct () { Struct.apply(this, arguments); } if ( Struct ) PlacedSymbolStruct.__proto__ = Struct; PlacedSymbolStruct.prototype = Object.create( Struct && Struct.prototype ); PlacedSymbolStruct.prototype.constructor = PlacedSymbolStruct; var prototypeAccessors$1 = { anchorX: { configurable: true },anchorY: { configurable: true },glyphStartIndex: { configurable: true },numGlyphs: { configurable: true },vertexStartIndex: { configurable: true },lineStartIndex: { configurable: true },lineLength: { configurable: true },segment: { configurable: true },lowerSize: { configurable: true },upperSize: { configurable: true },lineOffsetX: { configurable: true },lineOffsetY: { configurable: true },writingMode: { configurable: true },placedOrientation: { configurable: true },hidden: { configurable: true },crossTileID: { configurable: true } }; prototypeAccessors$1.anchorX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$1.anchorX.set = function (x ) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors$1.anchorY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$1.anchorY.set = function (x ) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors$1.glyphStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; }; prototypeAccessors$1.glyphStartIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 2] = x; }; prototypeAccessors$1.numGlyphs.get = function () { return this._structArray.uint16[this._pos2 + 3]; }; prototypeAccessors$1.numGlyphs.set = function (x ) { this._structArray.uint16[this._pos2 + 3] = x; }; prototypeAccessors$1.vertexStartIndex.get = function () { return this._structArray.uint32[this._pos4 + 2]; }; prototypeAccessors$1.vertexStartIndex.set = function (x ) { this._structArray.uint32[this._pos4 + 2] = x; }; prototypeAccessors$1.lineStartIndex.get = function () { return this._structArray.uint32[this._pos4 + 3]; }; prototypeAccessors$1.lineStartIndex.set = function (x ) { this._structArray.uint32[this._pos4 + 3] = x; }; prototypeAccessors$1.lineLength.get = function () { return this._structArray.uint32[this._pos4 + 4]; }; prototypeAccessors$1.lineLength.set = function (x ) { this._structArray.uint32[this._pos4 + 4] = x; }; prototypeAccessors$1.segment.get = function () { return this._structArray.uint16[this._pos2 + 10]; }; prototypeAccessors$1.segment.set = function (x ) { this._structArray.uint16[this._pos2 + 10] = x; }; prototypeAccessors$1.lowerSize.get = function () { return this._structArray.uint16[this._pos2 + 11]; }; prototypeAccessors$1.lowerSize.set = function (x ) { this._structArray.uint16[this._pos2 + 11] = x; }; prototypeAccessors$1.upperSize.get = function () { return this._structArray.uint16[this._pos2 + 12]; }; prototypeAccessors$1.upperSize.set = function (x ) { this._structArray.uint16[this._pos2 + 12] = x; }; prototypeAccessors$1.lineOffsetX.get = function () { return this._structArray.float32[this._pos4 + 7]; }; prototypeAccessors$1.lineOffsetX.set = function (x ) { this._structArray.float32[this._pos4 + 7] = x; }; prototypeAccessors$1.lineOffsetY.get = function () { return this._structArray.float32[this._pos4 + 8]; }; prototypeAccessors$1.lineOffsetY.set = function (x ) { this._structArray.float32[this._pos4 + 8] = x; }; prototypeAccessors$1.writingMode.get = function () { return this._structArray.uint8[this._pos1 + 36]; }; prototypeAccessors$1.writingMode.set = function (x ) { this._structArray.uint8[this._pos1 + 36] = x; }; prototypeAccessors$1.placedOrientation.get = function () { return this._structArray.uint8[this._pos1 + 37]; }; prototypeAccessors$1.placedOrientation.set = function (x ) { this._structArray.uint8[this._pos1 + 37] = x; }; prototypeAccessors$1.hidden.get = function () { return this._structArray.uint8[this._pos1 + 38]; }; prototypeAccessors$1.hidden.set = function (x ) { this._structArray.uint8[this._pos1 + 38] = x; }; prototypeAccessors$1.crossTileID.get = function () { return this._structArray.uint32[this._pos4 + 10]; }; prototypeAccessors$1.crossTileID.set = function (x ) { this._structArray.uint32[this._pos4 + 10] = x; }; Object.defineProperties( PlacedSymbolStruct.prototype, prototypeAccessors$1 ); return PlacedSymbolStruct; }(Struct)); PlacedSymbolStruct.prototype.size = 44; /** * @private */ var PlacedSymbolArray = /*@__PURE__*/(function (StructArrayLayout2i2ui3ul3ui2f3ub1ul44) { function PlacedSymbolArray () { StructArrayLayout2i2ui3ul3ui2f3ub1ul44.apply(this, arguments); } if ( StructArrayLayout2i2ui3ul3ui2f3ub1ul44 ) PlacedSymbolArray.__proto__ = StructArrayLayout2i2ui3ul3ui2f3ub1ul44; PlacedSymbolArray.prototype = Object.create( StructArrayLayout2i2ui3ul3ui2f3ub1ul44 && StructArrayLayout2i2ui3ul3ui2f3ub1ul44.prototype ); PlacedSymbolArray.prototype.constructor = PlacedSymbolArray; PlacedSymbolArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new PlacedSymbolStruct(this, index); }; return PlacedSymbolArray; }(StructArrayLayout2i2ui3ul3ui2f3ub1ul44)); register('PlacedSymbolArray', PlacedSymbolArray); var SymbolInstanceStruct = /*@__PURE__*/(function (Struct) { function SymbolInstanceStruct () { Struct.apply(this, arguments); } if ( Struct ) SymbolInstanceStruct.__proto__ = Struct; SymbolInstanceStruct.prototype = Object.create( Struct && Struct.prototype ); SymbolInstanceStruct.prototype.constructor = SymbolInstanceStruct; var prototypeAccessors$2 = { anchorX: { configurable: true },anchorY: { configurable: true },rightJustifiedTextSymbolIndex: { configurable: true },centerJustifiedTextSymbolIndex: { configurable: true },leftJustifiedTextSymbolIndex: { configurable: true },verticalPlacedTextSymbolIndex: { configurable: true },key: { configurable: true },textBoxStartIndex: { configurable: true },textBoxEndIndex: { configurable: true },verticalTextBoxStartIndex: { configurable: true },verticalTextBoxEndIndex: { configurable: true },iconBoxStartIndex: { configurable: true },iconBoxEndIndex: { configurable: true },featureIndex: { configurable: true },numHorizontalGlyphVertices: { configurable: true },numVerticalGlyphVertices: { configurable: true },numIconVertices: { configurable: true },crossTileID: { configurable: true },textBoxScale: { configurable: true },radialTextOffset: { configurable: true } }; prototypeAccessors$2.anchorX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$2.anchorX.set = function (x ) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors$2.anchorY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$2.anchorY.set = function (x ) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors$2.rightJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors$2.rightJustifiedTextSymbolIndex.set = function (x ) { this._structArray.int16[this._pos2 + 2] = x; }; prototypeAccessors$2.centerJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 3]; }; prototypeAccessors$2.centerJustifiedTextSymbolIndex.set = function (x ) { this._structArray.int16[this._pos2 + 3] = x; }; prototypeAccessors$2.leftJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 4]; }; prototypeAccessors$2.leftJustifiedTextSymbolIndex.set = function (x ) { this._structArray.int16[this._pos2 + 4] = x; }; prototypeAccessors$2.verticalPlacedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 5]; }; prototypeAccessors$2.verticalPlacedTextSymbolIndex.set = function (x ) { this._structArray.int16[this._pos2 + 5] = x; }; prototypeAccessors$2.key.get = function () { return this._structArray.uint16[this._pos2 + 6]; }; prototypeAccessors$2.key.set = function (x ) { this._structArray.uint16[this._pos2 + 6] = x; }; prototypeAccessors$2.textBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 7]; }; prototypeAccessors$2.textBoxStartIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 7] = x; }; prototypeAccessors$2.textBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 8]; }; prototypeAccessors$2.textBoxEndIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 8] = x; }; prototypeAccessors$2.verticalTextBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 9]; }; prototypeAccessors$2.verticalTextBoxStartIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 9] = x; }; prototypeAccessors$2.verticalTextBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 10]; }; prototypeAccessors$2.verticalTextBoxEndIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 10] = x; }; prototypeAccessors$2.iconBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 11]; }; prototypeAccessors$2.iconBoxStartIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 11] = x; }; prototypeAccessors$2.iconBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 12]; }; prototypeAccessors$2.iconBoxEndIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 12] = x; }; prototypeAccessors$2.featureIndex.get = function () { return this._structArray.uint16[this._pos2 + 13]; }; prototypeAccessors$2.featureIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 13] = x; }; prototypeAccessors$2.numHorizontalGlyphVertices.get = function () { return this._structArray.uint16[this._pos2 + 14]; }; prototypeAccessors$2.numHorizontalGlyphVertices.set = function (x ) { this._structArray.uint16[this._pos2 + 14] = x; }; prototypeAccessors$2.numVerticalGlyphVertices.get = function () { return this._structArray.uint16[this._pos2 + 15]; }; prototypeAccessors$2.numVerticalGlyphVertices.set = function (x ) { this._structArray.uint16[this._pos2 + 15] = x; }; prototypeAccessors$2.numIconVertices.get = function () { return this._structArray.uint16[this._pos2 + 16]; }; prototypeAccessors$2.numIconVertices.set = function (x ) { this._structArray.uint16[this._pos2 + 16] = x; }; prototypeAccessors$2.crossTileID.get = function () { return this._structArray.uint32[this._pos4 + 9]; }; prototypeAccessors$2.crossTileID.set = function (x ) { this._structArray.uint32[this._pos4 + 9] = x; }; prototypeAccessors$2.textBoxScale.get = function () { return this._structArray.float32[this._pos4 + 10]; }; prototypeAccessors$2.textBoxScale.set = function (x ) { this._structArray.float32[this._pos4 + 10] = x; }; prototypeAccessors$2.radialTextOffset.get = function () { return this._structArray.float32[this._pos4 + 11]; }; prototypeAccessors$2.radialTextOffset.set = function (x ) { this._structArray.float32[this._pos4 + 11] = x; }; Object.defineProperties( SymbolInstanceStruct.prototype, prototypeAccessors$2 ); return SymbolInstanceStruct; }(Struct)); SymbolInstanceStruct.prototype.size = 48; /** * @private */ var SymbolInstanceArray = /*@__PURE__*/(function (StructArrayLayout6i11ui1ul2f48) { function SymbolInstanceArray () { StructArrayLayout6i11ui1ul2f48.apply(this, arguments); } if ( StructArrayLayout6i11ui1ul2f48 ) SymbolInstanceArray.__proto__ = StructArrayLayout6i11ui1ul2f48; SymbolInstanceArray.prototype = Object.create( StructArrayLayout6i11ui1ul2f48 && StructArrayLayout6i11ui1ul2f48.prototype ); SymbolInstanceArray.prototype.constructor = SymbolInstanceArray; SymbolInstanceArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new SymbolInstanceStruct(this, index); }; return SymbolInstanceArray; }(StructArrayLayout6i11ui1ul2f48)); register('SymbolInstanceArray', SymbolInstanceArray); var GlyphOffsetStruct = /*@__PURE__*/(function (Struct) { function GlyphOffsetStruct () { Struct.apply(this, arguments); } if ( Struct ) GlyphOffsetStruct.__proto__ = Struct; GlyphOffsetStruct.prototype = Object.create( Struct && Struct.prototype ); GlyphOffsetStruct.prototype.constructor = GlyphOffsetStruct; var prototypeAccessors$3 = { offsetX: { configurable: true } }; prototypeAccessors$3.offsetX.get = function () { return this._structArray.float32[this._pos4 + 0]; }; prototypeAccessors$3.offsetX.set = function (x ) { this._structArray.float32[this._pos4 + 0] = x; }; Object.defineProperties( GlyphOffsetStruct.prototype, prototypeAccessors$3 ); return GlyphOffsetStruct; }(Struct)); GlyphOffsetStruct.prototype.size = 4; /** * @private */ var GlyphOffsetArray = /*@__PURE__*/(function (StructArrayLayout1f4) { function GlyphOffsetArray () { StructArrayLayout1f4.apply(this, arguments); } if ( StructArrayLayout1f4 ) GlyphOffsetArray.__proto__ = StructArrayLayout1f4; GlyphOffsetArray.prototype = Object.create( StructArrayLayout1f4 && StructArrayLayout1f4.prototype ); GlyphOffsetArray.prototype.constructor = GlyphOffsetArray; GlyphOffsetArray.prototype.getoffsetX = function getoffsetX (index ) { return this.float32[index * 1 + 0]; }; /** * Return the GlyphOffsetStruct at the given location in the array. * @param {number} index The index of the element. */ GlyphOffsetArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new GlyphOffsetStruct(this, index); }; return GlyphOffsetArray; }(StructArrayLayout1f4)); register('GlyphOffsetArray', GlyphOffsetArray); var SymbolLineVertexStruct = /*@__PURE__*/(function (Struct) { function SymbolLineVertexStruct () { Struct.apply(this, arguments); } if ( Struct ) SymbolLineVertexStruct.__proto__ = Struct; SymbolLineVertexStruct.prototype = Object.create( Struct && Struct.prototype ); SymbolLineVertexStruct.prototype.constructor = SymbolLineVertexStruct; var prototypeAccessors$4 = { x: { configurable: true },y: { configurable: true },tileUnitDistanceFromAnchor: { configurable: true } }; prototypeAccessors$4.x.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$4.x.set = function (x ) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors$4.y.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$4.y.set = function (x ) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors$4.tileUnitDistanceFromAnchor.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors$4.tileUnitDistanceFromAnchor.set = function (x ) { this._structArray.int16[this._pos2 + 2] = x; }; Object.defineProperties( SymbolLineVertexStruct.prototype, prototypeAccessors$4 ); return SymbolLineVertexStruct; }(Struct)); SymbolLineVertexStruct.prototype.size = 6; /** * @private */ var SymbolLineVertexArray = /*@__PURE__*/(function (StructArrayLayout3i6) { function SymbolLineVertexArray () { StructArrayLayout3i6.apply(this, arguments); } if ( StructArrayLayout3i6 ) SymbolLineVertexArray.__proto__ = StructArrayLayout3i6; SymbolLineVertexArray.prototype = Object.create( StructArrayLayout3i6 && StructArrayLayout3i6.prototype ); SymbolLineVertexArray.prototype.constructor = SymbolLineVertexArray; SymbolLineVertexArray.prototype.getx = function getx (index ) { return this.int16[index * 3 + 0]; }; SymbolLineVertexArray.prototype.gety = function gety (index ) { return this.int16[index * 3 + 1]; }; SymbolLineVertexArray.prototype.gettileUnitDistanceFromAnchor = function gettileUnitDistanceFromAnchor (index ) { return this.int16[index * 3 + 2]; }; /** * Return the SymbolLineVertexStruct at the given location in the array. * @param {number} index The index of the element. */ SymbolLineVertexArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new SymbolLineVertexStruct(this, index); }; return SymbolLineVertexArray; }(StructArrayLayout3i6)); register('SymbolLineVertexArray', SymbolLineVertexArray); var FeatureIndexStruct = /*@__PURE__*/(function (Struct) { function FeatureIndexStruct () { Struct.apply(this, arguments); } if ( Struct ) FeatureIndexStruct.__proto__ = Struct; FeatureIndexStruct.prototype = Object.create( Struct && Struct.prototype ); FeatureIndexStruct.prototype.constructor = FeatureIndexStruct; var prototypeAccessors$5 = { featureIndex: { configurable: true },sourceLayerIndex: { configurable: true },bucketIndex: { configurable: true } }; prototypeAccessors$5.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 0]; }; prototypeAccessors$5.featureIndex.set = function (x ) { this._structArray.uint32[this._pos4 + 0] = x; }; prototypeAccessors$5.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; }; prototypeAccessors$5.sourceLayerIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 2] = x; }; prototypeAccessors$5.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 3]; }; prototypeAccessors$5.bucketIndex.set = function (x ) { this._structArray.uint16[this._pos2 + 3] = x; }; Object.defineProperties( FeatureIndexStruct.prototype, prototypeAccessors$5 ); return FeatureIndexStruct; }(Struct)); FeatureIndexStruct.prototype.size = 8; /** * @private */ var FeatureIndexArray = /*@__PURE__*/(function (StructArrayLayout1ul2ui8) { function FeatureIndexArray () { StructArrayLayout1ul2ui8.apply(this, arguments); } if ( StructArrayLayout1ul2ui8 ) FeatureIndexArray.__proto__ = StructArrayLayout1ul2ui8; FeatureIndexArray.prototype = Object.create( StructArrayLayout1ul2ui8 && StructArrayLayout1ul2ui8.prototype ); FeatureIndexArray.prototype.constructor = FeatureIndexArray; FeatureIndexArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new FeatureIndexStruct(this, index); }; return FeatureIndexArray; }(StructArrayLayout1ul2ui8)); register('FeatureIndexArray', FeatureIndexArray); // var layout$1 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); var members = layout$1.members; var size = layout$1.size; var alignment = layout$1.alignment; // var SegmentVector = function SegmentVector(segments) { if ( segments === void 0 ) segments = []; this.segments = segments; }; SegmentVector.prototype.prepareSegment = function prepareSegment (numVertices , layoutVertexArray , indexArray , sortKey ) { var 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; }; SegmentVector.prototype.get = function get () { return this.segments; }; SegmentVector.prototype.destroy = function destroy () { for (var i = 0, list = this.segments; i < list.length; i += 1) { var segment = list[i]; for (var k in segment.vaos) { segment.vaos[k].destroy(); } } }; SegmentVector.simpleSegment = function simpleSegment (vertexOffset , primitiveOffset , vertexLength , primitiveLength ) { return new SegmentVector([{ vertexOffset: vertexOffset, primitiveOffset: primitiveOffset, vertexLength: vertexLength, primitiveLength: primitiveLength, vaos: {}, sortKey: 0 }]); }; /* * 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; register('SegmentVector', SegmentVector); // /** * 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; } // // A transferable data structure that maps feature ids to their indices and buffer offsets var FeaturePositionMap = function FeaturePositionMap() { this.ids = []; this.positions = []; this.indexed = false; }; FeaturePositionMap.prototype.add = function add (id , index , start , end ) { this.ids.push(id); this.positions.push(index, start, end); }; FeaturePositionMap.prototype.getPositions = function getPositions (id ) { assert_1(this.indexed); // binary search for the first occurrence of id in this.ids; // relies on ids/positions being sorted by id, which happens in serialization var i = 0; var j = this.ids.length - 1; while (i < j) { var m = (i + j) >> 1; if (this.ids[m] >= id) { j = m; } else { i = m + 1; } } var positions = []; while (this.ids[i] === id) { var index = this.positions[3 * i]; var start = this.positions[3 * i + 1]; var end = this.positions[3 * i + 2]; positions.push({index: index, start: start, end: end}); i++; } return positions; }; FeaturePositionMap.serialize = function serialize (map , transferables ) { var ids = new Float64Array(map.ids); var positions = new Uint32Array(map.positions); sort(ids, positions, 0, ids.length - 1); transferables.push(ids.buffer, positions.buffer); return {ids: ids, positions: positions}; }; FeaturePositionMap.deserialize = function deserialize (obj ) { var 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; }; // custom quicksort that sorts ids, indices and offsets together (by ids) function sort(ids, positions, left, right) { if (left >= right) { return; } var pivot = ids[(left + right) >> 1]; var i = left - 1; var j = right + 1; 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); } sort(ids, positions, left, j); sort(ids, positions, j + 1, right); } function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } register('FeaturePositionMap', FeaturePositionMap); // var Uniform = function Uniform(context , location ) { this.gl = context.gl; this.location = location; }; var Uniform1i = /*@__PURE__*/(function (Uniform) { function Uniform1i(context , location ) { Uniform.call(this, context, location); this.current = 0; } if ( Uniform ) Uniform1i.__proto__ = Uniform; Uniform1i.prototype = Object.create( Uniform && Uniform.prototype ); Uniform1i.prototype.constructor = Uniform1i; Uniform1i.prototype.set = function set (v ) { if (this.current !== v) { this.current = v; this.gl.uniform1i(this.location, v); } }; return Uniform1i; }(Uniform)); var Uniform1f = /*@__PURE__*/(function (Uniform) { function Uniform1f(context , location ) { Uniform.call(this, context, location); this.current = 0; } if ( Uniform ) Uniform1f.__proto__ = Uniform; Uniform1f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform1f.prototype.constructor = Uniform1f; Uniform1f.prototype.set = function set (v ) { if (this.current !== v) { this.current = v; this.gl.uniform1f(this.location, v); } }; return Uniform1f; }(Uniform)); var Uniform2f = /*@__PURE__*/(function (Uniform) { function Uniform2f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0]; } if ( Uniform ) Uniform2f.__proto__ = Uniform; Uniform2f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform2f.prototype.constructor = Uniform2f; Uniform2f.prototype.set = function 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]); } }; return Uniform2f; }(Uniform)); var Uniform3f = /*@__PURE__*/(function (Uniform) { function Uniform3f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0, 0]; } if ( Uniform ) Uniform3f.__proto__ = Uniform; Uniform3f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform3f.prototype.constructor = Uniform3f; Uniform3f.prototype.set = function 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]); } }; return Uniform3f; }(Uniform)); var Uniform4f = /*@__PURE__*/(function (Uniform) { function Uniform4f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0, 0, 0]; } if ( Uniform ) Uniform4f.__proto__ = Uniform; Uniform4f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform4f.prototype.constructor = Uniform4f; Uniform4f.prototype.set = function 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]); } }; return Uniform4f; }(Uniform)); var UniformColor = /*@__PURE__*/(function (Uniform) { function UniformColor(context , location ) { Uniform.call(this, context, location); this.current = Color.transparent; } if ( Uniform ) UniformColor.__proto__ = Uniform; UniformColor.prototype = Object.create( Uniform && Uniform.prototype ); UniformColor.prototype.constructor = UniformColor; UniformColor.prototype.set = function 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); } }; return UniformColor; }(Uniform)); var emptyMat4 = new Float32Array(16); var UniformMatrix4f = /*@__PURE__*/(function (Uniform) { function UniformMatrix4f(context , location ) { Uniform.call(this, context, location); this.current = emptyMat4; } if ( Uniform ) UniformMatrix4f.__proto__ = Uniform; UniformMatrix4f.prototype = Object.create( Uniform && Uniform.prototype ); UniformMatrix4f.prototype.constructor = UniformMatrix4f; UniformMatrix4f.prototype.set = function 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 (var i = 1; i < 16; i++) { if (v[i] !== this.current[i]) { this.current = v; this.gl.uniformMatrix4fv(this.location, false, v); break; } } }; return UniformMatrix4f; }(Uniform)); // function packColor(color ) { return [ packUint8ToFloat(255 * color.r, 255 * color.g), packUint8ToFloat(255 * color.b, 255 * color.a) ]; } /** * `Binder` is the interface definition for the strategies for constructing, * uploading, and binding paint property data as GLSL attributes. Most style- * spec properties have a 1:1 relationship to shader attribute/uniforms, but * some require multliple 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 accomodate this. * * @private */ var ConstantBinder = function ConstantBinder(value , names , type ) { this.value = value; this.names = names; this.uniformNames = this.names.map(function (name) { return ("u_" + name); }); this.type = type; this.maxValue = -Infinity; }; ConstantBinder.prototype.defines = function defines () { return this.names.map(function (name) { return ("#define HAS_UNIFORM_u_" + name); }); }; ConstantBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions () {}; ConstantBinder.prototype.populatePaintArray = function populatePaintArray () {}; ConstantBinder.prototype.updatePaintArray = function updatePaintArray () {}; ConstantBinder.prototype.upload = function upload () {}; ConstantBinder.prototype.destroy = function destroy () {}; ConstantBinder.prototype.setUniforms = function setUniforms (context , uniform , globals , currentValue ) { uniform.set(currentValue.constantOr(this.value)); }; ConstantBinder.prototype.getBinding = function getBinding (context , location ) { return (this.type === 'color') ? new UniformColor(context, location) : new Uniform1f(context, location); }; ConstantBinder.serialize = function serialize$1 (binder ) { var value = binder.value; var names = binder.names; var type = binder.type; return {value: serialize(value), names: names, type: type}; }; ConstantBinder.deserialize = function deserialize$1 (serialized ) { var value = serialized.value; var names = serialized.names; var type = serialized.type; return new ConstantBinder(deserialize(value), names, type); }; var CrossFadedConstantBinder = function CrossFadedConstantBinder(value , names , type ) { this.value = value; this.names = names; this.uniformNames = this.names.map(function (name) { return ("u_" + name); }); this.type = type; this.maxValue = -Infinity; this.patternPositions = {patternTo: null, patternFrom: null}; }; CrossFadedConstantBinder.prototype.defines = function defines () { return this.names.map(function (name) { return ("#define HAS_UNIFORM_u_" + name); }); }; CrossFadedConstantBinder.prototype.populatePaintArray = function populatePaintArray () {}; CrossFadedConstantBinder.prototype.updatePaintArray = function updatePaintArray () {}; CrossFadedConstantBinder.prototype.upload = function upload () {}; CrossFadedConstantBinder.prototype.destroy = function destroy () {}; CrossFadedConstantBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions (posTo , posFrom ) { this.patternPositions.patternTo = posTo.tlbr; this.patternPositions.patternFrom = posFrom.tlbr; }; CrossFadedConstantBinder.prototype.setUniforms = function setUniforms (context , uniform , globals , currentValue , uniformName ) { var pos = this.patternPositions; if (uniformName === "u_pattern_to" && pos.patternTo) { uniform.set(pos.patternTo); } if (uniformName === "u_pattern_from" && pos.patternFrom) { uniform.set(pos.patternFrom); } }; CrossFadedConstantBinder.prototype.getBinding = function getBinding (context , location ) { return new Uniform4f(context, location); }; var SourceExpressionBinder = function SourceExpressionBinder(expression , names , type , PaintVertexArray ) { this.expression = expression; this.names = names; this.type = type; this.uniformNames = this.names.map(function (name) { return ("a_" + name); }); this.maxValue = -Infinity; this.paintVertexAttributes = names.map(function (name) { return ({ name: ("a_" + name), type: 'Float32', components: type === 'color' ? 2 : 1, offset: 0 }); } ); this.paintVertexArray = new PaintVertexArray(); }; SourceExpressionBinder.prototype.defines = function defines () { return []; }; SourceExpressionBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions () {}; SourceExpressionBinder.prototype.populatePaintArray = function populatePaintArray (newLength , feature , imagePositions , formattedSection ) { var paintArray = this.paintVertexArray; var start = paintArray.length; paintArray.reserve(newLength); var value = this.expression.evaluate(new EvaluationParameters(0), feature, {}, formattedSection); if (this.type === 'color') { var color = packColor(value); for (var i = start; i < newLength; i++) { paintArray.emplaceBack(color[0], color[1]); } } else { for (var i$1 = start; i$1 < newLength; i$1++) { paintArray.emplaceBack(value); } this.maxValue = Math.max(this.maxValue, value); } }; SourceExpressionBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState ) { var paintArray = this.paintVertexArray; var value = this.expression.evaluate({zoom: 0}, feature, featureState); if (this.type === 'color') { var color = packColor(value); for (var i = start; i < end; i++) { paintArray.emplace(i, color[0], color[1]); } } else { for (var i$1 = start; i$1 < end; i$1++) { paintArray.emplace(i$1, value); } this.maxValue = Math.max(this.maxValue, value); } }; SourceExpressionBinder.prototype.upload = function 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); } } }; SourceExpressionBinder.prototype.destroy = function destroy () { if (this.paintVertexBuffer) { this.paintVertexBuffer.destroy(); } }; SourceExpressionBinder.prototype.setUniforms = function setUniforms (context , uniform ) { uniform.set(0); }; SourceExpressionBinder.prototype.getBinding = function getBinding (context , location ) { return new Uniform1f(context, location); }; var CompositeExpressionBinder = function CompositeExpressionBinder(expression , names , type , useIntegerZoom , zoom , layout ) { this.expression = expression; this.names = names; this.uniformNames = this.names.map(function (name) { return ("u_" + name + "_t"); }); this.type = type; this.useIntegerZoom = useIntegerZoom; this.zoom = zoom; this.maxValue = -Infinity; var PaintVertexArray = layout; this.paintVertexAttributes = names.map(function (name) { return { name: ("a_" + name), type: 'Float32', components: type === 'color' ? 4 : 2, offset: 0 }; }); this.paintVertexArray = new PaintVertexArray(); }; CompositeExpressionBinder.prototype.defines = function defines () { return []; }; CompositeExpressionBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions () {}; CompositeExpressionBinder.prototype.populatePaintArray = function populatePaintArray (newLength , feature , imagePositions , formattedSection ) { var paintArray = this.paintVertexArray; var start = paintArray.length; paintArray.reserve(newLength); var min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}, formattedSection); var max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}, formattedSection); if (this.type === 'color') { var minColor = packColor(min); var maxColor = packColor(max); for (var i = start; i < newLength; i++) { paintArray.emplaceBack(minColor[0], minColor[1], maxColor[0], maxColor[1]); } } else { for (var i$1 = start; i$1 < newLength; i$1++) { paintArray.emplaceBack(min, max); } this.maxValue = Math.max(this.maxValue, min, max); } }; CompositeExpressionBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState ) { var paintArray = this.paintVertexArray; var min = this.expression.evaluate({zoom: this.zoom }, feature, featureState); var max = this.expression.evaluate({zoom: this.zoom + 1}, feature, featureState); if (this.type === 'color') { var minColor = packColor(min); var maxColor = packColor(max); for (var i = start; i < end; i++) { paintArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]); } } else { for (var i$1 = start; i$1 < end; i$1++) { paintArray.emplace(i$1, min, max); } this.maxValue = Math.max(this.maxValue, min, max); } }; CompositeExpressionBinder.prototype.upload = function 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); } } }; CompositeExpressionBinder.prototype.destroy = function destroy () { if (this.paintVertexBuffer) { this.paintVertexBuffer.destroy(); } }; CompositeExpressionBinder.prototype.interpolationFactor = function interpolationFactor (currentZoom ) { if (this.useIntegerZoom) { return this.expression.interpolationFactor(Math.floor(currentZoom), this.zoom, this.zoom + 1); } else { return this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1); } }; CompositeExpressionBinder.prototype.setUniforms = function setUniforms (context , uniform , globals ) { uniform.set(this.interpolationFactor(globals.zoom)); }; CompositeExpressionBinder.prototype.getBinding = function getBinding (context , location ) { return new Uniform1f(context, location); }; var CrossFadedCompositeBinder = function CrossFadedCompositeBinder(expression , names , type , useIntegerZoom , zoom , PaintVertexArray , layerId ) { this.expression = expression; this.names = names; this.type = type; this.uniformNames = this.names.map(function (name) { return ("u_" + name + "_t"); }); this.useIntegerZoom = useIntegerZoom; this.zoom = zoom; this.maxValue = -Infinity; this.layerId = layerId; this.paintVertexAttributes = names.map(function (name) { return ({ name: ("a_" + name), type: 'Uint16', components: 4, offset: 0 }); } ); this.zoomInPaintVertexArray = new PaintVertexArray(); this.zoomOutPaintVertexArray = new PaintVertexArray(); }; CrossFadedCompositeBinder.prototype.defines = function defines () { return []; }; CrossFadedCompositeBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions () {}; CrossFadedCompositeBinder.prototype.populatePaintArray = function populatePaintArray (length , feature , imagePositions ) { // 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. var zoomInArray = this.zoomInPaintVertexArray; var zoomOutArray = this.zoomOutPaintVertexArray; var ref = this; var layerId = ref.layerId; var start = zoomInArray.length; zoomInArray.reserve(length); zoomOutArray.reserve(length); if (imagePositions && feature.patterns && feature.patterns[layerId]) { var ref$1 = feature.patterns[layerId]; var min = ref$1.min; var mid = ref$1.mid; var max = ref$1.max; var imageMin = imagePositions[min]; var imageMid = imagePositions[mid]; var imageMax = imagePositions[max]; if (!imageMin || !imageMid || !imageMax) { return; } for (var i = start; i < length; i++) { zoomInArray.emplaceBack( imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1] ); zoomOutArray.emplaceBack( imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1] ); } } }; CrossFadedCompositeBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState , imagePositions ) { // 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. var zoomInArray = this.zoomInPaintVertexArray; var zoomOutArray = this.zoomOutPaintVertexArray; var ref = this; var layerId = ref.layerId; if (imagePositions && feature.patterns && feature.patterns[layerId]) { var ref$1 = feature.patterns[layerId]; var min = ref$1.min; var mid = ref$1.mid; var max = ref$1.max; var imageMin = imagePositions[min]; var imageMid = imagePositions[mid]; var imageMax = imagePositions[max]; if (!imageMin || !imageMid || !imageMax) { return; } for (var i = start; i < end; i++) { zoomInArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1] ); zoomOutArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1] ); } } }; CrossFadedCompositeBinder.prototype.upload = function 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); } }; CrossFadedCompositeBinder.prototype.destroy = function destroy () { if (this.zoomOutPaintVertexBuffer) { this.zoomOutPaintVertexBuffer.destroy(); } if (this.zoomInPaintVertexBuffer) { this.zoomInPaintVertexBuffer.destroy(); } }; CrossFadedCompositeBinder.prototype.setUniforms = function setUniforms (context , uniform ) { uniform.set(0); }; CrossFadedCompositeBinder.prototype.getBinding = function getBinding (context , location ) { return new Uniform1f(context, location); }; /** * ProgramConfiguration contains the logic for binding style layer properties and tile * layer feature data into GL program uniforms and vertex attributes. * * Non-data-driven property values are bound to shader uniforms. Data-driven property * values are bound to vertex attributes. In order to support a uniform GLSL syntax over * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma` * abstraction, which ProgramConfiguration is responsible for implementing. At runtime, * it examines the attributes of a particular layer, combines this with fixed knowledge * about how layers of the particular type are implemented, and determines which uniforms * and vertex attributes will be required. It can then substitute the appropriate text * into the shader source code, create and link a program, and bind the uniforms and * vertex attributes in preparation for drawing. * * When a vector tile is parsed, this same configuration information is used to * populate the attribute buffers needed for data-driven styling using the zoom * level and feature property data. * * @private */ var ProgramConfiguration = function ProgramConfiguration() { this.binders = {}; this.cacheKey = ''; this._buffers = []; this._featureMap = new FeaturePositionMap(); this._bufferOffset = 0; }; ProgramConfiguration.createDynamic = function createDynamic (layer , zoom , filterProperties ) { var self = new ProgramConfiguration(); var keys = []; for (var property in layer.paint._values) { if (!filterProperties(property)) { continue; } var value = layer.paint.get(property); if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { continue; } var names = paintAttributeNames(property, layer.type); var type = value.property.specification.type; var useIntegerZoom = value.property.useIntegerZoom; var isCrossFaded = value.property.specification['property-type'] === 'cross-faded' || value.property.specification['property-type'] === 'cross-faded-data-driven'; if (isCrossFaded) { if (value.value.kind === 'constant') { self.binders[property] = new CrossFadedConstantBinder(value.value.value, names, type); keys.push(("/u_" + property)); } else { var StructArrayLayout = layoutType(property, type, 'source'); self.binders[property] = new CrossFadedCompositeBinder(value.value, names, type, useIntegerZoom, zoom, StructArrayLayout, layer.id); keys.push(("/a_" + property)); } } else if (value.value.kind === 'constant') { self.binders[property] = new ConstantBinder(value.value.value, names, type); keys.push(("/u_" + property)); } else if (value.value.kind === 'source') { var StructArrayLayout$1 = layoutType(property, type, 'source'); self.binders[property] = new SourceExpressionBinder(value.value, names, type, StructArrayLayout$1); keys.push(("/a_" + property)); } else { var StructArrayLayout$2 = layoutType(property, type, 'composite'); self.binders[property] = new CompositeExpressionBinder(value.value, names, type, useIntegerZoom, zoom, StructArrayLayout$2); keys.push(("/z_" + property)); } } self.cacheKey = keys.sort().join(''); return self; }; ProgramConfiguration.prototype.populatePaintArrays = function populatePaintArrays (newLength , feature , index , imagePositions , formattedSection ) { for (var property in this.binders) { var binder = this.binders[property]; binder.populatePaintArray(newLength, feature, imagePositions, formattedSection); } if (feature.id !== undefined) { this._featureMap.add(+feature.id, index, this._bufferOffset, newLength); } this._bufferOffset = newLength; }; ProgramConfiguration.prototype.setConstantPatternPositions = function setConstantPatternPositions (posTo , posFrom ) { for (var property in this.binders) { var binder = this.binders[property]; binder.setConstantPatternPositions(posTo, posFrom); } }; ProgramConfiguration.prototype.updatePaintArrays = function updatePaintArrays (featureStates , vtLayer , layer , imagePositions ) { var dirty = false; for (var id in featureStates) { var positions = this._featureMap.getPositions(+id); for (var i = 0, list = positions; i < list.length; i += 1) { var pos = list[i]; var feature = vtLayer.feature(pos.index); for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) { continue; } if ((binder ).expression.isStateDependent === true) { //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255 var value = layer.paint.get(property); (binder ).expression = value.value; binder.updatePaintArray(pos.start, pos.end, feature, featureStates[id], imagePositions); dirty = true; } } } } return dirty; }; ProgramConfiguration.prototype.defines = function defines () { var result = []; for (var property in this.binders) { result.push.apply(result, this.binders[property].defines()); } return result; }; ProgramConfiguration.prototype.getPaintVertexBuffers = function getPaintVertexBuffers () { return this._buffers; }; ProgramConfiguration.prototype.getUniforms = function getUniforms (context , locations ) { var uniforms = []; for (var property in this.binders) { var binder = this.binders[property]; for (var i = 0, list = binder.uniformNames; i < list.length; i += 1) { var name = list[i]; if (locations[name]) { var binding = binder.getBinding(context, locations[name]); uniforms.push({name: name, property: property, binding: binding}); } } } return uniforms; }; ProgramConfiguration.prototype.setUniforms = function setUniforms (context , binderUniforms , properties , globals ) { // Uniform state bindings are owned by the Program, but we set them // from within the ProgramConfiguraton's binder members. for (var i = 0, list = binderUniforms; i < list.length; i += 1) { var ref = list[i]; var name = ref.name; var property = ref.property; var binding = ref.binding; this.binders[property].setUniforms(context, binding, globals, properties.get(property), name); } }; ProgramConfiguration.prototype.updatePatternPaintBuffers = function updatePatternPaintBuffers (crossfade ) { var buffers = []; for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof CrossFadedCompositeBinder) { var patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer; if (patternVertexBuffer) { buffers.push(patternVertexBuffer); } } else if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer ) { buffers.push(binder.paintVertexBuffer); } } this._buffers = buffers; }; ProgramConfiguration.prototype.upload = function upload (context ) { for (var property in this.binders) { this.binders[property].upload(context); } var buffers = []; for (var property$1 in this.binders) { var binder = this.binders[property$1]; if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer ) { buffers.push(binder.paintVertexBuffer); } } this._buffers = buffers; }; ProgramConfiguration.prototype.destroy = function destroy () { for (var property in this.binders) { this.binders[property].destroy(); } }; var ProgramConfigurationSet = function ProgramConfigurationSet(layoutAttributes , layers , zoom , filterProperties) { if ( filterProperties === void 0 ) filterProperties = function () { return true; }; this.programConfigurations = {}; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; this.programConfigurations[layer.id] = ProgramConfiguration.createDynamic(layer, zoom, filterProperties); this.programConfigurations[layer.id].layoutAttributes = layoutAttributes; } this.needsUpload = false; }; ProgramConfigurationSet.prototype.populatePaintArrays = function populatePaintArrays (length , feature , index , imagePositions , formattedSection ) { for (var key in this.programConfigurations) { this.programConfigurations[key].populatePaintArrays(length, feature, index, imagePositions, formattedSection); } this.needsUpload = true; }; ProgramConfigurationSet.prototype.updatePaintArrays = function updatePaintArrays (featureStates , vtLayer , layers , imagePositions ) { for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, vtLayer, layer, imagePositions) || this.needsUpload; } }; ProgramConfigurationSet.prototype.get = function get (layerId ) { return this.programConfigurations[layerId]; }; ProgramConfigurationSet.prototype.upload = function upload (context ) { if (!this.needsUpload) { return; } for (var layerId in this.programConfigurations) { this.programConfigurations[layerId].upload(context); } this.needsUpload = false; }; ProgramConfigurationSet.prototype.destroy = function destroy () { for (var layerId in this.programConfigurations) { this.programConfigurations[layerId].destroy(); } }; function paintAttributeNames(property, type) { var attributeNameExceptions = { 'text-opacity': ['opacity'], 'icon-opacity': ['opacity'], 'text-color': ['fill_color'], 'icon-color': ['fill_color'], 'text-halo-color': ['halo_color'], 'icon-halo-color': ['halo_color'], 'text-halo-blur': ['halo_blur'], 'icon-halo-blur': ['halo_blur'], 'text-halo-width': ['halo_width'], 'icon-halo-width': ['halo_width'], 'line-gap-width': ['gapwidth'], 'line-pattern': ['pattern_to', 'pattern_from'], 'fill-pattern': ['pattern_to', 'pattern_from'], 'fill-extrusion-pattern': ['pattern_to', 'pattern_from'], }; return attributeNameExceptions[property] || [property.replace((type + "-"), '').replace(/-/g, '_')]; } function getLayoutException(property) { var propertyExceptions = { 'line-pattern':{ 'source': StructArrayLayout8ui16, 'composite': StructArrayLayout8ui16 }, 'fill-pattern': { 'source': StructArrayLayout8ui16, 'composite': StructArrayLayout8ui16 }, 'fill-extrusion-pattern':{ 'source': StructArrayLayout8ui16, 'composite': StructArrayLayout8ui16 } }; return propertyExceptions[property]; } function layoutType(property, type, binderType) { var defaultLayouts = { 'color': { 'source': StructArrayLayout2f8, 'composite': StructArrayLayout4f16 }, 'number': { 'source': StructArrayLayout1f4, 'composite': StructArrayLayout2f8 } }; var layoutException = getLayoutException(property); return layoutException && layoutException[binderType] || defaultLayouts[type][binderType]; } register('ConstantBinder', ConstantBinder); register('CrossFadedConstantBinder', CrossFadedConstantBinder); register('SourceExpressionBinder', SourceExpressionBinder); register('CrossFadedCompositeBinder', CrossFadedCompositeBinder); register('CompositeExpressionBinder', CompositeExpressionBinder); register('ProgramConfiguration', ProgramConfiguration, {omit: ['_buffers']}); register('ProgramConfigurationSet', ProgramConfigurationSet); // // /** * 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; // // These bounds define the minimum and maximum supported coordinate values. // While visible coordinates are within [0, EXTENT], tiles may theoretically // contain cordinates within [-Infinity, Infinity]. Our range is limited by the // number of bits used to represent the coordinate. function createBounds(bits) { return { min: -1 * Math.pow(2, bits - 1), max: Math.pow(2, bits - 1) - 1 }; } var bounds = createBounds(15); /** * Loads a geometry from a VectorTileFeature and scales it to the common extent * used internally. * @param {VectorTileFeature} feature * @private */ function loadGeometry(feature ) { var scale = EXTENT / feature.extent; var geometry = feature.loadGeometry(); for (var r = 0; r < geometry.length; r++) { var ring = geometry[r]; for (var p = 0; p < ring.length; p++) { var point = ring[p]; // round here because mapbox-gl-native uses integers to represent // points and we need to do the same to avoid renering differences. point.x = Math.round(point.x * scale); point.y = Math.round(point.y * scale); if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) { warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size'); point.x = clamp(point.x, bounds.min, bounds.max); point.y = clamp(point.y, bounds.min, bounds.max); } } } return geometry; } // function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { layoutVertexArray.emplaceBack( (x * 2) + ((extrudeX + 1) / 2), (y * 2) + ((extrudeY + 1) / 2)); } /** * Circles are represented by two triangles. * * Each corner has a pos that is the center of the circle and an extrusion * vector that is where it points. * @private */ var CircleBucket = function CircleBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.layoutVertexArray = new StructArrayLayout2i4(); this.indexArray = new StructArrayLayout3ui6(); this.segments = new SegmentVector(); this.programConfigurations = new ProgramConfigurationSet(members, options.layers, options.zoom); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; CircleBucket.prototype.populate = function populate (features , options ) { var styleLayer = this.layers[0]; var bucketFeatures = []; var 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 (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (this.layers[0]._featureFilter(new EvaluationParameters(this.zoom), feature)) { var geometry = loadGeometry(feature); var sortKey = circleSortKey ? circleSortKey.evaluate(feature, {}) : undefined; var bucketFeature = { id: feature.id, properties: feature.properties, type: feature.type, sourceLayerIndex: sourceLayerIndex, index: index, geometry: geometry, patterns: {}, sortKey: sortKey }; bucketFeatures.push(bucketFeature); } } if (circleSortKey) { bucketFeatures.sort(function (a, b) { // a.sortKey is always a number when in use return ((a.sortKey ) ) - ((b.sortKey ) ); }); } for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) { var bucketFeature$1 = list$1[i$1]; var ref$1 = bucketFeature$1; var geometry$1 = ref$1.geometry; var index$1 = ref$1.index; var sourceLayerIndex$1 = ref$1.sourceLayerIndex; var feature$1 = features[index$1].feature; this.addFeature(bucketFeature$1, geometry$1, index$1); options.featureIndex.insert(feature$1, geometry$1, index$1, sourceLayerIndex$1, this.index); } }; CircleBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; CircleBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; CircleBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; CircleBucket.prototype.upload = function 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; }; CircleBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; CircleBucket.prototype.addFeature = function addFeature (feature , geometry , index ) { for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var ring = list$1[i$1]; for (var i = 0, list = ring; i < list.length; i += 1) { var point = list[i]; var x = point.x; var y = point.y; // Do not include points that are outside the tile boundaries. if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) { continue; } // this geometry will be of the Point type, and we'll derive // two triangles from it. // // ┌─────────┐ // │ 3 2 │ // │ │ // │ 0 1 │ // └─────────┘ var segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey); var index$1 = segment.vertexLength; 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); this.indexArray.emplaceBack(index$1, index$1 + 1, index$1 + 2); this.indexArray.emplaceBack(index$1, index$1 + 3, index$1 + 2); segment.vertexLength += 4; segment.primitiveLength += 2; } } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}); }; register('CircleBucket', CircleBucket, {omit: ['layers']}); // function polygonIntersectsPolygon(polygonA , polygonB ) { for (var i = 0; i < polygonA.length; i++) { if (polygonContainsPoint(polygonB, polygonA[i])) { return true; } } for (var i$1 = 0; i$1 < polygonB.length; i$1++) { if (polygonContainsPoint(polygonA, polygonB[i$1])) { return true; } } if (lineIntersectsLine(polygonA, polygonB)) { return true; } return false; } function polygonIntersectsBufferedPoint(polygon , point , radius ) { if (polygonContainsPoint(polygon, point)) { return true; } if (pointIntersectsBufferedLine(point, polygon, radius)) { return true; } return false; } function polygonIntersectsMultiPolygon(polygon , multiPolygon ) { if (polygon.length === 1) { return multiPolygonContainsPoint(multiPolygon, polygon[0]); } for (var m = 0; m < multiPolygon.length; m++) { var ring = multiPolygon[m]; for (var n = 0; n < ring.length; n++) { if (polygonContainsPoint(polygon, ring[n])) { return true; } } } for (var i = 0; i < polygon.length; i++) { if (multiPolygonContainsPoint(multiPolygon, polygon[i])) { return true; } } for (var k = 0; k < multiPolygon.length; k++) { if (lineIntersectsLine(polygon, multiPolygon[k])) { return true; } } return false; } function polygonIntersectsBufferedMultiLine(polygon , multiLine , radius ) { for (var i = 0; i < multiLine.length; i++) { var line = multiLine[i]; if (polygon.length >= 3) { for (var k = 0; k < line.length; k++) { if (polygonContainsPoint(polygon, line[k])) { return true; } } } if (lineIntersectsBufferedLine(polygon, line, radius)) { return true; } } return false; } function lineIntersectsBufferedLine(lineA , lineB , radius ) { if (lineA.length > 1) { if (lineIntersectsLine(lineA, lineB)) { return true; } // Check whether any point in either line is within radius of the other line for (var j = 0; j < lineB.length; j++) { if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) { return true; } } } for (var k = 0; k < lineA.length; k++) { if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) { return true; } } return false; } function lineIntersectsLine(lineA , lineB ) { if (lineA.length === 0 || lineB.length === 0) { return false; } for (var i = 0; i < lineA.length - 1; i++) { var a0 = lineA[i]; var a1 = lineA[i + 1]; for (var j = 0; j < lineB.length - 1; j++) { var b0 = lineB[j]; var b1 = lineB[j + 1]; if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) { return true; } } } return false; } function lineSegmentIntersectsLineSegment(a0 , a1 , b0 , b1 ) { return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) && isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1); } function pointIntersectsBufferedLine(p , line , radius ) { var radiusSquared = radius * radius; if (line.length === 1) { return p.distSqr(line[0]) < radiusSquared; } for (var i = 1; i < line.length; i++) { // Find line segments that have a distance <= radius^2 to p // In that case, we treat the line as "containing point p". var v = line[i - 1], w = line[i]; if (distToSegmentSquared(p, v, w) < radiusSquared) { return true; } } return false; } // Code from http://stackoverflow.com/a/1501725/331379. function distToSegmentSquared(p , v , w ) { var l2 = v.distSqr(w); if (l2 === 0) { return p.distSqr(v); } var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; if (t < 0) { return p.distSqr(v); } if (t > 1) { return p.distSqr(w); } return p.distSqr(w.sub(v)._mult(t)._add(v)); } // point in polygon ray casting algorithm function multiPolygonContainsPoint(rings , p ) { var c = false, ring, p1, p2; for (var k = 0; k < rings.length; k++) { ring = rings[k]; for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { p1 = ring[i]; p2 = ring[j]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { c = !c; } } } return c; } function polygonContainsPoint(ring , p ) { var c = false; for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { var p1 = ring[i]; var p2 = ring[j]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { c = !c; } } return c; } function polygonIntersectsBox(ring , boxX1 , boxY1 , boxX2 , boxY2 ) { for (var i$1 = 0, list = ring; i$1 < list.length; i$1 += 1) { var p = list[i$1]; if (boxX1 <= p.x && boxY1 <= p.y && boxX2 >= p.x && boxY2 >= p.y) { return true; } } var corners = [ new pointGeometry(boxX1, boxY1), new pointGeometry(boxX1, boxY2), new pointGeometry(boxX2, boxY2), new pointGeometry(boxX2, boxY1)]; if (ring.length > 2) { for (var i$2 = 0, list$1 = corners; i$2 < list$1.length; i$2 += 1) { var corner = list$1[i$2]; if (polygonContainsPoint(ring, corner)) { return true; } } } for (var i = 0; i < ring.length - 1; i++) { var p1 = ring[i]; var p2 = ring[i + 1]; if (edgeIntersectsBox(p1, p2, corners)) { return true; } } return false; } function edgeIntersectsBox(e1 , e2 , corners ) { var tl = corners[0]; var 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 var 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 ) { var value = ((layer.paint ).get(property) ).value; if (value.kind === 'constant') { return value.value; } else { var binders = bucket.programConfigurations.get(layer.id).binders; return binders[property].maxValue; } } function translateDistance(translate ) { return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]); } function translate(queryGeometry , translate , translateAnchor , bearing , pixelsToTileUnits ) { if (!translate[0] && !translate[1]) { return queryGeometry; } var pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); if (translateAnchor === "viewport") { pt._rotate(-bearing); } var translated = []; for (var i = 0; i < queryGeometry.length; i++) { var point = queryGeometry[i]; translated.push(point.sub(pt)); } return translated; } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$2 = new Properties({ "circle-sort-key": new DataDrivenProperty(spec["layout_circle"]["circle-sort-key"]), }); var paint$1 = 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 = ({ paint: paint$1, layout: layout$2 } ); /** * 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 {Type} 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, b) { return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); } if (!Math.hypot) { Math.hypot = function () { var arguments$1 = arguments; var y = 0, i = arguments.length; while (i--) { y += arguments$1[i] * arguments$1[i]; } return Math.sqrt(y); }; } /** * 2x2 Matrix * @module mat2 */ /** * Creates a new identity mat2 * * @returns {mat2} a new 2x2 matrix */ 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; } /** * Creates a new mat2 initialized with values from an existing matrix * * @param {mat2} a matrix to clone * @returns {mat2} a new 2x2 matrix */ function clone$1(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 {mat2} a the source matrix * @returns {mat2} out */ function copy(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(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(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(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 * * @param {mat2} out the receiving matrix * @param {mat2} a the source matrix * @returns {mat2} out */ 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; } /** * Inverts a mat2 * * @param {mat2} out the receiving matrix * @param {mat2} 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 * * @param {mat2} out the receiving matrix * @param {mat2} a the source matrix * @returns {mat2} out */ 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; } /** * Calculates the determinant of a mat2 * * @param {mat2} 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 * * @param {mat2} out the receiving matrix * @param {mat2} a the first operand * @param {mat2} b the second operand * @returns {mat2} out */ 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; } /** * Rotates a mat2 by the given angle * * @param {mat2} out the receiving matrix * @param {mat2} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat2} out */ 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; } /** * Scales the mat2 by the dimensions in the given vec2 * * @param {mat2} out the receiving matrix * @param {mat2} a the matrix to rotate * @param {vec2} 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); * * @param {mat2} out mat2 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat2} out */ 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; } /** * 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 {vec2} v Scaling vector * @returns {mat2} out */ function fromScaling(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 {mat2} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str(a) { return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; } /** * Returns Frobenius norm of a mat2 * * @param {mat2} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob(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 {mat2} L the lower triangular matrix * @param {mat2} D the diagonal matrix * @param {mat2} U the upper triangular matrix * @param {mat2} 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 {mat2} a the first operand * @param {mat2} b the second operand * @returns {mat2} out */ 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; } /** * Subtracts matrix b from matrix a * * @param {mat2} out the receiving matrix * @param {mat2} a the first operand * @param {mat2} 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; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {mat2} a The first matrix. * @param {mat2} 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]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat2} a The first matrix. * @param {mat2} 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)); } /** * Multiply each element of the matrix by a scalar. * * @param {mat2} out the receiving matrix * @param {mat2} 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; } /** * Adds two mat2's after multiplying each element of the second operand by a scalar value. * * @param {mat2} out the receiving vector * @param {mat2} a the first operand * @param {mat2} 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; } /** * Alias for {@link mat2.multiply} * @function */ var mul = multiply; /** * Alias for {@link mat2.subtract} * @function */ var sub = subtract; /** * 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); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[4] = 0; out[5] = 0; } out[0] = 1; out[3] = 1; return out; } /** * Creates a new mat2d initialized with values from an existing matrix * * @param {mat2d} a matrix to clone * @returns {mat2d} a new 2x3 matrix */ function clone$2(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 {mat2d} a the source matrix * @returns {mat2d} out */ 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 */ 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 */ 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 */ 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 {mat2d} a the source matrix * @returns {mat2d} out */ 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; if (!det) { return null; } 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 {mat2d} a the source matrix * @returns {Number} determinant of a */ function determinant$1(a) { return a[0] * a[3] - a[1] * a[2]; } /** * Multiplies two mat2d's * * @param {mat2d} out the receiving matrix * @param {mat2d} a the first operand * @param {mat2d} b the second operand * @returns {mat2d} out */ 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 {mat2d} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat2d} out */ 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; } /** * Scales the mat2d by the dimensions in the given vec2 * * @param {mat2d} out the receiving matrix * @param {mat2d} a the matrix to translate * @param {vec2} 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 {mat2d} a the matrix to translate * @param {vec2} v the vec2 to translate the matrix by * @returns {mat2d} out **/ function translate$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; 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$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 {vec2} v Scaling vector * @returns {mat2d} out */ 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 {vec2} v Translation vector * @returns {mat2d} out */ 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 {mat2d} a matrix to represent as a string * @returns {String} string representation of the matrix */ 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 {mat2d} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ 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 {mat2d} a the first operand * @param {mat2d} b the second operand * @returns {mat2d} out */ 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 {mat2d} a the first operand * @param {mat2d} b the second operand * @returns {mat2d} out */ 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 {mat2d} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat2d} out */ 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 {mat2d} a the first operand * @param {mat2d} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat2d} out */ 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 {mat2d} a The first matrix. * @param {mat2d} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ 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 {mat2d} a The first matrix. * @param {mat2d} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ 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 */ var mul$1 = multiply$1; /** * Alias for {@link mat2d.subtract} * @function */ var sub$1 = subtract$1; /** * 3x3 Matrix * @module mat3 */ /** * Creates a new identity mat3 * * @returns {mat3} a new 3x3 matrix */ 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; } 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 {mat4} a the source 4x4 matrix * @returns {mat3} out */ 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 {mat3} a matrix to clone * @returns {mat3} a new 3x3 matrix */ function clone$3(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 {mat3} a the source matrix * @returns {mat3} out */ 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 */ 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 */ 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; } /** * 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 {mat3} 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; } /** * Inverts a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} 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 var det = a00 * b01 + a01 * b11 + a02 * b21; 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 {mat3} 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; } /** * Calculates the determinant of a mat3 * * @param {mat3} a the source matrix * @returns {Number} determinant of a */ 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); } /** * Multiplies two mat3's * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} 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 {mat3} a the matrix to translate * @param {vec2} 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; } /** * Rotates a mat3 by the given angle * * @param {mat3} out the receiving matrix * @param {mat3} 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 {mat3} a the matrix to rotate * @param {vec2} 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 {vec2} v Translation vector * @returns {mat3} out */ 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 {vec2} v Scaling vector * @returns {mat3} out */ 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 {mat2d} a the matrix to copy * @returns {mat3} out **/ 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; } /** * Calculates a 3x3 matrix from the given quaternion * * @param {mat3} out mat3 receiving operation result * @param {quat} 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 {mat4} a Mat4 to derive the normal matrix from * * @returns {mat3} out */ 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 {mat3} 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 {mat3} 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], a[6], a[7], a[8]); } /** * Adds two mat3's * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ 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 {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ 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 {mat3} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat3} 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; 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 {mat3} a the first operand * @param {mat3} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat3} 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; 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 {mat3} a The first matrix. * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ 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 {mat3} a The first matrix. * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ 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 */ var mul$2 = multiply$2; /** * Alias for {@link mat3.subtract} * @function */ var sub$2 = subtract$2; /** * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. * @module mat4 */ /** * Creates a new identity mat4 * * @returns {mat4} a new 4x4 matrix */ function create$3() { var out = new ARRAY_TYPE(16); 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; } 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 {mat4} a matrix to clone * @returns {mat4} a new 4x4 matrix */ function clone$4(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; } /** * Copy the values from one mat4 to another * * @param {mat4} out the receiving matrix * @param {mat4} 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; } /** * 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; } /** * 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; } /** * 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; } /** * Transpose the values of a mat4 * * @param {mat4} out the receiving matrix * @param {mat4} 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]; } return out; } /** * Inverts a mat4 * * @param {mat4} out the receiving matrix * @param {mat4} 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 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] = (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 {mat4} a the source matrix * @returns {mat4} out */ 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; } /** * Calculates the determinant of a mat4 * * @param {mat4} 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 {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ 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 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 {mat4} a the matrix to translate * @param {vec3} v vector to translate by * @returns {mat4} out */ function translate$3(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; if (a === out) { out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; } else { a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; out[12] = a00 * x + a10 * y + a20 * z + a[12]; out[13] = a01 * x + a11 * y + a21 * z + a[13]; out[14] = a02 * x + a12 * y + a22 * z + a[14]; out[15] = a03 * x + a13 * y + a23 * z + a[15]; } return out; } /** * Scales the mat4 by the dimensions in the given vec3 not using vectorization * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to scale * @param {vec3} v the vec3 to scale the matrix by * @returns {mat4} out **/ 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 {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @param {vec3} axis the axis to rotate around * @returns {mat4} out */ 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; } 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 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 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; 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]; } return out; } /** * Rotates a matrix by the given angle around the X axis * * @param {mat4} out the receiving matrix * @param {mat4} 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]; 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 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 {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ 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]; 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 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; } /** * Rotates a matrix by the given angle around the Z axis * * @param {mat4} out the receiving matrix * @param {mat4} 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]; 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 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 {vec3} v Translation vector * @returns {mat4} out */ 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 {vec3} v Scaling vector * @returns {mat4} out */ 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; } /** * 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 {vec3} 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; if (len < EPSILON) { return null; } 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; } /** * 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 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; } /** * 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 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; } /** * 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 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; } /** * 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 {vec3} 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; } /** * Creates a new mat4 from a dual quat. * * @param {mat4} out Matrix * @param {quat2} 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 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; } fromRotationTranslation(out, a, translation); return out; } /** * 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 {mat4} 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; } /** * 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 {mat4} 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; } /** * 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 {mat4} 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; 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; } 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 {vec3} v Translation vector * @param {vec3} s Scaling vector * @returns {mat4} out */ 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; } /** * 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 {vec3} v Translation vector * @param {vec3} s Scaling vector * @param {vec3} 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; } /** * Calculates a 4x4 matrix from the given quaternion * * @param {mat4} out mat4 receiving operation result * @param {quat} 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; } /** * 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; } /** * 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; 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; } /** * 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; } /** * 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 */ 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; } /** * 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 {vec3} eye Position of the viewer * @param {vec3} center Point the viewer is looking at * @param {vec3} 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); if (!len) { x0 = 0; x1 = 0; x2 = 0; } else { len = 1 / len; x0 *= len; x1 *= len; x2 *= len; } y0 = z1 * x2 - z2 * x1; y1 = z2 * x0 - z0 * x2; y2 = z0 * x1 - z1 * x0; len = Math.hypot(y0, y1, y2); if (!len) { y0 = 0; y1 = 0; y2 = 0; } else { len = 1 / len; y0 *= len; y1 *= len; y2 *= len; } 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 {vec3} eye Position of the viewer * @param {vec3} center Point the viewer is looking at * @param {vec3} up vec3 pointing up * @returns {mat4} out */ 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; if (len > 0) { len = 1 / Math.sqrt(len); z0 *= len; z1 *= len; z2 *= len; } var x0 = upy * z2 - upz * z1, x1 = upz * z0 - upx * z2, x2 = upx * z1 - upy * z0; len = x0 * x0 + x1 * x1 + x2 * x2; if (len > 0) { len = 1 / Math.sqrt(len); x0 *= len; x1 *= len; x2 *= len; } 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 {mat4} a matrix to represent as a string * @returns {String} string representation of the matrix */ 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 {mat4} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob$3(a) { return Math.hypot(a[0], a[1], 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 {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ 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 {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ 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 {mat4} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat4} out */ 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 {mat4} a the first operand * @param {mat4} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat4} out */ 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 {mat4} a The first matrix. * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ 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]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat4} a The first matrix. * @param {mat4} 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 */ var mul$3 = multiply$3; /** * Alias for {@link mat4.subtract} * @function */ var sub$3 = subtract$3; /** * 3 Dimensional Vector * @module vec3 */ /** * Creates a new, empty vec3 * * @returns {vec3} a new 3D vector */ function create$4() { var out = new ARRAY_TYPE(3); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } return out; } /** * Creates a new vec3 initialized with values from an existing vector * * @param {vec3} a vector to clone * @returns {vec3} a new 3D vector */ function clone$5(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 {vec3} a vector to calculate length of * @returns {Number} length of a */ function length(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 */ 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 {vec3} 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 */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} 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]; return out; } /** * Multiplies two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ 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 {vec3} a vector to ceil * @returns {vec3} out */ 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 {vec3} a vector to floor * @returns {vec3} out */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ 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 {vec3} 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 {vec3} 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; } /** * Adds two vec3's after scaling the second operand by a scalar value * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} 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; } /** * Calculates the euclidian distance between two vec3's * * @param {vec3} a the first operand * @param {vec3} 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 {vec3} a the first operand * @param {vec3} b the second operand * @returns {Number} squared distance between a and b */ 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; } /** * Calculates the squared length of a vec3 * * @param {vec3} 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 {vec3} 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 {vec3} a vector to invert * @returns {vec3} out */ function inverse(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 {vec3} a vector to normalize * @returns {vec3} out */ function normalize(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var len = x * x + y * y + z * z; 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; out[2] = a[2] * len; return out; } /** * Calculates the dot product of two vec3's * * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {Number} dot product of a and b */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @param {vec3} c the third operand * @param {vec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ 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 {vec3} a the first operand * @param {vec3} b the second operand * @param {vec3} c the third operand * @param {vec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function bezier$1(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 */ 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 {vec3} a the vector to transform * @param {mat4} 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 {vec3} a the vector to transform * @param {mat3} 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 {vec3} a the vector to transform * @param {quat} q quaternion to transform with * @returns {vec3} out */ 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); var uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); var uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); var w2 = qw * 2; uvx *= w2; uvy *= w2; uvz *= w2; // vec3.scale(uuv, uuv, 2); 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 {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateX$1(out, a, b, c) { 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 r[0] = p[0]; r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c); r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c); //translate to correct position 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 {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateY$1(out, a, b, c) { 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 r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c); r[1] = p[1]; r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c); //translate to correct position 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 {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateZ$1(out, a, b, c) { 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 r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c); r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c); r[2] = p[2]; //translate to correct position 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 {vec3} a The first operand * @param {vec3} b The second operand * @returns {Number} The angle in radians */ function angle(a, b) { var tempA = fromValues$4(a[0], a[1], a[2]); var tempB = fromValues$4(b[0], b[1], b[2]); normalize(tempA, tempA); normalize(tempB, tempB); var cosine = dot(tempA, tempB); if (cosine > 1.0) { return 0; } else if (cosine < -1.0) { return Math.PI; } else { return Math.acos(cosine); } } /** * 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; } /** * Returns a string representation of a vector * * @param {vec3} 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 {vec3} a The first vector. * @param {vec3} 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 {vec3} a The first vector. * @param {vec3} 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 */ var sub$4 = subtract$4; /** * Alias for {@link vec3.multiply} * @function */ var mul$4 = multiply$4; /** * Alias for {@link vec3.divide} * @function */ var div = divide; /** * Alias for {@link vec3.distance} * @function */ 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; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } 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]; } return a; }; }(); /** * 4 Dimensional Vector * @module vec4 */ /** * Creates a new, empty vec4 * * @returns {vec4} a new 4D vector */ 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; } /** * Creates a new vec4 initialized with values from an existing vector * * @param {vec4} a vector to clone * @returns {vec4} a new 4D vector */ function clone$6(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$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 {vec4} 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; } /** * 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 {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} out */ 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 {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} 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]; return out; } /** * Multiplies two vec4's * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} 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; } /** * Divides two vec4's * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} 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; } /** * Math.ceil the components of a vec4 * * @param {vec4} out the receiving vector * @param {vec4} 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; } /** * Math.floor the components of a vec4 * * @param {vec4} out the receiving vector * @param {vec4} 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 {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} out */ 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 {vec4} a the first operand * @param {vec4} 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 {vec4} a vector to round * @returns {vec4} out */ 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 {vec4} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec4} out */ 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 {vec4} a the first operand * @param {vec4} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec4} out */ 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 {vec4} a the first operand * @param {vec4} b the second operand * @returns {Number} distance between a and b */ 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 {vec4} a the first operand * @param {vec4} b the second operand * @returns {Number} squared distance between a and b */ 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 {vec4} 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 {vec4} a vector to calculate squared length of * @returns {Number} squared length of a */ 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 {vec4} 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 * * @param {vec4} out the receiving vector * @param {vec4} a vector to invert * @returns {vec4} out */ 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 {vec4} a vector to normalize * @returns {vec4} out */ 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); } 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 {vec4} a the first operand * @param {vec4} b the second operand * @returns {Number} dot product of a and b */ 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 {vec4} result the receiving vector * @param {vec4} U the first vector * @param {vec4} V the second vector * @param {vec4} 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 {vec4} a the first operand * @param {vec4} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec4} out */ 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; } /** * 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; 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 {vec4} a the vector to transform * @param {mat4} 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 {vec4} a the vector to transform * @param {quat} 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 {vec4} a vector to represent as a string * @returns {String} string representation of the vector */ 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 {vec4} a The first vector. * @param {vec4} b The second vector. * @returns {Boolean} True if the vectors 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]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {vec4} a The first vector. * @param {vec4} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ 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)); } /** * 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 */ var div$1 = divide$1; /** * Alias for {@link vec4.distance} * @function */ var dist$1 = distance$1; /** * Alias for {@link vec4.squaredDistance} * @function */ var sqrDist$1 = squaredDistance$1; /** * Alias for {@link vec4.length} * @function */ var len$1 = length$1; /** * Alias for {@link vec4.squaredLength} * @function */ 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 */ var forEach$1 = function () { var vec = create$5(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 4; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } 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]; } return a; }; }(); /** * Quaternion * @module quat */ /** * 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; } out[3] = 1; return out; } /** * 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 {vec3} 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; } /** * 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 {quat} 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); 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; } return rad; } /** * Gets the angular distance between two unit quaternions * * @param {quat} a Origin unit quaternion * @param {quat} 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); } /** * Multiplies two quat's * * @param {quat} out the receiving quaternion * @param {quat} a the first operand * @param {quat} 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 {quat} 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 {quat} 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 {quat} a quat to rotate * @param {number} rad angle (in radians) to rotate * @returns {quat} out */ 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 {quat} a quat to calculate W component of * @returns {quat} out */ 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 {quat} a quat to calculate the exponential of * @returns {quat} out */ 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 {quat} a quat to calculate the exponential of * @returns {quat} out */ 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 {quat} a quat to calculate the exponential of * @param {Number} b amount to scale the quaternion by * @returns {quat} out */ 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 {quat} a the first operand * @param {quat} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat} out */ 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 cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary) if (cosom < 0.0) { cosom = -cosom; bx = -bx; by = -by; bz = -bz; bw = -bw; } // calculate coefficients 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 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 */ 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; } /** * Calculates the inverse of a quat * * @param {quat} out the receiving quaternion * @param {quat} 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 {quat} 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 {mat3} m rotation matrix * @returns {quat} out * @function */ 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; if (fTrace > 0.0) { // |w| > 1/2, may as well choose w > 1/2 fRoot = Math.sqrt(fTrace + 1.0); // 2w out[3] = 0.5 * fRoot; fRoot = 0.5 / fRoot; // 1/(4w) 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; } 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 */ 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 {quat} a vector to represent as a string * @returns {String} string representation of the vector */ 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 {quat} a quaternion to clone * @returns {quat} a new quaternion * @function */ var clone$7 = clone$6; /** * 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 */ var fromValues$6 = fromValues$5; /** * Copy the values from one quat to another * * @param {quat} out the receiving quaternion * @param {quat} a the source quaternion * @returns {quat} out * @function */ 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 */ var set$6 = set$5; /** * Adds two quat's * * @param {quat} out the receiving quaternion * @param {quat} a the first operand * @param {quat} b the second operand * @returns {quat} out * @function */ var add$6 = add$5; /** * Alias for {@link quat.multiply} * @function */ var mul$6 = multiply$6; /** * Scales a quat by a scalar number * * @param {quat} out the receiving vector * @param {quat} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {quat} out * @function */ var scale$6 = scale$5; /** * Calculates the dot product of two quat's * * @param {quat} a the first operand * @param {quat} b the second operand * @returns {Number} dot product of a and b * @function */ var dot$2 = dot$1; /** * Performs a linear interpolation between two quat's * * @param {quat} out the receiving quaternion * @param {quat} a the first operand * @param {quat} 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 {quat} 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 {quat} a vector to calculate squared length of * @returns {Number} squared length of a * @function */ var squaredLength$2 = squaredLength$1; /** * Alias for {@link quat.squaredLength} * @function */ var sqrLen$2 = squaredLength$2; /** * Normalize a quat * * @param {quat} out the receiving quaternion * @param {quat} a quaternion to normalize * @returns {quat} out * @function */ var normalize$2 = normalize$1; /** * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===) * * @param {quat} a The first quaternion. * @param {quat} b The second quaternion. * @returns {Boolean} True if the vectors are equal, false otherwise. */ var exactEquals$6 = exactEquals$5; /** * Returns whether or not the quaternions have approximately the same elements in the same position. * * @param {quat} a The first vector. * @param {quat} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ 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 {vec3} a the initial vector * @param {vec3} b the destination vector * @returns {quat} out */ 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); 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 {quat} a the first operand * @param {quat} b the second operand * @param {quat} c the third operand * @param {quat} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat} out */ 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 {vec3} view the vector representing the viewing direction * @param {vec3} right the vector representing the local "right" direction * @param {vec3} up the vector representing the local "up" direction * @returns {quat} out */ 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)); }; }(); /** * 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 */ /** * Creates a new identity dual quat * * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation] */ function create$7() { var dq = new ARRAY_TYPE(8); 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; } dq[3] = 1; return dq; } /** * Creates a new quat initialized with values from an existing quaternion * * @param {quat2} a dual quaternion to clone * @returns {quat2} new dual quaternion * @function */ function clone$8(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 */ 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; } /** * 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 {quat2} dual quaternion receiving operation result * @param {quat} q a normalized quaternion * @param {vec3} 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 {quat2} dual quaternion receiving operation result * @param {vec3} 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 {quat2} dual quaternion receiving operation result * @param {quat} q the quaternion * @returns {quat2} dual quaternion receiving operation result * @function */ 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 {mat4} a the matrix * @returns {quat2} dual quat receiving operation result * @function */ 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 {quat2} a the source dual quaternion * @returns {quat2} out * @function */ 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 */ 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 */ 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 {quat2} a Dual Quaternion * @return {quat} real part */ var getReal = copy$6; /** * Gets the dual part of a dual quat * @param {quat} out dual part * @param {quat2} 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; } /** * Set the real component of a dual quat to the given quaternion * * @param {quat2} out the receiving quaternion * @param {quat} q a quaternion representing the real part * @returns {quat2} out * @function */ var setReal = copy$6; /** * Set the dual component of a dual quat to the given quaternion * * @param {quat2} out the receiving quaternion * @param {quat} q a quaternion representing the dual part * @returns {quat2} out * @function */ 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 {quat2} a Dual Quaternion to be decomposed * @return {vec3} translation */ 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; } /** * Translates a dual quat by the given vector * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the dual quaternion to translate * @param {vec3} v vector to translate by * @returns {quat2} out */ function translate$4(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 {quat2} 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 {quat2} 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 {quat2} a the dual quaternion to rotate * @param {number} rad how far should the rotation be * @returns {quat2} out */ 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) * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the dual quaternion to rotate * @param {quat} q quaternion to rotate by * @returns {quat2} out */ 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 {quat} q quaternion to rotate by * @param {quat2} a the dual quaternion to rotate * @returns {quat2} out */ 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 {quat2} a the dual quaternion to rotate * @param {vec3} axis the axis to rotate around * @param {Number} rad how far the rotation should be * @returns {quat2} out */ function rotateAroundAxis(out, a, axis, rad) { //Special case for rad = 0 if (Math.abs(rad) < EPSILON) { return copy$7(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 {quat2} a the first operand * @param {quat2} b the second operand * @returns {quat2} out * @function */ 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 {quat2} a the first operand * @param {quat2} b the second operand * @returns {quat2} out */ 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 */ var mul$7 = multiply$7; /** * Scales a dual quat by a scalar number * * @param {quat2} out the receiving dual quat * @param {quat2} a the dual quat to scale * @param {Number} b amount to scale the dual quat by * @returns {quat2} out * @function */ 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 {quat2} a the first operand * @param {quat2} b the second operand * @returns {Number} dot product of a and b * @function */ 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 {quat2} a the first operand * @param {quat2} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat2} out */ 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 {quat2} a dual quat to calculate inverse of * @returns {quat2} out */ 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 {quat2} a quat to calculate conjugate of * @returns {quat2} out */ 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; } /** * Calculates the length of a dual quat * * @param {quat2} 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 {quat2} 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 */ var sqrLen$3 = squaredLength$3; /** * Normalize a dual quat * * @param {quat2} out the receiving dual quaternion * @param {quat2} a dual quaternion to normalize * @returns {quat2} out * @function */ 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; } return out; } /** * Returns a string representation of a dual quatenion * * @param {quat2} a dual quaternion to represent as a string * @returns {String} string representation of the dual quat */ 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 {quat2} a the first dual quaternion. * @param {quat2} b the second dual quaternion. * @returns {Boolean} true if the dual quaternions 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] && 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 {quat2} a the first dual quat. * @param {quat2} b the second dual quat. * @returns {Boolean} true if the dual quats are equal, false otherwise. */ 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)); } /** * 2 Dimensional Vector * @module vec2 */ /** * Creates a new, empty vec2 * * @returns {vec2} a new 2D vector */ function create$8() { var out = new ARRAY_TYPE(2); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; } return out; } /** * Creates a new vec2 initialized with values from an existing vector * * @param {vec2} a vector to clone * @returns {vec2} a new 2D vector */ function clone$9(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 */ 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 {vec2} a the source vector * @returns {vec2} out */ function copy$8(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$8(out, x, y) { out[0] = x; out[1] = y; return out; } /** * Adds two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} 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 {vec2} a the first operand * @param {vec2} 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 {vec2} a the first operand * @param {vec2} 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 {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ 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 {vec2} 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 {vec2} a vector to floor * @returns {vec2} out */ 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 {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ 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 {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ 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 {vec2} a vector to round * @returns {vec2} out */ 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 {vec2} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec2} out */ 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 {vec2} a the first operand * @param {vec2} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec2} out */ 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 {vec2} a the first operand * @param {vec2} b the second operand * @returns {Number} distance between a and b */ 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 {vec2} a the first operand * @param {vec2} b the second operand * @returns {Number} squared distance between a and b */ 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 {vec2} a vector to calculate length of * @returns {Number} length of a */ function length$4(a) { var x = a[0], y = a[1]; return Math.hypot(x, y); } /** * Calculates the squared length of a vec2 * * @param {vec2} a vector to calculate squared length of * @returns {Number} squared length of a */ 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 {vec2} a vector to negate * @returns {vec2} out */ function negate$2(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 {vec2} 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; } /** * Normalize a vec2 * * @param {vec2} out the receiving vector * @param {vec2} 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; } /** * Calculates the dot product of two vec2's * * @param {vec2} a the first operand * @param {vec2} 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]; } /** * 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 {vec2} a the first operand * @param {vec2} 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; } /** * Performs a linear interpolation between two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} 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; } /** * 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; } /** * Transforms the vec2 with a mat2 * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat2} 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; } /** * Transforms the vec2 with a mat2d * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat2d} 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; } /** * Transforms the vec2 with a mat3 * 3rd vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat3} 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; } /** * 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 {vec2} a the vector to transform * @param {mat4} 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; } /** * Rotate a 2D vector * @param {vec2} out The receiving vec2 * @param {vec2} a The vec2 point to rotate * @param {vec2} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec2} out */ function rotate$4(out, a, b, c) { //Translate point to the origin var p0 = a[0] - b[0], p1 = a[1] - b[1], sinC = Math.sin(c), cosC = Math.cos(c); //perform rotation and translate to correct position 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 {vec2} a The first operand * @param {vec2} 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]; var len1 = x1 * x1 + y1 * y1; if (len1 > 0) { //TODO: evaluate use of glm_invsqrt here? len1 = 1 / Math.sqrt(len1); } var len2 = x2 * x2 + y2 * y2; if (len2 > 0) { //TODO: evaluate use of glm_invsqrt here? len2 = 1 / Math.sqrt(len2); } var cosine = (x1 * x2 + y1 * y2) * len1 * len2; if (cosine > 1.0) { return 0; } else if (cosine < -1.0) { return Math.PI; } else { return Math.acos(cosine); } } /** * 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; } /** * Returns a string representation of a vector * * @param {vec2} a vector to represent as a string * @returns {String} string representation of the vector */ function str$8(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 {vec2} a The first vector. * @param {vec2} 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]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {vec2} a The first vector. * @param {vec2} 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)); } /** * Alias for {@link vec2.length} * @function */ var len$4 = length$4; /** * Alias for {@link vec2.subtract} * @function */ var sub$6 = subtract$6; /** * Alias for {@link vec2.multiply} * @function */ var mul$8 = multiply$8; /** * Alias for {@link vec2.divide} * @function */ var div$2 = divide$2; /** * Alias for {@link vec2.distance} * @function */ var dist$2 = distance$2; /** * Alias for {@link vec2.squaredDistance} * @function */ var sqrDist$2 = squaredDistance$2; /** * Alias for {@link vec2.squaredLength} * @function */ 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 */ var forEach$2 = function () { var vec = create$8(); 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; } 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; }; }(); // var CircleStyleLayer = /*@__PURE__*/(function (StyleLayer) { function CircleStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) CircleStyleLayer.__proto__ = StyleLayer; CircleStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); CircleStyleLayer.prototype.constructor = CircleStyleLayer; CircleStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new CircleBucket(parameters); }; CircleStyleLayer.prototype.queryRadius = function queryRadius (bucket ) { var circleBucket = (bucket ); return getMaximumPaintValue('circle-radius', this, circleBucket) + getMaximumPaintValue('circle-stroke-width', this, circleBucket) + translateDistance(this.paint.get('circle-translate')); }; CircleStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits , pixelPosMatrix ) { var translatedPolygon = translate(queryGeometry, this.paint.get('circle-translate'), this.paint.get('circle-translate-anchor'), transform.angle, pixelsToTileUnits); var radius = this.paint.get('circle-radius').evaluate(feature, featureState); var stroke = this.paint.get('circle-stroke-width').evaluate(feature, featureState); var size = radius + stroke; // For pitch-alignment: map, compare feature geometry to query geometry in the plane of the tile // // Otherwise, compare geometry in the plane of the viewport // // A circle with fixed scaling relative to the viewport gets larger in tile space as it moves into the distance // // A circle with fixed scaling relative to the map gets smaller in viewport space as it moves into the distance var alignWithMap = this.paint.get('circle-pitch-alignment') === 'map'; var transformedPolygon = alignWithMap ? translatedPolygon : projectQueryGeometry(translatedPolygon, pixelPosMatrix); var transformedSize = alignWithMap ? size * pixelsToTileUnits : size; for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var ring = list$1[i$1]; for (var i = 0, list = ring; i < list.length; i += 1) { var point = list[i]; var transformedPoint = alignWithMap ? point : projectPoint(point, pixelPosMatrix); var adjustedSize = transformedSize; var projectedCenter = transformMat4$1([], [point.x, point.y, 0, 1], pixelPosMatrix); if (this.paint.get('circle-pitch-scale') === 'viewport' && this.paint.get('circle-pitch-alignment') === 'map') { adjustedSize *= projectedCenter[3] / transform.cameraToCenterDistance; } else if (this.paint.get('circle-pitch-scale') === 'map' && this.paint.get('circle-pitch-alignment') === 'viewport') { adjustedSize *= transform.cameraToCenterDistance / projectedCenter[3]; } if (polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, adjustedSize)) { return true; } } } return false; }; return CircleStyleLayer; }(StyleLayer)); function projectPoint(p , pixelPosMatrix ) { var point = transformMat4$1([], [p.x, p.y, 0, 1], pixelPosMatrix); return new pointGeometry(point[0] / point[3], point[1] / point[3]); } function projectQueryGeometry(queryGeometry , pixelPosMatrix ) { return queryGeometry.map(function (p) { return projectPoint(p, pixelPosMatrix); }); } // var HeatmapBucket = /*@__PURE__*/(function (CircleBucket) { function HeatmapBucket () { CircleBucket.apply(this, arguments); }if ( CircleBucket ) HeatmapBucket.__proto__ = CircleBucket; HeatmapBucket.prototype = Object.create( CircleBucket && CircleBucket.prototype ); HeatmapBucket.prototype.constructor = HeatmapBucket; return HeatmapBucket; }(CircleBucket)); register('HeatmapBucket', HeatmapBucket, {omit: ['layers']}); // function createImage(image , ref , channels , data ) { var width = ref.width; var height = ref.height; if (!data) { data = new Uint8Array(width * height * channels); } else if (data instanceof Uint8ClampedArray) { data = new Uint8Array(data.buffer); } else if (data.length !== width * height * channels) { throw new RangeError('mismatched image size'); } image.width = width; image.height = height; image.data = data; return image; } function resizeImage(image , ref , channels ) { var width = ref.width; var height = ref.height; if (width === image.width && height === image.height) { return; } var newImage = createImage({}, {width: width, height: height}, channels); copyImage(image, newImage, {x: 0, y: 0}, {x: 0, y: 0}, { width: Math.min(image.width, width), height: Math.min(image.height, height) }, channels); image.width = width; image.height = height; image.data = newImage.data; } function copyImage(srcImg , dstImg , srcPt , dstPt , size , channels ) { if (size.width === 0 || size.height === 0) { return dstImg; } if (size.width > srcImg.width || size.height > srcImg.height || srcPt.x > srcImg.width - size.width || srcPt.y > srcImg.height - size.height) { throw new RangeError('out of range source coordinates for image copy'); } if (size.width > dstImg.width || size.height > dstImg.height || dstPt.x > dstImg.width - size.width || dstPt.y > dstImg.height - size.height) { throw new RangeError('out of range destination coordinates for image copy'); } var srcData = srcImg.data; var dstData = dstImg.data; assert_1(srcData !== dstData); for (var y = 0; y < size.height; y++) { var srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels; var dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels; for (var i = 0; i < size.width * channels; i++) { dstData[dstOffset + i] = srcData[srcOffset + i]; } } return dstImg; } var AlphaImage = function AlphaImage(size , data ) { createImage(this, size, 1, data); }; AlphaImage.prototype.resize = function resize (size ) { resizeImage(this, size, 1); }; AlphaImage.prototype.clone = function clone () { return new AlphaImage({width: this.width, height: this.height}, new Uint8Array(this.data)); }; AlphaImage.copy = function copy (srcImg , dstImg , srcPt , dstPt , size ) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 1); }; // Not premultiplied, because ImageData is not premultiplied. // UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture. var RGBAImage = function RGBAImage(size , data ) { createImage(this, size, 4, data); }; RGBAImage.prototype.resize = function resize (size ) { resizeImage(this, size, 4); }; RGBAImage.prototype.replace = function replace (data , copy ) { if (copy) { this.data.set(data); } else if (data instanceof Uint8ClampedArray) { this.data = new Uint8Array(data.buffer); } else { this.data = data; } }; RGBAImage.prototype.clone = function clone () { return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data)); }; RGBAImage.copy = function copy (srcImg , dstImg , srcPt , dstPt , size ) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 4); }; register('AlphaImage', AlphaImage); register('RGBAImage', RGBAImage); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$2 = 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"]), "heatmap-color": new ColorRampProperty(spec["paint_heatmap"]["heatmap-color"]), "heatmap-opacity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-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$1 = ({ paint: paint$2 } ); // /** * Given an expression that should evaluate to a color ramp, return * a 256x1 px RGBA image representing that ramp expression. * * @private */ function renderColorRamp(expression , colorRampEvaluationParameter ) { var colorRampData = new Uint8Array(256 * 4); var evaluationGlobals = {}; for (var i = 0, j = 0; i < 256; i++, j += 4) { evaluationGlobals[colorRampEvaluationParameter] = i / 255; var pxColor = expression.evaluate((evaluationGlobals )); // the colors are being unpremultiplied because Color uses // premultiplied values, and the Texture class expects unpremultiplied ones colorRampData[j + 0] = Math.floor(pxColor.r * 255 / pxColor.a); colorRampData[j + 1] = Math.floor(pxColor.g * 255 / pxColor.a); colorRampData[j + 2] = Math.floor(pxColor.b * 255 / pxColor.a); colorRampData[j + 3] = Math.floor(pxColor.a * 255); } return new RGBAImage({width: 256, height: 1}, colorRampData); } // var HeatmapStyleLayer = /*@__PURE__*/(function (StyleLayer) { function HeatmapStyleLayer(layer ) { StyleLayer.call(this, layer, properties$1); // make sure color ramp texture is generated for default heatmap color too this._updateColorRamp(); } if ( StyleLayer ) HeatmapStyleLayer.__proto__ = StyleLayer; HeatmapStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); HeatmapStyleLayer.prototype.constructor = HeatmapStyleLayer; HeatmapStyleLayer.prototype.createBucket = function createBucket (options ) { return new HeatmapBucket(options); }; HeatmapStyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (name ) { if (name === 'heatmap-color') { this._updateColorRamp(); } }; HeatmapStyleLayer.prototype._updateColorRamp = function _updateColorRamp () { var expression = this._transitionablePaint._values['heatmap-color'].value.expression; this.colorRamp = renderColorRamp(expression, 'heatmapDensity'); this.colorRampTexture = null; }; HeatmapStyleLayer.prototype.resize = function resize () { if (this.heatmapFbo) { this.heatmapFbo.destroy(); this.heatmapFbo = null; } }; HeatmapStyleLayer.prototype.queryRadius = function queryRadius () { return 0; }; HeatmapStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature () { return false; }; HeatmapStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none'; }; return HeatmapStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$3 = 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"]), "hillshade-shadow-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-shadow-color"]), "hillshade-highlight-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-highlight-color"]), "hillshade-accent-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-accent-color"]), }); // 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$3 } ); // var HillshadeStyleLayer = /*@__PURE__*/(function (StyleLayer) { function HillshadeStyleLayer(layer ) { StyleLayer.call(this, layer, properties$2); } if ( StyleLayer ) HillshadeStyleLayer.__proto__ = StyleLayer; HillshadeStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); HillshadeStyleLayer.prototype.constructor = HillshadeStyleLayer; HillshadeStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none'; }; return HillshadeStyleLayer; }(StyleLayer)); // var layout$3 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); var members$1 = layout$3.members; var size$1 = layout$3.size; var alignment$1 = layout$3.alignment; 'use strict'; var earcut_1 = earcut; var default_1 = earcut; function earcut(data, holeIndices, dim) { dim = dim || 2; var hasHoles = holeIndices && holeIndices.length, outerLen = hasHoles ? holeIndices[0] * dim : data.length, outerNode = linkedList(data, 0, outerLen, dim, true), triangles = []; if (!outerNode || outerNode.next === outerNode.prev) { return triangles; } var minX, minY, maxX, maxY, x, y, invSize; if (hasHoles) { outerNode = eliminateHoles(data, holeIndices, outerNode, dim); } // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox if (data.length > 80 * dim) { minX = maxX = data[0]; minY = maxY = data[1]; for (var i = dim; i < outerLen; i += dim) { x = data[i]; y = data[i + 1]; if (x < minX) { minX = x; } if (y < minY) { minY = y; } if (x > maxX) { maxX = x; } if (y > maxY) { maxY = y; } } // minX, minY and invSize are later used to transform coords into integers for z-order calculation invSize = Math.max(maxX - minX, maxY - minY); invSize = invSize !== 0 ? 1 / invSize : 0; } earcutLinked(outerNode, triangles, dim, minX, minY, invSize); return triangles; } // create a circular doubly linked list from polygon points in the specified winding order function linkedList(data, start, end, dim, clockwise) { var i, last; if (clockwise === (signedArea(data, start, end, dim) > 0)) { for (i = start; i < end; i += dim) { last = insertNode(i, data[i], data[i + 1], last); } } else { for (i = end - dim; i >= start; i -= dim) { last = insertNode(i, data[i], data[i + 1], last); } } if (last && equals$a(last, last.next)) { removeNode(last); last = last.next; } return last; } // eliminate colinear or duplicate points function filterPoints(start, end) { if (!start) { return start; } if (!end) { end = start; } var p = start, again; do { again = false; if (!p.steiner && (equals$a(p, p.next) || area(p.prev, p, p.next) === 0)) { removeNode(p); p = end = p.prev; if (p === p.next) { break; } again = true; } else { p = p.next; } } while (again || p !== end); return end; } // main ear slicing loop which triangulates a polygon (given as a linked list) function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { if (!ear) { return; } // interlink polygon nodes in z-order if (!pass && invSize) { indexCurve(ear, minX, minY, invSize); } var stop = ear, prev, next; // iterate through ears, slicing them one by one while (ear.prev !== ear.next) { prev = ear.prev; next = ear.next; if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { // cut off the triangle triangles.push(prev.i / dim); triangles.push(ear.i / dim); triangles.push(next.i / dim); removeNode(ear); // skipping the next vertex leads to less sliver triangles ear = next.next; stop = next.next; continue; } ear = next; // if we looped through the whole remaining polygon and can't find any more ears if (ear === stop) { // try filtering points and slicing again if (!pass) { earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); // if this didn't work, try curing all small self-intersections locally } else if (pass === 1) { ear = cureLocalIntersections(filterPoints(ear), triangles, dim); earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); // as a last resort, try splitting the remaining polygon into two } else if (pass === 2) { splitEarcut(ear, triangles, dim, minX, minY, invSize); } break; } } } // check whether a polygon node forms a valid ear with adjacent nodes function isEar(ear) { var a = ear.prev, b = ear, c = ear.next; if (area(a, b, c) >= 0) { return false; } // reflex, can't be an ear // now make sure we don't have other points inside the potential ear var p = ear.next.next; while (p !== ear.prev) { if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) { return false; } p = p.next; } return true; } function isEarHashed(ear, minX, minY, invSize) { var a = ear.prev, b = ear, c = ear.next; if (area(a, b, c) >= 0) { return false; } // reflex, can't be an ear // triangle bbox; min & max are calculated like this for speed var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); // z-order range for the current triangle bbox; var minZ = zOrder(minTX, minTY, minX, minY, invSize), maxZ = zOrder(maxTX, maxTY, minX, minY, invSize); var p = ear.prevZ, n = ear.nextZ; // look for points inside the triangle in both directions while (p && p.z >= minZ && n && n.z <= maxZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) { return false; } p = p.prevZ; if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) { return false; } n = n.nextZ; } // look for remaining points in decreasing z-order while (p && p.z >= minZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) { return false; } p = p.prevZ; } // look for remaining points in increasing z-order while (n && n.z <= maxZ) { if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) { return false; } n = n.nextZ; } return true; } // go through all polygon nodes and cure small local self-intersections function cureLocalIntersections(start, triangles, dim) { var p = start; do { var a = p.prev, b = p.next.next; if (!equals$a(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { triangles.push(a.i / dim); triangles.push(p.i / dim); triangles.push(b.i / dim); // remove two nodes involved removeNode(p); removeNode(p.next); p = start = b; } p = p.next; } while (p !== start); return filterPoints(p); } // try splitting polygon into two and triangulate them independently function splitEarcut(start, triangles, dim, minX, minY, invSize) { // look for a valid diagonal that divides the polygon into two var a = start; do { var b = a.next.next; while (b !== a.prev) { if (a.i !== b.i && isValidDiagonal(a, b)) { // split the polygon in two by the diagonal var c = splitPolygon(a, b); // filter colinear points around the cuts a = filterPoints(a, a.next); c = filterPoints(c, c.next); // run earcut on each half earcutLinked(a, triangles, dim, minX, minY, invSize); earcutLinked(c, triangles, dim, minX, minY, invSize); return; } b = b.next; } a = a.next; } while (a !== start); } // link every hole into the outer loop, producing a single-ring polygon without holes function eliminateHoles(data, holeIndices, outerNode, dim) { var queue = [], i, len, start, end, list; for (i = 0, len = holeIndices.length; i < len; i++) { start = holeIndices[i] * dim; end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; list = linkedList(data, start, end, dim, false); if (list === list.next) { list.steiner = true; } queue.push(getLeftmost(list)); } queue.sort(compareX); // process holes from left to right for (i = 0; i < queue.length; i++) { eliminateHole(queue[i], outerNode); outerNode = filterPoints(outerNode, outerNode.next); } return outerNode; } function compareX(a, b) { return a.x - b.x; } // find a bridge between vertices that connects hole with an outer ring and and link it function eliminateHole(hole, outerNode) { outerNode = findHoleBridge(hole, outerNode); if (outerNode) { var b = splitPolygon(outerNode, hole); filterPoints(b, b.next); } } // David Eberly's algorithm for finding a bridge between hole and outer polygon function findHoleBridge(hole, outerNode) { var p = outerNode, hx = hole.x, hy = hole.y, qx = -Infinity, m; // find a segment intersected by a ray from the hole's leftmost point to the left; // segment's endpoint with lesser x will be potential connection point do { if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); if (x <= hx && x > qx) { qx = x; if (x === hx) { if (hy === p.y) { return p; } if (hy === p.next.y) { return p.next; } } m = p.x < p.next.x ? p : p.next; } } p = p.next; } while (p !== outerNode); if (!m) { return null; } if (hx === qx) { return m; } // hole touches outer segment; pick leftmost endpoint // look for points inside the triangle of hole point, segment intersection and endpoint; // if there are no points found, we have a valid connection; // otherwise choose the point of the minimum angle with the ray as connection point var stop = m, mx = m.x, my = m.y, tanMin = Infinity, tan; p = m; do { if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { tan = Math.abs(hy - p.y) / (hx - p.x); // tangential if (locallyInside(p, hole) && (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) { m = p; tanMin = tan; } } p = p.next; } while (p !== stop); return m; } // whether sector in vertex m contains sector in vertex p in the same coordinates function sectorContainsSector(m, p) { return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; } // interlink polygon nodes in z-order function indexCurve(start, minX, minY, invSize) { var p = start; do { if (p.z === null) { p.z = zOrder(p.x, p.y, minX, minY, invSize); } p.prevZ = p.prev; p.nextZ = p.next; p = p.next; } while (p !== start); p.prevZ.nextZ = null; p.prevZ = null; sortLinked(p); } // Simon Tatham's linked list merge sort algorithm // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html function sortLinked(list) { var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; do { p = list; list = null; tail = null; numMerges = 0; while (p) { numMerges++; q = p; pSize = 0; for (i = 0; i < inSize; i++) { pSize++; q = q.nextZ; if (!q) { break; } } qSize = inSize; while (pSize > 0 || (qSize > 0 && q)) { if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { e = p; p = p.nextZ; pSize--; } else { e = q; q = q.nextZ; qSize--; } if (tail) { tail.nextZ = e; } else { list = e; } e.prevZ = tail; tail = e; } p = q; } tail.nextZ = null; inSize *= 2; } while (numMerges > 1); return list; } // z-order of a point given coords and inverse of the longer side of data bbox function zOrder(x, y, minX, minY, invSize) { // coords are transformed into non-negative 15-bit integer range x = 32767 * (x - minX) * invSize; y = 32767 * (y - minY) * invSize; x = (x | (x << 8)) & 0x00FF00FF; x = (x | (x << 4)) & 0x0F0F0F0F; x = (x | (x << 2)) & 0x33333333; x = (x | (x << 1)) & 0x55555555; y = (y | (y << 8)) & 0x00FF00FF; y = (y | (y << 4)) & 0x0F0F0F0F; y = (y | (y << 2)) & 0x33333333; y = (y | (y << 1)) & 0x55555555; return x | (y << 1); } // find the leftmost node of a polygon ring function getLeftmost(start) { var p = start, leftmost = start; do { if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) { leftmost = p; } p = p.next; } while (p !== start); return leftmost; } // check if a point lies within a convex triangle function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; } // check if a diagonal between two polygon nodes is valid (lies in polygon interior) function isValidDiagonal(a, b) { return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // 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 } // signed area of a triangle function area(p, q, r) { return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); } // check if two points are equal function equals$a(p1, p2) { return p1.x === p2.x && p1.y === p2.y; } // check if two segments intersect function intersects(p1, q1, p2, q2) { var o1 = sign(area(p1, q1, p2)); var o2 = sign(area(p1, q1, q2)); var o3 = sign(area(p2, q2, p1)); var o4 = sign(area(p2, q2, q1)); if (o1 !== o2 && o3 !== o4) { return true; } // general case if (o1 === 0 && onSegment(p1, p2, q1)) { return true; } // p1, q1 and p2 are collinear and p2 lies on p1q1 if (o2 === 0 && onSegment(p1, q2, q1)) { return true; } // p1, q1 and q2 are collinear and q2 lies on p1q1 if (o3 === 0 && onSegment(p2, p1, q2)) { return true; } // p2, q2 and p1 are collinear and p1 lies on p2q2 if (o4 === 0 && onSegment(p2, q1, q2)) { return true; } // p2, q2 and q1 are collinear and q1 lies on p2q2 return false; } // for collinear points p, q, r, check if point q lies on segment pr function onSegment(p, q, r) { return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); } function sign(num) { return num > 0 ? 1 : num < 0 ? -1 : 0; } // check if a polygon diagonal intersects any polygon segments function intersectsPolygon(a, b) { var p = a; do { if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) { return true; } p = p.next; } while (p !== a); return false; } // check if a polygon diagonal is locally inside the polygon function locallyInside(a, b) { return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; } // check if the middle point of a polygon diagonal is inside the polygon function middleInside(a, b) { var p = a, inside = false, px = (a.x + b.x) / 2, py = (a.y + b.y) / 2; do { if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) { inside = !inside; } p = p.next; } while (p !== a); return inside; } // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; // if one belongs to the outer ring and another to a hole, it merges it into a single ring function splitPolygon(a, b) { var a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev; a.next = b; b.prev = a; a2.next = an; an.prev = a2; b2.next = a2; a2.prev = b2; bp.next = b2; b2.prev = bp; return b2; } // create a node and optionally link it with previous one (in a circular doubly linked list) function insertNode(i, x, y, last) { var p = new Node(i, x, y); if (!last) { p.prev = p; p.next = p; } else { p.next = last.next; p.prev = last; last.next.prev = p; last.next = p; } return p; } function removeNode(p) { p.next.prev = p.prev; p.prev.next = p.next; if (p.prevZ) { p.prevZ.nextZ = p.nextZ; } if (p.nextZ) { p.nextZ.prevZ = p.prevZ; } } function Node(i, x, y) { // vertex index in coordinates array this.i = i; // vertex coordinates this.x = x; this.y = y; // previous and next vertex nodes in a polygon ring this.prev = null; this.next = null; // z-order curve value this.z = null; // previous and next nodes in z-order this.prevZ = null; this.nextZ = null; // indicates whether this is a steiner point this.steiner = false; } // return a percentage difference between the polygon area and its triangulation area; // used to verify correctness of triangulation earcut.deviation = function (data, holeIndices, dim, triangles) { var hasHoles = holeIndices && holeIndices.length; var outerLen = hasHoles ? holeIndices[0] * dim : data.length; var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); if (hasHoles) { for (var i = 0, len = holeIndices.length; i < len; i++) { var start = holeIndices[i] * dim; var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; polygonArea -= Math.abs(signedArea(data, start, end, dim)); } } var trianglesArea = 0; for (i = 0; i < triangles.length; i += 3) { var a = triangles[i] * dim; var b = triangles[i + 1] * dim; var c = triangles[i + 2] * dim; trianglesArea += Math.abs( (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1])); } return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea); }; function signedArea(data, start, end, dim) { var sum = 0; for (var i = start, j = end - dim; i < end; i += dim) { sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); j = i; } return sum; } // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts earcut.flatten = function (data) { var dim = data[0][0].length, result = {vertices: [], holes: [], dimensions: dim}, holeIndex = 0; for (var i = 0; i < data.length; i++) { for (var j = 0; j < data[i].length; j++) { for (var d = 0; d < dim; d++) { result.vertices.push(data[i][j][d]); } } if (i > 0) { holeIndex += data[i - 1].length; result.holes.push(holeIndex); } } return result; }; earcut_1.default = default_1; function quickselect(arr, k, left, right, compare) { quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare); } function quickselectStep(arr, k, left, right, compare) { while (right > left) { if (right - left > 600) { var n = right - left + 1; var m = k - left + 1; var z = Math.log(n); var s = 0.5 * Math.exp(2 * z / 3); var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); quickselectStep(arr, k, newLeft, newRight, compare); } var t = arr[k]; var i = left; var j = right; swap$1(arr, left, k); if (compare(arr[right], t) > 0) { swap$1(arr, left, right); } while (i < j) { swap$1(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); } else { j++; swap$1(arr, j, right); } if (j <= k) { left = j + 1; } if (k <= j) { right = j - 1; } } } function swap$1(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } function defaultCompare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } // // classifies an array of rings into polygons with outer rings and holes function classifyRings(rings , maxRings ) { var len = rings.length; if (len <= 1) { return [rings]; } var polygons = []; var polygon, ccw; for (var i = 0; i < len; i++) { var area = calculateSignedArea(rings[i]); if (area === 0) { continue; } (rings[i] ).area = Math.abs(area); if (ccw === undefined) { ccw = area < 0; } if (ccw === area < 0) { if (polygon) { polygons.push(polygon); } polygon = [rings[i]]; } else { (polygon ).push(rings[i]); } } if (polygon) { polygons.push(polygon); } // Earcut performance degrades with the # of rings in a polygon. For this // reason, we limit strip out all but the `maxRings` largest rings. if (maxRings > 1) { for (var j = 0; j < polygons.length; j++) { if (polygons[j].length <= maxRings) { continue; } quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas); polygons[j] = polygons[j].slice(0, maxRings); } } return polygons; } function compareAreas(a, b) { return b.area - a.area; } // function hasPattern(type , layers , options ) { var patterns = options.patternDependencies; var hasPattern = false; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; var patternProperty = layer.paint.get((type + "-pattern")); if (!patternProperty.isConstant()) { hasPattern = true; } var constantPattern = patternProperty.constantOr(null); if (constantPattern) { hasPattern = true; patterns[constantPattern.to] = true; patterns[constantPattern.from] = true; } } return hasPattern; } function addPatternDependencies(type , layers , patternFeature , zoom , options ) { var patterns = options.patternDependencies; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; var patternProperty = layer.paint.get((type + "-pattern")); var patternPropertyValue = patternProperty.value; if (patternPropertyValue.kind !== "constant") { var min = patternPropertyValue.evaluate({zoom: zoom - 1}, patternFeature, {}); var mid = patternPropertyValue.evaluate({zoom: zoom}, patternFeature, {}); var max = patternPropertyValue.evaluate({zoom: zoom + 1}, patternFeature, {}); // add to patternDependencies patterns[min] = true; patterns[mid] = true; patterns[max] = true; // save for layout patternFeature.patterns[layer.id] = { min: min, mid: mid, max: max }; } } return patternFeature; } // var EARCUT_MAX_RINGS = 500; var FillBucket = function FillBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.patternFeatures = []; this.layoutVertexArray = new StructArrayLayout2i4(); this.indexArray = new StructArrayLayout3ui6(); this.indexArray2 = new StructArrayLayout2ui4(); this.programConfigurations = new ProgramConfigurationSet(members$1, options.layers, options.zoom); this.segments = new SegmentVector(); this.segments2 = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; FillBucket.prototype.populate = function populate (features , options ) { this.hasPattern = hasPattern('fill', this.layers, options); var fillSortKey = this.layers[0].layout.get('fill-sort-key'); var bucketFeatures = []; for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!this.layers[0]._featureFilter(new EvaluationParameters(this.zoom), feature)) { continue; } var geometry = loadGeometry(feature); var sortKey = fillSortKey ? fillSortKey.evaluate(feature, {}) : undefined; var bucketFeature = { id: feature.id, properties: feature.properties, type: feature.type, sourceLayerIndex: sourceLayerIndex, index: index, geometry: geometry, patterns: {}, sortKey: sortKey }; bucketFeatures.push(bucketFeature); } if (fillSortKey) { bucketFeatures.sort(function (a, b) { // a.sortKey is always a number when in use return ((a.sortKey ) ) - ((b.sortKey ) ); }); } for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) { var bucketFeature$1 = list$1[i$1]; var ref$1 = bucketFeature$1; var geometry$1 = ref$1.geometry; var index$1 = ref$1.index; var sourceLayerIndex$1 = ref$1.sourceLayerIndex; if (this.hasPattern) { var patternFeature = addPatternDependencies('fill', this.layers, bucketFeature$1, this.zoom, options); // pattern features are added only once the pattern is loaded into the image atlas // so are stored during populate until later updated with positions by tile worker in addFeatures this.patternFeatures.push(patternFeature); } else { this.addFeature(bucketFeature$1, geometry$1, index$1, {}); } var feature$1 = features[index$1].feature; options.featureIndex.insert(feature$1, geometry$1, index$1, sourceLayerIndex$1, this.index); } }; FillBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; FillBucket.prototype.addFeatures = function addFeatures (options , imagePositions ) { for (var i = 0, list = this.patternFeatures; i < list.length; i += 1) { var feature = list[i]; this.addFeature(feature, feature.geometry, feature.index, imagePositions); } }; FillBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; FillBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; FillBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$1); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.indexBuffer2 = context.createIndexBuffer(this.indexArray2); } this.programConfigurations.upload(context); this.uploaded = true; }; FillBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.indexBuffer2.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); this.segments2.destroy(); }; FillBucket.prototype.addFeature = function addFeature (feature , geometry , index , imagePositions ) { for (var i$4 = 0, list$2 = classifyRings(geometry, EARCUT_MAX_RINGS); i$4 < list$2.length; i$4 += 1) { var polygon = list$2[i$4]; var numVertices = 0; for (var i$2 = 0, list = polygon; i$2 < list.length; i$2 += 1) { var ring = list[i$2]; numVertices += ring.length; } var triangleSegment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray); var triangleIndex = triangleSegment.vertexLength; var flattened = []; var holeIndices = []; for (var i$3 = 0, list$1 = polygon; i$3 < list$1.length; i$3 += 1) { var ring$1 = list$1[i$3]; if (ring$1.length === 0) { continue; } if (ring$1 !== polygon[0]) { holeIndices.push(flattened.length / 2); } var lineSegment = this.segments2.prepareSegment(ring$1.length, this.layoutVertexArray, this.indexArray2); var lineIndex = lineSegment.vertexLength; this.layoutVertexArray.emplaceBack(ring$1[0].x, ring$1[0].y); this.indexArray2.emplaceBack(lineIndex + ring$1.length - 1, lineIndex); flattened.push(ring$1[0].x); flattened.push(ring$1[0].y); for (var i = 1; i < ring$1.length; i++) { this.layoutVertexArray.emplaceBack(ring$1[i].x, ring$1[i].y); this.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i); flattened.push(ring$1[i].x); flattened.push(ring$1[i].y); } lineSegment.vertexLength += ring$1.length; lineSegment.primitiveLength += ring$1.length; } var indices = earcut_1(flattened, holeIndices); assert_1(indices.length % 3 === 0); for (var i$1 = 0; i$1 < indices.length; i$1 += 3) { this.indexArray.emplaceBack( triangleIndex + indices[i$1], triangleIndex + indices[i$1 + 1], triangleIndex + indices[i$1 + 2]); } triangleSegment.vertexLength += numVertices; triangleSegment.primitiveLength += indices.length / 3; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions); }; register('FillBucket', FillBucket, {omit: ['layers', 'patternFeatures']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$4 = new Properties({ "fill-sort-key": new DataDrivenProperty(spec["layout_fill"]["fill-sort-key"]), }); var paint$4 = 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"]), "fill-outline-color": new DataDrivenProperty(spec["paint_fill"]["fill-outline-color"]), "fill-translate": new DataConstantProperty(spec["paint_fill"]["fill-translate"]), "fill-translate-anchor": new DataConstantProperty(spec["paint_fill"]["fill-translate-anchor"]), "fill-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill"]["fill-pattern"]), }); // 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$4, layout: layout$4 } ); // var FillStyleLayer = /*@__PURE__*/(function (StyleLayer) { function FillStyleLayer(layer ) { StyleLayer.call(this, layer, properties$3); } if ( StyleLayer ) FillStyleLayer.__proto__ = StyleLayer; FillStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); FillStyleLayer.prototype.constructor = FillStyleLayer; FillStyleLayer.prototype.recalculate = function recalculate (parameters ) { StyleLayer.prototype.recalculate.call(this, parameters); var outlineColor = this.paint._values['fill-outline-color']; if (outlineColor.value.kind === 'constant' && outlineColor.value.value === undefined) { this.paint._values['fill-outline-color'] = this.paint._values['fill-color']; } }; FillStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new FillBucket(parameters); }; FillStyleLayer.prototype.queryRadius = function queryRadius () { return translateDistance(this.paint.get('fill-translate')); }; FillStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('fill-translate'), this.paint.get('fill-translate-anchor'), transform.angle, pixelsToTileUnits); return polygonIntersectsMultiPolygon(translatedPolygon, geometry); }; FillStyleLayer.prototype.isTileClipped = function isTileClipped () { return true; }; return FillStyleLayer; }(StyleLayer)); // var layout$5 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_normal_ed', components: 4, type: 'Int16'} ], 4); var members$2 = layout$5.members; var size$2 = layout$5.size; var alignment$2 = layout$5.alignment; 'use strict'; var vectortilefeature = VectorTileFeature; function VectorTileFeature(pbf, end, extent, keys, values) { // Public this.properties = {}; this.extent = extent; this.type = 0; // Private this._pbf = pbf; this._geometry = -1; this._keys = keys; this._values = values; pbf.readFields(readFeature, this, end); } function readFeature(tag, feature, pbf) { if (tag == 1) { feature.id = pbf.readVarint(); } else if (tag == 2) { readTag(pbf, feature); } else if (tag == 3) { feature.type = pbf.readVarint(); } else if (tag == 4) { feature._geometry = pbf.pos; } } function readTag(pbf, feature) { var end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var key = feature._keys[pbf.readVarint()], value = feature._values[pbf.readVarint()]; feature.properties[key] = value; } } VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; VectorTileFeature.prototype.loadGeometry = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (cmd === 1) { // moveTo if (line) { lines.push(line); } line = []; } line.push(new pointGeometry(x, y)); } else if (cmd === 7) { // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 if (line) { line.push(line[0].clone()); // closePolygon } } else { throw new Error('unknown command ' + cmd); } } if (line) { lines.push(line); } return lines; }; VectorTileFeature.prototype.bbox = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x1 = Infinity, x2 = -Infinity, y1 = Infinity, y2 = -Infinity; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (x < x1) { x1 = x; } if (x > x2) { x2 = x; } if (y < y1) { y1 = y; } if (y > y2) { y2 = y; } } else if (cmd !== 7) { throw new Error('unknown command ' + cmd); } } return [x1, y1, x2, y2]; }; VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { var size = this.extent * Math.pow(2, z), x0 = this.extent * x, y0 = this.extent * y, coords = this.loadGeometry(), type = VectorTileFeature.types[this.type], i, j; function project(line) { for (var j = 0; j < line.length; j++) { var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; line[j] = [ (p.x + x0) * 360 / size - 180, 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 ]; } } switch (this.type) { case 1: var points = []; for (i = 0; i < coords.length; i++) { points[i] = coords[i][0]; } coords = points; project(coords); break; case 2: for (i = 0; i < coords.length; i++) { project(coords[i]); } break; case 3: coords = classifyRings$1(coords); for (i = 0; i < coords.length; i++) { for (j = 0; j < coords[i].length; j++) { project(coords[i][j]); } } break; } if (coords.length === 1) { coords = coords[0]; } else { type = 'Multi' + type; } var result = { type: "Feature", geometry: { type: type, coordinates: coords }, properties: this.properties }; if ('id' in this) { result.id = this.id; } return result; }; // classifies an array of rings into polygons with outer rings and holes function classifyRings$1(rings) { var len = rings.length; if (len <= 1) { return [rings]; } var polygons = [], polygon, ccw; for (var i = 0; i < len; i++) { var area = signedArea$1(rings[i]); if (area === 0) { continue; } if (ccw === undefined) { ccw = area < 0; } if (ccw === area < 0) { if (polygon) { polygons.push(polygon); } polygon = [rings[i]]; } else { polygon.push(rings[i]); } } if (polygon) { polygons.push(polygon); } return polygons; } function signedArea$1(ring) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; } 'use strict'; var vectortilelayer = VectorTileLayer; function VectorTileLayer(pbf, end) { // Public this.version = 1; this.name = null; this.extent = 4096; this.length = 0; // Private this._pbf = pbf; this._keys = []; this._values = []; this._features = []; pbf.readFields(readLayer, this, end); this.length = this._features.length; } function readLayer(tag, layer, pbf) { if (tag === 15) { layer.version = pbf.readVarint(); } else if (tag === 1) { layer.name = pbf.readString(); } else if (tag === 5) { layer.extent = pbf.readVarint(); } else if (tag === 2) { layer._features.push(pbf.pos); } else if (tag === 3) { layer._keys.push(pbf.readString()); } else if (tag === 4) { layer._values.push(readValueMessage(pbf)); } } function readValueMessage(pbf) { var value = null, end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var tag = pbf.readVarint() >> 3; value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null; } return value; } // return feature `i` from this layer as a `VectorTileFeature` VectorTileLayer.prototype.feature = function(i) { if (i < 0 || i >= this._features.length) { throw new Error('feature index out of bounds'); } this._pbf.pos = this._features[i]; var end = this._pbf.readVarint() + this._pbf.pos; return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values); }; 'use strict'; var vectortile = VectorTile; function VectorTile(pbf, end) { this.layers = pbf.readFields(readTile, {}, end); } function readTile(tag, layers, pbf) { if (tag === 3) { var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos); if (layer.length) { layers[layer.name] = layer; } } } var VectorTile$1 = vectortile; var VectorTileFeature$1 = vectortilefeature; var VectorTileLayer$1 = vectortilelayer; var vectorTile = { VectorTile: VectorTile$1, VectorTileFeature: VectorTileFeature$1, VectorTileLayer: VectorTileLayer$1 }; // var vectorTileFeatureTypes = vectorTile.VectorTileFeature.types; var EARCUT_MAX_RINGS$1 = 500; var FACTOR = Math.pow(2, 13); function addVertex(vertexArray, x, y, nx, ny, nz, t, e) { vertexArray.emplaceBack( // a_pos x, y, // a_normal_ed: 3-component normal and 1-component edgedistance Math.floor(nx * FACTOR) * 2 + t, ny * FACTOR * 2, nz * FACTOR * 2, // edgedistance (used for wrapping patterns around extrusion sides) Math.round(e) ); } var FillExtrusionBucket = function FillExtrusionBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.layoutVertexArray = new StructArrayLayout2i4i12(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = new ProgramConfigurationSet(members$2, options.layers, options.zoom); this.segments = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; FillExtrusionBucket.prototype.populate = function populate (features , options ) { this.features = []; this.hasPattern = hasPattern('fill-extrusion', this.layers, options); for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!this.layers[0]._featureFilter(new EvaluationParameters(this.zoom), feature)) { continue; } var geometry = loadGeometry(feature); var patternFeature = { sourceLayerIndex: sourceLayerIndex, index: index, geometry: geometry, properties: feature.properties, type: feature.type, patterns: {} }; if (typeof feature.id !== 'undefined') { patternFeature.id = feature.id; } if (this.hasPattern) { this.features.push(addPatternDependencies('fill-extrusion', this.layers, patternFeature, this.zoom, options)); } else { this.addFeature(patternFeature, geometry, index, {}); } options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index, true); } }; FillExtrusionBucket.prototype.addFeatures = function addFeatures (options , imagePositions ) { for (var i = 0, list = this.features; i < list.length; i += 1) { var feature = list[i]; var geometry = feature.geometry; this.addFeature(feature, geometry, feature.index, imagePositions); } }; FillExtrusionBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; FillExtrusionBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; FillExtrusionBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; FillExtrusionBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$2); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); this.uploaded = true; }; FillExtrusionBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; FillExtrusionBucket.prototype.addFeature = function addFeature (feature , geometry , index , imagePositions ) { for (var i$4 = 0, list$3 = classifyRings(geometry, EARCUT_MAX_RINGS$1); i$4 < list$3.length; i$4 += 1) { var polygon = list$3[i$4]; var numVertices = 0; for (var i$1 = 0, list = polygon; i$1 < list.length; i$1 += 1) { var ring = list[i$1]; numVertices += ring.length; } var segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); for (var i$2 = 0, list$1 = polygon; i$2 < list$1.length; i$2 += 1) { var ring$1 = list$1[i$2]; if (ring$1.length === 0) { continue; } if (isEntirelyOutside(ring$1)) { continue; } var edgeDistance = 0; for (var p = 0; p < ring$1.length; p++) { var p1 = ring$1[p]; if (p >= 1) { var p2 = ring$1[p - 1]; if (!isBoundaryEdge(p1, p2)) { if (segment.vertexLength + 4 > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); } var perp = p1.sub(p2)._perp()._unit(); var dist = p2.dist(p1); if (edgeDistance + dist > 32768) { edgeDistance = 0; } addVertex(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 0, edgeDistance); addVertex(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 1, edgeDistance); edgeDistance += dist; addVertex(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 0, edgeDistance); addVertex(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 1, edgeDistance); var bottomRight = segment.vertexLength; // ┌──────┐ // │ 0 1 │ Counter-clockwise winding order. // │ │ Triangle 1: 0 => 2 => 1 // │ 2 3 │ Triangle 2: 1 => 2 => 3 // └──────┘ this.indexArray.emplaceBack(bottomRight, bottomRight + 2, bottomRight + 1); this.indexArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3); segment.vertexLength += 4; segment.primitiveLength += 2; } } } } if (segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { segment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray); } //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') { continue; } var flattened = []; var holeIndices = []; var triangleIndex = segment.vertexLength; for (var i$3 = 0, list$2 = polygon; i$3 < list$2.length; i$3 += 1) { var ring$2 = list$2[i$3]; if (ring$2.length === 0) { continue; } if (ring$2 !== polygon[0]) { holeIndices.push(flattened.length / 2); } for (var i = 0; i < ring$2.length; i++) { var p$1 = ring$2[i]; addVertex(this.layoutVertexArray, p$1.x, p$1.y, 0, 0, 1, 1, 0); flattened.push(p$1.x); flattened.push(p$1.y); } } var indices = earcut_1(flattened, holeIndices); assert_1(indices.length % 3 === 0); for (var j = 0; j < indices.length; j += 3) { // Counter-clockwise winding order. this.indexArray.emplaceBack( triangleIndex + indices[j], triangleIndex + indices[j + 2], triangleIndex + indices[j + 1]); } segment.primitiveLength += indices.length / 3; segment.vertexLength += numVertices; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions); }; register('FillExtrusionBucket', FillExtrusionBucket, {omit: ['layers', 'features']}); function isBoundaryEdge(p1, p2) { return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT)) || (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT)); } function isEntirelyOutside(ring) { return ring.every(function (p) { return p.x < 0; }) || ring.every(function (p) { return p.x > EXTENT; }) || ring.every(function (p) { return p.y < 0; }) || ring.every(function (p) { return p.y > EXTENT; }); } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var 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"]), "fill-extrusion-translate-anchor": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]), "fill-extrusion-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-pattern"]), "fill-extrusion-height": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-height"]), "fill-extrusion-base": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-base"]), "fill-extrusion-vertical-gradient": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"]), }); // 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$5 } ); // var FillExtrusionStyleLayer = /*@__PURE__*/(function (StyleLayer) { function FillExtrusionStyleLayer(layer ) { StyleLayer.call(this, layer, properties$4); } if ( StyleLayer ) FillExtrusionStyleLayer.__proto__ = StyleLayer; FillExtrusionStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); FillExtrusionStyleLayer.prototype.constructor = FillExtrusionStyleLayer; FillExtrusionStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new FillExtrusionBucket(parameters); }; FillExtrusionStyleLayer.prototype.queryRadius = function queryRadius () { return translateDistance(this.paint.get('fill-extrusion-translate')); }; FillExtrusionStyleLayer.prototype.is3D = function is3D () { return true; }; FillExtrusionStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits , pixelPosMatrix ) { var translatedPolygon = translate(queryGeometry, this.paint.get('fill-extrusion-translate'), this.paint.get('fill-extrusion-translate-anchor'), transform.angle, pixelsToTileUnits); var height = this.paint.get('fill-extrusion-height').evaluate(feature, featureState); var base = this.paint.get('fill-extrusion-base').evaluate(feature, featureState); var projectedQueryGeometry = projectQueryGeometry$1(translatedPolygon, pixelPosMatrix, transform, 0); var projected = projectExtrusion(geometry, base, height, pixelPosMatrix); var projectedBase = projected[0]; var projectedTop = projected[1]; return checkIntersection(projectedBase, projectedTop, projectedQueryGeometry); }; return FillExtrusionStyleLayer; }(StyleLayer)); function dot$5(a, b) { return a.x * b.x + a.y * b.y; } function getIntersectionDistance(projectedQueryGeometry , projectedFace ) { if (projectedQueryGeometry.length === 1) { // For point queries calculate the z at which the point intersects the face // using barycentric coordinates. // Find the barycentric coordinates of the projected point within the first // triangle of the face, using only the xy plane. It doesn't matter if the // point is outside the first triangle because all the triangles in the face // are in the same plane. var a = projectedFace[0]; var b = projectedFace[1]; var c = projectedFace[3]; var p = projectedQueryGeometry[0]; var ab = b.sub(a); var ac = c.sub(a); var ap = p.sub(a); var dotABAB = dot$5(ab, ab); var dotABAC = dot$5(ab, ac); var dotACAC = dot$5(ac, ac); var dotAPAB = dot$5(ap, ab); var dotAPAC = dot$5(ap, ac); var denom = dotABAB * dotACAC - dotABAC * dotABAC; var v = (dotACAC * dotAPAB - dotABAC * dotAPAC) / denom; var w = (dotABAB * dotAPAC - dotABAC * dotAPAB) / denom; var u = 1 - v - w; // Use the barycentric weighting along with the original triangle z coordinates to get the point of intersection. return a.z * u + b.z * v + c.z * w; } else { // The counts as closest is less clear when the query is a box. This // returns the distance to the nearest point on the face, whether it is // within the query or not. It could be more correct to return the // distance to the closest point within the query box but this would be // more complicated and expensive to calculate with little benefit. var closestDistance = Infinity; for (var i = 0, list = projectedFace; i < list.length; i += 1) { var p$1 = list[i]; closestDistance = Math.min(closestDistance, p$1.z); } return closestDistance; } } function checkIntersection(projectedBase , projectedTop , projectedQueryGeometry ) { var closestDistance = Infinity; if (polygonIntersectsMultiPolygon(projectedQueryGeometry, projectedTop)) { closestDistance = getIntersectionDistance(projectedQueryGeometry, projectedTop[0]); } for (var r = 0; r < projectedTop.length; r++) { var ringTop = projectedTop[r]; var ringBase = projectedBase[r]; for (var p = 0; p < ringTop.length - 1; p++) { var topA = ringTop[p]; var topB = ringTop[p + 1]; var baseA = ringBase[p]; var baseB = ringBase[p + 1]; var face = [topA, topB, baseB, baseA, topA]; if (polygonIntersectsPolygon(projectedQueryGeometry, face)) { closestDistance = Math.min(closestDistance, getIntersectionDistance(projectedQueryGeometry, face)); } } } return closestDistance === Infinity ? false : closestDistance; } /* * Project the geometry using matrix `m`. This is essentially doing * `vec4.transformMat4([], [p.x, p.y, z, 1], m)` but the multiplication * is inlined so that parts of the projection that are the same across * different points can only be done once. This produced a measurable * performance improvement. */ function projectExtrusion(geometry , zBase , zTop , m ) { var projectedBase = []; var projectedTop = []; var baseXZ = m[8] * zBase; var baseYZ = m[9] * zBase; var baseZZ = m[10] * zBase; var baseWZ = m[11] * zBase; var topXZ = m[8] * zTop; var topYZ = m[9] * zTop; var topZZ = m[10] * zTop; var topWZ = m[11] * zTop; for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var r = list$1[i$1]; var ringBase = []; var ringTop = []; for (var i = 0, list = r; i < list.length; i += 1) { var p = list[i]; var x = p.x; var y = p.y; var sX = m[0] * x + m[4] * y + m[12]; var sY = m[1] * x + m[5] * y + m[13]; var sZ = m[2] * x + m[6] * y + m[14]; var sW = m[3] * x + m[7] * y + m[15]; var baseX = sX + baseXZ; var baseY = sY + baseYZ; var baseZ = sZ + baseZZ; var baseW = sW + baseWZ; var topX = sX + topXZ; var topY = sY + topYZ; var topZ = sZ + topZZ; var topW = sW + topWZ; var b = new pointGeometry(baseX / baseW, baseY / baseW); b.z = baseZ / baseW; ringBase.push(b); var t = new pointGeometry(topX / topW, topY / topW); t.z = topZ / topW; ringTop.push(t); } projectedBase.push(ringBase); projectedTop.push(ringTop); } return [projectedBase, projectedTop]; } function projectQueryGeometry$1(queryGeometry , pixelPosMatrix , transform , z ) { var projectedQueryGeometry = []; for (var i = 0, list = queryGeometry; i < list.length; i += 1) { var p = list[i]; var v = [p.x, p.y, z, 1]; transformMat4$1(v, v, pixelPosMatrix); projectedQueryGeometry.push(new pointGeometry(v[0] / v[3], v[1] / v[3])); } return projectedQueryGeometry; } // var lineLayoutAttributes = createLayout([ {name: 'a_pos_normal', components: 2, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint8'} ], 4); var members$3 = lineLayoutAttributes.members; var size$3 = lineLayoutAttributes.size; var alignment$3 = lineLayoutAttributes.alignment; // var vectorTileFeatureTypes$1 = vectorTile.VectorTileFeature.types; // NOTE ON EXTRUDE SCALE: // scale the extrusion vector so that the normal length is this value. // contains the "texture" normals (-1..1). this is distinct from the extrude // normals for line joins, because the x-value remains 0 for the texture // normal array, while the extrude normal actually moves the vertex to create // the acute/bevelled line join. var EXTRUDE_SCALE = 63; /* * Sharp corners cause dashed lines to tilt because the distance along the line * is the same at both the inner and outer corners. To improve the appearance of * dashed lines we add extra points near sharp corners so that a smaller part * of the line is tilted. * * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an * extra vertex. The default is 75 degrees. * * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner. */ var COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180)); var SHARP_CORNER_OFFSET = 15; // Angle per triangle for approximating round line joins. var DEG_PER_TRIANGLE = 20; // The number of bits that is used to store the line distance in the buffer. var LINE_DISTANCE_BUFFER_BITS = 15; // We don't have enough bits for the line distance as we'd like to have, so // use this value to scale the line distance (in tile units) down to a smaller // value. This lets us store longer distances while sacrificing precision. var LINE_DISTANCE_SCALE = 1 / 2; // The maximum line distance, in tile units, that fits in the buffer. var MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE; /** * @private */ var LineBucket = function LineBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.patternFeatures = []; this.layoutVertexArray = new StructArrayLayout2i4ub8(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = new ProgramConfigurationSet(members$3, options.layers, options.zoom); this.segments = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; LineBucket.prototype.populate = function populate (features , options ) { this.hasPattern = hasPattern('line', this.layers, options); var lineSortKey = this.layers[0].layout.get('line-sort-key'); var bucketFeatures = []; for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!this.layers[0]._featureFilter(new EvaluationParameters(this.zoom), feature)) { continue; } var geometry = loadGeometry(feature); var sortKey = lineSortKey ? lineSortKey.evaluate(feature, {}) : undefined; var bucketFeature = { id: feature.id, properties: feature.properties, type: feature.type, sourceLayerIndex: sourceLayerIndex, index: index, geometry: geometry, patterns: {}, sortKey: sortKey }; bucketFeatures.push(bucketFeature); } if (lineSortKey) { bucketFeatures.sort(function (a, b) { // a.sortKey is always a number when in use return ((a.sortKey ) ) - ((b.sortKey ) ); }); } for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) { var bucketFeature$1 = list$1[i$1]; var ref$1 = bucketFeature$1; var geometry$1 = ref$1.geometry; var index$1 = ref$1.index; var sourceLayerIndex$1 = ref$1.sourceLayerIndex; if (this.hasPattern) { var patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature$1, this.zoom, options); // pattern features are added only once the pattern is loaded into the image atlas // so are stored during populate until later updated with positions by tile worker in addFeatures this.patternFeatures.push(patternBucketFeature); } else { this.addFeature(bucketFeature$1, geometry$1, index$1, {}); } var feature$1 = features[index$1].feature; options.featureIndex.insert(feature$1, geometry$1, index$1, sourceLayerIndex$1, this.index); } }; LineBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; LineBucket.prototype.addFeatures = function addFeatures (options , imagePositions ) { for (var i = 0, list = this.patternFeatures; i < list.length; i += 1) { var feature = list[i]; this.addFeature(feature, feature.geometry, feature.index, imagePositions); } }; LineBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; LineBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; LineBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); this.uploaded = true; }; LineBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; LineBucket.prototype.addFeature = function addFeature (feature , geometry , index , imagePositions ) { var layout = this.layers[0].layout; var join = layout.get('line-join').evaluate(feature, {}); var cap = layout.get('line-cap'); var miterLimit = layout.get('line-miter-limit'); var roundLimit = layout.get('line-round-limit'); for (var i = 0, list = geometry; i < list.length; i += 1) { var line = list[i]; this.addLine(line, feature, join, cap, miterLimit, roundLimit, index, imagePositions); } }; LineBucket.prototype.addLine = function addLine (vertices , feature , join , cap , miterLimit , roundLimit , index , imagePositions ) { this.distance = 0; this.scaledDistance = 0; this.totalDistance = 0; if (!!feature.properties && feature.properties.hasOwnProperty('mapbox_clip_start') && feature.properties.hasOwnProperty('mapbox_clip_end')) { this.clipStart = +feature.properties['mapbox_clip_start']; this.clipEnd = +feature.properties['mapbox_clip_end']; // Calculate the total distance, in tile units, of this tiled line feature for (var i = 0; i < vertices.length - 1; i++) { this.totalDistance += vertices[i].dist(vertices[i + 1]); } } var isPolygon = vectorTileFeatureTypes$1[feature.type] === 'Polygon'; // If the line has duplicate vertices at the ends, adjust start/length to remove them. var len = vertices.length; while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) { len--; } var first = 0; while (first < len - 1 && vertices[first].equals(vertices[first + 1])) { first++; } // Ignore invalid geometry. if (len < (isPolygon ? 3 : 2)) { return; } if (join === 'bevel') { miterLimit = 1.05; } var sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling)); // we could be more precise, but it would only save a negligible amount of space var segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray); var currentVertex; var prevVertex = ((undefined ) ); var nextVertex = ((undefined ) ); var prevNormal = ((undefined ) ); var nextNormal = ((undefined ) ); // the last two vertices added this.e1 = this.e2 = -1; if (isPolygon) { currentVertex = vertices[len - 2]; nextNormal = vertices[first].sub(currentVertex)._unit()._perp(); } for (var i$1 = first; i$1 < len; i$1++) { nextVertex = isPolygon && i$1 === len - 1 ? vertices[first + 1] : // if the line is closed, we treat the last vertex like the first vertices[i$1 + 1]; // just the next vertex // if two consecutive vertices exist, skip the current one if (nextVertex && vertices[i$1].equals(nextVertex)) { continue; } if (nextNormal) { prevNormal = nextNormal; } if (currentVertex) { prevVertex = currentVertex; } currentVertex = vertices[i$1]; // Calculate the normal towards the next vertex in this line. In case // there is no next vertex, pretend that the line is continuing straight, // meaning that we are just using the previous normal. nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal; // If we still don't have a previous normal, this is the beginning of a // non-closed line, so we're doing a straight "join". prevNormal = prevNormal || nextNormal; // Determine the normal of the join extrusion. It is the angle bisector // of the segments between the previous line and the next line. // In the case of 180° angles, the prev and next normals cancel each other out: // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle // below will also become 0 and miterLength will become Infinity. var joinNormal = prevNormal.add(nextNormal); if (joinNormal.x !== 0 || joinNormal.y !== 0) { joinNormal._unit(); } /* joinNormal prevNormal * ↖ ↑ * .________. prevVertex * | * nextNormal ← | currentVertex * | * nextVertex ! * */ // calculate cosines of the angle (and its half) using dot product var cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y; var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y; // Calculate the length of the miter (the ratio of the miter to the width) // as the inverse of cosine of the angle between next and join normals var miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity; // approximate angle from cosine var approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle); var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex; var lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0; if (isSharpCorner && i$1 > first) { var prevSegmentLength = currentVertex.dist(prevVertex); if (prevSegmentLength > 2 * sharpCornerOffset) { var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round()); this.updateDistance(prevVertex, newPrevVertex); this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment); prevVertex = newPrevVertex; } } // The join if a middle vertex, otherwise the cap. var middleVertex = prevVertex && nextVertex; var currentJoin = middleVertex ? join : isPolygon ? 'butt' : cap; if (middleVertex && currentJoin === 'round') { if (miterLength < roundLimit) { currentJoin = 'miter'; } else if (miterLength <= 2) { currentJoin = 'fakeround'; } } if (currentJoin === 'miter' && miterLength > miterLimit) { currentJoin = 'bevel'; } if (currentJoin === 'bevel') { // The maximum extrude length is 128 / 63 = 2 times the width of the line // so if miterLength >= 2 we need to draw a different type of bevel here. if (miterLength > 2) { currentJoin = 'flipbevel'; } // If the miterLength is really small and the line bevel wouldn't be visible, // just draw a miter join to save a triangle. if (miterLength < miterLimit) { currentJoin = 'miter'; } } // Calculate how far along the line the currentVertex is if (prevVertex) { this.updateDistance(prevVertex, currentVertex); } if (currentJoin === 'miter') { joinNormal._mult(miterLength); this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); } else if (currentJoin === 'flipbevel') { // miter is too big, flip the direction to make a beveled join if (miterLength > 100) { // Almost parallel lines joinNormal = nextNormal.mult(-1); } else { var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag(); joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1)); } this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment); } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') { var offset = -Math.sqrt(miterLength * miterLength - 1); var offsetA = lineTurnsLeft ? offset : 0; var offsetB = lineTurnsLeft ? 0 : offset; // Close previous segment with a bevel if (prevVertex) { this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment); } if (currentJoin === 'fakeround') { // The join angle is sharp enough that a round join would be visible. // Bevel joins fill the gap between segments with a single pie slice triangle. // Create a round join by adding multiple pie slices. The join isn't actually round, but // it looks like it is at the sizes we render lines at. // pick the number of triangles for approximating round join by based on the angle between normals var n = Math.round((approxAngle * 180 / Math.PI) / DEG_PER_TRIANGLE); for (var m = 1; m < n; m++) { var t = m / n; if (t !== 0.5) { // approximate spherical interpolation https://observablehq.com/@mourner/approximating-geometric-slerp var t2 = t - 0.5; var A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519)); var B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638); t = t + t * t2 * (t - 1) * (A * t2 * t2 + B); } var extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1); this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment); } } if (nextVertex) { // Start next segment this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment); } } else if (currentJoin === 'butt') { this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); // butt cap } else if (currentJoin === 'square') { var offset$1 = prevVertex ? 1 : -1; // closing or starting square cap this.addCurrentVertex(currentVertex, joinNormal, offset$1, offset$1, segment); } else if (currentJoin === 'round') { if (prevVertex) { // Close previous segment with butt this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment); // Add round cap or linejoin at end of segment this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true); } if (nextVertex) { // Add round cap before first segment this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true); // Start next segment with a butt this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment); } } if (isSharpCorner && i$1 < len - 1) { var nextSegmentLength = currentVertex.dist(nextVertex); if (nextSegmentLength > 2 * sharpCornerOffset) { var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round()); this.updateDistance(currentVertex, newCurrentVertex); this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment); currentVertex = newCurrentVertex; } } } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions); }; /** * Add two vertices to the buffers. * * @param p the line vertex to add buffer vertices for * @param normal vertex normal * @param endLeft extrude to shift the left vertex along the line * @param endRight extrude to shift the left vertex along the line * @param segment the segment object to add the vertex to * @param round whether this is a round cap * @private */ LineBucket.prototype.addCurrentVertex = function addCurrentVertex (p , normal , endLeft , endRight , segment , round) { if ( round === void 0 ) round = false; // left and right extrude vectors, perpendicularly shifted by endLeft/endRight var leftX = normal.x + normal.y * endLeft; var leftY = normal.y - normal.x * endLeft; var rightX = -normal.x + normal.y * endRight; var rightY = -normal.y - normal.x * endRight; this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment); this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment); // There is a maximum "distance along the line" that we can store in the buffers. // When we get close to the distance, reset it to zero and add the vertex again with // a distance of zero. The max distance is determined by the number of bits we allocate // to `linesofar`. if (this.distance > MAX_LINE_DISTANCE / 2 && this.totalDistance === 0) { this.distance = 0; this.addCurrentVertex(p, normal, endLeft, endRight, segment, round); } }; LineBucket.prototype.addHalfVertex = function addHalfVertex (ref , extrudeX , extrudeY , round , up , dir , segment ) { var x = ref.x; var y = ref.y; // scale down so that we can store longer distances while sacrificing precision. var linesofar = this.scaledDistance * LINE_DISTANCE_SCALE; this.layoutVertexArray.emplaceBack( // a_pos_normal // Encode round/up the least significant bits (x << 1) + (round ? 1 : 0), (y << 1) + (up ? 1 : 0), // a_data // add 128 to store a byte in an unsigned byte Math.round(EXTRUDE_SCALE * extrudeX) + 128, Math.round(EXTRUDE_SCALE * extrudeY) + 128, // Encode the -1/0/1 direction value into the first two bits of .z of a_data. // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make // room for the direction value). The upper 8 bits of `linesofar` are placed in // the `w` component. ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofar & 0x3F) << 2), linesofar >> 6); var e = segment.vertexLength++; if (this.e1 >= 0 && this.e2 >= 0) { this.indexArray.emplaceBack(this.e1, this.e2, e); segment.primitiveLength++; } if (up) { this.e2 = e; } else { this.e1 = e; } }; LineBucket.prototype.updateDistance = function updateDistance (prev , next ) { this.distance += prev.dist(next); // Knowing the ratio of the full linestring covered by this tiled feature, as well // as the total distance (in tile units) of this tiled feature, and the distance // (in tile units) of the current vertex, we can determine the relative distance // of this vertex along the full linestring feature and scale it to [0, 2^15) this.scaledDistance = this.totalDistance > 0 ? (this.clipStart + (this.clipEnd - this.clipStart) * this.distance / this.totalDistance) * (MAX_LINE_DISTANCE - 1) : this.distance; }; register('LineBucket', LineBucket, {omit: ['layers', 'patternFeatures']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$6 = new Properties({ "line-cap": new DataConstantProperty(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"]), "line-round-limit": new DataConstantProperty(spec["layout_line"]["line-round-limit"]), "line-sort-key": new DataDrivenProperty(spec["layout_line"]["line-sort-key"]), }); var paint$6 = 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"]), "line-translate-anchor": new DataConstantProperty(spec["paint_line"]["line-translate-anchor"]), "line-width": new DataDrivenProperty(spec["paint_line"]["line-width"]), "line-gap-width": new DataDrivenProperty(spec["paint_line"]["line-gap-width"]), "line-offset": new DataDrivenProperty(spec["paint_line"]["line-offset"]), "line-blur": new DataDrivenProperty(spec["paint_line"]["line-blur"]), "line-dasharray": new CrossFadedProperty(spec["paint_line"]["line-dasharray"]), "line-pattern": new CrossFadedDataDrivenProperty(spec["paint_line"]["line-pattern"]), "line-gradient": new ColorRampProperty(spec["paint_line"]["line-gradient"]), }); // 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$6, layout: layout$6 } ); // var LineFloorwidthProperty = /*@__PURE__*/(function (DataDrivenProperty) { function LineFloorwidthProperty () { DataDrivenProperty.apply(this, arguments); } if ( DataDrivenProperty ) LineFloorwidthProperty.__proto__ = DataDrivenProperty; LineFloorwidthProperty.prototype = Object.create( DataDrivenProperty && DataDrivenProperty.prototype ); LineFloorwidthProperty.prototype.constructor = LineFloorwidthProperty; LineFloorwidthProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value, parameters) { parameters = new EvaluationParameters(Math.floor(parameters.zoom), { now: parameters.now, fadeDuration: parameters.fadeDuration, zoomHistory: parameters.zoomHistory, transition: parameters.transition }); return DataDrivenProperty.prototype.possiblyEvaluate.call(this, value, parameters); }; LineFloorwidthProperty.prototype.evaluate = function evaluate (value, globals, feature, featureState) { globals = extend({}, globals, {zoom: Math.floor(globals.zoom)}); return DataDrivenProperty.prototype.evaluate.call(this, value, globals, feature, featureState); }; return LineFloorwidthProperty; }(DataDrivenProperty)); var lineFloorwidthProperty = new LineFloorwidthProperty(properties$5.paint.properties['line-width'].specification); lineFloorwidthProperty.useIntegerZoom = true; var LineStyleLayer = /*@__PURE__*/(function (StyleLayer) { function LineStyleLayer(layer ) { StyleLayer.call(this, layer, properties$5); } if ( StyleLayer ) LineStyleLayer.__proto__ = StyleLayer; LineStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); LineStyleLayer.prototype.constructor = LineStyleLayer; LineStyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (name ) { if (name === 'line-gradient') { this._updateGradient(); } }; LineStyleLayer.prototype._updateGradient = function _updateGradient () { var expression = this._transitionablePaint._values['line-gradient'].value.expression; this.gradient = renderColorRamp(expression, 'lineProgress'); this.gradientTexture = null; }; LineStyleLayer.prototype.recalculate = function recalculate (parameters ) { StyleLayer.prototype.recalculate.call(this, parameters); (this.paint._values )['line-floorwidth'] = lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters); }; LineStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new LineBucket(parameters); }; LineStyleLayer.prototype.queryRadius = function queryRadius (bucket ) { var lineBucket = (bucket ); var width = getLineWidth( getMaximumPaintValue('line-width', this, lineBucket), getMaximumPaintValue('line-gap-width', this, lineBucket)); var offset = getMaximumPaintValue('line-offset', this, lineBucket); return width / 2 + Math.abs(offset) + translateDistance(this.paint.get('line-translate')); }; LineStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('line-translate'), this.paint.get('line-translate-anchor'), transform.angle, pixelsToTileUnits); var halfWidth = pixelsToTileUnits / 2 * getLineWidth( this.paint.get('line-width').evaluate(feature, featureState), this.paint.get('line-gap-width').evaluate(feature, featureState)); var lineOffset = this.paint.get('line-offset').evaluate(feature, featureState); if (lineOffset) { geometry = offsetLine(geometry, lineOffset * pixelsToTileUnits); } return polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth); }; LineStyleLayer.prototype.isTileClipped = function isTileClipped () { return true; }; return LineStyleLayer; }(StyleLayer)); function getLineWidth(lineWidth, lineGapWidth) { if (lineGapWidth > 0) { return lineGapWidth + 2 * lineWidth; } else { return lineWidth; } } function offsetLine(rings, offset) { var newRings = []; var zero = new pointGeometry(0, 0); for (var k = 0; k < rings.length; k++) { var ring = rings[k]; var newRing = []; for (var i = 0; i < ring.length; i++) { var a = ring[i - 1]; var b = ring[i]; var c = ring[i + 1]; var aToB = i === 0 ? zero : b.sub(a)._unit()._perp(); var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp(); var extrude = aToB._add(bToC)._unit(); var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y; extrude._mult(1 / cosHalfAngle); newRing.push(extrude._mult(offset)._add(b)); } newRings.push(newRing); } return newRings; } // var symbolLayoutAttributes = createLayout([ {name: 'a_pos_offset', components: 4, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint16'} ]); var dynamicLayoutAttributes = createLayout([ { name: 'a_projected_pos', components: 3, type: 'Float32' } ], 4); var placementOpacityAttributes = createLayout([ { name: 'a_fade_opacity', components: 1, type: 'Uint32' } ], 4); var collisionVertexAttributes = createLayout([ { name: 'a_placed', components: 2, type: 'Uint8' }, { name: 'a_shift', components: 2, type: 'Float32'} ]); var collisionBox = createLayout([ // the box is centered around the anchor point { type: 'Int16', name: 'anchorPointX' }, { type: 'Int16', name: 'anchorPointY' }, // distances to the edges from the anchor { type: 'Int16', name: 'x1' }, { type: 'Int16', name: 'y1' }, { type: 'Int16', name: 'x2' }, { type: 'Int16', name: 'y2' }, // the index of the feature in the original vectortile { type: 'Uint32', name: 'featureIndex' }, // the source layer the feature appears in { type: 'Uint16', name: 'sourceLayerIndex' }, // the bucket the feature appears in { type: 'Uint16', name: 'bucketIndex' }, // collision circles for lines store their distance to the anchor in tile units // so that they can be ignored if the projected label doesn't extend into // the box area { type: 'Int16', name: 'radius' }, { type: 'Int16', name: 'signedDistanceFromAnchor' } ]); var collisionBoxLayout = createLayout([ // used to render collision boxes for debugging purposes {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_anchor_pos', components: 2, type: 'Int16'}, {name: 'a_extrude', components: 2, type: 'Int16'} ], 4); var collisionCircleLayout = createLayout([ // used to render collision circles for debugging purposes {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_anchor_pos', components: 2, type: 'Int16'}, {name: 'a_extrude', components: 2, type: 'Int16'} ], 4); var placement = createLayout([ { type: 'Int16', name: 'anchorX' }, { type: 'Int16', name: 'anchorY' }, { type: 'Uint16', name: 'glyphStartIndex' }, { type: 'Uint16', name: 'numGlyphs' }, { type: 'Uint32', name: 'vertexStartIndex' }, { type: 'Uint32', name: 'lineStartIndex' }, { type: 'Uint32', name: 'lineLength' }, { type: 'Uint16', name: 'segment' }, { type: 'Uint16', name: 'lowerSize' }, { type: 'Uint16', name: 'upperSize' }, { type: 'Float32', name: 'lineOffsetX' }, { type: 'Float32', name: 'lineOffsetY' }, { type: 'Uint8', name: 'writingMode' }, { type: 'Uint8', name: 'placedOrientation' }, { type: 'Uint8', name: 'hidden' }, { type: 'Uint32', name: 'crossTileID'} ]); var symbolInstance = createLayout([ { type: 'Int16', name: 'anchorX' }, { type: 'Int16', name: 'anchorY' }, { type: 'Int16', name: 'rightJustifiedTextSymbolIndex' }, { type: 'Int16', name: 'centerJustifiedTextSymbolIndex' }, { type: 'Int16', name: 'leftJustifiedTextSymbolIndex' }, { type: 'Int16', name: 'verticalPlacedTextSymbolIndex' }, { type: 'Uint16', name: 'key' }, { type: 'Uint16', name: 'textBoxStartIndex' }, { type: 'Uint16', name: 'textBoxEndIndex' }, { type: 'Uint16', name: 'verticalTextBoxStartIndex' }, { type: 'Uint16', name: 'verticalTextBoxEndIndex' }, { type: 'Uint16', name: 'iconBoxStartIndex' }, { type: 'Uint16', name: 'iconBoxEndIndex' }, { type: 'Uint16', name: 'featureIndex' }, { type: 'Uint16', name: 'numHorizontalGlyphVertices' }, { type: 'Uint16', name: 'numVerticalGlyphVertices' }, { type: 'Uint16', name: 'numIconVertices' }, { type: 'Uint32', name: 'crossTileID' }, { type: 'Float32', name: 'textBoxScale'}, { type: 'Float32', name: 'radialTextOffset'} ]); var glyphOffset = createLayout([ { type: 'Float32', name: 'offsetX' } ]); var lineVertex = createLayout([ { type: 'Int16', name: 'x' }, { type: 'Int16', name: 'y' }, { type: 'Int16', name: 'tileUnitDistanceFromAnchor' } ]); // function transformText(text , layer , feature ) { var transform = layer.layout.get('text-transform').evaluate(feature, {}); if (transform === 'uppercase') { text = text.toLocaleUpperCase(); } else if (transform === 'lowercase') { text = text.toLocaleLowerCase(); } if (plugin.applyArabicShaping) { text = plugin.applyArabicShaping(text); } return text; } function transformText$1(text , layer , feature ) { text.sections.forEach(function (section) { section.text = transformText(section.text, layer, feature); }); return text; } // function mergeLines (features ) { var leftIndex = {}; var rightIndex = {}; var mergedFeatures = []; var mergedIndex = 0; function add(k) { mergedFeatures.push(features[k]); mergedIndex++; } function mergeFromRight(leftKey , rightKey , geom) { var i = rightIndex[leftKey]; delete rightIndex[leftKey]; rightIndex[rightKey] = i; mergedFeatures[i].geometry[0].pop(); mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]); return i; } function mergeFromLeft(leftKey , rightKey , geom) { var i = leftIndex[rightKey]; delete leftIndex[rightKey]; leftIndex[leftKey] = i; mergedFeatures[i].geometry[0].shift(); mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]); return i; } function getKey(text, geom, onRight) { var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; return (text + ":" + (point.x) + ":" + (point.y)); } for (var k = 0; k < features.length; k++) { var feature = features[k]; var geom = feature.geometry; var text = feature.text ? feature.text.toString() : null; if (!text) { add(k); continue; } var leftKey = getKey(text, geom), rightKey = getKey(text, geom, true); if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { // found lines with the same text adjacent to both ends of the current line, merge all three var j = mergeFromLeft(leftKey, rightKey, geom); var i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry); delete leftIndex[leftKey]; delete rightIndex[rightKey]; rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i; mergedFeatures[j].geometry = (null ); } else if (leftKey in rightIndex) { // found mergeable line adjacent to the start of the current line, merge mergeFromRight(leftKey, rightKey, geom); } else if (rightKey in leftIndex) { // found mergeable line adjacent to the end of the current line, merge mergeFromLeft(leftKey, rightKey, geom); } else { // no adjacent lines, add as a new item add(k); leftIndex[leftKey] = mergedIndex - 1; rightIndex[rightKey] = mergedIndex - 1; } } return mergedFeatures.filter(function (f) { return f.geometry; }); } // var verticalizedCharacterMap = { '!': '︕', '#': '#', '$': '$', '%': '%', '&': '&', '(': '︵', ')': '︶', '*': '*', '+': '+', ',': '︐', '-': '︲', '.': '・', '/': '/', ':': '︓', ';': '︔', '<': '︿', '=': '=', '>': '﹀', '?': '︖', '@': '@', '[': '﹇', '\\': '\', ']': '﹈', '^': '^', '_': '︳', '`': '`', '{': '︷', '|': '―', '}': '︸', '~': '~', '¢': '¢', '£': '£', '¥': '¥', '¦': '¦', '¬': '¬', '¯': ' ̄', '–': '︲', '—': '︱', '‘': '﹃', '’': '﹄', '“': '﹁', '”': '﹂', '…': '︙', '‧': '・', '₩': '₩', '、': '︑', '。': '︒', '〈': '︿', '〉': '﹀', '《': '︽', '》': '︾', '「': '﹁', '」': '﹂', '『': '﹃', '』': '﹄', '【': '︻', '】': '︼', '〔': '︹', '〕': '︺', '〖': '︗', '〗': '︘', '!': '︕', '(': '︵', ')': '︶', ',': '︐', '-': '︲', '.': '・', ':': '︓', ';': '︔', '<': '︿', '>': '﹀', '?': '︖', '[': '﹇', ']': '﹈', '_': '︳', '{': '︷', '|': '―', '}': '︸', '⦅': '︵', '⦆': '︶', '。': '︒', '「': '﹁', '」': '﹂' }; function verticalizePunctuation(input ) { var output = ''; for (var i = 0; i < input.length; i++) { var nextCharCode = input.charCodeAt(i + 1) || null; var prevCharCode = input.charCodeAt(i - 1) || null; var canReplacePunctuation = ( (!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) && (!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]]) ); if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) { output += verticalizedCharacterMap[input[i]]; } else { output += input[i]; } } return output; } // // ONE_EM constant used to go between "em" units used in style spec and "points" used internally for layout var ONE_EM = 24; // var WritingMode = { horizontal: 1, vertical: 2, horizontalOnly: 3 }; // The position of a glyph relative to the text's anchor point. // A collection of positioned glyphs and some metadata var TaggedString = function TaggedString() { this.text = ""; this.sectionIndex = []; this.sections = []; }; TaggedString.fromFeature = function fromFeature (text , defaultFontStack ) { var result = new TaggedString(); for (var i = 0; i < text.sections.length; i++) { var section = text.sections[i]; result.sections.push({ scale: section.scale || 1, fontStack: section.fontStack || defaultFontStack }); result.text += section.text; for (var j = 0; j < section.text.length; j++) { result.sectionIndex.push(i); } } return result; }; TaggedString.prototype.length = function length () { return this.text.length; }; TaggedString.prototype.getSection = function getSection (index ) { return this.sections[this.sectionIndex[index]]; }; TaggedString.prototype.getSectionIndex = function getSectionIndex (index ) { return this.sectionIndex[index]; }; TaggedString.prototype.getCharCode = function getCharCode (index ) { return this.text.charCodeAt(index); }; TaggedString.prototype.verticalizePunctuation = function verticalizePunctuation$1 () { this.text = verticalizePunctuation(this.text); }; TaggedString.prototype.trim = function trim () { var beginningWhitespace = 0; for (var i = 0; i < this.text.length && whitespace[this.text.charCodeAt(i)]; i++) { beginningWhitespace++; } var trailingWhitespace = this.text.length; for (var i$1 = this.text.length - 1; i$1 >= 0 && i$1 >= beginningWhitespace && whitespace[this.text.charCodeAt(i$1)]; i$1--) { trailingWhitespace--; } this.text = this.text.substring(beginningWhitespace, trailingWhitespace); this.sectionIndex = this.sectionIndex.slice(beginningWhitespace, trailingWhitespace); }; TaggedString.prototype.substring = function substring (start , end ) { var substring = new TaggedString(); substring.text = this.text.substring(start, end); substring.sectionIndex = this.sectionIndex.slice(start, end); substring.sections = this.sections; return substring; }; TaggedString.prototype.toString = function toString () { return this.text; }; TaggedString.prototype.getMaxScale = function getMaxScale () { var this$1 = this; return this.sectionIndex.reduce(function (max, index) { return Math.max(max, this$1.sections[index].scale); }, 0); }; function breakLines(input , lineBreakPoints ) { var lines = []; var text = input.text; var start = 0; for (var i = 0, list = lineBreakPoints; i < list.length; i += 1) { var lineBreak = list[i]; lines.push(input.substring(start, lineBreak)); start = lineBreak; } if (start < text.length) { lines.push(input.substring(start, text.length)); } return lines; } function shapeText(text , glyphs , defaultFontStack , maxWidth , lineHeight , textAnchor , textJustify , spacing , translate , writingMode , allowVerticalPlacement ) { var logicalInput = TaggedString.fromFeature(text, defaultFontStack); if (writingMode === WritingMode.vertical) { logicalInput.verticalizePunctuation(); } var lines ; var processBidirectionalText = plugin.processBidirectionalText; var processStyledBidirectionalText = plugin.processStyledBidirectionalText; if (processBidirectionalText && logicalInput.sections.length === 1) { // Bidi doesn't have to be style-aware lines = []; var untaggedLines = processBidirectionalText(logicalInput.toString(), determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); for (var i$1 = 0, list = untaggedLines; i$1 < list.length; i$1 += 1) { var line = list[i$1]; var taggedLine = new TaggedString(); taggedLine.text = line; taggedLine.sections = logicalInput.sections; for (var i = 0; i < line.length; i++) { taggedLine.sectionIndex.push(0); } lines.push(taggedLine); } } else if (processStyledBidirectionalText) { // Need version of mapbox-gl-rtl-text with style support for combining RTL text // with formatting lines = []; var processedLines = processStyledBidirectionalText(logicalInput.text, logicalInput.sectionIndex, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); for (var i$2 = 0, list$1 = processedLines; i$2 < list$1.length; i$2 += 1) { var line$1 = list$1[i$2]; var taggedLine$1 = new TaggedString(); taggedLine$1.text = line$1[0]; taggedLine$1.sectionIndex = line$1[1]; taggedLine$1.sections = logicalInput.sections; lines.push(taggedLine$1); } } else { lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); } var positionedGlyphs = []; var shaping = { positionedGlyphs: positionedGlyphs, text: logicalInput.toString(), top: translate[1], bottom: translate[1], left: translate[0], right: translate[0], writingMode: writingMode, lineCount: lines.length, yOffset: -17 // the y offset *should* be part of the font metadata }; shapeLines(shaping, glyphs, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement); if (!positionedGlyphs.length) { return false; } return shaping; } // using computed properties due to https://github.com/facebook/flow/issues/380 /* eslint no-useless-computed-key: 0 */ var whitespace = {}; whitespace[0x09] = true; whitespace[0x0a] = true; whitespace[0x0b] = true; whitespace[0x0c] = true; whitespace[0x0d] = true; whitespace[0x20] = true; var breakable = {}; breakable[0x0a] = true; breakable[0x20] = true; breakable[0x26] = true; breakable[0x28] = true; breakable[0x29] = true; breakable[0x2b] = true; breakable[0x2d] = true; breakable[0x2f] = true; breakable[0xad] = true; breakable[0xb7] = true; breakable[0x200b] = true; breakable[0x2010] = true; breakable[0x2013] = true; breakable[0x2027] = true; function determineAverageLineWidth(logicalInput , spacing , maxWidth , glyphMap ) { var totalWidth = 0; for (var index = 0; index < logicalInput.length(); index++) { var section = logicalInput.getSection(index); var positions = glyphMap[section.fontStack]; var glyph = positions && positions[logicalInput.getCharCode(index)]; if (!glyph) { continue; } totalWidth += glyph.metrics.advance * section.scale + spacing; } var lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth)); return totalWidth / lineCount; } function calculateBadness(lineWidth , targetWidth , penalty , isLastBreak ) { var raggedness = Math.pow(lineWidth - targetWidth, 2); if (isLastBreak) { // Favor finals lines shorter than average over longer than average if (lineWidth < targetWidth) { return raggedness / 2; } else { return raggedness * 2; } } return raggedness + Math.abs(penalty) * penalty; } function calculatePenalty(codePoint , nextCodePoint , penalizableIdeographicBreak ) { var penalty = 0; // Force break on newline if (codePoint === 0x0a) { penalty -= 10000; } // Penalize breaks between characters that allow ideographic breaking because // they are less preferable than breaks at spaces (or zero width spaces). if (penalizableIdeographicBreak) { penalty += 150; } // Penalize open parenthesis at end of line if (codePoint === 0x28 || codePoint === 0xff08) { penalty += 50; } // Penalize close parenthesis at beginning of line if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) { penalty += 50; } return penalty; } function evaluateBreak(breakIndex , breakX , targetWidth , potentialBreaks , penalty , isLastBreak ) { // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth // ...but in fact we allow lines longer than maxWidth (if there's no break points) // ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give // more lopsided results. var bestPriorBreak = null; var bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak); for (var i = 0, list = potentialBreaks; i < list.length; i += 1) { var potentialBreak = list[i]; var lineWidth = breakX - potentialBreak.x; var breakBadness = calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness; if (breakBadness <= bestBreakBadness) { bestPriorBreak = potentialBreak; bestBreakBadness = breakBadness; } } return { index: breakIndex, x: breakX, priorBreak: bestPriorBreak, badness: bestBreakBadness }; } function leastBadBreaks(lastLineBreak ) { if (!lastLineBreak) { return []; } return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index); } function determineLineBreaks(logicalInput , spacing , maxWidth , glyphMap ) { if (!maxWidth) { return []; } if (!logicalInput) { return []; } var potentialLineBreaks = []; var targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap); var hasServerSuggestedBreakpoints = logicalInput.text.indexOf("\u200b") >= 0; var currentX = 0; for (var i = 0; i < logicalInput.length(); i++) { var section = logicalInput.getSection(i); var codePoint = logicalInput.getCharCode(i); var positions = glyphMap[section.fontStack]; var glyph = positions && positions[codePoint]; if (glyph && !whitespace[codePoint]) { currentX += glyph.metrics.advance * section.scale + spacing; } // Ideographic characters, spaces, and word-breaking punctuation that often appear without // surrounding spaces. if ((i < logicalInput.length() - 1)) { var ideographicBreak = charAllowsIdeographicBreaking(codePoint); if (breakable[codePoint] || ideographicBreak) { potentialLineBreaks.push( evaluateBreak( i + 1, currentX, targetWidth, potentialLineBreaks, calculatePenalty(codePoint, logicalInput.getCharCode(i + 1), ideographicBreak && hasServerSuggestedBreakpoints), false)); } } } return leastBadBreaks( evaluateBreak( logicalInput.length(), currentX, targetWidth, potentialLineBreaks, 0, true)); } function getAnchorAlignment(anchor ) { var horizontalAlign = 0.5, verticalAlign = 0.5; switch (anchor) { case 'right': case 'top-right': case 'bottom-right': horizontalAlign = 1; break; case 'left': case 'top-left': case 'bottom-left': horizontalAlign = 0; break; } switch (anchor) { case 'bottom': case 'bottom-right': case 'bottom-left': verticalAlign = 1; break; case 'top': case 'top-right': case 'top-left': verticalAlign = 0; break; } return { horizontalAlign: horizontalAlign, verticalAlign: verticalAlign }; } function shapeLines(shaping , glyphMap , lines , lineHeight , textAnchor , textJustify , writingMode , spacing , allowVerticalPlacement ) { var x = 0; var y = shaping.yOffset; var maxLineLength = 0; var positionedGlyphs = shaping.positionedGlyphs; var justify = textJustify === 'right' ? 1 : textJustify === 'left' ? 0 : 0.5; for (var i$1 = 0, list = lines; i$1 < list.length; i$1 += 1) { var line = list[i$1]; line.trim(); var lineMaxScale = line.getMaxScale(); if (!line.length()) { y += lineHeight; // Still need a line feed after empty line continue; } var lineStartIndex = positionedGlyphs.length; for (var i = 0; i < line.length(); i++) { var section = line.getSection(i); var sectionIndex = line.getSectionIndex(i); var codePoint = line.getCharCode(i); // We don't know the baseline, but since we're laying out // at 24 points, we can calculate how much it will move when // we scale up or down. var baselineOffset = (lineMaxScale - section.scale) * 24; var positions = glyphMap[section.fontStack]; var glyph = positions && positions[codePoint]; if (!glyph) { continue; } if (writingMode === WritingMode.horizontal || // Don't verticalize glyphs that have no upright orientation if vertical placement is disabled. (!allowVerticalPlacement && !charHasUprightVerticalOrientation(codePoint)) || // If vertical placement is ebabled, don't verticalize glyphs that // are from complex text layout script, or whitespaces. (allowVerticalPlacement && (whitespace[codePoint] || charInComplexShapingScript(codePoint)))) { positionedGlyphs.push({glyph: codePoint, x: x, y: y + baselineOffset, vertical: false, scale: section.scale, fontStack: section.fontStack, sectionIndex: sectionIndex}); x += glyph.metrics.advance * section.scale + spacing; } else { positionedGlyphs.push({glyph: codePoint, x: x, y: y + baselineOffset, vertical: true, scale: section.scale, fontStack: section.fontStack, sectionIndex: sectionIndex}); x += ONE_EM * section.scale + spacing; } } // Only justify if we placed at least one glyph if (positionedGlyphs.length !== lineStartIndex) { var lineLength = x - spacing; maxLineLength = Math.max(lineLength, maxLineLength); justifyLine(positionedGlyphs, glyphMap, lineStartIndex, positionedGlyphs.length - 1, justify); } x = 0; y += lineHeight * lineMaxScale; } var ref = getAnchorAlignment(textAnchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; align$1(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, lines.length); // Calculate the bounding box var height = y - shaping.yOffset; shaping.top += -verticalAlign * height; shaping.bottom = shaping.top + height; shaping.left += -horizontalAlign * maxLineLength; shaping.right = shaping.left + maxLineLength; } // justify right = 1, left = 0, center = 0.5 function justifyLine(positionedGlyphs , glyphMap , start , end , justify ) { if (!justify) { return; } var lastPositionedGlyph = positionedGlyphs[end]; var positions = glyphMap[lastPositionedGlyph.fontStack]; var glyph = positions && positions[lastPositionedGlyph.glyph]; if (glyph) { var lastAdvance = glyph.metrics.advance * lastPositionedGlyph.scale; var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; for (var j = start; j <= end; j++) { positionedGlyphs[j].x -= lineIndent; } } } function align$1(positionedGlyphs , justify , horizontalAlign , verticalAlign , maxLineLength , lineHeight , lineCount ) { var shiftX = (justify - horizontalAlign) * maxLineLength; var shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight; for (var j = 0; j < positionedGlyphs.length; j++) { positionedGlyphs[j].x += shiftX; positionedGlyphs[j].y += shiftY; } } function shapeIcon(image , iconOffset , iconAnchor ) { var ref = getAnchorAlignment(iconAnchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var dx = iconOffset[0]; var dy = iconOffset[1]; var x1 = dx - image.displaySize[0] * horizontalAlign; var x2 = x1 + image.displaySize[0]; var y1 = dy - image.displaySize[1] * verticalAlign; var y2 = y1 + image.displaySize[1]; return {image: image, top: y1, bottom: y2, left: x1, right: x2}; } // var Anchor = /*@__PURE__*/(function (Point) { function Anchor(x , y , angle , segment ) { Point.call(this, x, y); this.angle = angle; if (segment !== undefined) { this.segment = segment; } } if ( Point ) Anchor.__proto__ = Point; Anchor.prototype = Object.create( Point && Point.prototype ); Anchor.prototype.constructor = Anchor; Anchor.prototype.clone = function clone () { return new Anchor(this.x, this.y, this.angle, this.segment); }; return Anchor; }(pointGeometry)); register('Anchor', Anchor); // var SIZE_PACK_FACTOR = 256; // For {text,icon}-size, get the bucket-level data that will be needed by // the painter to set symbol-size-related uniforms function getSizeData(tileZoom , value ) { var expression = value.expression; if (expression.kind === 'constant') { var layoutSize = expression.evaluate(new EvaluationParameters(tileZoom + 1)); return {kind: 'constant', layoutSize: layoutSize}; } else if (expression.kind === 'source') { return {kind: 'source'}; } else { var zoomStops = expression.zoomStops; var interpolationType = expression.interpolationType; // calculate covering zoom stops for zoom-dependent values var lower = 0; while (lower < zoomStops.length && zoomStops[lower] <= tileZoom) { lower++; } lower = Math.max(0, lower - 1); var upper = lower; while (upper < zoomStops.length && zoomStops[upper] < tileZoom + 1) { upper++; } upper = Math.min(zoomStops.length - 1, upper); var minZoom = zoomStops[lower]; var maxZoom = zoomStops[upper]; // We'd like to be able to use CameraExpression or CompositeExpression in these // return types rather than ExpressionSpecification, but the former are not // transferrable across Web Worker boundaries. if (expression.kind === 'composite') { return {kind: 'composite', minZoom: minZoom, maxZoom: maxZoom, interpolationType: interpolationType}; } // for camera functions, also save off the function values // evaluated at the covering zoom levels var minSize = expression.evaluate(new EvaluationParameters(minZoom)); var maxSize = expression.evaluate(new EvaluationParameters(maxZoom)); return {kind: 'camera', minZoom: minZoom, maxZoom: maxZoom, minSize: minSize, maxSize: maxSize, interpolationType: interpolationType}; } } function evaluateSizeForFeature(sizeData , ref , ref$1 ) { var uSize = ref.uSize; var uSizeT = ref.uSizeT; var lowerSize = ref$1.lowerSize; var upperSize = ref$1.upperSize; if (sizeData.kind === 'source') { return lowerSize / SIZE_PACK_FACTOR; } else if (sizeData.kind === 'composite') { return number(lowerSize / SIZE_PACK_FACTOR, upperSize / SIZE_PACK_FACTOR, uSizeT); } return uSize; } function evaluateSizeForZoom(sizeData , zoom ) { var uSizeT = 0; var uSize = 0; if (sizeData.kind === 'constant') { uSize = sizeData.layoutSize; } else if (sizeData.kind !== 'source') { var interpolationType = sizeData.interpolationType; var minZoom = sizeData.minZoom; var maxZoom = sizeData.maxZoom; // Even though we could get the exact value of the camera function // at z = tr.zoom, we intentionally do not: instead, we interpolate // between the camera function values at a pair of zoom stops covering // [tileZoom, tileZoom + 1] in order to be consistent with this // restriction on composite functions var t = !interpolationType ? 0 : clamp( Interpolate.interpolationFactor(interpolationType, zoom, minZoom, maxZoom), 0, 1); if (sizeData.kind === 'camera') { uSize = number(sizeData.minSize, sizeData.maxSize, t); } else { uSizeT = t; } } return {uSizeT: uSizeT, uSize: uSize}; } var symbolSize = /*#__PURE__*/Object.freeze({ getSizeData: getSizeData, evaluateSizeForFeature: evaluateSizeForFeature, evaluateSizeForZoom: evaluateSizeForZoom, SIZE_PACK_FACTOR: SIZE_PACK_FACTOR }); // var vectorTileFeatureTypes$2 = vectorTile.VectorTileFeature.types; // Opacity arrays are frequently updated but don't contain a lot of information, so we pack them // tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph // 7 bits are for the current opacity, and the lowest bit is the target opacity // actually defined in symbol_attributes.js // const placementOpacityAttributes = [ // { name: 'a_fade_opacity', components: 1, type: 'Uint32' } // ]; var shaderOpacityAttributes = [ { name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0 } ]; function addVertex$1(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex) { array.emplaceBack( // a_pos_offset anchorX, anchorY, Math.round(ox * 32), Math.round(oy * 32), // a_data tx, // x coordinate of symbol on glyph atlas texture ty, // y coordinate of symbol on glyph atlas texture sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0 ); } function addDynamicAttributes(dynamicLayoutVertexArray , p , angle ) { dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); } var SymbolBuffers = function SymbolBuffers(programConfigurations ) { this.layoutVertexArray = new StructArrayLayout4i4ui16(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = programConfigurations; this.segments = new SegmentVector(); this.dynamicLayoutVertexArray = new StructArrayLayout3f12(); this.opacityVertexArray = new StructArrayLayout1ul4(); this.placedSymbolArray = new PlacedSymbolArray(); }; SymbolBuffers.prototype.upload = function upload (context , dynamicIndexBuffer , upload$1 , update ) { if (upload$1) { 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$1 || update) { this.programConfigurations.upload(context); } }; SymbolBuffers.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); this.dynamicLayoutVertexBuffer.destroy(); this.opacityVertexBuffer.destroy(); }; register('SymbolBuffers', SymbolBuffers); var CollisionBuffers = function CollisionBuffers(LayoutArray , layoutAttributes , IndexArray ) { this.layoutVertexArray = new LayoutArray(); this.layoutAttributes = layoutAttributes; this.indexArray = new IndexArray(); this.segments = new SegmentVector(); this.collisionVertexArray = new StructArrayLayout2ub2f12(); }; CollisionBuffers.prototype.upload = function upload (context ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true); }; CollisionBuffers.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.segments.destroy(); this.collisionVertexBuffer.destroy(); }; register('CollisionBuffers', CollisionBuffers); /** * Unlike other buckets, which simply implement #addFeature with type-specific * logic for (essentially) triangulating feature geometries, SymbolBucket * requires specialized behavior: * * 1. WorkerTile#parse(), the logical owner of the bucket creation process, * calls SymbolBucket#populate(), which resolves text and icon tokens on * each feature, adds each glyphs and symbols needed to the passed-in * collections options.glyphDependencies and options.iconDependencies, and * stores the feature data for use in subsequent step (this.features). * * 2. WorkerTile asynchronously requests from the main thread all of the glyphs * and icons needed (by this bucket and any others). When glyphs and icons * have been received, the WorkerTile creates a CollisionIndex and invokes: * * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and * layout on a Symbol Bucket. This step populates: * `this.symbolInstances`: metadata on generated symbols * `this.collisionBoxArray`: collision data for use by foreground * `this.text`: SymbolBuffers for text symbols * `this.icons`: SymbolBuffers for icons * `this.collisionBox`: Debug SymbolBuffers for collision boxes * `this.collisionCircle`: Debug SymbolBuffers for collision circles * The results are sent to the foreground for rendering * * 4. performSymbolPlacement(bucket, collisionIndex) is run on the foreground, * and uses the CollisionIndex along with current camera settings to determine * which symbols can actually show on the map. Collided symbols are hidden * using a dynamic "OpacityVertexArray". * * @private */ var SymbolBucket = function SymbolBucket(options ) { this.collisionBoxArray = options.collisionBoxArray; this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.pixelRatio = options.pixelRatio; this.sourceLayerIndex = options.sourceLayerIndex; this.hasPattern = false; this.hasPaintOverrides = false; var layer = this.layers[0]; var unevaluatedLayoutValues = layer._unevaluatedLayout._values; this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']); this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']); var layout = this.layers[0].layout; var sortKey = layout.get('symbol-sort-key'); var zOrder = layout.get('symbol-z-order'); this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined; var zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey); this.sortFeaturesByY = zOrderByViewportY && (layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') || layout.get('text-ignore-placement') || layout.get('icon-ignore-placement')); if (layout.get('symbol-placement') === 'point') { this.writingModes = layout.get('text-writing-mode').map(function (wm) { return WritingMode[wm]; }); } this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); this.sourceID = options.sourceID; }; SymbolBucket.prototype.createArrays = function createArrays () { var layout = this.layers[0].layout; this.hasPaintOverrides = SymbolStyleLayer.hasPaintOverrides(layout); this.text = new SymbolBuffers(new ProgramConfigurationSet(symbolLayoutAttributes.members, this.layers, this.zoom, function (property) { return /^text/.test(property); })); this.icon = new SymbolBuffers(new ProgramConfigurationSet(symbolLayoutAttributes.members, this.layers, this.zoom, function (property) { return /^icon/.test(property); })); this.collisionBox = new CollisionBuffers(StructArrayLayout2i2i2i12, collisionBoxLayout.members, StructArrayLayout2ui4); this.collisionCircle = new CollisionBuffers(StructArrayLayout2i2i2i12, collisionCircleLayout.members, StructArrayLayout3ui6); this.glyphOffsetArray = new GlyphOffsetArray(); this.lineVertexArray = new SymbolLineVertexArray(); this.symbolInstances = new SymbolInstanceArray(); }; SymbolBucket.prototype.calculateGlyphDependencies = function calculateGlyphDependencies (text , stack , textAlongLine , allowVerticalPlacement , doesAllowVerticalWritingMode ) { for (var i = 0; i < text.length; i++) { stack[text.charCodeAt(i)] = true; if ((textAlongLine || allowVerticalPlacement) && doesAllowVerticalWritingMode) { var verticalChar = verticalizedCharacterMap[text.charAt(i)]; if (verticalChar) { stack[verticalChar.charCodeAt(0)] = true; } } } }; SymbolBucket.prototype.populate = function populate (features , options ) { var layer = this.layers[0]; var layout = layer.layout; var textFont = layout.get('text-font'); var textField = layout.get('text-field'); var iconImage = layout.get('icon-image'); var hasText = (textField.value.kind !== 'constant' || textField.value.value.toString().length > 0) && (textFont.value.kind !== 'constant' || textFont.value.value.length > 0); var hasIcon = iconImage.value.kind !== 'constant' || iconImage.value.value && iconImage.value.value.length > 0; var symbolSortKey = layout.get('symbol-sort-key'); this.features = []; if (!hasText && !hasIcon) { return; } var icons = options.iconDependencies; var stacks = options.glyphDependencies; var globalProperties = new EvaluationParameters(this.zoom); for (var i$1 = 0, list$1 = features; i$1 < list$1.length; i$1 += 1) { var ref = list$1[i$1]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!layer._featureFilter(globalProperties, feature)) { continue; } var text = (void 0) ; if (hasText) { // Expression evaluation will automatically coerce to Formatted // but plain string token evaluation skips that pathway so do the // conversion here. var resolvedTokens = layer.getValueAndResolveTokens('text-field', feature); text = transformText$1(resolvedTokens instanceof Formatted ? resolvedTokens : Formatted.fromString(resolvedTokens), layer, feature); } var icon = (void 0); if (hasIcon) { icon = layer.getValueAndResolveTokens('icon-image', feature); } if (!text && !icon) { continue; } var sortKey = this.sortFeaturesByKey ? symbolSortKey.evaluate(feature, {}) : undefined; var symbolFeature = { text: text, icon: icon, index: index, sourceLayerIndex: sourceLayerIndex, geometry: loadGeometry(feature), properties: feature.properties, type: vectorTileFeatureTypes$2[feature.type], sortKey: sortKey }; if (typeof feature.id !== 'undefined') { symbolFeature.id = feature.id; } this.features.push(symbolFeature); if (icon) { icons[icon] = true; } if (text) { var fontStack = textFont.evaluate(feature, {}).join(','); var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(WritingMode.vertical) >= 0; for (var i = 0, list = text.sections; i < list.length; i += 1) { var section = list[i]; var doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString()); var sectionFont = section.fontStack || fontStack; var sectionStack = stacks[sectionFont] = stacks[sectionFont] || {}; this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode); } } } 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); } if (this.sortFeaturesByKey) { this.features.sort(function (a, b) { // a.sortKey is always a number when sortFeaturesByKey is true return ((a.sortKey ) ) - ((b.sortKey ) ); }); } }; SymbolBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions); this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions); }; SymbolBucket.prototype.isEmpty = function isEmpty () { return this.symbolInstances.length === 0; }; SymbolBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload; }; SymbolBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.collisionBox.upload(context); this.collisionCircle.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; }; SymbolBucket.prototype.destroy = function destroy () { this.text.destroy(); this.icon.destroy(); this.collisionBox.destroy(); this.collisionCircle.destroy(); }; SymbolBucket.prototype.addToLineVertexArray = function addToLineVertexArray (anchor , line ) { var lineStartIndex = this.lineVertexArray.length; if (anchor.segment !== undefined) { var sumForwardLength = anchor.dist(line[anchor.segment + 1]); var sumBackwardLength = anchor.dist(line[anchor.segment]); var vertices = {}; for (var i = anchor.segment + 1; i < line.length; i++) { vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumForwardLength }; if (i < line.length - 1) { sumForwardLength += line[i + 1].dist(line[i]); } } for (var i$1 = anchor.segment || 0; i$1 >= 0; i$1--) { vertices[i$1] = { x: line[i$1].x, y: line[i$1].y, tileUnitDistanceFromAnchor: sumBackwardLength }; if (i$1 > 0) { sumBackwardLength += line[i$1 - 1].dist(line[i$1]); } } for (var i$2 = 0; i$2 < line.length; i$2++) { var vertex = vertices[i$2]; this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor); } } return { lineStartIndex: lineStartIndex, lineLength: this.lineVertexArray.length - lineStartIndex }; }; SymbolBucket.prototype.addSymbols = function addSymbols (arrays , quads , sizeVertex , lineOffset , alongLine , feature , writingMode , labelAnchor , lineStartIndex , lineLength ) { var this$1 = this; var indexArray = arrays.indexArray; var layoutVertexArray = arrays.layoutVertexArray; var dynamicLayoutVertexArray = arrays.dynamicLayoutVertexArray; var segment = arrays.segments.prepareSegment(4 * quads.length, arrays.layoutVertexArray, arrays.indexArray, feature.sortKey); var glyphOffsetArrayStart = this.glyphOffsetArray.length; var vertexStartIndex = segment.vertexLength; var angle = (this.allowVerticalPlacement && writingMode === WritingMode.vertical) ? Math.PI / 2 : 0; var addSymbol = function (symbol ) { var tl = symbol.tl, tr = symbol.tr, bl = symbol.bl, br = symbol.br, tex = symbol.tex; var index = segment.vertexLength; var y = symbol.glyphOffset[1]; addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex); addDynamicAttributes(dynamicLayoutVertexArray, labelAnchor, angle); indexArray.emplaceBack(index, index + 1, index + 2); indexArray.emplaceBack(index + 1, index + 2, index + 3); segment.vertexLength += 4; segment.primitiveLength += 2; this$1.glyphOffsetArray.emplaceBack(symbol.glyphOffset[0]); }; if (feature.text && feature.text.sections) { var sections = feature.text.sections; if (this.hasPaintOverrides) { var currentSectionIndex; var populatePaintArrayForSection = function (sectionIndex , lastSection ) { if (currentSectionIndex !== undefined && (currentSectionIndex !== sectionIndex || lastSection)) { arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature, feature.index, {}, sections[currentSectionIndex]); } currentSectionIndex = sectionIndex; }; for (var i = 0, list = quads; i < list.length; i += 1) { var symbol = list[i]; populatePaintArrayForSection(symbol.sectionIndex, false); addSymbol(symbol); } // Populate paint arrays for the last section. populatePaintArrayForSection(currentSectionIndex, true); } else { for (var i$1 = 0, list$1 = quads; i$1 < list$1.length; i$1 += 1) { var symbol$1 = list$1[i$1]; addSymbol(symbol$1); } arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature, feature.index, {}, sections[0]); } } else { for (var i$2 = 0, list$2 = quads; i$2 < list$2.length; i$2 += 1) { var symbol$2 = list$2[i$2]; addSymbol(symbol$2); } arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature, feature.index, {}); } arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y, glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, lineStartIndex, lineLength, (labelAnchor.segment ), sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, lineOffset[0], lineOffset[1], writingMode, // 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); }; SymbolBucket.prototype._addCollisionDebugVertex = function _addCollisionDebugVertex (layoutVertexArray , collisionVertexArray , point , anchorX , anchorY , extrude ) { collisionVertexArray.emplaceBack(0, 0); return layoutVertexArray.emplaceBack( // pos point.x, point.y, // a_anchor_pos anchorX, anchorY, // extrude Math.round(extrude.x), Math.round(extrude.y)); }; SymbolBucket.prototype.addCollisionDebugVertices = function addCollisionDebugVertices (x1 , y1 , x2 , y2 , arrays , boxAnchorPoint , symbolInstance , isCircle ) { var segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray); var index = segment.vertexLength; var layoutVertexArray = arrays.layoutVertexArray; var collisionVertexArray = arrays.collisionVertexArray; var anchorX = symbolInstance.anchorX; var anchorY = symbolInstance.anchorY; this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y1)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y1)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y2)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y2)); segment.vertexLength += 4; if (isCircle) { var indexArray = (arrays.indexArray ); indexArray.emplaceBack(index, index + 1, index + 2); indexArray.emplaceBack(index, index + 2, index + 3); segment.primitiveLength += 2; } else { var indexArray$1 = (arrays.indexArray ); indexArray$1.emplaceBack(index, index + 1); indexArray$1.emplaceBack(index + 1, index + 2); indexArray$1.emplaceBack(index + 2, index + 3); indexArray$1.emplaceBack(index + 3, index); segment.primitiveLength += 4; } }; SymbolBucket.prototype.addDebugCollisionBoxes = function addDebugCollisionBoxes (startIndex , endIndex , symbolInstance ) { for (var b = startIndex; b < endIndex; b++) { var box = (this.collisionBoxArray.get(b) ); var x1 = box.x1; var y1 = box.y1; var x2 = box.x2; var y2 = box.y2; // If the radius > 0, this collision box is actually a circle // The data we add to the buffers is exactly the same, but we'll render with a different shader. var isCircle = box.radius > 0; this.addCollisionDebugVertices(x1, y1, x2, y2, isCircle ? this.collisionCircle : this.collisionBox, box.anchorPoint, symbolInstance, isCircle); } }; SymbolBucket.prototype.generateCollisionDebugBuffers = function generateCollisionDebugBuffers () { for (var i = 0; i < this.symbolInstances.length; i++) { var symbolInstance = this.symbolInstances.get(i); this.addDebugCollisionBoxes(symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance); this.addDebugCollisionBoxes(symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance); this.addDebugCollisionBoxes(symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance); } }; // These flat arrays are meant to be quicker to iterate over than the source // CollisionBoxArray SymbolBucket.prototype._deserializeCollisionBoxesForSymbol = function _deserializeCollisionBoxesForSymbol (collisionBoxArray , textStartIndex , textEndIndex , verticalTextStartIndex , verticalTextEndIndex , iconStartIndex , iconEndIndex ) { var collisionArrays = {}; for (var k = textStartIndex; k < textEndIndex; k++) { var box = (collisionBoxArray.get(k) ); if (box.radius === 0) { collisionArrays.textBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY }; collisionArrays.textFeatureIndex = box.featureIndex; break; // Only one box allowed per instance } else { if (!collisionArrays.textCircles) { collisionArrays.textCircles = []; collisionArrays.textFeatureIndex = box.featureIndex; } var used = 1; // May be updated at collision detection time collisionArrays.textCircles.push(box.anchorPointX, box.anchorPointY, box.radius, box.signedDistanceFromAnchor, used); } } for (var k$1 = verticalTextStartIndex; k$1 < verticalTextEndIndex; k$1++) { var box$1 = (collisionBoxArray.get(k$1) ); if (box$1.radius === 0) { collisionArrays.verticalTextBox = { x1: box$1.x1, y1: box$1.y1, x2: box$1.x2, y2: box$1.y2, anchorPointX: box$1.anchorPointX, anchorPointY: box$1.anchorPointY }; collisionArrays.verticalTextFeatureIndex = box$1.featureIndex; break; // Only one box allowed per instance } } for (var k$2 = iconStartIndex; k$2 < iconEndIndex; k$2++) { // An icon can only have one box now, so this indexing is a bit vestigial... var box$2 = (collisionBoxArray.get(k$2) ); if (box$2.radius === 0) { collisionArrays.iconBox = { x1: box$2.x1, y1: box$2.y1, x2: box$2.x2, y2: box$2.y2, anchorPointX: box$2.anchorPointX, anchorPointY: box$2.anchorPointY }; collisionArrays.iconFeatureIndex = box$2.featureIndex; break; // Only one box allowed per instance } } return collisionArrays; }; SymbolBucket.prototype.deserializeCollisionBoxes = function deserializeCollisionBoxes (collisionBoxArray ) { this.collisionArrays = []; for (var i = 0; i < this.symbolInstances.length; i++) { var symbolInstance = this.symbolInstances.get(i); this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol( collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex )); } }; SymbolBucket.prototype.hasTextData = function hasTextData () { return this.text.segments.get().length > 0; }; SymbolBucket.prototype.hasIconData = function hasIconData () { return this.icon.segments.get().length > 0; }; SymbolBucket.prototype.hasCollisionBoxData = function hasCollisionBoxData () { return this.collisionBox.segments.get().length > 0; }; SymbolBucket.prototype.hasCollisionCircleData = function hasCollisionCircleData () { return this.collisionCircle.segments.get().length > 0; }; SymbolBucket.prototype.addIndicesForPlacedTextSymbol = function addIndicesForPlacedTextSymbol (placedTextSymbolIndex ) { var placedSymbol = this.text.placedSymbolArray.get(placedTextSymbolIndex); var endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4; for (var vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) { this.text.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); this.text.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); } }; SymbolBucket.prototype.getSortedSymbolIndexes = function getSortedSymbolIndexes (angle ) { if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) { return this.symbolInstanceIndexes; } var sin = Math.sin(angle); var cos = Math.cos(angle); var rotatedYs = []; var featureIndexes = []; var result = []; for (var i = 0; i < this.symbolInstances.length; ++i) { result.push(i); var symbolInstance = this.symbolInstances.get(i); rotatedYs.push(Math.round(sin * symbolInstance.anchorX + cos * symbolInstance.anchorY) | 0); featureIndexes.push(symbolInstance.featureIndex); } result.sort(function (aIndex, bIndex) { return (rotatedYs[aIndex] - rotatedYs[bIndex]) || (featureIndexes[bIndex] - featureIndexes[aIndex]); }); return result; }; SymbolBucket.prototype.sortFeatures = function sortFeatures (angle ) { var this$1 = this; 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 (var i$1 = 0, list = this.symbolInstanceIndexes; i$1 < list.length; i$1 += 1) { var i = list[i$1]; var symbolInstance = this.symbolInstances.get(i); this.featureSortOrder.push(symbolInstance.featureIndex); [ symbolInstance.rightJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.leftJustifiedTextSymbolIndex ].forEach(function (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$1.addIndicesForPlacedTextSymbol(index); } }); if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { this.addIndicesForPlacedTextSymbol(symbolInstance.verticalPlacedTextSymbolIndex); } var placedIcon = this.icon.placedSymbolArray.get(i); if (placedIcon.numGlyphs) { var vertexIndex = placedIcon.vertexStartIndex; this.icon.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); this.icon.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); } } if (this.text.indexBuffer) { this.text.indexBuffer.updateData(this.text.indexArray); } if (this.icon.indexBuffer) { this.icon.indexBuffer.updateData(this.icon.indexArray); } }; register('SymbolBucket', SymbolBucket, { omit: ['layers', 'collisionBoxArray', 'features', 'compareText'] }); // this constant is based on the size of StructArray indexes used in a symbol // bucket--namely, glyphOffsetArrayStart // eg the max valid UInt16 is 65,535 // See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation // lineStartIndex and textBoxStartIndex could potentially be concerns // but we expect there to be many fewer boxes/lines than glyphs SymbolBucket.MAX_GLYPHS = 65535; SymbolBucket.addDynamicAttributes = addDynamicAttributes; // /** * Replace tokens in a string template with values in an object * * @param properties a key/value relationship between tokens and replacements * @param text the template string * @returns the template with tokens replaced * @private */ function resolveTokens(properties , text ) { return text.replace(/{([^{}]+)}/g, function (match, key ) { return key in properties ? String(properties[key]) : ''; }); } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$7 = 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 DataConstantProperty(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"]), }); var paint$7 = 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: function (o) { return o.textColor; }, hasOverride: function (o) { return !!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"]), }); // 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$7, layout: layout$7 } ); // var FormatSectionOverride = function FormatSectionOverride(defaultValue ) { assert_1(defaultValue.property.overrides !== undefined); this.type = defaultValue.property.overrides ? defaultValue.property.overrides.runtimeType : NullType; this.defaultValue = defaultValue; }; FormatSectionOverride.prototype.evaluate = function evaluate (ctx ) { if (ctx.formattedSection) { var 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; }; FormatSectionOverride.prototype.eachChild = function eachChild (fn ) { if (!this.defaultValue.isConstant()) { var expr = ((this.defaultValue.value) ); fn(expr._styleExpression.expression); } }; // Cannot be statically evaluated, as the output depends on the evaluation context. FormatSectionOverride.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; FormatSectionOverride.prototype.serialize = function serialize () { return null; }; register('FormatSectionOverride', FormatSectionOverride, {omit: ['defaultValue']}); // var SymbolStyleLayer = /*@__PURE__*/(function (StyleLayer) { function SymbolStyleLayer(layer ) { StyleLayer.call(this, layer, properties$6); } if ( StyleLayer ) SymbolStyleLayer.__proto__ = StyleLayer; SymbolStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); SymbolStyleLayer.prototype.constructor = SymbolStyleLayer; SymbolStyleLayer.prototype.recalculate = function recalculate (parameters ) { StyleLayer.prototype.recalculate.call(this, parameters); if (this.layout.get('icon-rotation-alignment') === 'auto') { if (this.layout.get('symbol-placement') !== 'point') { this.layout._values['icon-rotation-alignment'] = 'map'; } else { this.layout._values['icon-rotation-alignment'] = 'viewport'; } } if (this.layout.get('text-rotation-alignment') === 'auto') { if (this.layout.get('symbol-placement') !== 'point') { this.layout._values['text-rotation-alignment'] = 'map'; } else { this.layout._values['text-rotation-alignment'] = 'viewport'; } } // If unspecified, `*-pitch-alignment` inherits `*-rotation-alignment` if (this.layout.get('text-pitch-alignment') === 'auto') { this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment'); } if (this.layout.get('icon-pitch-alignment') === 'auto') { this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment'); } if (this.layout.get('symbol-placement') === 'point') { var writingModes = this.layout.get('text-writing-mode'); if (writingModes) { // remove duplicates, preserving order var deduped = []; for (var i = 0, list = writingModes; i < list.length; i += 1) { var m = list[i]; if (deduped.indexOf(m) < 0) { deduped.push(m); } } this.layout._values['text-writing-mode'] = deduped; } else { this.layout._values['text-writing-mode'] = ['horizontal']; } } this._setPaintOverrides(); }; SymbolStyleLayer.prototype.getValueAndResolveTokens = function getValueAndResolveTokens (name , feature ) { var value = this.layout.get(name).evaluate(feature, {}); var unevaluated = this._unevaluatedLayout._values[name]; if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value)) { return resolveTokens(feature.properties, value); } return value; }; SymbolStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new SymbolBucket(parameters); }; SymbolStyleLayer.prototype.queryRadius = function queryRadius () { return 0; }; SymbolStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature () { assert_1(false); // Should take a different path in FeatureIndex return false; }; SymbolStyleLayer.prototype._setPaintOverrides = function _setPaintOverrides () { for (var i = 0, list = properties$6.paint.overridableProperties; i < list.length; i += 1) { var overridable = list[i]; if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) { continue; } var overriden = this.paint.get(overridable); var override = new FormatSectionOverride(overriden); var styleExpression = new StyleExpression(override, overriden.property.specification); var 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); } }; SymbolStyleLayer.prototype._handleOverridablePaintPropertyUpdate = function _handleOverridablePaintPropertyUpdate (name , oldValue , newValue ) { if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) { return false; } return SymbolStyleLayer.hasPaintOverride(this.layout, name); }; SymbolStyleLayer.hasPaintOverride = function hasPaintOverride (layout , propertyName ) { var textField = layout.get('text-field'); var property = properties$6.paint.properties[propertyName]; var hasOverrides = false; var checkSections = function (sections) { for (var i = 0, list = sections; i < list.length; i += 1) { var section = list[i]; 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') { var checkExpression = function (expression ) { if (hasOverrides) { return; } if (expression instanceof Literal && typeOf(expression.value) === FormattedType) { var formatted = ((expression.value) ); checkSections(formatted.sections); } else if (expression instanceof FormatExpression) { checkSections(expression.sections); } else { expression.eachChild(checkExpression); } }; var expr = ((textField.value) ); if (expr._styleExpression) { checkExpression(expr._styleExpression.expression); } } return hasOverrides; }; SymbolStyleLayer.hasPaintOverrides = function hasPaintOverrides (layout ) { for (var i = 0, list = properties$6.paint.overridableProperties; i < list.length; i += 1) { var overridable = list[i]; if (SymbolStyleLayer.hasPaintOverride(layout, overridable)) { return true; } } return false; }; return SymbolStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$8 = 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"]), }); // 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$8 } ); // var BackgroundStyleLayer = /*@__PURE__*/(function (StyleLayer) { function BackgroundStyleLayer(layer ) { StyleLayer.call(this, layer, properties$7); } if ( StyleLayer ) BackgroundStyleLayer.__proto__ = StyleLayer; BackgroundStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); BackgroundStyleLayer.prototype.constructor = BackgroundStyleLayer; return BackgroundStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$9 = 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$9 } ); // var RasterStyleLayer = /*@__PURE__*/(function (StyleLayer) { function RasterStyleLayer(layer ) { StyleLayer.call(this, layer, properties$8); } if ( StyleLayer ) RasterStyleLayer.__proto__ = StyleLayer; RasterStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); RasterStyleLayer.prototype.constructor = RasterStyleLayer; return RasterStyleLayer; }(StyleLayer)); // /** * 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', function() { * map.addLayer(new NullIslandLayer()); * }); */ /** * 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}.fromLatLng * 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}.fromLatLng * can be used to project a `LngLat` to a mercator coordinate. */ function validateCustomStyleLayer(layerObject ) { var errors = []; var id = layerObject.id; if (id === undefined) { errors.push({ message: ("layers." + id + ": missing required property \"id\"") }); } if (layerObject.render === undefined) { errors.push({ message: ("layers." + id + ": missing required method \"render\"") }); } if (layerObject.renderingMode && layerObject.renderingMode !== '2d' && layerObject.renderingMode !== '3d') { errors.push({ message: ("layers." + id + ": property \"renderingMode\" must be either \"2d\" or \"3d\"") }); } return errors; } var CustomStyleLayer = /*@__PURE__*/(function (StyleLayer) { function CustomStyleLayer(implementation ) { StyleLayer.call(this, implementation, {}); this.implementation = implementation; } if ( StyleLayer ) CustomStyleLayer.__proto__ = StyleLayer; CustomStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); CustomStyleLayer.prototype.constructor = CustomStyleLayer; CustomStyleLayer.prototype.is3D = function is3D () { return this.implementation.renderingMode === '3d'; }; CustomStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.implementation.prerender !== undefined; }; CustomStyleLayer.prototype.recalculate = function recalculate () {}; CustomStyleLayer.prototype.updateTransitions = function updateTransitions () {}; CustomStyleLayer.prototype.hasTransition = function hasTransition () {}; CustomStyleLayer.prototype.serialize = function serialize () { assert_1(false, "Custom layers cannot be serialized"); }; CustomStyleLayer.prototype.onAdd = function onAdd (map ) { if (this.implementation.onAdd) { this.implementation.onAdd(map, map.painter.context.gl); } }; CustomStyleLayer.prototype.onRemove = function onRemove (map ) { if (this.implementation.onRemove) { this.implementation.onRemove(map, map.painter.context.gl); } }; return CustomStyleLayer; }(StyleLayer)); // var subclasses = { circle: CircleStyleLayer, heatmap: HeatmapStyleLayer, hillshade: HillshadeStyleLayer, fill: FillStyleLayer, 'fill-extrusion': FillExtrusionStyleLayer, line: LineStyleLayer, symbol: SymbolStyleLayer, background: BackgroundStyleLayer, raster: RasterStyleLayer }; function createStyleLayer(layer ) { if (layer.type === 'custom') { return new CustomStyleLayer(layer); } else { return new subclasses[layer.type](layer); } } function potpack(boxes) { // calculate total box area and maximum box width var area = 0; var maxWidth = 0; for (var i$1 = 0, list = boxes; i$1 < list.length; i$1 += 1) { var box = list[i$1]; area += box.w * box.h; maxWidth = Math.max(maxWidth, box.w); } // sort the boxes for insertion by height, descending boxes.sort(function (a, b) { return b.h - a.h; }); // aim for a squarish resulting container, // slightly adjusted for sub-100% space utilization var startWidth = Math.max(Math.ceil(Math.sqrt(area / 0.95)), maxWidth); // start with a single empty space, unbounded at the bottom var spaces = [{x: 0, y: 0, w: startWidth, h: Infinity}]; var width = 0; var height = 0; for (var i$2 = 0, list$1 = boxes; i$2 < list$1.length; i$2 += 1) { // look through spaces backwards so that we check smaller spaces first var box$1 = list$1[i$2]; for (var i = spaces.length - 1; i >= 0; i--) { var space = spaces[i]; // look for empty spaces that can accommodate the current box if (box$1.w > space.w || box$1.h > space.h) { continue; } // found the space; add the box to its top-left corner // |-------|-------| // | box | | // |_______| | // | space | // |_______________| box$1.x = space.x; box$1.y = space.y; height = Math.max(height, box$1.y + box$1.h); width = Math.max(width, box$1.x + box$1.w); if (box$1.w === space.w && box$1.h === space.h) { // space matches the box exactly; remove it var last = spaces.pop(); if (i < spaces.length) { spaces[i] = last; } } else if (box$1.h === space.h) { // space matches the box height; update it accordingly // |-------|---------------| // | box | updated space | // |_______|_______________| space.x += box$1.w; space.w -= box$1.w; } else if (box$1.w === space.w) { // space matches the box width; update it accordingly // |---------------| // | box | // |_______________| // | updated space | // |_______________| space.y += box$1.h; space.h -= box$1.h; } else { // otherwise the box splits the space into two spaces // |-------|-----------| // | box | new space | // |_______|___________| // | updated space | // |___________________| spaces.push({ x: space.x + box$1.w, y: space.y, w: space.w - box$1.w, h: box$1.h }); space.y += box$1.h; space.h -= box$1.h; } break; } } return { w: width, // container width h: height, // container height fill: (area / (width * height)) || 0 // space utilization }; } // var padding = 1; var ImagePosition = function ImagePosition(paddedRect , ref ) { var pixelRatio = ref.pixelRatio; var version = ref.version; this.paddedRect = paddedRect; this.pixelRatio = pixelRatio; this.version = version; }; var prototypeAccessors = { tl: { configurable: true },br: { configurable: true },tlbr: { configurable: true },displaySize: { configurable: true } }; prototypeAccessors.tl.get = function () { return [ this.paddedRect.x + padding, this.paddedRect.y + padding ]; }; prototypeAccessors.br.get = function () { return [ this.paddedRect.x + this.paddedRect.w - padding, this.paddedRect.y + this.paddedRect.h - padding ]; }; prototypeAccessors.tlbr.get = function () { return this.tl.concat(this.br); }; prototypeAccessors.displaySize.get = function () { return [ (this.paddedRect.w - padding * 2) / this.pixelRatio, (this.paddedRect.h - padding * 2) / this.pixelRatio ]; }; Object.defineProperties( ImagePosition.prototype, prototypeAccessors ); var ImageAtlas = function ImageAtlas(icons , patterns ) { var iconPositions = {}, patternPositions = {}; this.haveRenderCallbacks = []; var bins = []; this.addImages(icons, iconPositions, bins); this.addImages(patterns, patternPositions, bins); var ref = potpack(bins); var w = ref.w; var h = ref.h; var image = new RGBAImage({width: w || 1, height: h || 1}); for (var id in icons) { var src = icons[id]; var bin = iconPositions[id].paddedRect; RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x: bin.x + padding, y: bin.y + padding}, src.data); } for (var id$1 in patterns) { var src$1 = patterns[id$1]; var bin$1 = patternPositions[id$1].paddedRect; var x = bin$1.x + padding, y = bin$1.y + padding, w$1 = src$1.data.width, h$1 = src$1.data.height; RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: x, y: y}, src$1.data); // Add 1 pixel wrapped padding on each side of the image. RGBAImage.copy(src$1.data, image, { x: 0, y: h$1 - 1 }, { x: x, y: y - 1 }, { width: w$1, height: 1 }); // T RGBAImage.copy(src$1.data, image, { x: 0, y: 0 }, { x: x, y: y + h$1 }, { width: w$1, height: 1 }); // B RGBAImage.copy(src$1.data, image, { x: w$1 - 1, y: 0 }, { x: x - 1, y: y }, { width: 1, height: h$1 }); // L RGBAImage.copy(src$1.data, image, { x: 0, y: 0 }, { x: x + w$1, y: y }, { width: 1, height: h$1 }); // R } this.image = image; this.iconPositions = iconPositions; this.patternPositions = patternPositions; }; ImageAtlas.prototype.addImages = function addImages (images , positions , bins ) { for (var id in images) { var src = images[id]; var bin = { x: 0, y: 0, w: src.data.width + 2 * padding, h: src.data.height + 2 * padding, }; bins.push(bin); positions[id] = new ImagePosition(bin, src); if (src.hasRenderCallback) { this.haveRenderCallbacks.push(id); } } }; ImageAtlas.prototype.patchUpdatedImages = function patchUpdatedImages (imageManager , texture ) { imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks); for (var name in imageManager.updatedImages) { this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture); this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name), texture); } }; ImageAtlas.prototype.patchUpdatedImage = function patchUpdatedImage (position , image , texture ) { if (!position || !image) { return; } if (position.version === image.version) { return; } position.version = image.version; var ref = position.tl; var x = ref[0]; var y = ref[1]; texture.update(image.data, undefined, {x: x, y: y}); }; register('ImagePosition', ImagePosition); register('ImageAtlas', ImageAtlas); // var HTMLImageElement = self.HTMLImageElement; var HTMLCanvasElement = self.HTMLCanvasElement; var HTMLVideoElement = self.HTMLVideoElement; var ImageData$1 = self.ImageData; var Texture = function Texture(context , image , format , options ) { this.context = context; this.format = format; this.texture = context.gl.createTexture(); this.update(image, options); }; Texture.prototype.update = function update (image , options , position ) { var width = image.width; var height = image.height; var resize = (!this.size || this.size[0] !== width || this.size[1] !== height) && !position; var ref = this; var context = ref.context; var gl = context.gl; this.useMipmap = Boolean(options && options.useMipmap); 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 (resize) { this.size = [width, height]; if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$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 { var ref$1 = position || { x: 0, y: 0}; var x = ref$1.x; var y = ref$1.y; if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$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); } } if (this.useMipmap && this.isSizePowerOfTwo()) { gl.generateMipmap(gl.TEXTURE_2D); } }; Texture.prototype.bind = function bind (filter , wrap , minFilter ) { var ref = this; var context = ref.context; var gl = context.gl; gl.bindTexture(gl.TEXTURE_2D, this.texture); if (minFilter === gl.LINEAR_MIPMAP_NEAREST && !this.isSizePowerOfTwo()) { minFilter = gl.LINEAR; } if (filter !== this.filter) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter || filter); this.filter = filter; } if (wrap !== this.wrap) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap); this.wrap = wrap; } }; Texture.prototype.isSizePowerOfTwo = function isSizePowerOfTwo () { return this.size[0] === this.size[1] && (Math.log(this.size[0]) / Math.LN2) % 1 === 0; }; Texture.prototype.destroy = function destroy () { var ref = this.context; var gl = ref.gl; gl.deleteTexture(this.texture); this.texture = (null ); }; var read = function (buffer, offset, isLE, mLen, nBytes) { var e, m; var eLen = (nBytes * 8) - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var nBits = -7; var i = isLE ? (nBytes - 1) : 0; var d = isLE ? -1 : 1; var s = buffer[offset + i]; i += d; e = s & ((1 << (-nBits)) - 1); s >>= (-nBits); nBits += eLen; for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1); e >>= (-nBits); nBits += mLen; for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias; } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen); e = e - eBias; } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) }; var write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c; var eLen = (nBytes * 8) - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); var i = isLE ? 0 : (nBytes - 1); var d = isLE ? 1 : -1; var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; value = Math.abs(value); if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0; e = eMax; } else { e = Math.floor(Math.log(value) / Math.LN2); if (value * (c = Math.pow(2, -e)) < 1) { e--; c *= 2; } if (e + eBias >= 1) { value += rt / c; } else { value += rt * Math.pow(2, 1 - eBias); } if (value * c >= 2) { e++; c /= 2; } if (e + eBias >= eMax) { m = 0; e = eMax; } else if (e + eBias >= 1) { m = ((value * c) - 1) * Math.pow(2, mLen); e = e + eBias; } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); e = 0; } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m; eLen += mLen; for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128; }; var ieee754 = { read: read, write: write }; 'use strict'; var pbf = Pbf; function Pbf(buf) { this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); this.pos = 0; this.type = 0; this.length = this.buf.length; } Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; Pbf.prototype = { destroy: function() { this.buf = null; }, // === READING ================================================================= readFields: function(readField, result, end) { end = end || this.length; while (this.pos < end) { var val = this.readVarint(), tag = val >> 3, startPos = this.pos; this.type = val & 0x7; readField(tag, result, this); if (this.pos === startPos) { this.skip(val); } } return result; }, readMessage: function(readField, result) { return this.readFields(readField, result, this.readVarint() + this.pos); }, readFixed32: function() { var val = readUInt32(this.buf, this.pos); this.pos += 4; return val; }, readSFixed32: function() { var val = readInt32(this.buf, this.pos); this.pos += 4; return val; }, // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) readFixed64: function() { var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; return val; }, readSFixed64: function() { var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; return val; }, readFloat: function() { var val = ieee754.read(this.buf, this.pos, true, 23, 4); this.pos += 4; return val; }, readDouble: function() { var val = ieee754.read(this.buf, this.pos, true, 52, 8); this.pos += 8; return val; }, readVarint: function(isSigned) { var buf = this.buf, val, b; b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) { return val; } b = buf[this.pos]; val |= (b & 0x0f) << 28; return readVarintRemainder(val, isSigned, this); }, readVarint64: function() { // for compatibility with v2.0.1 return this.readVarint(true); }, readSVarint: function() { var num = this.readVarint(); return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding }, readBoolean: function() { return Boolean(this.readVarint()); }, readString: function() { var end = this.readVarint() + this.pos, str = readUtf8(this.buf, this.pos, end); this.pos = end; return str; }, readBytes: function() { var end = this.readVarint() + this.pos, buffer = this.buf.subarray(this.pos, end); this.pos = end; return buffer; }, // verbose for performance reasons; doesn't affect gzipped size readPackedVarint: function(arr, isSigned) { if (this.type !== Pbf.Bytes) { return arr.push(this.readVarint(isSigned)); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readVarint(isSigned)); } return arr; }, readPackedSVarint: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readSVarint()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSVarint()); } return arr; }, readPackedBoolean: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readBoolean()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readBoolean()); } return arr; }, readPackedFloat: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readFloat()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFloat()); } return arr; }, readPackedDouble: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readDouble()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readDouble()); } return arr; }, readPackedFixed32: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readFixed32()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFixed32()); } return arr; }, readPackedSFixed32: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readSFixed32()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSFixed32()); } return arr; }, readPackedFixed64: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readFixed64()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFixed64()); } return arr; }, readPackedSFixed64: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readSFixed64()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSFixed64()); } return arr; }, skip: function(val) { var type = val & 0x7; if (type === Pbf.Varint) { while (this.buf[this.pos++] > 0x7f) {} } else if (type === Pbf.Bytes) { this.pos = this.readVarint() + this.pos; } else if (type === Pbf.Fixed32) { this.pos += 4; } else if (type === Pbf.Fixed64) { this.pos += 8; } else { throw new Error('Unimplemented type: ' + type); } }, // === WRITING ================================================================= writeTag: function(tag, type) { this.writeVarint((tag << 3) | type); }, realloc: function(min) { var length = this.length || 16; while (length < this.pos + min) { length *= 2; } if (length !== this.length) { var buf = new Uint8Array(length); buf.set(this.buf); this.buf = buf; this.length = length; } }, finish: function() { this.length = this.pos; this.pos = 0; return this.buf.subarray(0, this.length); }, writeFixed32: function(val) { this.realloc(4); writeInt32(this.buf, val, this.pos); this.pos += 4; }, writeSFixed32: function(val) { this.realloc(4); writeInt32(this.buf, val, this.pos); this.pos += 4; }, writeFixed64: function(val) { this.realloc(8); writeInt32(this.buf, val & -1, this.pos); writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); this.pos += 8; }, writeSFixed64: function(val) { this.realloc(8); writeInt32(this.buf, val & -1, this.pos); writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); this.pos += 8; }, writeVarint: function(val) { val = +val || 0; if (val > 0xfffffff || val < 0) { writeBigVarint(val, this); return; } this.realloc(4); this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = (val >>> 7) & 0x7f; }, writeSVarint: function(val) { this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); }, writeBoolean: function(val) { this.writeVarint(Boolean(val)); }, writeString: function(str) { str = String(str); this.realloc(str.length * 4); this.pos++; // reserve 1 byte for short string length var startPos = this.pos; // write the string directly to the buffer and see how much was written this.pos = writeUtf8(this.buf, str, this.pos); var len = this.pos - startPos; if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } // finally, write the message length in the reserved place and restore the position this.pos = startPos - 1; this.writeVarint(len); this.pos += len; }, writeFloat: function(val) { this.realloc(4); ieee754.write(this.buf, val, this.pos, true, 23, 4); this.pos += 4; }, writeDouble: function(val) { this.realloc(8); ieee754.write(this.buf, val, this.pos, true, 52, 8); this.pos += 8; }, writeBytes: function(buffer) { var len = buffer.length; this.writeVarint(len); this.realloc(len); for (var i = 0; i < len; i++) { this.buf[this.pos++] = buffer[i]; } }, writeRawMessage: function(fn, obj) { this.pos++; // reserve 1 byte for short message length // write the message directly to the buffer and see how much was written var startPos = this.pos; fn(obj, this); var len = this.pos - startPos; if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } // finally, write the message length in the reserved place and restore the position this.pos = startPos - 1; this.writeVarint(len); this.pos += len; }, writeMessage: function(tag, fn, obj) { this.writeTag(tag, Pbf.Bytes); this.writeRawMessage(fn, obj); }, writePackedVarint: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedVarint, arr); } }, writePackedSVarint: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSVarint, arr); } }, writePackedBoolean: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedBoolean, arr); } }, writePackedFloat: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFloat, arr); } }, writePackedDouble: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedDouble, arr); } }, writePackedFixed32: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFixed32, arr); } }, writePackedSFixed32: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSFixed32, arr); } }, writePackedFixed64: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFixed64, arr); } }, writePackedSFixed64: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSFixed64, arr); } }, writeBytesField: function(tag, buffer) { this.writeTag(tag, Pbf.Bytes); this.writeBytes(buffer); }, writeFixed32Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeFixed32(val); }, writeSFixed32Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeSFixed32(val); }, writeFixed64Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeFixed64(val); }, writeSFixed64Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeSFixed64(val); }, writeVarintField: function(tag, val) { this.writeTag(tag, Pbf.Varint); this.writeVarint(val); }, writeSVarintField: function(tag, val) { this.writeTag(tag, Pbf.Varint); this.writeSVarint(val); }, writeStringField: function(tag, str) { this.writeTag(tag, Pbf.Bytes); this.writeString(str); }, writeFloatField: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeFloat(val); }, writeDoubleField: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeDouble(val); }, writeBooleanField: function(tag, val) { this.writeVarintField(tag, Boolean(val)); } }; function readVarintRemainder(l, s, p) { var buf = p.buf, h, b; b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) { return toNum(l, h, s); } throw new Error('Expected varint not more than 10 bytes'); } function readPackedEnd(pbf) { return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1; } function toNum(low, high, isSigned) { if (isSigned) { return high * 0x100000000 + (low >>> 0); } return ((high >>> 0) * 0x100000000) + (low >>> 0); } function writeBigVarint(val, pbf) { var low, high; if (val >= 0) { low = (val % 0x100000000) | 0; high = (val / 0x100000000) | 0; } else { low = ~(-val % 0x100000000); high = ~(-val / 0x100000000); if (low ^ 0xffffffff) { low = (low + 1) | 0; } else { low = 0; high = (high + 1) | 0; } } if (val >= 0x10000000000000000 || val < -0x10000000000000000) { throw new Error('Given varint doesn\'t fit into 10 bytes'); } pbf.realloc(10); writeBigVarintLow(low, high, pbf); writeBigVarintHigh(high, pbf); } function writeBigVarintLow(low, high, pbf) { pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos] = low & 0x7f; } function writeBigVarintHigh(high, pbf) { var lsb = (high & 0x07) << 4; pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f; } function makeRoomForExtraLength(startPos, len, pbf) { var extraLen = len <= 0x3fff ? 1 : len <= 0x1fffff ? 2 : len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7)); // if 1 byte isn't enough for encoding message length, shift the data to the right pbf.realloc(extraLen); for (var i = pbf.pos - 1; i >= startPos; i--) { pbf.buf[i + extraLen] = pbf.buf[i]; } } function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeVarint(arr[i]); } } function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSVarint(arr[i]); } } function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFloat(arr[i]); } } function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeDouble(arr[i]); } } function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeBoolean(arr[i]); } } function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed32(arr[i]); } } function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed32(arr[i]); } } function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed64(arr[i]); } } function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed64(arr[i]); } } // Buffer code below from https://github.com/feross/buffer, MIT-licensed function readUInt32(buf, pos) { return ((buf[pos]) | (buf[pos + 1] << 8) | (buf[pos + 2] << 16)) + (buf[pos + 3] * 0x1000000); } function writeInt32(buf, val, pos) { buf[pos] = val; buf[pos + 1] = (val >>> 8); buf[pos + 2] = (val >>> 16); buf[pos + 3] = (val >>> 24); } function readInt32(buf, pos) { return ((buf[pos]) | (buf[pos + 1] << 8) | (buf[pos + 2] << 16)) + (buf[pos + 3] << 24); } function readUtf8(buf, pos, end) { var str = ''; var i = pos; while (i < end) { var b0 = buf[i]; var c = null; // codepoint var bytesPerSequence = b0 > 0xEF ? 4 : b0 > 0xDF ? 3 : b0 > 0xBF ? 2 : 1; if (i + bytesPerSequence > end) { break; } var b1, b2, b3; if (bytesPerSequence === 1) { if (b0 < 0x80) { c = b0; } } else if (bytesPerSequence === 2) { b1 = buf[i + 1]; if ((b1 & 0xC0) === 0x80) { c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F); if (c <= 0x7F) { c = null; } } } else if (bytesPerSequence === 3) { b1 = buf[i + 1]; b2 = buf[i + 2]; if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) { c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F); if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) { c = null; } } } else if (bytesPerSequence === 4) { b1 = buf[i + 1]; b2 = buf[i + 2]; b3 = buf[i + 3]; if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F); if (c <= 0xFFFF || c >= 0x110000) { c = null; } } } if (c === null) { c = 0xFFFD; bytesPerSequence = 1; } else if (c > 0xFFFF) { c -= 0x10000; str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); c = 0xDC00 | c & 0x3FF; } str += String.fromCharCode(c); i += bytesPerSequence; } return str; } function writeUtf8(buf, str, pos) { for (var i = 0, c, lead; i < str.length; i++) { c = str.charCodeAt(i); // code point if (c > 0xD7FF && c < 0xE000) { if (lead) { if (c < 0xDC00) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; lead = c; continue; } else { c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; lead = null; } } else { if (c > 0xDBFF || (i + 1 === str.length)) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; } else { lead = c; } continue; } } else if (lead) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; lead = null; } if (c < 0x80) { buf[pos++] = c; } else { if (c < 0x800) { buf[pos++] = c >> 0x6 | 0xC0; } else { if (c < 0x10000) { buf[pos++] = c >> 0xC | 0xE0; } else { buf[pos++] = c >> 0x12 | 0xF0; buf[pos++] = c >> 0xC & 0x3F | 0x80; } buf[pos++] = c >> 0x6 & 0x3F | 0x80; } buf[pos++] = c & 0x3F | 0x80; } } return pos; } // var border = 3; function readFontstacks(tag , glyphs , pbf ) { if (tag === 1) { pbf.readMessage(readFontstack, glyphs); } } function readFontstack(tag , glyphs , pbf ) { if (tag === 3) { var ref = pbf.readMessage(readGlyph, {}); var id = ref.id; var bitmap = ref.bitmap; var width = ref.width; var height = ref.height; var left = ref.left; var top = ref.top; var advance = ref.advance; glyphs.push({ id: id, bitmap: new AlphaImage({ width: width + 2 * border, height: height + 2 * border }, bitmap), metrics: {width: width, height: height, left: left, top: top, advance: advance} }); } } function readGlyph(tag , glyph , pbf ) { if (tag === 1) { glyph.id = pbf.readVarint(); } else if (tag === 2) { glyph.bitmap = pbf.readBytes(); } else if (tag === 3) { glyph.width = pbf.readVarint(); } else if (tag === 4) { glyph.height = pbf.readVarint(); } else if (tag === 5) { glyph.left = pbf.readSVarint(); } else if (tag === 6) { glyph.top = pbf.readSVarint(); } else if (tag === 7) { glyph.advance = pbf.readVarint(); } } function parseGlyphPBF (data ) { return new pbf(data).readFields(readFontstacks, []); } var GLYPH_PBF_BORDER = border; // /** * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests * are ignored until the function was actually invoked. * * @private */ var ThrottledInvoker = function ThrottledInvoker(callback ) { var this$1 = this; this._callback = callback; this._triggered = false; if (typeof MessageChannel !== 'undefined') { this._channel = new MessageChannel(); this._channel.port2.onmessage = function () { this$1._triggered = false; this$1._callback(); }; } }; ThrottledInvoker.prototype.trigger = function trigger () { var this$1 = this; if (!this._triggered) { this._triggered = true; if (this._channel) { this._channel.port1.postMessage(true); } else { setTimeout(function () { this$1._triggered = false; this$1._callback(); }, 0); } } }; // /** * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model) * that maintains the relationship between asynchronous tasks and the objects * that spin them off - in this case, tasks like parsing parts of styles, * owned by the styles * * @param {WebWorker} target * @param {WebWorker} parent * @param {string|number} mapId A unique identifier for the Map instance using this Actor. * @private */ var Actor = function Actor(target , parent , mapId ) { this.target = target; this.parent = parent; this.mapId = mapId; this.callbacks = {}; this.tasks = {}; this.taskQueue = []; this.cancelCallbacks = {}; bindAll(['receive', 'process'], this); this.invoker = new ThrottledInvoker(this.process); this.target.addEventListener('message', this.receive, false); }; /** * Sends a message from a main-thread map to a Worker or from a Worker back to * a main-thread map instance. * * @param type The name of the target method to invoke or '[source-type].[source-name].name' for a method on a WorkerSource. * @param targetMapId A particular mapId to which to send this message. * @private */ Actor.prototype.send = function send (type , data , callback , targetMapId ) { var this$1 = this; // 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. var id = Math.round((Math.random() * 1e18)).toString(36).substring(0, 10); if (callback) { this.callbacks[id] = callback; } var buffers = []; this.target.postMessage({ id: id, type: type, hasCallback: !!callback, targetMapId: targetMapId, sourceMapId: this.mapId, data: serialize(data, buffers) }, buffers); return { cancel: function () { if (callback) { // Set the callback to null so that it never fires after the request is aborted. delete this$1.callbacks[id]; } this$1.target.postMessage({ id: id, type: '', targetMapId: targetMapId, sourceMapId: this$1.mapId }); } }; }; Actor.prototype.receive = function receive (message ) { var data = message.data, id = data.id; if (!id) { return; } if (data.targetMapId && this.mapId !== data.targetMapId) { return; } 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. delete this.tasks[id]; var cancel = this.cancelCallbacks[id]; delete this.cancelCallbacks[id]; if (cancel) { cancel(); } } else { // Store the tasks that we need to process before actually processing them. This // is necessary because we want to keep receiving messages, and in particular, // 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. this.tasks[id] = data; this.taskQueue.push(id); this.invoker.trigger(); } }; Actor.prototype.process = function process () { var this$1 = this; if (!this.taskQueue.length) { return; } var id = this.taskQueue.shift(); var 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; } 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. var 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)); } } } else { var completed = false; var done = task.hasCallback ? function (err, data) { completed = true; delete this$1.cancelCallbacks[id]; var buffers = []; this$1.target.postMessage({ id: id, type: '', sourceMapId: this$1.mapId, error: err ? serialize(err) : null, data: serialize(data, buffers) }, buffers); } : function (_) { completed = true; }; var callback$1 = null; var params = (deserialize(task.data) ); if (this.parent[task.type]) { // task.type == 'loadTile', 'removeTile', etc. callback$1 = this.parent[task.type](task.sourceMapId, params, done); } else if (this.parent.getWorkerSource) { // task.type == sourcetype.method var keys = task.type.split('.'); var scope = (this.parent ).getWorkerSource(task.sourceMapId, keys[0], params.source); callback$1 = scope[keys[1]](params, done); } else { // No function was found. done(new Error(("Could not find function " + (task.type)))); } if (!completed && callback$1 && callback$1.cancel) { // Allows canceling the task as long as it hasn't been completed yet. this.cancelCallbacks[id] = callback$1.cancel; } } }; Actor.prototype.remove = function remove () { this.target.removeEventListener('message', this.receive, false); }; /** * 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]; } // /** * A `LngLatBounds` object represents a geographical bounding box, * defined by its southwest and northeast points in longitude and latitude. * * If no arguments are provided to the constructor, a `null` bounding box is created. * * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option * can also accept an `Array` of two {@link LngLatLike} constructs and will perform an implicit conversion. * This flexible type is documented as {@link LngLatBoundsLike}. * * @param {LngLatLike} [sw] The southwest corner of the bounding box. * @param {LngLatLike} [ne] The northeast corner of the bounding box. * @example * var sw = new mapboxgl.LngLat(-73.9876, 40.7661); * var ne = new mapboxgl.LngLat(-73.9397, 40.8002); * var llb = new mapboxgl.LngLatBounds(sw, ne); */ var LngLatBounds = function LngLatBounds(sw , ne ) { if (!sw) { // 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]); } }; /** * Set the northeast corner of the bounding box * * @param {LngLatLike} ne * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.setNorthEast = function setNorthEast (ne ) { this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne); return this; }; /** * Set the southwest corner of the bounding box * * @param {LngLatLike} sw * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.setSouthWest = function setSouthWest (sw ) { this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw); return this; }; /** * Extend the bounds to include a given LngLat or LngLatBounds. * * @param {LngLat|LngLatBounds} obj object to extend to * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.extend = function extend (obj ) { var sw = this._sw, ne = this._ne; var sw2, ne2; if (obj instanceof LngLat) { sw2 = obj; ne2 = obj; } else if (obj instanceof LngLatBounds) { sw2 = obj._sw; ne2 = obj._ne; if (!sw2 || !ne2) { return this; } } else { if (Array.isArray(obj)) { if (obj.every(Array.isArray)) { return this.extend(LngLatBounds.convert(obj)); } else { return this.extend(LngLat.convert(obj)); } } return this; } if (!sw && !ne) { this._sw = new LngLat(sw2.lng, sw2.lat); this._ne = new LngLat(ne2.lng, ne2.lat); } else { sw.lng = Math.min(sw2.lng, sw.lng); sw.lat = Math.min(sw2.lat, sw.lat); ne.lng = Math.max(ne2.lng, ne.lng); ne.lat = Math.max(ne2.lat, ne.lat); } return this; }; /** * Returns the geographical coordinate equidistant from the bounding box's corners. * * @returns {LngLat} The bounding box's center. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315} */ LngLatBounds.prototype.getCenter = function getCenter () { return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2); }; /** * Returns the southwest corner of the bounding box. * * @returns {LngLat} The southwest corner of the bounding box. */ LngLatBounds.prototype.getSouthWest = function getSouthWest () { return this._sw; }; /** * Returns the northeast corner of the bounding box. * * @returns {LngLat} The northeast corner of the bounding box. */ LngLatBounds.prototype.getNorthEast = function getNorthEast () { return this._ne; }; /** * Returns the northwest corner of the bounding box. * * @returns {LngLat} The northwest corner of the bounding box. */ LngLatBounds.prototype.getNorthWest = function getNorthWest () { return new LngLat(this.getWest(), this.getNorth()); }; /** * Returns the southeast corner of the bounding box. * * @returns {LngLat} The southeast corner of the bounding box. */ LngLatBounds.prototype.getSouthEast = function getSouthEast () { return new LngLat(this.getEast(), this.getSouth()); }; /** * Returns the west edge of the bounding box. * * @returns {number} The west edge of the bounding box. */ LngLatBounds.prototype.getWest = function getWest () { return this._sw.lng; }; /** * Returns the south edge of the bounding box. * * @returns {number} The south edge of the bounding box. */ LngLatBounds.prototype.getSouth = function getSouth () { return this._sw.lat; }; /** * Returns the east edge of the bounding box. * * @returns {number} The east edge of the bounding box. */ LngLatBounds.prototype.getEast = function getEast () { return this._ne.lng; }; /** * Returns the north edge of the bounding box. * * @returns {number} The north edge of the bounding box. */ LngLatBounds.prototype.getNorth = function getNorth () { return this._ne.lat; }; /** * Returns the bounding box represented as an array. * * @returns {Array>} The bounding box represented as an array, consisting of the * southwest and northeast coordinates of the bounding represented as arrays of numbers. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]] */ LngLatBounds.prototype.toArray = function toArray () { return [this._sw.toArray(), this._ne.toArray()]; }; /** * Return the bounding box represented as a string. * * @returns {string} The bounding box represents as a string of the format * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.toString(); // = "LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))" */ LngLatBounds.prototype.toString = function toString () { return ("LngLatBounds(" + (this._sw.toString()) + ", " + (this._ne.toString()) + ")"); }; /** * Check if the bounding box is an empty/`null`-type box. * * @returns {boolean} True if bounds have been defined, otherwise false. */ LngLatBounds.prototype.isEmpty = function isEmpty () { return !(this._sw && this._ne); }; /** * Converts an array to a `LngLatBounds` object. * * If a `LngLatBounds` object is passed in, the function returns it unchanged. * * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values. * * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return. * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object. * @example * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; * var llb = mapboxgl.LngLatBounds.convert(arr); * llb; // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}} */ LngLatBounds.convert = function convert (input ) { if (!input || input instanceof LngLatBounds) { return input; } return new LngLatBounds(input); }; // /** * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees. * * Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON. * * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option * can also accept an `Array` of two numbers and will perform an implicit conversion. * This flexible type is documented as {@link LngLatLike}. * * @param {number} lng Longitude, measured in degrees. * @param {number} lat Latitude, measured in degrees. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * @see [Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/) * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) */ var LngLat = function LngLat(lng , lat ) { if (isNaN(lng) || isNaN(lat)) { throw new Error(("Invalid LngLat object: (" + lng + ", " + lat + ")")); } this.lng = +lng; this.lat = +lat; if (this.lat > 90 || this.lat < -90) { throw new Error('Invalid LngLat latitude value: must be between -90 and 90'); } }; /** * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180). * * @returns {LngLat} The wrapped `LngLat` object. * @example * var ll = new mapboxgl.LngLat(286.0251, 40.7736); * var wrapped = ll.wrap(); * wrapped.lng; // = -73.9749 */ LngLat.prototype.wrap = function wrap$1 () { return new LngLat(wrap(this.lng, -180, 180), this.lat); }; /** * Returns the coordinates represented as an array of two numbers. * * @returns {Array} The coordinates represeted as an array of longitude and latitude. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toArray(); // = [-73.9749, 40.7736] */ LngLat.prototype.toArray = function toArray () { return [this.lng, this.lat]; }; /** * Returns the coordinates represent as a string. * * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toString(); // = "LngLat(-73.9749, 40.7736)" */ LngLat.prototype.toString = function toString () { return ("LngLat(" + (this.lng) + ", " + (this.lat) + ")"); }; /** * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. * * @param {number} [radius=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 * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]] */ LngLat.prototype.toBounds = function toBounds (radius) { if ( radius === void 0 ) radius = 0; var earthCircumferenceInMetersAtEquator = 40075017; var latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); return new LngLatBounds(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy)); }; /** * Converts an array of two numbers 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 * var arr = [-73.9749, 40.7736]; * var ll = mapboxgl.LngLat.convert(arr); * ll; // = LngLat {lng: -73.9749, lat: 40.7736} */ LngLat.convert = function convert (input ) { if (input instanceof LngLat) { return input; } if (Array.isArray(input) && (input.length === 2 || input.length === 3)) { return new LngLat(Number(input[0]), Number(input[1])); } if (!Array.isArray(input) && typeof input === 'object' && input !== null) { return new LngLat( // 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 [, ]"); }; // /* * The circumference of the world in meters at the equator. */ var circumferenceAtEquator = 2 * Math.PI * 6378137; /* * The circumference of the world in meters at the given latitude. */ function circumferenceAtLatitude(latitude ) { return circumferenceAtEquator * Math.cos(latitude * Math.PI / 180); } function mercatorXfromLng(lng ) { return (180 + lng) / 360; } function mercatorYfromLat(lat ) { return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360; } function mercatorZfromAltitude(altitude , lat ) { return altitude / circumferenceAtLatitude(lat); } function lngFromMercatorX(x ) { return x * 360 - 180; } function latFromMercatorY(y ) { var y2 = 180 - y * 360; return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; } function altitudeFromMercatorZ(z , y ) { return z * circumferenceAtLatitude(latFromMercatorY(y)); } /** * 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 */ function mercatorScale(lat ) { return 1 / Math.cos(lat * Math.PI / 180); } /** * 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 * var nullIsland = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); * * @see [Add a custom style layer](https://www.mapbox.com/mapbox-gl-js/example/custom-style-layer/) */ var MercatorCoordinate = function MercatorCoordinate(x , y , z) { if ( z === void 0 ) 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 * var coord = mapboxgl.MercatorCoordinate.fromLngLat({ lng: 0, lat: 0}, 0); * coord; // MercatorCoordinate(0.5, 0.5, 0) */ MercatorCoordinate.fromLngLat = function fromLngLat (lngLatLike , altitude) { if ( altitude === void 0 ) altitude = 0; var lngLat = LngLat.convert(lngLatLike); return new MercatorCoordinate( mercatorXfromLng(lngLat.lng), mercatorYfromLat(lngLat.lat), mercatorZfromAltitude(altitude, lngLat.lat)); }; /** * Returns the `LngLat` for the coordinate. * * @returns {LngLat} The `LngLat` object. * @example * var coord = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); * var latLng = coord.toLngLat(); // LngLat(0, 0) */ MercatorCoordinate.prototype.toLngLat = function 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 * var coord = new mapboxgl.MercatorCoordinate(0, 0, 0.02); * coord.toAltitude(); // 6914.281956295339 */ MercatorCoordinate.prototype.toAltitude = function 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. */ MercatorCoordinate.prototype.meterInMercatorCoordinateUnits = function meterInMercatorCoordinateUnits () { // 1 meter / circumference at equator in meters * Mercator projection scale factor at this latitude return 1 / circumferenceAtEquator * mercatorScale(latFromMercatorY(this.y)); }; // var CanonicalTileID = function CanonicalTileID(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, x, y); }; CanonicalTileID.prototype.equals = function equals (id ) { return this.z === id.z && this.x === id.x && this.y === id.y; }; // given a list of urls, choose a url template and return a tile URL CanonicalTileID.prototype.url = function url (urls , scheme ) { var bbox = getTileBBox(this.x, this.y, this.z); var quadkey = getQuadkey(this.z, this.x, this.y); return urls[(this.x + this.y) % urls.length] .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16)) .replace('{z}', String(this.z)) .replace('{x}', String(this.x)) .replace('{y}', String(scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)) .replace('{quadkey}', quadkey) .replace('{bbox-epsg-3857}', bbox); }; CanonicalTileID.prototype.getTilePoint = function getTilePoint (coord ) { var tilesAtZoom = Math.pow(2, this.z); return new pointGeometry( (coord.x * tilesAtZoom - this.x) * EXTENT, (coord.y * tilesAtZoom - this.y) * EXTENT); }; var UnwrappedTileID = function UnwrappedTileID(wrap , canonical ) { this.wrap = wrap; this.canonical = canonical; this.key = calculateKey(wrap, canonical.z, canonical.x, canonical.y); }; var OverscaledTileID = function OverscaledTileID(overscaledZ , wrap , z , x , y ) { assert_1(overscaledZ >= z); this.overscaledZ = overscaledZ; this.wrap = wrap; this.canonical = new CanonicalTileID(z, +x, +y); this.key = calculateKey(wrap, overscaledZ, x, y); }; OverscaledTileID.prototype.equals = function equals (id ) { return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical); }; OverscaledTileID.prototype.scaledTo = function scaledTo (targetZ ) { assert_1(targetZ <= this.overscaledZ); var zDifference = this.canonical.z - targetZ; if (targetZ > this.canonical.z) { return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y); } else { return new OverscaledTileID(targetZ, this.wrap, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference); } }; OverscaledTileID.prototype.isChildOf = function isChildOf (parent ) { if (parent.wrap !== this.wrap) { // We can't be a child if we're in a different world copy return false; } var zDifference = this.canonical.z - parent.canonical.z; // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined. return parent.overscaledZ === 0 || ( parent.overscaledZ < this.overscaledZ && parent.canonical.x === (this.canonical.x >> zDifference) && parent.canonical.y === (this.canonical.y >> zDifference)); }; OverscaledTileID.prototype.children = function children (sourceMaxZoom ) { if (this.overscaledZ >= sourceMaxZoom) { // return a single tile coord representing a an overscaled tile return [new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)]; } var z = this.canonical.z + 1; var x = this.canonical.x * 2; var y = this.canonical.y * 2; return [ new OverscaledTileID(z, this.wrap, z, x, y), new OverscaledTileID(z, this.wrap, z, x + 1, y), new OverscaledTileID(z, this.wrap, z, x, y + 1), new OverscaledTileID(z, this.wrap, z, x + 1, y + 1) ]; }; OverscaledTileID.prototype.isLessThan = function isLessThan (rhs ) { if (this.wrap < rhs.wrap) { return true; } if (this.wrap > rhs.wrap) { return false; } if (this.overscaledZ < rhs.overscaledZ) { return true; } if (this.overscaledZ > rhs.overscaledZ) { return false; } if (this.canonical.x < rhs.canonical.x) { return true; } if (this.canonical.x > rhs.canonical.x) { return false; } if (this.canonical.y < rhs.canonical.y) { return true; } return false; }; OverscaledTileID.prototype.wrapped = function wrapped () { return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y); }; OverscaledTileID.prototype.unwrapTo = function unwrapTo (wrap ) { return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y); }; OverscaledTileID.prototype.overscaleFactor = function overscaleFactor () { return Math.pow(2, this.overscaledZ - this.canonical.z); }; OverscaledTileID.prototype.toUnwrapped = function toUnwrapped () { return new UnwrappedTileID(this.wrap, this.canonical); }; OverscaledTileID.prototype.toString = function toString () { return ((this.overscaledZ) + "/" + (this.canonical.x) + "/" + (this.canonical.y)); }; OverscaledTileID.prototype.getTilePoint = function getTilePoint (coord ) { return this.canonical.getTilePoint(new MercatorCoordinate(coord.x - this.wrap, coord.y)); }; function calculateKey(wrap , z , x , y ) { wrap *= 2; if (wrap < 0) { wrap = wrap * -1 - 1; } var dim = 1 << z; return ((dim * dim * wrap + dim * y + x) * 32) + z; } function getQuadkey(z, x, y) { var quadkey = '', mask; for (var i = z; i > 0; i--) { mask = 1 << (i - 1); quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0)); } return quadkey; } register('CanonicalTileID', CanonicalTileID); register('OverscaledTileID', OverscaledTileID, {omit: ['posMatrix']}); // // 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. // DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8 // surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a // tile's edge without backfilling from neighboring tiles. var DEMData = function DEMData(uid , data , encoding ) { 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\".") ); } var dim = this.dim = data.height; this.stride = this.dim + 2; this.data = new Int32Array(this.stride * this.stride); var pixels = data.data; var unpack = encoding === "terrarium" ? this._unpackTerrarium : this._unpackMapbox; for (var y = 0; y < dim; y++) { for (var x = 0; x < dim; x++) { var i = y * dim + x; var j = i * 4; this.set(x, y, unpack(pixels[j], pixels[j + 1], pixels[j + 2])); } } // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder for (var x$1 = 0; x$1 < dim; x$1++) { // left vertical border this.set(-1, x$1, this.get(0, x$1)); // right vertical border this.set(dim, x$1, this.get(dim - 1, x$1)); // left horizontal border this.set(x$1, -1, this.get(x$1, 0)); // right horizontal border this.set(x$1, dim, this.get(x$1, dim - 1)); } // corners this.set(-1, -1, this.get(0, 0)); this.set(dim, -1, this.get(dim - 1, 0)); this.set(-1, dim, this.get(0, dim - 1)); this.set(dim, dim, this.get(dim - 1, dim - 1)); }; DEMData.prototype.set = function set (x , y , value ) { this.data[this._idx(x, y)] = value + 65536; }; DEMData.prototype.get = function get (x , y ) { return this.data[this._idx(x, y)] - 65536; }; DEMData.prototype._idx = function _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); }; DEMData.prototype._unpackMapbox = function _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); }; DEMData.prototype._unpackTerrarium = function _unpackTerrarium (r , g , b ) { // unpacking formula for mapzen terrarium: // https://aws.amazon.com/public-datasets/terrain/ return ((r * 256 + g + b / 256) - 32768.0); }; DEMData.prototype.getPixels = function getPixels () { return new RGBAImage({width: this.stride, height: this.stride}, new Uint8Array(this.data.buffer)); }; DEMData.prototype.backfillBorder = function backfillBorder (borderTile , dx , dy ) { if (this.dim !== borderTile.dim) { throw new Error('dem dimension mismatch'); } var xMin = dx * this.dim, xMax = dx * this.dim + this.dim, yMin = dy * this.dim, yMax = dy * this.dim + this.dim; switch (dx) { case -1: xMin = xMax - 1; break; case 1: xMax = xMin + 1; break; } switch (dy) { case -1: yMin = yMax - 1; break; case 1: yMax = yMin + 1; break; } var ox = -dx * this.dim; var oy = -dy * this.dim; for (var y = yMin; y < yMax; y++) { for (var x = xMin; x < xMax; x++) { this.set(x, y, borderTile.get(x + ox, y + oy)); } } }; register('DEMData', DEMData); // var rasterBoundsAttributes = createLayout([ { name: 'a_pos', type: 'Int16', components: 2 }, { name: 'a_texture_pos', type: 'Int16', components: 2 } ]); // /** * The `Bucket` interface is the single point of knowledge about turning vector * tiles into WebGL buffers. * * `Bucket` is an abstract interface. An implementation exists for each style layer type. * Create a bucket via the `StyleLayer#createBucket` method. * * The concrete bucket types, using layout options from the style layer, * transform feature geometries into vertex and index data for use by the * vertex shader. They also (via `ProgramConfiguration`) use feature * properties and the zoom level to populate the attributes needed for * data-driven styling. * * Buckets are designed to be built on a worker thread and then serialized and * transferred back to the main thread for rendering. On the worker side, a * bucket's vertex, index, and attribute data is stored in `bucket.arrays: * ArrayGroup`. When a bucket's data is serialized and sent back to the main * thread, is gets deserialized (using `new Bucket(serializedBucketData)`, with * the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups * hold the same data as ArrayGroups, but are tuned for consumption by WebGL. * * @private */ function deserialize$1(input , style ) { var output = {}; // Guard against the case where the map's style has been set to null while // this bucket has been parsing. if (!style) { return output; } var loop = function () { var bucket = list$1[i$1]; var layers = bucket.layerIds .map(function (id) { return style.getLayer(id); }) .filter(Boolean); if (layers.length === 0) { return; } // look up StyleLayer objects from layer ids (since we don't // want to waste time serializing/copying them from the worker) (bucket ).layers = layers; if ((bucket ).stateDependentLayerIds) { (bucket ).stateDependentLayers = (bucket ).stateDependentLayerIds.map(function (lId) { return layers.filter(function (l) { return l.id === lId; })[0]; }); } for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; output[layer.id] = bucket; } }; for (var i$1 = 0, list$1 = input; i$1 < list$1.length; i$1 += 1) loop(); return output; } // strict var DictionaryCoder = function DictionaryCoder(strings ) { this._stringToNumber = {}; this._numberToString = []; for (var i = 0; i < strings.length; i++) { var string = strings[i]; this._stringToNumber[string] = i; this._numberToString[i] = string; } }; DictionaryCoder.prototype.encode = function encode (string ) { assert_1(string in this._stringToNumber); return this._stringToNumber[string]; }; DictionaryCoder.prototype.decode = function decode (n ) { assert_1(n < this._numberToString.length); return this._numberToString[n]; }; // var Feature = function Feature(vectorTileFeature , z , x , y ) { this.type = 'Feature'; this._vectorTileFeature = vectorTileFeature; (vectorTileFeature )._z = z; (vectorTileFeature )._x = x; (vectorTileFeature )._y = y; this.properties = vectorTileFeature.properties; if (vectorTileFeature.id != null) { this.id = vectorTileFeature.id; } }; var prototypeAccessors$1 = { geometry: { configurable: true } }; prototypeAccessors$1.geometry.get = function () { if (this._geometry === undefined) { this._geometry = this._vectorTileFeature.toGeoJSON( (this._vectorTileFeature )._x, (this._vectorTileFeature )._y, (this._vectorTileFeature )._z).geometry; } return this._geometry; }; prototypeAccessors$1.geometry.set = function (g ) { this._geometry = g; }; Feature.prototype.toJSON = function toJSON () { var json = { geometry: this.geometry }; for (var i in this) { if (i === '_geometry' || i === '_vectorTileFeature') { continue; } json[i] = (this )[i]; } return json; }; Object.defineProperties( Feature.prototype, prototypeAccessors$1 ); // /** * 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 */ var SourceFeatureState = function SourceFeatureState() { this.state = {}; this.stateChanges = {}; this.deletedStates = {}; }; SourceFeatureState.prototype.updateState = function updateState (sourceLayer , featureId , newState ) { var feature = String(featureId); this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {}; this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {}; extend(this.stateChanges[sourceLayer][feature], newState); if (this.deletedStates[sourceLayer] === null) { this.deletedStates[sourceLayer] = {}; for (var ft in this.state[sourceLayer]) { if (ft !== feature) { this.deletedStates[sourceLayer][ft] = null; } } } else { var featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null; if (featureDeletionQueued) { this.deletedStates[sourceLayer][feature] = {}; for (var prop in this.state[sourceLayer][feature]) { if (!newState[prop]) { this.deletedStates[sourceLayer][feature][prop] = null; } } } else { for (var key in newState) { var deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null; if (deletionInQueue) { delete this.deletedStates[sourceLayer][feature][key]; } } } } }; SourceFeatureState.prototype.removeFeatureState = function removeFeatureState (sourceLayer , featureId , key ) { var sourceLayerDeleted = this.deletedStates[sourceLayer] === null; if (sourceLayerDeleted) { return; } var feature = String(featureId); this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {}; if (key && featureId !== undefined && featureId >= 0) { if (this.deletedStates[sourceLayer][feature] !== null) { this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {}; this.deletedStates[sourceLayer][feature][key] = null; } } else if (featureId !== undefined && featureId >= 0) { var 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; } } else { this.deletedStates[sourceLayer][feature] = null; } } else { this.deletedStates[sourceLayer] = null; } }; SourceFeatureState.prototype.getState = function getState (sourceLayer , featureId ) { var feature = String(featureId); var base = this.state[sourceLayer] || {}; var changes = this.stateChanges[sourceLayer] || {}; var reconciledState = extend({}, base[feature], changes[feature]); //return empty object if the whole source layer is awaiting deletion if (this.deletedStates[sourceLayer] === null) { return {}; } else if (this.deletedStates[sourceLayer]) { var featureDeletions = this.deletedStates[sourceLayer][featureId]; if (featureDeletions === null) { return {}; } for (var prop in featureDeletions) { delete reconciledState[prop]; } } return reconciledState; }; SourceFeatureState.prototype.initializeTileState = function initializeTileState (tile , painter ) { tile.setFeatureState(this.state, painter); }; SourceFeatureState.prototype.coalesceChanges = function coalesceChanges (tiles , painter ) { //track changes with full state objects, but only for features that got modified var featuresChanged = {}; for (var sourceLayer in this.stateChanges) { this.state[sourceLayer] = this.state[sourceLayer] || {}; var layerStates = {}; for (var 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; } for (var sourceLayer$1 in this.deletedStates) { this.state[sourceLayer$1] = this.state[sourceLayer$1] || {}; var layerStates$1 = {}; if (this.deletedStates[sourceLayer$1] === null) { for (var ft in this.state[sourceLayer$1]) { layerStates$1[ft] = {}; this.state[sourceLayer$1][ft] = {}; } } else { for (var feature$1 in this.deletedStates[sourceLayer$1]) { var deleteWholeFeatureState = this.deletedStates[sourceLayer$1][feature$1] === null; if (deleteWholeFeatureState) { this.state[sourceLayer$1][feature$1] = {}; } else { for (var i = 0, list = Object.keys(this.deletedStates[sourceLayer$1][feature$1]); i < list.length; i += 1) { var key = list[i]; delete this.state[sourceLayer$1][feature$1][key]; } } layerStates$1[feature$1] = this.state[sourceLayer$1][feature$1]; } } featuresChanged[sourceLayer$1] = featuresChanged[sourceLayer$1] || {}; extend(featuresChanged[sourceLayer$1], layerStates$1); } this.stateChanges = {}; this.deletedStates = {}; if (Object.keys(featuresChanged).length === 0) { return; } for (var id in tiles) { var tile = tiles[id]; tile.setFeatureState(featuresChanged, painter); } }; // var FeatureIndex = function FeatureIndex(tileID , grid , featureIndexArray ) { this.tileID = tileID; this.x = tileID.canonical.x; this.y = tileID.canonical.y; this.z = tileID.canonical.z; this.grid = grid || new gridIndex(EXTENT, 16, 0); this.grid3D = new gridIndex(EXTENT, 16, 0); this.featureIndexArray = featureIndexArray || new FeatureIndexArray(); }; FeatureIndex.prototype.insert = function insert (feature , geometry , featureIndex , sourceLayerIndex , bucketIndex , is3D ) { var key = this.featureIndexArray.length; this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex); var grid = is3D ? this.grid3D : this.grid; for (var r = 0; r < geometry.length; r++) { var ring = geometry[r]; var bbox = [Infinity, Infinity, -Infinity, -Infinity]; for (var i = 0; i < ring.length; i++) { var p = ring[i]; bbox[0] = Math.min(bbox[0], p.x); bbox[1] = Math.min(bbox[1], p.y); bbox[2] = Math.max(bbox[2], p.x); bbox[3] = Math.max(bbox[3], p.y); } if (bbox[0] < EXTENT && bbox[1] < EXTENT && bbox[2] >= 0 && bbox[3] >= 0) { grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]); } } }; FeatureIndex.prototype.loadVTLayers = function 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']); } return this.vtLayers; }; // Finds non-symbol features in this tile at a particular position. FeatureIndex.prototype.query = function query (args , styleLayers , sourceFeatureState ) { var this$1 = this; this.loadVTLayers(); var params = args.params || {}, pixelsToTileUnits = EXTENT / args.tileSize / args.scale, filter = createFilter(params.filter); var queryGeometry = args.queryGeometry; var queryPadding = args.queryPadding * pixelsToTileUnits; var bounds = getBounds(queryGeometry); var matching = this.grid.query(bounds.minX - queryPadding, bounds.minY - queryPadding, bounds.maxX + queryPadding, bounds.maxY + queryPadding); var cameraBounds = getBounds(args.cameraQueryGeometry); var matching3D = this.grid3D.query( cameraBounds.minX - queryPadding, cameraBounds.minY - queryPadding, cameraBounds.maxX + queryPadding, cameraBounds.maxY + queryPadding, function (bx1, by1, bx2, by2) { return polygonIntersectsBox(args.cameraQueryGeometry, bx1 - queryPadding, by1 - queryPadding, bx2 + queryPadding, by2 + queryPadding); }); for (var i = 0, list = matching3D; i < list.length; i += 1) { var key = list[i]; matching.push(key); } matching.sort(topDownFeatureComparator); var result = {}; var previousIndex; var loop = function ( k ) { var index = matching[k]; // don't check the same feature more than once if (index === previousIndex) { return; } previousIndex = index; var match = this$1.featureIndexArray.get(index); var featureGeometry = null; this$1.loadMatchingFeature( result, match.bucketIndex, match.sourceLayerIndex, match.featureIndex, filter, params.layers, styleLayers, function (feature , styleLayer ) { if (!featureGeometry) { featureGeometry = loadGeometry(feature); } var featureState = {}; if (feature.id) { // `feature-state` expression evaluation requires feature state to be available featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', feature.id); } return styleLayer.queryIntersectsFeature(queryGeometry, feature, featureState, featureGeometry, this$1.z, args.transform, pixelsToTileUnits, args.pixelPosMatrix); } ); }; for (var k = 0; k < matching.length; k++) loop( k ); return result; }; FeatureIndex.prototype.loadMatchingFeature = function loadMatchingFeature ( result , bucketIndex , sourceLayerIndex , featureIndex , filter , filterLayerIDs , styleLayers , intersectionTest ) { var layerIDs = this.bucketLayerIDs[bucketIndex]; if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) { return; } var sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex); var sourceLayer = this.vtLayers[sourceLayerName]; var feature = sourceLayer.feature(featureIndex); if (!filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { return; } for (var l = 0; l < layerIDs.length; l++) { var layerID = layerIDs[l]; if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) { continue; } var styleLayer = styleLayers[layerID]; if (!styleLayer) { continue; } var intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer); if (!intersectionZ) { // Only applied for non-symbol features continue; } var geojsonFeature = new Feature(feature, this.z, this.x, this.y); (geojsonFeature ).layer = styleLayer.serialize(); var layerResult = result[layerID]; if (layerResult === undefined) { layerResult = result[layerID] = []; } layerResult.push({ featureIndex: featureIndex, feature: geojsonFeature, intersectionZ: intersectionZ }); } }; // Given a set of symbol indexes that have already been looked up, // return a matching set of GeoJSONFeatures FeatureIndex.prototype.lookupSymbolFeatures = function lookupSymbolFeatures (symbolFeatureIndexes , bucketIndex , sourceLayerIndex , filterSpec , filterLayerIDs , styleLayers ) { var result = {}; this.loadVTLayers(); var filter = createFilter(filterSpec); for (var i = 0, list = symbolFeatureIndexes; i < list.length; i += 1) { var symbolFeatureIndex = list[i]; this.loadMatchingFeature( result, bucketIndex, sourceLayerIndex, symbolFeatureIndex, filter, filterLayerIDs, styleLayers ); } return result; }; FeatureIndex.prototype.hasLayer = function hasLayer (id ) { for (var i$1 = 0, list$1 = this.bucketLayerIDs; i$1 < list$1.length; i$1 += 1) { var layerIDs = list$1[i$1]; for (var i = 0, list = layerIDs; i < list.length; i += 1) { var layerID = list[i]; if (id === layerID) { return true; } } } return false; }; register( 'FeatureIndex', FeatureIndex, { omit: ['rawTileData', 'sourceLayerCoder'] } ); function getBounds(geometry ) { var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = geometry; i < list.length; i += 1) { var p = list[i]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } return { minX: minX, minY: minY, maxX: maxX, maxY: maxY }; } function topDownFeatureComparator(a, b) { return b - a; } // var CLOCK_SKEW_RETRY_TIMEOUT = 30000; /* Tile data was previously loaded, but has expired per its * HTTP headers and is in the process of refreshing. */ /** * A tile object is the combination of a Coordinate, which defines * its place, as well as a unique ID and data tracking for its content * * @private */ var Tile = function Tile(tileID , size ) { this.tileID = tileID; this.uid = uniqueId(); this.uses = 0; this.tileSize = size; this.buckets = {}; this.expirationTime = null; this.queryPadding = 0; this.hasSymbolBuckets = false; // Counts the number of times a response was already expired when // received. We're using this to add a delay when making a new request // so we don't have to keep retrying immediately in case of a server // serving expired tiles. this.expiredRequestCount = 0; this.state = 'loading'; }; Tile.prototype.registerFadeDuration = function registerFadeDuration (duration ) { var fadeEndTime = duration + this.timeAdded; if (fadeEndTime < exported.now()) { return; } if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) { return; } this.fadeEndTime = fadeEndTime; }; Tile.prototype.wasRequested = function wasRequested () { return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading'; }; /** * Given a data object with a 'buffers' property, load it into * this tile's elementGroups and buffers properties and set loaded * to true. If the data is null, like in the case of an empty * GeoJSON tile, no-op but still set loaded to true. * @param {Object} data * @param painter * @returns {undefined} * @private */ Tile.prototype.loadVectorData = function loadVectorData (data , painter , justReloaded ) { if (this.hasData()) { this.unloadVectorData(); } this.state = 'loaded'; // empty GeoJSON tile if (!data) { this.collisionBoxArray = new CollisionBoxArray(); return; } 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$1(data.buckets, painter.style); this.hasSymbolBuckets = false; for (var id in this.buckets) { var bucket = this.buckets[id]; if (bucket instanceof SymbolBucket) { this.hasSymbolBuckets = true; if (justReloaded) { bucket.justReloaded = true; } else { break; } } } this.queryPadding = 0; for (var id$1 in this.buckets) { var bucket$1 = this.buckets[id$1]; this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id$1).queryRadius(bucket$1)); } if (data.imageAtlas) { this.imageAtlas = data.imageAtlas; } if (data.glyphAtlasImage) { this.glyphAtlasImage = data.glyphAtlasImage; } }; /** * Release any data or WebGL resources referenced by this tile. * @returns {undefined} * @private */ Tile.prototype.unloadVectorData = function unloadVectorData () { for (var id in this.buckets) { this.buckets[id].destroy(); } this.buckets = {}; if (this.imageAtlasTexture) { this.imageAtlasTexture.destroy(); } if (this.imageAtlas) { this.imageAtlas = null; } if (this.glyphAtlasTexture) { this.glyphAtlasTexture.destroy(); } this.latestFeatureIndex = null; this.state = 'unloaded'; }; Tile.prototype.unloadDEMData = function unloadDEMData () { this.dem = null; this.neighboringTiles = null; this.state = 'unloaded'; }; Tile.prototype.getBucket = function getBucket (layer ) { return this.buckets[layer.id]; }; Tile.prototype.upload = function upload (context ) { for (var id in this.buckets) { var bucket = this.buckets[id]; if (bucket.uploadPending()) { bucket.upload(context); } } var gl = context.gl; if (this.imageAtlas && !this.imageAtlas.uploaded) { this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA); this.imageAtlas.uploaded = true; } if (this.glyphAtlasImage) { this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA); this.glyphAtlasImage = null; } }; Tile.prototype.prepare = function prepare (imageManager ) { if (this.imageAtlas) { this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture); } }; // Queries non-symbol features rendered for this tile. // Symbol features are queried globally Tile.prototype.queryRenderedFeatures = function queryRenderedFeatures (layers , sourceFeatureState , queryGeometry , cameraQueryGeometry , scale , params , transform , maxPitchScaleFactor , pixelPosMatrix ) { if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) { return {}; } return this.latestFeatureIndex.query({ queryGeometry: queryGeometry, cameraQueryGeometry: cameraQueryGeometry, scale: scale, tileSize: this.tileSize, pixelPosMatrix: pixelPosMatrix, transform: transform, params: params, queryPadding: this.queryPadding * maxPitchScaleFactor }, layers, sourceFeatureState); }; Tile.prototype.querySourceFeatures = function querySourceFeatures (result , params ) { if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) { return; } var vtLayers = this.latestFeatureIndex.loadVTLayers(); var sourceLayer = params ? params.sourceLayer : ''; var layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer]; if (!layer) { return; } var filter = createFilter(params && params.filter); var ref = this.tileID.canonical; var z = ref.z; var x = ref.x; var y = ref.y; var coord = {z: z, x: x, y: y}; for (var i = 0; i < layer.length; i++) { var feature = layer.feature(i); if (filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { var geojsonFeature = new Feature(feature, z, x, y); (geojsonFeature ).tile = coord; result.push(geojsonFeature); } } }; Tile.prototype.clearMask = function clearMask () { if (this.segments) { this.segments.destroy(); delete this.segments; } if (this.maskedBoundsBuffer) { this.maskedBoundsBuffer.destroy(); delete this.maskedBoundsBuffer; } if (this.maskedIndexBuffer) { this.maskedIndexBuffer.destroy(); delete this.maskedIndexBuffer; } }; Tile.prototype.setMask = function setMask (mask , context ) { // don't redo buffer work if the mask is the same; if (deepEqual(this.mask, mask)) { return; } this.mask = mask; this.clearMask(); // We want to render the full tile, and keeping the segments/vertices/indices empty means // using the global shared buffers for covering the entire tile. if (deepEqual(mask, {'0': true})) { return; } var maskedBoundsArray = new StructArrayLayout4i8(); var indexArray = new StructArrayLayout3ui6(); this.segments = new SegmentVector(); // Create a new segment so that we will upload (empty) buffers even when there is nothing to // draw for this tile. this.segments.prepareSegment(0, maskedBoundsArray, indexArray); var maskArray = Object.keys(mask); for (var i = 0; i < maskArray.length; i++) { var maskCoord = mask[+maskArray[i]]; var vertexExtent = EXTENT >> maskCoord.z; var tlVertex = new pointGeometry(maskCoord.x * vertexExtent, maskCoord.y * vertexExtent); var brVertex = new pointGeometry(tlVertex.x + vertexExtent, tlVertex.y + vertexExtent); // not sure why flow is complaining here because it doesn't complain at L401 var segment = (this.segments ).prepareSegment(4, maskedBoundsArray, indexArray); maskedBoundsArray.emplaceBack(tlVertex.x, tlVertex.y, tlVertex.x, tlVertex.y); maskedBoundsArray.emplaceBack(brVertex.x, tlVertex.y, brVertex.x, tlVertex.y); maskedBoundsArray.emplaceBack(tlVertex.x, brVertex.y, tlVertex.x, brVertex.y); maskedBoundsArray.emplaceBack(brVertex.x, brVertex.y, brVertex.x, brVertex.y); var offset = segment.vertexLength; // 0, 1, 2 // 1, 2, 3 indexArray.emplaceBack(offset, offset + 1, offset + 2); indexArray.emplaceBack(offset + 1, offset + 2, offset + 3); segment.vertexLength += 4; segment.primitiveLength += 2; } this.maskedBoundsBuffer = context.createVertexBuffer(maskedBoundsArray, rasterBoundsAttributes.members); this.maskedIndexBuffer = context.createIndexBuffer(indexArray); }; Tile.prototype.hasData = function hasData () { return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired'; }; Tile.prototype.patternsLoaded = function patternsLoaded () { return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length; }; Tile.prototype.setExpiryData = function setExpiryData (data ) { var prior = this.expirationTime; if (data.cacheControl) { var 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(); } if (this.expirationTime) { var now = Date.now(); var isExpired = false; if (this.expirationTime > now) { isExpired = false; } else if (!prior) { isExpired = true; } else if (this.expirationTime < prior) { // Expiring date is going backwards: // fall back to exponential backoff isExpired = true; } else { var delta = this.expirationTime - prior; if (!delta) { // Server is serving the same expired resource over and over: fall // back to exponential backoff. isExpired = true; } else { // Assume that either the client or the server clock is wrong and // try to interpolate a valid expiration date (from the client POV) // observing a minimum timeout. this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT); } } if (isExpired) { this.expiredRequestCount++; this.state = 'expired'; } else { this.expiredRequestCount = 0; } } }; Tile.prototype.getExpiryTimeout = function getExpiryTimeout () { if (this.expirationTime) { if (this.expiredRequestCount) { return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31)); } else { // Max value for `setTimeout` implementations is a 32 bit integer; cap this accordingly return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1); } } }; Tile.prototype.setFeatureState = function setFeatureState (states , painter ) { if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData || Object.keys(states).length === 0) { return; } var vtLayers = this.latestFeatureIndex.loadVTLayers(); for (var id in this.buckets) { var bucket = this.buckets[id]; // Buckets are grouped by common source-layer var sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer'; var sourceLayer = vtLayers[sourceLayerId]; var sourceLayerStates = states[sourceLayerId]; if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) { continue; } bucket.update(sourceLayerStates, sourceLayer, this.imageAtlas && this.imageAtlas.patternPositions || {}); if (painter && painter.style) { this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id).queryRadius(bucket)); } } }; Tile.prototype.holdingForFade = function holdingForFade () { return this.symbolFadeHoldUntil !== undefined; }; Tile.prototype.symbolFadeFinished = function symbolFadeFinished () { return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < exported.now(); }; Tile.prototype.clearFadeHold = function clearFadeHold () { this.symbolFadeHoldUntil = undefined; }; Tile.prototype.setHoldDuration = function setHoldDuration (duration ) { this.symbolFadeHoldUntil = exported.now() + duration; }; var refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout']; // /** * Labels placed around really sharp angles aren't readable. Check if any * part of the potential label has a combined angle that is too big. * * @param line * @param anchor The point on the line around which the label is anchored. * @param labelLength The length of the label in geometry units. * @param windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big. * @param maxAngle The maximum combined angle that any window along the label is allowed to have. * * @returns {boolean} whether the label should be placed * @private */ function checkMaxAngle(line , anchor , labelLength , windowSize , maxAngle ) { // horizontal labels always pass if (anchor.segment === undefined) { return true; } var p = anchor; var index = anchor.segment + 1; var anchorDistance = 0; // move backwards along the line to the first segment the label appears on while (anchorDistance > -labelLength / 2) { index--; // there isn't enough room for the label after the beginning of the line if (index < 0) { return false; } anchorDistance -= line[index].dist(p); p = line[index]; } anchorDistance += line[index].dist(line[index + 1]); index++; // store recent corners and their total angle difference var recentCorners = []; var recentAngleDelta = 0; // move forwards by the length of the label and check angles along the way while (anchorDistance < labelLength / 2) { var prev = line[index - 1]; var current = line[index]; var next = line[index + 1]; // there isn't enough room for the label before the end of the line if (!next) { return false; } var angleDelta = prev.angleTo(current) - current.angleTo(next); // restrict angle to -pi..pi range angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI); recentCorners.push({ distance: anchorDistance, angleDelta: angleDelta }); recentAngleDelta += angleDelta; // remove corners that are far enough away from the list of recent anchors while (anchorDistance - recentCorners[0].distance > windowSize) { recentAngleDelta -= recentCorners.shift().angleDelta; } // the sum of angles within the window area exceeds the maximum allowed value. check fails. if (recentAngleDelta > maxAngle) { return false; } index++; anchorDistance += current.dist(next); } // no part of the line had an angle greater than the maximum allowed. check passes. return true; } // function getLineLength(line ) { var lineLength = 0; for (var k = 0; k < line.length - 1; k++) { lineLength += line[k].dist(line[k + 1]); } return lineLength; } function getAngleWindowSize(shapedText , glyphSize , boxScale ) { return shapedText ? 3 / 5 * glyphSize * boxScale : 0; } function getShapedLabelLength(shapedText , shapedIcon ) { return Math.max( shapedText ? shapedText.right - shapedText.left : 0, shapedIcon ? shapedIcon.right - shapedIcon.left : 0); } function getCenterAnchor(line , maxAngle , shapedText , shapedIcon , glyphSize , boxScale ) { var angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); var labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale; var prevDistance = 0; var centerDistance = getLineLength(line) / 2; for (var i = 0; i < line.length - 1; i++) { var a = line[i], b = line[i + 1]; var segmentDistance = a.dist(b); if (prevDistance + segmentDistance > centerDistance) { // The center is on this segment var t = (centerDistance - prevDistance) / segmentDistance, x = number(a.x, b.x, t), y = number(a.y, b.y, t); var anchor = new Anchor(x, y, b.angleTo(a), i); anchor._round(); if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { return anchor; } else { return; } } prevDistance += segmentDistance; } } function getAnchors(line , spacing , maxAngle , shapedText , shapedIcon , glyphSize , boxScale , overscaling , tileExtent ) { // Resample a line to get anchor points for labels and check that each // potential label passes text-max-angle check and has enough froom to fit // on the line. var angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); var shapedLabelLength = getShapedLabelLength(shapedText, shapedIcon); var labelLength = shapedLabelLength * boxScale; // Is the line continued from outside the tile boundary? var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent; // Is the label long, relative to the spacing? // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges. if (spacing - labelLength < spacing / 4) { spacing = labelLength + spacing / 4; } // Offset the first anchor by: // Either half the label length plus a fixed extra offset if the line is not continued // Or half the spacing if the line is continued. // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections. var fixedExtraOffset = glyphSize * 2; var offset = !isLineContinued ? ((shapedLabelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing : (spacing / 2 * overscaling) % spacing; return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent); } function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) { var halfLabelLength = labelLength / 2; var lineLength = getLineLength(line); var distance = 0, markedDistance = offset - spacing; var anchors = []; for (var i = 0; i < line.length - 1; i++) { var a = line[i], b = line[i + 1]; var segmentDist = a.dist(b), angle = b.angleTo(a); while (markedDistance + spacing < distance + segmentDist) { markedDistance += spacing; var t = (markedDistance - distance) / segmentDist, x = number(a.x, b.x, t), y = number(a.y, b.y, t); // Check that the point is within the tile boundaries and that // the label would fit before the beginning and end of the line // if placed at this point. if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent && markedDistance - halfLabelLength >= 0 && markedDistance + halfLabelLength <= lineLength) { var anchor = new Anchor(x, y, angle, i); anchor._round(); if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { anchors.push(anchor); } } } distance += segmentDist; } if (!placeAtMiddle && !anchors.length && !isLineContinued) { // The first attempt at finding anchors at which labels can be placed failed. // Try again, but this time just try placing one anchor at the middle of the line. // This has the most effect for short lines in overscaled tiles, since the // initial offset used in overscaled tiles is calculated to align labels with positions in // parent tiles instead of placing the label as close to the beginning as possible. anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent); } return anchors; } // /** * Returns the part of a multiline that intersects with the provided rectangular box. * * @param lines * @param x1 the left edge of the box * @param y1 the top edge of the box * @param x2 the right edge of the box * @param y2 the bottom edge of the box * @returns lines * @private */ function clipLine(lines , x1 , y1 , x2 , y2 ) { var clippedLines = []; for (var l = 0; l < lines.length; l++) { var line = lines[l]; var clippedLine = (void 0); for (var i = 0; i < line.length - 1; i++) { var p0 = line[i]; var p1 = line[i + 1]; if (p0.x < x1 && p1.x < x1) { continue; } else if (p0.x < x1) { p0 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); } else if (p1.x < x1) { p1 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); } if (p0.y < y1 && p1.y < y1) { continue; } else if (p0.y < y1) { p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); } else if (p1.y < y1) { p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); } if (p0.x >= x2 && p1.x >= x2) { continue; } else if (p0.x >= x2) { p0 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); } else if (p1.x >= x2) { p1 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); } if (p0.y >= y2 && p1.y >= y2) { continue; } else if (p0.y >= y2) { p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); } else if (p1.y >= y2) { p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); } if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) { clippedLine = [p0]; clippedLines.push(clippedLine); } clippedLine.push(p1); } } return clippedLines; } // /** * A textured quad for rendering a single icon or glyph. * * The zoom range the glyph can be shown is defined by minScale and maxScale. * * @param tl The offset of the top left corner from the anchor. * @param tr The offset of the top right corner from the anchor. * @param bl The offset of the bottom left corner from the anchor. * @param br The offset of the bottom right corner from the anchor. * @param tex The texture coordinates. * * @private */ /** * Create the quads used for rendering an icon. * @private */ function getIconQuads(anchor , shapedIcon , layer , alongLine , shapedText , feature ) { var image = shapedIcon.image; var layout = layer.layout; // If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual // pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped // on one edge in some cases. var border = 1; var top = shapedIcon.top - border / image.pixelRatio; var left = shapedIcon.left - border / image.pixelRatio; var bottom = shapedIcon.bottom + border / image.pixelRatio; var right = shapedIcon.right + border / image.pixelRatio; var tl, tr, br, bl; // text-fit mode if (layout.get('icon-text-fit') !== 'none' && shapedText) { var iconWidth = (right - left), iconHeight = (bottom - top), size = layout.get('text-size').evaluate(feature, {}) / 24, textLeft = shapedText.left * size, textRight = shapedText.right * size, textTop = shapedText.top * size, textBottom = shapedText.bottom * size, textWidth = textRight - textLeft, textHeight = textBottom - textTop, padT = layout.get('icon-text-fit-padding')[0], padR = layout.get('icon-text-fit-padding')[1], padB = layout.get('icon-text-fit-padding')[2], padL = layout.get('icon-text-fit-padding')[3], offsetY = layout.get('icon-text-fit') === 'width' ? (textHeight - iconHeight) * 0.5 : 0, offsetX = layout.get('icon-text-fit') === 'height' ? (textWidth - iconWidth) * 0.5 : 0, width = layout.get('icon-text-fit') === 'width' || layout.get('icon-text-fit') === 'both' ? textWidth : iconWidth, height = layout.get('icon-text-fit') === 'height' || layout.get('icon-text-fit') === 'both' ? textHeight : iconHeight; tl = new pointGeometry(textLeft + offsetX - padL, textTop + offsetY - padT); tr = new pointGeometry(textLeft + offsetX + padR + width, textTop + offsetY - padT); br = new pointGeometry(textLeft + offsetX + padR + width, textTop + offsetY + padB + height); bl = new pointGeometry(textLeft + offsetX - padL, textTop + offsetY + padB + height); // Normal icon size mode } else { tl = new pointGeometry(left, top); tr = new pointGeometry(right, top); br = new pointGeometry(right, bottom); bl = new pointGeometry(left, bottom); } var angle = layer.layout.get('icon-rotate').evaluate(feature, {}) * Math.PI / 180; if (angle) { var sin = Math.sin(angle), cos = Math.cos(angle), matrix = [cos, -sin, sin, cos]; tl._matMult(matrix); tr._matMult(matrix); bl._matMult(matrix); br._matMult(matrix); } // Icon quad is padded, so texture coordinates also need to be padded. return [{tl: tl, tr: tr, bl: bl, br: br, tex: image.paddedRect, writingMode: undefined, glyphOffset: [0, 0], sectionIndex: 0}]; } /** * Create the quads used for rendering a text label. * @private */ function getGlyphQuads(anchor , shaping , textOffset , layer , alongLine , feature , positions , allowVerticalPlacement ) { var textRotate = layer.layout.get('text-rotate').evaluate(feature, {}) * Math.PI / 180; var positionedGlyphs = shaping.positionedGlyphs; var quads = []; for (var k = 0; k < positionedGlyphs.length; k++) { var positionedGlyph = positionedGlyphs[k]; var glyphPositions = positions[positionedGlyph.fontStack]; var glyph = glyphPositions && glyphPositions[positionedGlyph.glyph]; if (!glyph) { continue; } var rect = glyph.rect; if (!rect) { continue; } // The rects have an addditional buffer that is not included in their size. var glyphPadding = 1.0; var rectBuffer = GLYPH_PBF_BORDER + glyphPadding; var halfAdvance = glyph.metrics.advance * positionedGlyph.scale / 2; var glyphOffset = alongLine ? [positionedGlyph.x + halfAdvance, positionedGlyph.y] : [0, 0]; var builtInOffset = alongLine ? [0, 0] : [positionedGlyph.x + halfAdvance + textOffset[0], positionedGlyph.y + textOffset[1]]; var rotateVerticalGlyph = (alongLine || allowVerticalPlacement) && positionedGlyph.vertical; var verticalizedLabelOffset = [0, 0]; if (rotateVerticalGlyph) { // Vertical POI labels that are rotated 90deg CW and whose glyphs must preserve upright orientation // need to be rotated 90deg CCW. After a quad is rotated, it is translated to the original built-in offset. verticalizedLabelOffset = builtInOffset; builtInOffset = [0, 0]; } var x1 = (glyph.metrics.left - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset[0]; var y1 = (-glyph.metrics.top - rectBuffer) * positionedGlyph.scale + builtInOffset[1]; var x2 = x1 + rect.w * positionedGlyph.scale; var y2 = y1 + rect.h * positionedGlyph.scale; var tl = new pointGeometry(x1, y1); var tr = new pointGeometry(x2, y1); var bl = new pointGeometry(x1, y2); var br = new pointGeometry(x2, y2); if (rotateVerticalGlyph) { // Vertical-supporting glyphs are laid out in 24x24 point boxes (1 square em) // In horizontal orientation, the y values for glyphs are below the midline // and we use a "yOffset" of -17 to pull them up to the middle. // By rotating counter-clockwise around the point at the center of the left // edge of a 24x24 layout box centered below the midline, we align the center // of the glyphs with the horizontal midline, so the yOffset is no longer // necessary, but we also pull the glyph to the left along the x axis. // The y coordinate includes baseline yOffset, thus needs to be accounted // for when glyph is rotated and translated. var center = new pointGeometry(-halfAdvance, halfAdvance - shaping.yOffset); var verticalRotation = -Math.PI / 2; // xHalfWidhtOffsetcorrection is a difference between full-width and half-width // advance, should be 0 for full-width glyphs and will pull up half-width glyphs. var xHalfWidhtOffsetcorrection = ONE_EM / 2 - halfAdvance; var xOffsetCorrection = new pointGeometry(5 - shaping.yOffset - xHalfWidhtOffsetcorrection, 0); var verticalOffsetCorrection = new (Function.prototype.bind.apply( pointGeometry, [ null ].concat( verticalizedLabelOffset) )); tl._rotateAround(verticalRotation, center)._add(xOffsetCorrection)._add(verticalOffsetCorrection); tr._rotateAround(verticalRotation, center)._add(xOffsetCorrection)._add(verticalOffsetCorrection); bl._rotateAround(verticalRotation, center)._add(xOffsetCorrection)._add(verticalOffsetCorrection); br._rotateAround(verticalRotation, center)._add(xOffsetCorrection)._add(verticalOffsetCorrection); } if (textRotate) { var sin = Math.sin(textRotate), cos = Math.cos(textRotate), matrix = [cos, -sin, sin, cos]; tl._matMult(matrix); tr._matMult(matrix); bl._matMult(matrix); br._matMult(matrix); } quads.push({tl: tl, tr: tr, bl: bl, br: br, tex: rect, writingMode: shaping.writingMode, glyphOffset: glyphOffset, sectionIndex: positionedGlyph.sectionIndex}); } return quads; } // /** * A CollisionFeature represents the area of the tile covered by a single label. * It is used with CollisionIndex to check if the label overlaps with any * previous labels. A CollisionFeature is mostly just a set of CollisionBox * objects. * * @private */ var CollisionFeature = function CollisionFeature(collisionBoxArray , line , anchor , featureIndex , sourceLayerIndex , bucketIndex , shaped , boxScale , padding , alignLine , overscaling , rotate ) { var y1 = shaped.top * boxScale - padding; var y2 = shaped.bottom * boxScale + padding; var x1 = shaped.left * boxScale - padding; var x2 = shaped.right * boxScale + padding; this.boxStartIndex = collisionBoxArray.length; if (alignLine) { var height = y2 - y1; var length = x2 - x1; if (height > 0) { // set minimum box height to avoid very many small labels height = Math.max(10 * boxScale, height); this._addLineCollisionCircles(collisionBoxArray, line, anchor, (anchor.segment ), length, height, featureIndex, sourceLayerIndex, bucketIndex, overscaling); } } else { if (rotate) { // Account for *-rotate in point collision boxes // See https://github.com/mapbox/mapbox-gl-js/issues/6075 // Doesn't account for icon-text-fit var tl = new pointGeometry(x1, y1); var tr = new pointGeometry(x2, y1); var bl = new pointGeometry(x1, y2); var br = new pointGeometry(x2, y2); var rotateRadians = rotate * Math.PI / 180; tl._rotate(rotateRadians); tr._rotate(rotateRadians); bl._rotate(rotateRadians); br._rotate(rotateRadians); // Collision features require an "on-axis" geometry, // so take the envelope of the rotated geometry // (may be quite large for wide labels rotated 45 degrees) x1 = Math.min(tl.x, tr.x, bl.x, br.x); x2 = Math.max(tl.x, tr.x, bl.x, br.x); y1 = Math.min(tl.y, tr.y, bl.y, br.y); y2 = Math.max(tl.y, tr.y, bl.y, br.y); } collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, featureIndex, sourceLayerIndex, bucketIndex, 0, 0); } this.boxEndIndex = collisionBoxArray.length; }; /** * Create a set of CollisionBox objects for a line. * * @param labelLength The length of the label in geometry units. * @param anchor The point along the line around which the label is anchored. * @param boxSize The size of the collision boxes that will be created. * @private */ CollisionFeature.prototype._addLineCollisionCircles = function _addLineCollisionCircles (collisionBoxArray , line , anchor , segment , labelLength , boxSize , featureIndex , sourceLayerIndex , bucketIndex , overscaling ) { var step = boxSize / 2; var nBoxes = Math.floor(labelLength / step) || 1; // We calculate line collision circles out to 300% of what would normally be our // max size, to allow collision detection to work on labels that expand as // they move into the distance // Vertically oriented labels in the distant field can extend past this padding // This is a noticeable problem in overscaled tiles where the pitch 0-based // symbol spacing will put labels very close together in a pitched map. // To reduce the cost of adding extra collision circles, we slowly increase // them for overscaled tiles. var overscalingPaddingFactor = 1 + .4 * Math.log(overscaling) / Math.LN2; var nPitchPaddingBoxes = Math.floor(nBoxes * overscalingPaddingFactor / 2); // offset the center of the first box by half a box so that the edge of the // box is at the edge of the label. var firstBoxOffset = -boxSize / 2; var p = anchor; var index = segment + 1; var anchorDistance = firstBoxOffset; var labelStartDistance = -labelLength / 2; var paddingStartDistance = labelStartDistance - labelLength / 4; // move backwards along the line to the first segment the label appears on do { index--; if (index < 0) { if (anchorDistance > labelStartDistance) { // there isn't enough room for the label after the beginning of the line // checkMaxAngle should have already caught this return; } else { // The line doesn't extend far enough back for all of our padding, // but we got far enough to show the label under most conditions. index = 0; break; } } else { anchorDistance -= line[index].dist(p); p = line[index]; } } while (anchorDistance > paddingStartDistance); var segmentLength = line[index].dist(line[index + 1]); for (var i = -nPitchPaddingBoxes; i < nBoxes + nPitchPaddingBoxes; i++) { // the distance the box will be from the anchor var boxOffset = i * step; var boxDistanceToAnchor = labelStartDistance + boxOffset; // make the distance between pitch padding boxes bigger if (boxOffset < 0) { boxDistanceToAnchor += boxOffset; } if (boxOffset > labelLength) { boxDistanceToAnchor += boxOffset - labelLength; } if (boxDistanceToAnchor < anchorDistance) { // The line doesn't extend far enough back for this box, skip it // (This could allow for line collisions on distant tiles) continue; } // the box is not on the current segment. Move to the next segment. while (anchorDistance + segmentLength < boxDistanceToAnchor) { anchorDistance += segmentLength; index++; // There isn't enough room before the end of the line. if (index + 1 >= line.length) { return; } segmentLength = line[index].dist(line[index + 1]); } // the distance the box will be from the beginning of the segment var segmentBoxDistance = boxDistanceToAnchor - anchorDistance; var p0 = line[index]; var p1 = line[index + 1]; var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round(); // If the box is within boxSize of the anchor, force the box to be used // (so even 0-width labels use at least one box) // Otherwise, the .8 multiplication gives us a little bit of conservative // padding in choosing which boxes to use (see CollisionIndex#placedCollisionCircles) var paddedAnchorDistance = Math.abs(boxDistanceToAnchor - firstBoxOffset) < step ? 0 : (boxDistanceToAnchor - firstBoxOffset) * 0.8; collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y, -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, featureIndex, sourceLayerIndex, bucketIndex, boxSize / 2, paddedAnchorDistance); } }; var TinyQueue = function TinyQueue(data, compare) { if ( data === void 0 ) data = []; if ( compare === void 0 ) compare = defaultCompare$1; this.data = data; this.length = this.data.length; this.compare = compare; if (this.length > 0) { for (var i = (this.length >> 1) - 1; i >= 0; i--) { this._down(i); } } }; TinyQueue.prototype.push = function push (item) { this.data.push(item); this.length++; this._up(this.length - 1); }; TinyQueue.prototype.pop = function pop () { if (this.length === 0) { return undefined; } var top = this.data[0]; var bottom = this.data.pop(); this.length--; if (this.length > 0) { this.data[0] = bottom; this._down(0); } return top; }; TinyQueue.prototype.peek = function peek () { return this.data[0]; }; TinyQueue.prototype._up = function _up (pos) { var ref = this; var data = ref.data; var compare = ref.compare; var item = data[pos]; while (pos > 0) { var parent = (pos - 1) >> 1; var current = data[parent]; if (compare(item, current) >= 0) { break; } data[pos] = current; pos = parent; } data[pos] = item; }; TinyQueue.prototype._down = function _down (pos) { var ref = this; var data = ref.data; var compare = ref.compare; var halfLength = this.length >> 1; var item = data[pos]; while (pos < halfLength) { var left = (pos << 1) + 1; var best = data[left]; var right = left + 1; if (right < this.length && compare(data[right], best) < 0) { left = right; best = data[right]; } if (compare(best, item) >= 0) { break; } data[pos] = best; pos = left; } data[pos] = item; }; function defaultCompare$1(a, b) { return a < b ? -1 : a > b ? 1 : 0; } // /** * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility * This is a copy of http://github.com/mapbox/polylabel adapted to use Points * * @param polygonRings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings * @param precision Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision * @param debug Print some statistics to the console during execution * @returns Pole of Inaccessibiliy. * @private */ function findPoleOfInaccessibility (polygonRings , precision, debug) { if ( precision === void 0 ) precision = 1; if ( debug === void 0 ) debug = false; // find the bounding box of the outer ring var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; var outerRing = polygonRings[0]; for (var i = 0; i < outerRing.length; i++) { var p = outerRing[i]; if (!i || p.x < minX) { minX = p.x; } if (!i || p.y < minY) { minY = p.y; } if (!i || p.x > maxX) { maxX = p.x; } if (!i || p.y > maxY) { maxY = p.y; } } var width = maxX - minX; var height = maxY - minY; var cellSize = Math.min(width, height); var h = cellSize / 2; // a priority queue of cells in order of their "potential" (max distance to polygon) var cellQueue = new TinyQueue([], compareMax); if (cellSize === 0) { return new pointGeometry(minX, minY); } // cover polygon with initial cells for (var x = minX; x < maxX; x += cellSize) { for (var y = minY; y < maxY; y += cellSize) { cellQueue.push(new Cell(x + h, y + h, h, polygonRings)); } } // take centroid as the first best guess var bestCell = getCentroidCell(polygonRings); var numProbes = cellQueue.length; while (cellQueue.length) { // pick the most promising cell from the queue var cell = cellQueue.pop(); // update the best cell if we found a better one if (cell.d > bestCell.d || !bestCell.d) { bestCell = cell; if (debug) { console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes); } } // do not drill down further if there's no chance of a better solution if (cell.max - bestCell.d <= precision) { continue; } // split the cell into four cells h = cell.h / 2; cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings)); numProbes += 4; } if (debug) { console.log(("num probes: " + numProbes)); console.log(("best distance: " + (bestCell.d))); } return bestCell.p; } function compareMax(a, b) { return b.max - a.max; } function Cell(x, y, h, polygon) { this.p = new pointGeometry(x, y); this.h = h; // half the cell size this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell } // signed distance from point to polygon outline (negative if point is outside) function pointToPolygonDist(p, polygon) { var inside = false; var minDistSq = Infinity; for (var k = 0; k < polygon.length; k++) { var ring = polygon[k]; for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { var a = ring[i]; var b = ring[j]; if ((a.y > p.y !== b.y > p.y) && (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) { inside = !inside; } minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b)); } } return (inside ? 1 : -1) * Math.sqrt(minDistSq); } // get polygon centroid function getCentroidCell(polygon) { var area = 0; var x = 0; var y = 0; var points = polygon[0]; for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) { var a = points[i]; var b = points[j]; var f = a.x * b.y - b.x * a.y; x += (a.x + b.x) * f; y += (a.y + b.y) * f; area += f * 3; } return new Cell(x / area, y / area, 0, polygon); } var murmurhash3_gc = createCommonjsModule(function (module) { /** * 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 */ 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; } }); var murmurhash2_gc = createCommonjsModule(function (module) { /** * 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 */ 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; 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)); } 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; // // The symbol layout process needs `text-size` evaluated at up to five different zoom levels, and // `icon-size` at up to three: // // 1. `text-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `text-size` // expressions, and to calculate the box dimensions for icon-text-fit. // 2. `icon-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `icon-size` // expressions. // 3. `text-size` and `icon-size` at the zoom level of the bucket, plus one. Used to calculate collision boxes. // 4. `text-size` at zoom level 18. Used for something line-symbol-placement-related. // 5. For composite `*-size` expressions: two zoom levels of curve stops that "cover" the zoom level of the // bucket. These go into a vertex buffer and are used by the shader to interpolate the size at render time. // // (1) and (2) are stored in `bucket.layers[0].layout`. The remainder are below. // // The radial offset is to the edge of the text box // In the horizontal direction, the edge of the text box is where glyphs start // But in the vertical direction, the glyphs appear to "start" at the baseline // We don't actually load baseline data, but we assume an offset of ONE_EM - 17 // (see "yOffset" in shaping.js) var baselineOffset = 7; function evaluateRadialOffset(anchor , radialOffset ) { var x = 0, y = 0; // solve for r where r^2 + r^2 = radialOffset^2 var hypotenuse = radialOffset / Math.sqrt(2); switch (anchor) { case 'top-right': case 'top-left': y = hypotenuse - baselineOffset; break; case 'bottom-right': case 'bottom-left': y = -hypotenuse + baselineOffset; break; case 'bottom': y = -radialOffset + baselineOffset; break; case 'top': y = radialOffset - baselineOffset; break; } switch (anchor) { case 'top-right': case 'bottom-right': x = -hypotenuse; break; case 'top-left': case 'bottom-left': x = hypotenuse; break; case 'left': x = radialOffset; break; case 'right': x = -radialOffset; break; } return [x, y]; } function performSymbolLayout(bucket , glyphMap , glyphPositions , imageMap , imagePositions , showCollisionBoxes ) { bucket.createArrays(); var tileSize = 512 * bucket.overscaling; bucket.tilePixelRatio = EXTENT / tileSize; bucket.compareText = {}; bucket.iconsNeedLinear = false; var layout = bucket.layers[0].layout; var unevaluatedLayoutValues = bucket.layers[0]._unevaluatedLayout._values; var sizes = {}; if (bucket.textSizeData.kind === 'composite') { var ref = bucket.textSizeData; var minZoom = ref.minZoom; var maxZoom = ref.maxZoom; sizes.compositeTextSizes = [ unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(minZoom)), unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(maxZoom)) ]; } if (bucket.iconSizeData.kind === 'composite') { var ref$1 = bucket.iconSizeData; var minZoom$1 = ref$1.minZoom; var maxZoom$1 = ref$1.maxZoom; sizes.compositeIconSizes = [ unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(minZoom$1)), unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(maxZoom$1)) ]; } sizes.layoutTextSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1)); sizes.layoutIconSize = unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1)); sizes.textMaxSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(18)); var lineHeight = layout.get('text-line-height') * ONE_EM; var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; var keepUpright = layout.get('text-keep-upright'); var loop = function () { var feature = list[i$1]; var fontstack = layout.get('text-font').evaluate(feature, {}).join(','); var glyphPositionMap = glyphPositions; var shapedTextOrientations = { horizontal: {}, vertical: undefined }; var text = feature.text; var textOffset = [0, 0]; if (text) { var unformattedText = text.toString(); var spacing = layout.get('text-letter-spacing').evaluate(feature, {}) * ONE_EM; var spacingIfAllowed = allowsLetterSpacing(unformattedText) ? spacing : 0; var textAnchor = layout.get('text-anchor').evaluate(feature, {}); var variableTextAnchor = layout.get('text-variable-anchor'); var radialOffset = layout.get('text-radial-offset').evaluate(feature, {}); if (!variableTextAnchor) { // Layers with variable anchors use the `text-radial-offset` property and the [x, y] offset vector // is calculated at placement time instead of layout time if (radialOffset) { // The style spec says don't use `text-offset` and `text-radial-offset` together // but doesn't actually specify what happens if you use both. We go with the radial offset. textOffset = evaluateRadialOffset(textAnchor, radialOffset * ONE_EM); } else { textOffset = (layout.get('text-offset').evaluate(feature, {}).map(function (t) { return t * ONE_EM; }) ); } } var textJustify = textAlongLine ? "center" : layout.get('text-justify').evaluate(feature, {}); var maxWidth = layout.get('symbol-placement') === 'point' ? layout.get('text-max-width').evaluate(feature, {}) * ONE_EM : 0; var addVerticalShapingForPointLabelIfNeeded = function () { if (bucket.allowVerticalPlacement && allowsVerticalWritingMode(unformattedText)) { // Vertical POI label placement is meant to be used for scripts that support vertical // writing mode, thus, default left justification is used. If Latin // scripts would need to be supported, this should take into account other justifications. shapedTextOrientations.vertical = shapeText(text, glyphMap, fontstack, maxWidth, lineHeight, textAnchor, 'left', spacingIfAllowed, textOffset, WritingMode.vertical, true); } }; // If this layer uses text-variable-anchor, generate shapings for all justification possibilities. if (!textAlongLine && variableTextAnchor) { var justifications = textJustify === "auto" ? variableTextAnchor.map(function (a) { return getAnchorJustification(a); }) : [textJustify]; var singleLine = false; for (var i = 0; i < justifications.length; i++) { var justification = justifications[i]; if (shapedTextOrientations.horizontal[justification]) { continue; } if (singleLine) { // If the shaping for the first justification was only a single line, we // can re-use it for the other justifications shapedTextOrientations.horizontal[justification] = shapedTextOrientations.horizontal[0]; } else { // If using text-variable-anchor for the layer, we use a center anchor for all shapings and apply // the offsets for the anchor in the placement step. var shaping = shapeText(text, glyphMap, fontstack, maxWidth, lineHeight, 'center', justification, spacingIfAllowed, textOffset, WritingMode.horizontal, false); if (shaping) { shapedTextOrientations.horizontal[justification] = shaping; singleLine = shaping.lineCount === 1; } } } addVerticalShapingForPointLabelIfNeeded(); } else { if (textJustify === "auto") { textJustify = getAnchorJustification(textAnchor); } // Horizontal point or line label. var shaping$1 = shapeText(text, glyphMap, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, WritingMode.horizontal, false); if (shaping$1) { shapedTextOrientations.horizontal[textJustify] = shaping$1; } // Vertical point label (if allowVerticalPlacement is enabled). addVerticalShapingForPointLabelIfNeeded(); // Verticalized line label. if (allowsVerticalWritingMode(unformattedText) && textAlongLine && keepUpright) { shapedTextOrientations.vertical = shapeText(text, glyphMap, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, WritingMode.vertical, false); } } } var shapedIcon = (void 0); if (feature.icon) { var image = imageMap[feature.icon]; if (image) { shapedIcon = shapeIcon( imagePositions[feature.icon], layout.get('icon-offset').evaluate(feature, {}), layout.get('icon-anchor').evaluate(feature, {})); if (bucket.sdfIcons === undefined) { bucket.sdfIcons = image.sdf; } else if (bucket.sdfIcons !== image.sdf) { warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer'); } if (image.pixelRatio !== bucket.pixelRatio) { bucket.iconsNeedLinear = true; } else if (layout.get('icon-rotate').constantOr(1) !== 0) { bucket.iconsNeedLinear = true; } } } if (Object.keys(shapedTextOrientations.horizontal).length || shapedIcon) { addFeature(bucket, feature, shapedTextOrientations, shapedIcon, glyphPositionMap, sizes, textOffset); } }; for (var i$1 = 0, list = bucket.features; i$1 < list.length; i$1 += 1) loop(); if (showCollisionBoxes) { bucket.generateCollisionDebugBuffers(); } } // Choose the justification that matches the direction of the TextAnchor function getAnchorJustification(anchor ) { switch (anchor) { case 'right': case 'top-right': case 'bottom-right': return 'right'; case 'left': case 'top-left': case 'bottom-left': return 'left'; } return 'center'; } /** * Given a feature and its shaped text and icon data, add a 'symbol * instance' for each _possible_ placement of the symbol feature. * (At render timePlaceSymbols#place() selects which of these instances to * show or hide based on collisions with symbols in other layers.) * @private */ function addFeature(bucket , feature , shapedTextOrientations , shapedIcon , glyphPositionMap , sizes , textOffset ) { var layoutTextSize = sizes.layoutTextSize.evaluate(feature, {}); var layoutIconSize = sizes.layoutIconSize.evaluate(feature, {}); // To reduce the number of labels that jump around when zooming we need // to use a text-size value that is the same for all zoom levels. // bucket calculates text-size at a high zoom level so that all tiles can // use the same value when calculating anchor positions. var textMaxSize = sizes.textMaxSize.evaluate(feature, {}); if (textMaxSize === undefined) { textMaxSize = layoutTextSize; } var layout = bucket.layers[0].layout; var iconOffset = layout.get('icon-offset').evaluate(feature, {}); var defaultHorizontalShaping = getDefaultHorizontalShaping(shapedTextOrientations.horizontal); var glyphSize = 24, fontScale = layoutTextSize / glyphSize, textBoxScale = bucket.tilePixelRatio * fontScale, textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize, iconBoxScale = bucket.tilePixelRatio * layoutIconSize, symbolMinDistance = bucket.tilePixelRatio * layout.get('symbol-spacing'), textPadding = layout.get('text-padding') * bucket.tilePixelRatio, iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio, textMaxAngle = layout.get('text-max-angle') / 180 * Math.PI, textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', iconAlongLine = layout.get('icon-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', symbolPlacement = layout.get('symbol-placement'), textRepeatDistance = symbolMinDistance / 2; var addSymbolAtAnchor = function (line, anchor) { if (anchor.x < 0 || anchor.x >= EXTENT || anchor.y < 0 || anchor.y >= EXTENT) { // Symbol layers are drawn across tile boundaries, We filter out symbols // outside our tile boundaries (which may be included in vector tile buffers) // to prevent double-drawing symbols. return; } addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, bucket.layers[0], bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex, bucket.index, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, glyphPositionMap, sizes); }; if (symbolPlacement === 'line') { for (var i$1 = 0, list$1 = clipLine(feature.geometry, 0, 0, EXTENT, EXTENT); i$1 < list$1.length; i$1 += 1) { var line = list$1[i$1]; var anchors = getAnchors( line, symbolMinDistance, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale, bucket.overscaling, EXTENT ); for (var i = 0, list = anchors; i < list.length; i += 1) { var anchor = list[i]; var shapedText = defaultHorizontalShaping; if (!shapedText || !anchorIsTooClose(bucket, shapedText.text, textRepeatDistance, anchor)) { addSymbolAtAnchor(line, anchor); } } } } else if (symbolPlacement === 'line-center') { // No clipping, multiple lines per feature are allowed // "lines" with only one point are ignored as in clipLines for (var i$2 = 0, list$2 = feature.geometry; i$2 < list$2.length; i$2 += 1) { var line$1 = list$2[i$2]; if (line$1.length > 1) { var anchor$1 = getCenterAnchor( line$1, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale); if (anchor$1) { addSymbolAtAnchor(line$1, anchor$1); } } } } else if (feature.type === 'Polygon') { for (var i$3 = 0, list$3 = classifyRings(feature.geometry, 0); i$3 < list$3.length; i$3 += 1) { // 16 here represents 2 pixels var polygon = list$3[i$3]; var poi = findPoleOfInaccessibility(polygon, 16); addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0)); } } else if (feature.type === 'LineString') { // https://github.com/mapbox/mapbox-gl-js/issues/3808 for (var i$4 = 0, list$4 = feature.geometry; i$4 < list$4.length; i$4 += 1) { var line$2 = list$4[i$4]; addSymbolAtAnchor(line$2, new Anchor(line$2[0].x, line$2[0].y, 0)); } } else if (feature.type === 'Point') { for (var i$6 = 0, list$6 = feature.geometry; i$6 < list$6.length; i$6 += 1) { var points = list$6[i$6]; for (var i$5 = 0, list$5 = points; i$5 < list$5.length; i$5 += 1) { var point = list$5[i$5]; addSymbolAtAnchor([point], new Anchor(point.x, point.y, 0)); } } } } var MAX_PACKED_SIZE = 65535; function addTextVertices(bucket , anchor , shapedText , layer , textAlongLine , feature , textOffset , lineArray , writingMode , placementTypes , placedTextSymbolIndices , glyphPositionMap , sizes ) { var glyphQuads = getGlyphQuads(anchor, shapedText, textOffset, layer, textAlongLine, feature, glyphPositionMap, bucket.allowVerticalPlacement); var sizeData = bucket.textSizeData; var textSizeData = null; if (sizeData.kind === 'source') { textSizeData = [ SIZE_PACK_FACTOR * layer.layout.get('text-size').evaluate(feature, {}) ]; if (textSizeData[0] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"text-size\" is >= 256. Reduce your \"text-size\".")); } } else if (sizeData.kind === 'composite') { textSizeData = [ SIZE_PACK_FACTOR * sizes.compositeTextSizes[0].evaluate(feature, {}), SIZE_PACK_FACTOR * sizes.compositeTextSizes[1].evaluate(feature, {}) ]; if (textSizeData[0] > MAX_PACKED_SIZE || textSizeData[1] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"text-size\" is >= 256. Reduce your \"text-size\".")); } } bucket.addSymbols( bucket.text, glyphQuads, textSizeData, textOffset, textAlongLine, feature, writingMode, anchor, lineArray.lineStartIndex, lineArray.lineLength); // The placedSymbolArray is used at render time in drawTileSymbols // These indices allow access to the array at collision detection time for (var i = 0, list = placementTypes; i < list.length; i += 1) { var placementType = list[i]; placedTextSymbolIndices[placementType] = bucket.text.placedSymbolArray.length - 1; } return glyphQuads.length * 4; } function getDefaultHorizontalShaping(horizontalShaping ) { // We don't care which shaping we get because this is used for collision purposes // and all the justifications have the same collision box for (var justification in horizontalShaping) { return horizontalShaping[justification]; } return null; } /** * Add a single label & icon placement. * * @private */ function addSymbol(bucket , anchor , line , shapedTextOrientations , shapedIcon , layer , collisionBoxArray , featureIndex , sourceLayerIndex , bucketIndex , textBoxScale , textPadding , textAlongLine , textOffset , iconBoxScale , iconPadding , iconAlongLine , iconOffset , feature , glyphPositionMap , sizes ) { var lineArray = bucket.addToLineVertexArray(anchor, line); var textCollisionFeature, iconCollisionFeature, verticalTextCollisionFeature; var numIconVertices = 0; var numHorizontalGlyphVertices = 0; var numVerticalGlyphVertices = 0; var placedTextSymbolIndices = {}; var key = murmurhashJs(''); var radialTextOffset = (layer.layout.get('text-radial-offset').evaluate(feature, {}) || 0) * ONE_EM; if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) { var textRotation = layer.layout.get('text-rotate').evaluate(feature, {}); var verticalTextRotation = textRotation + 90.0; var verticalShaping = shapedTextOrientations.vertical; verticalTextCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticalShaping, textBoxScale, textPadding, textAlongLine, bucket.overscaling, verticalTextRotation); } for (var justification in shapedTextOrientations.horizontal) { var shaping = shapedTextOrientations.horizontal[justification]; if (!textCollisionFeature) { key = murmurhashJs(shaping.text); var textRotate = layer.layout.get('text-rotate').evaluate(feature, {}); // As a collision approximation, we can use either the vertical or any of the horizontal versions of the feature // We're counting on all versions having similar dimensions textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textBoxScale, textPadding, textAlongLine, bucket.overscaling, textRotate); } var singleLine = shaping.lineCount === 1; numHorizontalGlyphVertices += addTextVertices( bucket, anchor, shaping, layer, textAlongLine, feature, textOffset, lineArray, shapedTextOrientations.vertical ? WritingMode.horizontal : WritingMode.horizontalOnly, singleLine ? (Object.keys(shapedTextOrientations.horizontal) ) : [justification], placedTextSymbolIndices, glyphPositionMap, sizes); if (singleLine) { break; } } if (shapedTextOrientations.vertical) { numVerticalGlyphVertices += addTextVertices( bucket, anchor, shapedTextOrientations.vertical, layer, textAlongLine, feature, textOffset, lineArray, WritingMode.vertical, ['vertical'], placedTextSymbolIndices, glyphPositionMap, sizes); } var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; var verticalTextBoxStartIndex = verticalTextCollisionFeature ? verticalTextCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var verticalTextBoxEndIndex = verticalTextCollisionFeature ? verticalTextCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; if (shapedIcon) { var iconQuads = getIconQuads(anchor, shapedIcon, layer, iconAlongLine, getDefaultHorizontalShaping(shapedTextOrientations.horizontal), feature); var iconRotate = layer.layout.get('icon-rotate').evaluate(feature, {}); iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, /*align boxes to line*/false, bucket.overscaling, iconRotate); numIconVertices = iconQuads.length * 4; var sizeData = bucket.iconSizeData; var iconSizeData = null; if (sizeData.kind === 'source') { iconSizeData = [ SIZE_PACK_FACTOR * layer.layout.get('icon-size').evaluate(feature, {}) ]; if (iconSizeData[0] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"icon-size\" is >= 256. Reduce your \"icon-size\".")); } } else if (sizeData.kind === 'composite') { iconSizeData = [ SIZE_PACK_FACTOR * sizes.compositeIconSizes[0].evaluate(feature, {}), SIZE_PACK_FACTOR * sizes.compositeIconSizes[1].evaluate(feature, {}) ]; if (iconSizeData[0] > MAX_PACKED_SIZE || iconSizeData[1] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"icon-size\" is >= 256. Reduce your \"icon-size\".")); } } bucket.addSymbols( bucket.icon, iconQuads, iconSizeData, iconOffset, iconAlongLine, feature, false, anchor, lineArray.lineStartIndex, lineArray.lineLength); } var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; if (bucket.glyphOffsetArray.length >= SymbolBucket.MAX_GLYPHS) { warnOnce( "Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907" ); } bucket.symbolInstances.emplaceBack( anchor.x, anchor.y, placedTextSymbolIndices.right >= 0 ? placedTextSymbolIndices.right : -1, placedTextSymbolIndices.center >= 0 ? placedTextSymbolIndices.center : -1, placedTextSymbolIndices.left >= 0 ? placedTextSymbolIndices.left : -1, placedTextSymbolIndices.vertical || -1, key, textBoxStartIndex, textBoxEndIndex, verticalTextBoxStartIndex, verticalTextBoxEndIndex, iconBoxStartIndex, iconBoxEndIndex, featureIndex, numHorizontalGlyphVertices, numVerticalGlyphVertices, numIconVertices, 0, textBoxScale, radialTextOffset); } function anchorIsTooClose(bucket , text , repeatDistance , anchor ) { var compareText = bucket.compareText; if (!(text in compareText)) { compareText[text] = []; } else { var otherAnchors = compareText[text]; for (var k = otherAnchors.length - 1; k >= 0; k--) { if (anchor.dist(otherAnchors[k]) < repeatDistance) { // If it's within repeatDistance of one anchor, stop looking return true; } } } // If anchor is not within repeatDistance of any other anchor, add to array compareText[text].push(anchor); return false; } exports.Actor = Actor; exports.AlphaImage = AlphaImage; exports.CanonicalTileID = CanonicalTileID; exports.CollisionBoxArray = CollisionBoxArray; exports.Color = Color; exports.DEMData = DEMData; exports.DataConstantProperty = DataConstantProperty; exports.DictionaryCoder = DictionaryCoder; exports.EXTENT = EXTENT; exports.ErrorEvent = ErrorEvent; exports.EvaluationParameters = EvaluationParameters; exports.Event = Event; exports.Evented = Evented; exports.FeatureIndex = FeatureIndex; exports.FillBucket = FillBucket; exports.FillExtrusionBucket = FillExtrusionBucket; exports.ImageAtlas = ImageAtlas; exports.ImagePosition = ImagePosition; exports.LineBucket = LineBucket; exports.LngLat = LngLat; exports.LngLatBounds = LngLatBounds; exports.MercatorCoordinate = MercatorCoordinate; exports.ONE_EM = ONE_EM; exports.OverscaledTileID = OverscaledTileID; exports.Point = pointGeometry; exports.Point$1 = pointGeometry; exports.ProgramConfiguration = ProgramConfiguration; exports.Properties = Properties; exports.Protobuf = pbf; exports.RGBAImage = RGBAImage; exports.RequestManager = RequestManager; exports.ResourceType = ResourceType; exports.SegmentVector = SegmentVector; exports.SourceFeatureState = SourceFeatureState; exports.StructArrayLayout1ui2 = StructArrayLayout1ui2; exports.StructArrayLayout2i4 = StructArrayLayout2i4; exports.StructArrayLayout2ui4 = StructArrayLayout2ui4; exports.StructArrayLayout3ui6 = StructArrayLayout3ui6; exports.StructArrayLayout4i8 = StructArrayLayout4i8; exports.SymbolBucket = SymbolBucket; 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.UniformMatrix4f = UniformMatrix4f; exports.UnwrappedTileID = UnwrappedTileID; exports.ValidationError = ValidationError; exports.WritingMode = WritingMode; exports.ZoomHistory = ZoomHistory; exports.addDynamicAttributes = addDynamicAttributes; exports.assert = assert_1; exports.asyncAll = asyncAll; exports.bezier = bezier; exports.bindAll = bindAll; exports.browser = exported; exports.cacheEntryPossiblyAdded = cacheEntryPossiblyAdded; exports.clamp = clamp; exports.clearTileCache = clearTileCache; exports.clone = clone$4; exports.clone$1 = clone; exports.config = config; exports.create = create$3; exports.create$1 = create$2; exports.create$2 = create; exports.createCommonjsModule = createCommonjsModule; exports.createExpression = createExpression; exports.createLayout = createLayout; exports.createStyleLayer = createStyleLayer; exports.deepEqual = deepEqual; exports.ease = ease; exports.emitValidationErrors = emitValidationErrors; exports.endsWith = endsWith; exports.enforceCacheSizeLimit = enforceCacheSizeLimit; exports.evaluateRadialOffset = evaluateRadialOffset; exports.evaluateSizeForFeature = evaluateSizeForFeature; exports.evaluateSizeForZoom = evaluateSizeForZoom; exports.evented = evented; exports.extend = extend; exports.featureFilter = createFilter; exports.filterObject = filterObject; exports.fromRotation = fromRotation$2; exports.getAnchorAlignment = getAnchorAlignment; exports.getAnchorJustification = getAnchorJustification; exports.getArrayBuffer = getArrayBuffer; exports.getImage = getImage; exports.getJSON = getJSON; exports.getReferrer = getReferrer; exports.getVideo = getVideo; exports.identity = identity$3; exports.invert = invert$3; exports.isChar = unicodeBlockLookup; exports.isMapboxURL = isMapboxURL; exports.keysDifference = keysDifference; exports.makeRequest = makeRequest; exports.mapObject = mapObject; exports.mercatorXfromLng = mercatorXfromLng; exports.mercatorYfromLat = mercatorYfromLat; exports.mercatorZfromAltitude = mercatorZfromAltitude; exports.multiply = multiply$3; exports.mvt = vectorTile; exports.number = number; exports.ortho = ortho; exports.parseGlyphPBF = parseGlyphPBF; exports.pbf = pbf; exports.performSymbolLayout = performSymbolLayout; exports.perspective = perspective; exports.pick = pick; exports.plugin = plugin; exports.polygonIntersectsPolygon = polygonIntersectsPolygon; exports.postMapLoadEvent = postMapLoadEvent; exports.postTurnstileEvent = postTurnstileEvent; exports.potpack = potpack; exports.rasterBoundsAttributes = rasterBoundsAttributes; exports.refProperties = refProperties; exports.register = register; exports.registerForPluginAvailability = registerForPluginAvailability; exports.rotate = rotate; exports.rotateX = rotateX; exports.rotateZ = rotateZ; exports.scale = scale$3; exports.setCacheLimits = setCacheLimits; exports.setRTLTextPlugin = setRTLTextPlugin; exports.sphericalToCartesian = sphericalToCartesian; exports.styleSpec = spec; exports.symbolSize = symbolSize; exports.transformMat3 = transformMat3; exports.transformMat4 = transformMat4$1; exports.translate = translate$3; exports.uniqueId = uniqueId; exports.validateCustomStyleLayer = validateCustomStyleLayer; exports.validateLight = validateLight$1; exports.validateStyle = validateStyle; exports.values = values; exports.vectorTile = vectorTile; exports.version = version; exports.warnOnce = warnOnce; exports.webpSupported = exported$1; exports.window = self; exports.wrap = wrap; }); define(['./shared'], function (symbol_layout) { 'use strict'; function stringify(obj) { var type = typeof obj; if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null) { return JSON.stringify(obj); } if (Array.isArray(obj)) { var str$1 = '['; for (var i$1 = 0, list = obj; i$1 < list.length; i$1 += 1) { var val = list[i$1]; str$1 += (stringify(val)) + ","; } return (str$1 + "]"); } var keys = Object.keys(obj).sort(); var str = '{'; for (var i = 0; i < keys.length; i++) { str += (JSON.stringify(keys[i])) + ":" + (stringify(obj[keys[i]])) + ","; } return (str + "}"); } function getKey(layer) { var key = ''; for (var i = 0, list = symbol_layout.refProperties; i < list.length; i += 1) { var k = list[i]; key += "/" + (stringify(layer[k])); } return key; } /** * 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) { var groups = {}; for (var i = 0; i < layers.length; i++) { var k = (cachedKeys && cachedKeys[layers[i].id]) || getKey(layers[i]); // update the cache if there is one if (cachedKeys) { cachedKeys[layers[i].id] = k; } var group = groups[k]; if (!group) { group = groups[k] = []; } group.push(layers[i]); } var result = []; for (var k$1 in groups) { result.push(groups[k$1]); } return result; } // var StyleLayerIndex = function StyleLayerIndex(layerConfigs ) { this.keyCache = {}; if (layerConfigs) { this.replace(layerConfigs); } }; StyleLayerIndex.prototype.replace = function replace (layerConfigs ) { this._layerConfigs = {}; this._layers = {}; this.update(layerConfigs, []); }; StyleLayerIndex.prototype.update = function update (layerConfigs , removedIds ) { var this$1 = this; for (var i = 0, list = layerConfigs; i < list.length; i += 1) { var layerConfig = list[i]; this._layerConfigs[layerConfig.id] = layerConfig; var layer = this._layers[layerConfig.id] = symbol_layout.createStyleLayer(layerConfig); layer._featureFilter = symbol_layout.featureFilter(layer.filter); if (this.keyCache[layerConfig.id]) { delete this.keyCache[layerConfig.id]; } } for (var i$1 = 0, list$1 = removedIds; i$1 < list$1.length; i$1 += 1) { var id = list$1[i$1]; delete this.keyCache[id]; delete this._layerConfigs[id]; delete this._layers[id]; } this.familiesBySource = {}; var groups = groupByLayout(symbol_layout.values(this._layerConfigs), this.keyCache); for (var i$2 = 0, list$2 = groups; i$2 < list$2.length; i$2 += 1) { var layerConfigs$1 = list$2[i$2]; var layers = layerConfigs$1.map(function (layerConfig) { return this$1._layers[layerConfig.id]; }); var layer$1 = layers[0]; if (layer$1.visibility === 'none') { continue; } var sourceId = layer$1.source || ''; var sourceGroup = this.familiesBySource[sourceId]; if (!sourceGroup) { sourceGroup = this.familiesBySource[sourceId] = {}; } var sourceLayerId = layer$1.sourceLayer || '_geojsonTileLayer'; var sourceLayerFamilies = sourceGroup[sourceLayerId]; if (!sourceLayerFamilies) { sourceLayerFamilies = sourceGroup[sourceLayerId] = []; } sourceLayerFamilies.push(layers); } }; // var padding = 1; var GlyphAtlas = function GlyphAtlas(stacks ) { var positions = {}; var bins = []; for (var stack in stacks) { var glyphs = stacks[stack]; var stackPositions = positions[stack] = {}; for (var id in glyphs) { var src = glyphs[+id]; if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) { continue; } var bin = { x: 0, y: 0, w: src.bitmap.width + 2 * padding, h: src.bitmap.height + 2 * padding }; bins.push(bin); stackPositions[id] = {rect: bin, metrics: src.metrics}; } } var ref = symbol_layout.potpack(bins); var w = ref.w; var h = ref.h; var image = new symbol_layout.AlphaImage({width: w || 1, height: h || 1}); for (var stack$1 in stacks) { var glyphs$1 = stacks[stack$1]; for (var id$1 in glyphs$1) { var src$1 = glyphs$1[+id$1]; if (!src$1 || src$1.bitmap.width === 0 || src$1.bitmap.height === 0) { continue; } var bin$1 = positions[stack$1][id$1].rect; symbol_layout.AlphaImage.copy(src$1.bitmap, image, {x: 0, y: 0}, {x: bin$1.x + padding, y: bin$1.y + padding}, src$1.bitmap); } } this.image = image; this.positions = positions; }; symbol_layout.register('GlyphAtlas', GlyphAtlas); // var WorkerTile = function WorkerTile(params ) { this.tileID = new symbol_layout.OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y); this.uid = params.uid; this.zoom = params.zoom; this.pixelRatio = params.pixelRatio; this.tileSize = params.tileSize; this.source = params.source; this.overscaling = this.tileID.overscaleFactor(); this.showCollisionBoxes = params.showCollisionBoxes; this.collectResourceTiming = !!params.collectResourceTiming; this.returnDependencies = !!params.returnDependencies; }; WorkerTile.prototype.parse = function parse (data , layerIndex , actor , callback ) { var this$1 = this; this.status = 'parsing'; this.data = data; this.collisionBoxArray = new symbol_layout.CollisionBoxArray(); var sourceLayerCoder = new symbol_layout.DictionaryCoder(Object.keys(data.layers).sort()); var featureIndex = new symbol_layout.FeatureIndex(this.tileID); featureIndex.bucketLayerIDs = []; var buckets = {}; var options = { featureIndex: featureIndex, iconDependencies: {}, patternDependencies: {}, glyphDependencies: {} }; var layerFamilies = layerIndex.familiesBySource[this.source]; for (var sourceLayerId in layerFamilies) { var sourceLayer = data.layers[sourceLayerId]; if (!sourceLayer) { continue; } if (sourceLayer.version === 1) { symbol_layout.warnOnce("Vector tile source \"" + (this.source) + "\" layer \"" + sourceLayerId + "\" " + "does not use vector tile spec v2 and therefore may have some rendering errors."); } var sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId); var features = []; for (var index = 0; index < sourceLayer.length; index++) { var feature = sourceLayer.feature(index); features.push({ feature: feature, index: index, sourceLayerIndex: sourceLayerIndex }); } for (var i = 0, list = layerFamilies[sourceLayerId]; i < list.length; i += 1) { var family = list[i]; var layer = family[0]; symbol_layout.assert(layer.source === this.source); if (layer.minzoom && this.zoom < Math.floor(layer.minzoom)) { continue; } if (layer.maxzoom && this.zoom >= layer.maxzoom) { continue; } if (layer.visibility === 'none') { continue; } recalculateLayers(family, this.zoom); var bucket = buckets[layer.id] = layer.createBucket({ index: featureIndex.bucketLayerIDs.length, layers: family, zoom: this.zoom, pixelRatio: this.pixelRatio, overscaling: this.overscaling, collisionBoxArray: this.collisionBoxArray, sourceLayerIndex: sourceLayerIndex, sourceID: this.source }); bucket.populate(features, options); featureIndex.bucketLayerIDs.push(family.map(function (l) { return l.id; })); } } var error ; var glyphMap ; var iconMap ; var patternMap ; var stacks = symbol_layout.mapObject(options.glyphDependencies, function (glyphs) { return Object.keys(glyphs).map(Number); }); if (Object.keys(stacks).length) { actor.send('getGlyphs', {uid: this.uid, stacks: stacks}, function (err, result) { if (!error) { error = err; glyphMap = result; maybePrepare.call(this$1); } }); } else { glyphMap = {}; } var icons = Object.keys(options.iconDependencies); if (icons.length) { actor.send('getImages', {icons: icons}, function (err, result) { if (!error) { error = err; iconMap = result; maybePrepare.call(this$1); } }); } else { iconMap = {}; } var patterns = Object.keys(options.patternDependencies); if (patterns.length) { actor.send('getImages', {icons: patterns}, function (err, result) { if (!error) { error = err; patternMap = result; maybePrepare.call(this$1); } }); } else { patternMap = {}; } maybePrepare.call(this); function maybePrepare() { if (error) { return callback(error); } else if (glyphMap && iconMap && patternMap) { var glyphAtlas = new GlyphAtlas(glyphMap); var imageAtlas = new symbol_layout.ImageAtlas(iconMap, patternMap); for (var key in buckets) { var bucket = buckets[key]; if (bucket instanceof symbol_layout.SymbolBucket) { recalculateLayers(bucket.layers, this.zoom); symbol_layout.performSymbolLayout(bucket, glyphMap, glyphAtlas.positions, iconMap, imageAtlas.iconPositions, this.showCollisionBoxes); } else if (bucket.hasPattern && (bucket instanceof symbol_layout.LineBucket || bucket instanceof symbol_layout.FillBucket || bucket instanceof symbol_layout.FillExtrusionBucket)) { recalculateLayers(bucket.layers, this.zoom); bucket.addFeatures(options, imageAtlas.patternPositions); } } this.status = 'done'; callback(null, { buckets: symbol_layout.values(buckets).filter(function (b) { return !b.isEmpty(); }), featureIndex: featureIndex, collisionBoxArray: this.collisionBoxArray, glyphAtlasImage: glyphAtlas.image, imageAtlas: imageAtlas, // Only used for benchmarking: glyphMap: this.returnDependencies ? glyphMap : null, iconMap: this.returnDependencies ? iconMap : null, glyphPositions: this.returnDependencies ? glyphAtlas.positions : null }); } } }; function recalculateLayers(layers , zoom ) { // Layers are shared and may have been used by a WorkerTile with a different zoom. var parameters = new symbol_layout.EvaluationParameters(zoom); for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; layer.recalculate(parameters); } } // // Wraps performance to facilitate testing // Not incorporated into browser.js because the latter is poisonous when used outside the main thread var performanceExists = typeof performance !== 'undefined'; var wrapper = {}; wrapper.getEntriesByName = function (url ) { if (performanceExists && performance && performance.getEntriesByName) { return performance.getEntriesByName(url); } else { return false; } }; wrapper.mark = function (name ) { if (performanceExists && performance && performance.mark) { return performance.mark(name); } else { return false; } }; wrapper.measure = function (name , startMark , endMark ) { if (performanceExists && performance && performance.measure) { return performance.measure(name, startMark, endMark); } else { return false; } }; wrapper.clearMarks = function (name ) { if (performanceExists && performance && performance.clearMarks) { return performance.clearMarks(name); } else { return false; } }; wrapper.clearMeasures = function (name ) { if (performanceExists && performance && performance.clearMeasures) { return performance.clearMeasures(name); } else { return false; } }; /** * Safe wrapper for the performance resource timing API in web workers with graceful degradation * * @param {RequestParameters} request * @private */ var Performance = function Performance (request ) { this._marks = { start: [request.url, 'start'].join('#'), end: [request.url, 'end'].join('#'), measure: request.url.toString() }; wrapper.mark(this._marks.start); }; Performance.prototype.finish = function finish () { wrapper.mark(this._marks.end); var resourceTimingData = wrapper.getEntriesByName(this._marks.measure); // fallback if web worker implementation of perf.getEntriesByName returns empty if (resourceTimingData.length === 0) { wrapper.measure(this._marks.measure, this._marks.start, this._marks.end); resourceTimingData = wrapper.getEntriesByName(this._marks.measure); // cleanup wrapper.clearMarks(this._marks.start); wrapper.clearMarks(this._marks.end); wrapper.clearMeasures(this._marks.measure); } return resourceTimingData; }; wrapper.Performance = Performance; // /** * @callback LoadVectorDataCallback * @param error * @param vectorTile * @private */ /** * @private */ function loadVectorTile(params , callback ) { var request = symbol_layout.getArrayBuffer(params.request, function (err , data , cacheControl , expires ) { if (err) { callback(err); } else if (data) { callback(null, { vectorTile: new symbol_layout.vectorTile.VectorTile(new symbol_layout.pbf(data)), rawData: data, cacheControl: cacheControl, expires: expires }); } }); return function () { request.cancel(); callback(); }; } /** * The {@link WorkerSource} implementation that supports {@link VectorTileSource}. * This class is designed to be easily reused to support custom source types * for data formats that can be parsed/converted into an in-memory VectorTile * representation. To do so, create it with * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`. * * @private */ var VectorTileWorkerSource = function VectorTileWorkerSource(actor , layerIndex , loadVectorData ) { this.actor = actor; this.layerIndex = layerIndex; this.loadVectorData = loadVectorData || loadVectorTile; this.loading = {}; this.loaded = {}; }; /** * Implements {@link WorkerSource#loadTile}. Delegates to * {@link VectorTileWorkerSource#loadVectorData} (which by default expects * a `params.url` property) for fetching and producing a VectorTile object. */ VectorTileWorkerSource.prototype.loadTile = function loadTile (params , callback ) { var this$1 = this; var uid = params.uid; if (!this.loading) { this.loading = {}; } var perf = (params && params.request && params.request.collectResourceTiming) ? new wrapper.Performance(params.request) : false; var workerTile = this.loading[uid] = new WorkerTile(params); workerTile.abort = this.loadVectorData(params, function (err, response) { delete this$1.loading[uid]; if (err || !response) { workerTile.status = 'done'; this$1.loaded[uid] = workerTile; return callback(err); } var rawTileData = response.rawData; var cacheControl = {}; if (response.expires) { cacheControl.expires = response.expires; } if (response.cacheControl) { cacheControl.cacheControl = response.cacheControl; } var resourceTiming = {}; if (perf) { var resourceTimingData = perf.finish(); // it's necessary to eval the result of getEntriesByName() here via parse/stringify // late evaluation in the main thread causes TypeError: illegal invocation if (resourceTimingData) { resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData)); } } workerTile.vectorTile = response.vectorTile; workerTile.parse(response.vectorTile, this$1.layerIndex, this$1.actor, function (err, result) { if (err || !result) { return callback(err); } // Transferring a copy of rawTileData because the worker needs to retain its copy. callback(null, symbol_layout.extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming)); }); this$1.loaded = this$1.loaded || {}; this$1.loaded[uid] = workerTile; }); }; /** * Implements {@link WorkerSource#reloadTile}. */ VectorTileWorkerSource.prototype.reloadTile = function reloadTile (params , callback ) { var loaded = this.loaded, uid = params.uid, vtSource = this; if (loaded && loaded[uid]) { var workerTile = loaded[uid]; workerTile.showCollisionBoxes = params.showCollisionBoxes; var done = function (err, data) { var reloadCallback = workerTile.reloadCallback; if (reloadCallback) { delete workerTile.reloadCallback; workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, vtSource.actor, reloadCallback); } callback(err, data); }; if (workerTile.status === 'parsing') { workerTile.reloadCallback = done; } else if (workerTile.status === 'done') { // if there was no vector tile data on the initial load, don't try and re-parse tile if (workerTile.vectorTile) { workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done); } else { done(); } } } }; /** * Implements {@link WorkerSource#abortTile}. * * @param params * @param params.uid The UID for this tile. */ VectorTileWorkerSource.prototype.abortTile = function abortTile (params , callback ) { var loading = this.loading, uid = params.uid; if (loading && loading[uid] && loading[uid].abort) { loading[uid].abort(); delete loading[uid]; } callback(); }; /** * Implements {@link WorkerSource#removeTile}. * * @param params * @param params.uid The UID for this tile. */ VectorTileWorkerSource.prototype.removeTile = function removeTile (params , callback ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { delete loaded[uid]; } callback(); }; // var RasterDEMTileWorkerSource = function RasterDEMTileWorkerSource() { this.loaded = {}; }; RasterDEMTileWorkerSource.prototype.loadTile = function loadTile (params , callback ) { var uid = params.uid; var encoding = params.encoding; var rawImageData = params.rawImageData; var dem = new symbol_layout.DEMData(uid, rawImageData, encoding); this.loaded = this.loaded || {}; this.loaded[uid] = dem; callback(null, dem); }; RasterDEMTileWorkerSource.prototype.removeTile = function removeTile (params ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { delete loaded[uid]; } }; var RADIUS = 6378137; var FLATTENING = 1/298.257223563; var POLAR_RADIUS = 6356752.3142; var wgs84 = { RADIUS: RADIUS, FLATTENING: FLATTENING, POLAR_RADIUS: POLAR_RADIUS }; var geometry_1 = geometry; var ring = ringArea; function geometry(_) { var area = 0, i; switch (_.type) { case 'Polygon': return polygonArea(_.coordinates); case 'MultiPolygon': for (i = 0; i < _.coordinates.length; i++) { area += polygonArea(_.coordinates[i]); } return area; case 'Point': case 'MultiPoint': case 'LineString': case 'MultiLineString': return 0; case 'GeometryCollection': for (i = 0; i < _.geometries.length; i++) { area += geometry(_.geometries[i]); } return area; } } function polygonArea(coords) { var area = 0; if (coords && coords.length > 0) { area += Math.abs(ringArea(coords[0])); for (var i = 1; i < coords.length; i++) { area -= Math.abs(ringArea(coords[i])); } } return area; } /** * Calculate the approximate area of the polygon were it projected onto * the earth. Note that this area will be positive if ring is oriented * clockwise, otherwise it will be negative. * * Reference: * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409 * * Returns: * {float} The approximate signed geodesic area of the polygon in square * meters. */ function ringArea(coords) { var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i, area = 0, coordsLength = coords.length; if (coordsLength > 2) { for (i = 0; i < coordsLength; i++) { if (i === coordsLength - 2) {// i = N-2 lowerIndex = coordsLength - 2; middleIndex = coordsLength -1; upperIndex = 0; } else if (i === coordsLength - 1) {// i = N-1 lowerIndex = coordsLength - 1; middleIndex = 0; upperIndex = 1; } else { // i = 0 to N-3 lowerIndex = i; middleIndex = i+1; upperIndex = i+2; } p1 = coords[lowerIndex]; p2 = coords[middleIndex]; p3 = coords[upperIndex]; area += ( rad(p3[0]) - rad(p1[0]) ) * Math.sin( rad(p2[1])); } area = area * wgs84.RADIUS * wgs84.RADIUS / 2; } return area; } function rad(_) { return _ * Math.PI / 180; } var geojsonArea = { geometry: geometry_1, ring: ring }; var geojsonRewind = rewind; function rewind(gj, outer) { switch ((gj && gj.type) || null) { case 'FeatureCollection': gj.features = gj.features.map(curryOuter(rewind, outer)); return gj; case 'GeometryCollection': gj.geometries = gj.geometries.map(curryOuter(rewind, outer)); return gj; case 'Feature': gj.geometry = rewind(gj.geometry, outer); return gj; case 'Polygon': case 'MultiPolygon': return correct(gj, outer); default: return gj; } } function curryOuter(a, b) { return function(_) { return a(_, b); }; } function correct(_, outer) { if (_.type === 'Polygon') { _.coordinates = correctRings(_.coordinates, outer); } else if (_.type === 'MultiPolygon') { _.coordinates = _.coordinates.map(curryOuter(correctRings, outer)); } return _; } function correctRings(_, outer) { outer = !!outer; _[0] = wind(_[0], outer); for (var i = 1; i < _.length; i++) { _[i] = wind(_[i], !outer); } return _; } function wind(_, dir) { return cw(_) === dir ? _ : _.reverse(); } function cw(_) { return geojsonArea.ring(_) >= 0; } // var toGeoJSON = symbol_layout.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. var FeatureWrapper = function FeatureWrapper(feature ) { this._feature = feature; this.extent = symbol_layout.EXTENT; this.type = feature.type; this.properties = feature.tags; // If the feature has a top-level `id` property, copy it over, but only // if it can be coerced to an integer, because this wrapper is used for // serializing geojson feature data into vector tile PBF data, and the // vector tile spec only supports integer values for feature ids -- // allowing non-integer values here results in a non-compliant PBF // that causes an exception when it is parsed with vector-tile-js if ('id' in feature && !isNaN(feature.id)) { this.id = parseInt(feature.id, 10); } }; FeatureWrapper.prototype.loadGeometry = function loadGeometry () { if (this._feature.type === 1) { var geometry = []; for (var i = 0, list = this._feature.geometry; i < list.length; i += 1) { var point = list[i]; geometry.push([new symbol_layout.Point$1(point[0], point[1])]); } return geometry; } else { var geometry$1 = []; for (var i$2 = 0, list$2 = this._feature.geometry; i$2 < list$2.length; i$2 += 1) { var ring = list$2[i$2]; var newRing = []; for (var i$1 = 0, list$1 = ring; i$1 < list$1.length; i$1 += 1) { var point$1 = list$1[i$1]; newRing.push(new symbol_layout.Point$1(point$1[0], point$1[1])); } geometry$1.push(newRing); } return geometry$1; } }; FeatureWrapper.prototype.toGeoJSON = function toGeoJSON$1 (x , y , z ) { return toGeoJSON.call(this, x, y, z); }; var GeoJSONWrapper = function GeoJSONWrapper(features ) { this.layers = { '_geojsonTileLayer': this }; this.name = '_geojsonTileLayer'; this.extent = symbol_layout.EXTENT; this.length = features.length; this._features = features; }; GeoJSONWrapper.prototype.feature = function feature (i ) { return new FeatureWrapper(this._features[i]); }; 'use strict'; var VectorTileFeature = symbol_layout.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) }; 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; } FeatureWrapper$1.prototype.loadGeometry = function () { var rings = this.rawGeometry; this.geometry = []; for (var i = 0; i < rings.length; i++) { var ring = rings[i]; var newRing = []; for (var j = 0; j < ring.length; j++) { newRing.push(new symbol_layout.Point$1(ring[j][0], ring[j][1])); } 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); } } return [x1, y1, x2, y2] }; FeatureWrapper$1.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON; var vtPbf = fromVectorTileJs; var fromVectorTileJs_1 = fromVectorTileJs; var fromGeojsonVt_1 = fromGeojsonVt; var GeoJSONWrapper_1 = geojson_wrapper; /** * 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 symbol_layout.pbf(); writeTile(tile, out); return out.finish() } /** * Serialized a geojson-vt-created tile to pbf. * * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects * @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}) } function writeTile (tile, pbf) { for (var key in tile.layers) { pbf.writeMessage(3, writeLayer, tile.layers[key]); } } function writeLayer (layer, pbf) { pbf.writeVarintField(15, layer.version || 1); pbf.writeStringField(1, layer.name || ''); pbf.writeVarintField(5, layer.extent || 4096); var i; var context = { keys: [], values: [], keycache: {}, valuecache: {} }; for (i = 0; i < layer.length; i++) { context.feature = layer.feature(i); pbf.writeMessage(2, writeFeature, context); } var keys = context.keys; for (i = 0; i < keys.length; i++) { pbf.writeStringField(3, keys[i]); } var values = context.values; for (i = 0; i < values.length; i++) { pbf.writeMessage(4, writeValue, values[i]); } } function writeFeature (context, pbf) { var feature = context.feature; if (feature.id !== undefined) { pbf.writeVarintField(1, feature.id); } pbf.writeMessage(2, writeProperties, context); pbf.writeVarintField(3, feature.type); pbf.writeMessage(4, writeGeometry, feature); } function writeProperties (context, pbf) { var feature = context.feature; var keys = context.keys; var values = context.values; var keycache = context.keycache; var valuecache = context.valuecache; for (var key in feature.properties) { var keyIndex = keycache[key]; if (typeof keyIndex === 'undefined') { keys.push(key); keyIndex = keys.length - 1; keycache[key] = keyIndex; } pbf.writeVarint(keyIndex); var value = feature.properties[key]; var type = typeof value; if (type !== 'string' && type !== 'boolean' && type !== 'number') { value = JSON.stringify(value); } var valueKey = type + ':' + value; var valueIndex = valuecache[valueKey]; if (typeof valueIndex === 'undefined') { values.push(value); valueIndex = values.length - 1; valuecache[valueKey] = valueIndex; } pbf.writeVarint(valueIndex); } } function command (cmd, length) { return (length << 3) + (cmd & 0x7) } function zigzag (num) { return (num << 1) ^ (num >> 31) } function writeGeometry (feature, pbf) { var geometry = feature.loadGeometry(); var type = feature.type; var x = 0; var y = 0; var rings = geometry.length; for (var r = 0; r < rings; r++) { var ring = geometry[r]; var count = 1; if (type === 1) { count = ring.length; } pbf.writeVarint(command(1, count)); // moveto // 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 } } } 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; } var m = (left + right) >> 1; select(ids, coords, m, left, right, depth % 2); sortKD(ids, coords, nodeSize, left, m - 1, depth + 1); sortKD(ids, coords, nodeSize, m + 1, right, depth + 1); } function select(ids, coords, k, left, right, inc) { while (right > left) { if (right - left > 600) { var n = right - left + 1; var m = k - left + 1; var z = Math.log(n); var s = 0.5 * Math.exp(2 * z / 3); var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); select(ids, coords, k, newLeft, newRight, inc); } var t = coords[2 * k + inc]; var i = left; var j = right; swapItem(ids, coords, left, k); if (coords[2 * right + inc] > t) { swapItem(ids, coords, left, right); } while (i < j) { swapItem(ids, coords, i, j); i++; j--; while (coords[2 * i + inc] < t) { i++; } while (coords[2 * j + inc] > t) { j--; } } if (coords[2 * left + inc] === t) { swapItem(ids, coords, left, j); } else { j++; swapItem(ids, coords, j, right); } if (j <= k) { left = j + 1; } if (k <= j) { right = j - 1; } } } function swapItem(ids, coords, i, j) { swap(ids, i, j); swap(coords, 2 * i, 2 * j); swap(coords, 2 * i + 1, 2 * j + 1); } function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } function range(ids, coords, minX, minY, maxX, maxY, nodeSize) { var stack = [0, ids.length - 1, 0]; var result = []; var x, y; while (stack.length) { var axis = stack.pop(); var right = stack.pop(); var left = stack.pop(); if (right - left <= nodeSize) { for (var i = left; i <= right; i++) { x = coords[2 * i]; y = coords[2 * i + 1]; if (x >= minX && x <= maxX && y >= minY && y <= maxY) { result.push(ids[i]); } } continue; } var m = Math.floor((left + right) / 2); x = coords[2 * m]; y = coords[2 * m + 1]; if (x >= minX && x <= maxX && y >= minY && y <= maxY) { result.push(ids[m]); } var nextAxis = (axis + 1) % 2; if (axis === 0 ? minX <= x : minY <= y) { stack.push(left); stack.push(m - 1); stack.push(nextAxis); } if (axis === 0 ? maxX >= x : maxY >= y) { stack.push(m + 1); stack.push(right); stack.push(nextAxis); } } return result; } function within(ids, coords, qx, qy, r, nodeSize) { var stack = [0, ids.length - 1, 0]; var result = []; var r2 = r * r; while (stack.length) { var axis = stack.pop(); var right = stack.pop(); var left = stack.pop(); if (right - left <= nodeSize) { for (var i = left; i <= right; i++) { if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) { result.push(ids[i]); } } continue; } var m = Math.floor((left + right) / 2); var x = coords[2 * m]; var y = coords[2 * m + 1]; if (sqDist(x, y, qx, qy) <= r2) { result.push(ids[m]); } var nextAxis = (axis + 1) % 2; if (axis === 0 ? qx - r <= x : qy - r <= y) { stack.push(left); stack.push(m - 1); stack.push(nextAxis); } if (axis === 0 ? qx + r >= x : qy + r >= y) { stack.push(m + 1); stack.push(right); stack.push(nextAxis); } } return result; } function sqDist(ax, ay, bx, by) { var dx = ax - bx; var dy = ay - by; return dx * dx + dy * dy; } var defaultGetX = function (p) { return p[0]; }; var defaultGetY = function (p) { return p[1]; }; var KDBush = function KDBush(points, getX, getY, nodeSize, ArrayType) { if ( getX === void 0 ) getX = defaultGetX; if ( getY === void 0 ) getY = defaultGetY; if ( nodeSize === void 0 ) nodeSize = 64; if ( ArrayType === void 0 ) ArrayType = Float64Array; this.nodeSize = nodeSize; this.points = points; var IndexArrayType = points.length < 65536 ? Uint16Array : Uint32Array; var ids = this.ids = new IndexArrayType(points.length); var coords = this.coords = new ArrayType(points.length * 2); for (var i = 0; i < points.length; i++) { ids[i] = i; coords[2 * i] = getX(points[i]); coords[2 * i + 1] = getY(points[i]); } sortKD(ids, coords, nodeSize, 0, ids.length - 1, 0); }; KDBush.prototype.range = function range$1 (minX, minY, maxX, maxY) { return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize); }; KDBush.prototype.within = function within$1 (x, y, r) { return within(this.ids, this.coords, x, y, r, this.nodeSize); }; var defaultOptions = { minZoom: 0, // min zoom to generate clusters on maxZoom: 16, // max zoom level to cluster the points on radius: 40, // cluster radius in pixels extent: 512, // tile extent (radius is calculated relative to it) nodeSize: 64, // size of the KD-tree leaf node, affects performance log: false, // whether to log timing info // a reduce function for calculating custom cluster properties reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; } // properties to use for individual points when running the reducer map: function (props) { return props; } // props => ({sum: props.my_value}) }; var Supercluster = function Supercluster(options) { this.options = extend(Object.create(defaultOptions), options); this.trees = new Array(this.options.maxZoom + 1); }; Supercluster.prototype.load = function load (points) { var ref = this.options; var log = ref.log; var minZoom = ref.minZoom; var maxZoom = ref.maxZoom; var nodeSize = ref.nodeSize; if (log) { console.time('total time'); } var timerId = "prepare " + (points.length) + " points"; if (log) { console.time(timerId); } this.points = points; // generate a cluster object for each point and index input points into a KD-tree var clusters = []; for (var 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 (var z = maxZoom; z >= minZoom; z--) { var now = +Date.now(); // 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); if (log) { console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now); } } if (log) { console.timeEnd('total time'); } return this; }; Supercluster.prototype.getClusters = function getClusters (bbox, zoom) { var minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180; var minLat = Math.max(-90, Math.min(90, bbox[1])); var maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180; var maxLat = Math.max(-90, Math.min(90, bbox[3])); if (bbox[2] - bbox[0] >= 360) { minLng = -180; maxLng = 180; } else if (minLng > maxLng) { var easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom); var westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom); return easternHem.concat(westernHem); } var tree = this.trees[this._limitZoom(zoom)]; var ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat)); var clusters = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var c = tree.points[id]; clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); } return clusters; }; Supercluster.prototype.getChildren = function getChildren (clusterId) { var originId = clusterId >> 5; var originZoom = clusterId % 32; var errorMsg = 'No cluster with the specified id.'; var index = this.trees[originZoom]; if (!index) { throw new Error(errorMsg); } var origin = index.points[originId]; if (!origin) { throw new Error(errorMsg); } var r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1)); var ids = index.within(origin.x, origin.y, r); var children = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var c = index.points[id]; if (c.parentId === clusterId) { children.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); } } if (children.length === 0) { throw new Error(errorMsg); } return children; }; Supercluster.prototype.getLeaves = function getLeaves (clusterId, limit, offset) { limit = limit || 10; offset = offset || 0; var leaves = []; this._appendLeaves(leaves, clusterId, limit, offset, 0); return leaves; }; Supercluster.prototype.getTile = function getTile (z, x, y) { var tree = this.trees[this._limitZoom(z)]; var z2 = Math.pow(2, z); var ref = this.options; var extent = ref.extent; var radius = ref.radius; var p = radius / extent; var top = (y - p) / z2; var bottom = (y + 1 + p) / z2; var tile = { features: [] }; this._addTileFeatures( tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom), tree.points, x, y, z2, tile); if (x === 0) { this._addTileFeatures( tree.range(1 - p / z2, top, 1, bottom), tree.points, z2, y, z2, tile); } if (x === z2 - 1) { this._addTileFeatures( tree.range(0, top, p / z2, bottom), tree.points, -1, y, z2, tile); } return tile.features.length ? tile : null; }; Supercluster.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (clusterId) { var clusterZoom = (clusterId % 32) - 1; while (clusterZoom <= this.options.maxZoom) { var children = this.getChildren(clusterId); clusterZoom++; if (children.length !== 1) { break; } clusterId = children[0].properties.cluster_id; } return clusterZoom; }; Supercluster.prototype._appendLeaves = function _appendLeaves (result, clusterId, limit, offset, skipped) { var children = this.getChildren(clusterId); for (var i = 0, list = children; i < list.length; i += 1) { var child = list[i]; var props = child.properties; 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; } } return skipped; }; Supercluster.prototype._addTileFeatures = function _addTileFeatures (ids, points, x, y, z2, tile) { for (var i$1 = 0, list = ids; i$1 < list.length; i$1 += 1) { var i = list[i$1]; var c = points[i]; var f = { type: 1, geometry: [[ Math.round(this.options.extent * (c.x * z2 - x)), Math.round(this.options.extent * (c.y * z2 - y)) ]], tags: c.numPoints ? getClusterProperties(c) : this.points[c.index].properties }; var id = c.numPoints ? c.id : this.points[c.index].id; if (id !== undefined) { f.id = id; } tile.features.push(f); } }; Supercluster.prototype._limitZoom = function _limitZoom (z) { return Math.max(this.options.minZoom, Math.min(z, this.options.maxZoom + 1)); }; Supercluster.prototype._cluster = function _cluster (points, zoom) { var clusters = []; var ref = this.options; var radius = ref.radius; var extent = ref.extent; var reduce = ref.reduce; var r = radius / (extent * Math.pow(2, zoom)); // loop through each point for (var i = 0; i < points.length; i++) { var p = points[i]; // if we've already visited the point at this zoom level, skip it if (p.zoom <= zoom) { continue; } p.zoom = zoom; // find all nearby points var tree = this.trees[zoom + 1]; var neighborIds = tree.within(p.x, p.y, r); var numPoints = p.numPoints || 1; var wx = p.x * numPoints; var wy = p.y * numPoints; var clusterProperties = reduce && numPoints > 1 ? this._map(p, true) : null; // encode both zoom and point index on which the cluster originated var id = (i << 5) + (zoom + 1); for (var i$1 = 0, list = neighborIds; i$1 < list.length; i$1 += 1) { var neighborId = list[i$1]; var b = tree.points[neighborId]; // filter out neighbors that are already processed if (b.zoom <= zoom) { continue; } b.zoom = zoom; // save the zoom (so it doesn't get processed twice) var numPoints2 = b.numPoints || 1; wx += b.x * numPoints2; // accumulate coordinates for calculating weighted center wy += b.y * numPoints2; numPoints += numPoints2; b.parentId = id; if (reduce) { if (!clusterProperties) { clusterProperties = this._map(p, true); } reduce(clusterProperties, this._map(b)); } } if (numPoints === 1) { clusters.push(p); } else { p.parentId = id; clusters.push(createCluster(wx / numPoints, wy / numPoints, id, numPoints, clusterProperties)); } } return clusters; }; Supercluster.prototype._map = function _map (point, clone) { if (point.numPoints) { return clone ? extend({}, point.properties) : point.properties; } var original = this.points[point.index].properties; var result = this.options.map(original); return clone && result === original ? extend({}, result) : result; }; function createCluster(x, y, id, numPoints, properties) { return { x: x, // weighted cluster center y: y, zoom: Infinity, // the last zoom the cluster was processed at id: id, // encodes index of the first child of the cluster and its zoom level parentId: -1, // parent cluster id numPoints: numPoints, properties: properties }; } function createPointCluster(p, id) { var ref = p.geometry.coordinates; var x = ref[0]; var y = ref[1]; return { x: lngX(x), // projected point coordinates y: 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 }; } function getClusterJSON(cluster) { return { type: 'Feature', id: cluster.id, properties: getClusterProperties(cluster), geometry: { type: 'Point', coordinates: [xLng(cluster.x), yLat(cluster.y)] } }; } function getClusterProperties(cluster) { var count = cluster.numPoints; var abbrev = count >= 10000 ? ((Math.round(count / 1000)) + "k") : count >= 1000 ? ((Math.round(count / 100) / 10) + "k") : count; return extend(extend({}, cluster.properties), { cluster: true, cluster_id: cluster.id, point_count: count, point_count_abbreviated: abbrev }); } // longitude/latitude to spherical mercator in [0..1] range function lngX(lng) { return lng / 360 + 0.5; } function latY(lat) { var sin = Math.sin(lat * Math.PI / 180); var y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); return y < 0 ? 0 : y > 1 ? 1 : y; } // spherical mercator to longitude/latitude function xLng(x) { return (x - 0.5) * 360; } function yLat(y) { var y2 = (180 - y * 360) * Math.PI / 180; return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90; } function extend(dest, src) { for (var id in src) { dest[id] = src[id]; } return dest; } function getX(p) { return p.x; } function getY(p) { return p.y; } // calculate simplification data using optimized Douglas-Peucker algorithm function simplify(coords, first, last, sqTolerance) { var maxSqDist = sqTolerance; var mid = (last - first) >> 1; var minPosToMid = last - first; var index; var ax = coords[first]; var ay = coords[first + 1]; var bx = coords[last]; var by = coords[last + 1]; for (var i = first + 3; i < last; i += 3) { var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by); if (d > maxSqDist) { index = i; maxSqDist = d; } 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 (maxSqDist > sqTolerance) { if (index - first > 3) { simplify(coords, first, index, sqTolerance); } coords[index + 2] = maxSqDist; if (last - index > 3) { simplify(coords, index, last, sqTolerance); } } } // square distance from a point to a segment function getSqSegDist(px, py, x, y, bx, by) { var dx = bx - x; var dy = by - y; if (dx !== 0 || dy !== 0) { var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); if (t > 1) { x = bx; y = by; } else if (t > 0) { x += dx * t; y += dy * t; } } dx = px - x; dy = py - y; return dx * dx + dy * dy; } 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; } function calcBBox(feature) { var geom = feature.geometry; var type = feature.type; if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { calcLineBBox(feature, geom); } else if (type === 'Polygon' || type === 'MultiLineString') { for (var i = 0; i < geom.length; i++) { calcLineBBox(feature, geom[i]); } } else if (type === 'MultiPolygon') { for (i = 0; i < geom.length; i++) { for (var j = 0; j < geom[i].length; j++) { calcLineBBox(feature, geom[i][j]); } } } } function calcLineBBox(feature, geom) { for (var i = 0; i < geom.length; i += 3) { feature.minX = Math.min(feature.minX, geom[i]); feature.minY = Math.min(feature.minY, geom[i + 1]); feature.maxX = Math.max(feature.maxX, geom[i]); feature.maxY = Math.max(feature.maxY, geom[i + 1]); } } // 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); } } else if (data.type === 'Feature') { convertFeature(features, data, options); } else { // single geometry or a geometry collection convertFeature(features, {geometry: data}, options); } return features; } function convertFeature(features, geojson, options, index) { if (!geojson.geometry) { return; } 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); } else if (type === 'MultiPoint') { for (var i = 0; i < coords.length; i++) { convertPoint(coords[i], geometry); } } else if (type === 'LineString') { convertLine(coords, geometry, tolerance, false); } 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); } } else if (type === 'Polygon') { convertLines(coords, geometry, tolerance, true); } 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.'); } 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); if (j > 0) { if (isPolygon) { size += (x0 * y - x * y0) / 2; // area } else { size += Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); // length } } x0 = x; y0 = y; } var last = out.length - 3; out[2] = 1; simplify(out, 0, last, tolerance); out[last + 2] = 1; out.size = Math.abs(size); out.start = 0; out.end = out.size; } 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); } } 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: * | | * ___|___ | / * / | \____|____/ * | | */ 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 = []; for (var i = 0; i < features.length; i++) { var feature = features[i]; var geometry = feature.geometry; var type = feature.type; var min = axis === 0 ? feature.minX : feature.minY; var max = axis === 0 ? feature.maxX : feature.maxY; if (min >= k1 && max < k2) { // trivial accept clipped.push(feature); continue; } else if (max < k1 || min >= k2) { // trivial reject continue; } var newGeometry = []; if (type === 'Point' || type === 'MultiPoint') { clipPoints(geometry, newGeometry, k1, k2, axis); } else if (type === 'LineString') { clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics); } else if (type === 'MultiLineString') { clipLines(geometry, newGeometry, k1, k2, axis, false); } else if (type === 'Polygon') { clipLines(geometry, newGeometry, k1, k2, axis, true); } else if (type === 'MultiPolygon') { for (var j = 0; j < geometry.length; j++) { var polygon = []; clipLines(geometry[j], polygon, k1, k2, axis, true); if (polygon.length) { newGeometry.push(polygon); } } } if (newGeometry.length) { if (options.lineMetrics && type === 'LineString') { for (j = 0; j < newGeometry.length; j++) { clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags)); } continue; } if (type === 'LineString' || type === 'MultiLineString') { if (newGeometry.length === 1) { type = 'LineString'; newGeometry = newGeometry[0]; } else { type = 'MultiLineString'; } } if (type === 'Point' || type === 'MultiPoint') { type = newGeometry.length === 3 ? 'Point' : 'MultiPoint'; } clipped.push(createFeature(feature.id, type, newGeometry, feature.tags)); } } return clipped.length ? clipped : null; } function clipPoints(geom, newGeom, k1, k2, axis) { for (var i = 0; i < geom.length; i += 3) { var a = geom[i + axis]; if (a >= k1 && a <= k2) { newGeom.push(geom[i]); newGeom.push(geom[i + 1]); newGeom.push(geom[i + 2]); } } } function clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) { var slice = newSlice(geom); var intersect = axis === 0 ? intersectX : intersectY; var len = geom.start; var segLen, t; 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; if (trackMetrics) { segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2)); } 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 (!isPolygon && exited) { if (trackMetrics) { slice.end = len + segLen * t; } newGeom.push(slice); slice = newSlice(geom); } if (trackMetrics) { len += segLen; } } // add the last point var last = geom.length - 3; ax = geom[last]; ay = geom[last + 1]; az = geom[last + 2]; a = axis === 0 ? ax : ay; if (a >= k1 && a <= k2) { addPoint(slice, ax, ay, az); } // close the polygon if its endpoints are not the same after clipping last = slice.length - 3; if (isPolygon && last >= 3 && (slice[last] !== slice[0] || slice[last + 1] !== slice[1])) { addPoint(slice, slice[0], slice[1], slice[2]); } // add the final slice if (slice.length) { newGeom.push(slice); } } function newSlice(line) { var slice = []; slice.size = line.size; slice.start = line.start; slice.end = line.end; return slice; } function clipLines(geom, newGeom, k1, k2, axis, isPolygon) { for (var i = 0; i < geom.length; i++) { clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false); } } function addPoint(out, x, y, z) { out.push(x); out.push(y); out.push(z); } 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; } 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; } 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 (left || right) { merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; // center world copy if (left) { merged = shiftFeatureCoords(left, 1).concat(merged); } // merge left into center if (right) { merged = merged.concat(shiftFeatureCoords(right, -1)); } // merge right into center } return merged; } function shiftFeatureCoords(features, offset) { var newFeatures = []; for (var i = 0; i < features.length; i++) { var feature = features[i], type = feature.type; var newGeometry; if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { newGeometry = shiftCoords(feature.geometry, offset); } else if (type === 'MultiLineString' || type === 'Polygon') { newGeometry = []; for (var j = 0; j < feature.geometry.length; j++) { newGeometry.push(shiftCoords(feature.geometry[j], offset)); } } else if (type === 'MultiPolygon') { newGeometry = []; for (j = 0; j < feature.geometry.length; j++) { var newPolygon = []; for (var k = 0; k < feature.geometry[j].length; k++) { newPolygon.push(shiftCoords(feature.geometry[j][k], offset)); } newGeometry.push(newPolygon); } } newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags)); } return newFeatures; } function shiftCoords(points, offset) { var newPoints = []; newPoints.size = points.size; if (points.start !== undefined) { newPoints.start = points.start; newPoints.end = points.end; } for (var i = 0; i < points.length; i += 3) { newPoints.push(points[i] + offset, points[i + 1], points[i + 2]); } 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; feature.geometry = []; if (type === 1) { for (j = 0; j < geom.length; j += 2) { feature.geometry.push(transformPoint(geom[j], geom[j + 1], extent, z2, tx, ty)); } } else { for (j = 0; j < geom.length; j++) { var ring = []; for (k = 0; k < geom[j].length; k += 2) { ring.push(transformPoint(geom[j][k], geom[j][k + 1], extent, z2, tx, ty)); } feature.geometry.push(ring); } } } tile.transformed = true; return tile; } function transformPoint(x, y, extent, z2, tx, ty) { return [ Math.round(extent * (x * z2 - tx)), Math.round(extent * (y * z2 - ty))]; } 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); var minX = features[i].minX; var minY = features[i].minY; var maxX = features[i].maxX; var maxY = features[i].maxY; if (minX < tile.minX) { tile.minX = minX; } if (minY < tile.minY) { tile.minY = minY; } if (maxX > tile.maxX) { tile.maxX = maxX; } if (maxY > tile.maxY) { tile.maxY = maxY; } } return tile; } function addFeature(tile, feature, tolerance, options) { var geom = feature.geometry, type = feature.type, simplified = []; if (type === 'Point' || type === 'MultiPoint') { for (var i = 0; i < geom.length; i += 3) { simplified.push(geom[i]); simplified.push(geom[i + 1]); tile.numPoints++; tile.numSimplified++; } } else if (type === 'LineString') { addLine(simplified, geom, tile, tolerance, false, false); } else if (type === 'MultiLineString' || type === 'Polygon') { for (i = 0; i < geom.length; i++) { addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0); } } else if (type === 'MultiPolygon') { for (var k = 0; k < geom.length; k++) { var polygon = geom[k]; for (i = 0; i < polygon.length; i++) { addLine(simplified, polygon[i], tile, tolerance, true, i === 0); } } } 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); } } function addLine(result, geom, tile, tolerance, isPolygon, isOuter) { var sqTolerance = tolerance * tolerance; if (tolerance > 0 && (geom.size < (isPolygon ? sqTolerance : tolerance))) { tile.numPoints += geom.length / 3; return; } var ring = []; 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 (isPolygon) { rewind$1(ring, isOuter); } result.push(ring); } 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]); } 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; } } } function geojsonvt(data, options) { return new GeoJSONVT(data, options); } function GeoJSONVT(data, options) { options = this.options = extend$1(Object.create(this.options), options); var debug = options.debug; if (debug) { console.time('preprocess data'); } if (options.maxZoom < 0 || options.maxZoom > 24) { throw new Error('maxZoom should be in the 0-24 range'); } if (options.promoteId && options.generateId) { throw new Error('promoteId and generateId cannot be used together.'); } var features = convert(data, options); this.tiles = {}; this.tileCoords = []; if (debug) { console.timeEnd('preprocess data'); console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints); console.time('generate tiles'); this.stats = {}; this.total = 0; } features = wrap(features, options); // start slicing from the top tile down if (features.length) { this.splitTile(features, 0, 0, 0); } if (debug) { if (features.length) { console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); } console.timeEnd('generate tiles'); console.log('tiles generated:', this.total, JSON.stringify(this.stats)); } } GeoJSONVT.prototype.options = { maxZoom: 14, // max zoom to preserve detail on indexMaxZoom: 5, // max zoom in the tile index indexMaxPoints: 100000, // max number of points per tile in the tile index tolerance: 3, // simplification tolerance (higher means simpler) extent: 4096, // tile extent buffer: 64, // tile buffer on each side 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) }; GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { var stack = [features, z, x, y], options = this.options, debug = options.debug; // avoid recursion by using a processing queue while (stack.length) { y = stack.pop(); x = stack.pop(); z = stack.pop(); features = stack.pop(); var z2 = 1 << z, id = toID(z, x, y), tile = this.tiles[id]; if (!tile) { if (debug > 1) { console.time('creation'); } 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++; } } // save reference to original geometry in tile so that we can drill down later if we stop now tile.source = features; // if it's the first-pass tiling if (!cz) { // stop tiling if we reached max zoom, or if the tile is too simple if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) { continue; } // if a drilldown to a specific tile } else { // stop tiling if we reached base zoom or our target tile zoom if (z === options.maxZoom || z === cz) { continue; } // stop tiling if it's not an ancestor of the target tile var m = 1 << (cz - z); if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) { continue; } } // if we slice further down, no need to keep source geometry tile.source = null; if (features.length === 0) { continue; } if (debug > 1) { console.time('clipping'); } // values we'll use for clipping var k1 = 0.5 * options.buffer / options.extent, k2 = 0.5 - k1, k3 = 0.5 + k1, k4 = 1 + k1, tl, bl, tr, br, left, right; tl = bl = tr = br = null; left = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX, 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; } 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); } }; 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)]; } if (!parent || !parent.source) { return null; } // if we found a parent tile containing the original geometry, we can drill down from it if (debug > 1) { console.log('found parent tile z%d-%d-%d', z0, x0, y0); } if (debug > 1) { console.time('drilling down'); } this.splitTile(parent.source, z0, x0, y0, z, x, y); if (debug > 1) { console.timeEnd('drilling down'); } return this.tiles[id] ? transformTile(this.tiles[id], extent) : null; }; function toID(z, x, y) { return (((1 << z) * y + x) * 32) + z; } function extend$1(dest, src) { for (var i in src) { dest[i] = src[i]; } return dest; } // function loadGeoJSONTile(params , callback ) { var canonical = params.tileID.canonical; if (!this._geoJSONIndex) { return callback(null, null); // we couldn't load the file } var geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y); if (!geoJSONTile) { return callback(null, null); // nothing in the given tile } var geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features); // Encode the geojson-vt tile into binary vector tile form. This // is a convenience that allows `FeatureIndex` to operate the same way // across `VectorTileSource` and `GeoJSONSource` data. var pbf = vtPbf(geojsonWrapper); if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) { // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35) pbf = new Uint8Array(pbf); } callback(null, { vectorTile: geojsonWrapper, rawData: pbf.buffer }); } // 'loadData' received while coalescing, trigger one more 'loadData' on receiving 'coalesced' /** * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}. * This class is designed to be easily reused to support custom source types * for data formats that can be parsed/converted into an in-memory GeoJSON * representation. To do so, create it with * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`. * For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson). * * @private */ var GeoJSONWorkerSource = /*@__PURE__*/(function (VectorTileWorkerSource) { function GeoJSONWorkerSource(actor , layerIndex , loadGeoJSON ) { VectorTileWorkerSource.call(this, actor, layerIndex, loadGeoJSONTile); if (loadGeoJSON) { this.loadGeoJSON = loadGeoJSON; } } if ( VectorTileWorkerSource ) GeoJSONWorkerSource.__proto__ = VectorTileWorkerSource; GeoJSONWorkerSource.prototype = Object.create( VectorTileWorkerSource && VectorTileWorkerSource.prototype ); GeoJSONWorkerSource.prototype.constructor = GeoJSONWorkerSource; /** * Fetches (if appropriate), parses, and index geojson data into tiles. This * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile} * can correctly serve up tiles. * * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing, * expecting `callback(error, data)` to be called with either an error or a * parsed GeoJSON object. * * 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 */ GeoJSONWorkerSource.prototype.loadData = function loadData (params , callback ) { if (this._pendingCallback) { // Tell the foreground the previous call has been abandoned this._pendingCallback(null, { abandoned: true }); } this._pendingCallback = callback; this._pendingLoadDataParams = params; if (this._state && this._state !== 'Idle') { this._state = 'NeedsLoadData'; } else { this._state = 'Coalescing'; this._loadData(); } }; /** * Internal implementation: called directly by `loadData` * or by `coalesce` using stored parameters. */ GeoJSONWorkerSource.prototype._loadData = function _loadData () { var this$1 = this; if (!this._pendingCallback || !this._pendingLoadDataParams) { symbol_layout.assert(false); return; } var callback = this._pendingCallback; var params = this._pendingLoadDataParams; delete this._pendingCallback; delete this._pendingLoadDataParams; var perf = (params && params.request && params.request.collectResourceTiming) ? new wrapper.Performance(params.request) : false; this.loadGeoJSON(params, function (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); try { this$1._geoJSONIndex = params.cluster ? new Supercluster(getSuperclusterOptions(params)).load(data.features) : geojsonvt(data, params.geojsonVtOptions); } catch (err) { return callback(err); } this$1.loaded = {}; var result = {}; if (perf) { var resourceTimingData = perf.finish(); // 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); } }); }; /** * While processing `loadData`, we coalesce all further * `loadData` messages into a single call to _loadData * that will happen once we've finished processing the * first message. {@link GeoJSONSource#_updateWorkerData} * is responsible for sending us the `coalesce` message * at the time it receives a response from `loadData` * * State: Idle * ↑ | * 'coalesce' 'loadData' * | (triggers load) * | ↓ * State: Coalescing * ↑ | * (triggers load) | * 'coalesce' 'loadData' * | ↓ * State: NeedsLoadData */ GeoJSONWorkerSource.prototype.coalesce = function coalesce () { if (this._state === 'Coalescing') { this._state = 'Idle'; } else if (this._state === 'NeedsLoadData') { this._state = 'Coalescing'; this._loadData(); } }; /** * 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. */ GeoJSONWorkerSource.prototype.reloadTile = function reloadTile (params , callback ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { return VectorTileWorkerSource.prototype.reloadTile.call(this, params, callback); } else { return this.loadTile(params, callback); } }; /** * Fetch and parse GeoJSON according to the given params. Calls `callback` * with `(err, data)`, where `data` is a parsed GeoJSON object. * * GeoJSON is loaded and parsed from `params.url` if it exists, or else * expected as a literal (string or object) `params.data`. * * @param params * @param [params.url] A URL to the remote GeoJSON data. * @param [params.data] Literal GeoJSON data. Must be provided if `params.url` is not. */ GeoJSONWorkerSource.prototype.loadGeoJSON = function loadGeoJSON (params , callback ) { // Because of same origin issues, urls must either include an explicit // origin or absolute path. // ie: /foo/bar.json or http://example.com/bar.json // but not ../foo/bar.json if (params.request) { symbol_layout.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."))); } }; GeoJSONWorkerSource.prototype.removeSource = function removeSource (params , callback ) { if (this._pendingCallback) { // Don't leak callbacks this._pendingCallback(null, { abandoned: true }); } callback(); }; GeoJSONWorkerSource.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (params , callback ) { callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId)); }; GeoJSONWorkerSource.prototype.getClusterChildren = function getClusterChildren (params , callback ) { callback(null, this._geoJSONIndex.getChildren(params.clusterId)); }; GeoJSONWorkerSource.prototype.getClusterLeaves = function getClusterLeaves (params , callback ) { callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset)); }; return GeoJSONWorkerSource; }(VectorTileWorkerSource)); function getSuperclusterOptions(ref) { var superclusterOptions = ref.superclusterOptions; var clusterProperties = ref.clusterProperties; if (!clusterProperties || !superclusterOptions) { return superclusterOptions; } var mapExpressions = {}; var reduceExpressions = {}; var globals = {accumulated: null, zoom: 0}; var feature = {properties: null}; var propertyNames = Object.keys(clusterProperties); for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; var ref$1 = clusterProperties[key]; var operator = ref$1[0]; var mapExpression = ref$1[1]; var mapExpressionParsed = symbol_layout.createExpression(mapExpression); var reduceExpressionParsed = symbol_layout.createExpression( typeof operator === 'string' ? [operator, ['accumulated'], ['get', key]] : operator); symbol_layout.assert(mapExpressionParsed.result === 'success'); symbol_layout.assert(reduceExpressionParsed.result === 'success'); mapExpressions[key] = mapExpressionParsed.value; reduceExpressions[key] = reduceExpressionParsed.value; } superclusterOptions.map = function (pointProperties) { feature.properties = pointProperties; var properties = {}; for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; properties[key] = mapExpressions[key].evaluate(globals, feature); } return properties; }; superclusterOptions.reduce = function (accumulated, clusterProperties) { feature.properties = clusterProperties; for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; globals.accumulated = accumulated[key]; accumulated[key] = reduceExpressions[key].evaluate(globals, feature); } }; return superclusterOptions; } // /** * @private */ var Worker = function Worker(self ) { var this$1 = this; this.self = self; this.actor = new symbol_layout.Actor(self, this); this.layerIndexes = {}; this.workerSourceTypes = { vector: VectorTileWorkerSource, geojson: GeoJSONWorkerSource }; // [mapId][sourceType][sourceName] => worker source instance this.workerSources = {}; this.demWorkerSources = {}; this.self.registerWorkerSource = function (name , WorkerSource ) { if (this$1.workerSourceTypes[name]) { throw new Error(("Worker source with name \"" + name + "\" already registered.")); } this$1.workerSourceTypes[name] = WorkerSource; }; this.self.registerRTLTextPlugin = function (rtlTextPlugin ) { if (symbol_layout.plugin.isLoaded()) { throw new Error('RTL text plugin already registered.'); } symbol_layout.plugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping; symbol_layout.plugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText; symbol_layout.plugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText; }; }; Worker.prototype.setReferrer = function setReferrer (mapID , referrer ) { this.referrer = referrer; }; Worker.prototype.setLayers = function setLayers (mapId , layers , callback ) { this.getLayerIndex(mapId).replace(layers); callback(); }; Worker.prototype.updateLayers = function updateLayers (mapId , params , callback ) { this.getLayerIndex(mapId).update(params.layers, params.removedIds); callback(); }; Worker.prototype.loadTile = function loadTile (mapId , params , callback ) { symbol_layout.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).loadTile(params, callback); }; Worker.prototype.loadDEMTile = function loadDEMTile (mapId , params , callback ) { this.getDEMWorkerSource(mapId, params.source).loadTile(params, callback); }; Worker.prototype.reloadTile = function reloadTile (mapId , params , callback ) { symbol_layout.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).reloadTile(params, callback); }; Worker.prototype.abortTile = function abortTile (mapId , params , callback ) { symbol_layout.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback); }; Worker.prototype.removeTile = function removeTile (mapId , params , callback ) { symbol_layout.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback); }; Worker.prototype.removeDEMTile = function removeDEMTile (mapId , params ) { this.getDEMWorkerSource(mapId, params.source).removeTile(params); }; Worker.prototype.removeSource = function removeSource (mapId , params , callback ) { symbol_layout.assert(params.type); symbol_layout.assert(params.source); if (!this.workerSources[mapId] || !this.workerSources[mapId][params.type] || !this.workerSources[mapId][params.type][params.source]) { return; } var worker = this.workerSources[mapId][params.type][params.source]; delete this.workerSources[mapId][params.type][params.source]; if (worker.removeSource !== undefined) { worker.removeSource(params, callback); } else { callback(); } }; /** * Load a {@link WorkerSource} script at params.url. The script is run * (using importScripts) with `registerWorkerSource` in scope, which is a * function taking `(name, workerSourceObject)`. * @private */ Worker.prototype.loadWorkerSource = function loadWorkerSource (map , params , callback ) { try { this.self.importScripts(params.url); callback(); } catch (e) { callback(e.toString()); } }; Worker.prototype.loadRTLTextPlugin = function loadRTLTextPlugin (map , pluginURL , callback ) { try { if (!symbol_layout.plugin.isLoaded()) { this.self.importScripts(pluginURL); callback(symbol_layout.plugin.isLoaded() ? null : new Error(("RTL Text Plugin failed to import scripts from " + pluginURL))); } } catch (e) { callback(e.toString()); } }; Worker.prototype.getLayerIndex = function getLayerIndex (mapId ) { var layerIndexes = this.layerIndexes[mapId]; if (!layerIndexes) { layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); } return layerIndexes; }; Worker.prototype.getWorkerSource = function getWorkerSource (mapId , type , source ) { var this$1 = this; if (!this.workerSources[mapId]) { this.workerSources[mapId] = {}; } if (!this.workerSources[mapId][type]) { this.workerSources[mapId][type] = {}; } 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 var actor = { send: function (type, data, callback) { this$1.actor.send(type, data, callback, mapId); } }; this.workerSources[mapId][type][source] = new (this.workerSourceTypes[type] )((actor ), this.getLayerIndex(mapId)); } return this.workerSources[mapId][type][source]; }; Worker.prototype.getDEMWorkerSource = function getDEMWorkerSource (mapId , source ) { if (!this.demWorkerSources[mapId]) { this.demWorkerSources[mapId] = {}; } if (!this.demWorkerSources[mapId][source]) { this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource(); } return this.demWorkerSources[mapId][source]; }; Worker.prototype.enforceCacheSizeLimit = function enforceCacheSizeLimit$1 (mapId , limit ) { symbol_layout.enforceCacheSizeLimit(limit); }; /* global self, WorkerGlobalScope */ if (typeof WorkerGlobalScope !== 'undefined' && typeof symbol_layout.window !== 'undefined' && symbol_layout.window instanceof WorkerGlobalScope) { symbol_layout.window.worker = new Worker(symbol_layout.window); } return Worker; }); define(['./shared'], function (symbol_layout) { 'use strict'; var mapboxGlSupported = symbol_layout.createCommonjsModule(function (module) { 'use strict'; if ('object' !== 'undefined' && module.exports) { module.exports = isSupported; } else if (window) { window.mapboxgl = window.mapboxgl || {}; window.mapboxgl.supported = isSupported; } /** * Test whether the current browser supports Mapbox GL JS * @param {Object} options * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false` * if the performance of Mapbox GL JS would be dramatically worse than * expected (i.e. a software renderer is would be used) * @return {boolean} */ function isSupported(options) { return !!( isBrowser() && isArraySupported() && isFunctionSupported() && isObjectSupported() && isJSONSupported() && isWorkerSupported() && isUint8ClampedArraySupported() && isArrayBufferSupported() && isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat) ); } function isBrowser() { return typeof window !== 'undefined' && typeof document !== 'undefined'; } function isArraySupported() { return ( Array.prototype && Array.prototype.every && Array.prototype.filter && Array.prototype.forEach && Array.prototype.indexOf && Array.prototype.lastIndexOf && Array.prototype.map && Array.prototype.some && Array.prototype.reduce && Array.prototype.reduceRight && Array.isArray ); } function isFunctionSupported() { return Function.prototype && Function.prototype.bind; } function isObjectSupported() { return ( Object.keys && Object.create && Object.getPrototypeOf && Object.getOwnPropertyNames && Object.isSealed && Object.isFrozen && Object.isExtensible && Object.getOwnPropertyDescriptor && Object.defineProperty && Object.defineProperties && Object.seal && Object.freeze && Object.preventExtensions ); } function isJSONSupported() { return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON; } function isWorkerSupported() { if (!('Worker' in window && 'Blob' in window && '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; } var isWebGLSupportedCache = {}; function isWebGLSupportedCached(failIfMajorPerformanceCaveat) { if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) { isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat); } return isWebGLSupportedCache[failIfMajorPerformanceCaveat]; } isSupported.webGLContextAttributes = { antialias: false, alpha: true, stencil: true, depth: true }; function isWebGLSupported(failIfMajorPerformanceCaveat) { var canvas = document.createElement('canvas'); var attributes = Object.create(isSupported.webGLContextAttributes); attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat; if (canvas.probablySupportsContext) { return ( canvas.probablySupportsContext('webgl', attributes) || canvas.probablySupportsContext('experimental-webgl', attributes) ); } else if (canvas.supportsContext) { return ( canvas.supportsContext('webgl', attributes) || canvas.supportsContext('experimental-webgl', attributes) ); } else { return ( canvas.getContext('webgl', attributes) || canvas.getContext('experimental-webgl', attributes) ); } } }); // strict var DOM = {}; DOM.create = function (tagName , className , container ) { var el = symbol_layout.window.document.createElement(tagName); if (className !== undefined) { el.className = className; } if (container) { container.appendChild(el); } return el; }; DOM.createNS = function (namespaceURI , tagName ) { var el = symbol_layout.window.document.createElementNS(namespaceURI, tagName); return el; }; var docStyle = symbol_layout.window.document.documentElement.style; function testProp(props) { if (!docStyle) { return props[0]; } for (var i = 0; i < props.length; i++) { if (props[i] in docStyle) { return props[i]; } } return props[0]; } var selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']); var userSelect; DOM.disableDrag = function () { if (docStyle && selectProp) { userSelect = docStyle[selectProp]; docStyle[selectProp] = 'none'; } }; DOM.enableDrag = function () { if (docStyle && selectProp) { docStyle[selectProp] = userSelect; } }; var transformProp = testProp(['transform', 'WebkitTransform']); DOM.setTransform = function(el , value ) { // https://github.com/facebook/flow/issues/7754 // $FlowFixMe el.style[transformProp] = value; }; // Feature detection for {passive: false} support in add/removeEventListener. var passiveSupported = false; try { // https://github.com/facebook/flow/issues/285 // $FlowFixMe var options$1 = Object.defineProperty({}, "passive", { get: function get() { // eslint-disable-line passiveSupported = true; } }); symbol_layout.window.addEventListener("test", options$1, options$1); symbol_layout.window.removeEventListener("test", options$1, options$1); } catch (err) { passiveSupported = false; } DOM.addEventListener = function(target , type , callback , options) { if ( options === void 0 ) options = {}; if ('passive' in options && passiveSupported) { target.addEventListener(type, callback, options); } else { target.addEventListener(type, callback, options.capture); } }; DOM.removeEventListener = function(target , type , callback , options) { if ( options === void 0 ) options = {}; if ('passive' in options && passiveSupported) { target.removeEventListener(type, callback, options); } else { target.removeEventListener(type, callback, options.capture); } }; // Suppress the next click, but only if it's immediate. var suppressClick = function (e) { e.preventDefault(); e.stopPropagation(); symbol_layout.window.removeEventListener('click', suppressClick, true); }; DOM.suppressClick = function() { symbol_layout.window.addEventListener('click', suppressClick, true); symbol_layout.window.setTimeout(function () { symbol_layout.window.removeEventListener('click', suppressClick, true); }, 0); }; DOM.mousePos = function (el , e ) { var rect = el.getBoundingClientRect(); var t = symbol_layout.window.TouchEvent && (e instanceof symbol_layout.window.TouchEvent) ? e.touches[0] : e; return new symbol_layout.Point( t.clientX - rect.left - el.clientLeft, t.clientY - rect.top - el.clientTop ); }; DOM.touchPos = function (el , e ) { var rect = el.getBoundingClientRect(), points = []; var touches = (e.type === 'touchend') ? e.changedTouches : e.touches; for (var i = 0; i < touches.length; i++) { points.push(new symbol_layout.Point( touches[i].clientX - rect.left - el.clientLeft, touches[i].clientY - rect.top - el.clientTop )); } return points; }; DOM.mouseButton = function (e ) { symbol_layout.assert(e.type === 'mousedown' || e.type === 'mouseup'); if (typeof symbol_layout.window.InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey && symbol_layout.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; }; DOM.remove = function(node ) { if (node.parentNode) { node.parentNode.removeChild(node); } }; // function loadSprite(baseURL , requestManager , callback ) { var json , image, error; var format = symbol_layout.browser.devicePixelRatio > 1 ? '@2x' : ''; var jsonRequest = symbol_layout.getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), symbol_layout.ResourceType.SpriteJSON), function (err , data ) { jsonRequest = null; if (!error) { error = err; json = data; maybeComplete(); } }); var imageRequest = symbol_layout.getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), symbol_layout.ResourceType.SpriteImage), function (err, img) { imageRequest = null; if (!error) { error = err; image = img; maybeComplete(); } }); function maybeComplete() { if (error) { callback(error); } else if (json && image) { var imageData = symbol_layout.browser.getImageData(image); var result = {}; for (var id in json) { var ref = json[id]; var width = ref.width; var height = ref.height; var x = ref.x; var y = ref.y; var sdf = ref.sdf; var pixelRatio = ref.pixelRatio; var data = new symbol_layout.RGBAImage({width: width, height: height}); symbol_layout.RGBAImage.copy(imageData, data, {x: x, y: y}, {x: 0, y: 0}, {width: width, height: height}); result[id] = {data: data, pixelRatio: pixelRatio, sdf: sdf}; } callback(null, result); } } return { cancel: function cancel() { if (jsonRequest) { jsonRequest.cancel(); jsonRequest = null; } if (imageRequest) { imageRequest.cancel(); imageRequest = null; } } }; } // function renderStyleImage(image ) { var userImage = image.userImage; if (userImage && userImage.render) { var updated = userImage.render(); if (updated) { image.data.replace(new Uint8Array(userImage.data.buffer)); return true; } } return false; } /** * 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 * @property {number} height * @property {Uint8Array | Uint8ClampedArray} data * * @see [Add an animated icon to the map.](https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/) * * @example * var flashingSquare = { * width: 64, * height: 64, * data: new Uint8Array(64 * 64 * 4), * * onAdd: function(map) { * this.map = map; * }, * * render: function() { * // keep repainting while the icon is on the map * this.map.triggerRepaint(); * * // alternate between black and white based on the time * var value = Math.round(Date.now() / 1000) % 2 === 0 ? 255 : 0; * * // check if image needs to be changed * if (value !== this.previousValue) { * this.previousValue = value; * * var bytesPerPixel = 4; * for (var x = 0; x < this.width; x++) { * for (var y = 0; y < this.height; y++) { * var 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. var 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. */ var ImageManager = /*@__PURE__*/(function (Evented) { function ImageManager() { Evented.call(this); this.images = {}; this.updatedImages = {}; this.callbackDispatchedThisFrame = {}; this.loaded = false; this.requestors = []; this.patterns = {}; this.atlasImage = new symbol_layout.RGBAImage({width: 1, height: 1}); this.dirty = true; } if ( Evented ) ImageManager.__proto__ = Evented; ImageManager.prototype = Object.create( Evented && Evented.prototype ); ImageManager.prototype.constructor = ImageManager; ImageManager.prototype.isLoaded = function isLoaded () { return this.loaded; }; ImageManager.prototype.setLoaded = function setLoaded (loaded ) { if (this.loaded === loaded) { return; } this.loaded = loaded; if (loaded) { for (var i = 0, list = this.requestors; i < list.length; i += 1) { var ref = list[i]; var ids = ref.ids; var callback = ref.callback; this._notify(ids, callback); } this.requestors = []; } }; ImageManager.prototype.getImage = function getImage (id ) { return this.images[id]; }; ImageManager.prototype.addImage = function addImage (id , image ) { symbol_layout.assert(!this.images[id]); this.images[id] = image; }; ImageManager.prototype.updateImage = function updateImage (id , image ) { var oldImage = this.images[id]; symbol_layout.assert(oldImage); symbol_layout.assert(oldImage.data.width === image.data.width); symbol_layout.assert(oldImage.data.height === image.data.height); image.version = oldImage.version + 1; this.images[id] = image; this.updatedImages[id] = true; }; ImageManager.prototype.removeImage = function removeImage (id ) { symbol_layout.assert(this.images[id]); var image = this.images[id]; delete this.images[id]; delete this.patterns[id]; if (image.userImage && image.userImage.onRemove) { image.userImage.onRemove(); } }; ImageManager.prototype.listImages = function listImages () { return Object.keys(this.images); }; ImageManager.prototype.getImages = function getImages (ids , callback ) { // If the sprite has been loaded, or if all the icon dependencies are already present // (i.e. if they've been addeded via runtime styling), then notify the requestor immediately. // Otherwise, delay notification until the sprite is loaded. At that point, if any of the // dependencies are still unavailable, we'll just assume they are permanently missing. var hasAllDependencies = true; if (!this.isLoaded()) { for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; if (!this.images[id]) { hasAllDependencies = false; } } } if (this.isLoaded() || hasAllDependencies) { this._notify(ids, callback); } else { this.requestors.push({ids: ids, callback: callback}); } }; ImageManager.prototype._notify = function _notify (ids , callback ) { var response = {}; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; if (!this.images[id]) { this.fire(new symbol_layout.Event('styleimagemissing', { id: id })); } var 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, hasRenderCallback: Boolean(image.userImage && image.userImage.render) }; } else { symbol_layout.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.")); } } callback(null, response); }; // Pattern stuff ImageManager.prototype.getPixelSize = function getPixelSize () { var ref = this.atlasImage; var width = ref.width; var height = ref.height; return {width: width, height: height}; }; ImageManager.prototype.getPattern = function getPattern (id ) { var pattern = this.patterns[id]; var image = this.getImage(id); if (!image) { return null; } if (pattern && pattern.position.version === image.version) { return pattern.position; } if (!pattern) { var w = image.data.width + padding * 2; var h = image.data.height + padding * 2; var bin = {w: w, h: h, x: 0, y: 0}; var position = new symbol_layout.ImagePosition(bin, image); this.patterns[id] = {bin: bin, position: position}; } else { pattern.position.version = image.version; } this._updatePatternAtlas(); return this.patterns[id].position; }; ImageManager.prototype.bind = function bind (context ) { var gl = context.gl; if (!this.atlasTexture) { this.atlasTexture = new symbol_layout.Texture(context, this.atlasImage, gl.RGBA); } else if (this.dirty) { this.atlasTexture.update(this.atlasImage); this.dirty = false; } this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); }; ImageManager.prototype._updatePatternAtlas = function _updatePatternAtlas () { var bins = []; for (var id in this.patterns) { bins.push(this.patterns[id].bin); } var ref = symbol_layout.potpack(bins); var w = ref.w; var h = ref.h; var dst = this.atlasImage; dst.resize({width: w || 1, height: h || 1}); for (var id$1 in this.patterns) { var ref$1 = this.patterns[id$1]; var bin = ref$1.bin; var x = bin.x + padding; var y = bin.y + padding; var src = this.images[id$1].data; var w$1 = src.width; var h$1 = src.height; symbol_layout.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x, y: y }, { width: w$1, height: h$1 }); // Add 1 pixel wrapped padding on each side of the image. symbol_layout.RGBAImage.copy(src, dst, { x: 0, y: h$1 - 1 }, { x: x, y: y - 1 }, { width: w$1, height: 1 }); // T symbol_layout.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x, y: y + h$1 }, { width: w$1, height: 1 }); // B symbol_layout.RGBAImage.copy(src, dst, { x: w$1 - 1, y: 0 }, { x: x - 1, y: y }, { width: 1, height: h$1 }); // L symbol_layout.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x + w$1, y: y }, { width: 1, height: h$1 }); // R } this.dirty = true; }; ImageManager.prototype.beginFrame = function beginFrame () { this.callbackDispatchedThisFrame = {}; }; ImageManager.prototype.dispatchRenderCallbacks = function dispatchRenderCallbacks (ids ) { for (var i = 0, list = ids; i < list.length; i += 1) { // the callback for the image was already dispatched for a different frame var id = list[i]; if (this.callbackDispatchedThisFrame[id]) { continue; } this.callbackDispatchedThisFrame[id] = true; var image = this.images[id]; symbol_layout.assert(image); var updated = renderStyleImage(image); if (updated) { this.updateImage(id, image); } } }; return ImageManager; }(symbol_layout.Evented)); // function loadGlyphRange (fontstack , range , urlTemplate , requestManager , callback ) { var begin = range * 256; var end = begin + 255; var request = requestManager.transformRequest( requestManager.normalizeGlyphsURL(urlTemplate) .replace('{fontstack}', fontstack) .replace('{range}', (begin + "-" + end)), symbol_layout.ResourceType.Glyphs); symbol_layout.getArrayBuffer(request, function (err , data ) { if (err) { callback(err); } else if (data) { var glyphs = {}; for (var i = 0, list = symbol_layout.parseGlyphPBF(data); i < list.length; i += 1) { var glyph = list[i]; glyphs[glyph.id] = glyph; } callback(null, glyphs); } }); } 'use strict'; var tinySdf = TinySDF; var default_1 = TinySDF; var INF = 1e20; function TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) { this.fontSize = fontSize || 24; this.buffer = buffer === undefined ? 3 : buffer; this.cutoff = cutoff || 0.25; this.fontFamily = fontFamily || 'sans-serif'; this.fontWeight = fontWeight || 'normal'; this.radius = radius || 8; var size = this.size = this.fontSize + this.buffer * 2; this.canvas = document.createElement('canvas'); this.canvas.width = this.canvas.height = size; this.ctx = this.canvas.getContext('2d'); this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily; this.ctx.textBaseline = 'middle'; this.ctx.fillStyle = 'black'; // temporary arrays for the distance transform this.gridOuter = new Float64Array(size * size); this.gridInner = new Float64Array(size * size); this.f = new Float64Array(size); this.d = new Float64Array(size); this.z = new Float64Array(size + 1); this.v = new Int16Array(size); // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852 this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1)); } TinySDF.prototype.draw = function (char) { this.ctx.clearRect(0, 0, this.size, this.size); this.ctx.fillText(char, this.buffer, this.middle); var imgData = this.ctx.getImageData(0, 0, this.size, this.size); var alphaChannel = new Uint8ClampedArray(this.size * this.size); for (var i = 0; i < this.size * this.size; i++) { var a = imgData.data[i * 4 + 3] / 255; // alpha value this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2); this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2); } edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z); edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z); for (i = 0; i < this.size * this.size; i++) { var d = this.gridOuter[i] - this.gridInner[i]; alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff)))); } return alphaChannel; }; // 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf function edt(data, width, height, f, d, v, z) { for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { f[y] = data[y * width + x]; } edt1d(f, d, v, z, height); for (y = 0; y < height; y++) { data[y * width + x] = d[y]; } } for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { f[x] = data[y * width + x]; } edt1d(f, d, v, z, width); for (x = 0; x < width; x++) { data[y * width + x] = Math.sqrt(d[x]); } } } // 1D squared distance transform function edt1d(f, d, v, z, n) { v[0] = 0; z[0] = -INF; z[1] = +INF; for (var q = 1, k = 0; q < n; q++) { var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); while (s <= z[k]) { k--; s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); } k++; v[k] = q; z[k] = s; z[k + 1] = +INF; } for (q = 0, k = 0; q < n; q++) { while (z[k + 1] < q) { k++; } d[q] = (q - v[k]) * (q - v[k]) + f[v[k]]; } } tinySdf.default = default_1; // var GlyphManager = function GlyphManager(requestManager , localIdeographFontFamily ) { this.requestManager = requestManager; this.localIdeographFontFamily = localIdeographFontFamily; this.entries = {}; }; GlyphManager.prototype.setURL = function setURL (url ) { this.url = url; }; GlyphManager.prototype.getGlyphs = function getGlyphs (glyphs , callback ) { var this$1 = this; var all = []; for (var stack in glyphs) { for (var i = 0, list = glyphs[stack]; i < list.length; i += 1) { var id = list[i]; all.push({stack: stack, id: id}); } } symbol_layout.asyncAll(all, function (ref, callback ) { var stack = ref.stack; var id = ref.id; var entry = this$1.entries[stack]; if (!entry) { entry = this$1.entries[stack] = { glyphs: {}, requests: {} }; } var glyph = entry.glyphs[id]; if (glyph !== undefined) { callback(null, {stack: stack, id: id, glyph: glyph}); return; } glyph = this$1._tinySDF(entry, stack, id); if (glyph) { entry.glyphs[id] = glyph; callback(null, {stack: stack, id: id, glyph: glyph}); return; } var range = Math.floor(id / 256); if (range * 256 > 65535) { callback(new Error('glyphs > 65535 not supported')); return; } var requests = entry.requests[range]; if (!requests) { requests = entry.requests[range] = []; GlyphManager.loadGlyphRange(stack, range, (this$1.url ), this$1.requestManager, function (err, response ) { if (response) { for (var id in response) { if (!this$1._doesCharSupportLocalGlyph(+id)) { entry.glyphs[+id] = response[+id]; } } } for (var i = 0, list = requests; i < list.length; i += 1) { var cb = list[i]; cb(err, response); } delete entry.requests[range]; }); } requests.push(function (err, result ) { if (err) { callback(err); } else if (result) { callback(null, {stack: stack, id: id, glyph: result[id] || null}); } }); }, function (err, glyphs ) { if (err) { callback(err); } else if (glyphs) { var result = {}; for (var i = 0, list = glyphs; i < list.length; i += 1) { // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred. var ref = list[i]; var stack = ref.stack; var id = ref.id; var glyph = ref.glyph; (result[stack] || (result[stack] = {}))[id] = glyph && { id: glyph.id, bitmap: glyph.bitmap.clone(), metrics: glyph.metrics }; } callback(null, result); } }); }; GlyphManager.prototype._doesCharSupportLocalGlyph = function _doesCharSupportLocalGlyph (id ) { /* eslint-disable new-cap */ return !!this.localIdeographFontFamily && (symbol_layout.isChar['CJK Unified Ideographs'](id) || symbol_layout.isChar['Hangul Syllables'](id) || symbol_layout.isChar['Hiragana'](id) || symbol_layout.isChar['Katakana'](id)); /* eslint-enable new-cap */ }; GlyphManager.prototype._tinySDF = function _tinySDF (entry , stack , id ) { var family = this.localIdeographFontFamily; if (!family) { return; } if (!this._doesCharSupportLocalGlyph(id)) { return; } var tinySDF = entry.tinySDF; if (!tinySDF) { var fontWeight = '400'; if (/bold/i.test(stack)) { fontWeight = '900'; } else if (/medium/i.test(stack)) { fontWeight = '500'; } else if (/light/i.test(stack)) { fontWeight = '200'; } tinySDF = entry.tinySDF = new GlyphManager.TinySDF(24, 3, 8, .25, family, fontWeight); } return { id: id, bitmap: new symbol_layout.AlphaImage({width: 30, height: 30}, tinySDF.draw(String.fromCharCode(id))), metrics: { width: 24, height: 24, left: 0, top: -8, advance: 24 } }; }; GlyphManager.loadGlyphRange = loadGlyphRange; GlyphManager.TinySDF = tinySdf; // var LightPositionProperty = function LightPositionProperty() { this.specification = symbol_layout.styleSpec.light.position; }; LightPositionProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { return symbol_layout.sphericalToCartesian(value.expression.evaluate(parameters)); }; LightPositionProperty.prototype.interpolate = function interpolate$1 (a , b , t ) { return { x: symbol_layout.number(a.x, b.x, t), y: symbol_layout.number(a.y, b.y, t), z: symbol_layout.number(a.z, b.z, t), }; }; var properties = new symbol_layout.Properties({ "anchor": new symbol_layout.DataConstantProperty(symbol_layout.styleSpec.light.anchor), "position": new LightPositionProperty(), "color": new symbol_layout.DataConstantProperty(symbol_layout.styleSpec.light.color), "intensity": new symbol_layout.DataConstantProperty(symbol_layout.styleSpec.light.intensity), }); var TRANSITION_SUFFIX = '-transition'; /* * Represents the light used to light extruded features. */ var Light = /*@__PURE__*/(function (Evented) { function Light(lightOptions ) { Evented.call(this); this._transitionable = new symbol_layout.Transitionable(properties); this.setLight(lightOptions); this._transitioning = this._transitionable.untransitioned(); } if ( Evented ) Light.__proto__ = Evented; Light.prototype = Object.create( Evented && Evented.prototype ); Light.prototype.constructor = Light; Light.prototype.getLight = function getLight () { return this._transitionable.serialize(); }; Light.prototype.setLight = function setLight (light , options) { if ( options === void 0 ) options = {}; if (this._validate(symbol_layout.validateLight, light, options)) { return; } for (var name in light) { var value = light[name]; if (symbol_layout.endsWith(name, TRANSITION_SUFFIX)) { this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value); } else { this._transitionable.setValue(name, value); } } }; Light.prototype.updateTransitions = function updateTransitions (parameters ) { this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); }; Light.prototype.hasTransition = function hasTransition () { return this._transitioning.hasTransition(); }; Light.prototype.recalculate = function recalculate (parameters ) { this.properties = this._transitioning.possiblyEvaluate(parameters); }; Light.prototype._validate = function _validate (validate , value , options ) { if (options && options.validate === false) { return false; } return symbol_layout.emitValidationErrors(this, validate.call(symbol_layout.validateStyle, symbol_layout.extend({ value: value, // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 style: {glyphs: true, sprite: true}, styleSpec: symbol_layout.styleSpec }))); }; return Light; }(symbol_layout.Evented)); // /** * A LineAtlas lets us reuse rendered dashed lines * by writing many of them to a texture and then fetching their positions * using .getDash. * * @param {number} width * @param {number} height * @private */ var LineAtlas = function LineAtlas(width , height ) { this.width = width; this.height = height; this.nextRow = 0; this.bytes = 4; this.data = new Uint8Array(this.width * this.height * this.bytes); this.positions = {}; }; /** * Get or create a dash line pattern. * * @param {Array} dasharray * @param {boolean} round whether to add circle caps in between dash segments * @returns {Object} position of dash texture in { y, height, width } * @private */ LineAtlas.prototype.getDash = function getDash (dasharray , round ) { var key = dasharray.join(",") + String(round); if (!this.positions[key]) { this.positions[key] = this.addDash(dasharray, round); } return this.positions[key]; }; LineAtlas.prototype.addDash = function addDash (dasharray , round ) { var n = round ? 7 : 0; var height = 2 * n + 1; var offset = 128; if (this.nextRow + height > this.height) { symbol_layout.warnOnce('LineAtlas out of space'); return null; } var length = 0; for (var i = 0; i < dasharray.length; i++) { length += dasharray[i]; } var stretch = this.width / length; var halfWidth = stretch / 2; // If dasharray has an odd length, both the first and last parts // are dashes and should be joined seamlessly. var oddLength = dasharray.length % 2 === 1; for (var y = -n; y <= n; y++) { var row = this.nextRow + n + y; var index = this.width * row; var left = oddLength ? -dasharray[dasharray.length - 1] : 0; var right = dasharray[0]; var partIndex = 1; for (var x = 0; x < this.width; x++) { while (right < x / stretch) { left = right; right = right + dasharray[partIndex]; if (oddLength && partIndex === dasharray.length - 1) { right += dasharray[0]; } partIndex++; } var distLeft = Math.abs(x - left * stretch); var distRight = Math.abs(x - right * stretch); var dist = Math.min(distLeft, distRight); var inside = (partIndex % 2) === 1; var signedDistance = (void 0); if (round) { // Add circle caps var distMiddle = n ? y / n * (halfWidth + 1) : 0; if (inside) { var distEdge = halfWidth - Math.abs(distMiddle); signedDistance = Math.sqrt(dist * dist + distEdge * distEdge); } else { signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle); } } else { signedDistance = (inside ? 1 : -1) * dist; } this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset)); } } var pos = { y: (this.nextRow + n + 0.5) / this.height, height: 2 * n / this.height, width: length }; this.nextRow += height; this.dirty = true; return pos; }; LineAtlas.prototype.bind = function bind (context ) { var gl = context.gl; if (!this.texture) { this.texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data); } else { gl.bindTexture(gl.TEXTURE_2D, this.texture); if (this.dirty) { this.dirty = false; gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data); } } }; // /** * Responsible for sending messages from a {@link Source} to an associated * {@link WorkerSource}. * * @private */ var Dispatcher = function Dispatcher(workerPool , parent ) { this.workerPool = workerPool; this.actors = []; this.currentActor = 0; this.id = symbol_layout.uniqueId(); var workers = this.workerPool.acquire(this.id); for (var i = 0; i < workers.length; i++) { var worker = workers[i]; var actor = new Dispatcher.Actor(worker, parent, this.id); actor.name = "Worker " + i; this.actors.push(actor); } symbol_layout.assert(this.actors.length); }; /** * Broadcast a message to all Workers. */ Dispatcher.prototype.broadcast = function broadcast (type , data , cb ) { symbol_layout.assert(this.actors.length); cb = cb || function () {}; symbol_layout.asyncAll(this.actors, function (actor, done) { actor.send(type, data, done); }, cb); }; /** * Acquires an actor to dispatch messages to. The actors are distributed in round-robin fashion. * @returns An actor object backed by a web worker for processing messages. */ Dispatcher.prototype.getActor = function getActor () { symbol_layout.assert(this.actors.length); this.currentActor = (this.currentActor + 1) % this.actors.length; return this.actors[this.currentActor]; }; Dispatcher.prototype.remove = function remove () { this.actors.forEach(function (actor) { actor.remove(); }); this.actors = []; this.workerPool.release(this.id); }; Dispatcher.Actor = symbol_layout.Actor; // function loadTileJSON(options , requestManager , callback ) { var loaded = function(err , tileJSON ) { if (err) { return callback(err); } else if (tileJSON) { var result = symbol_layout.pick( // explicit source options take precedence over TileJSON symbol_layout.extend(tileJSON, options), ['tiles', 'minzoom', 'maxzoom', 'attribution', 'mapbox_logo', 'bounds', 'scheme', 'tileSize', 'encoding'] ); if (tileJSON.vector_layers) { result.vectorLayers = tileJSON.vector_layers; result.vectorLayerIds = result.vectorLayers.map(function (layer) { return layer.id; }); } // only canonicalize tile tileset if source is declared using a tilejson url if (options.url) { result.tiles = requestManager.canonicalizeTileset(result, options.url); } callback(null, result); } }; if (options.url) { return symbol_layout.getJSON(requestManager.transformRequest(requestManager.normalizeSourceURL(options.url), symbol_layout.ResourceType.Source), loaded); } else { return symbol_layout.browser.frame(function () { return loaded(null, options); }); } } // var TileBounds = function TileBounds(bounds , minzoom , maxzoom ) { this.bounds = symbol_layout.LngLatBounds.convert(this.validateBounds(bounds)); this.minzoom = minzoom || 0; this.maxzoom = maxzoom || 24; }; TileBounds.prototype.validateBounds = function validateBounds (bounds ) { // make sure the bounds property contains valid longitude and latitudes if (!Array.isArray(bounds) || bounds.length !== 4) { return [-180, -90, 180, 90]; } return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])]; }; TileBounds.prototype.contains = function contains (tileID ) { var worldSize = Math.pow(2, tileID.z); var level = { minX: Math.floor(symbol_layout.mercatorXfromLng(this.bounds.getWest()) * worldSize), minY: Math.floor(symbol_layout.mercatorYfromLat(this.bounds.getNorth()) * worldSize), maxX: Math.ceil(symbol_layout.mercatorXfromLng(this.bounds.getEast()) * worldSize), maxY: Math.ceil(symbol_layout.mercatorYfromLat(this.bounds.getSouth()) * worldSize) }; var hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY; return hit; }; // var VectorTileSource = /*@__PURE__*/(function (Evented) { function VectorTileSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.type = 'vector'; this.minzoom = 0; this.maxzoom = 22; this.scheme = 'xyz'; this.tileSize = 512; this.reparseOverscaled = true; this.isTileClipped = true; this._loaded = false; symbol_layout.extend(this, symbol_layout.pick(options, ['url', 'scheme', 'tileSize'])); this._options = symbol_layout.extend({ type: 'vector' }, options); this._collectResourceTiming = options.collectResourceTiming; if (this.tileSize !== 512) { throw new Error('vector tile sources must have a tileSize of 512'); } this.setEventedParent(eventedParent); } if ( Evented ) VectorTileSource.__proto__ = Evented; VectorTileSource.prototype = Object.create( Evented && Evented.prototype ); VectorTileSource.prototype.constructor = VectorTileSource; VectorTileSource.prototype.load = function load () { var this$1 = this; this._loaded = false; this.fire(new symbol_layout.Event('dataloading', {dataType: 'source'})); this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, function (err, tileJSON) { this$1._tileJSONRequest = null; this$1._loaded = true; if (err) { this$1.fire(new symbol_layout.ErrorEvent(err)); } else if (tileJSON) { symbol_layout.extend(this$1, tileJSON); if (tileJSON.bounds) { this$1.tileBounds = new TileBounds(tileJSON.bounds, this$1.minzoom, this$1.maxzoom); } symbol_layout.postTurnstileEvent(tileJSON.tiles, this$1.map._requestManager._customAccessToken); symbol_layout.postMapLoadEvent(tileJSON.tiles, this$1.map._getMapId(), this$1.map._requestManager._skuToken, this$1.map._requestManager._customAccessToken); // `content` is included here to prevent a race condition where `Style#_updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this$1.fire(new symbol_layout.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); this$1.fire(new symbol_layout.Event('data', {dataType: 'source', sourceDataType: 'content'})); } }); }; VectorTileSource.prototype.loaded = function loaded () { return this._loaded; }; VectorTileSource.prototype.hasTile = function hasTile (tileID ) { return !this.tileBounds || this.tileBounds.contains(tileID.canonical); }; VectorTileSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; VectorTileSource.prototype.onRemove = function onRemove () { if (this._tileJSONRequest) { this._tileJSONRequest.cancel(); this._tileJSONRequest = null; } }; VectorTileSource.prototype.serialize = function serialize () { return symbol_layout.extend({}, this._options); }; VectorTileSource.prototype.loadTile = function loadTile (tile , callback ) { var url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, null); var params = { request: this.map._requestManager.transformRequest(url, symbol_layout.ResourceType.Tile), uid: tile.uid, tileID: tile.tileID, zoom: tile.tileID.overscaledZ, tileSize: this.tileSize * tile.tileID.overscaleFactor(), type: this.type, source: this.id, pixelRatio: symbol_layout.browser.devicePixelRatio, showCollisionBoxes: this.map.showCollisionBoxes, }; params.request.collectResourceTiming = this._collectResourceTiming; if (!tile.actor || tile.state === 'expired') { tile.actor = this.dispatcher.getActor(); tile.request = tile.actor.send('loadTile', params, done.bind(this)); } 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); } if (data && data.resourceTiming) { tile.resourceTiming = data.resourceTiming; } if (this.map._refreshExpiredTiles && data) { tile.setExpiryData(data); } tile.loadVectorData(data, this.map.painter); symbol_layout.cacheEntryPossiblyAdded(this.dispatcher); callback(null); if (tile.reloadCallback) { this.loadTile(tile, tile.reloadCallback); tile.reloadCallback = null; } } }; VectorTileSource.prototype.abortTile = function 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 }, undefined); } }; VectorTileSource.prototype.unloadTile = function unloadTile (tile ) { tile.unloadVectorData(); if (tile.actor) { tile.actor.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, undefined); } }; VectorTileSource.prototype.hasTransition = function hasTransition () { return false; }; return VectorTileSource; }(symbol_layout.Evented)); // var RasterTileSource = /*@__PURE__*/(function (Evented) { function RasterTileSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.setEventedParent(eventedParent); this.type = 'raster'; this.minzoom = 0; this.maxzoom = 22; this.roundZoom = true; this.scheme = 'xyz'; this.tileSize = 512; this._loaded = false; this._options = symbol_layout.extend({ type: 'raster' }, options); symbol_layout.extend(this, symbol_layout.pick(options, ['url', 'scheme', 'tileSize'])); } if ( Evented ) RasterTileSource.__proto__ = Evented; RasterTileSource.prototype = Object.create( Evented && Evented.prototype ); RasterTileSource.prototype.constructor = RasterTileSource; RasterTileSource.prototype.load = function load () { var this$1 = this; this._loaded = false; this.fire(new symbol_layout.Event('dataloading', {dataType: 'source'})); this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, function (err, tileJSON) { this$1._tileJSONRequest = null; this$1._loaded = true; if (err) { this$1.fire(new symbol_layout.ErrorEvent(err)); } else if (tileJSON) { symbol_layout.extend(this$1, tileJSON); if (tileJSON.bounds) { this$1.tileBounds = new TileBounds(tileJSON.bounds, this$1.minzoom, this$1.maxzoom); } symbol_layout.postTurnstileEvent(tileJSON.tiles); symbol_layout.postMapLoadEvent(tileJSON.tiles, this$1.map._getMapId(), this$1.map._requestManager._skuToken); // `content` is included here to prevent a race condition where `Style#_updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this$1.fire(new symbol_layout.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); this$1.fire(new symbol_layout.Event('data', {dataType: 'source', sourceDataType: 'content'})); } }); }; RasterTileSource.prototype.loaded = function loaded () { return this._loaded; }; RasterTileSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; RasterTileSource.prototype.onRemove = function onRemove () { if (this._tileJSONRequest) { this._tileJSONRequest.cancel(); this._tileJSONRequest = null; } }; RasterTileSource.prototype.serialize = function serialize () { return symbol_layout.extend({}, this._options); }; RasterTileSource.prototype.hasTile = function hasTile (tileID ) { return !this.tileBounds || this.tileBounds.contains(tileID.canonical); }; RasterTileSource.prototype.loadTile = function loadTile (tile , callback ) { var this$1 = this; var url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, this.tileSize); tile.request = symbol_layout.getImage(this.map._requestManager.transformRequest(url, symbol_layout.ResourceType.Tile), function (err, img) { delete tile.request; if (tile.aborted) { tile.state = 'unloaded'; callback(null); } else if (err) { tile.state = 'errored'; callback(err); } else if (img) { if (this$1.map._refreshExpiredTiles) { tile.setExpiryData(img); } delete (img ).cacheControl; delete (img ).expires; var context = this$1.map.painter.context; var gl = context.gl; tile.texture = this$1.map.painter.getTileTexture(img.width); if (tile.texture) { tile.texture.update(img, { useMipmap: true }); } else { tile.texture = new symbol_layout.Texture(context, img, gl.RGBA, { useMipmap: true }); tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); if (context.extTextureFilterAnisotropic) { gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); } } tile.state = 'loaded'; symbol_layout.cacheEntryPossiblyAdded(this$1.dispatcher); callback(null); } }); }; RasterTileSource.prototype.abortTile = function abortTile (tile , callback ) { if (tile.request) { tile.request.cancel(); delete tile.request; } callback(); }; RasterTileSource.prototype.unloadTile = function unloadTile (tile , callback ) { if (tile.texture) { this.map.painter.saveTileTexture(tile.texture); } callback(); }; RasterTileSource.prototype.hasTransition = function hasTransition () { return false; }; return RasterTileSource; }(symbol_layout.Evented)); // var RasterDEMTileSource = /*@__PURE__*/(function (RasterTileSource) { function RasterDEMTileSource(id , options , dispatcher , eventedParent ) { RasterTileSource.call(this, id, options, dispatcher, eventedParent); this.type = 'raster-dem'; this.maxzoom = 22; this._options = symbol_layout.extend({ type: 'raster-dem' }, options); this.encoding = options.encoding || "mapbox"; } if ( RasterTileSource ) RasterDEMTileSource.__proto__ = RasterTileSource; RasterDEMTileSource.prototype = Object.create( RasterTileSource && RasterTileSource.prototype ); RasterDEMTileSource.prototype.constructor = RasterDEMTileSource; RasterDEMTileSource.prototype.serialize = function serialize () { return { type: 'raster-dem', url: this.url, tileSize: this.tileSize, tiles: this.tiles, bounds: this.bounds, encoding: this.encoding }; }; RasterDEMTileSource.prototype.loadTile = function loadTile (tile , callback ) { var url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, this.tileSize); tile.request = symbol_layout.getImage(this.map._requestManager.transformRequest(url, symbol_layout.ResourceType.Tile), imageLoaded.bind(this)); tile.neighboringTiles = this._getNeighboringTiles(tile.tileID); function imageLoaded(err, img) { delete tile.request; if (tile.aborted) { tile.state = 'unloaded'; callback(null); } else if (err) { tile.state = 'errored'; callback(err); } else if (img) { if (this.map._refreshExpiredTiles) { tile.setExpiryData(img); } delete (img ).cacheControl; delete (img ).expires; var rawImageData = symbol_layout.browser.getImageData(img); var params = { uid: tile.uid, coord: tile.tileID, source: this.id, rawImageData: rawImageData, encoding: this.encoding }; if (!tile.actor || tile.state === 'expired') { tile.actor = this.dispatcher.getActor(); tile.actor.send('loadDEMTile', params, done.bind(this)); } } } function done(err, dem) { if (err) { tile.state = 'errored'; callback(err); } if (dem) { tile.dem = dem; tile.needsHillshadePrepare = true; tile.state = 'loaded'; callback(null); } } }; RasterDEMTileSource.prototype._getNeighboringTiles = function _getNeighboringTiles (tileID ) { var canonical = tileID.canonical; var dim = Math.pow(2, canonical.z); var px = (canonical.x - 1 + dim) % dim; var pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap; var nx = (canonical.x + 1 + dim) % dim; var nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap; var neighboringTiles = {}; // add adjacent tiles neighboringTiles[new symbol_layout.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = {backfilled: false}; neighboringTiles[new symbol_layout.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = {backfilled: false}; // Add upper neighboringTiles if (canonical.y > 0) { neighboringTiles[new symbol_layout.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = {backfilled: false}; neighboringTiles[new symbol_layout.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = {backfilled: false}; neighboringTiles[new symbol_layout.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = {backfilled: false}; } // Add lower neighboringTiles if (canonical.y + 1 < dim) { neighboringTiles[new symbol_layout.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = {backfilled: false}; neighboringTiles[new symbol_layout.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = {backfilled: false}; neighboringTiles[new symbol_layout.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = {backfilled: false}; } return neighboringTiles; }; RasterDEMTileSource.prototype.unloadTile = function unloadTile (tile ) { if (tile.demTexture) { this.map.painter.saveTileTexture(tile.demTexture); } if (tile.fbo) { tile.fbo.destroy(); delete tile.fbo; } if (tile.dem) { delete tile.dem; } delete tile.neighboringTiles; tile.state = 'unloaded'; if (tile.actor) { tile.actor.send('removeDEMTile', { uid: tile.uid, source: this.id }); } }; return RasterDEMTileSource; }(RasterTileSource)); // /** * 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 [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) * @see [Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/) * @see [Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/) * @see [Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) */ var GeoJSONSource = /*@__PURE__*/(function (Evented) { function GeoJSONSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; // `type` is a property rather than a constant to make it easy for 3rd // parties to use GeoJSONSource to build their own source types. this.type = 'geojson'; this.minzoom = 0; this.maxzoom = 18; this.tileSize = 512; this.isTileClipped = true; this.reparseOverscaled = true; this._removed = false; this._loaded = false; this.actor = dispatcher.getActor(); this.setEventedParent(eventedParent); this._data = (options.data ); this._options = symbol_layout.extend({}, options); this._collectResourceTiming = options.collectResourceTiming; this._resourceTiming = []; if (options.maxzoom !== undefined) { this.maxzoom = options.maxzoom; } if (options.type) { this.type = options.type; } if (options.attribution) { this.attribution = options.attribution; } var scale = symbol_layout.EXTENT / this.tileSize; // sent to the worker, along with `url: ...` or `data: literal geojson`, // so that it can load/parse/index the geojson data // extending with `options.workerOptions` helps to make it easy for // third-party sources to hack/reuse GeoJSONSource. this.workerOptions = symbol_layout.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: symbol_layout.EXTENT, maxZoom: this.maxzoom, lineMetrics: options.lineMetrics || false, generateId: options.generateId || false }, superclusterOptions: { maxZoom: options.clusterMaxZoom !== undefined ? Math.min(options.clusterMaxZoom, this.maxzoom - 1) : (this.maxzoom - 1), extent: symbol_layout.EXTENT, radius: (options.clusterRadius || 50) * scale, log: false }, clusterProperties: options.clusterProperties }, options.workerOptions); } if ( Evented ) GeoJSONSource.__proto__ = Evented; GeoJSONSource.prototype = Object.create( Evented && Evented.prototype ); GeoJSONSource.prototype.constructor = GeoJSONSource; GeoJSONSource.prototype.load = function load () { var this$1 = this; this.fire(new symbol_layout.Event('dataloading', {dataType: 'source'})); this._updateWorkerData(function (err) { if (err) { this$1.fire(new symbol_layout.ErrorEvent(err)); return; } var data = { dataType: 'source', sourceDataType: 'metadata' }; if (this$1._collectResourceTiming && this$1._resourceTiming && (this$1._resourceTiming.length > 0)) { data.resourceTiming = this$1._resourceTiming; this$1._resourceTiming = []; } // although GeoJSON sources contain no metadata, we fire this event to let the SourceCache // know its ok to start requesting tiles. this$1.fire(new symbol_layout.Event('data', data)); }); }; GeoJSONSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; /** * Sets the GeoJSON data and re-renders the map. * * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files. * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.setData = function setData (data ) { var this$1 = this; this._data = data; this.fire(new symbol_layout.Event('dataloading', {dataType: 'source'})); this._updateWorkerData(function (err) { if (err) { this$1.fire(new symbol_layout.ErrorEvent(err)); return; } var data = { dataType: 'source', sourceDataType: 'content' }; if (this$1._collectResourceTiming && this$1._resourceTiming && (this$1._resourceTiming.length > 0)) { data.resourceTiming = this$1._resourceTiming; this$1._resourceTiming = []; } this$1.fire(new symbol_layout.Event('data', data)); }); return this; }; /** * For clustered sources, fetches the zoom at which the given cluster expands. * * @param clusterId The value of the cluster's `cluster_id` property. * @param callback A callback to be called when the zoom value is retrieved (`(error, zoom) => { ... }`). * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (clusterId , callback ) { this.actor.send('geojson.getClusterExpansionZoom', { clusterId: clusterId, source: this.id }, callback); return this; }; /** * For clustered sources, fetches the children of the given cluster on the next zoom level (as an array of GeoJSON features). * * @param clusterId The value of the cluster's `cluster_id` property. * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.getClusterChildren = function getClusterChildren (clusterId , callback ) { this.actor.send('geojson.getClusterChildren', { clusterId: clusterId, source: this.id }, callback); return this; }; /** * For clustered sources, fetches the original points that belong to the cluster (as an array of GeoJSON features). * * @param clusterId The value of the cluster's `cluster_id` property. * @param limit The maximum number of features to return. * @param offset The number of features to skip (e.g. for pagination). * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.getClusterLeaves = function getClusterLeaves (clusterId , limit , offset , callback ) { this.actor.send('geojson.getClusterLeaves', { source: this.id, clusterId: clusterId, limit: limit, offset: offset }, callback); return this; }; /* * Responsible for invoking WorkerSource's geojson.loadData target, which * handles loading the geojson data and preparing to serve it up as tiles, * using geojson-vt or supercluster as appropriate. */ GeoJSONSource.prototype._updateWorkerData = function _updateWorkerData (callback ) { var this$1 = this; this._loaded = false; var options = symbol_layout.extend({}, this.workerOptions); var data = this._data; if (typeof data === 'string') { options.request = this.map._requestManager.transformRequest(symbol_layout.browser.resolveURL(data), symbol_layout.ResourceType.Source); options.request.collectResourceTiming = this._collectResourceTiming; } else { options.data = JSON.stringify(data); } // target {this.type}.loadData rather than literally geojson.loadData, // so that other geojson-like source types can easily reuse this // implementation this.actor.send(((this.type) + ".loadData"), options, function (err, result) { if (this$1._removed || (result && result.abandoned)) { return; } this$1._loaded = true; if (result && result.resourceTiming && result.resourceTiming[this$1.id]) { this$1._resourceTiming = result.resourceTiming[this$1.id].slice(0); } // Any `loadData` calls that piled up while we were processing // this one will get coalesced into a single call when this // 'coalesce' message is processed. // We would self-send from the worker if we had access to its // message queue. Waiting instead for the 'coalesce' to round-trip // through the foreground just means we're throttling the worker // to run at a little less than full-throttle. this$1.actor.send(((this$1.type) + ".coalesce"), { source: options.source }, null); callback(err); }); }; GeoJSONSource.prototype.loaded = function loaded () { return this._loaded; }; GeoJSONSource.prototype.loadTile = function loadTile (tile , callback ) { var this$1 = this; var message = !tile.actor ? 'loadTile' : 'reloadTile'; tile.actor = this.actor; var params = { type: this.type, uid: tile.uid, tileID: tile.tileID, zoom: tile.tileID.overscaledZ, maxZoom: this.maxzoom, tileSize: this.tileSize, source: this.id, pixelRatio: symbol_layout.browser.devicePixelRatio, showCollisionBoxes: this.map.showCollisionBoxes }; tile.request = this.actor.send(message, params, function (err, data) { delete tile.request; tile.unloadVectorData(); if (tile.aborted) { return callback(null); } if (err) { return callback(err); } tile.loadVectorData(data, this$1.map.painter, message === 'reloadTile'); return callback(null); }); }; GeoJSONSource.prototype.abortTile = function abortTile (tile ) { if (tile.request) { tile.request.cancel(); delete tile.request; } tile.aborted = true; }; GeoJSONSource.prototype.unloadTile = function unloadTile (tile ) { tile.unloadVectorData(); this.actor.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }); }; GeoJSONSource.prototype.onRemove = function onRemove () { this._removed = true; this.actor.send('removeSource', { type: this.type, source: this.id }); }; GeoJSONSource.prototype.serialize = function serialize () { return symbol_layout.extend({}, this._options, { type: this.type, data: this._data }); }; GeoJSONSource.prototype.hasTransition = function hasTransition () { return false; }; return GeoJSONSource; }(symbol_layout.Evented)); // /** * 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 * var 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 [Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/) */ var ImageSource = /*@__PURE__*/(function (Evented) { function ImageSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.coordinates = options.coordinates; this.type = 'image'; this.minzoom = 0; this.maxzoom = 22; this.tileSize = 512; this.tiles = {}; this._loaded = false; this.setEventedParent(eventedParent); this.options = options; } if ( Evented ) ImageSource.__proto__ = Evented; ImageSource.prototype = Object.create( Evented && Evented.prototype ); ImageSource.prototype.constructor = ImageSource; ImageSource.prototype.load = function load (newCoordinates , successCallback ) { var this$1 = this; this._loaded = false; this.fire(new symbol_layout.Event('dataloading', {dataType: 'source'})); this.url = this.options.url; symbol_layout.getImage(this.map._requestManager.transformRequest(this.url, symbol_layout.ResourceType.Image), function (err, image) { this$1._loaded = true; if (err) { this$1.fire(new symbol_layout.ErrorEvent(err)); } else if (image) { this$1.image = image; if (newCoordinates) { this$1.coordinates = newCoordinates; } if (successCallback) { successCallback(); } this$1._finishLoading(); } }); }; ImageSource.prototype.loaded = function loaded () { return this._loaded; }; /** * 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 * @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} this */ ImageSource.prototype.updateImage = function updateImage (options ) { var this$1 = this; if (!this.image || !options.url) { return this; } this.options.url = options.url; this.load(options.coordinates, function () { this$1.texture = null; }); return this; }; ImageSource.prototype._finishLoading = function _finishLoading () { if (this.map) { this.setCoordinates(this.coordinates); this.fire(new symbol_layout.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); } }; ImageSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; /** * Sets the image's coordinates and re-renders the map. * * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the image. * The coordinates start at the top left corner of the image and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {ImageSource} this */ ImageSource.prototype.setCoordinates = function setCoordinates (coordinates ) { var this$1 = this; this.coordinates = coordinates; // Calculate which mercator tile is suitable for rendering the video in // and create a buffer with the corner coordinates. These coordinates // may be outside the tile, because raster tiles aren't clipped when rendering. // transform the geo coordinates into (zoom 0) tile space coordinates var cornerCoords = coordinates.map(symbol_layout.MercatorCoordinate.fromLngLat); // Compute the coordinates of the tile we'll use to hold this image's // render data this.tileID = getCoordinatesCenterTileID(cornerCoords); // 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; // Transform the corner coordinates into the coordinate space of our // tile. var tileCoords = cornerCoords.map(function (coord) { return this$1.tileID.getTilePoint(coord)._round(); }); this._boundsArray = new symbol_layout.StructArrayLayout4i8(); this._boundsArray.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0); this._boundsArray.emplaceBack(tileCoords[1].x, tileCoords[1].y, symbol_layout.EXTENT, 0); this._boundsArray.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, symbol_layout.EXTENT); this._boundsArray.emplaceBack(tileCoords[2].x, tileCoords[2].y, symbol_layout.EXTENT, symbol_layout.EXTENT); if (this.boundsBuffer) { this.boundsBuffer.destroy(); delete this.boundsBuffer; } this.fire(new symbol_layout.Event('data', {dataType:'source', sourceDataType: 'content'})); return this; }; ImageSource.prototype.prepare = function prepare () { if (Object.keys(this.tiles).length === 0 || !this.image) { return; } var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, symbol_layout.rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = symbol_layout.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new symbol_layout.Texture(context, this.image, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; ImageSource.prototype.loadTile = function loadTile (tile , callback ) { // We have a single tile -- whoose coordinates are this.tileID -- that // covers the image we want to render. If that's the one being // requested, set it up with the image; otherwise, mark the tile as // `errored` to indicate that we have no data for it. // If the world wraps, we may have multiple "wrapped" copies of the // single tile. if (this.tileID && this.tileID.equals(tile.tileID.canonical)) { this.tiles[String(tile.tileID.wrap)] = tile; tile.buckets = {}; callback(null); } else { tile.state = 'errored'; callback(null); } }; ImageSource.prototype.serialize = function serialize () { return { type: 'image', url: this.options.url, coordinates: this.coordinates }; }; ImageSource.prototype.hasTransition = function hasTransition () { return false; }; return ImageSource; }(symbol_layout.Evented)); /** * Given a list of coordinates, get their center as a coordinate. * * @returns centerpoint * @private */ function getCoordinatesCenterTileID(coords ) { var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; minX = Math.min(minX, coord.x); minY = Math.min(minY, coord.y); maxX = Math.max(maxX, coord.x); maxY = Math.max(maxY, coord.y); } var dx = maxX - minX; var dy = maxY - minY; var dMax = Math.max(dx, dy); var zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2)); var tilesAtZoom = Math.pow(2, zoom); return new symbol_layout.CanonicalTileID( zoom, Math.floor((minX + maxX) / 2 * tilesAtZoom), Math.floor((minY + maxY) / 2 * tilesAtZoom)); } // /** * 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 * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove * @see [Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/) */ var VideoSource = /*@__PURE__*/(function (ImageSource) { function VideoSource(id , options , dispatcher , eventedParent ) { ImageSource.call(this, id, options, dispatcher, eventedParent); this.roundZoom = true; this.type = 'video'; this.options = options; } if ( ImageSource ) VideoSource.__proto__ = ImageSource; VideoSource.prototype = Object.create( ImageSource && ImageSource.prototype ); VideoSource.prototype.constructor = VideoSource; VideoSource.prototype.load = function load () { var this$1 = this; this._loaded = false; var options = this.options; this.urls = []; for (var i = 0, list = options.urls; i < list.length; i += 1) { var url = list[i]; this.urls.push(this.map._requestManager.transformRequest(url, symbol_layout.ResourceType.Source).url); } symbol_layout.getVideo(this.urls, function (err, video) { this$1._loaded = true; if (err) { this$1.fire(new symbol_layout.ErrorEvent(err)); } else if (video) { this$1.video = video; this$1.video.loop = true; // Start repainting when video starts playing. hasTransition() will then return // true to trigger additional frames as long as the videos continues playing. this$1.video.addEventListener('playing', function () { this$1.map.triggerRepaint(); }); if (this$1.map) { this$1.video.play(); } this$1._finishLoading(); } }); }; /** * Pauses the video. */ VideoSource.prototype.pause = function pause () { if (this.video) { this.video.pause(); } }; /** * Plays the video. */ VideoSource.prototype.play = function play () { if (this.video) { this.video.play(); } }; /** * Sets playback to a timestamp, in seconds. */ VideoSource.prototype.seek = function seek (seconds ) { if (this.video) { var seekableRange = this.video.seekable; if (seconds < seekableRange.start(0) || seconds > seekableRange.end(0)) { this.fire(new symbol_layout.ErrorEvent(new symbol_layout.ValidationError(("Playback for this video can be set only between the " + (seekableRange.start(0)) + " and " + (seekableRange.end(0)) + "-second mark.")))); } else { this.video.currentTime = seconds; } } }; /** * Returns the HTML `video` element. * * @returns {HTMLVideoElement} The HTML `video` element. */ VideoSource.prototype.getVideo = function getVideo () { return this.video; }; VideoSource.prototype.onAdd = function onAdd (map ) { if (this.map) { return; } this.map = map; this.load(); if (this.video) { this.video.play(); this.setCoordinates(this.coordinates); } }; /** * Sets the video's coordinates and re-renders the map. * * @method setCoordinates * @instance * @memberof VideoSource * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the video. * The coordinates start at the top left corner of the video and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {VideoSource} this */ // setCoordinates inherited from ImageSource VideoSource.prototype.prepare = function prepare () { if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) { return; // not enough data for current position } var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, symbol_layout.rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = symbol_layout.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new symbol_layout.Texture(context, this.video, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } else if (!this.video.paused) { this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video); } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; VideoSource.prototype.serialize = function serialize () { return { type: 'video', urls: this.urls, coordinates: this.coordinates }; }; VideoSource.prototype.hasTransition = function hasTransition () { return this.video && !this.video.paused; }; return VideoSource; }(ImageSource)); // /** * 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 (i.e. pixels do not need to be re-read on every frame), `animate` should be set to `false` to improve performance. */ /** * 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 * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove */ var CanvasSource = /*@__PURE__*/(function (ImageSource) { function CanvasSource(id , options , dispatcher , eventedParent ) { ImageSource.call(this, id, options, dispatcher, eventedParent); // We build in some validation here, since canvas sources aren't included in the style spec: if (!options.coordinates) { this.fire(new symbol_layout.ErrorEvent(new symbol_layout.ValidationError(("sources." + id), null, 'missing required property "coordinates"'))); } else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 || options.coordinates.some(function (c) { return !Array.isArray(c) || c.length !== 2 || c.some(function (l) { return typeof l !== 'number'; }); })) { this.fire(new symbol_layout.ErrorEvent(new symbol_layout.ValidationError(("sources." + id), null, '"coordinates" property must be an array of 4 longitude/latitude array pairs'))); } if (options.animate && typeof options.animate !== 'boolean') { this.fire(new symbol_layout.ErrorEvent(new symbol_layout.ValidationError(("sources." + id), null, 'optional "animate" property must be a boolean value'))); } if (!options.canvas) { this.fire(new symbol_layout.ErrorEvent(new symbol_layout.ValidationError(("sources." + id), null, 'missing required property "canvas"'))); } else if (typeof options.canvas !== 'string' && !(options.canvas instanceof symbol_layout.window.HTMLCanvasElement)) { this.fire(new symbol_layout.ErrorEvent(new symbol_layout.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'))); } this.options = options; this.animate = options.animate !== undefined ? options.animate : true; } if ( ImageSource ) CanvasSource.__proto__ = ImageSource; CanvasSource.prototype = Object.create( ImageSource && ImageSource.prototype ); CanvasSource.prototype.constructor = CanvasSource; /** * Enables animation. The image will be copied from the canvas to the map on each frame. * @method play * @instance * @memberof CanvasSource */ /** * Disables animation. The map will display a static copy of the canvas image. * @method pause * @instance * @memberof CanvasSource */ CanvasSource.prototype.load = function load () { this._loaded = true; if (!this.canvas) { this.canvas = (this.options.canvas instanceof symbol_layout.window.HTMLCanvasElement) ? this.options.canvas : symbol_layout.window.document.getElementById(this.options.canvas); } this.width = this.canvas.width; this.height = this.canvas.height; if (this._hasInvalidDimensions()) { this.fire(new symbol_layout.ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.'))); return; } this.play = function() { this._playing = true; this.map.triggerRepaint(); }; this.pause = function() { if (this._playing) { this.prepare(); this._playing = false; } }; this._finishLoading(); }; /** * Returns the HTML `canvas` element. * * @returns {HTMLCanvasElement} The HTML `canvas` element. */ CanvasSource.prototype.getCanvas = function getCanvas () { return this.canvas; }; CanvasSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); if (this.canvas) { if (this.animate) { this.play(); } } }; CanvasSource.prototype.onRemove = function onRemove () { this.pause(); }; /** * Sets the canvas's coordinates and re-renders the map. * * @method setCoordinates * @instance * @memberof CanvasSource * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the canvas. * The coordinates start at the top left corner of the canvas and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {CanvasSource} this */ // setCoordinates inherited from ImageSource CanvasSource.prototype.prepare = function prepare () { var resize = false; if (this.canvas.width !== this.width) { this.width = this.canvas.width; resize = true; } if (this.canvas.height !== this.height) { this.height = this.canvas.height; resize = true; } if (this._hasInvalidDimensions()) { return; } if (Object.keys(this.tiles).length === 0) { return; } // not enough data for current position var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, symbol_layout.rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = symbol_layout.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new symbol_layout.Texture(context, this.canvas, gl.RGBA, { premultiply: true }); } else if (resize || this._playing) { this.texture.update(this.canvas, { premultiply: true }); } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; CanvasSource.prototype.serialize = function serialize () { return { type: 'canvas', coordinates: this.coordinates }; }; CanvasSource.prototype.hasTransition = function hasTransition () { return this._playing; }; CanvasSource.prototype._hasInvalidDimensions = function _hasInvalidDimensions () { for (var i = 0, list = [this.canvas.width, this.canvas.height]; i < list.length; i += 1) { var x = list[i]; if (isNaN(x) || x <= 0) { return true; } } return false; }; return CanvasSource; }(ImageSource)); // var sourceTypes = { vector: VectorTileSource, raster: RasterTileSource, 'raster-dem': RasterDEMTileSource, geojson: GeoJSONSource, video: VideoSource, image: ImageSource, canvas: CanvasSource }; /* * 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} */ var create = function(id , specification , dispatcher , eventedParent ) { var source = new sourceTypes[specification.type](id, (specification ), dispatcher, eventedParent); if (source.id !== id) { throw new Error(("Expected Source id to be " + id + " instead of " + (source.id))); } symbol_layout.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source); return source; }; var getType = function (name ) { return sourceTypes[name]; }; var setType = function (name , type ) { sourceTypes[name] = type; }; // /* * Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates. */ function getPixelPosMatrix(transform, tileID) { var t = symbol_layout.identity([]); symbol_layout.translate(t, t, [1, 1, 0]); symbol_layout.scale(t, t, [transform.width * 0.5, transform.height * 0.5, 1]); return symbol_layout.multiply(t, t, transform.calculatePosMatrix(tileID.toUnwrapped())); } function queryIncludes3DLayer(layers , styleLayers , sourceID ) { if (layers) { for (var i = 0, list = layers; i < list.length; i += 1) { var layerID = list[i]; var layer = styleLayers[layerID]; if (layer && layer.source === sourceID && layer.type === 'fill-extrusion') { return true; } } } else { for (var key in styleLayers) { var layer$1 = styleLayers[key]; if (layer$1.source === sourceID && layer$1.type === 'fill-extrusion') { return true; } } } return false; } function queryRenderedFeatures(sourceCache , styleLayers , queryGeometry , params , transform ) { var has3DLayer = queryIncludes3DLayer(params && params.layers, styleLayers, sourceCache.id); var maxPitchScaleFactor = transform.maxPitchScaleFactor(); var tilesIn = sourceCache.tilesIn(queryGeometry, maxPitchScaleFactor, has3DLayer); tilesIn.sort(sortTilesIn); var renderedFeatureLayers = []; for (var i = 0, list = tilesIn; i < list.length; i += 1) { var tileIn = list[i]; renderedFeatureLayers.push({ wrappedTileID: tileIn.tileID.wrapped().key, queryResults: tileIn.tile.queryRenderedFeatures( styleLayers, sourceCache._state, tileIn.queryGeometry, tileIn.cameraQueryGeometry, tileIn.scale, params, transform, maxPitchScaleFactor, getPixelPosMatrix(sourceCache.transform, tileIn.tileID)) }); } var result = mergeRenderedFeatureLayers(renderedFeatureLayers); // Merge state from SourceCache into the results for (var layerID in result) { result[layerID].forEach(function (featureWrapper) { var feature = featureWrapper.feature; var 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; } function queryRenderedSymbols(styleLayers , sourceCaches , queryGeometry , params , collisionIndex , retainedQueryData ) { var result = {}; var renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry); var bucketQueryData = []; for (var i = 0, list = Object.keys(renderedSymbols).map(Number); i < list.length; i += 1) { var bucketInstanceId = list[i]; bucketQueryData.push(retainedQueryData[bucketInstanceId]); } bucketQueryData.sort(sortTilesIn); var loop = function () { var queryData = list$2[i$2]; var bucketSymbols = queryData.featureIndex.lookupSymbolFeatures( renderedSymbols[queryData.bucketInstanceId], queryData.bucketIndex, queryData.sourceLayerIndex, params.filter, params.layers, styleLayers); for (var layerID in bucketSymbols) { var resultFeatures = result[layerID] = result[layerID] || []; var layerSymbols = bucketSymbols[layerID]; layerSymbols.sort(function (a, b) { // Match topDownFeatureComparator from FeatureIndex, but using // most recent sorting of features from bucket.sortFeatures var 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. var sortedA = featureSortOrder.indexOf(a.featureIndex); var sortedB = featureSortOrder.indexOf(b.featureIndex); symbol_layout.assert(sortedA >= 0); symbol_layout.assert(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 (var i$1 = 0, list$1 = layerSymbols; i$1 < list$1.length; i$1 += 1) { var symbolFeature = list$1[i$1]; resultFeatures.push(symbolFeature); } } }; for (var i$2 = 0, list$2 = bucketQueryData; i$2 < list$2.length; i$2 += 1) loop(); // Merge state from SourceCache into the results var loop$1 = function ( layerName ) { result[layerName].forEach(function (featureWrapper) { var feature = featureWrapper.feature; var layer = styleLayers[layerName]; var sourceCache = sourceCaches[layer.source]; var 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; }); }; for (var layerName in result) loop$1( layerName ); return result; } function querySourceFeatures(sourceCache , params ) { var tiles = sourceCache.getRenderableIds().map(function (id) { return sourceCache.getTileByID(id); }); var result = []; var dataTiles = {}; for (var i = 0; i < tiles.length; i++) { var tile = tiles[i]; var dataID = tile.tileID.canonical.key; if (!dataTiles[dataID]) { dataTiles[dataID] = true; tile.querySourceFeatures(result, params); } } return result; } function sortTilesIn(a, b) { var idA = a.tileID; var idB = b.tileID; return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x); } function mergeRenderedFeatureLayers(tiles) { // Merge results from all tiles, but if two tiles share the same // wrapped ID, don't duplicate features between the two tiles var result = {}; var wrappedIDLayerMap = {}; for (var i$1 = 0, list$1 = tiles; i$1 < list$1.length; i$1 += 1) { var tile = list$1[i$1]; var queryResults = tile.queryResults; var wrappedID = tile.wrappedTileID; var wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {}; for (var layerID in queryResults) { var tileFeatures = queryResults[layerID]; var wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {}; var resultFeatures = result[layerID] = result[layerID] || []; for (var i = 0, list = tileFeatures; i < list.length; i += 1) { var tileFeature = list[i]; if (!wrappedIDFeatures[tileFeature.featureIndex]) { wrappedIDFeatures[tileFeature.featureIndex] = true; resultFeatures.push(tileFeature); } } } } return result; } // /** * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms) * with hash lookup made possible by keeping a list of keys in parallel to * an array of dictionary of values * * @private */ var TileCache = function TileCache(max , onRemove ) { this.max = max; this.onRemove = onRemove; this.reset(); }; /** * Clear the cache * * @returns {TileCache} this cache * @private */ TileCache.prototype.reset = function reset () { for (var key in this.data) { for (var i = 0, list = this.data[key]; i < list.length; i += 1) { var removedData = list[i]; if (removedData.timeout) { clearTimeout(removedData.timeout); } this.onRemove(removedData.value); } } 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} this cache * @private */ TileCache.prototype.add = function add (tileID , data , expiryTimeout ) { var this$1 = this; var key = tileID.wrapped().key; if (this.data[key] === undefined) { this.data[key] = []; } var dataWrapper = { value: data, timeout: undefined }; if (expiryTimeout !== undefined) { dataWrapper.timeout = setTimeout(function () { this$1.remove(tileID, dataWrapper); }, expiryTimeout); } this.data[key].push(dataWrapper); this.order.push(key); if (this.order.length > this.max) { var removedData = this._getAndRemoveByKey(this.order[0]); if (removedData) { this.onRemove(removedData); } } 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 */ TileCache.prototype.has = function 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 */ TileCache.prototype.getAndRemove = function getAndRemove (tileID ) { if (!this.has(tileID)) { return null; } return this._getAndRemoveByKey(tileID.wrapped().key); }; /* * Get and remove the value with the specified key. */ TileCache.prototype._getAndRemoveByKey = function _getAndRemoveByKey (key ) { var 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); return data.value; }; /** * 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 */ TileCache.prototype.get = function get (tileID ) { if (!this.has(tileID)) { return null; } var data = this.data[tileID.wrapped().key][0]; return data.value; }; /** * 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 */ TileCache.prototype.remove = function remove (tileID , value ) { if (!this.has(tileID)) { return this; } var key = tileID.wrapped().key; var dataIndex = value === undefined ? 0 : this.data[key].indexOf(value); var 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; }; /** * Change the max size of the cache. * * @param {number} max the max size of the cache * @returns {TileCache} this cache * @private */ TileCache.prototype.setMaxSize = function setMaxSize (max ) { this.max = max; while (this.order.length > this.max) { var removedData = this._getAndRemoveByKey(this.order[0]); if (removedData) { this.onRemove(removedData); } } return this; }; // var IndexBuffer = function IndexBuffer(context , array , dynamicDraw ) { this.context = context; var 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) { delete array.arrayBuffer; } }; IndexBuffer.prototype.bind = function bind () { this.context.bindElementBuffer.set(this.buffer); }; IndexBuffer.prototype.updateData = function updateData (array ) { var gl = this.context.gl; symbol_layout.assert(this.dynamicDraw); // The right VAO will get this buffer re-bound later in VertexArrayObject#bind // See https://github.com/mapbox/mapbox-gl-js/issues/5620 this.context.unbindVAO(); this.bind(); gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer); }; IndexBuffer.prototype.destroy = function destroy () { var gl = this.context.gl; if (this.buffer) { gl.deleteBuffer(this.buffer); delete this.buffer; } }; // /** * @enum {string} AttributeType * @private * @readonly */ var AttributeType = { Int8: 'BYTE', Uint8: 'UNSIGNED_BYTE', Int16: 'SHORT', Uint16: 'UNSIGNED_SHORT', Int32: 'INT', Uint32: 'UNSIGNED_INT', Float32: 'FLOAT' }; /** * The `VertexBuffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's * Struct type is converted to a WebGL atribute. * @private */ var VertexBuffer = function VertexBuffer(context , array , attributes , dynamicDraw ) { this.length = array.length; this.attributes = attributes; this.itemSize = array.bytesPerElement; this.dynamicDraw = dynamicDraw; this.context = context; var gl = context.gl; this.buffer = gl.createBuffer(); context.bindVertexBuffer.set(this.buffer); gl.bufferData(gl.ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); if (!this.dynamicDraw) { delete array.arrayBuffer; } }; VertexBuffer.prototype.bind = function bind () { this.context.bindVertexBuffer.set(this.buffer); }; VertexBuffer.prototype.updateData = function updateData (array ) { symbol_layout.assert(array.length === this.length); var gl = this.context.gl; this.bind(); gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer); }; VertexBuffer.prototype.enableAttributes = function enableAttributes (gl , program ) { for (var j = 0; j < this.attributes.length; j++) { var member = this.attributes[j]; var attribIndex = program.attributes[member.name]; if (attribIndex !== undefined) { gl.enableVertexAttribArray(attribIndex); } } }; /** * Set the attribute pointers in a WebGL context * @param gl The WebGL context * @param program The active WebGL program * @param vertexOffset Index of the starting vertex of the segment */ VertexBuffer.prototype.setVertexAttribPointers = function setVertexAttribPointers (gl , program , vertexOffset ) { for (var j = 0; j < this.attributes.length; j++) { var member = this.attributes[j]; var 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)) ); } } }; /** * Destroy the GL buffer bound to the given WebGL context */ VertexBuffer.prototype.destroy = function destroy () { var gl = this.context.gl; if (this.buffer) { gl.deleteBuffer(this.buffer); delete this.buffer; } }; // var BaseValue = function BaseValue(context ) { this.gl = context.gl; this.default = this.getDefault(); this.current = this.default; this.dirty = false; }; BaseValue.prototype.get = function get (){ return this.current; }; BaseValue.prototype.set = function set (value ) { // eslint-disable-line // overridden in child classes; }; BaseValue.prototype.getDefault = function getDefault (){ return this.default; // overriden in child classes }; BaseValue.prototype.setDefault = function setDefault () { this.set(this.default); }; var ClearColor = /*@__PURE__*/(function (BaseValue) { function ClearColor () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearColor.__proto__ = BaseValue; ClearColor.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearColor.prototype.constructor = ClearColor; ClearColor.prototype.getDefault = function getDefault () { return symbol_layout.Color.transparent; }; ClearColor.prototype.set = function set (v ) { var c = this.current; if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) { return; } this.gl.clearColor(v.r, v.g, v.b, v.a); this.current = v; this.dirty = false; }; return ClearColor; }(BaseValue)); var ClearDepth = /*@__PURE__*/(function (BaseValue) { function ClearDepth () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearDepth.__proto__ = BaseValue; ClearDepth.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearDepth.prototype.constructor = ClearDepth; ClearDepth.prototype.getDefault = function getDefault () { return 1; }; ClearDepth.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.clearDepth(v); this.current = v; this.dirty = false; }; return ClearDepth; }(BaseValue)); var ClearStencil = /*@__PURE__*/(function (BaseValue) { function ClearStencil () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearStencil.__proto__ = BaseValue; ClearStencil.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearStencil.prototype.constructor = ClearStencil; ClearStencil.prototype.getDefault = function getDefault () { return 0; }; ClearStencil.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.clearStencil(v); this.current = v; this.dirty = false; }; return ClearStencil; }(BaseValue)); var ColorMask = /*@__PURE__*/(function (BaseValue) { function ColorMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) ColorMask.__proto__ = BaseValue; ColorMask.prototype = Object.create( BaseValue && BaseValue.prototype ); ColorMask.prototype.constructor = ColorMask; ColorMask.prototype.getDefault = function getDefault () { return [true, true, true, true]; }; ColorMask.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) { return; } this.gl.colorMask(v[0], v[1], v[2], v[3]); this.current = v; this.dirty = false; }; return ColorMask; }(BaseValue)); var DepthMask = /*@__PURE__*/(function (BaseValue) { function DepthMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthMask.__proto__ = BaseValue; DepthMask.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthMask.prototype.constructor = DepthMask; DepthMask.prototype.getDefault = function getDefault () { return true; }; DepthMask.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.depthMask(v); this.current = v; this.dirty = false; }; return DepthMask; }(BaseValue)); var StencilMask = /*@__PURE__*/(function (BaseValue) { function StencilMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilMask.__proto__ = BaseValue; StencilMask.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilMask.prototype.constructor = StencilMask; StencilMask.prototype.getDefault = function getDefault () { return 0xFF; }; StencilMask.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.stencilMask(v); this.current = v; this.dirty = false; }; return StencilMask; }(BaseValue)); var StencilFunc = /*@__PURE__*/(function (BaseValue) { function StencilFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilFunc.__proto__ = BaseValue; StencilFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilFunc.prototype.constructor = StencilFunc; StencilFunc.prototype.getDefault = function getDefault () { return { func: this.gl.ALWAYS, ref: 0, mask: 0xFF }; }; StencilFunc.prototype.set = function set (v ) { var c = this.current; if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty) { return; } this.gl.stencilFunc(v.func, v.ref, v.mask); this.current = v; this.dirty = false; }; return StencilFunc; }(BaseValue)); var StencilOp = /*@__PURE__*/(function (BaseValue) { function StencilOp () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilOp.__proto__ = BaseValue; StencilOp.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilOp.prototype.constructor = StencilOp; StencilOp.prototype.getDefault = function getDefault () { var gl = this.gl; return [gl.KEEP, gl.KEEP, gl.KEEP]; }; StencilOp.prototype.set = function set (v ) { var 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; }; return StencilOp; }(BaseValue)); var StencilTest = /*@__PURE__*/(function (BaseValue) { function StencilTest () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilTest.__proto__ = BaseValue; StencilTest.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilTest.prototype.constructor = StencilTest; StencilTest.prototype.getDefault = function getDefault () { return false; }; StencilTest.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.STENCIL_TEST); } else { gl.disable(gl.STENCIL_TEST); } this.current = v; this.dirty = false; }; return StencilTest; }(BaseValue)); var DepthRange = /*@__PURE__*/(function (BaseValue) { function DepthRange () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthRange.__proto__ = BaseValue; DepthRange.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthRange.prototype.constructor = DepthRange; DepthRange.prototype.getDefault = function getDefault () { return [0, 1]; }; DepthRange.prototype.set = function set (v ) { var 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; }; return DepthRange; }(BaseValue)); var DepthTest = /*@__PURE__*/(function (BaseValue) { function DepthTest () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthTest.__proto__ = BaseValue; DepthTest.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthTest.prototype.constructor = DepthTest; DepthTest.prototype.getDefault = function getDefault () { return false; }; DepthTest.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.DEPTH_TEST); } else { gl.disable(gl.DEPTH_TEST); } this.current = v; this.dirty = false; }; return DepthTest; }(BaseValue)); var DepthFunc = /*@__PURE__*/(function (BaseValue) { function DepthFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthFunc.__proto__ = BaseValue; DepthFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthFunc.prototype.constructor = DepthFunc; DepthFunc.prototype.getDefault = function getDefault () { return this.gl.LESS; }; DepthFunc.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.depthFunc(v); this.current = v; this.dirty = false; }; return DepthFunc; }(BaseValue)); var Blend = /*@__PURE__*/(function (BaseValue) { function Blend () { BaseValue.apply(this, arguments); } if ( BaseValue ) Blend.__proto__ = BaseValue; Blend.prototype = Object.create( BaseValue && BaseValue.prototype ); Blend.prototype.constructor = Blend; Blend.prototype.getDefault = function getDefault () { return false; }; Blend.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.BLEND); } else { gl.disable(gl.BLEND); } this.current = v; this.dirty = false; }; return Blend; }(BaseValue)); var BlendFunc = /*@__PURE__*/(function (BaseValue) { function BlendFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendFunc.__proto__ = BaseValue; BlendFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendFunc.prototype.constructor = BlendFunc; BlendFunc.prototype.getDefault = function getDefault () { var gl = this.gl; return [gl.ONE, gl.ZERO]; }; BlendFunc.prototype.set = function set (v ) { var 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; }; return BlendFunc; }(BaseValue)); var BlendColor = /*@__PURE__*/(function (BaseValue) { function BlendColor () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendColor.__proto__ = BaseValue; BlendColor.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendColor.prototype.constructor = BlendColor; BlendColor.prototype.getDefault = function getDefault () { return symbol_layout.Color.transparent; }; BlendColor.prototype.set = function set (v ) { var c = this.current; if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) { return; } this.gl.blendColor(v.r, v.g, v.b, v.a); this.current = v; this.dirty = false; }; return BlendColor; }(BaseValue)); var BlendEquation = /*@__PURE__*/(function (BaseValue) { function BlendEquation () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendEquation.__proto__ = BaseValue; BlendEquation.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendEquation.prototype.constructor = BlendEquation; BlendEquation.prototype.getDefault = function getDefault () { return this.gl.FUNC_ADD; }; BlendEquation.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.blendEquation(v); this.current = v; this.dirty = false; }; return BlendEquation; }(BaseValue)); var CullFace = /*@__PURE__*/(function (BaseValue) { function CullFace () { BaseValue.apply(this, arguments); } if ( BaseValue ) CullFace.__proto__ = BaseValue; CullFace.prototype = Object.create( BaseValue && BaseValue.prototype ); CullFace.prototype.constructor = CullFace; CullFace.prototype.getDefault = function getDefault () { return false; }; CullFace.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.CULL_FACE); } else { gl.disable(gl.CULL_FACE); } this.current = v; this.dirty = false; }; return CullFace; }(BaseValue)); var CullFaceSide = /*@__PURE__*/(function (BaseValue) { function CullFaceSide () { BaseValue.apply(this, arguments); } if ( BaseValue ) CullFaceSide.__proto__ = BaseValue; CullFaceSide.prototype = Object.create( BaseValue && BaseValue.prototype ); CullFaceSide.prototype.constructor = CullFaceSide; CullFaceSide.prototype.getDefault = function getDefault () { return this.gl.BACK; }; CullFaceSide.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.cullFace(v); this.current = v; this.dirty = false; }; return CullFaceSide; }(BaseValue)); var FrontFace = /*@__PURE__*/(function (BaseValue) { function FrontFace () { BaseValue.apply(this, arguments); } if ( BaseValue ) FrontFace.__proto__ = BaseValue; FrontFace.prototype = Object.create( BaseValue && BaseValue.prototype ); FrontFace.prototype.constructor = FrontFace; FrontFace.prototype.getDefault = function getDefault () { return this.gl.CCW; }; FrontFace.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.frontFace(v); this.current = v; this.dirty = false; }; return FrontFace; }(BaseValue)); var Program = /*@__PURE__*/(function (BaseValue) { function Program () { BaseValue.apply(this, arguments); } if ( BaseValue ) Program.__proto__ = BaseValue; Program.prototype = Object.create( BaseValue && BaseValue.prototype ); Program.prototype.constructor = Program; Program.prototype.getDefault = function getDefault () { return null; }; Program.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.useProgram(v); this.current = v; this.dirty = false; }; return Program; }(BaseValue)); var ActiveTextureUnit = /*@__PURE__*/(function (BaseValue) { function ActiveTextureUnit () { BaseValue.apply(this, arguments); } if ( BaseValue ) ActiveTextureUnit.__proto__ = BaseValue; ActiveTextureUnit.prototype = Object.create( BaseValue && BaseValue.prototype ); ActiveTextureUnit.prototype.constructor = ActiveTextureUnit; ActiveTextureUnit.prototype.getDefault = function getDefault () { return this.gl.TEXTURE0; }; ActiveTextureUnit.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.activeTexture(v); this.current = v; this.dirty = false; }; return ActiveTextureUnit; }(BaseValue)); var Viewport = /*@__PURE__*/(function (BaseValue) { function Viewport () { BaseValue.apply(this, arguments); } if ( BaseValue ) Viewport.__proto__ = BaseValue; Viewport.prototype = Object.create( BaseValue && BaseValue.prototype ); Viewport.prototype.constructor = Viewport; Viewport.prototype.getDefault = function getDefault () { var gl = this.gl; return [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight]; }; Viewport.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) { return; } this.gl.viewport(v[0], v[1], v[2], v[3]); this.current = v; this.dirty = false; }; return Viewport; }(BaseValue)); var BindFramebuffer = /*@__PURE__*/(function (BaseValue) { function BindFramebuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindFramebuffer.__proto__ = BaseValue; BindFramebuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindFramebuffer.prototype.constructor = BindFramebuffer; BindFramebuffer.prototype.getDefault = function getDefault () { return null; }; BindFramebuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindFramebuffer(gl.FRAMEBUFFER, v); this.current = v; this.dirty = false; }; return BindFramebuffer; }(BaseValue)); var BindRenderbuffer = /*@__PURE__*/(function (BaseValue) { function BindRenderbuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindRenderbuffer.__proto__ = BaseValue; BindRenderbuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindRenderbuffer.prototype.constructor = BindRenderbuffer; BindRenderbuffer.prototype.getDefault = function getDefault () { return null; }; BindRenderbuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindRenderbuffer(gl.RENDERBUFFER, v); this.current = v; this.dirty = false; }; return BindRenderbuffer; }(BaseValue)); var BindTexture = /*@__PURE__*/(function (BaseValue) { function BindTexture () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindTexture.__proto__ = BaseValue; BindTexture.prototype = Object.create( BaseValue && BaseValue.prototype ); BindTexture.prototype.constructor = BindTexture; BindTexture.prototype.getDefault = function getDefault () { return null; }; BindTexture.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindTexture(gl.TEXTURE_2D, v); this.current = v; this.dirty = false; }; return BindTexture; }(BaseValue)); var BindVertexBuffer = /*@__PURE__*/(function (BaseValue) { function BindVertexBuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindVertexBuffer.__proto__ = BaseValue; BindVertexBuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindVertexBuffer.prototype.constructor = BindVertexBuffer; BindVertexBuffer.prototype.getDefault = function getDefault () { return null; }; BindVertexBuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindBuffer(gl.ARRAY_BUFFER, v); this.current = v; this.dirty = false; }; return BindVertexBuffer; }(BaseValue)); var BindElementBuffer = /*@__PURE__*/(function (BaseValue) { function BindElementBuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindElementBuffer.__proto__ = BaseValue; BindElementBuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindElementBuffer.prototype.constructor = BindElementBuffer; BindElementBuffer.prototype.getDefault = function getDefault () { return null; }; BindElementBuffer.prototype.set = function set (v ) { // Always rebind var gl = this.gl; gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v); this.current = v; this.dirty = false; }; return BindElementBuffer; }(BaseValue)); var BindVertexArrayOES = /*@__PURE__*/(function (BaseValue) { function BindVertexArrayOES(context ) { BaseValue.call(this, context); this.vao = context.extVertexArrayObject; } if ( BaseValue ) BindVertexArrayOES.__proto__ = BaseValue; BindVertexArrayOES.prototype = Object.create( BaseValue && BaseValue.prototype ); BindVertexArrayOES.prototype.constructor = BindVertexArrayOES; BindVertexArrayOES.prototype.getDefault = function getDefault () { return null; }; BindVertexArrayOES.prototype.set = function set (v ) { if (!this.vao || v === this.current && !this.dirty) { return; } this.vao.bindVertexArrayOES(v); this.current = v; this.dirty = false; }; return BindVertexArrayOES; }(BaseValue)); var PixelStoreUnpack = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpack () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpack.__proto__ = BaseValue; PixelStoreUnpack.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpack.prototype.constructor = PixelStoreUnpack; PixelStoreUnpack.prototype.getDefault = function getDefault () { return 4; }; PixelStoreUnpack.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_ALIGNMENT, v); this.current = v; this.dirty = false; }; return PixelStoreUnpack; }(BaseValue)); var PixelStoreUnpackPremultiplyAlpha = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpackPremultiplyAlpha () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpackPremultiplyAlpha.__proto__ = BaseValue; PixelStoreUnpackPremultiplyAlpha.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpackPremultiplyAlpha.prototype.constructor = PixelStoreUnpackPremultiplyAlpha; PixelStoreUnpackPremultiplyAlpha.prototype.getDefault = function getDefault () { return false; }; PixelStoreUnpackPremultiplyAlpha.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, (v )); this.current = v; this.dirty = false; }; return PixelStoreUnpackPremultiplyAlpha; }(BaseValue)); var PixelStoreUnpackFlipY = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpackFlipY () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpackFlipY.__proto__ = BaseValue; PixelStoreUnpackFlipY.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpackFlipY.prototype.constructor = PixelStoreUnpackFlipY; PixelStoreUnpackFlipY.prototype.getDefault = function getDefault () { return false; }; PixelStoreUnpackFlipY.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, (v )); this.current = v; this.dirty = false; }; return PixelStoreUnpackFlipY; }(BaseValue)); var FramebufferAttachment = /*@__PURE__*/(function (BaseValue) { function FramebufferAttachment(context , parent ) { BaseValue.call(this, context); this.context = context; this.parent = parent; } if ( BaseValue ) FramebufferAttachment.__proto__ = BaseValue; FramebufferAttachment.prototype = Object.create( BaseValue && BaseValue.prototype ); FramebufferAttachment.prototype.constructor = FramebufferAttachment; FramebufferAttachment.prototype.getDefault = function getDefault () { return null; }; return FramebufferAttachment; }(BaseValue)); var ColorAttachment = /*@__PURE__*/(function (FramebufferAttachment) { function ColorAttachment () { FramebufferAttachment.apply(this, arguments); } if ( FramebufferAttachment ) ColorAttachment.__proto__ = FramebufferAttachment; ColorAttachment.prototype = Object.create( FramebufferAttachment && FramebufferAttachment.prototype ); ColorAttachment.prototype.constructor = ColorAttachment; ColorAttachment.prototype.setDirty = function setDirty () { this.dirty = true; }; ColorAttachment.prototype.set = function 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 var gl = this.gl; gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0); this.current = v; this.dirty = false; }; return ColorAttachment; }(FramebufferAttachment)); var DepthAttachment = /*@__PURE__*/(function (FramebufferAttachment) { function DepthAttachment () { FramebufferAttachment.apply(this, arguments); } if ( FramebufferAttachment ) DepthAttachment.__proto__ = FramebufferAttachment; DepthAttachment.prototype = Object.create( FramebufferAttachment && FramebufferAttachment.prototype ); DepthAttachment.prototype.constructor = DepthAttachment; DepthAttachment.prototype.set = function 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 var gl = this.gl; gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, v); this.current = v; this.dirty = false; }; return DepthAttachment; }(FramebufferAttachment)); // var Framebuffer = function Framebuffer(context , width , height ) { this.context = context; this.width = width; this.height = height; var gl = context.gl; var fbo = this.framebuffer = gl.createFramebuffer(); this.colorAttachment = new ColorAttachment(context, fbo); this.depthAttachment = new DepthAttachment(context, fbo); }; Framebuffer.prototype.destroy = function destroy () { var gl = this.context.gl; var texture = this.colorAttachment.get(); if (texture) { gl.deleteTexture(texture); } var renderbuffer = this.depthAttachment.get(); if (renderbuffer) { gl.deleteRenderbuffer(renderbuffer); } gl.deleteFramebuffer(this.framebuffer); }; // var ALWAYS = 0x0207; var DepthMode = function DepthMode(depthFunc , depthMask , depthRange ) { this.func = depthFunc; this.mask = depthMask; this.range = depthRange; }; DepthMode.ReadOnly = false; DepthMode.ReadWrite = true; DepthMode.disabled = new DepthMode(ALWAYS, DepthMode.ReadOnly, [0, 1]); // var ALWAYS$1 = 0x0207; var KEEP = 0x1E00; var StencilMode = function StencilMode(test , ref , mask , fail , depthFail , pass ) { this.test = test; this.ref = ref; this.mask = mask; this.fail = fail; this.depthFail = depthFail; this.pass = pass; }; StencilMode.disabled = new StencilMode({ func: ALWAYS$1, mask: 0 }, 0, 0, KEEP, KEEP, KEEP); // var ZERO = 0x0000; var ONE = 0x0001; var ONE_MINUS_SRC_ALPHA = 0x0303; var ColorMode = function ColorMode(blendFunction , blendColor , mask ) { this.blendFunction = blendFunction; this.blendColor = blendColor; this.mask = mask; }; ColorMode.Replace = [ONE, ZERO]; ColorMode.disabled = new ColorMode(ColorMode.Replace, symbol_layout.Color.transparent, [false, false, false, false]); ColorMode.unblended = new ColorMode(ColorMode.Replace, symbol_layout.Color.transparent, [true, true, true, true]); ColorMode.alphaBlended = new ColorMode([ONE, ONE_MINUS_SRC_ALPHA], symbol_layout.Color.transparent, [true, true, true, true]); // var BACK = 0x0405; var CCW = 0x0901; var CullFaceMode = function CullFaceMode(enable , mode , frontFace ) { this.enable = enable; this.mode = mode; this.frontFace = frontFace; }; CullFaceMode.disabled = new CullFaceMode(false, BACK, CCW); CullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW); // var Context = function Context(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.extTextureHalfFloat = gl.getExtension('OES_texture_half_float'); if (this.extTextureHalfFloat) { gl.getExtension('OES_texture_half_float_linear'); } }; Context.prototype.setDefault = function setDefault () { this.unbindVAO(); 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(); }; Context.prototype.setDirty = function 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; }; Context.prototype.createIndexBuffer = function createIndexBuffer (array , dynamicDraw ) { return new IndexBuffer(this, array, dynamicDraw); }; Context.prototype.createVertexBuffer = function createVertexBuffer (array , attributes , dynamicDraw ) { return new VertexBuffer(this, array, attributes, dynamicDraw); }; Context.prototype.createRenderbuffer = function createRenderbuffer (storageFormat , width , height ) { var gl = this.gl; var rbo = gl.createRenderbuffer(); this.bindRenderbuffer.set(rbo); gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height); this.bindRenderbuffer.set(null); return rbo; }; Context.prototype.createFramebuffer = function createFramebuffer (width , height ) { return new Framebuffer(this, width, height); }; Context.prototype.clear = function clear (ref ) { var color = ref.color; var depth = ref.depth; var gl = this.gl; var mask = 0; if (color) { mask |= gl.COLOR_BUFFER_BIT; this.clearColor.set(color); this.colorMask.set([true, true, true, true]); } if (typeof depth !== 'undefined') { mask |= gl.DEPTH_BUFFER_BIT; // 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); } // See note in Painter#clearStencil: implement this the easy way once GPU bug/workaround is fixed upstream // if (typeof stencil !== 'undefined') { // mask |= gl.STENCIL_BUFFER_BIT; // this.clearStencil.set(stencil); // this.stencilMask.set(0xFF); // } gl.clear(mask); }; Context.prototype.setCullFace = function 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); } }; Context.prototype.setDepthMode = function setDepthMode (depthMode ) { if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) { this.depthTest.set(false); } else { this.depthTest.set(true); this.depthFunc.set(depthMode.func); this.depthMask.set(depthMode.mask); this.depthRange.set(depthMode.range); } }; Context.prototype.setStencilMode = function setStencilMode (stencilMode ) { if (stencilMode.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 }); } }; Context.prototype.setColorMode = function setColorMode (colorMode ) { if (symbol_layout.deepEqual(colorMode.blendFunction, ColorMode.Replace)) { this.blend.set(false); } else { this.blend.set(true); this.blendFunc.set(colorMode.blendFunction); this.blendColor.set(colorMode.blendColor); } this.colorMask.set(colorMode.mask); }; Context.prototype.unbindVAO = function 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); } }; // /** * `SourceCache` is responsible for * * - creating an instance of `Source` * - forwarding events from `Source` * - caching tiles loaded from an instance of `Source` * - loading the tiles needed to render a given viewport * - unloading the cached tiles not needed to render a given viewport * * @private */ var SourceCache = /*@__PURE__*/(function (Evented) { function SourceCache(id , options , dispatcher ) { var this$1 = this; Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.on('data', function (e) { // this._sourceLoaded signifies that the TileJSON is loaded if applicable. // if the source type does not come with a TileJSON, the flag signifies the // source data has loaded (i.e geojson has been tiled on the worker and is ready) if (e.dataType === 'source' && e.sourceDataType === 'metadata') { this$1._sourceLoaded = true; } // for sources with mutable data, this event fires when the underlying data // to a source is changed. (i.e. GeoJSONSource#setData and ImageSource#serCoordinates) if (this$1._sourceLoaded && !this$1._paused && e.dataType === "source" && e.sourceDataType === 'content') { this$1.reload(); if (this$1.transform) { this$1.update(this$1.transform); } } }); this.on('error', function () { this$1._sourceErrored = true; }); this._source = create(id, options, dispatcher, this); this._tiles = {}; this._cache = new TileCache(0, this._unloadTile.bind(this)); this._timers = {}; this._cacheTimers = {}; this._maxTileCacheSize = null; this._coveredTiles = {}; this._state = new symbol_layout.SourceFeatureState(); } if ( Evented ) SourceCache.__proto__ = Evented; SourceCache.prototype = Object.create( Evented && Evented.prototype ); SourceCache.prototype.constructor = SourceCache; SourceCache.prototype.onAdd = function onAdd (map ) { this.map = map; this._maxTileCacheSize = map ? map._maxTileCacheSize : null; if (this._source && this._source.onAdd) { this._source.onAdd(map); } }; SourceCache.prototype.onRemove = function onRemove (map ) { if (this._source && this._source.onRemove) { this._source.onRemove(map); } }; /** * Return true if no tile data is pending, tiles will not change unless * an additional API call is received. */ SourceCache.prototype.loaded = function loaded () { if (this._sourceErrored) { return true; } if (!this._sourceLoaded) { return false; } if (!this._source.loaded()) { return false; } for (var t in this._tiles) { var tile = this._tiles[t]; if (tile.state !== 'loaded' && tile.state !== 'errored') { return false; } } return true; }; SourceCache.prototype.getSource = function getSource () { return this._source; }; SourceCache.prototype.pause = function pause () { this._paused = true; }; SourceCache.prototype.resume = function resume () { if (!this._paused) { return; } var shouldReload = this._shouldReloadOnResume; this._paused = false; this._shouldReloadOnResume = false; if (shouldReload) { this.reload(); } if (this.transform) { this.update(this.transform); } }; SourceCache.prototype._loadTile = function _loadTile (tile , callback ) { return this._source.loadTile(tile, callback); }; SourceCache.prototype._unloadTile = function _unloadTile (tile ) { if (this._source.unloadTile) { return this._source.unloadTile(tile, function () {}); } }; SourceCache.prototype._abortTile = function _abortTile (tile ) { if (this._source.abortTile) { return this._source.abortTile(tile, function () {}); } }; SourceCache.prototype.serialize = function serialize () { return this._source.serialize(); }; SourceCache.prototype.prepare = function prepare (context ) { if (this._source.prepare) { this._source.prepare(); } this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null); for (var i in this._tiles) { var tile = this._tiles[i]; tile.upload(context); tile.prepare(this.map.style.imageManager); } }; /** * Return all tile ids ordered with z-order, and cast to numbers */ SourceCache.prototype.getIds = function getIds () { return Object.keys(this._tiles).map(Number).sort(compareKeyZoom); }; SourceCache.prototype.getRenderableIds = function getRenderableIds (symbolLayer ) { var this$1 = this; var ids = []; for (var id in this._tiles) { if (this._isIdRenderable(+id, symbolLayer)) { ids.push(+id); } } if (symbolLayer) { return ids.sort(function (a_, b_) { var a = this$1._tiles[a_].tileID; var b = this$1._tiles[b_].tileID; var rotatedA = (new symbol_layout.Point(a.canonical.x, a.canonical.y))._rotate(this$1.transform.angle); var rotatedB = (new symbol_layout.Point(b.canonical.x, b.canonical.y))._rotate(this$1.transform.angle); return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x; }); } return ids.sort(compareKeyZoom); }; SourceCache.prototype.hasRenderableParent = function hasRenderableParent (tileID ) { var parentTile = this.findLoadedParent(tileID, 0); if (parentTile) { return this._isIdRenderable(parentTile.tileID.key); } return false; }; SourceCache.prototype._isIdRenderable = function _isIdRenderable (id , symbolLayer ) { return this._tiles[id] && this._tiles[id].hasData() && !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade()); }; SourceCache.prototype.reload = function reload () { if (this._paused) { this._shouldReloadOnResume = true; return; } this._cache.reset(); for (var i in this._tiles) { if (this._tiles[i].state !== "errored") { this._reloadTile(i, 'reloading'); } } }; SourceCache.prototype._reloadTile = function _reloadTile (id , state ) { var tile = this._tiles[id]; // this potentially does not address all underlying // issues https://github.com/mapbox/mapbox-gl-js/issues/4252 // - hard to tell without repro steps if (!tile) { return; } // The difference between "loading" tiles and "reloading" or "expired" // tiles is that "reloading"/"expired" tiles are "renderable". // Therefore, a "loading" tile cannot become a "reloading" tile without // first becoming a "loaded" tile. if (tile.state !== 'loading') { tile.state = state; } this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state)); }; SourceCache.prototype._tileLoaded = function _tileLoaded (tile , id , previousState , err ) { if (err) { tile.state = 'errored'; if ((err ).status !== 404) { this._source.fire(new symbol_layout.ErrorEvent(err, {tile: tile})); } // continue to try loading parent/children tiles if a tile doesn't exist (404) else { this.update(this.transform); } return; } tile.timeAdded = symbol_layout.browser.now(); if (previousState === 'expired') { tile.refreshedUponExpiration = true; } this._setTileReloadTimer(id, tile); if (this.getSource().type === 'raster-dem' && tile.dem) { this._backfillDEM(tile); } this._state.initializeTileState(tile, this.map ? this.map.painter : null); this._source.fire(new symbol_layout.Event('data', {dataType: 'source', tile: tile, coord: tile.tileID})); }; /** * For raster terrain source, backfill DEM to eliminate visible tile boundaries * @private */ SourceCache.prototype._backfillDEM = function _backfillDEM (tile ) { var renderables = this.getRenderableIds(); for (var i = 0; i < renderables.length; i++) { var borderId = renderables[i]; if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { var borderTile = this.getTileByID(borderId); fillBorder(tile, borderTile); fillBorder(borderTile, tile); } } function fillBorder(tile, borderTile) { tile.needsHillshadePrepare = true; var dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x; var dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y; var dim = Math.pow(2, tile.tileID.canonical.z); var borderId = borderTile.tileID.key; if (dx === 0 && dy === 0) { return; } if (Math.abs(dy) > 1) { return; } if (Math.abs(dx) > 1) { // Adjust the delta coordinate for world wraparound. if (Math.abs(dx + dim) === 1) { dx += dim; } else if (Math.abs(dx - dim) === 1) { dx -= dim; } } if (!borderTile.dem || !tile.dem) { return; } tile.dem.backfillBorder(borderTile.dem, dx, dy); if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { tile.neighboringTiles[borderId].backfilled = true; } } }; /** * Get a specific tile by TileID */ SourceCache.prototype.getTile = function getTile (tileID ) { return this.getTileByID(tileID.key); }; /** * Get a specific tile by id */ SourceCache.prototype.getTileByID = function getTileByID (id ) { return this._tiles[id]; }; /** * get the zoom level adjusted for the difference in map and source tilesizes */ SourceCache.prototype.getZoom = function getZoom (transform ) { return transform.zoom + transform.scaleZoom(transform.tileSize / this._source.tileSize); }; /** * For a given set of tiles, retain children that are loaded and have a zoom * between `zoom` (exclusive) and `maxCoveringZoom` (inclusive) */ SourceCache.prototype._retainLoadedChildren = function _retainLoadedChildren ( idealTiles , zoom , maxCoveringZoom , retain ) { for (var id in this._tiles) { var 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 var topmostLoadedID = tile.tileID; while (tile && tile.tileID.overscaledZ > zoom + 1) { var parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1); tile = this._tiles[parentID.key]; if (tile && tile.hasData()) { topmostLoadedID = parentID; } } // loop through ancestors of the topmost loaded child to see if there's one that needed it var tileID = topmostLoadedID; while (tileID.overscaledZ > zoom) { tileID = tileID.scaledTo(tileID.overscaledZ - 1); if (idealTiles[tileID.key]) { // found a parent that needed a loaded child; retain that child retain[topmostLoadedID.key] = topmostLoadedID; break; } } } }; /** * Find a loaded parent of the given tile (up to minCoveringZoom) */ SourceCache.prototype.findLoadedParent = function findLoadedParent (tileID , minCoveringZoom ) { for (var z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) { var parent = tileID.scaledTo(z); if (!parent) { return; } var id = String(parent.key); var tile = this._tiles[id]; if (tile && tile.hasData()) { return tile; } if (this._cache.has(parent)) { return this._cache.get(parent); } } }; /** * Resizes the tile cache based on the current viewport's size * or the maxTileCacheSize option passed during map creation * * Larger viewports use more tiles and need larger caches. Larger viewports * are more likely to be found on devices with more memory and on pages where * the map is more important. */ SourceCache.prototype.updateCacheSize = function updateCacheSize (transform ) { var widthInTiles = Math.ceil(transform.width / this._source.tileSize) + 1; var heightInTiles = Math.ceil(transform.height / this._source.tileSize) + 1; var approxTilesInView = widthInTiles * heightInTiles; var commonZoomRange = 5; var viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange); var maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize; this._cache.setMaxSize(maxSize); }; SourceCache.prototype.handleWrapJump = function handleWrapJump (lng ) { // On top of the regular z/x/y values, TileIDs have a `wrap` value that specify // which cppy 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. var prevLng = this._prevLng === undefined ? lng : this._prevLng; var lngDifference = lng - prevLng; var worldDifference = lngDifference / 360; var wrapDelta = Math.round(worldDifference); this._prevLng = lng; if (wrapDelta) { var tiles = {}; for (var key in this._tiles) { var tile = this._tiles[key]; tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta); tiles[tile.tileID.key] = tile; } this._tiles = tiles; // Reset tile reload timers for (var id in this._timers) { clearTimeout(this._timers[id]); delete this._timers[id]; } for (var id$1 in this._tiles) { var tile$1 = this._tiles[id$1]; this._setTileReloadTimer(id$1, tile$1); } } }; /** * Removes tiles that are outside the viewport and adds new tiles that * are inside the viewport. */ SourceCache.prototype.update = function update (transform ) { var this$1 = this; this.transform = transform; if (!this._sourceLoaded || this._paused) { return; } this.updateCacheSize(transform); this.handleWrapJump(this.transform.center.lng); // Covered is a list of retained tiles who's areas are fully covered by other, // better, retained tiles. They are not drawn separately. this._coveredTiles = {}; var idealTileIDs; if (!this.used) { idealTileIDs = []; } else if (this._source.tileID) { idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID) .map(function (unwrapped) { return new symbol_layout.OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y); }); } else { idealTileIDs = transform.coveringTiles({ tileSize: this._source.tileSize, minzoom: this._source.minzoom, maxzoom: this._source.maxzoom, roundZoom: this._source.roundZoom, reparseOverscaled: this._source.reparseOverscaled }); if (this._source.hasTile) { idealTileIDs = idealTileIDs.filter(function (coord) { return (this$1._source.hasTile )(coord); }); } } // Determine the overzooming/underzooming amounts. var zoom = (this._source.roundZoom ? Math.round : Math.floor)(this.getZoom(transform)); var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); // Retain is a list of tiles that we shouldn't delete, even if they are not // the most ideal tile for the current viewport. This may include tiles like // parent or child tiles that are *already* loaded. var retain = this._updateRetainedTiles(idealTileIDs, zoom); if (isRasterType(this._source.type)) { var parentsForFading = {}; var fadingTiles = {}; var ids = Object.keys(retain); for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var tileID = retain[id]; symbol_layout.assert(tileID.key === +id); var tile = this._tiles[id]; if (!tile || tile.fadeEndTime && tile.fadeEndTime <= symbol_layout.browser.now()) { continue; } // if the tile is loaded but still fading in, find parents to cross-fade with it var parentTile = this.findLoadedParent(tileID, minCoveringZoom); if (parentTile) { this._addTile(parentTile.tileID); parentsForFading[parentTile.tileID.key] = parentTile.tileID; } fadingTiles[id] = tileID; } // for tiles that are still fading in, also find children to cross-fade with this._retainLoadedChildren(fadingTiles, zoom, maxCoveringZoom, retain); for (var id$1 in parentsForFading) { if (!retain[id$1]) { // 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$1] = true; retain[id$1] = parentsForFading[id$1]; } } } for (var 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(); } // Remove the tiles we don't need anymore. var remove = symbol_layout.keysDifference(this._tiles, retain); for (var i$1 = 0, list$1 = remove; i$1 < list$1.length; i$1 += 1) { var tileID$1 = list$1[i$1]; var tile$1 = this._tiles[tileID$1]; if (tile$1.hasSymbolBuckets && !tile$1.holdingForFade()) { tile$1.setHoldDuration(this.map._fadeDuration); } else if (!tile$1.hasSymbolBuckets || tile$1.symbolFadeFinished()) { this._removeTile(tileID$1); } } }; SourceCache.prototype.releaseSymbolFadeTiles = function releaseSymbolFadeTiles () { for (var id in this._tiles) { if (this._tiles[id].holdingForFade()) { this._removeTile(id); } } }; SourceCache.prototype._updateRetainedTiles = function _updateRetainedTiles (idealTileIDs , zoom ) { var retain = {}; var checked = {}; var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); var missingTiles = {}; for (var i = 0, list = idealTileIDs; i < list.length; i += 1) { var tileID = list[i]; var tile = this._addTile(tileID); // retain the tile even if it's not loaded because it's an ideal tile. retain[tileID.key] = tileID; if (tile.hasData()) { continue; } if (zoom < this._source.maxzoom) { // save missing tiles that potentially have loaded children missingTiles[tileID.key] = tileID; } } // retain any loaded children of ideal tiles up to maxCoveringZoom this._retainLoadedChildren(missingTiles, zoom, maxCoveringZoom, retain); for (var i$1 = 0, list$1 = idealTileIDs; i$1 < list$1.length; i$1 += 1) { var tileID$1 = list$1[i$1]; var tile$1 = this._tiles[tileID$1.key]; if (tile$1.hasData()) { continue; } // The tile we require is not yet loaded or does not exist; // Attempt to find children that fully cover it. if (zoom + 1 > this._source.maxzoom) { // We're looking for an overzoomed child tile. var childCoord = tileID$1.children(this._source.maxzoom)[0]; var 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 (i.e. the missing ideal tile is covered) var children = tileID$1.children(this._source.maxzoom); if (retain[children[0].key] && retain[children[1].key] && retain[children[2].key] && retain[children[3].key]) { continue; } // tile is covered by children } // We couldn't find child tiles that entirely cover the ideal tile; look for parents now. // 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. var parentWasRequested = tile$1.wasRequested(); for (var overscaledZ = tileID$1.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) { var parentId = tileID$1.scaledTo(overscaledZ); // Break parent tile ascent if this route has been previously checked by another child. if (checked[parentId.key]) { break; } checked[parentId.key] = true; tile$1 = this.getTile(parentId); if (!tile$1 && parentWasRequested) { tile$1 = this._addTile(parentId); } if (tile$1) { 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$1.wasRequested(); if (tile$1.hasData()) { break; } } } } return retain; }; /** * Add a tile, given its coordinate, to the pyramid. * @private */ SourceCache.prototype._addTile = function _addTile (tileID ) { var tile = this._tiles[tileID.key]; if (tile) { return tile; } tile = this._cache.getAndRemove(tileID); 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); } } var cached = Boolean(tile); if (!cached) { tile = new symbol_layout.Tile(tileID, this._source.tileSize * tileID.overscaleFactor()); this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state)); } // Impossible, but silence flow. if (!tile) { return (null ); } tile.uses++; this._tiles[tileID.key] = tile; if (!cached) { this._source.fire(new symbol_layout.Event('dataloading', {tile: tile, coord: tile.tileID, dataType: 'source'})); } return tile; }; SourceCache.prototype._setTileReloadTimer = function _setTileReloadTimer (id , tile ) { var this$1 = this; if (id in this._timers) { clearTimeout(this._timers[id]); delete this._timers[id]; } var expiryTimeout = tile.getExpiryTimeout(); if (expiryTimeout) { this._timers[id] = setTimeout(function () { this$1._reloadTile(id, 'expired'); delete this$1._timers[id]; }, expiryTimeout); } }; /** * Remove a tile, given its id, from the pyramid * @private */ SourceCache.prototype._removeTile = function _removeTile (id ) { var tile = this._tiles[id]; if (!tile) { return; } tile.uses--; delete this._tiles[id]; if (this._timers[id]) { clearTimeout(this._timers[id]); delete this._timers[id]; } if (tile.uses > 0) { return; } if (tile.hasData() && tile.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 */ SourceCache.prototype.clearTiles = function clearTiles () { this._shouldReloadOnResume = false; this._paused = false; for (var id in this._tiles) { this._removeTile(id); } this._cache.reset(); }; /** * Search through our current tiles and attempt to find the tiles that * cover the given bounds. * @param pointQueryGeometry coordinates of the corners of bounding rectangle * @returns {Array} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile. */ SourceCache.prototype.tilesIn = function tilesIn (pointQueryGeometry , maxPitchScaleFactor , has3DLayer ) { var this$1 = this; var tileResults = []; var transform = this.transform; if (!transform) { return tileResults; } var cameraPointQueryGeometry = has3DLayer ? transform.getCameraQueryGeometry(pointQueryGeometry) : pointQueryGeometry; var queryGeometry = pointQueryGeometry.map(function (p) { return transform.pointCoordinate(p); }); var cameraQueryGeometry = cameraPointQueryGeometry.map(function (p) { return transform.pointCoordinate(p); }); var ids = this.getIds(); var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i$1 = 0, list = cameraQueryGeometry; i$1 < list.length; i$1 += 1) { var p = list[i$1]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } var loop = function ( i ) { var tile = this$1._tiles[ids[i]]; if (tile.holdingForFade()) { // Tiles held for fading are covered by tiles that are closer to ideal return; } var tileID = tile.tileID; var scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ); var queryPadding = maxPitchScaleFactor * tile.queryPadding * symbol_layout.EXTENT / tile.tileSize / scale; var tileSpaceBounds = [ tileID.getTilePoint(new symbol_layout.MercatorCoordinate(minX, minY)), tileID.getTilePoint(new symbol_layout.MercatorCoordinate(maxX, maxY)) ]; if (tileSpaceBounds[0].x - queryPadding < symbol_layout.EXTENT && tileSpaceBounds[0].y - queryPadding < symbol_layout.EXTENT && tileSpaceBounds[1].x + queryPadding >= 0 && tileSpaceBounds[1].y + queryPadding >= 0) { var tileSpaceQueryGeometry = queryGeometry.map(function (c) { return tileID.getTilePoint(c); }); var tileSpaceCameraQueryGeometry = cameraQueryGeometry.map(function (c) { return tileID.getTilePoint(c); }); tileResults.push({ tile: tile, tileID: tileID, queryGeometry: tileSpaceQueryGeometry, cameraQueryGeometry: tileSpaceCameraQueryGeometry, scale: scale }); } }; for (var i = 0; i < ids.length; i++) loop( i ); return tileResults; }; SourceCache.prototype.getVisibleCoordinates = function getVisibleCoordinates (symbolLayer ) { var this$1 = this; var coords = this.getRenderableIds(symbolLayer).map(function (id) { return this$1._tiles[id].tileID; }); for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; coord.posMatrix = this.transform.calculatePosMatrix(coord.toUnwrapped()); } return coords; }; SourceCache.prototype.hasTransition = function hasTransition () { if (this._source.hasTransition()) { return true; } if (isRasterType(this._source.type)) { for (var id in this._tiles) { var tile = this._tiles[id]; if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= symbol_layout.browser.now()) { return true; } } } return false; }; /** * Set the value of a particular state for a feature * @private */ SourceCache.prototype.setFeatureState = function setFeatureState (sourceLayer , feature , state ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; this._state.updateState(sourceLayer, feature, state); }; /** * Resets the value of a particular state key for a feature * @private */ SourceCache.prototype.removeFeatureState = function removeFeatureState (sourceLayer , feature , key ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; this._state.removeFeatureState(sourceLayer, feature, key); }; /** * Get the entire state object for a feature * @private */ SourceCache.prototype.getFeatureState = function getFeatureState (sourceLayer , feature ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; return this._state.getState(sourceLayer, feature); }; return SourceCache; }(symbol_layout.Evented)); SourceCache.maxOverzooming = 10; SourceCache.maxUnderzooming = 3; function compareKeyZoom(a, b) { return ((a % 32) - (b % 32)) || (b - a); } function isRasterType(type) { return type === 'raster' || type === 'image' || type === 'video'; } // function WebWorker () { return (new symbol_layout.window.Worker(exported.workerUrl) ); } // /** * Constructs a worker pool. * @private */ var WorkerPool = function WorkerPool() { this.active = {}; }; WorkerPool.prototype.acquire = function 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()); } } this.active[mapId] = true; return this.workers.slice(); }; WorkerPool.prototype.release = function release (mapId ) { delete this.active[mapId]; if (Object.keys(this.active).length === 0) { this.workers.forEach(function (w) { w.terminate(); }); this.workers = (null ); } }; var availableLogicalProcessors = Math.floor(symbol_layout.browser.hardwareConcurrency / 2); WorkerPool.workerCount = Math.max(Math.min(availableLogicalProcessors, 6), 1); // var globalWorkerPool; /** * 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; } function deref(layer, parent) { var result = {}; for (var k in layer) { if (k !== 'ref') { result[k] = layer[k]; } } symbol_layout.refProperties.forEach(function (k) { if (k in parent) { result[k] = parent[k]; } }); return result; } /** * Given an array of layers, some of which may contain `ref` properties * whose value is the `id` of another property, return a new array where * such layers have been augmented with the 'type', 'source', etc. properties * from the parent layer, and the `ref` property has been removed. * * The input is not modified. The output may contain references to portions * of the input. * * @private * @param {Array} layers * @returns {Array} */ function derefLayers(layers) { layers = layers.slice(); var map = Object.create(null); for (var i = 0; i < layers.length; i++) { map[layers[i].id] = layers[i]; } for (var i$1 = 0; i$1 < layers.length; i$1++) { if ('ref' in layers[i$1]) { layers[i$1] = deref(layers[i$1], map[layers[i$1].ref]); } } return layers; } var operations = { /* * { command: 'setStyle', args: [stylesheet] } */ setStyle: 'setStyle', /* * { command: 'addLayer', args: [layer, 'beforeLayerId'] } */ addLayer: 'addLayer', /* * { command: 'removeLayer', args: ['layerId'] } */ removeLayer: 'removeLayer', /* * { command: 'setPaintProperty', args: ['layerId', 'prop', value] } */ setPaintProperty: 'setPaintProperty', /* * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] } */ setLayoutProperty: 'setLayoutProperty', /* * { command: 'setFilter', args: ['layerId', filter] } */ setFilter: 'setFilter', /* * { command: 'addSource', args: ['sourceId', source] } */ addSource: 'addSource', /* * { command: 'removeSource', args: ['sourceId'] } */ removeSource: 'removeSource', /* * { command: 'setGeoJSONSourceData', args: ['sourceId', data] } */ setGeoJSONSourceData: 'setGeoJSONSourceData', /* * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] } */ setLayerZoomRange: 'setLayerZoomRange', /* * { command: 'setLayerProperty', args: ['layerId', 'prop', value] } */ setLayerProperty: 'setLayerProperty', /* * { command: 'setCenter', args: [[lon, lat]] } */ setCenter: 'setCenter', /* * { command: 'setZoom', args: [zoom] } */ setZoom: 'setZoom', /* * { command: 'setBearing', args: [bearing] } */ setBearing: 'setBearing', /* * { command: 'setPitch', args: [pitch] } */ setPitch: 'setPitch', /* * { command: 'setSprite', args: ['spriteUrl'] } */ setSprite: 'setSprite', /* * { command: 'setGlyphs', args: ['glyphsUrl'] } */ setGlyphs: 'setGlyphs', /* * { command: 'setTransition', args: [transition] } */ setTransition: 'setTransition', /* * { command: 'setLighting', args: [lightProperties] } */ setLight: 'setLight' }; function addSource(sourceId, after, commands) { commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] }); } function removeSource(sourceId, commands, sourcesRemoved) { commands.push({ command: operations.removeSource, args: [sourceId] }); sourcesRemoved[sourceId] = true; } function updateSource(sourceId, after, commands, sourcesRemoved) { removeSource(sourceId, commands, sourcesRemoved); addSource(sourceId, after, commands); } function canUpdateGeoJSON(before, after, sourceId) { var prop; for (prop in before[sourceId]) { if (!before[sourceId].hasOwnProperty(prop)) { continue; } if (prop !== 'data' && !symbol_layout.deepEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } } for (prop in after[sourceId]) { if (!after[sourceId].hasOwnProperty(prop)) { continue; } if (prop !== 'data' && !symbol_layout.deepEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } } return true; } function diffSources(before, after, commands, sourcesRemoved) { before = before || {}; after = after || {}; var sourceId; // look for sources to remove for (sourceId in before) { if (!before.hasOwnProperty(sourceId)) { continue; } if (!after.hasOwnProperty(sourceId)) { removeSource(sourceId, commands, sourcesRemoved); } } // look for sources to add/update for (sourceId in after) { if (!after.hasOwnProperty(sourceId)) { continue; } if (!before.hasOwnProperty(sourceId)) { addSource(sourceId, after, commands); } else if (!symbol_layout.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); } } } } function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) { before = before || {}; after = after || {}; var prop; for (prop in before) { if (!before.hasOwnProperty(prop)) { continue; } if (!symbol_layout.deepEqual(before[prop], after[prop])) { commands.push({ command: command, args: [layerId, prop, after[prop], klass] }); } } for (prop in after) { if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) { continue; } if (!symbol_layout.deepEqual(before[prop], after[prop])) { commands.push({ command: command, args: [layerId, prop, after[prop], klass] }); } } } function pluckId(layer) { return layer.id; } function indexById(group, layer) { group[layer.id] = layer; return group; } function diffLayers(before, after, commands) { before = before || []; after = after || []; // order of layers by id var beforeOrder = before.map(pluckId); var afterOrder = after.map(pluckId); // index of layer by id var beforeIndex = before.reduce(indexById, {}); var afterIndex = after.reduce(indexById, {}); // track order of layers as if they have been mutated var tracker = beforeOrder.slice(); // layers that have been added do not need to be diffed var clean = Object.create(null); var i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop; // remove layers for (i = 0, d = 0; i < beforeOrder.length; i++) { layerId = beforeOrder[i]; if (!afterIndex.hasOwnProperty(layerId)) { commands.push({ command: operations.removeLayer, args: [layerId] }); tracker.splice(tracker.indexOf(layerId, d), 1); } else { // limit where in tracker we need to look for a match d++; } } // add/reorder layers for (i = 0, d = 0; i < afterOrder.length; i++) { // work backwards as insert is before an existing layer layerId = afterOrder[afterOrder.length - 1 - i]; if (tracker[tracker.length - 1 - i] === layerId) { continue; } if (beforeIndex.hasOwnProperty(layerId)) { // remove the layer before we insert at the correct position commands.push({ command: operations.removeLayer, args: [layerId] }); tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1); } else { // limit where in tracker we need to look for a match d++; } // add layer at correct position insertBeforeLayerId = tracker[tracker.length - i]; commands.push({ command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId] }); tracker.splice(tracker.length - i, 0, layerId); clean[layerId] = true; } // update layers for (i = 0; i < afterOrder.length; i++) { layerId = afterOrder[i]; beforeLayer = beforeIndex[layerId]; afterLayer = afterIndex[layerId]; // no need to update if previously added (new or moved) if (clean[layerId] || symbol_layout.deepEqual(beforeLayer, afterLayer)) { continue; } // If source, source-layer, or type have changes, then remove the layer // and add it back 'from scratch'. if (!symbol_layout.deepEqual(beforeLayer.source, afterLayer.source) || !symbol_layout.deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !symbol_layout.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; } // 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 (!symbol_layout.deepEqual(beforeLayer.filter, afterLayer.filter)) { commands.push({ command: operations.setFilter, args: [layerId, afterLayer.filter] }); } if (!symbol_layout.deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !symbol_layout.deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) { commands.push({ command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom] }); } // handle all other layer props, including paint.* for (prop in beforeLayer) { if (!beforeLayer.hasOwnProperty(prop)) { continue; } if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') { continue; } if (prop.indexOf('paint.') === 0) { diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); } else if (!symbol_layout.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 (!symbol_layout.deepEqual(beforeLayer[prop], afterLayer[prop])) { commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] }); } } } } /** * Diff two stylesheet * * Creates semanticly aware diffs that can easily be applied at runtime. * Operations produced by the diff closely resemble the mapbox-gl-js API. Any * error creating the diff will fall back to the 'setStyle' operation. * * Example diff: * [ * { command: 'setConstant', args: ['@water', '#0000FF'] }, * { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] } * ] * * @private * @param {*} [before] stylesheet to compare from * @param {*} after stylesheet to compare to * @returns Array list of changes */ function diffStyles(before, after) { if (!before) { return [{ command: operations.setStyle, args: [after] }]; } var commands = []; try { // Handle changes to top-level properties if (!symbol_layout.deepEqual(before.version, after.version)) { return [{ command: operations.setStyle, args: [after] }]; } if (!symbol_layout.deepEqual(before.center, after.center)) { commands.push({ command: operations.setCenter, args: [after.center] }); } if (!symbol_layout.deepEqual(before.zoom, after.zoom)) { commands.push({ command: operations.setZoom, args: [after.zoom] }); } if (!symbol_layout.deepEqual(before.bearing, after.bearing)) { commands.push({ command: operations.setBearing, args: [after.bearing] }); } if (!symbol_layout.deepEqual(before.pitch, after.pitch)) { commands.push({ command: operations.setPitch, args: [after.pitch] }); } if (!symbol_layout.deepEqual(before.sprite, after.sprite)) { commands.push({ command: operations.setSprite, args: [after.sprite] }); } if (!symbol_layout.deepEqual(before.glyphs, after.glyphs)) { commands.push({ command: operations.setGlyphs, args: [after.glyphs] }); } if (!symbol_layout.deepEqual(before.transition, after.transition)) { commands.push({ command: operations.setTransition, args: [after.transition] }); } if (!symbol_layout.deepEqual(before.light, after.light)) { commands.push({ command: operations.setLight, args: [after.light] }); } // Handle changes to `sources` // If a source is to be removed, we also--before the removeSource // command--need to remove all the style layers that depend on it. var sourcesRemoved = {}; // First collect the {add,remove}Source commands var removeOrAddSourceCommands = []; diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved); // Push a removeLayer command for each style layer that depends on a // source that's being removed. // Also, exclude any such layers them from the input to `diffLayers` // below, so that diffLayers produces the appropriate `addLayers` // command var beforeLayers = []; if (before.layers) { before.layers.forEach(function (layer) { if (sourcesRemoved[layer.source]) { commands.push({ command: operations.removeLayer, args: [layer.id] }); } else { beforeLayers.push(layer); } }); } commands = commands.concat(removeOrAddSourceCommands); // Handle changes to `layers` diffLayers(beforeLayers, after.layers, commands); } catch (e) { // fall back to setStyle console.warn('Unable to compute style diff:', e); commands = [{ command: operations.setStyle, args: [after] }]; } return commands; } // /** * GridIndex is a data structure for testing the intersection of * circles and rectangles in a 2d plane. * It is optimized for rapid insertion and querying. * GridIndex splits the plane into a set of "cells" and keeps track * of which geometries intersect with each cell. At query time, * full geometry comparisons are only done for items that share * at least one cell. As long as the geometries are relatively * uniformly distributed across the plane, this greatly reduces * the number of comparisons necessary. * * @private */ var GridIndex = function GridIndex (width , height , cellSize ) { var boxCells = this.boxCells = []; var circleCells = this.circleCells = []; // More cells -> fewer geometries to check per cell, but items tend // to be split across more cells. // Sweet spot allows most small items to fit in one cell this.xCellCount = Math.ceil(width / cellSize); this.yCellCount = Math.ceil(height / cellSize); for (var i = 0; i < this.xCellCount * this.yCellCount; i++) { boxCells.push([]); circleCells.push([]); } this.circleKeys = []; this.boxKeys = []; this.bboxes = []; this.circles = []; this.width = width; this.height = height; this.xScale = this.xCellCount / width; this.yScale = this.yCellCount / height; this.boxUid = 0; this.circleUid = 0; }; GridIndex.prototype.keysLength = function keysLength () { return this.boxKeys.length + this.circleKeys.length; }; GridIndex.prototype.insert = function insert (key , x1 , y1 , x2 , y2 ) { this._forEachCell(x1, y1, x2, y2, this._insertBoxCell, this.boxUid++); this.boxKeys.push(key); this.bboxes.push(x1); this.bboxes.push(y1); this.bboxes.push(x2); this.bboxes.push(y2); }; GridIndex.prototype.insertCircle = function insertCircle (key , x , y , radius ) { // Insert circle into grid for all cells in the circumscribing square // It's more than necessary (by a factor of 4/PI), but fast to insert this._forEachCell(x - radius, y - radius, x + radius, y + radius, this._insertCircleCell, this.circleUid++); this.circleKeys.push(key); this.circles.push(x); this.circles.push(y); this.circles.push(radius); }; GridIndex.prototype._insertBoxCell = function _insertBoxCell (x1 , y1 , x2 , y2 , cellIndex , uid ) { this.boxCells[cellIndex].push(uid); }; GridIndex.prototype._insertCircleCell = function _insertCircleCell (x1 , y1 , x2 , y2 , cellIndex , uid ) { this.circleCells[cellIndex].push(uid); }; GridIndex.prototype._query = function _query (x1 , y1 , x2 , y2 , hitTest , predicate ) { if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { return hitTest ? false : []; } var result = []; if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) { if (hitTest) { return true; } for (var 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 (var circleUid = 0; circleUid < this.circleKeys.length; circleUid++) { var x = this.circles[circleUid * 3]; var y = this.circles[circleUid * 3 + 1]; var 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 { var queryArgs = { hitTest: hitTest, seenUids: { box: {}, circle: {} } }; this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate); return hitTest ? result.length > 0 : result; } }; GridIndex.prototype._queryCircle = function _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 var x1 = x - radius; var x2 = x + radius; var y1 = y - radius; var y2 = y + radius; if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { return hitTest ? false : []; } // Box query early exits if the bounding box is larger than the grid, but we don't do // the equivalent calculation for circle queries because early exit is less likely // and the calculation is more expensive var result = []; var queryArgs = { hitTest: hitTest, circle: { x: x, y: y, radius: radius }, seenUids: { box: {}, circle: {} } }; this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate); return hitTest ? result.length > 0 : result; }; GridIndex.prototype.query = function query (x1 , y1 , x2 , y2 , predicate ) { return (this._query(x1, y1, x2, y2, false, predicate) ); }; GridIndex.prototype.hitTest = function hitTest (x1 , y1 , x2 , y2 , predicate ) { return (this._query(x1, y1, x2, y2, true, predicate) ); }; GridIndex.prototype.hitTestCircle = function hitTestCircle (x , y , radius , predicate ) { return (this._queryCircle(x, y, radius, true, predicate) ); }; GridIndex.prototype._queryCell = function _queryCell (x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { var seenUids = queryArgs.seenUids; var boxCell = this.boxCells[cellIndex]; if (boxCell !== null) { var bboxes = this.bboxes; for (var i = 0, list = boxCell; i < list.length; i += 1) { var boxUid = list[i]; if (!seenUids.box[boxUid]) { seenUids.box[boxUid] = true; var offset = boxUid * 4; if ((x1 <= bboxes[offset + 2]) && (y1 <= bboxes[offset + 3]) && (x2 >= bboxes[offset + 0]) && (y2 >= bboxes[offset + 1]) && (!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] }); } } } } } var circleCell = this.circleCells[cellIndex]; if (circleCell !== null) { var circles = this.circles; for (var i$1 = 0, list$1 = circleCell; i$1 < list$1.length; i$1 += 1) { var circleUid = list$1[i$1]; if (!seenUids.circle[circleUid]) { seenUids.circle[circleUid] = true; var offset$1 = circleUid * 3; if (this._circleAndRectCollide( circles[offset$1], circles[offset$1 + 1], circles[offset$1 + 2], x1, y1, x2, y2) && (!predicate || predicate(this.circleKeys[circleUid]))) { if (queryArgs.hitTest) { result.push(true); return true; } else { var x = circles[offset$1]; var y = circles[offset$1 + 1]; var radius = circles[offset$1 + 2]; result.push({ key: this.circleKeys[circleUid], x1: x - radius, y1: y - radius, x2: x + radius, y2: y + radius }); } } } } } }; GridIndex.prototype._queryCellCircle = function _queryCellCircle (x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { var circle = queryArgs.circle; var seenUids = queryArgs.seenUids; var boxCell = this.boxCells[cellIndex]; if (boxCell !== null) { var bboxes = this.bboxes; for (var i = 0, list = boxCell; i < list.length; i += 1) { var boxUid = list[i]; if (!seenUids.box[boxUid]) { seenUids.box[boxUid] = true; var offset = boxUid * 4; if (this._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; } } } } var circleCell = this.circleCells[cellIndex]; if (circleCell !== null) { var circles = this.circles; for (var i$1 = 0, list$1 = circleCell; i$1 < list$1.length; i$1 += 1) { var circleUid = list$1[i$1]; if (!seenUids.circle[circleUid]) { seenUids.circle[circleUid] = true; var offset$1 = circleUid * 3; if (this._circlesCollide( circles[offset$1], circles[offset$1 + 1], circles[offset$1 + 2], circle.x, circle.y, circle.radius) && (!predicate || predicate(this.circleKeys[circleUid]))) { result.push(true); return true; } } } } }; GridIndex.prototype._forEachCell = function _forEachCell (x1 , y1 , x2 , y2 , fn , arg1 , arg2 , predicate ) { var cx1 = this._convertToXCellCoord(x1); var cy1 = this._convertToYCellCoord(y1); var cx2 = this._convertToXCellCoord(x2); var cy2 = this._convertToYCellCoord(y2); for (var x = cx1; x <= cx2; x++) { for (var y = cy1; y <= cy2; y++) { var cellIndex = this.xCellCount * y + x; if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate)) { return; } } } }; GridIndex.prototype._convertToXCellCoord = function _convertToXCellCoord (x ) { return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale))); }; GridIndex.prototype._convertToYCellCoord = function _convertToYCellCoord (y ) { return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale))); }; GridIndex.prototype._circlesCollide = function _circlesCollide (x1 , y1 , r1 , x2 , y2 , r2 ) { var dx = x2 - x1; var dy = y2 - y1; var bothRadii = r1 + r2; return (bothRadii * bothRadii) > (dx * dx + dy * dy); }; GridIndex.prototype._circleAndRectCollide = function _circleAndRectCollide (circleX , circleY , radius , x1 , y1 , x2 , y2 ) { var halfRectWidth = (x2 - x1) / 2; var distX = Math.abs(circleX - (x1 + halfRectWidth)); if (distX > (halfRectWidth + radius)) { return false; } var halfRectHeight = (y2 - y1) / 2; var distY = Math.abs(circleY - (y1 + halfRectHeight)); if (distY > (halfRectHeight + radius)) { return false; } if (distX <= halfRectWidth || distY <= halfRectHeight) { return true; } var dx = distX - halfRectWidth; var dy = distY - halfRectHeight; return (dx * dx + dy * dy <= (radius * radius)); }; // /* * # Overview of coordinate spaces * * ## Tile coordinate spaces * Each label has an anchor. Some labels have corresponding line geometries. * The points for both anchors and lines are stored in tile units. Each tile has it's own * coordinate space going from (0, 0) at the top left to (EXTENT, EXTENT) at the bottom right. * * ## GL coordinate space * At the end of everything, the vertex shader needs to produce a position in GL coordinate space, * which is (-1, 1) at the top left and (1, -1) in the bottom right. * * ## Map pixel coordinate spaces * Each tile has a pixel coordinate space. It's just the tile units scaled so that one unit is * whatever counts as 1 pixel at the current zoom. * This space is used for pitch-alignment=map, rotation-alignment=map * * ## Rotated map pixel coordinate spaces * Like the above, but rotated so axis of the space are aligned with the viewport instead of the tile. * This space is used for pitch-alignment=map, rotation-alignment=viewport * * ## Viewport pixel coordinate space * (0, 0) is at the top left of the canvas and (pixelWidth, pixelHeight) is at the bottom right corner * of the canvas. This space is used for pitch-alignment=viewport * * * # Vertex projection * It goes roughly like this: * 1. project the anchor and line from tile units into the correct label coordinate space * - map pixel space pitch-alignment=map rotation-alignment=map * - rotated map pixel space pitch-alignment=map rotation-alignment=viewport * - viewport pixel space pitch-alignment=viewport rotation-alignment=* * 2. if the label follows a line, find the point along the line that is the correct distance from the anchor. * 3. add the glyph's corner offset to the point from step 3 * 4. convert from the label coordinate space to gl coordinates * * For horizontal labels we want to do step 1 in the shader for performance reasons (no cpu work). * This is what `u_label_plane_matrix` is used for. * For labels aligned with lines we have to steps 1 and 2 on the cpu since we need access to the line geometry. * This is what `updateLineLabels(...)` does. * Since the conversion is handled on the cpu we just set `u_label_plane_matrix` to an identity matrix. * * Steps 3 and 4 are done in the shaders for all labels. */ /* * Returns a matrix for converting from tile units to the correct label coordinate space. */ function getLabelPlaneMatrix(posMatrix , pitchWithMap , rotateWithMap , transform , pixelsToTileUnits ) { var m = symbol_layout.create(); if (pitchWithMap) { symbol_layout.scale(m, m, [1 / pixelsToTileUnits, 1 / pixelsToTileUnits, 1]); if (!rotateWithMap) { symbol_layout.rotateZ(m, m, transform.angle); } } else { symbol_layout.multiply(m, transform.labelPlaneMatrix, posMatrix); } return m; } /* * Returns a matrix for converting from the correct label coordinate space to gl coords. */ function getGlCoordMatrix(posMatrix , pitchWithMap , rotateWithMap , transform , pixelsToTileUnits ) { if (pitchWithMap) { var m = symbol_layout.clone(posMatrix); symbol_layout.scale(m, m, [pixelsToTileUnits, pixelsToTileUnits, 1]); if (!rotateWithMap) { symbol_layout.rotateZ(m, m, -transform.angle); } return m; } else { return transform.glCoordMatrix; } } function project(point , matrix ) { var pos = [point.x, point.y, 0, 1]; xyTransformMat4(pos, pos, matrix); var w = pos[3]; return { point: new symbol_layout.Point(pos[0] / w, pos[1] / w), signedDistanceFromCamera: w }; } function isVisible(anchorPos , clippingBuffer ) { var x = anchorPos[0] / anchorPos[3]; var y = anchorPos[1] / anchorPos[3]; var inPaddedViewport = ( x >= -clippingBuffer[0] && x <= clippingBuffer[0] && y >= -clippingBuffer[1] && y <= clippingBuffer[1]); return inPaddedViewport; } /* * Update the `dynamicLayoutVertexBuffer` for the buffer with the correct glyph positions for the current map view. * This is only run on labels that are aligned with lines. Horizontal labels are handled entirely in the shader. */ function updateLineLabels(bucket , posMatrix , painter , isText , labelPlaneMatrix , glCoordMatrix , pitchWithMap , keepUpright ) { var sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; var partiallyEvaluatedSize = symbol_layout.evaluateSizeForZoom(sizeData, painter.transform.zoom); var clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1]; var dynamicLayoutVertexArray = isText ? bucket.text.dynamicLayoutVertexArray : bucket.icon.dynamicLayoutVertexArray; dynamicLayoutVertexArray.clear(); var lineVertexArray = bucket.lineVertexArray; var placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray; var aspectRatio = painter.transform.width / painter.transform.height; var useVertical = false; for (var s = 0; s < placedSymbols.length; s++) { var symbol = placedSymbols.get(s); // Don't do calculations for vertical glyphs unless the previous symbol was horizontal // and we determined that vertical glyphs were necessary. // Also don't do calculations for symbols that are collided and fully faded out if (symbol.hidden || symbol.writingMode === symbol_layout.WritingMode.vertical && !useVertical) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } // Awkward... but we're counting on the paired "vertical" symbol coming immediately after its horizontal counterpart useVertical = false; var anchorPos = [symbol.anchorX, symbol.anchorY, 0, 1]; symbol_layout.transformMat4(anchorPos, anchorPos, posMatrix); // Don't bother calculating the correct point for invisible labels. if (!isVisible(anchorPos, clippingBuffer)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } var cameraToAnchorDistance = anchorPos[3]; var perspectiveRatio = 0.5 + 0.5 * (cameraToAnchorDistance / painter.transform.cameraToCenterDistance); var fontSize = symbol_layout.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol); var pitchScaledFontSize = pitchWithMap ? fontSize * perspectiveRatio : fontSize / perspectiveRatio; var tileAnchorPoint = new symbol_layout.Point(symbol.anchorX, symbol.anchorY); var anchorPoint = project(tileAnchorPoint, labelPlaneMatrix).point; var projectionCache = {}; var placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio); useVertical = placeUnflipped.useVertical; if (placeUnflipped.notEnoughRoom || useVertical || (placeUnflipped.needsFlipping && placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio).notEnoughRoom)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); } } if (isText) { bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } else { bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } } function placeFirstAndLastGlyph(fontScale , glyphOffsetArray , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , symbol , lineVertexArray , labelPlaneMatrix , projectionCache , returnTileDistance ) { var glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; var lineStartIndex = symbol.lineStartIndex; var lineEndIndex = symbol.lineStartIndex + symbol.lineLength; var firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex); var lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1); var firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, returnTileDistance); if (!firstPlacedGlyph) { return null; } var lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, returnTileDistance); if (!lastPlacedGlyph) { return null; } return { first: firstPlacedGlyph, last: lastPlacedGlyph }; } function requiresOrientationChange(writingMode, firstPoint, lastPoint, aspectRatio) { if (writingMode === symbol_layout.WritingMode.horizontal) { // On top of choosing whether to flip, choose whether to render this version of the glyphs or the alternate // vertical glyphs. We can't just filter out vertical glyphs in the horizontal range because the horizontal // and vertical versions can have slightly different projections which could lead to angles where both or // neither showed. var rise = Math.abs(lastPoint.y - firstPoint.y); var run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio; if (rise > run) { return { useVertical: true }; } } if (writingMode === symbol_layout.WritingMode.vertical ? firstPoint.y < lastPoint.y : firstPoint.x > lastPoint.x) { // Includes "horizontalOnly" case for labels without vertical glyphs return { needsFlipping: true }; } return null; } function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio) { var fontScale = fontSize / 24; var lineOffsetX = symbol.lineOffsetX * fontScale; var lineOffsetY = symbol.lineOffsetY * fontScale; var placedGlyphs; if (symbol.numGlyphs > 1) { var glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; var lineStartIndex = symbol.lineStartIndex; var lineEndIndex = symbol.lineStartIndex + symbol.lineLength; // Place the first and the last glyph in the label first, so we can figure out // the overall orientation of the label and determine whether it needs to be flipped in keepUpright mode var firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, false); if (!firstAndLastGlyph) { return { notEnoughRoom: true }; } var firstPoint = project(firstAndLastGlyph.first.point, glCoordMatrix).point; var lastPoint = project(firstAndLastGlyph.last.point, glCoordMatrix).point; if (keepUpright && !flip) { var orientationChange = requiresOrientationChange(symbol.writingMode, firstPoint, lastPoint, aspectRatio); if (orientationChange) { return orientationChange; } } placedGlyphs = [firstAndLastGlyph.first]; for (var glyphIndex = symbol.glyphStartIndex + 1; glyphIndex < glyphEndIndex - 1; glyphIndex++) { // Since first and last glyph fit on the line, we're sure that the rest of the glyphs can be placed // $FlowFixMe placedGlyphs.push(placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, false)); } placedGlyphs.push(firstAndLastGlyph.last); } else { // Only a single glyph to place // So, determine whether to flip based on projected angle of the line segment it's on if (keepUpright && !flip) { var a = project(tileAnchorPoint, posMatrix).point; var tileVertexIndex = (symbol.lineStartIndex + symbol.segment + 1); // $FlowFixMe var tileSegmentEnd = new symbol_layout.Point(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex)); var projectedVertex = project(tileSegmentEnd, posMatrix); // We know the anchor will be in the viewport, but the end of the line segment may be // behind the plane of the camera, in which case we can use a point at any arbitrary (closer) // point on the segment. var b = (projectedVertex.signedDistanceFromCamera > 0) ? projectedVertex.point : projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix); var orientationChange$1 = requiresOrientationChange(symbol.writingMode, a, b, aspectRatio); if (orientationChange$1) { return orientationChange$1; } } // $FlowFixMe var singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache, false); if (!singleGlyph) { return { notEnoughRoom: true }; } placedGlyphs = [singleGlyph]; } for (var i = 0, list = placedGlyphs; i < list.length; i += 1) { var glyph = list[i]; symbol_layout.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle); } return {}; } function projectTruncatedLineSegment(previousTilePoint , currentTilePoint , previousProjectedPoint , minimumLength , projectionMatrix ) { // We are assuming "previousTilePoint" won't project to a point within one unit of the camera plane // If it did, that would mean our label extended all the way out from within the viewport to a (very distant) // point near the plane of the camera. We wouldn't be able to render the label anyway once it crossed the // plane of the camera. var projectedUnitVertex = project(previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()), projectionMatrix).point; var projectedUnitSegment = previousProjectedPoint.sub(projectedUnitVertex); return previousProjectedPoint.add(projectedUnitSegment._mult(minimumLength / projectedUnitSegment.mag())); } function placeGlyphAlongLine(offsetX , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , anchorSegment , lineStartIndex , lineEndIndex , lineVertexArray , labelPlaneMatrix , projectionCache , returnTileDistance ) { var combinedOffsetX = flip ? offsetX - lineOffsetX : offsetX + lineOffsetX; var dir = combinedOffsetX > 0 ? 1 : -1; var angle = 0; if (flip) { // The label needs to be flipped to keep text upright. // Iterate in the reverse direction. dir *= -1; angle = Math.PI; } if (dir < 0) { angle += Math.PI; } var currentIndex = dir > 0 ? lineStartIndex + anchorSegment : lineStartIndex + anchorSegment + 1; var initialIndex = currentIndex; var current = anchorPoint; var prev = anchorPoint; var distanceToPrev = 0; var currentSegmentDistance = 0; var absOffsetX = Math.abs(combinedOffsetX); while (distanceToPrev + currentSegmentDistance <= absOffsetX) { currentIndex += dir; // offset does not fit on the projected line if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex) { return null; } prev = current; current = projectionCache[currentIndex]; if (current === undefined) { var currentVertex = new symbol_layout.Point(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); var projection = project(currentVertex, labelPlaneMatrix); if (projection.signedDistanceFromCamera > 0) { current = projectionCache[currentIndex] = projection.point; } else { // The vertex is behind the plane of the camera, so we can't project it // Instead, we'll create a vertex along the line that's far enough to include the glyph var previousLineVertexIndex = currentIndex - dir; var previousTilePoint = distanceToPrev === 0 ? tileAnchorPoint : new symbol_layout.Point(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex)); // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment current = projectTruncatedLineSegment(previousTilePoint, currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix); } } distanceToPrev += currentSegmentDistance; currentSegmentDistance = prev.dist(current); } // The point is on the current segment. Interpolate to find it. var segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance; var prevToCurrent = current.sub(prev); var p = prevToCurrent.mult(segmentInterpolationT)._add(prev); // offset the point from the line to text-offset and icon-offset p._add(prevToCurrent._unit()._perp()._mult(lineOffsetY * dir)); var segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x); return { point: p, angle: segmentAngle, tileDistance: returnTileDistance ? { prevTileDistance: (currentIndex - dir) === initialIndex ? 0 : lineVertexArray.gettileUnitDistanceFromAnchor(currentIndex - dir), lastSegmentViewportDistance: absOffsetX - distanceToPrev } : null }; } var hiddenGlyphAttributes = new Float32Array([-Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0]); // Hide them by moving them offscreen. We still need to add them to the buffer // because the dynamic buffer is paired with a static buffer that doesn't get updated. function hideGlyphs(num , dynamicLayoutVertexArray ) { for (var i = 0; i < num; i++) { var offset = dynamicLayoutVertexArray.length; dynamicLayoutVertexArray.resize(offset + 4); // Since all hidden glyphs have the same attributes, we can build up the array faster with a single call to Float32Array.set // for each set of four vertices, instead of calling addDynamicAttributes for each vertex. dynamicLayoutVertexArray.float32.set(hiddenGlyphAttributes, offset * 3); } } // For line label layout, we're not using z output and our w input is always 1 // This custom matrix transformation ignores those components to make projection faster function xyTransformMat4(out , a , m ) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; out[3] = m[3] * x + m[7] * y + m[15]; return out; } // // When a symbol crosses the edge that causes it to be included in // collision detection, it will cause changes in the symbols around // it. This constant specifies how many pixels to pad the edge of // the viewport for collision detection so that the bulk of the changes // occur offscreen. Making this constant greater increases label // stability, but it's expensive. var viewportPadding = 100; /** * A collision index used to prevent symbols from overlapping. It keep tracks of * where previous symbols have been placed and is used to check if a new * symbol overlaps with any previously added symbols. * * There are two steps to insertion: first placeCollisionBox/Circles checks if * there's room for a symbol, then insertCollisionBox/Circles actually puts the * symbol in the index. The two step process allows paired symbols to be inserted * together even if they overlap. * * @private */ var CollisionIndex = function CollisionIndex( transform , grid, ignoredGrid ) { if ( grid === void 0 ) grid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25); if ( ignoredGrid === void 0 ) ignoredGrid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25); this.transform = transform; this.grid = grid; this.ignoredGrid = ignoredGrid; this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance; this.screenRightBoundary = transform.width + viewportPadding; this.screenBottomBoundary = transform.height + viewportPadding; this.gridRightBoundary = transform.width + 2 * viewportPadding; this.gridBottomBoundary = transform.height + 2 * viewportPadding; }; CollisionIndex.prototype.placeCollisionBox = function placeCollisionBox (collisionBox , allowOverlap , textPixelRatio , posMatrix , collisionGroupPredicate ) { var projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY); var tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio; var tlX = collisionBox.x1 * tileToViewport + projectedPoint.point.x; var tlY = collisionBox.y1 * tileToViewport + projectedPoint.point.y; var brX = collisionBox.x2 * tileToViewport + projectedPoint.point.x; var brY = collisionBox.y2 * tileToViewport + projectedPoint.point.y; if (!this.isInsideGrid(tlX, tlY, brX, brY) || (!allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate))) { return { box: [], offscreen: false }; } return { box: [tlX, tlY, brX, brY], offscreen: this.isOffscreen(tlX, tlY, brX, brY) }; }; CollisionIndex.prototype.approximateTileDistance = function approximateTileDistance (tileDistance , lastSegmentAngle , pixelsToTileUnits , cameraToAnchorDistance , pitchWithMap ) { // This is a quick and dirty solution for chosing which collision circles to use (since collision circles are // laid out in tile units). Ideally, I think we should generate collision circles on the fly in viewport coordinates // at the time we do collision detection. // See https://github.com/mapbox/mapbox-gl-js/issues/5474 // incidenceStretch is the ratio of how much y space a label takes up on a tile while drawn perpendicular to the viewport vs // how much space it would take up if it were drawn flat on the tile // Using law of sines, camera_to_anchor/sin(ground_angle) = camera_to_center/sin(incidence_angle) // Incidence angle 90 -> head on, sin(incidence_angle) = 1, no stretch // Incidence angle 1 -> very oblique, sin(incidence_angle) =~ 0, lots of stretch // ground_angle = u_pitch + PI/2 -> sin(ground_angle) = cos(u_pitch) // incidenceStretch = 1 / sin(incidenceAngle) var incidenceStretch = pitchWithMap ? 1 : cameraToAnchorDistance / this.pitchfactor; var lastSegmentTile = tileDistance.lastSegmentViewportDistance * pixelsToTileUnits; return tileDistance.prevTileDistance + lastSegmentTile + (incidenceStretch - 1) * lastSegmentTile * Math.abs(Math.sin(lastSegmentAngle)); }; CollisionIndex.prototype.placeCollisionCircles = function placeCollisionCircles (collisionCircles , allowOverlap , scale , textPixelRatio , symbol , lineVertexArray , glyphOffsetArray , fontSize , posMatrix , labelPlaneMatrix , showCollisionCircles , pitchWithMap , collisionGroupPredicate ) { var placedCollisionCircles = []; var projectedAnchor = this.projectAnchor(posMatrix, symbol.anchorX, symbol.anchorY); var projectionCache = {}; var fontScale = fontSize / 24; var lineOffsetX = symbol.lineOffsetX * fontSize; var lineOffsetY = symbol.lineOffsetY * fontSize; var tileUnitAnchorPoint = new symbol_layout.Point(symbol.anchorX, symbol.anchorY); // projection.project generates NDC coordinates, as opposed to the // pixel-based grid coordinates generated by this.projectPoint var labelPlaneAnchorPoint = project(tileUnitAnchorPoint, labelPlaneMatrix).point; var firstAndLastGlyph = placeFirstAndLastGlyph( fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, /*flip*/ false, labelPlaneAnchorPoint, tileUnitAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, /*return tile distance*/ true); var collisionDetected = false; var inGrid = false; var entirelyOffscreen = true; var tileToViewport = projectedAnchor.perspectiveRatio * textPixelRatio; // pixelsToTileUnits is used for translating line geometry to tile units // ... so we care about 'scale' but not 'perspectiveRatio' // equivalent to pixel_to_tile_units var pixelsToTileUnits = 1 / (textPixelRatio * scale); var firstTileDistance = 0, lastTileDistance = 0; if (firstAndLastGlyph) { firstTileDistance = this.approximateTileDistance(firstAndLastGlyph.first.tileDistance, firstAndLastGlyph.first.angle, pixelsToTileUnits, projectedAnchor.cameraDistance, pitchWithMap); lastTileDistance = this.approximateTileDistance(firstAndLastGlyph.last.tileDistance, firstAndLastGlyph.last.angle, pixelsToTileUnits, projectedAnchor.cameraDistance, pitchWithMap); } for (var k = 0; k < collisionCircles.length; k += 5) { var anchorPointX = collisionCircles[k]; var anchorPointY = collisionCircles[k + 1]; var tileUnitRadius = collisionCircles[k + 2]; var boxSignedDistanceFromAnchor = collisionCircles[k + 3]; if (!firstAndLastGlyph || (boxSignedDistanceFromAnchor < -firstTileDistance) || (boxSignedDistanceFromAnchor > lastTileDistance)) { // The label either doesn't fit on its line or we // don't need to use this circle because the label // doesn't extend this far. Either way, mark the circle unused. markCollisionCircleUsed(collisionCircles, k, false); continue; } var projectedPoint = this.projectPoint(posMatrix, anchorPointX, anchorPointY); var radius = tileUnitRadius * tileToViewport; var atLeastOneCirclePlaced = placedCollisionCircles.length > 0; if (atLeastOneCirclePlaced) { var dx = projectedPoint.x - placedCollisionCircles[placedCollisionCircles.length - 4]; var dy = projectedPoint.y - placedCollisionCircles[placedCollisionCircles.length - 3]; // The circle edges touch when the distance between their centers is 2x the radius // When the distance is 1x the radius, they're doubled up, and we could remove // every other circle while keeping them all in touch. // We actually start removing circles when the distance is √2x the radius: // thinning the number of circles as much as possible is a major performance win, // and the small gaps introduced don't make a very noticeable difference. var placedTooDensely = radius * radius * 2 > dx * dx + dy * dy; if (placedTooDensely) { var atLeastOneMoreCircle = (k + 8) < collisionCircles.length; if (atLeastOneMoreCircle) { var nextBoxDistanceToAnchor = collisionCircles[k + 8]; if ((nextBoxDistanceToAnchor > -firstTileDistance) && (nextBoxDistanceToAnchor < lastTileDistance)) { // Hide significantly overlapping circles, unless this is the last one we can // use, in which case we want to keep it in place even if it's tightly packed // with the one before it. markCollisionCircleUsed(collisionCircles, k, false); continue; } } } } var collisionBoxArrayIndex = k / 5; placedCollisionCircles.push(projectedPoint.x, projectedPoint.y, radius, collisionBoxArrayIndex); markCollisionCircleUsed(collisionCircles, k, true); var x1 = projectedPoint.x - radius; var y1 = projectedPoint.y - radius; var x2 = projectedPoint.x + radius; var y2 = projectedPoint.y + radius; entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2); inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2); if (!allowOverlap) { if (this.grid.hitTestCircle(projectedPoint.x, projectedPoint.y, radius, collisionGroupPredicate)) { if (!showCollisionCircles) { return { circles: [], offscreen: false }; } else { // Don't early exit if we're showing the debug circles because we still want to calculate // which circles are in use collisionDetected = true; } } } } return { circles: (collisionDetected || !inGrid) ? [] : placedCollisionCircles, offscreen: entirelyOffscreen }; }; /** * Because the geometries in the CollisionIndex are an approximation of the shape of * symbols on the map, we use the CollisionIndex to look up the symbol part of * `queryRenderedFeatures`. * * @private */ CollisionIndex.prototype.queryRenderedSymbols = function queryRenderedSymbols (viewportQueryGeometry ) { if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) { return {}; } var query = []; var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = viewportQueryGeometry; i < list.length; i += 1) { var point = list[i]; var gridPoint = new symbol_layout.Point(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); } var features = this.grid.query(minX, minY, maxX, maxY) .concat(this.ignoredGrid.query(minX, minY, maxX, maxY)); var seenFeatures = {}; var result = {}; for (var i$1 = 0, list$1 = features; i$1 < list$1.length; i$1 += 1) { var feature = list$1[i$1]; var 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. var bbox = [ new symbol_layout.Point(feature.x1, feature.y1), new symbol_layout.Point(feature.x2, feature.y1), new symbol_layout.Point(feature.x2, feature.y2), new symbol_layout.Point(feature.x1, feature.y2) ]; if (!symbol_layout.polygonIntersectsPolygon(query, bbox)) { continue; } seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true; if (result[featureKey.bucketInstanceId] === undefined) { result[featureKey.bucketInstanceId] = []; } result[featureKey.bucketInstanceId].push(featureKey.featureIndex); } return result; }; CollisionIndex.prototype.insertCollisionBox = function insertCollisionBox (collisionBox , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { var grid = ignorePlacement ? this.ignoredGrid : this.grid; var key = { bucketInstanceId: bucketInstanceId, featureIndex: featureIndex, collisionGroupID: collisionGroupID }; grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]); }; CollisionIndex.prototype.insertCollisionCircles = function insertCollisionCircles (collisionCircles , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { var grid = ignorePlacement ? this.ignoredGrid : this.grid; var key = { bucketInstanceId: bucketInstanceId, featureIndex: featureIndex, collisionGroupID: collisionGroupID }; for (var k = 0; k < collisionCircles.length; k += 4) { grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]); } }; CollisionIndex.prototype.projectAnchor = function projectAnchor (posMatrix , x , y ) { var p = [x, y, 0, 1]; xyTransformMat4(p, p, posMatrix); return { perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]), cameraDistance: p[3] }; }; CollisionIndex.prototype.projectPoint = function projectPoint (posMatrix , x , y ) { var p = [x, y, 0, 1]; xyTransformMat4(p, p, posMatrix); return new symbol_layout.Point( (((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding ); }; CollisionIndex.prototype.projectAndGetPerspectiveRatio = function projectAndGetPerspectiveRatio (posMatrix , x , y ) { var p = [x, y, 0, 1]; xyTransformMat4(p, p, posMatrix); var a = new symbol_layout.Point( (((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding ); return { point: a, // See perspective ratio comment in symbol_sdf.vertex // We're doing collision detection in viewport space so we need // to scale down boxes in the distance perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]) }; }; CollisionIndex.prototype.isOffscreen = function isOffscreen (x1 , y1 , x2 , y2 ) { return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary; }; CollisionIndex.prototype.isInsideGrid = function isInsideGrid (x1 , y1 , x2 , y2 ) { return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary; }; function markCollisionCircleUsed(collisionCircles , index , used ) { collisionCircles[index + 4] = used ? 1 : 0; } // /** * 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 * (symbol_layout.EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ))); } // var OpacityState = function OpacityState(prevState , increment , placed , skipFade ) { if (prevState) { this.opacity = Math.max(0, Math.min(1, prevState.opacity + (prevState.placed ? increment : -increment))); } else { this.opacity = (skipFade && placed) ? 1 : 0; } this.placed = placed; }; OpacityState.prototype.isHidden = function isHidden () { return this.opacity === 0 && !this.placed; }; var JointOpacityState = function JointOpacityState(prevState , increment , placedText , placedIcon , skipFade ) { this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade); this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade); }; JointOpacityState.prototype.isHidden = function isHidden () { return this.text.isHidden() && this.icon.isHidden(); }; var JointPlacement = function JointPlacement(text , icon , skipFade ) { this.text = text; this.icon = icon; this.skipFade = skipFade; }; var RetainedQueryData = function RetainedQueryData(bucketInstanceId , featureIndex , sourceLayerIndex , bucketIndex , tileID ) { this.bucketInstanceId = bucketInstanceId; this.featureIndex = featureIndex; this.sourceLayerIndex = sourceLayerIndex; this.bucketIndex = bucketIndex; this.tileID = tileID; }; var CollisionGroups = function CollisionGroups(crossSourceCollisions ) { this.crossSourceCollisions = crossSourceCollisions; this.maxGroupID = 0; this.collisionGroups = {}; }; CollisionGroups.prototype.get = function 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]) { var nextGroupID = ++this.maxGroupID; this.collisionGroups[sourceID] = { ID: nextGroupID, predicate: function (key) { return key.collisionGroupID === nextGroupID; } }; } return this.collisionGroups[sourceID]; } else { return { ID: 0, predicate: null }; } }; function calculateVariableLayoutOffset(anchor , width , height , radialOffset , textBoxScale ) { var ref = symbol_layout.getAnchorAlignment(anchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var shiftX = -(horizontalAlign - 0.5) * width; var shiftY = -(verticalAlign - 0.5) * height; var offset = symbol_layout.evaluateRadialOffset(anchor, radialOffset); return new symbol_layout.Point( shiftX + offset[0] * textBoxScale, shiftY + offset[1] * textBoxScale ); } function shiftVariableCollisionBox(collisionBox , shiftX , shiftY , rotateWithMap , pitchWithMap , angle ) { var x1 = collisionBox.x1; var x2 = collisionBox.x2; var y1 = collisionBox.y1; var y2 = collisionBox.y2; var anchorPointX = collisionBox.anchorPointX; var anchorPointY = collisionBox.anchorPointY; var rotatedOffset = new symbol_layout.Point(shiftX, shiftY); if (rotateWithMap) { rotatedOffset._rotate(pitchWithMap ? angle : -angle); } return { x1: x1 + rotatedOffset.x, y1: y1 + rotatedOffset.y, x2: x2 + rotatedOffset.x, y2: y2 + rotatedOffset.y, // symbol anchor point stays the same regardless of text-anchor anchorPointX: anchorPointX, anchorPointY: anchorPointY }; } var Placement = function Placement(transform , fadeDuration , crossSourceCollisions , prevPlacement ) { this.transform = transform.clone(); this.collisionIndex = new CollisionIndex(this.transform); this.placements = {}; this.opacities = {}; this.variableOffsets = {}; this.stale = false; this.commitTime = 0; this.fadeDuration = fadeDuration; this.retainedQueryData = {}; this.collisionGroups = new CollisionGroups(crossSourceCollisions); this.prevPlacement = prevPlacement; if (prevPlacement) { prevPlacement.prevPlacement = undefined; // Only hold on to one placement back } this.placedOrientations = {}; }; Placement.prototype.placeLayerTile = function placeLayerTile (styleLayer , tile , showCollisionBoxes , seenCrossTileIDs ) { var symbolBucket = ((tile.getBucket(styleLayer) ) ); var bucketFeatureIndex = tile.latestFeatureIndex; if (!symbolBucket || !bucketFeatureIndex || styleLayer.id !== symbolBucket.layerIds[0]) { return; } var collisionBoxArray = tile.collisionBoxArray; var layout = symbolBucket.layers[0].layout; var scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ); var textPixelRatio = tile.tileSize / symbol_layout.EXTENT; var posMatrix = this.transform.calculatePosMatrix(tile.tileID.toUnwrapped()); var textLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, layout.get('text-pitch-alignment') === 'map', layout.get('text-rotation-alignment') === 'map', this.transform, pixelsToTileUnits(tile, 1, this.transform.zoom)); var iconLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, layout.get('icon-pitch-alignment') === 'map', layout.get('icon-rotation-alignment') === 'map', this.transform, pixelsToTileUnits(tile, 1, this.transform.zoom)); // 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 ); this.placeLayerBucket(symbolBucket, posMatrix, textLabelPlaneMatrix, iconLabelPlaneMatrix, scale, textPixelRatio, showCollisionBoxes, tile.holdingForFade(), seenCrossTileIDs, collisionBoxArray); }; Placement.prototype.attemptAnchorPlacement = function attemptAnchorPlacement (anchor , textBox , width , height , radialTextOffset , textBoxScale , rotateWithMap , pitchWithMap , textPixelRatio , posMatrix , collisionGroup , textAllowOverlap , symbolInstance , bucket , orientation ) { var shift = calculateVariableLayoutOffset(anchor, width, height, radialTextOffset, textBoxScale); var placedGlyphBoxes = this.collisionIndex.placeCollisionBox( shiftVariableCollisionBox( textBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); if (placedGlyphBoxes.box.length > 0) { var 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; } symbol_layout.assert(symbolInstance.crossTileID !== 0); this.variableOffsets[symbolInstance.crossTileID] = { radialOffset: radialTextOffset, width: width, height: height, anchor: anchor, textBoxScale: textBoxScale, prevAnchor: prevAnchor }; this.markUsedJustification(bucket, anchor, symbolInstance, orientation); if (bucket.allowVerticalPlacement) { this.markUsedOrientation(bucket, orientation, symbolInstance); this.placedOrientations[symbolInstance.crossTileID] = orientation; } return placedGlyphBoxes; } }; Placement.prototype.placeLayerBucket = function placeLayerBucket (bucket , posMatrix , textLabelPlaneMatrix , iconLabelPlaneMatrix , scale , textPixelRatio , showCollisionBoxes , holdingForFade , seenCrossTileIDs , collisionBoxArray ) { var this$1 = this; var layout = bucket.layers[0].layout; var partiallyEvaluatedTextSize = symbol_layout.evaluateSizeForZoom(bucket.textSizeData, this.transform.zoom); var textOptional = layout.get('text-optional'); var iconOptional = layout.get('icon-optional'); var textAllowOverlap = layout.get('text-allow-overlap'); var iconAllowOverlap = layout.get('icon-allow-overlap'); // 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 var alwaysShowText = textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || iconOptional); var alwaysShowIcon = iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || textOptional); var collisionGroup = this.collisionGroups.get(bucket.sourceID); var rotateWithMap = layout.get('text-rotation-alignment') === 'map'; var pitchWithMap = layout.get('text-pitch-alignment') === 'map'; var zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y'; if (!bucket.collisionArrays && collisionBoxArray) { bucket.deserializeCollisionBoxes(collisionBoxArray); } var placeSymbol = function (symbolInstance , collisionArrays ) { 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$1.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false); return; } var placeText = false; var placeIcon = false; var offscreen = true; var placed = { box: null, offscreen: null }; var placedVertical = { box: null, offscreen: null }; var placedGlyphBoxes = null; var placedGlyphCircles = null; var placedIconBoxes = null; var textFeatureIndex = 0; var verticalTextFeatureIndex = 0; var iconFeatureIndex = 0; if (collisionArrays.textFeatureIndex) { textFeatureIndex = collisionArrays.textFeatureIndex; } if (collisionArrays.verticalTextFeatureIndex) { verticalTextFeatureIndex = collisionArrays.verticalTextFeatureIndex; } var textBox = collisionArrays.textBox; if (textBox) { var updatePreviousOrientationIfNotPlaced = function (isPlaced) { var previousOrientation = symbol_layout.WritingMode.horizontal; if (bucket.allowVerticalPlacement && !isPlaced && this$1.prevPlacement) { var prevPlacedOrientation = this$1.prevPlacement.placedOrientations[symbolInstance.crossTileID]; if (prevPlacedOrientation) { this$1.placedOrientations[symbolInstance.crossTileID] = prevPlacedOrientation; previousOrientation = prevPlacedOrientation; this$1.markUsedOrientation(bucket, previousOrientation, symbolInstance); } } return previousOrientation; }; var placeTextForPlacementModes = function (placeHorizontalFn, placeVerticalFn) { if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && collisionArrays.verticalTextBox) { for (var i = 0, list = bucket.writingModes; i < list.length; i += 1) { var placementMode = list[i]; if (placementMode === symbol_layout.WritingMode.vertical) { placed = placeVerticalFn(); placedVertical = placed; } else { placed = placeHorizontalFn(); } if (placed && placed.box && placed.box.length) { break; } } } else { placed = placeHorizontalFn(); } }; if (!layout.get('text-variable-anchor')) { var placeBox = function (collisionTextBox, orientation) { var placedFeature = this$1.collisionIndex.placeCollisionBox(collisionTextBox, layout.get('text-allow-overlap'), textPixelRatio, posMatrix, collisionGroup.predicate); if (placedFeature && placedFeature.box && placedFeature.box.length) { this$1.markUsedOrientation(bucket, orientation, symbolInstance); this$1.placedOrientations[symbolInstance.crossTileID] = orientation; } return placedFeature; }; var placeHorizontal = function () { return placeBox(textBox, symbol_layout.WritingMode.horizontal); }; var placeVertical = function () { var verticalTextBox = collisionArrays.verticalTextBox; if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { return placeBox(verticalTextBox, symbol_layout.WritingMode.vertical); } return { box: null, offscreen: null }; }; placeTextForPlacementModes(placeHorizontal, placeVertical); updatePreviousOrientationIfNotPlaced(placed && placed.box && placed.box.length); } else { var anchors = layout.get('text-variable-anchor'); // 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$1.prevPlacement && this$1.prevPlacement.variableOffsets[symbolInstance.crossTileID]) { var prevOffsets = this$1.prevPlacement.variableOffsets[symbolInstance.crossTileID]; if (anchors.indexOf(prevOffsets.anchor) > 0) { anchors = anchors.filter(function (anchor) { return anchor !== prevOffsets.anchor; }); anchors.unshift(prevOffsets.anchor); } } var placeBoxForVariableAnchors = function (collisionTextBox, orientation) { var width = collisionTextBox.x2 - collisionTextBox.x1; var height = collisionTextBox.y2 - collisionTextBox.y1; var textBoxScale = symbolInstance.textBoxScale; var placedBox = { box: [], offscreen: false }; var placementAttempts = textAllowOverlap ? anchors.length * 2 : anchors.length; for (var i = 0; i < placementAttempts; ++i) { var anchor = anchors[i % anchors.length]; var allowOverlap = (i >= anchors.length); placedBox = this$1.attemptAnchorPlacement( anchor, collisionTextBox, width, height, symbolInstance.radialTextOffset, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, allowOverlap, symbolInstance, bucket, orientation); if (placedBox && placedBox.box && placedBox.box.length) { placeText = true; break; } } return placedBox; }; var placeHorizontal$1 = function () { return placeBoxForVariableAnchors(textBox, symbol_layout.WritingMode.horizontal); }; var placeVertical$1 = function () { var verticalTextBox = collisionArrays.verticalTextBox; var wasPlaced = placed && placed.box && placed.box.length; if (bucket.allowVerticalPlacement && !wasPlaced && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { return placeBoxForVariableAnchors(verticalTextBox, symbol_layout.WritingMode.vertical); } return { box: null, offscreen: null }; }; placeTextForPlacementModes(placeHorizontal$1, placeVertical$1); if (placed) { placeText = placed.box; offscreen = placed.offscreen; } var prevOrientation = updatePreviousOrientationIfNotPlaced(placed && placed.box); // If we didn't get placed, we still need to copy our position from the last placement for // fade animations if (!placeText && this$1.prevPlacement) { var prevOffset = this$1.prevPlacement.variableOffsets[symbolInstance.crossTileID]; if (prevOffset) { this$1.variableOffsets[symbolInstance.crossTileID] = prevOffset; this$1.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, prevOrientation); } } } } placedGlyphBoxes = placed; placeText = placedGlyphBoxes && placedGlyphBoxes.box && placedGlyphBoxes.box.length > 0; offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen; var textCircles = collisionArrays.textCircles; if (textCircles) { var placedSymbol = bucket.text.placedSymbolArray.get(symbolInstance.centerJustifiedTextSymbolIndex); var fontSize = symbol_layout.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol); placedGlyphCircles = this$1.collisionIndex.placeCollisionCircles(textCircles, layout.get('text-allow-overlap'), scale, textPixelRatio, placedSymbol, bucket.lineVertexArray, bucket.glyphOffsetArray, fontSize, posMatrix, textLabelPlaneMatrix, showCollisionBoxes, pitchWithMap, collisionGroup.predicate); // If text-allow-overlap is set, force "placedCircles" to true // In theory there should always be at least one circle placed // in this case, but for now quirks in text-anchor // and text-offset may prevent that from being true. placeText = layout.get('text-allow-overlap') || placedGlyphCircles.circles.length > 0; offscreen = offscreen && placedGlyphCircles.offscreen; } if (collisionArrays.iconFeatureIndex) { iconFeatureIndex = collisionArrays.iconFeatureIndex; } if (collisionArrays.iconBox) { placedIconBoxes = this$1.collisionIndex.placeCollisionBox(collisionArrays.iconBox, layout.get('icon-allow-overlap'), textPixelRatio, posMatrix, collisionGroup.predicate); placeIcon = placedIconBoxes.box.length > 0; offscreen = offscreen && placedIconBoxes.offscreen; } var iconWithoutText = textOptional || (symbolInstance.numHorizontalGlyphVertices === 0 && symbolInstance.numVerticalGlyphVertices === 0); var textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0; // Combine the scales for icons and text. if (!iconWithoutText && !textWithoutIcon) { placeIcon = placeText = placeIcon && placeText; } else if (!textWithoutIcon) { placeText = placeIcon && placeText; } else if (!iconWithoutText) { placeIcon = placeIcon && placeText; } if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) { if (placedVertical && placedVertical.box && verticalTextFeatureIndex) { this$1.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID); } else { this$1.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); } } if (placeIcon && placedIconBoxes) { this$1.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'), bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID); } if (placeText && placedGlyphCircles) { this$1.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); } symbol_layout.assert(symbolInstance.crossTileID !== 0); symbol_layout.assert(bucket.bucketInstanceId !== 0); this$1.placements[symbolInstance.crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded); seenCrossTileIDs[symbolInstance.crossTileID] = true; }; if (zOrderByViewportY) { var symbolIndexes = bucket.getSortedSymbolIndexes(this.transform.angle); for (var i = symbolIndexes.length - 1; i >= 0; --i) { var symbolIndex = symbolIndexes[i]; placeSymbol(bucket.symbolInstances.get(symbolIndex), bucket.collisionArrays[symbolIndex]); } } else { for (var i$1 = 0; i$1 < bucket.symbolInstances.length; ++i$1) { placeSymbol(bucket.symbolInstances.get(i$1), bucket.collisionArrays[i$1]); } } bucket.justReloaded = false; }; Placement.prototype.markUsedJustification = function markUsedJustification (bucket , placedAnchor , symbolInstance , orientation ) { var justifications = { "left": symbolInstance.leftJustifiedTextSymbolIndex, "center": symbolInstance.centerJustifiedTextSymbolIndex, "right": symbolInstance.rightJustifiedTextSymbolIndex }; var autoIndex; if (orientation === symbol_layout.WritingMode.vertical) { autoIndex = symbolInstance.verticalPlacedTextSymbolIndex; } else { autoIndex = justifications[symbol_layout.getAnchorJustification(placedAnchor)]; } var indexes = [ symbolInstance.leftJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.rightJustifiedTextSymbolIndex, symbolInstance.verticalPlacedTextSymbolIndex ]; for (var i = 0, list = indexes; i < list.length; i += 1) { var index = list[i]; 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; } } } }; Placement.prototype.markUsedOrientation = function markUsedOrientation (bucket , orientation , symbolInstance ) { var horizontal = (orientation === symbol_layout.WritingMode.horizontal || orientation === symbol_layout.WritingMode.horizontalOnly) ? orientation : 0; var vertical = orientation === symbol_layout.WritingMode.vertical ? orientation : 0; var horizontalIndexes = [ symbolInstance.leftJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.rightJustifiedTextSymbolIndex ]; for (var i = 0, list = horizontalIndexes; i < list.length; i += 1) { var index = list[i]; bucket.text.placedSymbolArray.get(index).placedOrientation = horizontal; } if (symbolInstance.verticalPlacedTextSymbolIndex) { bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).placedOrientation = vertical; } }; Placement.prototype.commit = function commit (now ) { this.commitTime = now; var prevPlacement = this.prevPlacement; var placementChanged = false; var increment = (prevPlacement && this.fadeDuration !== 0) ? (this.commitTime - prevPlacement.commitTime) / this.fadeDuration : 1; var prevOpacities = prevPlacement ? prevPlacement.opacities : {}; var prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {}; var prevOrientations = prevPlacement ? prevPlacement.placedOrientations : {}; // add the opacities from the current placement, and copy their current values from the previous placement for (var crossTileID in this.placements) { var jointPlacement = this.placements[crossTileID]; var prevOpacity = prevOpacities[crossTileID]; if (prevOpacity) { this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon); 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); placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon; } } // copy and update values from the previous placement that aren't in the current placement but haven't finished fading for (var crossTileID$1 in prevOpacities) { var prevOpacity$1 = prevOpacities[crossTileID$1]; if (!this.opacities[crossTileID$1]) { var jointOpacity = new JointOpacityState(prevOpacity$1, increment, false, false); if (!jointOpacity.isHidden()) { this.opacities[crossTileID$1] = jointOpacity; placementChanged = placementChanged || prevOpacity$1.text.placed || prevOpacity$1.icon.placed; } } } for (var crossTileID$2 in prevOffsets) { if (!this.variableOffsets[crossTileID$2] && this.opacities[crossTileID$2] && !this.opacities[crossTileID$2].isHidden()) { this.variableOffsets[crossTileID$2] = prevOffsets[crossTileID$2]; } } for (var crossTileID$3 in prevOrientations) { if (!this.placedOrientations[crossTileID$3] && this.opacities[crossTileID$3] && !this.opacities[crossTileID$3].isHidden()) { this.placedOrientations[crossTileID$3] = prevOrientations[crossTileID$3]; } } // 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 symbol_layout.assert(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined); if (placementChanged) { this.lastPlacementChangeTime = now; } else if (typeof this.lastPlacementChangeTime !== 'number') { this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now; } }; Placement.prototype.updateLayerOpacities = function updateLayerOpacities (styleLayer , tiles ) { var seenCrossTileIDs = {}; for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var symbolBucket = ((tile.getBucket(styleLayer) ) ); if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) { this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray); } } }; Placement.prototype.updateBucketOpacities = function updateBucketOpacities (bucket , seenCrossTileIDs , collisionBoxArray ) { if (bucket.hasTextData()) { bucket.text.opacityVertexArray.clear(); } if (bucket.hasIconData()) { bucket.icon.opacityVertexArray.clear(); } if (bucket.hasCollisionBoxData()) { bucket.collisionBox.collisionVertexArray.clear(); } if (bucket.hasCollisionCircleData()) { bucket.collisionCircle.collisionVertexArray.clear(); } var layout = bucket.layers[0].layout; var duplicateOpacityState = new JointOpacityState(null, 0, false, false, true); var textAllowOverlap = layout.get('text-allow-overlap'); var iconAllowOverlap = layout.get('icon-allow-overlap'); var variablePlacement = layout.get('text-variable-anchor'); var rotateWithMap = layout.get('text-rotation-alignment') === 'map'; var pitchWithMap = layout.get('text-pitch-alignment') === 'map'; // 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 var defaultOpacityState = new JointOpacityState(null, 0, textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), true); if (!bucket.collisionArrays && collisionBoxArray && (bucket.hasCollisionBoxData() || bucket.hasCollisionCircleData())) { bucket.deserializeCollisionBoxes(collisionBoxArray); } for (var s = 0; s < bucket.symbolInstances.length; s++) { var symbolInstance = bucket.symbolInstances.get(s); var numHorizontalGlyphVertices = symbolInstance.numHorizontalGlyphVertices; var numVerticalGlyphVertices = symbolInstance.numVerticalGlyphVertices; var crossTileID = symbolInstance.crossTileID; var isDuplicate = seenCrossTileIDs[crossTileID]; var 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; } seenCrossTileIDs[crossTileID] = true; var hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0; var hasIcon = symbolInstance.numIconVertices > 0; if (hasText) { var packedOpacity = packOpacity(opacityState.text); // Vertical text fades in/out on collision the same way as corresponding // horizontal text. Switch between vertical/horizontal should be instantaneous var opacityEntryCount = (numHorizontalGlyphVertices + numVerticalGlyphVertices) / 4; for (var i = 0; i < opacityEntryCount; i++) { bucket.text.opacityVertexArray.emplaceBack(packedOpacity); } // 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. var symbolHidden = opacityState.text.isHidden() ? 1 : 0; var placedOrientation = this.placedOrientations[symbolInstance.crossTileID]; var verticalHidden = (placedOrientation === symbol_layout.WritingMode.horizontal || placedOrientation === symbol_layout.WritingMode.horizontalOnly) ? 1 : 0; var horizontalHidden = placedOrientation === symbol_layout.WritingMode.vertical ? 1 : 0; [ symbolInstance.rightJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.leftJustifiedTextSymbolIndex ].forEach(function (index) { if (index >= 0) { bucket.text.placedSymbolArray.get(index).hidden = symbolHidden || horizontalHidden; } }); if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).hidden = symbolHidden || verticalHidden; } var prevOffset = this.variableOffsets[symbolInstance.crossTileID]; if (prevOffset) { this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, placedOrientation); } var prevOrientation = this.placedOrientations[symbolInstance.crossTileID]; if (prevOrientation) { this.markUsedJustification(bucket, 'left', symbolInstance, prevOrientation); this.markUsedOrientation(bucket, prevOrientation, symbolInstance); } } if (hasIcon) { var packedOpacity$1 = packOpacity(opacityState.icon); for (var i$1 = 0; i$1 < symbolInstance.numIconVertices / 4; i$1++) { bucket.icon.opacityVertexArray.emplaceBack(packedOpacity$1); } bucket.icon.placedSymbolArray.get(s).hidden = (opacityState.icon.isHidden() ); } if (bucket.hasCollisionBoxData() || bucket.hasCollisionCircleData()) { var collisionArrays = bucket.collisionArrays[s]; if (collisionArrays) { if (collisionArrays.textBox) { var shift = new symbol_layout.Point(0, 0); var used = true; if (variablePlacement) { var 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 = calculateVariableLayoutOffset(variableOffset.anchor, variableOffset.width, variableOffset.height, variableOffset.radialOffset, variableOffset.textBoxScale); 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; } } updateCollisionVertices(bucket.collisionBox.collisionVertexArray, opacityState.text.placed, !used, shift.x, shift.y); } if (collisionArrays.iconBox) { updateCollisionVertices(bucket.collisionBox.collisionVertexArray, opacityState.icon.placed, false); } var textCircles = collisionArrays.textCircles; if (textCircles && bucket.hasCollisionCircleData()) { for (var k = 0; k < textCircles.length; k += 5) { var notUsed = isDuplicate || textCircles[k + 4] === 0; updateCollisionVertices(bucket.collisionCircle.collisionVertexArray, opacityState.text.placed, notUsed); } } } } } bucket.sortFeatures(this.transform.angle); if (this.retainedQueryData[bucket.bucketInstanceId]) { this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder; } if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) { bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray); } if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) { bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray); } if (bucket.hasCollisionBoxData() && bucket.collisionBox.collisionVertexBuffer) { bucket.collisionBox.collisionVertexBuffer.updateData(bucket.collisionBox.collisionVertexArray); } if (bucket.hasCollisionCircleData() && bucket.collisionCircle.collisionVertexBuffer) { bucket.collisionCircle.collisionVertexBuffer.updateData(bucket.collisionCircle.collisionVertexArray); } symbol_layout.assert(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4); symbol_layout.assert(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4); }; Placement.prototype.symbolFadeChange = function symbolFadeChange (now ) { return this.fadeDuration === 0 ? 1 : (now - this.commitTime) / this.fadeDuration; }; Placement.prototype.hasTransitions = function hasTransitions (now ) { return this.stale || now - this.lastPlacementChangeTime < this.fadeDuration; }; Placement.prototype.stillRecent = function stillRecent (now ) { return this.commitTime + this.fadeDuration > now; }; Placement.prototype.setStale = function setStale () { this.stale = true; }; 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); } // All four vertices for a glyph will have the same opacity state // So we pack the opacity into a uint8, and then repeat it four times // to make a single uint32 that we can upload for each glyph in the // label. var shift25 = Math.pow(2, 25); var shift24 = Math.pow(2, 24); var shift17 = Math.pow(2, 17); var shift16 = Math.pow(2, 16); var shift9 = Math.pow(2, 9); var shift8 = Math.pow(2, 8); var shift1 = Math.pow(2, 1); function packOpacity(opacityState ) { if (opacityState.opacity === 0 && !opacityState.placed) { return 0; } else if (opacityState.opacity === 1 && opacityState.placed) { return 4294967295; } var targetBit = opacityState.placed ? 1 : 0; var opacityBits = Math.floor(opacityState.opacity * 127); return opacityBits * shift25 + targetBit * shift24 + opacityBits * shift17 + targetBit * shift16 + opacityBits * shift9 + targetBit * shift8 + opacityBits * shift1 + targetBit; } // var LayerPlacement = function LayerPlacement() { this._currentTileIndex = 0; this._seenCrossTileIDs = {}; }; LayerPlacement.prototype.continuePlacement = function continuePlacement (tiles , placement , showCollisionBoxes , styleLayer , shouldPausePlacement ) { while (this._currentTileIndex < tiles.length) { var tile = tiles[this._currentTileIndex]; placement.placeLayerTile(styleLayer, tile, showCollisionBoxes, this._seenCrossTileIDs); this._currentTileIndex++; if (shouldPausePlacement()) { return true; } } }; var PauseablePlacement = function PauseablePlacement(transform , order , forceFullPlacement , showCollisionBoxes , fadeDuration , crossSourceCollisions , prevPlacement ) { this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement); this._currentPlacementIndex = order.length - 1; this._forceFullPlacement = forceFullPlacement; this._showCollisionBoxes = showCollisionBoxes; this._done = false; }; PauseablePlacement.prototype.isDone = function isDone () { return this._done; }; PauseablePlacement.prototype.continuePlacement = function continuePlacement (order , layers , layerTiles ) { var this$1 = this; var startTime = symbol_layout.browser.now(); var shouldPausePlacement = function () { var elapsedTime = symbol_layout.browser.now() - startTime; return this$1._forceFullPlacement ? false : elapsedTime > 2; }; while (this._currentPlacementIndex >= 0) { var layerId = order[this._currentPlacementIndex]; var layer = layers[layerId]; var placementZoom = this.placement.collisionIndex.transform.zoom; if (layer.type === 'symbol' && (!layer.minzoom || layer.minzoom <= placementZoom) && (!layer.maxzoom || layer.maxzoom > placementZoom)) { if (!this._inProgressLayer) { this._inProgressLayer = new LayerPlacement(); } var pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement); if (pausePlacement) { // We didn't finish placing all layers within 2ms, // but we can keep rendering with a partial placement // We'll resume here on the next frame return; } delete this._inProgressLayer; } this._currentPlacementIndex--; } this._done = true; }; PauseablePlacement.prototype.commit = function commit (now ) { this.placement.commit(now); return this.placement; }; // /* The CrossTileSymbolIndex generally works on the assumption that a conceptual "unique symbol" can be identified by the text of the label combined with the anchor point. The goal is to assign these conceptual "unique symbols" a shared crossTileID that can be used by Placement to keep fading opacity states consistent and to deduplicate labels. The CrossTileSymbolIndex indexes all the current symbol instances and their crossTileIDs. When a symbol bucket gets added or updated, the index assigns a crossTileID to each of it's symbol instances by either matching it with an existing id or assigning a new one. */ // Round anchor positions to roughly 4 pixel grid var roundingFactor = 512 / symbol_layout.EXTENT / 2; var TileLayerIndex = function TileLayerIndex(tileID , symbolInstances , bucketInstanceId ) { this.tileID = tileID; this.indexedSymbolInstances = {}; this.bucketInstanceId = bucketInstanceId; for (var i = 0; i < symbolInstances.length; i++) { var symbolInstance = symbolInstances.get(i); var 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) }); } }; // Converts the coordinates of the input symbol instance into coordinates that be can compared // against other symbols in this index. Coordinates are: // (1) world-based (so after conversion the source tile is irrelevant) // (2) converted to the z-scale of this TileLayerIndex // (3) down-sampled by "roundingFactor" from tile coordinate precision in order to be // more tolerant of small differences between tiles. TileLayerIndex.prototype.getScaledCoordinates = function getScaledCoordinates (symbolInstance , childTileID ) { var zDifference = childTileID.canonical.z - this.tileID.canonical.z; var scale = roundingFactor / Math.pow(2, zDifference); return { x: Math.floor((childTileID.canonical.x * symbol_layout.EXTENT + symbolInstance.anchorX) * scale), y: Math.floor((childTileID.canonical.y * symbol_layout.EXTENT + symbolInstance.anchorY) * scale) }; }; TileLayerIndex.prototype.findMatches = function findMatches (symbolInstances , newTileID , zoomCrossTileIDs ) { var tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z); for (var i = 0; i < symbolInstances.length; i++) { var symbolInstance = symbolInstances.get(i); if (symbolInstance.crossTileID) { // already has a match, skip continue; } var indexedInstances = this.indexedSymbolInstances[symbolInstance.key]; if (!indexedInstances) { // No symbol with this key in this bucket continue; } var scaledSymbolCoord = this.getScaledCoordinates(symbolInstance, newTileID); for (var i$1 = 0, list = indexedInstances; i$1 < list.length; i$1 += 1) { // Return any symbol with the same keys whose coordinates are within 1 // grid unit. (with a 4px grid, this covers a 12px by 12px area) var thisTileSymbol = list[i$1]; if (Math.abs(thisTileSymbol.coord.x - scaledSymbolCoord.x) <= tolerance && Math.abs(thisTileSymbol.coord.y - scaledSymbolCoord.y) <= tolerance && !zoomCrossTileIDs[thisTileSymbol.crossTileID]) { // Once we've marked ourselves duplicate against this parent symbol, // don't let any other symbols at the same zoom level duplicate against // the same parent (see issue #5993) zoomCrossTileIDs[thisTileSymbol.crossTileID] = true; symbolInstance.crossTileID = thisTileSymbol.crossTileID; break; } } } }; var CrossTileIDs = function CrossTileIDs() { this.maxCrossTileID = 0; }; CrossTileIDs.prototype.generate = function generate () { return ++this.maxCrossTileID; }; var CrossTileSymbolLayerIndex = function CrossTileSymbolLayerIndex() { this.indexes = {}; this.usedCrossTileIDs = {}; 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. */ CrossTileSymbolLayerIndex.prototype.handleWrapJump = function handleWrapJump (lng ) { var wrapDelta = Math.round((lng - this.lng) / 360); if (wrapDelta !== 0) { for (var zoom in this.indexes) { var zoomIndexes = this.indexes[zoom]; var newZoomIndex = {}; for (var key in zoomIndexes) { // change the tileID's wrap and add it to a new index var index = zoomIndexes[key]; index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta); newZoomIndex[index.tileID.key] = index; } this.indexes[zoom] = newZoomIndex; } } this.lng = lng; }; CrossTileSymbolLayerIndex.prototype.addBucket = function 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]); } } for (var i = 0; i < bucket.symbolInstances.length; i++) { var symbolInstance = bucket.symbolInstances.get(i); symbolInstance.crossTileID = 0; } if (!this.usedCrossTileIDs[tileID.overscaledZ]) { this.usedCrossTileIDs[tileID.overscaledZ] = {}; } var zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ]; for (var zoom in this.indexes) { var zoomIndexes = this.indexes[zoom]; if (Number(zoom) > tileID.overscaledZ) { for (var id in zoomIndexes) { var childIndex = zoomIndexes[id]; if (childIndex.tileID.isChildOf(tileID)) { childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } } else { var parentCoord = tileID.scaledTo(Number(zoom)); var parentIndex = zoomIndexes[parentCoord.key]; if (parentIndex) { parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } } for (var i$1 = 0; i$1 < bucket.symbolInstances.length; i$1++) { var symbolInstance$1 = bucket.symbolInstances.get(i$1); if (!symbolInstance$1.crossTileID) { // symbol did not match any known symbol, assign a new id symbolInstance$1.crossTileID = crossTileIDs.generate(); zoomCrossTileIDs[symbolInstance$1.crossTileID] = true; } } if (this.indexes[tileID.overscaledZ] === undefined) { this.indexes[tileID.overscaledZ] = {}; } this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId); return true; }; CrossTileSymbolLayerIndex.prototype.removeBucketCrossTileIDs = function removeBucketCrossTileIDs (zoom , removedBucket ) { for (var key in removedBucket.indexedSymbolInstances) { for (var i = 0, list = removedBucket.indexedSymbolInstances[(key )]; i < list.length; i += 1) { var symbolInstance = list[i]; delete this.usedCrossTileIDs[zoom][symbolInstance.crossTileID]; } } }; CrossTileSymbolLayerIndex.prototype.removeStaleBuckets = function removeStaleBuckets (currentIDs ) { var tilesChanged = false; for (var z in this.indexes) { var zoomIndexes = this.indexes[z]; for (var tileKey in zoomIndexes) { if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) { this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]); delete zoomIndexes[tileKey]; tilesChanged = true; } } } return tilesChanged; }; var CrossTileSymbolIndex = function CrossTileSymbolIndex() { this.layerIndexes = {}; this.crossTileIDs = new CrossTileIDs(); this.maxBucketInstanceId = 0; this.bucketsInCurrentPlacement = {}; }; CrossTileSymbolIndex.prototype.addLayer = function addLayer (styleLayer , tiles , lng ) { var layerIndex = this.layerIndexes[styleLayer.id]; if (layerIndex === undefined) { layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex(); } var symbolBucketsChanged = false; var currentBucketIDs = {}; layerIndex.handleWrapJump(lng); for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var 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; } if (layerIndex.removeStaleBuckets(currentBucketIDs)) { symbolBucketsChanged = true; } return symbolBucketsChanged; }; CrossTileSymbolIndex.prototype.pruneUnusedLayers = function pruneUnusedLayers (usedLayers ) { var usedLayerMap = {}; usedLayers.forEach(function (usedLayer) { usedLayerMap[usedLayer] = true; }); for (var layerId in this.layerIndexes) { if (!usedLayerMap[layerId]) { delete this.layerIndexes[layerId]; } } }; // // 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): var emitValidationErrors = function (evented , errors ) { return symbol_layout.emitValidationErrors(evented, errors && errors.filter(function (error) { return error.identifier !== 'source.canvas'; })); }; var supportedDiffOperations = symbol_layout.pick(operations, [ 'addLayer', 'removeLayer', 'setPaintProperty', 'setLayoutProperty', 'setFilter', 'addSource', 'removeSource', 'setLayerZoomRange', 'setLight', 'setTransition', 'setGeoJSONSourceData' ]); var ignoredDiffOperations = symbol_layout.pick(operations, [ 'setCenter', 'setZoom', 'setBearing', 'setPitch' ]); /** * @private */ var Style = /*@__PURE__*/(function (Evented) { function Style(map , options) { var this$1 = this; if ( options === void 0 ) options = {}; Evented.call(this); this.map = map; this.dispatcher = new Dispatcher(getGlobalWorkerPool(), this); this.imageManager = new ImageManager(); this.imageManager.setEventedParent(this); this.glyphManager = new GlyphManager(map._requestManager, options.localIdeographFontFamily); this.lineAtlas = new LineAtlas(256, 512); this.crossTileSymbolIndex = new CrossTileSymbolIndex(); this._layers = {}; this._order = []; this.sourceCaches = {}; this.zoomHistory = new symbol_layout.ZoomHistory(); this._loaded = false; this._resetUpdates(); this.dispatcher.broadcast('setReferrer', symbol_layout.getReferrer()); var self = this; this._rtlTextPluginCallback = Style.registerForPluginAvailability(function (args) { self.dispatcher.broadcast('loadRTLTextPlugin', args.pluginURL, args.completionCallback); for (var id in self.sourceCaches) { self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load } }); this.on('data', function (event) { if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') { return; } var sourceCache = this$1.sourceCaches[event.sourceId]; if (!sourceCache) { return; } var source = sourceCache.getSource(); if (!source || !source.vectorLayerIds) { return; } for (var layerId in this$1._layers) { var layer = this$1._layers[layerId]; if (layer.source === source.id) { this$1._validateLayer(layer); } } }); } if ( Evented ) Style.__proto__ = Evented; Style.prototype = Object.create( Evented && Evented.prototype ); Style.prototype.constructor = Style; Style.prototype.loadURL = function loadURL (url , options) { var this$1 = this; if ( options === void 0 ) options = {}; this.fire(new symbol_layout.Event('dataloading', {dataType: 'style'})); var validate = typeof options.validate === 'boolean' ? options.validate : !symbol_layout.isMapboxURL(url); url = this.map._requestManager.normalizeStyleURL(url, options.accessToken); var request = this.map._requestManager.transformRequest(url, symbol_layout.ResourceType.Style); this._request = symbol_layout.getJSON(request, function (error , json ) { this$1._request = null; if (error) { this$1.fire(new symbol_layout.ErrorEvent(error)); } else if (json) { this$1._load(json, validate); } }); }; Style.prototype.loadJSON = function loadJSON (json , options) { var this$1 = this; if ( options === void 0 ) options = {}; this.fire(new symbol_layout.Event('dataloading', {dataType: 'style'})); this._request = symbol_layout.browser.frame(function () { this$1._request = null; this$1._load(json, options.validate !== false); }); }; Style.prototype._load = function _load (json , validate ) { var this$1 = this; if (validate && emitValidationErrors(this, symbol_layout.validateStyle(json))) { return; } this._loaded = true; this.stylesheet = json; for (var id in json.sources) { this.addSource(id, json.sources[id], {validate: false}); } if (json.sprite) { this._spriteRequest = loadSprite(json.sprite, this.map._requestManager, function (err, images) { this$1._spriteRequest = null; if (err) { this$1.fire(new symbol_layout.ErrorEvent(err)); } else if (images) { for (var id in images) { this$1.imageManager.addImage(id, images[id]); } } this$1.imageManager.setLoaded(true); this$1.fire(new symbol_layout.Event('data', {dataType: 'style'})); }); } else { this.imageManager.setLoaded(true); } this.glyphManager.setURL(json.glyphs); var layers = derefLayers(this.stylesheet.layers); this._order = layers.map(function (layer) { return layer.id; }); this._layers = {}; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; layer = symbol_layout.createStyleLayer(layer); layer.setEventedParent(this, {layer: {id: layer.id}}); this._layers[layer.id] = layer; } this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order)); this.light = new Light(this.stylesheet.light); this.fire(new symbol_layout.Event('data', {dataType: 'style'})); this.fire(new symbol_layout.Event('style.load')); }; Style.prototype._validateLayer = function _validateLayer (layer ) { var sourceCache = this.sourceCaches[layer.source]; if (!sourceCache) { return; } var sourceLayer = layer.sourceLayer; if (!sourceLayer) { return; } var source = sourceCache.getSource(); if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) { this.fire(new symbol_layout.ErrorEvent(new Error( "Source layer \"" + sourceLayer + "\" " + "does not exist on source \"" + (source.id) + "\" " + "as specified by style layer \"" + (layer.id) + "\"" ))); } }; Style.prototype.loaded = function loaded () { if (!this._loaded) { return false; } if (Object.keys(this._updatedSources).length) { return false; } for (var id in this.sourceCaches) { if (!this.sourceCaches[id].loaded()) { return false; } } if (!this.imageManager.isLoaded()) { return false; } return true; }; Style.prototype._serializeLayers = function _serializeLayers (ids ) { var serializedLayers = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var layer = this._layers[id]; if (layer.type !== 'custom') { serializedLayers.push(layer.serialize()); } } return serializedLayers; }; Style.prototype.hasTransitions = function hasTransitions () { if (this.light && this.light.hasTransition()) { return true; } for (var id in this.sourceCaches) { if (this.sourceCaches[id].hasTransition()) { return true; } } for (var id$1 in this._layers) { if (this._layers[id$1].hasTransition()) { return true; } } return false; }; Style.prototype._checkLoaded = function _checkLoaded () { if (!this._loaded) { throw new Error('Style is not done loading'); } }; /** * Apply queued style updates in a batch and recalculate zoom-dependent paint properties. */ Style.prototype.update = function update (parameters ) { if (!this._loaded) { return; } var changed = this._changed; if (this._changed) { var updatedIds = Object.keys(this._updatedLayers); var removedIds = Object.keys(this._removedLayers); if (updatedIds.length || removedIds.length) { this._updateWorkerLayers(updatedIds, removedIds); } for (var id in this._updatedSources) { var action = this._updatedSources[id]; symbol_layout.assert(action === 'reload' || action === 'clear'); if (action === 'reload') { this._reloadSource(id); } else if (action === 'clear') { this._clearSource(id); } } for (var id$1 in this._updatedPaintProps) { this._layers[id$1].updateTransitions(parameters); } this.light.updateTransitions(parameters); this._resetUpdates(); } for (var sourceId in this.sourceCaches) { this.sourceCaches[sourceId].used = false; } for (var i = 0, list = this._order; i < list.length; i += 1) { var layerId = list[i]; var layer = this._layers[layerId]; layer.recalculate(parameters); if (!layer.isHidden(parameters.zoom) && layer.source) { this.sourceCaches[layer.source].used = true; } } this.light.recalculate(parameters); this.z = parameters.zoom; if (changed) { this.fire(new symbol_layout.Event('data', {dataType: 'style'})); } }; Style.prototype._updateWorkerLayers = function _updateWorkerLayers (updatedIds , removedIds ) { this.dispatcher.broadcast('updateLayers', { layers: this._serializeLayers(updatedIds), removedIds: removedIds }); }; Style.prototype._resetUpdates = function _resetUpdates () { this._changed = false; this._updatedLayers = {}; this._removedLayers = {}; this._updatedSources = {}; this._updatedPaintProps = {}; }; /** * Update this style's state to match the given style JSON, performing only * the necessary mutations. * * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec * diff algorithm produces an operation that is not supported. * * @returns {boolean} true if any changes were made; false otherwise * @private */ Style.prototype.setState = function setState (nextState ) { var this$1 = this; this._checkLoaded(); if (emitValidationErrors(this, symbol_layout.validateStyle(nextState))) { return false; } nextState = symbol_layout.clone$1(nextState); nextState.layers = derefLayers(nextState.layers); var changes = diffStyles(this.serialize(), nextState) .filter(function (op) { return !(op.command in ignoredDiffOperations); }); if (changes.length === 0) { return false; } var unimplementedOps = changes.filter(function (op) { return !(op.command in supportedDiffOperations); }); if (unimplementedOps.length > 0) { throw new Error(("Unimplemented: " + (unimplementedOps.map(function (op) { return op.command; }).join(', ')) + ".")); } changes.forEach(function (op) { if (op.command === 'setTransition') { // `transition` is always read directly off of // `this.stylesheet`, which we update below return; } (this$1 )[op.command].apply(this$1, op.args); }); this.stylesheet = nextState; return true; }; Style.prototype.addImage = function addImage (id , image ) { if (this.getImage(id)) { return this.fire(new symbol_layout.ErrorEvent(new Error('An image with this name already exists.'))); } this.imageManager.addImage(id, image); this.fire(new symbol_layout.Event('data', {dataType: 'style'})); }; Style.prototype.updateImage = function updateImage (id , image ) { this.imageManager.updateImage(id, image); }; Style.prototype.getImage = function getImage (id ) { return this.imageManager.getImage(id); }; Style.prototype.removeImage = function removeImage (id ) { if (!this.getImage(id)) { return this.fire(new symbol_layout.ErrorEvent(new Error('No image with this name exists.'))); } this.imageManager.removeImage(id); this.fire(new symbol_layout.Event('data', {dataType: 'style'})); }; Style.prototype.listImages = function listImages () { this._checkLoaded(); return this.imageManager.listImages(); }; Style.prototype.addSource = function addSource (id , source , options) { var this$1 = this; if ( options === void 0 ) options = {}; this._checkLoaded(); if (this.sourceCaches[id] !== undefined) { throw new Error('There is already a source with this ID'); } if (!source.type) { throw new Error(("The type property must be defined, but the only the following properties were given: " + (Object.keys(source).join(', ')) + ".")); } var builtIns = ['vector', 'raster', 'geojson', 'video', 'image']; var shouldValidate = builtIns.indexOf(source.type) >= 0; if (shouldValidate && this._validate(symbol_layout.validateStyle.source, ("sources." + id), source, null, options)) { return; } if (this.map && this.map._collectResourceTiming) { (source ).collectResourceTiming = true; } var sourceCache = this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher); sourceCache.style = this; sourceCache.setEventedParent(this, function () { return ({ isSourceLoaded: this$1.loaded(), source: sourceCache.serialize(), sourceId: id }); }); sourceCache.onAdd(this.map); this._changed = true; }; /** * Remove a source from this stylesheet, given its id. * @param {string} id id of the source to remove * @throws {Error} if no source is found with the given ID */ Style.prototype.removeSource = function removeSource (id ) { this._checkLoaded(); if (this.sourceCaches[id] === undefined) { throw new Error('There is no source with this ID'); } for (var layerId in this._layers) { if (this._layers[layerId].source === id) { return this.fire(new symbol_layout.ErrorEvent(new Error(("Source \"" + id + "\" cannot be removed while layer \"" + layerId + "\" is using it.")))); } } var sourceCache = this.sourceCaches[id]; delete this.sourceCaches[id]; delete this._updatedSources[id]; sourceCache.fire(new symbol_layout.Event('data', {sourceDataType: 'metadata', dataType:'source', sourceId: id})); sourceCache.setEventedParent(null); sourceCache.clearTiles(); if (sourceCache.onRemove) { sourceCache.onRemove(this.map); } this._changed = true; }; /** * Set the data of a GeoJSON source, given its id. * @param {string} id id of the source * @param {GeoJSON|string} data GeoJSON source */ Style.prototype.setGeoJSONSourceData = function setGeoJSONSourceData (id , data ) { this._checkLoaded(); symbol_layout.assert(this.sourceCaches[id] !== undefined, 'There is no source with this ID'); var geojsonSource = (this.sourceCaches[id].getSource() ); symbol_layout.assert(geojsonSource.type === 'geojson'); geojsonSource.setData(data); this._changed = true; }; /** * Get a source by id. * @param {string} id id of the desired source * @returns {Object} source */ Style.prototype.getSource = function getSource (id ) { return this.sourceCaches[id] && this.sourceCaches[id].getSource(); }; /** * Add a layer to the map style. The layer will be inserted before the layer with * ID `before`, or appended if `before` is omitted. * @param {string} [before] ID of an existing layer to insert before */ Style.prototype.addLayer = function addLayer (layerObject , before , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var id = layerObject.id; if (this.getLayer(id)) { this.fire(new symbol_layout.ErrorEvent(new Error(("Layer with id \"" + id + "\" already exists on this map")))); return; } var layer; if (layerObject.type === 'custom') { if (emitValidationErrors(this, symbol_layout.validateCustomStyleLayer(layerObject))) { return; } layer = symbol_layout.createStyleLayer(layerObject); } else { if (typeof layerObject.source === 'object') { this.addSource(id, layerObject.source); layerObject = symbol_layout.clone$1(layerObject); layerObject = (symbol_layout.extend(layerObject, {source: id}) ); } // this layer is not in the style.layers array, so we pass an impossible array index if (this._validate(symbol_layout.validateStyle.layer, ("layers." + id), layerObject, {arrayIndex: -1}, options)) { return; } layer = symbol_layout.createStyleLayer(layerObject); this._validateLayer(layer); layer.setEventedParent(this, {layer: {id: id}}); } var index = before ? this._order.indexOf(before) : this._order.length; if (before && index === -1) { this.fire(new symbol_layout.ErrorEvent(new Error(("Layer with id \"" + before + "\" does not exist on this map.")))); return; } this._order.splice(index, 0, id); this._layerOrderChanged = true; this._layers[id] = layer; if (this._removedLayers[id] && layer.source && 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 var removed = this._removedLayers[id]; delete this._removedLayers[id]; if (removed.type !== layer.type) { this._updatedSources[layer.source] = 'clear'; } else { this._updatedSources[layer.source] = 'reload'; this.sourceCaches[layer.source].pause(); } } this._updateLayer(layer); if (layer.onAdd) { layer.onAdd(this.map); } }; /** * Moves a layer to a different z-position. The layer will be inserted before the layer with * ID `before`, or appended if `before` is omitted. * @param {string} id ID of the layer to move * @param {string} [before] ID of an existing layer to insert before */ Style.prototype.moveLayer = function moveLayer (id , before ) { this._checkLoaded(); this._changed = true; var layer = this._layers[id]; if (!layer) { this.fire(new symbol_layout.ErrorEvent(new Error(("The layer '" + id + "' does not exist in the map's style and cannot be moved.")))); return; } if (id === before) { return; } var index = this._order.indexOf(id); this._order.splice(index, 1); var newIndex = before ? this._order.indexOf(before) : this._order.length; if (before && newIndex === -1) { this.fire(new symbol_layout.ErrorEvent(new Error(("Layer with id \"" + before + "\" does not exist on this map.")))); return; } this._order.splice(newIndex, 0, id); this._layerOrderChanged = true; }; /** * Remove the layer with the given id from the style. * * If no such layer exists, an `error` event is fired. * * @param {string} id id of the layer to remove * @fires error */ Style.prototype.removeLayer = function removeLayer (id ) { this._checkLoaded(); var layer = this._layers[id]; if (!layer) { this.fire(new symbol_layout.ErrorEvent(new Error(("The layer '" + id + "' does not exist in the map's style and cannot be removed.")))); return; } layer.setEventedParent(null); var index = this._order.indexOf(id); this._order.splice(index, 1); this._layerOrderChanged = true; this._changed = true; this._removedLayers[id] = layer; delete this._layers[id]; delete this._updatedLayers[id]; delete this._updatedPaintProps[id]; if (layer.onRemove) { layer.onRemove(this.map); } }; /** * Return the style layer object with the given `id`. * * @param {string} id - id of the desired layer * @returns {?Object} a layer, if one with the given `id` exists */ Style.prototype.getLayer = function getLayer (id ) { return this._layers[id]; }; Style.prototype.setLayerZoomRange = function setLayerZoomRange (layerId , minzoom , maxzoom ) { this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new symbol_layout.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot have zoom extent.")))); return; } if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) { return; } if (minzoom != null) { layer.minzoom = minzoom; } if (maxzoom != null) { layer.maxzoom = maxzoom; } this._updateLayer(layer); }; Style.prototype.setFilter = function setFilter (layerId , filter , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new symbol_layout.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be filtered.")))); return; } if (symbol_layout.deepEqual(layer.filter, filter)) { return; } if (filter === null || filter === undefined) { layer.filter = undefined; this._updateLayer(layer); return; } if (this._validate(symbol_layout.validateStyle.filter, ("layers." + (layer.id) + ".filter"), filter, null, options)) { return; } layer.filter = symbol_layout.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 */ Style.prototype.getFilter = function getFilter (layer ) { return symbol_layout.clone$1(this.getLayer(layer).filter); }; Style.prototype.setLayoutProperty = function setLayoutProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new symbol_layout.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be styled.")))); return; } if (symbol_layout.deepEqual(layer.getLayoutProperty(name), value)) { return; } layer.setLayoutProperty(name, value, options); this._updateLayer(layer); }; /** * 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 */ Style.prototype.getLayoutProperty = function getLayoutProperty (layerId , name ) { var layer = this.getLayer(layerId); if (!layer) { this.fire(new symbol_layout.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style.")))); return; } return layer.getLayoutProperty(name); }; Style.prototype.setPaintProperty = function setPaintProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new symbol_layout.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be styled.")))); return; } if (symbol_layout.deepEqual(layer.getPaintProperty(name), value)) { return; } var requiresRelayout = layer.setPaintProperty(name, value, options); if (requiresRelayout) { this._updateLayer(layer); } this._changed = true; this._updatedPaintProps[layerId] = true; }; Style.prototype.getPaintProperty = function getPaintProperty (layer , name ) { return this.getLayer(layer).getPaintProperty(name); }; Style.prototype.setFeatureState = function setFeatureState (feature , state ) { this._checkLoaded(); var sourceId = feature.source; var sourceLayer = feature.sourceLayer; var sourceCache = this.sourceCaches[sourceId]; var featureId = parseInt(feature.id, 10); if (sourceCache === undefined) { this.fire(new symbol_layout.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; if (sourceType === 'geojson' && sourceLayer) { this.fire(new symbol_layout.ErrorEvent(new Error("GeoJSON sources cannot have a sourceLayer parameter."))); return; } if (sourceType === 'vector' && !sourceLayer) { this.fire(new symbol_layout.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (isNaN(featureId) || featureId < 0) { this.fire(new symbol_layout.ErrorEvent(new Error("The feature id parameter must be provided and non-negative."))); return; } sourceCache.setFeatureState(sourceLayer, featureId, state); }; Style.prototype.removeFeatureState = function removeFeatureState (target , key ) { this._checkLoaded(); var sourceId = target.source; var sourceCache = this.sourceCaches[sourceId]; if (sourceCache === undefined) { this.fire(new symbol_layout.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; var sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined; var featureId = parseInt(target.id, 10); if (sourceType === 'vector' && !sourceLayer) { this.fire(new symbol_layout.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (target.id !== undefined && isNaN(featureId) || featureId < 0) { this.fire(new symbol_layout.ErrorEvent(new Error("The feature id parameter must be non-negative."))); return; } if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) { this.fire(new symbol_layout.ErrorEvent(new Error("A feature id is requred to remove its specific state property."))); return; } sourceCache.removeFeatureState(sourceLayer, featureId, key); }; Style.prototype.getFeatureState = function getFeatureState (feature ) { this._checkLoaded(); var sourceId = feature.source; var sourceLayer = feature.sourceLayer; var sourceCache = this.sourceCaches[sourceId]; var featureId = parseInt(feature.id, 10); if (sourceCache === undefined) { this.fire(new symbol_layout.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; if (sourceType === 'vector' && !sourceLayer) { this.fire(new symbol_layout.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (isNaN(featureId) || featureId < 0) { this.fire(new symbol_layout.ErrorEvent(new Error("The feature id parameter must be provided and non-negative."))); return; } return sourceCache.getFeatureState(sourceLayer, featureId); }; Style.prototype.getTransition = function getTransition () { return symbol_layout.extend({ duration: 300, delay: 0 }, this.stylesheet && this.stylesheet.transition); }; Style.prototype.serialize = function serialize () { return symbol_layout.filterObject({ version: this.stylesheet.version, name: this.stylesheet.name, metadata: this.stylesheet.metadata, light: this.stylesheet.light, center: this.stylesheet.center, zoom: this.stylesheet.zoom, bearing: this.stylesheet.bearing, pitch: this.stylesheet.pitch, sprite: this.stylesheet.sprite, glyphs: this.stylesheet.glyphs, transition: this.stylesheet.transition, sources: symbol_layout.mapObject(this.sourceCaches, function (source) { return source.serialize(); }), layers: this._serializeLayers(this._order) }, function (value) { return value !== undefined; }); }; Style.prototype._updateLayer = function _updateLayer (layer ) { this._updatedLayers[layer.id] = true; if (layer.source && !this._updatedSources[layer.source]) { this._updatedSources[layer.source] = 'reload'; this.sourceCaches[layer.source].pause(); } this._changed = true; }; Style.prototype._flattenAndSortRenderedFeatures = function _flattenAndSortRenderedFeatures (sourceResults ) { var this$1 = this; // 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. var isLayer3D = function (layerId) { return this$1._layers[layerId].type === 'fill-extrusion'; }; var layerIndex = {}; var features3D = []; for (var l = this._order.length - 1; l >= 0; l--) { var layerId = this._order[l]; if (isLayer3D(layerId)) { layerIndex[layerId] = l; for (var i$2 = 0, list$1 = sourceResults; i$2 < list$1.length; i$2 += 1) { var sourceResult = list$1[i$2]; var layerFeatures = sourceResult[layerId]; if (layerFeatures) { for (var i$1 = 0, list = layerFeatures; i$1 < list.length; i$1 += 1) { var featureWrapper = list[i$1]; features3D.push(featureWrapper); } } } } } features3D.sort(function (a, b) { return b.intersectionZ - a.intersectionZ; }); var features = []; for (var l$1 = this._order.length - 1; l$1 >= 0; l$1--) { var layerId$1 = this._order[l$1]; if (isLayer3D(layerId$1)) { // add all 3D features that are in or above the current layer for (var i = features3D.length - 1; i >= 0; i--) { var topmost3D = features3D[i].feature; if (layerIndex[topmost3D.layer.id] < l$1) { break; } features.push(topmost3D); features3D.pop(); } } else { for (var i$4 = 0, list$3 = sourceResults; i$4 < list$3.length; i$4 += 1) { var sourceResult$1 = list$3[i$4]; var layerFeatures$1 = sourceResult$1[layerId$1]; if (layerFeatures$1) { for (var i$3 = 0, list$2 = layerFeatures$1; i$3 < list$2.length; i$3 += 1) { var featureWrapper$1 = list$2[i$3]; features.push(featureWrapper$1.feature); } } } } } return features; }; Style.prototype.queryRenderedFeatures = function queryRenderedFeatures$1 (queryGeometry , params , transform ) { if (params && params.filter) { this._validate(symbol_layout.validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, null, params); } var includedSources = {}; if (params && params.layers) { if (!Array.isArray(params.layers)) { this.fire(new symbol_layout.ErrorEvent(new Error('parameters.layers must be an Array.'))); return []; } for (var i = 0, list = params.layers; i < list.length; i += 1) { var layerId = list[i]; var layer = this._layers[layerId]; if (!layer) { // this layer is not in the style.layers array this.fire(new symbol_layout.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; } } var sourceResults = []; for (var id in this.sourceCaches) { if (params.layers && !includedSources[id]) { continue; } sourceResults.push( queryRenderedFeatures( this.sourceCaches[id], this._layers, queryGeometry, params, transform) ); } 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.sourceCaches, queryGeometry, params, this.placement.collisionIndex, this.placement.retainedQueryData) ); } return this._flattenAndSortRenderedFeatures(sourceResults); }; Style.prototype.querySourceFeatures = function querySourceFeatures$1 (sourceID , params ) { if (params && params.filter) { this._validate(symbol_layout.validateStyle.filter, 'querySourceFeatures.filter', params.filter, null, params); } var sourceCache = this.sourceCaches[sourceID]; return sourceCache ? querySourceFeatures(sourceCache, params) : []; }; Style.prototype.addSourceType = function addSourceType (name , SourceType , callback ) { if (Style.getSourceType(name)) { return callback(new Error(("A source type called \"" + name + "\" already exists."))); } Style.setSourceType(name, SourceType); if (!SourceType.workerSourceURL) { return callback(null, null); } this.dispatcher.broadcast('loadWorkerSource', { name: name, url: SourceType.workerSourceURL }, callback); }; Style.prototype.getLight = function getLight () { return this.light.getLight(); }; Style.prototype.setLight = function setLight (lightOptions , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var light = this.light.getLight(); var _update = false; for (var key in lightOptions) { if (!symbol_layout.deepEqual(lightOptions[key], light[key])) { _update = true; break; } } if (!_update) { return; } var parameters = { now: symbol_layout.browser.now(), transition: symbol_layout.extend({ duration: 300, delay: 0 }, this.stylesheet.transition) }; this.light.setLight(lightOptions, options); this.light.updateTransitions(parameters); }; Style.prototype._validate = function _validate (validate , key , value , props , options) { if ( options === void 0 ) options = {}; if (options && options.validate === false) { return false; } return emitValidationErrors(this, validate.call(symbol_layout.validateStyle, symbol_layout.extend({ key: key, style: this.serialize(), value: value, styleSpec: symbol_layout.styleSpec }, props))); }; Style.prototype._remove = function _remove () { if (this._request) { this._request.cancel(); this._request = null; } if (this._spriteRequest) { this._spriteRequest.cancel(); this._spriteRequest = null; } symbol_layout.evented.off('pluginAvailable', this._rtlTextPluginCallback); for (var id in this.sourceCaches) { this.sourceCaches[id].clearTiles(); } this.dispatcher.remove(); }; Style.prototype._clearSource = function _clearSource (id ) { this.sourceCaches[id].clearTiles(); }; Style.prototype._reloadSource = function _reloadSource (id ) { this.sourceCaches[id].resume(); this.sourceCaches[id].reload(); }; Style.prototype._updateSources = function _updateSources (transform ) { for (var id in this.sourceCaches) { this.sourceCaches[id].update(transform); } }; Style.prototype._generateCollisionBoxes = function _generateCollisionBoxes () { for (var id in this.sourceCaches) { this._reloadSource(id); } }; Style.prototype._updatePlacement = function _updatePlacement (transform , showCollisionBoxes , fadeDuration , crossSourceCollisions ) { var symbolBucketsChanged = false; var placementCommitted = false; var layerTiles = {}; for (var i = 0, list = this._order; i < list.length; i += 1) { var layerID = list[i]; var styleLayer = this._layers[layerID]; if (styleLayer.type !== 'symbol') { continue; } if (!layerTiles[styleLayer.source]) { var sourceCache = this.sourceCaches[styleLayer.source]; layerTiles[styleLayer.source] = sourceCache.getRenderableIds(true) .map(function (id) { return sourceCache.getTileByID(id); }) .sort(function (a, b) { return (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1); }); } var layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform.center.lng); 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 var forceFullPlacement = this._layerOrderChanged || fadeDuration === 0; if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(symbol_layout.browser.now()))) { this.pauseablePlacement = new PauseablePlacement(transform, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement); this._layerOrderChanged = false; } if (this.pauseablePlacement.isDone()) { // the last placement finished running, but the next one hasn’t // started yet because of the `stillRecent` check immediately // above, so mark it stale to ensure that we request another // render frame this.placement.setStale(); } else { this.pauseablePlacement.continuePlacement(this._order, this._layers, layerTiles); if (this.pauseablePlacement.isDone()) { this.placement = this.pauseablePlacement.commit(symbol_layout.browser.now()); placementCommitted = true; } if (symbolBucketsChanged) { // since the placement gets split over multiple frames it is possible // these buckets were processed before they were changed and so the // placement is already stale while it is in progress this.pauseablePlacement.placement.setStale(); } } if (placementCommitted || symbolBucketsChanged) { for (var i$1 = 0, list$1 = this._order; i$1 < list$1.length; i$1 += 1) { var layerID$1 = list$1[i$1]; var styleLayer$1 = this._layers[layerID$1]; if (styleLayer$1.type !== 'symbol') { continue; } this.placement.updateLayerOpacities(styleLayer$1, layerTiles[styleLayer$1.source]); } } // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols var needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(symbol_layout.browser.now()); return needsRerender; }; Style.prototype._releaseSymbolFadeTiles = function _releaseSymbolFadeTiles () { for (var id in this.sourceCaches) { this.sourceCaches[id].releaseSymbolFadeTiles(); } }; // Callbacks from web workers Style.prototype.getImages = function getImages (mapId , params , callback ) { this.imageManager.getImages(params.icons, callback); }; Style.prototype.getGlyphs = function getGlyphs (mapId , params , callback ) { this.glyphManager.getGlyphs(params.stacks, callback); }; Style.prototype.getResource = function getResource (mapId , params , callback ) { return symbol_layout.makeRequest(params, callback); }; return Style; }(symbol_layout.Evented)); Style.getSourceType = getType; Style.setSourceType = setType; Style.registerForPluginAvailability = symbol_layout.registerForPluginAvailability; // var posAttributes = symbol_layout.createLayout([ { name: 'a_pos', type: 'Int16', components: 2 } ]); var preludeFrag = "#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n"; var preludeVert = "#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\n// Unpack a pair of values that have been packed into a single float.\n// The packed values are assumed to be 8-bit unsigned integers, and are\n// packed like so:\n// packedValue = floor(input[0]) * 256 + input[1],\nvec2 unpack_float(const float packedValue) {\n int packedIntValue = int(packedValue);\n int v0 = packedIntValue / 256;\n return vec2(v0, packedIntValue - v0 * 256);\n}\n\nvec2 unpack_opacity(const float packedOpacity) {\n int intOpacity = int(packedOpacity) / 2;\n return vec2(float(intOpacity) / 127.0, mod(packedOpacity, 2.0));\n}\n\n// To minimize the number of attributes needed, we encode a 4-component\n// color into a pair of floats (i.e. a vec2) as follows:\n// [ floor(color.r * 255) * 256 + color.g * 255,\n// floor(color.b * 255) * 256 + color.g * 255 ]\nvec4 decode_color(const vec2 encodedColor) {\n return vec4(\n unpack_float(encodedColor[0]) / 255.0,\n unpack_float(encodedColor[1]) / 255.0\n );\n}\n\n// Unpack a pair of paint values and interpolate between them.\nfloat unpack_mix_vec2(const vec2 packedValue, const float t) {\n return mix(packedValue[0], packedValue[1], t);\n}\n\n// Unpack a pair of paint values and interpolate between them.\nvec4 unpack_mix_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"; var backgroundFrag = "uniform vec4 u_color;\nuniform float u_opacity;\n\nvoid main() {\n gl_FragColor = u_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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"; 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 gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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"; var circleFrag = "varying vec3 v_data;\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 gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var circleVert = "uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform bool u_pitch_with_map;\nuniform vec2 u_extrude_scale;\nuniform lowp float u_device_pixel_ratio;\nuniform highp float u_camera_to_center_distance;\n\nattribute vec2 a_pos;\n\nvarying vec3 v_data;\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(void) {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n vec2 circle_center = floor(a_pos * 0.5);\n if (u_pitch_with_map) {\n vec2 corner_position = circle_center;\n if (u_scale_with_map) {\n corner_position += extrude * (radius + stroke_width) * u_extrude_scale;\n } else {\n // Pitching the circle with the map effectively scales it with the map\n // To counteract the effect for pitch-scale: viewport, we rescale the\n // whole circle based on the pitch scaling effect at its central point\n vec4 projected_center = u_matrix * vec4(circle_center, 0, 1);\n corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance);\n }\n\n gl_Position = u_matrix * vec4(corner_position, 0, 1);\n } else {\n gl_Position = u_matrix * vec4(circle_center, 0, 1);\n\n if (u_scale_with_map) {\n gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance;\n } else {\n gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w;\n }\n }\n\n // This is a minimum blur distance that serves as a faux-antialiasing for\n // the circle. since blur is a ratio of the circle's size and the intent is\n // to keep the blur at roughly 1px, the two are inversely related.\n lowp float antialiasblur = 1.0 / u_device_pixel_ratio / (radius + stroke_width);\n\n v_data = vec3(extrude.x, extrude.y, antialiasblur);\n}\n"; var clippingMaskFrag = "void main() {\n gl_FragColor = vec4(1.0);\n}\n"; 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"; 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 OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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\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 vec4 pos = vec4(floor(a_pos * 0.5) + extrude, 0, 1);\n\n gl_Position = u_matrix * pos;\n}\n"; 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 gl_FragColor = color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(0.0);\n#endif\n}\n"; var heatmapTextureVert = "uniform mat4 u_matrix;\nuniform vec2 u_world;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1);\n\n v_pos.x = a_pos.x;\n v_pos.y = 1.0 - a_pos.y;\n}\n"; var collisionBoxFrag = "\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n\n float alpha = 0.5;\n\n // Red = collision, hide label\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n // Blue = no collision, label is showing\n if (v_placed > 0.5) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n }\n\n if (v_notUsed > 0.5) {\n // This box not used, fade it out\n gl_FragColor *= .1;\n }\n}"; var collisionBoxVert = "attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\nattribute vec2 a_shift;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = 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 4.0);\n\n gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n gl_Position.xy += (a_extrude + a_shift) * u_extrude_scale * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n}\n"; var collisionCircleFrag = "uniform float u_overscale_factor;\n\nvarying float v_placed;\nvarying float v_notUsed;\nvarying float v_radius;\nvarying vec2 v_extrude;\nvarying vec2 v_extrude_scale;\n\nvoid main() {\n float alpha = 0.5;\n\n // Red = collision, hide label\n vec4 color = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n // Blue = no collision, label is showing\n if (v_placed > 0.5) {\n color = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n }\n\n if (v_notUsed > 0.5) {\n // This box not used, fade it out\n color *= .2;\n }\n\n float extrude_scale_length = length(v_extrude_scale);\n float extrude_length = length(v_extrude) * extrude_scale_length;\n float stroke_width = 15.0 * extrude_scale_length / u_overscale_factor;\n float radius = v_radius * extrude_scale_length;\n\n float distance_to_edge = abs(extrude_length - radius);\n float opacity_t = smoothstep(-stroke_width, 0.0, -distance_to_edge);\n\n gl_FragColor = opacity_t * color;\n}\n"; var collisionCircleVert = "attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\nvarying float v_radius;\n\nvarying vec2 v_extrude;\nvarying vec2 v_extrude_scale;\n\nvoid main() {\n vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = 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 gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n\n highp float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur\n gl_Position.xy += a_extrude * u_extrude_scale * padding_factor * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n v_radius = abs(a_extrude.y); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius\n\n v_extrude = a_extrude * padding_factor;\n v_extrude_scale = u_extrude_scale * u_camera_to_center_distance * collision_perspective_ratio;\n}\n"; var debugFrag = "uniform highp vec4 u_color;\n\nvoid main() {\n gl_FragColor = u_color;\n}\n"; var debugVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; 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 gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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"; 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 gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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"; 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\n gl_FragColor = mix(color1, color2, u_fade) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillOutlinePatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec4 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\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 float pixelRatio = u_scale.x;\n float tileRatio = u_scale.y;\n float fromScale = u_scale.z;\n float toScale = u_scale.w;\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio);\n vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio);\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"; 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 gl_FragColor = mix(color1, color2, u_fade) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec4 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\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 float pixelRatio = u_scale.x;\n float tileZoomRatio = u_scale.y;\n float fromScale = u_scale.z;\n float toScale = u_scale.w;\n\n vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio);\n vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio);\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"; var fillExtrusionFrag = "varying vec4 v_color;\n\nvoid main() {\n gl_FragColor = v_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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 vec2 a_pos;\nattribute vec4 a_normal_ed;\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 normal = a_normal_ed.xyz;\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (normal.y != 0.0) {\n // 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.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n v_color *= u_opacity;\n}\n"; 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\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\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 mixedColor = mix(color1, color2, u_fade);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillExtrusionPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_height_factor;\nuniform vec4 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 vec2 a_pos;\nattribute vec4 a_normal_ed;\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\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\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 pixelRatio = u_scale.x;\n float tileRatio = u_scale.y;\n float fromScale = u_scale.z;\n float toScale = u_scale.w;\n\n vec3 normal = a_normal_ed.xyz;\n float edgedistance = a_normal_ed.w;\n\n vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio);\n vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio);\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, 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 / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (normal.y != 0.0) {\n // 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"; 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 float u_maxzoom;\n\nfloat getElevation(vec2 coord, float bias) {\n // Convert encoded elevation value to meters\n vec4 data = texture2D(u_image, coord) * 255.0;\n return (data.r + data.g * 256.0 + data.b * 256.0 * 256.0) / 4.0;\n}\n\nvoid main() {\n vec2 epsilon = 1.0 / u_dimension;\n\n // queried pixels:\n // +-----------+\n // | | | |\n // | a | b | c |\n // | | | |\n // +-----------+\n // | | | |\n // | d | e | f |\n // | | | |\n // +-----------+\n // | | | |\n // | g | h | i |\n // | | | |\n // +-----------+\n\n float a = getElevation(v_pos + vec2(-epsilon.x, -epsilon.y), 0.0);\n float b = getElevation(v_pos + vec2(0, -epsilon.y), 0.0);\n float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y), 0.0);\n float d = getElevation(v_pos + vec2(-epsilon.x, 0), 0.0);\n float e = getElevation(v_pos, 0.0);\n float f = getElevation(v_pos + vec2(epsilon.x, 0), 0.0);\n float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y), 0.0);\n float h = getElevation(v_pos + vec2(0, epsilon.y), 0.0);\n float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y), 0.0);\n\n // here we divide the x and y slopes by 8 * pixel size\n // where pixel size (aka meters/pixel) is:\n // circumference of the world / (pixels per tile * number of tiles)\n // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom))\n // which can be reduced to: pow(2, 19.25619978527 - u_zoom)\n // we want to vertically exaggerate the hillshading though, because otherwise\n // it is barely noticeable at low zooms. to do this, we multiply this by some\n // scale factor pow(2, (u_zoom - u_maxzoom) * a) where a is an arbitrary value\n // Here we use a=0.3 which works out to the expression below. see \n // nickidlugash's awesome breakdown for more info\n // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556\n float exaggeration = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;\n\n vec2 deriv = vec2(\n (c + f + f + i) - (a + d + d + g),\n (g + h + h + i) - (a + b + b + c)\n ) / pow(2.0, (u_zoom - u_maxzoom) * 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"; 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"; 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\n#define PI 3.141592653589793\n\nvoid main() {\n vec4 pixel = texture2D(u_image, v_pos);\n\n vec2 deriv = ((pixel.rg * 2.0) - 1.0);\n\n // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude\n // to account for mercator projection distortion. see #4807 for details\n float scaleFactor = cos(radians((u_latrange[0] - u_latrange[1]) * (1.0 - v_pos.y) + u_latrange[1]));\n // We also multiply the slope by an arbitrary z-factor of 1.25\n float slope = atan(1.25 * length(deriv) / scaleFactor);\n float aspect = deriv.x != 0.0 ? atan(deriv.y, -deriv.x) : PI / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0);\n\n float intensity = u_light.x;\n // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal\n // position property to account for 0deg corresponding to north/the top of the viewport in the style spec\n // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal.\n float azimuth = u_light.y + PI;\n\n // We scale the slope exponentially based on intensity, using a calculation similar to\n // the exponential interpolation function in the style spec:\n // https://github.com/mapbox/mapbox-gl-js/blob/master/src/style-spec/expression/definitions/interpolate.js#L217-L228\n // so that higher intensity values create more opaque hillshading.\n float base = 1.875 - intensity * 1.75;\n float maxValue = 0.5 * PI;\n float scaledSlope = intensity != 0.5 ? ((pow(base, slope) - 1.0) / (pow(base, maxValue) - 1.0)) * maxValue : slope;\n\n // The accent color is calculated with the cosine of the slope while the shade color is calculated with the sine\n // so that the accent color's rate of change eases in while the shade color's eases out.\n float accent = cos(scaledSlope);\n // We multiply both the accent and shade color by a clamped intensity value\n // so that intensities >= 0.5 do not additionally affect the color values\n // while intensity values < 0.5 make the overall color more transparent.\n vec4 accent_color = (1.0 - accent) * u_accent * clamp(intensity * 2.0, 0.0, 1.0);\n float shade = abs(mod((aspect + azimuth) / PI + 0.5, 2.0) - 1.0);\n vec4 shade_color = mix(u_shadow, u_highlight, shade) * sin(scaledSlope) * clamp(intensity * 2.0, 0.0, 1.0);\n gl_FragColor = accent_color * (1.0 - shade_color.a) + shade_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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"; var lineFrag = "uniform lowp float u_device_pixel_ratio;\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / 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 gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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 scale 0.015873016\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\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 float v_linesofar;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n\n // 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 v_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0;\n\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_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"; var lineGradientFrag = "uniform lowp float u_device_pixel_ratio;\nuniform sampler2D u_image;\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\nvarying highp float v_lineprogress;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / 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 // For gradient lines, v_lineprogress is the ratio along the entire line,\n // scaled to [0, 2^15), and the gradient ramp is stored in a texture.\n vec4 color = texture2D(u_image, vec2(v_lineprogress, 0.5));\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var lineGradientVert = "\n// the attribute conveying progress along a line is scaled to [0, 2^15)\n#define MAX_LINE_DISTANCE 32767.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform lowp float u_device_pixel_ratio;\nuniform vec2 u_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\nvarying highp float v_lineprogress;\n\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 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\n v_lineprogress = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0 / MAX_LINE_DISTANCE;\n\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_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"; var linePatternFrag = "uniform lowp float u_device_pixel_ratio;\nuniform vec2 u_texsize;\nuniform float u_fade;\nuniform mediump vec4 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;\n\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_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\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 pixelRatio = u_scale.x;\n float tileZoomRatio = u_scale.y;\n float fromScale = u_scale.z;\n float toScale = u_scale.w;\n\n vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio);\n vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio);\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 // 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, 1.0);\n float x_b = mod(v_linesofar / pattern_size_b.x, 1.0);\n\n // v_normal.y is 0 at the midpoint of the line, -1 at the lower edge, 1 at the upper edge\n // we clamp the line width outset to be between 0 and half the pattern height plus padding (2.0)\n // to ensure we don't sample outside the designated symbol on the sprite sheet.\n // 0.5 is added to shift the component to be bounded between 0 and 1 for interpolation of\n // the texture coordinate\n float y_a = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (pattern_size_a.y + 2.0) / 2.0) / pattern_size_a.y);\n float y_b = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (pattern_size_b.y + 2.0) / 2.0) / pattern_size_b.y);\n vec2 pos_a = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, vec2(x_a, y_a));\n vec2 pos_b = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, vec2(x_b, y_b));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n gl_FragColor = color * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; 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\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform vec2 u_units_to_pixels;\nuniform mediump float u_ratio;\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;\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 vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_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 mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_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 float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n // float tileRatio = u_scale.y;\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_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n}\n"; var lineSDFFrag = "\nuniform lowp float u_device_pixel_ratio;\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / 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 sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma / floorwidth, 0.5 + u_sdfgamma / floorwidth, sdfdist);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var lineSDFVert = "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform lowp float u_device_pixel_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n\n // 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 float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\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_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x / floorwidth, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x / floorwidth, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n v_width2 = vec2(outset, inset);\n}\n"; 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 gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var rasterVert = "uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n // We are using Int16 for texture position coordinates to give us enough precision for\n // fractional coordinates. We use 8192 to scale the texture coordinates in the buffer\n // as an arbitrarily high number to preserve adequate precision when rendering.\n // This is also the same value as the EXTENT we are using for our tile buffer pos coordinates,\n // so math for modifying either is consistent.\n v_pos0 = (((a_texture_pos / 8192.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n"; 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 = "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\nuniform highp float u_camera_to_center_distance;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform float u_fade_change;\n\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_data.xy;\n vec2 a_size = a_data.zw;\n\n highp float segment_angle = -a_projected_pos[2];\n\n float size;\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size[0], a_size[1], u_size_t) / 256.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size[0] / 256.0;\n } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n size = u_size;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // See comments in symbol_sdf.vertex\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 4.0);\n\n size *= perspective_ratio;\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // See comments in symbol_sdf.vertex\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0);\n\n v_tex = a_tex / u_texsize;\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n}\n"; 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 = "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\n// contents of a_size vary based on the type of property value\n// used for {text,icon}-size.\n// For constants, a_size is disabled.\n// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature.\n// For composite functions:\n// [ text-size(lowerZoomStop, feature),\n// text-size(upperZoomStop, feature) ]\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\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;\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_data.xy;\n vec2 a_size = a_data.zw;\n\n highp float segment_angle = -a_projected_pos[2];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size[0], a_size[1], u_size_t) / 256.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size[0] / 256.0;\n } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n size = u_size;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // If the label is pitched with the map, layout is done in pitched space,\n // which makes labels in the distance smaller relative to viewport space.\n // We counteract part of that effect by multiplying by the perspective ratio.\n // If the label isn't pitched with the map, we do layout in viewport space,\n // which makes labels in the distance larger relative to the features around\n // them. We counteract part of that effect by dividing by the perspective ratio.\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 4.0);\n\n size *= perspective_ratio;\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units\n // To figure out that angle in projected space, we draw a short horizontal line in tile\n // space, project it, and measure its angle in projected space.\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0);\n float gamma_scale = gl_Position.w;\n\n vec2 tex = a_tex / u_texsize;\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n\n v_data0 = vec2(tex.x, tex.y);\n v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity);\n}\n"; var prelude = compile(preludeFrag, preludeVert); var background = compile(backgroundFrag, backgroundVert); var backgroundPattern = compile(backgroundPatternFrag, backgroundPatternVert); var circle = compile(circleFrag, circleVert); var clippingMask = compile(clippingMaskFrag, clippingMaskVert); var heatmap = compile(heatmapFrag, heatmapVert); var heatmapTexture = compile(heatmapTextureFrag, heatmapTextureVert); var collisionBox = compile(collisionBoxFrag, collisionBoxVert); var collisionCircle = compile(collisionCircleFrag, collisionCircleVert); var debug = compile(debugFrag, debugVert); var fill = compile(fillFrag, fillVert); var fillOutline = compile(fillOutlineFrag, fillOutlineVert); var fillOutlinePattern = compile(fillOutlinePatternFrag, fillOutlinePatternVert); var fillPattern = compile(fillPatternFrag, fillPatternVert); var fillExtrusion = compile(fillExtrusionFrag, fillExtrusionVert); var fillExtrusionPattern = compile(fillExtrusionPatternFrag, fillExtrusionPatternVert); var hillshadePrepare = compile(hillshadePrepareFrag, hillshadePrepareVert); var hillshade = compile(hillshadeFrag, hillshadeVert); var line = compile(lineFrag, lineVert); var lineGradient = compile(lineGradientFrag, lineGradientVert); var linePattern = compile(linePatternFrag, linePatternVert); var lineSDF = compile(lineSDFFrag, lineSDFVert); var raster = compile(rasterFrag, rasterVert); var symbolIcon = compile(symbolIconFrag, symbolIconVert); var symbolSDF = compile(symbolSDFFrag, symbolSDFVert); // Expand #pragmas to #ifdefs. function compile(fragmentSource, vertexSource) { var re = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g; var fragmentPragmas = {}; fragmentSource = fragmentSource.replace(re, function (match, operation, precision, type, name) { fragmentPragmas[name] = true; if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nvarying " + precision + " " + type + " " + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { return ("\n#ifdef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } }); vertexSource = vertexSource.replace(re, function (match, operation, precision, type, name) { var attrType = type === 'float' ? 'vec2' : 'vec4'; var unpackType = name.match(/color/) ? 'color' : attrType; if (fragmentPragmas[name]) { if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nuniform lowp float u_" + name + "_t;\nattribute " + precision + " " + attrType + " a_" + name + ";\nvarying " + precision + " " + type + " " + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { if (unpackType === 'vec4') { // vec4 attributes are only used for cross-faded properties, and are not packed return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + name + " = a_" + name + ";\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } else { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + name + " = unpack_mix_" + unpackType + "(a_" + name + ", u_" + name + "_t);\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } } } else { if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nuniform lowp float u_" + name + "_t;\nattribute " + precision + " " + attrType + " a_" + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { if (unpackType === 'vec4') { // vec4 attributes are only used for cross-faded properties, and are not packed return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = a_" + name + ";\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } else /* */{ return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = unpack_mix_" + unpackType + "(a_" + name + ", u_" + name + "_t);\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } } } }); return {fragmentSource: fragmentSource, vertexSource: vertexSource}; } var shaders = /*#__PURE__*/Object.freeze({ prelude: prelude, background: background, backgroundPattern: backgroundPattern, circle: circle, clippingMask: clippingMask, heatmap: heatmap, heatmapTexture: heatmapTexture, collisionBox: collisionBox, collisionCircle: collisionCircle, debug: debug, fill: fill, fillOutline: fillOutline, fillOutlinePattern: fillOutlinePattern, fillPattern: fillPattern, fillExtrusion: fillExtrusion, fillExtrusionPattern: fillExtrusionPattern, hillshadePrepare: hillshadePrepare, hillshade: hillshade, line: line, lineGradient: lineGradient, linePattern: linePattern, lineSDF: lineSDF, raster: raster, symbolIcon: symbolIcon, symbolSDF: symbolSDF }); // var VertexArrayObject = function VertexArrayObject() { this.boundProgram = null; this.boundLayoutVertexBuffer = null; this.boundPaintVertexBuffers = []; this.boundIndexBuffer = null; this.boundVertexOffset = null; this.boundDynamicVertexBuffer = null; this.vao = null; }; VertexArrayObject.prototype.bind = function bind (context , program , layoutVertexBuffer , paintVertexBuffers , indexBuffer , vertexOffset , dynamicVertexBuffer , dynamicVertexBuffer2 ) { this.context = context; var paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length; for (var i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) { if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) { paintBuffersDiffer = true; } } var isFreshBindRequired = ( !this.vao || this.boundProgram !== program || this.boundLayoutVertexBuffer !== layoutVertexBuffer || paintBuffersDiffer || this.boundIndexBuffer !== indexBuffer || this.boundVertexOffset !== vertexOffset || this.boundDynamicVertexBuffer !== dynamicVertexBuffer || this.boundDynamicVertexBuffer2 !== dynamicVertexBuffer2 ); if (!context.extVertexArrayObject || isFreshBindRequired) { this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2); } else { context.bindVertexArrayOES.set(this.vao); if (dynamicVertexBuffer) { // The buffer may have been updated. Rebind to upload data. dynamicVertexBuffer.bind(); } if (indexBuffer && indexBuffer.dynamicDraw) { indexBuffer.bind(); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.bind(); } } }; VertexArrayObject.prototype.freshBind = function freshBind (program , layoutVertexBuffer , paintVertexBuffers , indexBuffer , vertexOffset , dynamicVertexBuffer , dynamicVertexBuffer2 ) { var numPrevAttributes; var numNextAttributes = program.numAttributes; var context = this.context; var gl = context.gl; if (context.extVertexArrayObject) { if (this.vao) { this.destroy(); } this.vao = context.extVertexArrayObject.createVertexArrayOES(); context.bindVertexArrayOES.set(this.vao); numPrevAttributes = 0; // store the arguments so that we can verify them when the vao is bound again this.boundProgram = program; this.boundLayoutVertexBuffer = layoutVertexBuffer; this.boundPaintVertexBuffers = paintVertexBuffers; this.boundIndexBuffer = indexBuffer; this.boundVertexOffset = vertexOffset; this.boundDynamicVertexBuffer = dynamicVertexBuffer; this.boundDynamicVertexBuffer2 = dynamicVertexBuffer2; } else { numPrevAttributes = context.currentNumAttributes || 0; // Disable all attributes from the previous program that aren't used in // the new program. Note: attribute indices are *not* program specific! for (var i = numNextAttributes; i < numPrevAttributes; i++) { // WebGL breaks if you disable attribute 0. // http://stackoverflow.com/questions/20305231 symbol_layout.assert(i !== 0); gl.disableVertexAttribArray(i); } } layoutVertexBuffer.enableAttributes(gl, program); for (var i$1 = 0, list = paintVertexBuffers; i$1 < list.length; i$1 += 1) { var vertexBuffer = list[i$1]; vertexBuffer.enableAttributes(gl, program); } if (dynamicVertexBuffer) { dynamicVertexBuffer.enableAttributes(gl, program); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.enableAttributes(gl, program); } layoutVertexBuffer.bind(); layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); for (var i$2 = 0, list$1 = paintVertexBuffers; i$2 < list$1.length; i$2 += 1) { var vertexBuffer$1 = list$1[i$2]; vertexBuffer$1.bind(); vertexBuffer$1.setVertexAttribPointers(gl, program, vertexOffset); } if (dynamicVertexBuffer) { dynamicVertexBuffer.bind(); dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); } if (indexBuffer) { indexBuffer.bind(); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.bind(); dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset); } context.currentNumAttributes = numNextAttributes; }; VertexArrayObject.prototype.destroy = function destroy () { if (this.vao) { this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao); this.vao = null; } }; // var Program$1 = function Program(context , source , configuration , fixedUniforms , showOverdrawInspector ) { var gl = context.gl; this.program = gl.createProgram(); var defines = configuration.defines(); if (showOverdrawInspector) { defines.push('#define OVERDRAW_INSPECTOR;'); } var fragmentSource = defines.concat(prelude.fragmentSource, source.fragmentSource).join('\n'); var vertexSource = defines.concat(prelude.vertexSource, source.vertexSource).join('\n'); var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragmentSource); gl.compileShader(fragmentShader); symbol_layout.assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(fragmentShader) )); gl.attachShader(this.program, fragmentShader); var vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexSource); gl.compileShader(vertexShader); symbol_layout.assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(vertexShader) )); gl.attachShader(this.program, vertexShader); // Manually bind layout attributes in the order defined by their // ProgramInterface so that we don't dynamically link an unused // attribute at position 0, which can cause rendering to fail for an // entire layer (see #4607, #4728) var layoutAttributes = configuration.layoutAttributes || []; for (var i = 0; i < layoutAttributes.length; i++) { gl.bindAttribLocation(this.program, i, layoutAttributes[i].name); } gl.linkProgram(this.program); symbol_layout.assert(gl.getProgramParameter(this.program, gl.LINK_STATUS), (gl.getProgramInfoLog(this.program) )); this.numAttributes = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES); this.attributes = {}; var uniformLocations = {}; for (var i$1 = 0; i$1 < this.numAttributes; i$1++) { var attribute = gl.getActiveAttrib(this.program, i$1); if (attribute) { this.attributes[attribute.name] = gl.getAttribLocation(this.program, attribute.name); } } var numUniforms = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS); for (var i$2 = 0; i$2 < numUniforms; i$2++) { var uniform = gl.getActiveUniform(this.program, i$2); if (uniform) { uniformLocations[uniform.name] = gl.getUniformLocation(this.program, uniform.name); } } this.fixedUniforms = fixedUniforms(context, uniformLocations); this.binderUniforms = configuration.getUniforms(context, uniformLocations); }; Program$1.prototype.draw = function draw (context , drawMode , depthMode , stencilMode , colorMode , cullFaceMode , uniformValues , layerID , layoutVertexBuffer , indexBuffer , segments , currentProperties , zoom , configuration , dynamicLayoutBuffer , dynamicLayoutBuffer2 ) { var obj; var gl = context.gl; context.program.set(this.program); context.setDepthMode(depthMode); context.setStencilMode(stencilMode); context.setColorMode(colorMode); context.setCullFace(cullFaceMode); for (var name in this.fixedUniforms) { this.fixedUniforms[name].set(uniformValues[name]); } if (configuration) { configuration.setUniforms(context, this.binderUniforms, currentProperties, {zoom: (zoom )}); } var primitiveSize = ( obj = {}, obj[gl.LINES] = 2, obj[gl.TRIANGLES] = 3, obj[gl.LINE_STRIP] = 1, obj )[drawMode]; for (var i = 0, list = segments.get(); i < list.length; i += 1) { var segment = list[i]; var vaos = segment.vaos || (segment.vaos = {}); var vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject()); vao.bind( context, this, layoutVertexBuffer, configuration ? configuration.getPaintVertexBuffers() : [], indexBuffer, segment.vertexOffset, dynamicLayoutBuffer, dynamicLayoutBuffer2 ); gl.drawElements( drawMode, segment.primitiveLength * primitiveSize, gl.UNSIGNED_SHORT, segment.primitiveOffset * primitiveSize * 2); } }; // function patternUniformValues(crossfade , painter , tile ) { var tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom); var numTiles = Math.pow(2, tile.tileID.overscaledZ); var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; var pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); var pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; return { 'u_image': 0, 'u_texsize': tile.imageAtlasTexture.size, // this assumes all images in the icon atlas texture have the same pixel ratio 'u_scale': [symbol_layout.browser.devicePixelRatio, 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 ) { var imagePosA = painter.imageManager.getPattern(image.from); var imagePosB = painter.imageManager.getPattern(image.to); symbol_layout.assert(imagePosA && imagePosB); var ref = painter.imageManager.getPixelSize(); var width = ref.width; var height = ref.height; var numTiles = Math.pow(2, tile.tileID.overscaledZ); var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; var pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); var pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; 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] }; } // var fillExtrusionUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_lightpos': new symbol_layout.Uniform3f(context, locations.u_lightpos), 'u_lightintensity': new symbol_layout.Uniform1f(context, locations.u_lightintensity), 'u_lightcolor': new symbol_layout.Uniform3f(context, locations.u_lightcolor), 'u_vertical_gradient': new symbol_layout.Uniform1f(context, locations.u_vertical_gradient), 'u_opacity': new symbol_layout.Uniform1f(context, locations.u_opacity) }); }; var fillExtrusionPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_lightpos': new symbol_layout.Uniform3f(context, locations.u_lightpos), 'u_lightintensity': new symbol_layout.Uniform1f(context, locations.u_lightintensity), 'u_lightcolor': new symbol_layout.Uniform3f(context, locations.u_lightcolor), 'u_vertical_gradient': new symbol_layout.Uniform1f(context, locations.u_vertical_gradient), 'u_height_factor': new symbol_layout.Uniform1f(context, locations.u_height_factor), // pattern uniforms 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_texsize': new symbol_layout.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new symbol_layout.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new symbol_layout.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new symbol_layout.Uniform4f(context, locations.u_scale), 'u_fade': new symbol_layout.Uniform1f(context, locations.u_fade), 'u_opacity': new symbol_layout.Uniform1f(context, locations.u_opacity) }); }; var fillExtrusionUniformValues = function ( matrix , painter , shouldUseVerticalGradient , opacity ) { var light = painter.style.light; var _lp = light.properties.get('position'); var lightPos = [_lp.x, _lp.y, _lp.z]; var lightMat = symbol_layout.create$1(); if (light.properties.get('anchor') === 'viewport') { symbol_layout.fromRotation(lightMat, -painter.transform.angle); } symbol_layout.transformMat3(lightPos, lightPos, lightMat); var lightColor = light.properties.get('color'); 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 }; }; var fillExtrusionPatternUniformValues = function ( matrix , painter , shouldUseVerticalGradient , opacity , coord , crossfade , tile ) { return symbol_layout.extend(fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity), patternUniformValues(crossfade, painter, tile), { 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8 }); }; // var fillUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix) }); }; var fillPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_texsize': new symbol_layout.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new symbol_layout.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new symbol_layout.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new symbol_layout.Uniform4f(context, locations.u_scale), 'u_fade': new symbol_layout.Uniform1f(context, locations.u_fade) }); }; var fillOutlineUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_world': new symbol_layout.Uniform2f(context, locations.u_world) }); }; var fillOutlinePatternUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_world': new symbol_layout.Uniform2f(context, locations.u_world), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_texsize': new symbol_layout.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new symbol_layout.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new symbol_layout.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new symbol_layout.Uniform4f(context, locations.u_scale), 'u_fade': new symbol_layout.Uniform1f(context, locations.u_fade) }); }; var fillUniformValues = function (matrix ) { return ({ 'u_matrix': matrix }); }; var fillPatternUniformValues = function ( matrix , painter , crossfade , tile ) { return symbol_layout.extend( fillUniformValues(matrix), patternUniformValues(crossfade, painter, tile) ); }; var fillOutlineUniformValues = function ( matrix , drawingBufferSize ) { return ({ 'u_matrix': matrix, 'u_world': drawingBufferSize }); }; var fillOutlinePatternUniformValues = function ( matrix , painter , crossfade , tile , drawingBufferSize ) { return symbol_layout.extend( fillPatternUniformValues(matrix, painter, crossfade, tile), { 'u_world': drawingBufferSize } ); }; // var circleUniforms = function (context , locations ) { return ({ 'u_camera_to_center_distance': new symbol_layout.Uniform1f(context, locations.u_camera_to_center_distance), 'u_scale_with_map': new symbol_layout.Uniform1i(context, locations.u_scale_with_map), 'u_pitch_with_map': new symbol_layout.Uniform1i(context, locations.u_pitch_with_map), 'u_extrude_scale': new symbol_layout.Uniform2f(context, locations.u_extrude_scale), 'u_device_pixel_ratio': new symbol_layout.Uniform1f(context, locations.u_device_pixel_ratio), 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix) }); }; var circleUniformValues = function ( painter , coord , tile , layer ) { var transform = painter.transform; var pitchWithMap , extrudeScale ; if (layer.paint.get('circle-pitch-alignment') === 'map') { var pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom); pitchWithMap = true; extrudeScale = [pixelRatio, pixelRatio]; } else { pitchWithMap = false; extrudeScale = transform.pixelsToGLUnits; } return { 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_scale_with_map': +(layer.paint.get('circle-pitch-scale') === 'map'), 'u_matrix': painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('circle-translate'), layer.paint.get('circle-translate-anchor')), 'u_pitch_with_map': +(pitchWithMap), 'u_device_pixel_ratio': symbol_layout.browser.devicePixelRatio, 'u_extrude_scale': extrudeScale }; }; // var collisionUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_camera_to_center_distance': new symbol_layout.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pixels_to_tile_units': new symbol_layout.Uniform1f(context, locations.u_pixels_to_tile_units), 'u_extrude_scale': new symbol_layout.Uniform2f(context, locations.u_extrude_scale), 'u_overscale_factor': new symbol_layout.Uniform1f(context, locations.u_overscale_factor) }); }; var collisionUniformValues = function ( matrix , transform , tile ) { var pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom); var scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ); var overscaleFactor = tile.tileID.overscaleFactor(); return { 'u_matrix': matrix, 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_pixels_to_tile_units': pixelRatio, 'u_extrude_scale': [transform.pixelsToGLUnits[0] / (pixelRatio * scale), transform.pixelsToGLUnits[1] / (pixelRatio * scale)], 'u_overscale_factor': overscaleFactor }; }; // var debugUniforms = function (context , locations ) { return ({ 'u_color': new symbol_layout.UniformColor(context, locations.u_color), 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix) }); }; var debugUniformValues = function (matrix , color ) { return ({ 'u_matrix': matrix, 'u_color': color }); }; // var clippingMaskUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix) }); }; var clippingMaskUniformValues = function (matrix ) { return ({ 'u_matrix': matrix }); }; // var heatmapUniforms = function (context , locations ) { return ({ 'u_extrude_scale': new symbol_layout.Uniform1f(context, locations.u_extrude_scale), 'u_intensity': new symbol_layout.Uniform1f(context, locations.u_intensity), 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix) }); }; var heatmapTextureUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_world': new symbol_layout.Uniform2f(context, locations.u_world), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_color_ramp': new symbol_layout.Uniform1i(context, locations.u_color_ramp), 'u_opacity': new symbol_layout.Uniform1f(context, locations.u_opacity) }); }; var heatmapUniformValues = function ( matrix , tile , zoom , intensity ) { return ({ 'u_matrix': matrix, 'u_extrude_scale': pixelsToTileUnits(tile, 1, zoom), 'u_intensity': intensity }); }; var heatmapTextureUniformValues = function ( painter , layer , textureUnit , colorRampUnit ) { var matrix = symbol_layout.create(); symbol_layout.ortho(matrix, 0, painter.width, painter.height, 0, 0, 1); var gl = painter.context.gl; return { 'u_matrix': matrix, 'u_world': [gl.drawingBufferWidth, gl.drawingBufferHeight], 'u_image': textureUnit, 'u_color_ramp': colorRampUnit, 'u_opacity': layer.paint.get('heatmap-opacity') }; }; // var hillshadeUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_latrange': new symbol_layout.Uniform2f(context, locations.u_latrange), 'u_light': new symbol_layout.Uniform2f(context, locations.u_light), 'u_shadow': new symbol_layout.UniformColor(context, locations.u_shadow), 'u_highlight': new symbol_layout.UniformColor(context, locations.u_highlight), 'u_accent': new symbol_layout.UniformColor(context, locations.u_accent) }); }; var hillshadePrepareUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_dimension': new symbol_layout.Uniform2f(context, locations.u_dimension), 'u_zoom': new symbol_layout.Uniform1f(context, locations.u_zoom), 'u_maxzoom': new symbol_layout.Uniform1f(context, locations.u_maxzoom) }); }; var hillshadeUniformValues = function ( painter , tile , layer ) { var shadow = layer.paint.get("hillshade-shadow-color"); var highlight = layer.paint.get("hillshade-highlight-color"); var accent = layer.paint.get("hillshade-accent-color"); var azimuthal = layer.paint.get('hillshade-illumination-direction') * (Math.PI / 180); // modify azimuthal angle by map rotation if light is anchored at the viewport if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') { azimuthal -= painter.transform.angle; } var align = !painter.options.moving; return { 'u_matrix': painter.transform.calculatePosMatrix(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 }; }; var hillshadeUniformPrepareValues = function ( tile , maxzoom ) { symbol_layout.assert(tile.dem); var stride = ((tile.dem ) ).stride; var matrix = symbol_layout.create(); // Flip rendering at y axis. symbol_layout.ortho(matrix, 0, symbol_layout.EXTENT, -symbol_layout.EXTENT, 0, 0, 1); symbol_layout.translate(matrix, matrix, [0, -symbol_layout.EXTENT, 0]); return { 'u_matrix': matrix, 'u_image': 1, 'u_dimension': [stride, stride], 'u_zoom': tile.tileID.overscaledZ, 'u_maxzoom': maxzoom }; }; function getTileLatRange(painter , tileID ) { // for scaling the magnitude of a points slope by its latitude var tilesAtZoom = Math.pow(2, tileID.canonical.z); var y = tileID.canonical.y; return [ new symbol_layout.MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat, new symbol_layout.MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat]; } // var lineUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new symbol_layout.Uniform1f(context, locations.u_ratio), 'u_device_pixel_ratio': new symbol_layout.Uniform1f(context, locations.u_device_pixel_ratio), 'u_units_to_pixels': new symbol_layout.Uniform2f(context, locations.u_units_to_pixels) }); }; var lineGradientUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new symbol_layout.Uniform1f(context, locations.u_ratio), 'u_device_pixel_ratio': new symbol_layout.Uniform1f(context, locations.u_device_pixel_ratio), 'u_units_to_pixels': new symbol_layout.Uniform2f(context, locations.u_units_to_pixels), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image) }); }; var linePatternUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_texsize': new symbol_layout.Uniform2f(context, locations.u_texsize), 'u_ratio': new symbol_layout.Uniform1f(context, locations.u_ratio), 'u_device_pixel_ratio': new symbol_layout.Uniform1f(context, locations.u_device_pixel_ratio), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_units_to_pixels': new symbol_layout.Uniform2f(context, locations.u_units_to_pixels), 'u_scale': new symbol_layout.Uniform4f(context, locations.u_scale), 'u_fade': new symbol_layout.Uniform1f(context, locations.u_fade) }); }; var lineSDFUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new symbol_layout.Uniform1f(context, locations.u_ratio), 'u_device_pixel_ratio': new symbol_layout.Uniform1f(context, locations.u_device_pixel_ratio), 'u_units_to_pixels': new symbol_layout.Uniform2f(context, locations.u_units_to_pixels), 'u_patternscale_a': new symbol_layout.Uniform2f(context, locations.u_patternscale_a), 'u_patternscale_b': new symbol_layout.Uniform2f(context, locations.u_patternscale_b), 'u_sdfgamma': new symbol_layout.Uniform1f(context, locations.u_sdfgamma), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_tex_y_a': new symbol_layout.Uniform1f(context, locations.u_tex_y_a), 'u_tex_y_b': new symbol_layout.Uniform1f(context, locations.u_tex_y_b), 'u_mix': new symbol_layout.Uniform1f(context, locations.u_mix) }); }; var lineUniformValues = function ( painter , tile , layer ) { var transform = painter.transform; return { 'u_matrix': calculateMatrix(painter, tile, layer), 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom), 'u_device_pixel_ratio': symbol_layout.browser.devicePixelRatio, 'u_units_to_pixels': [ 1 / transform.pixelsToGLUnits[0], 1 / transform.pixelsToGLUnits[1] ] }; }; var lineGradientUniformValues = function ( painter , tile , layer ) { return symbol_layout.extend(lineUniformValues(painter, tile, layer), { 'u_image': 0 }); }; var linePatternUniformValues = function ( painter , tile , layer , crossfade ) { var transform = painter.transform; var tileZoomRatio = calculateTileRatio(tile, transform); return { 'u_matrix': calculateMatrix(painter, tile, layer), 'u_texsize': tile.imageAtlasTexture.size, // camera zoom ratio 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom), 'u_device_pixel_ratio': symbol_layout.browser.devicePixelRatio, 'u_image': 0, // this assumes all images in the icon atlas texture have the same pixel ratio 'u_scale': [symbol_layout.browser.devicePixelRatio, tileZoomRatio, crossfade.fromScale, crossfade.toScale], 'u_fade': crossfade.t, 'u_units_to_pixels': [ 1 / transform.pixelsToGLUnits[0], 1 / transform.pixelsToGLUnits[1] ] }; }; var lineSDFUniformValues = function ( painter , tile , layer , dasharray , crossfade ) { var transform = painter.transform; var lineAtlas = painter.lineAtlas; var tileRatio = calculateTileRatio(tile, transform); var round = layer.layout.get('line-cap') === 'round'; var posA = lineAtlas.getDash(dasharray.from, round); var posB = lineAtlas.getDash(dasharray.to, round); var widthA = posA.width * crossfade.fromScale; var widthB = posB.width * crossfade.toScale; return symbol_layout.extend(lineUniformValues(painter, tile, layer), { 'u_patternscale_a': [tileRatio / widthA, -posA.height / 2], 'u_patternscale_b': [tileRatio / widthB, -posB.height / 2], 'u_sdfgamma': lineAtlas.width / (Math.min(widthA, widthB) * 256 * symbol_layout.browser.devicePixelRatio) / 2, 'u_image': 0, 'u_tex_y_a': posA.y, 'u_tex_y_b': posB.y, 'u_mix': crossfade.t }); }; function calculateTileRatio(tile , transform ) { return 1 / pixelsToTileUnits(tile, 1, transform.tileZoom); } function calculateMatrix(painter, tile, layer) { return painter.translatePosMatrix( tile.tileID.posMatrix, tile, layer.paint.get('line-translate'), layer.paint.get('line-translate-anchor') ); } // var rasterUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_tl_parent': new symbol_layout.Uniform2f(context, locations.u_tl_parent), 'u_scale_parent': new symbol_layout.Uniform1f(context, locations.u_scale_parent), 'u_buffer_scale': new symbol_layout.Uniform1f(context, locations.u_buffer_scale), 'u_fade_t': new symbol_layout.Uniform1f(context, locations.u_fade_t), 'u_opacity': new symbol_layout.Uniform1f(context, locations.u_opacity), 'u_image0': new symbol_layout.Uniform1i(context, locations.u_image0), 'u_image1': new symbol_layout.Uniform1i(context, locations.u_image1), 'u_brightness_low': new symbol_layout.Uniform1f(context, locations.u_brightness_low), 'u_brightness_high': new symbol_layout.Uniform1f(context, locations.u_brightness_high), 'u_saturation_factor': new symbol_layout.Uniform1f(context, locations.u_saturation_factor), 'u_contrast_factor': new symbol_layout.Uniform1f(context, locations.u_contrast_factor), 'u_spin_weights': new symbol_layout.Uniform3f(context, locations.u_spin_weights) }); }; var rasterUniformValues = function ( matrix , parentTL , parentScaleBy , fade , layer ) { return ({ 'u_matrix': matrix, 'u_tl_parent': parentTL, 'u_scale_parent': parentScaleBy, 'u_buffer_scale': 1, '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')) }); }; function spinWeights(angle) { angle *= Math.PI / 180; var s = Math.sin(angle); var c = Math.cos(angle); return [ (2 * c + 1) / 3, (-Math.sqrt(3) * s - c + 1) / 3, (Math.sqrt(3) * s - c + 1) / 3 ]; } function contrastFactor(contrast) { return contrast > 0 ? 1 / (1 - contrast) : 1 + contrast; } function saturationFactor(saturation) { return saturation > 0 ? 1 - 1 / (1.001 - saturation) : -saturation; } // var symbolIconUniforms = function (context , locations ) { return ({ 'u_is_size_zoom_constant': new symbol_layout.Uniform1i(context, locations.u_is_size_zoom_constant), 'u_is_size_feature_constant': new symbol_layout.Uniform1i(context, locations.u_is_size_feature_constant), 'u_size_t': new symbol_layout.Uniform1f(context, locations.u_size_t), 'u_size': new symbol_layout.Uniform1f(context, locations.u_size), 'u_camera_to_center_distance': new symbol_layout.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pitch': new symbol_layout.Uniform1f(context, locations.u_pitch), 'u_rotate_symbol': new symbol_layout.Uniform1i(context, locations.u_rotate_symbol), 'u_aspect_ratio': new symbol_layout.Uniform1f(context, locations.u_aspect_ratio), 'u_fade_change': new symbol_layout.Uniform1f(context, locations.u_fade_change), 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_label_plane_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_label_plane_matrix), 'u_coord_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_coord_matrix), 'u_is_text': new symbol_layout.Uniform1f(context, locations.u_is_text), 'u_pitch_with_map': new symbol_layout.Uniform1i(context, locations.u_pitch_with_map), 'u_texsize': new symbol_layout.Uniform2f(context, locations.u_texsize), 'u_texture': new symbol_layout.Uniform1i(context, locations.u_texture) }); }; var symbolSDFUniforms = function (context , locations ) { return ({ 'u_is_size_zoom_constant': new symbol_layout.Uniform1i(context, locations.u_is_size_zoom_constant), 'u_is_size_feature_constant': new symbol_layout.Uniform1i(context, locations.u_is_size_feature_constant), 'u_size_t': new symbol_layout.Uniform1f(context, locations.u_size_t), 'u_size': new symbol_layout.Uniform1f(context, locations.u_size), 'u_camera_to_center_distance': new symbol_layout.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pitch': new symbol_layout.Uniform1f(context, locations.u_pitch), 'u_rotate_symbol': new symbol_layout.Uniform1i(context, locations.u_rotate_symbol), 'u_aspect_ratio': new symbol_layout.Uniform1f(context, locations.u_aspect_ratio), 'u_fade_change': new symbol_layout.Uniform1f(context, locations.u_fade_change), 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_label_plane_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_label_plane_matrix), 'u_coord_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_coord_matrix), 'u_is_text': new symbol_layout.Uniform1f(context, locations.u_is_text), 'u_pitch_with_map': new symbol_layout.Uniform1i(context, locations.u_pitch_with_map), 'u_texsize': new symbol_layout.Uniform2f(context, locations.u_texsize), 'u_texture': new symbol_layout.Uniform1i(context, locations.u_texture), 'u_gamma_scale': new symbol_layout.Uniform1f(context, locations.u_gamma_scale), 'u_device_pixel_ratio': new symbol_layout.Uniform1f(context, locations.u_device_pixel_ratio), 'u_is_halo': new symbol_layout.Uniform1f(context, locations.u_is_halo) }); }; var symbolIconUniformValues = function ( functionType , size , rotateInShader , pitchWithMap , painter , matrix , labelPlaneMatrix , glCoordMatrix , isText , texSize ) { var transform = painter.transform; 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_texture': 0 }; }; var symbolSDFUniformValues = function ( functionType , size , rotateInShader , pitchWithMap , painter , matrix , labelPlaneMatrix , glCoordMatrix , isText , texSize , isHalo ) { var transform = painter.transform; return symbol_layout.extend(symbolIconUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize), { 'u_gamma_scale': (pitchWithMap ? Math.cos(transform._pitch) * transform.cameraToCenterDistance : 1), 'u_device_pixel_ratio': symbol_layout.browser.devicePixelRatio, 'u_is_halo': +isHalo }); }; // var backgroundUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_opacity': new symbol_layout.Uniform1f(context, locations.u_opacity), 'u_color': new symbol_layout.UniformColor(context, locations.u_color) }); }; var backgroundPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new symbol_layout.UniformMatrix4f(context, locations.u_matrix), 'u_opacity': new symbol_layout.Uniform1f(context, locations.u_opacity), 'u_image': new symbol_layout.Uniform1i(context, locations.u_image), 'u_pattern_tl_a': new symbol_layout.Uniform2f(context, locations.u_pattern_tl_a), 'u_pattern_br_a': new symbol_layout.Uniform2f(context, locations.u_pattern_br_a), 'u_pattern_tl_b': new symbol_layout.Uniform2f(context, locations.u_pattern_tl_b), 'u_pattern_br_b': new symbol_layout.Uniform2f(context, locations.u_pattern_br_b), 'u_texsize': new symbol_layout.Uniform2f(context, locations.u_texsize), 'u_mix': new symbol_layout.Uniform1f(context, locations.u_mix), 'u_pattern_size_a': new symbol_layout.Uniform2f(context, locations.u_pattern_size_a), 'u_pattern_size_b': new symbol_layout.Uniform2f(context, locations.u_pattern_size_b), 'u_scale_a': new symbol_layout.Uniform1f(context, locations.u_scale_a), 'u_scale_b': new symbol_layout.Uniform1f(context, locations.u_scale_b), 'u_pixel_coord_upper': new symbol_layout.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new symbol_layout.Uniform2f(context, locations.u_pixel_coord_lower), 'u_tile_units_to_pixels': new symbol_layout.Uniform1f(context, locations.u_tile_units_to_pixels) }); }; var backgroundUniformValues = function ( matrix , opacity , color ) { return ({ 'u_matrix': matrix, 'u_opacity': opacity, 'u_color': color }); }; var backgroundPatternUniformValues = function ( matrix , opacity , painter , image , tile , crossfade ) { return symbol_layout.extend( bgPatternUniformValues(image, crossfade, painter, tile), { 'u_matrix': matrix, 'u_opacity': opacity } ); }; // var programUniforms = { fillExtrusion: fillExtrusionUniforms, fillExtrusionPattern: fillExtrusionPatternUniforms, fill: fillUniforms, fillPattern: fillPatternUniforms, fillOutline: fillOutlineUniforms, fillOutlinePattern: fillOutlinePatternUniforms, circle: circleUniforms, collisionBox: collisionUniforms, collisionCircle: collisionUniforms, debug: debugUniforms, clippingMask: clippingMaskUniforms, heatmap: heatmapUniforms, heatmapTexture: heatmapTextureUniforms, hillshade: hillshadeUniforms, hillshadePrepare: hillshadePrepareUniforms, line: lineUniforms, lineGradient: lineGradientUniforms, linePattern: linePatternUniforms, lineSDF: lineSDFUniforms, raster: rasterUniforms, symbolIcon: symbolIconUniforms, symbolSDF: symbolSDFUniforms, background: backgroundUniforms, backgroundPattern: backgroundPatternUniforms }; // // Updates the TileMasks for all renderable tiles. A TileMask describes all regions // within that tile that are *not* covered by other renderable tiles. // Example: renderableTiles in our list are 2/1/3, 3/3/6, and 4/5/13. The schematic for creating the // TileMask for 2/1/3 looks like this: // // ┌────────┬────────┬─────────────────┐ // │ │ │#################│ // │ 4/4/12 │ 4/5/12 │#################│ // │ │ │#################│ // ├──────3/2/6──────┤#####3/3/6#######│ // │ │########│#################│ // │ 4/4/13 │#4/5/13#│#################│ // │ │########│#################│ // ├────────┴──────2/1/3───────────────┤ // │ │ │ // │ │ │ // │ │ │ // │ 3/2/7 │ 3/3/7 │ // │ │ │ // │ │ │ // │ │ │ // └─────────────────┴─────────────────┘ // // The TileMask for 2/1/3 thus consists of the tiles 4/4/12, 4/5/12, 4/4/13, 3/2/7, and 3/3/7, // but it does *not* include 4/5/13, and 3/3/6, since these are other renderableTiles. // A TileMask always contains TileIDs *relative* to the tile it is generated for, so 2/1/3 is // "subtracted" from these TileIDs. The final TileMask for 2/1/3 will thus be: // // ┌────────┬────────┬─────────────────┐ // │ │ │#################│ // │ 2/0/0 │ 2/1/0 │#################│ // │ │ │#################│ // ├────────┼────────┤#################│ // │ │########│#################│ // │ 2/0/1 │########│#################│ // │ │########│#################│ // ├────────┴────────┼─────────────────┤ // │ │ │ // │ │ │ // │ │ │ // │ 1/0/1 │ 1/1/1 │ // │ │ │ // │ │ │ // │ │ │ // └─────────────────┴─────────────────┘ // // Only other renderable tiles that are *children* of the tile we are generating the mask for will // be considered. For example, adding TileID 4/8/13 to renderableTiles won't affect the TileMask for // 2/1/3, since it is not a descendant of it. function updateTileMasks(renderableTiles , context ) { var sortedRenderables = renderableTiles.sort(function (a, b) { return a.tileID.isLessThan(b.tileID) ? -1 : b.tileID.isLessThan(a.tileID) ? 1 : 0; }); for (var i = 0; i < sortedRenderables.length; i++) { var mask = {}; var tile = sortedRenderables[i]; var childArray = sortedRenderables.slice(i + 1); // Try to add all remaining ids as children. We sorted the tile list // by z earlier, so all preceding items cannot be children of the current // tile. We also compute the lower bound of the next wrap, because items of the next wrap // can never be children of the current wrap. computeTileMasks(tile.tileID.wrapped(), tile.tileID, childArray, new symbol_layout.OverscaledTileID(0, tile.tileID.wrap + 1, 0, 0, 0), mask); tile.setMask(mask, context); } } function computeTileMasks(rootTile , ref , childArray , lowerBound , mask ) { // If the reference or any of its children is found in the list, we need to recurse. for (var i = 0; i < childArray.length; i++) { var childTile = childArray[i]; // childTile is from a larger wrap than the rootTile so it cannot be a child tile if (lowerBound.isLessThan(childTile.tileID)) { break; } // The current tile is masked out, so we don't need to add them to the mask set. if (ref.key === childTile.tileID.key) { return; } else if (childTile.tileID.isChildOf(ref)) { // There's at least one child tile that is masked out, so recursively descend var children = ref.children(Infinity); for (var j = 0; j < children.length; j++) { var child = children[j]; computeTileMasks(rootTile, child, childArray.slice(i), lowerBound, mask); } return; } } // We couldn't find a child, so it's definitely a masked part. // Compute the difference between the root tile ID and the reference tile ID, since TileMask // elements are always relative (see below for explanation). var diffZ = ref.overscaledZ - rootTile.overscaledZ; var maskTileId = new symbol_layout.CanonicalTileID(diffZ, ref.canonical.x - (rootTile.canonical.x << diffZ), ref.canonical.y - (rootTile.canonical.y << diffZ)); mask[maskTileId.key] = mask[maskTileId.key] || maskTileId; } // function drawCollisionDebugGeometry(painter , sourceCache , layer , coords , drawCircles ) { var context = painter.context; var gl = context.gl; var program = drawCircles ? painter.useProgram('collisionCircle') : painter.useProgram('collisionBox'); for (var i = 0; i < coords.length; i++) { var coord = coords[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var buffers = drawCircles ? bucket.collisionCircle : bucket.collisionBox; if (!buffers) { continue; } program.draw(context, drawCircles ? gl.TRIANGLES : gl.LINES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, collisionUniformValues( coord.posMatrix, painter.transform, tile), layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, buffers.segments, null, painter.transform.zoom, null, null, buffers.collisionVertexBuffer); } } function drawCollisionDebug(painter , sourceCache , layer , coords ) { drawCollisionDebugGeometry(painter, sourceCache, layer, coords, false); drawCollisionDebugGeometry(painter, sourceCache, layer, coords, true); } // var identityMat4 = symbol_layout.identity(new Float32Array(16)); 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. var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); if (layer.paint.get('icon-opacity').constantOr(1) !== 0) { drawLayerSymbols(painter, sourceCache, layer, coords, false, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), layer.layout.get('icon-rotation-alignment'), layer.layout.get('icon-pitch-alignment'), layer.layout.get('icon-keep-upright'), stencilMode, colorMode, variableOffsets ); } 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, variableOffsets ); } if (sourceCache.map.showCollisionBoxes) { drawCollisionDebug(painter, sourceCache, layer, coords); } } function calculateVariableRenderShift(anchor, width, height, radialOffset, textBoxScale, renderTextSize) { var ref = symbol_layout.getAnchorAlignment(anchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var shiftX = -(horizontalAlign - 0.5) * width; var shiftY = -(verticalAlign - 0.5) * height; var offset = symbol_layout.evaluateRadialOffset(anchor, radialOffset); return new symbol_layout.Point( (shiftX / textBoxScale + offset[0]) * renderTextSize, (shiftY / textBoxScale + offset[1]) * renderTextSize ); } function updateVariableAnchors(bucket, rotateWithMap, pitchWithMap, variableOffsets, symbolSize, transform, labelPlaneMatrix, posMatrix, tileScale, size) { var placedSymbols = bucket.text.placedSymbolArray; var dynamicLayoutVertexArray = bucket.text.dynamicLayoutVertexArray; dynamicLayoutVertexArray.clear(); for (var s = 0; s < placedSymbols.length; s++) { var symbol = placedSymbols.get(s); var skipOrientation = bucket.allowVerticalPlacement && !symbol.placedOrientation; var variableOffset = (!symbol.hidden && symbol.crossTileID && !skipOrientation) ? variableOffsets[symbol.crossTileID] : null; 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, dynamicLayoutVertexArray); } else { var tileAnchor = new symbol_layout.Point(symbol.anchorX, symbol.anchorY); var projectedAnchor = project(tileAnchor, pitchWithMap ? posMatrix : labelPlaneMatrix); var perspectiveRatio = 0.5 + 0.5 * (transform.cameraToCenterDistance / projectedAnchor.signedDistanceFromCamera); var renderTextSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / symbol_layout.ONE_EM; if (pitchWithMap) { // Go from size in pixels to equivalent size in tile units renderTextSize *= bucket.tilePixelRatio / tileScale; } var width = variableOffset.width; var height = variableOffset.height; var radialOffset = variableOffset.radialOffset; var textBoxScale = variableOffset.textBoxScale; var shift = calculateVariableRenderShift( variableOffset.anchor, width, height, radialOffset, textBoxScale, renderTextSize); // 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. var shiftedAnchor = pitchWithMap ? project(tileAnchor.add(shift), labelPlaneMatrix).point : projectedAnchor.point.add(rotateWithMap ? shift.rotate(-transform.angle) : shift); var angle = (bucket.allowVerticalPlacement && symbol.placedOrientation === symbol_layout.WritingMode.vertical) ? Math.PI / 2 : 0; for (var g = 0; g < symbol.numGlyphs; g++) { symbol_layout.addDynamicAttributes(dynamicLayoutVertexArray, shiftedAnchor, angle); } } } bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } function updateVerticalLabels(bucket) { var placedSymbols = bucket.text.placedSymbolArray; var dynamicLayoutVertexArray = bucket.text.dynamicLayoutVertexArray; dynamicLayoutVertexArray.clear(); for (var s = 0; s < placedSymbols.length; s++) { var symbol = placedSymbols.get(s); var shouldHide = symbol.hidden || !symbol.placedOrientation; if (shouldHide) { // These symbols are from an orientation 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, dynamicLayoutVertexArray); } else { var tileAnchor = new symbol_layout.Point(symbol.anchorX, symbol.anchorY); var angle = (bucket.allowVerticalPlacement && symbol.placedOrientation === symbol_layout.WritingMode.vertical) ? Math.PI / 2 : 0; for (var g = 0; g < symbol.numGlyphs; g++) { symbol_layout.addDynamicAttributes(dynamicLayoutVertexArray, tileAnchor, angle); } } } bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, rotationAlignment, pitchAlignment, keepUpright, stencilMode, colorMode, variableOffsets) { var context = painter.context; var gl = context.gl; var tr = painter.transform; var rotateWithMap = rotationAlignment === 'map'; var pitchWithMap = pitchAlignment === 'map'; var alongLine = rotateWithMap && layer.layout.get('symbol-placement') !== 'point'; // Line label rotation happens in `updateLineLabels` // Pitched point labels are automatically rotated by the labelPlaneMatrix projection // Unpitched point labels need to have their rotation applied after projection var rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; var sortFeaturesByKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var program; var size; var variablePlacement = layer.layout.get('text-variable-anchor'); var tileRenderState = []; for (var i$1 = 0, list$1 = coords; i$1 < list$1.length; i$1 += 1) { var coord = list$1[i$1]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var buffers = isText ? bucket.text : bucket.icon; if (!buffers || !buffers.segments.get().length) { continue; } var programConfiguration = buffers.programConfigurations.get(layer.id); var isSDF = isText || bucket.sdfIcons; var sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; if (!program) { program = painter.useProgram(isSDF ? 'symbolSDF' : 'symbolIcon', programConfiguration); size = symbol_layout.evaluateSizeForZoom(sizeData, tr.zoom); } context.activeTexture.set(gl.TEXTURE0); var texSize = (void 0) ; var atlasTexture = (void 0); var atlasInterpolation = (void 0); if (isText) { atlasTexture = tile.glyphAtlasTexture; atlasInterpolation = gl.LINEAR; texSize = tile.glyphAtlasTexture.size; } else { var iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear; var iconTransformed = pitchWithMap || tr.pitch !== 0; atlasTexture = tile.imageAtlasTexture; atlasInterpolation = isSDF || painter.options.rotating || painter.options.zooming || iconScaled || iconTransformed ? gl.LINEAR : gl.NEAREST; texSize = tile.imageAtlasTexture.size; } var s = pixelsToTileUnits(tile, 1, painter.transform.zoom); var labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); var glCoordMatrix = getGlCoordMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); if (alongLine) { updateLineLabels(bucket, coord.posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright); } else if (isText && size && variablePlacement) { var tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ); updateVariableAnchors(bucket, rotateWithMap, pitchWithMap, variableOffsets, symbol_layout.symbolSize, tr, labelPlaneMatrix, coord.posMatrix, tileScale, size); } else if (isText && size && bucket.allowVerticalPlacement) { updateVerticalLabels(bucket); } var matrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor), uLabelPlaneMatrix = (alongLine || (isText && variablePlacement)) ? identityMat4 : labelPlaneMatrix, uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true); var hasHalo = isSDF && layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0; var uniformValues = (void 0); if (isSDF) { uniformValues = symbolSDFUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, true); } else { uniformValues = symbolIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize); } var state = { program: program, buffers: buffers, uniformValues: uniformValues, atlasTexture: atlasTexture, atlasInterpolation: atlasInterpolation, isSDF: isSDF, hasHalo: hasHalo }; if (sortFeaturesByKey) { var oldSegments = buffers.segments.get(); for (var i = 0, list = oldSegments; i < list.length; i += 1) { var segment = list[i]; tileRenderState.push({ segments: new symbol_layout.SegmentVector([segment]), sortKey: ((segment.sortKey ) ), state: state }); } } else { tileRenderState.push({ segments: buffers.segments, sortKey: 0, state: state }); } } if (sortFeaturesByKey) { tileRenderState.sort(function (a, b) { return a.sortKey - b.sortKey; }); } for (var i$2 = 0, list$2 = tileRenderState; i$2 < list$2.length; i$2 += 1) { var segmentState = list$2[i$2]; var state$1 = segmentState.state; state$1.atlasTexture.bind(state$1.atlasInterpolation, gl.CLAMP_TO_EDGE); if (state$1.isSDF) { var uniformValues$1 = ((state$1.uniformValues ) ); if (state$1.hasHalo) { uniformValues$1['u_is_halo'] = 1; drawSymbolElements(state$1.buffers, segmentState.segments, layer, painter, state$1.program, depthMode, stencilMode, colorMode, uniformValues$1); } uniformValues$1['u_is_halo'] = 0; } drawSymbolElements(state$1.buffers, segmentState.segments, layer, painter, state$1.program, depthMode, stencilMode, colorMode, state$1.uniformValues); } } function drawSymbolElements(buffers, segments, layer, painter, program, depthMode, stencilMode, colorMode, uniformValues) { var context = painter.context; var gl = context.gl; program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, segments, layer.paint, painter.transform.zoom, buffers.programConfigurations.get(layer.id), buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer); } // function drawCircles(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var opacity = layer.paint.get('circle-opacity'); var strokeWidth = layer.paint.get('circle-stroke-width'); var strokeOpacity = layer.paint.get('circle-stroke-opacity'); var sortFeaturesByKey = layer.layout.get('circle-sort-key').constantOr(1) !== undefined; if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) { return; } var context = painter.context; var gl = context.gl; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); // Turn off stencil testing to allow circles to be drawn across boundaries, // so that large circles are not clipped to tiles var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); var segmentsRenderStates = []; for (var i = 0; i < coords.length; i++) { var coord = coords[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram('circle', programConfiguration); var layoutVertexBuffer = bucket.layoutVertexBuffer; var indexBuffer = bucket.indexBuffer; var uniformValues = circleUniformValues(painter, coord, tile, layer); var state = { programConfiguration: programConfiguration, program: program, layoutVertexBuffer: layoutVertexBuffer, indexBuffer: indexBuffer, uniformValues: uniformValues, }; if (sortFeaturesByKey) { var oldSegments = bucket.segments.get(); for (var i$1 = 0, list = oldSegments; i$1 < list.length; i$1 += 1) { var segment = list[i$1]; segmentsRenderStates.push({ segments: new symbol_layout.SegmentVector([segment]), sortKey: ((segment.sortKey ) ), state: state }); } } else { segmentsRenderStates.push({ segments: bucket.segments, sortKey: 0, state: state }); } } if (sortFeaturesByKey) { segmentsRenderStates.sort(function (a, b) { return a.sortKey - b.sortKey; }); } for (var i$2 = 0, list$1 = segmentsRenderStates; i$2 < list$1.length; i$2 += 1) { var segmentsState = list$1[i$2]; var ref = segmentsState.state; var programConfiguration$1 = ref.programConfiguration; var program$1 = ref.program; var layoutVertexBuffer$1 = ref.layoutVertexBuffer; var indexBuffer$1 = ref.indexBuffer; var uniformValues$1 = ref.uniformValues; var segments = segmentsState.segments; program$1.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues$1, layer.id, layoutVertexBuffer$1, indexBuffer$1, segments, layer.paint, painter.transform.zoom, programConfiguration$1); } } // function drawHeatmap(painter , sourceCache , layer , coords ) { if (layer.paint.get('heatmap-opacity') === 0) { return; } if (painter.renderPass === 'offscreen') { var context = painter.context; var gl = context.gl; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); // Allow kernels to be drawn across boundaries, so that // large kernels are not clipped to tiles var stencilMode = StencilMode.disabled; // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula var colorMode = new ColorMode([gl.ONE, gl.ONE], symbol_layout.Color.transparent, [true, true, true, true]); bindFramebuffer(context, painter, layer); context.clear({ color: symbol_layout.Color.transparent }); for (var i = 0; i < coords.length; i++) { var coord = coords[i]; // Skip tiles that have uncovered parents to avoid flickering; we don't need // to use complex tile masking here because the change between zoom levels is subtle, // so it's fine to simply render the parent until all its 4 children are loaded if (sourceCache.hasRenderableParent(coord)) { continue; } var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram('heatmap', programConfiguration); var ref = painter.transform; var zoom = ref.zoom; program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, heatmapUniformValues(coord.posMatrix, tile, zoom, layer.paint.get('heatmap-intensity')), layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); } context.viewport.set([0, 0, painter.width, painter.height]); } else if (painter.renderPass === 'translucent') { painter.context.setColorMode(painter.colorModeForRenderPass()); renderTextureToMap(painter, layer); } } function bindFramebuffer(context, painter, layer) { var gl = context.gl; context.activeTexture.set(gl.TEXTURE1); // Use a 4x downscaled screen texture for better performance context.viewport.set([0, 0, painter.width / 4, painter.height / 4]); var fbo = layer.heatmapFbo; if (!fbo) { var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); fbo = layer.heatmapFbo = context.createFramebuffer(painter.width / 4, painter.height / 4); bindTextureToFramebuffer(context, painter, texture, fbo); } else { gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); context.bindFramebuffer.set(fbo.framebuffer); } } function bindTextureToFramebuffer(context, painter, texture, fbo) { var gl = context.gl; // Use the higher precision half-float texture where available (producing much smoother looking heatmaps); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, painter.width / 4, painter.height / 4, 0, gl.RGBA, context.extTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE, null); fbo.colorAttachment.set(texture); // If using half-float texture as a render target is not supported, fall back to a low precision texture if (context.extTextureHalfFloat && gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) { context.extTextureHalfFloat = null; fbo.colorAttachment.setDirty(); bindTextureToFramebuffer(context, painter, texture, fbo); } } function renderTextureToMap(painter, layer) { var context = painter.context; var gl = context.gl; // Here we bind two different textures from which we'll sample in drawing // heatmaps: the kernel texture, prepared in the offscreen pass, and a // color ramp texture. var fbo = layer.heatmapFbo; if (!fbo) { return; } context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); context.activeTexture.set(gl.TEXTURE1); var colorRampTexture = layer.colorRampTexture; if (!colorRampTexture) { colorRampTexture = layer.colorRampTexture = new symbol_layout.Texture(context, layer.colorRamp, gl.RGBA); } colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); painter.useProgram('heatmapTexture').draw(context, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, heatmapTextureUniformValues(painter, layer, 0, 1), layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer, painter.viewportSegments, layer.paint, painter.transform.zoom); } // function drawLine(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var opacity = layer.paint.get('line-opacity'); var width = layer.paint.get('line-width'); if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0) { return; } var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var colorMode = painter.colorModeForRenderPass(); var dasharray = layer.paint.get('line-dasharray'); var patternProperty = layer.paint.get('line-pattern'); var image = patternProperty.constantOr((1 )); var gradient = layer.paint.get('line-gradient'); var crossfade = layer.getCrossfadeParameters(); var programId = dasharray ? 'lineSDF' : image ? 'linePattern' : gradient ? 'lineGradient' : 'line'; var context = painter.context; var gl = context.gl; var firstTile = true; if (gradient) { context.activeTexture.set(gl.TEXTURE0); var gradientTexture = layer.gradientTexture; if (!layer.gradient) { return; } if (!gradientTexture) { gradientTexture = layer.gradientTexture = new symbol_layout.Texture(context, layer.gradient, gl.RGBA); } gradientTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); if (image && !tile.patternsLoaded()) { continue; } var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var prevProgram = painter.context.program.get(); var program = painter.useProgram(programId, programConfiguration); var programChanged = firstTile || program.program !== prevProgram; var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var posTo = tile.imageAtlas.patternPositions[constantPattern.to]; var posFrom = tile.imageAtlas.patternPositions[constantPattern.from]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var uniformValues = dasharray ? lineSDFUniformValues(painter, tile, layer, dasharray, crossfade) : image ? linePatternUniformValues(painter, tile, layer, crossfade) : gradient ? lineGradientUniformValues(painter, tile, layer) : lineUniformValues(painter, tile, layer); if (dasharray && (programChanged || painter.lineAtlas.dirty)) { context.activeTexture.set(gl.TEXTURE0); painter.lineAtlas.bind(context); } else if (image) { context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePatternPaintBuffers(crossfade); } program.draw(context, gl.TRIANGLES, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); firstTile = false; // once refactored so that bound texture state is managed, we'll also be able to remove this firstTile/programChanged logic } } // function drawFill(painter , sourceCache , layer , coords ) { var color = layer.paint.get('fill-color'); var opacity = layer.paint.get('fill-opacity'); if (opacity.constantOr(1) === 0) { return; } var colorMode = painter.colorModeForRenderPass(); var pattern = layer.paint.get('fill-pattern'); var pass = painter.opaquePassEnabledForLayer() && (!pattern.constantOr((1 )) && color.constantOr(symbol_layout.Color.transparent).a === 1 && opacity.constantOr(0) === 1) ? 'opaque' : 'translucent'; // Draw fill if (painter.renderPass === pass) { var depthMode = painter.depthModeForSublayer( 1, painter.renderPass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly); drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false); } // Draw stroke if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) { // 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. var depthMode$1 = painter.depthModeForSublayer( layer.getPaintProperty('fill-outline-color') ? 2 : 0, DepthMode.ReadOnly); drawFillTiles(painter, sourceCache, layer, coords, depthMode$1, colorMode, true); } } function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) { var gl = painter.context.gl; var patternProperty = layer.paint.get('fill-pattern'); var image = patternProperty && patternProperty.constantOr((1 )); var crossfade = layer.getCrossfadeParameters(); var 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; } for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); if (image && !tile.patternsLoaded()) { continue; } var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram(programName, programConfiguration); if (image) { painter.context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePatternPaintBuffers(crossfade); } var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var posTo = tile.imageAtlas.patternPositions[constantPattern.to]; var posFrom = tile.imageAtlas.patternPositions[constantPattern.from]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var tileMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor')); if (!isOutline) { indexBuffer = bucket.indexBuffer; segments = bucket.segments; uniformValues = image ? fillPatternUniformValues(tileMatrix, painter, crossfade, tile) : fillUniformValues(tileMatrix); } else { indexBuffer = bucket.indexBuffer2; segments = bucket.segments2; var drawingBufferSize = [gl.drawingBufferWidth, gl.drawingBufferHeight]; uniformValues = (programName === 'fillOutlinePattern' && image) ? fillOutlinePatternUniformValues(tileMatrix, painter, crossfade, tile, drawingBufferSize) : fillOutlineUniformValues(tileMatrix, drawingBufferSize); } program.draw(painter.context, drawMode, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration); } } // function draw(painter , source , layer , coords ) { var opacity = layer.paint.get('fill-extrusion-opacity'); if (opacity === 0) { return; } if (painter.renderPass === 'translucent') { var depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D); if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr((1 ))) { var colorMode = painter.colorModeForRenderPass(); drawExtrusionTiles(painter, source, layer, coords, depthMode, 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, StencilMode.disabled, ColorMode.disabled); // 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()); } } } function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; var patternProperty = layer.paint.get('fill-extrusion-pattern'); var image = patternProperty.constantOr((1 )); var crossfade = layer.getCrossfadeParameters(); var opacity = layer.paint.get('fill-extrusion-opacity'); for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = source.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration); if (image) { painter.context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePatternPaintBuffers(crossfade); } var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var posTo = tile.imageAtlas.patternPositions[constantPattern.to]; var posFrom = tile.imageAtlas.patternPositions[constantPattern.from]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var matrix = painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('fill-extrusion-translate'), layer.paint.get('fill-extrusion-translate-anchor')); var shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient'); var uniformValues = image ? fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) : fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity); program.draw(context, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.backCCW, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); } } // function drawHillshade(painter , sourceCache , layer , tileIDs ) { if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') { return; } var context = painter.context; var sourceMaxZoom = sourceCache.getSource().maxzoom; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var tile = sourceCache.getTile(tileID); if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') { prepareHillshade(painter, tile, layer, sourceMaxZoom, depthMode, stencilMode, colorMode); continue; } else if (painter.renderPass === 'translucent') { renderHillshade(painter, tile, layer, depthMode, stencilMode, colorMode); } } context.viewport.set([0, 0, painter.width, painter.height]); } function renderHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; var fbo = tile.fbo; if (!fbo) { return; } var program = painter.useProgram('hillshade'); context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); var uniformValues = hillshadeUniformValues(painter, tile, layer); if (tile.maskedBoundsBuffer && tile.maskedIndexBuffer && tile.segments) { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, tile.maskedBoundsBuffer, tile.maskedIndexBuffer, tile.segments); } else { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); } } // 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, sourceMaxZoom, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; // decode rgba levels by using integer overflow to convert each Uint32Array element -> 4 Uint8Array elements. // ex. // Uint32: // base 10 - 67308 // base 2 - 0000 0000 0000 0001 0000 0110 1110 1100 // // Uint8: // base 10 - 0, 1, 6, 236 (this order is reversed in the resulting array via the overflow. // first 8 bits represent 236, so the r component of the texture pixel will be 236 etc.) // base 2 - 0000 0000, 0000 0001, 0000 0110, 1110 1100 if (tile.dem && tile.dem.data) { var tileSize = tile.dem.dim; var textureStride = tile.dem.stride; var pixelData = tile.dem.getPixels(); context.activeTexture.set(gl.TEXTURE1); // if UNPACK_PREMULTIPLY_ALPHA_WEBGL is set to true prior to drawHillshade being called // tiles will appear blank, because as you can see above the alpha value for these textures // is always 0 context.pixelStoreUnpackPremultiplyAlpha.set(false); tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride); if (tile.demTexture) { var demTexture = tile.demTexture; demTexture.update(pixelData, { premultiply: false }); demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } else { tile.demTexture = new symbol_layout.Texture(context, pixelData, gl.RGBA, { premultiply: false }); tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } context.activeTexture.set(gl.TEXTURE0); var fbo = tile.fbo; if (!fbo) { var renderTexture = new symbol_layout.Texture(context, {width: tileSize, height: tileSize, data: null}, gl.RGBA); renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); fbo = tile.fbo = context.createFramebuffer(tileSize, tileSize); fbo.colorAttachment.set(renderTexture.texture); } context.bindFramebuffer.set(fbo.framebuffer); context.viewport.set([0, 0, tileSize, tileSize]); painter.useProgram('hillshadePrepare').draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, hillshadeUniformPrepareValues(tile, sourceMaxZoom), layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); tile.needsHillshadePrepare = false; } } // function drawRaster(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } if (layer.paint.get('raster-opacity') === 0) { return; } var context = painter.context; var gl = context.gl; var source = sourceCache.getSource(); var program = painter.useProgram('raster'); var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); var minTileZ = coords.length && coords[0].overscaledZ; var align = !painter.options.moving; for (var i = 0, list = coords; i < list.length; i += 1) { // Set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers // Use gl.LESS to prevent double drawing in areas where tiles overlap. var coord = list[i]; var depthMode = painter.depthModeForSublayer(coord.overscaledZ - minTileZ, layer.paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly, gl.LESS); var tile = sourceCache.getTile(coord); var posMatrix = painter.transform.calculatePosMatrix(coord.toUnwrapped(), align); tile.registerFadeDuration(layer.paint.get('raster-fade-duration')); var parentTile = sourceCache.findLoadedParent(coord, 0), fade = getFadeValues(tile, parentTile, sourceCache, layer, painter.transform); var parentScaleBy = (void 0), parentTL = (void 0); var textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR; context.activeTexture.set(gl.TEXTURE0); tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); context.activeTexture.set(gl.TEXTURE1); if (parentTile) { parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ); parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1]; } else { tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); } var uniformValues = rasterUniformValues(posMatrix, parentTL || [0, 0], parentScaleBy || 1, fade, layer); if (source instanceof ImageSource) { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, source.boundsBuffer, painter.quadTriangleIndexBuffer, source.boundsSegments); } else if (tile.maskedBoundsBuffer && tile.maskedIndexBuffer && tile.segments) { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, tile.maskedBoundsBuffer, tile.maskedIndexBuffer, tile.segments, layer.paint, painter.transform.zoom); } else { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); } } } function getFadeValues(tile, parentTile, sourceCache, layer, transform) { var fadeDuration = layer.paint.get('raster-fade-duration'); if (fadeDuration > 0) { var now = symbol_layout.browser.now(); var sinceTile = (now - tile.timeAdded) / fadeDuration; var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; var source = sourceCache.getSource(); var idealZ = transform.coveringZoomLevel({ tileSize: source.tileSize, roundZoom: source.roundZoom }); // if no parent or parent is older, fade in; if parent is younger, fade out var fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ); var childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : symbol_layout.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 }; } } // function drawBackground(painter , sourceCache , layer ) { var color = layer.paint.get('background-color'); var opacity = layer.paint.get('background-opacity'); if (opacity === 0) { return; } var context = painter.context; var gl = context.gl; var transform = painter.transform; var tileSize = transform.tileSize; var image = layer.paint.get('background-pattern'); if (painter.isPatternMissing(image)) { return; } var pass = (!image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer()) ? 'opaque' : 'translucent'; if (painter.renderPass !== pass) { return; } var stencilMode = StencilMode.disabled; var depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly); var colorMode = painter.colorModeForRenderPass(); var program = painter.useProgram(image ? 'backgroundPattern' : 'background'); var tileIDs = transform.coveringTiles({tileSize: tileSize}); if (image) { context.activeTexture.set(gl.TEXTURE0); painter.imageManager.bind(painter.context); } var crossfade = layer.getCrossfadeParameters(); for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var matrix = painter.transform.calculatePosMatrix(tileID.toUnwrapped()); var uniformValues = image ? backgroundPatternUniformValues(matrix, opacity, painter, image, {tileID: tileID, tileSize: tileSize}, crossfade) : backgroundUniformValues(matrix, opacity, color); program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.tileExtentBuffer, painter.quadTriangleIndexBuffer, painter.tileExtentSegments); } } // function drawDebug(painter , sourceCache , coords ) { for (var i = 0; i < coords.length; i++) { drawDebugTile(painter, sourceCache, coords[i]); } } function drawDebugTile(painter, sourceCache, coord) { var context = painter.context; var gl = context.gl; var posMatrix = coord.posMatrix; var program = painter.useProgram('debug'); var depthMode = DepthMode.disabled; var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); var id = '$debug'; program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues(posMatrix, symbol_layout.Color.red), id, painter.debugBuffer, painter.tileBorderIndexBuffer, painter.debugSegments); var tileRawData = sourceCache.getTileByID(coord.key).latestRawTileData; var tileByteLength = (tileRawData && tileRawData.byteLength) || 0; var tileSizeKb = Math.floor(tileByteLength / 1024); var tileSize = sourceCache.getTile(coord).tileSize; var scaleRatio = 512 / Math.min(tileSize, 512); var vertices = createTextVertices(((coord.toString()) + " " + tileSizeKb + "kb"), 50, 200 * scaleRatio, 5 * scaleRatio); var debugTextArray = new symbol_layout.StructArrayLayout2i4(); var debugTextIndices = new symbol_layout.StructArrayLayout2ui4(); for (var v = 0; v < vertices.length; v += 2) { debugTextArray.emplaceBack(vertices[v], vertices[v + 1]); debugTextIndices.emplaceBack(v, v + 1); } var debugTextBuffer = context.createVertexBuffer(debugTextArray, posAttributes.members); var debugTextIndexBuffer = context.createIndexBuffer(debugTextIndices); var debugTextSegment = symbol_layout.SegmentVector.simpleSegment(0, 0, debugTextArray.length / 2, debugTextArray.length / 2); // Draw the halo with multiple 1px lines instead of one wider line because // the gl spec doesn't guarantee support for lines with width > 1. var onePixel = symbol_layout.EXTENT / (Math.pow(2, painter.transform.zoom - coord.overscaledZ) * tileSize * scaleRatio); var haloWidth = 1; var translations = []; for (var x = -haloWidth; x <= haloWidth; x++) { for (var y = -haloWidth; y <= haloWidth; y++) { if (x === 0 && y === 0) { // don't draw the halo at 0,0 since the text is drawn there break; } translations.push([x, y]); } } for (var i = 0; i < translations.length; i++) { var translation = translations[i]; program.draw(context, gl.LINES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues( symbol_layout.translate([], posMatrix, [ onePixel * translation[0], onePixel * translation[1], 0]), symbol_layout.Color.white), id, debugTextBuffer, debugTextIndexBuffer, debugTextSegment); } program.draw(context, gl.LINES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues(posMatrix, symbol_layout.Color.black), id, debugTextBuffer, debugTextIndexBuffer, debugTextSegment); } // Font data From Hershey Simplex Font // http://paulbourke.net/dataformats/hershey/ var simplexFont = { " ": [16, []], "!": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], "\"": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]], "#": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]], "$": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], "%": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]], "&": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]], "'": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]], "(": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]], ")": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]], "*": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]], "+": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]], ",": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], "-": [26, [4, 9, 22, 9]], ".": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], "/": [22, [20, 25, 2, -7]], "0": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]], "1": [20, [6, 17, 8, 18, 11, 21, 11, 0]], "2": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]], "3": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], "4": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]], "5": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], "6": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]], "7": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]], "8": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]], "9": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]], ":": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], ";": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], "<": [24, [20, 18, 4, 9, 20, 0]], "=": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]], ">": [24, [4, 18, 20, 9, 4, 0]], "?": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]], "@": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]], "A": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]], "B": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]], "C": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]], "D": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]], "E": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]], "F": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]], "G": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]], "H": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]], "I": [8, [4, 21, 4, 0]], "J": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]], "K": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]], "L": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]], "M": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]], "N": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]], "O": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]], "P": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]], "Q": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]], "R": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]], "S": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], "T": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]], "U": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]], "V": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]], "W": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]], "X": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]], "Y": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]], "Z": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]], "[": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]], "\\": [14, [0, 21, 14, -3]], "]": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]], "^": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]], "_": [16, [0, -2, 16, -2]], "`": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]], "a": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "b": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], "c": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "d": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "e": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "f": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]], "g": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "h": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], "i": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]], "j": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]], "k": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]], "l": [8, [4, 21, 4, 0]], "m": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]], "n": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], "o": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]], "p": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], "q": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "r": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]], "s": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]], "t": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]], "u": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]], "v": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]], "w": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]], "x": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]], "y": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]], "z": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]], "{": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]], "|": [8, [4, 25, 4, -7]], "}": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]], "~": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]] }; function createTextVertices(text, left, baseline, scale) { scale = scale || 1; var strokes = []; var i, len, j, len2, glyph, x, y, prev; for (i = 0, len = text.length; i < len; i++) { glyph = simplexFont[text[i]]; if (!glyph) { continue; } prev = null; for (j = 0, len2 = glyph[1].length; j < len2; j += 2) { if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) { prev = null; } else { x = left + glyph[1][j] * scale; y = baseline - glyph[1][j + 1] * scale; if (prev) { strokes.push(prev.x, prev.y, x, y); } prev = {x: x, y: y}; } } left += glyph[0] * scale; } return strokes; } // function drawCustom(painter , sourceCache , layer ) { var context = painter.context; var implementation = layer.implementation; if (painter.renderPass === 'offscreen') { var prerender = implementation.prerender; if (prerender) { painter.setCustomLayerDefaults(); context.setColorMode(painter.colorModeForRenderPass()); prerender.call(implementation, context.gl, painter.transform.customLayerMatrix()); context.setDirty(); painter.setBaseState(); } } else if (painter.renderPass === 'translucent') { painter.setCustomLayerDefaults(); context.setColorMode(painter.colorModeForRenderPass()); context.setStencilMode(StencilMode.disabled); var depthMode = implementation.renderingMode === '3d' ? new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D) : painter.depthModeForSublayer(0, DepthMode.ReadOnly); context.setDepthMode(depthMode); implementation.render(context.gl, painter.transform.customLayerMatrix()); context.setDirty(); painter.setBaseState(); context.bindFramebuffer.set(null); } } // var draw$1 = { symbol: drawSymbols, circle: drawCircles, heatmap: drawHeatmap, line: drawLine, fill: drawFill, 'fill-extrusion': draw, hillshade: drawHillshade, raster: drawRaster, background: drawBackground, debug: drawDebug, custom: drawCustom }; /** * Initialize a new painter object. * * @param {Canvas} gl an experimental-webgl drawing context * @private */ var Painter = function Painter(gl , transform ) { this.context = new Context(gl); this.transform = transform; this._tileTextures = {}; this.setup(); // Within each layer there are multiple distinct z-planes that can be drawn to. // This is implemented using the WebGL depth buffer. this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1; this.depthEpsilon = 1 / Math.pow(2, 16); this.depthRboNeedsClear = true; this.emptyProgramConfiguration = new symbol_layout.ProgramConfiguration(); this.crossTileSymbolIndex = new CrossTileSymbolIndex(); }; /* * Update the GL viewport, projection matrix, and transforms to compensate * for a new width and height value. */ Painter.prototype.resize = function resize (width , height ) { var gl = this.context.gl; this.width = width * symbol_layout.browser.devicePixelRatio; this.height = height * symbol_layout.browser.devicePixelRatio; this.context.viewport.set([0, 0, this.width, this.height]); if (this.style) { for (var i = 0, list = this.style._order; i < list.length; i += 1) { var layerId = list[i]; this.style._layers[layerId].resize(); } } if (this.depthRbo) { gl.deleteRenderbuffer(this.depthRbo); this.depthRbo = null; } }; Painter.prototype.setup = function setup () { var context = this.context; var tileExtentArray = new symbol_layout.StructArrayLayout2i4(); tileExtentArray.emplaceBack(0, 0); tileExtentArray.emplaceBack(symbol_layout.EXTENT, 0); tileExtentArray.emplaceBack(0, symbol_layout.EXTENT); tileExtentArray.emplaceBack(symbol_layout.EXTENT, symbol_layout.EXTENT); this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, posAttributes.members); this.tileExtentSegments = symbol_layout.SegmentVector.simpleSegment(0, 0, 4, 2); var debugArray = new symbol_layout.StructArrayLayout2i4(); debugArray.emplaceBack(0, 0); debugArray.emplaceBack(symbol_layout.EXTENT, 0); debugArray.emplaceBack(0, symbol_layout.EXTENT); debugArray.emplaceBack(symbol_layout.EXTENT, symbol_layout.EXTENT); this.debugBuffer = context.createVertexBuffer(debugArray, posAttributes.members); this.debugSegments = symbol_layout.SegmentVector.simpleSegment(0, 0, 4, 5); var rasterBoundsArray = new symbol_layout.StructArrayLayout4i8(); rasterBoundsArray.emplaceBack(0, 0, 0, 0); rasterBoundsArray.emplaceBack(symbol_layout.EXTENT, 0, symbol_layout.EXTENT, 0); rasterBoundsArray.emplaceBack(0, symbol_layout.EXTENT, 0, symbol_layout.EXTENT); rasterBoundsArray.emplaceBack(symbol_layout.EXTENT, symbol_layout.EXTENT, symbol_layout.EXTENT, symbol_layout.EXTENT); this.rasterBoundsBuffer = context.createVertexBuffer(rasterBoundsArray, symbol_layout.rasterBoundsAttributes.members); this.rasterBoundsSegments = symbol_layout.SegmentVector.simpleSegment(0, 0, 4, 2); var viewportArray = new symbol_layout.StructArrayLayout2i4(); viewportArray.emplaceBack(0, 0); viewportArray.emplaceBack(1, 0); viewportArray.emplaceBack(0, 1); viewportArray.emplaceBack(1, 1); this.viewportBuffer = context.createVertexBuffer(viewportArray, posAttributes.members); this.viewportSegments = symbol_layout.SegmentVector.simpleSegment(0, 0, 4, 2); var tileLineStripIndices = new symbol_layout.StructArrayLayout1ui2(); tileLineStripIndices.emplaceBack(0); tileLineStripIndices.emplaceBack(1); tileLineStripIndices.emplaceBack(3); tileLineStripIndices.emplaceBack(2); tileLineStripIndices.emplaceBack(0); this.tileBorderIndexBuffer = context.createIndexBuffer(tileLineStripIndices); var quadTriangleIndices = new symbol_layout.StructArrayLayout3ui6(); quadTriangleIndices.emplaceBack(0, 1, 2); quadTriangleIndices.emplaceBack(2, 1, 3); this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices); var gl = this.context.gl; this.stencilClearMode = new StencilMode({ func: gl.ALWAYS, mask: 0 }, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO); }; /* * Reset the drawing canvas by clearing the stencil buffer so that we can draw * new tiles at the same location, while retaining previously drawn pixels. */ Painter.prototype.clearStencil = function clearStencil () { var context = this.context; var gl = context.gl; this.nextStencilID = 1; this.currentStencilSource = undefined; // 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 }) var matrix = symbol_layout.create(); symbol_layout.ortho(matrix, 0, this.width, this.height, 0, 0, 1); symbol_layout.scale(matrix, matrix, [gl.drawingBufferWidth, gl.drawingBufferHeight, 0]); this.useProgram('clippingMask').draw(context, gl.TRIANGLES, DepthMode.disabled, this.stencilClearMode, ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(matrix), '$clipping', this.viewportBuffer, this.quadTriangleIndexBuffer, this.viewportSegments); }; Painter.prototype._renderTileClippingMasks = function _renderTileClippingMasks (layer , tileIDs ) { if (this.currentStencilSource === layer.source || !layer.isTileClipped() || !tileIDs || !tileIDs.length) { return; } this.currentStencilSource = layer.source; var context = this.context; var gl = context.gl; if (this.nextStencilID + tileIDs.length > 256) { // we'll run out of fresh IDs so we need to clear and start from scratch this.clearStencil(); } context.setColorMode(ColorMode.disabled); context.setDepthMode(DepthMode.disabled); var program = this.useProgram('clippingMask'); this._tileClippingMaskIDs = {}; for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++; program.draw(context, gl.TRIANGLES, DepthMode.disabled, // Tests will always pass, and ref value will be written to stencil buffer. new StencilMode({ func: gl.ALWAYS, mask: 0 }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(tileID.posMatrix), '$clipping', this.tileExtentBuffer, this.quadTriangleIndexBuffer, this.tileExtentSegments); } }; Painter.prototype.stencilModeFor3D = function stencilModeFor3D () { this.currentStencilSource = undefined; if (this.nextStencilID + 1 > 256) { this.clearStencil(); } var id = this.nextStencilID++; var gl = this.context.gl; return new StencilMode({ func: gl.NOTEQUAL, mask: 0xFF }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); }; Painter.prototype.stencilModeForClipping = function stencilModeForClipping (tileID ) { var gl = this.context.gl; return new StencilMode({ func: gl.EQUAL, mask: 0xFF }, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE); }; Painter.prototype.colorModeForRenderPass = function colorModeForRenderPass () { var gl = this.context.gl; if (this._showOverdrawInspector) { var numOverdrawSteps = 8; var a = 1 / numOverdrawSteps; return new ColorMode([gl.CONSTANT_COLOR, gl.ONE], new symbol_layout.Color(a, a, a, 0), [true, true, true, true]); } else if (this.renderPass === 'opaque') { return ColorMode.unblended; } else { return ColorMode.alphaBlended; } }; Painter.prototype.depthModeForSublayer = function depthModeForSublayer (n , mask , func ) { if (!this.opaquePassEnabledForLayer()) { return DepthMode.disabled; } var depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon; return new DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]); }; /* * 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. */ Painter.prototype.opaquePassEnabledForLayer = function opaquePassEnabledForLayer () { return this.currentLayer < this.opaquePassCutoff; }; Painter.prototype.render = function render (style , options ) { this.style = style; this.options = options; this.lineAtlas = style.lineAtlas; this.imageManager = style.imageManager; this.glyphManager = style.glyphManager; this.symbolFadeChange = style.placement.symbolFadeChange(symbol_layout.browser.now()); this.imageManager.beginFrame(); var layerIds = this.style._order; var sourceCaches = this.style.sourceCaches; for (var id in sourceCaches) { var sourceCache = sourceCaches[id]; if (sourceCache.used) { sourceCache.prepare(this.context); } } var coordsAscending = {}; var coordsDescending = {}; var coordsDescendingSymbol = {}; for (var id$1 in sourceCaches) { var sourceCache$1 = sourceCaches[id$1]; coordsAscending[id$1] = sourceCache$1.getVisibleCoordinates(); coordsDescending[id$1] = coordsAscending[id$1].slice().reverse(); coordsDescendingSymbol[id$1] = sourceCache$1.getVisibleCoordinates(true).reverse(); } for (var id$2 in sourceCaches) { var sourceCache$2 = sourceCaches[id$2]; var source = sourceCache$2.getSource(); if (source.type !== 'raster' && source.type !== 'raster-dem') { continue; } var visibleTiles = []; for (var i$1 = 0, list = coordsAscending[id$2]; i$1 < list.length; i$1 += 1) { var coord = list[i$1]; visibleTiles.push(sourceCache$2.getTile(coord)); } updateTileMasks(visibleTiles, this.context); } this.opaquePassCutoff = Infinity; for (var i = 0; i < layerIds.length; i++) { var layerId = layerIds[i]; if (this.style._layers[layerId].is3D()) { this.opaquePassCutoff = i; break; } } // 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'; this.depthRboNeedsClear = true; for (var i$2 = 0, list$1 = layerIds; i$2 < list$1.length; i$2 += 1) { var layerId$1 = list$1[i$2]; var layer = this.style._layers[layerId$1]; if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom)) { continue; } var coords = coordsDescending[layer.source]; if (layer.type !== 'custom' && !coords.length) { continue; } this.renderLayer(this, sourceCaches[layer.source], layer, coords); } // Rebind the main framebuffer now that all offscreen layers have been rendered: this.context.bindFramebuffer.set(null); // Clear buffers in preparation for drawing to the main framebuffer this.context.clear({ color: options.showOverdrawInspector ? symbol_layout.Color.black : symbol_layout.Color.transparent, depth: 1 }); this.clearStencil(); this._showOverdrawInspector = options.showOverdrawInspector; this.depthRangeFor3D = [0, 1 - ((style._order.length + 2) * this.numSublayers * this.depthEpsilon)]; // Opaque pass =============================================== // Draw opaque layers top-to-bottom first. this.renderPass = 'opaque'; for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) { var layer$1 = this.style._layers[layerIds[this.currentLayer]]; var sourceCache$3 = sourceCaches[layer$1.source]; var coords$1 = coordsAscending[layer$1.source]; this._renderTileClippingMasks(layer$1, coords$1); this.renderLayer(this, sourceCache$3, layer$1, coords$1); } // Translucent pass =============================================== // Draw all other layers bottom-to-top. this.renderPass = 'translucent'; for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) { var layer$2 = this.style._layers[layerIds[this.currentLayer]]; var sourceCache$4 = sourceCaches[layer$2.source]; // 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 var coords$2 = (layer$2.type === 'symbol' ? coordsDescendingSymbol : coordsDescending)[layer$2.source]; this._renderTileClippingMasks(layer$2, coordsAscending[layer$2.source]); this.renderLayer(this, sourceCache$4, layer$2, coords$2); } if (this.options.showTileBoundaries) { for (var id$3 in sourceCaches) { draw$1.debug(this, sourceCaches[id$3], coordsAscending[id$3]); break; } } // Set defaults for most GL values so that anyone using the state after the render // encounters more expected values. this.context.setDefault(); }; Painter.prototype.setupOffscreenDepthRenderbuffer = function setupOffscreenDepthRenderbuffer () { var context = this.context; // All of the 3D textures will use the same depth renderbuffer. if (!this.depthRbo) { this.depthRbo = context.createRenderbuffer(context.gl.DEPTH_COMPONENT16, this.width, this.height); } }; Painter.prototype.renderLayer = function renderLayer (painter , sourceCache , layer , coords ) { if (layer.isHidden(this.transform.zoom)) { return; } if (layer.type !== 'background' && layer.type !== 'custom' && !coords.length) { return; } this.id = layer.id; draw$1[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets); }; /** * Transform a matrix to incorporate the *-translate and *-translate-anchor properties into it. * @param inViewportPixelUnitsUnits True when the units accepted by the matrix are in viewport pixels instead of tile units. * @returns {Float32Array} matrix */ Painter.prototype.translatePosMatrix = function translatePosMatrix (matrix , tile , translate , translateAnchor , inViewportPixelUnitsUnits ) { if (!translate[0] && !translate[1]) { return matrix; } var angle = inViewportPixelUnitsUnits ? (translateAnchor === 'map' ? this.transform.angle : 0) : (translateAnchor === 'viewport' ? -this.transform.angle : 0); if (angle) { var sinA = Math.sin(angle); var cosA = Math.cos(angle); translate = [ translate[0] * cosA - translate[1] * sinA, translate[0] * sinA + translate[1] * cosA ]; } var translation = [ inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom), inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom), 0 ]; var translatedMatrix = new Float32Array(16); symbol_layout.translate(translatedMatrix, matrix, translation); return translatedMatrix; }; Painter.prototype.saveTileTexture = function saveTileTexture (texture ) { var textures = this._tileTextures[texture.size[0]]; if (!textures) { this._tileTextures[texture.size[0]] = [texture]; } else { textures.push(texture); } }; Painter.prototype.getTileTexture = function getTileTexture (size ) { var textures = this._tileTextures[size]; return textures && textures.length > 0 ? textures.pop() : null; }; /** * 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. */ Painter.prototype.isPatternMissing = function isPatternMissing (image ) { if (!image) { return false; } var imagePosA = this.imageManager.getPattern(image.from); var imagePosB = this.imageManager.getPattern(image.to); return !imagePosA || !imagePosB; }; Painter.prototype.useProgram = function useProgram (name , programConfiguration) { if ( programConfiguration === void 0 ) programConfiguration = this.emptyProgramConfiguration; this.cache = this.cache || {}; var key = "" + name + (programConfiguration.cacheKey || '') + (this._showOverdrawInspector ? '/overdraw' : ''); if (!this.cache[key]) { this.cache[key] = new Program$1(this.context, shaders[name], programConfiguration, programUniforms[name], this._showOverdrawInspector); } return this.cache[key]; }; /* * Reset some GL state to default values to avoid hard-to-debug bugs * in custom layers. */ Painter.prototype.setCustomLayerDefaults = function 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(); // 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.activeTexture.setDefault(); this.context.pixelStoreUnpack.setDefault(); this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(); this.context.pixelStoreUnpackFlipY.setDefault(); }; /* * Set GL state that is shared by all layers. */ Painter.prototype.setBaseState = function setBaseState () { var 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); }; // function tileCover(z , bounds , actualZ , renderWorldCopies ) { if (renderWorldCopies === undefined) { renderWorldCopies = true; } var tiles = 1 << z; var t = {}; function scanLine(x0, x1, y) { var x, w, wx, coord; if (y >= 0 && y <= tiles) { for (x = x0; x < x1; x++) { w = Math.floor(x / tiles); wx = (x % tiles + tiles) % tiles; if (w === 0 || renderWorldCopies === true) { coord = new symbol_layout.OverscaledTileID(actualZ, w, z, wx, y); t[coord.key] = coord; } } } } var zoomedBounds = bounds.map(function (coord) { return new symbol_layout.Point(coord.x, coord.y)._mult(tiles); }); // Divide the screen up in two triangles and scan each of them: // +---/ // | / | // /---+ scanTriangle(zoomedBounds[0], zoomedBounds[1], zoomedBounds[2], 0, tiles, scanLine); scanTriangle(zoomedBounds[2], zoomedBounds[3], zoomedBounds[0], 0, tiles, scanLine); return Object.keys(t).map(function (id) { return t[id]; }); } // Taken from polymaps src/Layer.js // https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383 function edge(a , b ) { if (a.y > b.y) { var t = a; a = b; b = t; } return { x0: a.x, y0: a.y, x1: b.x, y1: b.y, dx: b.x - a.x, dy: b.y - a.y }; } function scanSpans(e0, e1, ymin, ymax, scanLine) { var y0 = Math.max(ymin, Math.floor(e1.y0)); var y1 = Math.min(ymax, Math.ceil(e1.y1)); // sort edges by x-coordinate if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ? (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) : (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) { var t = e0; e0 = e1; e1 = t; } // scan lines! var m0 = e0.dx / e0.dy; var m1 = e1.dx / e1.dy; var d0 = e0.dx > 0; // use y + 1 to compute x0 var d1 = e1.dx < 0; // use y + 1 to compute x1 for (var y = y0; y < y1; y++) { var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0; var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0; scanLine(Math.floor(x1), Math.ceil(x0), y); } } function scanTriangle(a , b , c , ymin, ymax, scanLine) { var ab = edge(a, b), bc = edge(b, c), ca = edge(c, a); var t; // sort edges by y-length if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; } if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; } if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; } // scan span! scan span! if (ab.dy) { scanSpans(ca, ab, ymin, ymax, scanLine); } if (bc.dy) { scanSpans(ca, bc, ymin, ymax, scanLine); } } // /** * A single transform, generally used for a single tile to be * scaled, rotated, and zoomed. * @private */ var Transform = function Transform(minZoom , maxZoom , renderWorldCopies ) { this.tileSize = 512; // constant this.maxValidLatitude = 85.051129; // constant this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies; this._minZoom = minZoom || 0; this._maxZoom = maxZoom || 22; this.setMaxBounds(); this.width = 0; this.height = 0; this._center = new symbol_layout.LngLat(0, 0); this.zoom = 0; this.angle = 0; this._fov = 0.6435011087932844; this._pitch = 0; this._unmodified = true; this._posMatrixCache = {}; this._alignedPosMatrixCache = {}; }; var prototypeAccessors = { minZoom: { configurable: true },maxZoom: { configurable: true },renderWorldCopies: { configurable: true },worldSize: { configurable: true },centerPoint: { configurable: true },size: { configurable: true },bearing: { configurable: true },pitch: { configurable: true },fov: { configurable: true },zoom: { configurable: true },center: { configurable: true },unmodified: { configurable: true },point: { configurable: true } }; Transform.prototype.clone = function clone () { var clone = new Transform(this._minZoom, this._maxZoom, this._renderWorldCopies); clone.tileSize = this.tileSize; clone.latRange = this.latRange; clone.width = this.width; clone.height = this.height; clone._center = this._center; clone.zoom = this.zoom; clone.angle = this.angle; clone._fov = this._fov; clone._pitch = this._pitch; clone._unmodified = this._unmodified; clone._calcMatrices(); return clone; }; prototypeAccessors.minZoom.get = function () { return this._minZoom; }; prototypeAccessors.minZoom.set = function (zoom ) { if (this._minZoom === zoom) { return; } this._minZoom = zoom; this.zoom = Math.max(this.zoom, zoom); }; prototypeAccessors.maxZoom.get = function () { return this._maxZoom; }; prototypeAccessors.maxZoom.set = function (zoom ) { if (this._maxZoom === zoom) { return; } this._maxZoom = zoom; this.zoom = Math.min(this.zoom, zoom); }; prototypeAccessors.renderWorldCopies.get = function () { return this._renderWorldCopies; }; prototypeAccessors.renderWorldCopies.set = function (renderWorldCopies ) { if (renderWorldCopies === undefined) { renderWorldCopies = true; } else if (renderWorldCopies === null) { renderWorldCopies = false; } this._renderWorldCopies = renderWorldCopies; }; prototypeAccessors.worldSize.get = function () { return this.tileSize * this.scale; }; prototypeAccessors.centerPoint.get = function () { return this.size._div(2); }; prototypeAccessors.size.get = function () { return new symbol_layout.Point(this.width, this.height); }; prototypeAccessors.bearing.get = function () { return -this.angle / Math.PI * 180; }; prototypeAccessors.bearing.set = function (bearing ) { var b = -symbol_layout.wrap(bearing, -180, 180) * Math.PI / 180; if (this.angle === b) { return; } this._unmodified = false; this.angle = b; this._calcMatrices(); // 2x2 matrix for rotating points this.rotationMatrix = symbol_layout.create$2(); symbol_layout.rotate(this.rotationMatrix, this.rotationMatrix, this.angle); }; prototypeAccessors.pitch.get = function () { return this._pitch / Math.PI * 180; }; prototypeAccessors.pitch.set = function (pitch ) { var p = symbol_layout.clamp(pitch, 0, 60) / 180 * Math.PI; if (this._pitch === p) { return; } this._unmodified = false; this._pitch = p; this._calcMatrices(); }; prototypeAccessors.fov.get = function () { return this._fov / Math.PI * 180; }; prototypeAccessors.fov.set = function (fov ) { fov = Math.max(0.01, Math.min(60, fov)); if (this._fov === fov) { return; } this._unmodified = false; this._fov = fov / 180 * Math.PI; this._calcMatrices(); }; prototypeAccessors.zoom.get = function () { return this._zoom; }; prototypeAccessors.zoom.set = function (zoom ) { var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); if (this._zoom === z) { return; } this._unmodified = false; this._zoom = z; this.scale = this.zoomScale(z); this.tileZoom = Math.floor(z); this.zoomFraction = z - this.tileZoom; this._constrain(); this._calcMatrices(); }; prototypeAccessors.center.get = function () { return this._center; }; prototypeAccessors.center.set = function (center ) { if (center.lat === this._center.lat && center.lng === this._center.lng) { return; } this._unmodified = false; this._center = center; this._constrain(); this._calcMatrices(); }; /** * Return a zoom level that will cover all tiles the transform * @param {Object} options * @param {number} options.tileSize * @param {boolean} options.roundZoom * @returns {number} zoom level */ Transform.prototype.coveringZoomLevel = function coveringZoomLevel (options ) { return (options.roundZoom ? Math.round : Math.floor)( this.zoom + this.scaleZoom(this.tileSize / options.tileSize) ); }; /** * Return any "wrapped" copies of a given tile coordinate that are visible * in the current view. * * @private */ Transform.prototype.getVisibleUnwrappedCoordinates = function getVisibleUnwrappedCoordinates (tileID ) { var result = [new symbol_layout.UnwrappedTileID(0, tileID)]; if (this._renderWorldCopies) { var utl = this.pointCoordinate(new symbol_layout.Point(0, 0)); var utr = this.pointCoordinate(new symbol_layout.Point(this.width, 0)); var ubl = this.pointCoordinate(new symbol_layout.Point(this.width, this.height)); var ubr = this.pointCoordinate(new symbol_layout.Point(0, this.height)); var w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x)); var 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. var extraWorldCopy = 1; for (var w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) { if (w === 0) { continue; } result.push(new symbol_layout.UnwrappedTileID(w, tileID)); } } return result; }; /** * Return all coordinates that could cover this transform for a covering * zoom level. * @param {Object} options * @param {number} options.tileSize * @param {number} options.minzoom * @param {number} options.maxzoom * @param {boolean} options.roundZoom * @param {boolean} options.reparseOverscaled * @param {boolean} options.renderWorldCopies * @returns {Array} OverscaledTileIDs */ Transform.prototype.coveringTiles = function coveringTiles ( options ) { var z = this.coveringZoomLevel(options); var actualZ = z; if (options.minzoom !== undefined && z < options.minzoom) { return []; } if (options.maxzoom !== undefined && z > options.maxzoom) { z = options.maxzoom; } var centerCoord = symbol_layout.MercatorCoordinate.fromLngLat(this.center); var numTiles = Math.pow(2, z); var centerPoint = new symbol_layout.Point(numTiles * centerCoord.x - 0.5, numTiles * centerCoord.y - 0.5); var cornerCoords = [ this.pointCoordinate(new symbol_layout.Point(0, 0)), this.pointCoordinate(new symbol_layout.Point(this.width, 0)), this.pointCoordinate(new symbol_layout.Point(this.width, this.height)), this.pointCoordinate(new symbol_layout.Point(0, this.height)) ]; return tileCover(z, cornerCoords, options.reparseOverscaled ? actualZ : z, this._renderWorldCopies) .sort(function (a, b) { return centerPoint.dist(a.canonical) - centerPoint.dist(b.canonical); }); }; Transform.prototype.resize = function resize (width , height ) { this.width = width; this.height = height; this.pixelsToGLUnits = [2 / width, -2 / height]; this._constrain(); this._calcMatrices(); }; prototypeAccessors.unmodified.get = function () { return this._unmodified; }; Transform.prototype.zoomScale = function zoomScale (zoom ) { return Math.pow(2, zoom); }; Transform.prototype.scaleZoom = function scaleZoom (scale ) { return Math.log(scale) / Math.LN2; }; Transform.prototype.project = function project (lnglat ) { var lat = symbol_layout.clamp(lnglat.lat, -this.maxValidLatitude, this.maxValidLatitude); return new symbol_layout.Point( symbol_layout.mercatorXfromLng(lnglat.lng) * this.worldSize, symbol_layout.mercatorYfromLat(lat) * this.worldSize); }; Transform.prototype.unproject = function unproject (point ) { return new symbol_layout.MercatorCoordinate(point.x / this.worldSize, point.y / this.worldSize).toLngLat(); }; prototypeAccessors.point.get = function () { return this.project(this.center); }; Transform.prototype.setLocationAtPoint = function setLocationAtPoint (lnglat , point ) { var a = this.pointCoordinate(point); var b = this.pointCoordinate(this.centerPoint); var loc = this.locationCoordinate(lnglat); var newCenter = new symbol_layout.MercatorCoordinate( loc.x - (a.x - b.x), loc.y - (a.y - b.y)); this.center = this.coordinateLocation(newCenter); if (this._renderWorldCopies) { this.center = this.center.wrap(); } }; /** * Given a location, return the screen point that corresponds to it * @param {LngLat} lnglat location * @returns {Point} screen point */ Transform.prototype.locationPoint = function locationPoint (lnglat ) { return this.coordinatePoint(this.locationCoordinate(lnglat)); }; /** * Given a point on screen, return its lnglat * @param {Point} p screen point * @returns {LngLat} lnglat location */ Transform.prototype.pointLocation = function pointLocation (p ) { return this.coordinateLocation(this.pointCoordinate(p)); }; /** * Given a geographical lnglat, return an unrounded * coordinate that represents it at this transform's zoom level. * @param {LngLat} lnglat * @returns {Coordinate} */ Transform.prototype.locationCoordinate = function locationCoordinate (lnglat ) { return symbol_layout.MercatorCoordinate.fromLngLat(lnglat); }; /** * Given a Coordinate, return its geographical position. * @param {Coordinate} coord * @returns {LngLat} lnglat */ Transform.prototype.coordinateLocation = function coordinateLocation (coord ) { return coord.toLngLat(); }; Transform.prototype.pointCoordinate = function pointCoordinate (p ) { var targetZ = 0; // since we don't know the correct projected z value for the point, // unproject two points to get a line and then find the point on that // line with z=0 var coord0 = [p.x, p.y, 0, 1]; var coord1 = [p.x, p.y, 1, 1]; symbol_layout.transformMat4(coord0, coord0, this.pixelMatrixInverse); symbol_layout.transformMat4(coord1, coord1, this.pixelMatrixInverse); var w0 = coord0[3]; var w1 = coord1[3]; var x0 = coord0[0] / w0; var x1 = coord1[0] / w1; var y0 = coord0[1] / w0; var y1 = coord1[1] / w1; var z0 = coord0[2] / w0; var z1 = coord1[2] / w1; var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); return new symbol_layout.MercatorCoordinate( symbol_layout.number(x0, x1, t) / this.worldSize, symbol_layout.number(y0, y1, t) / this.worldSize); }; /** * Given a coordinate, return the screen point that corresponds to it * @param {Coordinate} coord * @returns {Point} screen point */ Transform.prototype.coordinatePoint = function coordinatePoint (coord ) { var p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1]; symbol_layout.transformMat4(p, p, this.pixelMatrix); return new symbol_layout.Point(p[0] / p[3], p[1] / p[3]); }; /** * 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. */ Transform.prototype.getBounds = function getBounds () { return new symbol_layout.LngLatBounds() .extend(this.pointLocation(new symbol_layout.Point(0, 0))) .extend(this.pointLocation(new symbol_layout.Point(this.width, 0))) .extend(this.pointLocation(new symbol_layout.Point(this.width, this.height))) .extend(this.pointLocation(new symbol_layout.Point(0, this.height))); }; /** * Returns the maximum geographical bounds the map is constrained to, or `null` if none set. */ Transform.prototype.getMaxBounds = function getMaxBounds () { if (!this.latRange || this.latRange.length !== 2 || !this.lngRange || this.lngRange.length !== 2) { return null; } return new symbol_layout.LngLatBounds([this.lngRange[0], this.latRange[0]], [this.lngRange[1], this.latRange[1]]); }; /** * Sets or clears the map's geographical constraints. */ Transform.prototype.setMaxBounds = function setMaxBounds (bounds ) { if (bounds) { this.lngRange = [bounds.getWest(), bounds.getEast()]; this.latRange = [bounds.getSouth(), bounds.getNorth()]; this._constrain(); } else { this.lngRange = null; this.latRange = [-this.maxValidLatitude, this.maxValidLatitude]; } }; /** * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map. * @param {UnwrappedTileID} unwrappedTileID; */ Transform.prototype.calculatePosMatrix = function calculatePosMatrix (unwrappedTileID , aligned) { if ( aligned === void 0 ) aligned = false; var posMatrixKey = unwrappedTileID.key; var cache = aligned ? this._alignedPosMatrixCache : this._posMatrixCache; if (cache[posMatrixKey]) { return cache[posMatrixKey]; } var canonical = unwrappedTileID.canonical; var scale = this.worldSize / this.zoomScale(canonical.z); var unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap; var posMatrix = symbol_layout.identity(new Float64Array(16)); symbol_layout.translate(posMatrix, posMatrix, [unwrappedX * scale, canonical.y * scale, 0]); symbol_layout.scale(posMatrix, posMatrix, [scale / symbol_layout.EXTENT, scale / symbol_layout.EXTENT, 1]); symbol_layout.multiply(posMatrix, aligned ? this.alignedProjMatrix : this.projMatrix, posMatrix); cache[posMatrixKey] = new Float32Array(posMatrix); return cache[posMatrixKey]; }; Transform.prototype.customLayerMatrix = function customLayerMatrix () { return this.mercatorMatrix.slice(); }; Transform.prototype._constrain = function _constrain () { if (!this.center || !this.width || !this.height || this._constraining) { return; } this._constraining = true; var minY = -90; var maxY = 90; var minX = -180; var maxX = 180; var sy, sx, x2, y2; var size = this.size, unmodified = this._unmodified; if (this.latRange) { var latRange = this.latRange; minY = symbol_layout.mercatorYfromLat(latRange[1]) * this.worldSize; maxY = symbol_layout.mercatorYfromLat(latRange[0]) * this.worldSize; sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0; } if (this.lngRange) { var lngRange = this.lngRange; minX = symbol_layout.mercatorXfromLng(lngRange[0]) * this.worldSize; maxX = symbol_layout.mercatorXfromLng(lngRange[1]) * this.worldSize; sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0; } var point = this.point; // how much the map should scale to fit the screen into given latitude/longitude ranges var s = Math.max(sx || 0, sy || 0); if (s) { this.center = this.unproject(new symbol_layout.Point( sx ? (maxX + minX) / 2 : point.x, sy ? (maxY + minY) / 2 : point.y)); this.zoom += this.scaleZoom(s); this._unmodified = unmodified; this._constraining = false; return; } if (this.latRange) { var y = point.y, h2 = size.y / 2; if (y - h2 < minY) { y2 = minY + h2; } if (y + h2 > maxY) { y2 = maxY - h2; } } if (this.lngRange) { var x = point.x, w2 = size.x / 2; if (x - w2 < minX) { x2 = minX + w2; } if (x + w2 > maxX) { x2 = maxX - w2; } } // pan the map if the screen goes off the range if (x2 !== undefined || y2 !== undefined) { this.center = this.unproject(new symbol_layout.Point( x2 !== undefined ? x2 : point.x, y2 !== undefined ? y2 : point.y)); } this._unmodified = unmodified; this._constraining = false; }; Transform.prototype._calcMatrices = function _calcMatrices () { if (!this.height) { return; } this.cameraToCenterDistance = 0.5 / Math.tan(this._fov / 2) * this.height; // Find the distance from the center point [width/2, height/2] to the // center top point [width/2, 0] in Z units, using the law of sines. // 1 Z unit is equivalent to 1 horizontal px at the center of the map // (the distance between[width/2, height/2] and [width/2 + 1, height/2]) var halfFov = this._fov / 2; var groundAngle = Math.PI / 2 + this._pitch; var topHalfSurfaceDistance = Math.sin(halfFov) * this.cameraToCenterDistance / Math.sin(Math.PI - groundAngle - halfFov); var point = this.point; var x = point.x, y = point.y; // Calculate z distance of the farthest fragment that should be rendered. var furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.cameraToCenterDistance; // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance` var farZ = furthestDistance * 1.01; // 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. var nearZ = this.height / 50; // matrix for conversion from location to GL coordinates (-1 .. 1) var m = new Float64Array(16); symbol_layout.perspective(m, this._fov, this.width / this.height, nearZ, farZ); symbol_layout.scale(m, m, [1, -1, 1]); symbol_layout.translate(m, m, [0, 0, -this.cameraToCenterDistance]); symbol_layout.rotateX(m, m, this._pitch); symbol_layout.rotateZ(m, m, this.angle); symbol_layout.translate(m, m, [-x, -y, 0]); // The mercatorMatrix can be used to transform points from mercator coordinates // ([0, 0] nw, [1, 1] se) to GL coordinates. this.mercatorMatrix = symbol_layout.scale([], m, [this.worldSize, this.worldSize, this.worldSize]); // scale vertically to meters per pixel (inverse of ground resolution): symbol_layout.scale(m, m, [1, 1, symbol_layout.mercatorZfromAltitude(1, this.center.lat) * this.worldSize, 1]); this.projMatrix = m; // Make a second projection matrix that is aligned to a pixel grid for rendering raster tiles. // We're rounding the (floating point) x/y values to achieve to avoid rendering raster images to fractional // coordinates. Additionally, we adjust by half a pixel in either direction in case that viewport dimension // is an odd integer to preserve rendering to the pixel grid. We're rotating this shift based on the angle // of the transformation so that 0°, 90°, 180°, and 270° rasters are crisp, and adjust the shift so that // it is always <= 0.5 pixels. var xShift = (this.width % 2) / 2, yShift = (this.height % 2) / 2, angleCos = Math.cos(this.angle), angleSin = Math.sin(this.angle), dx = x - Math.round(x) + angleCos * xShift + angleSin * yShift, dy = y - Math.round(y) + angleCos * yShift + angleSin * xShift; var alignedM = new Float64Array(m); symbol_layout.translate(alignedM, alignedM, [ dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0 ]); this.alignedProjMatrix = alignedM; m = symbol_layout.create(); symbol_layout.scale(m, m, [this.width / 2, -this.height / 2, 1]); symbol_layout.translate(m, m, [1, -1, 0]); this.labelPlaneMatrix = m; m = symbol_layout.create(); symbol_layout.scale(m, m, [1, -1, 1]); symbol_layout.translate(m, m, [-1, -1, 0]); symbol_layout.scale(m, m, [2 / this.width, 2 / this.height, 1]); this.glCoordMatrix = m; // matrix for conversion from location to screen coordinates this.pixelMatrix = symbol_layout.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix); // inverse matrix for conversion from screen coordinaes to location m = symbol_layout.invert(new Float64Array(16), this.pixelMatrix); if (!m) { throw new Error("failed to invert matrix"); } this.pixelMatrixInverse = m; this._posMatrixCache = {}; this._alignedPosMatrixCache = {}; }; Transform.prototype.maxPitchScaleFactor = function maxPitchScaleFactor () { // calcMatrices hasn't run yet if (!this.pixelMatrixInverse) { return 1; } var coord = this.pointCoordinate(new symbol_layout.Point(0, 0)); var p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1]; var topPoint = symbol_layout.transformMat4(p, p, this.pixelMatrix); return topPoint[3] / this.cameraToCenterDistance; }; /* * 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. */ Transform.prototype.getCameraPoint = function getCameraPoint () { var pitch = this._pitch; var yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1); return this.centerPoint.add(new symbol_layout.Point(0, yOffset)); }; /* * 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 includes all of the original query as well as all possible ares of the * screen where the *base* of a visible extrusion could be. * - For point queries, the line from the query point to the "camera point" * - For other geometries, the envelope of the query geometry and the "camera point" */ Transform.prototype.getCameraQueryGeometry = function getCameraQueryGeometry (queryGeometry ) { var c = this.getCameraPoint(); if (queryGeometry.length === 1) { return [queryGeometry[0], c]; } else { var minX = c.x; var minY = c.y; var maxX = c.x; var maxY = c.y; for (var i = 0, list = queryGeometry; i < list.length; i += 1) { var p = list[i]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } return [ new symbol_layout.Point(minX, minY), new symbol_layout.Point(maxX, minY), new symbol_layout.Point(maxX, maxY), new symbol_layout.Point(minX, maxY), new symbol_layout.Point(minX, minY) ]; } }; Object.defineProperties( Transform.prototype, prototypeAccessors ); // strict /** * Throttle the given function to run at most every `period` milliseconds. Throttle the given function to run at most every period milliseconds. * @private */ function throttle(fn , time ) { var pending = false; var timerId = null; var later = function () { timerId = null; if (pending) { fn(); timerId = setTimeout(later, time); pending = false; } }; return function () { pending = true; if (!timerId) { later(); } return timerId; }; } // /* * Adds the map's position to its page's location hash. * Passed as an option to the map object. * * @returns {Hash} `this` */ var Hash = function Hash() { symbol_layout.bindAll([ '_onHashChange', '_updateHash' ], this); // Mobile Safari doesn't allow updating the hash more than 100 times per 30 seconds. this._updateHash = throttle(this._updateHashUnthrottled.bind(this), 30 * 1000 / 100); }; /* * Map element to listen for coordinate changes * * @param {Object} map * @returns {Hash} `this` */ Hash.prototype.addTo = function addTo (map ) { this._map = map; symbol_layout.window.addEventListener('hashchange', this._onHashChange, false); this._map.on('moveend', this._updateHash); return this; }; /* * Removes hash * * @returns {Popup} `this` */ Hash.prototype.remove = function remove () { symbol_layout.window.removeEventListener('hashchange', this._onHashChange, false); this._map.off('moveend', this._updateHash); clearTimeout(this._updateHash()); delete this._map; return this; }; Hash.prototype.getHashString = function getHashString (mapFeedback ) { var center = this._map.getCenter(), zoom = Math.round(this._map.getZoom() * 100) / 100, // derived from equation: 512px * 2^z / 360 / 10^d < 0.5px precision = Math.ceil((zoom * Math.LN2 + Math.log(512 / 360 / 0.5)) / Math.LN10), m = Math.pow(10, precision), lng = Math.round(center.lng * m) / m, lat = Math.round(center.lat * m) / m, bearing = this._map.getBearing(), pitch = this._map.getPitch(); var hash = ''; if (mapFeedback) { // new map feedback site has some constraints that don't allow // us to use the same hash format as we do for the Map hash option. hash += "#/" + lng + "/" + lat + "/" + zoom; } else { hash += "#" + zoom + "/" + lat + "/" + lng; } if (bearing || pitch) { hash += (("/" + (Math.round(bearing * 10) / 10))); } if (pitch) { hash += (("/" + (Math.round(pitch)))); } return hash; }; Hash.prototype._onHashChange = function _onHashChange () { var loc = symbol_layout.window.location.hash.replace('#', '').split('/'); if (loc.length >= 3) { this._map.jumpTo({ center: [+loc[2], +loc[1]], zoom: +loc[0], bearing: +(loc[3] || 0), pitch: +(loc[4] || 0) }); return true; } return false; }; Hash.prototype._updateHashUnthrottled = function _updateHashUnthrottled () { var hash = this.getHashString(); try { symbol_layout.window.history.replaceState(symbol_layout.window.history.state, '', hash); } catch (SecurityError) { // IE11 does not allow this if the page is within an iframe created // with iframe.contentWindow.document.write(...). // https://github.com/mapbox/mapbox-gl-js/issues/7410 } }; // /** * `MapMouseEvent` is the event type for mouse-related map events. * @extends {Object} */ var MapMouseEvent = /*@__PURE__*/(function (Event) { function MapMouseEvent(type , map , originalEvent , data) { if ( data === void 0 ) data = {}; var point = DOM.mousePos(map.getCanvasContainer(), originalEvent); var lngLat = map.unproject(point); Event.call(this, type, symbol_layout.extend({ point: point, lngLat: lngLat, originalEvent: originalEvent }, data)); this._defaultPrevented = false; this.target = map; } if ( Event ) MapMouseEvent.__proto__ = Event; MapMouseEvent.prototype = Object.create( Event && Event.prototype ); MapMouseEvent.prototype.constructor = MapMouseEvent; var prototypeAccessors = { defaultPrevented: { configurable: true } }; MapMouseEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. */ prototypeAccessors.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapMouseEvent.prototype, prototypeAccessors ); return MapMouseEvent; }(symbol_layout.Event)); /** * `MapTouchEvent` is the event type for touch-related map events. * @extends {Object} */ var MapTouchEvent = /*@__PURE__*/(function (Event) { function MapTouchEvent(type , map , originalEvent ) { var points = DOM.touchPos(map.getCanvasContainer(), originalEvent); var lngLats = points.map(function (t) { return map.unproject(t); }); var point = points.reduce(function (prev, curr, i, arr) { return prev.add(curr.div(arr.length)); }, new symbol_layout.Point(0, 0)); var lngLat = map.unproject(point); Event.call(this, type, { points: points, point: point, lngLats: lngLats, lngLat: lngLat, originalEvent: originalEvent }); this._defaultPrevented = false; } if ( Event ) MapTouchEvent.__proto__ = Event; MapTouchEvent.prototype = Object.create( Event && Event.prototype ); MapTouchEvent.prototype.constructor = MapTouchEvent; var prototypeAccessors$1 = { defaultPrevented: { configurable: true } }; MapTouchEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. */ prototypeAccessors$1.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapTouchEvent.prototype, prototypeAccessors$1 ); return MapTouchEvent; }(symbol_layout.Event)); /** * `MapWheelEvent` is the event type for the `wheel` map event. * @extends {Object} */ var MapWheelEvent = /*@__PURE__*/(function (Event) { function MapWheelEvent(type , map , originalEvent ) { Event.call(this, type, { originalEvent: originalEvent }); this._defaultPrevented = false; } if ( Event ) MapWheelEvent.__proto__ = Event; MapWheelEvent.prototype = Object.create( Event && Event.prototype ); MapWheelEvent.prototype.constructor = MapWheelEvent; var prototypeAccessors$2 = { defaultPrevented: { configurable: true } }; MapWheelEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. */ prototypeAccessors$2.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapWheelEvent.prototype, prototypeAccessors$2 ); return MapWheelEvent; }(symbol_layout.Event)); /** * @typedef {Object} MapBoxZoomEvent * @property {MouseEvent} originalEvent */ /** * A `MapDataEvent` object is emitted with the {@link Map.event:data} * and {@link Map.event:dataloading} events. Possible values for * `dataType`s are: * * - `'source'`: The non-tile data associated with any source * - `'style'`: The [style](https://www.mapbox.com/mapbox-gl-style-spec/) used by the map * * @typedef {Object} MapDataEvent * @property {string} type The event type. * @property {string} dataType The type of data that has changed. One of `'source'`, `'style'`. * @property {boolean} [isSourceLoaded] True if the event has a `dataType` of `source` and the source has no outstanding network requests. * @property {Object} [source] The [style spec representation of the source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) if the event has a `dataType` of `source`. * @property {string} [sourceDataType] Included if the event has a `dataType` of `source` and the event signals * that internal data has been received or changed. Possible values are `metadata` and `content`. * @property {Object} [tile] The tile being loaded or changed, if the event has a `dataType` of `source` and * the event is related to loading of a tile. * @property {Coordinate} [coord] The coordinate of the tile if the event has a `dataType` of `source` and * the event is related to loading of a tile. */ // // deltaY value for mouse scroll wheel identification var wheelZoomDelta = 4.000244140625; // These magic numbers control the rate of zoom. Trackpad events fire at a greater // frequency than mouse scroll wheel, so reduce the zoom rate per wheel tick var defaultZoomRate = 1 / 100; var wheelZoomRate = 1 / 450; // upper bound on how much we scale the map in any single render frame; this // is used to limit zoom rate in the case of very fast scrolling var maxScalePerFrame = 2; /** * The `ScrollZoomHandler` allows the user to zoom the map by scrolling. */ var ScrollZoomHandler = function ScrollZoomHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); this._delta = 0; this._defaultZoomRate = defaultZoomRate; this._wheelZoomRate = wheelZoomRate; symbol_layout.bindAll([ '_onWheel', '_onTimeout', '_onScrollFrame', '_onScrollFinished' ], this); }; /** * Set the zoom rate of a trackpad * @param {number} [zoomRate = 1/100] */ ScrollZoomHandler.prototype.setZoomRate = function setZoomRate (zoomRate ) { this._defaultZoomRate = zoomRate; }; /** * Set the zoom rate of a mouse wheel * @param {number} [wheelZoomRate = 1/450] */ ScrollZoomHandler.prototype.setWheelZoomRate = function setWheelZoomRate (wheelZoomRate ) { this._wheelZoomRate = wheelZoomRate; }; /** * Returns a Boolean indicating whether the "scroll to zoom" interaction is enabled. * * @returns {boolean} `true` if the "scroll to zoom" interaction is enabled. */ ScrollZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /* * Active state is turned on and off with every scroll wheel event and is set back to false before the map * render is called, so _active is not a good candidate for determining if a scroll zoom animation is in * progress. */ ScrollZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; ScrollZoomHandler.prototype.isZooming = function isZooming () { return !!this._zooming; }; /** * Enables the "scroll to zoom" interaction. * * @param {Object} [options] * @param {string} [options.around] If "center" is passed, map will zoom around center of map * * @example * map.scrollZoom.enable(); * @example * map.scrollZoom.enable({ around: 'center' }) */ ScrollZoomHandler.prototype.enable = function enable (options ) { if (this.isEnabled()) { return; } this._enabled = true; this._aroundCenter = options && options.around === 'center'; }; /** * Disables the "scroll to zoom" interaction. * * @example * map.scrollZoom.disable(); */ ScrollZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._enabled = false; }; ScrollZoomHandler.prototype.onWheel = function onWheel (e ) { if (!this.isEnabled()) { return; } // Remove `any` cast when https://github.com/facebook/flow/issues/4879 is fixed. var value = e.deltaMode === (symbol_layout.window.WheelEvent ).DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY; var now = symbol_layout.browser.now(), timeDelta = now - (this._lastWheelEventTime || 0); this._lastWheelEventTime = now; if (value !== 0 && (value % wheelZoomDelta) === 0) { // This one is definitely a mouse wheel event. this._type = 'wheel'; } else if (value !== 0 && Math.abs(value) < 4) { // This one is definitely a trackpad event because it is so small. this._type = 'trackpad'; } else if (timeDelta > 400) { // This is likely a new scroll action. this._type = null; this._lastValue = value; // Start a timeout in case this was a singular event, and dely it by up to 40ms. this._timeout = setTimeout(this._onTimeout, 40, e); } else if (!this._type) { // This is a repeating event, but we don't know the type of event just yet. // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode. this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel'; // Make sure our delayed event isn't fired again, because we accumulate // the previous event (which was less than 40ms ago) into this event. if (this._timeout) { clearTimeout(this._timeout); this._timeout = null; value += this._lastValue; } } // Slow down zoom if shift key is held for more precise zooming if (e.shiftKey && value) { value = value / 4; } // Only fire the callback if we actually know what type of scrolling device the user uses. if (this._type) { this._lastWheelEvent = e; this._delta -= value; if (!this.isActive()) { this._start(e); } } e.preventDefault(); }; ScrollZoomHandler.prototype._onTimeout = function _onTimeout (initialEvent ) { this._type = 'wheel'; this._delta -= this._lastValue; if (!this.isActive()) { this._start(initialEvent); } }; ScrollZoomHandler.prototype._start = function _start (e ) { if (!this._delta) { return; } if (this._frameId) { this._map._cancelRenderFrame(this._frameId); this._frameId = null; } this._active = true; if (!this.isZooming()) { this._zooming = true; this._map.fire(new symbol_layout.Event('movestart', {originalEvent: e})); this._map.fire(new symbol_layout.Event('zoomstart', {originalEvent: e})); } if (this._finishTimeout) { clearTimeout(this._finishTimeout); } var pos = DOM.mousePos(this._el, e); this._around = symbol_layout.LngLat.convert(this._aroundCenter ? this._map.getCenter() : this._map.unproject(pos)); this._aroundPoint = this._map.transform.locationPoint(this._around); if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onScrollFrame); } }; ScrollZoomHandler.prototype._onScrollFrame = function _onScrollFrame () { var this$1 = this; this._frameId = null; if (!this.isActive()) { return; } var tr = this._map.transform; // if we've had scroll events since the last render frame, consume the // accumulated delta, and update the target zoom level accordingly if (this._delta !== 0) { // For trackpad events and single mouse wheel ticks, use the default zoom rate var zoomRate = (this._type === 'wheel' && Math.abs(this._delta) > wheelZoomDelta) ? this._wheelZoomRate : this._defaultZoomRate; // Scale by sigmoid of scroll wheel delta. var scale = maxScalePerFrame / (1 + Math.exp(-Math.abs(this._delta * zoomRate))); if (this._delta < 0 && scale !== 0) { scale = 1 / scale; } var fromScale = typeof this._targetZoom === 'number' ? tr.zoomScale(this._targetZoom) : tr.scale; this._targetZoom = Math.min(tr.maxZoom, Math.max(tr.minZoom, tr.scaleZoom(fromScale * scale))); // if this is a mouse wheel, refresh the starting zoom and easing // function we're using to smooth out the zooming between wheel // events if (this._type === 'wheel') { this._startZoom = tr.zoom; this._easing = this._smoothOutEasing(200); } this._delta = 0; } var targetZoom = typeof this._targetZoom === 'number' ? this._targetZoom : tr.zoom; var startZoom = this._startZoom; var easing = this._easing; var finished = false; if (this._type === 'wheel' && startZoom && easing) { symbol_layout.assert(easing && typeof startZoom === 'number'); var t = Math.min((symbol_layout.browser.now() - this._lastWheelEventTime) / 200, 1); var k = easing(t); tr.zoom = symbol_layout.number(startZoom, targetZoom, k); if (t < 1) { if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onScrollFrame); } } else { finished = true; } } else { tr.zoom = targetZoom; finished = true; } tr.setLocationAtPoint(this._around, this._aroundPoint); this._map.fire(new symbol_layout.Event('move', {originalEvent: this._lastWheelEvent})); this._map.fire(new symbol_layout.Event('zoom', {originalEvent: this._lastWheelEvent})); if (finished) { this._active = false; this._finishTimeout = setTimeout(function () { this$1._zooming = false; this$1._map.fire(new symbol_layout.Event('zoomend', {originalEvent: this$1._lastWheelEvent})); this$1._map.fire(new symbol_layout.Event('moveend', {originalEvent: this$1._lastWheelEvent})); delete this$1._targetZoom; }, 200); } }; ScrollZoomHandler.prototype._smoothOutEasing = function _smoothOutEasing (duration ) { var easing = symbol_layout.ease; if (this._prevEase) { var ease = this._prevEase, t = (symbol_layout.browser.now() - ease.start) / ease.duration, speed = ease.easing(t + 0.01) - ease.easing(t), // Quick hack to make new bezier that is continuous with last x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, y = Math.sqrt(0.27 * 0.27 - x * x); easing = symbol_layout.bezier(x, y, 0.25, 1); } this._prevEase = { start: symbol_layout.browser.now(), duration: duration, easing: easing }; return easing; }; // /** * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box. * The bounding box is defined by clicking and holding `shift` while dragging the cursor. */ var BoxZoomHandler = function BoxZoomHandler(map , options ) { this._map = map; this._el = map.getCanvasContainer(); this._container = map.getContainer(); this._clickTolerance = options.clickTolerance || 1; symbol_layout.bindAll([ '_onMouseMove', '_onMouseUp', '_onKeyDown' ], this); }; /** * Returns a Boolean indicating whether the "box zoom" interaction is enabled. * * @returns {boolean} `true` if the "box zoom" interaction is enabled. */ BoxZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "box zoom" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "box zoom" interaction is active. */ BoxZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "box zoom" interaction. * * @example * map.boxZoom.enable(); */ BoxZoomHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._enabled = true; }; /** * Disables the "box zoom" interaction. * * @example * map.boxZoom.disable(); */ BoxZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._enabled = false; }; BoxZoomHandler.prototype.onMouseDown = function onMouseDown (e ) { if (!this.isEnabled()) { return; } if (!(e.shiftKey && e.button === 0)) { return; } symbol_layout.window.document.addEventListener('mousemove', this._onMouseMove, false); symbol_layout.window.document.addEventListener('keydown', this._onKeyDown, false); symbol_layout.window.document.addEventListener('mouseup', this._onMouseUp, false); DOM.disableDrag(); this._startPos = this._lastPos = DOM.mousePos(this._el, e); this._active = true; }; BoxZoomHandler.prototype._onMouseMove = function _onMouseMove (e ) { var pos = DOM.mousePos(this._el, e); if (this._lastPos.equals(pos) || (!this._box && pos.dist(this._startPos) < this._clickTolerance)) { return; } var p0 = this._startPos; this._lastPos = pos; if (!this._box) { this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); this._container.classList.add('mapboxgl-crosshair'); this._fireEvent('boxzoomstart', e); } var minX = Math.min(p0.x, pos.x), maxX = Math.max(p0.x, pos.x), minY = Math.min(p0.y, pos.y), maxY = Math.max(p0.y, pos.y); DOM.setTransform(this._box, ("translate(" + minX + "px," + minY + "px)")); this._box.style.width = (maxX - minX) + "px"; this._box.style.height = (maxY - minY) + "px"; }; BoxZoomHandler.prototype._onMouseUp = function _onMouseUp (e ) { if (e.button !== 0) { return; } var p0 = this._startPos, p1 = DOM.mousePos(this._el, e); this._finish(); DOM.suppressClick(); if (p0.x === p1.x && p0.y === p1.y) { this._fireEvent('boxzoomcancel', e); } else { this._map .fitScreenCoordinates(p0, p1, this._map.getBearing(), {linear: true}) .fire(new symbol_layout.Event('boxzoomend', { originalEvent: e})); } }; BoxZoomHandler.prototype._onKeyDown = function _onKeyDown (e ) { if (e.keyCode === 27) { this._finish(); this._fireEvent('boxzoomcancel', e); } }; BoxZoomHandler.prototype._finish = function _finish () { this._active = false; symbol_layout.window.document.removeEventListener('mousemove', this._onMouseMove, false); symbol_layout.window.document.removeEventListener('keydown', this._onKeyDown, false); symbol_layout.window.document.removeEventListener('mouseup', this._onMouseUp, false); this._container.classList.remove('mapboxgl-crosshair'); if (this._box) { DOM.remove(this._box); this._box = (null ); } DOM.enableDrag(); delete this._startPos; delete this._lastPos; }; BoxZoomHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(new symbol_layout.Event(type, { originalEvent: e })); }; // var inertiaLinearity = 0.25, inertiaEasing = symbol_layout.bezier(0, 0, inertiaLinearity, 1), inertiaMaxSpeed = 180, // deg/s inertiaDeceleration = 720; // deg/s^2 /** * The `DragRotateHandler` allows the user to rotate the map by clicking and * dragging the cursor while holding the right mouse button or `ctrl` key. */ var DragRotateHandler = function DragRotateHandler(map , options ) { this._map = map; this._el = options.element || map.getCanvasContainer(); this._state = 'disabled'; this._button = options.button || 'right'; this._bearingSnap = options.bearingSnap || 0; this._pitchWithRotate = options.pitchWithRotate !== false; symbol_layout.bindAll([ 'onMouseDown', '_onMouseMove', '_onMouseUp', '_onBlur', '_onDragFrame' ], this); }; /** * Returns a Boolean indicating whether the "drag to rotate" interaction is enabled. * * @returns {boolean} `true` if the "drag to rotate" interaction is enabled. */ DragRotateHandler.prototype.isEnabled = function isEnabled () { return this._state !== 'disabled'; }; /** * Returns a Boolean indicating whether the "drag to rotate" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "drag to rotate" interaction is active. */ DragRotateHandler.prototype.isActive = function isActive () { return this._state === 'active'; }; /** * Enables the "drag to rotate" interaction. * * @example * map.dragRotate.enable(); */ DragRotateHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._state = 'enabled'; }; /** * Disables the "drag to rotate" interaction. * * @example * map.dragRotate.disable(); */ DragRotateHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } switch (this._state) { case 'active': this._state = 'disabled'; this._unbind(); this._deactivate(); this._fireEvent('rotateend'); if (this._pitchWithRotate) { this._fireEvent('pitchend'); } this._fireEvent('moveend'); break; case 'pending': this._state = 'disabled'; this._unbind(); break; default: this._state = 'disabled'; break; } }; DragRotateHandler.prototype.onMouseDown = function onMouseDown (e ) { if (this._state !== 'enabled') { return; } var touchEvent = e.type === 'touchstart'; if (touchEvent) { this._startTime = Date.now(); } else { if (this._button === 'right') { this._eventButton = DOM.mouseButton(e); if (this._eventButton !== (e.ctrlKey ? 0 : 2)) { return; } } else { if (e.ctrlKey || DOM.mouseButton(e) !== 0) { return; } this._eventButton = 0; } } DOM.disableDrag(); // Bind window-level event listeners for move and up/end events. In the absence of // the pointer capture API, which is not supported by all necessary platforms, // 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. if (touchEvent) { symbol_layout.window.document.addEventListener('touchmove', this._onMouseMove, { capture: true }); symbol_layout.window.document.addEventListener('touchend', this._onMouseUp); } else { symbol_layout.window.document.addEventListener('mousemove', this._onMouseMove, { capture: true }); symbol_layout.window.document.addEventListener('mouseup', this._onMouseUp); } // Deactivate when the window loses focus. Otherwise if a mouseup occurs when the window // isn't in focus, dragging will continue even though the mouse is no longer pressed. symbol_layout.window.addEventListener('blur', this._onBlur); this._state = 'pending'; this._inertia = [[symbol_layout.browser.now(), this._map.getBearing()]]; this._startPos = this._prevPos = this._lastPos = DOM.mousePos(this._el, e); this._center = this._map.transform.centerPoint; // Center of rotation e.preventDefault(); }; DragRotateHandler.prototype._onMouseMove = function _onMouseMove (e ) { var pos = DOM.mousePos(this._el, e); if (this._lastPos.equals(pos)) { return; } this._lastMoveEvent = e; this._lastPos = pos; if (this._state === 'pending') { this._state = 'active'; this._fireEvent('rotatestart', e); this._fireEvent('movestart', e); if (this._pitchWithRotate) { this._fireEvent('pitchstart', e); } } if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onDragFrame); } }; DragRotateHandler.prototype._onDragFrame = function _onDragFrame () { this._frameId = null; var e = this._lastMoveEvent; if (!e) { return; } var tr = this._map.transform; var p1 = this._prevPos, p2 = this._lastPos, bearingDiff = (p1.x - p2.x) * 0.8, pitchDiff = (p1.y - p2.y) * -0.5, bearing = tr.bearing - bearingDiff, pitch = tr.pitch - pitchDiff, inertia = this._inertia, last = inertia[inertia.length - 1]; this._drainInertiaBuffer(); inertia.push([symbol_layout.browser.now(), this._map._normalizeBearing(bearing, last[1])]); tr.bearing = bearing; if (this._pitchWithRotate) { this._fireEvent('pitch', e); tr.pitch = pitch; } this._fireEvent('rotate', e); this._fireEvent('move', e); delete this._lastMoveEvent; this._prevPos = this._lastPos; }; DragRotateHandler.prototype._onMouseUp = function _onMouseUp (e ) { var touchEvent = e.type === 'touchend'; if (touchEvent && (this._startPos === this._lastPos) && (Date.now() - this._startTime) < 300) { this._el.click(); } if (DOM.mouseButton(e) !== this._eventButton) { return; } switch (this._state) { case 'active': this._state = 'enabled'; DOM.suppressClick(); this._unbind(); this._deactivate(); this._inertialRotate(e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: symbol_layout.assert(false); break; } }; DragRotateHandler.prototype._onBlur = function _onBlur (e ) { switch (this._state) { case 'active': this._state = 'enabled'; this._unbind(); this._deactivate(); this._fireEvent('rotateend', e); if (this._pitchWithRotate) { this._fireEvent('pitchend', e); } this._fireEvent('moveend', e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: symbol_layout.assert(false); break; } }; DragRotateHandler.prototype._unbind = function _unbind () { symbol_layout.window.document.removeEventListener('mousemove', this._onMouseMove, { capture: true }); symbol_layout.window.document.removeEventListener('mouseup', this._onMouseUp); symbol_layout.window.document.removeEventListener('touchmove', this._onMouseMove, { capture: true }); symbol_layout.window.document.removeEventListener('touchend', this._onMouseUp); symbol_layout.window.removeEventListener('blur', this._onBlur); DOM.enableDrag(); }; DragRotateHandler.prototype._deactivate = function _deactivate () { if (this._frameId) { this._map._cancelRenderFrame(this._frameId); this._frameId = null; } delete this._lastMoveEvent; delete this._startPos; delete this._prevPos; delete this._lastPos; }; DragRotateHandler.prototype._inertialRotate = function _inertialRotate (e ) { var this$1 = this; this._fireEvent('rotateend', e); this._drainInertiaBuffer(); var map = this._map, mapBearing = map.getBearing(), inertia = this._inertia; var finish = function () { if (Math.abs(mapBearing) < this$1._bearingSnap) { map.resetNorth({noMoveStart: true}, { originalEvent: e }); } else { this$1._fireEvent('moveend', e); } if (this$1._pitchWithRotate) { this$1._fireEvent('pitchend', e); } }; if (inertia.length < 2) { finish(); return; } var first = inertia[0], last = inertia[inertia.length - 1], previous = inertia[inertia.length - 2]; var bearing = map._normalizeBearing(mapBearing, previous[1]); var flingDiff = last[1] - first[1], sign = flingDiff < 0 ? -1 : 1, flingDuration = (last[0] - first[0]) / 1000; if (flingDiff === 0 || flingDuration === 0) { finish(); return; } var speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration)); // deg/s if (speed > inertiaMaxSpeed) { speed = inertiaMaxSpeed; } var duration = speed / (inertiaDeceleration * inertiaLinearity), offset = sign * speed * (duration / 2); bearing += offset; if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) { bearing = map._normalizeBearing(0, bearing); } map.rotateTo(bearing, { duration: duration * 1000, easing: inertiaEasing, noMoveStart: true }, { originalEvent: e }); }; DragRotateHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(new symbol_layout.Event(type, e ? { originalEvent: e } : {})); }; DragRotateHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = symbol_layout.browser.now(), cutoff = 160; //msec while (inertia.length > 0 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; // var inertiaLinearity$1 = 0.3, inertiaEasing$1 = symbol_layout.bezier(0, 0, inertiaLinearity$1, 1), inertiaMaxSpeed$1 = 1400, // px/s inertiaDeceleration$1 = 2500; // px/s^2 /** * The `DragPanHandler` allows the user to pan the map by clicking and dragging * the cursor. */ var DragPanHandler = function DragPanHandler(map , options ) { this._map = map; this._el = map.getCanvasContainer(); this._state = 'disabled'; this._clickTolerance = options.clickTolerance || 1; symbol_layout.bindAll([ '_onMove', '_onMouseUp', '_onTouchEnd', '_onBlur', '_onDragFrame' ], this); }; /** * Returns a Boolean indicating whether the "drag to pan" interaction is enabled. * * @returns {boolean} `true` if the "drag to pan" interaction is enabled. */ DragPanHandler.prototype.isEnabled = function isEnabled () { return this._state !== 'disabled'; }; /** * Returns a Boolean indicating whether the "drag to pan" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "drag to pan" interaction is active. */ DragPanHandler.prototype.isActive = function isActive () { return this._state === 'active'; }; /** * Enables the "drag to pan" interaction. * * @example * map.dragPan.enable(); */ DragPanHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._el.classList.add('mapboxgl-touch-drag-pan'); this._state = 'enabled'; }; /** * Disables the "drag to pan" interaction. * * @example * map.dragPan.disable(); */ DragPanHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.classList.remove('mapboxgl-touch-drag-pan'); switch (this._state) { case 'active': this._state = 'disabled'; this._unbind(); this._deactivate(); this._fireEvent('dragend'); this._fireEvent('moveend'); break; case 'pending': this._state = 'disabled'; this._unbind(); break; default: this._state = 'disabled'; break; } }; DragPanHandler.prototype.onMouseDown = function onMouseDown (e ) { if (this._state !== 'enabled') { return; } if (e.ctrlKey || DOM.mouseButton(e) !== 0) { return; } // Bind window-level event listeners for mousemove/up events. In the absence of // the pointer capture API, which is not supported by all necessary platforms, // 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. DOM.addEventListener(symbol_layout.window.document, 'mousemove', this._onMove, {capture: true}); DOM.addEventListener(symbol_layout.window.document, 'mouseup', this._onMouseUp); this._start(e); }; DragPanHandler.prototype.onTouchStart = function onTouchStart (e ) { if (this._state !== 'enabled') { return; } if (e.touches.length > 1) { return; } // Bind window-level event listeners for touchmove/end events. In the absence of // the pointer capture API, which is not supported by all necessary platforms, // 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. DOM.addEventListener(symbol_layout.window.document, 'touchmove', this._onMove, {capture: true, passive: false}); DOM.addEventListener(symbol_layout.window.document, 'touchend', this._onTouchEnd); this._start(e); }; DragPanHandler.prototype._start = function _start (e ) { // Deactivate when the window loses focus. Otherwise if a mouseup occurs when the window // isn't in focus, dragging will continue even though the mouse is no longer pressed. symbol_layout.window.addEventListener('blur', this._onBlur); this._state = 'pending'; this._startPos = this._mouseDownPos = this._prevPos = this._lastPos = DOM.mousePos(this._el, e); this._inertia = [[symbol_layout.browser.now(), this._startPos]]; }; DragPanHandler.prototype._onMove = function _onMove (e ) { e.preventDefault(); var pos = DOM.mousePos(this._el, e); if (this._lastPos.equals(pos) || (this._state === 'pending' && pos.dist(this._mouseDownPos) < this._clickTolerance)) { return; } this._lastMoveEvent = e; this._lastPos = pos; this._drainInertiaBuffer(); this._inertia.push([symbol_layout.browser.now(), this._lastPos]); if (this._state === 'pending') { // we treat the first move event (rather than the mousedown event) // as the start of the drag this._state = 'active'; this._fireEvent('dragstart', e); this._fireEvent('movestart', e); } if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onDragFrame); } }; /** * Called in each render frame while dragging is happening. * @private */ DragPanHandler.prototype._onDragFrame = function _onDragFrame () { this._frameId = null; var e = this._lastMoveEvent; if (!e) { return; } var tr = this._map.transform; tr.setLocationAtPoint(tr.pointLocation(this._prevPos), this._lastPos); this._fireEvent('drag', e); this._fireEvent('move', e); this._prevPos = this._lastPos; delete this._lastMoveEvent; }; DragPanHandler.prototype._onMouseUp = function _onMouseUp (e ) { if (DOM.mouseButton(e) !== 0) { return; } switch (this._state) { case 'active': this._state = 'enabled'; DOM.suppressClick(); this._unbind(); this._deactivate(); this._inertialPan(e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: symbol_layout.assert(false); break; } }; DragPanHandler.prototype._onTouchEnd = function _onTouchEnd (e ) { switch (this._state) { case 'active': this._state = 'enabled'; this._unbind(); this._deactivate(); this._inertialPan(e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: symbol_layout.assert(false); break; } }; DragPanHandler.prototype._onBlur = function _onBlur (e ) { switch (this._state) { case 'active': this._state = 'enabled'; this._unbind(); this._deactivate(); this._fireEvent('dragend', e); this._fireEvent('moveend', e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: symbol_layout.assert(false); break; } }; DragPanHandler.prototype._unbind = function _unbind () { DOM.removeEventListener(symbol_layout.window.document, 'touchmove', this._onMove, {capture: true, passive: false}); DOM.removeEventListener(symbol_layout.window.document, 'touchend', this._onTouchEnd); DOM.removeEventListener(symbol_layout.window.document, 'mousemove', this._onMove, {capture: true}); DOM.removeEventListener(symbol_layout.window.document, 'mouseup', this._onMouseUp); DOM.removeEventListener(symbol_layout.window, 'blur', this._onBlur); }; DragPanHandler.prototype._deactivate = function _deactivate () { if (this._frameId) { this._map._cancelRenderFrame(this._frameId); this._frameId = null; } delete this._lastMoveEvent; delete this._startPos; delete this._prevPos; delete this._mouseDownPos; delete this._lastPos; }; DragPanHandler.prototype._inertialPan = function _inertialPan (e ) { this._fireEvent('dragend', e); this._drainInertiaBuffer(); var inertia = this._inertia; if (inertia.length < 2) { this._fireEvent('moveend', e); return; } var last = inertia[inertia.length - 1], first = inertia[0], flingOffset = last[1].sub(first[1]), flingDuration = (last[0] - first[0]) / 1000; if (flingDuration === 0 || last[1].equals(first[1])) { this._fireEvent('moveend', e); return; } // calculate px/s velocity & adjust for increased initial animation speed when easing out var velocity = flingOffset.mult(inertiaLinearity$1 / flingDuration); var speed = velocity.mag(); // px/s if (speed > inertiaMaxSpeed$1) { speed = inertiaMaxSpeed$1; velocity._unit()._mult(speed); } var duration = speed / (inertiaDeceleration$1 * inertiaLinearity$1), offset = velocity.mult(-duration / 2); this._map.panBy(offset, { duration: duration * 1000, easing: inertiaEasing$1, noMoveStart: true }, { originalEvent: e }); }; DragPanHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(new symbol_layout.Event(type, e ? { originalEvent: e } : {})); }; DragPanHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = symbol_layout.browser.now(), cutoff = 160; // msec while (inertia.length > 0 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; // var panStep = 100, bearingStep = 15, pitchStep = 10; /** * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using * the following keyboard shortcuts: * * - `=` / `+`: Increase the zoom level by 1. * - `Shift-=` / `Shift-+`: Increase the zoom level by 2. * - `-`: Decrease the zoom level by 1. * - `Shift--`: Decrease the zoom level by 2. * - Arrow keys: Pan by 100 pixels. * - `Shift+⇢`: Increase the rotation by 15 degrees. * - `Shift+⇠`: Decrease the rotation by 15 degrees. * - `Shift+⇡`: Increase the pitch by 10 degrees. * - `Shift+⇣`: Decrease the pitch by 10 degrees. */ var KeyboardHandler = function KeyboardHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); symbol_layout.bindAll([ '_onKeyDown' ], this); }; /** * Returns a Boolean indicating whether keyboard interaction is enabled. * * @returns {boolean} `true` if keyboard interaction is enabled. */ KeyboardHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Enables keyboard interaction. * * @example * map.keyboard.enable(); */ KeyboardHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._el.addEventListener('keydown', this._onKeyDown, false); this._enabled = true; }; /** * Disables keyboard interaction. * * @example * map.keyboard.disable(); */ KeyboardHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.removeEventListener('keydown', this._onKeyDown); this._enabled = false; }; KeyboardHandler.prototype._onKeyDown = function _onKeyDown (e ) { if (e.altKey || e.ctrlKey || e.metaKey) { return; } var zoomDir = 0; var bearingDir = 0; var pitchDir = 0; var xDir = 0; var yDir = 0; switch (e.keyCode) { case 61: case 107: case 171: case 187: zoomDir = 1; break; case 189: case 109: case 173: zoomDir = -1; break; case 37: if (e.shiftKey) { bearingDir = -1; } else { e.preventDefault(); xDir = -1; } break; case 39: if (e.shiftKey) { bearingDir = 1; } else { e.preventDefault(); xDir = 1; } break; case 38: if (e.shiftKey) { pitchDir = 1; } else { e.preventDefault(); yDir = -1; } break; case 40: if (e.shiftKey) { pitchDir = -1; } else { yDir = 1; e.preventDefault(); } break; default: return; } var map = this._map; var zoom = map.getZoom(); var easeOptions = { duration: 300, delayEndEvents: 500, easing: easeOut, zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom, bearing: map.getBearing() + bearingDir * bearingStep, pitch: map.getPitch() + pitchDir * pitchStep, offset: [-xDir * panStep, -yDir * panStep], center: map.getCenter() }; map.easeTo(easeOptions, {originalEvent: e}); }; function easeOut(t) { return t * (2 - t); } // // maximum distance between two tap Points for them to qualify as a double-tap var maxDist = 30; /** * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by * double clicking or double tapping. */ var DoubleClickZoomHandler = function DoubleClickZoomHandler(map ) { this._map = map; symbol_layout.bindAll([ '_onDblClick', '_onZoomEnd' ], this); }; /** * Returns a Boolean indicating whether the "double click to zoom" interaction is enabled. * * @returns {boolean} `true` if the "double click to zoom" interaction is enabled. */ DoubleClickZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "double click to zoom" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "double click to zoom" interaction is active. */ DoubleClickZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "double click to zoom" interaction. * * @example * map.doubleClickZoom.enable(); */ DoubleClickZoomHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._enabled = true; }; /** * Disables the "double click to zoom" interaction. * * @example * map.doubleClickZoom.disable(); */ DoubleClickZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._enabled = false; }; DoubleClickZoomHandler.prototype.onTouchStart = function onTouchStart (e ) { var this$1 = this; if (!this.isEnabled()) { return; } if (e.points.length > 1) { return; } if (!this._tapped) { this._tappedPoint = e.points[0]; this._tapped = setTimeout(function () { this$1._tapped = null; this$1._tappedPoint = null; }, 300); } else { var newTap = e.points[0]; var firstTap = this._tappedPoint; if (firstTap && firstTap.dist(newTap) <= maxDist) { e.originalEvent.preventDefault(); // prevent duplicate zoom on dblclick var onTouchEnd = function () { // ignore the touchend event, as it has no point we can zoom to if (this$1._tapped) { // make sure we are still within the timeout window this$1._zoom(e); // pass the original touchstart event, with the tapped point } this$1._map.off('touchcancel', onTouchCancel); this$1._resetTapped(); }; var onTouchCancel = function () { this$1._map.off('touchend', onTouchEnd); this$1._resetTapped(); }; this._map.once('touchend', onTouchEnd); this._map.once('touchcancel', onTouchCancel); } else { // touches are too far apart, don't zoom this._resetTapped(); } } }; DoubleClickZoomHandler.prototype._resetTapped = function _resetTapped () { clearTimeout(this._tapped); this._tapped = null; this._tappedPoint = null; }; DoubleClickZoomHandler.prototype.onDblClick = function onDblClick (e ) { if (!this.isEnabled()) { return; } e.originalEvent.preventDefault(); this._zoom(e); }; DoubleClickZoomHandler.prototype._zoom = function _zoom (e ) { this._active = true; this._map.on('zoomend', this._onZoomEnd); this._map.zoomTo( this._map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1), {around: e.lngLat}, e ); }; DoubleClickZoomHandler.prototype._onZoomEnd = function _onZoomEnd () { this._active = false; this._map.off('zoomend', this._onZoomEnd); }; // var inertiaLinearity$2 = 0.15, inertiaEasing$2 = symbol_layout.bezier(0, 0, inertiaLinearity$2, 1), inertiaDeceleration$2 = 12, // scale / s^2 inertiaMaxSpeed$2 = 2.5, // scale / s significantScaleThreshold = 0.15, significantRotateThreshold = 10; /** * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by * pinching on a touchscreen. */ var TouchZoomRotateHandler = function TouchZoomRotateHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); symbol_layout.bindAll([ '_onMove', '_onEnd', '_onTouchFrame' ], this); }; /** * Returns a Boolean indicating whether the "pinch to rotate and zoom" interaction is enabled. * * @returns {boolean} `true` if the "pinch to rotate and zoom" interaction is enabled. */ TouchZoomRotateHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Enables the "pinch to rotate and zoom" interaction. * * @param {Object} [options] * @param {string} [options.around] If "center" is passed, map will zoom around the center * * @example * map.touchZoomRotate.enable(); * @example * map.touchZoomRotate.enable({ around: 'center' }); */ TouchZoomRotateHandler.prototype.enable = function enable (options ) { if (this.isEnabled()) { return; } this._el.classList.add('mapboxgl-touch-zoom-rotate'); this._enabled = true; this._aroundCenter = !!options && options.around === 'center'; }; /** * Disables the "pinch to rotate and zoom" interaction. * * @example * map.touchZoomRotate.disable(); */ TouchZoomRotateHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.classList.remove('mapboxgl-touch-zoom-rotate'); this._enabled = false; }; /** * Disables the "pinch to rotate" interaction, leaving the "pinch to zoom" * interaction enabled. * * @example * map.touchZoomRotate.disableRotation(); */ TouchZoomRotateHandler.prototype.disableRotation = function disableRotation () { this._rotationDisabled = true; }; /** * Enables the "pinch to rotate" interaction. * * @example * map.touchZoomRotate.enable(); * map.touchZoomRotate.enableRotation(); */ TouchZoomRotateHandler.prototype.enableRotation = function enableRotation () { this._rotationDisabled = false; }; TouchZoomRotateHandler.prototype.onStart = function onStart (e ) { if (!this.isEnabled()) { return; } if (e.touches.length !== 2) { return; } var p0 = DOM.mousePos(this._el, e.touches[0]), p1 = DOM.mousePos(this._el, e.touches[1]), center = p0.add(p1).div(2); this._startVec = p0.sub(p1); this._startAround = this._map.transform.pointLocation(center); this._gestureIntent = undefined; this._inertia = []; DOM.addEventListener(symbol_layout.window.document, 'touchmove', this._onMove, {passive: false}); DOM.addEventListener(symbol_layout.window.document, 'touchend', this._onEnd); }; TouchZoomRotateHandler.prototype._getTouchEventData = function _getTouchEventData (e ) { var p0 = DOM.mousePos(this._el, e.touches[0]), p1 = DOM.mousePos(this._el, e.touches[1]); var vec = p0.sub(p1); return { vec: vec, center: p0.add(p1).div(2), scale: vec.mag() / this._startVec.mag(), bearing: this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI }; }; TouchZoomRotateHandler.prototype._onMove = function _onMove (e ) { if (e.touches.length !== 2) { return; } var ref = this._getTouchEventData(e); var vec = ref.vec; var scale = ref.scale; var bearing = ref.bearing; // Determine 'intent' by whichever threshold is surpassed first, // then keep that state for the duration of this gesture. if (!this._gestureIntent) { // when rotation is disabled, any scale change triggers the zoom gesture to start var scalingSignificantly = (this._rotationDisabled && scale !== 1) || (Math.abs(1 - scale) > significantScaleThreshold), rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold); if (rotatingSignificantly) { this._gestureIntent = 'rotate'; } else if (scalingSignificantly) { this._gestureIntent = 'zoom'; } if (this._gestureIntent) { this._map.fire(new symbol_layout.Event(((this._gestureIntent) + "start"), { originalEvent: e })); this._map.fire(new symbol_layout.Event('movestart', { originalEvent: e })); this._startVec = vec; } } this._lastTouchEvent = e; if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onTouchFrame); } e.preventDefault(); }; TouchZoomRotateHandler.prototype._onTouchFrame = function _onTouchFrame () { this._frameId = null; var gestureIntent = this._gestureIntent; if (!gestureIntent) { return; } var tr = this._map.transform; if (!this._startScale) { this._startScale = tr.scale; this._startBearing = tr.bearing; } var ref = this._getTouchEventData(this._lastTouchEvent); var center = ref.center; var bearing = ref.bearing; var scale = ref.scale; var around = tr.pointLocation(center); var aroundPoint = tr.locationPoint(around); if (gestureIntent === 'rotate') { tr.bearing = this._startBearing + bearing; } tr.zoom = tr.scaleZoom(this._startScale * scale); tr.setLocationAtPoint(this._startAround, aroundPoint); this._map.fire(new symbol_layout.Event(gestureIntent, {originalEvent: this._lastTouchEvent})); this._map.fire(new symbol_layout.Event('move', {originalEvent: this._lastTouchEvent})); this._drainInertiaBuffer(); this._inertia.push([symbol_layout.browser.now(), scale, center]); }; TouchZoomRotateHandler.prototype._onEnd = function _onEnd (e ) { DOM.removeEventListener(symbol_layout.window.document, 'touchmove', this._onMove, {passive: false}); DOM.removeEventListener(symbol_layout.window.document, 'touchend', this._onEnd); var gestureIntent = this._gestureIntent; var startScale = this._startScale; if (this._frameId) { this._map._cancelRenderFrame(this._frameId); this._frameId = null; } delete this._gestureIntent; delete this._startScale; delete this._startBearing; delete this._lastTouchEvent; if (!gestureIntent) { return; } this._map.fire(new symbol_layout.Event((gestureIntent + "end"), { originalEvent: e })); this._drainInertiaBuffer(); var inertia = this._inertia, map = this._map; if (inertia.length < 2) { map.snapToNorth({}, { originalEvent: e }); return; } var last = inertia[inertia.length - 1], first = inertia[0], lastScale = map.transform.scaleZoom(startScale * last[1]), firstScale = map.transform.scaleZoom(startScale * first[1]), scaleOffset = lastScale - firstScale, scaleDuration = (last[0] - first[0]) / 1000, p = last[2]; if (scaleDuration === 0 || lastScale === firstScale) { map.snapToNorth({}, { originalEvent: e }); return; } // calculate scale/s speed and adjust for increased initial animation speed when easing var speed = scaleOffset * inertiaLinearity$2 / scaleDuration; // scale/s if (Math.abs(speed) > inertiaMaxSpeed$2) { if (speed > 0) { speed = inertiaMaxSpeed$2; } else { speed = -inertiaMaxSpeed$2; } } var duration = Math.abs(speed / (inertiaDeceleration$2 * inertiaLinearity$2)) * 1000; var targetScale = lastScale + speed * duration / 2000; if (targetScale < 0) { targetScale = 0; } map.easeTo({ zoom: targetScale, duration: duration, easing: inertiaEasing$2, around: this._aroundCenter ? map.getCenter() : map.unproject(p), noMoveStart: true }, { originalEvent: e }); }; TouchZoomRotateHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = symbol_layout.browser.now(), cutoff = 160; // msec while (inertia.length > 2 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; // var handlers = { scrollZoom: ScrollZoomHandler, boxZoom: BoxZoomHandler, dragRotate: DragRotateHandler, dragPan: DragPanHandler, keyboard: KeyboardHandler, doubleClickZoom: DoubleClickZoomHandler, touchZoomRotate: TouchZoomRotateHandler }; function bindHandlers(map , options ) { var el = map.getCanvasContainer(); var contextMenuEvent = null; var mouseDown = false; var startPos = null; for (var name in handlers) { (map )[name] = new handlers[name](map, options); if (options.interactive && options[name]) { (map )[name].enable(options[name]); } } DOM.addEventListener(el, 'mouseout', onMouseOut); DOM.addEventListener(el, 'mousedown', onMouseDown); DOM.addEventListener(el, 'mouseup', onMouseUp); DOM.addEventListener(el, 'mousemove', onMouseMove); DOM.addEventListener(el, 'mouseover', onMouseOver); // Bind touchstart and touchmove with passive: false because, even though // they only fire a map events and therefore could theoretically be // passive, binding with passive: true causes iOS not to respect // e.preventDefault() in _other_ handlers, even if they are non-passive // (see https://bugs.webkit.org/show_bug.cgi?id=184251) DOM.addEventListener(el, 'touchstart', onTouchStart, {passive: false}); DOM.addEventListener(el, 'touchmove', onTouchMove, {passive: false}); DOM.addEventListener(el, 'touchend', onTouchEnd); DOM.addEventListener(el, 'touchcancel', onTouchCancel); DOM.addEventListener(el, 'click', onClick); DOM.addEventListener(el, 'dblclick', onDblClick); DOM.addEventListener(el, 'contextmenu', onContextMenu); DOM.addEventListener(el, 'wheel', onWheel, {passive: false}); function onMouseDown(e ) { mouseDown = true; startPos = DOM.mousePos(el, e); var mapEvent = new MapMouseEvent('mousedown', map, e); map.fire(mapEvent); if (mapEvent.defaultPrevented) { return; } if (options.interactive && !map.doubleClickZoom.isActive()) { map.stop(); } map.boxZoom.onMouseDown(e); if (!map.boxZoom.isActive() && !map.dragPan.isActive()) { map.dragRotate.onMouseDown(e); } if (!map.boxZoom.isActive() && !map.dragRotate.isActive()) { map.dragPan.onMouseDown(e); } } function onMouseUp(e ) { var rotating = map.dragRotate.isActive(); if (contextMenuEvent && !rotating) { // This will be the case for Mac map.fire(new MapMouseEvent('contextmenu', map, contextMenuEvent)); } contextMenuEvent = null; mouseDown = false; map.fire(new MapMouseEvent('mouseup', map, e)); } function onMouseMove(e ) { if (map.dragPan.isActive()) { return; } if (map.dragRotate.isActive()) { return; } var target = (e.target ); while (target && target !== el) { target = target.parentNode; } if (target !== el) { return; } map.fire(new MapMouseEvent('mousemove', map, e)); } function onMouseOver(e ) { var target = (e.target ); while (target && target !== el) { target = target.parentNode; } if (target !== el) { return; } map.fire(new MapMouseEvent('mouseover', map, e)); } function onMouseOut(e ) { map.fire(new MapMouseEvent('mouseout', map, e)); } function onTouchStart(e ) { var mapEvent = new MapTouchEvent('touchstart', map, e); map.fire(mapEvent); if (mapEvent.defaultPrevented) { return; } if (options.interactive) { map.stop(); } if (!map.boxZoom.isActive() && !map.dragRotate.isActive()) { map.dragPan.onTouchStart(e); } map.touchZoomRotate.onStart(e); map.doubleClickZoom.onTouchStart(mapEvent); } function onTouchMove(e ) { map.fire(new MapTouchEvent('touchmove', map, e)); } function onTouchEnd(e ) { map.fire(new MapTouchEvent('touchend', map, e)); } function onTouchCancel(e ) { map.fire(new MapTouchEvent('touchcancel', map, e)); } function onClick(e ) { var pos = DOM.mousePos(el, e); if (!startPos || pos.equals(startPos) || pos.dist(startPos) < options.clickTolerance) { map.fire(new MapMouseEvent('click', map, e)); } } function onDblClick(e ) { var mapEvent = new MapMouseEvent('dblclick', map, e); map.fire(mapEvent); if (mapEvent.defaultPrevented) { return; } map.doubleClickZoom.onDblClick(mapEvent); } function onContextMenu(e ) { var rotating = map.dragRotate.isActive(); if (!mouseDown && !rotating) { // Windows: contextmenu fired on mouseup, so fire event now map.fire(new MapMouseEvent('contextmenu', map, e)); } else if (mouseDown) { // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake contextMenuEvent = e; } // prevent browser context menu when necessary; we don't allow it with rotation // because we can't discern rotation gesture start from contextmenu on Mac if (map.dragRotate.isEnabled() || map.listens('contextmenu')) { e.preventDefault(); } } function onWheel(e ) { if (options.interactive) { map.stop(); } var mapEvent = new MapWheelEvent('wheel', map, e); map.fire(mapEvent); if (mapEvent.defaultPrevented) { return; } map.scrollZoom.onWheel(e); } } // /** * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo}, controlling the desired location, * zoom, bearing, and pitch of the camera. All properties are optional, and when a property is omitted, the current * camera value for that property will remain unchanged. * * @typedef {Object} CameraOptions * @property {LngLatLike} center The desired center. * @property {number} zoom The desired zoom level. * @property {number} bearing The desired bearing, in degrees. The bearing is the compass direction that * is "up"; for example, a bearing of 90° orients the map so that east is up. * @property {number} pitch The desired pitch, in degrees. * @property {LngLatLike} around If `zoom` is specified, `around` determines the point around which the zoom is centered. */ /** * Options common to map movement methods that involve animation, such as {@link Map#panBy} and * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties * are optional. * * @typedef {Object} AnimationOptions * @property {number} duration The animation's duration, measured in milliseconds. * @property {Function} easing A function taking a time in the range 0..1 and returning a number where 0 is * the initial state and 1 is the final state. * @property {PointLike} offset of the target center relative to real map container center at the end of animation. * @property {boolean} animate If `false`, no animation will occur. */ /** * Options for setting padding on a call to {@link Map#fitBounds}. All properties of this object must be * non-negative integers. * * @typedef {Object} PaddingOptions * @property {number} top Padding in pixels from the top of the map canvas. * @property {number} bottom Padding in pixels from the bottom of the map canvas. * @property {number} left Padding in pixels from the left of the map canvas. * @property {number} right Padding in pixels from the right of the map canvas. */ var Camera = /*@__PURE__*/(function (Evented) { function Camera(transform , options ) { Evented.call(this); this._moving = false; this._zooming = false; this.transform = transform; this._bearingSnap = options.bearingSnap; symbol_layout.bindAll(['_renderFrameCallback'], this); } if ( Evented ) Camera.__proto__ = Evented; Camera.prototype = Object.create( Evented && Evented.prototype ); Camera.prototype.constructor = Camera; /** * Returns the map's geographical centerpoint. * * @memberof Map# * @returns The map's geographical centerpoint. */ Camera.prototype.getCenter = function getCenter () { return new symbol_layout.LngLat(this.transform.center.lng, this.transform.center.lat); }; /** * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`. * * @memberof Map# * @param center The centerpoint to set. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * map.setCenter([-74, 38]); */ Camera.prototype.setCenter = function setCenter (center , eventData ) { return this.jumpTo({center: center}, eventData); }; /** * Pans the map by the specified offset. * * @memberof Map# * @param offset `x` and `y` coordinates by which to pan the map. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.panBy = function panBy (offset , options , eventData ) { offset = symbol_layout.Point.convert(offset).mult(-1); return this.panTo(this.transform.center, symbol_layout.extend({offset: offset}, options), eventData); }; /** * Pans the map to the specified location, with an animated transition. * * @memberof Map# * @param lnglat The location to pan the map to. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.panTo = function panTo (lnglat , options , eventData ) { return this.easeTo(symbol_layout.extend({ center: lnglat }, options), eventData); }; /** * Returns the map's current zoom level. * * @memberof Map# * @returns The map's current zoom level. */ Camera.prototype.getZoom = function getZoom () { return this.transform.zoom; }; /** * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`. * * @memberof Map# * @param zoom The zoom level to set (0-20). * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` * @example * // zoom the map to 5 * map.setZoom(5); */ Camera.prototype.setZoom = function setZoom (zoom , eventData ) { this.jumpTo({zoom: zoom}, eventData); return this; }; /** * Zooms the map to the specified zoom level, with an animated transition. * * @memberof Map# * @param zoom The zoom level to transition to. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomTo = function zoomTo (zoom , options , eventData ) { return this.easeTo(symbol_layout.extend({ zoom: zoom }, options), eventData); }; /** * Increases the map's zoom level by 1. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomIn = function zoomIn (options , eventData ) { this.zoomTo(this.getZoom() + 1, options, eventData); return this; }; /** * Decreases the map's zoom level by 1. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomOut = function zoomOut (options , eventData ) { this.zoomTo(this.getZoom() - 1, options, eventData); return this; }; /** * Returns the map's current bearing. The bearing is the compass direction that is \"up\"; for example, a bearing * of 90° orients the map so that east is up. * * @memberof Map# * @returns The map's current bearing. * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.getBearing = function getBearing () { return this.transform.bearing; }; /** * Sets the map's bearing (rotation). The bearing is the compass direction that is \"up\"; for example, a bearing * of 90° orients the map so that east is up. * * Equivalent to `jumpTo({bearing: bearing})`. * * @memberof Map# * @param bearing The desired bearing. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * // rotate the map to 90 degrees * map.setBearing(90); */ Camera.prototype.setBearing = function setBearing (bearing , eventData ) { this.jumpTo({bearing: bearing}, eventData); return this; }; /** * Rotates the map to the specified bearing, with an animated transition. The bearing is the compass direction * that is \"up\"; for example, a bearing of 90° orients the map so that east is up. * * @memberof Map# * @param bearing The desired bearing. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.rotateTo = function rotateTo (bearing , options , eventData ) { return this.easeTo(symbol_layout.extend({ bearing: bearing }, options), eventData); }; /** * Rotates the map so that north is up (0° bearing), with an animated transition. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.resetNorth = function resetNorth (options , eventData ) { this.rotateTo(0, symbol_layout.extend({duration: 1000}, options), eventData); return this; }; /** * Rotates and pitches the map so that north is up (0° bearing) and pitch is 0°, with an animated transition. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.resetNorthPitch = function resetNorthPitch (options , eventData ) { this.easeTo(symbol_layout.extend({ bearing: 0, pitch: 0, duration: 1000 }, options), eventData); return this; }; /** * Snaps the map so that north is up (0° bearing), if the current bearing is close enough to it (i.e. within the * `bearingSnap` threshold). * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.snapToNorth = function snapToNorth (options , eventData ) { if (Math.abs(this.getBearing()) < this._bearingSnap) { return this.resetNorth(options, eventData); } return this; }; /** * Returns the map's current pitch (tilt). * * @memberof Map# * @returns The map's current pitch, measured in degrees away from the plane of the screen. */ Camera.prototype.getPitch = function getPitch () { return this.transform.pitch; }; /** * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`. * * @memberof Map# * @param pitch The pitch to set, measured in degrees away from the plane of the screen (0-60). * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires pitchstart * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.setPitch = function setPitch (pitch , eventData ) { this.jumpTo({pitch: pitch}, eventData); return this; }; /** * @memberof Map# * @param {LatLngBoundsLike} bounds Calculate the center for these bounds in the viewport and use * the highest zoom level up to and including `Map#getMaxZoom()` that fits * in the viewport. LatLngBounds represent a box that is always axis-aligned with bearing 0. * @param options * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds. * @returns {CameraOptions | void} If map is able to fit to provided bounds, returns `CameraOptions` with * `center`, `zoom`, and `bearing`. If map is unable to fit, method will warn and return undefined. * @example * var bbox = [[-79, 43], [-73, 45]]; * var newCameraTransform = map.cameraForBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); */ Camera.prototype.cameraForBounds = function cameraForBounds (bounds , options ) { bounds = symbol_layout.LngLatBounds.convert(bounds); return this._cameraForBoxAndBearing(bounds.getNorthWest(), bounds.getSouthEast(), 0, options); }; /** * Calculate the center of these two points in the viewport and use * the highest zoom level up to and including `Map#getMaxZoom()` that fits * the points in the viewport at the specified bearing. * @memberof Map# * @param {LngLatLike} p0 First point * @param {LngLatLike} p1 Second point * @param bearing Desired map bearing at end of animation, in degrees * @param options * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds. * @returns {CameraOptions | void} If map is able to fit to provided bounds, returns `CameraOptions` with * `center`, `zoom`, and `bearing`. If map is unable to fit, method will warn and return undefined. * @private * @example * var p0 = [-79, 43]; * var p1 = [-73, 45]; * var bearing = 90; * var newCameraTransform = map._cameraForBoxAndBearing(p0, p1, bearing, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); */ Camera.prototype._cameraForBoxAndBearing = function _cameraForBoxAndBearing (p0 , p1 , bearing , options ) { options = symbol_layout.extend({ padding: { top: 0, bottom: 0, right: 0, left: 0 }, offset: [0, 0], maxZoom: this.transform.maxZoom }, options); if (typeof options.padding === 'number') { var p = options.padding; options.padding = { top: p, bottom: p, right: p, left: p }; } if (!symbol_layout.deepEqual(Object.keys(options.padding).sort(function (a, b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; }), ["bottom", "left", "right", "top"])) { symbol_layout.warnOnce( "options.padding must be a positive number, or an Object with keys 'bottom', 'left', 'right', 'top'" ); return; } var tr = this.transform; // 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. var p0world = tr.project(symbol_layout.LngLat.convert(p0)); var p1world = tr.project(symbol_layout.LngLat.convert(p1)); var p0rotated = p0world.rotate(-bearing * Math.PI / 180); var p1rotated = p1world.rotate(-bearing * Math.PI / 180); var upperRight = new symbol_layout.Point(Math.max(p0rotated.x, p1rotated.x), Math.max(p0rotated.y, p1rotated.y)); var lowerLeft = new symbol_layout.Point(Math.min(p0rotated.x, p1rotated.x), Math.min(p0rotated.y, p1rotated.y)); // Calculate zoom: consider the original bbox and padding. var size = upperRight.sub(lowerLeft); var scaleX = (tr.width - options.padding.left - options.padding.right) / size.x; var scaleY = (tr.height - options.padding.top - options.padding.bottom) / size.y; if (scaleY < 0 || scaleX < 0) { symbol_layout.warnOnce( 'Map cannot fit within canvas with the given bounds, padding, and/or offset.' ); return; } var zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom); // Calculate center: apply the zoom, the configured offset, as well as offset that exists as a result of padding. var offset = symbol_layout.Point.convert(options.offset); var paddingOffsetX = (options.padding.left - options.padding.right) / 2; var paddingOffsetY = (options.padding.top - options.padding.bottom) / 2; var offsetAtInitialZoom = new symbol_layout.Point(offset.x + paddingOffsetX, offset.y + paddingOffsetY); var offsetAtFinalZoom = offsetAtInitialZoom.mult(tr.scale / tr.zoomScale(zoom)); var center = tr.unproject(p0world.add(p1world).div(2).sub(offsetAtFinalZoom)); return { center: center, zoom: zoom, bearing: bearing }; }; /** * Pans and zooms the map to contain its visible area within the specified geographical bounds. * This function will also reset the map's bearing to 0 if bearing is nonzero. * * @memberof Map# * @param bounds Center these bounds in the viewport and use the highest * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport. * @param {Object} [options] Options supports all properties from {@link AnimationOptions} and {@link CameraOptions} in addition to the fields below. * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {boolean} [options.linear=false] If `true`, the map transitions using * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See * those functions and {@link AnimationOptions} for information about options available. * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds. * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * var bbox = [[-79, 43], [-73, 45]]; * map.fitBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * @see [Fit a map to a bounding box](https://www.mapbox.com/mapbox-gl-js/example/fitbounds/) */ Camera.prototype.fitBounds = function fitBounds (bounds , options , eventData ) { return this._fitInternal( this.cameraForBounds(bounds, options), options, eventData); }; /** * 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. * * @memberof Map# * @param p0 First point on screen, in pixel coordinates * @param p1 Second point on screen, in pixel coordinates * @param bearing Desired map bearing at end of animation, in degrees * @param options * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {boolean} [options.linear=false] If `true`, the map transitions using * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See * those functions and {@link AnimationOptions} for information about options available. * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * var p0 = [220, 400]; * var p1 = [500, 900]; * map.fitScreenCoordinates(p0, p1, map.getBearing(), { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * @see [Used by BoxZoomHandler](https://www.mapbox.com/mapbox-gl-js/api/#boxzoomhandler) */ Camera.prototype.fitScreenCoordinates = function fitScreenCoordinates (p0 , p1 , bearing , options , eventData ) { return this._fitInternal( this._cameraForBoxAndBearing( this.transform.pointLocation(symbol_layout.Point.convert(p0)), this.transform.pointLocation(symbol_layout.Point.convert(p1)), bearing, options), options, eventData); }; Camera.prototype._fitInternal = function _fitInternal (calculatedOptions , options , eventData ) { // cameraForBounds warns + returns undefined if unable to fit: if (!calculatedOptions) { return this; } options = symbol_layout.extend(calculatedOptions, options); return options.linear ? this.easeTo(options, eventData) : this.flyTo(options, eventData); }; /** * Changes any combination of center, zoom, bearing, and pitch, without * an animated transition. The map will retain its current values for any * details not specified in `options`. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires rotate * @fires move * @fires zoom * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` */ Camera.prototype.jumpTo = function jumpTo (options , eventData ) { this.stop(); var tr = this.transform; var zoomChanged = false, bearingChanged = false, pitchChanged = false; if ('zoom' in options && tr.zoom !== +options.zoom) { zoomChanged = true; tr.zoom = +options.zoom; } if (options.center !== undefined) { tr.center = symbol_layout.LngLat.convert(options.center); } if ('bearing' in options && tr.bearing !== +options.bearing) { bearingChanged = true; tr.bearing = +options.bearing; } if ('pitch' in options && tr.pitch !== +options.pitch) { pitchChanged = true; tr.pitch = +options.pitch; } this.fire(new symbol_layout.Event('movestart', eventData)) .fire(new symbol_layout.Event('move', eventData)); if (zoomChanged) { this.fire(new symbol_layout.Event('zoomstart', eventData)) .fire(new symbol_layout.Event('zoom', eventData)) .fire(new symbol_layout.Event('zoomend', eventData)); } if (bearingChanged) { this.fire(new symbol_layout.Event('rotatestart', eventData)) .fire(new symbol_layout.Event('rotate', eventData)) .fire(new symbol_layout.Event('rotateend', eventData)); } if (pitchChanged) { this.fire(new symbol_layout.Event('pitchstart', eventData)) .fire(new symbol_layout.Event('pitch', eventData)) .fire(new symbol_layout.Event('pitchend', eventData)); } return this.fire(new symbol_layout.Event('moveend', eventData)); }; /** * Changes any combination of center, zoom, bearing, and pitch, with an animated transition * between old and new values. The map will retain its current values for any * details not specified in `options`. * * Note: The transition will happen instantly if the user has enabled * the `reduced motion` accesibility feature enabled in their operating system. * * @memberof Map# * @param options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires rotate * @fires move * @fires zoom * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.easeTo = function easeTo (options , eventData ) { var this$1 = this; this.stop(); options = symbol_layout.extend({ offset: [0, 0], duration: 500, easing: symbol_layout.ease }, options); if (options.animate === false || symbol_layout.browser.prefersReducedMotion) { options.duration = 0; } var tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), zoom = 'zoom' in options ? +options.zoom : startZoom, bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, pitch = 'pitch' in options ? +options.pitch : startPitch; var pointAtOffset = tr.centerPoint.add(symbol_layout.Point.convert(options.offset)); var locationAtOffset = tr.pointLocation(pointAtOffset); var center = symbol_layout.LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); var from = tr.project(locationAtOffset); var delta = tr.project(center).sub(from); var finalScale = tr.zoomScale(zoom - startZoom); var around, aroundPoint; if (options.around) { around = symbol_layout.LngLat.convert(options.around); aroundPoint = tr.locationPoint(around); } this._zooming = (zoom !== startZoom); this._rotating = (startBearing !== bearing); this._pitching = (pitch !== startPitch); this._prepareEase(eventData, options.noMoveStart); clearTimeout(this._easeEndTimeoutID); this._ease(function (k) { if (this$1._zooming) { tr.zoom = symbol_layout.number(startZoom, zoom, k); } if (this$1._rotating) { tr.bearing = symbol_layout.number(startBearing, bearing, k); } if (this$1._pitching) { tr.pitch = symbol_layout.number(startPitch, pitch, k); } if (around) { tr.setLocationAtPoint(around, aroundPoint); } else { var scale = tr.zoomScale(tr.zoom - startZoom); var base = zoom > startZoom ? Math.min(2, finalScale) : Math.max(0.5, finalScale); var speedup = Math.pow(base, 1 - k); var newCenter = tr.unproject(from.add(delta.mult(k * speedup)).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); } this$1._fireMoveEvents(eventData); }, function () { if (options.delayEndEvents) { this$1._easeEndTimeoutID = setTimeout(function () { return this$1._afterEase(eventData); }, options.delayEndEvents); } else { this$1._afterEase(eventData); } }, options); return this; }; Camera.prototype._prepareEase = function _prepareEase (eventData , noMoveStart ) { this._moving = true; if (!noMoveStart) { this.fire(new symbol_layout.Event('movestart', eventData)); } if (this._zooming) { this.fire(new symbol_layout.Event('zoomstart', eventData)); } if (this._rotating) { this.fire(new symbol_layout.Event('rotatestart', eventData)); } if (this._pitching) { this.fire(new symbol_layout.Event('pitchstart', eventData)); } }; Camera.prototype._fireMoveEvents = function _fireMoveEvents (eventData ) { this.fire(new symbol_layout.Event('move', eventData)); if (this._zooming) { this.fire(new symbol_layout.Event('zoom', eventData)); } if (this._rotating) { this.fire(new symbol_layout.Event('rotate', eventData)); } if (this._pitching) { this.fire(new symbol_layout.Event('pitch', eventData)); } }; Camera.prototype._afterEase = function _afterEase (eventData ) { var wasZooming = this._zooming; var wasRotating = this._rotating; var wasPitching = this._pitching; this._moving = false; this._zooming = false; this._rotating = false; this._pitching = false; if (wasZooming) { this.fire(new symbol_layout.Event('zoomend', eventData)); } if (wasRotating) { this.fire(new symbol_layout.Event('rotateend', eventData)); } if (wasPitching) { this.fire(new symbol_layout.Event('pitchend', eventData)); } this.fire(new symbol_layout.Event('moveend', eventData)); }; /** * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that * evokes flight. The animation seamlessly incorporates zooming and panning to help * the user maintain her bearings even after traversing a great distance. * * Note: The animation will be skipped, and this will behave equivalently to `jumpTo` * if the user has the `reduced motion` accesibility feature enabled in their operating system. * * @memberof Map# * @param {Object} options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions}, {@link AnimationOptions}, * and the following additional options. * @param {number} [options.curve=1.42] The zooming "curve" that will occur along the * flight path. A high value maximizes zooming for an exaggerated animation, while a low * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average * value selected by participants in the user study discussed in * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A * value of 1 would produce a circular motion. * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If * `options.curve` is specified, this option is ignored. * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span. * It does not correspond to a fixed physical distance, but varies by zoom level. * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored. * @param {number} [options.maxDuration] The animation's maximum duration, measured in milliseconds. * If duration exceeds maximum duration, it resets to 0. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires move * @fires zoom * @fires rotate * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @example * // fly with default options to null island * map.flyTo({center: [0, 0], zoom: 9}); * // using flyTo options * map.flyTo({ * center: [0, 0], * zoom: 9, * speed: 0.2, * curve: 1, * easing(t) { * return t; * } * }); * @see [Fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto/) * @see [Slowly fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto-options/) * @see [Fly to a location based on scroll position](https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/) */ Camera.prototype.flyTo = function flyTo (options , eventData ) { var this$1 = this; // Fall through to jumpTo if user has set prefers-reduced-motion if (symbol_layout.browser.prefersReducedMotion) { var coercedOptions = (symbol_layout.pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around']) ); return this.jumpTo(coercedOptions, eventData); } // This method implements an “optimal path” animation, as detailed in: // // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS // ’03. pp. 15–22. . // // Where applicable, local variable documentation begins with the associated variable or // function in van Wijk (2003). this.stop(); options = symbol_layout.extend({ offset: [0, 0], speed: 1.2, curve: 1.42, easing: symbol_layout.ease }, options); var tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(); var zoom = 'zoom' in options ? symbol_layout.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom; var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; var pitch = 'pitch' in options ? +options.pitch : startPitch; var scale = tr.zoomScale(zoom - startZoom); var pointAtOffset = tr.centerPoint.add(symbol_layout.Point.convert(options.offset)); var locationAtOffset = tr.pointLocation(pointAtOffset); var center = symbol_layout.LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); var from = tr.project(locationAtOffset); var delta = tr.project(center).sub(from); var rho = options.curve; // w₀: Initial visible span, measured in pixels at the initial scale. var w0 = Math.max(tr.width, tr.height), // w₁: Final visible span, measured in pixels with respect to the initial scale. w1 = w0 / scale, // Length of the flight path as projected onto the ground plane, measured in pixels from // the world image origin at the initial scale. u1 = delta.mag(); if ('minZoom' in options) { var minZoom = symbol_layout.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); // wm: Maximum visible span, measured in pixels with respect to the initial // scale. var wMax = w0 / tr.zoomScale(minZoom - startZoom); rho = Math.sqrt(wMax / u1 * 2); } // ρ² var rho2 = rho * rho; /** * rᵢ: Returns the zoom-out factor at one end of the animation. * * @param i 0 for the ascent or 1 for the descent. * @private */ function r(i) { var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1); return Math.log(Math.sqrt(b * b + 1) - b); } function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } function tanh(n) { return sinh(n) / cosh(n); } // r₀: Zoom-out factor during ascent. var r0 = r(0); // w(s): Returns the visible span on the ground, measured in pixels with respect to the // initial scale. Assumes an angular field of view of 2 arctan ½ ≈ 53°. var w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); }; // u(s): Returns the distance along the flight path as projected onto the ground plane, // measured in pixels from the world image origin at the initial scale. var u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; }; // S: Total length of the flight path, measured in ρ-screenfuls. var S = (r(1) - r0) / rho; // When u₀ = u₁, the optimal path doesn’t require both ascent and descent. if (Math.abs(u1) < 0.000001 || !isFinite(S)) { // Perform a more or less instantaneous transition if the path is too short. if (Math.abs(w0 - w1) < 0.000001) { return this.easeTo(options, eventData); } var k = w1 < w0 ? -1 : 1; S = Math.abs(Math.log(w1 / w0)) / rho; u = function() { return 0; }; w = function(s) { return Math.exp(k * rho * s); }; } if ('duration' in options) { options.duration = +options.duration; } else { var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed; options.duration = 1000 * S / V; } if (options.maxDuration && options.duration > options.maxDuration) { options.duration = 0; } this._zooming = true; this._rotating = (startBearing !== bearing); this._pitching = (pitch !== startPitch); this._prepareEase(eventData, false); this._ease(function (k) { // s: The distance traveled along the flight path, measured in ρ-screenfuls. var s = k * S; var scale = 1 / w(s); tr.zoom = k === 1 ? zoom : startZoom + tr.scaleZoom(scale); if (this$1._rotating) { tr.bearing = symbol_layout.number(startBearing, bearing, k); } if (this$1._pitching) { tr.pitch = symbol_layout.number(startPitch, pitch, k); } var newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); this$1._fireMoveEvents(eventData); }, function () { return this$1._afterEase(eventData); }, options); return this; }; Camera.prototype.isEasing = function isEasing () { return !!this._easeFrameId; }; /** * Stops any animated transition underway. * * @memberof Map# * @returns {Map} `this` */ Camera.prototype.stop = function stop () { if (this._easeFrameId) { this._cancelRenderFrame(this._easeFrameId); delete this._easeFrameId; delete this._onEaseFrame; } if (this._onEaseEnd) { // The _onEaseEnd function might emit events which trigger new // animation, which sets a new _onEaseEnd. Ensure we don't delete // it unintentionally. var onEaseEnd = this._onEaseEnd; delete this._onEaseEnd; onEaseEnd.call(this); } return this; }; Camera.prototype._ease = function _ease (frame , finish , options ) { if (options.animate === false || options.duration === 0) { frame(1); finish(); } else { this._easeStart = symbol_layout.browser.now(); this._easeOptions = options; this._onEaseFrame = frame; this._onEaseEnd = finish; this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); } }; // Callback for map._requestRenderFrame Camera.prototype._renderFrameCallback = function _renderFrameCallback () { var t = Math.min((symbol_layout.browser.now() - this._easeStart) / this._easeOptions.duration, 1); this._onEaseFrame(this._easeOptions.easing(t)); if (t < 1) { this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); } else { this.stop(); } }; // convert bearing so that it's numerically close to the current one so that it interpolates properly Camera.prototype._normalizeBearing = function _normalizeBearing (bearing , currentBearing ) { bearing = symbol_layout.wrap(bearing, -180, 180); var diff = Math.abs(bearing - currentBearing); if (Math.abs(bearing - 360 - currentBearing) < diff) { bearing -= 360; } if (Math.abs(bearing + 360 - currentBearing) < diff) { bearing += 360; } return bearing; }; // If a path crossing the antimeridian would be shorter, extend the final coordinate so that // interpolating between the two endpoints will cross it. Camera.prototype._normalizeCenter = function _normalizeCenter (center ) { var tr = this.transform; if (!tr.renderWorldCopies || tr.lngRange) { return; } var delta = center.lng - tr.center.lng; center.lng += delta > 180 ? -360 : delta < -180 ? 360 : 0; }; return Camera; }(symbol_layout.Evented)); // /** * An `AttributionControl` control presents the map's [attribution information](https://www.mapbox.com/help/attribution/). * * @implements {IControl} * @param {Object} [options] * @param {boolean} [options.compact] If `true` force a compact attribution that shows the full attribution on mouse hover, or if `false` force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide. * @param {string | Array} [options.customAttribution] String or strings to show in addition to any other attributions. * @example * var map = new mapboxgl.Map({attributionControl: false}) * .addControl(new mapboxgl.AttributionControl({ * compact: true * })); */ var AttributionControl = function AttributionControl(options) { if ( options === void 0 ) options = {}; this.options = options; symbol_layout.bindAll([ '_updateEditLink', '_updateData', '_updateCompact' ], this); }; AttributionControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-right'; }; AttributionControl.prototype.onAdd = function onAdd (map ) { var compact = this.options && this.options.compact; this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib'); this._innerContainer = DOM.create('div', 'mapboxgl-ctrl-attrib-inner', this._container); if (compact) { this._container.classList.add('mapboxgl-compact'); } this._updateAttributions(); this._updateEditLink(); this._map.on('styledata', this._updateData); this._map.on('sourcedata', this._updateData); this._map.on('moveend', this._updateEditLink); if (compact === undefined) { this._map.on('resize', this._updateCompact); this._updateCompact(); } return this._container; }; AttributionControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('styledata', this._updateData); this._map.off('sourcedata', this._updateData); this._map.off('moveend', this._updateEditLink); this._map.off('resize', this._updateCompact); this._map = (undefined ); }; AttributionControl.prototype._updateEditLink = function _updateEditLink () { var editLink = this._editLink; if (!editLink) { editLink = this._editLink = (this._container.querySelector('.mapbox-improve-map') ); } var params = [ {key: "owner", value: this.styleOwner}, {key: "id", value: this.styleId}, {key: "access_token", value: this._map._requestManager._customAccessToken || symbol_layout.config.ACCESS_TOKEN} ]; if (editLink) { var paramString = params.reduce(function (acc, next, i) { if (next.value) { acc += (next.key) + "=" + (next.value) + (i < params.length - 1 ? '&' : ''); } return acc; }, "?"); editLink.href = (symbol_layout.config.FEEDBACK_URL) + "/" + paramString + (this._map._hash ? this._map._hash.getHashString(true) : ''); editLink.rel = "noopener nofollow"; } }; AttributionControl.prototype._updateData = function _updateData (e ) { if (e && (e.sourceDataType === 'metadata' || e.dataType === 'style')) { this._updateAttributions(); this._updateEditLink(); } }; AttributionControl.prototype._updateAttributions = function _updateAttributions () { if (!this._map.style) { return; } var attributions = []; if (this.options.customAttribution) { if (Array.isArray(this.options.customAttribution)) { attributions = attributions.concat( this.options.customAttribution.map(function (attribution) { if (typeof attribution !== 'string') { return ''; } return attribution; }) ); } else if (typeof this.options.customAttribution === 'string') { attributions.push(this.options.customAttribution); } } if (this._map.style.stylesheet) { var stylesheet = this._map.style.stylesheet; this.styleOwner = stylesheet.owner; this.styleId = stylesheet.id; } var sourceCaches = this._map.style.sourceCaches; for (var id in sourceCaches) { var sourceCache = sourceCaches[id]; if (sourceCache.used) { var source = sourceCache.getSource(); if (source.attribution && attributions.indexOf(source.attribution) < 0) { attributions.push(source.attribution); } } } // remove any entries that are substrings of another entry. // first sort by length so that substrings come first attributions.sort(function (a, b) { return a.length - b.length; }); attributions = attributions.filter(function (attrib, i) { for (var j = i + 1; j < attributions.length; j++) { if (attributions[j].indexOf(attrib) >= 0) { return false; } } return true; }); // check if attribution string is different to minimize DOM changes var attribHTML = attributions.join(' | '); if (attribHTML === this._attribHTML) { return; } this._attribHTML = attribHTML; if (attributions.length) { this._innerContainer.innerHTML = attribHTML; this._container.classList.remove('mapboxgl-attrib-empty'); } else { this._container.classList.add('mapboxgl-attrib-empty'); } // remove old DOM node from _editLink this._editLink = null; }; AttributionControl.prototype._updateCompact = function _updateCompact () { if (this._map.getCanvasContainer().offsetWidth <= 640) { this._container.classList.add('mapboxgl-compact'); } else { this._container.classList.remove('mapboxgl-compact'); } }; // /** * A `LogoControl` is a control that adds the Mapbox watermark * to the map as required by the [terms of service](https://www.mapbox.com/tos/) for Mapbox * vector tiles and core styles. * * @implements {IControl} * @private **/ var LogoControl = function LogoControl() { symbol_layout.bindAll(['_updateLogo'], this); symbol_layout.bindAll(['_updateCompact'], this); }; LogoControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl'); var anchor = DOM.create('a', 'mapboxgl-ctrl-logo'); anchor.target = "_blank"; anchor.rel = "noopener nofollow"; anchor.href = "https://www.mapbox.com/"; anchor.setAttribute("aria-label", "Mapbox logo"); anchor.setAttribute("rel", "noopener nofollow"); this._container.appendChild(anchor); this._container.style.display = 'none'; this._map.on('sourcedata', this._updateLogo); this._updateLogo(); this._map.on('resize', this._updateCompact); this._updateCompact(); return this._container; }; LogoControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('sourcedata', this._updateLogo); this._map.off('resize', this._updateCompact); }; LogoControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-left'; }; LogoControl.prototype._updateLogo = function _updateLogo (e ) { if (!e || e.sourceDataType === 'metadata') { this._container.style.display = this._logoRequired() ? 'block' : 'none'; } }; LogoControl.prototype._logoRequired = function _logoRequired () { if (!this._map.style) { return; } var sourceCaches = this._map.style.sourceCaches; for (var id in sourceCaches) { var source = sourceCaches[id].getSource(); if (source.mapbox_logo) { return true; } } return false; }; LogoControl.prototype._updateCompact = function _updateCompact () { var containerChildren = this._container.children; if (containerChildren.length) { var anchor = containerChildren[0]; if (this._map.getCanvasContainer().offsetWidth < 250) { anchor.classList.add('mapboxgl-compact'); } else { anchor.classList.remove('mapboxgl-compact'); } } }; // strict // can't mark opaque due to https://github.com/flowtype/flow-remove-types/pull/61 var TaskQueue = function TaskQueue(){ this._queue = []; this._id = 0; this._cleared = false; this._currentlyRunning = false; }; TaskQueue.prototype.add = function add (callback ) { var id = ++this._id; var queue = this._queue; queue.push({callback: callback, id: id, cancelled: false}); return id; }; TaskQueue.prototype.remove = function remove (id ) { var running = this._currentlyRunning; var queue = running ? this._queue.concat(running) : this._queue; for (var i = 0, list = queue; i < list.length; i += 1) { var task = list[i]; if (task.id === id) { task.cancelled = true; return; } } }; TaskQueue.prototype.run = function run () { symbol_layout.assert(!this._currentlyRunning); var queue = this._currentlyRunning = this._queue; // Tasks queued by callbacks in the current queue should be executed // on the next run, not the current run. this._queue = []; for (var i = 0, list = queue; i < list.length; i += 1) { var task = list[i]; if (task.cancelled) { continue; } task.callback(); if (this._cleared) { break; } } this._cleared = false; this._currentlyRunning = false; }; TaskQueue.prototype.clear = function clear () { if (this._currentlyRunning) { this._cleared = true; } this._queue = []; }; // var HTMLImageElement = symbol_layout.window.HTMLImageElement; var HTMLElement = symbol_layout.window.HTMLElement; /* eslint-disable no-use-before-define */ /* eslint-enable no-use-before-define */ var defaultMinZoom = 0; var defaultMaxZoom = 22; var defaultOptions = { center: [0, 0], zoom: 0, bearing: 0, pitch: 0, minZoom: defaultMinZoom, maxZoom: defaultMaxZoom, interactive: true, scrollZoom: true, boxZoom: true, dragRotate: true, dragPan: true, keyboard: true, doubleClickZoom: true, touchZoomRotate: true, bearingSnap: 7, clickTolerance: 3, hash: false, attributionControl: true, failIfMajorPerformanceCaveat: false, preserveDrawingBuffer: false, trackResize: true, renderWorldCopies: true, refreshExpiredTiles: true, maxTileCacheSize: null, localIdeographFontFamily: 'sans-serif', transformRequest: null, accessToken: null, fadeDuration: 300, crossSourceCollisions: true }; /** * The `Map` object represents the map on your page. It exposes methods * and properties that enable you to programmatically change the map, * and fires events as users interact with it. * * You create a `Map` by specifying a `container` and other options. * Then Mapbox GL JS initializes the map on the page and returns your `Map` * object. * * @extends Evented * @param {Object} options * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`. The specified element must have no children. * @param {number} [options.minZoom=0] The minimum zoom level of the map (0-24). * @param {number} [options.maxZoom=22] The maximum zoom level of the map (0-24). * @param {Object|string} [options.style] The map's Mapbox style. This must be an a JSON object conforming to * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to * such JSON. * * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`, * where `:owner` is your Mapbox account name and `:style` is the style ID. Or you can use one of the following * [the predefined Mapbox styles](https://www.mapbox.com/maps/): * * * `mapbox://styles/mapbox/streets-v10` * * `mapbox://styles/mapbox/outdoors-v10` * * `mapbox://styles/mapbox/light-v9` * * `mapbox://styles/mapbox/dark-v9` * * `mapbox://styles/mapbox/satellite-v9` * * `mapbox://styles/mapbox/satellite-streets-v10` * * `mapbox://styles/mapbox/navigation-preview-day-v2` * * `mapbox://styles/mapbox/navigation-preview-night-v2` * * `mapbox://styles/mapbox/navigation-guidance-day-v2` * * `mapbox://styles/mapbox/navigation-guidance-night-v2` * * Tilesets hosted with Mapbox can be style-optimized if you append `?optimize=true` to the end of your style URL, like `mapbox://styles/mapbox/streets-v9?optimize=true`. * Learn more about style-optimized vector tiles in our [API documentation](https://www.mapbox.com/api-documentation/maps/#retrieve-tiles). * * @param {boolean} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL. * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`. * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction. * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's * bearing will snap to north. For example, with a `bearingSnap` of 7, if the user rotates * the map within 7 degrees of north, the map will automatically snap to exact north. * @param {boolean} [options.pitchWithRotate=true] If `false`, the map's pitch (tilt) control with "drag to rotate" interaction will be disabled. * @param {number} [options.clickTolerance=3] The max number of pixels a user can shift the mouse pointer during a click for it to be considered a valid click (as opposed to a mouse drag). * @param {boolean} [options.attributionControl=true] If `true`, an {@link AttributionControl} will be added to the map. * @param {string | Array} [options.customAttribution] String or strings to show in an {@link AttributionControl}. Only applicable if `options.attributionControl` is `true`. * @param {string} [options.logoPosition='bottom-left'] A string representing the position of the Mapbox wordmark on the map. Valid options are `top-left`,`top-right`, `bottom-left`, `bottom-right`. * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox * GL JS would be dramatically worse than expected (i.e. a software renderer would be used). * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization. * @param {boolean} [options.antialias] If `true`, the gl context will be created with MSAA antialiasing, which can be useful for antialiasing custom layers. this is `false` by default as a performance optimization. * @param {boolean} [options.refreshExpiredTiles=true] If `false`, the map won't attempt to re-request tiles once they expire per their HTTP `cacheControl`/`expires` headers. * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds. * @param {boolean|Object} [options.scrollZoom=true] If `true`, the "scroll to zoom" interaction is enabled. An `Object` value is passed as options to {@link ScrollZoomHandler#enable}. * @param {boolean} [options.boxZoom=true] If `true`, the "box zoom" interaction is enabled (see {@link BoxZoomHandler}). * @param {boolean} [options.dragRotate=true] If `true`, the "drag to rotate" interaction is enabled (see {@link DragRotateHandler}). * @param {boolean} [options.dragPan=true] If `true`, the "drag to pan" interaction is enabled (see {@link DragPanHandler}). * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see {@link KeyboardHandler}). * @param {boolean} [options.doubleClickZoom=true] If `true`, the "double click to zoom" interaction is enabled (see {@link DoubleClickZoomHandler}). * @param {boolean|Object} [options.touchZoomRotate=true] If `true`, the "pinch to rotate and zoom" interaction is enabled. An `Object` value is passed as options to {@link TouchZoomRotateHandler#enable}. * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes. * @param {LngLatLike} [options.center=[0, 0]] The inital geographical centerpoint of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]` Note: Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON. * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-60). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {LngLatBoundsLike} [options.bounds] The initial bounds of the map. If `bounds` is specified, it overrides `center` and `zoom` constructor options. * @param {Object} [options.fitBoundsOptions] A [`fitBounds`](#map#fitbounds) options object to use _only_ when fitting the initial `bounds` provided above. * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered, when zoomed out. * @param {number} [options.maxTileCacheSize=null] The maximum number of tiles stored in the tile cache for a given source. If omitted, the cache will be dynamically sized based on the current viewport. * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges. * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold). * Set to `false`, to enable font settings from the map's style for these glyph ranges. Note that [Mapbox Studio](https://studio.mapbox.com/) sets this value to `false` by default. * The purpose of this option is to avoid bandwidth-intensive glyph server requests. (See [Use locally generated ideographs](https://www.mapbox.com/mapbox-gl-js/example/local-ideographs).) * @param {RequestTransformFunction} [options.transformRequest=null] A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests. * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties. * @param {boolean} [options.collectResourceTiming=false] If `true`, Resource Timing API information will be collected for requests made by GeoJSON and Vector Tile web workers (this information is normally inaccessible from the main Javascript thread). Information will be returned in a `resourceTiming` property of relevant `data` events. * @param {number} [options.fadeDuration=300] Controls the duration of the fade-in/fade-out animation for label collisions, in milliseconds. This setting affects all symbol layers. This setting does not affect the duration of runtime styling transitions or raster tile cross-fading. * @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 instead of the one defined in mapboxgl.accessToken. * @example * var map = new mapboxgl.Map({ * container: 'map', * center: [-122.420679, 37.772537], * zoom: 13, * style: style_object, * hash: true, * transformRequest: (url, resourceType)=> { * if(resourceType === 'Source' && url.startsWith('http://myHost')) { * return { * url: url.replace('http', 'https'), * headers: { 'my-custom-header': true}, * credentials: 'include' // Include cookies for cross-origin requests * } * } * } * }); * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) */ var Map = /*@__PURE__*/(function (Camera) { function Map(options ) { var this$1 = this; options = symbol_layout.extend({}, defaultOptions, options); if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) { throw new Error("maxZoom must be greater than minZoom"); } var transform = new Transform(options.minZoom, options.maxZoom, options.renderWorldCopies); Camera.call(this, transform, options); this._interactive = options.interactive; this._maxTileCacheSize = options.maxTileCacheSize; this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat; this._preserveDrawingBuffer = options.preserveDrawingBuffer; this._antialias = options.antialias; this._trackResize = options.trackResize; this._bearingSnap = options.bearingSnap; this._refreshExpiredTiles = options.refreshExpiredTiles; this._fadeDuration = options.fadeDuration; this._crossSourceCollisions = options.crossSourceCollisions; this._crossFadingFactor = 1; this._collectResourceTiming = options.collectResourceTiming; this._renderTaskQueue = new TaskQueue(); this._controls = []; this._mapId = symbol_layout.uniqueId(); this._requestManager = new symbol_layout.RequestManager(options.transformRequest, options.accessToken); if (typeof options.container === 'string') { this._container = symbol_layout.window.document.getElementById(options.container); if (!this._container) { throw new Error(("Container '" + (options.container) + "' not found.")); } } else if (options.container instanceof HTMLElement) { this._container = options.container; } else { throw new Error("Invalid type: 'container' must be a String or HTMLElement."); } if (options.maxBounds) { this.setMaxBounds(options.maxBounds); } symbol_layout.bindAll([ '_onWindowOnline', '_onWindowResize', '_contextLost', '_contextRestored' ], this); this._setupContainer(); this._setupPainter(); if (this.painter === undefined) { throw new Error("Failed to initialize WebGL."); } this.on('move', function () { return this$1._update(false); }); this.on('moveend', function () { return this$1._update(false); }); this.on('zoom', function () { return this$1._update(true); }); if (typeof symbol_layout.window !== 'undefined') { symbol_layout.window.addEventListener('online', this._onWindowOnline, false); symbol_layout.window.addEventListener('resize', this._onWindowResize, false); } bindHandlers(this, options); this._hash = options.hash && (new Hash()).addTo(this); // don't set position from options if set through hash if (!this._hash || !this._hash._onHashChange()) { this.jumpTo({ center: options.center, zoom: options.zoom, bearing: options.bearing, pitch: options.pitch }); if (options.bounds) { this.resize(); this.fitBounds(options.bounds, symbol_layout.extend({}, options.fitBoundsOptions, { duration: 0 })); } } this.resize(); this._localIdeographFontFamily = options.localIdeographFontFamily; if (options.style) { this.setStyle(options.style, { localIdeographFontFamily: options.localIdeographFontFamily }); } if (options.attributionControl) { this.addControl(new AttributionControl({ customAttribution: options.customAttribution })); } this.addControl(new LogoControl(), options.logoPosition); this.on('style.load', function () { if (this$1.transform.unmodified) { this$1.jumpTo((this$1.style.stylesheet )); } }); this.on('data', function (event ) { this$1._update(event.dataType === 'style'); this$1.fire(new symbol_layout.Event(((event.dataType) + "data"), event)); }); this.on('dataloading', function (event ) { this$1.fire(new symbol_layout.Event(((event.dataType) + "dataloading"), event)); }); } if ( Camera ) Map.__proto__ = Camera; Map.prototype = Object.create( Camera && Camera.prototype ); Map.prototype.constructor = Map; var prototypeAccessors = { showTileBoundaries: { configurable: true },showCollisionBoxes: { configurable: true },showOverdrawInspector: { configurable: true },repaint: { configurable: true },vertices: { configurable: true },version: { configurable: true } }; /* * Returns a unique number for this map instance which is used for the MapLoadEvent * to make sure we only fire one event per instantiated map object. * @private * @returns {number} */ Map.prototype._getMapId = function _getMapId () { return this._mapId; }; /** * Adds a {@link IControl} to the map, calling `control.onAdd(this)`. * * @param {IControl} control The {@link IControl} to add. * @param {string} [position] position on the map to which the control will be added. * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`. * @returns {Map} `this` * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) */ Map.prototype.addControl = function addControl (control , position ) { if (position === undefined && control.getDefaultPosition) { position = control.getDefaultPosition(); } if (position === undefined) { position = 'top-right'; } if (!control || !control.onAdd) { return this.fire(new symbol_layout.ErrorEvent(new Error( 'Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.'))); } var controlElement = control.onAdd(this); this._controls.push(control); var positionContainer = this._controlPositions[position]; if (position.indexOf('bottom') !== -1) { positionContainer.insertBefore(controlElement, positionContainer.firstChild); } else { positionContainer.appendChild(controlElement); } return this; }; /** * Removes the control from the map. * * @param {IControl} control The {@link IControl} to remove. * @returns {Map} `this` */ Map.prototype.removeControl = function removeControl (control ) { if (!control || !control.onRemove) { return this.fire(new symbol_layout.ErrorEvent(new Error( 'Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.'))); } var ci = this._controls.indexOf(control); if (ci > -1) { this._controls.splice(ci, 1); } control.onRemove(this); return this; }; /** * Resizes the map according to the dimensions of its * `container` element. * * This method must be called after the map's `container` is resized by another script, * or when the map is shown after being initially hidden with CSS. * * @param eventData Additional properties to be added to event objects of events triggered by this method. * @returns {Map} `this` */ Map.prototype.resize = function resize (eventData ) { var dimensions = this._containerDimensions(); var width = dimensions[0]; var height = dimensions[1]; this._resizeCanvas(width, height); this.transform.resize(width, height); this.painter.resize(width, height); this.fire(new symbol_layout.Event('movestart', eventData)) .fire(new symbol_layout.Event('move', eventData)) .fire(new symbol_layout.Event('resize', eventData)) .fire(new symbol_layout.Event('moveend', eventData)); return this; }; /** * 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. */ Map.prototype.getBounds = function getBounds () { return this.transform.getBounds(); }; /** * Returns the maximum geographical bounds the map is constrained to, or `null` if none set. */ Map.prototype.getMaxBounds = function getMaxBounds () { return this.transform.getMaxBounds(); }; /** * Sets or clears the map's geographical bounds. * * Pan and zoom operations are constrained within these bounds. * If a pan or zoom is performed that would * display regions outside these bounds, the map will * instead display a position and zoom level * as close as possible to the operation's request while still * remaining within the bounds. * * @param {LngLatBoundsLike | null | undefined} bounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds. * @returns {Map} `this` */ Map.prototype.setMaxBounds = function setMaxBounds (bounds ) { this.transform.setMaxBounds(symbol_layout.LngLatBounds.convert(bounds)); return this._update(); }; /** * Sets or clears the map's minimum zoom level. * If the map's current zoom level is lower than the new minimum, * the map will zoom to the new minimum. * * @param {number | null | undefined} minZoom The minimum zoom level to set (0-24). * If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to 0). * @returns {Map} `this` */ Map.prototype.setMinZoom = function setMinZoom (minZoom ) { minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom; if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) { this.transform.minZoom = minZoom; this._update(); if (this.getZoom() < minZoom) { this.setZoom(minZoom); } return this; } else { throw new Error(("minZoom must be between " + defaultMinZoom + " and the current maxZoom, inclusive")); } }; /** * Returns the map's minimum allowable zoom level. * * @returns {number} minZoom */ Map.prototype.getMinZoom = function getMinZoom () { return this.transform.minZoom; }; /** * Sets or clears the map's maximum zoom level. * If the map's current zoom level is higher than the new maximum, * the map will zoom to the new maximum. * * @param {number | null | undefined} maxZoom The maximum zoom level to set. * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 22). * @returns {Map} `this` */ Map.prototype.setMaxZoom = function setMaxZoom (maxZoom ) { maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom; if (maxZoom >= this.transform.minZoom) { this.transform.maxZoom = maxZoom; this._update(); if (this.getZoom() > maxZoom) { this.setZoom(maxZoom); } return this; } else { throw new Error("maxZoom must be greater than the current minZoom"); } }; /** * Returns the state of renderWorldCopies. * * @returns {boolean} renderWorldCopies */ Map.prototype.getRenderWorldCopies = function getRenderWorldCopies () { return this.transform.renderWorldCopies; }; /** * Sets the state of renderWorldCopies. * * @param {boolean} renderWorldCopies If `true`, multiple copies of the world will be rendered, when zoomed out. `undefined` is treated as `true`, `null` is treated as `false`. * @returns {Map} `this` */ Map.prototype.setRenderWorldCopies = function setRenderWorldCopies (renderWorldCopies ) { this.transform.renderWorldCopies = renderWorldCopies; return this._update(); }; /** * Returns the map's maximum allowable zoom level. * * @returns {number} maxZoom */ Map.prototype.getMaxZoom = function getMaxZoom () { return this.transform.maxZoom; }; /** * Returns a {@link Point} representing pixel coordinates, relative to the map's `container`, * that correspond to the specified geographical location. * * @param {LngLatLike} lnglat The geographical location to project. * @returns {Point} The {@link Point} corresponding to `lnglat`, relative to the map's `container`. */ Map.prototype.project = function project (lnglat ) { return this.transform.locationPoint(symbol_layout.LngLat.convert(lnglat)); }; /** * Returns a {@link LngLat} representing geographical coordinates that correspond * to the specified pixel coordinates. * * @param {PointLike} point The pixel coordinates to unproject. * @returns {LngLat} The {@link LngLat} corresponding to `point`. * @see [Show polygon information on click](https://www.mapbox.com/mapbox-gl-js/example/polygon-popup-on-click/) */ Map.prototype.unproject = function unproject (point ) { return this.transform.pointLocation(symbol_layout.Point.convert(point)); }; /** * Returns true if the map is panning, zooming, rotating, or pitching due to a camera animation or user gesture. */ Map.prototype.isMoving = function isMoving () { return this._moving || this.dragPan.isActive() || this.dragRotate.isActive() || this.scrollZoom.isActive(); }; /** * Returns true if the map is zooming due to a camera animation or user gesture. */ Map.prototype.isZooming = function isZooming () { return this._zooming || this.scrollZoom.isZooming(); }; /** * Returns true if the map is rotating due to a camera animation or user gesture. */ Map.prototype.isRotating = function isRotating () { return this._rotating || this.dragRotate.isActive(); }; /** * Adds a listener for events of a specified type. * * @method * @name on * @memberof Map * @instance * @param {string} type The event type to add a listen for. * @param {Function} listener The function to be called when the event is fired. * The listener function is called with the data object passed to `fire`, * extended with `target` and `type` properties. * @returns {Map} `this` */ /** * Adds a listener for events of a specified type occurring on features in a specified style layer. * * @param {string} type The event type to listen for; one of `'mousedown'`, `'mouseup'`, `'click'`, `'dblclick'`, * `'mousemove'`, `'mouseenter'`, `'mouseleave'`, `'mouseover'`, `'mouseout'`, `'contextmenu'`, `'touchstart'`, * `'touchend'`, or `'touchcancel'`. `mouseenter` and `mouseover` events are triggered when the cursor enters * a visible portion of the specified layer from outside that layer or outside the map canvas. `mouseleave` * and `mouseout` events are triggered when the cursor leaves a visible portion of the specified layer, or leaves * the map canvas. * @param {string} layerId The ID of a style layer. Only events whose location is within a visible * feature in this layer will trigger the listener. The event will have a `features` property containing * an array of the matching features. * @param {Function} listener The function to be called when the event is fired. * @returns {Map} `this` */ Map.prototype.on = function on (type , layerId , listener ) { var this$1 = this; if (listener === undefined) { return Camera.prototype.on.call(this, type, layerId); } var delegatedListener = (function () { var obj; if (type === 'mouseenter' || type === 'mouseover') { var mousein = false; var mousemove = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, {layers: [layerId]}) : []; if (!features.length) { mousein = false; } else if (!mousein) { mousein = true; listener.call(this$1, new MapMouseEvent(type, this$1, e.originalEvent, {features: features})); } }; var mouseout = function () { mousein = false; }; return {layer: layerId, listener: listener, delegates: {mousemove: mousemove, mouseout: mouseout}}; } else if (type === 'mouseleave' || type === 'mouseout') { var mousein$1 = false; var mousemove$1 = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, {layers: [layerId]}) : []; if (features.length) { mousein$1 = true; } else if (mousein$1) { mousein$1 = false; listener.call(this$1, new MapMouseEvent(type, this$1, e.originalEvent)); } }; var mouseout$1 = function (e) { if (mousein$1) { mousein$1 = false; listener.call(this$1, new MapMouseEvent(type, this$1, e.originalEvent)); } }; return {layer: layerId, listener: listener, delegates: {mousemove: mousemove$1, mouseout: mouseout$1}}; } else { var delegate = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, {layers: [layerId]}) : []; if (features.length) { // Here we need to mutate the original event, so that preventDefault works as expected. e.features = features; listener.call(this$1, e); delete e.features; } }; return {layer: layerId, listener: listener, delegates: ( obj = {}, obj[type] = delegate, obj )}; } })(); this._delegatedListeners = this._delegatedListeners || {}; this._delegatedListeners[type] = this._delegatedListeners[type] || []; this._delegatedListeners[type].push(delegatedListener); for (var event in delegatedListener.delegates) { this.on((event ), delegatedListener.delegates[event]); } return this; }; /** * Removes an event listener previously added with `Map#on`. * * @method * @name off * @memberof Map * @instance * @param {string} type The event type previously used to install the listener. * @param {Function} listener The function previously installed as a listener. * @returns {Map} `this` */ /** * Removes an event listener for layer-specific events previously added with `Map#on`. * * @param {string} type The event type previously used to install the listener. * @param {string} layerId The layer ID previously used to install the listener. * @param {Function} listener The function previously installed as a listener. * @returns {Map} `this` */ Map.prototype.off = function off (type , layerId , listener ) { if (listener === undefined) { return Camera.prototype.off.call(this, type, layerId); } if (this._delegatedListeners && this._delegatedListeners[type]) { var listeners = this._delegatedListeners[type]; for (var i = 0; i < listeners.length; i++) { var delegatedListener = listeners[i]; if (delegatedListener.layer === layerId && delegatedListener.listener === listener) { for (var event in delegatedListener.delegates) { this.off((event ), delegatedListener.delegates[event]); } listeners.splice(i, 1); return this; } } } return this; }; /** * Returns an array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2) * representing visible features that satisfy the query parameters. * * @param {PointLike|Array} [geometry] - The geometry of the query region: * either a single point or southwest and northeast points describing a bounding box. * Omitting this parameter (i.e. calling {@link Map#queryRenderedFeatures} with zero arguments, * or with only a `options` argument) is equivalent to passing a bounding box encompassing the entire * map viewport. * @param {Object} [options] * @param {Array} [options.layers] An array of style layer IDs for the query to inspect. * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked. * @param {Array} [options.filter] A [filter](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter) * to limit query results. * @param {boolean} [options.validate=true] Whether to check if the [options.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 {Array} An array of [GeoJSON](http://geojson.org/) * [feature objects](https://tools.ietf.org/html/rfc7946#section-3.2). * * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported). * * Each feature includes top-level `layer`, `source`, and `sourceLayer` properties. The `layer` property is an object * representing the style layer to which the feature belongs. Layout and paint properties in this object contain values * which are fully evaluated for the given zoom level and feature. * * Features from layers whose `visibility` property is `"none"`, or from layers whose zoom range excludes the * current zoom level are not included. Symbol features that have been hidden due to text or icon collision are * not included. Features from all other layers are included, including features that may have no visible * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to * 0. * * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low * zoom levels) are returned only once (though subject to the following caveat). * * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple * tiles due to tile buffering. * * @example * // Find all features at a point * var features = map.queryRenderedFeatures( * [20, 35], * { layers: ['my-layer-name'] } * ); * * @example * // Find all features within a static bounding box * var features = map.queryRenderedFeatures( * [[10, 20], [30, 50]], * { layers: ['my-layer-name'] } * ); * * @example * // Find all features within a bounding box around a point * var width = 10; * var height = 20; * var features = map.queryRenderedFeatures([ * [point.x - width / 2, point.y - height / 2], * [point.x + width / 2, point.y + height / 2] * ], { layers: ['my-layer-name'] }); * * @example * // Query all rendered features from a single layer * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] }); * @see [Get features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) */ Map.prototype.queryRenderedFeatures = function queryRenderedFeatures (geometry , options ) { // The first parameter can be omitted entirely, making this effectively an overloaded method // with two signatures: // // queryRenderedFeatures(geometry: PointLike | [PointLike, PointLike], options?: Object) // queryRenderedFeatures(options?: Object) // // There no way to express that in a way that's compatible with both flow and documentation.js. // Related: https://github.com/facebook/flow/issues/1556 if (!this.style) { return []; } if (options === undefined && geometry !== undefined && !(geometry instanceof symbol_layout.Point) && !Array.isArray(geometry)) { options = (geometry ); geometry = undefined; } options = options || {}; geometry = geometry || [[0, 0], [this.transform.width, this.transform.height]]; var queryGeometry; if (geometry instanceof symbol_layout.Point || typeof geometry[0] === 'number') { queryGeometry = [symbol_layout.Point.convert(geometry)]; } else { var tl = symbol_layout.Point.convert(geometry[0]); var br = symbol_layout.Point.convert(geometry[1]); queryGeometry = [tl, new symbol_layout.Point(br.x, tl.y), br, new symbol_layout.Point(tl.x, br.y), tl]; } return this.style.queryRenderedFeatures(queryGeometry, options, this.transform); }; /** * Returns an array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2) * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters. * * @param {string} sourceId The ID of the vector tile or GeoJSON source to query. * @param {Object} [parameters] * @param {string} [parameters.sourceLayer] The name of the vector tile layer to query. *For vector tile * sources, this parameter is required.* For GeoJSON sources, it is ignored. * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter) * to limit query results. * @param {boolean} [parameters.validate=true] Whether to check if the [parameters.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 {Array} An array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2). * * In contrast to {@link Map#queryRenderedFeatures}, this function * returns all features matching the query parameters, * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently * visible viewport. * * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple * tiles due to tile buffering. * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) */ Map.prototype.querySourceFeatures = function querySourceFeatures (sourceId , parameters ) { return this.style.querySourceFeatures(sourceId, parameters); }; /** * Updates the map's Mapbox style object with a new value. If a style already is set and options.diff is true, * this compares the style against the map's current state and performs only the changes necessary to make * the map style match the desired state. * * @param style A JSON object conforming to the schema described in the * [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON. * @param {Object} [options] * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style * and building the given one instead of attempting a diff-based update. * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges. * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold). * Set to `false`, to enable font settings from the map's style for these glyph ranges. * Forces a full update. * @returns {Map} `this` * @see [Change a map's style](https://www.mapbox.com/mapbox-gl-js/example/setstyle/) */ Map.prototype.setStyle = function setStyle (style , options ) { options = symbol_layout.extend({}, { localIdeographFontFamily: this._localIdeographFontFamily}, options); if ((options.diff !== false && options.localIdeographFontFamily === this._localIdeographFontFamily) && this.style && style) { this._diffStyle(style, options); return this; } else { this._localIdeographFontFamily = options.localIdeographFontFamily; return this._updateStyle(style, options); } }; Map.prototype._updateStyle = function _updateStyle (style , options ) { if (this.style) { this.style.setEventedParent(null); this.style._remove(); } if (!style) { delete this.style; return this; } else { this.style = new Style(this, options || {}); } this.style.setEventedParent(this, {style: this.style}); if (typeof style === 'string') { this.style.loadURL(style); } else { this.style.loadJSON(style); } return this; }; Map.prototype._diffStyle = function _diffStyle (style , options ) { var this$1 = this; if (typeof style === 'string') { var url = this._requestManager.normalizeStyleURL(style); var request = this._requestManager.transformRequest(url, symbol_layout.ResourceType.Style); symbol_layout.getJSON(request, function (error , json ) { if (error) { this$1.fire(new symbol_layout.ErrorEvent(error)); } else if (json) { this$1._updateDiff(json, options); } }); } else if (typeof style === 'object') { this._updateDiff(style, options); } }; Map.prototype._updateDiff = function _updateDiff (style , options ) { try { if (this.style.setState(style)) { this._update(true); } } catch (e) { symbol_layout.warnOnce( ("Unable to perform style diff: " + (e.message || e.error || e) + ". Rebuilding the style from scratch.") ); this._updateStyle(style, options); } }; /** * Returns the map's Mapbox style object, which can be used to recreate the map's style. * * @returns {Object} The map's style object. */ Map.prototype.getStyle = function getStyle () { if (this.style) { return this.style.serialize(); } }; /** * Returns a Boolean indicating whether the map's style is fully loaded. * * @returns {boolean} A Boolean indicating whether the style is fully loaded. */ Map.prototype.isStyleLoaded = function isStyleLoaded () { if (!this.style) { return symbol_layout.warnOnce('There is no style added to the map.'); } return this.style.loaded(); }; /** * Adds a source to the map's style. * * @param {string} id The ID of the source to add. Must not conflict with existing sources. * @param {Object} source The source object, conforming to the * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or * {@link CanvasSourceOptions}. * @fires source.add * @returns {Map} `this` * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) * @see [Style circles using data-driven styling](https://www.mapbox.com/mapbox-gl-js/example/data-driven-circle-colors/) * @see [Set a point after Geocoder result](https://www.mapbox.com/mapbox-gl-js/example/point-from-geocoder-result/) */ Map.prototype.addSource = function addSource (id , source ) { this.style.addSource(id, source); return this._update(true); }; /** * Returns a Boolean indicating whether the source is loaded. * * @param {string} id The ID of the source to be checked. * @returns {boolean} A Boolean indicating whether the source is loaded. */ Map.prototype.isSourceLoaded = function isSourceLoaded (id ) { var source = this.style && this.style.sourceCaches[id]; if (source === undefined) { this.fire(new symbol_layout.ErrorEvent(new Error(("There is no source with ID '" + id + "'")))); return; } return source.loaded(); }; /** * Returns a Boolean indicating whether all tiles in the viewport from all sources on * the style are loaded. * * @returns {boolean} A Boolean indicating whether all tiles are loaded. */ Map.prototype.areTilesLoaded = function areTilesLoaded () { var sources = this.style && this.style.sourceCaches; for (var id in sources) { var source = sources[id]; var tiles = source._tiles; for (var t in tiles) { var tile = tiles[t]; if (!(tile.state === 'loaded' || tile.state === 'errored')) { return false; } } } return true; }; /** * Adds a [custom source type](#Custom Sources), making it available for use with * {@link Map#addSource}. * @private * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field. * @param {Function} SourceType A {@link Source} constructor. * @param {Function} callback Called when the source type is ready or with an error argument if there is an error. */ Map.prototype.addSourceType = function addSourceType (name , SourceType , callback ) { return this.style.addSourceType(name, SourceType, callback); }; /** * Removes a source from the map's style. * * @param {string} id The ID of the source to remove. * @returns {Map} `this` */ Map.prototype.removeSource = function removeSource (id ) { this.style.removeSource(id); return this._update(true); }; /** * Returns the source with the specified ID in the map's style. * * @param {string} id The ID of the source to get. * @returns {?Object} The style source with the specified ID, or `undefined` * if the ID corresponds to no existing sources. * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Animate a point](https://www.mapbox.com/mapbox-gl-js/example/animate-point-along-line/) * @see [Add live realtime data](https://www.mapbox.com/mapbox-gl-js/example/live-geojson/) */ Map.prototype.getSource = function getSource (id ) { return this.style.getSource(id); }; /** * Add an image to the style. This image can be used in `icon-image`, * `background-pattern`, `fill-pattern`, and `line-pattern`. An * {@link Map#error} event will be fired if there is not enough space in the * sprite to add this image. * * @see [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) * @see [Add a generated icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image-generated/) * @param id The ID of the image. * @param image The image as an `HTMLImageElement`, `ImageData`, or object with `width`, `height`, and `data` * properties with the same format as `ImageData`. * @param options * @param options.pixelRatio The ratio of pixels in the image to physical pixels on the screen * @param options.sdf Whether the image should be interpreted as an SDF image */ Map.prototype.addImage = function addImage (id , image , ref) { if ( ref === void 0 ) ref = {}; var pixelRatio = ref.pixelRatio; if ( pixelRatio === void 0 ) pixelRatio = 1; var sdf = ref.sdf; if ( sdf === void 0 ) sdf = false; var version = 0; if (image instanceof HTMLImageElement) { var ref$1 = symbol_layout.browser.getImageData(image); var width = ref$1.width; var height = ref$1.height; var data = ref$1.data; this.style.addImage(id, { data: new symbol_layout.RGBAImage({width: width, height: height}, data), pixelRatio: pixelRatio, sdf: sdf, version: version }); } else if (image.width === undefined || image.height === undefined) { return this.fire(new symbol_layout.ErrorEvent(new Error( 'Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`'))); } else { var width$1 = image.width; var height$1 = image.height; var data$1 = image.data; var userImage = ((image ) ); this.style.addImage(id, { data: new symbol_layout.RGBAImage({width: width$1, height: height$1}, new Uint8Array(data$1)), pixelRatio: pixelRatio, sdf: sdf, version: version, userImage: userImage }); if (userImage.onAdd) { userImage.onAdd(this, id); } } }; /** * Update an existing style image. This image can be used in `icon-image`, * `background-pattern`, `fill-pattern`, and `line-pattern`. * * @param id The ID of the image. * @param image The image as an `HTMLImageElement`, `ImageData`, or object with `width`, `height`, and `data` * properties with the same format as `ImageData`. */ Map.prototype.updateImage = function updateImage (id , image ) { var existingImage = this.style.getImage(id); if (!existingImage) { return this.fire(new symbol_layout.ErrorEvent(new Error( 'The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.'))); } var imageData = image instanceof HTMLImageElement ? symbol_layout.browser.getImageData(image) : image; var width = imageData.width; var height = imageData.height; var data = imageData.data; if (width === undefined || height === undefined) { return this.fire(new symbol_layout.ErrorEvent(new Error( 'Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`'))); } if (width !== existingImage.data.width || height !== existingImage.data.height) { return this.fire(new symbol_layout.ErrorEvent(new Error( 'The width and height of the updated image must be that same as the previous version of the image'))); } var copy = !(image instanceof HTMLImageElement); existingImage.data.replace(data, copy); this.style.updateImage(id, existingImage); }; /** * Define whether the image has been added or not * * @param id The ID of the image. */ Map.prototype.hasImage = function hasImage (id ) { if (!id) { this.fire(new symbol_layout.ErrorEvent(new Error('Missing required image id'))); return false; } return !!this.style.getImage(id); }; /** * Remove an image from the style (such as one used by `icon-image` or `background-pattern`). * * @param id The ID of the image. */ Map.prototype.removeImage = function removeImage (id ) { this.style.removeImage(id); }; /** * Load an image from an external URL for use with `Map#addImage`. External * domains must support [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). * * @param {string} url The URL of the image file. Image file must be in png, webp, or jpg format. * @param {Function} callback Expecting `callback(error, data)`. Called when the image has loaded or with an error argument if there is an error. * @see [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) */ Map.prototype.loadImage = function loadImage (url , callback ) { symbol_layout.getImage(this._requestManager.transformRequest(url, symbol_layout.ResourceType.Image), callback); }; /** * Returns an Array of strings containing the names of all sprites/images currently available in the map * * @returns {Array} An Array of strings containing the names of all sprites/images currently available in the map * */ Map.prototype.listImages = function listImages () { return this.style.listImages(); }; /** * Adds a [Mapbox style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers) * to the map's style. * * A layer defines styling for data from a specified source. * * @param {Object | CustomLayerInterface} layer The style layer to add, conforming to the Mapbox Style Specification's * [layer definition](https://www.mapbox.com/mapbox-gl-style-spec/#layers). * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. * If this argument is omitted, the layer will be appended to the end of the layers array. * @returns {Map} `this` * @see [Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) * @see [Add a vector tile source](https://www.mapbox.com/mapbox-gl-js/example/vector-source/) * @see [Add a WMS source](https://www.mapbox.com/mapbox-gl-js/example/wms/) */ Map.prototype.addLayer = function addLayer (layer , beforeId ) { this.style.addLayer(layer, beforeId); return this._update(true); }; /** * Moves a layer to a different z-position. * * @param {string} id The ID of the layer to move. * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. * If this argument is omitted, the layer will be appended to the end of the layers array. * @returns {Map} `this` */ Map.prototype.moveLayer = function moveLayer (id , beforeId ) { this.style.moveLayer(id, beforeId); return this._update(true); }; /** * Removes the layer with the given id from the map's style. * * If no such layer exists, an `error` event is fired. * * @param {string} id id of the layer to remove * @fires error */ Map.prototype.removeLayer = function removeLayer (id ) { this.style.removeLayer(id); return this._update(true); }; /** * Returns the layer with the specified ID in the map's style. * * @param {string} id The ID of the layer to get. * @returns {?Object} The layer with the specified ID, or `undefined` * if the ID corresponds to no existing layers. * @see [Filter symbols by toggling a list](https://www.mapbox.com/mapbox-gl-js/example/filter-markers/) * @see [Filter symbols by text input](https://www.mapbox.com/mapbox-gl-js/example/filter-markers-by-input/) */ Map.prototype.getLayer = function getLayer (id ) { return this.style.getLayer(id); }; /** * Sets the filter for the specified style layer. * * @param {string} layerId The ID of the layer to which the filter will be applied. * @param {Array | null | undefined} filter The filter, conforming to the Mapbox Style Specification's * [filter definition](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter). If `null` or `undefined` is provided, the function removes any existing filter from the layer. * @param {Object} [options] * @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} `this` * @example * map.setFilter('my-layer', ['==', 'name', 'USA']); * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) */ Map.prototype.setFilter = function setFilter (layerId , filter , options) { if ( options === void 0 ) options = {}; this.style.setFilter(layerId, filter, options); return this._update(true); }; /** * Sets the zoom extent for the specified style layer. * * @param {string} layerId The ID of the layer to which the zoom extent will be applied. * @param {number} minzoom The minimum zoom to set (0-24). * @param {number} maxzoom The maximum zoom to set (0-24). * @returns {Map} `this` * @example * map.setLayerZoomRange('my-layer', 2, 5); */ Map.prototype.setLayerZoomRange = function setLayerZoomRange (layerId , minzoom , maxzoom ) { this.style.setLayerZoomRange(layerId, minzoom, maxzoom); return this._update(true); }; /** * Returns the filter applied to the specified style layer. * * @param {string} layerId The ID of the style layer whose filter to get. * @returns {Array} The layer's filter. */ Map.prototype.getFilter = function getFilter (layerId ) { return this.style.getFilter(layerId); }; /** * Sets the value of a paint property in the specified style layer. * * @param {string} layerId The ID of the layer to set the paint property in. * @param {string} name The name of the paint property to set. * @param {*} value The value of the paint property to set. * Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @param {Object} [options] * @param {boolean} [options.validate=true] Whether to check if `value` 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} `this` * @example * map.setPaintProperty('my-layer', 'fill-color', '#faafee'); * @see [Change a layer's color with buttons](https://www.mapbox.com/mapbox-gl-js/example/color-switcher/) * @see [Adjust a layer's opacity](https://www.mapbox.com/mapbox-gl-js/example/adjust-layer-opacity/) * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ Map.prototype.setPaintProperty = function setPaintProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this.style.setPaintProperty(layerId, name, value, options); return this._update(true); }; /** * Returns the value of a paint property in the specified style layer. * * @param {string} layerId The ID of the layer to get the paint property from. * @param {string} name The name of a paint property to get. * @returns {*} The value of the specified paint property. */ Map.prototype.getPaintProperty = function getPaintProperty (layerId , name ) { return this.style.getPaintProperty(layerId, name); }; /** * Sets the value of a layout property in the specified style layer. * * @param {string} layerId The ID of the layer to set the layout property in. * @param {string} name The name of the layout property to set. * @param {*} value The value of the layout property. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @param {Object} [options] * @param {boolean} [options.validate=true] Whether to check if `value` 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} `this` * @example * map.setLayoutProperty('my-layer', 'visibility', 'none'); */ Map.prototype.setLayoutProperty = function setLayoutProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this.style.setLayoutProperty(layerId, name, value, options); return this._update(true); }; /** * Returns the value of a layout property in the specified style layer. * * @param {string} layerId The ID of the layer to get the layout property from. * @param {string} name The name of the layout property to get. * @returns {*} The value of the specified layout property. */ Map.prototype.getLayoutProperty = function getLayoutProperty (layerId , name ) { return this.style.getLayoutProperty(layerId, name); }; /** * Sets the any combination of light values. * * @param light Light properties to set. Must conform to the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#light). * @param {Object} [options] * @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} `this` */ Map.prototype.setLight = function setLight (light , options) { if ( options === void 0 ) options = {}; this.style.setLight(light, options); return this._update(true); }; /** * Returns the value of the light object. * * @returns {Object} light Light properties of the style. */ Map.prototype.getLight = function getLight () { return this.style.getLight(); }; /** * Sets the state of a feature. The `state` object is merged in with the existing state of the feature. * Features are identified by their `id` attribute, which must be an integer or a string that can be * cast to an integer. * * @param {Object} feature Feature identifier. Feature objects returned from * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} feature.id Unique id of the feature. * @param {string} feature.source The Id of the vector source or GeoJSON source for the feature. * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, the sourceLayer is * required.* * @param {Object} state A set of key-value pairs. The values should be valid JSON types. * * This method requires the `feature.id` attribute on data sets. For GeoJSON sources without * feature ids, set the `generateId` option in the `GeoJSONSourceSpecification` to auto-assign them. This * option assigns ids based on a feature's index in the source data. If you change feature data using * `map.getSource('some id').setData(..)`, you may need to re-apply state taking into account updated `id` values. */ Map.prototype.setFeatureState = function setFeatureState (feature , state ) { this.style.setFeatureState(feature, state); return this._update(); }; /** * Removes feature state, setting it back to the default behavior. If only * source is specified, removes all states of that source. If * target.id is also specified, removes all keys for that feature's state. * If key is also specified, removes that key from that feature's state. * Features are identified by their `id` attribute, which must be an integer or a string that can be * cast to an integer. * @param {Object} target Identifier of where to set state: can be a source, a feature, or a specific key of feature. * Feature objects returned from {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} target.id (optional) Unique id of the feature. Optional if key is not specified. * @param {string} target.source The Id of the vector source or GeoJSON source for the feature. * @param {string} [target.sourceLayer] (optional) *For vector tile sources, the sourceLayer is * required.* * @param {string} key (optional) The key in the feature state to reset. */ Map.prototype.removeFeatureState = function removeFeatureState (target , key ) { this.style.removeFeatureState(target, key); return this._update(); }; /** * Gets the state of a feature. * Features are identified by their `id` attribute, which must be an integer or a string that can be * cast to an integer. * * @param {Object} feature Feature identifier. Feature objects returned from * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} feature.id Unique id of the feature. * @param {string} feature.source The Id of the vector source or GeoJSON source for the feature. * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, the sourceLayer is * required.* * * @returns {Object} The state of the feature. */ Map.prototype.getFeatureState = function getFeatureState (feature ) { return this.style.getFeatureState(feature); }; /** * Returns the map's containing HTML element. * * @returns {HTMLElement} The map's container. */ Map.prototype.getContainer = function getContainer () { return this._container; }; /** * Returns the HTML element containing the map's `` element. * * If you want to add non-GL overlays to the map, you should append them to this element. * * This is the element to which event bindings for map interactivity (such as panning and zooming) are * attached. It will receive bubbled events from child elements such as the ``, but not from * map controls. * * @returns {HTMLElement} The container of the map's ``. * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) */ Map.prototype.getCanvasContainer = function getCanvasContainer () { return this._canvasContainer; }; /** * Returns the map's `` element. * * @returns {HTMLCanvasElement} The map's `` element. * @see [Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/) * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) */ Map.prototype.getCanvas = function getCanvas () { return this._canvas; }; Map.prototype._containerDimensions = function _containerDimensions () { var width = 0; var height = 0; if (this._container) { width = this._container.clientWidth || 400; height = this._container.clientHeight || 300; } return [width, height]; }; Map.prototype._detectMissingCSS = function _detectMissingCSS () { var computedColor = symbol_layout.window.getComputedStyle(this._missingCSSCanary).getPropertyValue('background-color'); if (computedColor !== 'rgb(250, 128, 114)') { symbol_layout.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/.'); } }; Map.prototype._setupContainer = function _setupContainer () { var container = this._container; container.classList.add('mapboxgl-map'); var missingCSSCanary = this._missingCSSCanary = DOM.create('div', 'mapboxgl-canary', container); missingCSSCanary.style.visibility = 'hidden'; this._detectMissingCSS(); var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container); if (this._interactive) { canvasContainer.classList.add('mapboxgl-interactive'); } this._canvas = DOM.create('canvas', 'mapboxgl-canvas', canvasContainer); this._canvas.style.position = 'absolute'; this._canvas.addEventListener('webglcontextlost', this._contextLost, false); this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false); this._canvas.setAttribute('tabindex', '0'); this._canvas.setAttribute('aria-label', 'Map'); var dimensions = this._containerDimensions(); this._resizeCanvas(dimensions[0], dimensions[1]); var controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container); var positions = this._controlPositions = {}; ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (positionName) { positions[positionName] = DOM.create('div', ("mapboxgl-ctrl-" + positionName), controlContainer); }); }; Map.prototype._resizeCanvas = function _resizeCanvas (width , height ) { var pixelRatio = symbol_layout.window.devicePixelRatio || 1; // Request the required canvas size taking the pixelratio into account. this._canvas.width = pixelRatio * width; this._canvas.height = pixelRatio * height; // Maintain the same canvas size, potentially downscaling it for HiDPI displays this._canvas.style.width = width + "px"; this._canvas.style.height = height + "px"; }; Map.prototype._setupPainter = function _setupPainter () { var attributes = symbol_layout.extend({}, mapboxGlSupported.webGLContextAttributes, { failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat, preserveDrawingBuffer: this._preserveDrawingBuffer, antialias: this._antialias || false }); var gl = this._canvas.getContext('webgl', attributes) || this._canvas.getContext('experimental-webgl', attributes); if (!gl) { this.fire(new symbol_layout.ErrorEvent(new Error('Failed to initialize WebGL'))); return; } this.painter = new Painter(gl, this.transform); symbol_layout.webpSupported.testSupport(gl); }; Map.prototype._contextLost = function _contextLost (event ) { event.preventDefault(); if (this._frame) { this._frame.cancel(); this._frame = null; } this.fire(new symbol_layout.Event('webglcontextlost', {originalEvent: event})); }; Map.prototype._contextRestored = function _contextRestored (event ) { this._setupPainter(); this.resize(); this._update(); this.fire(new symbol_layout.Event('webglcontextrestored', {originalEvent: event})); }; /** * Returns a Boolean indicating whether the map is fully loaded. * * Returns `false` if the style is not yet fully loaded, * or if there has been a change to the sources or style that * has not yet fully loaded. * * @returns {boolean} A Boolean indicating whether the map is fully loaded. */ Map.prototype.loaded = function loaded () { return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded(); }; /** * Update this map's style and sources, and re-render the map. * * @param {boolean} updateStyle mark the map's style for reprocessing as * well as its sources * @returns {Map} this * @private */ Map.prototype._update = function _update (updateStyle ) { if (!this.style) { return this; } this._styleDirty = this._styleDirty || updateStyle; this._sourcesDirty = true; this.triggerRepaint(); return this; }; /** * Request that the given callback be executed during the next render * frame. Schedule a render frame if one is not already scheduled. * @returns An id that can be used to cancel the callback * @private */ Map.prototype._requestRenderFrame = function _requestRenderFrame (callback ) { this._update(); return this._renderTaskQueue.add(callback); }; Map.prototype._cancelRenderFrame = function _cancelRenderFrame (id ) { this._renderTaskQueue.remove(id); }; /** * Call when a (re-)render of the map is required: * - The style has changed (`setPaintProperty()`, etc.) * - Source data has changed (e.g. tiles have finished loading) * - The map has is moving (or just finished moving) * - A transition is in progress * * @returns {Map} this * @private */ Map.prototype._render = function _render () { // A custom layer may have used the context asynchronously. Mark the state as dirty. this.painter.context.setDirty(); this.painter.setBaseState(); this._renderTaskQueue.run(); var crossFading = false; // If the style has changed, the map is being zoomed, or a transition or fade is in progress: // - Apply style changes (in a batch) // - Recalculate paint properties. if (this.style && this._styleDirty) { this._styleDirty = false; var zoom = this.transform.zoom; var now = symbol_layout.browser.now(); this.style.zoomHistory.update(zoom, now); var parameters = new symbol_layout.EvaluationParameters(zoom, { now: now, fadeDuration: this._fadeDuration, zoomHistory: this.style.zoomHistory, transition: this.style.getTransition() }); var factor = parameters.crossFadingFactor(); if (factor !== 1 || factor !== this._crossFadingFactor) { crossFading = true; this._crossFadingFactor = factor; } this.style.update(parameters); } // If we are in _render for any reason other than an in-progress paint // transition, update source caches to check for and load any tiles we // need for the current transform if (this.style && this._sourcesDirty) { this._sourcesDirty = false; this.style._updateSources(this.transform); } this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, this._fadeDuration, this._crossSourceCollisions); // Actually draw this.painter.render(this.style, { showTileBoundaries: this.showTileBoundaries, showOverdrawInspector: this._showOverdrawInspector, rotating: this.isRotating(), zooming: this.isZooming(), moving: this.isMoving(), fadeDuration: this._fadeDuration }); this.fire(new symbol_layout.Event('render')); if (this.loaded() && !this._loaded) { this._loaded = true; this.fire(new symbol_layout.Event('load')); } if (this.style && (this.style.hasTransitions() || crossFading)) { this._styleDirty = true; } if (this.style && !this._placementDirty) { // Since no fade operations are in progress, we can release // all tiles held for fading. If we didn't do this, the tiles // would just sit in the SourceCaches until the next render this.style._releaseSymbolFadeTiles(); } // Schedule another render frame if it's needed. // // Even though `_styleDirty` and `_sourcesDirty` are reset in this // method, synchronous events fired during Style#update or // Style#_updateSources could have caused them to be set again. if (this._sourcesDirty || this._repaint || this._styleDirty || this._placementDirty) { this.triggerRepaint(); } else if (!this.isMoving() && this.loaded()) { this.fire(new symbol_layout.Event('idle')); } return this; }; /** * Clean up and release all internal resources associated with this map. * * This includes DOM elements, event bindings, web workers, and WebGL resources. * * Use this method when you are done using the map and wish to ensure that it no * longer consumes browser resources. Afterwards, you must not call any other * methods on the map. */ Map.prototype.remove = function remove () { if (this._hash) { this._hash.remove(); } for (var i = 0, list = this._controls; i < list.length; i += 1) { var control = list[i]; control.onRemove(this); } this._controls = []; if (this._frame) { this._frame.cancel(); this._frame = null; } this._renderTaskQueue.clear(); this.setStyle(null); if (typeof symbol_layout.window !== 'undefined') { symbol_layout.window.removeEventListener('resize', this._onWindowResize, false); symbol_layout.window.removeEventListener('online', this._onWindowOnline, false); } var extension = this.painter.context.gl.getExtension('WEBGL_lose_context'); if (extension) { extension.loseContext(); } removeNode(this._canvasContainer); removeNode(this._controlContainer); removeNode(this._missingCSSCanary); this._container.classList.remove('mapboxgl-map'); this.fire(new symbol_layout.Event('remove')); }; /** * Trigger the rendering of a single frame. Use this method with custom layers to * repaint the map when the layer changes. Calling this multiple times before the * next frame is rendered will still result in only a single frame being rendered. */ Map.prototype.triggerRepaint = function triggerRepaint () { var this$1 = this; if (this.style && !this._frame) { this._frame = symbol_layout.browser.frame(function () { this$1._frame = null; this$1._render(); }); } }; Map.prototype._onWindowOnline = function _onWindowOnline () { this._update(); }; Map.prototype._onWindowResize = function _onWindowResize () { if (this._trackResize) { this.resize()._update(); } }; /** * Gets and sets a Boolean indicating whether the map will render an outline * around each tile and the tile ID. These tile boundaries are useful for * debugging. * * The uncompressed file size of the first vector source is drawn in the top left * corner of each tile, next to the tile ID. * * @name showTileBoundaries * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showTileBoundaries.get = function () { return !!this._showTileBoundaries; }; prototypeAccessors.showTileBoundaries.set = function (value ) { if (this._showTileBoundaries === value) { return; } this._showTileBoundaries = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will render boxes * around all symbols in the data source, revealing which symbols * were rendered or which were hidden due to collisions. * This information is useful for debugging. * * @name showCollisionBoxes * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showCollisionBoxes.get = function () { return !!this._showCollisionBoxes; }; prototypeAccessors.showCollisionBoxes.set = function (value ) { if (this._showCollisionBoxes === value) { return; } this._showCollisionBoxes = value; if (value) { // When we turn collision boxes on we have to generate them for existing tiles // When we turn them off, there's no cost to leaving existing boxes in place this.style._generateCollisionBoxes(); } else { // Otherwise, call an update to remove collision boxes this._update(); } }; /* * Gets and sets a Boolean indicating whether the map should color-code * each fragment to show how many times it has been shaded. * White fragments have been shaded 8 or more times. * Black fragments have been shaded 0 times. * This information is useful for debugging. * * @name showOverdraw * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showOverdrawInspector.get = function () { return !!this._showOverdrawInspector; }; prototypeAccessors.showOverdrawInspector.set = function (value ) { if (this._showOverdrawInspector === value) { return; } this._showOverdrawInspector = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will * continuously repaint. This information is useful for analyzing performance. * * @name repaint * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.repaint.get = function () { return !!this._repaint; }; prototypeAccessors.repaint.set = function (value ) { if (this._repaint !== value) { this._repaint = value; this.triggerRepaint(); } }; // show vertices prototypeAccessors.vertices.get = function () { return !!this._vertices; }; prototypeAccessors.vertices.set = function (value ) { this._vertices = value; this._update(); }; // for cache browser tests Map.prototype._setCacheLimits = function _setCacheLimits (limit , checkThreshold ) { symbol_layout.setCacheLimits(limit, checkThreshold); }; /** * The version of Mapbox GL JS in use as specified in package.json, CHANGELOG.md, and the GitHub release. * * @name version * @instance * @memberof Map * @var {string} version */ prototypeAccessors.version.get = function () { return symbol_layout.version; }; Object.defineProperties( Map.prototype, prototypeAccessors ); return Map; }(Camera)); function removeNode(node) { if (node.parentNode) { node.parentNode.removeChild(node); } } /** * Interface for interactive controls added to the map. This is an * specification for implementers to model: it is not * an exported method or class. * * Controls must implement `onAdd` and `onRemove`, and must own an * element, which is often a `div` element. To use Mapbox GL JS's * default control styling, add the `mapboxgl-ctrl` class to your control's * node. * * @interface IControl * @example * // Control implemented as ES6 class * class HelloWorldControl { * onAdd(map) { * this._map = map; * this._container = document.createElement('div'); * this._container.className = 'mapboxgl-ctrl'; * this._container.textContent = 'Hello, world'; * return this._container; * } * * onRemove() { * this._container.parentNode.removeChild(this._container); * this._map = undefined; * } * } * * // Control implemented as ES5 prototypical class * function HelloWorldControl() { } * * HelloWorldControl.prototype.onAdd = function(map) { * this._map = map; * this._container = document.createElement('div'); * this._container.className = 'mapboxgl-ctrl'; * this._container.textContent = 'Hello, world'; * return this._container; * }; * * HelloWorldControl.prototype.onRemove = function () { * this._container.parentNode.removeChild(this._container); * this._map = undefined; * }; */ /** * Register a control on the map and give it a chance to register event listeners * and resources. This method is called by {@link Map#addControl} * internally. * * @function * @memberof IControl * @instance * @name onAdd * @param {Map} map the Map this control will be added to * @returns {HTMLElement} The control's container element. This should * be created by the control and returned by onAdd without being attached * to the DOM: the map will insert the control's element into the DOM * as necessary. */ /** * Unregister a control on the map and give it a chance to detach event listeners * and resources. This method is called by {@link Map#removeControl} * internally. * * @function * @memberof IControl * @instance * @name onRemove * @param {Map} map the Map this control will be removed from * @returns {undefined} there is no required return value for this method */ /** * Optionally provide a default position for this control. If this method * is implemented and {@link Map#addControl} is called without the `position` * parameter, the value returned by getDefaultPosition will be used as the * control's position. * * @function * @memberof IControl * @instance * @name getDefaultPosition * @returns {string} a control position, one of the values valid in addControl. */ /** * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has * `x` and `y` properties representing screen coordinates in pixels. * * @typedef {Object} Point */ /** * A {@link Point} or an array of two numbers representing `x` and `y` screen coordinates in pixels. * * @typedef {(Point | Array)} PointLike */ // var defaultOptions$1 = { showCompass: true, showZoom: true, visualizePitch: false }; /** * A `NavigationControl` control contains zoom buttons and a compass. * * @implements {IControl} * @param {Object} [options] * @param {Boolean} [options.showCompass=true] If `true` the compass button is included. * @param {Boolean} [options.showZoom=true] If `true` the zoom-in and zoom-out buttons are included. * @param {Boolean} [options.visualizePitch=false] If `true` the pitch is visualized by rotating X-axis of compass. * @example * var nav = new mapboxgl.NavigationControl(); * map.addControl(nav, 'top-left'); * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) * @see [Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/) */ var NavigationControl = function NavigationControl(options ) { var this$1 = this; this.options = symbol_layout.extend({}, defaultOptions$1, options); this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-group'); this._container.addEventListener('contextmenu', function (e) { return e.preventDefault(); }); if (this.options.showZoom) { symbol_layout.bindAll([ '_updateZoomButtons' ], this); this._zoomInButton = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-in', 'Zoom in', function () { return this$1._map.zoomIn(); }); this._zoomOutButton = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-out', 'Zoom out', function () { return this$1._map.zoomOut(); }); } if (this.options.showCompass) { symbol_layout.bindAll([ '_rotateCompassArrow' ], this); this._compass = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-compass', 'Reset bearing to north', function () { if (this$1.options.visualizePitch) { this$1._map.resetNorthPitch(); } else { this$1._map.resetNorth(); } }); this._compassArrow = DOM.create('span', 'mapboxgl-ctrl-compass-arrow', this._compass); } }; NavigationControl.prototype._updateZoomButtons = function _updateZoomButtons () { var zoom = this._map.getZoom(); if (zoom === this._map.getMaxZoom()) { this._zoomInButton.classList.add('mapboxgl-ctrl-icon-disabled'); } else { this._zoomInButton.classList.remove('mapboxgl-ctrl-icon-disabled'); } if (zoom === this._map.getMinZoom()) { this._zoomOutButton.classList.add('mapboxgl-ctrl-icon-disabled'); } else { this._zoomOutButton.classList.remove('mapboxgl-ctrl-icon-disabled'); } }; NavigationControl.prototype._rotateCompassArrow = function _rotateCompassArrow () { var 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)"); this._compassArrow.style.transform = rotate; }; NavigationControl.prototype.onAdd = function onAdd (map ) { this._map = map; if (this.options.showZoom) { this._map.on('zoom', this._updateZoomButtons); this._updateZoomButtons(); } if (this.options.showCompass) { if (this.options.visualizePitch) { this._map.on('pitch', this._rotateCompassArrow); } this._map.on('rotate', this._rotateCompassArrow); this._rotateCompassArrow(); this._handler = new DragRotateHandler(map, {button: 'left', element: this._compass}); DOM.addEventListener(this._compass, 'mousedown', this._handler.onMouseDown); DOM.addEventListener(this._compass, 'touchstart', this._handler.onMouseDown, { passive: false }); this._handler.enable(); } return this._container; }; NavigationControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); if (this.options.showZoom) { this._map.off('zoom', this._updateZoomButtons); } if (this.options.showCompass) { if (this.options.visualizePitch) { this._map.off('pitch', this._rotateCompassArrow); } this._map.off('rotate', this._rotateCompassArrow); DOM.removeEventListener(this._compass, 'mousedown', this._handler.onMouseDown); DOM.removeEventListener(this._compass, 'touchstart', this._handler.onMouseDown, { passive: false }); this._handler.disable(); delete this._handler; } delete this._map; }; NavigationControl.prototype._createButton = function _createButton (className , ariaLabel , fn ) { var a = DOM.create('button', className, this._container); a.type = 'button'; a.title = ariaLabel; a.setAttribute('aria-label', ariaLabel); a.addEventListener('click', fn); return a; }; // /** * Given a LngLat, prior projected position, and a transform, return a new LngLat shifted * n × 360° east or west for some n ≥ 0 such that: * * * the projected location of the result is on screen, if possible, and secondarily: * * the difference between the projected location of the result and the prior position * is minimized. * * The object is to preserve perceived object constancy for Popups and Markers as much as * possible; they should avoid shifting large distances across the screen, even when the * map center changes by ±360° due to automatic wrapping, and when about to go off screen, * should wrap just enough to avoid doing so. * * @private */ function smartWrap(lngLat , priorPos , transform ) { lngLat = new symbol_layout.LngLat(lngLat.lng, lngLat.lat); // First, try shifting one world in either direction, and see if either is closer to the // prior position. This preserves object constancy when the map center is auto-wrapped // during animations. if (priorPos) { var left = new symbol_layout.LngLat(lngLat.lng - 360, lngLat.lat); var right = new symbol_layout.LngLat(lngLat.lng + 360, lngLat.lat); var delta = transform.locationPoint(lngLat).distSqr(priorPos); if (transform.locationPoint(left).distSqr(priorPos) < delta) { lngLat = left; } else if (transform.locationPoint(right).distSqr(priorPos) < delta) { lngLat = right; } } // Second, wrap toward the center until the new position is on screen, or we can't get // any closer. while (Math.abs(lngLat.lng - transform.center.lng) > 180) { var pos = transform.locationPoint(lngLat); if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) { break; } if (lngLat.lng > transform.center.lng) { lngLat.lng -= 360; } else { lngLat.lng += 360; } } return lngLat; } // var anchorTranslate = { 'center': 'translate(-50%,-50%)', 'top': 'translate(-50%,0)', 'top-left': 'translate(0,0)', 'top-right': 'translate(-100%,0)', 'bottom': 'translate(-50%,-100%)', 'bottom-left': 'translate(0,-100%)', 'bottom-right': 'translate(-100%,-100%)', 'left': 'translate(0,-50%)', 'right': 'translate(-100%,-50%)' }; function applyAnchorClass(element , anchor , prefix ) { var classList = element.classList; for (var key in anchorTranslate) { classList.remove(("mapboxgl-" + prefix + "-anchor-" + key)); } classList.add(("mapboxgl-" + prefix + "-anchor-" + anchor)); } // /** * Creates a marker component * @param {Object} [options] * @param {HTMLElement} [options.element] DOM element to use as a marker. The default is a light blue, droplet-shaped SVG marker. * @param {string} [options.anchor='center'] A string indicating the part of the Marker that should be positioned closest to the coordinate set via {@link Marker#setLngLat}. * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. * @param {PointLike} [options.offset] The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up. * @param {string} [options.color='#3FB1CE'] The color to use for the default marker if options.element is not provided. The default is light blue. * @param {boolean} [options.draggable=false] A boolean indicating whether or not a marker is able to be dragged to a new position on the map. * @example * var marker = new mapboxgl.Marker() * .setLngLat([30.5, 50.5]) * .addTo(map); * @see [Add custom icons with Markers](https://www.mapbox.com/mapbox-gl-js/example/custom-marker-icons/) * @see [Create a draggable Marker](https://www.mapbox.com/mapbox-gl-js/example/drag-a-marker/) */ var Marker = /*@__PURE__*/(function (Evented) { function Marker(options , legacyOptions ) { Evented.call(this); // For backward compatibility -- the constructor used to accept the element as a // required first argument, before it was made optional. if (options instanceof symbol_layout.window.HTMLElement || legacyOptions) { options = symbol_layout.extend({element: options}, legacyOptions); } symbol_layout.bindAll([ '_update', '_onMove', '_onUp', '_addDragHandler', '_onMapClick' ], this); this._anchor = options && options.anchor || 'center'; this._color = options && options.color || '#3FB1CE'; this._draggable = options && options.draggable || false; this._state = 'inactive'; if (!options || !options.element) { this._defaultMarker = true; this._element = DOM.create('div'); // create default map marker SVG var svg = DOM.createNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttributeNS(null, 'display', 'block'); svg.setAttributeNS(null, 'height', '41px'); svg.setAttributeNS(null, 'width', '27px'); svg.setAttributeNS(null, 'viewBox', '0 0 27 41'); var markerLarge = DOM.createNS('http://www.w3.org/2000/svg', 'g'); markerLarge.setAttributeNS(null, 'stroke', 'none'); markerLarge.setAttributeNS(null, 'stroke-width', '1'); markerLarge.setAttributeNS(null, 'fill', 'none'); markerLarge.setAttributeNS(null, 'fill-rule', 'evenodd'); var page1 = DOM.createNS('http://www.w3.org/2000/svg', 'g'); page1.setAttributeNS(null, 'fill-rule', 'nonzero'); var shadow = DOM.createNS('http://www.w3.org/2000/svg', 'g'); shadow.setAttributeNS(null, 'transform', 'translate(3.0, 29.0)'); shadow.setAttributeNS(null, 'fill', '#000000'); var ellipses = [ {'rx': '10.5', 'ry': '5.25002273'}, {'rx': '10.5', 'ry': '5.25002273'}, {'rx': '9.5', 'ry': '4.77275007'}, {'rx': '8.5', 'ry': '4.29549936'}, {'rx': '7.5', 'ry': '3.81822308'}, {'rx': '6.5', 'ry': '3.34094679'}, {'rx': '5.5', 'ry': '2.86367051'}, {'rx': '4.5', 'ry': '2.38636864'} ]; for (var i = 0, list = ellipses; i < list.length; i += 1) { var data = list[i]; var ellipse = DOM.createNS('http://www.w3.org/2000/svg', 'ellipse'); ellipse.setAttributeNS(null, 'opacity', '0.04'); ellipse.setAttributeNS(null, 'cx', '10.5'); ellipse.setAttributeNS(null, 'cy', '5.80029008'); ellipse.setAttributeNS(null, 'rx', data['rx']); ellipse.setAttributeNS(null, 'ry', data['ry']); shadow.appendChild(ellipse); } var background = DOM.createNS('http://www.w3.org/2000/svg', 'g'); background.setAttributeNS(null, 'fill', this._color); var bgPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); bgPath.setAttributeNS(null, 'd', 'M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z'); background.appendChild(bgPath); var border = DOM.createNS('http://www.w3.org/2000/svg', 'g'); border.setAttributeNS(null, 'opacity', '0.25'); border.setAttributeNS(null, 'fill', '#000000'); var borderPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); borderPath.setAttributeNS(null, 'd', 'M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z'); border.appendChild(borderPath); var maki = DOM.createNS('http://www.w3.org/2000/svg', 'g'); maki.setAttributeNS(null, 'transform', 'translate(6.0, 7.0)'); maki.setAttributeNS(null, 'fill', '#FFFFFF'); var circleContainer = DOM.createNS('http://www.w3.org/2000/svg', 'g'); circleContainer.setAttributeNS(null, 'transform', 'translate(8.0, 8.0)'); var circle1 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); circle1.setAttributeNS(null, 'fill', '#000000'); circle1.setAttributeNS(null, 'opacity', '0.25'); circle1.setAttributeNS(null, 'cx', '5.5'); circle1.setAttributeNS(null, 'cy', '5.5'); circle1.setAttributeNS(null, 'r', '5.4999962'); var circle2 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); circle2.setAttributeNS(null, 'fill', '#FFFFFF'); circle2.setAttributeNS(null, 'cx', '5.5'); circle2.setAttributeNS(null, 'cy', '5.5'); circle2.setAttributeNS(null, 'r', '5.4999962'); circleContainer.appendChild(circle1); circleContainer.appendChild(circle2); page1.appendChild(shadow); page1.appendChild(background); page1.appendChild(border); page1.appendChild(maki); page1.appendChild(circleContainer); svg.appendChild(page1); this._element.appendChild(svg); // if no element and no offset option given apply an offset for the default marker // the -14 as the y value of the default marker offset was determined as follows // // the marker tip is at the center of the shadow ellipse from the default svg // the y value of the center of the shadow ellipse relative to the svg top left is "shadow transform translate-y (29.0) + ellipse cy (5.80029008)" // offset to the svg center "height (41 / 2)" gives (29.0 + 5.80029008) - (41 / 2) and rounded for an integer pixel offset gives 14 // negative is used to move the marker up from the center so the tip is at the Marker lngLat this._offset = symbol_layout.Point.convert(options && options.offset || [0, -14]); } else { this._element = options.element; this._offset = symbol_layout.Point.convert(options && options.offset || [0, 0]); } this._element.classList.add('mapboxgl-marker'); this._element.addEventListener('dragstart', function (e ) { e.preventDefault(); }); applyAnchorClass(this._element, this._anchor, 'marker'); this._popup = null; } if ( Evented ) Marker.__proto__ = Evented; Marker.prototype = Object.create( Evented && Evented.prototype ); Marker.prototype.constructor = Marker; /** * Attaches the marker to a map * @param {Map} map * @returns {Marker} `this` */ Marker.prototype.addTo = function addTo (map ) { this.remove(); this._map = map; map.getCanvasContainer().appendChild(this._element); map.on('move', this._update); map.on('moveend', this._update); this.setDraggable(this._draggable); this._update(); // If we attached the `click` listener to the marker element, the popup // would close once the event propogated to `map` due to the // `Popup#_onClickClose` listener. this._map.on('click', this._onMapClick); return this; }; /** * Removes the marker from a map * @example * var marker = new mapboxgl.Marker().addTo(map); * marker.remove(); * @returns {Marker} `this` */ Marker.prototype.remove = function remove () { if (this._map) { this._map.off('click', this._onMapClick); this._map.off('move', this._update); this._map.off('moveend', this._update); 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); delete this._map; } DOM.remove(this._element); if (this._popup) { this._popup.remove(); } return this; }; /** * Get the marker's geographical location. * * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously * set by `setLngLat` because `Marker` wraps the anchor longitude across copies of the world to keep * the marker on screen. * * @returns {LngLat} */ Marker.prototype.getLngLat = function getLngLat () { return this._lngLat; }; /** * Set the marker's geographical position and move it. * @returns {Marker} `this` */ Marker.prototype.setLngLat = function setLngLat (lnglat ) { this._lngLat = symbol_layout.LngLat.convert(lnglat); this._pos = null; if (this._popup) { this._popup.setLngLat(this._lngLat); } this._update(); return this; }; /** * Returns the `Marker`'s HTML element. * @returns {HTMLElement} element */ Marker.prototype.getElement = function getElement () { return this._element; }; /** * Binds a Popup to the Marker * @param popup an instance of the `Popup` class. If undefined or null, any popup * set on this `Marker` instance is unset * @returns {Marker} `this` */ Marker.prototype.setPopup = function setPopup (popup ) { if (this._popup) { this._popup.remove(); this._popup = null; } if (popup) { if (!('offset' in popup.options)) { var markerHeight = 41 - (5.8 / 2); var markerRadius = 13.5; var linearOffset = Math.sqrt(Math.pow(markerRadius, 2) / 2); popup.options.offset = this._defaultMarker ? { 'top': [0, 0], 'top-left': [0, 0], 'top-right': [0, 0], 'bottom': [0, -markerHeight], 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1], 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1], 'left': [markerRadius, (markerHeight - markerRadius) * -1], 'right': [-markerRadius, (markerHeight - markerRadius) * -1] } : this._offset; } this._popup = popup; if (this._lngLat) { this._popup.setLngLat(this._lngLat); } } return this; }; Marker.prototype._onMapClick = function _onMapClick (e ) { var targetElement = e.originalEvent.target; var element = this._element; if (this._popup && (targetElement === element || element.contains((targetElement )))) { this.togglePopup(); } }; /** * Returns the Popup instance that is bound to the Marker * @returns {Popup} popup */ Marker.prototype.getPopup = function getPopup () { return this._popup; }; /** * Opens or closes the bound popup, depending on the current state * @returns {Marker} `this` */ Marker.prototype.togglePopup = function togglePopup () { var popup = this._popup; if (!popup) { return this; } else if (popup.isOpen()) { popup.remove(); } else { popup.addTo(this._map); } return this; }; Marker.prototype._update = function _update (e ) { if (!this._map) { return; } if (this._map.transform.renderWorldCopies) { this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); } this._pos = this._map.project(this._lngLat)._add(this._offset); // because rounding the coordinates at every `move` event causes stuttered zooming // we only round them when _update is called with `moveend` or when its called with // no arguments (when the Marker is initialized or Marker#setLngLat is invoked). if (!e || e.type === "moveend") { this._pos = this._pos.round(); } DOM.setTransform(this._element, ((anchorTranslate[this._anchor]) + " translate(" + (this._pos.x) + "px, " + (this._pos.y) + "px)")); }; /** * Get the marker's offset. * @returns {Point} */ Marker.prototype.getOffset = function getOffset () { return this._offset; }; /** * Sets the offset of the marker * @param {PointLike} offset The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up. * @returns {Marker} `this` */ Marker.prototype.setOffset = function setOffset (offset ) { this._offset = symbol_layout.Point.convert(offset); this._update(); return this; }; Marker.prototype._onMove = function _onMove (e ) { this._pos = e.point.sub(this._positionDelta); this._lngLat = this._map.unproject(this._pos); this.setLngLat(this._lngLat); // suppress click event so that popups don't toggle on drag this._element.style.pointerEvents = 'none'; // make sure dragstart only fires on the first move event after mousedown. // this can't be on mousedown because that event doesn't necessarily // imply that a drag is about to happen. if (this._state === 'pending') { this._state = 'active'; /** * Fired when dragging starts * * @event dragstart * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that is being dragged */ this.fire(new symbol_layout.Event('dragstart')); } /** * Fired while dragging * * @event drag * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that is being dragged */ this.fire(new symbol_layout.Event('drag')); }; Marker.prototype._onUp = function _onUp () { // revert to normal pointer event handling this._element.style.pointerEvents = 'auto'; this._positionDelta = null; this._map.off('mousemove', this._onMove); this._map.off('touchmove', this._onMove); // only fire dragend if it was preceded by at least one drag event if (this._state === 'active') { /** * Fired when the marker is finished being dragged * * @event dragend * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that was dragged */ this.fire(new symbol_layout.Event('dragend')); } this._state = 'inactive'; }; Marker.prototype._addDragHandler = function _addDragHandler (e ) { if (this._element.contains((e.originalEvent.target ))) { e.preventDefault(); // We need to calculate the pixel distance between the click point // and the marker position, with the offset accounted for. Then we // can subtract this distance from the mousemove event's position // 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._offset); 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); } }; /** * Sets the `draggable` property and functionality of the marker * @param {boolean} [shouldBeDraggable=false] Turns drag functionality on/off * @returns {Marker} `this` */ Marker.prototype.setDraggable = function setDraggable (shouldBeDraggable ) { this._draggable = !!shouldBeDraggable; // convert possible undefined value to false // handle case where map may not exist yet // e.g. when setDraggable is called before addTo if (this._map) { if (shouldBeDraggable) { this._map.on('mousedown', this._addDragHandler); this._map.on('touchstart', this._addDragHandler); } else { this._map.off('mousedown', this._addDragHandler); this._map.off('touchstart', this._addDragHandler); } } return this; }; /** * Returns true if the marker can be dragged * @returns {boolean} */ Marker.prototype.isDraggable = function isDraggable () { return this._draggable; }; return Marker; }(symbol_layout.Evented)); // var defaultOptions$2 = { positionOptions: { enableHighAccuracy: false, maximumAge: 0, timeout: 6000 /* 6 sec */ }, fitBoundsOptions: { maxZoom: 15 }, trackUserLocation: false, showUserLocation: true }; var className = 'mapboxgl-ctrl'; var supportsGeolocation; function checkGeolocationSupport(callback) { if (supportsGeolocation !== undefined) { callback(supportsGeolocation); } else if (symbol_layout.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 symbol_layout.window.navigator.permissions.query({ name: 'geolocation' }).then(function (p) { supportsGeolocation = p.state !== 'denied'; callback(supportsGeolocation); }); } else { supportsGeolocation = !!symbol_layout.window.navigator.geolocation; callback(supportsGeolocation); } } /** * A `GeolocateControl` control provides a button that uses the browser's geolocation * API to locate the user on the map. * * Not all browsers support geolocation, * and some users may disable the feature. Geolocation support for modern * browsers including Chrome requires sites to be served over HTTPS. If * geolocation support is not available, the GeolocateControl will not * be visible. * * The zoom level applied will depend on the accuracy of the geolocation provided by the device. * * The GeolocateControl has two modes. If `trackUserLocation` is `false` (default) the control acts as a button, which when pressed will set the map's camera to target the user location. If the user moves, the map won't update. This is most suited for the desktop. If `trackUserLocation` is `true` the control acts as a toggle button that when active the user's location is actively monitored for changes. In this mode the GeolocateControl has three states: * * active - the map's camera automatically updates as the user's location changes, keeping the location dot in the center. * * passive - the user's location dot automatically updates, but the map's camera does not. * * disabled * * @implements {IControl} * @param {Object} [options] * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A Geolocation API [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object. * @param {Object} [options.fitBoundsOptions={maxZoom: 15}] A [`fitBounds`](#map#fitbounds) options object to use when the map is panned and zoomed to the user's location. The default is to use a `maxZoom` of 15 to limit how far the map will zoom in for very accurate locations. * @param {Object} [options.trackUserLocation=false] If `true` the Geolocate Control becomes a toggle button and when active the map will receive updates to the user's location as it changes. * @param {Object} [options.showUserLocation=true] By default a dot will be shown on the map at the user's location. Set to `false` to disable. * * @example * map.addControl(new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * })); * @see [Locate the user](https://www.mapbox.com/mapbox-gl-js/example/locate-user/) */ var GeolocateControl = /*@__PURE__*/(function (Evented) { function GeolocateControl(options ) { Evented.call(this); this.options = symbol_layout.extend({}, defaultOptions$2, options); symbol_layout.bindAll([ '_onSuccess', '_onError', '_finish', '_setupUI', '_updateCamera', '_updateMarker' ], this); } if ( Evented ) GeolocateControl.__proto__ = Evented; GeolocateControl.prototype = Object.create( Evented && Evented.prototype ); GeolocateControl.prototype.constructor = GeolocateControl; GeolocateControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', (className + " " + className + "-group")); checkGeolocationSupport(this._setupUI); return this._container; }; GeolocateControl.prototype.onRemove = function onRemove () { // clear the geolocation watch if exists if (this._geolocationWatchID !== undefined) { symbol_layout.window.navigator.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); } // clear the marker from the map if (this.options.showUserLocation && this._userLocationDotMarker) { this._userLocationDotMarker.remove(); } DOM.remove(this._container); this._map = (undefined ); }; GeolocateControl.prototype._onSuccess = function _onSuccess (position ) { if (this.options.trackUserLocation) { // keep a record of the position so that if the state is BACKGROUND and the user // clicks the button, we can move to ACTIVE_LOCK immediately without waiting for // watchPosition to trigger _onSuccess this._lastKnownPosition = position; switch (this._watchState) { case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': this._watchState = 'ACTIVE_LOCK'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'BACKGROUND': case 'BACKGROUND_ERROR': this._watchState = 'BACKGROUND'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; default: symbol_layout.assert(false, ("Unexpected watchState " + (this._watchState))); } } // if showUserLocation and the watch state isn't off then update the marker location if (this.options.showUserLocation && this._watchState !== 'OFF') { this._updateMarker(position); } // if in normal mode (not watch mode), or if in watch mode and the state is active watch // then update the camera if (!this.options.trackUserLocation || this._watchState === 'ACTIVE_LOCK') { this._updateCamera(position); } if (this.options.showUserLocation) { this._dotElement.classList.remove('mapboxgl-user-location-dot-stale'); } this.fire(new symbol_layout.Event('geolocate', position)); this._finish(); }; GeolocateControl.prototype._updateCamera = function _updateCamera (position ) { var center = new symbol_layout.LngLat(position.coords.longitude, position.coords.latitude); var radius = position.coords.accuracy; var bearing = this._map.getBearing(); var options = symbol_layout.extend({bearing: 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 }); }; GeolocateControl.prototype._updateMarker = function _updateMarker (position ) { if (position) { this._userLocationDotMarker.setLngLat([position.coords.longitude, position.coords.latitude]).addTo(this._map); } else { this._userLocationDotMarker.remove(); } }; GeolocateControl.prototype._onError = function _onError (error ) { if (this.options.trackUserLocation) { if (error.code === 1) { // PERMISSION_DENIED this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); if (this._geolocationWatchID !== undefined) { this._clearWatch(); } } else { switch (this._watchState) { case 'WAITING_ACTIVE': this._watchState = 'ACTIVE_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); break; case 'ACTIVE_LOCK': this._watchState = 'ACTIVE_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); // turn marker grey break; case 'BACKGROUND': this._watchState = 'BACKGROUND_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); // turn marker grey break; case 'ACTIVE_ERROR': break; default: symbol_layout.assert(false, ("Unexpected watchState " + (this._watchState))); } } } if (this._watchState !== 'OFF' && this.options.showUserLocation) { this._dotElement.classList.add('mapboxgl-user-location-dot-stale'); } this.fire(new symbol_layout.Event('error', error)); this._finish(); }; GeolocateControl.prototype._finish = function _finish () { if (this._timeoutId) { clearTimeout(this._timeoutId); } this._timeoutId = undefined; }; GeolocateControl.prototype._setupUI = function _setupUI (supported ) { var this$1 = this; if (supported === false) { symbol_layout.warnOnce('Geolocation support is not available, the GeolocateControl will not be visible.'); return; } this._container.addEventListener('contextmenu', function (e ) { return e.preventDefault(); }); this._geolocateButton = DOM.create('button', (className + "-icon " + className + "-geolocate"), this._container); this._geolocateButton.type = 'button'; this._geolocateButton.setAttribute('aria-label', 'Geolocate'); if (this.options.trackUserLocation) { this._geolocateButton.setAttribute('aria-pressed', 'false'); this._watchState = 'OFF'; } // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map if (this.options.showUserLocation) { this._dotElement = DOM.create('div', 'mapboxgl-user-location-dot'); this._userLocationDotMarker = new Marker(this._dotElement); if (this.options.trackUserLocation) { this._watchState = 'OFF'; } } this._geolocateButton.addEventListener('click', this.trigger.bind(this)); this._setup = true; // when the camera is changed (and it's not as a result of the Geolocation Control) change // the watch mode to background watch, so that the marker is updated but not the camera. if (this.options.trackUserLocation) { this._map.on('movestart', function (event) { if (!event.geolocateSource && this$1._watchState === 'ACTIVE_LOCK') { this$1._watchState = 'BACKGROUND'; this$1._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); this$1._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this$1.fire(new symbol_layout.Event('trackuserlocationend')); } }); } }; /** * Trigger a geolocation * * @returns {boolean} Returns `false` if called before control was added to a map, otherwise returns `true`. */ GeolocateControl.prototype.trigger = function trigger () { if (!this._setup) { symbol_layout.warnOnce('Geolocate control triggered before added to a map'); return false; } if (this.options.trackUserLocation) { // update watchState and do any outgoing state cleanup switch (this._watchState) { case 'OFF': // turn on the Geolocate Control this._watchState = 'WAITING_ACTIVE'; this.fire(new symbol_layout.Event('trackuserlocationstart')); break; case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': case 'BACKGROUND_ERROR': // turn off the Geolocate Control this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this.fire(new symbol_layout.Event('trackuserlocationend')); break; case 'BACKGROUND': this._watchState = 'ACTIVE_LOCK'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); // set camera to last known location if (this._lastKnownPosition) { this._updateCamera(this._lastKnownPosition); } this.fire(new symbol_layout.Event('trackuserlocationstart')); break; default: symbol_layout.assert(false, ("Unexpected watchState " + (this._watchState))); } // incoming state setup switch (this._watchState) { case 'WAITING_ACTIVE': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'ACTIVE_LOCK': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'ACTIVE_ERROR': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); break; case 'BACKGROUND': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; case 'BACKGROUND_ERROR': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); break; case 'OFF': break; default: symbol_layout.assert(false, ("Unexpected watchState " + (this._watchState))); } // manage geolocation.watchPosition / geolocation.clearWatch if (this._watchState === 'OFF' && this._geolocationWatchID !== undefined) { // clear watchPosition as we've changed to an OFF state this._clearWatch(); } else if (this._geolocationWatchID === undefined) { // enable watchPosition since watchState is not OFF and there is no watchPosition already running this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'true'); this._geolocationWatchID = symbol_layout.window.navigator.geolocation.watchPosition( this._onSuccess, this._onError, this.options.positionOptions); } } else { symbol_layout.window.navigator.geolocation.getCurrentPosition( this._onSuccess, this._onError, this.options.positionOptions); // This timeout ensures that we still call finish() even if // the user declines to share their location in Firefox this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */); } return true; }; GeolocateControl.prototype._clearWatch = function _clearWatch () { symbol_layout.window.navigator.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'false'); if (this.options.showUserLocation) { this._updateMarker(null); } }; return GeolocateControl; }(symbol_layout.Evented)); /* Geolocate Control Watch States * This is the private state of the control. * * OFF * off/inactive * WAITING_ACTIVE * Geolocate Control was clicked but still waiting for Geolocation API response with user location * ACTIVE_LOCK * Showing the user location as a dot AND tracking the camera to be fixed to their location. If their location changes the map moves to follow. * ACTIVE_ERROR * There was en error from the Geolocation API while trying to show and track the user location. * BACKGROUND * Showing the user location as a dot but the camera doesn't follow their location as it changes. * BACKGROUND_ERROR * There was an error from the Geolocation API while trying to show (but not track) the user location. */ /** * Fired on each Geolocation API position update which returned as success. * * @event geolocate * @memberof GeolocateControl * @instance * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * */ /** * Fired on each Geolocation API position update which returned as an error. * * @event error * @memberof GeolocateControl * @instance * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * */ /** * Fired when the Geolocate Control changes to the active lock state, which happens either upon first obtaining a successful Geolocation API position for the user (a geolocate event will follow), or the user clicks the geolocate button when in the background state which uses the last known position to recenter the map and enter active lock state (no geolocate event will follow unless the users's location changes). * * @event trackuserlocationstart * @memberof GeolocateControl * @instance * */ /** * Fired when the Geolocate Control changes to the background state, which happens when a user changes the camera during an active position lock. This only applies when trackUserLocation is true. In the background state, the dot on the map will update with location updates but the camera will not. * * @event trackuserlocationend * @memberof GeolocateControl * @instance * */ // var defaultOptions$3 = { maxWidth: 100, unit: 'metric' }; /** * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground. * * @implements {IControl} * @param {Object} [options] * @param {number} [options.maxWidth='100'] The maximum length of the scale control in pixels. * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`). * @example * var scale = new mapboxgl.ScaleControl({ * maxWidth: 80, * unit: 'imperial' * }); * map.addControl(scale); * * scale.setUnit('metric'); */ var ScaleControl = function ScaleControl(options ) { this.options = symbol_layout.extend({}, defaultOptions$3, options); symbol_layout.bindAll([ '_onMove', 'setUnit' ], this); }; ScaleControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-left'; }; ScaleControl.prototype._onMove = function _onMove () { updateScale(this._map, this._container, this.options); }; ScaleControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer()); this._map.on('move', this._onMove); this._onMove(); return this._container; }; ScaleControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('move', this._onMove); this._map = (undefined ); }; /** * Set the scale's unit of the distance * * @param unit Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`). */ ScaleControl.prototype.setUnit = function setUnit (unit ) { this.options.unit = unit; updateScale(this._map, this._container, this.options); }; function updateScale(map, container, options) { // A horizontal scale is imagined to be present at center of the map // container with maximum length (Default) as 100px. // Using spherical law of cosines approximation, the real distance is // found between the two coordinates. var maxWidth = options && options.maxWidth || 100; var y = map._container.clientHeight / 2; var maxMeters = getDistance(map.unproject([0, y]), map.unproject([maxWidth, y])); // The real distance corresponding to 100px scale length is rounded off to // near pretty number and the scale length for the same is found out. // Default unit of the scale is based on User's locale. if (options && options.unit === 'imperial') { var maxFeet = 3.2808 * maxMeters; if (maxFeet > 5280) { var maxMiles = maxFeet / 5280; setScale(container, maxWidth, maxMiles, 'mi'); } else { setScale(container, maxWidth, maxFeet, 'ft'); } } else if (options && options.unit === 'nautical') { var maxNauticals = maxMeters / 1852; setScale(container, maxWidth, maxNauticals, 'nm'); } else { setScale(container, maxWidth, maxMeters, 'm'); } } function setScale(container, maxWidth, maxDistance, unit) { var distance = getRoundNum(maxDistance); var ratio = distance / maxDistance; if (unit === 'm' && distance >= 1000) { distance = distance / 1000; unit = 'km'; } container.style.width = (maxWidth * ratio) + "px"; container.innerHTML = distance + unit; } function getDistance(latlng1, latlng2) { // Uses spherical law of cosines approximation. var R = 6371000; var rad = Math.PI / 180, lat1 = latlng1.lat * rad, lat2 = latlng2.lat * rad, a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad); var maxMeters = R * Math.acos(Math.min(a, 1)); return maxMeters; } function getDecimalRoundNum(d) { var multiplier = Math.pow(10, Math.ceil(-Math.log(d) / Math.LN10)); return Math.round(d * multiplier) / multiplier; } function getRoundNum(num) { var pow10 = Math.pow(10, (("" + (Math.floor(num)))).length - 1); var d = num / pow10; d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : d >= 1 ? 1 : getDecimalRoundNum(d); return pow10 * d; } // /** * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode. * * @implements {IControl} * @param {Object} [options] * @param {HTMLElement} [options.container] `container` is the [compatible DOM element](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen#Compatible_elements) which should be made full screen. By default, the map container element will be made full screen. * * @example * map.addControl(new mapboxgl.FullscreenControl({container: document.querySelector('body')})); * @see [View a fullscreen map](https://www.mapbox.com/mapbox-gl-js/example/fullscreen/) */ var FullscreenControl = function FullscreenControl(options ) { this._fullscreen = false; if (options && options.container) { if (options.container instanceof symbol_layout.window.HTMLElement) { this._container = options.container; } else { symbol_layout.warnOnce('Full screen control \'container\' must be a DOM element.'); } } symbol_layout.bindAll([ '_onClickFullscreen', '_changeIcon' ], this); if ('onfullscreenchange' in symbol_layout.window.document) { this._fullscreenchange = 'fullscreenchange'; } else if ('onmozfullscreenchange' in symbol_layout.window.document) { this._fullscreenchange = 'mozfullscreenchange'; } else if ('onwebkitfullscreenchange' in symbol_layout.window.document) { this._fullscreenchange = 'webkitfullscreenchange'; } else if ('onmsfullscreenchange' in symbol_layout.window.document) { this._fullscreenchange = 'MSFullscreenChange'; } this._className = 'mapboxgl-ctrl'; }; FullscreenControl.prototype.onAdd = function onAdd (map ) { this._map = map; if (!this._container) { this._container = this._map.getContainer(); } this._controlContainer = DOM.create('div', ((this._className) + " mapboxgl-ctrl-group")); if (this._checkFullscreenSupport()) { this._setupUI(); } else { this._controlContainer.style.display = 'none'; symbol_layout.warnOnce('This device does not support fullscreen mode.'); } return this._controlContainer; }; FullscreenControl.prototype.onRemove = function onRemove () { DOM.remove(this._controlContainer); this._map = (null ); symbol_layout.window.document.removeEventListener(this._fullscreenchange, this._changeIcon); }; FullscreenControl.prototype._checkFullscreenSupport = function _checkFullscreenSupport () { return !!( symbol_layout.window.document.fullscreenEnabled || (symbol_layout.window.document ).mozFullScreenEnabled || (symbol_layout.window.document ).msFullscreenEnabled || (symbol_layout.window.document ).webkitFullscreenEnabled ); }; FullscreenControl.prototype._setupUI = function _setupUI () { var button = this._fullscreenButton = DOM.create('button', (((this._className) + "-icon " + (this._className) + "-fullscreen")), this._controlContainer); button.type = 'button'; this._updateTitle(); this._fullscreenButton.addEventListener('click', this._onClickFullscreen); symbol_layout.window.document.addEventListener(this._fullscreenchange, this._changeIcon); }; FullscreenControl.prototype._updateTitle = function _updateTitle () { var title = this._isFullscreen() ? "Exit fullscreen" : "Enter fullscreen"; this._fullscreenButton.setAttribute("aria-label", title); this._fullscreenButton.title = title; }; FullscreenControl.prototype._isFullscreen = function _isFullscreen () { return this._fullscreen; }; FullscreenControl.prototype._changeIcon = function _changeIcon () { var fullscreenElement = symbol_layout.window.document.fullscreenElement || (symbol_layout.window.document ).mozFullScreenElement || (symbol_layout.window.document ).webkitFullscreenElement || (symbol_layout.window.document ).msFullscreenElement; if ((fullscreenElement === this._container) !== this._fullscreen) { this._fullscreen = !this._fullscreen; this._fullscreenButton.classList.toggle(((this._className) + "-shrink")); this._fullscreenButton.classList.toggle(((this._className) + "-fullscreen")); this._updateTitle(); } }; FullscreenControl.prototype._onClickFullscreen = function _onClickFullscreen () { if (this._isFullscreen()) { if (symbol_layout.window.document.exitFullscreen) { (symbol_layout.window.document ).exitFullscreen(); } else if (symbol_layout.window.document.mozCancelFullScreen) { (symbol_layout.window.document ).mozCancelFullScreen(); } else if (symbol_layout.window.document.msExitFullscreen) { (symbol_layout.window.document ).msExitFullscreen(); } else if (symbol_layout.window.document.webkitCancelFullScreen) { (symbol_layout.window.document ).webkitCancelFullScreen(); } } else if (this._container.requestFullscreen) { this._container.requestFullscreen(); } else if ((this._container ).mozRequestFullScreen) { (this._container ).mozRequestFullScreen(); } else if ((this._container ).msRequestFullscreen) { (this._container ).msRequestFullscreen(); } else if ((this._container ).webkitRequestFullscreen) { (this._container ).webkitRequestFullscreen(); } }; // var defaultOptions$4 = { closeButton: true, closeOnClick: true, className: '', maxWidth: "240px" }; /** * A popup component. * * @param {Object} [options] * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the * top right corner of the popup. * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the * map is clicked. * @param {string} [options.anchor] - A string indicating the part of the Popup that should * be positioned closest to the coordinate set via {@link Popup#setLngLat}. * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be * dynamically set to ensure the popup falls within the map container with a preference * for `'bottom'`. * @param {number|PointLike|Object} [options.offset] - * A pixel offset applied to the popup's location specified as: * - a single number specifying a distance from the popup's location * - a {@link PointLike} specifying a constant offset * - an object of {@link Point}s specifing an offset for each anchor position * Negative offsets indicate left and up. * @param {string} [options.className] Space-separated CSS class names to add to popup container * @param {string} [options.maxWidth='240px'] - * A string that sets the CSS property of the popup's maximum width, eg `'300px'`. * To ensure the popup resizes to fit its content, set this property to `'none'`. * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width * @example * var markerHeight = 50, markerRadius = 10, linearOffset = 25; * var popupOffsets = { * 'top': [0, 0], * 'top-left': [0,0], * 'top-right': [0,0], * 'bottom': [0, -markerHeight], * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1], * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1], * 'left': [markerRadius, (markerHeight - markerRadius) * -1], * 'right': [-markerRadius, (markerHeight - markerRadius) * -1] * }; * var popup = new mapboxgl.Popup({offset: popupOffsets, className: 'my-class'}) * .setLngLat(e.lngLat) * .setHTML("

Hello World!

") * .setMaxWidth("300px") * .addTo(map); * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Display a popup on click](https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Attach a popup to a marker instance](https://www.mapbox.com/mapbox-gl-js/example/set-popup/) */ var Popup = /*@__PURE__*/(function (Evented) { function Popup(options ) { Evented.call(this); this.options = symbol_layout.extend(Object.create(defaultOptions$4), options); symbol_layout.bindAll(['_update', '_onClickClose', 'remove'], this); } if ( Evented ) Popup.__proto__ = Evented; Popup.prototype = Object.create( Evented && Evented.prototype ); Popup.prototype.constructor = Popup; /** * Adds the popup to a map. * * @param {Map} map The Mapbox GL JS map to add the popup to. * @returns {Popup} `this` */ Popup.prototype.addTo = function addTo (map ) { var this$1 = this; this._map = map; if (this.options.closeOnClick) { this._map.on('click', this._onClickClose); } this._map.on('remove', this.remove); this._update(); if (this._trackPointer) { this._map.on('mousemove', function (e) { this$1._update(e.point); }); this._map.on('mouseup', function (e) { this$1._update(e.point); }); this._container.classList.add('mapboxgl-popup-track-pointer'); this._map._canvasContainer.classList.add('mapboxgl-track-pointer'); } else { this._map.on('move', this._update); } /** * Fired when the popup is opened manually or programatically. * * @event open * @memberof Popup * @instance * @type {Object} * @property {Popup} popup object that was opened */ this.fire(new symbol_layout.Event('open')); return this; }; /** * @returns {boolean} `true` if the popup is open, `false` if it is closed. */ Popup.prototype.isOpen = function isOpen () { return !!this._map; }; /** * Removes the popup from the map it has been added to. * * @example * var popup = new mapboxgl.Popup().addTo(map); * popup.remove(); * @returns {Popup} `this` */ Popup.prototype.remove = function remove () { if (this._content) { DOM.remove(this._content); } if (this._container) { DOM.remove(this._container); delete this._container; } if (this._map) { this._map.off('move', this._update); this._map.off('click', this._onClickClose); this._map.off('remove', this.remove); this._map.off('mousemove'); delete this._map; } /** * Fired when the popup is closed manually or programatically. * * @event close * @memberof Popup * @instance * @type {Object} * @property {Popup} popup object that was closed */ this.fire(new symbol_layout.Event('close')); return this; }; /** * Returns the geographical location of the popup's anchor. * * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously * set by `setLngLat` because `Popup` wraps the anchor longitude across copies of the world to keep * the popup on screen. * * @returns {LngLat} The geographical location of the popup's anchor. */ Popup.prototype.getLngLat = function getLngLat () { return this._lngLat; }; /** * Sets the geographical location of the popup's anchor, and moves the popup to it. Replaces trackPointer() behavior. * * @param lnglat The geographical location to set as the popup's anchor. * @returns {Popup} `this` */ Popup.prototype.setLngLat = function setLngLat (lnglat ) { this._lngLat = symbol_layout.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._container.classList.remove('mapboxgl-popup-track-pointer'); this._map._canvasContainer.classList.remove('mapboxgl-track-pointer'); } return this; }; /** * Tracks the popup anchor to the cursor position, on screens with a pointer device (will be hidden on touchscreens). Replaces the setLngLat behavior. * For most use cases, `closeOnClick` and `closeButton` should also be set to `false` here. * @returns {Popup} `this` */ Popup.prototype.trackPointer = function trackPointer () { var this$1 = this; this._trackPointer = true; this._pos = null; if (this._map) { this._map.off('move', this._update); this._map.on('mousemove', function (e) { this$1._update(e.point); }); this._map.on('drag', function (e) { this$1._update(e.point); }); this._container.classList.add('mapboxgl-popup-track-pointer'); this._map._canvasContainer.classList.add('mapboxgl-track-pointer'); } return this; }; /** * Returns the `Popup`'s HTML element. * @returns {HTMLElement} element */ Popup.prototype.getElement = function getElement () { return this._container; }; /** * Sets the popup's content to a string of text. * * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM, * so it cannot insert raw HTML. Use this method for security against XSS * if the popup content is user-provided. * * @param text Textual content for the popup. * @returns {Popup} `this` * @example * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setText('Hello, world!') * .addTo(map); */ Popup.prototype.setText = function setText (text ) { return this.setDOMContent(symbol_layout.window.document.createTextNode(text)); }; /** * Sets the popup's content to the HTML provided as a string. * * This method does not perform HTML filtering or sanitization, and must be * used only with trusted content. Consider {@link Popup#setText} if * the content is an untrusted text string. * * @param html A string representing HTML content for the popup. * @returns {Popup} `this` */ Popup.prototype.setHTML = function setHTML (html ) { var frag = symbol_layout.window.document.createDocumentFragment(); var temp = symbol_layout.window.document.createElement('body'); var child; temp.innerHTML = html; while (true) { child = temp.firstChild; if (!child) { break; } frag.appendChild(child); } return this.setDOMContent(frag); }; /** * Returns the popup's maximum width. * * @returns {string} The maximum width of the popup. */ Popup.prototype.getMaxWidth = function getMaxWidth () { return this._container.style.maxWidth; }; /** * Sets the popup's maximum width. This is setting the CSS property `max-width`. * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width * * @param maxWidth A string representing the value for the maximum width. * @returns {Popup} `this` */ Popup.prototype.setMaxWidth = function setMaxWidth (maxWidth ) { this.options.maxWidth = maxWidth; this._update(); return this; }; /** * Sets the popup's content to the element provided as a DOM node. * * @param htmlNode A DOM node to be used as content for the popup. * @returns {Popup} `this` * @example * // create an element with the popup content * var div = window.document.createElement('div'); * div.innerHTML = 'Hello, world!'; * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setDOMContent(div) * .addTo(map); */ Popup.prototype.setDOMContent = function setDOMContent (htmlNode ) { this._createContent(); this._content.appendChild(htmlNode); this._update(); return this; }; Popup.prototype._createContent = function _createContent () { if (this._content) { DOM.remove(this._content); } this._content = DOM.create('div', 'mapboxgl-popup-content', this._container); if (this.options.closeButton) { this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content); this._closeButton.type = 'button'; this._closeButton.setAttribute('aria-label', 'Close popup'); this._closeButton.innerHTML = '×'; this._closeButton.addEventListener('click', this._onClickClose); } }; Popup.prototype._update = function _update (cursor ) { var this$1 = this; var hasPosition = this._lngLat || this._trackPointer; if (!this._map || !hasPosition || !this._content) { return; } if (!this._container) { this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer()); this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container); this._container.appendChild(this._content); if (this.options.className) { this.options.className.split(' ').forEach(function (name) { return this$1._container.classList.add(name); }); } } if (this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth) { this._container.style.maxWidth = this.options.maxWidth; } if (this._map.transform.renderWorldCopies && !this._trackPointer) { this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); } if (this._trackPointer && !cursor) { return; } var pos = this._pos = this._trackPointer && cursor ? cursor : this._map.project(this._lngLat); var anchor = this.options.anchor; var offset = normalizeOffset(this.options.offset); if (!anchor) { var width = this._container.offsetWidth; var height = this._container.offsetHeight; var anchorComponents; if (pos.y + offset.bottom.y < height) { anchorComponents = ['top']; } else if (pos.y > this._map.transform.height - height) { anchorComponents = ['bottom']; } else { anchorComponents = []; } if (pos.x < width / 2) { anchorComponents.push('left'); } else if (pos.x > this._map.transform.width - width / 2) { anchorComponents.push('right'); } if (anchorComponents.length === 0) { anchor = 'bottom'; } else { anchor = (anchorComponents.join('-') ); } } var offsetedPos = pos.add(offset[anchor]).round(); DOM.setTransform(this._container, ((anchorTranslate[anchor]) + " translate(" + (offsetedPos.x) + "px," + (offsetedPos.y) + "px)")); applyAnchorClass(this._container, anchor, 'popup'); }; Popup.prototype._onClickClose = function _onClickClose () { this.remove(); }; return Popup; }(symbol_layout.Evented)); function normalizeOffset(offset ) { if (!offset) { return normalizeOffset(new symbol_layout.Point(0, 0)); } else if (typeof offset === 'number') { // input specifies a radius from which to calculate offsets at all positions var cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2))); return { 'center': new symbol_layout.Point(0, 0), 'top': new symbol_layout.Point(0, offset), 'top-left': new symbol_layout.Point(cornerOffset, cornerOffset), 'top-right': new symbol_layout.Point(-cornerOffset, cornerOffset), 'bottom': new symbol_layout.Point(0, -offset), 'bottom-left': new symbol_layout.Point(cornerOffset, -cornerOffset), 'bottom-right': new symbol_layout.Point(-cornerOffset, -cornerOffset), 'left': new symbol_layout.Point(offset, 0), 'right': new symbol_layout.Point(-offset, 0) }; } else if (offset instanceof symbol_layout.Point || Array.isArray(offset)) { // input specifies a single offset to be applied to all positions var convertedOffset = symbol_layout.Point.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': symbol_layout.Point.convert(offset['center'] || [0, 0]), 'top': symbol_layout.Point.convert(offset['top'] || [0, 0]), 'top-left': symbol_layout.Point.convert(offset['top-left'] || [0, 0]), 'top-right': symbol_layout.Point.convert(offset['top-right'] || [0, 0]), 'bottom': symbol_layout.Point.convert(offset['bottom'] || [0, 0]), 'bottom-left': symbol_layout.Point.convert(offset['bottom-left'] || [0, 0]), 'bottom-right': symbol_layout.Point.convert(offset['bottom-right'] || [0, 0]), 'left': symbol_layout.Point.convert(offset['left'] || [0, 0]), 'right': symbol_layout.Point.convert(offset['right'] || [0, 0]) }; } } // var exported = { version: symbol_layout.version, supported: mapboxGlSupported, setRTLTextPlugin: symbol_layout.setRTLTextPlugin, Map: Map, NavigationControl: NavigationControl, GeolocateControl: GeolocateControl, AttributionControl: AttributionControl, ScaleControl: ScaleControl, FullscreenControl: FullscreenControl, Popup: Popup, Marker: Marker, Style: Style, LngLat: symbol_layout.LngLat, LngLatBounds: symbol_layout.LngLatBounds, Point: symbol_layout.Point, MercatorCoordinate: symbol_layout.MercatorCoordinate, Evented: symbol_layout.Evented, config: symbol_layout.config, /** * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/). * * @var {string} accessToken * @example * mapboxgl.accessToken = myAccessToken; * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) */ get accessToken() { return symbol_layout.config.ACCESS_TOKEN; }, set accessToken(token ) { symbol_layout.config.ACCESS_TOKEN = token; }, /** * Gets and sets the map's default API URL for requesting tiles, styles, sprites, and glyphs * * @var {string} baseApiUrl * @example * mapboxgl.baseApiUrl = 'https://api.mapbox.com'; */ get baseApiUrl() { return symbol_layout.config.API_URL; }, set baseApiUrl(url ) { symbol_layout.config.API_URL = url; }, /** * Gets and sets the number of web workers instantiated on a page with GL JS maps. * By default, it is set to half the number of CPU cores (capped at 6). * Make sure to set this property before creating any map instances for it to have effect. * * @var {string} workerCount * @example * mapboxgl.workerCount = 2; */ get workerCount() { return WorkerPool.workerCount; }, set workerCount(count ) { WorkerPool.workerCount = count; }, /** * Gets and sets the maximum number of images (raster tiles, sprites, icons) to load in parallel, * which affects performance in raster-heavy maps. 16 by default. * * @var {string} maxParallelImageRequests * @example * mapboxgl.maxParallelImageRequests = 10; */ get maxParallelImageRequests() { return symbol_layout.config.MAX_PARALLEL_IMAGE_REQUESTS; }, set maxParallelImageRequests(numRequests ) { symbol_layout.config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests; }, /** * Clears browser storage used by this library. Using this method flushes the Mapbox tile * cache that is managed by this library. Tiles may still be cached by the browser * in some cases. * * This API is supported on browsers where the [`Cache` API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) * is supported and enabled. This includes all major browsers when pages are served over * `https://`, except Internet Explorer and Edge Mobile. * * When called in unsupported browsers or environments (private or incognito mode), the * callback will be called with an error argument. * * @function clearStorage * @param {Function} callback Called with an error argument if there is an error. */ clearStorage: function clearStorage(callback ) { symbol_layout.clearTileCache(callback); }, workerUrl: '' }; // canary assert: used to confirm that asserts have been removed from production build symbol_layout.assert(true, 'canary assert'); return exported; }); // return mapboxgl; })); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwYm94LWdsLWRldi5qcyIsInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvYXNzZXJ0L25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9hc3NlcnQvbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYXNzZXJ0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdW5pdGJlemllci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3BvaW50LWdlb21ldHJ5L2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9kZWVwX2VxdWFsLmpzIiwiLi4vc3JjL3V0aWwvdXRpbC5qcyIsIi4uL3NyYy91dGlsL2Jyb3dzZXIuanMiLCIuLi9zcmMvdXRpbC9jb25maWcuanMiLCIuLi9zcmMvdXRpbC93ZWJwX3N1cHBvcnRlZC5qcyIsIi4uL3NyYy91dGlsL3NrdV90b2tlbi5qcyIsIi4uL3NyYy91dGlsL21hcGJveC5qcyIsIi4uL3NyYy91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyIsIi4uL3NyYy91dGlsL2FqYXguanMiLCIuLi9zcmMvdXRpbC9ldmVudGVkLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2NvbnN0YW50cy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvZXh0ZW5kLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vcGFyc2luZ19lcnJvci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vc2NvcGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvY29sbGF0b3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdmFsdWVzLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9saXRlcmFsLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9ydW50aW1lX2Vycm9yLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9hc3NlcnRpb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Zvcm1hdC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29lcmNpb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2V2YWx1YXRpb25fY29udGV4dC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vY29tcG91bmRfZXhwcmVzc2lvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29sbGF0b3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2lzX2NvbnN0YW50LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy92YXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfY29udGV4dC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vc3RvcHMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3N0ZXAuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9jb2xvcl9zcGFjZXMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2FsZXNjZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGV0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9hdC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbWF0Y2guanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Nhc2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvbXBhcmlzb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL251bWJlcl9mb3JtYXQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2xlbmd0aC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW5kZXguanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3Jlc3VsdC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvZ2V0X3R5cGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9mdW5jdGlvbi9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9vYmplY3QuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9hcnJheS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX251bWJlci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Z1bmN0aW9uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Jvb2xlYW4uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9jb2xvci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2VudW0uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlci9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3Byb3BlcnR5LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfc3RyaW5nLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZm9ybWF0dGVkLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9nbHlwaHNfdXJsLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGVfc3R5bGUubWluLmpzIiwiLi4vc3JjL3N0eWxlL3ZhbGlkYXRlX3N0eWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dyaWQtaW5kZXgvZ3JpZC1pbmRleC5qcyIsIi4uL3NyYy91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMiLCIuLi9zcmMvc3R5bGUvem9vbV9oaXN0b3J5LmpzIiwiLi4vc3JjL3V0aWwvaXNfY2hhcl9pbl91bmljb2RlX2Jsb2NrLmpzIiwiLi4vc3JjL3V0aWwvc2NyaXB0X2RldGVjdGlvbi5qcyIsIi4uL3NyYy9zb3VyY2UvcnRsX3RleHRfcGx1Z2luLmpzIiwiLi4vc3JjL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyIsIi4uL3NyYy9zdHlsZS9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3V0aWwvc3RydWN0X2FycmF5LmpzIiwiLi4vc3JjL2RhdGEvYXJyYXlfdHlwZXMuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvY2lyY2xlX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvZGF0YS9zZWdtZW50LmpzIiwiLi4vc3JjL3NoYWRlcnMvZW5jb2RlX2F0dHJpYnV0ZS5qcyIsIi4uL3NyYy9kYXRhL2ZlYXR1cmVfcG9zaXRpb25fbWFwLmpzIiwiLi4vc3JjL3JlbmRlci91bmlmb3JtX2JpbmRpbmcuanMiLCIuLi9zcmMvZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMiLCIuLi9zcmMvZGF0YS9leHRlbnQuanMiLCIuLi9zcmMvZGF0YS9sb2FkX2dlb21ldHJ5LmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2NpcmNsZV9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMuanMiLCIuLi9zcmMvc3R5bGUvcXVlcnlfdXRpbHMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9jb21tb24uanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0MmQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0NC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzMuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWM0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vcXVhdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3F1YXQyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjMi5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvaGVhdG1hcF9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9pbWFnZS5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvdXRpbC9jb2xvcl9yYW1wLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYXR0cmlidXRlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9xdWlja3NlbGVjdC9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2NsYXNzaWZ5X3JpbmdzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2F0dHJpYnV0ZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXQuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9saW5lX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvbGluZV9idWNrZXQuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvc3ltYm9sX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvc3ltYm9sL3RyYW5zZm9ybV90ZXh0LmpzIiwiLi4vc3JjL3N5bWJvbC9tZXJnZWxpbmVzLmpzIiwiLi4vc3JjL3V0aWwvdmVydGljYWxpemVfcHVuY3R1YXRpb24uanMiLCIuLi9zcmMvc3ltYm9sL29uZV9lbS5qcyIsIi4uL3NyYy9zeW1ib2wvc2hhcGluZy5qcyIsIi4uL3NyYy9zeW1ib2wvYW5jaG9yLmpzIiwiLi4vc3JjL3N5bWJvbC9zeW1ib2xfc2l6ZS5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzIiwiLi4vc3JjL3V0aWwvcmVzb2x2ZV90b2tlbnMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Zvcm1hdF9zZWN0aW9uX292ZXJyaWRlLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvYmFja2dyb3VuZF9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3N0eWxlL2NyZWF0ZV9zdHlsZV9sYXllci5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3RwYWNrL2luZGV4Lm1qcyIsIi4uL3NyYy9yZW5kZXIvaW1hZ2VfYXRsYXMuanMiLCIuLi9zcmMvcmVuZGVyL3RleHR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wYmYvaW5kZXguanMiLCIuLi9zcmMvc3R5bGUvcGFyc2VfZ2x5cGhfcGJmLmpzIiwiLi4vc3JjL3V0aWwvdGhyb3R0bGVkX2ludm9rZXIuanMiLCIuLi9zcmMvdXRpbC9hY3Rvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3dob290cy1qcy9pbmRleC5tanMiLCIuLi9zcmMvZ2VvL2xuZ19sYXRfYm91bmRzLmpzIiwiLi4vc3JjL2dlby9sbmdfbGF0LmpzIiwiLi4vc3JjL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzIiwiLi4vc3JjL3NvdXJjZS90aWxlX2lkLmpzIiwiLi4vc3JjL2RhdGEvZGVtX2RhdGEuanMiLCIuLi9zcmMvZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9kaWN0aW9uYXJ5X2NvZGVyLmpzIiwiLi4vc3JjL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uLmpzIiwiLi4vc3JjL3NvdXJjZS9zb3VyY2Vfc3RhdGUuanMiLCIuLi9zcmMvZGF0YS9mZWF0dXJlX2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS90aWxlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9yZWZfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zeW1ib2wvY2hlY2tfbWF4X2FuZ2xlLmpzIiwiLi4vc3JjL3N5bWJvbC9nZXRfYW5jaG9ycy5qcyIsIi4uL3NyYy9zeW1ib2wvY2xpcF9saW5lLmpzIiwiLi4vc3JjL3N5bWJvbC9xdWFkcy5qcyIsIi4uL3NyYy9zeW1ib2wvY29sbGlzaW9uX2ZlYXR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvdGlueXF1ZXVlL2luZGV4LmpzIiwiLi4vc3JjL3V0aWwvZmluZF9wb2xlX29mX2luYWNjZXNzaWJpbGl0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9tdXJtdXJoYXNoLWpzL211cm11cmhhc2gzX2djLmpzIiwiLi4vbm9kZV9tb2R1bGVzL211cm11cmhhc2gtanMvbXVybXVyaGFzaDJfZ2MuanMiLCIuLi9ub2RlX21vZHVsZXMvbXVybXVyaGFzaC1qcy9pbmRleC5qcyIsIi4uL3NyYy9zeW1ib2wvc3ltYm9sX2xheW91dC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2dyb3VwX2J5X2xheW91dC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllcl9pbmRleC5qcyIsIi4uL3NyYy9yZW5kZXIvZ2x5cGhfYXRsYXMuanMiLCIuLi9zcmMvc291cmNlL3dvcmtlcl90aWxlLmpzIiwiLi4vc3JjL3V0aWwvcGVyZm9ybWFuY2UuanMiLCIuLi9zcmMvc291cmNlL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3Jhc3Rlcl9kZW1fdGlsZV93b3JrZXJfc291cmNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3dnczg0L2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvZ2VvanNvbi1hcmVhL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvZ2VvanNvbi1yZXdpbmQvaW5kZXguanMiLCIuLi9zcmMvc291cmNlL2dlb2pzb25fd3JhcHBlci5qcyIsIi4uL25vZGVfbW9kdWxlcy92dC1wYmYvbGliL2dlb2pzb25fd3JhcHBlci5qcyIsIi4uL25vZGVfbW9kdWxlcy92dC1wYmYvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMva2RidXNoL3NyYy9zb3J0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvcmFuZ2UuanMiLCIuLi9ub2RlX21vZHVsZXMva2RidXNoL3NyYy93aXRoaW4uanMiLCIuLi9ub2RlX21vZHVsZXMva2RidXNoL3NyYy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zdXBlcmNsdXN0ZXIvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvc2ltcGxpZnkuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvZmVhdHVyZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jb252ZXJ0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvd3JhcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90cmFuc2Zvcm0uanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdGlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIi4uL3NyYy9zb3VyY2UvZ2VvanNvbl93b3JrZXJfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS93b3JrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkL2luZGV4LmpzIiwiLi4vc3JjL3V0aWwvZG9tLmpzIiwiLi4vc3JjL3N0eWxlL2xvYWRfc3ByaXRlLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2ltYWdlLmpzIiwiLi4vc3JjL3JlbmRlci9pbWFnZV9tYW5hZ2VyLmpzIiwiLi4vc3JjL3N0eWxlL2xvYWRfZ2x5cGhfcmFuZ2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC90aW55LXNkZi9pbmRleC5qcyIsIi4uL3NyYy9yZW5kZXIvZ2x5cGhfbWFuYWdlci5qcyIsIi4uL3NyYy9zdHlsZS9saWdodC5qcyIsIi4uL3NyYy9yZW5kZXIvbGluZV9hdGxhcy5qcyIsIi4uL3NyYy91dGlsL2Rpc3BhdGNoZXIuanMiLCIuLi9zcmMvc291cmNlL2xvYWRfdGlsZWpzb24uanMiLCIuLi9zcmMvc291cmNlL3RpbGVfYm91bmRzLmpzIiwiLi4vc3JjL3NvdXJjZS92ZWN0b3JfdGlsZV9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvcmFzdGVyX2RlbV90aWxlX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvZ2VvanNvbl9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL2ltYWdlX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvdmlkZW9fc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9jYW52YXNfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3F1ZXJ5X2ZlYXR1cmVzLmpzIiwiLi4vc3JjL3NvdXJjZS90aWxlX2NhY2hlLmpzIiwiLi4vc3JjL2dsL2luZGV4X2J1ZmZlci5qcyIsIi4uL3NyYy9nbC92ZXJ0ZXhfYnVmZmVyLmpzIiwiLi4vc3JjL2dsL3ZhbHVlLmpzIiwiLi4vc3JjL2dsL2ZyYW1lYnVmZmVyLmpzIiwiLi4vc3JjL2dsL2RlcHRoX21vZGUuanMiLCIuLi9zcmMvZ2wvc3RlbmNpbF9tb2RlLmpzIiwiLi4vc3JjL2dsL2NvbG9yX21vZGUuanMiLCIuLi9zcmMvZ2wvY3VsbF9mYWNlX21vZGUuanMiLCIuLi9zcmMvZ2wvY29udGV4dC5qcyIsIi4uL3NyYy9zb3VyY2Uvc291cmNlX2NhY2hlLmpzIiwiLi4vc3JjL3V0aWwvYnJvd3Nlci93ZWJfd29ya2VyLmpzIiwiLi4vc3JjL3V0aWwvd29ya2VyX3Bvb2wuanMiLCIuLi9zcmMvdXRpbC9nbG9iYWxfd29ya2VyX3Bvb2wuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9kZXJlZi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2RpZmYuanMiLCIuLi9zcmMvc3ltYm9sL2dyaWRfaW5kZXguanMiLCIuLi9zcmMvc3ltYm9sL3Byb2plY3Rpb24uanMiLCIuLi9zcmMvc3ltYm9sL2NvbGxpc2lvbl9pbmRleC5qcyIsIi4uL3NyYy9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMuanMiLCIuLi9zcmMvc3ltYm9sL3BsYWNlbWVudC5qcyIsIi4uL3NyYy9zdHlsZS9wYXVzZWFibGVfcGxhY2VtZW50LmpzIiwiLi4vc3JjL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZS5qcyIsIi4uL3NyYy9kYXRhL3Bvc19hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL3NoYWRlcnMvc2hhZGVycy5qcyIsIi4uL3NyYy9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdC5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9wYXR0ZXJuLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2ZpbGxfZXh0cnVzaW9uX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vZmlsbF9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2NpcmNsZV9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2NvbGxpc2lvbl9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2RlYnVnX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vY2xpcHBpbmdfbWFza19wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2hlYXRtYXBfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9oaWxsc2hhZGVfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9saW5lX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vcmFzdGVyX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vc3ltYm9sX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vYmFja2dyb3VuZF9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3Byb2dyYW1fdW5pZm9ybXMuanMiLCIuLi9zcmMvcmVuZGVyL3RpbGVfbWFzay5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19jb2xsaXNpb25fZGVidWcuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfc3ltYm9sLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2NpcmNsZS5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19oZWF0bWFwLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2xpbmUuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZmlsbC5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19maWxsX2V4dHJ1c2lvbi5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19oaWxsc2hhZGUuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfcmFzdGVyLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2JhY2tncm91bmQuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZGVidWcuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfY3VzdG9tLmpzIiwiLi4vc3JjL3JlbmRlci9wYWludGVyLmpzIiwiLi4vc3JjL3V0aWwvdGlsZV9jb3Zlci5qcyIsIi4uL3NyYy9nZW8vdHJhbnNmb3JtLmpzIiwiLi4vc3JjL3V0aWwvdGhyb3R0bGUuanMiLCIuLi9zcmMvdWkvaGFzaC5qcyIsIi4uL3NyYy91aS9ldmVudHMuanMiLCIuLi9zcmMvdWkvaGFuZGxlci9zY3JvbGxfem9vbS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL2JveF96b29tLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvZHJhZ19yb3RhdGUuanMiLCIuLi9zcmMvdWkvaGFuZGxlci9kcmFnX3Bhbi5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL2tleWJvYXJkLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvZGJsY2xpY2tfem9vbS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlLmpzIiwiLi4vc3JjL3VpL2JpbmRfaGFuZGxlcnMuanMiLCIuLi9zcmMvdWkvY2FtZXJhLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbC5qcyIsIi4uL3NyYy91aS9jb250cm9sL2xvZ29fY29udHJvbC5qcyIsIi4uL3NyYy91dGlsL3Rhc2tfcXVldWUuanMiLCIuLi9zcmMvdWkvbWFwLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvbmF2aWdhdGlvbl9jb250cm9sLmpzIiwiLi4vc3JjL3V0aWwvc21hcnRfd3JhcC5qcyIsIi4uL3NyYy91aS9hbmNob3IuanMiLCIuLi9zcmMvdWkvbWFya2VyLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZ2VvbG9jYXRlX2NvbnRyb2wuanMiLCIuLi9zcmMvdWkvY29udHJvbC9zY2FsZV9jb250cm9sLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZnVsbHNjcmVlbl9jb250cm9sLmpzIiwiLi4vc3JjL3VpL3BvcHVwLmpzIiwiLi4vc3JjL2luZGV4LmpzIiwiLi4vcm9sbHVwL21hcGJveGdsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvYmplY3RBc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIGNvbXBhcmUgYW5kIGlzQnVmZmVyIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvYmxvYi82ODBlOWU1ZTQ4OGYyMmFhYzI3NTk5YTU3ZGM4NDRhNjMxNTkyOGRkL2luZGV4LmpzXG4vLyBvcmlnaW5hbCBub3RpY2U6XG5cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuZnVuY3Rpb24gaXNCdWZmZXIoYikge1xuICBpZiAoZ2xvYmFsLkJ1ZmZlciAmJiB0eXBlb2YgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyKGIpO1xuICB9XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpO1xufVxuXG4vLyBiYXNlZCBvbiBub2RlIGFzc2VydCwgb3JpZ2luYWwgbm90aWNlOlxuLy8gTkI6IFRoZSBVUkwgdG8gdGhlIENvbW1vbkpTIHNwZWMgaXMga2VwdCBqdXN0IGZvciB0cmFkaXRpb24uXG4vLyAgICAgbm9kZS1hc3NlcnQgaGFzIGV2b2x2ZWQgYSBsb3Qgc2luY2UgdGhlbiwgYm90aCBpbiBBUEkgYW5kIGJlaGF2aW9yLlxuXG4vLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsLycpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbn0oKSk7XG5mdW5jdGlvbiBwVG9TdHJpbmcgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG59XG5mdW5jdGlvbiBpc1ZpZXcoYXJyYnVmKSB7XG4gIGlmIChpc0J1ZmZlcihhcnJidWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnJidWYpO1xuICB9XG4gIGlmICghYXJyYnVmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhcnJidWYgaW5zdGFuY2VvZiBEYXRhVmlldykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChhcnJidWYuYnVmZmVyICYmIGFycmJ1Zi5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIDEuIFRoZSBhc3NlcnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRocm93XG4vLyBBc3NlcnRpb25FcnJvcidzIHdoZW4gcGFydGljdWxhciBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGVcbi8vIGFzc2VydCBtb2R1bGUgbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuXG52YXIgYXNzZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSBvaztcblxuLy8gMi4gVGhlIEFzc2VydGlvbkVycm9yIGlzIGRlZmluZWQgaW4gYXNzZXJ0LlxuLy8gbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pXG5cbnZhciByZWdleCA9IC9cXHMqZnVuY3Rpb25cXHMrKFteXFwoXFxzXSopXFxzKi87XG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL2Jsb2IvYWRlZWVlYzhiZmNjNjA2OGIxODdkN2Q5ZmIzZDViYjFkM2EzMDg5OS9pbXBsZW1lbnRhdGlvbi5qc1xuZnVuY3Rpb24gZ2V0TmFtZShmdW5jKSB7XG4gIGlmICghdXRpbC5pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMpIHtcbiAgICByZXR1cm4gZnVuYy5uYW1lO1xuICB9XG4gIHZhciBzdHIgPSBmdW5jLnRvU3RyaW5nKCk7XG4gIHZhciBtYXRjaCA9IHN0ci5tYXRjaChyZWdleCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn1cbmFzc2VydC5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIEFzc2VydGlvbkVycm9yKG9wdGlvbnMpIHtcbiAgdGhpcy5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcbiAgdGhpcy5hY3R1YWwgPSBvcHRpb25zLmFjdHVhbDtcbiAgdGhpcy5leHBlY3RlZCA9IG9wdGlvbnMuZXhwZWN0ZWQ7XG4gIHRoaXMub3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yO1xuICBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE1lc3NhZ2UodGhpcyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gdHJ1ZTtcbiAgfVxuICB2YXIgc3RhY2tTdGFydEZ1bmN0aW9uID0gb3B0aW9ucy5zdGFja1N0YXJ0RnVuY3Rpb24gfHwgZmFpbDtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBub24gdjggYnJvd3NlcnMgc28gd2UgY2FuIGhhdmUgYSBzdGFja3RyYWNlXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgIHZhciBvdXQgPSBlcnIuc3RhY2s7XG5cbiAgICAgIC8vIHRyeSB0byBzdHJpcCB1c2VsZXNzIGZyYW1lc1xuICAgICAgdmFyIGZuX25hbWUgPSBnZXROYW1lKHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMgfHwgIXV0aWwuaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWwuaW5zcGVjdChzb21ldGhpbmcpO1xuICB9XG4gIHZhciByYXduYW1lID0gZ2V0TmFtZShzb21ldGhpbmcpO1xuICB2YXIgbmFtZSA9IHJhd25hbWUgPyAnOiAnICsgcmF3bmFtZSA6ICcnO1xuICByZXR1cm4gJ1tGdW5jdGlvbicgKyAgbmFtZSArICddJztcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZikge1xuICByZXR1cm4gdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmFjdHVhbCksIDEyOCkgKyAnICcgK1xuICAgICAgICAgc2VsZi5vcGVyYXRvciArICcgJyArXG4gICAgICAgICB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuZXhwZWN0ZWQpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwRXF1YWwnLCBhc3NlcnQuZGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGRlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBTdHJpY3RFcXVhbCcsIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0RhdGUoYWN0dWFsKSAmJiB1dGlsLmlzRGF0ZShleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMyBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIFJlZ0V4cCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kXG4gIC8vIHByb3BlcnRpZXMgKGBnbG9iYWxgLCBgbXVsdGlsaW5lYCwgYGxhc3RJbmRleGAsIGBpZ25vcmVDYXNlYCkuXG4gIH0gZWxzZSBpZiAodXRpbC5pc1JlZ0V4cChhY3R1YWwpICYmIHV0aWwuaXNSZWdFeHAoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5zb3VyY2UgPT09IGV4cGVjdGVkLnNvdXJjZSAmJlxuICAgICAgICAgICBhY3R1YWwuZ2xvYmFsID09PSBleHBlY3RlZC5nbG9iYWwgJiZcbiAgICAgICAgICAgYWN0dWFsLm11bHRpbGluZSA9PT0gZXhwZWN0ZWQubXVsdGlsaW5lICYmXG4gICAgICAgICAgIGFjdHVhbC5sYXN0SW5kZXggPT09IGV4cGVjdGVkLmxhc3RJbmRleCAmJlxuICAgICAgICAgICBhY3R1YWwuaWdub3JlQ2FzZSA9PT0gZXhwZWN0ZWQuaWdub3JlQ2FzZTtcblxuICAvLyA3LjQuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsXG4gIC8vIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIH0gZWxzZSBpZiAoKGFjdHVhbCA9PT0gbnVsbCB8fCB0eXBlb2YgYWN0dWFsICE9PSAnb2JqZWN0JykgJiZcbiAgICAgICAgICAgICAoZXhwZWN0ZWQgPT09IG51bGwgfHwgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyBJZiBib3RoIHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mIHR5cGVkIGFycmF5cywgd3JhcCB0aGVpciB1bmRlcmx5aW5nXG4gIC8vIEFycmF5QnVmZmVycyBpbiBhIEJ1ZmZlciBlYWNoIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlXG4gIC8vIFRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIHRoZSBhcnJheXMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGNoZWNrZWQgYnlcbiAgLy8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAoYWthIHBUb1N0cmluZykuIE5ldmVyIHBlcmZvcm0gYmluYXJ5XG4gIC8vIGNvbXBhcmlzb25zIGZvciBGbG9hdCpBcnJheXMsIHRob3VnaCwgc2luY2UgZS5nLiArMCA9PT0gLTAgYnV0IHRoZWlyXG4gIC8vIGJpdCBwYXR0ZXJucyBhcmUgbm90IGlkZW50aWNhbC5cbiAgfSBlbHNlIGlmIChpc1ZpZXcoYWN0dWFsKSAmJiBpc1ZpZXcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgcFRvU3RyaW5nKGFjdHVhbCkgPT09IHBUb1N0cmluZyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICAhKGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgICAgICAgYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSkge1xuICAgIHJldHVybiBjb21wYXJlKG5ldyBVaW50OEFycmF5KGFjdHVhbC5idWZmZXIpLFxuICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGV4cGVjdGVkLmJ1ZmZlcikpID09PSAwO1xuXG4gIC8vIDcuNSBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAhPT0gaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG1lbW9zID0gbWVtb3MgfHwge2FjdHVhbDogW10sIGV4cGVjdGVkOiBbXX07XG5cbiAgICB2YXIgYWN0dWFsSW5kZXggPSBtZW1vcy5hY3R1YWwuaW5kZXhPZihhY3R1YWwpO1xuICAgIGlmIChhY3R1YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gbWVtb3MuZXhwZWN0ZWQuaW5kZXhPZihleHBlY3RlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb3MuYWN0dWFsLnB1c2goYWN0dWFsKTtcbiAgICBtZW1vcy5leHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcblxuICAgIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSB7XG4gIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24gbm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5mdW5jdGlvbiBub3REZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBTdHJpY3RFcXVhbCcsIG5vdERlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn1cblxuXG4vLyA5LiBUaGUgc3RyaWN0IGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzdHJpY3QgZXF1YWxpdHksIGFzIGRldGVybWluZWQgYnkgPT09LlxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09PScsIGFzc2VydC5zdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT09JywgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWdub3JlLiAgVGhlIGluc3RhbmNlb2YgY2hlY2sgZG9lc24ndCB3b3JrIGZvciBhcnJvdyBmdW5jdGlvbnMuXG4gIH1cblxuICBpZiAoRXJyb3IuaXNQcm90b3R5cGVPZihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZXhwZWN0ZWQuY2FsbCh7fSwgYWN0dWFsKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gX3RyeUJsb2NrKGJsb2NrKSB7XG4gIHZhciBlcnJvcjtcbiAgdHJ5IHtcbiAgICBibG9jaygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHR5cGVvZiBibG9jayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYmxvY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIGFjdHVhbCA9IF90cnlCbG9jayhibG9jayk7XG5cbiAgbWVzc2FnZSA9IChleHBlY3RlZCAmJiBleHBlY3RlZC5uYW1lID8gJyAoJyArIGV4cGVjdGVkLm5hbWUgKyAnKS4nIDogJy4nKSArXG4gICAgICAgICAgICAobWVzc2FnZSA/ICcgJyArIG1lc3NhZ2UgOiAnLicpO1xuXG4gIGlmIChzaG91bGRUaHJvdyAmJiAhYWN0dWFsKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnTWlzc2luZyBleHBlY3RlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICB2YXIgdXNlclByb3ZpZGVkTWVzc2FnZSA9IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJztcbiAgdmFyIGlzVW53YW50ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgdXRpbC5pc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnRocm93cyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyhmYWxzZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHRocm93IGVycjsgfTtcblxuLy8gRXhwb3NlIGEgc3RyaWN0IG9ubHkgdmFyaWFudCBvZiBhc3NlcnRcbmZ1bmN0aW9uIHN0cmljdCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBzdHJpY3QpO1xufVxuYXNzZXJ0LnN0cmljdCA9IG9iamVjdEFzc2lnbihzdHJpY3QsIGFzc2VydCwge1xuICBlcXVhbDogYXNzZXJ0LnN0cmljdEVxdWFsLFxuICBkZWVwRXF1YWw6IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwsXG4gIG5vdEVxdWFsOiBhc3NlcnQubm90U3RyaWN0RXF1YWwsXG4gIG5vdERlZXBFcXVhbDogYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbFxufSk7XG5hc3NlcnQuc3RyaWN0LnN0cmljdCA9IGFzc2VydC5zdHJpY3Q7XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuIiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSXG4gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUlxuICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sXG4gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICpcbiAqIFBvcnRlZCBmcm9tIFdlYmtpdFxuICogaHR0cDovL3N2bi53ZWJraXQub3JnL3JlcG9zaXRvcnkvd2Via2l0L3RydW5rL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1VuaXRCZXppZXIuaFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gVW5pdEJlemllcjtcblxuZnVuY3Rpb24gVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBvbHlub21pYWwgY29lZmZpY2llbnRzLCBpbXBsaWNpdCBmaXJzdCBhbmQgbGFzdCBjb250cm9sIHBvaW50cyBhcmUgKDAsMCkgYW5kICgxLDEpLlxuICAgIHRoaXMuY3ggPSAzLjAgKiBwMXg7XG4gICAgdGhpcy5ieCA9IDMuMCAqIChwMnggLSBwMXgpIC0gdGhpcy5jeDtcbiAgICB0aGlzLmF4ID0gMS4wIC0gdGhpcy5jeCAtIHRoaXMuYng7XG5cbiAgICB0aGlzLmN5ID0gMy4wICogcDF5O1xuICAgIHRoaXMuYnkgPSAzLjAgKiAocDJ5IC0gcDF5KSAtIHRoaXMuY3k7XG4gICAgdGhpcy5heSA9IDEuMCAtIHRoaXMuY3kgLSB0aGlzLmJ5O1xuXG4gICAgdGhpcy5wMXggPSBwMXg7XG4gICAgdGhpcy5wMXkgPSBwMnk7XG4gICAgdGhpcy5wMnggPSBwMng7XG4gICAgdGhpcy5wMnkgPSBwMnk7XG59XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlWCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAvLyBgYXggdF4zICsgYnggdF4yICsgY3ggdCcgZXhwYW5kZWQgdXNpbmcgSG9ybmVyJ3MgcnVsZS5cbiAgICByZXR1cm4gKCh0aGlzLmF4ICogdCArIHRoaXMuYngpICogdCArIHRoaXMuY3gpICogdDtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlWSA9IGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gKCh0aGlzLmF5ICogdCArIHRoaXMuYnkpICogdCArIHRoaXMuY3kpICogdDtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgzLjAgKiB0aGlzLmF4ICogdCArIDIuMCAqIHRoaXMuYngpICogdCArIHRoaXMuY3g7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZUN1cnZlWCA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICBpZiAodHlwZW9mIGVwc2lsb24gPT09ICd1bmRlZmluZWQnKSBlcHNpbG9uID0gMWUtNjtcblxuICAgIHZhciB0MCwgdDEsIHQyLCB4MiwgaTtcblxuICAgIC8vIEZpcnN0IHRyeSBhIGZldyBpdGVyYXRpb25zIG9mIE5ld3RvbidzIG1ldGhvZCAtLSBub3JtYWxseSB2ZXJ5IGZhc3QuXG4gICAgZm9yICh0MiA9IHgsIGkgPSAwOyBpIDwgODsgaSsrKSB7XG5cbiAgICAgICAgeDIgPSB0aGlzLnNhbXBsZUN1cnZlWCh0MikgLSB4O1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIpIDwgZXBzaWxvbikgcmV0dXJuIHQyO1xuXG4gICAgICAgIHZhciBkMiA9IHRoaXMuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWCh0Mik7XG4gICAgICAgIGlmIChNYXRoLmFicyhkMikgPCAxZS02KSBicmVhaztcblxuICAgICAgICB0MiA9IHQyIC0geDIgLyBkMjtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJpc2VjdGlvbiBtZXRob2QgZm9yIHJlbGlhYmlsaXR5LlxuICAgIHQwID0gMC4wO1xuICAgIHQxID0gMS4wO1xuICAgIHQyID0geDtcblxuICAgIGlmICh0MiA8IHQwKSByZXR1cm4gdDA7XG4gICAgaWYgKHQyID4gdDEpIHJldHVybiB0MTtcblxuICAgIHdoaWxlICh0MCA8IHQxKSB7XG5cbiAgICAgICAgeDIgPSB0aGlzLnNhbXBsZUN1cnZlWCh0Mik7XG4gICAgICAgIGlmIChNYXRoLmFicyh4MiAtIHgpIDwgZXBzaWxvbikgcmV0dXJuIHQyO1xuXG4gICAgICAgIGlmICh4ID4geDIpIHtcbiAgICAgICAgICAgIHQwID0gdDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0MSA9IHQyO1xuICAgICAgICB9XG5cbiAgICAgICAgdDIgPSAodDEgLSB0MCkgKiAwLjUgKyB0MDtcbiAgICB9XG5cbiAgICAvLyBGYWlsdXJlLlxuICAgIHJldHVybiB0Mjtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlID0gZnVuY3Rpb24oeCwgZXBzaWxvbikge1xuICAgIHJldHVybiB0aGlzLnNhbXBsZUN1cnZlWSh0aGlzLnNvbHZlQ3VydmVYKHgsIGVwc2lsb24pKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbi8qKlxuICogQSBzdGFuZGFsb25lIHBvaW50IGdlb21ldHJ5IHdpdGggdXNlZnVsIGFjY2Vzc29yLCBjb21wYXJpc29uLCBhbmRcbiAqIG1vZGlmaWNhdGlvbiBtZXRob2RzLlxuICpcbiAqIEBjbGFzcyBQb2ludFxuICogQHBhcmFtIHtOdW1iZXJ9IHggdGhlIHgtY29vcmRpbmF0ZS4gdGhpcyBjb3VsZCBiZSBsb25naXR1ZGUgb3Igc2NyZWVuXG4gKiBwaXhlbHMsIG9yIGFueSBvdGhlciBzb3J0IG9mIHVuaXQuXG4gKiBAcGFyYW0ge051bWJlcn0geSB0aGUgeS1jb29yZGluYXRlLiB0aGlzIGNvdWxkIGJlIGxhdGl0dWRlIG9yIHNjcmVlblxuICogcGl4ZWxzLCBvciBhbnkgb3RoZXIgc29ydCBvZiB1bml0LlxuICogQGV4YW1wbGVcbiAqIHZhciBwb2ludCA9IG5ldyBQb2ludCgtNzcsIDM4KTtcbiAqL1xuZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbn1cblxuUG9pbnQucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgdGhpcyBwb2ludCwgcmV0dXJuaW5nIGEgbmV3IHBvaW50IHRoYXQgY2FuIGJlIG1vZGlmaWVkXG4gICAgICogd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9sZCBvbmUuXG4gICAgICogQHJldHVybiB7UG9pbnR9IHRoZSBjbG9uZVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIHRvIGFub3RoZXIgcG9pbnQsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgYWRkOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQocCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgdG8gZnJvbSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBzdWI6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtdWx0QnlQb2ludDogICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgcG9pbnQsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgZGl2QnlQb2ludDogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2QnlQb2ludChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBhIGZhY3RvcixcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBrIGZhY3RvclxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtdWx0OiAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHQoayk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IGEgZmFjdG9yLFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IGsgZmFjdG9yXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIGRpdjogICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KGspOyB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHRoaXMgcG9pbnQgYXJvdW5kIHRoZSAwLCAwIG9yaWdpbiBieSBhbiBhbmdsZSBhLFxuICAgICAqIGdpdmVuIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYSBhbmdsZSB0byByb3RhdGUgYXJvdW5kLCBpbiByYWRpYW5zXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHJvdGF0ZTogIGZ1bmN0aW9uKGEpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGEpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHRoaXMgcG9pbnQgYXJvdW5kIHAgcG9pbnQgYnkgYW4gYW5nbGUgYSxcbiAgICAgKiBnaXZlbiBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGEgYW5nbGUgdG8gcm90YXRlIGFyb3VuZCwgaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgUG9pbnQgdG8gcm90YXRlIGFyb3VuZFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICByb3RhdGVBcm91bmQ6ICBmdW5jdGlvbihhLHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlQXJvdW5kKGEscCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0aGlzIHBvaW50IGJ5IGEgNHgxIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSB7QXJyYXk8TnVtYmVyPn0gbSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgbWF0TXVsdDogZnVuY3Rpb24obSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KG0pOyB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoaXMgcG9pbnQgYnV0IGFzIGEgdW5pdCB2ZWN0b3IgZnJvbSAwLCAwLCBtZWFuaW5nXG4gICAgICogdGhhdCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcmVzdWx0aW5nIHBvaW50IHRvIHRoZSAwLCAwXG4gICAgICogY29vcmRpbmF0ZSB3aWxsIGJlIGVxdWFsIHRvIDEgYW5kIHRoZSBhbmdsZSBmcm9tIHRoZSByZXN1bHRpbmdcbiAgICAgKiBwb2ludCB0byB0aGUgMCwgMCBjb29yZGluYXRlIHdpbGwgYmUgdGhlIHNhbWUgYXMgYmVmb3JlLlxuICAgICAqIEByZXR1cm4ge1BvaW50fSB1bml0IHZlY3RvciBwb2ludFxuICAgICAqL1xuICAgIHVuaXQ6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIGEgcGVycGVuZGljdWxhciBwb2ludCwgd2hlcmUgdGhlIG5ldyB5IGNvb3JkaW5hdGVcbiAgICAgKiBpcyB0aGUgb2xkIHggY29vcmRpbmF0ZSBhbmQgdGhlIG5ldyB4IGNvb3JkaW5hdGUgaXMgdGhlIG9sZCB5XG4gICAgICogY29vcmRpbmF0ZSBtdWx0aXBsaWVkIGJ5IC0xXG4gICAgICogQHJldHVybiB7UG9pbnR9IHBlcnBlbmRpY3VsYXIgcG9pbnRcbiAgICAgKi9cbiAgICBwZXJwOiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGlzIHBvaW50IHdpdGggdGhlIHggJiB5IGNvb3JkaW5hdGVzXG4gICAgICogcm91bmRlZCB0byBpbnRlZ2Vycy5cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcm91bmRlZCBwb2ludFxuICAgICAqL1xuICAgIHJvdW5kOiAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBtYWdpdHVkZSBvZiB0aGlzIHBvaW50OiB0aGlzIGlzIHRoZSBFdWNsaWRlYW5cbiAgICAgKiBkaXN0YW5jZSBmcm9tIHRoZSAwLCAwIGNvb3JkaW5hdGUgdG8gdGhpcyBwb2ludCdzIHggYW5kIHlcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IG1hZ25pdHVkZVxuICAgICAqL1xuICAgIG1hZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSnVkZ2Ugd2hldGhlciB0aGlzIHBvaW50IGlzIGVxdWFsIHRvIGFub3RoZXIgcG9pbnQsIHJldHVybmluZ1xuICAgICAqIHRydWUgb3IgZmFsc2UuXG4gICAgICogQHBhcmFtIHtQb2ludH0gb3RoZXIgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gd2hldGhlciB0aGUgcG9pbnRzIGFyZSBlcXVhbFxuICAgICAqL1xuICAgIGVxdWFsczogZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PT0gb3RoZXIueCAmJlxuICAgICAgICAgICAgICAgdGhpcy55ID09PSBvdGhlci55O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBwb2ludCB0byBhbm90aGVyIHBvaW50XG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAgICovXG4gICAgZGlzdDogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihwKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnQsXG4gICAgICogd2l0aG91dCB0aGUgc3F1YXJlIHJvb3Qgc3RlcC4gVXNlZnVsIGlmIHlvdSdyZSBjb21wYXJpbmdcbiAgICAgKiByZWxhdGl2ZSBkaXN0YW5jZXMuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAgICovXG4gICAgZGlzdFNxcjogZnVuY3Rpb24ocCkge1xuICAgICAgICB2YXIgZHggPSBwLnggLSB0aGlzLngsXG4gICAgICAgICAgICBkeSA9IHAueSAtIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFuZ2xlIGZyb20gdGhlIDAsIDAgY29vcmRpbmF0ZSB0byB0aGlzIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogY29vcmRpbmF0ZXMuXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgICAqL1xuICAgIGFuZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFuZ2xlIGZyb20gdGhpcyBwb2ludCB0byBhbm90aGVyIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gYiB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGVUbzogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnkgLSBiLnksIHRoaXMueCAtIGIueCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCBhbm90aGVyIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gYiB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGVXaXRoOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZ2xlV2l0aFNlcChiLngsIGIueSk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICogRmluZCB0aGUgYW5nbGUgb2YgdGhlIHR3byB2ZWN0b3JzLCBzb2x2aW5nIHRoZSBmb3JtdWxhIGZvclxuICAgICAqIHRoZSBjcm9zcyBwcm9kdWN0IGEgeCBiID0gfGF8fGJ8c2luKMOOwrgpIGZvciDDjsK4LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4IHRoZSB4LWNvb3JkaW5hdGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geSB0aGUgeS1jb29yZGluYXRlXG4gICAgICogQHJldHVybiB7TnVtYmVyfSB0aGUgYW5nbGUgaW4gcmFkaWFuc1xuICAgICAqL1xuICAgIGFuZ2xlV2l0aFNlcDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMihcbiAgICAgICAgICAgIHRoaXMueCAqIHkgLSB0aGlzLnkgKiB4LFxuICAgICAgICAgICAgdGhpcy54ICogeCArIHRoaXMueSAqIHkpO1xuICAgIH0sXG5cbiAgICBfbWF0TXVsdDogZnVuY3Rpb24obSkge1xuICAgICAgICB2YXIgeCA9IG1bMF0gKiB0aGlzLnggKyBtWzFdICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IG1bMl0gKiB0aGlzLnggKyBtWzNdICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2FkZDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKz0gcC54O1xuICAgICAgICB0aGlzLnkgKz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3N1YjogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLT0gcC54O1xuICAgICAgICB0aGlzLnkgLT0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54ICo9IGs7XG4gICAgICAgIHRoaXMueSAqPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdjogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggLz0gaztcbiAgICAgICAgdGhpcy55IC89IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdEJ5UG9pbnQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICo9IHAueDtcbiAgICAgICAgdGhpcy55ICo9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXZCeVBvaW50OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAvPSBwLng7XG4gICAgICAgIHRoaXMueSAvPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2Rpdih0aGlzLm1hZygpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9wZXJwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMueDtcbiAgICAgICAgdGhpcy54ID0gLXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlOiBmdW5jdGlvbihhbmdsZSkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IGNvcyAqIHRoaXMueCAtIHNpbiAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBzaW4gKiB0aGlzLnggKyBjb3MgKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlQXJvdW5kOiBmdW5jdGlvbihhbmdsZSwgcCkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IHAueCArIGNvcyAqICh0aGlzLnggLSBwLngpIC0gc2luICogKHRoaXMueSAtIHAueSksXG4gICAgICAgICAgICB5ID0gcC55ICsgc2luICogKHRoaXMueCAtIHAueCkgKyBjb3MgKiAodGhpcy55IC0gcC55KTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIHBvaW50IGZyb20gYW4gYXJyYXkgaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2UgaWYgdGhlIGlucHV0XG4gKiBpcyBhbHJlYWR5IGEgUG9pbnQsIG9yIGFuIHVua25vd24gdHlwZSwgcmV0dXJuIGl0IHVuY2hhbmdlZFxuICogQHBhcmFtIHtBcnJheTxOdW1iZXI+fFBvaW50fCp9IGEgYW55IGtpbmQgb2YgaW5wdXQgdmFsdWVcbiAqIEByZXR1cm4ge1BvaW50fSBjb25zdHJ1Y3RlZCBwb2ludCwgb3IgcGFzc2VkLXRocm91Z2ggdmFsdWUuXG4gKiBAZXhhbXBsZVxuICogLy8gdGhpc1xuICogdmFyIHBvaW50ID0gUG9pbnQuY29udmVydChbMCwgMV0pO1xuICogLy8gaXMgZXF1aXZhbGVudCB0b1xuICogdmFyIHBvaW50ID0gbmV3IFBvaW50KDAsIDEpO1xuICovXG5Qb2ludC5jb252ZXJ0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIFBvaW50KSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KGFbMF0sIGFbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbn07XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIERlZXBseSBjb21wYXJlcyB0d28gb2JqZWN0IGxpdGVyYWxzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbChhOiA/bWl4ZWQsIGI6ID9taXhlZCk6IGJvb2xlYW4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShiKSB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIGEgIT09IG51bGwgJiYgYiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoISh0eXBlb2YgYiA9PT0gJ29iamVjdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYSkge1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZWVwRXF1YWw7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVW5pdEJlemllciBmcm9tICdAbWFwYm94L3VuaXRiZXppZXInO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcblxuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5cbi8qKlxuICogQG1vZHVsZSB1dGlsXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogR2l2ZW4gYSB2YWx1ZSBgdGAgdGhhdCB2YXJpZXMgYmV0d2VlbiAwIGFuZCAxLCByZXR1cm5cbiAqIGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24gdGhhdCBlYXNlcyBiZXR3ZWVuIDAgYW5kIDEgaW4gYSBwbGVhc2luZ1xuICogY3ViaWMgaW4tb3V0IGZhc2hpb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVhc2VDdWJpY0luT3V0KHQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHQgPD0gMCkgcmV0dXJuIDA7XG4gICAgaWYgKHQgPj0gMSkgcmV0dXJuIDE7XG4gICAgY29uc3QgdDIgPSB0ICogdCxcbiAgICAgICAgdDMgPSB0MiAqIHQ7XG4gICAgcmV0dXJuIDQgKiAodCA8IDAuNSA/IHQzIDogMyAqICh0IC0gdDIpICsgdDMgLSAwLjc1KTtcbn1cblxuLyoqXG4gKiBHaXZlbiBnaXZlbiAoeCwgeSksICh4MSwgeTEpIGNvbnRyb2wgcG9pbnRzIGZvciBhIGJlemllciBjdXJ2ZSxcbiAqIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgaW50ZXJwb2xhdGVzIGFsb25nIHRoYXQgY3VydmUuXG4gKlxuICogQHBhcmFtIHAxeCBjb250cm9sIHBvaW50IDEgeCBjb29yZGluYXRlXG4gKiBAcGFyYW0gcDF5IGNvbnRyb2wgcG9pbnQgMSB5IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBwMnggY29udHJvbCBwb2ludCAyIHggY29vcmRpbmF0ZVxuICogQHBhcmFtIHAyeSBjb250cm9sIHBvaW50IDIgeSBjb29yZGluYXRlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyKHAxeDogbnVtYmVyLCBwMXk6IG51bWJlciwgcDJ4OiBudW1iZXIsIHAyeTogbnVtYmVyKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyIHtcbiAgICBjb25zdCBiZXppZXIgPSBuZXcgVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGJlemllci5zb2x2ZSh0KTtcbiAgICB9O1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBiZXppZXItY3VydmUgcG93ZXJlZCBlYXNpbmcgZnVuY3Rpb24gd2l0aFxuICogY29udHJvbCBwb2ludHMgKDAuMjUsIDAuMSkgYW5kICgwLjI1LCAxKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBlYXNlID0gYmV6aWVyKDAuMjUsIDAuMSwgMC4yNSwgMSk7XG5cbi8qKlxuICogY29uc3RyYWluIG4gdG8gdGhlIGdpdmVuIHJhbmdlIHZpYSBtaW4gKyBtYXhcbiAqXG4gKiBAcGFyYW0gbiB2YWx1ZVxuICogQHBhcmFtIG1pbiB0aGUgbWluaW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZFxuICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZFxuICogQHJldHVybnMgdGhlIGNsYW1wZWQgdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChuOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBuKSk7XG59XG5cbi8qKlxuICogY29uc3RyYWluIG4gdG8gdGhlIGdpdmVuIHJhbmdlLCBleGNsdWRpbmcgdGhlIG1pbmltdW0sIHZpYSBtb2R1bGFyIGFyaXRobWV0aWNcbiAqXG4gKiBAcGFyYW0gbiB2YWx1ZVxuICogQHBhcmFtIG1pbiB0aGUgbWluaW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZCwgZXhjbHVzaXZlXG4gKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkLCBpbmNsdXNpdmVcbiAqIEByZXR1cm5zIGNvbnN0cmFpbmVkIG51bWJlclxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXAobjogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGQgPSBtYXggLSBtaW47XG4gICAgY29uc3QgdyA9ICgobiAtIG1pbikgJSBkICsgZCkgJSBkICsgbWluO1xuICAgIHJldHVybiAodyA9PT0gbWluKSA/IG1heCA6IHc7XG59XG5cbi8qXG4gKiBDYWxsIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvbiBhbiBhcnJheSBvZiBhcmd1bWVudHMsXG4gKiBjYWxsaW5nIGBjYWxsYmFja2Agd2l0aCB0aGUgY29tcGxldGVkIHJlc3VsdHMgb2YgYWxsIGNhbGxzLlxuICpcbiAqIEBwYXJhbSBhcnJheSBpbnB1dCB0byBlYWNoIGNhbGwgb2YgdGhlIGFzeW5jIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZuIGFuIGFzeW5jIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlIChkYXRhLCBjYWxsYmFjaylcbiAqIEBwYXJhbSBjYWxsYmFjayBhIGNhbGxiYWNrIHJ1biBhZnRlciBhbGwgYXN5bmMgd29yayBpcyBkb25lLlxuICogY2FsbGVkIHdpdGggYW4gYXJyYXksIGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgb2YgZWFjaCBhc3luYyBjYWxsLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzeW5jQWxsPEl0ZW0sIFJlc3VsdD4oXG4gICAgYXJyYXk6IEFycmF5PEl0ZW0+LFxuICAgIGZuOiAoaXRlbTogSXRlbSwgZm5DYWxsYmFjazogQ2FsbGJhY2s8UmVzdWx0PikgPT4gdm9pZCxcbiAgICBjYWxsYmFjazogQ2FsbGJhY2s8QXJyYXk8UmVzdWx0Pj5cbikge1xuICAgIGlmICghYXJyYXkubGVuZ3RoKSB7IHJldHVybiBjYWxsYmFjayhudWxsLCBbXSk7IH1cbiAgICBsZXQgcmVtYWluaW5nID0gYXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXkoYXJyYXkubGVuZ3RoKTtcbiAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgIGFycmF5LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgZm4oaXRlbSwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIHJlc3VsdHNbaV0gPSAoKHJlc3VsdDogYW55KTogUmVzdWx0KTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzIxMjNcbiAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgY2FsbGJhY2soZXJyb3IsIHJlc3VsdHMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLypcbiAqIFBvbHlmaWxsIGZvciBPYmplY3QudmFsdWVzLiBOb3QgZnVsbHkgc3BlYyBjb21wbGlhbnQsIGJ1dCB3ZSBkb24ndFxuICogbmVlZCBpdCB0byBiZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzPFQ+KG9iajoge1trZXk6IHN0cmluZ106IFR9KTogQXJyYXk8VD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICAgICAgcmVzdWx0LnB1c2gob2JqW2tdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUga2V5cyBpbiBvbmUgb2JqZWN0IGFuZCB0aGUga2V5c1xuICogaW4gYW5vdGhlciBvYmplY3QuXG4gKlxuICogQHJldHVybnMga2V5cyBkaWZmZXJlbmNlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24ga2V5c0RpZmZlcmVuY2U8UywgVD4ob2JqOiB7W2tleTogc3RyaW5nXTogU30sIG90aGVyOiB7W2tleTogc3RyaW5nXTogVH0pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gW107XG4gICAgZm9yIChjb25zdCBpIGluIG9iaikge1xuICAgICAgICBpZiAoIShpIGluIG90aGVyKSkge1xuICAgICAgICAgICAgZGlmZmVyZW5jZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWZmZXJlbmNlO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgZGVzdGluYXRpb24gb2JqZWN0IGFuZCBvcHRpb25hbGx5IG1hbnkgc291cmNlIG9iamVjdHMsXG4gKiBjb3B5IGFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBvYmplY3RzIGludG8gdGhlIGRlc3RpbmF0aW9uLlxuICogVGhlIGxhc3Qgc291cmNlIG9iamVjdCBnaXZlbiBvdmVycmlkZXMgcHJvcGVydGllcyBmcm9tIHByZXZpb3VzXG4gKiBzb3VyY2Ugb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gZGVzdCBkZXN0aW5hdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBzb3VyY2VzIHNvdXJjZXMgZnJvbSB3aGljaCBwcm9wZXJ0aWVzIGFyZSBwdWxsZWRcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQoZGVzdDogT2JqZWN0LCAuLi5zb3VyY2VzOiBBcnJheTw/T2JqZWN0Pik6IE9iamVjdCB7XG4gICAgZm9yIChjb25zdCBzcmMgb2Ygc291cmNlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKSB7XG4gICAgICAgICAgICBkZXN0W2tdID0gc3JjW2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIG9iamVjdCBhbmQgYSBudW1iZXIgb2YgcHJvcGVydGllcyBhcyBzdHJpbmdzLCByZXR1cm4gdmVyc2lvblxuICogb2YgdGhhdCBvYmplY3Qgd2l0aCBvbmx5IHRob3NlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHNyYyB0aGUgb2JqZWN0XG4gKiBAcGFyYW0gcHJvcGVydGllcyBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBjaG9zZW5cbiAqIHRvIGFwcGVhciBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqIEByZXR1cm5zIG9iamVjdCB3aXRoIGxpbWl0ZWQgcHJvcGVydGllcy5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZm9vID0geyBuYW1lOiAnQ2hhcmxpZScsIGFnZTogMTAgfTtcbiAqIHZhciBqdXN0TmFtZSA9IHBpY2soZm9vLCBbJ25hbWUnXSk7XG4gKiAvLyBqdXN0TmFtZSA9IHsgbmFtZTogJ0NoYXJsaWUnIH1cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrKHNyYzogT2JqZWN0LCBwcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+KTogT2JqZWN0IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgayA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgIGlmIChrIGluIHNyYykge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gc3JjW2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmxldCBpZCA9IDE7XG5cbi8qKlxuICogUmV0dXJuIGEgdW5pcXVlIG51bWVyaWMgaWQsIHN0YXJ0aW5nIGF0IDEgYW5kIGluY3JlbWVudGluZyB3aXRoXG4gKiBlYWNoIGNhbGwuXG4gKlxuICogQHJldHVybnMgdW5pcXVlIG51bWVyaWMgaWQuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaWQrKztcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSByYW5kb20gVVVJRCAodjQpLiBUYWtlbiBmcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qZWQvOTgyODgzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZCgpOiBzdHJpbmcge1xuICAgIGZ1bmN0aW9uIGIoYSkge1xuICAgICAgICByZXR1cm4gYSA/IChhIF4gTWF0aC5yYW5kb20oKSAqIDE2ID4+IGEgLyA0KS50b1N0cmluZygxNikgOlxuICAgICAgICAvLyRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIHRoZSBpbXBsaWVkIGFycmF5IGxpdGVyYWwgY29udmVyc2lvbiBoZXJlXG4gICAgICAgICAgICAoWzFlN10gKyAtWzFlM10gKyAtNGUzICsgLThlMyArIC0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLCBiKTtcbiAgICB9XG4gICAgcmV0dXJuIGIoKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHN0cmluZyB0byBtYXRjaCBVVUlEKHY0KSBvZiB0aGVcbiAqIGZvcm06IHh4eHh4eHh4LXh4eHgtNHh4eC1bODlhYl14eHgteHh4eHh4eHh4eHh4XG4gKiBAcGFyYW0gc3RyIHN0cmluZyB0byB2YWxpZGF0ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVV1aWQoc3RyOiA/c3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0ciA/IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzRdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pLnRlc3Qoc3RyKSA6IGZhbHNlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lcyBhcyBzdHJpbmdzLCByZXBsYWNlIGFsbCBvZiB0aGVtXG4gKiB3aXRoIGJvdW5kIHZlcnNpb25zIHRoYXQgd2lsbCBhbHdheXMgcmVmZXIgdG8gYGNvbnRleHRgIGFzIGB0aGlzYC4gVGhpc1xuICogaXMgdXNlZnVsIGZvciBjbGFzc2VzIHdoZXJlIG90aGVyd2lzZSBldmVudCBiaW5kaW5ncyB3b3VsZCByZWFzc2lnblxuICogYHRoaXNgIHRvIHRoZSBldmVudGVkIG9iamVjdCBvciBzb21lIG90aGVyIHZhbHVlOiB0aGlzIGxldHMgeW91IGVuc3VyZVxuICogdGhlIGB0aGlzYCB2YWx1ZSBhbHdheXMuXG4gKlxuICogQHBhcmFtIGZucyBsaXN0IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lc1xuICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKiBmdW5jdGlvbiBNeUNsYXNzKCkge1xuICogICBiaW5kQWxsKFsnb250aW1lciddLCB0aGlzKTtcbiAqICAgdGhpcy5uYW1lID0gJ1RvbSc7XG4gKiB9XG4gKiBNeUNsYXNzLnByb3RvdHlwZS5vbnRpbWVyID0gZnVuY3Rpb24oKSB7XG4gKiAgIGFsZXJ0KHRoaXMubmFtZSk7XG4gKiB9O1xuICogdmFyIG15Q2xhc3MgPSBuZXcgTXlDbGFzcygpO1xuICogc2V0VGltZW91dChteUNsYXNzLm9udGltZXIsIDEwMCk7XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEFsbChmbnM6IEFycmF5PHN0cmluZz4sIGNvbnRleHQ6IE9iamVjdCk6IHZvaWQge1xuICAgIGZucy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgICBpZiAoIWNvbnRleHRbZm5dKSB7IHJldHVybjsgfVxuICAgICAgICBjb250ZXh0W2ZuXSA9IGNvbnRleHRbZm5dLmJpbmQoY29udGV4dCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgc3RyaW5nIGVuZHMgd2l0aCBhIHBhcnRpY3VsYXIgc3Vic3RyaW5nXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZzogc3RyaW5nLCBzdWZmaXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdHJpbmcuaW5kZXhPZihzdWZmaXgsIHN0cmluZy5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSAhPT0gLTE7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9iamVjdCBieSBtYXBwaW5nIGFsbCB0aGUgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIG9iamVjdCB3aGlsZVxuICogcHJlc2VydmluZyB0aGVpciBrZXlzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBPYmplY3QoaW5wdXQ6IE9iamVjdCwgaXRlcmF0b3I6IEZ1bmN0aW9uLCBjb250ZXh0PzogT2JqZWN0KTogT2JqZWN0IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuICAgICAgICBvdXRwdXRba2V5XSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCB0aGlzLCBpbnB1dFtrZXldLCBrZXksIGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IGJ5IGZpbHRlcmluZyBvdXQgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyT2JqZWN0KGlucHV0OiBPYmplY3QsIGl0ZXJhdG9yOiBGdW5jdGlvbiwgY29udGV4dD86IE9iamVjdCk6IE9iamVjdCB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCB0aGlzLCBpbnB1dFtrZXldLCBrZXksIGlucHV0KSkge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBpbnB1dFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG5cbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2RlZXBfZXF1YWwnO1xuZXhwb3J0IHsgZGVlcEVxdWFsIH07XG5cbi8qKlxuICogRGVlcGx5IGNsb25lcyB0d28gb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmU8VD4oaW5wdXQ6IFQpOiBUIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0Lm1hcChjbG9uZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoKG1hcE9iamVjdChpbnB1dCwgY2xvbmUpOiBhbnkpOiBUKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHR3byBhcnJheXMgaGF2ZSBhdCBsZWFzdCBvbmUgY29tbW9uIGVsZW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0ludGVyc2VjdDxUPihhOiBBcnJheTxUPiwgYjogQXJyYXk8VD4pOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBsID0gMDsgbCA8IGEubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgaWYgKGIuaW5kZXhPZihhW2xdKSA+PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFByaW50IGEgd2FybmluZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIGFuZCBlbnN1cmUgZHVwbGljYXRlIHdhcm5pbmcgbWVzc2FnZXNcbiAqIGFyZSBub3QgcHJpbnRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB3YXJuT25jZUhpc3Rvcnk6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gd2Fybk9uY2UobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF3YXJuT25jZUhpc3RvcnlbbWVzc2FnZV0pIHtcbiAgICAgICAgLy8gY29uc29sZSBpc24ndCBkZWZpbmVkIGluIHNvbWUgV2ViV29ya2Vycywgc2VlICMyNTU4XG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICB3YXJuT25jZUhpc3RvcnlbbWVzc2FnZV0gPSB0cnVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgaWYgdGhlIHByb3ZpZGVkIFBvaW50cyBhcmUgaW4gYSBjb3VudGVyIGNsb2Nrd2lzZSAodHJ1ZSkgb3IgY2xvY2t3aXNlIChmYWxzZSkgb3JkZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMgdHJ1ZSBmb3IgYSBjb3VudGVyIGNsb2Nrd2lzZSBzZXQgb2YgcG9pbnRzXG4gKi9cbi8vIGh0dHA6Ly9icnljZWJvZS5jb20vMjAwNi8xMC8yMy9saW5lLXNlZ21lbnQtaW50ZXJzZWN0aW9uLWFsZ29yaXRobS9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvdW50ZXJDbG9ja3dpc2UoYTogUG9pbnQsIGI6IFBvaW50LCBjOiBQb2ludCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoYy55IC0gYS55KSAqIChiLnggLSBhLngpID4gKGIueSAtIGEueSkgKiAoYy54IC0gYS54KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaWduZWQgYXJlYSBmb3IgdGhlIHBvbHlnb24gcmluZy4gIFBvc3RpdmUgYXJlYXMgYXJlIGV4dGVyaW9yIHJpbmdzIGFuZFxuICogaGF2ZSBhIGNsb2Nrd2lzZSB3aW5kaW5nLiAgTmVnYXRpdmUgYXJlYXMgYXJlIGludGVyaW9yIHJpbmdzIGFuZCBoYXZlIGEgY291bnRlciBjbG9ja3dpc2VcbiAqIG9yZGVyaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gcmluZyBFeHRlcmlvciBvciBpbnRlcmlvciByaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaWduZWRBcmVhKHJpbmc6IEFycmF5PFBvaW50Pik6IG51bWJlciB7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMSwgcDEsIHAyOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgcDIgPSByaW5nW2pdO1xuICAgICAgICBzdW0gKz0gKHAyLnggLSBwMS54KSAqIChwMS55ICsgcDIueSk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbi8qKlxuICogRGV0ZWN0cyBjbG9zZWQgcG9seWdvbnMsIGZpcnN0ICsgbGFzdCBwb2ludCBhcmUgZXF1YWxcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHBvaW50cyBhcnJheSBvZiBwb2ludHNcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcG9pbnRzIGFyZSBhIGNsb3NlZCBwb2x5Z29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Nsb3NlZFBvbHlnb24ocG9pbnRzOiBBcnJheTxQb2ludD4pOiBib29sZWFuIHtcbiAgICAvLyBJZiBpdCBpcyAyIHBvaW50cyB0aGF0IGFyZSB0aGUgc2FtZSB0aGVuIGl0IGlzIGEgcG9pbnRcbiAgICAvLyBJZiBpdCBpcyAzIHBvaW50cyB3aXRoIHN0YXJ0IGFuZCBlbmQgdGhlIHNhbWUgdGhlbiBpdCBpcyBhIGxpbmVcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHAxID0gcG9pbnRzWzBdO1xuICAgIGNvbnN0IHAyID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcblxuICAgIGlmIChNYXRoLmFicyhwMS54IC0gcDIueCkgPiAwIHx8XG4gICAgICAgIE1hdGguYWJzKHAxLnkgLSBwMi55KSA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHBvbHlnb24gc2ltcGxpZmljYXRpb24gY2FuIHByb2R1Y2UgcG9seWdvbnMgd2l0aCB6ZXJvIGFyZWEgYW5kIG1vcmUgdGhhbiAzIHBvaW50c1xuICAgIHJldHVybiBNYXRoLmFicyhjYWxjdWxhdGVTaWduZWRBcmVhKHBvaW50cykpID4gMC4wMTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBzcGhlcmljYWwgY29vcmRpbmF0ZXMgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc3BoZXJpY2FsIFNwaGVyaWNhbCBjb29yZGluYXRlcywgaW4gW3JhZGlhbCwgYXppbXV0aGFsLCBwb2xhcl1cbiAqIEByZXR1cm4gY2FydGVzaWFuIGNvb3JkaW5hdGVzIGluIFt4LCB5LCB6XVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcGhlcmljYWxUb0NhcnRlc2lhbihbciwgYXppbXV0aGFsLCBwb2xhcl06IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSB7XG4gICAgLy8gV2UgYWJzdHJhY3QgXCJub3J0aFwiL1widXBcIiAoY29tcGFzcy13aXNlKSB0byBiZSAww4LCsCB3aGVuIHJlYWxseSB0aGlzIGlzIDkww4LCsCAow4/CgC8yKTpcbiAgICAvLyBjb3JyZWN0IGZvciB0aGF0IGhlcmVcbiAgICBhemltdXRoYWwgKz0gOTA7XG5cbiAgICAvLyBDb252ZXJ0IGF6aW11dGhhbCBhbmQgcG9sYXIgYW5nbGVzIHRvIHJhZGlhbnNcbiAgICBhemltdXRoYWwgKj0gTWF0aC5QSSAvIDE4MDtcbiAgICBwb2xhciAqPSBNYXRoLlBJIC8gMTgwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogciAqIE1hdGguY29zKGF6aW11dGhhbCkgKiBNYXRoLnNpbihwb2xhciksXG4gICAgICAgIHk6IHIgKiBNYXRoLnNpbihhemltdXRoYWwpICogTWF0aC5zaW4ocG9sYXIpLFxuICAgICAgICB6OiByICogTWF0aC5jb3MocG9sYXIpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgZGF0YSBmcm9tICdDYWNoZS1Db250cm9sJyBoZWFkZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gY2FjaGVDb250cm9sIFZhbHVlIG9mICdDYWNoZS1Db250cm9sJyBoZWFkZXJcbiAqIEByZXR1cm4gb2JqZWN0IGNvbnRhaW5pbmcgcGFyc2VkIGhlYWRlciBpbmZvLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNhY2hlQ29udHJvbChjYWNoZUNvbnRyb2w6IHN0cmluZyk6IE9iamVjdCB7XG4gICAgLy8gVGFrZW4gZnJvbSBbV3JlY2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9oYXBpanMvd3JlY2spXG4gICAgY29uc3QgcmUgPSAvKD86XnwoPzpcXHMqXFwsXFxzKikpKFteXFx4MDAtXFx4MjBcXChcXCk8PkBcXCw7XFw6XFxcXFwiXFwvXFxbXFxdXFw/XFw9XFx7XFx9XFx4N0ZdKykoPzpcXD0oPzooW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKXwoPzpcXFwiKCg/OlteXCJcXFxcXXxcXFxcLikqKVxcXCIpKSk/L2c7XG5cbiAgICBjb25zdCBoZWFkZXIgPSB7fTtcbiAgICBjYWNoZUNvbnRyb2wucmVwbGFjZShyZSwgKCQwLCAkMSwgJDIsICQzKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gJDIgfHwgJDM7XG4gICAgICAgIGhlYWRlclskMV0gPSB2YWx1ZSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB0cnVlO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG5cbiAgICBpZiAoaGVhZGVyWydtYXgtYWdlJ10pIHtcbiAgICAgICAgY29uc3QgbWF4QWdlID0gcGFyc2VJbnQoaGVhZGVyWydtYXgtYWdlJ10sIDEwKTtcbiAgICAgICAgaWYgKGlzTmFOKG1heEFnZSkpIGRlbGV0ZSBoZWFkZXJbJ21heC1hZ2UnXTtcbiAgICAgICAgZWxzZSBoZWFkZXJbJ21heC1hZ2UnXSA9IG1heEFnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RvcmFnZUF2YWlsYWJsZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gd2luZG93W3R5cGVdO1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oJ19tYXBib3hfdGVzdF8nLCAxKTtcbiAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKCdfbWFwYm94X3Rlc3RfJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3dCYXNlNjQvQmFzZTY0X2VuY29kaW5nX2FuZF9kZWNvZGluZyNUaGVfVW5pY29kZV9Qcm9ibGVtXG4vL1VuaWNvZGUgY29tcGxpYW50IGJhc2U2NCBlbmNvZGVyIGZvciBzdHJpbmdzXG5leHBvcnQgZnVuY3Rpb24gYjY0RW5jb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiB3aW5kb3cuYnRvYShcbiAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZyxcbiAgICAgICAgICAgIChtYXRjaCwgcDEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShOdW1iZXIoJzB4JyArIHAxKSk7IC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgfVxuICAgICAgICApXG4gICAgKTtcbn1cblxuLy8gVW5pY29kZSBjb21wbGlhbnQgZGVjb2RlciBmb3IgYmFzZTY0LWVuY29kZWQgc3RyaW5nc1xuZXhwb3J0IGZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5hdG9iKHN0cikuc3BsaXQoJycpLm1hcCgoYykgPT4ge1xuICAgICAgICByZXR1cm4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7IC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgIH0pLmpvaW4oJycpKTtcbn1cbiIsIi8vIEBmbG93IHN0cmljdFxuXG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcbmltcG9ydCB0eXBlIHsgQ2FuY2VsYWJsZSB9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuXG5jb25zdCBub3cgPSB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA/XG4gICAgd2luZG93LnBlcmZvcm1hbmNlLm5vdy5iaW5kKHdpbmRvdy5wZXJmb3JtYW5jZSkgOlxuICAgIERhdGUubm93LmJpbmQoRGF0ZSk7XG5cbmNvbnN0IHJhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuY29uc3QgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cbmxldCBsaW5rRWw7XG5cbmxldCByZWR1Y2VkTW90aW9uUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGV4cG9ydGVkID0ge1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgZnVuY3Rpb24gdGhhdCBvdXRwdXRzIG1pbGxpc2Vjb25kczogZWl0aGVyIHBlcmZvcm1hbmNlLm5vdygpXG4gICAgICogb3IgYSBmYWxsYmFjayB0byBEYXRlLm5vdygpXG4gICAgICovXG4gICAgbm93LFxuXG4gICAgZnJhbWUoZm46ICgpID0+IHZvaWQpOiBDYW5jZWxhYmxlIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSByYWYoZm4pO1xuICAgICAgICByZXR1cm4geyBjYW5jZWw6ICgpID0+IGNhbmNlbChmcmFtZSkgfTtcbiAgICB9LFxuXG4gICAgZ2V0SW1hZ2VEYXRhKGltZzogQ2FudmFzSW1hZ2VTb3VyY2UpOiBJbWFnZURhdGEge1xuICAgICAgICBjb25zdCBjYW52YXMgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBjcmVhdGUgY2FudmFzIDJkIGNvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlVVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIWxpbmtFbCkgbGlua0VsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGlua0VsLmhyZWYgPSBwYXRoO1xuICAgICAgICByZXR1cm4gbGlua0VsLmhyZWY7XG4gICAgfSxcblxuICAgIGhhcmR3YXJlQ29uY3VycmVuY3k6IHdpbmRvdy5uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSB8fCA0LFxuXG4gICAgZ2V0IGRldmljZVBpeGVsUmF0aW8oKSB7IHJldHVybiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzsgfSxcbiAgICBnZXQgcHJlZmVyc1JlZHVjZWRNb3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghd2luZG93Lm1hdGNoTWVkaWEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy9MYXppbHkgaW5pdGlhbGl6ZSBtZWRpYSBxdWVyeVxuICAgICAgICBpZiAocmVkdWNlZE1vdGlvblF1ZXJ5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJlZHVjZWRNb3Rpb25RdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWR1Y2VkTW90aW9uUXVlcnkubWF0Y2hlcztcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZXhwb3J0ZWQ7XG4iLCIvLyBAZmxvdyBzdHJpY3RcblxudHlwZSBDb25maWcgPSB7fFxuICBBUElfVVJMOiBzdHJpbmcsXG4gIEVWRU5UU19VUkw6ID9zdHJpbmcsXG4gIEZFRURCQUNLX1VSTDogc3RyaW5nLFxuICBSRVFVSVJFX0FDQ0VTU19UT0tFTjogYm9vbGVhbixcbiAgQUNDRVNTX1RPS0VOOiA/c3RyaW5nLFxuICBNQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM6IG51bWJlclxufH07XG5cbmNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgIEFQSV9VUkw6ICdodHRwczovL2FwaS5tYXBib3guY29tJyxcbiAgICBnZXQgRVZFTlRTX1VSTCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLkFQSV9VUkwpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgaWYgKHRoaXMuQVBJX1VSTC5pbmRleE9mKCdodHRwczovL2FwaS5tYXBib3guY24nKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICdodHRwczovL2V2ZW50cy5tYXBib3guY24vZXZlbnRzL3YyJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLkFQSV9VUkwuaW5kZXhPZignaHR0cHM6Ly9hcGkubWFwYm94LmNvbScpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2h0dHBzOi8vZXZlbnRzLm1hcGJveC5jb20vZXZlbnRzL3YyJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBGRUVEQkFDS19VUkw6ICdodHRwczovL2FwcHMubWFwYm94LmNvbS9mZWVkYmFjaycsXG4gICAgUkVRVUlSRV9BQ0NFU1NfVE9LRU46IHRydWUsXG4gICAgQUNDRVNTX1RPS0VOOiBudWxsLFxuICAgIE1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUzogMTZcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZztcbiIsIi8vIEBmbG93IHN0cmljdFxuXG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcblxuY29uc3QgZXhwb3J0ZWQgPSB7XG4gICAgc3VwcG9ydGVkOiBmYWxzZSxcbiAgICB0ZXN0U3VwcG9ydFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZXhwb3J0ZWQ7XG5cbmxldCBnbEZvclRlc3Rpbmc7XG5sZXQgd2VicENoZWNrQ29tcGxldGUgPSBmYWxzZTtcbmxldCB3ZWJwSW1nVGVzdDtcbmxldCB3ZWJwSW1nVGVzdE9ubG9hZENvbXBsZXRlID0gZmFsc2U7XG5cbmlmICh3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICB3ZWJwSW1nVGVzdCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICB3ZWJwSW1nVGVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGdsRm9yVGVzdGluZykgdGVzdFdlYnBUZXh0dXJlVXBsb2FkKGdsRm9yVGVzdGluZyk7XG4gICAgICAgIGdsRm9yVGVzdGluZyA9IG51bGw7XG4gICAgICAgIHdlYnBJbWdUZXN0T25sb2FkQ29tcGxldGUgPSB0cnVlO1xuICAgIH07XG4gICAgd2VicEltZ1Rlc3Qub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3ZWJwQ2hlY2tDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgIGdsRm9yVGVzdGluZyA9IG51bGw7XG4gICAgfTtcbiAgICB3ZWJwSW1nVGVzdC5zcmMgPSAnZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmg0QUFBQlhSVUpRVmxBNFRCRUFBQUF2QVFBQUFBZlEvLzczdi8rQmlPaC9BQUE9Jztcbn1cblxuZnVuY3Rpb24gdGVzdFN1cHBvcnQoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICAgIGlmICh3ZWJwQ2hlY2tDb21wbGV0ZSB8fCAhd2VicEltZ1Rlc3QpIHJldHVybjtcblxuICAgIC8vIEhUTUxJbWFnZUVsZW1lbnQuY29tcGxldGUgaXMgc2V0IHdoZW4gYW4gaW1hZ2UgaXMgZG9uZSBsb2FkaW5nIGl0J3Mgc291cmNlXG4gICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBsb2FkIHdhcyBzdWNjZXNzZnVsIG9yIG5vdC5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIGZvciBhbiBlcnJvciB0byBzZXQgSFRNTEltYWdlRWxlbWVudC5jb21wbGV0ZSB0byB0cnVlIHdoaWNoIHdvdWxkIHRyaWdnZXJcbiAgICAvLyB0ZXN0V2VicFRleHR1cmVVcGxvYWQgYW5kIG1pc3Rha2VubHkgc2V0IGV4cG9ydGVkLnN1cHBvcnRlZCB0byB0cnVlIGluIGJyb3dzZXJzIHdoaWNoIGRvbid0IHN1cHBvcnQgd2VicFxuICAgIC8vIFRvIGF2b2lkIHRoaXMsIHdlIHNldCBhIGZsYWcgaW4gdGhlIGltYWdlJ3Mgb25sb2FkIGhhbmRsZXIgYW5kIG9ubHkgY2FsbCB0ZXN0V2VicFRleHR1cmVVcGxvYWRcbiAgICAvLyBhZnRlciBhIHN1Y2Nlc3NmdWwgaW1hZ2UgbG9hZCBldmVudC5cbiAgICBpZiAod2VicEltZ1Rlc3RPbmxvYWRDb21wbGV0ZSkge1xuICAgICAgICB0ZXN0V2VicFRleHR1cmVVcGxvYWQoZ2wpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGdsRm9yVGVzdGluZyA9IGdsO1xuXG4gICAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0V2VicFRleHR1cmVVcGxvYWQoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICAgIC8vIEVkZ2UgMTggc3VwcG9ydHMgV2ViUCBidXQgbm90IHVwbG9hZGluZyBhIFdlYlAgaW1hZ2UgdG8gYSBnbCB0ZXh0dXJlXG4gICAgLy8gVGVzdCBzdXBwb3J0IGZvciB0aGlzIGJlZm9yZSBhbGxvd2luZyBXZWJQIGltYWdlcy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNzY3MVxuICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG5cbiAgICB0cnkge1xuICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHdlYnBJbWdUZXN0KTtcblxuICAgICAgICAvLyBUaGUgZXJyb3IgZG9lcyBub3QgZ2V0IHRyaWdnZXJlZCBpbiBFZGdlIGlmIHRoZSBjb250ZXh0IGlzIGxvc3RcbiAgICAgICAgaWYgKGdsLmlzQ29udGV4dExvc3QoKSkgcmV0dXJuO1xuXG4gICAgICAgIGV4cG9ydGVkLnN1cHBvcnRlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBDYXRjaCBcIlVuc3BlY2lmaWVkIEVycm9yLlwiIGluIEVkZ2UgMTguXG4gICAgfVxuXG4gICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTtcblxuICAgIHdlYnBDaGVja0NvbXBsZXRlID0gdHJ1ZTtcbn1cbiIsIi8vIEBmbG93XG5cbi8qKioqKiBTVEFSVCBXQVJOSU5HIC0gSUYgWU9VIFVTRSBUSElTIENPREUgV0lUSCBNQVBCT1ggTUFQUElORyBBUElTLCBSRU1PVkFMIE9SXG4qIE1PRElGSUNBVElPTiBPRiBUSEUgRk9MTE9XSU5HIENPREUgVklPTEFURVMgVEhFIE1BUEJPWCBURVJNUyBPRiBTRVJWSUNFICAqKioqKipcbiogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQgdG8gYWNjZXNzIE1hcGJveCdzIE1hcHBpbmcgQVBJcy4gUmVtb3ZhbCBvciBtb2RpZmljYXRpb25cbiogb2YgdGhpcyBjb2RlIHdoZW4gdXNlZCB3aXRoIE1hcGJveCdzIE1hcHBpbmcgQVBJcyBjYW4gcmVzdWx0IGluIGhpZ2hlciBmZWVzIGFuZC9vclxuKiB0ZXJtaW5hdGlvbiBvZiB5b3VyIGFjY291bnQgd2l0aCBNYXBib3guXG4qXG4qIFVuZGVyIHRoZSBNYXBib3ggVGVybXMgb2YgU2VydmljZSwgeW91IG1heSBub3QgdXNlIHRoaXMgY29kZSB0byBhY2Nlc3MgTWFwYm94XG4qIE1hcHBpbmcgQVBJcyBvdGhlciB0aGFuIHRocm91Z2ggTWFwYm94IFNES3MuXG4qXG4qIFRoZSBNYXBwaW5nIEFQSXMgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vYXBpL21hcHMvI21hcHNcbiogYW5kIHRoZSBNYXBib3ggVGVybXMgb2YgU2VydmljZSBhcmUgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vdG9zL1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG50eXBlIFNrdVRva2VuT2JqZWN0ID0ge3xcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIHRva2VuRXhwaXJlc0F0OiBudW1iZXJcbnx9O1xuXG5jb25zdCBTS1VfSUQgPSAnMDEnO1xuXG5mdW5jdGlvbiBjcmVhdGVTa3VUb2tlbigpOiBTa3VUb2tlbk9iamVjdCB7XG4gICAgLy8gU0tVX0lEIGFuZCBUT0tFTl9WRVJTSU9OIGFyZSBzcGVjaWZpZWQgYnkgYW4gaW50ZXJuYWwgc2NoZW1hIGFuZCBzaG91bGQgbm90IGNoYW5nZVxuICAgIGNvbnN0IFRPS0VOX1ZFUlNJT04gPSAnMSc7XG4gICAgY29uc3QgYmFzZTYyY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonO1xuICAgIC8vIHNlc3Npb25SYW5kb21pemVyIGlzIGEgcmFuZG9taXplZCAxMC1kaWdpdCBiYXNlLTYyIG51bWJlclxuICAgIGxldCBzZXNzaW9uUmFuZG9taXplciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBzZXNzaW9uUmFuZG9taXplciArPSBiYXNlNjJjaGFyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA2MildO1xuICAgIH1cbiAgICBjb25zdCBleHBpcmF0aW9uID0gMTIgKiA2MCAqIDYwICogMTAwMDsgLy8gMTIgaG91cnNcbiAgICBjb25zdCB0b2tlbiA9IFtUT0tFTl9WRVJTSU9OLCBTS1VfSUQsIHNlc3Npb25SYW5kb21pemVyXS5qb2luKCcnKTtcbiAgICBjb25zdCB0b2tlbkV4cGlyZXNBdCA9IERhdGUubm93KCkgKyBleHBpcmF0aW9uO1xuXG4gICAgcmV0dXJuIHsgdG9rZW4sIHRva2VuRXhwaXJlc0F0IH07XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVNrdVRva2VuLCBTS1VfSUQgfTtcblxuLyoqKioqIEVORCBXQVJOSU5HIC0gUkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhFXG5QUkVDRURJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKi9cbiIsIi8vIEBmbG93XG5cbi8qKioqKiBTVEFSVCBXQVJOSU5HIC0gSUYgWU9VIFVTRSBUSElTIENPREUgV0lUSCBNQVBCT1ggTUFQUElORyBBUElTLCBSRU1PVkFMIE9SXG4qIE1PRElGSUNBVElPTiBPRiBUSEUgRk9MTE9XSU5HIENPREUgVklPTEFURVMgVEhFIE1BUEJPWCBURVJNUyBPRiBTRVJWSUNFICAqKioqKipcbiogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQgdG8gYWNjZXNzIE1hcGJveCdzIE1hcHBpbmcgQVBJcy4gUmVtb3ZhbCBvciBtb2RpZmljYXRpb25cbiogb2YgdGhpcyBjb2RlIHdoZW4gdXNlZCB3aXRoIE1hcGJveCdzIE1hcHBpbmcgQVBJcyBjYW4gcmVzdWx0IGluIGhpZ2hlciBmZWVzIGFuZC9vclxuKiB0ZXJtaW5hdGlvbiBvZiB5b3VyIGFjY291bnQgd2l0aCBNYXBib3guXG4qXG4qIFVuZGVyIHRoZSBNYXBib3ggVGVybXMgb2YgU2VydmljZSwgeW91IG1heSBub3QgdXNlIHRoaXMgY29kZSB0byBhY2Nlc3MgTWFwYm94XG4qIE1hcHBpbmcgQVBJcyBvdGhlciB0aGFuIHRocm91Z2ggTWFwYm94IFNES3MuXG4qXG4qIFRoZSBNYXBwaW5nIEFQSXMgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vYXBpL21hcHMvI21hcHNcbiogYW5kIHRoZSBNYXBib3ggVGVybXMgb2YgU2VydmljZSBhcmUgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vdG9zL1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcblxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi9icm93c2VyJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuaW1wb3J0IHdlYnBTdXBwb3J0ZWQgZnJvbSAnLi93ZWJwX3N1cHBvcnRlZCc7XG5pbXBvcnQgeyBjcmVhdGVTa3VUb2tlbiwgU0tVX0lEIH0gZnJvbSAnLi9za3VfdG9rZW4nO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyBzZGtWZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7IHV1aWQsIHZhbGlkYXRlVXVpZCwgc3RvcmFnZUF2YWlsYWJsZSwgYjY0RGVjb2RlVW5pY29kZSwgYjY0RW5jb2RlVW5pY29kZSwgd2Fybk9uY2UsIGV4dGVuZCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBwb3N0RGF0YSwgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi9hamF4JztcblxuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0UGFyYW1ldGVycyB9IGZyb20gJy4vYWpheCc7XG5pbXBvcnQgdHlwZSB7IENhbmNlbGFibGUgfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcbmltcG9ydCB0eXBlIHsgVGlsZUpTT04gfSBmcm9tICcuLi90eXBlcy90aWxlanNvbic7XG5cbnR5cGUgUmVzb3VyY2VUeXBlRW51bSA9ICRLZXlzPHR5cGVvZiBSZXNvdXJjZVR5cGU+O1xuZXhwb3J0IHR5cGUgUmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uID0gKHVybDogc3RyaW5nLCByZXNvdXJjZVR5cGU/OiBSZXNvdXJjZVR5cGVFbnVtKSA9PiBSZXF1ZXN0UGFyYW1ldGVycztcblxudHlwZSBVcmxPYmplY3QgPSB7fFxuICAgIHByb3RvY29sOiBzdHJpbmcsXG4gICAgYXV0aG9yaXR5OiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHBhcmFtczogQXJyYXk8c3RyaW5nPlxufH07XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0TWFuYWdlciB7XG4gICAgX3NrdVRva2VuOiBzdHJpbmc7XG4gICAgX3NrdVRva2VuRXhwaXJlc0F0OiBudW1iZXI7XG4gICAgX3RyYW5zZm9ybVJlcXVlc3RGbjogP1JlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbjtcbiAgICBfY3VzdG9tQWNjZXNzVG9rZW46ID9zdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc2Zvcm1SZXF1ZXN0Rm4/OiBSZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb24sIGN1c3RvbUFjY2Vzc1Rva2VuPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbiA9IHRyYW5zZm9ybVJlcXVlc3RGbjtcbiAgICAgICAgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gPSBjdXN0b21BY2Nlc3NUb2tlbjtcbiAgICAgICAgdGhpcy5fY3JlYXRlU2t1VG9rZW4oKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlU2t1VG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHNrdVRva2VuID0gY3JlYXRlU2t1VG9rZW4oKTtcbiAgICAgICAgdGhpcy5fc2t1VG9rZW4gPSBza3VUb2tlbi50b2tlbjtcbiAgICAgICAgdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQgPSBza3VUb2tlbi50b2tlbkV4cGlyZXNBdDtcbiAgICB9XG5cbiAgICBfaXNTa3VUb2tlbkV4cGlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpID4gdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQ7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtUmVxdWVzdCh1cmw6IHN0cmluZywgdHlwZTogUmVzb3VyY2VUeXBlRW51bSkge1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKHVybCwgdHlwZSkgfHwge3VybH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3VybH07XG4gICAgfVxuXG4gICAgbm9ybWFsaXplU3R5bGVVUkwodXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvc3R5bGVzL3YxJHt1cmxPYmplY3QucGF0aH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUFQSVVSTCh1cmxPYmplY3QsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGFjY2Vzc1Rva2VuKTtcbiAgICB9XG5cbiAgICBub3JtYWxpemVHbHlwaHNVUkwodXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvZm9udHMvdjEke3VybE9iamVjdC5wYXRofWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlQVBJVVJMKHVybE9iamVjdCwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4pO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZVNvdXJjZVVSTCh1cmw6IHN0cmluZywgYWNjZXNzVG9rZW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XG4gICAgICAgIHVybE9iamVjdC5wYXRoID0gYC92NC8ke3VybE9iamVjdC5hdXRob3JpdHl9Lmpzb25gO1xuICAgICAgICAvLyBUaWxlSlNPTiByZXF1ZXN0cyBuZWVkIGEgc2VjdXJlIGZsYWcgYXBwZW5kZWQgdG8gdGhlaXIgVVJMcyBzb1xuICAgICAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIga25vd3MgdG8gc2VuZCBTU0wtaWZpZWQgcmVzb3VyY2UgcmVmZXJlbmNlcy5cbiAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VBUElVUkwodXJsT2JqZWN0LCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbik7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplU3ByaXRlVVJMKHVybDogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSB7XG4gICAgICAgICAgICB1cmxPYmplY3QucGF0aCArPSBgJHtmb3JtYXR9JHtleHRlbnNpb259YDtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRVcmwodXJsT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvc3R5bGVzL3YxJHt1cmxPYmplY3QucGF0aH0vc3ByaXRlJHtmb3JtYXR9JHtleHRlbnNpb259YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VBUElVUkwodXJsT2JqZWN0LCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbik7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplVGlsZVVSTCh0aWxlVVJMOiBzdHJpbmcsIHNvdXJjZVVSTD86ID9zdHJpbmcsIHRpbGVTaXplPzogP251bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NrdVRva2VuRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVTa3VUb2tlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzb3VyY2VVUkwgfHwgIWlzTWFwYm94VVJMKHNvdXJjZVVSTCkpIHJldHVybiB0aWxlVVJMO1xuXG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHRpbGVVUkwpO1xuICAgICAgICBjb25zdCBpbWFnZUV4dGVuc2lvblJlID0gLyhcXC4ocG5nfGpwZylcXGQqKSg/PSQpLztcbiAgICAgICAgY29uc3QgdGlsZVVSTEFQSVByZWZpeFJlID0gL14uK1xcL3Y0XFwvLztcblxuICAgICAgICAvLyBUaGUgdjQgbWFwYm94IHRpbGUgQVBJIHN1cHBvcnRzIDUxMng1MTIgaW1hZ2UgdGlsZXMgb25seSB3aGVuIEAyeFxuICAgICAgICAvLyBpcyBhcHBlbmRlZCB0byB0aGUgdGlsZSBVUkwuIElmIGB0aWxlU2l6ZTogNTEyYCBpcyBzcGVjaWZpZWQgZm9yXG4gICAgICAgIC8vIGEgTWFwYm94IHJhc3RlciBzb3VyY2UgZm9yY2UgdGhlIEAyeCBzdWZmaXggZXZlbiBpZiBhIG5vbiBoaWRwaSBkZXZpY2UuXG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyA+PSAyIHx8IHRpbGVTaXplID09PSA1MTIgPyAnQDJ4JyA6ICcnO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSB3ZWJwU3VwcG9ydGVkLnN1cHBvcnRlZCA/ICcud2VicCcgOiAnJDEnO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IHVybE9iamVjdC5wYXRoLnJlcGxhY2UoaW1hZ2VFeHRlbnNpb25SZSwgYCR7c3VmZml4fSR7ZXh0ZW5zaW9ufWApO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IHVybE9iamVjdC5wYXRoLnJlcGxhY2UodGlsZVVSTEFQSVByZWZpeFJlLCAnLycpO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvdjQke3VybE9iamVjdC5wYXRofWA7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTiAmJiAoY29uZmlnLkFDQ0VTU19UT0tFTiB8fCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbikgJiYgdGhpcy5fc2t1VG9rZW4pIHtcbiAgICAgICAgICAgIHVybE9iamVjdC5wYXJhbXMucHVzaChgc2t1PSR7dGhpcy5fc2t1VG9rZW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUFQSVVSTCh1cmxPYmplY3QsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICB9XG5cbiAgICBjYW5vbmljYWxpemVUaWxlVVJMKHVybDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBcIi92NC9cIjtcbiAgICAgICAgLy8gbWF0Y2hlcyBhbnkgZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIGJ5IGEgZG90IGFuZCBvbmUgb3IgbW9yZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICBjb25zdCBleHRlbnNpb25SZSA9IC9cXC5bXFx3XSskLztcblxuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgdmFsaWQgTWFwYm94IHRpbGUgVVJMLlxuICAgICAgICAvLyBIYXMgdG8gYmVnaW4gd2l0aCAvdjQvLCB3aXRoIGEgdmFsaWQgZmlsZW5hbWUgKyBleHRlbnNpb25cbiAgICAgICAgaWYgKCF1cmxPYmplY3QucGF0aC5tYXRjaCgvKF5cXC92NFxcLykvKSB8fCAhdXJsT2JqZWN0LnBhdGgubWF0Y2goZXh0ZW5zaW9uUmUpKSB7XG4gICAgICAgICAgICAvLyBOb3QgYSBwcm9wZXIgTWFwYm94IHRpbGUgVVJMLlxuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWFzc2VtYmxlIHRoZSBjYW5vbmljYWwgVVJMIGZyb20gdGhlIHBhcnRzIHdlJ3ZlIHBhcnNlZCBiZWZvcmUuXG4gICAgICAgIGxldCByZXN1bHQgPSBcIm1hcGJveDovL3RpbGVzL1wiO1xuICAgICAgICByZXN1bHQgKz0gIHVybE9iamVjdC5wYXRoLnJlcGxhY2UodmVyc2lvbiwgJycpO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgcXVlcnkgc3RyaW5nLCBtaW51cyB0aGUgYWNjZXNzIHRva2VuIHBhcmFtZXRlci5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gdXJsT2JqZWN0LnBhcmFtcy5maWx0ZXIocCA9PiAhcC5tYXRjaCgvXmFjY2Vzc190b2tlbj0vKSk7XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoKSByZXN1bHQgKz0gYD8ke3BhcmFtcy5qb2luKCcmJyl9YDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjYW5vbmljYWxpemVUaWxlc2V0KHRpbGVKU09OOiBUaWxlSlNPTiwgc291cmNlVVJMOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTChzb3VyY2VVUkwpKSByZXR1cm4gdGlsZUpTT04udGlsZXMgfHwgW107XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHVybCBvZiB0aWxlSlNPTi50aWxlcykge1xuICAgICAgICAgICAgY29uc3QgY2Fub25pY2FsVXJsID0gdGhpcy5jYW5vbmljYWxpemVUaWxlVVJMKHVybCk7XG4gICAgICAgICAgICBjYW5vbmljYWwucHVzaChjYW5vbmljYWxVcmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5vbmljYWw7XG4gICAgfVxuXG4gICAgX21ha2VBUElVUkwodXJsT2JqZWN0OiBVcmxPYmplY3QsIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCBudWxsIHwgdm9pZCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGhlbHAgPSAnU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blcyc7XG4gICAgICAgIGNvbnN0IGFwaVVybE9iamVjdCA9IHBhcnNlVXJsKGNvbmZpZy5BUElfVVJMKTtcbiAgICAgICAgdXJsT2JqZWN0LnByb3RvY29sID0gYXBpVXJsT2JqZWN0LnByb3RvY29sO1xuICAgICAgICB1cmxPYmplY3QuYXV0aG9yaXR5ID0gYXBpVXJsT2JqZWN0LmF1dGhvcml0eTtcblxuICAgICAgICBpZiAoYXBpVXJsT2JqZWN0LnBhdGggIT09ICcvJykge1xuICAgICAgICAgICAgdXJsT2JqZWN0LnBhdGggPSBgJHthcGlVcmxPYmplY3QucGF0aH0ke3VybE9iamVjdC5wYXRofWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xuXG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW4gfHwgY29uZmlnLkFDQ0VTU19UT0tFTjtcbiAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiAke2hlbHB9YCk7XG4gICAgICAgIGlmIChhY2Nlc3NUb2tlblswXSA9PT0gJ3MnKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2UgYSBwdWJsaWMgYWNjZXNzIHRva2VuIChway4qKSB3aXRoIE1hcGJveCBHTCwgbm90IGEgc2VjcmV0IGFjY2VzcyB0b2tlbiAoc2suKikuICR7aGVscH1gKTtcblxuICAgICAgICB1cmxPYmplY3QucGFyYW1zID0gdXJsT2JqZWN0LnBhcmFtcy5maWx0ZXIoKGQpID0+IGQuaW5kZXhPZignYWNjZXNzX3Rva2VuJykgPT09IC0xKTtcbiAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNNYXBib3hVUkwodXJsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdXJsLmluZGV4T2YoJ21hcGJveDonKSA9PT0gMDtcbn1cblxuY29uc3QgbWFwYm94SFRUUFVSTFJlID0gL14oKGh0dHBzPzopP1xcL1xcLyk/KFteXFwvXStcXC4pP21hcGJveFxcLmMobnxvbSkoXFwvfFxcP3wkKS9pO1xuZnVuY3Rpb24gaXNNYXBib3hIVFRQVVJMKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1hcGJveEhUVFBVUkxSZS50ZXN0KHVybCk7XG59XG5cbmZ1bmN0aW9uIGhhc0NhY2hlRGVmZWF0aW5nU2t1KHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVybC5pbmRleE9mKCdza3U9JykgPiAwICYmIGlzTWFwYm94SFRUUFVSTCh1cmwpO1xufVxuXG5jb25zdCB1cmxSZSA9IC9eKFxcdyspOlxcL1xcLyhbXi8/XSopKFxcL1teP10rKT9cXD8/KC4rKT8vO1xuXG5mdW5jdGlvbiBwYXJzZVVybCh1cmw6IHN0cmluZyk6IFVybE9iamVjdCB7XG4gICAgY29uc3QgcGFydHMgPSB1cmwubWF0Y2godXJsUmUpO1xuICAgIGlmICghcGFydHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgVVJMIG9iamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbDogcGFydHNbMV0sXG4gICAgICAgIGF1dGhvcml0eTogcGFydHNbMl0sXG4gICAgICAgIHBhdGg6IHBhcnRzWzNdIHx8ICcvJyxcbiAgICAgICAgcGFyYW1zOiBwYXJ0c1s0XSA/IHBhcnRzWzRdLnNwbGl0KCcmJykgOiBbXVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVybChvYmo6IFVybE9iamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyYW1zID0gb2JqLnBhcmFtcy5sZW5ndGggPyBgPyR7b2JqLnBhcmFtcy5qb2luKCcmJyl9YCA6ICcnO1xuICAgIHJldHVybiBgJHtvYmoucHJvdG9jb2x9Oi8vJHtvYmouYXV0aG9yaXR5fSR7b2JqLnBhdGh9JHtwYXJhbXN9YDtcbn1cblxuZXhwb3J0IHsgaXNNYXBib3hVUkwsIGlzTWFwYm94SFRUUFVSTCwgaGFzQ2FjaGVEZWZlYXRpbmdTa3UgfTtcblxuY29uc3QgdGVsZW1FdmVudEtleSA9ICdtYXBib3guZXZlbnREYXRhJztcblxuZnVuY3Rpb24gcGFyc2VBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbjogP3N0cmluZykge1xuICAgIGlmICghYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBhY2Nlc3NUb2tlbi5zcGxpdCgnLicpO1xuICAgIGlmICghcGFydHMgfHwgcGFydHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShiNjREZWNvZGVVbmljb2RlKHBhcnRzWzFdKSk7XG4gICAgICAgIHJldHVybiBqc29uRGF0YTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxudHlwZSBUZWxlbWV0cnlFdmVudFR5cGUgPSAnYXBwVXNlclR1cm5zdGlsZScgfCAnbWFwLmxvYWQnO1xuXG5jbGFzcyBUZWxlbWV0cnlFdmVudCB7XG4gICAgZXZlbnREYXRhOiBhbnk7XG4gICAgYW5vbklkOiA/c3RyaW5nO1xuICAgIHF1ZXVlOiBBcnJheTxhbnk+O1xuICAgIHR5cGU6IFRlbGVtZXRyeUV2ZW50VHlwZTtcbiAgICBwZW5kaW5nUmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgX2N1c3RvbUFjY2Vzc1Rva2VuOiA/c3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVGVsZW1ldHJ5RXZlbnRUeXBlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYW5vbklkID0gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRTdG9yYWdlS2V5KGRvbWFpbjogP3N0cmluZykge1xuICAgICAgICBjb25zdCB0b2tlbkRhdGEgPSBwYXJzZUFjY2Vzc1Rva2VuKGNvbmZpZy5BQ0NFU1NfVE9LRU4pO1xuICAgICAgICBsZXQgdSA9ICcnO1xuICAgICAgICBpZiAodG9rZW5EYXRhICYmIHRva2VuRGF0YVsndSddKSB7XG4gICAgICAgICAgICB1ID0gYjY0RW5jb2RlVW5pY29kZSh0b2tlbkRhdGFbJ3UnXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1ID0gY29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9tYWluID9cbiAgICAgICAgICAgIGAke3RlbGVtRXZlbnRLZXl9LiR7ZG9tYWlufToke3V9YCA6XG4gICAgICAgICAgICBgJHt0ZWxlbUV2ZW50S2V5fToke3V9YDtcbiAgICB9XG5cbiAgICBmZXRjaEV2ZW50RGF0YSgpIHtcbiAgICAgICAgY29uc3QgaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUgPSBzdG9yYWdlQXZhaWxhYmxlKCdsb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleSgpO1xuICAgICAgICBjb25zdCB1dWlkS2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KCd1dWlkJyk7XG5cbiAgICAgICAgaWYgKGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAvL1JldHJpZXZlIGNhY2hlZCBkYXRhXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odXVpZEtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHV1aWQpIHRoaXMuYW5vbklkID0gdXVpZDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnVW5hYmxlIHRvIHJlYWQgZnJvbSBMb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNhdmVFdmVudERhdGEoKSB7XG4gICAgICAgIGNvbnN0IGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlID0gc3RvcmFnZUF2YWlsYWJsZSgnbG9jYWxTdG9yYWdlJyk7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSAgdGhpcy5nZXRTdG9yYWdlS2V5KCk7XG4gICAgICAgIGNvbnN0IHV1aWRLZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXkoJ3V1aWQnKTtcbiAgICAgICAgaWYgKGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh1dWlkS2V5LCB0aGlzLmFub25JZCk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXZlbnREYXRhKS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5ldmVudERhdGEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ1VuYWJsZSB0byB3cml0ZSB0byBMb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKF86ID9zdHJpbmcpIHt9XG5cbiAgICAvKlxuICAgICogSWYgYW55IGV2ZW50IGRhdGEgc2hvdWxkIGJlIHBlcnNpc3RlZCBhZnRlciB0aGUgUE9TVCByZXF1ZXN0LCB0aGUgY2FsbGJhY2sgc2hvdWxkIG1vZGlmeSBldmVudERhdGFgXG4gICAgKiB0byB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHNhdmVkLiBGb3IgdGhpcyByZWFzb24sIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZCBwcmlvciB0byB0aGUgY2FsbFxuICAgICogdG8gVGVsZW1ldHJ5RXZlbnQjc2F2ZURhdGFcbiAgICAqL1xuICAgIHBvc3RFdmVudCh0aW1lc3RhbXA6IG51bWJlciwgYWRkaXRpb25hbFBheWxvYWQ6IHtbc3RyaW5nXTogYW55fSwgY2FsbGJhY2s6IChlcnI6ID9FcnJvcikgPT4gdm9pZCwgY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIGlmICghY29uZmlnLkVWRU5UU19VUkwpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXZlbnRzVXJsT2JqZWN0OiBVcmxPYmplY3QgPSBwYXJzZVVybChjb25maWcuRVZFTlRTX1VSTCk7XG4gICAgICAgIGV2ZW50c1VybE9iamVjdC5wYXJhbXMucHVzaChgYWNjZXNzX3Rva2VuPSR7Y3VzdG9tQWNjZXNzVG9rZW4gfHwgY29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJ31gKTtcblxuICAgICAgICBjb25zdCBwYXlsb2FkOiBPYmplY3QgPSB7XG4gICAgICAgICAgICBldmVudDogdGhpcy50eXBlLFxuICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUodGltZXN0YW1wKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgc2RrSWRlbnRpZmllcjogJ21hcGJveC1nbC1qcycsXG4gICAgICAgICAgICBzZGtWZXJzaW9uLFxuICAgICAgICAgICAgc2t1SWQ6IFNLVV9JRCxcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy5hbm9uSWRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaW5hbFBheWxvYWQgPSBhZGRpdGlvbmFsUGF5bG9hZCA/IGV4dGVuZChwYXlsb2FkLCBhZGRpdGlvbmFsUGF5bG9hZCkgOiBwYXlsb2FkO1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBSZXF1ZXN0UGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIHVybDogZm9ybWF0VXJsKGV2ZW50c1VybE9iamVjdCksXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyAvL1NraXAgdGhlIHByZS1mbGlnaHQgT1BUSU9OUyByZXF1ZXN0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoW2ZpbmFsUGF5bG9hZF0pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IHBvc3REYXRhKHJlcXVlc3QsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnNhdmVFdmVudERhdGEoKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcXVldWVSZXF1ZXN0KGV2ZW50OiBudW1iZXIgfCB7aWQ6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXJ9LCBjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdHMoY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcExvYWRFdmVudCBleHRlbmRzIFRlbGVtZXRyeUV2ZW50IHtcbiAgICArc3VjY2Vzczoge1tudW1iZXJdOiBib29sZWFufTtcbiAgICBza3VUb2tlbjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdtYXAubG9hZCcpO1xuICAgICAgICB0aGlzLnN1Y2Nlc3MgPSB7fTtcbiAgICAgICAgdGhpcy5za3VUb2tlbiA9ICcnO1xuICAgIH1cblxuICAgIHBvc3RNYXBMb2FkRXZlbnQodGlsZVVybHM6IEFycmF5PHN0cmluZz4sIG1hcElkOiBudW1iZXIsIHNrdVRva2VuOiBzdHJpbmcsIGN1c3RvbUFjY2Vzc1Rva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgLy9FbmFibGVkIG9ubHkgd2hlbiBNYXBib3ggQWNjZXNzIFRva2VuIGlzIHNldCBhbmQgYSBzb3VyY2UgdXNlc1xuICAgICAgICAvLyBtYXBib3ggdGlsZXMuXG4gICAgICAgIHRoaXMuc2t1VG9rZW4gPSBza3VUb2tlbjtcblxuICAgICAgICBpZiAoY29uZmlnLkVWRU5UU19VUkwgJiZcbiAgICAgICAgICAgIGN1c3RvbUFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU4gJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGlsZVVybHMpICYmXG4gICAgICAgICAgICB0aWxlVXJscy5zb21lKHVybCA9PiBpc01hcGJveFVSTCh1cmwpIHx8IGlzTWFwYm94SFRUUFVSTCh1cmwpKSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZVJlcXVlc3Qoe2lkOiBtYXBJZCwgdGltZXN0YW1wOiBEYXRlLm5vdygpfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB7aWQsIHRpbWVzdGFtcH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgbG9hZCBldmVudCBzaG91bGQgZmlyZSBwZXIgbWFwXG4gICAgICAgIGlmIChpZCAmJiB0aGlzLnN1Y2Nlc3NbaWRdKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLmFub25JZCkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaEV2ZW50RGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWxpZGF0ZVV1aWQodGhpcy5hbm9uSWQpKSB7XG4gICAgICAgICAgICB0aGlzLmFub25JZCA9IHV1aWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdEV2ZW50KHRpbWVzdGFtcCwge3NrdVRva2VuOiB0aGlzLnNrdVRva2VufSwgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQpIHRoaXMuc3VjY2Vzc1tpZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBjdXN0b21BY2Nlc3NUb2tlbik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHVybnN0aWxlRXZlbnQgZXh0ZW5kcyBUZWxlbWV0cnlFdmVudCB7XG4gICAgY29uc3RydWN0b3IoY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCdhcHBVc2VyVHVybnN0aWxlJyk7XG4gICAgICAgIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuID0gY3VzdG9tQWNjZXNzVG9rZW47XG4gICAgfVxuXG4gICAgcG9zdFR1cm5zdGlsZUV2ZW50KHRpbGVVcmxzOiBBcnJheTxzdHJpbmc+LCBjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcbiAgICAgICAgLy9FbmFibGVkIG9ubHkgd2hlbiBNYXBib3ggQWNjZXNzIFRva2VuIGlzIHNldCBhbmQgYSBzb3VyY2UgdXNlc1xuICAgICAgICAvLyBtYXBib3ggdGlsZXMuXG4gICAgICAgIGlmIChjb25maWcuRVZFTlRTX1VSTCAmJlxuICAgICAgICAgICAgY29uZmlnLkFDQ0VTU19UT0tFTiAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aWxlVXJscykgJiZcbiAgICAgICAgICAgIHRpbGVVcmxzLnNvbWUodXJsID0+IGlzTWFwYm94VVJMKHVybCkgfHwgaXNNYXBib3hIVFRQVVJMKHVybCkpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlUmVxdWVzdChEYXRlLm5vdygpLCBjdXN0b21BY2Nlc3NUb2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzUmVxdWVzdHMoY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0IHx8IHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYW5vbklkIHx8ICF0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2VzcyB8fCAhdGhpcy5ldmVudERhdGEudG9rZW5VKSB7XG4gICAgICAgICAgICAvL1JldHJpZXZlIGNhY2hlZCBkYXRhXG4gICAgICAgICAgICB0aGlzLmZldGNoRXZlbnREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2tlbkRhdGEgPSBwYXJzZUFjY2Vzc1Rva2VuKGNvbmZpZy5BQ0NFU1NfVE9LRU4pO1xuICAgICAgICBjb25zdCB0b2tlblUgPSB0b2tlbkRhdGEgPyB0b2tlbkRhdGFbJ3UnXSA6IGNvbmZpZy5BQ0NFU1NfVE9LRU47XG4gICAgICAgIC8vUmVzZXQgZXZlbnQgZGF0YSBjYWNoZSBpZiB0aGUgYWNjZXNzIHRva2VuIG93bmVyIGNoYW5nZWQuXG4gICAgICAgIGxldCBkdWVGb3JFdmVudCA9IHRva2VuVSAhPT0gdGhpcy5ldmVudERhdGEudG9rZW5VO1xuXG4gICAgICAgIGlmICghdmFsaWRhdGVVdWlkKHRoaXMuYW5vbklkKSkge1xuICAgICAgICAgICAgdGhpcy5hbm9uSWQgPSB1dWlkKCk7XG4gICAgICAgICAgICBkdWVGb3JFdmVudCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0VXBkYXRlID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAvLyBSZWNvcmQgdHVybnN0aWxlIGV2ZW50IG9uY2UgcGVyIGNhbGVuZGFyIGRheS5cbiAgICAgICAgaWYgKHRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VXBkYXRlID0gbmV3IERhdGUodGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MpO1xuICAgICAgICAgICAgY29uc3QgbmV4dERhdGUgPSBuZXcgRGF0ZShuZXh0VXBkYXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGRheXNFbGFwc2VkID0gKG5leHRVcGRhdGUgLSB0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2VzcykgLyAoMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgICAgICAgICBkdWVGb3JFdmVudCA9IGR1ZUZvckV2ZW50IHx8IGRheXNFbGFwc2VkID49IDEgfHwgZGF5c0VsYXBzZWQgPCAtMSB8fCBsYXN0VXBkYXRlLmdldERhdGUoKSAhPT0gbmV4dERhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHVlRm9yRXZlbnQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkdWVGb3JFdmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlcXVlc3RzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvc3RFdmVudChuZXh0VXBkYXRlLCB7XCJlbmFibGVkLnRlbGVtZXRyeVwiOiBmYWxzZX0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MgPSBuZXh0VXBkYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnREYXRhLnRva2VuVSA9IHRva2VuVTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgIH1cbn1cblxuY29uc3QgdHVybnN0aWxlRXZlbnRfID0gbmV3IFR1cm5zdGlsZUV2ZW50KCk7XG5leHBvcnQgY29uc3QgcG9zdFR1cm5zdGlsZUV2ZW50ID0gdHVybnN0aWxlRXZlbnRfLnBvc3RUdXJuc3RpbGVFdmVudC5iaW5kKHR1cm5zdGlsZUV2ZW50Xyk7XG5cbmNvbnN0IG1hcExvYWRFdmVudF8gPSBuZXcgTWFwTG9hZEV2ZW50KCk7XG5leHBvcnQgY29uc3QgcG9zdE1hcExvYWRFdmVudCA9IG1hcExvYWRFdmVudF8ucG9zdE1hcExvYWRFdmVudC5iaW5kKG1hcExvYWRFdmVudF8pO1xuXG4vKioqKiogRU5EIFdBUk5JTkcgLSBSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSEVcblBSRUNFRElORyBDT0RFIFZJT0xBVEVTIFRIRSBNQVBCT1ggVEVSTVMgT0YgU0VSVklDRSAgKioqKioqL1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgd2Fybk9uY2UsIHBhcnNlQ2FjaGVDb250cm9sIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuXG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4vZGlzcGF0Y2hlcic7XG5cbmNvbnN0IENBQ0hFX05BTUUgPSAnbWFwYm94LXRpbGVzJztcbmxldCBjYWNoZUxpbWl0ID0gNTAwOyAvLyA1ME1CIC8gKDEwMEtCL3RpbGUpIH49IDUwMCB0aWxlc1xubGV0IGNhY2hlQ2hlY2tUaHJlc2hvbGQgPSA1MDtcblxuY29uc3QgTUlOX1RJTUVfVU5USUxfRVhQSVJZID0gMTAwMCAqIDYwICogNzsgLy8gNyBtaW51dGVzLiBTa2lwIGNhY2hpbmcgdGlsZXMgd2l0aCBhIHNob3J0IGVub3VnaCBtYXggYWdlLlxuXG5leHBvcnQgdHlwZSBSZXNwb25zZU9wdGlvbnMgPSB7XG4gICAgc3RhdHVzOiBudW1iZXIsXG4gICAgc3RhdHVzVGV4dDogc3RyaW5nLFxuICAgIGhlYWRlcnM6IHdpbmRvdy5IZWFkZXJzXG59O1xuXG5sZXQgcmVzcG9uc2VDb25zdHJ1Y3RvclN1cHBvcnRzUmVhZGFibGVTdHJlYW07XG5mdW5jdGlvbiBwcmVwYXJlQm9keShyZXNwb25zZTogUmVzcG9uc2UsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHJlc3BvbnNlQ29uc3RydWN0b3JTdXBwb3J0c1JlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBSZXNwb25zZShuZXcgUmVhZGFibGVTdHJlYW0oKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgICAgICAgIHJlc3BvbnNlQ29uc3RydWN0b3JTdXBwb3J0c1JlYWRhYmxlU3RyZWFtID0gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gRWRnZVxuICAgICAgICAgICAgcmVzcG9uc2VDb25zdHJ1Y3RvclN1cHBvcnRzUmVhZGFibGVTdHJlYW0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZUNvbnN0cnVjdG9yU3VwcG9ydHNSZWFkYWJsZVN0cmVhbSkge1xuICAgICAgICBjYWxsYmFjayhyZXNwb25zZS5ib2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZS5ibG9iKCkudGhlbihjYWxsYmFjayk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVQdXQocmVxdWVzdDogUmVxdWVzdCwgcmVzcG9uc2U6IFJlc3BvbnNlLCByZXF1ZXN0VGltZTogbnVtYmVyKSB7XG4gICAgaWYgKCF3aW5kb3cuY2FjaGVzKSByZXR1cm47XG5cbiAgICBjb25zdCBvcHRpb25zOiBSZXNwb25zZU9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgd2luZG93LkhlYWRlcnMoKVxuICAgIH07XG4gICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2LCBrKSA9PiBvcHRpb25zLmhlYWRlcnMuc2V0KGssIHYpKTtcblxuICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IHBhcnNlQ2FjaGVDb250cm9sKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDYWNoZS1Db250cm9sJykgfHwgJycpO1xuICAgIGlmIChjYWNoZUNvbnRyb2xbJ25vLXN0b3JlJ10pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2FjaGVDb250cm9sWydtYXgtYWdlJ10pIHtcbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzLnNldCgnRXhwaXJlcycsIG5ldyBEYXRlKHJlcXVlc3RUaW1lICsgY2FjaGVDb250cm9sWydtYXgtYWdlJ10gKiAxMDAwKS50b1VUQ1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lVW50aWxFeHBpcnkgPSBuZXcgRGF0ZShvcHRpb25zLmhlYWRlcnMuZ2V0KCdFeHBpcmVzJykpLmdldFRpbWUoKSAtIHJlcXVlc3RUaW1lO1xuICAgIGlmICh0aW1lVW50aWxFeHBpcnkgPCBNSU5fVElNRV9VTlRJTF9FWFBJUlkpIHJldHVybjtcblxuICAgIHByZXBhcmVCb2R5KHJlc3BvbnNlLCBib2R5ID0+IHtcbiAgICAgICAgY29uc3QgY2xvbmVkUmVzcG9uc2UgPSBuZXcgd2luZG93LlJlc3BvbnNlKGJvZHksIG9wdGlvbnMpO1xuXG4gICAgICAgIHdpbmRvdy5jYWNoZXMub3BlbihDQUNIRV9OQU1FKVxuICAgICAgICAgICAgLnRoZW4oY2FjaGUgPT4gY2FjaGUucHV0KHN0cmlwUXVlcnlQYXJhbWV0ZXJzKHJlcXVlc3QudXJsKSwgY2xvbmVkUmVzcG9uc2UpKVxuICAgICAgICAgICAgLmNhdGNoKGUgPT4gd2Fybk9uY2UoZS5tZXNzYWdlKSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwUXVlcnlQYXJhbWV0ZXJzKHVybDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3RhcnQgPSB1cmwuaW5kZXhPZignPycpO1xuICAgIHJldHVybiBzdGFydCA8IDAgPyB1cmwgOiB1cmwuc2xpY2UoMCwgc3RhcnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVHZXQocmVxdWVzdDogUmVxdWVzdCwgY2FsbGJhY2s6IChlcnJvcjogP2FueSwgcmVzcG9uc2U6ID9SZXNwb25zZSwgZnJlc2g6ID9ib29sZWFuKSA9PiB2b2lkKSB7XG4gICAgaWYgKCF3aW5kb3cuY2FjaGVzKSByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG5cbiAgICBjb25zdCBzdHJpcHBlZFVSTCA9IHN0cmlwUXVlcnlQYXJhbWV0ZXJzKHJlcXVlc3QudXJsKTtcblxuICAgIHdpbmRvdy5jYWNoZXMub3BlbihDQUNIRV9OQU1FKVxuICAgICAgICAudGhlbihjYWNoZSA9PiB7XG4gICAgICAgICAgICAvLyBtYW51YWxseSBzdHJpcCBVUkwgaW5zdGVhZCBvZiBgaWdub3JlU2VhcmNoOiB0cnVlYCBiZWNhdXNlIG9mIGEga25vd25cbiAgICAgICAgICAgIC8vIHBlcmZvcm1hbmNlIGlzc3VlIGluIENocm9tZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvODQzMVxuICAgICAgICAgICAgY2FjaGUubWF0Y2goc3RyaXBwZWRVUkwpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmVzaCA9IGlzRnJlc2gocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlaW5zZXJ0IGludG8gY2FjaGUgc28gdGhhdCBvcmRlciBvZiBrZXlzIGluIHRoZSBjYWNoZSBpcyB0aGUgb3JkZXIgb2YgYWNjZXNzLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbmUgbWFrZXMgdGhlIGNhY2hlIGEgTFJVIGluc3RlYWQgb2YgYSBGSUZPIGNhY2hlLlxuICAgICAgICAgICAgICAgICAgICBjYWNoZS5kZWxldGUoc3RyaXBwZWRVUkwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnB1dChzdHJpcHBlZFVSTCwgcmVzcG9uc2UuY2xvbmUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZSwgZnJlc2gpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcblxufVxuXG5mdW5jdGlvbiBpc0ZyZXNoKHJlc3BvbnNlKSB7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGV4cGlyZXMgPSBuZXcgRGF0ZShyZXNwb25zZS5oZWFkZXJzLmdldCgnRXhwaXJlcycpKTtcbiAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSBwYXJzZUNhY2hlQ29udHJvbChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ2FjaGUtQ29udHJvbCcpIHx8ICcnKTtcbiAgICByZXR1cm4gZXhwaXJlcyA+IERhdGUubm93KCkgJiYgIWNhY2hlQ29udHJvbFsnbm8tY2FjaGUnXTtcbn1cblxuLy8gYEluZmluaXR5YCB0cmlnZ2VycyBhIGNhY2hlIGNoZWNrIGFmdGVyIHRoZSBmaXJzdCB0aWxlIGlzIGxvYWRlZFxuLy8gc28gdGhhdCBhIGNoZWNrIGlzIHJ1biBhdCBsZWFzdCBvbmNlIG9uIGVhY2ggcGFnZSBsb2FkLlxubGV0IGdsb2JhbEVudHJ5Q291bnRlciA9IEluZmluaXR5O1xuXG4vLyBUaGUgY2FjaGUgY2hlY2sgZ2V0cyBydW4gb24gYSB3b3JrZXIuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdFxuLy8gcHJvZmlsaW5nIHNvbWV0aW1lcyBzaG93cyB0aGlzIGFzIHRha2luZyB1cCBzaWduaWZpY2FudCB0aW1lIG9uIHRoZVxuLy8gdGhyZWFkIGl0IGdldHMgY2FsbGVkIGZyb20uIEFuZCBzb21ldGltZXMgaXQgZG9lc24ndC4gSXQgKm1heSogYmVcbi8vIGZpbmUgdG8gcnVuIHRoaXMgb24gdGhlIG1haW4gdGhyZWFkIGJ1dCBvdXQgb2YgY2F1dGlvbiB0aGlzIGlzIGJlaW5nXG4vLyBkaXNwYXRjaGVkIG9uIGEgd29ya2VyLiBUaGlzIGNhbiBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlciBpbiB0aGUgZnV0dXJlLlxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlRW50cnlQb3NzaWJseUFkZGVkKGRpc3BhdGNoZXI6IERpc3BhdGNoZXIpIHtcbiAgICBnbG9iYWxFbnRyeUNvdW50ZXIrKztcbiAgICBpZiAoZ2xvYmFsRW50cnlDb3VudGVyID4gY2FjaGVDaGVja1RocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaGVyLmdldEFjdG9yKCkuc2VuZCgnZW5mb3JjZUNhY2hlU2l6ZUxpbWl0JywgY2FjaGVMaW1pdCk7XG4gICAgICAgIGdsb2JhbEVudHJ5Q291bnRlciA9IDA7XG4gICAgfVxufVxuXG4vLyBydW5zIG9uIHdvcmtlciwgc2VlIGFib3ZlIGNvbW1lbnRcbmV4cG9ydCBmdW5jdGlvbiBlbmZvcmNlQ2FjaGVTaXplTGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIGlmICghd2luZG93LmNhY2hlcykgcmV0dXJuO1xuICAgIHdpbmRvdy5jYWNoZXMub3BlbihDQUNIRV9OQU1FKVxuICAgICAgICAudGhlbihjYWNoZSA9PiB7XG4gICAgICAgICAgICBjYWNoZS5rZXlzKCkudGhlbihrZXlzID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gbGltaXQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjYWNoZS5kZWxldGUoa2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUaWxlQ2FjaGUoY2FsbGJhY2s/OiAoZXJyOiA/RXJyb3IpID0+IHZvaWQpIHtcbiAgICBjb25zdCBwcm9taXNlID0gd2luZG93LmNhY2hlcy5kZWxldGUoQ0FDSEVfTkFNRSk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHByb21pc2UuY2F0Y2goY2FsbGJhY2spLnRoZW4oKCkgPT4gY2FsbGJhY2soKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FjaGVMaW1pdHMobGltaXQ6IG51bWJlciwgY2hlY2tUaHJlc2hvbGQ6IG51bWJlcikge1xuICAgIGNhY2hlTGltaXQgPSBsaW1pdDtcbiAgICBjYWNoZUNoZWNrVGhyZXNob2xkID0gY2hlY2tUaHJlc2hvbGQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcbmltcG9ydCB7IGV4dGVuZCwgd2Fybk9uY2UgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgaXNNYXBib3hIVFRQVVJMLCBoYXNDYWNoZURlZmVhdGluZ1NrdSB9IGZyb20gJy4vbWFwYm94JztcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY2FjaGVHZXQsIGNhY2hlUHV0IH0gZnJvbSAnLi90aWxlX3JlcXVlc3RfY2FjaGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhbGxiYWNrIH0gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUgeyBDYW5jZWxhYmxlIH0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgYSByZXNvdXJjZS5cbiAqIEBwcml2YXRlXG4gKiBAcmVhZG9ubHlcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFJlc291cmNlVHlwZSA9IHtcbiAgICBVbmtub3duOiAnVW5rbm93bicsXG4gICAgU3R5bGU6ICdTdHlsZScsXG4gICAgU291cmNlOiAnU291cmNlJyxcbiAgICBUaWxlOiAnVGlsZScsXG4gICAgR2x5cGhzOiAnR2x5cGhzJyxcbiAgICBTcHJpdGVJbWFnZTogJ1Nwcml0ZUltYWdlJyxcbiAgICBTcHJpdGVKU09OOiAnU3ByaXRlSlNPTicsXG4gICAgSW1hZ2U6ICdJbWFnZSdcbn07XG5leHBvcnQgeyBSZXNvdXJjZVR5cGUgfTtcblxuaWYgKHR5cGVvZiBPYmplY3QuZnJlZXplID09ICdmdW5jdGlvbicpIHtcbiAgICBPYmplY3QuZnJlZXplKFJlc291cmNlVHlwZSk7XG59XG5cbi8qKlxuICogQSBgUmVxdWVzdFBhcmFtZXRlcnNgIG9iamVjdCB0byBiZSByZXR1cm5lZCBmcm9tIE1hcC5vcHRpb25zLnRyYW5zZm9ybVJlcXVlc3QgY2FsbGJhY2tzLlxuICogQHR5cGVkZWYge09iamVjdH0gUmVxdWVzdFBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSByZXF1ZXN0ZWQuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaGVhZGVycyBUaGUgaGVhZGVycyB0byBiZSBzZW50IHdpdGggdGhlIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3JlZGVudGlhbHMgYCdzYW1lLW9yaWdpbid8J2luY2x1ZGUnYCBVc2UgJ2luY2x1ZGUnIHRvIHNlbmQgY29va2llcyB3aXRoIGNyb3NzLW9yaWdpbiByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgaGVhZGVycz86IE9iamVjdCxcbiAgICBtZXRob2Q/OiAnR0VUJyB8ICdQT1NUJyB8ICdQVVQnLFxuICAgIGJvZHk/OiBzdHJpbmcsXG4gICAgdHlwZT86ICdzdHJpbmcnIHwgJ2pzb24nIHwgJ2FycmF5QnVmZmVyJyxcbiAgICBjcmVkZW50aWFscz86ICdzYW1lLW9yaWdpbicgfCAnaW5jbHVkZScsXG4gICAgY29sbGVjdFJlc291cmNlVGltaW5nPzogYm9vbGVhblxufTtcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDYWxsYmFjazxUPiA9IChlcnJvcjogP0Vycm9yLCBkYXRhOiA/VCwgY2FjaGVDb250cm9sOiA/c3RyaW5nLCBleHBpcmVzOiA/c3RyaW5nKSA9PiB2b2lkO1xuXG5jbGFzcyBBSkFYRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgdXJsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDAxICYmIGlzTWFwYm94SFRUUFVSTCh1cmwpKSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9ICc6IHlvdSBtYXkgaGF2ZSBwcm92aWRlZCBhbiBpbnZhbGlkIE1hcGJveCBhY2Nlc3MgdG9rZW4uIFNlZSBodHRwczovL3d3dy5tYXBib3guY29tL2FwaS1kb2N1bWVudGF0aW9uLyNhY2Nlc3MtdG9rZW5zLWFuZC10b2tlbi1zY29wZXMnO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG5cbiAgICAgICAgLy8gd29yayBhcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9SaWNoLUhhcnJpcy9idWJsZS9pc3N1ZXMvNDBcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9ICgke3RoaXMuc3RhdHVzfSk6ICR7dGhpcy51cmx9YDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya2VyKCkge1xuICAgIHJldHVybiB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7XG59XG5cbi8vIEVuc3VyZSB0aGF0IHdlJ3JlIHNlbmRpbmcgdGhlIGNvcnJlY3QgcmVmZXJyZXIgZnJvbSBibG9iIFVSTCB3b3JrZXIgYnVuZGxlcy5cbi8vIEZvciBmaWxlcyBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0sIGBsb2NhdGlvbi5vcmlnaW5gIHdpbGwgYmUgc2V0XG4vLyB0byB0aGUgc3RyaW5nKCEpIFwibnVsbFwiIChGaXJlZm94KSwgb3IgXCJmaWxlOi8vXCIgKENocm9tZSwgU2FmYXJpLCBFZGdlLCBJRSksXG4vLyBhbmQgd2Ugd2lsbCBzZXQgYW4gZW1wdHkgcmVmZXJyZXIuIE90aGVyd2lzZSwgd2UncmUgdXNpbmcgdGhlIGRvY3VtZW50J3MgVVJMLlxuLyogZ2xvYmFsIHNlbGYsIFdvcmtlckdsb2JhbFNjb3BlICovXG5leHBvcnQgY29uc3QgZ2V0UmVmZXJyZXIgPSBpc1dvcmtlcigpID9cbiAgICAoKSA9PiBzZWxmLndvcmtlciAmJiBzZWxmLndvcmtlci5yZWZlcnJlciA6XG4gICAgKCkgPT4gKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2Jsb2I6JyA/IHdpbmRvdy5wYXJlbnQgOiB3aW5kb3cpLmxvY2F0aW9uLmhyZWY7XG5cbi8vIERldGVybWluZXMgd2hldGhlciBhIFVSTCBpcyBhIGZpbGU6Ly8gVVJMLiBUaGlzIGlzIG9idmlvdXNseSB0aGUgY2FzZSBpZiBpdCBiZWdpbnNcbi8vIHdpdGggZmlsZTovLy4gUmVsYXRpdmUgVVJMcyBhcmUgYWxzbyBmaWxlOi8vIFVSTHMgaWZmIHRoZSBvcmlnaW5hbCBkb2N1bWVudCB3YXMgbG9hZGVkXG4vLyB2aWEgYSBmaWxlOi8vIFVSTC5cbmNvbnN0IGlzRmlsZVVSTCA9IHVybCA9PiAvXmZpbGU6Ly50ZXN0KHVybCkgfHwgKC9eZmlsZTovLnRlc3QoZ2V0UmVmZXJyZXIoKSkgJiYgIS9eXFx3KzovLnRlc3QodXJsKSk7XG5cbmZ1bmN0aW9uIG1ha2VGZXRjaFJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyB3aW5kb3cuQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyB3aW5kb3cuUmVxdWVzdChyZXF1ZXN0UGFyYW1ldGVycy51cmwsIHtcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0UGFyYW1ldGVycy5tZXRob2QgfHwgJ0dFVCcsXG4gICAgICAgIGJvZHk6IHJlcXVlc3RQYXJhbWV0ZXJzLmJvZHksXG4gICAgICAgIGNyZWRlbnRpYWxzOiByZXF1ZXN0UGFyYW1ldGVycy5jcmVkZW50aWFscyxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdFBhcmFtZXRlcnMuaGVhZGVycyxcbiAgICAgICAgcmVmZXJyZXI6IGdldFJlZmVycmVyKCksXG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWxcbiAgICB9KTtcbiAgICBsZXQgY29tcGxldGUgPSBmYWxzZTtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FjaGVJZ25vcmluZ1NlYXJjaCA9IGhhc0NhY2hlRGVmZWF0aW5nU2t1KHJlcXVlc3QudXJsKTtcblxuICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicpIHtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZU9yRmV0Y2ggPSAoZXJyLCBjYWNoZWRSZXNwb25zZSwgcmVzcG9uc2VJc0ZyZXNoKSA9PiB7XG4gICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgLy8gRG8gZmV0Y2ggaW4gY2FzZSBvZiBjYWNoZSBlcnJvci5cbiAgICAgICAgICAgIC8vIEhUVFAgcGFnZXMgaW4gRWRnZSB0cmlnZ2VyIGEgc2VjdXJpdHkgZXJyb3IgdGhhdCBjYW4gYmUgaWdub3JlZC5cbiAgICAgICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gJ1NlY3VyaXR5RXJyb3InKSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZWRSZXNwb25zZSAmJiByZXNwb25zZUlzRnJlc2gpIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5pc2hSZXF1ZXN0KGNhY2hlZFJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZWRSZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZG8gcmV2YWxpZGF0aW9uIHdpdGggJ0lmLU5vbmUtTWF0Y2gnIGJlY2F1c2UgdGhlbiB0aGVcbiAgICAgICAgICAgIC8vIHJlcXVlc3QgZG9lc24ndCBoYXZlIHNpbXBsZSBjb3JzIGhlYWRlcnMuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgd2luZG93LmZldGNoKHJlcXVlc3QpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVhYmxlUmVzcG9uc2UgPSBjYWNoZUlnbm9yaW5nU2VhcmNoID8gcmVzcG9uc2UuY2xvbmUoKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFJlcXVlc3QocmVzcG9uc2UsIGNhY2hlYWJsZVJlc3BvbnNlLCByZXF1ZXN0VGltZSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBBSkFYRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCwgcmVzcG9uc2Uuc3RhdHVzLCByZXF1ZXN0UGFyYW1ldGVycy51cmwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDIwKSB7XG4gICAgICAgICAgICAgICAgLy8gc2lsZW5jZSBleHBlY3RlZCBBYm9ydEVycm9yXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGZpbmlzaFJlcXVlc3QgPSAocmVzcG9uc2UsIGNhY2hlYWJsZVJlc3BvbnNlLCByZXF1ZXN0VGltZSkgPT4ge1xuICAgICAgICAoXG4gICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnYXJyYXlCdWZmZXInID8gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSA6XG4gICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicgPyByZXNwb25zZS5qc29uKCkgOlxuICAgICAgICAgICAgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgICkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChjYWNoZWFibGVSZXNwb25zZSAmJiByZXF1ZXN0VGltZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjYWNoZSBhZnRlciBpdCBoYXMgY29tcGxldGVseSBsb2FkZWQuXG4gICAgICAgICAgICAgICAgLy8gVW50aWwgaXQgaXMgZnVsbHkgbG9hZGVkIHRoZXJlIGlzIGEgY2hhbmNlIGl0IHdpbGwgYmUgYWJvcnRlZC4gQWJvcnRpbmcgd2hpbGVcbiAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHRoZSBib2R5IGNhbiBjYXVzZSB0aGUgY2FjaGUgaW5zZXJ0aW9uIHRvIGVycm9yLiBXZSBjb3VsZCBjYXRjaCB0aGlzIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gaW4gbW9zdCBicm93c2VycyBidXQgaW4gRmlyZWZveCBpdCBzZWVtcyB0byBzb21ldGltZXMgY3Jhc2ggdGhlIHRhYi4gQWRkaW5nXG4gICAgICAgICAgICAgICAgLy8gaXQgdG8gdGhlIGNhY2hlIGhlcmUgYXZvaWRzIHRoYXQgZXJyb3IuXG4gICAgICAgICAgICAgICAgY2FjaGVQdXQocmVxdWVzdCwgY2FjaGVhYmxlUmVzcG9uc2UsIHJlcXVlc3RUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCwgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NhY2hlLUNvbnRyb2wnKSwgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0V4cGlyZXMnKSk7XG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyLm1lc3NhZ2UpKSk7XG4gICAgfTtcblxuICAgIGlmIChjYWNoZUlnbm9yaW5nU2VhcmNoKSB7XG4gICAgICAgIGNhY2hlR2V0KHJlcXVlc3QsIHZhbGlkYXRlT3JGZXRjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdGVPckZldGNoKG51bGwsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNhbmNlbDogKCkgPT4ge1xuICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFjb21wbGV0ZSkgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIH19O1xufVxuXG5mdW5jdGlvbiBtYWtlWE1MSHR0cFJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgeGhyOiBYTUxIdHRwUmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIHhoci5vcGVuKHJlcXVlc3RQYXJhbWV0ZXJzLm1ldGhvZCB8fCAnR0VUJywgcmVxdWVzdFBhcmFtZXRlcnMudXJsLCB0cnVlKTtcbiAgICBpZiAocmVxdWVzdFBhcmFtZXRlcnMudHlwZSA9PT0gJ2FycmF5QnVmZmVyJykge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICB9XG4gICAgZm9yIChjb25zdCBrIGluIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaywgcmVxdWVzdFBhcmFtZXRlcnMuaGVhZGVyc1trXSk7XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICd0ZXh0JztcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0UGFyYW1ldGVycy5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnO1xuICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQpKTtcbiAgICB9O1xuICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmICgoKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHx8IHhoci5zdGF0dXMgPT09IDApICYmIHhoci5yZXNwb25zZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGRhdGE6IG1peGVkID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG1hbnVhbGx5IHBhcnNpbmcgSlNPTiBoZXJlIHRvIGdldCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDYWNoZS1Db250cm9sJyksIHhoci5nZXRSZXNwb25zZUhlYWRlcignRXhwaXJlcycpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBBSkFYRXJyb3IoeGhyLnN0YXR1c1RleHQsIHhoci5zdGF0dXMsIHJlcXVlc3RQYXJhbWV0ZXJzLnVybCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB4aHIuc2VuZChyZXF1ZXN0UGFyYW1ldGVycy5ib2R5KTtcbiAgICByZXR1cm4geyBjYW5jZWw6ICgpID0+IHhoci5hYm9ydCgpIH07XG59XG5cbmV4cG9ydCBjb25zdCBtYWtlUmVxdWVzdCA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8YW55Pik6IENhbmNlbGFibGUge1xuICAgIC8vIFdlJ3JlIHRyeWluZyB0byB1c2UgdGhlIEZldGNoIEFQSSBpZiBwb3NzaWJsZS4gSG93ZXZlciwgaW4gc29tZSBzaXR1YXRpb25zIHdlIGNhbid0IHVzZSBpdDpcbiAgICAvLyAtIElFMTEgZG9lc24ndCBzdXBwb3J0IGl0IGF0IGFsbC4gSW4gdGhpcyBjYXNlLCB3ZSBkaXNwYXRjaCB0aGUgcmVxdWVzdCB0byB0aGUgbWFpbiB0aHJlYWQgc29cbiAgICAvLyAgIHRoYXQgd2UgY2FuIGdldCBhbiBhY2NydWF0ZSByZWZlcnJlciBoZWFkZXIuXG4gICAgLy8gLSBTYWZhcmkgZXhwb3NlcyB3aW5kb3cuQWJvcnRDb250cm9sbGVyLCBidXQgaXQgZG9lc24ndCB3b3JrIGFjdHVhbGx5IGFib3J0IGFueSByZXF1ZXN0cyBpblxuICAgIC8vICAgc29tZSB2ZXJzaW9ucyAoc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ5ODAjYzIpXG4gICAgLy8gLSBSZXF1ZXN0cyBmb3IgcmVzb3VyY2VzIHdpdGggdGhlIGZpbGU6Ly8gVVJJIHNjaGVtZSBkb24ndCB3b3JrIHdpdGggdGhlIEZldGNoIEFQSSBlaXRoZXIuIEluXG4gICAgLy8gICB0aGlzIGNhc2Ugd2UgdW5jb25kaXRpb25hbGx5IHVzZSBYSFIgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHNpbmNlIHJlZmVycmVycyBkb24ndCBtYXR0ZXIuXG4gICAgaWYgKCFpc0ZpbGVVUkwocmVxdWVzdFBhcmFtZXRlcnMudXJsKSkge1xuICAgICAgICBpZiAod2luZG93LmZldGNoICYmIHdpbmRvdy5SZXF1ZXN0ICYmIHdpbmRvdy5BYm9ydENvbnRyb2xsZXIgJiYgd2luZG93LlJlcXVlc3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KCdzaWduYWwnKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VGZXRjaFJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNXb3JrZXIoKSAmJiBzZWxmLndvcmtlciAmJiBzZWxmLndvcmtlci5hY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYud29ya2VyLmFjdG9yLnNlbmQoJ2dldFJlc291cmNlJywgcmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFrZVhNTEh0dHBSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjayk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SlNPTiA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8T2JqZWN0Pik6IENhbmNlbGFibGUge1xuICAgIHJldHVybiBtYWtlUmVxdWVzdChleHRlbmQocmVxdWVzdFBhcmFtZXRlcnMsIHsgdHlwZTogJ2pzb24nIH0pLCBjYWxsYmFjayk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXJyYXlCdWZmZXIgPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPEFycmF5QnVmZmVyPik6IENhbmNlbGFibGUge1xuICAgIHJldHVybiBtYWtlUmVxdWVzdChleHRlbmQocmVxdWVzdFBhcmFtZXRlcnMsIHsgdHlwZTogJ2FycmF5QnVmZmVyJyB9KSwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvc3REYXRhID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxzdHJpbmc+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywgeyBtZXRob2Q6ICdQT1NUJyB9KSwgY2FsbGJhY2spO1xufTtcblxuZnVuY3Rpb24gc2FtZU9yaWdpbih1cmwpIHtcbiAgICBjb25zdCBhOiBIVE1MQW5jaG9yRWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIHJldHVybiBhLnByb3RvY29sID09PSB3aW5kb3cuZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgJiYgYS5ob3N0ID09PSB3aW5kb3cuZG9jdW1lbnQubG9jYXRpb24uaG9zdDtcbn1cblxuY29uc3QgdHJhbnNwYXJlbnRQbmdVcmwgPSAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FZQUFBQWZGY1NKQUFBQUMwbEVRVlFZVjJOZ0FBSUFBQVVBQWFyVnlGRUFBQUFBU1VWT1JLNUNZSUk9JztcblxubGV0IGltYWdlUXVldWUsIG51bUltYWdlUmVxdWVzdHM7XG5leHBvcnQgY29uc3QgcmVzZXRJbWFnZVJlcXVlc3RRdWV1ZSA9ICgpID0+IHtcbiAgICBpbWFnZVF1ZXVlID0gW107XG4gICAgbnVtSW1hZ2VSZXF1ZXN0cyA9IDA7XG59O1xucmVzZXRJbWFnZVJlcXVlc3RRdWV1ZSgpO1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2UgPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBDYWxsYmFjazxIVE1MSW1hZ2VFbGVtZW50Pik6IENhbmNlbGFibGUge1xuICAgIC8vIGxpbWl0IGNvbmN1cnJlbnQgaW1hZ2UgbG9hZHMgdG8gaGVscCB3aXRoIHJhc3RlciBzb3VyY2VzIHBlcmZvcm1hbmNlIG9uIGJpZyBzY3JlZW5zXG4gICAgaWYgKG51bUltYWdlUmVxdWVzdHMgPj0gY29uZmlnLk1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUykge1xuICAgICAgICBjb25zdCBxdWV1ZWQgPSB7XG4gICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycyxcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgY2FuY2VsbGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGNhbmNlbCgpIHsgdGhpcy5jYW5jZWxsZWQgPSB0cnVlOyB9XG4gICAgICAgIH07XG4gICAgICAgIGltYWdlUXVldWUucHVzaChxdWV1ZWQpO1xuICAgICAgICByZXR1cm4gcXVldWVkO1xuICAgIH1cbiAgICBudW1JbWFnZVJlcXVlc3RzKys7XG5cbiAgICBsZXQgYWR2YW5jZWQgPSBmYWxzZTtcbiAgICBjb25zdCBhZHZhbmNlSW1hZ2VSZXF1ZXN0UXVldWUgPSAoKSA9PiB7XG4gICAgICAgIGlmIChhZHZhbmNlZCkgcmV0dXJuO1xuICAgICAgICBhZHZhbmNlZCA9IHRydWU7XG4gICAgICAgIG51bUltYWdlUmVxdWVzdHMtLTtcbiAgICAgICAgYXNzZXJ0KG51bUltYWdlUmVxdWVzdHMgPj0gMCk7XG4gICAgICAgIHdoaWxlIChpbWFnZVF1ZXVlLmxlbmd0aCAmJiBudW1JbWFnZVJlcXVlc3RzIDwgY29uZmlnLk1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW1hZ2VRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgY29uc3Qge3JlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjaywgY2FuY2VsbGVkfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBpZiAoIWNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuY2FuY2VsID0gZ2V0SW1hZ2UocmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrKS5jYW5jZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gcmVxdWVzdCB0aGUgaW1hZ2Ugd2l0aCBYSFIgdG8gd29yayBhcm91bmQgY2FjaGluZyBpc3N1ZXNcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzE0NzBcbiAgICBjb25zdCByZXF1ZXN0ID0gZ2V0QXJyYXlCdWZmZXIocmVxdWVzdFBhcmFtZXRlcnMsIChlcnI6ID9FcnJvciwgZGF0YTogP0FycmF5QnVmZmVyLCBjYWNoZUNvbnRyb2w6ID9zdHJpbmcsIGV4cGlyZXM6ID9zdHJpbmcpID0+IHtcblxuICAgICAgICBhZHZhbmNlSW1hZ2VSZXF1ZXN0UXVldWUoKTtcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGltZzogSFRNTEltYWdlRWxlbWVudCA9IG5ldyB3aW5kb3cuSW1hZ2UoKTtcbiAgICAgICAgICAgIGNvbnN0IFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgaW1nKTtcbiAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGltZy5zcmMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gY2FsbGJhY2sobmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBpbWFnZS4gUGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgYSBzdXBwb3J0ZWQgaW1hZ2UgdHlwZSBzdWNoIGFzIFBORyBvciBKUEVHLiBOb3RlIHRoYXQgU1ZHcyBhcmUgbm90IHN1cHBvcnRlZC4nKSk7XG4gICAgICAgICAgICBjb25zdCBibG9iOiBCbG9iID0gbmV3IHdpbmRvdy5CbG9iKFtuZXcgVWludDhBcnJheShkYXRhKV0sIHsgdHlwZTogJ2ltYWdlL3BuZycgfSk7XG4gICAgICAgICAgICAoaW1nOiBhbnkpLmNhY2hlQ29udHJvbCA9IGNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgIChpbWc6IGFueSkuZXhwaXJlcyA9IGV4cGlyZXM7XG4gICAgICAgICAgICBpbWcuc3JjID0gZGF0YS5ieXRlTGVuZ3RoID8gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSA6IHRyYW5zcGFyZW50UG5nVXJsO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICBhZHZhbmNlSW1hZ2VSZXF1ZXN0UXVldWUoKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmlkZW8gPSBmdW5jdGlvbih1cmxzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8SFRNTFZpZGVvRWxlbWVudD4pOiBDYW5jZWxhYmxlIHtcbiAgICBjb25zdCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcbiAgICB2aWRlby5vbmxvYWRzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB2aWRlbyk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgczogSFRNTFNvdXJjZUVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc291cmNlJyk7XG4gICAgICAgIGlmICghc2FtZU9yaWdpbih1cmxzW2ldKSkge1xuICAgICAgICAgICAgdmlkZW8uY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgfVxuICAgICAgICBzLnNyYyA9IHVybHNbaV07XG4gICAgICAgIHZpZGVvLmFwcGVuZENoaWxkKHMpO1xuICAgIH1cbiAgICByZXR1cm4geyBjYW5jZWw6ICgpID0+IHt9IH07XG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi91dGlsJztcblxudHlwZSBMaXN0ZW5lciA9IChPYmplY3QpID0+IGFueTtcbnR5cGUgTGlzdGVuZXJzID0geyBbc3RyaW5nXTogQXJyYXk8TGlzdGVuZXI+IH07XG5cbmZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IExpc3RlbmVyLCBsaXN0ZW5lckxpc3Q6IExpc3RlbmVycykge1xuICAgIGNvbnN0IGxpc3RlbmVyRXhpc3RzID0gbGlzdGVuZXJMaXN0W3R5cGVdICYmIGxpc3RlbmVyTGlzdFt0eXBlXS5pbmRleE9mKGxpc3RlbmVyKSAhPT0gLTE7XG4gICAgaWYgKCFsaXN0ZW5lckV4aXN0cykge1xuICAgICAgICBsaXN0ZW5lckxpc3RbdHlwZV0gPSBsaXN0ZW5lckxpc3RbdHlwZV0gfHwgW107XG4gICAgICAgIGxpc3RlbmVyTGlzdFt0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9yZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IExpc3RlbmVyLCBsaXN0ZW5lckxpc3Q6IExpc3RlbmVycykge1xuICAgIGlmIChsaXN0ZW5lckxpc3QgJiYgbGlzdGVuZXJMaXN0W3R5cGVdKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJMaXN0W3R5cGVdLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsaXN0ZW5lckxpc3RbdHlwZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50IHtcbiAgICArdHlwZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBkYXRhOiBPYmplY3QgPSB7fSkge1xuICAgICAgICBleHRlbmQodGhpcywgZGF0YSk7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBlcnJvcjogRXJyb3I7XG5cbiAgICBjb25zdHJ1Y3RvcihlcnJvcjogRXJyb3IsIGRhdGE6IE9iamVjdCA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCdlcnJvcicsIGV4dGVuZCh7ZXJyb3J9LCBkYXRhKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIE1ldGhvZHMgbWl4ZWQgaW4gdG8gb3RoZXIgY2xhc3NlcyBmb3IgZXZlbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBtaXhpbiBFdmVudGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudGVkIHtcbiAgICBfbGlzdGVuZXJzOiBMaXN0ZW5lcnM7XG4gICAgX29uZVRpbWVMaXN0ZW5lcnM6IExpc3RlbmVycztcbiAgICBfZXZlbnRlZFBhcmVudDogP0V2ZW50ZWQ7XG4gICAgX2V2ZW50ZWRQYXJlbnREYXRhOiA/KE9iamVjdCB8ICgpID0+IE9iamVjdCk7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYSBzcGVjaWZpZWQgZXZlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGFkZCBhIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICAgKiAgIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIGBmaXJlYCxcbiAgICAgKiAgIGV4dGVuZGVkIHdpdGggYHRhcmdldGAgYW5kIGB0eXBlYCBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB0aGlzYFxuICAgICAqL1xuICAgIG9uKHR5cGU6ICosIGxpc3RlbmVyOiBMaXN0ZW5lcik6IHRoaXMge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMgfHwge307XG4gICAgICAgIF9hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzLl9saXN0ZW5lcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB0aGlzYFxuICAgICAqL1xuICAgIG9mZih0eXBlOiAqLCBsaXN0ZW5lcjogTGlzdGVuZXIpIHtcbiAgICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX2xpc3RlbmVycyk7XG4gICAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UgdG8gYSBzcGVjaWZpZWQgZXZlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqIFRoZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCBmaXJzdCB0aW1lIHRoZSBldmVudCBmaXJlcyBhZnRlciB0aGUgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZCB0aGUgZmlyc3QgdGltZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBgdGhpc2BcbiAgICAgKi9cbiAgICBvbmNlKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IExpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgPSB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZmlyZShldmVudDogRXZlbnQsIHByb3BlcnRpZXM/OiBPYmplY3QpIHtcbiAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSB3aXRoICh0eXBlOiBzdHJpbmcsIHByb3BlcnRpZXM6IE9iamVjdCkgc2lnbmF0dXJlIGZyb20gcHJldmlvdXMgdmVyc2lvbnMuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjUyMixcbiAgICAgICAgLy8gICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWRyYXcvaXNzdWVzLzc2NlxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnQsIHByb3BlcnRpZXMgfHwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVucyh0eXBlKSkge1xuICAgICAgICAgICAgKGV2ZW50OiBhbnkpLnRhcmdldCA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhZGRpbmcgb3IgcmVtb3ZpbmcgbGlzdGVuZXJzIGluc2lkZSBvdGhlciBsaXN0ZW5lcnMgd29uJ3QgY2F1c2UgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzICYmIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA/IHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5zbGljZSgpIDogW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvbmVUaW1lTGlzdGVuZXJzID0gdGhpcy5fb25lVGltZUxpc3RlbmVycyAmJiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3R5cGVdID8gdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0eXBlXS5zbGljZSgpIDogW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIG9uZVRpbWVMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2V2ZW50ZWRQYXJlbnQ7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhID09PSAnZnVuY3Rpb24nID8gdGhpcy5fZXZlbnRlZFBhcmVudERhdGEoKSA6IHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuZmlyZShldmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHRoYXQgbm8gZXJyb3IgZXZlbnRzIGFyZSBkcm9wcGVkLCBwcmludCB0aGVtIHRvIHRoZVxuICAgICAgICAvLyBjb25zb2xlIGlmIHRoZXkgaGF2ZSBubyBsaXN0ZW5lcnMuXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFcnJvckV2ZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGV2ZW50LmVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB0cnVlIGlmIHRoaXMgaW5zdGFuY2Ugb2YgRXZlbnRlZCBvciBhbnkgZm9yd2FyZGVlZCBpbnN0YW5jZXMgb2YgRXZlbnRlZCBoYXZlIGEgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcmVnaXN0ZXJlZCBsaXN0ZW5lciBmb3Igc3BlY2lmaWVkIGV2ZW50IHR5cGUsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsaXN0ZW5zKHR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuX2xpc3RlbmVycyAmJiB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gJiYgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAodGhpcy5fb25lVGltZUxpc3RlbmVycyAmJiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3R5cGVdICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICh0aGlzLl9ldmVudGVkUGFyZW50ICYmIHRoaXMuX2V2ZW50ZWRQYXJlbnQubGlzdGVucyh0eXBlKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWJibGUgYWxsIGV2ZW50cyBmaXJlZCBieSB0aGlzIGluc3RhbmNlIG9mIEV2ZW50ZWQgdG8gdGhpcyBwYXJlbnQgaW5zdGFuY2Ugb2YgRXZlbnRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRFdmVudGVkUGFyZW50KHBhcmVudDogP0V2ZW50ZWQsIGRhdGE/OiBPYmplY3QgfCAoKSA9PiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEgPSBkYXRhO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBtZXNzYWdlLCBpZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IChrZXkgPyBgJHtrZXl9OiBgIDogJycpICsgbWVzc2FnZTtcbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuX19saW5lX18pIHtcbiAgICAgICAgICAgIHRoaXMubGluZSA9IHZhbHVlLl9fbGluZV9fO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUNvbnN0YW50cyhvcHRpb25zKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgY29uc3RhbnRzID0gb3B0aW9ucy52YWx1ZTtcblxuICAgIGlmIChjb25zdGFudHMpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgY29uc3RhbnRzLCAnY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4JyldO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChvdXRwdXQsIC4uLmlucHV0cykge1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgayBpbiBpbnB1dCkge1xuICAgICAgICAgICAgb3V0cHV0W2tdID0gaW5wdXRba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsImZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbjtcbn1cblxuLy8gVHVybiBqc29ubGludC1saW5lcy1wcmltaXRpdmVzIG9iamVjdHMgaW50byBwcmltaXRpdmUgb2JqZWN0c1xuZXhwb3J0IGZ1bmN0aW9uIHVuYnVuZGxlKHZhbHVlKSB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwVW5idW5kbGUodmFsdWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChkZWVwVW5idW5kbGUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgIWlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICBjb25zdCB1bmJ1bmRsZWRWYWx1ZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgdW5idW5kbGVkVmFsdWVba2V5XSA9IGRlZXBVbmJ1bmRsZSh2YWx1ZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5idW5kbGVkVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuYnVuZGxlKHZhbHVlKTtcbn1cblxuIiwiLy8gQGZsb3dcblxuY2xhc3MgUGFyc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGtleTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihrZXk6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNpbmdFcnJvcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuL2V4cHJlc3Npb24nO1xuXG4vKipcbiAqIFRyYWNrcyBgbGV0YCBiaW5kaW5ncyBkdXJpbmcgZXhwcmVzc2lvbiBwYXJzaW5nLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU2NvcGUge1xuICAgIHBhcmVudDogP1Njb3BlO1xuICAgIGJpbmRpbmdzOiB7W3N0cmluZ106IEV4cHJlc3Npb259O1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudD86IFNjb3BlLCBiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+ID0gW10pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgZXhwcmVzc2lvbl0gb2YgYmluZGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbbmFtZV0gPSBleHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uY2F0KGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY29wZSh0aGlzLCBiaW5kaW5ncyk7XG4gICAgfVxuXG4gICAgZ2V0KG5hbWU6IHN0cmluZyk6IEV4cHJlc3Npb24ge1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nc1tuYW1lXSkgeyByZXR1cm4gdGhpcy5iaW5kaW5nc1tuYW1lXTsgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgcmV0dXJuIHRoaXMucGFyZW50LmdldChuYW1lKTsgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gbm90IGZvdW5kIGluIHNjb3BlLmApO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbbmFtZV0pIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5oYXMobmFtZSkgOiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNjb3BlO1xuIiwiLy8gQGZsb3dcblxuZXhwb3J0IHR5cGUgTnVsbFR5cGVUID0geyBraW5kOiAnbnVsbCcgfTtcbmV4cG9ydCB0eXBlIE51bWJlclR5cGVUID0geyBraW5kOiAnbnVtYmVyJyB9O1xuZXhwb3J0IHR5cGUgU3RyaW5nVHlwZVQgPSB7IGtpbmQ6ICdzdHJpbmcnIH07XG5leHBvcnQgdHlwZSBCb29sZWFuVHlwZVQgPSB7IGtpbmQ6ICdib29sZWFuJyB9O1xuZXhwb3J0IHR5cGUgQ29sb3JUeXBlVCA9IHsga2luZDogJ2NvbG9yJyB9O1xuZXhwb3J0IHR5cGUgT2JqZWN0VHlwZVQgPSB7IGtpbmQ6ICdvYmplY3QnIH07XG5leHBvcnQgdHlwZSBWYWx1ZVR5cGVUID0geyBraW5kOiAndmFsdWUnIH07XG5leHBvcnQgdHlwZSBFcnJvclR5cGVUID0geyBraW5kOiAnZXJyb3InIH07XG5leHBvcnQgdHlwZSBDb2xsYXRvclR5cGVUID0geyBraW5kOiAnY29sbGF0b3InIH07XG5leHBvcnQgdHlwZSBGb3JtYXR0ZWRUeXBlVCA9IHsga2luZDogJ2Zvcm1hdHRlZCcgfTtcblxuZXhwb3J0IHR5cGUgRXZhbHVhdGlvbktpbmQgPSAnY29uc3RhbnQnIHwgJ3NvdXJjZScgfCAnY2FtZXJhJyB8ICdjb21wb3NpdGUnO1xuXG5leHBvcnQgdHlwZSBUeXBlID1cbiAgICBOdWxsVHlwZVQgfFxuICAgIE51bWJlclR5cGVUIHxcbiAgICBTdHJpbmdUeXBlVCB8XG4gICAgQm9vbGVhblR5cGVUIHxcbiAgICBDb2xvclR5cGVUIHxcbiAgICBPYmplY3RUeXBlVCB8XG4gICAgVmFsdWVUeXBlVCB8XG4gICAgQXJyYXlUeXBlIHwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIEVycm9yVHlwZVQgfFxuICAgIENvbGxhdG9yVHlwZVQgfFxuICAgIEZvcm1hdHRlZFR5cGVUXG5cbmV4cG9ydCB0eXBlIEFycmF5VHlwZSA9IHtcbiAgICBraW5kOiAnYXJyYXknLFxuICAgIGl0ZW1UeXBlOiBUeXBlLFxuICAgIE46ID9udW1iZXJcbn1cblxuZXhwb3J0IGNvbnN0IE51bGxUeXBlID0geyBraW5kOiAnbnVsbCcgfTtcbmV4cG9ydCBjb25zdCBOdW1iZXJUeXBlID0geyBraW5kOiAnbnVtYmVyJyB9O1xuZXhwb3J0IGNvbnN0IFN0cmluZ1R5cGUgPSB7IGtpbmQ6ICdzdHJpbmcnIH07XG5leHBvcnQgY29uc3QgQm9vbGVhblR5cGUgPSB7IGtpbmQ6ICdib29sZWFuJyB9O1xuZXhwb3J0IGNvbnN0IENvbG9yVHlwZSA9IHsga2luZDogJ2NvbG9yJyB9O1xuZXhwb3J0IGNvbnN0IE9iamVjdFR5cGUgPSB7IGtpbmQ6ICdvYmplY3QnIH07XG5leHBvcnQgY29uc3QgVmFsdWVUeXBlID0geyBraW5kOiAndmFsdWUnIH07XG5leHBvcnQgY29uc3QgRXJyb3JUeXBlID0geyBraW5kOiAnZXJyb3InIH07XG5leHBvcnQgY29uc3QgQ29sbGF0b3JUeXBlID0geyBraW5kOiAnY29sbGF0b3InIH07XG5leHBvcnQgY29uc3QgRm9ybWF0dGVkVHlwZSA9IHsga2luZDogJ2Zvcm1hdHRlZCcgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5KGl0ZW1UeXBlOiBUeXBlLCBOOiA/bnVtYmVyKTogQXJyYXlUeXBlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnYXJyYXknLFxuICAgICAgICBpdGVtVHlwZSxcbiAgICAgICAgTlxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyh0eXBlOiBUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gdG9TdHJpbmcodHlwZS5pdGVtVHlwZSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdHlwZS5OID09PSAnbnVtYmVyJyA/XG4gICAgICAgICAgICBgYXJyYXk8JHtpdGVtVHlwZX0sICR7dHlwZS5OfT5gIDpcbiAgICAgICAgICAgIHR5cGUuaXRlbVR5cGUua2luZCA9PT0gJ3ZhbHVlJyA/ICdhcnJheScgOiBgYXJyYXk8JHtpdGVtVHlwZX0+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHlwZS5raW5kO1xuICAgIH1cbn1cblxuY29uc3QgdmFsdWVNZW1iZXJUeXBlcyA9IFtcbiAgICBOdWxsVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgQm9vbGVhblR5cGUsXG4gICAgQ29sb3JUeXBlLFxuICAgIEZvcm1hdHRlZFR5cGUsXG4gICAgT2JqZWN0VHlwZSxcbiAgICBhcnJheShWYWx1ZVR5cGUpXG5dO1xuXG4vKipcbiAqIFJldHVybnMgbnVsbCBpZiBgdGAgaXMgYSBzdWJ0eXBlIG9mIGBleHBlY3RlZGA7IG90aGVyd2lzZSByZXR1cm5zIGFuXG4gKiBlcnJvciBtZXNzYWdlLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU3VidHlwZShleHBlY3RlZDogVHlwZSwgdDogVHlwZSk6ID9zdHJpbmcge1xuICAgIGlmICh0LmtpbmQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgLy8gRXJyb3IgaXMgYSBzdWJ0eXBlIG9mIGV2ZXJ5IHR5cGVcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmICh0LmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICgodC5OID09PSAwICYmIHQuaXRlbVR5cGUua2luZCA9PT0gJ3ZhbHVlJykgfHwgIWNoZWNrU3VidHlwZShleHBlY3RlZC5pdGVtVHlwZSwgdC5pdGVtVHlwZSkpICYmXG4gICAgICAgICAgICAodHlwZW9mIGV4cGVjdGVkLk4gIT09ICdudW1iZXInIHx8IGV4cGVjdGVkLk4gPT09IHQuTikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSB0LmtpbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVyVHlwZSBvZiB2YWx1ZU1lbWJlclR5cGVzKSB7XG4gICAgICAgICAgICBpZiAoIWNoZWNrU3VidHlwZShtZW1iZXJUeXBlLCB0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGBFeHBlY3RlZCAke3RvU3RyaW5nKGV4cGVjdGVkKX0gYnV0IGZvdW5kICR7dG9TdHJpbmcodCl9IGluc3RlYWQuYDtcbn1cbiIsIi8vIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMi5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vY3NzLWNvbG9yLXBhcnNlci1qc1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4vLyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4vLyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvXG52YXIga0NTU0NvbG9yVGFibGUgPSB7XG4gIFwidHJhbnNwYXJlbnRcIjogWzAsMCwwLDBdLCBcImFsaWNlYmx1ZVwiOiBbMjQwLDI0OCwyNTUsMV0sXG4gIFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsMjM1LDIxNSwxXSwgXCJhcXVhXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiYXF1YW1hcmluZVwiOiBbMTI3LDI1NSwyMTIsMV0sIFwiYXp1cmVcIjogWzI0MCwyNTUsMjU1LDFdLFxuICBcImJlaWdlXCI6IFsyNDUsMjQ1LDIyMCwxXSwgXCJiaXNxdWVcIjogWzI1NSwyMjgsMTk2LDFdLFxuICBcImJsYWNrXCI6IFswLDAsMCwxXSwgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LDIzNSwyMDUsMV0sXG4gIFwiYmx1ZVwiOiBbMCwwLDI1NSwxXSwgXCJibHVldmlvbGV0XCI6IFsxMzgsNDMsMjI2LDFdLFxuICBcImJyb3duXCI6IFsxNjUsNDIsNDIsMV0sIFwiYnVybHl3b29kXCI6IFsyMjIsMTg0LDEzNSwxXSxcbiAgXCJjYWRldGJsdWVcIjogWzk1LDE1OCwxNjAsMV0sIFwiY2hhcnRyZXVzZVwiOiBbMTI3LDI1NSwwLDFdLFxuICBcImNob2NvbGF0ZVwiOiBbMjEwLDEwNSwzMCwxXSwgXCJjb3JhbFwiOiBbMjU1LDEyNyw4MCwxXSxcbiAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLDE0OSwyMzcsMV0sIFwiY29ybnNpbGtcIjogWzI1NSwyNDgsMjIwLDFdLFxuICBcImNyaW1zb25cIjogWzIyMCwyMCw2MCwxXSwgXCJjeWFuXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiZGFya2JsdWVcIjogWzAsMCwxMzksMV0sIFwiZGFya2N5YW5cIjogWzAsMTM5LDEzOSwxXSxcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsMTM0LDExLDFdLCBcImRhcmtncmF5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJrZ3JlZW5cIjogWzAsMTAwLDAsMV0sIFwiZGFya2dyZXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtraGFraVwiOiBbMTg5LDE4MywxMDcsMV0sIFwiZGFya21hZ2VudGFcIjogWzEzOSwwLDEzOSwxXSxcbiAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsMTA3LDQ3LDFdLCBcImRhcmtvcmFuZ2VcIjogWzI1NSwxNDAsMCwxXSxcbiAgXCJkYXJrb3JjaGlkXCI6IFsxNTMsNTAsMjA0LDFdLCBcImRhcmtyZWRcIjogWzEzOSwwLDAsMV0sXG4gIFwiZGFya3NhbG1vblwiOiBbMjMzLDE1MCwxMjIsMV0sIFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsMTg4LDE0MywxXSxcbiAgXCJkYXJrc2xhdGVibHVlXCI6IFs3Miw2MSwxMzksMV0sIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsNzksNzksMV0sXG4gIFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsNzksNzksMV0sIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwyMDYsMjA5LDFdLFxuICBcImRhcmt2aW9sZXRcIjogWzE0OCwwLDIxMSwxXSwgXCJkZWVwcGlua1wiOiBbMjU1LDIwLDE0NywxXSxcbiAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwxOTEsMjU1LDFdLCBcImRpbWdyYXlcIjogWzEwNSwxMDUsMTA1LDFdLFxuICBcImRpbWdyZXlcIjogWzEwNSwxMDUsMTA1LDFdLCBcImRvZGdlcmJsdWVcIjogWzMwLDE0NCwyNTUsMV0sXG4gIFwiZmlyZWJyaWNrXCI6IFsxNzgsMzQsMzQsMV0sIFwiZmxvcmFsd2hpdGVcIjogWzI1NSwyNTAsMjQwLDFdLFxuICBcImZvcmVzdGdyZWVuXCI6IFszNCwxMzksMzQsMV0sIFwiZnVjaHNpYVwiOiBbMjU1LDAsMjU1LDFdLFxuICBcImdhaW5zYm9yb1wiOiBbMjIwLDIyMCwyMjAsMV0sIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LDI0OCwyNTUsMV0sXG4gIFwiZ29sZFwiOiBbMjU1LDIxNSwwLDFdLCBcImdvbGRlbnJvZFwiOiBbMjE4LDE2NSwzMiwxXSxcbiAgXCJncmF5XCI6IFsxMjgsMTI4LDEyOCwxXSwgXCJncmVlblwiOiBbMCwxMjgsMCwxXSxcbiAgXCJncmVlbnllbGxvd1wiOiBbMTczLDI1NSw0NywxXSwgXCJncmV5XCI6IFsxMjgsMTI4LDEyOCwxXSxcbiAgXCJob25leWRld1wiOiBbMjQwLDI1NSwyNDAsMV0sIFwiaG90cGlua1wiOiBbMjU1LDEwNSwxODAsMV0sXG4gIFwiaW5kaWFucmVkXCI6IFsyMDUsOTIsOTIsMV0sIFwiaW5kaWdvXCI6IFs3NSwwLDEzMCwxXSxcbiAgXCJpdm9yeVwiOiBbMjU1LDI1NSwyNDAsMV0sIFwia2hha2lcIjogWzI0MCwyMzAsMTQwLDFdLFxuICBcImxhdmVuZGVyXCI6IFsyMzAsMjMwLDI1MCwxXSwgXCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsMjQwLDI0NSwxXSxcbiAgXCJsYXduZ3JlZW5cIjogWzEyNCwyNTIsMCwxXSwgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwyNTAsMjA1LDFdLFxuICBcImxpZ2h0Ymx1ZVwiOiBbMTczLDIxNiwyMzAsMV0sIFwibGlnaHRjb3JhbFwiOiBbMjQwLDEyOCwxMjgsMV0sXG4gIFwibGlnaHRjeWFuXCI6IFsyMjQsMjU1LDI1NSwxXSwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLDI1MCwyMTAsMV0sXG4gIFwibGlnaHRncmF5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodGdyZWVuXCI6IFsxNDQsMjM4LDE0NCwxXSxcbiAgXCJsaWdodGdyZXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0cGlua1wiOiBbMjU1LDE4MiwxOTMsMV0sXG4gIFwibGlnaHRzYWxtb25cIjogWzI1NSwxNjAsMTIyLDFdLCBcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLDE3OCwxNzAsMV0sXG4gIFwibGlnaHRza3libHVlXCI6IFsxMzUsMjA2LDI1MCwxXSwgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LDEzNiwxNTMsMV0sXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwxMzYsMTUzLDFdLCBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsMTk2LDIyMiwxXSxcbiAgXCJsaWdodHllbGxvd1wiOiBbMjU1LDI1NSwyMjQsMV0sIFwibGltZVwiOiBbMCwyNTUsMCwxXSxcbiAgXCJsaW1lZ3JlZW5cIjogWzUwLDIwNSw1MCwxXSwgXCJsaW5lblwiOiBbMjUwLDI0MCwyMzAsMV0sXG4gIFwibWFnZW50YVwiOiBbMjU1LDAsMjU1LDFdLCBcIm1hcm9vblwiOiBbMTI4LDAsMCwxXSxcbiAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsMjA1LDE3MCwxXSwgXCJtZWRpdW1ibHVlXCI6IFswLDAsMjA1LDFdLFxuICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LDg1LDIxMSwxXSwgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywxMTIsMjE5LDFdLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwxNzksMTEzLDFdLCBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLDEwNCwyMzgsMV0sXG4gIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsMjUwLDE1NCwxXSwgXCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLDIwOSwyMDQsMV0sXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksMjEsMTMzLDFdLCBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsMjUsMTEyLDFdLFxuICBcIm1pbnRjcmVhbVwiOiBbMjQ1LDI1NSwyNTAsMV0sIFwibWlzdHlyb3NlXCI6IFsyNTUsMjI4LDIyNSwxXSxcbiAgXCJtb2NjYXNpblwiOiBbMjU1LDIyOCwxODEsMV0sIFwibmF2YWpvd2hpdGVcIjogWzI1NSwyMjIsMTczLDFdLFxuICBcIm5hdnlcIjogWzAsMCwxMjgsMV0sIFwib2xkbGFjZVwiOiBbMjUzLDI0NSwyMzAsMV0sXG4gIFwib2xpdmVcIjogWzEyOCwxMjgsMCwxXSwgXCJvbGl2ZWRyYWJcIjogWzEwNywxNDIsMzUsMV0sXG4gIFwib3JhbmdlXCI6IFsyNTUsMTY1LDAsMV0sIFwib3JhbmdlcmVkXCI6IFsyNTUsNjksMCwxXSxcbiAgXCJvcmNoaWRcIjogWzIxOCwxMTIsMjE0LDFdLCBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwyMzIsMTcwLDFdLFxuICBcInBhbGVncmVlblwiOiBbMTUyLDI1MSwxNTIsMV0sIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LDIzOCwyMzgsMV0sXG4gIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LDExMiwxNDcsMV0sIFwicGFwYXlhd2hpcFwiOiBbMjU1LDIzOSwyMTMsMV0sXG4gIFwicGVhY2hwdWZmXCI6IFsyNTUsMjE4LDE4NSwxXSwgXCJwZXJ1XCI6IFsyMDUsMTMzLDYzLDFdLFxuICBcInBpbmtcIjogWzI1NSwxOTIsMjAzLDFdLCBcInBsdW1cIjogWzIyMSwxNjAsMjIxLDFdLFxuICBcInBvd2RlcmJsdWVcIjogWzE3NiwyMjQsMjMwLDFdLCBcInB1cnBsZVwiOiBbMTI4LDAsMTI4LDFdLFxuICBcInJlYmVjY2FwdXJwbGVcIjogWzEwMiw1MSwxNTMsMV0sXG4gIFwicmVkXCI6IFsyNTUsMCwwLDFdLCBcInJvc3licm93blwiOiBbMTg4LDE0MywxNDMsMV0sXG4gIFwicm95YWxibHVlXCI6IFs2NSwxMDUsMjI1LDFdLCBcInNhZGRsZWJyb3duXCI6IFsxMzksNjksMTksMV0sXG4gIFwic2FsbW9uXCI6IFsyNTAsMTI4LDExNCwxXSwgXCJzYW5keWJyb3duXCI6IFsyNDQsMTY0LDk2LDFdLFxuICBcInNlYWdyZWVuXCI6IFs0NiwxMzksODcsMV0sIFwic2Vhc2hlbGxcIjogWzI1NSwyNDUsMjM4LDFdLFxuICBcInNpZW5uYVwiOiBbMTYwLDgyLDQ1LDFdLCBcInNpbHZlclwiOiBbMTkyLDE5MiwxOTIsMV0sXG4gIFwic2t5Ymx1ZVwiOiBbMTM1LDIwNiwyMzUsMV0sIFwic2xhdGVibHVlXCI6IFsxMDYsOTAsMjA1LDFdLFxuICBcInNsYXRlZ3JheVwiOiBbMTEyLDEyOCwxNDQsMV0sIFwic2xhdGVncmV5XCI6IFsxMTIsMTI4LDE0NCwxXSxcbiAgXCJzbm93XCI6IFsyNTUsMjUwLDI1MCwxXSwgXCJzcHJpbmdncmVlblwiOiBbMCwyNTUsMTI3LDFdLFxuICBcInN0ZWVsYmx1ZVwiOiBbNzAsMTMwLDE4MCwxXSwgXCJ0YW5cIjogWzIxMCwxODAsMTQwLDFdLFxuICBcInRlYWxcIjogWzAsMTI4LDEyOCwxXSwgXCJ0aGlzdGxlXCI6IFsyMTYsMTkxLDIxNiwxXSxcbiAgXCJ0b21hdG9cIjogWzI1NSw5OSw3MSwxXSwgXCJ0dXJxdW9pc2VcIjogWzY0LDIyNCwyMDgsMV0sXG4gIFwidmlvbGV0XCI6IFsyMzgsMTMwLDIzOCwxXSwgXCJ3aGVhdFwiOiBbMjQ1LDIyMiwxNzksMV0sXG4gIFwid2hpdGVcIjogWzI1NSwyNTUsMjU1LDFdLCBcIndoaXRlc21va2VcIjogWzI0NSwyNDUsMjQ1LDFdLFxuICBcInllbGxvd1wiOiBbMjU1LDI1NSwwLDFdLCBcInllbGxvd2dyZWVuXCI6IFsxNTQsMjA1LDUwLDFdfVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfYnl0ZShpKSB7ICAvLyBDbGFtcCB0byBpbnRlZ2VyIDAgLi4gMjU1LlxuICBpID0gTWF0aC5yb3VuZChpKTsgIC8vIFNlZW1zIHRvIGJlIHdoYXQgQ2hyb21lIGRvZXMgKHZzIHRydW5jYXRpb24pLlxuICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDI1NSA/IDI1NSA6IGk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19mbG9hdChmKSB7ICAvLyBDbGFtcCB0byBmbG9hdCAwLjAgLi4gMS4wLlxuICByZXR1cm4gZiA8IDAgPyAwIDogZiA+IDEgPyAxIDogZjtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2ludChzdHIpIHsgIC8vIGludCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUZsb2F0KHN0cikgLyAxMDAgKiAyNTUpO1xuICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VJbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19mbG9hdChzdHIpIHsgIC8vIGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikgLyAxMDApO1xuICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkge1xuICBpZiAoaCA8IDApIGggKz0gMTtcbiAgZWxzZSBpZiAoaCA+IDEpIGggLT0gMTtcblxuICBpZiAoaCAqIDYgPCAxKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiBoICogNjtcbiAgaWYgKGggKiAyIDwgMSkgcmV0dXJuIG0yO1xuICBpZiAoaCAqIDMgPCAyKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiAoMi8zIC0gaCkgKiA2O1xuICByZXR1cm4gbTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ1NTQ29sb3IoY3NzX3N0cikge1xuICAvLyBSZW1vdmUgYWxsIHdoaXRlc3BhY2UsIG5vdCBjb21wbGlhbnQsIGJ1dCBzaG91bGQganVzdCBiZSBtb3JlIGFjY2VwdGluZy5cbiAgdmFyIHN0ciA9IGNzc19zdHIucmVwbGFjZSgvIC9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDb2xvciBrZXl3b3JkcyAoYW5kIHRyYW5zcGFyZW50KSBsb29rdXAuXG4gIGlmIChzdHIgaW4ga0NTU0NvbG9yVGFibGUpIHJldHVybiBrQ1NTQ29sb3JUYWJsZVtzdHJdLnNsaWNlKCk7ICAvLyBkdXAuXG5cbiAgLy8gI2FiYyBhbmQgI2FiYzEyMyBzeW50YXguXG4gIGlmIChzdHJbMF0gPT09ICcjJykge1xuICAgIGlmIChzdHIubGVuZ3RoID09PSA0KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWygoaXYgJiAweGYwMCkgPj4gNCkgfCAoKGl2ICYgMHhmMDApID4+IDgpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYwKSB8ICgoaXYgJiAweGYwKSA+PiA0KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmKSB8ICgoaXYgJiAweGYpIDw8IDQpLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9IGVsc2UgaWYgKHN0ci5sZW5ndGggPT09IDcpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZmZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKGl2ICYgMHhmZjAwMDApID4+IDE2LFxuICAgICAgICAgICAgICAoaXYgJiAweGZmMDApID4+IDgsXG4gICAgICAgICAgICAgIGl2ICYgMHhmZixcbiAgICAgICAgICAgICAgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgb3AgPSBzdHIuaW5kZXhPZignKCcpLCBlcCA9IHN0ci5pbmRleE9mKCcpJyk7XG4gIGlmIChvcCAhPT0gLTEgJiYgZXAgKyAxID09PSBzdHIubGVuZ3RoKSB7XG4gICAgdmFyIGZuYW1lID0gc3RyLnN1YnN0cigwLCBvcCk7XG4gICAgdmFyIHBhcmFtcyA9IHN0ci5zdWJzdHIob3ArMSwgZXAtKG9wKzEpKS5zcGxpdCgnLCcpO1xuICAgIHZhciBhbHBoYSA9IDE7ICAvLyBUbyBhbGxvdyBjYXNlIGZhbGx0aHJvdWdoLlxuICAgIHN3aXRjaCAoZm5hbWUpIHtcbiAgICAgIGNhc2UgJ3JnYmEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ3JnYic6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFtwYXJzZV9jc3NfaW50KHBhcmFtc1swXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMV0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzJdKSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBjYXNlICdoc2xhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdoc2wnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBoID0gKCgocGFyc2VGbG9hdChwYXJhbXNbMF0pICUgMzYwKSArIDM2MCkgJSAzNjApIC8gMzYwOyAgLy8gMCAuLiAxXG4gICAgICAgIC8vIE5PVEUoZGVhbm0pOiBBY2NvcmRpbmcgdG8gdGhlIENTUyBzcGVjIHMvbCBzaG91bGQgb25seSBiZVxuICAgICAgICAvLyBwZXJjZW50YWdlcywgYnV0IHdlIGRvbid0IGJvdGhlciBhbmQgbGV0IGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gICAgICAgIHZhciBzID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1sxXSk7XG4gICAgICAgIHZhciBsID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1syXSk7XG4gICAgICAgIHZhciBtMiA9IGwgPD0gMC41ID8gbCAqIChzICsgMSkgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgbTEgPSBsICogMiAtIG0yO1xuICAgICAgICByZXR1cm4gW2NsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCsxLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgtMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnRyeSB7IGV4cG9ydHMucGFyc2VDU1NDb2xvciA9IHBhcnNlQ1NTQ29sb3IgfSBjYXRjaChlKSB7IH1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHBhcnNlQ1NTQ29sb3IgfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbi8qKlxuICogQW4gUkdCQSBjb2xvciB2YWx1ZS4gQ3JlYXRlIGluc3RhbmNlcyBmcm9tIGNvbG9yIHN0cmluZ3MgdXNpbmcgdGhlIHN0YXRpY1xuICogbWV0aG9kIGBDb2xvci5wYXJzZWAuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIFJHQiBjaGFubmVsIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIGBbMCwgMV1gLCBwcmVtdWx0aXBsaWVkIGJ5IEEuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHIgVGhlIHJlZCBjaGFubmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IGcgVGhlIGdyZWVuIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gYiBUaGUgYmx1ZSBjaGFubmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IGEgVGhlIGFscGhhIGNoYW5uZWwuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb2xvciB7XG4gICAgcjogbnVtYmVyO1xuICAgIGc6IG51bWJlcjtcbiAgICBiOiBudW1iZXI7XG4gICAgYTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyID0gMSkge1xuICAgICAgICB0aGlzLnIgPSByO1xuICAgICAgICB0aGlzLmcgPSBnO1xuICAgICAgICB0aGlzLmIgPSBiO1xuICAgICAgICB0aGlzLmEgPSBhO1xuICAgIH1cblxuICAgIHN0YXRpYyBibGFjazogQ29sb3I7XG4gICAgc3RhdGljIHdoaXRlOiBDb2xvcjtcbiAgICBzdGF0aWMgdHJhbnNwYXJlbnQ6IENvbG9yO1xuICAgIHN0YXRpYyByZWQ6IENvbG9yO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCByZXR1cm5zIGEgYENvbG9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyBBIGBDb2xvcmAgaW5zdGFuY2UsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBjb2xvciBzdHJpbmcuXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKGlucHV0OiA/c3RyaW5nKTogQ29sb3IgfCB2b2lkIHtcbiAgICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJnYmEgPSBwYXJzZUNTU0NvbG9yKGlucHV0KTtcbiAgICAgICAgaWYgKCFyZ2JhKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihcbiAgICAgICAgICAgIHJnYmFbMF0gLyAyNTUgKiByZ2JhWzNdLFxuICAgICAgICAgICAgcmdiYVsxXSAvIDI1NSAqIHJnYmFbM10sXG4gICAgICAgICAgICByZ2JhWzJdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgIHJnYmFbM11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIFJHQkEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29sb3IgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBSR0JBIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwdXJwbGUgPSBuZXcgQ29sb3IucGFyc2UoJ3B1cnBsZScpO1xuICAgICAqIHB1cnBsZS50b1N0cmluZzsgLy8gPSBcInJnYmEoMTI4LDAsMTI4LDEpXCJcbiAgICAgKiB2YXIgdHJhbnNsdWNlbnRHcmVlbiA9IG5ldyBDb2xvci5wYXJzZSgncmdiYSgyNiwgMjA3LCAyNiwgLjczKScpO1xuICAgICAqIHRyYW5zbHVjZW50R3JlZW4udG9TdHJpbmcoKTsgLy8gPSBcInJnYmEoMjYsMjA3LDI2LDAuNzMpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbciwgZywgYiwgYV0gPSB0aGlzLnRvQXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIGByZ2JhKCR7TWF0aC5yb3VuZChyKX0sJHtNYXRoLnJvdW5kKGcpfSwke01hdGgucm91bmQoYil9LCR7YX0pYDtcbiAgICB9XG5cbiAgICB0b0FycmF5KCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3Qge3IsIGcsIGIsIGF9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGEgPT09IDAgPyBbMCwgMCwgMCwgMF0gOiBbXG4gICAgICAgICAgICByICogMjU1IC8gYSxcbiAgICAgICAgICAgIGcgKiAyNTUgLyBhLFxuICAgICAgICAgICAgYiAqIDI1NSAvIGEsXG4gICAgICAgICAgICBhXG4gICAgICAgIF07XG4gICAgfVxufVxuXG5Db2xvci5ibGFjayA9IG5ldyBDb2xvcigwLCAwLCAwLCAxKTtcbkNvbG9yLndoaXRlID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuQ29sb3IudHJhbnNwYXJlbnQgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7XG5Db2xvci5yZWQgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XG5cbmV4cG9ydCBkZWZhdWx0IENvbG9yO1xuIiwiLy8gQGZsb3dcblxuLy8gRmxvdyB0eXBlIGRlY2xhcmF0aW9ucyBmb3IgSW50bCBjcmliYmVkIGZyb21cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xMjcwXG5cbmRlY2xhcmUgdmFyIEludGw6IHtcbiAgICBDb2xsYXRvcjogQ2xhc3M8SW50bCRDb2xsYXRvcj5cbn07XG5cbmRlY2xhcmUgY2xhc3MgSW50bCRDb2xsYXRvciB7XG4gICAgY29uc3RydWN0b3IgKFxuICAgICAgICBsb2NhbGVzPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIG9wdGlvbnM/OiBDb2xsYXRvck9wdGlvbnNcbiAgICApOiBJbnRsJENvbGxhdG9yO1xuXG4gICAgc3RhdGljIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogQ29sbGF0b3JPcHRpb25zXG4gICAgKTogSW50bCRDb2xsYXRvcjtcblxuICAgIGNvbXBhcmUgKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyO1xuXG4gICAgcmVzb2x2ZWRPcHRpb25zKCk6IGFueTtcbn1cblxudHlwZSBDb2xsYXRvck9wdGlvbnMgPSB7XG4gICAgbG9jYWxlTWF0Y2hlcj86ICdsb29rdXAnIHwgJ2Jlc3QgZml0JyxcbiAgICB1c2FnZT86ICdzb3J0JyB8ICdzZWFyY2gnLFxuICAgIHNlbnNpdGl2aXR5PzogJ2Jhc2UnIHwgJ2FjY2VudCcgfCAnY2FzZScgfCAndmFyaWFudCcsXG4gICAgaWdub3JlUHVuY3R1YXRpb24/OiBib29sZWFuLFxuICAgIG51bWVyaWM/OiBib29sZWFuLFxuICAgIGNhc2VGaXJzdD86ICd1cHBlcicgfCAnbG93ZXInIHwgJ2ZhbHNlJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xsYXRvciB7XG4gICAgbG9jYWxlOiBzdHJpbmcgfCBudWxsO1xuICAgIHNlbnNpdGl2aXR5OiAnYmFzZScgfCAnYWNjZW50JyB8ICdjYXNlJyB8ICd2YXJpYW50JztcbiAgICBjb2xsYXRvcjogSW50bCRDb2xsYXRvcjtcblxuICAgIGNvbnN0cnVjdG9yKGNhc2VTZW5zaXRpdmU6IGJvb2xlYW4sIGRpYWNyaXRpY1NlbnNpdGl2ZTogYm9vbGVhbiwgbG9jYWxlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmIChjYXNlU2Vuc2l0aXZlKVxuICAgICAgICAgICAgdGhpcy5zZW5zaXRpdml0eSA9IGRpYWNyaXRpY1NlbnNpdGl2ZSA/ICd2YXJpYW50JyA6ICdjYXNlJztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5zZW5zaXRpdml0eSA9IGRpYWNyaXRpY1NlbnNpdGl2ZSA/ICdhY2NlbnQnIDogJ2Jhc2UnO1xuXG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuICAgICAgICB0aGlzLmNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IodGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZSA6IFtdLFxuICAgICAgICAgICAgeyBzZW5zaXRpdml0eTogdGhpcy5zZW5zaXRpdml0eSwgdXNhZ2U6ICdzZWFyY2gnIH0pO1xuICAgIH1cblxuICAgIGNvbXBhcmUobGhzOiBzdHJpbmcsIHJoczogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZShsaHMsIHJocyk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gV2UgY3JlYXRlIGEgQ29sbGF0b3Igd2l0aG91dCBcInVzYWdlOiBzZWFyY2hcIiBiZWNhdXNlIHdlIGRvbid0IHdhbnRcbiAgICAgICAgLy8gdGhlIHNlYXJjaCBvcHRpb25zIGVuY29kZWQgaW4gb3VyIHJlc3VsdCAoZS5nLiBcImVuLXUtY28tc2VhcmNoXCIpXG4gICAgICAgIHJldHVybiBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlIDogW10pXG4gICAgICAgICAgICAucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3V0aWwvY29sb3InO1xuXG5leHBvcnQgY2xhc3MgRm9ybWF0dGVkU2VjdGlvbiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHNjYWxlOiBudW1iZXIgfCBudWxsO1xuICAgIGZvbnRTdGFjazogc3RyaW5nIHwgbnVsbDtcbiAgICB0ZXh0Q29sb3I6IENvbG9yIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKHRleHQ6IHN0cmluZywgc2NhbGU6IG51bWJlciB8IG51bGwsIGZvbnRTdGFjazogc3RyaW5nIHwgbnVsbCwgdGV4dENvbG9yOiBDb2xvciB8IG51bGwpIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgICAgICB0aGlzLmZvbnRTdGFjayA9IGZvbnRTdGFjaztcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0ZXh0Q29sb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXR0ZWQge1xuICAgIHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uPikge1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21TdHJpbmcodW5mb3JtYXR0ZWQ6IHN0cmluZyk6IEZvcm1hdHRlZCB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybWF0dGVkKFtuZXcgRm9ybWF0dGVkU2VjdGlvbih1bmZvcm1hdHRlZCwgbnVsbCwgbnVsbCwgbnVsbCldKTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5tYXAoc2VjdGlvbiA9PiBzZWN0aW9uLnRleHQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wiZm9ybWF0XCJdO1xuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5zZWN0aW9ucykge1xuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHNlY3Rpb24udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5mb250U3RhY2spIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1widGV4dC1mb250XCJdID0gW1wibGl0ZXJhbFwiLCBzZWN0aW9uLmZvbnRTdGFjay5zcGxpdCgnLCcpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1tcImZvbnQtc2NhbGVcIl0gPSBzZWN0aW9uLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1tcInRleHQtY29sb3JcIl0gPSBbXCJyZ2JhXCJdLmNvbmNhdChzZWN0aW9uLnRleHRDb2xvci50b0FycmF5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3V0aWwvY29sb3InO1xuaW1wb3J0IENvbGxhdG9yIGZyb20gJy4vdHlwZXMvY29sbGF0b3InO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuL3R5cGVzL2Zvcm1hdHRlZCc7XG5pbXBvcnQgeyBOdWxsVHlwZSwgTnVtYmVyVHlwZSwgU3RyaW5nVHlwZSwgQm9vbGVhblR5cGUsIENvbG9yVHlwZSwgT2JqZWN0VHlwZSwgVmFsdWVUeXBlLCBDb2xsYXRvclR5cGUsIEZvcm1hdHRlZFR5cGUsIGFycmF5IH0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSR0JBKHI6IG1peGVkLCBnOiBtaXhlZCwgYjogbWl4ZWQsIGE/OiBtaXhlZCk6ID9zdHJpbmcge1xuICAgIGlmICghKFxuICAgICAgICB0eXBlb2YgciA9PT0gJ251bWJlcicgJiYgciA+PSAwICYmIHIgPD0gMjU1ICYmXG4gICAgICAgIHR5cGVvZiBnID09PSAnbnVtYmVyJyAmJiBnID49IDAgJiYgZyA8PSAyNTUgJiZcbiAgICAgICAgdHlwZW9mIGIgPT09ICdudW1iZXInICYmIGIgPj0gMCAmJiBiIDw9IDI1NVxuICAgICkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBbciwgZywgYiwgYV0gOiBbciwgZywgYl07XG4gICAgICAgIHJldHVybiBgSW52YWxpZCByZ2JhIHZhbHVlIFske3ZhbHVlLmpvaW4oJywgJyl9XTogJ3InLCAnZycsIGFuZCAnYicgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NS5gO1xuICAgIH1cblxuICAgIGlmICghKFxuICAgICAgICB0eXBlb2YgYSA9PT0gJ3VuZGVmaW5lZCcgfHwgKHR5cGVvZiBhID09PSAnbnVtYmVyJyAmJiBhID49IDAgJiYgYSA8PSAxKVxuICAgICkpIHtcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHJnYmEgdmFsdWUgWyR7W3IsIGcsIGIsIGFdLmpvaW4oJywgJyl9XTogJ2EnIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIFZhbHVlID0gbnVsbCB8IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBDb2xvciB8IENvbGxhdG9yIHwgRm9ybWF0dGVkIHwgJFJlYWRPbmx5QXJyYXk8VmFsdWU+IHwgeyArW3N0cmluZ106IFZhbHVlIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsdWUobWl4ZWQ6IG1peGVkKTogYm9vbGVhbiB7XG4gICAgaWYgKG1peGVkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1peGVkIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIENvbGxhdG9yKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1peGVkKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShtaXhlZFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZU9mKHZhbHVlOiBWYWx1ZSk6IFR5cGUge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTnVsbFR5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmdUeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW5UeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gTnVtYmVyVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGF0b3IpIHtcbiAgICAgICAgcmV0dXJuIENvbGxhdG9yVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiBGb3JtYXR0ZWRUeXBlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICBsZXQgaXRlbVR5cGU6ID9UeXBlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHR5cGVPZihpdGVtKTtcbiAgICAgICAgICAgIGlmICghaXRlbVR5cGUpIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlID09PSB0KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gVmFsdWVUeXBlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFycmF5KGl0ZW1UeXBlIHx8IFZhbHVlVHlwZSwgbGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jyk7XG4gICAgICAgIHJldHVybiBPYmplY3RUeXBlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlOiBWYWx1ZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sb3IgfHwgdmFsdWUgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IENvbG9yLCBDb2xsYXRvciB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgaXNWYWx1ZSwgdHlwZU9mLCBDb2xvciB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgVmFsdWUgfSAgZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcblxuY2xhc3MgTGl0ZXJhbCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgdmFsdWU6IFZhbHVlO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgdmFsdWU6IFZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgJ2xpdGVyYWwnIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBpZiAoIWlzVmFsdWUoYXJnc1sxXSkpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgaW52YWxpZCB2YWx1ZWApO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGFyZ3NbMV06IGFueSk7XG4gICAgICAgIGxldCB0eXBlID0gdHlwZU9mKHZhbHVlKTtcblxuICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGluZmVyIHRoZSBpdGVtIHR5cGUgaWYgcG9zc2libGUgZm9yIHplcm8tbGVuZ3RoIGFycmF5c1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgIHR5cGUuTiA9PT0gMCAmJlxuICAgICAgICAgICAgZXhwZWN0ZWQgJiZcbiAgICAgICAgICAgIGV4cGVjdGVkLmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICh0eXBlb2YgZXhwZWN0ZWQuTiAhPT0gJ251bWJlcicgfHwgZXhwZWN0ZWQuTiA9PT0gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gZXhwZWN0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IExpdGVyYWwodHlwZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoKSB7fVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCkge1xuICAgICAgICByZXR1cm4gW3RoaXMudmFsdWVdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdhcnJheScgfHwgdGhpcy50eXBlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gW1wibGl0ZXJhbFwiLCB0aGlzLnZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgICAgIC8vIENvbnN0YW50LWZvbGRpbmcgY2FuIGdlbmVyYXRlIExpdGVyYWwgZXhwcmVzc2lvbnMgdGhhdCB5b3VcbiAgICAgICAgICAgIC8vIGNvdWxkbid0IGFjdHVhbGx5IGdlbmVyYXRlIHdpdGggYSBcImxpdGVyYWxcIiBleHByZXNzaW9uLFxuICAgICAgICAgICAgLy8gc28gd2UgaGF2ZSB0byBpbXBsZW1lbnQgYW4gZXF1aXZhbGVudCBzZXJpYWxpemF0aW9uIGhlcmVcbiAgICAgICAgICAgIHJldHVybiBbXCJyZ2JhXCJdLmNvbmNhdCh0aGlzLnZhbHVlLnRvQXJyYXkoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCkge1xuICAgICAgICAgICAgLy8gU2FtZSBhcyBDb2xvclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc2VyaWFsaXplKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQodGhpcy52YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXRlcmFsO1xuIiwiLy8gQGZsb3dcblxuY2xhc3MgUnVudGltZUVycm9yIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubmFtZSA9ICdFeHByZXNzaW9uRXZhbHVhdGlvbkVycm9yJztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSdW50aW1lRXJyb3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7XG4gICAgT2JqZWN0VHlwZSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIGNoZWNrU3VidHlwZSxcbiAgICB0b1N0cmluZyxcbiAgICBhcnJheVxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3InO1xuaW1wb3J0IHsgdHlwZU9mIH0gZnJvbSAnLi4vdmFsdWVzJztcblxuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVmFsdWUgfSBmcm9tICcuLi92YWx1ZXMnO1xuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCB0eXBlcyA9IHtcbiAgICBzdHJpbmc6IFN0cmluZ1R5cGUsXG4gICAgbnVtYmVyOiBOdW1iZXJUeXBlLFxuICAgIGJvb2xlYW46IEJvb2xlYW5UeXBlLFxuICAgIG9iamVjdDogT2JqZWN0VHlwZVxufTtcblxuY2xhc3MgQXNzZXJ0aW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBhcmdzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgbGV0IHR5cGU7XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGlmIChuYW1lID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBsZXQgaXRlbVR5cGU7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGFyZ3NbMV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCAhKHR5cGUgaW4gdHlwZXMpIHx8IHR5cGUgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignVGhlIGl0ZW0gdHlwZSBhcmd1bWVudCBvZiBcImFycmF5XCIgbXVzdCBiZSBvbmUgb2Ygc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4nLCAxKTtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IHR5cGVzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSBWYWx1ZVR5cGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBOO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzWzJdICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgYXJnc1syXSAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMl0gPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzJdICE9PSBNYXRoLmZsb29yKGFyZ3NbMl0pKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignVGhlIGxlbmd0aCBhcmd1bWVudCB0byBcImFycmF5XCIgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgbGl0ZXJhbCcsIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBOID0gYXJnc1syXTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHR5cGUgPSBhcnJheShpdGVtVHlwZSwgTik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZXNbbmFtZV0sIG5hbWUpO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGVzW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgICAgIGZvciAoOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHR5cGUsIHBhcnNlZCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmFyZ3NbaV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gY2hlY2tTdWJ0eXBlKHRoaXMudHlwZSwgdHlwZU9mKHZhbHVlKSk7XG4gICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSB0aGlzLmFyZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgJHt0b1N0cmluZyh0aGlzLnR5cGUpfSwgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKHZhbHVlKSl9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKTogQXJyYXk8VmFsdWUgfCB2b2lkPiB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5hcmdzLm1hcCgoYXJnKSA9PiBhcmcucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFt0eXBlLmtpbmRdO1xuICAgICAgICBpZiAodHlwZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHR5cGUuaXRlbVR5cGU7XG4gICAgICAgICAgICBpZiAoaXRlbVR5cGUua2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgICBpdGVtVHlwZS5raW5kID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgIGl0ZW1UeXBlLmtpbmQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChpdGVtVHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBjb25zdCBOID0gdHlwZS5OO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTiA9PT0gJ251bWJlcicgfHwgdGhpcy5hcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKE4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZC5jb25jYXQodGhpcy5hcmdzLm1hcChhcmcgPT4gYXJnLnNlcmlhbGl6ZSgpKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBc3NlcnRpb247XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBOdW1iZXJUeXBlLCBWYWx1ZVR5cGUsIEZvcm1hdHRlZFR5cGUsIGFycmF5LCBTdHJpbmdUeXBlLCBDb2xvclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgRm9ybWF0dGVkLCB7IEZvcm1hdHRlZFNlY3Rpb24gfSBmcm9tICcuLi90eXBlcy9mb3JtYXR0ZWQnO1xuaW1wb3J0IHsgdG9TdHJpbmcgfSBmcm9tICcuLi92YWx1ZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG50eXBlIEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uID0ge1xuICAgIHRleHQ6IEV4cHJlc3Npb24sXG4gICAgc2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuICAgIGZvbnQ6IEV4cHJlc3Npb24gfCBudWxsO1xuICAgIHRleHRDb2xvcjogRXhwcmVzc2lvbiB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uRXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IEZvcm1hdHRlZFR5cGU7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFyZ3MubGVuZ3RoIC0gMSkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uPiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGtpbmQgPSB0ZXh0LnR5cGUua2luZDtcbiAgICAgICAgICAgIGlmIChraW5kICE9PSAnc3RyaW5nJyAmJiBraW5kICE9PSAndmFsdWUnICYmIGtpbmQgIT09ICdudWxsJylcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRm9ybWF0dGVkIHRleHQgdHlwZSBtdXN0IGJlICdzdHJpbmcnLCAndmFsdWUnLCBvciAnbnVsbCcuYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1tpICsgMV06IGFueSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShvcHRpb25zKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRm9ybWF0IG9wdGlvbnMgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG5cbiAgICAgICAgICAgIGxldCBzY2FsZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAob3B0aW9uc1snZm9udC1zY2FsZSddKSB7XG4gICAgICAgICAgICAgICAgc2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2ZvbnQtc2NhbGUnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzY2FsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBmb250ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zWyd0ZXh0LWZvbnQnXSkge1xuICAgICAgICAgICAgICAgIGZvbnQgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ3RleHQtZm9udCddLCAxLCBhcnJheShTdHJpbmdUeXBlKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmb250KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHRDb2xvciA9IG51bGw7XG4gICAgICAgICAgICBpZiAob3B0aW9uc1sndGV4dC1jb2xvciddKSB7XG4gICAgICAgICAgICAgICAgdGV4dENvbG9yID0gY29udGV4dC5wYXJzZShvcHRpb25zWyd0ZXh0LWNvbG9yJ10sIDEsIENvbG9yVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0Q29sb3IpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7dGV4dCwgc2NhbGUsIGZvbnQsIHRleHRDb2xvcn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXRFeHByZXNzaW9uKHNlY3Rpb25zKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybWF0dGVkKFxuICAgICAgICAgICAgdGhpcy5zZWN0aW9ucy5tYXAoc2VjdGlvbiA9PlxuICAgICAgICAgICAgICAgIG5ldyBGb3JtYXR0ZWRTZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhzZWN0aW9uLnRleHQuZXZhbHVhdGUoY3R4KSksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uc2NhbGUgPyBzZWN0aW9uLnNjYWxlLmV2YWx1YXRlKGN0eCkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmZvbnQgPyBzZWN0aW9uLmZvbnQuZXZhbHVhdGUoY3R4KS5qb2luKCcsJykgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLnRleHRDb2xvciA/IHNlY3Rpb24udGV4dENvbG9yLmV2YWx1YXRlKGN0eCkgOiBudWxsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGZuKHNlY3Rpb24udGV4dCk7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5zY2FsZSkge1xuICAgICAgICAgICAgICAgIGZuKHNlY3Rpb24uc2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24uZm9udCkge1xuICAgICAgICAgICAgICAgIGZuKHNlY3Rpb24uZm9udCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi50ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgICAgICBmbihzZWN0aW9uLnRleHRDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIC8vIFRlY2huaWNhbGx5IHRoZSBjb21iaW5hdG9yaWMgc2V0IG9mIGFsbCBjaGlsZHJlblxuICAgICAgICAvLyBVc3VhbGx5LCB0aGlzLnRleHQgd2lsbCBiZSB1bmRlZmluZWQgYW55d2F5XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJmb3JtYXRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goc2VjdGlvbi50ZXh0LnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1snZm9udC1zY2FsZSddID0gc2VjdGlvbi5zY2FsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmZvbnQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zWyd0ZXh0LWZvbnQnXSA9IHNlY3Rpb24uZm9udC5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnRleHRDb2xvcikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbJ3RleHQtY29sb3InXSA9IHNlY3Rpb24udGV4dENvbG9yLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtCb29sZWFuVHlwZSwgQ29sb3JUeXBlLCBOdW1iZXJUeXBlLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7Q29sb3IsIHRvU3RyaW5nIGFzIHZhbHVlVG9TdHJpbmcsIHZhbGlkYXRlUkdCQX0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL3R5cGVzL2Zvcm1hdHRlZCc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuLi9kZWZpbml0aW9ucy9mb3JtYXQnO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IHR5cGVzID0ge1xuICAgICd0by1ib29sZWFuJzogQm9vbGVhblR5cGUsXG4gICAgJ3RvLWNvbG9yJzogQ29sb3JUeXBlLFxuICAgICd0by1udW1iZXInOiBOdW1iZXJUeXBlLFxuICAgICd0by1zdHJpbmcnOiBTdHJpbmdUeXBlXG59O1xuXG4vKipcbiAqIFNwZWNpYWwgZm9ybSBmb3IgZXJyb3ItY29hbGVzY2luZyBjb2VyY2lvbiBleHByZXNzaW9ucyBcInRvLW51bWJlclwiLFxuICogXCJ0by1jb2xvclwiLiAgU2luY2UgdGhlc2UgY29lcmNpb25zIGNhbiBmYWlsIGF0IHJ1bnRpbWUsIHRoZXkgYWNjZXB0IG11bHRpcGxlXG4gKiBhcmd1bWVudHMsIG9ubHkgZXZhbHVhdGluZyBvbmUgYXQgYSB0aW1lIHVudGlsIG9uZSBzdWNjZWVkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb2VyY2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSAoYXJnc1swXTogYW55KTtcbiAgICAgICAgYXNzZXJ0KHR5cGVzW25hbWVdLCBuYW1lKTtcblxuICAgICAgICBpZiAoKG5hbWUgPT09ICd0by1ib29sZWFuJyB8fCBuYW1lID09PSAndG8tc3RyaW5nJykgJiYgYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tuYW1lXTtcblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1tpXSwgaSwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb2VyY2lvbih0eXBlLCBwYXJzZWQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgbGV0IGlucHV0O1xuICAgICAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gY3R4LnBhcnNlQ29sb3IoaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoIDwgMyB8fCBpbnB1dC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGBJbnZhbGlkIHJiZ2EgdmFsdWUgJHtKU09OLnN0cmluZ2lmeShpbnB1dCl9OiBleHBlY3RlZCBhbiBhcnJheSBjb250YWluaW5nIGVpdGhlciB0aHJlZSBvciBmb3VyIG51bWVyaWMgdmFsdWVzLmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHZhbGlkYXRlUkdCQShpbnB1dFswXSwgaW5wdXRbMV0sIGlucHV0WzJdLCBpbnB1dFszXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcigoaW5wdXRbMF06IGFueSkgLyAyNTUsIChpbnB1dFsxXTogYW55KSAvIDI1NSwgKGlucHV0WzJdOiBhbnkpIC8gMjU1LCAoaW5wdXRbM106IGFueSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihlcnJvciB8fCBgQ291bGQgbm90IHBhcnNlIGNvbG9yIGZyb20gdmFsdWUgJyR7dHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IGlucHV0IDogU3RyaW5nKEpTT04uc3RyaW5naWZ5KGlucHV0KSl9J2ApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZS5raW5kID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihudW0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQ291bGQgbm90IGNvbnZlcnQgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9IHRvIG51bWJlci5gKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2Zvcm1hdHRlZCcpIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGV4cGxpY2l0ICd0by1mb3JtYXR0ZWQnIGJ1dCB0aGlzIGNvZXJjaW9uIGNhbiBiZSBpbXBsaWNpdGx5XG4gICAgICAgICAgICAvLyBjcmVhdGVkIGJ5IHByb3BlcnRpZXMgdGhhdCBleHBlY3QgdGhlICdmb3JtYXR0ZWQnIHR5cGUuXG4gICAgICAgICAgICByZXR1cm4gRm9ybWF0dGVkLmZyb21TdHJpbmcodmFsdWVUb1N0cmluZyh0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoY3R4KSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlVG9TdHJpbmcodGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCk6IEFycmF5PFZhbHVlIHwgdm9pZD4ge1xuICAgICAgICByZXR1cm4gW10uY29uY2F0KC4uLnRoaXMuYXJncy5tYXAoKGFyZykgPT4gYXJnLnBvc3NpYmxlT3V0cHV0cygpKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdEV4cHJlc3Npb24oW3t0ZXh0OiB0aGlzLmFyZ3NbMF0sIHNjYWxlOiBudWxsLCBmb250OiBudWxsLCB0ZXh0Q29sb3I6IG51bGx9XSkuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtgdG8tJHt0aGlzLnR5cGUua2luZH1gXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2VyY2lvbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi92YWx1ZXMnO1xuaW1wb3J0IHR5cGUgeyBGb3JtYXR0ZWRTZWN0aW9uIH0gZnJvbSAnLi90eXBlcy9mb3JtYXR0ZWQnO1xuaW1wb3J0IHR5cGUgeyBHbG9iYWxQcm9wZXJ0aWVzLCBGZWF0dXJlLCBGZWF0dXJlU3RhdGUgfSBmcm9tICcuL2luZGV4JztcblxuY29uc3QgZ2VvbWV0cnlUeXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuY2xhc3MgRXZhbHVhdGlvbkNvbnRleHQge1xuICAgIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXM7XG4gICAgZmVhdHVyZTogP0ZlYXR1cmU7XG4gICAgZmVhdHVyZVN0YXRlOiA/RmVhdHVyZVN0YXRlO1xuICAgIGZvcm1hdHRlZFNlY3Rpb246ID9Gb3JtYXR0ZWRTZWN0aW9uO1xuXG4gICAgX3BhcnNlQ29sb3JDYWNoZToge1tzdHJpbmddOiA/Q29sb3J9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFscyA9IChudWxsOiBhbnkpO1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSBudWxsO1xuICAgICAgICB0aGlzLmZlYXR1cmVTdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9ybWF0dGVkU2VjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX3BhcnNlQ29sb3JDYWNoZSA9IHt9O1xuICAgIH1cblxuICAgIGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmICdpZCcgaW4gdGhpcy5mZWF0dXJlID8gdGhpcy5mZWF0dXJlLmlkIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZW9tZXRyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgPyB0eXBlb2YgdGhpcy5mZWF0dXJlLnR5cGUgPT09ICdudW1iZXInID8gZ2VvbWV0cnlUeXBlc1t0aGlzLmZlYXR1cmUudHlwZV0gOiB0aGlzLmZlYXR1cmUudHlwZSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvcGVydGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSAmJiB0aGlzLmZlYXR1cmUucHJvcGVydGllcyB8fCB7fTtcbiAgICB9XG5cbiAgICBwYXJzZUNvbG9yKGlucHV0OiBzdHJpbmcpOiA/Q29sb3Ige1xuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fcGFyc2VDb2xvckNhY2hlW2lucHV0XTtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICAgIGNhY2hlZCA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVtpbnB1dF0gPSBDb2xvci5wYXJzZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2YWx1YXRpb25Db250ZXh0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgdG9TdHJpbmcgfSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IFBhcnNpbmdDb250ZXh0IGZyb20gJy4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiwgRXhwcmVzc2lvblJlZ2lzdHJ5IH0gZnJvbSAnLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4vdmFsdWVzJztcblxuZXhwb3J0IHR5cGUgVmFyYXJncyA9IHt8IHR5cGU6IFR5cGUgfH07XG50eXBlIFNpZ25hdHVyZSA9IEFycmF5PFR5cGU+IHwgVmFyYXJncztcbnR5cGUgRXZhbHVhdGUgPSAoRXZhbHVhdGlvbkNvbnRleHQsIEFycmF5PEV4cHJlc3Npb24+KSA9PiBWYWx1ZTtcbnR5cGUgRGVmaW5pdGlvbiA9IFtUeXBlLCBTaWduYXR1cmUsIEV2YWx1YXRlXSB8XG4gICAge3x0eXBlOiBUeXBlLCBvdmVybG9hZHM6IEFycmF5PFtTaWduYXR1cmUsIEV2YWx1YXRlXT58fTtcblxuY2xhc3MgQ29tcG91bmRFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHR5cGU6IFR5cGU7XG4gICAgX2V2YWx1YXRlOiBFdmFsdWF0ZTtcbiAgICBhcmdzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIHN0YXRpYyBkZWZpbml0aW9uczogeyBbc3RyaW5nXTogRGVmaW5pdGlvbiB9O1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlOiBUeXBlLCBldmFsdWF0ZTogRXZhbHVhdGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRlID0gZXZhbHVhdGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGUoY3R4LCB0aGlzLmFyZ3MpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICByZXR1cm4gW3RoaXMubmFtZV0uY29uY2F0KHRoaXMuYXJncy5tYXAoYXJnID0+IGFyZy5zZXJpYWxpemUoKSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCBvcDogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBDb21wb3VuZEV4cHJlc3Npb24uZGVmaW5pdGlvbnNbb3BdO1xuICAgICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIGV4cHJlc3Npb24gXCIke29wfVwiLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IGNoZWNrIGFyZ3VtZW50IHR5cGVzIGFnYWluc3QgZWFjaCBzaWduYXR1cmVcbiAgICAgICAgY29uc3QgdHlwZSA9IEFycmF5LmlzQXJyYXkoZGVmaW5pdGlvbikgP1xuICAgICAgICAgICAgZGVmaW5pdGlvblswXSA6IGRlZmluaXRpb24udHlwZTtcblxuICAgICAgICBjb25zdCBhdmFpbGFibGVPdmVybG9hZHMgPSBBcnJheS5pc0FycmF5KGRlZmluaXRpb24pID9cbiAgICAgICAgICAgIFtbZGVmaW5pdGlvblsxXSwgZGVmaW5pdGlvblsyXV1dIDpcbiAgICAgICAgICAgIGRlZmluaXRpb24ub3ZlcmxvYWRzO1xuXG4gICAgICAgIGNvbnN0IG92ZXJsb2FkcyA9IGF2YWlsYWJsZU92ZXJsb2Fkcy5maWx0ZXIoKFtzaWduYXR1cmVdKSA9PiAoXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzaWduYXR1cmUpIHx8IC8vIHZhcmFnc1xuICAgICAgICAgICAgc2lnbmF0dXJlLmxlbmd0aCA9PT0gYXJncy5sZW5ndGggLSAxIC8vIGNvcnJlY3QgcGFyYW0gY291bnRcbiAgICAgICAgKSk7XG5cbiAgICAgICAgbGV0IHNpZ25hdHVyZUNvbnRleHQ6IFBhcnNpbmdDb250ZXh0ID0gKG51bGw6IGFueSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFyYW1zLCBldmFsdWF0ZV0gb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICAgICAgICAvLyBVc2UgYSBmcmVzaCBjb250ZXh0IGZvciBlYWNoIGF0dGVtcHRlZCBzaWduYXR1cmUgc28gdGhhdCwgaWZcbiAgICAgICAgICAgIC8vIHdlIGV2ZW50dWFsbHkgc3VjY2VlZCwgd2UgaGF2ZW4ndCBwb2xsdXRlZCBgY29udGV4dC5lcnJvcnNgLlxuICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dCA9IG5ldyBQYXJzaW5nQ29udGV4dChjb250ZXh0LnJlZ2lzdHJ5LCBjb250ZXh0LnBhdGgsIG51bGwsIGNvbnRleHQuc2NvcGUpO1xuXG4gICAgICAgICAgICAvLyBGaXJzdCBwYXJzZSBhbGwgdGhlIGFyZ3MsIHBvdGVudGlhbGx5IGNvZXJjaW5nIHRvIHRoZVxuICAgICAgICAgICAgLy8gdHlwZXMgZXhwZWN0ZWQgYnkgdGhpcyBvdmVybG9hZC5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3M6IEFycmF5PEV4cHJlc3Npb24+ID0gW107XG4gICAgICAgICAgICBsZXQgYXJnUGFyc2VGYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gQXJyYXkuaXNBcnJheShwYXJhbXMpID9cbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2kgLSAxXSA6XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy50eXBlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gc2lnbmF0dXJlQ29udGV4dC5wYXJzZShhcmcsIDEgKyBwYXJzZWRBcmdzLmxlbmd0aCwgZXhwZWN0ZWRUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICBhcmdQYXJzZUZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJzZWRBcmdzLnB1c2gocGFyc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmdQYXJzZUZhaWxlZCkge1xuICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGNvZXJjZSBhcmdzIG9mIHRoaXMgb3ZlcmxvYWQgdG8gZXhwZWN0ZWQgdHlwZSwgbW92ZVxuICAgICAgICAgICAgICAgIC8vIG9uIHRvIG5leHQgb25lLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IHBhcnNlZEFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQuZXJyb3IoYEV4cGVjdGVkICR7cGFyYW1zLmxlbmd0aH0gYXJndW1lbnRzLCBidXQgZm91bmQgJHtwYXJzZWRBcmdzLmxlbmd0aH0gaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZEFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/IHBhcmFtc1tpXSA6IHBhcmFtcy50eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IHBhcnNlZEFyZ3NbaV07XG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dC5jb25jYXQoaSArIDEpLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYXJnLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3VuZEV4cHJlc3Npb24ob3AsIHR5cGUsIGV2YWx1YXRlLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydCghc2lnbmF0dXJlQ29udGV4dCB8fCBzaWduYXR1cmVDb250ZXh0LmVycm9ycy5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaCguLi5zaWduYXR1cmVDb250ZXh0LmVycm9ycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IG92ZXJsb2Fkcy5sZW5ndGggPyBvdmVybG9hZHMgOiBhdmFpbGFibGVPdmVybG9hZHM7XG4gICAgICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gZXhwZWN0ZWRcbiAgICAgICAgICAgICAgICAubWFwKChbcGFyYW1zXSkgPT4gc3RyaW5naWZ5U2lnbmF0dXJlKHBhcmFtcykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJyB8ICcpO1xuXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxUeXBlcyA9IFtdO1xuICAgICAgICAgICAgLy8gRm9yIGVycm9yIG1lc3NhZ2UsIHJlLXBhcnNlIGFyZ3VtZW50cyB3aXRob3V0IHRyeWluZyB0b1xuICAgICAgICAgICAgLy8gYXBwbHkgYW55IGNvZXJjaW9uc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCAxICsgYWN0dWFsVHlwZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgYWN0dWFsVHlwZXMucHVzaCh0b1N0cmluZyhwYXJzZWQudHlwZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXJndW1lbnRzIG9mIHR5cGUgJHtzaWduYXR1cmVzfSwgYnV0IGZvdW5kICgke2FjdHVhbFR5cGVzLmpvaW4oJywgJyl9KSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlZ2lzdGVyKFxuICAgICAgICByZWdpc3RyeTogRXhwcmVzc2lvblJlZ2lzdHJ5LFxuICAgICAgICBkZWZpbml0aW9uczogeyBbc3RyaW5nXTogRGVmaW5pdGlvbiB9XG4gICAgKSB7XG4gICAgICAgIGFzc2VydCghQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zKTtcbiAgICAgICAgQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBkZWZpbml0aW9ucykge1xuICAgICAgICAgICAgcmVnaXN0cnlbbmFtZV0gPSBDb21wb3VuZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVNpZ25hdHVyZShzaWduYXR1cmU6IFNpZ25hdHVyZSk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSkge1xuICAgICAgICByZXR1cm4gYCgke3NpZ25hdHVyZS5tYXAodG9TdHJpbmcpLmpvaW4oJywgJyl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAoJHt0b1N0cmluZyhzaWduYXR1cmUudHlwZSl9Li4uKWA7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21wb3VuZEV4cHJlc3Npb247XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBTdHJpbmdUeXBlLCBCb29sZWFuVHlwZSwgQ29sbGF0b3JUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IENvbGxhdG9yIGZyb20gJy4uL3R5cGVzL2NvbGxhdG9yJztcblxuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3JFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBjYXNlU2Vuc2l0aXZlOiBFeHByZXNzaW9uO1xuICAgIGRpYWNyaXRpY1NlbnNpdGl2ZTogRXhwcmVzc2lvbjtcbiAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVNlbnNpdGl2ZTogRXhwcmVzc2lvbiwgZGlhY3JpdGljU2Vuc2l0aXZlOiBFeHByZXNzaW9uLCBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IENvbGxhdG9yVHlwZTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG4gICAgICAgIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlID0gZGlhY3JpdGljU2Vuc2l0aXZlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1sxXTogYW55KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ29sbGF0b3Igb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5gKTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gY29udGV4dC5wYXJzZShcbiAgICAgICAgICAgIG9wdGlvbnNbJ2Nhc2Utc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSwgMSwgQm9vbGVhblR5cGUpO1xuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRpYWNyaXRpY1NlbnNpdGl2ZSA9IGNvbnRleHQucGFyc2UoXG4gICAgICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddLCAxLCBCb29sZWFuVHlwZSk7XG4gICAgICAgIGlmICghZGlhY3JpdGljU2Vuc2l0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgbG9jYWxlID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2xvY2FsZSddKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2xvY2FsZSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3JFeHByZXNzaW9uKGNhc2VTZW5zaXRpdmUsIGRpYWNyaXRpY1NlbnNpdGl2ZSwgbG9jYWxlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3IodGhpcy5jYXNlU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUoY3R4KSA6IG51bGwpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5jYXNlU2Vuc2l0aXZlKTtcbiAgICAgICAgZm4odGhpcy5kaWFjcml0aWNTZW5zaXRpdmUpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgLy8gVGVjaG5pY2FsbHkgdGhlIHNldCBvZiBwb3NzaWJsZSBvdXRwdXRzIGlzIHRoZSBjb21iaW5hdG9yaWMgc2V0IG9mIENvbGxhdG9ycyBwcm9kdWNlZFxuICAgICAgICAvLyBieSBhbGwgcG9zc2libGVPdXRwdXRzIG9mIGxvY2FsZS9jYXNlU2Vuc2l0aXZlL2RpYWNyaXRpY1NlbnNpdGl2ZVxuICAgICAgICAvLyBCdXQgZm9yIHRoZSBwcmltYXJ5IHVzZSBvZiBDb2xsYXRvcnMgaW4gY29tcGFyaXNvbiBvcGVyYXRvcnMsIHdlIGlnbm9yZSB0aGUgQ29sbGF0b3Inc1xuICAgICAgICAvLyBwb3NzaWJsZU91dHB1dHMgYW55d2F5LCBzbyB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBsZWF2aW5nIHRoaXMgdW5kZWZpbmVkIGZvciBub3cuXG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSA9IHRoaXMuY2FzZVNlbnNpdGl2ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddID0gdGhpcy5kaWFjcml0aWNTZW5zaXRpdmUuc2VyaWFsaXplKCk7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsZSkge1xuICAgICAgICAgICAgb3B0aW9uc1snbG9jYWxlJ10gPSB0aGlzLmxvY2FsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1wiY29sbGF0b3JcIiwgb3B0aW9uc107XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuL2NvbXBvdW5kX2V4cHJlc3Npb24nO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuXG5mdW5jdGlvbiBpc0ZlYXR1cmVDb25zdGFudChlOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2dldCcgJiYgZS5hcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5uYW1lID09PSAnaGFzJyAmJiBlLmFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBlLm5hbWUgPT09ICdwcm9wZXJ0aWVzJyB8fFxuICAgICAgICAgICAgZS5uYW1lID09PSAnZ2VvbWV0cnktdHlwZScgfHxcbiAgICAgICAgICAgIGUubmFtZSA9PT0gJ2lkJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICgvXmZpbHRlci0vLnRlc3QoZS5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNGZWF0dXJlQ29uc3RhbnQoYXJnKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGVDb25zdGFudChlOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNTdGF0ZUNvbnN0YW50KGFyZykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoZTogRXhwcmVzc2lvbiwgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmIHByb3BlcnRpZXMuaW5kZXhPZihlLm5hbWUpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoKGFyZykgPT4ge1xuICAgICAgICBpZiAocmVzdWx0ICYmICFpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoYXJnLCBwcm9wZXJ0aWVzKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7IGlzRmVhdHVyZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzU3RhdGVDb25zdGFudCB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgIGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5cbmNsYXNzIFZhciBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGJvdW5kRXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgYm91bmRFeHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IGJvdW5kRXhwcmVzc2lvbi50eXBlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmJvdW5kRXhwcmVzc2lvbiA9IGJvdW5kRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIgfHwgdHlwZW9mIGFyZ3NbMV0gIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd2YXInIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgc3RyaW5nIGxpdGVyYWwgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbMV07XG4gICAgICAgIGlmICghY29udGV4dC5zY29wZS5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIHZhcmlhYmxlIFwiJHtuYW1lfVwiLiBNYWtlIHN1cmUgXCIke25hbWV9XCIgaGFzIGJlZW4gYm91bmQgaW4gYW4gZW5jbG9zaW5nIFwibGV0XCIgZXhwcmVzc2lvbiBiZWZvcmUgdXNpbmcgaXQuYCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFZhcihuYW1lLCBjb250ZXh0LnNjb3BlLmdldChuYW1lKSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZEV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoKSB7fVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZF07XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gW1widmFyXCIsIHRoaXMubmFtZV07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWYXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU2NvcGUgZnJvbSAnLi9zY29wZSc7XG5pbXBvcnQgeyBjaGVja1N1YnR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9wYXJzaW5nX2Vycm9yJztcbmltcG9ydCBMaXRlcmFsIGZyb20gJy4vZGVmaW5pdGlvbnMvbGl0ZXJhbCc7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvYXNzZXJ0aW9uJztcbmltcG9ydCBDb2VyY2lvbiBmcm9tICcuL2RlZmluaXRpb25zL2NvZXJjaW9uJztcbmltcG9ydCBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4vY29tcG91bmRfZXhwcmVzc2lvbic7XG5pbXBvcnQgQ29sbGF0b3JFeHByZXNzaW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvY29sbGF0b3InO1xuaW1wb3J0IHtpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50fSBmcm9tICcuL2lzX2NvbnN0YW50JztcbmltcG9ydCBWYXIgZnJvbSAnLi9kZWZpbml0aW9ucy92YXInO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgRXhwcmVzc2lvblJlZ2lzdHJ5fSBmcm9tICcuL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFN0YXRlIGFzc29jaWF0ZWQgcGFyc2luZyBhdCBhIGdpdmVuIHBvaW50IGluIGFuIGV4cHJlc3Npb24gdHJlZS5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFBhcnNpbmdDb250ZXh0IHtcbiAgICByZWdpc3RyeTogRXhwcmVzc2lvblJlZ2lzdHJ5O1xuICAgIHBhdGg6IEFycmF5PG51bWJlcj47XG4gICAga2V5OiBzdHJpbmc7XG4gICAgc2NvcGU6IFNjb3BlO1xuICAgIGVycm9yczogQXJyYXk8UGFyc2luZ0Vycm9yPjtcblxuICAgIC8vIFRoZSBleHBlY3RlZCB0eXBlIG9mIHRoaXMgZXhwcmVzc2lvbi4gUHJvdmlkZWQgb25seSB0byBhbGxvdyBFeHByZXNzaW9uXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIHRvIGluZmVyIGFyZ3VtZW50IHR5cGVzOiBFeHByZXNzaW9uI3BhcnNlKCkgbmVlZCBub3RcbiAgICAvLyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcGFyc2VkIGV4cHJlc3Npb24gbWF0Y2hlc1xuICAgIC8vIGBleHBlY3RlZFR5cGVgLlxuICAgIGV4cGVjdGVkVHlwZTogP1R5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcmVnaXN0cnk6IEV4cHJlc3Npb25SZWdpc3RyeSxcbiAgICAgICAgcGF0aDogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgICAgICBleHBlY3RlZFR5cGU6ID9UeXBlLFxuICAgICAgICBzY29wZTogU2NvcGUgPSBuZXcgU2NvcGUoKSxcbiAgICAgICAgZXJyb3JzOiBBcnJheTxQYXJzaW5nRXJyb3I+ID0gW11cbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmtleSA9IHBhdGgubWFwKHBhcnQgPT4gYFske3BhcnR9XWApLmpvaW4oJycpO1xuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICB0aGlzLmV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkVHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZXhwciB0aGUgSlNPTiBleHByZXNzaW9uIHRvIHBhcnNlXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBvcHRpb25hbCBhcmd1bWVudCBpbmRleCBpZiB0aGlzIGV4cHJlc3Npb24gaXMgYW4gYXJndW1lbnQgb2YgYSBwYXJlbnQgZXhwcmVzc2lvbiB0aGF0J3MgYmVpbmcgcGFyc2VkXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5vbWl0VHlwZUFubm90YXRpb25zIHNldCB0cnVlIHRvIG9taXQgaW5mZXJyZWQgdHlwZSBhbm5vdGF0aW9ucy4gIENhbGxlciBiZXdhcmU6IHdpdGggdGhpcyBvcHRpb24gc2V0LCB0aGUgcGFyc2VkIGV4cHJlc3Npb24ncyB0eXBlIHdpbGwgTk9UIHNhdGlzZnkgYGV4cGVjdGVkVHlwZWAgaWYgaXQgd291bGQgbm9ybWFsbHkgYmUgd3JhcHBlZCBpbiBhbiBpbmZlcnJlZCBhbm5vdGF0aW9uLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcGFyc2UoXG4gICAgICAgIGV4cHI6IG1peGVkLFxuICAgICAgICBpbmRleD86IG51bWJlcixcbiAgICAgICAgZXhwZWN0ZWRUeXBlPzogP1R5cGUsXG4gICAgICAgIGJpbmRpbmdzPzogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+LFxuICAgICAgICBvcHRpb25zOiB7dHlwZUFubm90YXRpb24/OiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnfSA9IHt9XG4gICAgKTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmNhdChpbmRleCwgZXhwZWN0ZWRUeXBlLCBiaW5kaW5ncykuX3BhcnNlKGV4cHIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJzZShleHByLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBfcGFyc2UoZXhwcjogbWl4ZWQsIG9wdGlvbnM6IHt0eXBlQW5ub3RhdGlvbj86ICdhc3NlcnQnIHwgJ2NvZXJjZScgfCAnb21pdCd9KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoZXhwciA9PT0gbnVsbCB8fCB0eXBlb2YgZXhwciA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGV4cHIgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgZXhwciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGV4cHIgPSBbJ2xpdGVyYWwnLCBleHByXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFubm90YXRlKHBhcnNlZCwgdHlwZSwgdHlwZUFubm90YXRpb246ICdhc3NlcnQnIHwgJ2NvZXJjZScgfCAnb21pdCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlQW5ub3RhdGlvbiA9PT0gJ2Fzc2VydCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbih0eXBlLCBbcGFyc2VkXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBbm5vdGF0aW9uID09PSAnY29lcmNlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29lcmNpb24odHlwZSwgW3BhcnNlZF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpIHtcbiAgICAgICAgICAgIGlmIChleHByLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBFeHBlY3RlZCBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50LiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgW11dLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvcCA9IGV4cHJbMF07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYEV4cHJlc3Npb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgZm91bmQgJHt0eXBlb2Ygb3B9IGluc3RlYWQuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IEV4cHIgPSB0aGlzLnJlZ2lzdHJ5W29wXTtcbiAgICAgICAgICAgIGlmIChFeHByKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlZCA9IEV4cHIucGFyc2UoZXhwciwgdGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5leHBlY3RlZFR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbCA9IHBhcnNlZC50eXBlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgZXhwZWN0IGEgbnVtYmVyLCBzdHJpbmcsIGJvb2xlYW4sIG9yIGFycmF5IGJ1dCBoYXZlIGEgdmFsdWUsIHdyYXAgaXQgaW4gYW4gYXNzZXJ0aW9uLlxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGV4cGVjdCBhIGNvbG9yIG9yIGZvcm1hdHRlZCBzdHJpbmcsIGJ1dCBoYXZlIGEgc3RyaW5nIG9yIHZhbHVlLCB3cmFwIGl0IGluIGEgY29lcmNpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgZG8gc3RhdGljIHR5cGUtY2hlY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGJlaGF2aW9ycyBhcmUgb3ZlcnJpZGFibGUgZm9yOlxuICAgICAgICAgICAgICAgICAgICAvLyAgICogVGhlIFwiY29hbGVzY2VcIiBvcGVyYXRvciwgd2hpY2ggbmVlZHMgdG8gb21pdCB0eXBlIGFubm90YXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAvLyAgICogU3RyaW5nLXZhbHVlZCBwcm9wZXJ0aWVzIChlLmcuIGB0ZXh0LWZpZWxkYCksIHdoZXJlIGNvZXJjaW9uIGlzIG1vcmUgY29udmVuaWVudCB0aGFuIGFzc2VydGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgaWYgKChleHBlY3RlZC5raW5kID09PSAnc3RyaW5nJyB8fCBleHBlY3RlZC5raW5kID09PSAnbnVtYmVyJyB8fCBleHBlY3RlZC5raW5kID09PSAnYm9vbGVhbicgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ29iamVjdCcgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ2FycmF5JykgJiYgYWN0dWFsLmtpbmQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZCA9IGFubm90YXRlKHBhcnNlZCwgZXhwZWN0ZWQsIG9wdGlvbnMudHlwZUFubm90YXRpb24gfHwgJ2Fzc2VydCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChleHBlY3RlZC5raW5kID09PSAnY29sb3InIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdmb3JtYXR0ZWQnKSAmJiAoYWN0dWFsLmtpbmQgPT09ICd2YWx1ZScgfHwgYWN0dWFsLmtpbmQgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gYW5ub3RhdGUocGFyc2VkLCBleHBlY3RlZCwgb3B0aW9ucy50eXBlQW5ub3RhdGlvbiB8fCAnY29lcmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja1N1YnR5cGUoZXhwZWN0ZWQsIGFjdHVhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gZXhwcmVzc2lvbidzIGFyZ3VtZW50cyBhcmUgYWxsIGxpdGVyYWxzLCB3ZSBjYW4gZXZhbHVhdGVcbiAgICAgICAgICAgICAgICAvLyBpdCBpbW1lZGlhdGVseSBhbmQgcmVwbGFjZSBpdCB3aXRoIGEgbGl0ZXJhbCB2YWx1ZSBpbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwYXJzZWQvY29tcGlsZWQgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGlmICghKHBhcnNlZCBpbnN0YW5jZW9mIExpdGVyYWwpICYmIGlzQ29uc3RhbnQocGFyc2VkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlYyA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gbmV3IExpdGVyYWwocGFyc2VkLnR5cGUsIHBhcnNlZC5ldmFsdWF0ZShlYykpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBVbmtub3duIGV4cHJlc3Npb24gXCIke29wfVwiLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHByID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYCd1bmRlZmluZWQnIHZhbHVlIGludmFsaWQuIFVzZSBudWxsIGluc3RlYWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgQmFyZSBvYmplY3RzIGludmFsaWQuIFVzZSBbXCJsaXRlcmFsXCIsIHsuLi59XSBpbnN0ZWFkLmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYEV4cGVjdGVkIGFuIGFycmF5LCBidXQgZm91bmQgJHt0eXBlb2YgZXhwcn0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgY29udGV4dCBzdWl0YWJsZSBmb3IgcGFyc2luZyB0aGUgc3ViZXhwcmVzc2lvbiBhdFxuICAgICAqIGluZGV4IGBpbmRleGAsIG9wdGlvbmFsbHkgYXBwZW5kaW5nIHRvICdsZXQnIGJpbmRpbmcgbWFwLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGBlcnJvcnNgIHByb3BlcnR5LCBpbnRlbmRlZCBmb3IgY29sbGVjdGluZyBlcnJvcnMgd2hpbGVcbiAgICAgKiBwYXJzaW5nLCBpcyBjb3BpZWQgYnkgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGNsb25lZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbmNhdChpbmRleDogbnVtYmVyLCBleHBlY3RlZFR5cGU/OiA/VHlwZSwgYmluZGluZ3M/OiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4pIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyB0aGlzLnBhdGguY29uY2F0KGluZGV4KSA6IHRoaXMucGF0aDtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBiaW5kaW5ncyA/IHRoaXMuc2NvcGUuY29uY2F0KGJpbmRpbmdzKSA6IHRoaXMuc2NvcGU7XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2luZ0NvbnRleHQoXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGV4cGVjdGVkVHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICB0aGlzLmVycm9yc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1c2ggYSBwYXJzaW5nIChvciB0eXBlIGNoZWNraW5nKSBlcnJvciBpbnRvIHRoZSBgdGhpcy5lcnJvcnNgXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBtZXNzYWdlXG4gICAgICogQHBhcmFtIGtleXMgT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yIGF0IGEgY2hpbGRcbiAgICAgKiBvZiB0aGUgY3VycmVudCBleHByZXNzaW9uIGF0IGB0aGlzLmtleWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlcnJvcihlcnJvcjogc3RyaW5nLCAuLi5rZXlzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGAke3RoaXMua2V5fSR7a2V5cy5tYXAoayA9PiBgWyR7a31dYCkuam9pbignJyl9YDtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgUGFyc2luZ0Vycm9yKGtleSwgZXJyb3IpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG51bGwgaWYgYHRgIGlzIGEgc3VidHlwZSBvZiBgZXhwZWN0ZWRgOyBvdGhlcndpc2UgcmV0dXJucyBhblxuICAgICAqIGVycm9yIG1lc3NhZ2UgYW5kIGFsc28gcHVzaGVzIGl0IHRvIGB0aGlzLmVycm9yc2AuXG4gICAgICovXG4gICAgY2hlY2tTdWJ0eXBlKGV4cGVjdGVkOiBUeXBlLCB0OiBUeXBlKTogP3N0cmluZyB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gY2hlY2tTdWJ0eXBlKGV4cGVjdGVkLCB0KTtcbiAgICAgICAgaWYgKGVycm9yKSB0aGlzLmVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFyc2luZ0NvbnRleHQ7XG5cbmZ1bmN0aW9uIGlzQ29uc3RhbnQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbikge1xuICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN0YW50KGV4cHJlc3Npb24uYm91bmRFeHByZXNzaW9uKTtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24gJiYgZXhwcmVzc2lvbi5uYW1lID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2xsYXRvckV4cHJlc3Npb24pIHtcbiAgICAgICAgLy8gQWx0aG91Z2ggdGhlIHJlc3VsdHMgb2YgYSBDb2xsYXRvciBleHByZXNzaW9uIHdpdGggZml4ZWQgYXJndW1lbnRzXG4gICAgICAgIC8vIGdlbmVyYWxseSBzaG91bGRuJ3QgY2hhbmdlIGJldHdlZW4gZXhlY3V0aW9ucywgd2UgY2FuJ3Qgc2VyaWFsaXplIHRoZW1cbiAgICAgICAgLy8gYXMgY29uc3RhbnQgZXhwcmVzc2lvbnMgYmVjYXVzZSByZXN1bHRzIGNoYW5nZSBiYXNlZCBvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGlzVHlwZUFubm90YXRpb24gPSBleHByZXNzaW9uIGluc3RhbmNlb2YgQ29lcmNpb24gfHxcbiAgICAgICAgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFzc2VydGlvbjtcblxuICAgIGxldCBjaGlsZHJlbkNvbnN0YW50ID0gdHJ1ZTtcbiAgICBleHByZXNzaW9uLmVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgICAgIC8vIFdlIGNhbiBfYWxtb3N0XyBhc3N1bWUgdGhhdCBpZiBgZXhwcmVzc2lvbnNgIGNoaWxkcmVuIGFyZSBjb25zdGFudCxcbiAgICAgICAgLy8gdGhleSB3b3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBldmFsdWF0ZWQgdG8gTGl0ZXJhbCB2YWx1ZXMgd2hlbiB0aGV5XG4gICAgICAgIC8vIHdlcmUgcGFyc2VkLiAgVHlwZSBhbm5vdGF0aW9ucyBhcmUgdGhlIGV4Y2VwdGlvbiwgYmVjYXVzZSB0aGV5IG1pZ2h0XG4gICAgICAgIC8vIGhhdmUgYmVlbiBpbmZlcnJlZCBhbmQgYWRkZWQgYWZ0ZXIgYSBjaGlsZCB3YXMgcGFyc2VkLlxuXG4gICAgICAgIC8vIFNvIHdlIHJlY3Vyc2UgaW50byBpc0NvbnN0YW50KCkgZm9yIHRoZSBjaGlsZHJlbiBvZiB0eXBlIGFubm90YXRpb25zLFxuICAgICAgICAvLyBidXQgb3RoZXJ3aXNlIHNpbXBseSBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIExpdGVyYWxzLlxuICAgICAgICBpZiAoaXNUeXBlQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgY2hpbGRyZW5Db25zdGFudCA9IGNoaWxkcmVuQ29uc3RhbnQgJiYgaXNDb25zdGFudChjaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGlsZHJlbkNvbnN0YW50ID0gY2hpbGRyZW5Db25zdGFudCAmJiBjaGlsZCBpbnN0YW5jZW9mIExpdGVyYWw7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWNoaWxkcmVuQ29uc3RhbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBpc0ZlYXR1cmVDb25zdGFudChleHByZXNzaW9uKSAmJlxuICAgICAgICBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoZXhwcmVzc2lvbiwgWyd6b29tJywgJ2hlYXRtYXAtZGVuc2l0eScsICdsaW5lLXByb2dyZXNzJywgJ2FjY3VtdWxhdGVkJywgJ2lzLXN1cHBvcnRlZC1zY3JpcHQnXSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4vcnVudGltZV9lcnJvcic7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4vZXhwcmVzc2lvbic7XG5cbmV4cG9ydCB0eXBlIFN0b3BzID0gQXJyYXk8W251bWJlciwgRXhwcmVzc2lvbl0+O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0b3AgPD0gaW5wdXQsIG9yIDAgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHN0b3BzOiBBcnJheTxudW1iZXI+LCBpbnB1dDogbnVtYmVyKSB7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gc3RvcHMubGVuZ3RoIC0gMTtcbiAgICBsZXQgbG93ZXJJbmRleCA9IDA7XG4gICAgbGV0IHVwcGVySW5kZXggPSBsYXN0SW5kZXg7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgbGV0IGN1cnJlbnRWYWx1ZSwgbmV4dFZhbHVlO1xuXG4gICAgd2hpbGUgKGxvd2VySW5kZXggPD0gdXBwZXJJbmRleCkge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBNYXRoLmZsb29yKChsb3dlckluZGV4ICsgdXBwZXJJbmRleCkgLyAyKTtcbiAgICAgICAgY3VycmVudFZhbHVlID0gc3RvcHNbY3VycmVudEluZGV4XTtcbiAgICAgICAgbmV4dFZhbHVlID0gc3RvcHNbY3VycmVudEluZGV4ICsgMV07XG5cbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8PSBpbnB1dCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbGFzdEluZGV4IHx8IGlucHV0IDwgbmV4dFZhbHVlKSB7IC8vIFNlYXJjaCBjb21wbGV0ZVxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvd2VySW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSA+IGlucHV0KSB7XG4gICAgICAgICAgICB1cHBlckluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoJ0lucHV0IGlzIG5vdCBhIG51bWJlci4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgTnVtYmVyVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyB9IGZyb20gJy4uL3N0b3BzJztcblxuaW1wb3J0IHR5cGUgeyBTdG9wcyB9IGZyb20gJy4uL3N0b3BzJztcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuY2xhc3MgU3RlcCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG5cbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBsYWJlbHM6IEFycmF5PG51bWJlcj47XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgc3RvcHM6IFN0b3BzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcblxuICAgICAgICB0aGlzLmxhYmVscyA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbbGFiZWwsIGV4cHJlc3Npb25dIG9mIHN0b3BzKSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0cy5wdXNoKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gMSA8IDQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhcmdzLmxlbmd0aCAtIDEpICUgMiAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RvcHM6IFN0b3BzID0gW107XG5cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6IFR5cGUgPSAobnVsbDogYW55KTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBpID09PSAxID8gLUluZmluaXR5IDogYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IGxhYmVsS2V5ID0gaTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5ID0gaSArIDE7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJzdGVwXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZXMgKG5vdCBjb21wdXRlZCBleHByZXNzaW9ucykgZm9yIHRoZSBpbnB1dCB2YWx1ZXMuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RvcHMubGVuZ3RoICYmIHN0b3BzW3N0b3BzLmxlbmd0aCAtIDFdWzBdID49IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJzdGVwXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBhcnJhbmdlZCB3aXRoIGlucHV0IHZhbHVlcyBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKHZhbHVlLCB2YWx1ZUtleSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHN0b3BzLnB1c2goW2xhYmVsLCBwYXJzZWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3RlcChvdXRwdXRUeXBlLCBpbnB1dCwgc3RvcHMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLm91dHB1dHM7XG5cbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBpZiAodmFsdWUgPD0gbGFiZWxzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcENvdW50ID0gbGFiZWxzLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlID49IGxhYmVsc1tzdG9wQ291bnQgLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbc3RvcENvdW50IC0gMV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhsYWJlbHMsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dHNbaW5kZXhdLmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKTogQXJyYXk8VmFsdWUgfCB2b2lkPiB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiBvdXRwdXQucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJzdGVwXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5sYWJlbHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3V0cHV0c1tpXS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdGVwO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3InO1xuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyKGE6IG51bWJlciwgYjogbnVtYmVyLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKGEgKiAoMSAtIHQpKSArIChiICogdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcihmcm9tOiBDb2xvciwgdG86IENvbG9yLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICBudW1iZXIoZnJvbS5yLCB0by5yLCB0KSxcbiAgICAgICAgbnVtYmVyKGZyb20uZywgdG8uZywgdCksXG4gICAgICAgIG51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBudW1iZXIoZnJvbS5hLCB0by5hLCB0KVxuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShmcm9tOiBBcnJheTxudW1iZXI+LCB0bzogQXJyYXk8bnVtYmVyPiwgdDogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb20ubWFwKChkLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBudW1iZXIoZCwgdG9baV0sIHQpO1xuICAgIH0pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3InO1xuXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZU51bWJlcn0gZnJvbSAnLi9pbnRlcnBvbGF0ZSc7XG5cbnR5cGUgTEFCQ29sb3IgPSB7XG4gICAgbDogbnVtYmVyLFxuICAgIGE6IG51bWJlcixcbiAgICBiOiBudW1iZXIsXG4gICAgYWxwaGE6IG51bWJlclxufTtcblxudHlwZSBIQ0xDb2xvciA9IHtcbiAgICBoOiBudW1iZXIsXG4gICAgYzogbnVtYmVyLFxuICAgIGw6IG51bWJlcixcbiAgICBhbHBoYTogbnVtYmVyXG59O1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IFhuID0gMC45NTA0NzAsIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudFxuICAgIFluID0gMSxcbiAgICBabiA9IDEuMDg4ODMwLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDEsXG4gICAgZGVnMnJhZCA9IE1hdGguUEkgLyAxODAsXG4gICAgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7XG5cbi8vIFV0aWxpdGllc1xuZnVuY3Rpb24geHl6MmxhYih0KSB7XG4gICAgcmV0dXJuIHQgPiB0MyA/IE1hdGgucG93KHQsIDEgLyAzKSA6IHQgLyB0MiArIHQwO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KHQpIHtcbiAgICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTtcbn1cblxuZnVuY3Rpb24geHl6MnJnYih4KSB7XG4gICAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJ4eXooeCkge1xuICAgIHggLz0gMjU1O1xuICAgIHJldHVybiB4IDw9IDAuMDQwNDUgPyB4IC8gMTIuOTIgOiBNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xufVxuXG4vLyBMQUJcbmZ1bmN0aW9uIHJnYlRvTGFiKHJnYkNvbG9yOiBDb2xvcik6IExBQkNvbG9yIHtcbiAgICBjb25zdCBiID0gcmdiMnh5eihyZ2JDb2xvci5yKSxcbiAgICAgICAgYSA9IHJnYjJ4eXoocmdiQ29sb3IuZyksXG4gICAgICAgIGwgPSByZ2IyeHl6KHJnYkNvbG9yLmIpLFxuICAgICAgICB4ID0geHl6MmxhYigoMC40MTI0NTY0ICogYiArIDAuMzU3NTc2MSAqIGEgKyAwLjE4MDQzNzUgKiBsKSAvIFhuKSxcbiAgICAgICAgeSA9IHh5ejJsYWIoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiksXG4gICAgICAgIHogPSB4eXoybGFiKCgwLjAxOTMzMzkgKiBiICsgMC4xMTkxOTIwICogYSArIDAuOTUwMzA0MSAqIGwpIC8gWm4pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogMTE2ICogeSAtIDE2LFxuICAgICAgICBhOiA1MDAgKiAoeCAtIHkpLFxuICAgICAgICBiOiAyMDAgKiAoeSAtIHopLFxuICAgICAgICBhbHBoYTogcmdiQ29sb3IuYVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGxhYlRvUmdiKGxhYkNvbG9yOiBMQUJDb2xvcik6IENvbG9yIHtcbiAgICBsZXQgeSA9IChsYWJDb2xvci5sICsgMTYpIC8gMTE2LFxuICAgICAgICB4ID0gaXNOYU4obGFiQ29sb3IuYSkgPyB5IDogeSArIGxhYkNvbG9yLmEgLyA1MDAsXG4gICAgICAgIHogPSBpc05hTihsYWJDb2xvci5iKSA/IHkgOiB5IC0gbGFiQ29sb3IuYiAvIDIwMDtcbiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpO1xuICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7XG4gICAgeiA9IFpuICogbGFiMnh5eih6KTtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICB4eXoycmdiKDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCXG4gICAgICAgIHh5ejJyZ2IoLTAuOTY5MjY2MCAqIHggKyAxLjg3NjAxMDggKiB5ICsgMC4wNDE1NTYwICogeiksXG4gICAgICAgIHh5ejJyZ2IoMC4wNTU2NDM0ICogeCAtIDAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSxcbiAgICAgICAgbGFiQ29sb3IuYWxwaGFcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUxhYihmcm9tOiBMQUJDb2xvciwgdG86IExBQkNvbG9yLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmwsIHRvLmwsIHQpLFxuICAgICAgICBhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmEsIHRvLmEsIHQpLFxuICAgICAgICBiOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBhbHBoYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hbHBoYSwgdG8uYWxwaGEsIHQpXG4gICAgfTtcbn1cblxuLy8gSENMXG5mdW5jdGlvbiByZ2JUb0hjbChyZ2JDb2xvcjogQ29sb3IpOiBIQ0xDb2xvciB7XG4gICAgY29uc3Qge2wsIGEsIGJ9ID0gcmdiVG9MYWIocmdiQ29sb3IpO1xuICAgIGNvbnN0IGggPSBNYXRoLmF0YW4yKGIsIGEpICogcmFkMmRlZztcbiAgICByZXR1cm4ge1xuICAgICAgICBoOiBoIDwgMCA/IGggKyAzNjAgOiBoLFxuICAgICAgICBjOiBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksXG4gICAgICAgIGwsXG4gICAgICAgIGFscGhhOiByZ2JDb2xvci5hXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaGNsVG9SZ2IoaGNsQ29sb3I6IEhDTENvbG9yKTogQ29sb3Ige1xuICAgIGNvbnN0IGggPSBoY2xDb2xvci5oICogZGVnMnJhZCxcbiAgICAgICAgYyA9IGhjbENvbG9yLmMsXG4gICAgICAgIGwgPSBoY2xDb2xvci5sO1xuICAgIHJldHVybiBsYWJUb1JnYih7XG4gICAgICAgIGwsXG4gICAgICAgIGE6IE1hdGguY29zKGgpICogYyxcbiAgICAgICAgYjogTWF0aC5zaW4oaCkgKiBjLFxuICAgICAgICBhbHBoYTogaGNsQ29sb3IuYWxwaGFcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVIdWUoYTogbnVtYmVyLCBiOiBudW1iZXIsIHQ6IG51bWJlcikge1xuICAgIGNvbnN0IGQgPSBiIC0gYTtcbiAgICByZXR1cm4gYSArIHQgKiAoZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlSGNsKGZyb206IEhDTENvbG9yLCB0bzogSENMQ29sb3IsIHQ6IG51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGg6IGludGVycG9sYXRlSHVlKGZyb20uaCwgdG8uaCwgdCksXG4gICAgICAgIGM6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYywgdG8uYywgdCksXG4gICAgICAgIGw6IGludGVycG9sYXRlTnVtYmVyKGZyb20ubCwgdG8ubCwgdCksXG4gICAgICAgIGFscGhhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmFscGhhLCB0by5hbHBoYSwgdClcbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgbGFiID0ge1xuICAgIGZvcndhcmQ6IHJnYlRvTGFiLFxuICAgIHJldmVyc2U6IGxhYlRvUmdiLFxuICAgIGludGVycG9sYXRlOiBpbnRlcnBvbGF0ZUxhYlxufTtcblxuZXhwb3J0IGNvbnN0IGhjbCA9IHtcbiAgICBmb3J3YXJkOiByZ2JUb0hjbCxcbiAgICByZXZlcnNlOiBoY2xUb1JnYixcbiAgICBpbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGVIY2xcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVW5pdEJlemllciBmcm9tICdAbWFwYm94L3VuaXRiZXppZXInO1xuXG5pbXBvcnQgKiBhcyBpbnRlcnBvbGF0ZSBmcm9tICcuLi8uLi91dGlsL2ludGVycG9sYXRlJztcbmltcG9ydCB7IHRvU3RyaW5nLCBOdW1iZXJUeXBlLCBDb2xvclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvIH0gZnJvbSAnLi4vc3RvcHMnO1xuaW1wb3J0IHsgaGNsLCBsYWIgfSBmcm9tICcuLi8uLi91dGlsL2NvbG9yX3NwYWNlcyc7XG5cbmltcG9ydCB0eXBlIHsgU3RvcHMgfSBmcm9tICcuLi9zdG9wcyc7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIEludGVycG9sYXRpb25UeXBlID1cbiAgICB7IG5hbWU6ICdsaW5lYXInIH0gfFxuICAgIHsgbmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogbnVtYmVyIH0gfFxuICAgIHsgbmFtZTogJ2N1YmljLWJlemllcicsIGNvbnRyb2xQb2ludHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIH07XG5cbmNsYXNzIEludGVycG9sYXRlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIG9wZXJhdG9yOiAnaW50ZXJwb2xhdGUnIHwgJ2ludGVycG9sYXRlLWhjbCcgfCAnaW50ZXJwb2xhdGUtbGFiJztcbiAgICBpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZTtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBsYWJlbHM6IEFycmF5PG51bWJlcj47XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBvcGVyYXRvcjogJ2ludGVycG9sYXRlJyB8ICdpbnRlcnBvbGF0ZS1oY2wnIHwgJ2ludGVycG9sYXRlLWxhYicsIGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgc3RvcHM6IFN0b3BzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtsYWJlbCwgZXhwcmVzc2lvbl0gb2Ygc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJwb2xhdGlvbkZhY3RvcihpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikge1xuICAgICAgICBsZXQgdCA9IDA7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIHQgPSBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIGludGVycG9sYXRpb24uYmFzZSwgbG93ZXIsIHVwcGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICB0ID0gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCAxLCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2N1YmljLWJlemllcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbnRlcnBvbGF0aW9uLmNvbnRyb2xQb2ludHM7XG4gICAgICAgICAgICBjb25zdCB1YiA9IG5ldyBVbml0QmV6aWVyKGNbMF0sIGNbMV0sIGNbMl0sIGNbM10pO1xuICAgICAgICAgICAgdCA9IHViLnNvbHZlKGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgMSwgbG93ZXIsIHVwcGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgbGV0IFtvcGVyYXRvciwgaW50ZXJwb2xhdGlvbiwgaW5wdXQsIC4uLnJlc3RdID0gYXJncztcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW50ZXJwb2xhdGlvbikgfHwgaW50ZXJwb2xhdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBpbnRlcnBvbGF0aW9uIHR5cGUgZXhwcmVzc2lvbi5gLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHsgbmFtZTogJ2xpbmVhcicgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnZXhwb25lbnRpYWwnKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlID0gaW50ZXJwb2xhdGlvblsxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZSAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cG9uZW50aWFsIGludGVycG9sYXRpb24gcmVxdWlyZXMgYSBudW1lcmljIGJhc2UuYCwgMSwgMSk7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgICAgICAgYmFzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnY3ViaWMtYmV6aWVyJykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbFBvaW50cyA9IGludGVycG9sYXRpb24uc2xpY2UoMSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50cy5sZW5ndGggIT09IDQgfHxcbiAgICAgICAgICAgICAgICBjb250cm9sUG9pbnRzLnNvbWUodCA9PiB0eXBlb2YgdCAhPT0gJ251bWJlcicgfHwgdCA8IDAgfHwgdCA+IDEpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignQ3ViaWMgYmV6aWVyIGludGVycG9sYXRpb24gcmVxdWlyZXMgZm91ciBudW1lcmljIGFyZ3VtZW50cyB3aXRoIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEuJywgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2N1YmljLWJlemllcicsXG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50czogKGNvbnRyb2xQb2ludHM6IGFueSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biBpbnRlcnBvbGF0aW9uIHR5cGUgJHtTdHJpbmcoaW50ZXJwb2xhdGlvblswXSl9YCwgMSwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggLSAxIDwgNCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFyZ3MubGVuZ3RoIC0gMSkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGlucHV0LCAyLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RvcHM6IFN0b3BzID0gW107XG5cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6IFR5cGUgPSAobnVsbDogYW55KTtcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJyB8fCBvcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlLWxhYicpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBDb2xvclR5cGU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHJlc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3RbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBsYWJlbEtleSA9IGkgKyAzO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVLZXkgPSBpICsgNDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZXMgKG5vdCBjb21wdXRlZCBleHByZXNzaW9ucykgZm9yIHRoZSBpbnB1dCB2YWx1ZXMuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RvcHMubGVuZ3RoICYmIHN0b3BzW3N0b3BzLmxlbmd0aCAtIDFdWzBdID49IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgdmFsdWVLZXksIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcGFyc2VkLnR5cGU7XG4gICAgICAgICAgICBzdG9wcy5wdXNoKFtsYWJlbCwgcGFyc2VkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3V0cHV0VHlwZS5raW5kICE9PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgb3V0cHV0VHlwZS5raW5kICE9PSAnY29sb3InICYmXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIG91dHB1dFR5cGUua2luZCA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgICAgIG91dHB1dFR5cGUuaXRlbVR5cGUua2luZCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb3V0cHV0VHlwZS5OID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBUeXBlICR7dG9TdHJpbmcob3V0cHV0VHlwZSl9IGlzIG5vdCBpbnRlcnBvbGF0YWJsZS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGUob3V0cHV0VHlwZSwgKG9wZXJhdG9yOiBhbnkpLCBpbnRlcnBvbGF0aW9uLCBpbnB1dCwgc3RvcHMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLm91dHB1dHM7XG5cbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBpZiAodmFsdWUgPD0gbGFiZWxzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcENvdW50ID0gbGFiZWxzLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlID49IGxhYmVsc1tzdG9wQ291bnQgLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbc3RvcENvdW50IC0gMV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhsYWJlbHMsIHZhbHVlKTtcbiAgICAgICAgY29uc3QgbG93ZXIgPSBsYWJlbHNbaW5kZXhdO1xuICAgICAgICBjb25zdCB1cHBlciA9IGxhYmVsc1tpbmRleCArIDFdO1xuICAgICAgICBjb25zdCB0ID0gSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLmludGVycG9sYXRpb24sIHZhbHVlLCBsb3dlciwgdXBwZXIpO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dExvd2VyID0gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VXBwZXIgPSBvdXRwdXRzW2luZGV4ICsgMV0uZXZhbHVhdGUoY3R4KTtcblxuICAgICAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIChpbnRlcnBvbGF0ZVt0aGlzLnR5cGUua2luZC50b0xvd2VyQ2FzZSgpXTogYW55KShvdXRwdXRMb3dlciwgb3V0cHV0VXBwZXIsIHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJykge1xuICAgICAgICAgICAgcmV0dXJuIGhjbC5yZXZlcnNlKGhjbC5pbnRlcnBvbGF0ZShoY2wuZm9yd2FyZChvdXRwdXRMb3dlciksIGhjbC5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxhYi5yZXZlcnNlKGxhYi5pbnRlcnBvbGF0ZShsYWIuZm9yd2FyZChvdXRwdXRMb3dlciksIGxhYi5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKTogQXJyYXk8VmFsdWUgfCB2b2lkPiB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiBvdXRwdXQucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgbGV0IGludGVycG9sYXRpb247XG4gICAgICAgIGlmICh0aGlzLmludGVycG9sYXRpb24ubmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJsaW5lYXJcIl07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIGlmICAodGhpcy5pbnRlcnBvbGF0aW9uLmJhc2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wibGluZWFyXCJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wiZXhwb25lbnRpYWxcIiwgdGhpcy5pbnRlcnBvbGF0aW9uLmJhc2VdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImN1YmljLWJlemllclwiIF0uY29uY2F0KHRoaXMuaW50ZXJwb2xhdGlvbi5jb250cm9sUG9pbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbdGhpcy5vcGVyYXRvciwgaW50ZXJwb2xhdGlvbiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzW2ldLFxuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0c1tpXS5zZXJpYWxpemUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKiBIb3cgaXQgd29ya3M6IFR3byBjb25zZWN1dGl2ZSBzdG9wIHZhbHVlcyBkZWZpbmUgYSAoc2NhbGVkIGFuZCBzaGlmdGVkKSBleHBvbmVudGlhbCBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4qL1xuZnVuY3Rpb24gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCBiYXNlLCBsb3dlclZhbHVlLCB1cHBlclZhbHVlKSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IHVwcGVyVmFsdWUgLSBsb3dlclZhbHVlO1xuICAgIGNvbnN0IHByb2dyZXNzID0gaW5wdXQgLSBsb3dlclZhbHVlO1xuXG4gICAgaWYgKGRpZmZlcmVuY2UgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcyAvIGRpZmZlcmVuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChNYXRoLnBvdyhiYXNlLCBwcm9ncmVzcykgLSAxKSAvIChNYXRoLnBvdyhiYXNlLCBkaWZmZXJlbmNlKSAtIDEpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJwb2xhdGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IGNoZWNrU3VidHlwZSwgVmFsdWVUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIENvYWxlc2NlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBhcmdzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoXCJFeHBlY3RlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiBUeXBlID0gKG51bGw6IGFueSk7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlICYmIGV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKGFyZywgMSArIHBhcnNlZEFyZ3MubGVuZ3RoLCBvdXRwdXRUeXBlLCB1bmRlZmluZWQsIHt0eXBlQW5ub3RhdGlvbjogJ29taXQnfSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHBhcnNlZEFyZ3MucHVzaChwYXJzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChvdXRwdXRUeXBlKTtcblxuICAgICAgICAvLyBBYm92ZSwgd2UgcGFyc2UgYXJndW1lbnRzIHdpdGhvdXQgaW5mZXJyZWQgdHlwZSBhbm5vdGF0aW9uIHNvIHRoYXRcbiAgICAgICAgLy8gdGhleSBkb24ndCBwcm9kdWNlIGEgcnVudGltZSBlcnJvciBmb3IgYG51bGxgIGlucHV0LCB3aGljaCB3b3VsZFxuICAgICAgICAvLyBwcmVlbXB0IHRoZSBkZXNpcmVkIG51bGwtY29hbGVzY2luZyBiZWhhdmlvci5cbiAgICAgICAgLy8gVGh1cywgaWYgYW55IG9mIG91ciBhcmd1bWVudHMgd291bGQgaGF2ZSBuZWVkZWQgYW4gYW5ub3RhdGlvbiwgd2VcbiAgICAgICAgLy8gbmVlZCB0byB3cmFwIHRoZSBlbmNsb3NpbmcgY29hbGVzY2UgZXhwcmVzc2lvbiB3aXRoIGl0IGluc3RlYWQuXG4gICAgICAgIGNvbnN0IG5lZWRzQW5ub3RhdGlvbiA9IGV4cGVjdGVkVHlwZSAmJlxuICAgICAgICAgICAgcGFyc2VkQXJncy5zb21lKGFyZyA9PiBjaGVja1N1YnR5cGUoZXhwZWN0ZWRUeXBlLCBhcmcudHlwZSkpO1xuXG4gICAgICAgIHJldHVybiBuZWVkc0Fubm90YXRpb24gP1xuICAgICAgICAgICAgbmV3IENvYWxlc2NlKFZhbHVlVHlwZSwgcGFyc2VkQXJncykgOlxuICAgICAgICAgICAgbmV3IENvYWxlc2NlKChvdXRwdXRUeXBlOiBhbnkpLCBwYXJzZWRBcmdzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKTogQXJyYXk8VmFsdWUgfCB2b2lkPiB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5hcmdzLm1hcCgoYXJnKSA9PiBhcmcucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJjb2FsZXNjZVwiXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2FsZXNjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0ICBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuXG5jbGFzcyBMZXQgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT47XG4gICAgcmVzdWx0OiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPiwgcmVzdWx0OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHJlc3VsdC50eXBlO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gW10uY29uY2F0KGJpbmRpbmdzKTtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQuZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgICAgICBmbihiaW5kaW5nWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBmbih0aGlzLnJlc3VsdCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbaV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgc3RyaW5nLCBidXQgZm91bmQgJHt0eXBlb2YgbmFtZX0gaW5zdGVhZC5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFZhcmlhYmxlIG5hbWVzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yICdfJy5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaSArIDFdLCBpICsgMSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYmluZGluZ3MucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIGNvbnRleHQuZXhwZWN0ZWRUeXBlLCBiaW5kaW5ncyk7XG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IExldChiaW5kaW5ncywgcmVzdWx0KTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5wb3NzaWJsZU91dHB1dHMoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJsZXRcIl07XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIGV4cHJdIG9mIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChuYW1lLCBleHByLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5yZXN1bHQuc2VyaWFsaXplKCkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExldDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGFycmF5LCBWYWx1ZVR5cGUsIE51bWJlclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFR5cGUsIEFycmF5VHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgVmFsdWUgfSBmcm9tICcuLi92YWx1ZXMnO1xuXG5jbGFzcyBBdCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5kZXg6IEV4cHJlc3Npb247XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBpbmRleDogRXhwcmVzc2lvbiwgaW5wdXQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDIgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgYXJyYXkoY29udGV4dC5leHBlY3RlZFR5cGUgfHwgVmFsdWVUeXBlKSk7XG5cbiAgICAgICAgaWYgKCFpbmRleCB8fCAhaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHQ6IEFycmF5VHlwZSA9IChpbnB1dC50eXBlOiBhbnkpO1xuICAgICAgICByZXR1cm4gbmV3IEF0KHQuaXRlbVR5cGUsIGluZGV4LCBpbnB1dCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgodGhpcy5pbmRleC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBjb25zdCBhcnJheSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBBcnJheTxWYWx1ZT4pO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6ICR7aW5kZXh9IDwgMC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA+PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6ICR7aW5kZXh9ID4gJHthcnJheS5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPT0gTWF0aC5mbG9vcihpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG11c3QgYmUgYW4gaW50ZWdlciwgYnV0IGZvdW5kICR7aW5kZXh9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyYXlbaW5kZXhdO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbmRleCk7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcImF0XCIsIHRoaXMuaW5kZXguc2VyaWFsaXplKCksIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IHR5cGVPZiB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgeyBWYWx1ZVR5cGUsIHR5cGUgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVmFsdWUgfSBmcm9tICcuLi92YWx1ZXMnO1xuXG4vLyBNYXAgaW5wdXQgbGFiZWwgdmFsdWVzIHRvIG91dHB1dCBleHByZXNzaW9uIGluZGV4XG50eXBlIENhc2VzID0ge1tudW1iZXIgfCBzdHJpbmddOiBudW1iZXJ9O1xuXG5jbGFzcyBNYXRjaCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXRUeXBlOiBUeXBlO1xuXG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgY2FzZXM6IENhc2VzO1xuICAgIG91dHB1dHM6IEFycmF5PEV4cHJlc3Npb24+O1xuICAgIG90aGVyd2lzZTogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0VHlwZTogVHlwZSwgb3V0cHV0VHlwZTogVHlwZSwgaW5wdXQ6IEV4cHJlc3Npb24sIGNhc2VzOiBDYXNlcywgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj4sIG90aGVyd2lzZTogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLmlucHV0VHlwZSA9IGlucHV0VHlwZTtcbiAgICAgICAgdGhpcy50eXBlID0gb3V0cHV0VHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmNhc2VzID0gY2FzZXM7XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IG91dHB1dHM7XG4gICAgICAgIHRoaXMub3RoZXJ3aXNlID0gb3RoZXJ3aXNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDUpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICUgMiAhPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7XG5cbiAgICAgICAgbGV0IGlucHV0VHlwZTtcbiAgICAgICAgbGV0IG91dHB1dFR5cGU7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FzZXMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxzID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsYWJlbHMpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxzID0gW2xhYmVsc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ29udGV4dCA9IGNvbnRleHQuY29uY2F0KGkpO1xuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKCdFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYnJhbmNoIGxhYmVsLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIGxhYmVscykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdudW1iZXInICYmIHR5cGVvZiBsYWJlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgQnJhbmNoIGxhYmVscyBtdXN0IGJlIG51bWJlcnMgb3Igc3RyaW5ncy5gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicgJiYgTWF0aC5hYnMobGFiZWwpID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgQnJhbmNoIGxhYmVscyBtdXN0IGJlIGludGVnZXJzIG5vIGxhcmdlciB0aGFuICR7TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9LmApO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInICYmIE1hdGguZmxvb3IobGFiZWwpICE9PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKGBOdW1lcmljIGJyYW5jaCBsYWJlbHMgbXVzdCBiZSBpbnRlZ2VyIHZhbHVlcy5gKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSB0eXBlT2YobGFiZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxDb250ZXh0LmNoZWNrU3VidHlwZShpbnB1dFR5cGUsIHR5cGVPZihsYWJlbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FzZXNbU3RyaW5nKGxhYmVsKV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoJ0JyYW5jaCBsYWJlbHMgbXVzdCBiZSB1bmlxdWUuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZXNbU3RyaW5nKGxhYmVsKV0gPSBvdXRwdXRzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgaSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCByZXN1bHQudHlwZTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChyZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG90aGVyd2lzZSA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIG91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoIW90aGVyd2lzZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXNzZXJ0KGlucHV0VHlwZSAmJiBvdXRwdXRUeXBlKTtcblxuICAgICAgICBpZiAoaW5wdXQudHlwZS5raW5kICE9PSAndmFsdWUnICYmIGNvbnRleHQuY29uY2F0KDEpLmNoZWNrU3VidHlwZSgoaW5wdXRUeXBlOiBhbnkpLCBpbnB1dC50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE1hdGNoKChpbnB1dFR5cGU6IGFueSksIChvdXRwdXRUeXBlOiBhbnkpLCBpbnB1dCwgY2FzZXMsIG91dHB1dHMsIG90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9ICh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9ICh0eXBlT2YoaW5wdXQpID09PSB0aGlzLmlucHV0VHlwZSAmJiB0aGlzLm91dHB1dHNbdGhpcy5jYXNlc1tpbnB1dF1dKSB8fCB0aGlzLm90aGVyd2lzZTtcbiAgICAgICAgcmV0dXJuIG91dHB1dC5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIHRoaXMub3V0cHV0cy5mb3JFYWNoKGZuKTtcbiAgICAgICAgZm4odGhpcy5vdGhlcndpc2UpO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpOiBBcnJheTxWYWx1ZSB8IHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAuY29uY2F0KC4uLnRoaXMub3V0cHV0cy5tYXAoKG91dCkgPT4gb3V0LnBvc3NpYmxlT3V0cHV0cygpKSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5vdGhlcndpc2UucG9zc2libGVPdXRwdXRzKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibWF0Y2hcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG5cbiAgICAgICAgLy8gU29ydCBzbyBzZXJpYWxpemF0aW9uIGhhcyBhbiBhcmJpdHJhcnkgZGVmaW5lZCBvcmRlciwgZXZlbiB0aG91Z2hcbiAgICAgICAgLy8gYnJhbmNoIG9yZGVyIGRvZXNuJ3QgYWZmZWN0IGV2YWx1YXRpb25cbiAgICAgICAgY29uc3Qgc29ydGVkTGFiZWxzID0gT2JqZWN0LmtleXModGhpcy5jYXNlcykuc29ydCgpO1xuXG4gICAgICAgIC8vIEdyb3VwIGJyYW5jaGVzIGJ5IHVuaXF1ZSBtYXRjaCBleHByZXNzaW9uIHRvIHN1cHBvcnQgY29uZGVuc2VkXG4gICAgICAgIC8vIHNlcmlhbGl6YXRpb25zIG9mIHRoZSBmb3JtIFtjYXNlMSwgY2FzZTIsIC4uLl0gLT4gbWF0Y2hFeHByZXNzaW9uXG4gICAgICAgIGNvbnN0IGdyb3VwZWRCeU91dHB1dDogQXJyYXk8W251bWJlciwgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPl0+ID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dExvb2t1cDoge1tpbmRleDogbnVtYmVyXTogbnVtYmVyfSA9IHt9OyAvLyBsb29rdXAgaW5kZXggaW50byBncm91cGVkQnlPdXRwdXQgZm9yIGEgZ2l2ZW4gb3V0cHV0IGV4cHJlc3Npb25cbiAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBzb3J0ZWRMYWJlbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gb3V0cHV0TG9va3VwW3RoaXMuY2FzZXNbbGFiZWxdXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhpcyBvdXRwdXQsIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBncm91cGVkIGxpc3RcbiAgICAgICAgICAgICAgICBvdXRwdXRMb29rdXBbdGhpcy5jYXNlc1tsYWJlbF1dID0gZ3JvdXBlZEJ5T3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXQucHVzaChbdGhpcy5jYXNlc1tsYWJlbF0sIFtsYWJlbF1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UndmUgc2VlbiB0aGlzIGV4cHJlc3Npb24gYmVmb3JlLCBhZGQgdGhlIGxhYmVsIHRvIHRoYXQgb3V0cHV0J3MgZ3JvdXBcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXRbb3V0cHV0SW5kZXhdWzFdLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29lcmNlTGFiZWwgPSAobGFiZWwpID0+IHRoaXMuaW5wdXRUeXBlLmtpbmQgPT09ICdudW1iZXInID8gTnVtYmVyKGxhYmVsKSA6IGxhYmVsO1xuXG4gICAgICAgIGZvciAoY29uc3QgW291dHB1dEluZGV4LCBsYWJlbHNdIG9mIGdyb3VwZWRCeU91dHB1dCkge1xuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGEgc2luZ2xlIGxhYmVsIG1hdGNoZXMgdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChjb2VyY2VMYWJlbChsYWJlbHNbMF0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgbGl0ZXJhbCBsYWJlbHMgcG9pbnRpbmcgdG8gdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChsYWJlbHMubWFwKGNvZXJjZUxhYmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5vdXRwdXRzW291dHB1dEluZGV4XS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3RoZXJ3aXNlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRjaDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgQm9vbGVhblR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBCcmFuY2hlcyA9IEFycmF5PFtFeHByZXNzaW9uLCBFeHByZXNzaW9uXT47XG5cbmNsYXNzIENhc2UgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuXG4gICAgYnJhbmNoZXM6IEJyYW5jaGVzO1xuICAgIG90aGVyd2lzZTogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGJyYW5jaGVzOiBCcmFuY2hlcywgb3RoZXJ3aXNlOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSBicmFuY2hlcztcbiAgICAgICAgdGhpcy5vdGhlcndpc2UgPSBvdGhlcndpc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIG9kZCBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiA/VHlwZTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJyYW5jaGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3QgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIEJvb2xlYW5UeXBlKTtcbiAgICAgICAgICAgIGlmICghdGVzdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1tpICsgMV0sIGkgKyAxLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYnJhbmNoZXMucHVzaChbdGVzdCwgcmVzdWx0XSk7XG5cbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHJlc3VsdC50eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3RoZXJ3aXNlID0gY29udGV4dC5wYXJzZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0sIGFyZ3MubGVuZ3RoIC0gMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgIGlmICghb3RoZXJ3aXNlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBhc3NlcnQob3V0cHV0VHlwZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZSgob3V0cHV0VHlwZTogYW55KSwgYnJhbmNoZXMsIG90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0ZXN0LCBleHByZXNzaW9uXSBvZiB0aGlzLmJyYW5jaGVzKSB7XG4gICAgICAgICAgICBpZiAodGVzdC5ldmFsdWF0ZShjdHgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vdGhlcndpc2UuZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3Rlc3QsIGV4cHJlc3Npb25dIG9mIHRoaXMuYnJhbmNoZXMpIHtcbiAgICAgICAgICAgIGZuKHRlc3QpO1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZm4odGhpcy5vdGhlcndpc2UpO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpOiBBcnJheTxWYWx1ZSB8IHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAuY29uY2F0KC4uLnRoaXMuYnJhbmNoZXMubWFwKChbXywgb3V0XSkgPT4gb3V0LnBvc3NpYmxlT3V0cHV0cygpKSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5vdGhlcndpc2UucG9zc2libGVPdXRwdXRzKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImNhc2VcIl07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FzZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHRvU3RyaW5nLCBWYWx1ZVR5cGUsIEJvb2xlYW5UeXBlLCBDb2xsYXRvclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vYXNzZXJ0aW9uJztcbmltcG9ydCB7IHR5cGVPZiB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3InO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG50eXBlIENvbXBhcmlzb25PcGVyYXRvciA9ICc9PScgfCAnIT0nIHwgJzwnIHwgJz4nIHwgJzw9JyB8ICc+PScgO1xuXG5mdW5jdGlvbiBpc0NvbXBhcmFibGVUeXBlKG9wOiBDb21wYXJpc29uT3BlcmF0b3IsIHR5cGU6IFR5cGUpIHtcbiAgICBpZiAob3AgPT09ICc9PScgfHwgb3AgPT09ICchPScpIHtcbiAgICAgICAgLy8gZXF1YWxpdHkgb3BlcmF0b3JcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudWxsJyB8fFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAndmFsdWUnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9yZGVyaW5nIG9wZXJhdG9yXG4gICAgICAgIHJldHVybiB0eXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICd2YWx1ZSc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPT09IGI7IH1cbmZ1bmN0aW9uIG5lcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgIT09IGI7IH1cbmZ1bmN0aW9uIGx0KGN0eCwgYSwgYikgeyByZXR1cm4gYSA8IGI7IH1cbmZ1bmN0aW9uIGd0KGN0eCwgYSwgYikgeyByZXR1cm4gYSA+IGI7IH1cbmZ1bmN0aW9uIGx0ZXEoY3R4LCBhLCBiKSB7IHJldHVybiBhIDw9IGI7IH1cbmZ1bmN0aW9uIGd0ZXEoY3R4LCBhLCBiKSB7IHJldHVybiBhID49IGI7IH1cblxuZnVuY3Rpb24gZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpID09PSAwOyB9XG5mdW5jdGlvbiBuZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gIWVxQ29sbGF0ZShjdHgsIGEsIGIsIGMpOyB9XG5mdW5jdGlvbiBsdENvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPCAwOyB9XG5mdW5jdGlvbiBndENvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPiAwOyB9XG5mdW5jdGlvbiBsdGVxQ29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA8PSAwOyB9XG5mdW5jdGlvbiBndGVxQ29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA+PSAwOyB9XG5cbi8qKlxuICogU3BlY2lhbCBmb3JtIGZvciBjb21wYXJpc29uIG9wZXJhdG9ycywgaW1wbGVtZW50aW5nIHRoZSBzaWduYXR1cmVzOlxuICogLSAoVCwgVCwgP0NvbGxhdG9yKSA9PiBib29sZWFuXG4gKiAtIChULCB2YWx1ZSwgP0NvbGxhdG9yKSA9PiBib29sZWFuXG4gKiAtICh2YWx1ZSwgVCwgP0NvbGxhdG9yKSA9PiBib29sZWFuXG4gKlxuICogRm9yIGluZXF1YWxpdGllcywgVCBtdXN0IGJlIGVpdGhlciB2YWx1ZSwgc3RyaW5nLCBvciBudW1iZXIuIEZvciA9PS8hPSwgaXRcbiAqIGNhbiBhbHNvIGJlIGJvb2xlYW4gb3IgbnVsbC5cbiAqXG4gKiBFcXVhbGl0eSBzZW1hbnRpY3MgYXJlIGVxdWl2YWxlbnQgdG8gSmF2YXNjcmlwdCdzIHN0cmljdCBlcXVhbGl0eSAoPT09LyE9PSlcbiAqIC0tIGkuZS4sIHdoZW4gdGhlIGFyZ3VtZW50cycgdHlwZXMgZG9uJ3QgbWF0Y2gsID09IGV2YWx1YXRlcyB0byBmYWxzZSwgIT0gdG9cbiAqIHRydWUuXG4gKlxuICogV2hlbiB0eXBlcyBkb24ndCBtYXRjaCBpbiBhbiBvcmRlcmluZyBjb21wYXJpc29uLCBhIHJ1bnRpbWUgZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VDb21wYXJpc29uKG9wOiBDb21wYXJpc29uT3BlcmF0b3IsIGNvbXBhcmVCYXNpYywgY29tcGFyZVdpdGhDb2xsYXRvcikge1xuICAgIGNvbnN0IGlzT3JkZXJDb21wYXJpc29uID0gb3AgIT09ICc9PScgJiYgb3AgIT09ICchPSc7XG5cbiAgICByZXR1cm4gY2xhc3MgQ29tcGFyaXNvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgICAgICB0eXBlOiBUeXBlO1xuICAgICAgICBsaHM6IEV4cHJlc3Npb247XG4gICAgICAgIHJoczogRXhwcmVzc2lvbjtcbiAgICAgICAgY29sbGF0b3I6ID9FeHByZXNzaW9uO1xuICAgICAgICBoYXNVbnR5cGVkQXJndW1lbnQ6IGJvb2xlYW47XG5cbiAgICAgICAgY29uc3RydWN0b3IobGhzOiBFeHByZXNzaW9uLCByaHM6IEV4cHJlc3Npb24sIGNvbGxhdG9yOiA/RXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy50eXBlID0gQm9vbGVhblR5cGU7XG4gICAgICAgICAgICB0aGlzLmxocyA9IGxocztcbiAgICAgICAgICAgIHRoaXMucmhzID0gcmhzO1xuICAgICAgICAgICAgdGhpcy5jb2xsYXRvciA9IGNvbGxhdG9yO1xuICAgICAgICAgICAgdGhpcy5oYXNVbnR5cGVkQXJndW1lbnQgPSBsaHMudHlwZS5raW5kID09PSAndmFsdWUnIHx8IHJocy50eXBlLmtpbmQgPT09ICd2YWx1ZSc7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMyAmJiBhcmdzLmxlbmd0aCAhPT0gNClcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5gKTtcblxuICAgICAgICAgICAgY29uc3Qgb3A6IENvbXBhcmlzb25PcGVyYXRvciA9IChhcmdzWzBdOiBhbnkpO1xuXG4gICAgICAgICAgICBsZXQgbGhzID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFsaHMpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKCFpc0NvbXBhcmFibGVUeXBlKG9wLCBsaHMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jb25jYXQoMSkuZXJyb3IoYFwiJHtvcH1cIiBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAnJHt0b1N0cmluZyhsaHMudHlwZSl9Jy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByaHMgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJocykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoIWlzQ29tcGFyYWJsZVR5cGUob3AsIHJocy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbmNhdCgyKS5lcnJvcihgXCIke29wfVwiIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0eXBlICcke3RvU3RyaW5nKHJocy50eXBlKX0nLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gcmhzLnR5cGUua2luZCAmJlxuICAgICAgICAgICAgICAgIGxocy50eXBlLmtpbmQgIT09ICd2YWx1ZScgJiZcbiAgICAgICAgICAgICAgICByaHMudHlwZS5raW5kICE9PSAndmFsdWUnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ2Fubm90IGNvbXBhcmUgdHlwZXMgJyR7dG9TdHJpbmcobGhzLnR5cGUpfScgYW5kICcke3RvU3RyaW5nKHJocy50eXBlKX0nLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPcmRlckNvbXBhcmlzb24pIHtcbiAgICAgICAgICAgICAgICAvLyB0eXBpbmcgcnVsZXMgc3BlY2lmaWMgdG8gbGVzcy9ncmVhdGVyIHRoYW4gb3BlcmF0b3JzXG4gICAgICAgICAgICAgICAgaWYgKGxocy50eXBlLmtpbmQgPT09ICd2YWx1ZScgJiYgcmhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAvLyAodmFsdWUsIFQpXG4gICAgICAgICAgICAgICAgICAgIGxocyA9IG5ldyBBc3NlcnRpb24ocmhzLnR5cGUsIFtsaHNdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxocy50eXBlLmtpbmQgIT09ICd2YWx1ZScgJiYgcmhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAvLyAoVCwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJocyA9IG5ldyBBc3NlcnRpb24obGhzLnR5cGUsIFtyaHNdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb2xsYXRvciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxocy50eXBlLmtpbmQgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIHJocy50eXBlLmtpbmQgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIGxocy50eXBlLmtpbmQgIT09ICd2YWx1ZScgJiZcbiAgICAgICAgICAgICAgICAgICAgcmhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ2Fubm90IHVzZSBjb2xsYXRvciB0byBjb21wYXJlIG5vbi1zdHJpbmcgdHlwZXMuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbGxhdG9yID0gY29udGV4dC5wYXJzZShhcmdzWzNdLCAzLCBDb2xsYXRvclR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICghY29sbGF0b3IpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhcmlzb24obGhzLCByaHMsIGNvbGxhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxocyA9IHRoaXMubGhzLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICBjb25zdCByaHMgPSB0aGlzLnJocy5ldmFsdWF0ZShjdHgpO1xuXG4gICAgICAgICAgICBpZiAoaXNPcmRlckNvbXBhcmlzb24gJiYgdGhpcy5oYXNVbnR5cGVkQXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsdCA9IHR5cGVPZihsaHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ0ID0gdHlwZU9mKHJocyk7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0eXBlIGlzIHN0cmluZyBvciBudW1iZXIsIGFuZCBlcXVhbFxuICAgICAgICAgICAgICAgIGlmIChsdC5raW5kICE9PSBydC5raW5kIHx8ICEobHQua2luZCA9PT0gJ3N0cmluZycgfHwgbHQua2luZCA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50cyBmb3IgXCIke29wfVwiIHRvIGJlIChzdHJpbmcsIHN0cmluZykgb3IgKG51bWJlciwgbnVtYmVyKSwgYnV0IGZvdW5kICgke2x0LmtpbmR9LCAke3J0LmtpbmR9KSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuY29sbGF0b3IgJiYgIWlzT3JkZXJDb21wYXJpc29uICYmIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbHQgPSB0eXBlT2YobGhzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBydCA9IHR5cGVPZihyaHMpO1xuICAgICAgICAgICAgICAgIGlmIChsdC5raW5kICE9PSAnc3RyaW5nJyB8fCBydC5raW5kICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZUJhc2ljKGN0eCwgbGhzLCByaHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IgP1xuICAgICAgICAgICAgICAgIGNvbXBhcmVXaXRoQ29sbGF0b3IoY3R4LCBsaHMsIHJocywgdGhpcy5jb2xsYXRvci5ldmFsdWF0ZShjdHgpKSA6XG4gICAgICAgICAgICAgICAgY29tcGFyZUJhc2ljKGN0eCwgbGhzLCByaHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICAgICAgZm4odGhpcy5saHMpO1xuICAgICAgICAgICAgZm4odGhpcy5yaHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29sbGF0b3IpIHtcbiAgICAgICAgICAgICAgICBmbih0aGlzLmNvbGxhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgZmFsc2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtvcF07XG4gICAgICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgRXF1YWxzID0gbWFrZUNvbXBhcmlzb24oJz09JywgZXEsIGVxQ29sbGF0ZSk7XG5leHBvcnQgY29uc3QgTm90RXF1YWxzID0gbWFrZUNvbXBhcmlzb24oJyE9JywgbmVxLCBuZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBMZXNzVGhhbiA9IG1ha2VDb21wYXJpc29uKCc8JywgbHQsIGx0Q29sbGF0ZSk7XG5leHBvcnQgY29uc3QgR3JlYXRlclRoYW4gPSBtYWtlQ29tcGFyaXNvbignPicsIGd0LCBndENvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IExlc3NUaGFuT3JFcXVhbCA9IG1ha2VDb21wYXJpc29uKCc8PScsIGx0ZXEsIGx0ZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBHcmVhdGVyVGhhbk9yRXF1YWwgPSBtYWtlQ29tcGFyaXNvbignPj0nLCBndGVxLCBndGVxQ29sbGF0ZSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBTdHJpbmdUeXBlLCBOdW1iZXJUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5kZWNsYXJlIHZhciBJbnRsOiB7XG4gICAgTnVtYmVyRm9ybWF0OiBDbGFzczxJbnRsJE51bWJlckZvcm1hdD5cbn07XG5cbmRlY2xhcmUgY2xhc3MgSW50bCROdW1iZXJGb3JtYXQge1xuICAgIGNvbnN0cnVjdG9yIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogTnVtYmVyRm9ybWF0T3B0aW9uc1xuICAgICk6IEludGwkTnVtYmVyRm9ybWF0O1xuXG4gICAgc3RhdGljIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogTnVtYmVyRm9ybWF0T3B0aW9uc1xuICAgICk6IEludGwkTnVtYmVyRm9ybWF0O1xuXG4gICAgZm9ybWF0KGE6IG51bWJlcik6IHN0cmluZztcblxuICAgIHJlc29sdmVkT3B0aW9ucygpOiBhbnk7XG59XG5cbnR5cGUgTnVtYmVyRm9ybWF0T3B0aW9ucyA9IHtcbiAgICBzdHlsZT86ICdkZWNpbWFsJyB8ICdjdXJyZW5jeScgfCAncGVyY2VudCc7XG4gICAgY3VycmVuY3k/OiBudWxsIHwgc3RyaW5nO1xuICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0cz86IG51bGwgfCBzdHJpbmc7XG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzPzogbnVsbCB8IHN0cmluZztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE51bWJlckZvcm1hdCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbnVtYmVyOiBFeHByZXNzaW9uO1xuICAgIGxvY2FsZTogRXhwcmVzc2lvbiB8IG51bGw7ICAgLy8gQkNQIDQ3IGxhbmd1YWdlIHRhZ1xuICAgIGN1cnJlbmN5OiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gSVNPIDQyMTcgY3VycmVuY3kgY29kZSwgcmVxdWlyZWQgaWYgc3R5bGU9Y3VycmVuY3lcbiAgICBtaW5GcmFjdGlvbkRpZ2l0czogRXhwcmVzc2lvbiB8IG51bGw7IC8vIERlZmF1bHQgMFxuICAgIG1heEZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gRGVmYXVsdCAzXG5cbiAgICBjb25zdHJ1Y3RvcihudW1iZXI6IEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBFeHByZXNzaW9uIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogRXhwcmVzc2lvbiB8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsLFxuICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnR5cGUgPSBTdHJpbmdUeXBlO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY3VycmVuY3kgPSBjdXJyZW5jeTtcbiAgICAgICAgdGhpcy5taW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID0gbWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGNvbnN0IG51bWJlciA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghbnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gKGFyZ3NbMl06IGFueSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG9wdGlvbnMpKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYE51bWJlckZvcm1hdCBvcHRpb25zIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0LmApO1xuXG4gICAgICAgIGxldCBsb2NhbGUgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snbG9jYWxlJ10pIHtcbiAgICAgICAgICAgIGxvY2FsZSA9IGNvbnRleHQucGFyc2Uob3B0aW9uc1snbG9jYWxlJ10sIDEsIFN0cmluZ1R5cGUpO1xuICAgICAgICAgICAgaWYgKCFsb2NhbGUpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbmN5ID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2N1cnJlbmN5J10pIHtcbiAgICAgICAgICAgIGN1cnJlbmN5ID0gY29udGV4dC5wYXJzZShvcHRpb25zWydjdXJyZW5jeSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghY3VycmVuY3kpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1pbkZyYWN0aW9uRGlnaXRzID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSkge1xuICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1pbkZyYWN0aW9uRGlnaXRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhGcmFjdGlvbkRpZ2l0cyA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10pIHtcbiAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzID0gY29udGV4dC5wYXJzZShvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFtYXhGcmFjdGlvbkRpZ2l0cykgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE51bWJlckZvcm1hdChudW1iZXIsIGxvY2FsZSwgY3VycmVuY3ksIG1pbkZyYWN0aW9uRGlnaXRzLCBtYXhGcmFjdGlvbkRpZ2l0cyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUoY3R4KSA6IFtdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLmN1cnJlbmN5ID8gXCJjdXJyZW5jeVwiIDogXCJkZWNpbWFsXCIsXG4gICAgICAgICAgICAgICAgY3VycmVuY3k6IHRoaXMuY3VycmVuY3kgPyB0aGlzLmN1cnJlbmN5LmV2YWx1YXRlKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzID8gdGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZShjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyA/IHRoaXMubWF4RnJhY3Rpb25EaWdpdHMuZXZhbHVhdGUoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZvcm1hdCh0aGlzLm51bWJlci5ldmFsdWF0ZShjdHgpKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMubnVtYmVyKTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBmbih0aGlzLmxvY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VycmVuY3kpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuY3VycmVuY3kpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1pbkZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBmbih0aGlzLm1pbkZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXhGcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgZm4odGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBvcHRpb25zWydsb2NhbGUnXSA9IHRoaXMubG9jYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbmN5KSB7XG4gICAgICAgICAgICBvcHRpb25zWydjdXJyZW5jeSddID0gdGhpcy5jdXJyZW5jeS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5taW5GcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgb3B0aW9uc1snbWluLWZyYWN0aW9uLWRpZ2l0cyddID0gdGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXhGcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgb3B0aW9uc1snbWF4LWZyYWN0aW9uLWRpZ2l0cyddID0gdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1wibnVtYmVyLWZvcm1hdFwiLCB0aGlzLm51bWJlci5zZXJpYWxpemUoKSwgb3B0aW9uc107XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgTnVtYmVyVHlwZSwgdG9TdHJpbmcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IHR5cGVPZiB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3InO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jbGFzcyBMZW5ndGggaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gTnVtYmVyVHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAxIGFyZ3VtZW50LCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoaW5wdXQudHlwZS5raW5kICE9PSAnYXJyYXknICYmIGlucHV0LnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiYgaW5wdXQudHlwZS5raW5kICE9PSAndmFsdWUnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50IG9mIHR5cGUgc3RyaW5nIG9yIGFycmF5LCBidXQgZm91bmQgJHt0b1N0cmluZyhpbnB1dC50eXBlKX0gaW5zdGVhZC5gKTtcblxuICAgICAgICByZXR1cm4gbmV3IExlbmd0aChpbnB1dCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlIHN0cmluZyBvciBhcnJheSwgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKGlucHV0KSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImxlbmd0aFwiXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMZW5ndGg7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIHR5cGUgVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgQm9vbGVhblR5cGUsXG4gICAgQ29sb3JUeXBlLFxuICAgIE9iamVjdFR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIEVycm9yVHlwZSxcbiAgICBDb2xsYXRvclR5cGUsXG4gICAgYXJyYXksXG4gICAgdG9TdHJpbmcgYXMgdHlwZVRvU3RyaW5nXG59IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgdHlwZU9mLCBDb2xvciwgdmFsaWRhdGVSR0JBLCB0b1N0cmluZyBhcyB2YWx1ZVRvU3RyaW5nIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi4vY29tcG91bmRfZXhwcmVzc2lvbic7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3InO1xuaW1wb3J0IExldCBmcm9tICcuL2xldCc7XG5pbXBvcnQgVmFyIGZyb20gJy4vdmFyJztcbmltcG9ydCBMaXRlcmFsIGZyb20gJy4vbGl0ZXJhbCc7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vYXNzZXJ0aW9uJztcbmltcG9ydCBDb2VyY2lvbiBmcm9tICcuL2NvZXJjaW9uJztcbmltcG9ydCBBdCBmcm9tICcuL2F0JztcbmltcG9ydCBNYXRjaCBmcm9tICcuL21hdGNoJztcbmltcG9ydCBDYXNlIGZyb20gJy4vY2FzZSc7XG5pbXBvcnQgU3RlcCBmcm9tICcuL3N0ZXAnO1xuaW1wb3J0IEludGVycG9sYXRlIGZyb20gJy4vaW50ZXJwb2xhdGUnO1xuaW1wb3J0IENvYWxlc2NlIGZyb20gJy4vY29hbGVzY2UnO1xuaW1wb3J0IHtcbiAgICBFcXVhbHMsXG4gICAgTm90RXF1YWxzLFxuICAgIExlc3NUaGFuLFxuICAgIEdyZWF0ZXJUaGFuLFxuICAgIExlc3NUaGFuT3JFcXVhbCxcbiAgICBHcmVhdGVyVGhhbk9yRXF1YWxcbn0gZnJvbSAnLi9jb21wYXJpc29uJztcbmltcG9ydCBDb2xsYXRvckV4cHJlc3Npb24gZnJvbSAnLi9jb2xsYXRvcic7XG5pbXBvcnQgTnVtYmVyRm9ybWF0IGZyb20gJy4vbnVtYmVyX2Zvcm1hdCc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuL2Zvcm1hdCc7XG5pbXBvcnQgTGVuZ3RoIGZyb20gJy4vbGVuZ3RoJztcblxuaW1wb3J0IHR5cGUgeyBWYXJhcmdzIH0gZnJvbSAnLi4vY29tcG91bmRfZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb25SZWdpc3RyeSB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuXG5jb25zdCBleHByZXNzaW9uczogRXhwcmVzc2lvblJlZ2lzdHJ5ID0ge1xuICAgIC8vIHNwZWNpYWwgZm9ybXNcbiAgICAnPT0nOiBFcXVhbHMsXG4gICAgJyE9JzogTm90RXF1YWxzLFxuICAgICc+JzogR3JlYXRlclRoYW4sXG4gICAgJzwnOiBMZXNzVGhhbixcbiAgICAnPj0nOiBHcmVhdGVyVGhhbk9yRXF1YWwsXG4gICAgJzw9JzogTGVzc1RoYW5PckVxdWFsLFxuICAgICdhcnJheSc6IEFzc2VydGlvbixcbiAgICAnYXQnOiBBdCxcbiAgICAnYm9vbGVhbic6IEFzc2VydGlvbixcbiAgICAnY2FzZSc6IENhc2UsXG4gICAgJ2NvYWxlc2NlJzogQ29hbGVzY2UsXG4gICAgJ2NvbGxhdG9yJzogQ29sbGF0b3JFeHByZXNzaW9uLFxuICAgICdmb3JtYXQnOiBGb3JtYXRFeHByZXNzaW9uLFxuICAgICdpbnRlcnBvbGF0ZSc6IEludGVycG9sYXRlLFxuICAgICdpbnRlcnBvbGF0ZS1oY2wnOiBJbnRlcnBvbGF0ZSxcbiAgICAnaW50ZXJwb2xhdGUtbGFiJzogSW50ZXJwb2xhdGUsXG4gICAgJ2xlbmd0aCc6IExlbmd0aCxcbiAgICAnbGV0JzogTGV0LFxuICAgICdsaXRlcmFsJzogTGl0ZXJhbCxcbiAgICAnbWF0Y2gnOiBNYXRjaCxcbiAgICAnbnVtYmVyJzogQXNzZXJ0aW9uLFxuICAgICdudW1iZXItZm9ybWF0JzogTnVtYmVyRm9ybWF0LFxuICAgICdvYmplY3QnOiBBc3NlcnRpb24sXG4gICAgJ3N0ZXAnOiBTdGVwLFxuICAgICdzdHJpbmcnOiBBc3NlcnRpb24sXG4gICAgJ3RvLWJvb2xlYW4nOiBDb2VyY2lvbixcbiAgICAndG8tY29sb3InOiBDb2VyY2lvbixcbiAgICAndG8tbnVtYmVyJzogQ29lcmNpb24sXG4gICAgJ3RvLXN0cmluZyc6IENvZXJjaW9uLFxuICAgICd2YXInOiBWYXJcbn07XG5cbmZ1bmN0aW9uIHJnYmEoY3R4LCBbciwgZywgYiwgYV0pIHtcbiAgICByID0gci5ldmFsdWF0ZShjdHgpO1xuICAgIGcgPSBnLmV2YWx1YXRlKGN0eCk7XG4gICAgYiA9IGIuZXZhbHVhdGUoY3R4KTtcbiAgICBjb25zdCBhbHBoYSA9IGEgPyBhLmV2YWx1YXRlKGN0eCkgOiAxO1xuICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVSR0JBKHIsIGcsIGIsIGFscGhhKTtcbiAgICBpZiAoZXJyb3IpIHRocm93IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBuZXcgQ29sb3IociAvIDI1NSAqIGFscGhhLCBnIC8gMjU1ICogYWxwaGEsIGIgLyAyNTUgKiBhbHBoYSwgYWxwaGEpO1xufVxuXG5mdW5jdGlvbiBoYXMoa2V5LCBvYmopIHtcbiAgICByZXR1cm4ga2V5IGluIG9iajtcbn1cblxuZnVuY3Rpb24gZ2V0KGtleSwgb2JqKSB7XG4gICAgY29uc3QgdiA9IG9ialtrZXldO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogdjtcbn1cblxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKHYsIGEsIGksIGopIHtcbiAgICB3aGlsZSAoaSA8PSBqKSB7XG4gICAgICAgIGNvbnN0IG0gPSAoaSArIGopID4+IDE7XG4gICAgICAgIGlmIChhW21dID09PSB2KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChhW21dID4gdilcbiAgICAgICAgICAgIGogPSBtIC0gMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaSA9IG0gKyAxO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHZhcmFyZ3ModHlwZTogVHlwZSk6IFZhcmFyZ3Mge1xuICAgIHJldHVybiB7IHR5cGUgfTtcbn1cblxuQ29tcG91bmRFeHByZXNzaW9uLnJlZ2lzdGVyKGV4cHJlc3Npb25zLCB7XG4gICAgJ2Vycm9yJzogW1xuICAgICAgICBFcnJvclR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7IHRocm93IG5ldyBSdW50aW1lRXJyb3Iodi5ldmFsdWF0ZShjdHgpKTsgfVxuICAgIF0sXG4gICAgJ3R5cGVvZic6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4gdHlwZVRvU3RyaW5nKHR5cGVPZih2LmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ3RvLXJnYmEnOiBbXG4gICAgICAgIGFycmF5KE51bWJlclR5cGUsIDQpLFxuICAgICAgICBbQ29sb3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdi5ldmFsdWF0ZShjdHgpLnRvQXJyYXkoKTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3JnYic6IFtcbiAgICAgICAgQ29sb3JUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIHJnYmFcbiAgICBdLFxuICAgICdyZ2JhJzogW1xuICAgICAgICBDb2xvclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgcmdiYVxuICAgIF0sXG4gICAgJ2hhcyc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhblR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5XSkgPT4gaGFzKGtleS5ldmFsdWF0ZShjdHgpLCBjdHgucHJvcGVydGllcygpKVxuICAgICAgICAgICAgXSwgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlLCBPYmplY3RUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5LCBvYmpdKSA9PiBoYXMoa2V5LmV2YWx1YXRlKGN0eCksIG9iai5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnZ2V0Jzoge1xuICAgICAgICB0eXBlOiBWYWx1ZVR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5XSkgPT4gZ2V0KGtleS5ldmFsdWF0ZShjdHgpLCBjdHgucHJvcGVydGllcygpKVxuICAgICAgICAgICAgXSwgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlLCBPYmplY3RUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5LCBvYmpdKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIG9iai5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnZmVhdHVyZS1zdGF0ZSc6IFtcbiAgICAgICAgVmFsdWVUeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgIChjdHgsIFtrZXldKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5mZWF0dXJlU3RhdGUgfHwge30pXG4gICAgXSxcbiAgICAncHJvcGVydGllcyc6IFtcbiAgICAgICAgT2JqZWN0VHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5wcm9wZXJ0aWVzKClcbiAgICBdLFxuICAgICdnZW9tZXRyeS10eXBlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdlb21ldHJ5VHlwZSgpXG4gICAgXSxcbiAgICAnaWQnOiBbXG4gICAgICAgIFZhbHVlVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5pZCgpXG4gICAgXSxcbiAgICAnem9vbSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLnpvb21cbiAgICBdLFxuICAgICdoZWF0bWFwLWRlbnNpdHknOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2xvYmFscy5oZWF0bWFwRGVuc2l0eSB8fCAwXG4gICAgXSxcbiAgICAnbGluZS1wcm9ncmVzcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLmxpbmVQcm9ncmVzcyB8fCAwXG4gICAgXSxcbiAgICAnYWNjdW11bGF0ZWQnOiBbXG4gICAgICAgIFZhbHVlVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLmFjY3VtdWxhdGVkID09PSB1bmRlZmluZWQgPyBudWxsIDogY3R4Lmdsb2JhbHMuYWNjdW11bGF0ZWRcbiAgICBdLFxuICAgICcrJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnKic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IDE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICo9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJy0nOiB7XG4gICAgICAgIHR5cGU6IE51bWJlclR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAtIGIuZXZhbHVhdGUoY3R4KVxuICAgICAgICAgICAgXSwgW1xuICAgICAgICAgICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYV0pID0+IC1hLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJy8nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgLyBiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICclJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpICUgYi5ldmFsdWF0ZShjdHgpXG4gICAgXSxcbiAgICAnbG4yJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKCkgPT4gTWF0aC5MTjJcbiAgICBdLFxuICAgICdwaSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguUElcbiAgICBdLFxuICAgICdlJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKCkgPT4gTWF0aC5FXG4gICAgXSxcbiAgICAnXic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbYiwgZV0pID0+IE1hdGgucG93KGIuZXZhbHVhdGUoY3R4KSwgZS5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ3NxcnQnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW3hdKSA9PiBNYXRoLnNxcnQoeC5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2xvZzEwJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5sb2cobi5ldmFsdWF0ZShjdHgpKSAvIE1hdGguTE4xMFxuICAgIF0sXG4gICAgJ2xuJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5sb2cobi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2xvZzInOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmxvZyhuLmV2YWx1YXRlKGN0eCkpIC8gTWF0aC5MTjJcbiAgICBdLFxuICAgICdzaW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLnNpbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnY29zJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5jb3Mobi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ3Rhbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgudGFuKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdhc2luJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5hc2luKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdhY29zJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5hY29zKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdhdGFuJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5hdGFuKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdtaW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIHZhcmFyZ3MoTnVtYmVyVHlwZSksXG4gICAgICAgIChjdHgsIGFyZ3MpID0+IE1hdGgubWluKC4uLmFyZ3MubWFwKGFyZyA9PiBhcmcuZXZhbHVhdGUoY3R4KSkpXG4gICAgXSxcbiAgICAnbWF4JzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBNYXRoLm1heCguLi5hcmdzLm1hcChhcmcgPT4gYXJnLmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ2Ficyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYWJzKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdyb3VuZCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBuLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICAvLyBKYXZhc2NyaXB0J3MgTWF0aC5yb3VuZCgpIHJvdW5kcyB0b3dhcmRzICtJbmZpbml0eSBmb3IgaGFsZndheVxuICAgICAgICAgICAgLy8gdmFsdWVzLCBldmVuIHdoZW4gdGhleSdyZSBuZWdhdGl2ZS4gSXQncyBtb3JlIGNvbW1vbiB0byByb3VuZFxuICAgICAgICAgICAgLy8gYXdheSBmcm9tIDAgKGUuZy4sIHRoaXMgaXMgd2hhdCBweXRob24gYW5kIEMrKyBkbylcbiAgICAgICAgICAgIHJldHVybiB2IDwgMCA/IC1NYXRoLnJvdW5kKC12KSA6IE1hdGgucm91bmQodik7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmbG9vcic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguZmxvb3Iobi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2NlaWwnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmNlaWwobi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2ZpbHRlci09PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdID09PSAodjogYW55KS52YWx1ZVxuICAgIF0sXG4gICAgJ2ZpbHRlci1pZC09PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IGN0eC5pZCgpID09PSAodjogYW55KS52YWx1ZVxuICAgIF0sXG4gICAgJ2ZpbHRlci10eXBlLT09JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IGN0eC5nZW9tZXRyeVR5cGUoKSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItPCc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA8IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPCc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHguaWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA8IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItPic6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPic6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHguaWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItPD0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPD0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci1pZC08PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHguaWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA8PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLT49JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID49IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPj0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPj0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci1oYXMnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2tdKSA9PiAoazogYW55KS52YWx1ZSBpbiBjdHgucHJvcGVydGllcygpXG4gICAgXSxcbiAgICAnZmlsdGVyLWhhcy1pZCc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguaWQoKSAhPT0gbnVsbFxuICAgIF0sXG4gICAgJ2ZpbHRlci10eXBlLWluJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW2FycmF5KFN0cmluZ1R5cGUpXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiAodjogYW55KS52YWx1ZS5pbmRleE9mKGN0eC5nZW9tZXRyeVR5cGUoKSkgPj0gMFxuICAgIF0sXG4gICAgJ2ZpbHRlci1pZC1pbic6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFthcnJheShWYWx1ZVR5cGUpXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiAodjogYW55KS52YWx1ZS5pbmRleE9mKGN0eC5pZCgpKSA+PSAwXG4gICAgXSxcbiAgICAnZmlsdGVyLWluLXNtYWxsJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIGFycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAvLyBhc3N1bWVzIHYgaXMgYW4gYXJyYXkgbGl0ZXJhbFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV0pID49IDBcbiAgICBdLFxuICAgICdmaWx0ZXItaW4tbGFyZ2UnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgYXJyYXkoVmFsdWVUeXBlKV0sXG4gICAgICAgIC8vIGFzc3VtZXMgdiBpcyBhIGFycmF5IGxpdGVyYWwgd2l0aCB2YWx1ZXMgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBhbmQgb2YgYSBzaW5nbGUgdHlwZVxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IGJpbmFyeVNlYXJjaChjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSwgKHY6IGFueSkudmFsdWUsIDAsICh2OiBhbnkpLnZhbHVlLmxlbmd0aCAtIDEpXG4gICAgXSxcbiAgICAnYWxsJzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW0Jvb2xlYW5UeXBlLCBCb29sZWFuVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgJiYgYi5ldmFsdWF0ZShjdHgpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHZhcmFyZ3MoQm9vbGVhblR5cGUpLFxuICAgICAgICAgICAgICAgIChjdHgsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmcuZXZhbHVhdGUoY3R4KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnYW55Jzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW0Jvb2xlYW5UeXBlLCBCb29sZWFuVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgfHwgYi5ldmFsdWF0ZShjdHgpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHZhcmFyZ3MoQm9vbGVhblR5cGUpLFxuICAgICAgICAgICAgICAgIChjdHgsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICchJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW0Jvb2xlYW5UeXBlXSxcbiAgICAgICAgKGN0eCwgW2JdKSA9PiAhYi5ldmFsdWF0ZShjdHgpXG4gICAgXSxcbiAgICAnaXMtc3VwcG9ydGVkLXNjcmlwdCc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgLy8gQXQgcGFyc2UgdGltZSB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlLCBzbyB3ZSBuZWVkIHRvIGV4Y2x1ZGUgdGhpcyBleHByZXNzaW9uIHdpdGggaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50XG4gICAgICAgIChjdHgsIFtzXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNTdXBwb3J0ZWRTY3JpcHQgPSBjdHguZ2xvYmFscyAmJiBjdHguZ2xvYmFscy5pc1N1cHBvcnRlZFNjcmlwdDtcbiAgICAgICAgICAgIGlmIChpc1N1cHBvcnRlZFNjcmlwdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1N1cHBvcnRlZFNjcmlwdChzLmV2YWx1YXRlKGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICd1cGNhc2UnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3NdKSA9PiBzLmV2YWx1YXRlKGN0eCkudG9VcHBlckNhc2UoKVxuICAgIF0sXG4gICAgJ2Rvd25jYXNlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgIChjdHgsIFtzXSkgPT4gcy5ldmFsdWF0ZShjdHgpLnRvTG93ZXJDYXNlKClcbiAgICBdLFxuICAgICdjb25jYXQnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIHZhcmFyZ3MoVmFsdWVUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gYXJncy5tYXAoYXJnID0+IHZhbHVlVG9TdHJpbmcoYXJnLmV2YWx1YXRlKGN0eCkpKS5qb2luKCcnKVxuICAgIF0sXG4gICAgJ3Jlc29sdmVkLWxvY2FsZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW0NvbGxhdG9yVHlwZV0sXG4gICAgICAgIChjdHgsIFtjb2xsYXRvcl0pID0+IGNvbGxhdG9yLmV2YWx1YXRlKGN0eCkucmVzb2x2ZWRMb2NhbGUoKVxuICAgIF1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBleHByZXNzaW9ucztcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogQSB0eXBlIHVzZWQgZm9yIHJldHVybmluZyBhbmQgcHJvcGFnYXRpbmcgZXJyb3JzLiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgdW5pb25cbiAqIHJlcHJlc2VudHMgc3VjY2VzcyBhbmQgY29udGFpbnMgYSB2YWx1ZSwgYW5kIHRoZSBzZWNvbmQgcmVwcmVzZW50cyBhbiBlcnJvciBhbmRcbiAqIGNvbnRhaW5zIGFuIGVycm9yIHZhbHVlLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0PFQsIEU+ID1cbiAgICB8IHt8IHJlc3VsdDogJ3N1Y2Nlc3MnLCB2YWx1ZTogVCB8fVxuICAgIHwge3wgcmVzdWx0OiAnZXJyb3InLCB2YWx1ZTogRSB8fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHN1Y2Nlc3M8VCwgRT4odmFsdWU6IFQpOiBSZXN1bHQ8VCwgRT4ge1xuICAgIHJldHVybiB7IHJlc3VsdDogJ3N1Y2Nlc3MnLCB2YWx1ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3I8VCwgRT4odmFsdWU6IEUpOiBSZXN1bHQ8VCwgRT4ge1xuICAgIHJldHVybiB7IHJlc3VsdDogJ2Vycm9yJywgdmFsdWUgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbihzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzcGVjWydwcm9wZXJ0eS10eXBlJ10gPT09ICdkYXRhLWRyaXZlbicgfHwgc3BlY1sncHJvcGVydHktdHlwZSddID09PSAnY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNab29tRXhwcmVzc2lvbihzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXNwZWMuZXhwcmVzc2lvbiAmJiBzcGVjLmV4cHJlc3Npb24ucGFyYW1ldGVycy5pbmRleE9mKCd6b29tJykgPiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzSW50ZXJwb2xhdGlvbihzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXNwZWMuZXhwcmVzc2lvbiAmJiBzcGVjLmV4cHJlc3Npb24uaW50ZXJwb2xhdGVkO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRUeXBlKHZhbCkge1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICB9IGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9IGVsc2UgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0ICogYXMgY29sb3JTcGFjZXMgZnJvbSAnLi4vdXRpbC9jb2xvcl9zcGFjZXMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3V0aWwvY29sb3InO1xuaW1wb3J0IGV4dGVuZCBmcm9tICcuLi91dGlsL2V4dGVuZCc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCAqIGFzIGludGVycG9sYXRlIGZyb20gJy4uL3V0aWwvaW50ZXJwb2xhdGUnO1xuaW1wb3J0IEludGVycG9sYXRlIGZyb20gJy4uL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5pbXBvcnQgeyBzdXBwb3J0c0ludGVycG9sYXRpb24gfSBmcm9tICcuLi91dGlsL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHsgZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyB9IGZyb20gJy4uL2V4cHJlc3Npb24vc3RvcHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHlGdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMpIHtcbiAgICBjb25zdCBpc0NvbG9yID0gcHJvcGVydHlTcGVjLnR5cGUgPT09ICdjb2xvcic7XG4gICAgY29uc3Qgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBwYXJhbWV0ZXJzLnN0b3BzICYmIHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdID09PSAnb2JqZWN0JztcbiAgICBjb25zdCBmZWF0dXJlRGVwZW5kZW50ID0gem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgfHwgcGFyYW1ldGVycy5wcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHpvb21EZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCAhZmVhdHVyZURlcGVuZGVudDtcbiAgICBjb25zdCB0eXBlID0gcGFyYW1ldGVycy50eXBlIHx8IChzdXBwb3J0c0ludGVycG9sYXRpb24ocHJvcGVydHlTcGVjKSA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnKTtcblxuICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHBhcmFtZXRlcnMgPSBleHRlbmQoe30sIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzID0gcGFyYW1ldGVycy5zdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIENvbG9yLnBhcnNlKHN0b3BbMV0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5kZWZhdWx0ID0gQ29sb3IucGFyc2UocGFyYW1ldGVycy5kZWZhdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdCA9IENvbG9yLnBhcnNlKHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgJiYgcGFyYW1ldGVycy5jb2xvclNwYWNlICE9PSAncmdiJyAmJiAhY29sb3JTcGFjZXNbcGFyYW1ldGVycy5jb2xvclNwYWNlXSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbG9yIHNwYWNlOiAke3BhcmFtZXRlcnMuY29sb3JTcGFjZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgaW5uZXJGdW47XG4gICAgbGV0IGhhc2hlZFN0b3BzO1xuICAgIGxldCBjYXRlZ29yaWNhbEtleVR5cGU7XG4gICAgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICBpbm5lckZ1biA9IGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbjtcblxuICAgICAgICAvLyBGb3IgY2F0ZWdvcmljYWwgZnVuY3Rpb25zLCBnZW5lcmF0ZSBhbiBPYmplY3QgYXMgYSBoYXNobWFwIG9mIHRoZSBzdG9wcyBmb3IgZmFzdCBzZWFyY2hpbmdcbiAgICAgICAgaGFzaGVkU3RvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0b3Agb2YgcGFyYW1ldGVycy5zdG9wcykge1xuICAgICAgICAgICAgaGFzaGVkU3RvcHNbc3RvcFswXV0gPSBzdG9wWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5mZXIga2V5IHR5cGUgYmFzZWQgb24gZmlyc3Qgc3RvcCBrZXktLSB1c2VkIHRvIGVuY2ZvcmNlIHN0cmljdCB0eXBlIGNoZWNraW5nIGxhdGVyXG4gICAgICAgIGNhdGVnb3JpY2FsS2V5VHlwZSA9IHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJZGVudGl0eUZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdW5jdGlvbiB0eXBlIFwiJHt0eXBlfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKHpvb21BbmRGZWF0dXJlRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVGdW5jdGlvbnMgPSB7fTtcbiAgICAgICAgY29uc3Qgem9vbVN0b3BzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHBhcmFtZXRlcnMuc3RvcHNbc107XG4gICAgICAgICAgICBjb25zdCB6b29tID0gc3RvcFswXS56b29tO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHBhcmFtZXRlcnMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHBhcmFtZXRlcnMuZGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB6b29tU3RvcHMucHVzaCh6b29tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0uc3RvcHMucHVzaChbc3RvcFswXS52YWx1ZSwgc3RvcFsxXV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9uU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB6IG9mIHpvb21TdG9wcykge1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uU3RvcHMucHVzaChbZmVhdHVyZUZ1bmN0aW9uc1t6XS56b29tLCBjcmVhdGVGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25zW3pdLCBwcm9wZXJ0eVNwZWMpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHtuYW1lOiAnbGluZWFyJ307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlKHt6b29tfSwgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBzdG9wczogZmVhdHVyZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHByb3BlcnR5U3BlYywgem9vbSkuZXZhbHVhdGUoem9vbSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh6b29tRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25UeXBlID0gdHlwZSA9PT0gJ2V4cG9uZW50aWFsJyA/XG4gICAgICAgICAgICB7bmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogcGFyYW1ldGVycy5iYXNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmJhc2UgOiAxfSA6IG51bGw7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY2FtZXJhJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBwYXJhbWV0ZXJzLnN0b3BzLm1hcChzID0+IHNbMF0pLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICh7em9vbX0pID0+IGlubmVyRnVuKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgem9vbSwgaGFzaGVkU3RvcHMsIGNhdGVnb3JpY2FsS2V5VHlwZSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ3NvdXJjZScsXG4gICAgICAgICAgICBldmFsdWF0ZShfLCBmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmZWF0dXJlICYmIGZlYXR1cmUucHJvcGVydGllcyA/IGZlYXR1cmUucHJvcGVydGllc1twYXJhbWV0ZXJzLnByb3BlcnR5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29hbGVzY2UocGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lckZ1bihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHZhbHVlLCBoYXNoZWRTdG9wcywgY2F0ZWdvcmljYWxLZXlUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvYWxlc2NlKGEsIGIsIGMpIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYTtcbiAgICBpZiAoYiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYjtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQsIGhhc2hlZFN0b3BzLCBrZXlUeXBlKSB7XG4gICAgY29uc3QgZXZhbHVhdGVkID0gdHlwZW9mIGlucHV0ID09PSBrZXlUeXBlID8gaGFzaGVkU3RvcHNbaW5wdXRdIDogdW5kZWZpbmVkOyAvLyBFbmZvcmNlIHN0cmljdCB0eXBpbmcgb24gaW5wdXRcbiAgICByZXR1cm4gY29hbGVzY2UoZXZhbHVhdGVkLCBwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQpIHtcbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBpbnB1dCkge1xuICAgIGNvbnN0IGJhc2UgPSBwYXJhbWV0ZXJzLmJhc2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYmFzZSA6IDE7XG5cbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuICAgIGNvbnN0IHQgPSBpbnRlcnBvbGF0aW9uRmFjdG9yKFxuICAgICAgICBpbnB1dCwgYmFzZSxcbiAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMF0sXG4gICAgICAgIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXggKyAxXVswXSk7XG5cbiAgICBjb25zdCBvdXRwdXRMb3dlciA9IHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xuICAgIGNvbnN0IG91dHB1dFVwcGVyID0gcGFyYW1ldGVycy5zdG9wc1tpbmRleCArIDFdWzFdO1xuICAgIGxldCBpbnRlcnAgPSBpbnRlcnBvbGF0ZVtwcm9wZXJ0eVNwZWMudHlwZV0gfHwgaWRlbnRpdHlGdW5jdGlvbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG5cbiAgICBpZiAocGFyYW1ldGVycy5jb2xvclNwYWNlICYmIHBhcmFtZXRlcnMuY29sb3JTcGFjZSAhPT0gJ3JnYicpIHtcbiAgICAgICAgY29uc3QgY29sb3JzcGFjZSA9IGNvbG9yU3BhY2VzW3BhcmFtZXRlcnMuY29sb3JTcGFjZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBpbnRlcnAgPSAoYSwgYikgPT4gY29sb3JzcGFjZS5yZXZlcnNlKGNvbG9yc3BhY2UuaW50ZXJwb2xhdGUoY29sb3JzcGFjZS5mb3J3YXJkKGEpLCBjb2xvcnNwYWNlLmZvcndhcmQoYiksIHQpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG91dHB1dExvd2VyLmV2YWx1YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBldmFsdWF0ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkTG93ZXIgPSBvdXRwdXRMb3dlci5ldmFsdWF0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZFVwcGVyID0gb3V0cHV0VXBwZXIuZXZhbHVhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZpbGwtb3V0bGluZS1jb2xvciwgd2hpY2ggaGFzIG5vIHNwZWMgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICBpZiAoZXZhbHVhdGVkTG93ZXIgPT09IHVuZGVmaW5lZCB8fCBldmFsdWF0ZWRVcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAoZXZhbHVhdGVkTG93ZXIsIGV2YWx1YXRlZFVwcGVyLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJwKG91dHB1dExvd2VyLCBvdXRwdXRVcHBlciwgdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIGlucHV0ID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHlTcGVjLnR5cGUgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgIGlucHV0ID0gRm9ybWF0dGVkLmZyb21TdHJpbmcoaW5wdXQudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmIChnZXRUeXBlKGlucHV0KSAhPT0gcHJvcGVydHlTcGVjLnR5cGUgJiYgKHByb3BlcnR5U3BlYy50eXBlICE9PSAnZW51bScgfHwgIXByb3BlcnR5U3BlYy52YWx1ZXNbaW5wdXRdKSkge1xuICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNvYWxlc2NlKGlucHV0LCBwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmF0aW8gdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuIGV4cG9uZW50aWFsIGZ1bmN0aW9uXG4gKiBzdG9wcy5cbiAqXG4gKiBIb3cgaXQgd29ya3M6XG4gKiBUd28gY29uc2VjdXRpdmUgc3RvcCB2YWx1ZXMgZGVmaW5lIGEgKHNjYWxlZCBhbmQgc2hpZnRlZCkgZXhwb25lbnRpYWxcbiAqIGZ1bmN0aW9uIGBmKHgpID0gYSAqIGJhc2VeeCArIGJgLCB3aGVyZSBgYmFzZWAgaXMgdGhlIHVzZXItc3BlY2lmaWVkIGJhc2UsXG4gKiBhbmQgYGFgIGFuZCBgYmAgYXJlIGNvbnN0YW50cyBhZmZvcmRpbmcgc3VmZmljaWVudCBkZWdyZWVzIG9mIGZyZWVkb20gdG8gZml0XG4gKiB0aGUgZnVuY3Rpb24gdG8gdGhlIGdpdmVuIHN0b3BzLlxuICpcbiAqIEhlcmUncyBhIGJpdCBvZiBhbGdlYnJhIHRoYXQgbGV0cyB1cyBjb21wdXRlIGBmKHgpYCBkaXJlY3RseSBmcm9tIHRoZSBzdG9wXG4gKiB2YWx1ZXMgd2l0aG91dCBleHBsaWNpdGx5IHNvbHZpbmcgZm9yIGBhYCBhbmQgYGJgOlxuICpcbiAqIEZpcnN0IHN0b3AgdmFsdWU6IGBmKHgwKSA9IHkwID0gYSAqIGJhc2VeeDAgKyBiYFxuICogU2Vjb25kIHN0b3AgdmFsdWU6IGBmKHgxKSA9IHkxID0gYSAqIGJhc2VeeDEgKyBiYFxuICogPT4gYHkxIC0geTAgPSBhKGJhc2VeeDEgLSBiYXNlXngwKWBcbiAqID0+IGBhID0gKHkxIC0geTApLyhiYXNlXngxIC0gYmFzZV54MClgXG4gKlxuICogRGVzaXJlZCB2YWx1ZTogYGYoeCkgPSB5ID0gYSAqIGJhc2VeeCArIGJgXG4gKiA9PiBgZih4KSA9IHkwICsgYSAqIChiYXNlXnggLSBiYXNlXngwKWBcbiAqXG4gKiBGcm9tIHRoZSBhYm92ZSwgd2UgY2FuIHJlcGxhY2UgdGhlIGBhYCBpbiBgYSAqIChiYXNlXnggLSBiYXNlXngwKWAgYW5kIGRvIGFcbiAqIGxpdHRsZSBhbGdlYnJhOlxuICogYGBgXG4gKiBhICogKGJhc2VeeCAtIGJhc2VeeDApID0gKHkxIC0geTApLyhiYXNlXngxIC0gYmFzZV54MCkgKiAoYmFzZV54IC0gYmFzZV54MClcbiAqICAgICAgICAgICAgICAgICAgICAgPSAoeTEgLSB5MCkgKiAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSAtIGJhc2VeeDApXG4gKiBgYGBcbiAqXG4gKiBJZiB3ZSBsZXQgYChiYXNlXnggLSBiYXNlXngwKSAvIChiYXNlXngxIGJhc2VeeDApYCwgdGhlbiB3ZSBoYXZlXG4gKiBgZih4KSA9IHkwICsgKHkxIC0geTApICogcmF0aW9gLiAgSW4gb3RoZXIgd29yZHMsIGByYXRpb2AgbWF5IGJlIHRyZWF0ZWQgYXNcbiAqIGFuIGludGVycG9sYXRpb24gZmFjdG9yIGJldHdlZW4gdGhlIHR3byBzdG9wcycgb3V0cHV0IHZhbHVlcy5cbiAqXG4gKiAoTm90ZTogYSBzbGlnaHRseSBkaWZmZXJlbnQgZm9ybSBmb3IgYHJhdGlvYCxcbiAqIGAoYmFzZV4oeC14MCkgLSAxKSAvIChiYXNlXih4MS14MCkgLSAxKSBgLCBpcyBlcXVpdmFsZW50LCBidXQgcmVxdWlyZXMgZmV3ZXJcbiAqIGV4cGVuc2l2ZSBgTWF0aC5wb3coKWAgb3BlcmF0aW9ucy4pXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW50ZXJwb2xhdGlvbkZhY3RvcihpbnB1dCwgYmFzZSwgbG93ZXJWYWx1ZSwgdXBwZXJWYWx1ZSkge1xuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB1cHBlclZhbHVlIC0gbG93ZXJWYWx1ZTtcbiAgICBjb25zdCBwcm9ncmVzcyA9IGlucHV0IC0gbG93ZXJWYWx1ZTtcblxuICAgIGlmIChkaWZmZXJlbmNlID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoYmFzZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3MgLyBkaWZmZXJlbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5wb3coYmFzZSwgcHJvZ3Jlc3MpIC0gMSkgLyAoTWF0aC5wb3coYmFzZSwgZGlmZmVyZW5jZSkgLSAxKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCBleHRlbmQgZnJvbSAnLi4vdXRpbC9leHRlbmQnO1xuaW1wb3J0IFBhcnNpbmdFcnJvciBmcm9tICcuL3BhcnNpbmdfZXJyb3InO1xuaW1wb3J0IFBhcnNpbmdDb250ZXh0IGZyb20gJy4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4vY29tcG91bmRfZXhwcmVzc2lvbic7XG5pbXBvcnQgU3RlcCBmcm9tICcuL2RlZmluaXRpb25zL3N0ZXAnO1xuaW1wb3J0IEludGVycG9sYXRlIGZyb20gJy4vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUnO1xuaW1wb3J0IENvYWxlc2NlIGZyb20gJy4vZGVmaW5pdGlvbnMvY29hbGVzY2UnO1xuaW1wb3J0IExldCBmcm9tICcuL2RlZmluaXRpb25zL2xldCc7XG5pbXBvcnQgZGVmaW5pdGlvbnMgZnJvbSAnLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgKiBhcyBpc0NvbnN0YW50IGZyb20gJy4vaXNfY29uc3RhbnQnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuL3J1bnRpbWVfZXJyb3InO1xuaW1wb3J0IHsgc3VjY2VzcywgZXJyb3IgfSBmcm9tICcuLi91dGlsL3Jlc3VsdCc7XG5pbXBvcnQgeyBzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbiwgc3VwcG9ydHNab29tRXhwcmVzc2lvbiwgc3VwcG9ydHNJbnRlcnBvbGF0aW9uIH0gZnJvbSAnLi4vdXRpbC9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge1R5cGUsIEV2YWx1YXRpb25LaW5kfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMnO1xuaW1wb3J0IHR5cGUge1Jlc3VsdH0gZnJvbSAnLi4vdXRpbC9yZXN1bHQnO1xuaW1wb3J0IHR5cGUge0ludGVycG9sYXRpb25UeXBlfSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlJztcbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkJztcblxuZXhwb3J0IHR5cGUgRmVhdHVyZSA9IHtcbiAgICArdHlwZTogMSB8IDIgfCAzIHwgJ1Vua25vd24nIHwgJ1BvaW50JyB8ICdNdWx0aVBvaW50JyB8ICdMaW5lU3RyaW5nJyB8ICdNdWx0aUxpbmVTdHJpbmcnIHwgJ1BvbHlnb24nIHwgJ011bHRpUG9seWdvbicsXG4gICAgK2lkPzogYW55LFxuICAgICtwcm9wZXJ0aWVzOiB7W3N0cmluZ106IGFueX0sXG4gICAgK3BhdHRlcm5zPzoge1tzdHJpbmddOiB7XCJtaW5cIjogc3RyaW5nLCBcIm1pZFwiOiBzdHJpbmcsIFwibWF4XCI6IHN0cmluZ319XG59O1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlU3RhdGUgPSB7W3N0cmluZ106IGFueX07XG5cbmV4cG9ydCB0eXBlIEdsb2JhbFByb3BlcnRpZXMgPSAkUmVhZE9ubHk8e1xuICAgIHpvb206IG51bWJlcixcbiAgICBoZWF0bWFwRGVuc2l0eT86IG51bWJlcixcbiAgICBsaW5lUHJvZ3Jlc3M/OiBudW1iZXIsXG4gICAgaXNTdXBwb3J0ZWRTY3JpcHQ/OiAoc3RyaW5nKSA9PiBib29sZWFuLFxuICAgIGFjY3VtdWxhdGVkPzogVmFsdWVcbn0+O1xuXG5leHBvcnQgY2xhc3MgU3R5bGVFeHByZXNzaW9uIHtcbiAgICBleHByZXNzaW9uOiBFeHByZXNzaW9uO1xuXG4gICAgX2V2YWx1YXRvcjogRXZhbHVhdGlvbkNvbnRleHQ7XG4gICAgX2RlZmF1bHRWYWx1ZTogVmFsdWU7XG4gICAgX3dhcm5pbmdIaXN0b3J5OiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn07XG4gICAgX2VudW1WYWx1ZXM6ID97W3N0cmluZ106IGFueX07XG5cbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBFeHByZXNzaW9uLCBwcm9wZXJ0eVNwZWM6ID9TdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLl93YXJuaW5nSGlzdG9yeSA9IHt9O1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQoKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gcHJvcGVydHlTcGVjID8gZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5U3BlYykgOiBudWxsO1xuICAgICAgICB0aGlzLl9lbnVtVmFsdWVzID0gcHJvcGVydHlTcGVjICYmIHByb3BlcnR5U3BlYy50eXBlID09PSAnZW51bScgPyBwcm9wZXJ0eVNwZWMudmFsdWVzIDogbnVsbDtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlU3RhdGUgPSBmZWF0dXJlU3RhdGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gZm9ybWF0dGVkU2VjdGlvbjtcblxuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHRoaXMuX2V2YWx1YXRvcik7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pOiBhbnkge1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZ2xvYmFscyA9IGdsb2JhbHM7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlID0gZmVhdHVyZSB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZVN0YXRlID0gZmVhdHVyZVN0YXRlIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gZm9ybWF0dGVkU2VjdGlvbiB8fCBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2VudW1WYWx1ZXMgJiYgISh2YWwgaW4gdGhpcy5fZW51bVZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvbmUgb2YgJHtPYmplY3Qua2V5cyh0aGlzLl9lbnVtVmFsdWVzKS5tYXAodiA9PiBKU09OLnN0cmluZ2lmeSh2KSkuam9pbignLCAnKX0sIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KHZhbCl9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dhcm5pbmdIaXN0b3J5W2UubWVzc2FnZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93YXJuaW5nSGlzdG9yeVtlLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cHJlc3Npb24oZXhwcmVzc2lvbjogbWl4ZWQpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgdHlwZW9mIGV4cHJlc3Npb25bMF0gPT09ICdzdHJpbmcnICYmIGV4cHJlc3Npb25bMF0gaW4gZGVmaW5pdGlvbnM7XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHR5cGVjaGVjayB0aGUgZ2l2ZW4gc3R5bGUgc3BlYyBKU09OIGV4cHJlc3Npb24uICBJZlxuICogb3B0aW9ucy5kZWZhdWx0VmFsdWUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIHJlc3VsdGluZyBTdHlsZUV4cHJlc3Npb24nc1xuICogYGV2YWx1YXRlKClgIG1ldGhvZCB3aWxsIGhhbmRsZSBlcnJvcnMgYnkgbG9nZ2luZyBhIHdhcm5pbmcgKG9uY2UgcGVyXG4gKiBtZXNzYWdlKSBhbmQgcmV0dXJuaW5nIHRoZSBkZWZhdWx0IHZhbHVlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHRocm93XG4gKiBldmFsdWF0aW9uIGVycm9ycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhwcmVzc2lvbihleHByZXNzaW9uOiBtaXhlZCwgcHJvcGVydHlTcGVjOiA/U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBSZXN1bHQ8U3R5bGVFeHByZXNzaW9uLCBBcnJheTxQYXJzaW5nRXJyb3I+PiB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNpbmdDb250ZXh0KGRlZmluaXRpb25zLCBbXSwgcHJvcGVydHlTcGVjID8gZ2V0RXhwZWN0ZWRUeXBlKHByb3BlcnR5U3BlYykgOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gRm9yIHN0cmluZy12YWx1ZWQgcHJvcGVydGllcywgY29lcmNlIHRvIHN0cmluZyBhdCB0aGUgdG9wIGxldmVsIHJhdGhlciB0aGFuIGFzc2VydGluZy5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZXIucGFyc2UoZXhwcmVzc2lvbiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCxcbiAgICAgICAgcHJvcGVydHlTcGVjICYmIHByb3BlcnR5U3BlYy50eXBlID09PSAnc3RyaW5nJyA/IHt0eXBlQW5ub3RhdGlvbjogJ2NvZXJjZSd9IDogdW5kZWZpbmVkKTtcblxuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICAgIGFzc2VydChwYXJzZXIuZXJyb3JzLmxlbmd0aCA+IDApO1xuICAgICAgICByZXR1cm4gZXJyb3IocGFyc2VyLmVycm9ycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Y2Nlc3MobmV3IFN0eWxlRXhwcmVzc2lvbihwYXJzZWQsIHByb3BlcnR5U3BlYykpO1xufVxuXG5leHBvcnQgY2xhc3MgWm9vbUNvbnN0YW50RXhwcmVzc2lvbjxLaW5kOiBFdmFsdWF0aW9uS2luZD4ge1xuICAgIGtpbmQ6IEtpbmQ7XG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbjtcbiAgICBfc3R5bGVFeHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihraW5kOiBLaW5kLCBleHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy5fc3R5bGVFeHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5pc1N0YXRlRGVwZW5kZW50ID0ga2luZCAhPT0gKCdjb25zdGFudCc6IEV2YWx1YXRpb25LaW5kKSAmJiAhaXNDb25zdGFudC5pc1N0YXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgWm9vbURlcGVuZGVudEV4cHJlc3Npb248S2luZDogRXZhbHVhdGlvbktpbmQ+IHtcbiAgICBraW5kOiBLaW5kO1xuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPjtcbiAgICBpc1N0YXRlRGVwZW5kZW50OiBib29sZWFuO1xuXG4gICAgX3N0eWxlRXhwcmVzc2lvbjogU3R5bGVFeHByZXNzaW9uO1xuICAgIGludGVycG9sYXRpb25UeXBlOiA/SW50ZXJwb2xhdGlvblR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihraW5kOiBLaW5kLCBleHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb24sIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPiwgaW50ZXJwb2xhdGlvblR5cGU/OiBJbnRlcnBvbGF0aW9uVHlwZSkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgICAgICB0aGlzLnpvb21TdG9wcyA9IHpvb21TdG9wcztcbiAgICAgICAgdGhpcy5fc3R5bGVFeHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5pc1N0YXRlRGVwZW5kZW50ID0ga2luZCAhPT0gKCdjYW1lcmEnOiBFdmFsdWF0aW9uS2luZCkgJiYgIWlzQ29uc3RhbnQuaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdGlvblR5cGUgPSBpbnRlcnBvbGF0aW9uVHlwZTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGlvbkZhY3RvcihpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJwb2xhdGlvblR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0aW9uRmFjdG9yKHRoaXMuaW50ZXJwb2xhdGlvblR5cGUsIGlucHV0LCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIENvbnN0YW50RXhwcmVzc2lvbiA9IHtcbiAgICBraW5kOiAnY29uc3RhbnQnLFxuICAgICtldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlKSA9PiBhbnksXG59XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ3NvdXJjZScsXG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbixcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikgPT4gYW55LFxufTtcblxuZXhwb3J0IHR5cGUgQ2FtZXJhRXhwcmVzc2lvbiA9IHtcbiAgICBraW5kOiAnY2FtZXJhJyxcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlKSA9PiBhbnksXG4gICAgK2ludGVycG9sYXRpb25GYWN0b3I6IChpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+LFxuICAgIGludGVycG9sYXRpb25UeXBlOiA/SW50ZXJwb2xhdGlvblR5cGVcbn07XG5cbmV4cG9ydCB0eXBlIENvbXBvc2l0ZUV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ2NvbXBvc2l0ZScsXG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbixcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikgPT4gYW55LFxuICAgICtpbnRlcnBvbGF0aW9uRmFjdG9yOiAoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiA9XG4gICAgfCBDb25zdGFudEV4cHJlc3Npb25cbiAgICB8IFNvdXJjZUV4cHJlc3Npb25cbiAgICB8IENhbWVyYUV4cHJlc3Npb25cbiAgICB8IENvbXBvc2l0ZUV4cHJlc3Npb247XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24oZXhwcmVzc2lvbjogbWl4ZWQsIHByb3BlcnR5U3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBSZXN1bHQ8U3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24sIEFycmF5PFBhcnNpbmdFcnJvcj4+IHtcbiAgICBleHByZXNzaW9uID0gY3JlYXRlRXhwcmVzc2lvbihleHByZXNzaW9uLCBwcm9wZXJ0eVNwZWMpO1xuICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBleHByZXNzaW9uLnZhbHVlLmV4cHJlc3Npb247XG5cbiAgICBjb25zdCBpc0ZlYXR1cmVDb25zdGFudCA9IGlzQ29uc3RhbnQuaXNGZWF0dXJlQ29uc3RhbnQocGFyc2VkKTtcbiAgICBpZiAoIWlzRmVhdHVyZUNvbnN0YW50ICYmICFzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbihwcm9wZXJ0eVNwZWMpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ2RhdGEgZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZCcpXSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNab29tQ29uc3RhbnQgPSBpc0NvbnN0YW50LmlzR2xvYmFsUHJvcGVydHlDb25zdGFudChwYXJzZWQsIFsnem9vbSddKTtcbiAgICBpZiAoIWlzWm9vbUNvbnN0YW50ICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnem9vbSBleHByZXNzaW9ucyBub3Qgc3VwcG9ydGVkJyldKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b29tQ3VydmUgPSBmaW5kWm9vbUN1cnZlKHBhcnNlZCk7XG4gICAgaWYgKCF6b29tQ3VydmUgJiYgIWlzWm9vbUNvbnN0YW50KSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKV0pO1xuICAgIH0gZWxzZSBpZiAoem9vbUN1cnZlIGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbem9vbUN1cnZlXSk7XG4gICAgfSBlbHNlIGlmICh6b29tQ3VydmUgaW5zdGFuY2VvZiBJbnRlcnBvbGF0ZSAmJiAhc3VwcG9ydHNJbnRlcnBvbGF0aW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyBwcm9wZXJ0eScpXSk7XG4gICAgfVxuXG4gICAgaWYgKCF6b29tQ3VydmUpIHtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoaXNGZWF0dXJlQ29uc3RhbnQgP1xuICAgICAgICAgICAgKG5ldyBab29tQ29uc3RhbnRFeHByZXNzaW9uKCdjb25zdGFudCcsIGV4cHJlc3Npb24udmFsdWUpOiBDb25zdGFudEV4cHJlc3Npb24pIDpcbiAgICAgICAgICAgIChuZXcgWm9vbUNvbnN0YW50RXhwcmVzc2lvbignc291cmNlJywgZXhwcmVzc2lvbi52YWx1ZSk6IFNvdXJjZUV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHpvb21DdXJ2ZSBpbnN0YW5jZW9mIEludGVycG9sYXRlID8gem9vbUN1cnZlLmludGVycG9sYXRpb24gOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gc3VjY2Vzcyhpc0ZlYXR1cmVDb25zdGFudCA/XG4gICAgICAgIChuZXcgWm9vbURlcGVuZGVudEV4cHJlc3Npb24oJ2NhbWVyYScsIGV4cHJlc3Npb24udmFsdWUsIHpvb21DdXJ2ZS5sYWJlbHMsIGludGVycG9sYXRpb25UeXBlKTogQ2FtZXJhRXhwcmVzc2lvbikgOlxuICAgICAgICAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjb21wb3NpdGUnLCBleHByZXNzaW9uLnZhbHVlLCB6b29tQ3VydmUubGFiZWxzLCBpbnRlcnBvbGF0aW9uVHlwZSk6IENvbXBvc2l0ZUV4cHJlc3Npb24pKTtcbn1cblxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgY3JlYXRlRnVuY3Rpb24gfSBmcm9tICcuLi9mdW5jdGlvbic7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4vdmFsdWVzJztcblxuLy8gc2VyaWFsaXphdGlvbiB3cmFwcGVyIGZvciBvbGQtc3R5bGUgc3RvcCBmdW5jdGlvbnMgbm9ybWFsaXplZCB0byB0aGVcbi8vIGV4cHJlc3Npb24gaW50ZXJmYWNlXG5leHBvcnQgY2xhc3MgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+IHtcbiAgICBfcGFyYW1ldGVyczogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD47XG4gICAgX3NwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuXG4gICAga2luZDogRXZhbHVhdGlvbktpbmQ7XG4gICAgZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSkgPT4gYW55O1xuICAgIGludGVycG9sYXRpb25GYWN0b3I6ID8oaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIHpvb21TdG9wczogP0FycmF5PG51bWJlcj47XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiwgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIHRoaXMuX3NwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgICAgICBleHRlbmQodGhpcywgY3JlYXRlRnVuY3Rpb24odGhpcy5fcGFyYW1ldGVycywgdGhpcy5fc3BlY2lmaWNhdGlvbikpO1xuICAgIH1cblxuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShzZXJpYWxpemVkOiB7X3BhcmFtZXRlcnM6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBfc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259KSB7XG4gICAgICAgIHJldHVybiAoKG5ldyBTdHlsZVByb3BlcnR5RnVuY3Rpb24oc2VyaWFsaXplZC5fcGFyYW1ldGVycywgc2VyaWFsaXplZC5fc3BlY2lmaWNhdGlvbikpOiBTdHlsZVByb3BlcnR5RnVuY3Rpb248VD4pO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXJpYWxpemUoaW5wdXQ6IFN0eWxlUHJvcGVydHlGdW5jdGlvbjxUPikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX3BhcmFtZXRlcnM6IGlucHV0Ll9wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgX3NwZWNpZmljYXRpb246IGlucHV0Ll9zcGVjaWZpY2F0aW9uXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uPFQ+KHZhbHVlOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiwgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAobmV3IFN0eWxlUHJvcGVydHlGdW5jdGlvbih2YWx1ZSwgc3BlY2lmaWNhdGlvbik6IGFueSk7XG5cbiAgICB9IGVsc2UgaWYgKGlzRXhwcmVzc2lvbih2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGNyZWF0ZVByb3BlcnR5RXhwcmVzc2lvbih2YWx1ZSwgc3BlY2lmaWNhdGlvbik7XG4gICAgICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBpbiB2YWxpZGF0aW9uXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXhwcmVzc2lvbi52YWx1ZS5tYXAoZXJyID0+IGAke2Vyci5rZXl9OiAke2Vyci5tZXNzYWdlfWApLmpvaW4oJywgJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uLnZhbHVlO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGNvbnN0YW50OiBhbnkgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgc3BlY2lmaWNhdGlvbi50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICBjb25zdGFudCA9IENvbG9yLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ2NvbnN0YW50JyxcbiAgICAgICAgICAgIGV2YWx1YXRlOiAoKSA9PiBjb25zdGFudFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuLy8gWm9vbS1kZXBlbmRlbnQgZXhwcmVzc2lvbnMgbWF5IG9ubHkgdXNlIFtcInpvb21cIl0gYXMgdGhlIGlucHV0IHRvIGEgdG9wLWxldmVsIFwic3RlcFwiIG9yIFwiaW50ZXJwb2xhdGVcIlxuLy8gZXhwcmVzc2lvbiAoY29sbGVjdGl2ZWx5IHJlZmVycmVkIHRvIGFzIGEgXCJjdXJ2ZVwiKS4gVGhlIGN1cnZlIG1heSBiZSB3cmFwcGVkIGluIG9uZSBvciBtb3JlIFwibGV0XCIgb3Jcbi8vIFwiY29hbGVzY2VcIiBleHByZXNzaW9ucy5cbmZ1bmN0aW9uIGZpbmRab29tQ3VydmUoZXhwcmVzc2lvbjogRXhwcmVzc2lvbik6IFN0ZXAgfCBJbnRlcnBvbGF0ZSB8IFBhcnNpbmdFcnJvciB8IG51bGwge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTGV0KSB7XG4gICAgICAgIHJlc3VsdCA9IGZpbmRab29tQ3VydmUoZXhwcmVzc2lvbi5yZXN1bHQpO1xuXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQ29hbGVzY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgZXhwcmVzc2lvbi5hcmdzKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmaW5kWm9vbUN1cnZlKGFyZyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdGVwIHx8IGV4cHJlc3Npb24gaW5zdGFuY2VvZiBJbnRlcnBvbGF0ZSkgJiZcbiAgICAgICAgZXhwcmVzc2lvbi5pbnB1dCBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJlxuICAgICAgICBleHByZXNzaW9uLmlucHV0Lm5hbWUgPT09ICd6b29tJykge1xuXG4gICAgICAgIHJlc3VsdCA9IGV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGV4cHJlc3Npb24uZWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IGZpbmRab29tQ3VydmUoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGRSZXN1bHQgaW5zdGFuY2VvZiBQYXJzaW5nRXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNoaWxkUmVzdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKCFyZXN1bHQgJiYgY2hpbGRSZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQYXJzaW5nRXJyb3IoJycsICdcInpvb21cIiBleHByZXNzaW9uIG1heSBvbmx5IGJlIHVzZWQgYXMgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb24uJyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICYmIGNoaWxkUmVzdWx0ICYmIHJlc3VsdCAhPT0gY2hpbGRSZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQYXJzaW5nRXJyb3IoJycsICdPbmx5IG9uZSB6b29tLWJhc2VkIFwic3RlcFwiIG9yIFwiaW50ZXJwb2xhdGVcIiBzdWJleHByZXNzaW9uIG1heSBiZSB1c2VkIGluIGFuIGV4cHJlc3Npb24uJyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmltcG9ydCB7IENvbG9yVHlwZSwgU3RyaW5nVHlwZSwgTnVtYmVyVHlwZSwgQm9vbGVhblR5cGUsIFZhbHVlVHlwZSwgRm9ybWF0dGVkVHlwZSwgYXJyYXkgfSBmcm9tICcuL3R5cGVzJztcblxuZnVuY3Rpb24gZ2V0RXhwZWN0ZWRUeXBlKHNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogVHlwZSB7XG4gICAgY29uc3QgdHlwZXMgPSB7XG4gICAgICAgIGNvbG9yOiBDb2xvclR5cGUsXG4gICAgICAgIHN0cmluZzogU3RyaW5nVHlwZSxcbiAgICAgICAgbnVtYmVyOiBOdW1iZXJUeXBlLFxuICAgICAgICBlbnVtOiBTdHJpbmdUeXBlLFxuICAgICAgICBib29sZWFuOiBCb29sZWFuVHlwZSxcbiAgICAgICAgZm9ybWF0dGVkOiBGb3JtYXR0ZWRUeXBlXG4gICAgfTtcblxuICAgIGlmIChzcGVjLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5KHR5cGVzW3NwZWMudmFsdWVdIHx8IFZhbHVlVHlwZSwgc3BlYy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlc1tzcGVjLnR5cGVdO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBWYWx1ZSB7XG4gICAgaWYgKHNwZWMudHlwZSA9PT0gJ2NvbG9yJyAmJiBpc0Z1bmN0aW9uKHNwZWMuZGVmYXVsdCkpIHtcbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBoZWF0bWFwLWNvbG9yOiBpdCB1c2VzIHRoZSAnZGVmYXVsdDonIHRvIGRlZmluZSBhXG4gICAgICAgIC8vIGRlZmF1bHQgY29sb3IgcmFtcCwgYnV0IGNyZWF0ZUV4cHJlc3Npb24gZXhwZWN0cyBhIHNpbXBsZSB2YWx1ZSB0byBmYWxsXG4gICAgICAgIC8vIGJhY2sgdG8gaW4gY2FzZSBvZiBydW50aW1lIGVycm9yc1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xuICAgIH0gZWxzZSBpZiAoc3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIHJldHVybiBDb2xvci5wYXJzZShzcGVjLmRlZmF1bHQpIHx8IG51bGw7XG4gICAgfSBlbHNlIGlmIChzcGVjLmRlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3BlYy5kZWZhdWx0O1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0IHZhbGlkYXRlU3BlYyBmcm9tICcuL3ZhbGlkYXRlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVPYmplY3Qob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IG9iamVjdCA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgZWxlbWVudFNwZWNzID0gb3B0aW9ucy52YWx1ZVNwZWMgfHwge307XG4gICAgY29uc3QgZWxlbWVudFZhbGlkYXRvcnMgPSBvcHRpb25zLm9iamVjdEVsZW1lbnRWYWxpZGF0b3JzIHx8IHt9O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZShvYmplY3QpO1xuICAgIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3QsIGBvYmplY3QgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvYmplY3RLZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRTcGVjS2V5ID0gb2JqZWN0S2V5LnNwbGl0KCcuJylbMF07IC8vIHRyZWF0ICdwYWludC4qJyBhcyAncGFpbnQnXG4gICAgICAgIGNvbnN0IGVsZW1lbnRTcGVjID0gZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XSB8fCBlbGVtZW50U3BlY3NbJyonXTtcblxuICAgICAgICBsZXQgdmFsaWRhdGVFbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSBlbGVtZW50VmFsaWRhdG9yc1tlbGVtZW50U3BlY0tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gdmFsaWRhdGVTcGVjO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRWYWxpZGF0b3JzWycqJ10pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IGVsZW1lbnRWYWxpZGF0b3JzWycqJ107XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNwZWNzWycqJ10pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IHZhbGlkYXRlU3BlYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3Rbb2JqZWN0S2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke29iamVjdEtleX1cImApKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVsZW1lbnQoe1xuICAgICAgICAgICAga2V5OiAoa2V5ID8gYCR7a2V5fS5gIDoga2V5KSArIG9iamVjdEtleSxcbiAgICAgICAgICAgIHZhbHVlOiBvYmplY3Rbb2JqZWN0S2V5XSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZWxlbWVudFNwZWMsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICAgIG9iamVjdEtleVxuICAgICAgICB9LCBvYmplY3QpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRTcGVjS2V5IGluIGVsZW1lbnRTcGVjcykge1xuICAgICAgICAvLyBEb24ndCBjaGVjayBgcmVxdWlyZWRgIHdoZW4gdGhlcmUncyBhIGN1c3RvbSB2YWxpZGF0b3IgZm9yIHRoYXQgcHJvcGVydHkuXG4gICAgICAgIGlmIChlbGVtZW50VmFsaWRhdG9yc1tlbGVtZW50U3BlY0tleV0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV0ucmVxdWlyZWQgJiYgZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XVsnZGVmYXVsdCddID09PSB1bmRlZmluZWQgJiYgb2JqZWN0W2VsZW1lbnRTcGVjS2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgb2JqZWN0LCBgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcIiR7ZWxlbWVudFNwZWNLZXl9XCJgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQXJyYXkob3B0aW9ucykge1xuICAgIGNvbnN0IGFycmF5ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBhcnJheVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsaWRhdGVBcnJheUVsZW1lbnQgPSBvcHRpb25zLmFycmF5RWxlbWVudFZhbGlkYXRvciB8fCB2YWxpZGF0ZTtcblxuICAgIGlmIChnZXRUeXBlKGFycmF5KSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBhcnJheSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUoYXJyYXkpfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjLmxlbmd0aCAmJiBhcnJheS5sZW5ndGggIT09IGFycmF5U3BlYy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBsZW5ndGggJHthcnJheVNwZWMubGVuZ3RofSBleHBlY3RlZCwgbGVuZ3RoICR7YXJyYXkubGVuZ3RofSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10gJiYgYXJyYXkubGVuZ3RoIDwgYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10pIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBsZW5ndGggYXQgbGVhc3QgJHthcnJheVNwZWNbJ21pbi1sZW5ndGgnXX0gZXhwZWN0ZWQsIGxlbmd0aCAke2FycmF5Lmxlbmd0aH0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgbGV0IGFycmF5RWxlbWVudFNwZWMgPSB7XG4gICAgICAgIFwidHlwZVwiOiBhcnJheVNwZWMudmFsdWUsXG4gICAgICAgIFwidmFsdWVzXCI6IGFycmF5U3BlYy52YWx1ZXNcbiAgICB9O1xuXG4gICAgaWYgKHN0eWxlU3BlYy4kdmVyc2lvbiA8IDcpIHtcbiAgICAgICAgYXJyYXlFbGVtZW50U3BlYy5mdW5jdGlvbiA9IGFycmF5U3BlYy5mdW5jdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoZ2V0VHlwZShhcnJheVNwZWMudmFsdWUpID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhcnJheUVsZW1lbnRTcGVjID0gYXJyYXlTcGVjLnZhbHVlO1xuICAgIH1cblxuICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVBcnJheUVsZW1lbnQoe1xuICAgICAgICAgICAgYXJyYXksXG4gICAgICAgICAgICBhcnJheUluZGV4OiBpLFxuICAgICAgICAgICAgdmFsdWU6IGFycmF5W2ldLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBhcnJheUVsZW1lbnRTcGVjLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBrZXk6IGAke2tleX1bJHtpfV1gXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU51bWJlcihvcHRpb25zKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYG51bWJlciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoJ21pbmltdW0nIGluIHZhbHVlU3BlYyAmJiB2YWx1ZSA8IHZhbHVlU3BlYy5taW5pbXVtKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgJHt2YWx1ZX0gaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlICR7dmFsdWVTcGVjLm1pbmltdW19YCldO1xuICAgIH1cblxuICAgIGlmICgnbWF4aW11bScgaW4gdmFsdWVTcGVjICYmIHZhbHVlID4gdmFsdWVTcGVjLm1heGltdW0pIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGAke3ZhbHVlfSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJHt2YWx1ZVNwZWMubWF4aW11bX1gKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZSc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QnO1xuaW1wb3J0IHZhbGlkYXRlQXJyYXkgZnJvbSAnLi92YWxpZGF0ZV9hcnJheSc7XG5pbXBvcnQgdmFsaWRhdGVOdW1iZXIgZnJvbSAnLi92YWxpZGF0ZV9udW1iZXInO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgeyB1bmJ1bmRsZSwgZGVlcFVuYnVuZGxlIH0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQge1xuICAgIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sXG4gICAgc3VwcG9ydHNJbnRlcnBvbGF0aW9uXG59IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZS50eXBlKTtcbiAgICBsZXQgc3RvcEtleVR5cGU7XG4gICAgbGV0IHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICBsZXQgcHJldmlvdXNTdG9wRG9tYWluVmFsdWU7XG4gICAgbGV0IHByZXZpb3VzU3RvcERvbWFpblpvb207XG5cbiAgICBjb25zdCBpc1pvb21GdW5jdGlvbiA9IGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNQcm9wZXJ0eUZ1bmN0aW9uID0gIWlzWm9vbUZ1bmN0aW9uO1xuICAgIGNvbnN0IGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24gPVxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHMpID09PSAnYXJyYXknICYmXG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wc1swXSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdWzBdKSA9PT0gJ29iamVjdCc7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLmZ1bmN0aW9uLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgIHN0b3BzOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICBkZWZhdWx0OiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnaWRlbnRpdHknICYmIGlzWm9vbUZ1bmN0aW9uKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlICE9PSAnaWRlbnRpdHknICYmICFvcHRpb25zLnZhbHVlLnN0b3BzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnZXhwb25lbnRpYWwnICYmIG9wdGlvbnMudmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihvcHRpb25zLnZhbHVlU3BlYykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2V4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4KSB7XG4gICAgICAgIGlmIChpc1Byb3BlcnR5RnVuY3Rpb24gJiYgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzWm9vbUZ1bmN0aW9uICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3pvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZ1bmN0aW9uVHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyB8fCBpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3BzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2lkZW50aXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnaWRlbnRpdHkgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGEgXCJzdG9wc1wiIHByb3BlcnR5JyldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5KHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy52YWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICBhcnJheUVsZW1lbnRWYWxpZGF0b3I6IHZhbGlkYXRlRnVuY3Rpb25TdG9wXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdhcnJheScgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCB2YWx1ZSwgJ2FycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3Aob3B0aW9ucykge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgbGVuZ3RoIDIgZXhwZWN0ZWQsIGxlbmd0aCAke3ZhbHVlLmxlbmd0aH0gZm91bmRgKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKGdldFR5cGUodmFsdWVbMF0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgb2JqZWN0IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWVbMF0pfSBmb3VuZGApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS56b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ29iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgem9vbScpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHZhbHVlJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RvcERvbWFpblpvb20gJiYgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA+IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWVbMF0uem9vbSwgJ3N0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pICE9PSBwcmV2aW91c1N0b3BEb21haW5ab29tKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA9IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogeyB6b29tOiB7fSB9LFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHsgem9vbTogdmFsaWRhdGVOdW1iZXIsIHZhbHVlOiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZSB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlU3RvcERvbWFpblZhbHVlKHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke2tleX1bMF1gLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVswXSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHt9LFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgIH0sIHZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFeHByZXNzaW9uKGRlZXBVbmJ1bmRsZSh2YWx1ZVsxXSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3JzLmNvbmNhdChbbmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WzFdYCwgdmFsdWVbMV0sICdleHByZXNzaW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gc3RvcHMuJyldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgIGtleTogYCR7a2V5fVsxXWAsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVbMV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZShvcHRpb25zLCBzdG9wKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKG9wdGlvbnMudmFsdWUpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHVuYnVuZGxlKG9wdGlvbnMudmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IHJlcG9ydFZhbHVlID0gb3B0aW9ucy52YWx1ZSAhPT0gbnVsbCA/IG9wdGlvbnMudmFsdWUgOiBzdG9wO1xuXG4gICAgICAgIGlmICghc3RvcEtleVR5cGUpIHtcbiAgICAgICAgICAgIHN0b3BLZXlUeXBlID0gdHlwZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSBzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYCR7dHlwZX0gc3RvcCBkb21haW4gdHlwZSBtdXN0IG1hdGNoIHByZXZpb3VzIHN0b3AgZG9tYWluIHR5cGUgJHtzdG9wS2V5VHlwZX1gKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSAhPT0gJ251bWJlcicgJiYgdHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCAnc3RvcCBkb21haW4gdmFsdWUgbXVzdCBiZSBhIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuJyldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgIT09ICdudW1iZXInICYmIGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgbnVtYmVyIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYDtcbiAgICAgICAgICAgIGlmIChzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbihmdW5jdGlvblZhbHVlU3BlYykgJiYgZnVuY3Rpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICdcXG5JZiB5b3UgaW50ZW5kZWQgdG8gdXNlIGEgY2F0ZWdvcmljYWwgZnVuY3Rpb24sIHNwZWNpZnkgYFwidHlwZVwiOiBcImNhdGVnb3JpY2FsXCJgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCBtZXNzYWdlKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnY2F0ZWdvcmljYWwnICYmIHR5cGUgPT09ICdudW1iZXInICYmICghaXNGaW5pdGUodmFsdWUpIHx8IE1hdGguZmxvb3IodmFsdWUpICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsIGBpbnRlZ2VyIGV4cGVjdGVkLCBmb3VuZCAke3ZhbHVlfWApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgIT09ICdjYXRlZ29yaWNhbCcgJiYgdHlwZSA9PT0gJ251bWJlcicgJiYgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IHByZXZpb3VzU3RvcERvbWFpblZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCAnc3RvcCBkb21haW4gdmFsdWVzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlcicpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnY2F0ZWdvcmljYWwnICYmIHZhbHVlIGluIHN0b3BEb21haW5WYWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUnKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdG9wRG9tYWluVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkRlZmF1bHQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBmdW5jdGlvblZhbHVlU3BlYyxcbiAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5pbXBvcnQgeyBjcmVhdGVFeHByZXNzaW9uLCBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB7IGRlZXBVbmJ1bmRsZSB9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQnO1xuaW1wb3J0IHsgaXNTdGF0ZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50IH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pc19jb25zdGFudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zOiBhbnkpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgPyBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24gOiBjcmVhdGVFeHByZXNzaW9uKShkZWVwVW5idW5kbGUob3B0aW9ucy52YWx1ZSksIG9wdGlvbnMudmFsdWVTcGVjKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWUubWFwKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7b3B0aW9ucy5rZXl9JHtlcnJvci5rZXl9YCwgb3B0aW9ucy52YWx1ZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb25PYmogPSAoZXhwcmVzc2lvbi52YWx1ZTogYW55KS5leHByZXNzaW9uIHx8IChleHByZXNzaW9uLnZhbHVlOiBhbnkpLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbjtcblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAncHJvcGVydHknICYmIChvcHRpb25zLnByb3BlcnR5S2V5ID09PSAndGV4dC1mb250JykgJiZcbiAgICAgICAgZXhwcmVzc2lvbk9iai5wb3NzaWJsZU91dHB1dHMoKS5pbmRleE9mKHVuZGVmaW5lZCkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgYEludmFsaWQgZGF0YSBleHByZXNzaW9uIGZvciBcIiR7b3B0aW9ucy5wcm9wZXJ0eUtleX1cIi4gT3V0cHV0IHZhbHVlcyBtdXN0IGJlIGNvbnRhaW5lZCBhcyBsaXRlcmFscyB3aXRoaW4gdGhlIGV4cHJlc3Npb24uYCldO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAncHJvcGVydHknICYmIG9wdGlvbnMucHJvcGVydHlUeXBlID09PSAnbGF5b3V0JyAmJlxuICAgICAgICAoIWlzU3RhdGVDb25zdGFudChleHByZXNzaW9uT2JqKSkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnXCJmZWF0dXJlLXN0YXRlXCIgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGxheW91dCBwcm9wZXJ0aWVzLicpXTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ2ZpbHRlcicgJiYgIWlzU3RhdGVDb25zdGFudChleHByZXNzaW9uT2JqKSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdcImZlYXR1cmUtc3RhdGVcIiBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggZmlsdGVycy4nKV07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgJiYgb3B0aW9ucy5leHByZXNzaW9uQ29udGV4dC5pbmRleE9mKCdjbHVzdGVyJykgPT09IDApIHtcbiAgICAgICAgaWYgKCFpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoZXhwcmVzc2lvbk9iaiwgWyd6b29tJywgJ2ZlYXR1cmUtc3RhdGUnXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wiem9vbVwiIGFuZCBcImZlYXR1cmUtc3RhdGVcIiBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGNsdXN0ZXIgcHJvcGVydGllcy4nKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdjbHVzdGVyLWluaXRpYWwnICYmICFpc0ZlYXR1cmVDb25zdGFudChleHByZXNzaW9uT2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnRmVhdHVyZSBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggaW5pdGlhbCBleHByZXNzaW9uIHBhcnQgb2YgY2x1c3RlciBwcm9wZXJ0aWVzLicpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUJvb2xlYW4ob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYm9vbGVhbiBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCB7IHBhcnNlQ1NTQ29sb3IgfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VDU1NDb2xvcih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgXCIke3ZhbHVlfVwiIGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCB7IHVuYnVuZGxlIH0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRW51bShvcHRpb25zKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVTcGVjLnZhbHVlcykpIHsgLy8gPD12N1xuICAgICAgICBpZiAodmFsdWVTcGVjLnZhbHVlcy5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBleHBlY3RlZCBvbmUgb2YgWyR7dmFsdWVTcGVjLnZhbHVlcy5qb2luKCcsICcpfV0sICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7IC8vID49djhcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlU3BlYy52YWx1ZXMpLmluZGV4T2YodW5idW5kbGUodmFsdWUpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGV4cGVjdGVkIG9uZSBvZiBbJHtPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5qb2luKCcsICcpfV0sICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgY3JlYXRlRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuXG5pbXBvcnQgdHlwZSB7R2xvYmFsUHJvcGVydGllc30gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5leHBvcnQgdHlwZSBGZWF0dXJlRmlsdGVyID0gKGdsb2JhbFByb3BlcnRpZXM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlKSA9PiBib29sZWFuO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGaWx0ZXI7XG5leHBvcnQgeyBpc0V4cHJlc3Npb25GaWx0ZXIgfTtcblxuZnVuY3Rpb24gaXNFeHByZXNzaW9uRmlsdGVyKGZpbHRlcjogYW55KSB7XG4gICAgaWYgKGZpbHRlciA9PT0gdHJ1ZSB8fCBmaWx0ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIpIHx8IGZpbHRlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGZpbHRlclswXSkge1xuICAgIGNhc2UgJ2hhcyc6XG4gICAgICAgIHJldHVybiBmaWx0ZXIubGVuZ3RoID49IDIgJiYgZmlsdGVyWzFdICE9PSAnJGlkJyAmJiBmaWx0ZXJbMV0gIT09ICckdHlwZSc7XG5cbiAgICBjYXNlICdpbic6XG4gICAgY2FzZSAnIWluJzpcbiAgICBjYXNlICchaGFzJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgY2FzZSAnPCc6XG4gICAgY2FzZSAnPD0nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCAhPT0gMyB8fCAoQXJyYXkuaXNBcnJheShmaWx0ZXJbMV0pIHx8IEFycmF5LmlzQXJyYXkoZmlsdGVyWzJdKSk7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGYpICYmIHR5cGVvZiBmICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmNvbnN0IGZpbHRlclNwZWMgPSB7XG4gICAgJ3R5cGUnOiAnYm9vbGVhbicsXG4gICAgJ2RlZmF1bHQnOiBmYWxzZSxcbiAgICAndHJhbnNpdGlvbic6IGZhbHNlLFxuICAgICdwcm9wZXJ0eS10eXBlJzogJ2RhdGEtZHJpdmVuJyxcbiAgICAnZXhwcmVzc2lvbic6IHtcbiAgICAgICAgJ2ludGVycG9sYXRlZCc6IGZhbHNlLFxuICAgICAgICAncGFyYW1ldGVycyc6IFsnem9vbScsICdmZWF0dXJlJ11cbiAgICB9XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXI6IGFueSk6IEZlYXR1cmVGaWx0ZXIge1xuICAgIGlmIChmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0V4cHJlc3Npb25GaWx0ZXIoZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBjb252ZXJ0RmlsdGVyKGZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsZWQgPSBjcmVhdGVFeHByZXNzaW9uKGZpbHRlciwgZmlsdGVyU3BlYyk7XG4gICAgaWYgKGNvbXBpbGVkLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29tcGlsZWQudmFsdWUubWFwKGVyciA9PiBgJHtlcnIua2V5fTogJHtlcnIubWVzc2FnZX1gKS5qb2luKCcsICcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFByb3BlcnRpZXM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlKSA9PiBjb21waWxlZC52YWx1ZS5ldmFsdWF0ZShnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlKTtcbiAgICB9XG59XG5cbi8vIENvbXBhcmlzb24gZnVuY3Rpb24gdG8gc29ydCBudW1iZXJzIGFuZCBzdHJpbmdzXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWx0ZXIoZmlsdGVyOiA/QXJyYXk8YW55Pik6IG1peGVkIHtcbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgb3AgPSBmaWx0ZXJbMF07XG4gICAgaWYgKGZpbHRlci5sZW5ndGggPD0gMSkgcmV0dXJuIChvcCAhPT0gJ2FueScpO1xuICAgIGNvbnN0IGNvbnZlcnRlZCA9XG4gICAgICAgIG9wID09PSAnPT0nID8gY29udmVydENvbXBhcmlzb25PcChmaWx0ZXJbMV0sIGZpbHRlclsyXSwgJz09JykgOlxuICAgICAgICBvcCA9PT0gJyE9JyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnPT0nKSkgOlxuICAgICAgICBvcCA9PT0gJzwnIHx8XG4gICAgICAgIG9wID09PSAnPicgfHxcbiAgICAgICAgb3AgPT09ICc8PScgfHxcbiAgICAgICAgb3AgPT09ICc+PScgPyBjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCBvcCkgOlxuICAgICAgICBvcCA9PT0gJ2FueScgPyBjb252ZXJ0RGlzanVuY3Rpb25PcChmaWx0ZXIuc2xpY2UoMSkpIDpcbiAgICAgICAgb3AgPT09ICdhbGwnID8gWydhbGwnXS5jb25jYXQoZmlsdGVyLnNsaWNlKDEpLm1hcChjb252ZXJ0RmlsdGVyKSkgOlxuICAgICAgICBvcCA9PT0gJ25vbmUnID8gWydhbGwnXS5jb25jYXQoZmlsdGVyLnNsaWNlKDEpLm1hcChjb252ZXJ0RmlsdGVyKS5tYXAoY29udmVydE5lZ2F0aW9uKSkgOlxuICAgICAgICBvcCA9PT0gJ2luJyA/IGNvbnZlcnRJbk9wKGZpbHRlclsxXSwgZmlsdGVyLnNsaWNlKDIpKSA6XG4gICAgICAgIG9wID09PSAnIWluJyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0SW5PcChmaWx0ZXJbMV0sIGZpbHRlci5zbGljZSgyKSkpIDpcbiAgICAgICAgb3AgPT09ICdoYXMnID8gY29udmVydEhhc09wKGZpbHRlclsxXSkgOlxuICAgICAgICBvcCA9PT0gJyFoYXMnID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRIYXNPcChmaWx0ZXJbMV0pKSA6XG4gICAgICAgIHRydWU7XG4gICAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuZnVuY3Rpb24gY29udmVydENvbXBhcmlzb25PcChwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcDogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJyR0eXBlJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLXR5cGUtJHtvcH1gLCB2YWx1ZV07XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWlkLSR7b3B9YCwgdmFsdWVdO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci0ke29wfWAsIHByb3BlcnR5LCB2YWx1ZV07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0RGlzanVuY3Rpb25PcChmaWx0ZXJzOiBBcnJheTxBcnJheTxhbnk+Pikge1xuICAgIHJldHVybiBbJ2FueSddLmNvbmNhdChmaWx0ZXJzLm1hcChjb252ZXJ0RmlsdGVyKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRJbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogQXJyYXk8YW55Pikge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICckdHlwZSc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci10eXBlLWluYCwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWlkLWluYCwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAyMDAgJiYgIXZhbHVlcy5zb21lKHYgPT4gdHlwZW9mIHYgIT09IHR5cGVvZiB2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gWydmaWx0ZXItaW4tbGFyZ2UnLCBwcm9wZXJ0eSwgWydsaXRlcmFsJywgdmFsdWVzLnNvcnQoY29tcGFyZSldXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2ZpbHRlci1pbi1zbWFsbCcsIHByb3BlcnR5LCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydEhhc09wKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnJHR5cGUnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaGFzLWlkYF07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWhhc2AsIHByb3BlcnR5XTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnROZWdhdGlvbihmaWx0ZXI6IG1peGVkKSB7XG4gICAgcmV0dXJuIFsnIScsIGZpbHRlcl07XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5pbXBvcnQgdmFsaWRhdGVFbnVtIGZyb20gJy4vdmFsaWRhdGVfZW51bSc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCB7IHVuYnVuZGxlLCBkZWVwVW5idW5kbGUgfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCBleHRlbmQgZnJvbSAnLi4vdXRpbC9leHRlbmQnO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uRmlsdGVyIH0gZnJvbSAnLi4vZmVhdHVyZV9maWx0ZXInO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUZpbHRlcihvcHRpb25zKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbkZpbHRlcihkZWVwVW5idW5kbGUob3B0aW9ucy52YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUV4cHJlc3Npb24oZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2ZpbHRlcicsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHsgdmFsdWU6ICdib29sZWFuJyB9XG4gICAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKG9wdGlvbnMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgIT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBhcnJheSBleHBlY3RlZCwgJHtnZXRUeXBlKHZhbHVlKX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgbGV0IHR5cGU7XG5cbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ2ZpbHRlciBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3QgMSBlbGVtZW50JyldO1xuICAgIH1cblxuICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbnVtKHtcbiAgICAgICAga2V5OiBgJHtrZXl9WzBdYCxcbiAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5maWx0ZXJfb3BlcmF0b3IsXG4gICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgfSkpO1xuXG4gICAgc3dpdGNoICh1bmJ1bmRsZSh2YWx1ZVswXSkpIHtcbiAgICBjYXNlICc8JzpcbiAgICBjYXNlICc8PSc6XG4gICAgY2FzZSAnPic6XG4gICAgY2FzZSAnPj0nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiYgdW5idW5kbGUodmFsdWVbMV0pID09PSAnJHR5cGUnKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBcIiR0eXBlXCIgY2Fubm90IGJlIHVzZSB3aXRoIG9wZXJhdG9yIFwiJHt2YWx1ZVswXX1cImApKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBvcGVyYXRvciBcIiR7dmFsdWVbMF19XCIgbXVzdCBoYXZlIDMgZWxlbWVudHNgKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgJ2luJzpcbiAgICBjYXNlICchaW4nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlW2ldKTtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZSh2YWx1ZVsxXSkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlRW51bSh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuZ2VvbWV0cnlfdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdudW1iZXInICYmIHR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVske2l9XWAsIHZhbHVlW2ldLCBgc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4gZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke2tleX1bJHtpfV1gLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdoYXMnOlxuICAgIGNhc2UgJyFoYXMnOlxuICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVsxXSk7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGZpbHRlciBhcnJheSBmb3IgXCIke3ZhbHVlWzBdfVwiIG9wZXJhdG9yIG11c3QgaGF2ZSAyIGVsZW1lbnRzYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgYHN0cmluZyBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi9mdW5jdGlvbic7XG5pbXBvcnQgeyB1bmJ1bmRsZSwgZGVlcFVuYnVuZGxlIH0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQgeyBzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbiB9IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkob3B0aW9ucywgcHJvcGVydHlUeXBlKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBwcm9wZXJ0eUtleSA9IG9wdGlvbnMub2JqZWN0S2V5O1xuICAgIGNvbnN0IGxheWVyU3BlYyA9IHN0eWxlU3BlY1tgJHtwcm9wZXJ0eVR5cGV9XyR7b3B0aW9ucy5sYXllclR5cGV9YF07XG5cbiAgICBpZiAoIWxheWVyU3BlYykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgdHJhbnNpdGlvbk1hdGNoID0gcHJvcGVydHlLZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG4gICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ3BhaW50JyAmJiB0cmFuc2l0aW9uTWF0Y2ggJiYgbGF5ZXJTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0gJiYgbGF5ZXJTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0udHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy50cmFuc2l0aW9uLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWMgfHwgbGF5ZXJTcGVjW3Byb3BlcnR5S2V5XTtcbiAgICBpZiAoIXZhbHVlU3BlYykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYHVua25vd24gcHJvcGVydHkgXCIke3Byb3BlcnR5S2V5fVwiYCldO1xuICAgIH1cblxuICAgIGxldCB0b2tlbk1hdGNoO1xuICAgIGlmIChnZXRUeXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYgc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWVTcGVjKSAmJiAhdmFsdWVTcGVjLnRva2VucyAmJiAodG9rZW5NYXRjaCA9IC9eeyhbXn1dKyl9JC8uZXhlYyh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGtleSwgdmFsdWUsXG4gICAgICAgICAgICBgXCIke3Byb3BlcnR5S2V5fVwiIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJwb2xhdGlvbiBzeW50YXhcXG5gICtcbiAgICAgICAgICAgICAgICBgVXNlIGFuIGlkZW50aXR5IHByb3BlcnR5IGZ1bmN0aW9uIGluc3RlYWQ6IFxcYHsgXCJ0eXBlXCI6IFwiaWRlbnRpdHlcIiwgXCJwcm9wZXJ0eVwiOiAke0pTT04uc3RyaW5naWZ5KHRva2VuTWF0Y2hbMV0pfSB9XFxgLmApXTtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChvcHRpb25zLmxheWVyVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5S2V5ID09PSAndGV4dC1maWVsZCcgJiYgc3R5bGUgJiYgIXN0eWxlLmdseXBocykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAndXNlIG9mIFwidGV4dC1maWVsZFwiIHJlcXVpcmVzIGEgc3R5bGUgXCJnbHlwaHNcIiBwcm9wZXJ0eScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXkgPT09ICd0ZXh0LWZvbnQnICYmIGlzRnVuY3Rpb24oZGVlcFVuYnVuZGxlKHZhbHVlKSkgJiYgdW5idW5kbGUodmFsdWUudHlwZSkgPT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1widGV4dC1mb250XCIgZG9lcyBub3Qgc3VwcG9ydCBpZGVudGl0eSBmdW5jdGlvbnMnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWMsXG4gICAgICAgIHN0eWxlLFxuICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAncHJvcGVydHknLFxuICAgICAgICBwcm9wZXJ0eVR5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgfSkpO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGVQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX3Byb3BlcnR5JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVQYWludFByb3BlcnR5KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eShvcHRpb25zLCAncGFpbnQnKTtcbn1cbiIsIlxuaW1wb3J0IHZhbGlkYXRlUHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wcm9wZXJ0eSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5b3V0UHJvcGVydHkob3B0aW9ucykge1xuICAgIHJldHVybiB2YWxpZGF0ZVByb3BlcnR5KG9wdGlvbnMsICdsYXlvdXQnKTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCB7IHVuYnVuZGxlIH0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QnO1xuaW1wb3J0IHZhbGlkYXRlRmlsdGVyIGZyb20gJy4vdmFsaWRhdGVfZmlsdGVyJztcbmltcG9ydCB2YWxpZGF0ZVBhaW50UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wYWludF9wcm9wZXJ0eSc7XG5pbXBvcnQgdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eSc7XG5pbXBvcnQgdmFsaWRhdGVTcGVjIGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IGV4dGVuZCBmcm9tICcuLi91dGlsL2V4dGVuZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5ZXIob3B0aW9ucykge1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IGxheWVyID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG5cbiAgICBpZiAoIWxheWVyLnR5cGUgJiYgIWxheWVyLnJlZikge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsICdlaXRoZXIgXCJ0eXBlXCIgb3IgXCJyZWZcIiBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG4gICAgbGV0IHR5cGUgPSB1bmJ1bmRsZShsYXllci50eXBlKTtcbiAgICBjb25zdCByZWYgPSB1bmJ1bmRsZShsYXllci5yZWYpO1xuXG4gICAgaWYgKGxheWVyLmlkKSB7XG4gICAgICAgIGNvbnN0IGxheWVySWQgPSB1bmJ1bmRsZShsYXllci5pZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcnJheUluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG90aGVyTGF5ZXIgPSBzdHlsZS5sYXllcnNbaV07XG4gICAgICAgICAgICBpZiAodW5idW5kbGUob3RoZXJMYXllci5pZCkgPT09IGxheWVySWQpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuaWQsIGBkdXBsaWNhdGUgbGF5ZXIgaWQgXCIke2xheWVyLmlkfVwiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAke290aGVyTGF5ZXIuaWQuX19saW5lX199YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdyZWYnIGluIGxheWVyKSB7XG4gICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ2ZpbHRlcicsICdsYXlvdXQnXS5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBpZiAocCBpbiBsYXllcikge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllcltwXSwgYFwiJHtwfVwiIGlzIHByb2hpYml0ZWQgZm9yIHJlZiBsYXllcnNgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwYXJlbnQ7XG5cbiAgICAgICAgc3R5bGUubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodW5idW5kbGUobGF5ZXIuaWQpID09PSByZWYpIHBhcmVudCA9IGxheWVyO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnJlZiwgYHJlZiBsYXllciBcIiR7cmVmfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQucmVmKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIucmVmLCAncmVmIGNhbm5vdCByZWZlcmVuY2UgYW5vdGhlciByZWYgbGF5ZXInKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gdW5idW5kbGUocGFyZW50LnR5cGUpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgICAgaWYgKCFsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcIicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHN0eWxlLnNvdXJjZXMgJiYgc3R5bGUuc291cmNlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHNvdXJjZSAmJiB1bmJ1bmRsZShzb3VyY2UudHlwZSk7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsIGBzb3VyY2UgXCIke2xheWVyLnNvdXJjZX1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmIHR5cGUgPT09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYGxheWVyIFwiJHtsYXllci5pZH1cIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2VgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICdyYXN0ZXInICYmIHR5cGUgIT09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYGxheWVyIFwiJHtsYXllci5pZH1cIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2VgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFsYXllclsnc291cmNlLWxheWVyJ10pIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgbXVzdCBzcGVjaWZ5IGEgXCJzb3VyY2UtbGF5ZXJcImApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3Jhc3Rlci1kZW0nICYmIHR5cGUgIT09ICdoaWxsc2hhZGUnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgJ3Jhc3Rlci1kZW0gc291cmNlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBsYXllciB0eXBlIFxcJ2hpbGxzaGFkZVxcJy4nKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdsaW5lJyAmJiBsYXllci5wYWludCAmJiBsYXllci5wYWludFsnbGluZS1ncmFkaWVudCddICYmXG4gICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2VUeXBlICE9PSAnZ2VvanNvbicgfHwgIXNvdXJjZS5saW5lTWV0cmljcykpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgc3BlY2lmaWVzIGEgbGluZS1ncmFkaWVudCwgd2hpY2ggcmVxdWlyZXMgYSBHZW9KU09OIHNvdXJjZSB3aXRoIFxcYGxpbmVNZXRyaWNzXFxgIGVuYWJsZWQuYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IGxheWVyLFxuICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5sYXllcixcbiAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAnKicoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZW5mb3JjZSB0aGUgc3BlYydzIGBcInJlcXVpcmVzXCI6IHRydWVgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcmVmcztcbiAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVxdWlyZW1lbnQgaXMgdmFsaWRhdGVkIGFib3ZlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU3NzIuXG4gICAgICAgICAgICB0eXBlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVNwZWMoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke2tleX0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBsYXllci50eXBlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5sYXllci50eXBlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0S2V5OiAndHlwZSdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWx0ZXI6IHZhbGlkYXRlRmlsdGVyLFxuICAgICAgICAgICAgbGF5b3V0KG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJyonKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eShleHRlbmQoe2xheWVyVHlwZTogdHlwZX0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhaW50KG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJyonKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVQYWludFByb3BlcnR5KGV4dGVuZCh7bGF5ZXJUeXBlOiB0eXBlfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IHsgdW5idW5kbGUgfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCB2YWxpZGF0ZU9iamVjdCBmcm9tICcuL3ZhbGlkYXRlX29iamVjdCc7XG5pbXBvcnQgdmFsaWRhdGVFbnVtIGZyb20gJy4vdmFsaWRhdGVfZW51bSc7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlU291cmNlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgaWYgKCF2YWx1ZS50eXBlKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJ0eXBlXCIgaXMgcmVxdWlyZWQnKV07XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHVuYnVuZGxlKHZhbHVlLnR5cGUpO1xuICAgIGxldCBlcnJvcnM7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd2ZWN0b3InOlxuICAgIGNhc2UgJ3Jhc3Rlcic6XG4gICAgY2FzZSAncmFzdGVyLWRlbSc6XG4gICAgICAgIGVycm9ycyA9IHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWNbYHNvdXJjZV8ke3R5cGUucmVwbGFjZSgnLScsICdfJyl9YF0sXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcblxuICAgIGNhc2UgJ2dlb2pzb24nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9nZW9qc29uLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh2YWx1ZS5jbHVzdGVyKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gdmFsdWUuY2x1c3RlclByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3BlcmF0b3IsIG1hcEV4cHJdID0gdmFsdWUuY2x1c3RlclByb3BlcnRpZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVkdWNlRXhwciA9IHR5cGVvZiBvcGVyYXRvciA9PT0gJ3N0cmluZycgPyBbb3BlcmF0b3IsIFsnYWNjdW11bGF0ZWQnXSwgWydnZXQnLCBwcm9wXV0gOiBvcGVyYXRvcjtcblxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS4ke3Byb3B9Lm1hcGAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXBFeHByLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2NsdXN0ZXItbWFwJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZUV4cHJlc3Npb24oe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke2tleX0uJHtwcm9wfS5yZWR1Y2VgLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVkdWNlRXhwcixcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6ICdjbHVzdGVyLXJlZHVjZSdcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ycztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX3ZpZGVvLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG5cbiAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9pbWFnZSxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuXG4gICAgY2FzZSAnY2FudmFzJzpcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbnVsbCwgYFBsZWFzZSB1c2UgcnVudGltZSBBUElzIHRvIGFkZCBjYW52YXMgc291cmNlcywgcmF0aGVyIHRoYW4gaW5jbHVkaW5nIHRoZW0gaW4gc3R5bGVzaGVldHMuYCwgJ3NvdXJjZS5jYW52YXMnKV07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsaWRhdGVFbnVtKHtcbiAgICAgICAgICAgIGtleTogYCR7a2V5fS50eXBlYCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiB7dmFsdWVzOiBbJ3ZlY3RvcicsICdyYXN0ZXInLCAncmFzdGVyLWRlbScsICdnZW9qc29uJywgJ3ZpZGVvJywgJ2ltYWdlJ119LFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGlnaHQob3B0aW9ucykge1xuICAgIGNvbnN0IGxpZ2h0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBsaWdodFNwZWMgPSBzdHlsZVNwZWMubGlnaHQ7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdFR5cGUgPSBnZXRUeXBlKGxpZ2h0KTtcbiAgICBpZiAobGlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2xpZ2h0JywgbGlnaHQsIGBvYmplY3QgZXhwZWN0ZWQsICR7cm9vdFR5cGV9IGZvdW5kYCldKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsaWdodCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxpZ2h0W2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWdodFNwZWNba2V5XSkge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBsaWdodFtrZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogbGlnaHRTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGlnaHRba2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdHlwZSA9IGdldFR5cGUodmFsdWUpO1xuXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdHRlZChvcHRpb25zOiBhbnkpIHtcbiAgICBpZiAodmFsaWRhdGVTdHJpbmcob3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xufVxuIiwiXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kJztcbmltcG9ydCB7IHVuYnVuZGxlLCBkZWVwVW5idW5kbGUgfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL2Z1bmN0aW9uJztcblxuaW1wb3J0IHZhbGlkYXRlRnVuY3Rpb24gZnJvbSAnLi92YWxpZGF0ZV9mdW5jdGlvbic7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QnO1xuaW1wb3J0IHZhbGlkYXRlQXJyYXkgZnJvbSAnLi92YWxpZGF0ZV9hcnJheSc7XG5pbXBvcnQgdmFsaWRhdGVCb29sZWFuIGZyb20gJy4vdmFsaWRhdGVfYm9vbGVhbic7XG5pbXBvcnQgdmFsaWRhdGVOdW1iZXIgZnJvbSAnLi92YWxpZGF0ZV9udW1iZXInO1xuaW1wb3J0IHZhbGlkYXRlQ29sb3IgZnJvbSAnLi92YWxpZGF0ZV9jb2xvcic7XG5pbXBvcnQgdmFsaWRhdGVDb25zdGFudHMgZnJvbSAnLi92YWxpZGF0ZV9jb25zdGFudHMnO1xuaW1wb3J0IHZhbGlkYXRlRW51bSBmcm9tICcuL3ZhbGlkYXRlX2VudW0nO1xuaW1wb3J0IHZhbGlkYXRlRmlsdGVyIGZyb20gJy4vdmFsaWRhdGVfZmlsdGVyJztcbmltcG9ydCB2YWxpZGF0ZUxheWVyIGZyb20gJy4vdmFsaWRhdGVfbGF5ZXInO1xuaW1wb3J0IHZhbGlkYXRlU291cmNlIGZyb20gJy4vdmFsaWRhdGVfc291cmNlJztcbmltcG9ydCB2YWxpZGF0ZUxpZ2h0IGZyb20gJy4vdmFsaWRhdGVfbGlnaHQnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nJztcbmltcG9ydCB2YWxpZGF0ZUZvcm1hdHRlZCBmcm9tICcuL3ZhbGlkYXRlX2Zvcm1hdHRlZCc7XG5cbmNvbnN0IFZBTElEQVRPUlMgPSB7XG4gICAgJyonKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICAnYXJyYXknOiB2YWxpZGF0ZUFycmF5LFxuICAgICdib29sZWFuJzogdmFsaWRhdGVCb29sZWFuLFxuICAgICdudW1iZXInOiB2YWxpZGF0ZU51bWJlcixcbiAgICAnY29sb3InOiB2YWxpZGF0ZUNvbG9yLFxuICAgICdjb25zdGFudHMnOiB2YWxpZGF0ZUNvbnN0YW50cyxcbiAgICAnZW51bSc6IHZhbGlkYXRlRW51bSxcbiAgICAnZmlsdGVyJzogdmFsaWRhdGVGaWx0ZXIsXG4gICAgJ2Z1bmN0aW9uJzogdmFsaWRhdGVGdW5jdGlvbixcbiAgICAnbGF5ZXInOiB2YWxpZGF0ZUxheWVyLFxuICAgICdvYmplY3QnOiB2YWxpZGF0ZU9iamVjdCxcbiAgICAnc291cmNlJzogdmFsaWRhdGVTb3VyY2UsXG4gICAgJ2xpZ2h0JzogdmFsaWRhdGVMaWdodCxcbiAgICAnc3RyaW5nJzogdmFsaWRhdGVTdHJpbmcsXG4gICAgJ2Zvcm1hdHRlZCc6IHZhbGlkYXRlRm9ybWF0dGVkXG59O1xuXG4vLyBNYWluIHJlY3Vyc2l2ZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBUcmFja3M6XG4vL1xuLy8gLSBrZXk6IHN0cmluZyByZXByZXNlbnRpbmcgbG9jYXRpb24gb2YgdmFsaWRhdGlvbiBpbiBzdHlsZSB0cmVlLiBVc2VkIG9ubHlcbi8vICAgZm9yIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IgcmVwb3J0aW5nLlxuLy8gLSB2YWx1ZTogY3VycmVudCB2YWx1ZSBmcm9tIHN0eWxlIGJlaW5nIGV2YWx1YXRlZC4gTWF5IGJlIGFueXRoaW5nIGZyb20gYVxuLy8gICBoaWdoIGxldmVsIG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGRlc2NlbmRlZCBpbnRvIGRlZXBlciBvciBhIHNpbXBsZVxuLy8gICBzY2FsYXIgdmFsdWUuXG4vLyAtIHZhbHVlU3BlYzogY3VycmVudCBzcGVjIGJlaW5nIGV2YWx1YXRlZC4gVHJhY2tzIHZhbHVlLlxuLy8gLSBzdHlsZVNwZWM6IGN1cnJlbnQgZnVsbCBzcGVjIGJlaW5nIGV2YWx1YXRlZC5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGUob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICh2YWx1ZVNwZWMuZXhwcmVzc2lvbiAmJiBpc0Z1bmN0aW9uKHVuYnVuZGxlKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2UgaWYgKHZhbHVlU3BlYy5leHByZXNzaW9uICYmIGlzRXhwcmVzc2lvbihkZWVwVW5idW5kbGUodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIGlmICh2YWx1ZVNwZWMudHlwZSAmJiBWQUxJREFUT1JTW3ZhbHVlU3BlYy50eXBlXSkge1xuICAgICAgICByZXR1cm4gVkFMSURBVE9SU1t2YWx1ZVNwZWMudHlwZV0ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlT2JqZWN0KGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgdmFsdWVTcGVjOiB2YWx1ZVNwZWMudHlwZSA/IHN0eWxlU3BlY1t2YWx1ZVNwZWMudHlwZV0gOiB2YWx1ZVNwZWNcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoKSByZXR1cm4gZXJyb3JzO1xuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJ3tmb250c3RhY2t9JykgPT09IC0xKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie2ZvbnRzdGFja31cIiB0b2tlbicpKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuaW5kZXhPZigne3JhbmdlfScpID09PSAtMSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntyYW5nZX1cIiB0b2tlbicpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGVDb25zdGFudHMgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGUnO1xuaW1wb3J0IGxhdGVzdFN0eWxlU3BlYyBmcm9tICcuL3JlZmVyZW5jZS9sYXRlc3QnO1xuaW1wb3J0IHZhbGlkYXRlR2x5cGhzVVJMIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybCc7XG5cbmltcG9ydCB2YWxpZGF0ZVNvdXJjZSBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZSc7XG5pbXBvcnQgdmFsaWRhdGVMaWdodCBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0JztcbmltcG9ydCB2YWxpZGF0ZUxheWVyIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5ZXInO1xuaW1wb3J0IHZhbGlkYXRlRmlsdGVyIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfZmlsdGVyJztcbmltcG9ydCB2YWxpZGF0ZVBhaW50UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9wYWludF9wcm9wZXJ0eSc7XG5pbXBvcnQgdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eSc7XG5cbi8qKlxuICogVmFsaWRhdGUgYSBNYXBib3ggR0wgc3R5bGUgYWdhaW5zdCB0aGUgc3R5bGUgc3BlY2lmaWNhdGlvbi4gVGhpcyBlbnRyeXBvaW50LFxuICogYG1hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZV9zdHlsZS5taW5gLCBpcyBkZXNpZ25lZCB0byBwcm9kdWNlIGFzXG4gKiBzbWFsbCBhIGJyb3dzZXJpZnkgYnVuZGxlIGFzIHBvc3NpYmxlIGJ5IG9taXR0aW5nIHVubmVjZXNzYXJ5IGZ1bmN0aW9uYWxpdHlcbiAqIGFuZCBsZWdhY3kgc3R5bGUgc3BlY2lmaWNhdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSBUaGUgc3R5bGUgdG8gYmUgdmFsaWRhdGVkLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdHlsZVNwZWNdIFRoZSBzdHlsZSBzcGVjaWZpY2F0aW9uIHRvIHZhbGlkYXRlIGFnYWluc3QuXG4gKiAgICAgSWYgb21pdHRlZCwgdGhlIGxhdGVzdCBzdHlsZSBzcGVjIGlzIHVzZWQuXG4gKiBAcmV0dXJucyB7QXJyYXk8VmFsaWRhdGlvbkVycm9yPn1cbiAqIEBleGFtcGxlXG4gKiAgIHZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZV9zdHlsZS5taW4nKTtcbiAqICAgdmFyIGVycm9ycyA9IHZhbGlkYXRlKHN0eWxlKTtcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHlsZU1pbihzdHlsZSwgc3R5bGVTcGVjKSB7XG4gICAgc3R5bGVTcGVjID0gc3R5bGVTcGVjIHx8IGxhdGVzdFN0eWxlU3BlYztcblxuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICBrZXk6ICcnLFxuICAgICAgICB2YWx1ZTogc3R5bGUsXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLiRyb290LFxuICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgIHN0eWxlLFxuICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgZ2x5cGhzOiB2YWxpZGF0ZUdseXBoc1VSTCxcbiAgICAgICAgICAgICcqJygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSk7XG5cbiAgICBpZiAoc3R5bGUuY29uc3RhbnRzKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVDb25zdGFudHMoe1xuICAgICAgICAgICAga2V5OiAnY29uc3RhbnRzJyxcbiAgICAgICAgICAgIHZhbHVlOiBzdHlsZS5jb25zdGFudHMsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRFcnJvcnMoZXJyb3JzKTtcbn1cblxudmFsaWRhdGVTdHlsZU1pbi5zb3VyY2UgPSB3cmFwQ2xlYW5FcnJvcnModmFsaWRhdGVTb3VyY2UpO1xudmFsaWRhdGVTdHlsZU1pbi5saWdodCA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUxpZ2h0KTtcbnZhbGlkYXRlU3R5bGVNaW4ubGF5ZXIgPSB3cmFwQ2xlYW5FcnJvcnModmFsaWRhdGVMYXllcik7XG52YWxpZGF0ZVN0eWxlTWluLmZpbHRlciA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUZpbHRlcik7XG52YWxpZGF0ZVN0eWxlTWluLnBhaW50UHJvcGVydHkgPSB3cmFwQ2xlYW5FcnJvcnModmFsaWRhdGVQYWludFByb3BlcnR5KTtcbnZhbGlkYXRlU3R5bGVNaW4ubGF5b3V0UHJvcGVydHkgPSB3cmFwQ2xlYW5FcnJvcnModmFsaWRhdGVMYXlvdXRQcm9wZXJ0eSk7XG5cbmZ1bmN0aW9uIHNvcnRFcnJvcnMoZXJyb3JzKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChlcnJvcnMpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIGEubGluZSAtIGIubGluZTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gd3JhcENsZWFuRXJyb3JzKGlubmVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHNvcnRFcnJvcnMoaW5uZXIuYXBwbHkodGhpcywgYXJncykpO1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlU3R5bGVNaW47XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHZhbGlkYXRlU3R5bGVNaW4gZnJvbSAnLi4vc3R5bGUtc3BlYy92YWxpZGF0ZV9zdHlsZS5taW4nO1xuaW1wb3J0IHsgRXJyb3JFdmVudCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5cbmltcG9ydCB0eXBlIHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuXG50eXBlIFZhbGlkYXRpb25FcnJvciA9IHtcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgbGluZTogbnVtYmVyLFxuICAgIGlkZW50aWZpZXI/OiBzdHJpbmdcbn07XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvciA9IChPYmplY3QpID0+ICRSZWFkT25seUFycmF5PFZhbGlkYXRpb25FcnJvcj47XG5cbnR5cGUgVmFsaWRhdGVTdHlsZSA9IHtcbiAgICAoT2JqZWN0LCA/T2JqZWN0KTogJFJlYWRPbmx5QXJyYXk8VmFsaWRhdGlvbkVycm9yPixcbiAgICBzb3VyY2U6IFZhbGlkYXRvcixcbiAgICBsYXllcjogVmFsaWRhdG9yLFxuICAgIGxpZ2h0OiBWYWxpZGF0b3IsXG4gICAgZmlsdGVyOiBWYWxpZGF0b3IsXG4gICAgcGFpbnRQcm9wZXJ0eTogVmFsaWRhdG9yLFxuICAgIGxheW91dFByb3BlcnR5OiBWYWxpZGF0b3Jcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN0eWxlID0gKHZhbGlkYXRlU3R5bGVNaW46IFZhbGlkYXRlU3R5bGUpO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVTb3VyY2UgPSB2YWxpZGF0ZVN0eWxlLnNvdXJjZTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxpZ2h0ID0gdmFsaWRhdGVTdHlsZS5saWdodDtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUZpbHRlciA9IHZhbGlkYXRlU3R5bGUuZmlsdGVyO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSA9IHZhbGlkYXRlU3R5bGUucGFpbnRQcm9wZXJ0eTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxheW91dFByb3BlcnR5ID0gdmFsaWRhdGVTdHlsZS5sYXlvdXRQcm9wZXJ0eTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVtaXRWYWxpZGF0aW9uRXJyb3JzKGVtaXR0ZXI6IEV2ZW50ZWQsIGVycm9yczogPyRSZWFkT25seUFycmF5PHttZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI/OiBzdHJpbmd9Pik6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgIGVtaXR0ZXIuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSkpKTtcbiAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc0Vycm9ycztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBHcmlkSW5kZXg7XG5cbnZhciBOVU1fUEFSQU1TID0gMztcblxuZnVuY3Rpb24gR3JpZEluZGV4KGV4dGVudCwgbiwgcGFkZGluZykge1xuICAgIHZhciBjZWxscyA9IHRoaXMuY2VsbHMgPSBbXTtcblxuICAgIGlmIChleHRlbnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gZXh0ZW50O1xuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgSW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgZXh0ZW50ID0gYXJyYXlbMF07XG4gICAgICAgIG4gPSBhcnJheVsxXTtcbiAgICAgICAgcGFkZGluZyA9IGFycmF5WzJdO1xuXG4gICAgICAgIHRoaXMuZCA9IG4gKyAyICogcGFkZGluZztcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmQgKiB0aGlzLmQ7IGsrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGtdO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGFycmF5W05VTV9QQVJBTVMgKyBrICsgMV07XG4gICAgICAgICAgICBjZWxscy5wdXNoKHN0YXJ0ID09PSBlbmQgP1xuICAgICAgICAgICAgICAgICAgICBudWxsIDpcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3ViYXJyYXkoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXlzT2Zmc2V0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aF07XG4gICAgICAgIHZhciBiYm94ZXNPZmZzZXQgPSBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV07XG4gICAgICAgIHRoaXMua2V5cyA9IGFycmF5LnN1YmFycmF5KGtleXNPZmZzZXQsIGJib3hlc09mZnNldCk7XG4gICAgICAgIHRoaXMuYmJveGVzID0gYXJyYXkuc3ViYXJyYXkoYmJveGVzT2Zmc2V0KTtcblxuICAgICAgICB0aGlzLmluc2VydCA9IHRoaXMuX2luc2VydFJlYWRvbmx5O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kID0gbiArIDIgKiBwYWRkaW5nO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZCAqIHRoaXMuZDsgaSsrKSB7XG4gICAgICAgICAgICBjZWxscy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7XG4gICAgdGhpcy5zY2FsZSA9IG4gLyBleHRlbnQ7XG4gICAgdGhpcy51aWQgPSAwO1xuXG4gICAgdmFyIHAgPSAocGFkZGluZyAvIG4pICogZXh0ZW50O1xuICAgIHRoaXMubWluID0gLXA7XG4gICAgdGhpcy5tYXggPSBleHRlbnQgKyBwO1xufVxuXG5cbkdyaWRJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24oa2V5LCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9pbnNlcnRDZWxsLCB0aGlzLnVpZCsrKTtcbiAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTIpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHkgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyAnQ2Fubm90IGluc2VydCBpbnRvIGEgR3JpZEluZGV4IGNyZWF0ZWQgZnJvbSBhbiBBcnJheUJ1ZmZlci4nO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHVpZCkge1xuICAgIHRoaXMuY2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgIGlmICh4MSA8PSBtaW4gJiYgeTEgPD0gbWluICYmIG1heCA8PSB4MiAmJiBtYXggPD0geTIgJiYgIWludGVyc2VjdGlvblRlc3QpIHtcbiAgICAgICAgLy8gV2UgdXNlIGBBcnJheSNzbGljZWAgYmVjYXVzZSBgdGhpcy5rZXlzYCBtYXkgYmUgYSBgSW50MzJBcnJheWAgYW5kXG4gICAgICAgIC8vIHNvbWUgYnJvd3NlcnMgKFNhZmFyaSBhbmQgSUUpIGRvIG5vdCBzdXBwb3J0IGBUeXBlZEFycmF5I3NsaWNlYFxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UeXBlZEFycmF5L3NsaWNlI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdmFyIHNlZW5VaWRzID0ge307XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGwsIHJlc3VsdCwgc2VlblVpZHMsIGludGVyc2VjdGlvblRlc3QpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX3F1ZXJ5Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHJlc3VsdCwgc2VlblVpZHMsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbY2VsbEluZGV4XTtcbiAgICBpZiAoY2VsbCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIga2V5cyA9IHRoaXMua2V5cztcbiAgICAgICAgdmFyIGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IGNlbGwubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciB1aWQgPSBjZWxsW3VdO1xuICAgICAgICAgICAgaWYgKHNlZW5VaWRzW3VpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSB1aWQgKiA0O1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25UZXN0ID9cbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uVGVzdChiYm94ZXNbb2Zmc2V0ICsgMF0sIGJib3hlc1tvZmZzZXQgKyAxXSwgYmJveGVzW29mZnNldCArIDJdLCBiYm94ZXNbb2Zmc2V0ICsgM10pIDpcbiAgICAgICAgICAgICAgICAgICAgKCh4MSA8PSBiYm94ZXNbb2Zmc2V0ICsgMl0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MSA8PSBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICh4MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMF0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMV0pKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5c1t1aWRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fZm9yRWFjaENlbGwgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgZm4sIGFyZzEsIGFyZzIsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgY3gxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgxKTtcbiAgICB2YXIgY3kxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkxKTtcbiAgICB2YXIgY3gyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgyKTtcbiAgICB2YXIgY3kyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkyKTtcbiAgICBmb3IgKHZhciB4ID0gY3gxOyB4IDw9IGN4MjsgeCsrKSB7XG4gICAgICAgIGZvciAodmFyIHkgPSBjeTE7IHkgPD0gY3kyOyB5KyspIHtcbiAgICAgICAgICAgIHZhciBjZWxsSW5kZXggPSB0aGlzLmQgKiB5ICsgeDtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25UZXN0ICYmICFpbnRlcnNlY3Rpb25UZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoeCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZCh5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHggKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHkgKyAxKSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpcywgeDEsIHkxLCB4MiwgeTIsIGNlbGxJbmRleCwgYXJnMSwgYXJnMiwgaW50ZXJzZWN0aW9uVGVzdCkpIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2NvbnZlcnRGcm9tQ2VsbENvb3JkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMucGFkZGluZykgLyB0aGlzLnNjYWxlO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fY29udmVydFRvQ2VsbENvb3JkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmQgLSAxLCBNYXRoLmZsb29yKHggKiB0aGlzLnNjYWxlKSArIHRoaXMucGFkZGluZykpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuYXJyYXlCdWZmZXIpIHJldHVybiB0aGlzLmFycmF5QnVmZmVyO1xuXG4gICAgdmFyIGNlbGxzID0gdGhpcy5jZWxscztcblxuICAgIHZhciBtZXRhZGF0YUxlbmd0aCA9IE5VTV9QQVJBTVMgKyB0aGlzLmNlbGxzLmxlbmd0aCArIDEgKyAxO1xuICAgIHZhciB0b3RhbENlbGxMZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbENlbGxMZW5ndGggKz0gdGhpcy5jZWxsc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5ID0gbmV3IEludDMyQXJyYXkobWV0YWRhdGFMZW5ndGggKyB0b3RhbENlbGxMZW5ndGggKyB0aGlzLmtleXMubGVuZ3RoICsgdGhpcy5iYm94ZXMubGVuZ3RoKTtcbiAgICBhcnJheVswXSA9IHRoaXMuZXh0ZW50O1xuICAgIGFycmF5WzFdID0gdGhpcy5uO1xuICAgIGFycmF5WzJdID0gdGhpcy5wYWRkaW5nO1xuXG4gICAgdmFyIG9mZnNldCA9IG1ldGFkYXRhTGVuZ3RoO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgY2VsbHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGNlbGwgPSBjZWxsc1trXTtcbiAgICAgICAgYXJyYXlbTlVNX1BBUkFNUyArIGtdID0gb2Zmc2V0O1xuICAgICAgICBhcnJheS5zZXQoY2VsbCwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IGNlbGwubGVuZ3RoO1xuICAgIH1cblxuICAgIGFycmF5W05VTV9QQVJBTVMgKyBjZWxscy5sZW5ndGhdID0gb2Zmc2V0O1xuICAgIGFycmF5LnNldCh0aGlzLmtleXMsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHRoaXMua2V5cy5sZW5ndGg7XG5cbiAgICBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV0gPSBvZmZzZXQ7XG4gICAgYXJyYXkuc2V0KHRoaXMuYmJveGVzLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmJib3hlcy5sZW5ndGg7XG5cbiAgICByZXR1cm4gYXJyYXkuYnVmZmVyO1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IEdyaWQgZnJvbSAnZ3JpZC1pbmRleCc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcbmltcG9ydCB7IFN0eWxlUHJvcGVydHlGdW5jdGlvbiwgU3R5bGVFeHByZXNzaW9uLCBab29tRGVwZW5kZW50RXhwcmVzc2lvbiwgWm9vbUNvbnN0YW50RXhwcmVzc2lvbiB9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uJztcbmltcG9ydCBleHByZXNzaW9ucyBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdyc7XG5jb25zdCB7IEltYWdlRGF0YSB9ID0gd2luZG93O1xuXG5pbXBvcnQgdHlwZSB7VHJhbnNmZXJhYmxlfSBmcm9tICcuLi90eXBlcy90cmFuc2ZlcmFibGUnO1xuXG50eXBlIFNlcmlhbGl6ZWRPYmplY3QgPSB7IFtzdHJpbmddOiBTZXJpYWxpemVkIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWQgPVxuICAgIHwgbnVsbFxuICAgIHwgdm9pZFxuICAgIHwgYm9vbGVhblxuICAgIHwgbnVtYmVyXG4gICAgfCBzdHJpbmdcbiAgICB8IEJvb2xlYW5cbiAgICB8IE51bWJlclxuICAgIHwgU3RyaW5nXG4gICAgfCBEYXRlXG4gICAgfCBSZWdFeHBcbiAgICB8IEFycmF5QnVmZmVyXG4gICAgfCAkQXJyYXlCdWZmZXJWaWV3XG4gICAgfCBJbWFnZURhdGFcbiAgICB8IEFycmF5PFNlcmlhbGl6ZWQ+XG4gICAgfCBTZXJpYWxpemVkT2JqZWN0O1xuXG50eXBlIFJlZ2lzdHJ5ID0ge1xuICAgIFtzdHJpbmddOiB7XG4gICAgICAgIGtsYXNzOiBDbGFzczxhbnk+LFxuICAgICAgICBvbWl0OiAkUmVhZE9ubHlBcnJheTxzdHJpbmc+LFxuICAgICAgICBzaGFsbG93OiAkUmVhZE9ubHlBcnJheTxzdHJpbmc+XG4gICAgfVxufTtcblxudHlwZSBSZWdpc3Rlck9wdGlvbnM8VD4gPSB7XG4gICAgb21pdD86ICRSZWFkT25seUFycmF5PCRLZXlzPFQ+PixcbiAgICBzaGFsbG93PzogJFJlYWRPbmx5QXJyYXk8JEtleXM8VD4+XG59XG5cbmNvbnN0IHJlZ2lzdHJ5OiBSZWdpc3RyeSA9IHt9O1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBnaXZlbiBjbGFzcyBhcyBzZXJpYWxpemFibGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBvcHRpb25zLm9taXQgTGlzdCBvZiBwcm9wZXJ0aWVzIHRvIG9taXQgZnJvbSBzZXJpYWxpemF0aW9uIChlLmcuLCBjYWNoZWQvY29tcHV0ZWQgcHJvcGVydGllcylcbiAqIEBwYXJhbSBvcHRpb25zLnNoYWxsb3cgTGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgYnkgYSBzaW1wbGUgc2hhbGxvdyBjb3B5LCByYXRoZXIgdGhhbiBieSBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHNlcmlhbGl6ZSgpLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlcjxUOiBhbnk+KG5hbWU6IHN0cmluZywga2xhc3M6IENsYXNzPFQ+LCBvcHRpb25zOiBSZWdpc3Rlck9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGFzc2VydCghcmVnaXN0cnlbbmFtZV0sIGAke25hbWV9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAoT2JqZWN0LmRlZmluZVByb3BlcnR5OiBhbnkpKGtsYXNzLCAnX2NsYXNzUmVnaXN0cnlLZXknLCB7XG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB3cml0ZWFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmVnaXN0cnlbbmFtZV0gPSB7XG4gICAgICAgIGtsYXNzLFxuICAgICAgICBvbWl0OiBvcHRpb25zLm9taXQgfHwgW10sXG4gICAgICAgIHNoYWxsb3c6IG9wdGlvbnMuc2hhbGxvdyB8fCBbXVxuICAgIH07XG59XG5cbnJlZ2lzdGVyKCdPYmplY3QnLCBPYmplY3QpO1xuXG50eXBlIFNlcmlhbGl6ZWRHcmlkID0geyBidWZmZXI6IEFycmF5QnVmZmVyIH07XG5cbkdyaWQuc2VyaWFsaXplID0gZnVuY3Rpb24gc2VyaWFsaXplKGdyaWQ6IEdyaWQsIHRyYW5zZmVyYWJsZXM/OiBBcnJheTxUcmFuc2ZlcmFibGU+KTogU2VyaWFsaXplZEdyaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGdyaWQudG9BcnJheUJ1ZmZlcigpO1xuICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChidWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4ge2J1ZmZlcn07XG59O1xuXG5HcmlkLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gZGVzZXJpYWxpemUoc2VyaWFsaXplZDogU2VyaWFsaXplZEdyaWQpOiBHcmlkIHtcbiAgICByZXR1cm4gbmV3IEdyaWQoc2VyaWFsaXplZC5idWZmZXIpO1xufTtcbnJlZ2lzdGVyKCdHcmlkJywgR3JpZCk7XG5cbnJlZ2lzdGVyKCdDb2xvcicsIENvbG9yKTtcbnJlZ2lzdGVyKCdFcnJvcicsIEVycm9yKTtcblxucmVnaXN0ZXIoJ1N0eWxlUHJvcGVydHlGdW5jdGlvbicsIFN0eWxlUHJvcGVydHlGdW5jdGlvbik7XG5yZWdpc3RlcignU3R5bGVFeHByZXNzaW9uJywgU3R5bGVFeHByZXNzaW9uLCB7b21pdDogWydfZXZhbHVhdG9yJ119KTtcblxucmVnaXN0ZXIoJ1pvb21EZXBlbmRlbnRFeHByZXNzaW9uJywgWm9vbURlcGVuZGVudEV4cHJlc3Npb24pO1xucmVnaXN0ZXIoJ1pvb21Db25zdGFudEV4cHJlc3Npb24nLCBab29tQ29uc3RhbnRFeHByZXNzaW9uKTtcbnJlZ2lzdGVyKCdDb21wb3VuZEV4cHJlc3Npb24nLCBDb21wb3VuZEV4cHJlc3Npb24sIHtvbWl0OiBbJ19ldmFsdWF0ZSddfSk7XG5mb3IgKGNvbnN0IG5hbWUgaW4gZXhwcmVzc2lvbnMpIHtcbiAgICBpZiAoKGV4cHJlc3Npb25zW25hbWVdOiBhbnkpLl9jbGFzc1JlZ2lzdHJ5S2V5KSBjb250aW51ZTtcbiAgICByZWdpc3RlcihgRXhwcmVzc2lvbl8ke25hbWV9YCwgZXhwcmVzc2lvbnNbbmFtZV0pO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gb2JqZWN0IGZvciB0cmFuc2ZlciB0byBvciBmcm9tIGEgd2ViIHdvcmtlci5cbiAqXG4gKiBGb3Igbm9uLWJ1aWx0aW4gdHlwZXMsIHJlY3Vyc2l2ZWx5IHNlcmlhbGl6ZSBlYWNoIHByb3BlcnR5IChwb3NzaWJseVxuICogb21pdHRpbmcgY2VydGFpbiBwcm9wZXJ0aWVzIC0gc2VlIHJlZ2lzdGVyKCkpLCBhbmQgcGFja2FnZSB0aGUgcmVzdWx0IGFsb25nXG4gKiB3aXRoIHRoZSBjb25zdHJ1Y3RvcidzIGBuYW1lYCBzbyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBjYW4gYmVcbiAqIGxvb2tlZCB1cCBpbiBgZGVzZXJpYWxpemUoKWAuXG4gKlxuICogSWYgYSBgdHJhbnNmZXJhYmxlc2AgYXJyYXkgaXMgcHJvdmlkZWQsIGFkZCBhbnkgdHJhbnNmZXJhYmxlIG9iamVjdHMgKGkuZS4sXG4gKiBhbnkgQXJyYXlCdWZmZXJzIG9yIEFycmF5QnVmZmVyIHZpZXdzKSB0byB0aGUgbGlzdC4gKElmIGEgY29weSBpcyBuZWVkZWQsXG4gKiB0aGlzIHNob3VsZCBoYXBwZW4gaW4gdGhlIGNsaWVudCBjb2RlLCBiZWZvcmUgdXNpbmcgc2VyaWFsaXplKCkuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoaW5wdXQ6IG1peGVkLCB0cmFuc2ZlcmFibGVzPzogQXJyYXk8VHJhbnNmZXJhYmxlPik6IFNlcmlhbGl6ZWQge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fFxuICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW4gfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dCkpIHtcbiAgICAgICAgY29uc3QgdmlldzogJEFycmF5QnVmZmVyVmlldyA9IChpbnB1dDogYW55KTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaCh2aWV3LmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2goaW5wdXQuZGF0YS5idWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZDogQXJyYXk8U2VyaWFsaXplZD4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0KSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goc2VyaWFsaXplKGl0ZW0sIHRyYW5zZmVyYWJsZXMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBrbGFzcyA9IChpbnB1dC5jb25zdHJ1Y3RvcjogYW55KTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGtsYXNzLl9jbGFzc1JlZ2lzdHJ5S2V5O1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3Qgc2VyaWFsaXplIG9iamVjdCBvZiB1bnJlZ2lzdGVyZWQgY2xhc3NgKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQocmVnaXN0cnlbbmFtZV0pO1xuXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXM6IFNlcmlhbGl6ZWRPYmplY3QgPSBrbGFzcy5zZXJpYWxpemUgP1xuICAgICAgICAgICAgLy8gKFRlbXBvcmFyeSB3b3JrYXJvdW5kKSBhbGxvdyBhIGNsYXNzIHRvIHByb3ZpZGUgc3RhdGljXG4gICAgICAgICAgICAvLyBgc2VyaWFsaXplKClgIGFuZCBgZGVzZXJpYWxpemUoKWAgbWV0aG9kcyB0byBieXBhc3MgdGhlIGdlbmVyaWNcbiAgICAgICAgICAgIC8vIGFwcHJvYWNoLlxuICAgICAgICAgICAgLy8gVGhpcyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBsZXRzIHVzIHVzZSB0aGUgZ2VuZXJpYyBzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAvLyBhcHByb2FjaCBmb3Igb2JqZWN0cyB3aG9zZSBtZW1iZXJzIGluY2x1ZGUgaW5zdGFuY2VzIG9mIGR5bmFtaWNcbiAgICAgICAgICAgIC8vIFN0cnVjdEFycmF5IHR5cGVzLiBPbmNlIHdlIHJlZmFjdG9yIFN0cnVjdEFycmF5IHRvIGJlIHN0YXRpYyxcbiAgICAgICAgICAgIC8vIHdlIGNhbiByZW1vdmUgdGhpcyBjb21wbGV4aXR5LlxuICAgICAgICAgICAgKGtsYXNzLnNlcmlhbGl6ZShpbnB1dCwgdHJhbnNmZXJhYmxlcyk6IFNlcmlhbGl6ZWRPYmplY3QpIDoge307XG5cbiAgICAgICAgaWYgKCFrbGFzcy5zZXJpYWxpemUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG4gICAgICAgICAgICAgICAgLy8gYW55IGNhc3QgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy81MzkzXG4gICAgICAgICAgICAgICAgaWYgKCEoaW5wdXQ6IGFueSkuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5W25hbWVdLm9taXQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gKGlucHV0OiBhbnkpW2tleV07XG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1trZXldID0gcmVnaXN0cnlbbmFtZV0uc2hhbGxvdy5pbmRleE9mKGtleSkgPj0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IDpcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHByb3BlcnR5LCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5tZXNzYWdlID0gaW5wdXQubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBzdGF0aWNhbGx5IHNlcmlhbGl6ZWQgb2JqZWN0IHN1cnZpdmVzIHRyYW5zZmVyIG9mICRuYW1lIHByb3BlcnR5XG4gICAgICAgICAgICBhc3NlcnQoIXRyYW5zZmVyYWJsZXMgfHwgcHJvcGVydGllcyAhPT0gdHJhbnNmZXJhYmxlc1t0cmFuc2ZlcmFibGVzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzLiRuYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyRuYW1lIHByb3BlcnR5IGlzIHJlc2VydmVkIGZvciB3b3JrZXIgc2VyaWFsaXphdGlvbiBsb2dpYy4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSAhPT0gJ09iamVjdCcpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuJG5hbWUgPSBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZShpbnB1dDogU2VyaWFsaXplZCk6IG1peGVkIHtcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHxcbiAgICAgICAgaW5wdXQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdib29sZWFuJyB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBCb29sZWFuIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIFJlZ0V4cCB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG4gICAgICAgIEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dCkgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gaW5wdXQubWFwKGRlc2VyaWFsaXplKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBuYW1lID0gKGlucHV0OiBhbnkpLiRuYW1lIHx8ICdPYmplY3QnO1xuXG4gICAgICAgIGNvbnN0IHtrbGFzc30gPSByZWdpc3RyeVtuYW1lXTtcbiAgICAgICAgaWYgKCFrbGFzcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgY2xhc3MgJHtuYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtsYXNzLmRlc2VyaWFsaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gKGtsYXNzLmRlc2VyaWFsaXplOiB0eXBlb2YgZGVzZXJpYWxpemUpKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUoa2xhc3MucHJvdG90eXBlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICckbmFtZScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoaW5wdXQ6IFNlcmlhbGl6ZWRPYmplY3QpW2tleV07XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHJlZ2lzdHJ5W25hbWVdLnNoYWxsb3cuaW5kZXhPZihrZXkpID49IDAgPyB2YWx1ZSA6IGRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSBvYmplY3Qgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbn1cbiIsIi8vIEBmbG93XG5cbmNsYXNzIFpvb21IaXN0b3J5IHtcbiAgICBsYXN0Wm9vbTogbnVtYmVyO1xuICAgIGxhc3RGbG9vclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb21UaW1lOiBudW1iZXI7XG4gICAgZmlyc3Q6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maXJzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlKHo6IG51bWJlciwgbm93OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZmxvb3JaID0gTWF0aC5mbG9vcih6KTtcblxuICAgICAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICB0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5sYXN0Wm9vbSA9IHo7XG4gICAgICAgICAgICB0aGlzLmxhc3RGbG9vclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPiBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaICsgMTtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tVGltZSA9IG5vdztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPCBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lID0gbm93O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHogIT09IHRoaXMubGFzdFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFpvb20gPSB6O1xuICAgICAgICAgICAgdGhpcy5sYXN0Rmxvb3Jab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBab29tSGlzdG9yeTtcbiIsIi8vIEBmbG93XG5cbi8vIFRoZSBmb2xsb3dpbmcgdGFibGUgY29tZXMgZnJvbSA8aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvMTIuMC4wL3VjZC9CbG9ja3MudHh0Pi5cbi8vIEtlZXAgaXQgc3luY2hyb25pemVkIHdpdGggPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0Jsb2Nrcy50eHQ+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+IGNoYXIgPj0gMHhFMDAwMCAmJiBjaGFyIDw9IDB4RTAwN0YsXG4gICAgLy8gJ1ZhcmlhdGlvbiBTZWxlY3RvcnMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4RTAxMDAgJiYgY2hhciA8PSAweEUwMUVGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4RjAwMDAgJiYgY2hhciA8PSAweEZGRkZGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQic6IChjaGFyKSA9PiBjaGFyID49IDB4MTAwMDAwICYmIGNoYXIgPD0gMHgxMEZGRkYsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bmljb2RlQmxvY2tMb29rdXA7XG4iLCIvLyBAZmxvd1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5cbmltcG9ydCBpc0NoYXIgZnJvbSAnLi9pc19jaGFyX2luX3VuaWNvZGVfYmxvY2snO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjaGFyczogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmICghY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhci5jaGFyQ29kZUF0KDApKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUoY2hhcnM6IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFycykge1xuICAgICAgICBpZiAoY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXIuY2hhckNvZGVBdCgwKSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd3NMZXR0ZXJTcGFjaW5nKGNoYXJzOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFyQWxsb3dzTGV0dGVyU3BhY2luZyhjaGFyLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckFsbG93c0xldHRlclNwYWNpbmcoY2hhcjogbnVtYmVyKSB7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljJ10oY2hhcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNDaGFyWydBcmFiaWMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIEV4dGVuZGVkLUEnXShjaGFyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcikpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhcjogbnVtYmVyKSB7XG4gICAgLy8gUmV0dXJuIGVhcmx5IGZvciBjaGFyYWN0ZXJzIG91dHNpZGUgYWxsIGlkZW9ncmFwaGljIHJhbmdlcy5cbiAgICBpZiAoY2hhciA8IDB4MkU4MCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8gRXh0ZW5kZWQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGlyYWdhbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydWZXJ0aWNhbCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgbG9naWMgY29tZXMgZnJvbVxuLy8gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzEyLjAuMC91Y2QvVmVydGljYWxPcmllbnRhdGlvbi50eHQ+LlxuLy8gS2VlcCBpdCBzeW5jaHJvbml6ZWQgd2l0aFxuLy8gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL1ZlcnRpY2FsT3JpZW50YXRpb24udHh0Pi5cbi8vIFRoZSBkYXRhIGZpbGUgZGVub3RlcyB3aXRoIMOiwoDCnFXDosKAwp0gb3Igw6LCgMKcVHXDosKAwp0gYW55IGNvZGVwb2ludCB0aGF0IG1heSBiZSBkcmF3blxuLy8gdXByaWdodCBpbiB2ZXJ0aWNhbCB0ZXh0IGJ1dCBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVwcmlnaHQgYW5kXG4vLyDDosKAwpxuZXV0cmFsw6LCgMKdIGNoYXJhY3RlcnMuXG5cbi8vIEJsb2NrcyBpbiB0aGUgVW5pY29kZSBzdXBwbGVtZW50YXJ5IHBsYW5lcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGlzIG1vZHVsZSBkdWVcbi8vIHRvIDxodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC9pc3N1ZXMvMjk+LlxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiB1cHJpZ2h0IG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyB1cHJpZ2h0IG9yaWVudGF0aW9uIGlmIGl0IGlzIGRyYXduIHVwcmlnaHQgKHVucm90YXRlZClcbiAqIHdoZXRoZXIgdGhlIGxpbmUgaXMgb3JpZW50ZWQgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHksIGV2ZW4gaWYgYm90aFxuICogYWRqYWNlbnQgY2hhcmFjdGVycyBjYW4gYmUgcm90YXRlZC4gRm9yIGV4YW1wbGUsIGEgQ2hpbmVzZSBjaGFyYWN0ZXIgaXNcbiAqIGFsd2F5cyBkcmF3biB1cHJpZ2h0LiBBbiB1cHJpZ2h0bHkgb3JpZW50ZWQgY2hhcmFjdGVyIGNhdXNlcyBhbiBhZGphY2VudFxuICogw6LCgMKcbmV1dHJhbMOiwoDCnSBjaGFyYWN0ZXIgdG8gYmUgZHJhd24gdXByaWdodCBhcyB3ZWxsLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyOiBudW1iZXIpIHtcbiAgICBpZiAoY2hhciA9PT0gMHgwMkVBIC8qIG1vZGlmaWVyIGxldHRlciB5aW4gZGVwYXJ0aW5nIHRvbmUgbWFyayAqLyB8fFxuICAgICAgICBjaGFyID09PSAweDAyRUIgLyogbW9kaWZpZXIgbGV0dGVyIHlhbmcgZGVwYXJ0aW5nIHRvbmUgbWFyayAqLykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZWFybHkgZm9yIGNoYXJhY3RlcnMgb3V0c2lkZSBhbGwgcmFuZ2VzIHdob3NlIGNoYXJhY3RlcnMgcmVtYWluXG4gICAgLy8gdXByaWdodCBpbiB2ZXJ0aWNhbCB3cml0aW5nIG1vZGUuXG4gICAgaWYgKGNoYXIgPCAweDExMDApIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChpc0NoYXJbJ0JvcG9tb2ZvIEV4dGVuZGVkJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0JvcG9tb2ZvJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHhGRTQ5IC8qIGRhc2hlZCBvdmVybGluZSAqLyAmJiBjaGFyIDw9IDB4RkU0RikgLyogd2F2eSBsb3cgbGluZSAqLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHknXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN0cm9rZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHgzMDA4IC8qIGxlZnQgYW5nbGUgYnJhY2tldCAqLyAmJiBjaGFyIDw9IDB4MzAxMSkgLyogcmlnaHQgYmxhY2sgbGVudGljdWxhciBicmFja2V0ICovKSAmJlxuICAgICAgICAgICAgISgoY2hhciA+PSAweDMwMTQgLyogbGVmdCB0b3J0b2lzZSBzaGVsbCBicmFja2V0ICovICYmIGNoYXIgPD0gMHgzMDFGKSAvKiBsb3cgZG91YmxlIHByaW1lIHF1b3RhdGlvbiBtYXJrICovKSAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHgzMDMwIC8qIHdhdnkgZGFzaCAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgSmFtbyBFeHRlbmRlZC1BJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUInXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIEphbW8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIaXJhZ2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thbmJ1biddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyICE9PSAweDMwRkMgLyoga2F0YWthbmEtaGlyYWdhbmEgcHJvbG9uZ2VkIHNvdW5kIG1hcmsgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0hhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKGNoYXIgIT09IDB4RkYwOCAvKiBmdWxsd2lkdGggbGVmdCBwYXJlbnRoZXNpcyAqLyAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjA5IC8qIGZ1bGx3aWR0aCByaWdodCBwYXJlbnRoZXNpcyAqLyAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjBEIC8qIGZ1bGx3aWR0aCBoeXBoZW4tbWludXMgKi8gJiZcbiAgICAgICAgICAgICEoKGNoYXIgPj0gMHhGRjFBIC8qIGZ1bGx3aWR0aCBjb2xvbiAqLyAmJiBjaGFyIDw9IDB4RkYxRSkgLyogZnVsbHdpZHRoIGdyZWF0ZXItdGhhbiBzaWduICovKSAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjNCIC8qIGZ1bGx3aWR0aCBsZWZ0IHNxdWFyZSBicmFja2V0ICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0QgLyogZnVsbHdpZHRoIHJpZ2h0IHNxdWFyZSBicmFja2V0ICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0YgLyogZnVsbHdpZHRoIGxvdyBsaW5lICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRjVCIC8qIGZ1bGx3aWR0aCBsZWZ0IGN1cmx5IGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweEZGREYpICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGRTMgLyogZnVsbHdpZHRoIG1hY3JvbiAqLyAmJlxuICAgICAgICAgICAgIShjaGFyID49IDB4RkZFOCAvKiBoYWxmd2lkdGggZm9ybXMgbGlnaHQgdmVydGljYWwgKi8gJiYgY2hhciA8PSAweEZGRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydTbWFsbCBGb3JtIFZhcmlhbnRzJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHhGRTU4IC8qIHNtYWxsIGVtIGRhc2ggKi8gJiYgY2hhciA8PSAweEZFNUUpIC8qIHNtYWxsIHJpZ2h0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8pICYmXG4gICAgICAgICAgICAhKChjaGFyID49IDB4RkU2MyAvKiBzbWFsbCBoeXBoZW4tbWludXMgKi8gJiYgY2hhciA8PSAweEZFNjYpIC8qIHNtYWxsIGVxdWFscyBzaWduICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzIEV4dGVuZGVkJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1ZlcnRpY2FsIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogbmV1dHJhbCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgbmV1dHJhbCBvcmllbnRhdGlvbiBpZiBpdCBtYXkgYmUgZHJhd24gcm90YXRlZCBvciB1bnJvdGF0ZWRcbiAqIHdoZW4gdGhlIGxpbmUgaXMgb3JpZW50ZWQgdmVydGljYWxseSwgZGVwZW5kaW5nIG9uIHRoZSBvcmllbnRhdGlvbiBvZiB0aGVcbiAqIGFkamFjZW50IGNoYXJhY3RlcnMuIEZvciBleGFtcGxlLCBhbG9uZyBhIHZlcnRpY2xseSBvcmllbnRlZCBsaW5lLCB0aGUgdnVsZ2FyXG4gKiBmcmFjdGlvbiDDgsK9IGlzIGRyYXduIHVwcmlnaHQgYW1vbmcgQ2hpbmVzZSBjaGFyYWN0ZXJzIGJ1dCByb3RhdGVkIGFtb25nIExhdGluXG4gKiBsZXR0ZXJzLiBBIG5ldXRyYWxseSBvcmllbnRlZCBjaGFyYWN0ZXIgZG9lcyBub3QgaW5mbHVlbmNlIHdoZXRoZXIgYW5cbiAqIGFkamFjZW50IGNoYXJhY3RlciBpcyBkcmF3biB1cHJpZ2h0IG9yIHJvdGF0ZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhckhhc05ldXRyYWxWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXI6IG51bWJlcikge1xuICAgIGlmIChpc0NoYXJbJ0xhdGluLTEgU3VwcGxlbWVudCddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyID09PSAweDAwQTcgLyogc2VjdGlvbiBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQTkgLyogY29weXJpZ2h0IHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBBRSAvKiByZWdpc3RlcmVkIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCMSAvKiBwbHVzLW1pbnVzIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCQyAvKiB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCRCAvKiB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCRSAvKiB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBENyAvKiBtdWx0aXBsaWNhdGlvbiBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwRjcgLyogZGl2aXNpb24gc2lnbiAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnR2VuZXJhbCBQdW5jdHVhdGlvbiddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyID09PSAweDIwMTYgLyogZG91YmxlIHZlcnRpY2FsIGxpbmUgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAyMCAvKiBkYWdnZXIgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAyMSAvKiBkb3VibGUgZGFnZ2VyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMzAgLyogcGVyIG1pbGxlIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzMSAvKiBwZXIgdGVuIHRob3VzYW5kIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzQiAvKiByZWZlcmVuY2UgbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDNDIC8qIGRvdWJsZSBleGNsYW1hdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDIgLyogYXN0ZXJpc20gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0NyAvKiBkb3VibGUgcXVlc3Rpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDQ4IC8qIHF1ZXN0aW9uIGV4Y2xhbWF0aW9uIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0OSAvKiBleGNsYW1hdGlvbiBxdWVzdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNTEgLyogdHdvIGFzdGVyaXNrcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0xldHRlcmxpa2UgU3ltYm9scyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydOdW1iZXIgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBUZWNobmljYWwnXShjaGFyKSkge1xuICAgICAgICBpZiAoKGNoYXIgPj0gMHgyMzAwIC8qIGRpYW1ldGVyIHNpZ24gKi8gJiYgY2hhciA8PSAweDIzMDcgLyogd2F2eSBsaW5lICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzBDIC8qIGJvdHRvbSByaWdodCBjcm9wICovICYmIGNoYXIgPD0gMHgyMzFGIC8qIGJvdHRvbSByaWdodCBjb3JuZXIgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzMjQgLyogdXAgYXJyb3doZWFkIGJldHdlZW4gdHdvIGhvcml6b250YWwgYmFycyAqLyAmJiBjaGFyIDw9IDB4MjMyOCAvKiBrZXlib2FyZCAqLykgfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjMyQiAvKiBlcmFzZSB0byB0aGUgbGVmdCAqLyB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzdEIC8qIHNob3VsZGVyZWQgb3BlbiBib3ggKi8gJiYgY2hhciA8PSAweDIzOUEgLyogY2xlYXIgc2NyZWVuIHN5bWJvbCAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjNCRSAvKiBkZW50aXN0cnkgc3ltYm9sIGxpZ2h0IHZlcnRpY2FsIGFuZCB0b3AgcmlnaHQgKi8gJiYgY2hhciA8PSAweDIzQ0QgLyogc3F1YXJlIGZvb3QgKi8pIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIzQ0YgLyogZWplY3Qgc3ltYm9sICovIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzRDEgLyogbWV0cmljYWwgYnJldmUgKi8gJiYgY2hhciA8PSAweDIzREIgLyogZnVzZSAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjNFMiAvKiB3aGl0ZSB0cmFwZXppdW0gKi8gJiYgY2hhciA8PSAweDIzRkYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydDb250cm9sIFBpY3R1cmVzJ10oY2hhcikgJiYgY2hhciAhPT0gMHgyNDIzIC8qIG9wZW4gYm94ICovKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydFbmNsb3NlZCBBbHBoYW51bWVyaWNzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0dlb21ldHJpYyBTaGFwZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBTeW1ib2xzJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHgyNjFBIC8qIGJsYWNrIGxlZnQgcG9pbnRpbmcgaW5kZXggKi8gJiYgY2hhciA8PSAweDI2MUYpIC8qIHdoaXRlIGRvd24gcG9pbnRpbmcgaW5kZXggKi8pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93cyddKGNoYXIpKSB7XG4gICAgICAgIGlmICgoY2hhciA+PSAweDJCMTIgLyogc3F1YXJlIHdpdGggdG9wIGhhbGYgYmxhY2sgKi8gJiYgY2hhciA8PSAweDJCMkYgLyogd2hpdGUgdmVydGljYWwgZWxsaXBzZSAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MkI1MCAvKiB3aGl0ZSBtZWRpdW0gc3RhciAqLyAmJiBjaGFyIDw9IDB4MkI1OSAvKiBoZWF2eSBjaXJjbGVkIHNhbHRpcmUgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDJCQjggLyogdXB3YXJkcyB3aGl0ZSBhcnJvdyBmcm9tIGJhciB3aXRoIGhvcml6b250YWwgYmFyICovICYmIGNoYXIgPD0gMHgyQkVCKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thdGFrYW5hJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1ByaXZhdGUgVXNlIEFyZWEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnU21hbGwgRm9ybSBWYXJpYW50cyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChjaGFyID09PSAweDIyMUUgLyogaW5maW5pdHkgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHgyMjM0IC8qIHRoZXJlZm9yZSAqLyB8fFxuICAgICAgICBjaGFyID09PSAweDIyMzUgLyogYmVjYXVzZSAqLyB8fFxuICAgICAgICAoY2hhciA+PSAweDI3MDAgLyogYmxhY2sgc2FmZXR5IHNjaXNzb3JzICovICYmIGNoYXIgPD0gMHgyNzY3IC8qIHJvdGF0ZWQgZmxvcmFsIGhlYXJ0IGJ1bGxldCAqLykgfHxcbiAgICAgICAgKGNoYXIgPj0gMHgyNzc2IC8qIGRpbmdiYXQgbmVnYXRpdmUgY2lyY2xlZCBkaWdpdCBvbmUgKi8gJiYgY2hhciA8PSAweDI3OTMgLyogZGluZ2JhdCBuZWdhdGl2ZSBjaXJjbGVkIHNhbnMtc2VyaWYgbnVtYmVyIHRlbiAqLykgfHxcbiAgICAgICAgY2hhciA9PT0gMHhGRkZDIC8qIG9iamVjdCByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHhGRkZEIC8qIHJlcGxhY2VtZW50IGNoYXJhY3RlciAqLykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBVbmljb2RlIGNvZGVwb2ludCBpZGVudGlmaWVzIGEgY2hhcmFjdGVyIHdpdGhcbiAqIHJvdGF0ZWQgb3JpZW50YXRpb24uXG4gKlxuICogQSBjaGFyYWN0ZXIgaGFzIHJvdGF0ZWQgb3JpZW50YXRpb24gaWYgaXQgaXMgZHJhd24gcm90YXRlZCB3aGVuIHRoZSBsaW5lIGlzXG4gKiBvcmllbnRlZCB2ZXJ0aWNhbGx5LCBldmVuIGlmIGJvdGggYWRqYWNlbnQgY2hhcmFjdGVycyBhcmUgdXByaWdodC4gRm9yXG4gKiBleGFtcGxlLCBhIExhdGluIGxldHRlciBpcyBkcmF3biByb3RhdGVkIGFsb25nIGEgdmVydGljYWwgbGluZS4gQSByb3RhdGVkXG4gKiBjaGFyYWN0ZXIgY2F1c2VzIGFuIGFkamFjZW50IMOiwoDCnG5ldXRyYWzDosKAwp0gY2hhcmFjdGVyIHRvIGJlIGRyYXduIHJvdGF0ZWQgYXMgd2VsbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFySGFzUm90YXRlZFZlcnRpY2FsT3JpZW50YXRpb24oY2hhcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuICEoY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXIpIHx8XG4gICAgICAgICAgICAgY2hhckhhc05ldXRyYWxWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJJbkNvbXBsZXhTaGFwaW5nU2NyaXB0KGNoYXI6IG51bWJlcikge1xuICAgIHJldHVybiBpc0NoYXJbJ0FyYWJpYyddKGNoYXIpIHx8XG4gICAgICAgICAgIGlzQ2hhclsnQXJhYmljIFN1cHBsZW1lbnQnXShjaGFyKSB8fFxuICAgICAgICAgICBpc0NoYXJbJ0FyYWJpYyBFeHRlbmRlZC1BJ10oY2hhcikgfHxcbiAgICAgICAgICAgaXNDaGFyWydBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEnXShjaGFyKSB8fFxuICAgICAgICAgICBpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiddKGNoYXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckluU3VwcG9ydGVkU2NyaXB0KGNoYXI6IG51bWJlciwgY2FuUmVuZGVyUlRMOiBib29sZWFuKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJvdWdoIGhldXJpc3RpYzogd2hldGhlciB3ZSBcImNhbiByZW5kZXJcIiBhIHNjcmlwdFxuICAgIC8vIGFjdHVhbGx5IGRlcGVuZHMgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIGZvbnQgYmVpbmcgdXNlZFxuICAgIC8vIGFuZCB3aGV0aGVyIGRpZmZlcmVuY2VzIGZyb20gdGhlIGlkZWFsIHJlbmRlcmluZyBhcmUgY29uc2lkZXJlZFxuICAgIC8vIHNlbWFudGljYWxseSBzaWduaWZpY2FudC5cblxuICAgIC8vIEV2ZW4gaW4gTGF0aW4gc2NyaXB0LCB3ZSBcImNhbid0IHJlbmRlclwiIGNvbWJpbmF0aW9ucyBzdWNoIGFzIHRoZSBmaVxuICAgIC8vIGxpZ2F0dXJlLCBidXQgd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBzZW1hbnRpY2FsbHkgc2lnbmlmaWNhbnQuXG4gICAgaWYgKCFjYW5SZW5kZXJSVEwgJiZcbiAgICAgICAgKChjaGFyID49IDB4MDU5MCAmJiBjaGFyIDw9IDB4MDhGRikgfHxcbiAgICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BJ10oY2hhcikgfHxcbiAgICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcikpKSB7XG4gICAgICAgIC8vIE1haW4gYmxvY2tzIGZvciBIZWJyZXcsIEFyYWJpYywgVGhhYW5hIGFuZCBvdGhlciBSVEwgc2NyaXB0c1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoY2hhciA+PSAweDA5MDAgJiYgY2hhciA8PSAweDBERkYpIHx8XG4gICAgICAgIC8vIE1haW4gYmxvY2tzIGZvciBJbmRpYyBzY3JpcHRzIGFuZCBTaW5oYWxhXG4gICAgICAgIChjaGFyID49IDB4MEYwMCAmJiBjaGFyIDw9IDB4MTA5RikgfHxcbiAgICAgICAgLy8gTWFpbiBibG9ja3MgZm9yIFRpYmV0YW4gYW5kIE15YW5tYXJcbiAgICAgICAgaXNDaGFyWydLaG1lciddKGNoYXIpKSB7XG4gICAgICAgIC8vIFRoZXNlIGJsb2NrcyBjb3ZlciBjb21tb24gc2NyaXB0cyB0aGF0IHJlcXVpcmVcbiAgICAgICAgLy8gY29tcGxleCB0ZXh0IHNoYXBpbmcsIGJhc2VkIG9uIHVuaWNvZGUgc2NyaXB0IG1ldGFkYXRhOlxuICAgICAgICAvLyBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9zL2NsZHIvdHJ1bmsvY29tbW9uL3Byb3BlcnRpZXMvc2NyaXB0TWV0YWRhdGEudHh0XG4gICAgICAgIC8vIHdoZXJlIFwiV2ViIFJhbmsgPD0gMzJcIiBcIlNoYXBpbmcgUmVxdWlyZWQgPSBZRVNcIlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdJblN1cHBvcnRlZFNjcmlwdChjaGFyczogc3RyaW5nLCBjYW5SZW5kZXJSVEw6IGJvb2xlYW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFySW5TdXBwb3J0ZWRTY3JpcHQoY2hhci5jaGFyQ29kZUF0KDApLCBjYW5SZW5kZXJSVEwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBFdmVudCwgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuXG5sZXQgcGx1Z2luUmVxdWVzdGVkID0gZmFsc2U7XG5sZXQgcGx1Z2luVVJMID0gbnVsbDtcbmxldCBmb3JlZ3JvdW5kTG9hZENvbXBsZXRlID0gZmFsc2U7XG5cbmV4cG9ydCBjb25zdCBldmVudGVkID0gbmV3IEV2ZW50ZWQoKTtcblxudHlwZSBDb21wbGV0aW9uQ2FsbGJhY2sgPSAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZDtcbnR5cGUgRXJyb3JDYWxsYmFjayA9IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG5cbmxldCBfY29tcGxldGlvbkNhbGxiYWNrO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJGb3JQbHVnaW5BdmFpbGFiaWxpdHkgPSBmdW5jdGlvbihcbiAgICBjYWxsYmFjazogKGFyZ3M6IHtwbHVnaW5VUkw6IHN0cmluZywgY29tcGxldGlvbkNhbGxiYWNrOiBDb21wbGV0aW9uQ2FsbGJhY2t9KSA9PiB2b2lkXG4pIHtcbiAgICBpZiAocGx1Z2luVVJMKSB7XG4gICAgICAgIGNhbGxiYWNrKHsgcGx1Z2luVVJMLCBjb21wbGV0aW9uQ2FsbGJhY2s6IF9jb21wbGV0aW9uQ2FsbGJhY2t9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBldmVudGVkLm9uY2UoJ3BsdWdpbkF2YWlsYWJsZScsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIHBsdWdpblJlcXVlc3RlZCA9IGZhbHNlO1xuICAgIHBsdWdpblVSTCA9IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0UlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKHVybDogc3RyaW5nLCBjYWxsYmFjazogRXJyb3JDYWxsYmFjaykge1xuICAgIGlmIChwbHVnaW5SZXF1ZXN0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRSVExUZXh0UGx1Z2luIGNhbm5vdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuJyk7XG4gICAgfVxuICAgIHBsdWdpblJlcXVlc3RlZCA9IHRydWU7XG4gICAgcGx1Z2luVVJMID0gYnJvd3Nlci5yZXNvbHZlVVJMKHVybCk7XG4gICAgX2NvbXBsZXRpb25DYWxsYmFjayA9IChlcnJvcj86IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgLy8gQ2xlYXIgbG9hZGVkIHN0YXRlIHRvIGFsbG93IHJldHJpZXNcbiAgICAgICAgICAgIGNsZWFyUlRMVGV4dFBsdWdpbigpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2FsbGVkIG9uY2UgZm9yIGVhY2ggd29ya2VyXG4gICAgICAgICAgICBmb3JlZ3JvdW5kTG9hZENvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgZXZlbnRlZC5maXJlKG5ldyBFdmVudCgncGx1Z2luQXZhaWxhYmxlJywgeyBwbHVnaW5VUkwsIGNvbXBsZXRpb25DYWxsYmFjazogX2NvbXBsZXRpb25DYWxsYmFjayB9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgcGx1Z2luOiB7XG4gICAgYXBwbHlBcmFiaWNTaGFwaW5nOiA/RnVuY3Rpb24sXG4gICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiA/KHN0cmluZywgQXJyYXk8bnVtYmVyPikgPT4gQXJyYXk8c3RyaW5nPixcbiAgICBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ6ID8oc3RyaW5nLCBBcnJheTxudW1iZXI+LCBBcnJheTxudW1iZXI+KSA9PiBBcnJheTxbc3RyaW5nLCBBcnJheTxudW1iZXI+XT4sXG4gICAgaXNMb2FkZWQ6ICgpID0+IGJvb2xlYW5cbn0gPSB7XG4gICAgYXBwbHlBcmFiaWNTaGFwaW5nOiBudWxsLFxuICAgIHByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dDogbnVsbCxcbiAgICBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ6IG51bGwsXG4gICAgaXNMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiBmb3JlZ3JvdW5kTG9hZENvbXBsZXRlIHx8ICAgICAgIC8vIEZvcmVncm91bmQ6IGxvYWRlZCBpZiB0aGUgY29tcGxldGlvbiBjYWxsYmFjayByZXR1cm5lZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIHBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcgIT0gbnVsbDsgLy8gQmFja2dyb3VuZDogbG9hZGVkIGlmIHRoZSBwbHVnaW4gZnVuY3Rpb25zIGhhdmUgYmVlbiBjb21waWxlZFxuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgWm9vbUhpc3RvcnkgZnJvbSAnLi96b29tX2hpc3RvcnknO1xuaW1wb3J0IHtpc1N0cmluZ0luU3VwcG9ydGVkU2NyaXB0fSBmcm9tICcuLi91dGlsL3NjcmlwdF9kZXRlY3Rpb24nO1xuaW1wb3J0IHtwbHVnaW4gYXMgcnRsVGV4dFBsdWdpbn0gZnJvbSAnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbic7XG5cbmltcG9ydCB0eXBlIHtUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIENyb3NzZmFkZVBhcmFtZXRlcnMgPSB7XG4gICAgZnJvbVNjYWxlOiBudW1iZXIsXG4gICAgdG9TY2FsZTogbnVtYmVyLFxuICAgIHQ6IG51bWJlclxufTtcblxuY2xhc3MgRXZhbHVhdGlvblBhcmFtZXRlcnMge1xuICAgIHpvb206IG51bWJlcjtcbiAgICBub3c6IG51bWJlcjtcbiAgICBmYWRlRHVyYXRpb246IG51bWJlcjtcbiAgICB6b29tSGlzdG9yeTogWm9vbUhpc3Rvcnk7XG4gICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvblNwZWNpZmljYXRpb247XG5cbiAgICAvLyBcIm9wdGlvbnNcIiBtYXkgYWxzbyBiZSBhbm90aGVyIEV2YWx1YXRpb25QYXJhbWV0ZXJzIHRvIGNvcHksIHNlZSBDcm9zc0ZhZGVkUHJvcGVydHkucG9zc2libHlFdmFsdWF0ZVxuICAgIGNvbnN0cnVjdG9yKHpvb206IG51bWJlciwgb3B0aW9ucz86ICopIHtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcblxuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5ub3cgPSBvcHRpb25zLm5vdztcbiAgICAgICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gb3B0aW9ucy5mYWRlRHVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0gb3B0aW9ucy56b29tSGlzdG9yeTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IG9wdGlvbnMudHJhbnNpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm93ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gMDtcbiAgICAgICAgICAgIHRoaXMuem9vbUhpc3RvcnkgPSBuZXcgWm9vbUhpc3RvcnkoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNTdXBwb3J0ZWRTY3JpcHQoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nSW5TdXBwb3J0ZWRTY3JpcHQoc3RyLCBydGxUZXh0UGx1Z2luLmlzTG9hZGVkKCkpO1xuICAgIH1cblxuICAgIGNyb3NzRmFkaW5nRmFjdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5mYWRlRHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKCh0aGlzLm5vdyAtIHRoaXMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tVGltZSkgLyB0aGlzLmZhZGVEdXJhdGlvbiwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk6IENyb3NzZmFkZVBhcmFtZXRlcnMge1xuICAgICAgICBjb25zdCB6ID0gdGhpcy56b29tO1xuICAgICAgICBjb25zdCBmcmFjdGlvbiA9IHogLSBNYXRoLmZsb29yKHopO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5jcm9zc0ZhZGluZ0ZhY3RvcigpO1xuXG4gICAgICAgIHJldHVybiB6ID4gdGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gP1xuICAgICAgICAgICAgeyBmcm9tU2NhbGU6IDIsIHRvU2NhbGU6IDEsIHQ6IGZyYWN0aW9uICsgKDEgLSBmcmFjdGlvbikgKiB0IH0gOlxuICAgICAgICAgICAgeyBmcm9tU2NhbGU6IDAuNSwgdG9TY2FsZTogMSwgdDogMSAtICgxIC0gdCkgKiBmcmFjdGlvbiB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZhbHVhdGlvblBhcmFtZXRlcnM7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IGNsb25lLCBleHRlbmQsIGVhc2VDdWJpY0luT3V0IH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCAqIGFzIGludGVycG9sYXRlIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgeyBub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb24gfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvc3R5bGUtc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgVHJhbnNpdGlvblNwZWNpZmljYXRpb24sXG4gICAgUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBGZWF0dXJlLFxuICAgIEZlYXR1cmVTdGF0ZSxcbiAgICBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbixcbiAgICBTb3VyY2VFeHByZXNzaW9uLFxuICAgIENvbXBvc2l0ZUV4cHJlc3Npb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcblxudHlwZSBUaW1lUG9pbnQgPSBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIENyb3NzRmFkZWQ8VD4gPSB7XG4gICAgdG86IFQsXG4gICAgZnJvbTogVFxufTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgbnVtYmVyIG9mIGNsYXNzZXMgdGhhdCBkZWZpbmUgc3RhdGUgYW5kIGJlaGF2aW9yIGZvciBwYWludCBhbmQgbGF5b3V0IHByb3BlcnRpZXMsIG1vc3RcbiAqIGltcG9ydGFudGx5IHRoZWlyIHJlc3BlY3RpdmUgZXZhbHVhdGlvbiBjaGFpbnM6XG4gKlxuICogICAgICAgVHJhbnNpdGlvbmFibGUgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDDosKGwpIgVHJhbnNpdGlvbmluZyBwYWludCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIMOiwobCkiBQb3NzaWJseSBldmFsdWF0ZWQgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDDosKGwpIgRnVsbHkgZXZhbHVhdGVkIHBhaW50IHByb3BlcnR5IHZhbHVlXG4gKlxuICogICAgICAgTGF5b3V0IHByb3BlcnR5IHZhbHVlXG4gKiAgICAgw6LChsKSIFBvc3NpYmx5IGV2YWx1YXRlZCBsYXlvdXQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDDosKGwpIgRnVsbHkgZXZhbHVhdGVkIGxheW91dCBwcm9wZXJ0eSB2YWx1ZVxuICpcbiAqIEBtb2R1bGVcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiAgSW1wbGVtZW50YXRpb25zIG9mIHRoZSBgUHJvcGVydHlgIGludGVyZmFjZTpcbiAqXG4gKiAgKiBIb2xkIG1ldGFkYXRhIGFib3V0IGEgcHJvcGVydHkgdGhhdCdzIGluZGVwZW5kZW50IG9mIGFueSBzcGVjaWZpYyB2YWx1ZTogc3R1ZmYgbGlrZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUsXG4gKiAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgZXRjLiBUaGlzIGNvbWVzIGZyb20gdGhlIHN0eWxlIHNwZWNpZmljYXRpb24gSlNPTi5cbiAqICAqIERlZmluZSBiZWhhdmlvciB0aGF0IG5lZWRzIHRvIGJlIHBvbHltb3JwaGljIGFjcm9zcyBkaWZmZXJlbnQgcHJvcGVydGllczogXCJwb3NzaWJseSBldmFsdWF0aW5nXCJcbiAqICAgIGFuIGlucHV0IHZhbHVlIChzZWUgYmVsb3cpLCBhbmQgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHR3byBwb3NzaWJseS1ldmFsdXRlZCB2YWx1ZXMuXG4gKlxuICogIFRoZSB0eXBlIGBUYCBpcyB0aGUgZnVsbHktZXZhbHVhdGVkIHZhbHVlIHR5cGUgKGUuZy4gYG51bWJlcmAsIGBzdHJpbmdgLCBgQ29sb3JgKS5cbiAqICBUaGUgdHlwZSBgUmAgaXMgdGhlIGludGVybWVkaWF0ZSBcInBvc3NpYmx5IGV2YWx1YXRlZFwiIHZhbHVlIHR5cGUuIFNlZSBiZWxvdy5cbiAqXG4gKiAgVGhlcmUgYXJlIHR3byBtYWluIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgaW50ZXJmYWNlIC0tIG9uZSBmb3IgcHJvcGVydGllcyB0aGF0IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcyxcbiAqICBhbmQgb25lIGZvciBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QuIFRoZXJlIGFyZSBhIGZldyBcInNwZWNpYWwgY2FzZVwiIGltcGxlbWVudGF0aW9ucyBhcyB3ZWxsOiBvbmUgZm9yIHByb3BlcnRpZXNcbiAqICB3aGljaCBjcm9zcy1mYWRlIGJldHdlZW4gdHdvIHZhbHVlcyByYXRoZXIgdGhhbiBpbnRlcnBvbGF0aW5nLCBvbmUgZm9yIGBoZWF0bWFwLWNvbG9yYCBhbmQgYGxpbmUtZ3JhZGllbnRgLFxuICogIGFuZCBvbmUgZm9yIGBsaWdodC1wb3NpdGlvbmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eTxULCBSPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBSO1xuICAgIGludGVycG9sYXRlKGE6IFIsIGI6IFIsIHQ6IG51bWJlcik6IFI7XG59XG5cbi8qKlxuICogIGBQcm9wZXJ0eVZhbHVlYCByZXByZXNlbnRzIHRoZSB2YWx1ZSBwYXJ0IG9mIGEgcHJvcGVydHkga2V5LXZhbHVlIHVuaXQuIEl0J3MgdXNlZCB0byByZXByZXNlbnQgYm90aFxuICogIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydHkgdmFsdWVzLCBhbmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGVpciBwcm9wZXJ0eSBzdXBwb3J0cyBkYXRhLWRyaXZlblxuICogIGV4cHJlc3Npb25zLlxuICpcbiAqICBgUHJvcGVydHlWYWx1ZWAgc3RvcmVzIHRoZSByYXcgaW5wdXQgdmFsdWUgYXMgc2VlbiBpbiBhIHN0eWxlIG9yIGEgcnVudGltZSBzdHlsaW5nIEFQSSBjYWxsLCBpLmUuIG9uZSBvZiB0aGVcbiAqICBmb2xsb3dpbmc6XG4gKlxuICogICAgKiBBIGNvbnN0YW50IHZhbHVlIG9mIHRoZSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHlcbiAqICAgICogQSBmdW5jdGlvbiB3aGljaCBwcm9kdWNlcyBhIHZhbHVlIG9mIHRoYXQgdHlwZSAoYnV0IGZ1bmN0aW9ucyBhcmUgcXVhc2ktZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBleHByZXNzaW9ucylcbiAqICAgICogQW4gZXhwcmVzc2lvbiB3aGljaCBwcm9kdWNlcyBhIHZhbHVlIG9mIHRoYXQgdHlwZVxuICogICAgKiBcInVuZGVmaW5lZFwiL1wibm90IHByZXNlbnRcIiwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvcGVydHkgaXMgYXNzdW1lZCB0byB0YWtlIG9uIGl0cyBkZWZhdWx0IHZhbHVlLlxuICpcbiAqICBJbiBhZGRpdGlvbiB0byBzdG9yaW5nIHRoZSBvcmlnaW5hbCBpbnB1dCB2YWx1ZSwgYFByb3BlcnR5VmFsdWVgIGFsc28gc3RvcmVzIGEgbm9ybWFsaXplZCByZXByZXNlbnRhdGlvbixcbiAqICBlZmZlY3RpdmVseSB0cmVhdGluZyBmdW5jdGlvbnMgYXMgaWYgdGhleSBhcmUgZXhwcmVzc2lvbnMsIGFuZCBjb25zdGFudCBvciBkZWZhdWx0IHZhbHVlcyBhcyBpZiB0aGV5IGFyZVxuICogIChjb25zdGFudCkgZXhwcmVzc2lvbnMuXG4gKlxuICogIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eVZhbHVlPFQsIFI+IHtcbiAgICBwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj47XG4gICAgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZDtcbiAgICBleHByZXNzaW9uOiBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPiwgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCkge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLmRlZmF1bHQgOiB2YWx1ZSwgcHJvcGVydHkuc3BlY2lmaWNhdGlvbik7XG4gICAgfVxuXG4gICAgaXNEYXRhRHJpdmVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmtpbmQgPT09ICdzb3VyY2UnIHx8IHRoaXMuZXhwcmVzc2lvbi5raW5kID09PSAnY29tcG9zaXRlJztcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogUiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcywgcGFyYW1ldGVycyk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tIFRyYW5zaXRpb25hYmxlIC0tLS0tLS1cblxuZXhwb3J0IHR5cGUgVHJhbnNpdGlvblBhcmFtZXRlcnMgPSB7XG4gICAgbm93OiBUaW1lUG9pbnQsXG4gICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvblNwZWNpZmljYXRpb25cbn07XG5cbi8qKlxuICogUGFpbnQgcHJvcGVydGllcyBhcmUgX3RyYW5zaXRpb25hYmxlXzogdGhleSBjYW4gY2hhbmdlIGluIGEgZmx1aWQgbWFubmVyLCBpbnRlcnBvbGF0aW5nIG9yIGNyb3NzLWZhZGluZyBiZXR3ZWVuXG4gKiBvbGQgYW5kIG5ldyB2YWx1ZS4gVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGRlbGF5IGJlZm9yZSBpdCBiZWdpbnMsIGlzIGNvbmZpZ3VyYWJsZS5cbiAqXG4gKiBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlYCBpcyBhIGNvbXBvc2l0aW9uYWwgY2xhc3MgdGhhdCBzdG9yZXMgYm90aCB0aGUgcHJvcGVydHkgdmFsdWUgYW5kIHRoYXQgdHJhbnNpdGlvblxuICogY29uZmlndXJhdGlvbi5cbiAqXG4gKiBBIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVgIGNhbiBjYWxjdWxhdGUgdGhlIG5leHQgc3RlcCBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbiBmb3IgcGFpbnQgcHJvcGVydHkgdmFsdWVzOlxuICogYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgIHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPjtcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPjtcbiAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbiB8IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj4pIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3IFByb3BlcnR5VmFsdWUocHJvcGVydHksIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvbmVkKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICBwcmlvcjogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4pOiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWUodGhpcy5wcm9wZXJ0eSwgdGhpcy52YWx1ZSwgcHJpb3IsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICAgIGV4dGVuZCh7fSwgcGFyYW1ldGVycy50cmFuc2l0aW9uLCB0aGlzLnRyYW5zaXRpb24pLCBwYXJhbWV0ZXJzLm5vdyk7XG4gICAgfVxuXG4gICAgdW50cmFuc2l0aW9uZWQoKTogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlKHRoaXMucHJvcGVydHksIHRoaXMudmFsdWUsIG51bGwsIHt9LCAwKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlPFQsIFI+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFByb3BzLCA8VCwgUj4ocDogUHJvcGVydHk8VCwgUj4pID0+IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogYFRyYW5zaXRpb25hYmxlYCBzdG9yZXMgYSBtYXAgb2YgYWxsIChwcm9wZXJ0eSBuYW1lLCBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlYCkgcGFpcnMgZm9yIHBhaW50IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYHMgZm9yIGFsbCBvZiB0aGVtIGF0IG9uY2UsIHByb2R1Y2luZyBhXG4gKiBgVHJhbnNpdGlvbmluZ2AgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2l0aW9uYWJsZTxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4pIHtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IChPYmplY3QuY3JlYXRlKHByb3BlcnRpZXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldFZhbHVlPFM6IHN0cmluZywgVD4obmFtZTogUyk6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLl92YWx1ZXNbbmFtZV0udmFsdWUudmFsdWUpO1xuICAgIH1cblxuICAgIHNldFZhbHVlPFM6IHN0cmluZywgVD4obmFtZTogUywgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCkge1xuICAgICAgICBpZiAoIXRoaXMuX3ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdID0gbmV3IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZSh0aGlzLl92YWx1ZXNbbmFtZV0ucHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgX3JlbW92ZV8gYW4gb3duIHByb3BlcnR5IGluIHRoZSBjYXNlIHdoZXJlIGEgdmFsdWUgaXMgYmVpbmcgcmVzZXRcbiAgICAgICAgLy8gdG8gdGhlIGRlZmF1bHQ6IHRoZSB0cmFuc2l0aW9uIG1pZ2h0IHN0aWxsIGJlIG5vbi1kZWZhdWx0LlxuICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0udmFsdWUgPSBuZXcgUHJvcGVydHlWYWx1ZSh0aGlzLl92YWx1ZXNbbmFtZV0ucHJvcGVydHksIHZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogY2xvbmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICBnZXRUcmFuc2l0aW9uPFM6IHN0cmluZz4obmFtZTogUyk6IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uIHwgdm9pZCB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLl92YWx1ZXNbbmFtZV0udHJhbnNpdGlvbik7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNpdGlvbjxTOiBzdHJpbmc+KG5hbWU6IFMsIHZhbHVlOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbiB8IHZvaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl92YWx1ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0udHJhbnNpdGlvbiA9IGNsb25lKHZhbHVlKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IHRoaXMuZ2V0VHJhbnNpdGlvbihwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAodHJhbnNpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2Ake3Byb3BlcnR5fS10cmFuc2l0aW9uYF0gPSB0cmFuc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvbmVkKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzLCBwcmlvcjogVHJhbnNpdGlvbmluZzxQcm9wcz4pOiBUcmFuc2l0aW9uaW5nPFByb3BzPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUcmFuc2l0aW9uaW5nKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS50cmFuc2l0aW9uZWQocGFyYW1ldGVycywgcHJpb3IuX3ZhbHVlc1twcm9wZXJ0eV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdW50cmFuc2l0aW9uZWQoKTogVHJhbnNpdGlvbmluZzxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVHJhbnNpdGlvbmluZyh0aGlzLl9wcm9wZXJ0aWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5fdmFsdWVzW3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc1twcm9wZXJ0eV0udW50cmFuc2l0aW9uZWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLSBUcmFuc2l0aW9uaW5nIC0tLS0tLS1cblxuLyoqXG4gKiBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgIGltcGxlbWVudHMgdGhlIGZpcnN0IG9mIHR3byBpbnRlcm1lZGlhdGUgc3RlcHMgaW4gdGhlIGV2YWx1YXRpb24gY2hhaW4gb2YgYSBwYWludFxuICogcHJvcGVydHkgdmFsdWUuIEluIHRoaXMgc3RlcCwgdHJhbnNpdGlvbnMgYmV0d2VlbiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGhhbmRsZWQ6IGFzIGxvbmcgYXMgdGhlIHRyYW5zaXRpb24gaXMgaW5cbiAqIHByb2dyZXNzLCBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgIG1haW50YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgcHJpb3IgdmFsdWUsIGFuZCBpbnRlcnBvbGF0ZXMgYmV0d2VlbiBpdCBhbmRcbiAqIHRoZSBuZXcgdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIGNvbmZpZ3VyZWQgdHJhbnNpdGlvbiBkdXJhdGlvbiBhbmQgZGVsYXkuIFRoZSBwcm9kdWN0IGlzIHRoZSBuZXh0XG4gKiBzdGVwIGluIHRoZSBldmFsdWF0aW9uIGNoYWluOiB0aGUgXCJwb3NzaWJseSBldmFsdWF0ZWRcIiByZXN1bHQgdHlwZSBgUmAuIFNlZSBiZWxvdyBmb3IgbW9yZSBvbiB0aGlzIGNvbmNlcHQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgIHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPjtcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPjtcbiAgICBwcmlvcjogP1RyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+O1xuICAgIGJlZ2luOiBUaW1lUG9pbnQ7XG4gICAgZW5kOiBUaW1lUG9pbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj4sXG4gICAgICAgICAgICAgICAgdmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4sXG4gICAgICAgICAgICAgICAgcHJpb3I6ID9UcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPixcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbixcbiAgICAgICAgICAgICAgICBub3c6IFRpbWVQb2ludCkge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5iZWdpbiA9IG5vdyArIHRyYW5zaXRpb24uZGVsYXkgfHwgMDtcbiAgICAgICAgdGhpcy5lbmQgPSB0aGlzLmJlZ2luICsgdHJhbnNpdGlvbi5kdXJhdGlvbiB8fCAwO1xuICAgICAgICBpZiAocHJvcGVydHkuc3BlY2lmaWNhdGlvbi50cmFuc2l0aW9uICYmICh0cmFuc2l0aW9uLmRlbGF5IHx8IHRyYW5zaXRpb24uZHVyYXRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLnByaW9yID0gcHJpb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogUiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IHBhcmFtZXRlcnMubm93IHx8IDA7XG4gICAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSB0aGlzLnZhbHVlLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIGNvbnN0IHByaW9yID0gdGhpcy5wcmlvcjtcbiAgICAgICAgaWYgKCFwcmlvcikge1xuICAgICAgICAgICAgLy8gTm8gcHJpb3IgdmFsdWUuXG4gICAgICAgICAgICByZXR1cm4gZmluYWxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChub3cgPiB0aGlzLmVuZCkge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBmcm9tIHByaW9yIHZhbHVlIGlzIG5vdyBjb21wbGV0ZS5cbiAgICAgICAgICAgIHRoaXMucHJpb3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pc0RhdGFEcml2ZW4oKSkge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbnMgdG8gZGF0YS1kcml2ZW4gcHJvcGVydGllcyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICAgIC8vIFdlIHNuYXAgaW1tZWRpYXRlbHkgdG8gdGhlIGRhdGEtZHJpdmVuIHZhbHVlIHNvIHRoYXQsIHdoZW4gd2UgcGVyZm9ybSBsYXlvdXQsXG4gICAgICAgICAgICAvLyB3ZSBzZWUgdGhlIGRhdGEtZHJpdmVuIGZ1bmN0aW9uIGFuZCBjYW4gdXNlIGl0IHRvIHBvcHVsYXRlIHZlcnRleCBidWZmZXJzLlxuICAgICAgICAgICAgdGhpcy5wcmlvciA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZmluYWxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChub3cgPCB0aGlzLmJlZ2luKSB7XG4gICAgICAgICAgICAvLyBUcmFuc2l0aW9uIGhhc24ndCBzdGFydGVkIHlldC5cbiAgICAgICAgICAgIHJldHVybiBwcmlvci5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGUgYmV0d2VlbiByZWN1cnNpdmVseS1jYWxjdWxhdGVkIHByaW9yIHZhbHVlIGFuZCBmaW5hbC5cbiAgICAgICAgICAgIGNvbnN0IHQgPSAobm93IC0gdGhpcy5iZWdpbikgLyAodGhpcy5lbmQgLSB0aGlzLmJlZ2luKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LmludGVycG9sYXRlKHByaW9yLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyksIGZpbmFsVmFsdWUsIGVhc2VDdWJpY0luT3V0KHQpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnR5cGUgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzPFByb3BzOiBPYmplY3Q+XG4gICAgPSAkRXhhY3Q8JE9iak1hcDxQcm9wcywgPFQsIFI+KHA6IFByb3BlcnR5PFQsIFI+KSA9PiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogYFRyYW5zaXRpb25pbmdgIHN0b3JlcyBhIG1hcCBvZiBhbGwgKHByb3BlcnR5IG5hbWUsIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZWApIHBhaXJzIGZvciBwYWludCBwcm9wZXJ0aWVzIG9mIGFcbiAqIGdpdmVuIGxheWVyIHR5cGUuIEl0IGNhbiBjYWxjdWxhdGUgdGhlIHBvc3NpYmx5LWV2YWx1YXRlZCB2YWx1ZXMgZm9yIGFsbCBvZiB0aGVtIGF0IG9uY2UsIHByb2R1Y2luZyBhXG4gKiBgUG9zc2libHlFdmFsdWF0ZWRgIGluc3RhbmNlIGZvciB0aGUgc2FtZSBzZXQgb2YgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvbmluZzxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogUG9zc2libHlFdmFsdWF0ZWQ8UHJvcHM+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFBvc3NpYmx5RXZhbHVhdGVkKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wcmlvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gTGF5b3V0IC0tLS0tLS1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUHJvcGVydHlWYWx1ZTxULCBSPmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBQcm9wZXJ0eVZhbHVlczxQcm9wczogT2JqZWN0PlxuICAgID0gJEV4YWN0PCRPYmpNYXA8UHJvcHMsIDxULCBSPihwOiBQcm9wZXJ0eTxULCBSPikgPT4gUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogQmVjYXVzZSBsYXlvdXQgcHJvcGVydGllcyBhcmUgbm90IHRyYW5zaXRpb25hYmxlLCB0aGV5IGhhdmUgYSBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIGFuZCBldmFsdWF0aW9uIGNoYWluIHRoYW5cbiAqIHBhaW50IHByb3BlcnRpZXM6IGBQcm9wZXJ0eVZhbHVlYHMgYXJlIHBvc3NpYmx5IGV2YWx1YXRlZCwgcHJvZHVjaW5nIHBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZXMsIHdoaWNoIGFyZSB0aGVuXG4gKiBmdWxseSBldmFsdWF0ZWQuXG4gKlxuICogYExheW91dGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFByb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXlvdXQ8UHJvcHM6IE9iamVjdD4ge1xuICAgIF9wcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPjtcbiAgICBfdmFsdWVzOiBQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldFZhbHVlPFM6IHN0cmluZz4obmFtZTogUykge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5fdmFsdWVzW25hbWVdLnZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZTxTOiBzdHJpbmc+KG5hbWU6IFMsIHZhbHVlOiAqKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHRoaXMuX3ZhbHVlc1tuYW1lXS5wcm9wZXJ0eSwgdmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBjbG9uZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogUG9zc2libHlFdmFsdWF0ZWQ8UHJvcHM+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFBvc3NpYmx5RXZhbHVhdGVkKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tIFBvc3NpYmx5RXZhbHVhdGVkIC0tLS0tLS1cblxuLyoqXG4gKiBcIlBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZVwiIGlzIGFuIGludGVybWVkaWF0ZSBzdGFnZSBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbiBmb3IgYm90aCBwYWludCBhbmQgbGF5b3V0IHByb3BlcnR5XG4gKiB2YWx1ZXMuIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3RhZ2UgaXMgdG8gb3B0aW1pemUgYXdheSB1bm5lY2Vzc2FyeSByZWNhbGN1bGF0aW9ucyBmb3IgZGF0YS1kcml2ZW4gcHJvcGVydGllcy4gQ29kZVxuICogd2hpY2ggdXNlcyBkYXRhLWRyaXZlbiBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBhc3N1bWUgdGhhdCB0aGUgdmFsdWUgaXMgZGVwZW5kZW50IG9uIGZlYXR1cmUgZGF0YSwgYW5kIHJlcXVlc3QgdGhhdCBpdFxuICogYmUgZXZhbHVhdGVkIGZvciBlYWNoIGZlYXR1cmUuIEJ1dCB3aGVuIHRoYXQgcHJvcGVydHkgdmFsdWUgaXMgaW4gZmFjdCBhIGNvbnN0YW50IG9yIGNhbWVyYSBmdW5jdGlvbiwgdGhlIGNhbGN1bGF0aW9uXG4gKiB3aWxsIG5vdCBhY3R1YWxseSBkZXBlbmQgb24gdGhlIGZlYXR1cmUsIGFuZCB3ZSBjYW4gYmVuZWZpdCBmcm9tIHJldHVybmluZyB0aGUgcHJpb3IgcmVzdWx0IG9mIGhhdmluZyBkb25lIHRoZVxuICogZXZhbHVhdGlvbiBvbmNlLCBhaGVhZCBvZiB0aW1lLCBpbiBhbiBpbnRlcm1lZGlhdGUgc3RlcCB3aG9zZSBpbnB1dHMgYXJlIGp1c3QgdGhlIHZhbHVlIGFuZCBcImdsb2JhbFwiIHBhcmFtZXRlcnNcbiAqIHN1Y2ggYXMgY3VycmVudCB6b29tIGxldmVsLlxuICpcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCByZXByZXNlbnRzIHRoZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyBvZiB0aGlzIHN0ZXA6IGlmIHRoZSBpbnB1dCB2YWx1ZSB3YXMgYSBjb25zdGFudCBvclxuICogY2FtZXJhIGV4cHJlc3Npb24sIHRoZW4gdGhlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgcmVzdWx0IGlzIGEgY29uc3RhbnQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGlucHV0IHZhbHVlIHdhcyBlaXRoZXJcbiAqIGEgc291cmNlIG9yIGNvbXBvc2l0ZSBleHByZXNzaW9uLCBhbmQgd2UgbXVzdCBkZWZlciBmaW5hbCBldmFsdWF0aW9uIHVudGlsIHN1cHBsaWVkIGEgZmVhdHVyZS4gV2Ugc2VwYXJhdGVcbiAqIHRoZSBzb3VyY2UgYW5kIGNvbXBvc2l0ZSBjYXNlcyBiZWNhdXNlIHRoZXkgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgd2hlbiBnZW5lcmF0aW5nIEdMIGF0dHJpYnV0ZXMsIGJ1ZmZlcnMsIGFuZFxuICogdW5pZm9ybXMuXG4gKlxuICogTm90ZSB0aGF0IGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCAoYW5kIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgLCBiZWxvdykgYXJlIF9ub3RfIHVzZWQgZm9yIHByb3BlcnRpZXMgdGhhdFxuICogZG8gbm90IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcy4gRm9yIHN1Y2ggcHJvcGVydGllcywgd2Uga25vdyB0aGF0IHRoZSBcInBvc3NpYmx5IGV2YWx1YXRlZFwiIHJlc3VsdCBpcyBhbHdheXMgYSBjb25zdGFudFxuICogc2NhbGFyIHZhbHVlLiBTZWUgYmVsb3cuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+ID1cbiAgICB8IHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogVH1cbiAgICB8IFNvdXJjZUV4cHJlc3Npb25cbiAgICB8IENvbXBvc2l0ZUV4cHJlc3Npb247XG5cbi8qKlxuICogYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAgaXMgdXNlZCBmb3IgZGF0YS1kcml2ZW4gcGFpbnQgYW5kIGxheW91dCBwcm9wZXJ0eSB2YWx1ZXMuIEl0IGhvbGRzIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCBhbmQgdGhlIGBHbG9iYWxQcm9wZXJ0aWVzYCB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSBpdC4gWW91J3JlIG5vdCBhbGxvd2VkIHRvIHN1cHBseVxuICogYSBkaWZmZXJlbnQgc2V0IG9mIGBHbG9iYWxQcm9wZXJ0aWVzYCB3aGVuIHBlcmZvcm1pbmcgdGhlIGZpbmFsIGV2YWx1YXRpb24gYmVjYXVzZSB0aGV5IHdvdWxkIGJlIGlnbm9yZWQgaW4gdGhlXG4gKiBjYXNlIHdoZXJlIHRoZSBpbnB1dCB2YWx1ZSB3YXMgYSBjb25zdGFudCBvciBjYW1lcmEgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPiB7XG4gICAgcHJvcGVydHk6IERhdGFEcml2ZW5Qcm9wZXJ0eTxUPjtcbiAgICB2YWx1ZTogUG9zc2libHlFdmFsdWF0ZWRWYWx1ZTxUPjtcbiAgICBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycztcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBEYXRhRHJpdmVuUHJvcGVydHk8VD4sIHZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICB9XG5cbiAgICBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnO1xuICAgIH1cblxuICAgIGNvbnN0YW50T3IodmFsdWU6IFQpOiBUIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5ldmFsdWF0ZSh0aGlzLnZhbHVlLCB0aGlzLnBhcmFtZXRlcnMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIHR5cGU6IGdpdmVuIGFuIG9iamVjdCB0eXBlIGBQcm9wZXJ0aWVzYCB3aG9zZSB2YWx1ZXMgYXJlIGVhY2ggb2YgdHlwZSBgUHJvcGVydHk8VCwgUj5gLCBpdCBjYWxjdWxhdGVzXG4gKiBhbiBvYmplY3QgdHlwZSB3aXRoIHRoZSBzYW1lIGtleXMsIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUmAuXG4gKlxuICogRm9yIHByb3BlcnRpZXMgdGhhdCBkb24ndCBhbGxvdyBkYXRhLWRyaXZlbiB2YWx1ZXMsIGBSYCBpcyBhIHNjYWxhciB0eXBlIHN1Y2ggYXMgYG51bWJlcmAsIGBzdHJpbmdgLCBvciBgQ29sb3JgLlxuICogRm9yIGRhdGEtZHJpdmVuIHByb3BlcnRpZXMsIGl0IGlzIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgLiBDcml0aWNhbGx5LCB0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgc2V0IHVwXG4gKiBpbiBhIHdheSB0aGF0IGFsbG93cyBmbG93IHRvIGtub3cgd2hpY2ggb2YgdGhlc2UgdHdvIGNhc2VzIGFwcGxpZXMgZm9yIGFueSBnaXZlbiBwcm9wZXJ0eSBuYW1lLCBhbmQgaWYgeW91IGF0dGVtcHRcbiAqIHRvIHVzZSBhIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgIGFzIGlmIGl0IHdhcyBhIHNjYWxhciwgb3IgdmljZSB2ZXJzYSwgeW91IHdpbGwgZ2V0IGEgdHlwZSBlcnJvci4gKEhvd2V2ZXIsXG4gKiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjYXNlIGluIHdoaWNoIGZsb3cgZmFpbHMgdG8gcHJvZHVjZSBhIHR5cGUgZXJyb3IgdGhhdCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mOiBpbiBhIGNvbnRleHQgc3VjaFxuICogYXMgYGxheWVyLnBhaW50LmdldCgnZm9vLW9wYWNpdHknKSA9PT0gMGAsIGlmIGBmb28tb3BhY2l0eWAgaXMgZGF0YS1kcml2ZW4sIHRoYW4gdGhlIGxlZnQtaGFuZCBzaWRlIGlzIG9mIHR5cGVcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPmAsIGJ1dCBmbG93IHdpbGwgbm90IGNvbXBsYWluIGFib3V0IGNvbXBhcmluZyB0aGlzIHRvIGEgbnVtYmVyIHVzaW5nIGA9PT1gLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yMzU5LilcbiAqXG4gKiBUaGVyZSdzIGFsc28gYSB0aGlyZCwgc3BlY2lhbCBjYXNlIHBvc3NpYmxpdHkgZm9yIGBSYDogZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIGl0J3MgYD9Dcm9zc0ZhZGVkPFQ+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFByb3BzLCA8VCwgUj4ocDogUHJvcGVydHk8VCwgUj4pID0+IFI+PlxuXG4vKipcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFJgKSBwYWlycyBmb3IgcGFpbnQgb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3NzaWJseUV2YWx1YXRlZDxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4pIHtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IChPYmplY3QuY3JlYXRlKHByb3BlcnRpZXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBnZXQ8Uzogc3RyaW5nPihuYW1lOiBTKTogJEVsZW1lbnRUeXBlPFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+LCBTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNbbmFtZV07XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIHByb3BlcnRpZXMgdGhhdCBkbyBub3QgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoaXMgcmVzdHJpY3Rpb24gYWxsb3dzIHVzIHRvIGRlY2xhcmUgc3RhdGljYWxseSB0aGF0IHRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHlcbiAqIGlzIGluIGZhY3QgYWx3YXlzIHRoZSBzY2FsYXIgdHlwZSBgVGAsIGFuZCBjYW4gYmUgdXNlZCB3aXRob3V0IGZ1cnRoZXIgZXZhbHVhdGluZyB0aGUgdmFsdWUgb24gYSBwZXItZmVhdHVyZSBiYXNpcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNvbnN0YW50UHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCBUPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgVD4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogVCB7XG4gICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICByZXR1cm4gdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBULCBiOiBULCB0OiBudW1iZXIpOiBUIHtcbiAgICAgICAgY29uc3QgaW50ZXJwOiA/KGE6IFQsIGI6IFQsIHQ6IG51bWJlcikgPT4gVCA9IChpbnRlcnBvbGF0ZTogYW55KVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICAgIGlmIChpbnRlcnApIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcnAoYSwgYiwgdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciBwcm9wZXJ0aWVzIHRoYXQgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHkgaXMgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPmA7IG9idGFpbmluZ1xuICogYSBzY2FsYXIgdmFsdWUgYFRgIHJlcXVpcmVzIGZ1cnRoZXIgZXZhbHVhdGlvbiBvbiBhIHBlci1mZWF0dXJlIGJhc2lzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhRHJpdmVuUHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcbiAgICBvdmVycmlkZXM6ID9PYmplY3Q7XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbiwgb3ZlcnJpZGVzPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIHRoaXMub3ZlcnJpZGVzID0gb3ZlcnJpZGVzO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+PiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4ge1xuICAgICAgICBpZiAodmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY29uc3RhbnQnIHx8IHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NhbWVyYScpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKX0sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywgdmFsdWUuZXhwcmVzc2lvbiwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4sXG4gICAgICAgICAgICAgICAgYjogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+LFxuICAgICAgICAgICAgICAgIHQ6IG51bWJlcik6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPiB7XG4gICAgICAgIC8vIElmIGVpdGhlciBwb3NzaWJseS1ldmFsdWF0ZWQgdmFsdWUgaXMgbm9uLWNvbnN0YW50LCBnaXZlIHVwOiB3ZSBhcmVuJ3QgYWJsZSB0byBpbnRlcnBvbGF0ZSBkYXRhLWRyaXZlbiB2YWx1ZXMuXG4gICAgICAgIGlmIChhLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHwgYi52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBoYWNrIHNvbGVseSBmb3IgZmlsbC1vdXRsaW5lLWNvbG9yLiBUaGUgdW5kZWZpbmVkIHZhbHVlIGlzIHN1YnNlcXVlbnRseSBoYW5kbGVkIGluXG4gICAgICAgIC8vIEZpbGxTdHlsZUxheWVyI3JlY2FsY3VsYXRlLCB3aGljaCBzZXRzIGZpbGwtb3V0bGluZS1jb2xvciB0byB0aGUgZmlsbC1jb2xvciB2YWx1ZSBpZiB0aGUgZm9ybWVyXG4gICAgICAgIC8vIGlzIGEgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlIGNvbnRhaW5pbmcgYSBjb25zdGFudCB1bmRlZmluZWQgdmFsdWUuIEluIGFkZGl0aW9uIHRvIHRoZVxuICAgICAgICAvLyByZXR1cm4gdmFsdWUgaGVyZSwgdGhlIG90aGVyIHNvdXJjZSBvZiBhIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSBjb250YWluaW5nIGEgY29uc3RhbnRcbiAgICAgICAgLy8gdW5kZWZpbmVkIHZhbHVlIGlzIHRoZSBcImRlZmF1bHQgdmFsdWVcIiBmb3IgZmlsbC1vdXRsaW5lLWNvbG9yIGhlbGQgaW5cbiAgICAgICAgLy8gYFByb3BlcnRpZXMjZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzYCwgd2hpY2ggc2VydmVzIGFzIHRoZSBwcm90b3R5cGUgb2ZcbiAgICAgICAgLy8gYFBvc3NpYmx5RXZhbHVhdGVkI192YWx1ZXNgLlxuICAgICAgICBpZiAoYS52YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGIudmFsdWUudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiAodW5kZWZpbmVkOiBhbnkpfSwgYS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVycDogPyhhOiBULCBiOiBULCB0OiBudW1iZXIpID0+IFQgPSAoaW50ZXJwb2xhdGU6IGFueSlbdGhpcy5zcGVjaWZpY2F0aW9uLnR5cGVdO1xuICAgICAgICBpZiAoaW50ZXJwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IGludGVycChhLnZhbHVlLnZhbHVlLCBiLnZhbHVlLnZhbHVlLCB0KX0sIGEucGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2YWx1YXRlKHZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUpOiBUIHtcbiAgICAgICAgaWYgKHZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5ldmFsdWF0ZShwYXJhbWV0ZXJzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yICBkYXRhIGRyaXZlbiBgbGluZS1wYXR0ZXJuYCB3aGljaCBhcmUgdHJhbnNpdGlvbmVkIGJ5IGNyb3NzLWZhZGluZ1xuICogcmF0aGVyIHRoYW4gaW50ZXJwb2xhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjbGFzcyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5PFQ+IGV4dGVuZHMgRGF0YURyaXZlblByb3BlcnR5PD9Dcm9zc0ZhZGVkPFQ+PiB7XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlOiBQcm9wZXJ0eVZhbHVlPD9Dcm9zc0ZhZGVkPFQ+LCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8P0Nyb3NzRmFkZWQ8VD4+PiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8P0Nyb3NzRmFkZWQ8VD4+IHtcbiAgICAgICAgaWYgKHZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogdW5kZWZpbmVkfSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBjb25zdGFudFZhbHVlID0gdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0YW50ID0gdGhpcy5fY2FsY3VsYXRlKGNvbnN0YW50VmFsdWUsIGNvbnN0YW50VmFsdWUsIGNvbnN0YW50VmFsdWUsIHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiBjb25zdGFudH0sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NhbWVyYScpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYVZhbCA9IHRoaXMuX2NhbGN1bGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogcGFyYW1ldGVycy56b29tIC0gMS4wfSksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHBhcmFtZXRlcnMuem9vbX0pLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiBwYXJhbWV0ZXJzLnpvb20gKyAxLjB9KSxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IGNhbWVyYVZhbH0sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc291cmNlIG9yIGNvbXBvc2l0ZSBleHByZXNzaW9uXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB2YWx1ZS5leHByZXNzaW9uLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2YWx1YXRlKHZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPD9Dcm9zc0ZhZGVkPFQ+PiwgZ2xvYmFsczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGZlYXR1cmU6IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlKTogP0Nyb3NzRmFkZWQ8VD4ge1xuICAgICAgICBpZiAodmFsdWUua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0YW50ID0gdmFsdWUuZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUoY29uc3RhbnQsIGNvbnN0YW50LCBjb25zdGFudCwgZ2xvYmFscyk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUoXG4gICAgICAgICAgICAgICAgdmFsdWUuZXZhbHVhdGUoe3pvb206IE1hdGguZmxvb3IoZ2xvYmFscy56b29tKSAtIDEuMH0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSksXG4gICAgICAgICAgICAgICAgdmFsdWUuZXZhbHVhdGUoe3pvb206IE1hdGguZmxvb3IoZ2xvYmFscy56b29tKX0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSksXG4gICAgICAgICAgICAgICAgdmFsdWUuZXZhbHVhdGUoe3pvb206IE1hdGguZmxvb3IoZ2xvYmFscy56b29tKSArIDEuMH0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSksXG4gICAgICAgICAgICAgICAgZ2xvYmFscyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlKG1pbjogVCwgbWlkOiBULCBtYXg6IFQsIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogQ3Jvc3NGYWRlZDxUPiB7XG4gICAgICAgIGNvbnN0IHogPSBwYXJhbWV0ZXJzLnpvb207XG4gICAgICAgIHJldHVybiB6ID4gcGFyYW1ldGVycy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gPyB7IGZyb206IG1pbiwgdG86IG1pZCB9IDogeyBmcm9tOiBtYXgsIHRvOiBtaWQgfTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8P0Nyb3NzRmFkZWQ8VD4+KTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPD9Dcm9zc0ZhZGVkPFQ+PiB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFByb3BlcnR5YCBmb3IgYCotcGF0dGVybmAgYW5kIGBsaW5lLWRhc2hhcnJheWAsIHdoaWNoIGFyZSB0cmFuc2l0aW9uZWQgYnkgY3Jvc3MtZmFkaW5nXG4gKiByYXRoZXIgdGhhbiBpbnRlcnBvbGF0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZhZGVkUHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCA/Q3Jvc3NGYWRlZDxUPj4ge1xuICAgIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuXG4gICAgY29uc3RydWN0b3Ioc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsID9Dcm9zc0ZhZGVkPFQ+PiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiA/Q3Jvc3NGYWRlZDxUPiB7XG4gICAgICAgIGlmICh2YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnQgPSB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShjb25zdGFudCwgY29uc3RhbnQsIGNvbnN0YW50LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSAtIDEuMCksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSArIDEuMCksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxjdWxhdGUobWluOiBULCBtaWQ6IFQsIG1heDogVCwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiA/Q3Jvc3NGYWRlZDxUPiB7XG4gICAgICAgIGNvbnN0IHogPSBwYXJhbWV0ZXJzLnpvb207XG4gICAgICAgIHJldHVybiB6ID4gcGFyYW1ldGVycy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gPyB7IGZyb206IG1pbiwgdG86IG1pZCB9IDogeyBmcm9tOiBtYXgsIHRvOiBtaWQgfTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiA/Q3Jvc3NGYWRlZDxUPik6ID9Dcm9zc0ZhZGVkPFQ+IHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIGBoZWF0bWFwLWNvbG9yYCBhbmQgYGxpbmUtZ3JhZGllbnRgLiBJbnRlcnBvbGF0aW9uIGlzIGEgbm8tb3AsIGFuZFxuICogZXZhbHVhdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbiBvcmRlciB0byBpbmRpY2F0ZSBpdHMgcHJlc2VuY2UsIGJ1dCB0aGUgcmVhbFxuICogZXZhbHVhdGlvbiBoYXBwZW5zIGluIFN0eWxlTGF5ZXIgY2xhc3Nlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjbGFzcyBDb2xvclJhbXBQcm9wZXJ0eSBpbXBsZW1lbnRzIFByb3BlcnR5PENvbG9yLCBib29sZWFuPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8Q29sb3IsIGJvb2xlYW4+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIGludGVycG9sYXRlKCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cbn1cblxuLyoqXG4gKiBgUHJvcGVydGllc2AgaG9sZHMgb2JqZWN0cyBjb250YWluaW5nIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgbGF5b3V0IG9yIHBhaW50IHByb3BlcnR5IHNldCBvZiBhIGdpdmVuXG4gKiBsYXllciB0eXBlLiBUaGVzZSBvYmplY3RzIGFyZSBpbW11dGFibGUsIGFuZCB0aGV5IGFyZSB1c2VkIGFzIHRoZSBwcm90b3R5cGVzIGZvciB0aGUgYF92YWx1ZXNgIG1lbWJlcnMgb2ZcbiAqIGBUcmFuc2l0aW9uYWJsZWAsIGBUcmFuc2l0aW9uaW5nYCwgYExheW91dGAsIGFuZCBgUG9zc2libHlFdmFsdWF0ZWRgLiBUaGlzIGFsbG93cyB0aGVzZSBjbGFzc2VzIHRvIGF2b2lkXG4gKiBkb2luZyB3b3JrIGluIHRoZSBjb21tb24gY2FzZSB3aGVyZSBhIHByb3BlcnR5IGhhcyBubyBleHBsaWNpdCB2YWx1ZSBzZXQgYW5kIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIHRha2VcbiAqIG9uIHRoZSBkZWZhdWx0IHZhbHVlOiB1c2luZyBgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKWAsIHRoZXkgY2FuIGl0ZXJhdGUgb3ZlclxuICogb25seSB0aGUgX293bl8gcHJvcGVydGllcyBvZiBgX3ZhbHVlc2AsIHNraXBwaW5nIHJlcGVhdGVkIGNhbGN1bGF0aW9uIG9mIHRyYW5zaXRpb25zIGFuZCBwb3NzaWJsZS9maW5hbFxuICogZXZhbHVhdGlvbnMgZm9yIGRlZmF1bHRzLCB0aGUgcmVzdWx0IG9mIHdoaWNoIHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0aWVzPFByb3BzOiBPYmplY3Q+IHtcbiAgICBwcm9wZXJ0aWVzOiBQcm9wcztcbiAgICBkZWZhdWx0UHJvcGVydHlWYWx1ZXM6IFByb3BlcnR5VmFsdWVzPFByb3BzPjtcbiAgICBkZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlczogVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG4gICAgZGVmYXVsdFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlczogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzPFByb3BzPjtcbiAgICBkZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXM6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuICAgIG92ZXJyaWRhYmxlUHJvcGVydGllczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6IFByb3BzKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuZGVmYXVsdFByb3BlcnR5VmFsdWVzID0gKHt9OiBhbnkpO1xuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzID0gKHt9OiBhbnkpO1xuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXMgPSAoe306IGFueSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzID0gKHt9OiBhbnkpO1xuICAgICAgICB0aGlzLm92ZXJyaWRhYmxlUHJvcGVydGllcyA9IChbXTogYW55KTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wZXJ0aWVzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChwcm9wLnNwZWNpZmljYXRpb24ub3ZlcnJpZGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJyaWRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQcm9wZXJ0eVZhbHVlID0gdGhpcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZShwcm9wLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZSA9IHRoaXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBuZXcgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlKHByb3ApO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzW3Byb3BlcnR5XSA9XG4gICAgICAgICAgICAgICAgZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZS51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBkZWZhdWx0UHJvcGVydHlWYWx1ZS5wb3NzaWJseUV2YWx1YXRlKCh7fTogYW55KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdEYXRhRHJpdmVuUHJvcGVydHknLCBEYXRhRHJpdmVuUHJvcGVydHkpO1xucmVnaXN0ZXIoJ0RhdGFDb25zdGFudFByb3BlcnR5JywgRGF0YUNvbnN0YW50UHJvcGVydHkpO1xucmVnaXN0ZXIoJ0Nyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHknLCBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KTtcbnJlZ2lzdGVyKCdDcm9zc0ZhZGVkUHJvcGVydHknLCBDcm9zc0ZhZGVkUHJvcGVydHkpO1xucmVnaXN0ZXIoJ0NvbG9yUmFtcFByb3BlcnR5JywgQ29sb3JSYW1wUHJvcGVydHkpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgZW5kc1dpdGgsIGZpbHRlck9iamVjdCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0JztcbmltcG9ydCB7XG4gICAgdmFsaWRhdGVTdHlsZSxcbiAgICB2YWxpZGF0ZUxheW91dFByb3BlcnR5LFxuICAgIHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSxcbiAgICBlbWl0VmFsaWRhdGlvbkVycm9yc1xufSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlJztcbmltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHsgTGF5b3V0LCBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUHJvcGVydGllcywgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVTdGF0ZSB9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7QnVja2V0fSBmcm9tICcuLi9kYXRhL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtGZWF0dXJlRmlsdGVyfSBmcm9tICcuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyJztcbmltcG9ydCB0eXBlIHtUcmFuc2l0aW9uUGFyYW1ldGVycywgUHJvcGVydHlWYWx1ZX0gZnJvbSAnLi9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25QYXJhbWV0ZXJzLCB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge1xuICAgIExheWVyU3BlY2lmaWNhdGlvbixcbiAgICBGaWx0ZXJTcGVjaWZpY2F0aW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuaW1wb3J0IHR5cGUge0N1c3RvbUxheWVySW50ZXJmYWNlfSBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcbmltcG9ydCB0eXBlIHtTdHlsZVNldHRlck9wdGlvbnN9IGZyb20gJy4vc3R5bGUnO1xuXG5jb25zdCBUUkFOU0lUSU9OX1NVRkZJWCA9ICctdHJhbnNpdGlvbic7XG5cbmNsYXNzIFN0eWxlTGF5ZXIgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBtaXhlZDtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmc7XG4gICAgc291cmNlTGF5ZXI6ID9zdHJpbmc7XG4gICAgbWluem9vbTogP251bWJlcjtcbiAgICBtYXh6b29tOiA/bnVtYmVyO1xuICAgIGZpbHRlcjogRmlsdGVyU3BlY2lmaWNhdGlvbiB8IHZvaWQ7XG4gICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnIHwgJ25vbmUnIHwgdm9pZDtcbiAgICBfY3Jvc3NmYWRlUGFyYW1ldGVyczogQ3Jvc3NmYWRlUGFyYW1ldGVycztcblxuICAgIF91bmV2YWx1YXRlZExheW91dDogTGF5b3V0PGFueT47XG4gICAgK2xheW91dDogbWl4ZWQ7XG5cbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8YW55PjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPGFueT47XG4gICAgK3BhaW50OiBtaXhlZDtcblxuICAgIF9mZWF0dXJlRmlsdGVyOiBGZWF0dXJlRmlsdGVyO1xuXG4gICAgK3F1ZXJ5UmFkaXVzOiAoYnVja2V0OiBCdWNrZXQpID0+IG51bWJlcjtcbiAgICArcXVlcnlJbnRlcnNlY3RzRmVhdHVyZTogKHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXkpID0+IGJvb2xlYW4gfCBudW1iZXI7XG5cbiAgICArb25BZGQ6ID8obWFwOiBNYXApID0+IHZvaWQ7XG4gICAgK29uUmVtb3ZlOiA/KG1hcDogTWFwKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbiB8IEN1c3RvbUxheWVySW50ZXJmYWNlLCBwcm9wZXJ0aWVzOiAkUmVhZE9ubHk8e2xheW91dD86IFByb3BlcnRpZXM8Kj4sIHBhaW50PzogUHJvcGVydGllczwqPn0+KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5pZCA9IGxheWVyLmlkO1xuICAgICAgICB0aGlzLnR5cGUgPSBsYXllci50eXBlO1xuICAgICAgICB0aGlzLl9mZWF0dXJlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcblxuICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2N1c3RvbScpIHJldHVybjtcblxuICAgICAgICBsYXllciA9ICgobGF5ZXI6IGFueSk6IExheWVyU3BlY2lmaWNhdGlvbik7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IGxheWVyLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSBsYXllci5taW56b29tO1xuICAgICAgICB0aGlzLm1heHpvb20gPSBsYXllci5tYXh6b29tO1xuXG4gICAgICAgIGlmIChsYXllci50eXBlICE9PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbGF5ZXIuc291cmNlO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VMYXllciA9IGxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gbGF5ZXIuZmlsdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnRpZXMubGF5b3V0KSB7XG4gICAgICAgICAgICB0aGlzLl91bmV2YWx1YXRlZExheW91dCA9IG5ldyBMYXlvdXQocHJvcGVydGllcy5sYXlvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnRpZXMucGFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQgPSBuZXcgVHJhbnNpdGlvbmFibGUocHJvcGVydGllcy5wYWludCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gbGF5ZXIucGFpbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBhaW50UHJvcGVydHkocHJvcGVydHksIGxheWVyLnBhaW50W3Byb3BlcnR5XSwge3ZhbGlkYXRlOiBmYWxzZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsYXllci5sYXlvdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldExheW91dFByb3BlcnR5KHByb3BlcnR5LCBsYXllci5sYXlvdXRbcHJvcGVydHldLCB7dmFsaWRhdGU6IGZhbHNlfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudW50cmFuc2l0aW9uZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENyb3NzZmFkZVBhcmFtZXRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jcm9zc2ZhZGVQYXJhbWV0ZXJzO1xuICAgIH1cblxuICAgIGdldExheW91dFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3Zpc2liaWxpdHknKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpYmlsaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LmdldFZhbHVlKG5hbWUpO1xuICAgIH1cblxuICAgIHNldExheW91dFByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGBsYXllcnMuJHt0aGlzLmlkfS5sYXlvdXQuJHtuYW1lfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVMYXlvdXRQcm9wZXJ0eSwga2V5LCBuYW1lLCB2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZSA9PT0gJ3Zpc2liaWxpdHknKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2liaWxpdHkgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRQYWludFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRUcmFuc2l0aW9uKG5hbWUuc2xpY2UoMCwgLVRSQU5TSVRJT05fU1VGRklYLmxlbmd0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuZ2V0VmFsdWUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRQYWludFByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IG1peGVkLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGxheWVycy4ke3RoaXMuaWR9LnBhaW50LiR7bmFtZX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSwga2V5LCBuYW1lLCB2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSwgKHZhbHVlOiBhbnkpIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uYWJsZSA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ3Jvc3NGYWRlZFByb3BlcnR5ID0gdHJhbnNpdGlvbmFibGUucHJvcGVydHkuc3BlY2lmaWNhdGlvbltcInByb3BlcnR5LXR5cGVcIl0gPT09ICdjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbic7XG4gICAgICAgICAgICBjb25zdCB3YXNEYXRhRHJpdmVuID0gdHJhbnNpdGlvbmFibGUudmFsdWUuaXNEYXRhRHJpdmVuKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRyYW5zaXRpb25hYmxlLnZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWUpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzRGF0YURyaXZlbiA9IG5ld1ZhbHVlLmlzRGF0YURyaXZlbigpO1xuXG4gICAgICAgICAgICAvLyBpZiBhIGNyb3NzLWZhZGVkIHZhbHVlIGlzIGNoYW5nZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBuZXcgaWNvbnMgZ2V0IGFkZGVkIHRvIGVhY2ggdGlsZSdzIGljb25BdGxhc1xuICAgICAgICAgICAgLy8gc28gYSBjYWxsIHRvIF91cGRhdGVMYXllciBpcyBuZWNlc3NhcnksIGFuZCB3ZSByZXR1cm4gdHJ1ZSBmcm9tIHRoaXMgZnVuY3Rpb24gc28gaXQgZ2V0cyBjYWxsZWQgaW5cbiAgICAgICAgICAgIC8vIFN0eWxlI3NldFBhaW50UHJvcGVydHlcbiAgICAgICAgICAgIHJldHVybiBpc0RhdGFEcml2ZW4gfHwgd2FzRGF0YURyaXZlbiB8fCBpc0Nyb3NzRmFkZWRQcm9wZXJ0eSB8fCB0aGlzLl9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZShfOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gTm8tb3A7IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBfaGFuZGxlT3ZlcnJpZGFibGVQYWludFByb3BlcnR5VXBkYXRlPFQsIFI+KG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4sIG5ld1ZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsIFI+KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIE5vLW9wOyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0hpZGRlbih6b29tOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMubWluem9vbSAmJiB6b29tIDwgdGhpcy5taW56b29tKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubWF4em9vbSAmJiB6b29tID49IHRoaXMubWF4em9vbSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2liaWxpdHkgPT09ICdub25lJztcbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzOiBUcmFuc2l0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQgPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnRyYW5zaXRpb25lZChwYXJhbWV0ZXJzLCB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQuaGFzVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldENyb3NzZmFkZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nyb3NzZmFkZVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl91bmV2YWx1YXRlZExheW91dCkge1xuICAgICAgICAgICAgKHRoaXM6IGFueSkubGF5b3V0ID0gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgICh0aGlzOiBhbnkpLnBhaW50ID0gdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50LnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBvdXRwdXQ6IGFueSA9IHtcbiAgICAgICAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAgICAgICAndHlwZSc6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICdzb3VyY2UnOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICdzb3VyY2UtbGF5ZXInOiB0aGlzLnNvdXJjZUxheWVyLFxuICAgICAgICAgICAgJ21ldGFkYXRhJzogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgICdtaW56b29tJzogdGhpcy5taW56b29tLFxuICAgICAgICAgICAgJ21heHpvb20nOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICAnZmlsdGVyJzogdGhpcy5maWx0ZXIsXG4gICAgICAgICAgICAnbGF5b3V0JzogdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQgJiYgdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2VyaWFsaXplKCksXG4gICAgICAgICAgICAncGFpbnQnOiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50ICYmIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2VyaWFsaXplKClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICBvdXRwdXQubGF5b3V0ID0gb3V0cHV0LmxheW91dCB8fCB7fTtcbiAgICAgICAgICAgIG91dHB1dC5sYXlvdXQudmlzaWJpbGl0eSA9IHRoaXMudmlzaWJpbGl0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJPYmplY3Qob3V0cHV0LCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhKGtleSA9PT0gJ2xheW91dCcgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpICYmXG4gICAgICAgICAgICAgICAgIShrZXkgPT09ICdwYWludCcgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGU6IEZ1bmN0aW9uLCBrZXk6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvYmplY3RLZXk6IG5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yNDA3XG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgaXMzRCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzVGlsZUNsaXBwZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmVzaXplKCkge1xuICAgICAgICAvLyBub29wXG4gICAgfVxuXG4gICAgaXNTdGF0ZURlcGVuZGVudCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiAodGhpczogYW55KS5wYWludC5fdmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzOiBhbnkpLnBhaW50LmdldChwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSkgfHwgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgodmFsdWUudmFsdWUua2luZCA9PT0gJ3NvdXJjZScgfHwgdmFsdWUudmFsdWUua2luZCA9PT0gJ2NvbXBvc2l0ZScpICYmXG4gICAgICAgICAgICAgICAgdmFsdWUudmFsdWUuaXNTdGF0ZURlcGVuZGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG4vLyBOb3RlOiBhbGwgXCJzaXplc1wiIGFyZSBtZWFzdXJlZCBpbiBieXRlc1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtUcmFuc2ZlcmFibGV9IGZyb20gJy4uL3R5cGVzL3RyYW5zZmVyYWJsZSc7XG5cbmNvbnN0IHZpZXdUeXBlcyA9IHtcbiAgICAnSW50OCc6IEludDhBcnJheSxcbiAgICAnVWludDgnOiBVaW50OEFycmF5LFxuICAgICdJbnQxNic6IEludDE2QXJyYXksXG4gICAgJ1VpbnQxNic6IFVpbnQxNkFycmF5LFxuICAgICdJbnQzMic6IEludDMyQXJyYXksXG4gICAgJ1VpbnQzMic6IFVpbnQzMkFycmF5LFxuICAgICdGbG9hdDMyJzogRmxvYXQzMkFycmF5XG59O1xuXG5leHBvcnQgdHlwZSBWaWV3VHlwZSA9ICRLZXlzPHR5cGVvZiB2aWV3VHlwZXM+O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdCB7XG4gICAgX3BvczE6IG51bWJlcjtcbiAgICBfcG9zMjogbnVtYmVyO1xuICAgIF9wb3M0OiBudW1iZXI7XG4gICAgX3Bvczg6IG51bWJlcjtcbiAgICArX3N0cnVjdEFycmF5OiBTdHJ1Y3RBcnJheTtcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGUgcHJvdG90eXBlIG9mIHN1YiBjbGFzc2VzLlxuICAgIHNpemU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RydWN0QXJyYXl9IHN0cnVjdEFycmF5IFRoZSBTdHJ1Y3RBcnJheSB0aGUgc3RydWN0IGlzIHN0b3JlZCBpblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHN0cnVjdCBpbiB0aGUgU3RydWN0QXJyYXkuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzdHJ1Y3RBcnJheTogU3RydWN0QXJyYXksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgKHRoaXM6IGFueSkuX3N0cnVjdEFycmF5ID0gc3RydWN0QXJyYXk7XG4gICAgICAgIHRoaXMuX3BvczEgPSBpbmRleCAqIHRoaXMuc2l6ZTtcbiAgICAgICAgdGhpcy5fcG9zMiA9IHRoaXMuX3BvczEgLyAyO1xuICAgICAgICB0aGlzLl9wb3M0ID0gdGhpcy5fcG9zMSAvIDQ7XG4gICAgICAgIHRoaXMuX3BvczggPSB0aGlzLl9wb3MxIC8gODtcbiAgICB9XG59XG5cbmNvbnN0IERFRkFVTFRfQ0FQQUNJVFkgPSAxMjg7XG5jb25zdCBSRVNJWkVfTVVMVElQTElFUiA9IDU7XG5cbmV4cG9ydCB0eXBlIFN0cnVjdEFycmF5TWVtYmVyID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlOiBWaWV3VHlwZSxcbiAgICBjb21wb25lbnRzOiBudW1iZXIsXG4gICAgb2Zmc2V0OiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIFN0cnVjdEFycmF5TGF5b3V0ID0ge1xuICAgIG1lbWJlcnM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgYWxpZ25tZW50OiA/bnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRTdHJ1Y3RBcnJheSA9IHtcbiAgICBsZW5ndGg6IG51bWJlcixcbiAgICBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJcbn07XG5cbi8qKlxuICogYFN0cnVjdEFycmF5YCBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBvdmVyIGBBcnJheUJ1ZmZlcmAgYW5kIGBUeXBlZEFycmF5YFxuICogbWFraW5nIGl0IGJlaGF2ZSBsaWtlIGFuIGFycmF5IG9mIHR5cGVkIHN0cnVjdHMuXG4gKlxuICogQ29uY2VwdHVhbGx5LCBhIFN0cnVjdEFycmF5IGlzIGNvbXByaXNlZCBvZiBlbGVtZW50cywgaS5lLiwgaW5zdGFuY2VzIG9mIGl0c1xuICogYXNzb2NpYXRlZCBzdHJ1Y3QgdHlwZS4gRWFjaCBwYXJ0aWN1bGFyIHN0cnVjdCB0eXBlLCB0b2dldGhlciB3aXRoIGFuXG4gKiBhbGlnbm1lbnQgc2l6ZSwgZGV0ZXJtaW5lcyB0aGUgbWVtb3J5IGxheW91dCBvZiBhIFN0cnVjdEFycmF5IHdob3NlIGVsZW1lbnRzXG4gKiBhcmUgb2YgdGhhdCB0eXBlLiAgVGh1cywgZm9yIGVhY2ggc3VjaCBsYXlvdXQgdGhhdCB3ZSBuZWVkLCB3ZSBoYXZlXG4gKiBhIGNvcnJzZXBvbmRpbmcgU3RydWN0QXJyYXlMYXlvdXQgY2xhc3MsIGluaGVyaXRpbmcgZnJvbSBTdHJ1Y3RBcnJheSBhbmRcbiAqIGltcGxlbWVudGluZyBgZW1wbGFjZUJhY2soKWAgYW5kIGBfcmVmcmVzaFZpZXdzKClgLlxuICpcbiAqIEluIHNvbWUgY2FzZXMsIHdoZXJlIHdlIG5lZWQgdG8gYWNjZXNzIHBhcnRpY3VsYXIgZWxlbWVudHMgb2YgYSBTdHJ1Y3RBcnJheSxcbiAqIHdlIGltcGxlbWVudCBhIG1vcmUgc3BlY2lmaWMgc3ViY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIG9uZSBvZiB0aGVcbiAqIFN0cnVjdEFycmF5TGF5b3V0cyBhbmQgYWRkcyBhIGBnZXQoaSk6IFRgIGFjY2Vzc29yIHRoYXQgcmV0dXJucyBhIHN0cnVjdHVyZWRcbiAqIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBwcm94aWVzIGludG8gdGhlIHVuZGVybHlpbmcgbWVtb3J5IHNwYWNlIGZvciB0aGVcbiAqIGktdGggZWxlbWVudC4gIFRoaXMgYWZmb3JkcyB0aGUgY29udmllbmNlIG9mIHdvcmtpbmcgd2l0aCAoc2VlbWluZ2x5KSBwbGFpblxuICogSmF2YXNjcmlwdCBvYmplY3RzIHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgdGhlbVxuICogaW50byBBcnJheUJ1ZmZlcnMgZm9yIGVmZmljaWVudCB3ZWIgd29ya2VyIHRyYW5zZmVyLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5IHtcbiAgICBjYXBhY2l0eTogbnVtYmVyO1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIGlzVHJhbnNmZXJyZWQ6IGJvb2xlYW47XG4gICAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZSBwcm90b3R5cGUuXG4gICAgbWVtYmVyczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIGJ5dGVzUGVyRWxlbWVudDogbnVtYmVyO1xuICAgICtlbXBsYWNlQmFjazogRnVuY3Rpb247XG4gICAgK2VtcGxhY2U6IEZ1bmN0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNUcmFuc2ZlcnJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcGFjaXR5ID0gLTE7XG4gICAgICAgIHRoaXMucmVzaXplKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBhIFN0cnVjdEFycmF5IGluc3RhbmNlLiAgU2VyaWFsaXplcyBib3RoIHRoZSByYXcgZGF0YSBhbmQgdGhlXG4gICAgICogbWV0YWRhdGEgbmVlZGVkIHRvIHJlY29uc3RydWN0IHRoZSBTdHJ1Y3RBcnJheSBiYXNlIGNsYXNzIGR1cmluZ1xuICAgICAqIGRlc2VyaWFsaXphdGlvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplKGFycmF5OiBTdHJ1Y3RBcnJheSwgdHJhbnNmZXJhYmxlcz86IEFycmF5PFRyYW5zZmVyYWJsZT4pOiBTZXJpYWxpemVkU3RydWN0QXJyYXkge1xuICAgICAgICBhc3NlcnQoIWFycmF5LmlzVHJhbnNmZXJyZWQpO1xuXG4gICAgICAgIGFycmF5Ll90cmltKCk7XG5cbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIGFycmF5LmlzVHJhbnNmZXJyZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGFycmF5LmFycmF5QnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZW5ndGg6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIGFycmF5QnVmZmVyOiBhcnJheS5hcnJheUJ1ZmZlcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUoaW5wdXQ6IFNlcmlhbGl6ZWRTdHJ1Y3RBcnJheSkge1xuICAgICAgICBjb25zdCBzdHJ1Y3RBcnJheSA9IE9iamVjdC5jcmVhdGUodGhpcy5wcm90b3R5cGUpO1xuICAgICAgICBzdHJ1Y3RBcnJheS5hcnJheUJ1ZmZlciA9IGlucHV0LmFycmF5QnVmZmVyO1xuICAgICAgICBzdHJ1Y3RBcnJheS5sZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIHN0cnVjdEFycmF5LmNhcGFjaXR5ID0gaW5wdXQuYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAvIHN0cnVjdEFycmF5LmJ5dGVzUGVyRWxlbWVudDtcbiAgICAgICAgc3RydWN0QXJyYXkuX3JlZnJlc2hWaWV3cygpO1xuICAgICAgICByZXR1cm4gc3RydWN0QXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoZSBhcnJheSB0byBkaXNjYXJkIHVudXNlZCBjYXBhY2l0eS5cbiAgICAgKi9cbiAgICBfdHJpbSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9PSB0aGlzLmNhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aGlzLmNhcGFjaXR5ID0gdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gdGhpcy5hcnJheUJ1ZmZlci5zbGljZSgwLCB0aGlzLmxlbmd0aCAqIHRoaXMuYnl0ZXNQZXJFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hWaWV3cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSB0byAwIHdpdGhvdXQgZGUtYWxsb2NhdGluZyBjYXBjYWNpdHkuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIGFycmF5LlxuICAgICAqIElmIGBuYCBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoIHRoZW4gYWRkaXRpb25hbCBlbGVtZW50cyB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMgYXJlIGFkZGVkLlxuICAgICAqIElmIGBuYCBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoIHRoZW4gdGhlIGFycmF5IHdpbGwgYmUgcmVkdWNlZCB0byB0aGUgZmlyc3QgYG5gIGVsZW1lbnRzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBuZXcgc2l6ZSBvZiB0aGUgYXJyYXkuXG4gICAgICovXG4gICAgcmVzaXplKG46IG51bWJlcikge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHRoaXMucmVzZXJ2ZShuKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlIGEgcGxhbm5lZCBpbmNyZWFzZSBpbiBzaXplLCBzbyB0aGF0IGFueSBuZWNlc3NhcnkgYWxsb2NhdGlvbiBtYXlcbiAgICAgKiBiZSBkb25lIG9uY2UsIGFoZWFkIG9mIHRpbWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGV4cGVjdGVkIHNpemUgb2YgdGhlIGFycmF5LlxuICAgICAqL1xuICAgIHJlc2VydmUobjogbnVtYmVyKSB7XG4gICAgICAgIGlmIChuID4gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSA9IE1hdGgubWF4KG4sIE1hdGguZmxvb3IodGhpcy5jYXBhY2l0eSAqIFJFU0laRV9NVUxUSVBMSUVSKSwgREVGQVVMVF9DQVBBQ0lUWSk7XG4gICAgICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuY2FwYWNpdHkgKiB0aGlzLmJ5dGVzUGVyRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9sZFVpbnQ4QXJyYXkgPSB0aGlzLnVpbnQ4O1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFZpZXdzKCk7XG4gICAgICAgICAgICBpZiAob2xkVWludDhBcnJheSkgdGhpcy51aW50OC5zZXQob2xkVWludDhBcnJheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgVHlwZWRBcnJheSB2aWV3cyBmb3IgdGhlIGN1cnJlbnQgQXJyYXlCdWZmZXIuXG4gICAgICovXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcmVmcmVzaFZpZXdzKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBlYWNoIGNvbmNyZXRlIFN0cnVjdEFycmF5IGxheW91dCcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgbWVtYmVyIGZpZWxkcywgY3JlYXRlIGEgZnVsbCBTdHJ1Y3RBcnJheUxheW91dCwgaW5cbiAqIHBhcnRpY3VsYXIgY2FsY3VsYXRpbmcgdGhlIGNvcnJlY3QgYnl0ZSBvZmZzZXQgZm9yIGVhY2ggZmllbGQuICBUaGlzIGRhdGFcbiAqIGlzIHVzZWQgYXQgYnVpbGQgdGltZSB0byBnZW5lcmF0ZSBTdHJ1Y3RBcnJheUxheW91dF8qI2VtcGxhY2VCYWNrKCkgYW5kXG4gKiBvdGhlciBhY2Nlc3NvcnMsIGFuZCBhdCBydW50aW1lIGZvciBiaW5kaW5nIHZlcnRleCBidWZmZXIgYXR0cmlidXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXQoXG4gICAgbWVtYmVyczogQXJyYXk8eyBuYW1lOiBzdHJpbmcsIHR5cGU6IFZpZXdUeXBlLCArY29tcG9uZW50cz86IG51bWJlciwgfT4sXG4gICAgYWxpZ25tZW50OiBudW1iZXIgPSAxXG4pOiBTdHJ1Y3RBcnJheUxheW91dCB7XG5cbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBsZXQgbWF4U2l6ZSA9IDA7XG4gICAgY29uc3QgbGF5b3V0TWVtYmVycyA9IG1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KG1lbWJlci5uYW1lLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHR5cGVTaXplID0gc2l6ZU9mKG1lbWJlci50eXBlKTtcbiAgICAgICAgY29uc3QgbWVtYmVyT2Zmc2V0ID0gb2Zmc2V0ID0gYWxpZ24ob2Zmc2V0LCBNYXRoLm1heChhbGlnbm1lbnQsIHR5cGVTaXplKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBtZW1iZXIuY29tcG9uZW50cyB8fCAxO1xuXG4gICAgICAgIG1heFNpemUgPSBNYXRoLm1heChtYXhTaXplLCB0eXBlU2l6ZSk7XG4gICAgICAgIG9mZnNldCArPSB0eXBlU2l6ZSAqIGNvbXBvbmVudHM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IG1lbWJlci5uYW1lLFxuICAgICAgICAgICAgdHlwZTogbWVtYmVyLnR5cGUsXG4gICAgICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICAgICAgb2Zmc2V0OiBtZW1iZXJPZmZzZXQsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaXplID0gYWxpZ24ob2Zmc2V0LCBNYXRoLm1heChtYXhTaXplLCBhbGlnbm1lbnQpKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIG1lbWJlcnM6IGxheW91dE1lbWJlcnMsXG4gICAgICAgIHNpemUsXG4gICAgICAgIGFsaWdubWVudFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNpemVPZih0eXBlOiBWaWV3VHlwZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHZpZXdUeXBlc1t0eXBlXS5CWVRFU19QRVJfRUxFTUVOVDtcbn1cblxuZnVuY3Rpb24gYWxpZ24ob2Zmc2V0OiBudW1iZXIsIHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguY2VpbChvZmZzZXQgLyBzaXplKSAqIHNpemU7XG59XG5cbmV4cG9ydCB7IFN0cnVjdEFycmF5LCBTdHJ1Y3QsIHZpZXdUeXBlcywgY3JlYXRlTGF5b3V0IH07XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0cnVjdC1hcnJheXMuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7U3RydWN0LCBTdHJ1Y3RBcnJheX0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0Mmk0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJpNCcsIFN0cnVjdEFycmF5TGF5b3V0Mmk0KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls0XVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NGk4IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2Myk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0aTgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ0aTgnLCBTdHJ1Y3RBcnJheUxheW91dDRpOCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqIFs0XTogSW50MTZbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpNGkxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA0XSA9IHY0O1xuICAgICAgICB0aGlzLmludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNGkxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTRpMTInLCBTdHJ1Y3RBcnJheUxheW91dDJpNGkxMik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqIFs0XTogVWludDhbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpNHViOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNDtcbiAgICAgICAgY29uc3QgbzEgPSBpICogODtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgNF0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDVdID0gdjM7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA2XSA9IHY0O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgN10gPSB2NTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNHViOC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gODtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJpNHViOCcsIFN0cnVjdEFycmF5TGF5b3V0Mmk0dWI4KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MTZbOF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDh1aTE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA4O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNF0gPSB2NDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA1XSA9IHY1O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDZdID0gdjY7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgN10gPSB2NztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDh1aTE2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDh1aTE2JywgU3RydWN0QXJyYXlMYXlvdXQ4dWkxNik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNF1cbiAqIFs4XTogVWludDE2WzRdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTE2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDRpNHVpMTYnLCBTdHJ1Y3RBcnJheUxheW91dDRpNHVpMTYpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbM11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDNmMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2Mik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMztcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMl0gPSB2MjtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDNmMTIucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDEyO1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0M2YxMicsIFN0cnVjdEFycmF5TGF5b3V0M2YxMik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDMyWzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxdWw0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjApO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDE7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1bDQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQxdWw0JywgU3RydWN0QXJyYXlMYXlvdXQxdWw0KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls2XVxuICogWzEyXTogVWludDMyWzFdXG4gKiBbMTZdOiBVaW50MTZbMl1cbiAqIFsyMF06IEludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTJpMjQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgdWludDMyOiBVaW50MzJBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMTI7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDY7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNF0gPSB2NDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgM10gPSB2NjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA4XSA9IHY3O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDldID0gdjg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMF0gPSB2OTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDExXSA9IHYxMDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMmkyNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTJpMjQnLCBTdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMmkyNCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqIFs0XTogSW50MTZbMl1cbiAqIFs4XTogSW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpMmkyaTEyIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA2O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA1XSA9IHY1O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDEyO1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTInLCBTdHJ1Y3RBcnJheUxheW91dDJpMmkyaTEyKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50OFsyXVxuICogWzRdOiBGbG9hdDMyWzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMSA9IGkgKiAxMjtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMztcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDBdID0gdjA7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYyO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYzO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MnViMmYxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyJywgU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICogWzRdOiBVaW50MTZbMl1cbiAqIFs4XTogVWludDMyWzNdXG4gKiBbMjBdOiBVaW50MTZbM11cbiAqIFsyOF06IEZsb2F0MzJbMl1cbiAqIFszNl06IFVpbnQ4WzNdXG4gKiBbNDBdOiBVaW50MzJbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpMnVpM3VsM3VpMmYzdWIxdWw0NCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIsIHYxNTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyLCB2MTI6IG51bWJlciwgdjEzOiBudW1iZXIsIHYxNDogbnVtYmVyLCB2MTU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyMjtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTE7XG4gICAgICAgIGNvbnN0IG8xID0gaSAqIDQ0O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDJdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgM10gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyA0XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDEwXSA9IHY3O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDExXSA9IHY4O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDEyXSA9IHY5O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyA3XSA9IHYxMDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgOF0gPSB2MTE7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyAzNl0gPSB2MTI7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyAzN10gPSB2MTM7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyAzOF0gPSB2MTQ7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMTBdID0gdjE1O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjN1YjF1bDQ0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0NDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJpMnVpM3VsM3VpMmYzdWIxdWw0NCcsIFN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjN1YjF1bDQ0KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls2XVxuICogWzEyXTogVWludDE2WzExXVxuICogWzM2XTogVWludDMyWzFdXG4gKiBbNDBdOiBGbG9hdDMyWzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ2aTExdWkxdWwyZjQ4IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG4gICAgdWludDMyOiBVaW50MzJBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIsIHYxMDogbnVtYmVyLCB2MTE6IG51bWJlciwgdjEyOiBudW1iZXIsIHYxMzogbnVtYmVyLCB2MTQ6IG51bWJlciwgdjE1OiBudW1iZXIsIHYxNjogbnVtYmVyLCB2MTc6IG51bWJlciwgdjE4OiBudW1iZXIsIHYxOTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTkpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIsIHYxNTogbnVtYmVyLCB2MTY6IG51bWJlciwgdjE3OiBudW1iZXIsIHYxODogbnVtYmVyLCB2MTk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyNDtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNF0gPSB2NDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNl0gPSB2NjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA3XSA9IHY3O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDhdID0gdjg7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOV0gPSB2OTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxMF0gPSB2MTA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTFdID0gdjExO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDEyXSA9IHYxMjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxM10gPSB2MTM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTRdID0gdjE0O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE1XSA9IHYxNTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxNl0gPSB2MTY7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgOV0gPSB2MTc7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDEwXSA9IHYxODtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMTFdID0gdjE5O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0NmkxMXVpMXVsMmY0OC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ2aTExdWkxdWwyZjQ4JywgU3RydWN0QXJyYXlMYXlvdXQ2aTExdWkxdWwyZjQ4KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBGbG9hdDMyWzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxZjQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjApO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQxZjQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQxZjQnLCBTdHJ1Y3RBcnJheUxheW91dDFmNCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbM11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDNpNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2Mik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDNpNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDNpNicsIFN0cnVjdEFycmF5TGF5b3V0M2k2KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MzJbMV1cbiAqIFs0XTogVWludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2Mik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMjtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNDtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDJdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgM10gPSB2MjtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1bDJ1aTgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4JywgU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MTZbM11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDN1aTYgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0M3VpNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDN1aTYnLCBTdHJ1Y3RBcnJheUxheW91dDN1aTYpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MnVpNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQydWk0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MnVpNCcsIFN0cnVjdEFycmF5TGF5b3V0MnVpNCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxdWkyIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjApO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1aTIucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQxdWkyJywgU3RydWN0QXJyYXlMYXlvdXQxdWkyKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBGbG9hdDMyWzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQyZjggZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAyO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MmY4LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MmY4JywgU3RydWN0QXJyYXlMYXlvdXQyZjgpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDRmMTYgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDQ7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDNdID0gdjM7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0ZjE2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDRmMTYnLCBTdHJ1Y3RBcnJheUxheW91dDRmMTYpO1xuXG5jbGFzcyBDb2xsaXNpb25Cb3hTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogQ29sbGlzaW9uQm94QXJyYXk7XG4gICAgYW5jaG9yUG9pbnRYOiBudW1iZXI7XG4gICAgYW5jaG9yUG9pbnRZOiBudW1iZXI7XG4gICAgeDE6IG51bWJlcjtcbiAgICB5MTogbnVtYmVyO1xuICAgIHgyOiBudW1iZXI7XG4gICAgeTI6IG51bWJlcjtcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgYnVja2V0SW5kZXg6IG51bWJlcjtcbiAgICByYWRpdXM6IG51bWJlcjtcbiAgICBzaWduZWREaXN0YW5jZUZyb21BbmNob3I6IG51bWJlcjtcbiAgICBhbmNob3JQb2ludDogUG9pbnQ7XG4gICAgZ2V0IGFuY2hvclBvaW50WCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXTsgfVxuICAgIHNldCBhbmNob3JQb2ludFgoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXSA9IHg7IH1cbiAgICBnZXQgYW5jaG9yUG9pbnRZKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdOyB9XG4gICAgc2V0IGFuY2hvclBvaW50WSh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdID0geDsgfVxuICAgIGdldCB4MSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXTsgfVxuICAgIHNldCB4MSh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDJdID0geDsgfVxuICAgIGdldCB5MSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAzXTsgfVxuICAgIHNldCB5MSh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdID0geDsgfVxuICAgIGdldCB4MigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA0XTsgfVxuICAgIHNldCB4Mih4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDRdID0geDsgfVxuICAgIGdldCB5MigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA1XTsgfVxuICAgIHNldCB5Mih4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDVdID0geDsgfVxuICAgIGdldCBmZWF0dXJlSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDNdOyB9XG4gICAgc2V0IGZlYXR1cmVJbmRleCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAzXSA9IHg7IH1cbiAgICBnZXQgc291cmNlTGF5ZXJJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOF07IH1cbiAgICBzZXQgc291cmNlTGF5ZXJJbmRleCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA4XSA9IHg7IH1cbiAgICBnZXQgYnVja2V0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDldOyB9XG4gICAgc2V0IGJ1Y2tldEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDldID0geDsgfVxuICAgIGdldCByYWRpdXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMTBdOyB9XG4gICAgc2V0IHJhZGl1cyh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDEwXSA9IHg7IH1cbiAgICBnZXQgc2lnbmVkRGlzdGFuY2VGcm9tQW5jaG9yKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDExXTsgfVxuICAgIHNldCBzaWduZWREaXN0YW5jZUZyb21BbmNob3IoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxMV0gPSB4OyB9XG4gICAgZ2V0IGFuY2hvclBvaW50KCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMuYW5jaG9yUG9pbnRYLCB0aGlzLmFuY2hvclBvaW50WSk7IH1cbn1cblxuQ29sbGlzaW9uQm94U3RydWN0LnByb3RvdHlwZS5zaXplID0gMjQ7XG5cbmV4cG9ydCB0eXBlIENvbGxpc2lvbkJveCA9IENvbGxpc2lvbkJveFN0cnVjdDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgQ29sbGlzaW9uQm94QXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMmkyNCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBDb2xsaXNpb25Cb3hTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogQ29sbGlzaW9uQm94U3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IENvbGxpc2lvbkJveFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignQ29sbGlzaW9uQm94QXJyYXknLCBDb2xsaXNpb25Cb3hBcnJheSk7XG5cbmNsYXNzIFBsYWNlZFN5bWJvbFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBQbGFjZWRTeW1ib2xBcnJheTtcbiAgICBhbmNob3JYOiBudW1iZXI7XG4gICAgYW5jaG9yWTogbnVtYmVyO1xuICAgIGdseXBoU3RhcnRJbmRleDogbnVtYmVyO1xuICAgIG51bUdseXBoczogbnVtYmVyO1xuICAgIHZlcnRleFN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICBsaW5lU3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGxpbmVMZW5ndGg6IG51bWJlcjtcbiAgICBzZWdtZW50OiBudW1iZXI7XG4gICAgbG93ZXJTaXplOiBudW1iZXI7XG4gICAgdXBwZXJTaXplOiBudW1iZXI7XG4gICAgbGluZU9mZnNldFg6IG51bWJlcjtcbiAgICBsaW5lT2Zmc2V0WTogbnVtYmVyO1xuICAgIHdyaXRpbmdNb2RlOiBudW1iZXI7XG4gICAgcGxhY2VkT3JpZW50YXRpb246IG51bWJlcjtcbiAgICBoaWRkZW46IG51bWJlcjtcbiAgICBjcm9zc1RpbGVJRDogbnVtYmVyO1xuICAgIGdldCBhbmNob3JYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgc2V0IGFuY2hvclgoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXSA9IHg7IH1cbiAgICBnZXQgYW5jaG9yWSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxuICAgIHNldCBhbmNob3JZKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV0gPSB4OyB9XG4gICAgZ2V0IGdseXBoU3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBzZXQgZ2x5cGhTdGFydEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdID0geDsgfVxuICAgIGdldCBudW1HbHlwaHMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgc2V0IG51bUdseXBocyh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXSA9IHg7IH1cbiAgICBnZXQgdmVydGV4U3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMl07IH1cbiAgICBzZXQgdmVydGV4U3RhcnRJbmRleCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAyXSA9IHg7IH1cbiAgICBnZXQgbGluZVN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDNdOyB9XG4gICAgc2V0IGxpbmVTdGFydEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDNdID0geDsgfVxuICAgIGdldCBsaW5lTGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyA0XTsgfVxuICAgIHNldCBsaW5lTGVuZ3RoKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDRdID0geDsgfVxuICAgIGdldCBzZWdtZW50KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMF07IH1cbiAgICBzZXQgc2VnbWVudCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMF0gPSB4OyB9XG4gICAgZ2V0IGxvd2VyU2l6ZSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTFdOyB9XG4gICAgc2V0IGxvd2VyU2l6ZSh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMV0gPSB4OyB9XG4gICAgZ2V0IHVwcGVyU2l6ZSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTJdOyB9XG4gICAgc2V0IHVwcGVyU2l6ZSh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMl0gPSB4OyB9XG4gICAgZ2V0IGxpbmVPZmZzZXRYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgN107IH1cbiAgICBzZXQgbGluZU9mZnNldFgoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDddID0geDsgfVxuICAgIGdldCBsaW5lT2Zmc2V0WSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDhdOyB9XG4gICAgc2V0IGxpbmVPZmZzZXRZKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyA4XSA9IHg7IH1cbiAgICBnZXQgd3JpdGluZ01vZGUoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzZdOyB9XG4gICAgc2V0IHdyaXRpbmdNb2RlKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzZdID0geDsgfVxuICAgIGdldCBwbGFjZWRPcmllbnRhdGlvbigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzN107IH1cbiAgICBzZXQgcGxhY2VkT3JpZW50YXRpb24oeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzN10gPSB4OyB9XG4gICAgZ2V0IGhpZGRlbigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzOF07IH1cbiAgICBzZXQgaGlkZGVuKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzhdID0geDsgfVxuICAgIGdldCBjcm9zc1RpbGVJRCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMTBdOyB9XG4gICAgc2V0IGNyb3NzVGlsZUlEKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDEwXSA9IHg7IH1cbn1cblxuUGxhY2VkU3ltYm9sU3RydWN0LnByb3RvdHlwZS5zaXplID0gNDQ7XG5cbmV4cG9ydCB0eXBlIFBsYWNlZFN5bWJvbCA9IFBsYWNlZFN5bWJvbFN0cnVjdDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgUGxhY2VkU3ltYm9sQXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDJpMnVpM3VsM3VpMmYzdWIxdWw0NCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBQbGFjZWRTeW1ib2xTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogUGxhY2VkU3ltYm9sU3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IFBsYWNlZFN5bWJvbFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignUGxhY2VkU3ltYm9sQXJyYXknLCBQbGFjZWRTeW1ib2xBcnJheSk7XG5cbmNsYXNzIFN5bWJvbEluc3RhbmNlU3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IFN5bWJvbEluc3RhbmNlQXJyYXk7XG4gICAgYW5jaG9yWDogbnVtYmVyO1xuICAgIGFuY2hvclk6IG51bWJlcjtcbiAgICByaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleDogbnVtYmVyO1xuICAgIGNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleDogbnVtYmVyO1xuICAgIGxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXg6IG51bWJlcjtcbiAgICB2ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleDogbnVtYmVyO1xuICAgIGtleTogbnVtYmVyO1xuICAgIHRleHRCb3hTdGFydEluZGV4OiBudW1iZXI7XG4gICAgdGV4dEJveEVuZEluZGV4OiBudW1iZXI7XG4gICAgdmVydGljYWxUZXh0Qm94U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIHZlcnRpY2FsVGV4dEJveEVuZEluZGV4OiBudW1iZXI7XG4gICAgaWNvbkJveFN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICBpY29uQm94RW5kSW5kZXg6IG51bWJlcjtcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcjtcbiAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlczogbnVtYmVyO1xuICAgIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlczogbnVtYmVyO1xuICAgIG51bUljb25WZXJ0aWNlczogbnVtYmVyO1xuICAgIGNyb3NzVGlsZUlEOiBudW1iZXI7XG4gICAgdGV4dEJveFNjYWxlOiBudW1iZXI7XG4gICAgcmFkaWFsVGV4dE9mZnNldDogbnVtYmVyO1xuICAgIGdldCBhbmNob3JYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgc2V0IGFuY2hvclgoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXSA9IHg7IH1cbiAgICBnZXQgYW5jaG9yWSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxuICAgIHNldCBhbmNob3JZKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV0gPSB4OyB9XG4gICAgZ2V0IHJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgc2V0IHJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl0gPSB4OyB9XG4gICAgZ2V0IGNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAzXTsgfVxuICAgIHNldCBjZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAzXSA9IHg7IH1cbiAgICBnZXQgbGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA0XTsgfVxuICAgIHNldCBsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNF0gPSB4OyB9XG4gICAgZ2V0IHZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDVdOyB9XG4gICAgc2V0IHZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNV0gPSB4OyB9XG4gICAgZ2V0IGtleSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgNl07IH1cbiAgICBzZXQga2V5KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDZdID0geDsgfVxuICAgIGdldCB0ZXh0Qm94U3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgN107IH1cbiAgICBzZXQgdGV4dEJveFN0YXJ0SW5kZXgoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgN10gPSB4OyB9XG4gICAgZ2V0IHRleHRCb3hFbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOF07IH1cbiAgICBzZXQgdGV4dEJveEVuZEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDhdID0geDsgfVxuICAgIGdldCB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA5XTsgfVxuICAgIHNldCB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDldID0geDsgfVxuICAgIGdldCB2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTBdOyB9XG4gICAgc2V0IHZlcnRpY2FsVGV4dEJveEVuZEluZGV4KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEwXSA9IHg7IH1cbiAgICBnZXQgaWNvbkJveFN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDExXTsgfVxuICAgIHNldCBpY29uQm94U3RhcnRJbmRleCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMV0gPSB4OyB9XG4gICAgZ2V0IGljb25Cb3hFbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTJdOyB9XG4gICAgc2V0IGljb25Cb3hFbmRJbmRleCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMl0gPSB4OyB9XG4gICAgZ2V0IGZlYXR1cmVJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTNdOyB9XG4gICAgc2V0IGZlYXR1cmVJbmRleCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxM10gPSB4OyB9XG4gICAgZ2V0IG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNF07IH1cbiAgICBzZXQgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTRdID0geDsgfVxuICAgIGdldCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE1XTsgfVxuICAgIHNldCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTVdID0geDsgfVxuICAgIGdldCBudW1JY29uVmVydGljZXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE2XTsgfVxuICAgIHNldCBudW1JY29uVmVydGljZXMoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTZdID0geDsgfVxuICAgIGdldCBjcm9zc1RpbGVJRCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgOV07IH1cbiAgICBzZXQgY3Jvc3NUaWxlSUQoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgOV0gPSB4OyB9XG4gICAgZ2V0IHRleHRCb3hTY2FsZSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDEwXTsgfVxuICAgIHNldCB0ZXh0Qm94U2NhbGUoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDEwXSA9IHg7IH1cbiAgICBnZXQgcmFkaWFsVGV4dE9mZnNldCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDExXTsgfVxuICAgIHNldCByYWRpYWxUZXh0T2Zmc2V0KHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAxMV0gPSB4OyB9XG59XG5cblN5bWJvbEluc3RhbmNlU3RydWN0LnByb3RvdHlwZS5zaXplID0gNDg7XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEluc3RhbmNlID0gU3ltYm9sSW5zdGFuY2VTdHJ1Y3Q7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFN5bWJvbEluc3RhbmNlQXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDZpMTF1aTF1bDJmNDgge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgU3ltYm9sSW5zdGFuY2VTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogU3ltYm9sSW5zdGFuY2VTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgU3ltYm9sSW5zdGFuY2VTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1N5bWJvbEluc3RhbmNlQXJyYXknLCBTeW1ib2xJbnN0YW5jZUFycmF5KTtcblxuY2xhc3MgR2x5cGhPZmZzZXRTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogR2x5cGhPZmZzZXRBcnJheTtcbiAgICBvZmZzZXRYOiBudW1iZXI7XG4gICAgZ2V0IG9mZnNldFgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAwXTsgfVxuICAgIHNldCBvZmZzZXRYKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAwXSA9IHg7IH1cbn1cblxuR2x5cGhPZmZzZXRTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA0O1xuXG5leHBvcnQgdHlwZSBHbHlwaE9mZnNldCA9IEdseXBoT2Zmc2V0U3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBHbHlwaE9mZnNldEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQxZjQge1xuICAgIGdldG9mZnNldFgoaW5kZXg6IG51bWJlcikgeyByZXR1cm4gdGhpcy5mbG9hdDMyW2luZGV4ICogMSArIDBdOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBHbHlwaE9mZnNldFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0KGluZGV4OiBudW1iZXIpOiBHbHlwaE9mZnNldFN0cnVjdCB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBHbHlwaE9mZnNldFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignR2x5cGhPZmZzZXRBcnJheScsIEdseXBoT2Zmc2V0QXJyYXkpO1xuXG5jbGFzcyBTeW1ib2xMaW5lVmVydGV4U3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IFN5bWJvbExpbmVWZXJ0ZXhBcnJheTtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yOiBudW1iZXI7XG4gICAgZ2V0IHgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBzZXQgeCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdID0geDsgfVxuICAgIGdldCB5KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdOyB9XG4gICAgc2V0IHkoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXSA9IHg7IH1cbiAgICBnZXQgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBzZXQgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXSA9IHg7IH1cbn1cblxuU3ltYm9sTGluZVZlcnRleFN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IDY7XG5cbmV4cG9ydCB0eXBlIFN5bWJvbExpbmVWZXJ0ZXggPSBTeW1ib2xMaW5lVmVydGV4U3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBTeW1ib2xMaW5lVmVydGV4QXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDNpNiB7XG4gICAgZ2V0eChpbmRleDogbnVtYmVyKSB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDBdOyB9XG4gICAgZ2V0eShpbmRleDogbnVtYmVyKSB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDFdOyB9XG4gICAgZ2V0dGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoaW5kZXg6IG51bWJlcikgeyByZXR1cm4gdGhpcy5pbnQxNltpbmRleCAqIDMgKyAyXTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgU3ltYm9sTGluZVZlcnRleFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0KGluZGV4OiBudW1iZXIpOiBTeW1ib2xMaW5lVmVydGV4U3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IFN5bWJvbExpbmVWZXJ0ZXhTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1N5bWJvbExpbmVWZXJ0ZXhBcnJheScsIFN5bWJvbExpbmVWZXJ0ZXhBcnJheSk7XG5cbmNsYXNzIEZlYXR1cmVJbmRleFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBGZWF0dXJlSW5kZXhBcnJheTtcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgYnVja2V0SW5kZXg6IG51bWJlcjtcbiAgICBnZXQgZmVhdHVyZUluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAwXTsgfVxuICAgIHNldCBmZWF0dXJlSW5kZXgoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMF0gPSB4OyB9XG4gICAgZ2V0IHNvdXJjZUxheWVySW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgc2V0IHNvdXJjZUxheWVySW5kZXgoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMl0gPSB4OyB9XG4gICAgZ2V0IGJ1Y2tldEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXTsgfVxuICAgIHNldCBidWNrZXRJbmRleCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXSA9IHg7IH1cbn1cblxuRmVhdHVyZUluZGV4U3RydWN0LnByb3RvdHlwZS5zaXplID0gODtcblxuZXhwb3J0IHR5cGUgRmVhdHVyZUluZGV4ID0gRmVhdHVyZUluZGV4U3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBGZWF0dXJlSW5kZXhBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBGZWF0dXJlSW5kZXhTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogRmVhdHVyZUluZGV4U3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IEZlYXR1cmVJbmRleFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignRmVhdHVyZUluZGV4QXJyYXknLCBGZWF0dXJlSW5kZXhBcnJheSk7XG5cbmV4cG9ydCB7XG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTgsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTRpMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTR1YjgsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ4dWkxNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRpNHVpMTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzZjEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVsNCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMmkyNCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpMmkyaTEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MnViMmYxMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpMnVpM3VsM3VpMmYzdWIxdWw0NCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDZpMTF1aTF1bDJmNDgsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxZjQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzaTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M3VpNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJ1aTQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWkyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmY4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGYxNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBQb3NBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRpOCBhcyBSYXN0ZXJCb3VuZHNBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBDaXJjbGVMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBGaWxsTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTRpMTIgYXMgRmlsbEV4dHJ1c2lvbkxheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0IGFzIEhlYXRtYXBMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNHViOCBhcyBMaW5lTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ4dWkxNiBhcyBQYXR0ZXJuTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTE2IGFzIFN5bWJvbExheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2YxMiBhcyBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWw0IGFzIFN5bWJvbE9wYWNpdHlBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpMmkyaTEyIGFzIENvbGxpc2lvbkJveExheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIgYXMgQ29sbGlzaW9uQ2lyY2xlTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyIGFzIENvbGxpc2lvblZlcnRleEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M3VpNiBhcyBUcmlhbmdsZUluZGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQydWk0IGFzIExpbmVJbmRleEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVpMiBhcyBMaW5lU3RyaXBJbmRleEFycmF5XG59O1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5JztcblxuY29uc3QgbGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgZGVmYXVsdCBsYXlvdXQ7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBsYXlvdXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuaW1wb3J0IHR5cGUgVmVydGV4QXJyYXlPYmplY3QgZnJvbSAnLi4vcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3QnO1xuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheSc7XG5cbmV4cG9ydCB0eXBlIFNlZ21lbnQgPSB7XG4gICAgc29ydEtleTogbnVtYmVyIHwgdm9pZCxcbiAgICB2ZXJ0ZXhPZmZzZXQ6IG51bWJlcixcbiAgICBwcmltaXRpdmVPZmZzZXQ6IG51bWJlcixcbiAgICB2ZXJ0ZXhMZW5ndGg6IG51bWJlcixcbiAgICBwcmltaXRpdmVMZW5ndGg6IG51bWJlcixcbiAgICB2YW9zOiB7W3N0cmluZ106IFZlcnRleEFycmF5T2JqZWN0fVxufVxuXG5jbGFzcyBTZWdtZW50VmVjdG9yIHtcbiAgICBzdGF0aWMgTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEg6IG51bWJlcjtcbiAgICBzZWdtZW50czogQXJyYXk8U2VnbWVudD47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWdtZW50cz86IEFycmF5PFNlZ21lbnQ+ID0gW10pIHtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IHNlZ21lbnRzO1xuICAgIH1cblxuICAgIHByZXBhcmVTZWdtZW50KG51bVZlcnRpY2VzOiBudW1iZXIsIGxheW91dFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheSwgaW5kZXhBcnJheTogU3RydWN0QXJyYXksIHNvcnRLZXk/OiBudW1iZXIpOiBTZWdtZW50IHtcbiAgICAgICAgbGV0IHNlZ21lbnQ6IFNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChudW1WZXJ0aWNlcyA+IFNlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpIHdhcm5PbmNlKGBNYXggdmVydGljZXMgcGVyIHNlZ21lbnQgaXMgJHtTZWdtZW50VmVjdG9yLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIfTogYnVja2V0IHJlcXVlc3RlZCAke251bVZlcnRpY2VzfWApO1xuICAgICAgICBpZiAoIXNlZ21lbnQgfHwgc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyBudW1WZXJ0aWNlcyA+IFNlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggfHwgc2VnbWVudC5zb3J0S2V5ICE9PSBzb3J0S2V5KSB7XG4gICAgICAgICAgICBzZWdtZW50ID0gKHtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQ6IGxheW91dFZlcnRleEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICBwcmltaXRpdmVPZmZzZXQ6IGluZGV4QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHZlcnRleExlbmd0aDogMCxcbiAgICAgICAgICAgICAgICBwcmltaXRpdmVMZW5ndGg6IDBcbiAgICAgICAgICAgIH06IGFueSk7XG4gICAgICAgICAgICBpZiAoc29ydEtleSAhPT0gdW5kZWZpbmVkKSBzZWdtZW50LnNvcnRLZXkgPSBzb3J0S2V5O1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgIH1cblxuICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHM7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBpbiBzZWdtZW50LnZhb3MpIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnZhb3Nba10uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHNpbXBsZVNlZ21lbnQodmVydGV4T2Zmc2V0OiBudW1iZXIsIHByaW1pdGl2ZU9mZnNldDogbnVtYmVyLCB2ZXJ0ZXhMZW5ndGg6IG51bWJlciwgcHJpbWl0aXZlTGVuZ3RoOiBudW1iZXIpOiBTZWdtZW50VmVjdG9yIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWdtZW50VmVjdG9yKFt7XG4gICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQsXG4gICAgICAgICAgICBwcmltaXRpdmVPZmZzZXQsXG4gICAgICAgICAgICB2ZXJ0ZXhMZW5ndGgsXG4gICAgICAgICAgICBwcmltaXRpdmVMZW5ndGgsXG4gICAgICAgICAgICB2YW9zOiB7fSxcbiAgICAgICAgICAgIHNvcnRLZXk6IDBcbiAgICAgICAgfV0pO1xuICAgIH1cbn1cblxuLypcbiAqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSB2ZXJ0ZXggYXJyYXkuIFRoaXMgbGltaXQgaXMgaW1wb3NlZCBieSBXZWJHTCdzIDE2IGJpdFxuICogYWRkcmVzc2luZyBvZiB2ZXJ0ZXggYnVmZmVycy5cbiAqIEBwcml2YXRlXG4gKiBAcmVhZG9ubHlcbiAqL1xuU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCA9IE1hdGgucG93KDIsIDE2KSAtIDE7XG5cbnJlZ2lzdGVyKCdTZWdtZW50VmVjdG9yJywgU2VnbWVudFZlY3Rvcik7XG5leHBvcnQgZGVmYXVsdCBTZWdtZW50VmVjdG9yO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG4vKipcbiAqIFBhY2tzIHR3byBudW1iZXJzLCBpbnRlcnByZXRlZCBhcyA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VycywgaW50byBhIHNpbmdsZVxuICogZmxvYXQuICBVbnBhY2sgdGhlbSBpbiB0aGUgc2hhZGVyIHVzaW5nIHRoZSBgdW5wYWNrX2Zsb2F0KClgIGZ1bmN0aW9uLFxuICogZGVmaW5lZCBpbiBfcHJlbHVkZS52ZXJ0ZXguZ2xzbFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWNrVWludDhUb0Zsb2F0KGE6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgLy8gY29lcmNlIGEgYW5kIGIgdG8gOC1iaXQgaW50c1xuICAgIGEgPSBjbGFtcChNYXRoLmZsb29yKGEpLCAwLCAyNTUpO1xuICAgIGIgPSBjbGFtcChNYXRoLmZsb29yKGIpLCAwLCAyNTUpO1xuICAgIHJldHVybiAyNTYgKiBhICsgYjtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxudHlwZSBTZXJpYWxpemVkRmVhdHVyZVBvc2l0aW9uTWFwID0ge1xuICAgIGlkczogRmxvYXQ2NEFycmF5O1xuICAgIHBvc2l0aW9uczogVWludDMyQXJyYXk7XG59O1xuXG50eXBlIEZlYXR1cmVQb3NpdGlvbiA9IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXI7XG59O1xuXG4vLyBBIHRyYW5zZmVyYWJsZSBkYXRhIHN0cnVjdHVyZSB0aGF0IG1hcHMgZmVhdHVyZSBpZHMgdG8gdGhlaXIgaW5kaWNlcyBhbmQgYnVmZmVyIG9mZnNldHNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZlYXR1cmVQb3NpdGlvbk1hcCB7XG4gICAgaWRzOiBBcnJheTxudW1iZXI+O1xuICAgIHBvc2l0aW9uczogQXJyYXk8bnVtYmVyPjtcbiAgICBpbmRleGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaWRzID0gW107XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gW107XG4gICAgICAgIHRoaXMuaW5kZXhlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZChpZDogbnVtYmVyLCBpbmRleDogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmlkcy5wdXNoKGlkKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChpbmRleCwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgZ2V0UG9zaXRpb25zKGlkOiBudW1iZXIpOiBBcnJheTxGZWF0dXJlUG9zaXRpb24+IHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW5kZXhlZCk7XG5cbiAgICAgICAgLy8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgaWQgaW4gdGhpcy5pZHM7XG4gICAgICAgIC8vIHJlbGllcyBvbiBpZHMvcG9zaXRpb25zIGJlaW5nIHNvcnRlZCBieSBpZCwgd2hpY2ggaGFwcGVucyBpbiBzZXJpYWxpemF0aW9uXG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGogPSB0aGlzLmlkcy5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSAoaSArIGopID4+IDE7XG4gICAgICAgICAgICBpZiAodGhpcy5pZHNbbV0gPj0gaWQpIHtcbiAgICAgICAgICAgICAgICBqID0gbTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSA9IG0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5pZHNbaV0gPT09IGlkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucG9zaXRpb25zWzMgKiBpXTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wb3NpdGlvbnNbMyAqIGkgKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucG9zaXRpb25zWzMgKiBpICsgMl07XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaCh7aW5kZXgsIHN0YXJ0LCBlbmR9KTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zaXRpb25zO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXJpYWxpemUobWFwOiBGZWF0dXJlUG9zaXRpb25NYXAsIHRyYW5zZmVyYWJsZXM6IEFycmF5PEFycmF5QnVmZmVyPik6IFNlcmlhbGl6ZWRGZWF0dXJlUG9zaXRpb25NYXAge1xuICAgICAgICBjb25zdCBpZHMgPSBuZXcgRmxvYXQ2NEFycmF5KG1hcC5pZHMpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgVWludDMyQXJyYXkobWFwLnBvc2l0aW9ucyk7XG5cbiAgICAgICAgc29ydChpZHMsIHBvc2l0aW9ucywgMCwgaWRzLmxlbmd0aCAtIDEpO1xuXG4gICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChpZHMuYnVmZmVyLCBwb3NpdGlvbnMuYnVmZmVyKTtcblxuICAgICAgICByZXR1cm4ge2lkcywgcG9zaXRpb25zfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUob2JqOiBTZXJpYWxpemVkRmVhdHVyZVBvc2l0aW9uTWFwKTogRmVhdHVyZVBvc2l0aW9uTWFwIHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IEZlYXR1cmVQb3NpdGlvbk1hcCgpO1xuICAgICAgICAvLyBhZnRlciB0cmFuc2ZlcnJpbmcsIHdlIG9ubHkgdXNlIHRoZXNlIGFycmF5cyBzdGF0aWNhbGx5IChubyBwdXNoZXMpLFxuICAgICAgICAvLyBzbyBUeXBlZEFycmF5IHZzIEFycmF5IGRpc3RpbmN0aW9uIHRoYXQgZmxvdyBwb2ludHMgb3V0IGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgIG1hcC5pZHMgPSAob2JqLmlkczogYW55KTtcbiAgICAgICAgbWFwLnBvc2l0aW9ucyA9IChvYmoucG9zaXRpb25zOiBhbnkpO1xuICAgICAgICBtYXAuaW5kZXhlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxufVxuXG4vLyBjdXN0b20gcXVpY2tzb3J0IHRoYXQgc29ydHMgaWRzLCBpbmRpY2VzIGFuZCBvZmZzZXRzIHRvZ2V0aGVyIChieSBpZHMpXG5mdW5jdGlvbiBzb3J0KGlkcywgcG9zaXRpb25zLCBsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0ID49IHJpZ2h0KSByZXR1cm47XG5cbiAgICBjb25zdCBwaXZvdCA9IGlkc1sobGVmdCArIHJpZ2h0KSA+PiAxXTtcbiAgICBsZXQgaSA9IGxlZnQgLSAxO1xuICAgIGxldCBqID0gcmlnaHQgKyAxO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgZG8gaSsrOyB3aGlsZSAoaWRzW2ldIDwgcGl2b3QpO1xuICAgICAgICBkbyBqLS07IHdoaWxlIChpZHNbal0gPiBwaXZvdCk7XG4gICAgICAgIGlmIChpID49IGopIGJyZWFrO1xuICAgICAgICBzd2FwKGlkcywgaSwgaik7XG4gICAgICAgIHN3YXAocG9zaXRpb25zLCAzICogaSwgMyAqIGopO1xuICAgICAgICBzd2FwKHBvc2l0aW9ucywgMyAqIGkgKyAxLCAzICogaiArIDEpO1xuICAgICAgICBzd2FwKHBvc2l0aW9ucywgMyAqIGkgKyAyLCAzICogaiArIDIpO1xuICAgIH1cblxuICAgIHNvcnQoaWRzLCBwb3NpdGlvbnMsIGxlZnQsIGopO1xuICAgIHNvcnQoaWRzLCBwb3NpdGlvbnMsIGogKyAxLCByaWdodCk7XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgY29uc3QgdG1wID0gYXJyW2ldO1xuICAgIGFycltpXSA9IGFycltqXTtcbiAgICBhcnJbal0gPSB0bXA7XG59XG5cbnJlZ2lzdGVyKCdGZWF0dXJlUG9zaXRpb25NYXAnLCBGZWF0dXJlUG9zaXRpb25NYXApO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5cbmV4cG9ydCB0eXBlIFVuaWZvcm1WYWx1ZXM8VXM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFVzLCA8Vj4odTogVW5pZm9ybTxWPikgPT4gVj4+O1xuZXhwb3J0IHR5cGUgVW5pZm9ybUxvY2F0aW9ucyA9IHtbc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb259O1xuXG5jbGFzcyBVbmlmb3JtPFQ+IHtcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xuICAgIGxvY2F0aW9uOiA/V2ViR0xVbmlmb3JtTG9jYXRpb247XG4gICAgY3VycmVudDogVDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICB0aGlzLmdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgIH1cblxuICAgICtzZXQ6ICh2OiBUKSA9PiB2b2lkO1xufVxuXG5jbGFzcyBVbmlmb3JtMWkgZXh0ZW5kcyBVbmlmb3JtPG51bWJlcj4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG4gICAgfVxuXG4gICAgc2V0KHY6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWkodGhpcy5sb2NhdGlvbiwgdik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm0xZiBleHRlbmRzIFVuaWZvcm08bnVtYmVyPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB9XG5cbiAgICBzZXQodjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZih0aGlzLmxvY2F0aW9uLCB2KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybTJmIGV4dGVuZHMgVW5pZm9ybTxbbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gWzAsIDBdO1xuICAgIH1cblxuICAgIHNldCh2OiBbbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIGlmICh2WzBdICE9PSB0aGlzLmN1cnJlbnRbMF0gfHwgdlsxXSAhPT0gdGhpcy5jdXJyZW50WzFdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmYodGhpcy5sb2NhdGlvbiwgdlswXSwgdlsxXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm0zZiBleHRlbmRzIFVuaWZvcm08W251bWJlciwgbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gWzAsIDAsIDBdO1xuICAgIH1cblxuICAgIHNldCh2OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZbMF0gIT09IHRoaXMuY3VycmVudFswXSB8fCB2WzFdICE9PSB0aGlzLmN1cnJlbnRbMV0gfHwgdlsyXSAhPT0gdGhpcy5jdXJyZW50WzJdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2YodGhpcy5sb2NhdGlvbiwgdlswXSwgdlsxXSwgdlsyXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm00ZiBleHRlbmRzIFVuaWZvcm08W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBbMCwgMCwgMCwgMF07XG4gICAgfVxuXG4gICAgc2V0KHY6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIGlmICh2WzBdICE9PSB0aGlzLmN1cnJlbnRbMF0gfHwgdlsxXSAhPT0gdGhpcy5jdXJyZW50WzFdIHx8XG4gICAgICAgICAgICB2WzJdICE9PSB0aGlzLmN1cnJlbnRbMl0gfHwgdlszXSAhPT0gdGhpcy5jdXJyZW50WzNdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYodGhpcy5sb2NhdGlvbiwgdlswXSwgdlsxXSwgdlsyXSwgdlszXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm1Db2xvciBleHRlbmRzIFVuaWZvcm08Q29sb3I+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBDb2xvci50cmFuc3BhcmVudDtcbiAgICB9XG5cbiAgICBzZXQodjogQ29sb3IpOiB2b2lkIHtcbiAgICAgICAgaWYgKHYuciAhPT0gdGhpcy5jdXJyZW50LnIgfHwgdi5nICE9PSB0aGlzLmN1cnJlbnQuZyB8fFxuICAgICAgICAgICAgdi5iICE9PSB0aGlzLmN1cnJlbnQuYiB8fCB2LmEgIT09IHRoaXMuY3VycmVudC5hKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYodGhpcy5sb2NhdGlvbiwgdi5yLCB2LmcsIHYuYiwgdi5hKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgZW1wdHlNYXQ0ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5jbGFzcyBVbmlmb3JtTWF0cml4NGYgZXh0ZW5kcyBVbmlmb3JtPEZsb2F0MzJBcnJheT4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGVtcHR5TWF0NDtcbiAgICB9XG5cbiAgICBzZXQodjogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSB2YXN0IG1ham9yaXR5IG9mIG1hdHJpeCBjb21wYXJpc29ucyB0aGF0IHdpbGwgdHJpcCB0aGlzIHNldFxuICAgICAgICAvLyBoYXBwZW4gYXQgaT0xMiBvciBpPTAsIHNvIHdlIGNoZWNrIHRob3NlIGZpcnN0IHRvIGF2b2lkIGxvdHMgb2ZcbiAgICAgICAgLy8gdW5uZWNlc3NhcnkgaXRlcmF0aW9uOlxuICAgICAgICBpZiAodlsxMl0gIT09IHRoaXMuY3VycmVudFsxMl0gfHwgdlswXSAhPT0gdGhpcy5jdXJyZW50WzBdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMubG9jYXRpb24sIGZhbHNlLCB2KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgIGlmICh2W2ldICE9PSB0aGlzLmN1cnJlbnRbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLmxvY2F0aW9uLCBmYWxzZSwgdik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7XG4gICAgVW5pZm9ybSxcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybTRmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn07XG5cbmV4cG9ydCB0eXBlIFVuaWZvcm1CaW5kaW5ncyA9IHtbc3RyaW5nXTogVW5pZm9ybTxhbnk+fTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHBhY2tVaW50OFRvRmxvYXQgfSBmcm9tICcuLi9zaGFkZXJzL2VuY29kZV9hdHRyaWJ1dGUnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQgeyBzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbiB9IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IHJlZ2lzdGVyLCBzZXJpYWxpemUsIGRlc2VyaWFsaXplIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCB7IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSB9IGZyb20gJy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHsgU3RydWN0QXJyYXlMYXlvdXQxZjQsIFN0cnVjdEFycmF5TGF5b3V0MmY4LCBTdHJ1Y3RBcnJheUxheW91dDRmMTYsIFBhdHRlcm5MYXlvdXRBcnJheSB9IGZyb20gJy4vYXJyYXlfdHlwZXMnO1xuXG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCBGZWF0dXJlUG9zaXRpb25NYXAgZnJvbSAnLi9mZWF0dXJlX3Bvc2l0aW9uX21hcCc7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0sXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtNGYsXG4gICAgdHlwZSBVbmlmb3JtTG9jYXRpb25zXG59IGZyb20gJy4uL3JlbmRlci91bmlmb3JtX2JpbmRpbmcnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1R5cGVkU3R5bGVMYXllcn0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvdHlwZWRfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXksIFN0cnVjdEFycmF5TWVtYmVyfSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheSc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcbmltcG9ydCB0eXBlIHtcbiAgICBGZWF0dXJlLFxuICAgIEZlYXR1cmVTdGF0ZSxcbiAgICBHbG9iYWxQcm9wZXJ0aWVzLFxuICAgIFNvdXJjZUV4cHJlc3Npb24sXG4gICAgQ29tcG9zaXRlRXhwcmVzc2lvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge1Bvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlJztcbmltcG9ydCB0eXBlIHtGb3JtYXR0ZWRTZWN0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuZXhwb3J0IHR5cGUgQmluZGVyVW5pZm9ybSA9IHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICBiaW5kaW5nOiBVbmlmb3JtPGFueT5cbn07XG5cbmZ1bmN0aW9uIHBhY2tDb2xvcihjb2xvcjogQ29sb3IpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBwYWNrVWludDhUb0Zsb2F0KDI1NSAqIGNvbG9yLnIsIDI1NSAqIGNvbG9yLmcpLFxuICAgICAgICBwYWNrVWludDhUb0Zsb2F0KDI1NSAqIGNvbG9yLmIsIDI1NSAqIGNvbG9yLmEpXG4gICAgXTtcbn1cblxuLyoqXG4gKiAgYEJpbmRlcmAgaXMgdGhlIGludGVyZmFjZSBkZWZpbml0aW9uIGZvciB0aGUgc3RyYXRlZ2llcyBmb3IgY29uc3RydWN0aW5nLFxuICogIHVwbG9hZGluZywgYW5kIGJpbmRpbmcgcGFpbnQgcHJvcGVydHkgZGF0YSBhcyBHTFNMIGF0dHJpYnV0ZXMuIE1vc3Qgc3R5bGUtXG4gKiAgc3BlYyBwcm9wZXJ0aWVzIGhhdmUgYSAxOjEgcmVsYXRpb25zaGlwIHRvIHNoYWRlciBhdHRyaWJ1dGUvdW5pZm9ybXMsIGJ1dFxuICogIHNvbWUgcmVxdWlyZSBtdWx0bGlwbGUgdmFsdWVzIHBlciBmZWF0dXJlIHRvIGJlIHBhc3NlZCB0byB0aGUgR1BVLCBhbmQgaW5cbiAqICB0aG9zZSBjYXNlcyB3ZSBiaW5kIG11bHRpcGxlIGF0dHJpYnV0ZXMvdW5pZm9ybXMuXG4gKlxuICogIEl0IGhhcyB0aHJlZSBpbXBsZW1lbnRhdGlvbnMsIG9uZSBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgc3RyYXRlZ2llcyB3ZSB1c2U6XG4gKlxuICogICogRm9yIF9jb25zdGFudF8gcHJvcGVydGllcyAtLSB0aG9zZSB3aG9zZSB2YWx1ZSBpcyBhIGNvbnN0YW50LCBvciB0aGUgY29uc3RhbnRcbiAqICAgIHJlc3VsdCBvZiBldmFsdWF0aW5nIGEgY2FtZXJhIGV4cHJlc3Npb24gYXQgYSBwYXJ0aWN1bGFyIGNhbWVyYSBwb3NpdGlvbiAtLSB3ZVxuICogICAgZG9uJ3QgbmVlZCBhIHZlcnRleCBhdHRyaWJ1dGUgYnVmZmVyLCBhbmQgaW5zdGVhZCB1c2UgYSB1bmlmb3JtLlxuICogICogRm9yIGRhdGEgZXhwcmVzc2lvbnMsIHdlIHVzZSBhIHZlcnRleCBidWZmZXIgd2l0aCBhIHNpbmdsZSBhdHRyaWJ1dGUgdmFsdWUsXG4gKiAgICB0aGUgZXZhbHVhdGVkIHJlc3VsdCBvZiB0aGUgc291cmNlIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZS5cbiAqICAqIEZvciBjb21wb3NpdGUgZXhwcmVzc2lvbnMsIHdlIHVzZSBhIHZlcnRleCBidWZmZXIgd2l0aCB0d28gYXR0cmlidXRlczogbWluIGFuZFxuICogICAgbWF4IHZhbHVlcyBjb3ZlcmluZyB0aGUgcmFuZ2Ugb2Ygem9vbXMgYXQgd2hpY2ggd2UgZXhwZWN0IHRoZSB0aWxlIHRvIGJlXG4gKiAgICBkaXNwbGF5ZWQuIFRoZXNlIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBieSBldmFsdWF0aW5nIHRoZSBjb21wb3NpdGUgZXhwcmVzc2lvbiBmb3JcbiAqICAgIHRoZSBnaXZlbiBmZWF0dXJlIGF0IHN0cmF0ZWdpY2FsbHkgY2hvc2VuIHpvb20gbGV2ZWxzLiBJbiBhZGRpdGlvbiB0byB0aGlzXG4gKiAgICBhdHRyaWJ1dGUgZGF0YSwgd2UgYWxzbyB1c2UgYSB1bmlmb3JtIHZhbHVlIHdoaWNoIHRoZSBzaGFkZXIgdXNlcyB0byBpbnRlcnBvbGF0ZVxuICogICAgYmV0d2VlbiB0aGUgbWluIGFuZCBtYXggdmFsdWUgYXQgdGhlIGZpbmFsIGRpc3BsYXllZCB6b29tIGxldmVsLiBUaGUgdXNlIG9mIGFcbiAqICAgIHVuaWZvcm0gYWxsb3dzIHVzIHRvIGNoZWFwbHkgdXBkYXRlIHRoZSB2YWx1ZSBvbiBldmVyeSBmcmFtZS5cbiAqXG4gKiAgTm90ZSB0aGF0IHRoZSBzaGFkZXIgc291cmNlIHZhcmllcyBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSdyZSB1c2luZyBhIHVuaWZvcm0gb3JcbiAqICBhdHRyaWJ1dGUuIFdlIGR5bmFtaWNhbGx5IGNvbXBpbGUgc2hhZGVycyBhdCBydW50aW1lIHRvIGFjY29tb2RhdGUgdGhpcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmludGVyZmFjZSBCaW5kZXI8VD4ge1xuICAgIG1heFZhbHVlOiBudW1iZXI7XG4gICAgdW5pZm9ybU5hbWVzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgcG9wdWxhdGVQYWludEFycmF5KGxlbmd0aDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pOiB2b2lkO1xuICAgIHVwZGF0ZVBhaW50QXJyYXkoc3RhcnQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSk6IHZvaWQ7XG4gICAgdXBsb2FkKENvbnRleHQpOiB2b2lkO1xuICAgIGRlc3Ryb3koKTogdm9pZDtcblxuICAgIGRlZmluZXMoKTogQXJyYXk8c3RyaW5nPjtcbiAgICBzZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG86IEltYWdlUG9zaXRpb24sIHBvc0Zyb206IEltYWdlUG9zaXRpb24pOiB2b2lkO1xuXG4gICAgc2V0VW5pZm9ybXMoY29udGV4dDogQ29udGV4dCwgdW5pZm9ybTogVW5pZm9ybTwqPiwgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcyxcbiAgICAgICAgY3VycmVudFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4sIHVuaWZvcm1OYW1lOiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pOiAkU2hhcGU8VW5pZm9ybTwqPj47XG59XG5cbmNsYXNzIENvbnN0YW50QmluZGVyPFQ+IGltcGxlbWVudHMgQmluZGVyPFQ+IHtcbiAgICB2YWx1ZTogVDtcbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICBtYXhWYWx1ZTogbnVtYmVyO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubmFtZXMgPSBuYW1lcztcbiAgICAgICAgdGhpcy51bmlmb3JtTmFtZXMgPSB0aGlzLm5hbWVzLm1hcChuYW1lID0+IGB1XyR7bmFtZX1gKTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IC1JbmZpbml0eTtcbiAgICB9XG5cbiAgICBkZWZpbmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAobmFtZSA9PiBgI2RlZmluZSBIQVNfVU5JRk9STV91XyR7bmFtZX1gKTtcbiAgICB9XG4gICAgc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKCkge31cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkoKSB7fVxuICAgIHVwZGF0ZVBhaW50QXJyYXkoKSB7fVxuICAgIHVwbG9hZCgpIHt9XG4gICAgZGVzdHJveSgpIHt9XG5cbiAgICBzZXRVbmlmb3Jtcyhjb250ZXh0OiBDb250ZXh0LCB1bmlmb3JtOiBVbmlmb3JtPCo+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+KTogdm9pZCB7XG4gICAgICAgIHVuaWZvcm0uc2V0KGN1cnJlbnRWYWx1ZS5jb25zdGFudE9yKHRoaXMudmFsdWUpKTtcbiAgICB9XG5cbiAgICBnZXRCaW5kaW5nKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbik6ICRTaGFwZTxVbmlmb3JtPGFueT4+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUgPT09ICdjb2xvcicpID9cbiAgICAgICAgICAgIG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb24pIDpcbiAgICAgICAgICAgIG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb24pO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXJpYWxpemUoYmluZGVyOiBDb25zdGFudEJpbmRlcjxUPikge1xuICAgICAgICBjb25zdCB7dmFsdWUsIG5hbWVzLCB0eXBlfSA9IGJpbmRlcjtcbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogc2VyaWFsaXplKHZhbHVlKSwgbmFtZXMsIHR5cGV9O1xuICAgIH1cblxuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShzZXJpYWxpemVkOiB7dmFsdWU6IFQsIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmd9KSB7XG4gICAgICAgIGNvbnN0IHt2YWx1ZSwgbmFtZXMsIHR5cGV9ID0gc2VyaWFsaXplZDtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudEJpbmRlcihkZXNlcmlhbGl6ZSh2YWx1ZSksIG5hbWVzLCB0eXBlKTtcbiAgICB9XG59XG5cbmNsYXNzIENyb3NzRmFkZWRDb25zdGFudEJpbmRlcjxUPiBpbXBsZW1lbnRzIEJpbmRlcjxUPiB7XG4gICAgdmFsdWU6IFQ7XG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgdW5pZm9ybU5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBhdHRlcm5Qb3NpdGlvbnM6IHtbc3RyaW5nXTogP0FycmF5PG51bWJlcj59O1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBtYXhWYWx1ZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWU6IFQsIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5hbWVzID0gbmFtZXM7XG4gICAgICAgIHRoaXMudW5pZm9ybU5hbWVzID0gdGhpcy5uYW1lcy5tYXAobmFtZSA9PiBgdV8ke25hbWV9YCk7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMubWF4VmFsdWUgPSAtSW5maW5pdHk7XG4gICAgICAgIHRoaXMucGF0dGVyblBvc2l0aW9ucyA9IHtwYXR0ZXJuVG86IG51bGwsIHBhdHRlcm5Gcm9tOiBudWxsfTtcbiAgICB9XG5cbiAgICBkZWZpbmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAobmFtZSA9PiBgI2RlZmluZSBIQVNfVU5JRk9STV91XyR7bmFtZX1gKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkoKSB7fVxuICAgIHVwZGF0ZVBhaW50QXJyYXkoKSB7fVxuICAgIHVwbG9hZCgpIHt9XG4gICAgZGVzdHJveSgpIHt9XG5cbiAgICBzZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG86IEltYWdlUG9zaXRpb24sIHBvc0Zyb206IEltYWdlUG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5wYXR0ZXJuUG9zaXRpb25zLnBhdHRlcm5UbyA9IHBvc1RvLnRsYnI7XG4gICAgICAgIHRoaXMucGF0dGVyblBvc2l0aW9ucy5wYXR0ZXJuRnJvbSA9IHBvc0Zyb20udGxicjtcbiAgICB9XG5cbiAgICBzZXRVbmlmb3Jtcyhjb250ZXh0OiBDb250ZXh0LCB1bmlmb3JtOiBVbmlmb3JtPCo+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+LCB1bmlmb3JtTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMucGF0dGVyblBvc2l0aW9ucztcbiAgICAgICAgaWYgKHVuaWZvcm1OYW1lID09PSBcInVfcGF0dGVybl90b1wiICYmIHBvcy5wYXR0ZXJuVG8pIHVuaWZvcm0uc2V0KHBvcy5wYXR0ZXJuVG8pO1xuICAgICAgICBpZiAodW5pZm9ybU5hbWUgPT09IFwidV9wYXR0ZXJuX2Zyb21cIiAmJiBwb3MucGF0dGVybkZyb20pIHVuaWZvcm0uc2V0KHBvcy5wYXR0ZXJuRnJvbSk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pOiAkU2hhcGU8VW5pZm9ybTxhbnk+PiB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICB9XG59XG5cbmNsYXNzIFNvdXJjZUV4cHJlc3Npb25CaW5kZXI8VD4gaW1wbGVtZW50cyBCaW5kZXI8VD4ge1xuICAgIGV4cHJlc3Npb246IFNvdXJjZUV4cHJlc3Npb247XG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgdW5pZm9ybU5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBtYXhWYWx1ZTogbnVtYmVyO1xuXG4gICAgcGFpbnRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXk7XG4gICAgcGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj47XG4gICAgcGFpbnRWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBTb3VyY2VFeHByZXNzaW9uLCBuYW1lczogQXJyYXk8c3RyaW5nPiwgdHlwZTogc3RyaW5nLCBQYWludFZlcnRleEFycmF5OiBDbGFzczxTdHJ1Y3RBcnJheT4pIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5uYW1lcyA9IG5hbWVzO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnVuaWZvcm1OYW1lcyA9IHRoaXMubmFtZXMubWFwKG5hbWUgPT4gYGFfJHtuYW1lfWApO1xuICAgICAgICB0aGlzLm1heFZhbHVlID0gLUluZmluaXR5O1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IG5hbWVzLm1hcCgobmFtZSkgPT5cbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgbmFtZTogYGFfJHtuYW1lfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogJ0Zsb2F0MzInLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHR5cGUgPT09ICdjb2xvcicgPyAyIDogMSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBQYWludFZlcnRleEFycmF5KCk7XG4gICAgfVxuXG4gICAgZGVmaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucygpIHt9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICBjb25zdCBwYWludEFycmF5ID0gdGhpcy5wYWludFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFpbnRBcnJheS5sZW5ndGg7XG4gICAgICAgIHBhaW50QXJyYXkucmVzZXJ2ZShuZXdMZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycygwKSwgZmVhdHVyZSwge30sIGZvcm1hdHRlZFNlY3Rpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gcGFja0NvbG9yKHZhbHVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IG5ld0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFpbnRBcnJheS5lbXBsYWNlQmFjayhjb2xvclswXSwgY29sb3JbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbmV3TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYWludEFycmF5LmVtcGxhY2VCYWNrKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IE1hdGgubWF4KHRoaXMubWF4VmFsdWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QXJyYXkoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHBhaW50QXJyYXkgPSB0aGlzLnBhaW50VmVydGV4QXJyYXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiAwfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcblxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IHBhY2tDb2xvcih2YWx1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZShpLCBjb2xvclswXSwgY29sb3JbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYWludEFycmF5LmVtcGxhY2UoaSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5tYXhWYWx1ZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRVbmlmb3Jtcyhjb250ZXh0OiBDb250ZXh0LCB1bmlmb3JtOiBVbmlmb3JtPCo+KTogdm9pZCB7XG4gICAgICAgIHVuaWZvcm0uc2V0KDApO1xuICAgIH1cblxuICAgIGdldEJpbmRpbmcoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKTogVW5pZm9ybTFmIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb24pO1xuICAgIH1cbn1cblxuY2xhc3MgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcjxUPiBpbXBsZW1lbnRzIEJpbmRlcjxUPiB7XG4gICAgZXhwcmVzc2lvbjogQ29tcG9zaXRlRXhwcmVzc2lvbjtcbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHVzZUludGVnZXJab29tOiBib29sZWFuO1xuICAgIHpvb206IG51bWJlcjtcbiAgICBtYXhWYWx1ZTogbnVtYmVyO1xuXG4gICAgcGFpbnRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXk7XG4gICAgcGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj47XG4gICAgcGFpbnRWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBDb21wb3NpdGVFeHByZXNzaW9uLCBuYW1lczogQXJyYXk8c3RyaW5nPiwgdHlwZTogc3RyaW5nLCB1c2VJbnRlZ2VyWm9vbTogYm9vbGVhbiwgem9vbTogbnVtYmVyLCBsYXlvdXQ6IENsYXNzPFN0cnVjdEFycmF5Pikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLm5hbWVzID0gbmFtZXM7XG4gICAgICAgIHRoaXMudW5pZm9ybU5hbWVzID0gdGhpcy5uYW1lcy5tYXAobmFtZSA9PiBgdV8ke25hbWV9X3RgKTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy51c2VJbnRlZ2VyWm9vbSA9IHVzZUludGVnZXJab29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLm1heFZhbHVlID0gLUluZmluaXR5O1xuICAgICAgICBjb25zdCBQYWludFZlcnRleEFycmF5ID0gbGF5b3V0O1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBgYV8ke25hbWV9YCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmxvYXQzMicsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50czogdHlwZSA9PT0gJ2NvbG9yJyA/IDQgOiAyLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBQYWludFZlcnRleEFycmF5KCk7XG4gICAgfVxuXG4gICAgZGVmaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucygpIHt9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICBjb25zdCBwYWludEFycmF5ID0gdGhpcy5wYWludFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFpbnRBcnJheS5sZW5ndGg7XG4gICAgICAgIHBhaW50QXJyYXkucmVzZXJ2ZShuZXdMZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZmVhdHVyZSwge30sIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSArIDEpLCBmZWF0dXJlLCB7fSwgZm9ybWF0dGVkU2VjdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgbWluQ29sb3IgPSBwYWNrQ29sb3IobWluKTtcbiAgICAgICAgICAgIGNvbnN0IG1heENvbG9yID0gcGFja0NvbG9yKG1heCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBuZXdMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZUJhY2sobWluQ29sb3JbMF0sIG1pbkNvbG9yWzFdLCBtYXhDb2xvclswXSwgbWF4Q29sb3JbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbmV3TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYWludEFycmF5LmVtcGxhY2VCYWNrKG1pbiwgbWF4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBNYXRoLm1heCh0aGlzLm1heFZhbHVlLCBtaW4sIG1heCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEFycmF5KHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSkge1xuICAgICAgICBjb25zdCBwYWludEFycmF5ID0gdGhpcy5wYWludFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogdGhpcy56b29tICAgIH0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogdGhpcy56b29tICsgMX0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgbWluQ29sb3IgPSBwYWNrQ29sb3IobWluKTtcbiAgICAgICAgICAgIGNvbnN0IG1heENvbG9yID0gcGFja0NvbG9yKG1heCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZShpLCBtaW5Db2xvclswXSwgbWluQ29sb3JbMV0sIG1heENvbG9yWzBdLCBtYXhDb2xvclsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZShpLCBtaW4sIG1heCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5tYXhWYWx1ZSwgbWluLCBtYXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0aW9uRmFjdG9yKGN1cnJlbnRab29tOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlSW50ZWdlclpvb20pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uaW50ZXJwb2xhdGlvbkZhY3RvcihNYXRoLmZsb29yKGN1cnJlbnRab29tKSwgdGhpcy56b29tLCB0aGlzLnpvb20gKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uaW50ZXJwb2xhdGlvbkZhY3RvcihjdXJyZW50Wm9vbSwgdGhpcy56b29tLCB0aGlzLnpvb20gKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQ6IENvbnRleHQsIHVuaWZvcm06IFVuaWZvcm08Kj4sXG4gICAgICAgICAgICAgICAgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcyk6IHZvaWQge1xuICAgICAgICB1bmlmb3JtLnNldCh0aGlzLmludGVycG9sYXRpb25GYWN0b3IoZ2xvYmFscy56b29tKSk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pOiBVbmlmb3JtMWYge1xuICAgICAgICByZXR1cm4gbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyPFQ+IGltcGxlbWVudHMgQmluZGVyPFQ+IHtcbiAgICBleHByZXNzaW9uOiBDb21wb3NpdGVFeHByZXNzaW9uO1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHVuaWZvcm1OYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdXNlSW50ZWdlclpvb206IGJvb2xlYW47XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG1heFZhbHVlOiBudW1iZXI7XG4gICAgbGF5ZXJJZDogc3RyaW5nO1xuXG4gICAgem9vbUluUGFpbnRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXk7XG4gICAgem9vbU91dFBhaW50VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIHpvb21JblBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIHpvb21PdXRQYWludFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBwYWludFZlcnRleEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb24sIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcsIHVzZUludGVnZXJab29tOiBib29sZWFuLCB6b29tOiBudW1iZXIsIFBhaW50VmVydGV4QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5PiwgbGF5ZXJJZDogc3RyaW5nKSB7XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5uYW1lcyA9IG5hbWVzO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnVuaWZvcm1OYW1lcyA9IHRoaXMubmFtZXMubWFwKG5hbWUgPT4gYHVfJHtuYW1lfV90YCk7XG4gICAgICAgIHRoaXMudXNlSW50ZWdlclpvb20gPSB1c2VJbnRlZ2VyWm9vbTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IC1JbmZpbml0eTtcbiAgICAgICAgdGhpcy5sYXllcklkID0gbGF5ZXJJZDtcblxuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IG5hbWVzLm1hcCgobmFtZSkgPT5cbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgbmFtZTogYGFfJHtuYW1lfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogJ1VpbnQxNicsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50czogNCxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBQYWludFZlcnRleEFycmF5KCk7XG4gICAgfVxuXG4gICAgZGVmaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucygpIHt9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIC8vIFdlIHBvcHVsYXRlIHR3byBwYWludCBhcnJheXMgYmVjYXVzZSwgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIHdlIGRvbid0IGtub3cgd2hpY2ggZGlyZWN0aW9uXG4gICAgICAgIC8vIHdlJ3JlIGNyb3NzLWZhZGluZyB0byBhdCBsYXlvdXQgdGltZS4gSW4gb3JkZXIgdG8ga2VlcCB2ZXJ0ZXggYXR0cmlidXRlcyB0byBhIG1pbmltdW0gYW5kIG5vdCBwYXNzXG4gICAgICAgIC8vIHVubmVjZXNzYXJ5IHZlcnRleCBkYXRhIHRvIHRoZSBzaGFkZXJzLCB3ZSBkZXRlcm1pbmUgd2hpY2ggdG8gdXBsb2FkIGF0IGRyYXcgdGltZS5cblxuICAgICAgICBjb25zdCB6b29tSW5BcnJheSA9IHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3Qgem9vbU91dEFycmF5ID0gdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgeyBsYXllcklkIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBzdGFydCA9IHpvb21JbkFycmF5Lmxlbmd0aDtcblxuICAgICAgICB6b29tSW5BcnJheS5yZXNlcnZlKGxlbmd0aCk7XG4gICAgICAgIHpvb21PdXRBcnJheS5yZXNlcnZlKGxlbmd0aCk7XG5cbiAgICAgICAgaWYgKGltYWdlUG9zaXRpb25zICYmIGZlYXR1cmUucGF0dGVybnMgJiYgZmVhdHVyZS5wYXR0ZXJuc1tsYXllcklkXSkge1xuICAgICAgICAgICAgY29uc3QgeyBtaW4sIG1pZCwgbWF4IH0gPSBmZWF0dXJlLnBhdHRlcm5zW2xheWVySWRdO1xuXG4gICAgICAgICAgICBjb25zdCBpbWFnZU1pbiA9IGltYWdlUG9zaXRpb25zW21pbl07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1pZCA9IGltYWdlUG9zaXRpb25zW21pZF07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1heCA9IGltYWdlUG9zaXRpb25zW21heF07XG5cbiAgICAgICAgICAgIGlmICghaW1hZ2VNaW4gfHwgIWltYWdlTWlkIHx8ICFpbWFnZU1heCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHpvb21JbkFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1pZC50bFswXSwgaW1hZ2VNaWQudGxbMV0sIGltYWdlTWlkLmJyWzBdLCBpbWFnZU1pZC5iclsxXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNaW4udGxbMF0sIGltYWdlTWluLnRsWzFdLCBpbWFnZU1pbi5iclswXSwgaW1hZ2VNaW4uYnJbMV1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgem9vbU91dEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1pZC50bFswXSwgaW1hZ2VNaWQudGxbMV0sIGltYWdlTWlkLmJyWzBdLCBpbWFnZU1pZC5iclsxXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXgudGxbMF0sIGltYWdlTWF4LnRsWzFdLCBpbWFnZU1heC5iclswXSwgaW1hZ2VNYXguYnJbMV1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIC8vIFdlIHBvcHVsYXRlIHR3byBwYWludCBhcnJheXMgYmVjYXVzZSwgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIHdlIGRvbid0IGtub3cgd2hpY2ggZGlyZWN0aW9uXG4gICAgICAgIC8vIHdlJ3JlIGNyb3NzLWZhZGluZyB0byBhdCBsYXlvdXQgdGltZS4gSW4gb3JkZXIgdG8ga2VlcCB2ZXJ0ZXggYXR0cmlidXRlcyB0byBhIG1pbmltdW0gYW5kIG5vdCBwYXNzXG4gICAgICAgIC8vIHVubmVjZXNzYXJ5IHZlcnRleCBkYXRhIHRvIHRoZSBzaGFkZXJzLCB3ZSBkZXRlcm1pbmUgd2hpY2ggdG8gdXBsb2FkIGF0IGRyYXcgdGltZS5cblxuICAgICAgICBjb25zdCB6b29tSW5BcnJheSA9IHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3Qgem9vbU91dEFycmF5ID0gdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgeyBsYXllcklkIH0gPSB0aGlzO1xuXG4gICAgICAgIGlmIChpbWFnZVBvc2l0aW9ucyAmJiBmZWF0dXJlLnBhdHRlcm5zICYmIGZlYXR1cmUucGF0dGVybnNbbGF5ZXJJZF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHttaW4sIG1pZCwgbWF4fSA9IGZlYXR1cmUucGF0dGVybnNbbGF5ZXJJZF07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1pbiA9IGltYWdlUG9zaXRpb25zW21pbl07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1pZCA9IGltYWdlUG9zaXRpb25zW21pZF07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1heCA9IGltYWdlUG9zaXRpb25zW21heF07XG5cbiAgICAgICAgICAgIGlmICghaW1hZ2VNaW4gfHwgIWltYWdlTWlkIHx8ICFpbWFnZU1heCkgcmV0dXJuO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICB6b29tSW5BcnJheS5lbXBsYWNlKGksXG4gICAgICAgICAgICAgICAgICAgIGltYWdlTWlkLnRsWzBdLCBpbWFnZU1pZC50bFsxXSwgaW1hZ2VNaWQuYnJbMF0sIGltYWdlTWlkLmJyWzFdLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1pbi50bFswXSwgaW1hZ2VNaW4udGxbMV0sIGltYWdlTWluLmJyWzBdLCBpbWFnZU1pbi5iclsxXVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB6b29tT3V0QXJyYXkuZW1wbGFjZShpLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1pZC50bFswXSwgaW1hZ2VNaWQudGxbMV0sIGltYWdlTWlkLmJyWzBdLCBpbWFnZU1pZC5iclsxXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXgudGxbMF0sIGltYWdlTWF4LnRsWzFdLCBpbWFnZU1heC5iclswXSwgaW1hZ2VNYXguYnJbMV1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIgJiYgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICAgICAgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyKSB0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyKSB0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcblxuICAgIH1cblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQ6IENvbnRleHQsIHVuaWZvcm06IFVuaWZvcm08Kj4pOiB2b2lkIHtcbiAgICAgICAgdW5pZm9ybS5zZXQoMCk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pOiAkU2hhcGU8VW5pZm9ybTxhbnk+PiB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICB9XG59XG5cbi8qKlxuICogUHJvZ3JhbUNvbmZpZ3VyYXRpb24gY29udGFpbnMgdGhlIGxvZ2ljIGZvciBiaW5kaW5nIHN0eWxlIGxheWVyIHByb3BlcnRpZXMgYW5kIHRpbGVcbiAqIGxheWVyIGZlYXR1cmUgZGF0YSBpbnRvIEdMIHByb2dyYW0gdW5pZm9ybXMgYW5kIHZlcnRleCBhdHRyaWJ1dGVzLlxuICpcbiAqIE5vbi1kYXRhLWRyaXZlbiBwcm9wZXJ0eSB2YWx1ZXMgYXJlIGJvdW5kIHRvIHNoYWRlciB1bmlmb3Jtcy4gRGF0YS1kcml2ZW4gcHJvcGVydHlcbiAqIHZhbHVlcyBhcmUgYm91bmQgdG8gdmVydGV4IGF0dHJpYnV0ZXMuIEluIG9yZGVyIHRvIHN1cHBvcnQgYSB1bmlmb3JtIEdMU0wgc3ludGF4IG92ZXJcbiAqIGJvdGgsIFtNYXBib3ggR0wgU2hhZGVyc10oaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtc2hhZGVycykgZGVmaW5lcyBhIGAjcHJhZ21hYFxuICogYWJzdHJhY3Rpb24sIHdoaWNoIFByb2dyYW1Db25maWd1cmF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcuIEF0IHJ1bnRpbWUsXG4gKiBpdCBleGFtaW5lcyB0aGUgYXR0cmlidXRlcyBvZiBhIHBhcnRpY3VsYXIgbGF5ZXIsIGNvbWJpbmVzIHRoaXMgd2l0aCBmaXhlZCBrbm93bGVkZ2VcbiAqIGFib3V0IGhvdyBsYXllcnMgb2YgdGhlIHBhcnRpY3VsYXIgdHlwZSBhcmUgaW1wbGVtZW50ZWQsIGFuZCBkZXRlcm1pbmVzIHdoaWNoIHVuaWZvcm1zXG4gKiBhbmQgdmVydGV4IGF0dHJpYnV0ZXMgd2lsbCBiZSByZXF1aXJlZC4gSXQgY2FuIHRoZW4gc3Vic3RpdHV0ZSB0aGUgYXBwcm9wcmlhdGUgdGV4dFxuICogaW50byB0aGUgc2hhZGVyIHNvdXJjZSBjb2RlLCBjcmVhdGUgYW5kIGxpbmsgYSBwcm9ncmFtLCBhbmQgYmluZCB0aGUgdW5pZm9ybXMgYW5kXG4gKiB2ZXJ0ZXggYXR0cmlidXRlcyBpbiBwcmVwYXJhdGlvbiBmb3IgZHJhd2luZy5cbiAqXG4gKiBXaGVuIGEgdmVjdG9yIHRpbGUgaXMgcGFyc2VkLCB0aGlzIHNhbWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvXG4gKiBwb3B1bGF0ZSB0aGUgYXR0cmlidXRlIGJ1ZmZlcnMgbmVlZGVkIGZvciBkYXRhLWRyaXZlbiBzdHlsaW5nIHVzaW5nIHRoZSB6b29tXG4gKiBsZXZlbCBhbmQgZmVhdHVyZSBwcm9wZXJ0eSBkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICBiaW5kZXJzOiB7IFtzdHJpbmddOiBCaW5kZXI8YW55PiB9O1xuICAgIGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgbGF5b3V0QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuXG4gICAgX2J1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj47XG4gICAgX2ZlYXR1cmVNYXA6IEZlYXR1cmVQb3NpdGlvbk1hcDtcbiAgICBfYnVmZmVyT2Zmc2V0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iaW5kZXJzID0ge307XG4gICAgICAgIHRoaXMuY2FjaGVLZXkgPSAnJztcbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IFtdO1xuICAgICAgICB0aGlzLl9mZWF0dXJlTWFwID0gbmV3IEZlYXR1cmVQb3NpdGlvbk1hcCgpO1xuICAgICAgICB0aGlzLl9idWZmZXJPZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVEeW5hbWljPExheWVyOiBUeXBlZFN0eWxlTGF5ZXI+KGxheWVyOiBMYXllciwgem9vbTogbnVtYmVyLCBmaWx0ZXJQcm9wZXJ0aWVzOiAoc3RyaW5nKSA9PiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gbGF5ZXIucGFpbnQuX3ZhbHVlcykge1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXJQcm9wZXJ0aWVzKHByb3BlcnR5KSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxheWVyLnBhaW50LmdldChwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSkgfHwgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IHBhaW50QXR0cmlidXRlTmFtZXMocHJvcGVydHksIGxheWVyLnR5cGUpO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb24udHlwZTtcbiAgICAgICAgICAgIGNvbnN0IHVzZUludGVnZXJab29tID0gdmFsdWUucHJvcGVydHkudXNlSW50ZWdlclpvb207XG4gICAgICAgICAgICBjb25zdCBpc0Nyb3NzRmFkZWQgPSB2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uWydwcm9wZXJ0eS10eXBlJ10gPT09ICdjcm9zcy1mYWRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb25bJ3Byb3BlcnR5LXR5cGUnXSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcblxuICAgICAgICAgICAgaWYgKGlzQ3Jvc3NGYWRlZCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuYmluZGVyc1twcm9wZXJ0eV0gPSBuZXcgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyKHZhbHVlLnZhbHVlLnZhbHVlLCBuYW1lcywgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChgL3VfJHtwcm9wZXJ0eX1gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJ1Y3RBcnJheUxheW91dCA9IGxheW91dFR5cGUocHJvcGVydHksIHR5cGUsICdzb3VyY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKHZhbHVlLnZhbHVlLCBuYW1lcywgdHlwZSwgdXNlSW50ZWdlclpvb20sIHpvb20sIFN0cnVjdEFycmF5TGF5b3V0LCBsYXllci5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChgL2FfJHtwcm9wZXJ0eX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmJpbmRlcnNbcHJvcGVydHldID0gbmV3IENvbnN0YW50QmluZGVyKHZhbHVlLnZhbHVlLnZhbHVlLCBuYW1lcywgdHlwZSk7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGAvdV8ke3Byb3BlcnR5fWApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS52YWx1ZS5raW5kID09PSAnc291cmNlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdEFycmF5TGF5b3V0ID0gbGF5b3V0VHlwZShwcm9wZXJ0eSwgdHlwZSwgJ3NvdXJjZScpO1xuICAgICAgICAgICAgICAgIHNlbGYuYmluZGVyc1twcm9wZXJ0eV0gPSBuZXcgU291cmNlRXhwcmVzc2lvbkJpbmRlcih2YWx1ZS52YWx1ZSwgbmFtZXMsIHR5cGUsIFN0cnVjdEFycmF5TGF5b3V0KTtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goYC9hXyR7cHJvcGVydHl9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdEFycmF5TGF5b3V0ID0gbGF5b3V0VHlwZShwcm9wZXJ0eSwgdHlwZSwgJ2NvbXBvc2l0ZScpO1xuICAgICAgICAgICAgICAgIHNlbGYuYmluZGVyc1twcm9wZXJ0eV0gPSBuZXcgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcih2YWx1ZS52YWx1ZSwgbmFtZXMsIHR5cGUsIHVzZUludGVnZXJab29tLCB6b29tLCBTdHJ1Y3RBcnJheUxheW91dCk7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGAvel8ke3Byb3BlcnR5fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5jYWNoZUtleSA9IGtleXMuc29ydCgpLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheXMobmV3TGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGluZGV4OiBudW1iZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGJpbmRlci5wb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoLCBmZWF0dXJlLCBpbWFnZVBvc2l0aW9ucywgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZmVhdHVyZU1hcC5hZGQoK2ZlYXR1cmUuaWQsIGluZGV4LCB0aGlzLl9idWZmZXJPZmZzZXQsIG5ld0xlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gbmV3TGVuZ3RoO1xuICAgIH1cbiAgICBzZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG86IEltYWdlUG9zaXRpb24sIHBvc0Zyb206IEltYWdlUG9zaXRpb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBiaW5kZXIuc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHBvc1RvLCBwb3NGcm9tKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QXJyYXlzKGZlYXR1cmVTdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgbGF5ZXI6IFR5cGVkU3R5bGVMYXllciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGRpcnR5OiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gZmVhdHVyZVN0YXRlcykge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5fZmVhdHVyZU1hcC5nZXRQb3NpdGlvbnMoK2lkKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwb3Mgb2YgcG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHZ0TGF5ZXIuZmVhdHVyZShwb3MuaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIENvbnN0YW50QmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb25zdGFudEJpbmRlcikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYmluZGVyOiBhbnkpLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9BSE06IFJlbW92ZSBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjI1NVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsYXllci5wYWludC5nZXQocHJvcGVydHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGJpbmRlcjogYW55KS5leHByZXNzaW9uID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXIudXBkYXRlUGFpbnRBcnJheShwb3Muc3RhcnQsIHBvcy5lbmQsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZXNbaWRdLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cblxuICAgIGRlZmluZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5iaW5kZXJzW3Byb3BlcnR5XS5kZWZpbmVzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzKCk6IEFycmF5PFZlcnRleEJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVycztcbiAgICB9XG5cbiAgICBnZXRVbmlmb3Jtcyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBBcnJheTxCaW5kZXJVbmlmb3JtPiB7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1zID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGJpbmRlci51bmlmb3JtTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25zW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRpbmcgPSBiaW5kZXIuZ2V0QmluZGluZyhjb250ZXh0LCBsb2NhdGlvbnNbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5wdXNoKHtuYW1lLCBwcm9wZXJ0eSwgYmluZGluZ30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pZm9ybXM7XG4gICAgfVxuXG4gICAgc2V0VW5pZm9ybXM8UHJvcGVydGllczogT2JqZWN0Pihjb250ZXh0OiBDb250ZXh0LCBiaW5kZXJVbmlmb3JtczogQXJyYXk8QmluZGVyVW5pZm9ybT4sIHByb3BlcnRpZXM6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BlcnRpZXM+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIC8vIFVuaWZvcm0gc3RhdGUgYmluZGluZ3MgYXJlIG93bmVkIGJ5IHRoZSBQcm9ncmFtLCBidXQgd2Ugc2V0IHRoZW1cbiAgICAgICAgLy8gZnJvbSB3aXRoaW4gdGhlIFByb2dyYW1Db25maWd1cmF0b24ncyBiaW5kZXIgbWVtYmVycy5cbiAgICAgICAgZm9yIChjb25zdCB7bmFtZSwgcHJvcGVydHksIGJpbmRpbmd9IG9mIGJpbmRlclVuaWZvcm1zKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRlcnNbcHJvcGVydHldLnNldFVuaWZvcm1zKGNvbnRleHQsIGJpbmRpbmcsIGdsb2JhbHMsIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5KSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYXR0ZXJuUGFpbnRCdWZmZXJzKGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycykge1xuICAgICAgICBjb25zdCBidWZmZXJzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5WZXJ0ZXhCdWZmZXIgPSBjcm9zc2ZhZGUuZnJvbVNjYWxlID09PSAyID8gYmluZGVyLnpvb21JblBhaW50VmVydGV4QnVmZmVyIDogYmluZGVyLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVyblZlcnRleEJ1ZmZlcikgYnVmZmVycy5wdXNoKHBhdHRlcm5WZXJ0ZXhCdWZmZXIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoYmluZGVyIGluc3RhbmNlb2YgU291cmNlRXhwcmVzc2lvbkJpbmRlciB8fFxuICAgICAgICAgICAgICAgIGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIpICYmXG4gICAgICAgICAgICAgICAgYmluZGVyLnBhaW50VmVydGV4QnVmZmVyXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goYmluZGVyLnBhaW50VmVydGV4QnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2J1ZmZlcnMgPSBidWZmZXJzO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRlcnNbcHJvcGVydHldLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHxcbiAgICAgICAgICAgICAgICBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKSAmJlxuICAgICAgICAgICAgICAgIGJpbmRlci5wYWludFZlcnRleEJ1ZmZlclxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGJpbmRlci5wYWludFZlcnRleEJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IGJ1ZmZlcnM7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGVyc1twcm9wZXJ0eV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8TGF5ZXI6IFR5cGVkU3R5bGVMYXllcj4ge1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczoge1tzdHJpbmddOiBQcm9ncmFtQ29uZmlndXJhdGlvbn07XG4gICAgbmVlZHNVcGxvYWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXlvdXRBdHRyaWJ1dGVzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj4sIGxheWVyczogJFJlYWRPbmx5QXJyYXk8TGF5ZXI+LCB6b29tOiBudW1iZXIsIGZpbHRlclByb3BlcnRpZXM6IChzdHJpbmcpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlKSB7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0ge307XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllci5pZF0gPSBQcm9ncmFtQ29uZmlndXJhdGlvbi5jcmVhdGVEeW5hbWljKGxheWVyLCB6b29tLCBmaWx0ZXJQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2xheWVyLmlkXS5sYXlvdXRBdHRyaWJ1dGVzID0gbGF5b3V0QXR0cmlidXRlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5lZWRzVXBsb2FkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1trZXldLnBvcHVsYXRlUGFpbnRBcnJheXMobGVuZ3RoLCBmZWF0dXJlLCBpbmRleCwgaW1hZ2VQb3NpdGlvbnMsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QXJyYXlzKGZlYXR1cmVTdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgbGF5ZXJzOiAkUmVhZE9ubHlBcnJheTxUeXBlZFN0eWxlTGF5ZXI+LCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2xheWVyLmlkXS51cGRhdGVQYWludEFycmF5cyhmZWF0dXJlU3RhdGVzLCB2dExheWVyLCBsYXllciwgaW1hZ2VQb3NpdGlvbnMpIHx8IHRoaXMubmVlZHNVcGxvYWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQobGF5ZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllcklkXTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMubmVlZHNVcGxvYWQpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllcklkXS51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXJJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwYWludEF0dHJpYnV0ZU5hbWVzKHByb3BlcnR5LCB0eXBlKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZUV4Y2VwdGlvbnMgPSB7XG4gICAgICAgICd0ZXh0LW9wYWNpdHknOiBbJ29wYWNpdHknXSxcbiAgICAgICAgJ2ljb24tb3BhY2l0eSc6IFsnb3BhY2l0eSddLFxuICAgICAgICAndGV4dC1jb2xvcic6IFsnZmlsbF9jb2xvciddLFxuICAgICAgICAnaWNvbi1jb2xvcic6IFsnZmlsbF9jb2xvciddLFxuICAgICAgICAndGV4dC1oYWxvLWNvbG9yJzogWydoYWxvX2NvbG9yJ10sXG4gICAgICAgICdpY29uLWhhbG8tY29sb3InOiBbJ2hhbG9fY29sb3InXSxcbiAgICAgICAgJ3RleHQtaGFsby1ibHVyJzogWydoYWxvX2JsdXInXSxcbiAgICAgICAgJ2ljb24taGFsby1ibHVyJzogWydoYWxvX2JsdXInXSxcbiAgICAgICAgJ3RleHQtaGFsby13aWR0aCc6IFsnaGFsb193aWR0aCddLFxuICAgICAgICAnaWNvbi1oYWxvLXdpZHRoJzogWydoYWxvX3dpZHRoJ10sXG4gICAgICAgICdsaW5lLWdhcC13aWR0aCc6IFsnZ2Fwd2lkdGgnXSxcbiAgICAgICAgJ2xpbmUtcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nXSxcbiAgICAgICAgJ2ZpbGwtcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nXSxcbiAgICAgICAgJ2ZpbGwtZXh0cnVzaW9uLXBhdHRlcm4nOiBbJ3BhdHRlcm5fdG8nLCAncGF0dGVybl9mcm9tJ10sXG4gICAgfTtcblxuICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lRXhjZXB0aW9uc1twcm9wZXJ0eV0gfHxcbiAgICAgICAgW3Byb3BlcnR5LnJlcGxhY2UoYCR7dHlwZX0tYCwgJycpLnJlcGxhY2UoLy0vZywgJ18nKV07XG59XG5cbmZ1bmN0aW9uIGdldExheW91dEV4Y2VwdGlvbihwcm9wZXJ0eSkge1xuICAgIGNvbnN0IHByb3BlcnR5RXhjZXB0aW9ucyA9IHtcbiAgICAgICAgJ2xpbmUtcGF0dGVybic6e1xuICAgICAgICAgICAgJ3NvdXJjZSc6IFBhdHRlcm5MYXlvdXRBcnJheSxcbiAgICAgICAgICAgICdjb21wb3NpdGUnOiBQYXR0ZXJuTGF5b3V0QXJyYXlcbiAgICAgICAgfSxcbiAgICAgICAgJ2ZpbGwtcGF0dGVybic6IHtcbiAgICAgICAgICAgICdzb3VyY2UnOiBQYXR0ZXJuTGF5b3V0QXJyYXksXG4gICAgICAgICAgICAnY29tcG9zaXRlJzogUGF0dGVybkxheW91dEFycmF5XG4gICAgICAgIH0sXG4gICAgICAgICdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJzp7XG4gICAgICAgICAgICAnc291cmNlJzogUGF0dGVybkxheW91dEFycmF5LFxuICAgICAgICAgICAgJ2NvbXBvc2l0ZSc6IFBhdHRlcm5MYXlvdXRBcnJheVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwcm9wZXJ0eUV4Y2VwdGlvbnNbcHJvcGVydHldO1xufVxuXG5mdW5jdGlvbiBsYXlvdXRUeXBlKHByb3BlcnR5LCB0eXBlLCBiaW5kZXJUeXBlKSB7XG4gICAgY29uc3QgZGVmYXVsdExheW91dHMgPSB7XG4gICAgICAgICdjb2xvcic6IHtcbiAgICAgICAgICAgICdzb3VyY2UnOiBTdHJ1Y3RBcnJheUxheW91dDJmOCxcbiAgICAgICAgICAgICdjb21wb3NpdGUnOiBTdHJ1Y3RBcnJheUxheW91dDRmMTZcbiAgICAgICAgfSxcbiAgICAgICAgJ251bWJlcic6IHtcbiAgICAgICAgICAgICdzb3VyY2UnOiBTdHJ1Y3RBcnJheUxheW91dDFmNCxcbiAgICAgICAgICAgICdjb21wb3NpdGUnOiBTdHJ1Y3RBcnJheUxheW91dDJmOFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGxheW91dEV4Y2VwdGlvbiA9IGdldExheW91dEV4Y2VwdGlvbihwcm9wZXJ0eSk7XG4gICAgcmV0dXJuICBsYXlvdXRFeGNlcHRpb24gJiYgbGF5b3V0RXhjZXB0aW9uW2JpbmRlclR5cGVdIHx8XG4gICAgICAgIGRlZmF1bHRMYXlvdXRzW3R5cGVdW2JpbmRlclR5cGVdO1xufVxuXG5yZWdpc3RlcignQ29uc3RhbnRCaW5kZXInLCBDb25zdGFudEJpbmRlcik7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyJywgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyKTtcbnJlZ2lzdGVyKCdTb3VyY2VFeHByZXNzaW9uQmluZGVyJywgU291cmNlRXhwcmVzc2lvbkJpbmRlcik7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcicsIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpO1xucmVnaXN0ZXIoJ0NvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXInLCBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKTtcbnJlZ2lzdGVyKCdQcm9ncmFtQ29uZmlndXJhdGlvbicsIFByb2dyYW1Db25maWd1cmF0aW9uLCB7b21pdDogWydfYnVmZmVycyddfSk7XG5yZWdpc3RlcignUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQnLCBQcm9ncmFtQ29uZmlndXJhdGlvblNldCk7XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgY29vcmRpbmF0ZSBpbiB0aGUgaW50ZXJuYWwgdGlsZSBjb29yZGluYXRlIHN5c3RlbS4gQ29vcmRpbmF0ZXMgb2ZcbiAqIGFsbCBzb3VyY2UgZmVhdHVyZXMgbm9ybWFsaXplZCB0byB0aGlzIGV4dGVudCB1cG9uIGxvYWQuXG4gKlxuICogVGhlIHZhbHVlIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAqIFZlcnRleCBidWZmZXIgc3RvcmUgcG9zaXRpb25zIGFzIHNpZ25lZCAxNiBiaXQgaW50ZWdlcnMuXG4gKiAqIE9uZSBiaXQgaXMgbG9zdCBmb3Igc2lnbmVkbmVzcyB0byBzdXBwb3J0IHRpbGUgYnVmZmVycy5cbiAqICogT25lIGJpdCBpcyBsb3N0IGJlY2F1c2UgdGhlIGxpbmUgdmVydGV4IGJ1ZmZlciB1c2VkIHRvIHBhY2sgMSBiaXQgb2Ygb3RoZXIgZGF0YSBpbnRvIHRoZSBpbnQuXG4gKiAqIE9uZSBiaXQgaXMgbG9zdCB0byBzdXBwb3J0IGZlYXR1cmVzIGV4dGVuZGluZyBwYXN0IHRoZSBleHRlbnQgb24gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHRpbGUuXG4gKiAqIFRoaXMgbGVhdmVzIHVzIHdpdGggMl4xMyA9IDgxOTJcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IDgxOTI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyB3YXJuT25jZSwgY2xhbXAgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgRVhURU5UIGZyb20gJy4vZXh0ZW50JztcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbi8vIFRoZXNlIGJvdW5kcyBkZWZpbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gc3VwcG9ydGVkIGNvb3JkaW5hdGUgdmFsdWVzLlxuLy8gV2hpbGUgdmlzaWJsZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIFswLCBFWFRFTlRdLCB0aWxlcyBtYXkgdGhlb3JldGljYWxseVxuLy8gY29udGFpbiBjb3JkaW5hdGVzIHdpdGhpbiBbLUluZmluaXR5LCBJbmZpbml0eV0uIE91ciByYW5nZSBpcyBsaW1pdGVkIGJ5IHRoZVxuLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvb3JkaW5hdGUuXG5mdW5jdGlvbiBjcmVhdGVCb3VuZHMoYml0cykge1xuICAgIHJldHVybiB7XG4gICAgICAgIG1pbjogLTEgKiBNYXRoLnBvdygyLCBiaXRzIC0gMSksXG4gICAgICAgIG1heDogTWF0aC5wb3coMiwgYml0cyAtIDEpIC0gMVxuICAgIH07XG59XG5cbmNvbnN0IGJvdW5kcyA9IGNyZWF0ZUJvdW5kcygxNSk7XG5cbi8qKlxuICogTG9hZHMgYSBnZW9tZXRyeSBmcm9tIGEgVmVjdG9yVGlsZUZlYXR1cmUgYW5kIHNjYWxlcyBpdCB0byB0aGUgY29tbW9uIGV4dGVudFxuICogdXNlZCBpbnRlcm5hbGx5LlxuICogQHBhcmFtIHtWZWN0b3JUaWxlRmVhdHVyZX0gZmVhdHVyZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9hZEdlb21ldHJ5KGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlKTogQXJyYXk8QXJyYXk8UG9pbnQ+PiB7XG4gICAgY29uc3Qgc2NhbGUgPSBFWFRFTlQgLyBmZWF0dXJlLmV4dGVudDtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUubG9hZEdlb21ldHJ5KCk7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBnZW9tZXRyeS5sZW5ndGg7IHIrKykge1xuICAgICAgICBjb25zdCByaW5nID0gZ2VvbWV0cnlbcl07XG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcmluZy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSByaW5nW3BdO1xuICAgICAgICAgICAgLy8gcm91bmQgaGVyZSBiZWNhdXNlIG1hcGJveC1nbC1uYXRpdmUgdXNlcyBpbnRlZ2VycyB0byByZXByZXNlbnRcbiAgICAgICAgICAgIC8vIHBvaW50cyBhbmQgd2UgbmVlZCB0byBkbyB0aGUgc2FtZSB0byBhdm9pZCByZW5lcmluZyBkaWZmZXJlbmNlcy5cbiAgICAgICAgICAgIHBvaW50LnggPSBNYXRoLnJvdW5kKHBvaW50LnggKiBzY2FsZSk7XG4gICAgICAgICAgICBwb2ludC55ID0gTWF0aC5yb3VuZChwb2ludC55ICogc2NhbGUpO1xuXG4gICAgICAgICAgICBpZiAocG9pbnQueCA8IGJvdW5kcy5taW4gfHwgcG9pbnQueCA+IGJvdW5kcy5tYXggfHwgcG9pbnQueSA8IGJvdW5kcy5taW4gfHwgcG9pbnQueSA+IGJvdW5kcy5tYXgpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnR2VvbWV0cnkgZXhjZWVkcyBhbGxvd2VkIGV4dGVudCwgcmVkdWNlIHlvdXIgdmVjdG9yIHRpbGUgYnVmZmVyIHNpemUnKTtcbiAgICAgICAgICAgICAgICBwb2ludC54ID0gY2xhbXAocG9pbnQueCwgYm91bmRzLm1pbiwgYm91bmRzLm1heCk7XG4gICAgICAgICAgICAgICAgcG9pbnQueSA9IGNsYW1wKHBvaW50LnksIGJvdW5kcy5taW4sIGJvdW5kcy5tYXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZW9tZXRyeTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IENpcmNsZUxheW91dEFycmF5IH0gZnJvbSAnLi4vYXJyYXlfdHlwZXMnO1xuXG5pbXBvcnQgeyBtZW1iZXJzIGFzIGxheW91dEF0dHJpYnV0ZXMgfSBmcm9tICcuL2NpcmNsZV9hdHRyaWJ1dGVzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL3NlZ21lbnQnO1xuaW1wb3J0IHsgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQgfSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgVHJpYW5nbGVJbmRleEFycmF5IH0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZSc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnknO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9leHRlbnQnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBCdWNrZXQsXG4gICAgQnVja2V0UGFyYW1ldGVycyxcbiAgICBCdWNrZXRGZWF0dXJlLFxuICAgIEluZGV4ZWRGZWF0dXJlLFxuICAgIFBvcHVsYXRlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9idWNrZXQnO1xuaW1wb3J0IHR5cGUgQ2lyY2xlU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgSGVhdG1hcFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvaW5kZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uLy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5cbmZ1bmN0aW9uIGFkZENpcmNsZVZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgeCwgeSwgZXh0cnVkZVgsIGV4dHJ1ZGVZKSB7XG4gICAgbGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICh4ICogMikgKyAoKGV4dHJ1ZGVYICsgMSkgLyAyKSxcbiAgICAgICAgKHkgKiAyKSArICgoZXh0cnVkZVkgKyAxKSAvIDIpKTtcbn1cblxuLyoqXG4gKiBDaXJjbGVzIGFyZSByZXByZXNlbnRlZCBieSB0d28gdHJpYW5nbGVzLlxuICpcbiAqIEVhY2ggY29ybmVyIGhhcyBhIHBvcyB0aGF0IGlzIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSBhbmQgYW4gZXh0cnVzaW9uXG4gKiB2ZWN0b3IgdGhhdCBpcyB3aGVyZSBpdCBwb2ludHMuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDaXJjbGVCdWNrZXQ8TGF5ZXI6IENpcmNsZVN0eWxlTGF5ZXIgfCBIZWF0bWFwU3R5bGVMYXllcj4gaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgbGF5ZXJzOiBBcnJheTxMYXllcj47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PExheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IENpcmNsZUxheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxMYXllcj47XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPExheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgQ2lyY2xlTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQobGF5b3V0QXR0cmlidXRlcywgb3B0aW9ucy5sYXllcnMsIG9wdGlvbnMuem9vbSk7XG4gICAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcCgobCkgPT4gbC5pZCk7XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXM6IEFycmF5PEluZGV4ZWRGZWF0dXJlPiwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlTGF5ZXIgPSB0aGlzLmxheWVyc1swXTtcbiAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZXMgPSBbXTtcbiAgICAgICAgbGV0IGNpcmNsZVNvcnRLZXkgPSBudWxsO1xuXG4gICAgICAgIC8vIEhlYXRtYXAgbGF5ZXJzIGFyZSBoYW5kbGVkIGluIHRoaXMgYnVja2V0IGFuZCBoYXZlIG5vIGV2YWx1YXRlZCBwcm9wZXJ0aWVzLCBzbyB3ZSBjaGVjayBvdXIgYWNjZXNzXG4gICAgICAgIGlmIChzdHlsZUxheWVyLnR5cGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICBjaXJjbGVTb3J0S2V5ID0gKChzdHlsZUxheWVyOiBhbnkpOiBDaXJjbGVTdHlsZUxheWVyKS5sYXlvdXQuZ2V0KCdjaXJjbGUtc29ydC1rZXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qge2ZlYXR1cmUsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20pLCBmZWF0dXJlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRLZXkgPSBjaXJjbGVTb3J0S2V5ID9cbiAgICAgICAgICAgICAgICAgICAgY2lyY2xlU29ydEtleS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkgOlxuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgICAgICAgICBzb3J0S2V5XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnB1c2goYnVja2V0RmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lyY2xlU29ydEtleSkge1xuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGEuc29ydEtleSBpcyBhbHdheXMgYSBudW1iZXIgd2hlbiBpbiB1c2VcbiAgICAgICAgICAgICAgICByZXR1cm4gKChhLnNvcnRLZXk6IGFueSk6IG51bWJlcikgLSAoKGIuc29ydEtleTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBidWNrZXRGZWF0dXJlIG9mIGJ1Y2tldEZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb25zdCB7Z2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSA9IGJ1Y2tldEZlYXR1cmU7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXNbaW5kZXhdLmZlYXR1cmU7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShidWNrZXRGZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgpO1xuICAgICAgICAgICAgb3B0aW9ucy5mZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleCwgdGhpcy5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHJpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gcG9pbnQueDtcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gcG9pbnQueTtcblxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBpbmNsdWRlIHBvaW50cyB0aGF0IGFyZSBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kYXJpZXMuXG4gICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHggPj0gRVhURU5UIHx8IHkgPCAwIHx8IHkgPj0gRVhURU5UKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgd2lsbCBiZSBvZiB0aGUgUG9pbnQgdHlwZSwgYW5kIHdlJ2xsIGRlcml2ZVxuICAgICAgICAgICAgICAgIC8vIHR3byB0cmlhbmdsZXMgZnJvbSBpdC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIMOiwpTCjMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCkFxuICAgICAgICAgICAgICAgIC8vIMOiwpTCgiAzICAgICAyIMOiwpTCglxuICAgICAgICAgICAgICAgIC8vIMOiwpTCgiAgICAgICAgIMOiwpTCglxuICAgICAgICAgICAgICAgIC8vIMOiwpTCgiAwICAgICAxIMOiwpTCglxuICAgICAgICAgICAgICAgIC8vIMOiwpTClMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCmFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5LCBmZWF0dXJlLnNvcnRLZXkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBhZGRDaXJjbGVWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgeCwgeSwgLTEsIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRDaXJjbGVWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgeCwgeSwgMSwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAxLCAxKTtcbiAgICAgICAgICAgICAgICBhZGRDaXJjbGVWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgeCwgeSwgLTEsIDEpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEsIGluZGV4ICsgMik7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDMsIGluZGV4ICsgMik7XG5cbiAgICAgICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBpbmRleCwge30pO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0NpcmNsZUJ1Y2tldCcsIENpcmNsZUJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlQnVja2V0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgaXNDb3VudGVyQ2xvY2t3aXNlIH0gZnJvbSAnLi91dGlsJztcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5leHBvcnQgeyBwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkUG9pbnQsIHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uLCBwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lLCBwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24sIGRpc3RUb1NlZ21lbnRTcXVhcmVkLCBwb2x5Z29uSW50ZXJzZWN0c0JveCB9O1xuXG50eXBlIExpbmUgPSBBcnJheTxQb2ludD47XG50eXBlIE11bHRpTGluZSA9IEFycmF5PExpbmU+O1xudHlwZSBSaW5nID0gQXJyYXk8UG9pbnQ+O1xudHlwZSBQb2x5Z29uID0gQXJyYXk8UG9pbnQ+O1xudHlwZSBNdWx0aVBvbHlnb24gPSBBcnJheTxQb2x5Z29uPjtcblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHBvbHlnb25BOiBQb2x5Z29uLCBwb2x5Z29uQjogUG9seWdvbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbkEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb25CLCBwb2x5Z29uQVtpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbkIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb25BLCBwb2x5Z29uQltpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsaW5lSW50ZXJzZWN0c0xpbmUocG9seWdvbkEsIHBvbHlnb25CKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludChwb2x5Z29uOiBQb2x5Z29uLCBwb2ludDogUG9pbnQsIHJhZGl1czogbnVtYmVyKSB7XG4gICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb24sIHBvaW50KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShwb2ludCwgcG9seWdvbiwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbihwb2x5Z29uOiBQb2x5Z29uLCBtdWx0aVBvbHlnb246IE11bHRpUG9seWdvbikge1xuXG4gICAgaWYgKHBvbHlnb24ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG11bHRpUG9seWdvbiwgcG9seWdvblswXSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdWx0aVBvbHlnb24ubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgY29uc3QgcmluZyA9IG11bHRpUG9seWdvblttXTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByaW5nLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbiwgcmluZ1tuXSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG11bHRpUG9seWdvbiwgcG9seWdvbltpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbXVsdGlQb2x5Z29uLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGlmIChsaW5lSW50ZXJzZWN0c0xpbmUocG9seWdvbiwgbXVsdGlQb2x5Z29uW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lKHBvbHlnb246IFBvbHlnb24sIG11bHRpTGluZTogTXVsdGlMaW5lLCByYWRpdXM6IG51bWJlcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXVsdGlMaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBtdWx0aUxpbmVbaV07XG5cbiAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uLCBsaW5lW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUocG9seWdvbiwgbGluZSwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUE6IExpbmUsIGxpbmVCOiBMaW5lLCByYWRpdXM6IG51bWJlcikge1xuXG4gICAgaWYgKGxpbmVBLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShsaW5lQSwgbGluZUIpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGFueSBwb2ludCBpbiBlaXRoZXIgbGluZSBpcyB3aXRoaW4gcmFkaXVzIG9mIHRoZSBvdGhlciBsaW5lXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUJbal0sIGxpbmVBLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZUEubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQVtrXSwgbGluZUIsIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNMaW5lKGxpbmVBOiBMaW5lLCBsaW5lQjogTGluZSkge1xuICAgIGlmIChsaW5lQS5sZW5ndGggPT09IDAgfHwgbGluZUIubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgYTAgPSBsaW5lQVtpXTtcbiAgICAgICAgY29uc3QgYTEgPSBsaW5lQVtpICsgMV07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBiMCA9IGxpbmVCW2pdO1xuICAgICAgICAgICAgY29uc3QgYjEgPSBsaW5lQltqICsgMV07XG4gICAgICAgICAgICBpZiAobGluZVNlZ21lbnRJbnRlcnNlY3RzTGluZVNlZ21lbnQoYTAsIGExLCBiMCwgYjEpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVTZWdtZW50SW50ZXJzZWN0c0xpbmVTZWdtZW50KGEwOiBQb2ludCwgYTE6IFBvaW50LCBiMDogUG9pbnQsIGIxOiBQb2ludCkge1xuICAgIHJldHVybiBpc0NvdW50ZXJDbG9ja3dpc2UoYTAsIGIwLCBiMSkgIT09IGlzQ291bnRlckNsb2Nrd2lzZShhMSwgYjAsIGIxKSAmJlxuICAgICAgICBpc0NvdW50ZXJDbG9ja3dpc2UoYTAsIGExLCBiMCkgIT09IGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYTEsIGIxKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKHA6IFBvaW50LCBsaW5lOiBMaW5lLCByYWRpdXM6IG51bWJlcikge1xuICAgIGNvbnN0IHJhZGl1c1NxdWFyZWQgPSByYWRpdXMgKiByYWRpdXM7XG5cbiAgICBpZiAobGluZS5sZW5ndGggPT09IDEpIHJldHVybiBwLmRpc3RTcXIobGluZVswXSkgPCByYWRpdXNTcXVhcmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEZpbmQgbGluZSBzZWdtZW50cyB0aGF0IGhhdmUgYSBkaXN0YW5jZSA8PSByYWRpdXNeMiB0byBwXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgdHJlYXQgdGhlIGxpbmUgYXMgXCJjb250YWluaW5nIHBvaW50IHBcIi5cbiAgICAgICAgY29uc3QgdiA9IGxpbmVbaSAtIDFdLCB3ID0gbGluZVtpXTtcbiAgICAgICAgaWYgKGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIHYsIHcpIDwgcmFkaXVzU3F1YXJlZCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gQ29kZSBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1MDE3MjUvMzMxMzc5LlxuZnVuY3Rpb24gZGlzdFRvU2VnbWVudFNxdWFyZWQocDogUG9pbnQsIHY6IFBvaW50LCB3OiBQb2ludCkge1xuICAgIGNvbnN0IGwyID0gdi5kaXN0U3FyKHcpO1xuICAgIGlmIChsMiA9PT0gMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBjb25zdCB0ID0gKChwLnggLSB2LngpICogKHcueCAtIHYueCkgKyAocC55IC0gdi55KSAqICh3LnkgLSB2LnkpKSAvIGwyO1xuICAgIGlmICh0IDwgMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBpZiAodCA+IDEpIHJldHVybiBwLmRpc3RTcXIodyk7XG4gICAgcmV0dXJuIHAuZGlzdFNxcih3LnN1Yih2KS5fbXVsdCh0KS5fYWRkKHYpKTtcbn1cblxuLy8gcG9pbnQgaW4gcG9seWdvbiByYXkgY2FzdGluZyBhbGdvcml0aG1cbmZ1bmN0aW9uIG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQocmluZ3M6IEFycmF5PFJpbmc+LCBwOiBQb2ludCkge1xuICAgIGxldCBjID0gZmFsc2UsXG4gICAgICAgIHJpbmcsIHAxLCBwMjtcblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcmluZ3MubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgcmluZyA9IHJpbmdzW2tdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IHJpbmcubGVuZ3RoIC0gMTsgaSA8IHJpbmcubGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgICAgICBpZiAoKChwMS55ID4gcC55KSAhPT0gKHAyLnkgPiBwLnkpKSAmJiAocC54IDwgKHAyLnggLSBwMS54KSAqIChwLnkgLSBwMS55KSAvIChwMi55IC0gcDEueSkgKyBwMS54KSkge1xuICAgICAgICAgICAgICAgIGMgPSAhYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcG9seWdvbkNvbnRhaW5zUG9pbnQocmluZzogUmluZywgcDogUG9pbnQpIHtcbiAgICBsZXQgYyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgY29uc3QgcDEgPSByaW5nW2ldO1xuICAgICAgICBjb25zdCBwMiA9IHJpbmdbal07XG4gICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICBjID0gIWM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzQm94KHJpbmc6IFJpbmcsIGJveFgxOiBudW1iZXIsIGJveFkxOiBudW1iZXIsIGJveFgyOiBudW1iZXIsIGJveFkyOiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IHAgb2YgcmluZykge1xuICAgICAgICBpZiAoYm94WDEgPD0gcC54ICYmXG4gICAgICAgICAgICBib3hZMSA8PSBwLnkgJiZcbiAgICAgICAgICAgIGJveFgyID49IHAueCAmJlxuICAgICAgICAgICAgYm94WTIgPj0gcC55KSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3JuZXJzID0gW1xuICAgICAgICBuZXcgUG9pbnQoYm94WDEsIGJveFkxKSxcbiAgICAgICAgbmV3IFBvaW50KGJveFgxLCBib3hZMiksXG4gICAgICAgIG5ldyBQb2ludChib3hYMiwgYm94WTIpLFxuICAgICAgICBuZXcgUG9pbnQoYm94WDIsIGJveFkxKV07XG5cbiAgICBpZiAocmluZy5sZW5ndGggPiAyKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29ybmVyIG9mIGNvcm5lcnMpIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChyaW5nLCBjb3JuZXIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcDEgPSByaW5nW2ldO1xuICAgICAgICBjb25zdCBwMiA9IHJpbmdbaSArIDFdO1xuICAgICAgICBpZiAoZWRnZUludGVyc2VjdHNCb3gocDEsIHAyLCBjb3JuZXJzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBlZGdlSW50ZXJzZWN0c0JveChlMTogUG9pbnQsIGUyOiBQb2ludCwgY29ybmVyczogQXJyYXk8UG9pbnQ+KSB7XG4gICAgY29uc3QgdGwgPSBjb3JuZXJzWzBdO1xuICAgIGNvbnN0IGJyID0gY29ybmVyc1syXTtcbiAgICAvLyB0aGUgZWRnZSBhbmQgYm94IGRvIG5vdCBpbnRlcnNlY3QgaW4gZWl0aGVyIHRoZSB4IG9yIHkgZGltZW5zaW9uc1xuICAgIGlmICgoKGUxLnggPCB0bC54KSAmJiAoZTIueCA8IHRsLngpKSB8fFxuICAgICAgICAoKGUxLnggPiBici54KSAmJiAoZTIueCA+IGJyLngpKSB8fFxuICAgICAgICAoKGUxLnkgPCB0bC55KSAmJiAoZTIueSA8IHRsLnkpKSB8fFxuICAgICAgICAoKGUxLnkgPiBici55KSAmJiAoZTIueSA+IGJyLnkpKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gY2hlY2sgaWYgYWxsIGNvcm5lcnMgb2YgdGhlIGJveCBhcmUgb24gdGhlIHNhbWUgc2lkZSBvZiB0aGUgZWRnZVxuICAgIGNvbnN0IGRpciA9IGlzQ291bnRlckNsb2Nrd2lzZShlMSwgZTIsIGNvcm5lcnNbMF0pO1xuICAgIHJldHVybiBkaXIgIT09IGlzQ291bnRlckNsb2Nrd2lzZShlMSwgZTIsIGNvcm5lcnNbMV0pIHx8XG4gICAgICAgIGRpciAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGUxLCBlMiwgY29ybmVyc1syXSkgfHxcbiAgICAgICAgZGlyICE9PSBpc0NvdW50ZXJDbG9ja3dpc2UoZTEsIGUyLCBjb3JuZXJzWzNdKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHR5cGUge1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZX0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heGltdW1QYWludFZhbHVlKHByb3BlcnR5OiBzdHJpbmcsIGxheWVyOiBTdHlsZUxheWVyLCBidWNrZXQ6IENpcmNsZUJ1Y2tldDwqPiB8IExpbmVCdWNrZXQpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlID0gKChsYXllci5wYWludDogYW55KS5nZXQocHJvcGVydHkpOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8YW55PikudmFsdWU7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJpbmRlcnMgPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCkuYmluZGVycztcbiAgICAgICAgcmV0dXJuIGJpbmRlcnNbcHJvcGVydHldLm1heFZhbHVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZURpc3RhbmNlKHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXSkge1xuICAgIHJldHVybiBNYXRoLnNxcnQodHJhbnNsYXRlWzBdICogdHJhbnNsYXRlWzBdICsgdHJhbnNsYXRlWzFdICogdHJhbnNsYXRlWzFdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUFuY2hvcjogJ3ZpZXdwb3J0JyB8ICdtYXAnLFxuICAgICAgICAgICAgICAgICAgIGJlYXJpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkge1xuICAgICAgICByZXR1cm4gcXVlcnlHZW9tZXRyeTtcbiAgICB9XG4gICAgY29uc3QgcHQgPSBQb2ludC5jb252ZXJ0KHRyYW5zbGF0ZSkuX211bHQocGl4ZWxzVG9UaWxlVW5pdHMpO1xuXG4gICAgaWYgKHRyYW5zbGF0ZUFuY2hvciA9PT0gXCJ2aWV3cG9ydFwiKSB7XG4gICAgICAgIHB0Ll9yb3RhdGUoLWJlYXJpbmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5R2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBxdWVyeUdlb21ldHJ5W2ldO1xuICAgICAgICB0cmFuc2xhdGVkLnB1c2gocG9pbnQuc3ViKHB0KSk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkO1xufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmV4cG9ydCB0eXBlIExheW91dFByb3BzID0ge3xcbiAgICBcImNpcmNsZS1zb3J0LWtleVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiY2lyY2xlLXNvcnQta2V5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2NpcmNsZVwiXVtcImNpcmNsZS1zb3J0LWtleVwiXSksXG59KTtcblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJjaXJjbGUtcmFkaXVzXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiY2lyY2xlLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJjaXJjbGUtYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImNpcmNsZS1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiY2lyY2xlLXBpdGNoLXNjYWxlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImNpcmNsZS1zdHJva2Utd2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJjaXJjbGUtcmFkaXVzXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXJhZGl1c1wiXSksXG4gICAgXCJjaXJjbGUtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtY29sb3JcIl0pLFxuICAgIFwiY2lyY2xlLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtYmx1clwiXSksXG4gICAgXCJjaXJjbGUtb3BhY2l0eVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1vcGFjaXR5XCJdKSxcbiAgICBcImNpcmNsZS10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS10cmFuc2xhdGVcIl0pLFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCJdKSxcbiAgICBcImNpcmNsZS1waXRjaC1zY2FsZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXBpdGNoLXNjYWxlXCJdKSxcbiAgICBcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIl0pLFxuICAgIFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1zdHJva2Utd2lkdGhcIl0pLFxuICAgIFwiY2lyY2xlLXN0cm9rZS1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1zdHJva2UtY29sb3JcIl0pLFxuICAgIFwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50LCBsYXlvdXQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4sIGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz5cbn0+KTtcbiIsIi8qKlxyXG4gKiBDb21tb24gdXRpbGl0aWVzXHJcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcclxuICovXG4vLyBDb25maWd1cmF0aW9uIENvbnN0YW50c1xuZXhwb3J0IHZhciBFUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgdmFyIEFSUkFZX1RZUEUgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuZXhwb3J0IHZhciBSQU5ET00gPSBNYXRoLnJhbmRvbTtcbi8qKlxyXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcclxuICpcclxuICogQHBhcmFtIHtUeXBlfSB0eXBlIEFycmF5IHR5cGUsIHN1Y2ggYXMgRmxvYXQzMkFycmF5IG9yIEFycmF5XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWF0cml4QXJyYXlUeXBlKHR5cGUpIHtcbiAgQVJSQVlfVFlQRSA9IHR5cGU7XG59XG52YXIgZGVncmVlID0gTWF0aC5QSSAvIDE4MDtcbi8qKlxyXG4gKiBDb252ZXJ0IERlZ3JlZSBUbyBSYWRpYW5cclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQW5nbGUgaW4gRGVncmVlc1xyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFkaWFuKGEpIHtcbiAgcmV0dXJuIGEgKiBkZWdyZWU7XG59XG4vKipcclxuICogVGVzdHMgd2hldGhlciBvciBub3QgdGhlIGFyZ3VtZW50cyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdmFsdWUsIHdpdGhpbiBhbiBhYnNvbHV0ZVxyXG4gKiBvciByZWxhdGl2ZSB0b2xlcmFuY2Ugb2YgZ2xNYXRyaXguRVBTSUxPTiAoYW4gYWJzb2x1dGUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIHZhbHVlcyBsZXNzXHJcbiAqIHRoYW4gb3IgZXF1YWwgdG8gMS4wLCBhbmQgYSByZWxhdGl2ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgbGFyZ2VyIHZhbHVlcylcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IG51bWJlciB0byB0ZXN0LlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBUaGUgc2Vjb25kIG51bWJlciB0byB0ZXN0LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVycyBhcmUgYXBwcm94aW1hdGVseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn1cbmlmICghTWF0aC5oeXBvdCkgTWF0aC5oeXBvdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHkgPSAwLFxuICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHkgKz0gYXJndW1lbnRzW2ldICogYXJndW1lbnRzW2ldO1xuICB9XG5cbiAgcmV0dXJuIE1hdGguc3FydCh5KTtcbn07IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogMngyIE1hdHJpeFxyXG4gKiBAbW9kdWxlIG1hdDJcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJcclxuICpcclxuICogQHJldHVybnMge21hdDJ9IGEgbmV3IDJ4MiBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgbWF0cml4IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgbWF0MiB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGUgYSBuZXcgbWF0MiB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0IEEgbmV3IDJ4MiBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMTAsIG0xMSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGVcbiAgLy8gc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMSA9IGFbMV07XG4gICAgb3V0WzFdID0gYVsyXTtcbiAgICBvdXRbMl0gPSBhMTtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMl07XG4gICAgb3V0WzJdID0gYVsxXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBJbnZlcnRzIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBhMCAqIGEzIC0gYTIgKiBhMTtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSBhMyAqIGRldDtcbiAgb3V0WzFdID0gLWExICogZGV0O1xuICBvdXRbMl0gPSAtYTIgKiBkZXQ7XG4gIG91dFszXSA9IGEwICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgdmFyIGEwID0gYVswXTtcbiAgb3V0WzBdID0gYVszXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHJldHVybiBhWzBdICogYVszXSAtIGFbMl0gKiBhWzFdO1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYTAgKiBjICsgYTIgKiBzO1xuICBvdXRbMV0gPSBhMSAqIGMgKyBhMyAqIHM7XG4gIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIHRoZSBtYXQyIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMCAqIHYwO1xuICBvdXRbMV0gPSBhMSAqIHYwO1xuICBvdXRbMl0gPSBhMiAqIHYxO1xuICBvdXRbM10gPSBhMyAqIHYxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDIucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0Mi5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7dmVjMn0gdiBTY2FsaW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IHZbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gJ21hdDIoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnKSc7XG59XG4vKipcclxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xufVxuLyoqXHJcbiAqIFJldHVybnMgTCwgRCBhbmQgVSBtYXRyaWNlcyAoTG93ZXIgdHJpYW5ndWxhciwgRGlhZ29uYWwgYW5kIFVwcGVyIHRyaWFuZ3VsYXIpIGJ5IGZhY3Rvcml6aW5nIHRoZSBpbnB1dCBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyfSBMIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IEQgdGhlIGRpYWdvbmFsIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IFUgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgaW5wdXQgbWF0cml4IHRvIGZhY3Rvcml6ZVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIExEVShMLCBELCBVLCBhKSB7XG4gIExbMl0gPSBhWzJdIC8gYVswXTtcbiAgVVswXSA9IGFbMF07XG4gIFVbMV0gPSBhWzFdO1xuICBVWzNdID0gYVszXSAtIExbMl0gKiBVWzFdO1xuICByZXR1cm4gW0wsIEQsIFVdO1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7bWF0Mn0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM107XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHttYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxyXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDIncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDJ4MyBNYXRyaXhcclxuICogQG1vZHVsZSBtYXQyZFxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogQSBtYXQyZCBjb250YWlucyBzaXggZWxlbWVudHMgZGVmaW5lZCBhczpcclxuICogPHByZT5cclxuICogW2EsIGIsIGMsXHJcbiAqICBkLCB0eCwgdHldXHJcbiAqIDwvcHJlPlxyXG4gKiBUaGlzIGlzIGEgc2hvcnQgZm9ybSBmb3IgdGhlIDN4MyBtYXRyaXg6XHJcbiAqIDxwcmU+XHJcbiAqIFthLCBiLCAwLFxyXG4gKiAgYywgZCwgMCxcclxuICogIHR4LCB0eSwgMV1cclxuICogPC9wcmU+XHJcbiAqIFRoZSBsYXN0IGNvbHVtbiBpcyBpZ25vcmVkIHNvIHRoZSBhcnJheSBpcyBzaG9ydGVyIGFuZCBvcGVyYXRpb25zIGFyZSBmYXN0ZXIuXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQyZFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IGEgbmV3IDJ4MyBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDJkIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgbWF0cml4IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQyZCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBtYXQyZCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZSBhIG5ldyBtYXQyZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQ29tcG9uZW50IEEgKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIENvbXBvbmVudCBCIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBDb21wb25lbnQgQyAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IGQgQ29tcG9uZW50IEQgKGluZGV4IDMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eCBDb21wb25lbnQgVFggKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eSBDb21wb25lbnQgVFkgKGluZGV4IDUpXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gQSBuZXcgbWF0MmRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gIG91dFswXSA9IGE7XG4gIG91dFsxXSA9IGI7XG4gIG91dFsyXSA9IGM7XG4gIG91dFszXSA9IGQ7XG4gIG91dFs0XSA9IHR4O1xuICBvdXRbNV0gPSB0eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyZCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBDb21wb25lbnQgQSAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgQ29tcG9uZW50IEIgKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIENvbXBvbmVudCBDIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gZCBDb21wb25lbnQgRCAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IHR4IENvbXBvbmVudCBUWCAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IHR5IENvbXBvbmVudCBUWSAoaW5kZXggNSlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBhLCBiLCBjLCBkLCB0eCwgdHkpIHtcbiAgb3V0WzBdID0gYTtcbiAgb3V0WzFdID0gYjtcbiAgb3V0WzJdID0gYztcbiAgb3V0WzNdID0gZDtcbiAgb3V0WzRdID0gdHg7XG4gIG91dFs1XSA9IHR5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEludmVydHMgYSBtYXQyZFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGFhID0gYVswXSxcbiAgICAgIGFiID0gYVsxXSxcbiAgICAgIGFjID0gYVsyXSxcbiAgICAgIGFkID0gYVszXTtcbiAgdmFyIGF0eCA9IGFbNF0sXG4gICAgICBhdHkgPSBhWzVdO1xuICB2YXIgZGV0ID0gYWEgKiBhZCAtIGFiICogYWM7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYWQgKiBkZXQ7XG4gIG91dFsxXSA9IC1hYiAqIGRldDtcbiAgb3V0WzJdID0gLWFjICogZGV0O1xuICBvdXRbM10gPSBhYSAqIGRldDtcbiAgb3V0WzRdID0gKGFjICogYXR5IC0gYWQgKiBhdHgpICogZGV0O1xuICBvdXRbNV0gPSAoYWIgKiBhdHggLSBhYSAqIGF0eSkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQyZFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHJldHVybiBhWzBdICogYVszXSAtIGFbMV0gKiBhWzJdO1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDJkJ3NcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XTtcbiAgb3V0WzBdID0gYTAgKiBiMCArIGEyICogYjE7XG4gIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgb3V0WzNdID0gYTEgKiBiMiArIGEzICogYjM7XG4gIG91dFs0XSA9IGEwICogYjQgKyBhMiAqIGI1ICsgYTQ7XG4gIG91dFs1XSA9IGExICogYjQgKyBhMyAqIGI1ICsgYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdDJkIGJ5IHRoZSBnaXZlbiBhbmdsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYTAgKiBjICsgYTIgKiBzO1xuICBvdXRbMV0gPSBhMSAqIGMgKyBhMyAqIHM7XG4gIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gIG91dFs0XSA9IGE0O1xuICBvdXRbNV0gPSBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXHJcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMCAqIHYwO1xuICBvdXRbMV0gPSBhMSAqIHYwO1xuICBvdXRbMl0gPSBhMiAqIHYxO1xuICBvdXRbM10gPSBhMyAqIHYxO1xuICBvdXRbNF0gPSBhNDtcbiAgb3V0WzVdID0gYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNsYXRlcyB0aGUgbWF0MmQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcclxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHRyYW5zbGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIHYwID0gdlswXSxcbiAgICAgIHYxID0gdlsxXTtcbiAgb3V0WzBdID0gYTA7XG4gIG91dFsxXSA9IGExO1xuICBvdXRbMl0gPSBhMjtcbiAgb3V0WzNdID0gYTM7XG4gIG91dFs0XSA9IGEwICogdjAgKyBhMiAqIHYxICsgYTQ7XG4gIG91dFs1XSA9IGExICogdjAgKyBhMyAqIHYxICsgYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDJkLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSBjO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQyZC5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHt2ZWMyfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IHZbMV07XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQyZC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IG1hdDJkIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7dmVjMn0gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IHZbMF07XG4gIG91dFs1XSA9IHZbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAnbWF0MmQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnLCAnICsgYVs0XSArICcsICcgKyBhWzVdICsgJyknO1xufVxuLyoqXHJcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQyZFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIDEpO1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDJkJ3NcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIG91dFs0XSA9IGFbNF0gLSBiWzRdO1xuICBvdXRbNV0gPSBhWzVdIC0gYls1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0MmQncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHttYXQyZH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge21hdDJkfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0MmQubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDJkLnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogM3gzIE1hdHJpeFxyXG4gKiBAbW9kdWxlIG1hdDNcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDNcclxuICpcclxuICogQHJldHVybnMge21hdDN9IGEgbmV3IDN4MyBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFs0XSA9IDE7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29waWVzIHRoZSB1cHBlci1sZWZ0IDN4MyB2YWx1ZXMgaW50byB0aGUgZ2l2ZW4gbWF0My5cclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyAzeDMgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSAgIHRoZSBzb3VyY2UgNHg0IG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbU1hdDQob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbNF07XG4gIG91dFs0XSA9IGFbNV07XG4gIG91dFs1XSA9IGFbNl07XG4gIG91dFs2XSA9IGFbOF07XG4gIG91dFs3XSA9IGFbOV07XG4gIG91dFs4XSA9IGFbMTBdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IGEgbWF0cml4IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDMgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hdDMgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEByZXR1cm5zIHttYXQzfSBBIG5ldyBtYXQzXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyhtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0wMjtcbiAgb3V0WzNdID0gbTEwO1xuICBvdXRbNF0gPSBtMTE7XG4gIG91dFs1XSA9IG0xMjtcbiAgb3V0WzZdID0gbTIwO1xuICBvdXRbN10gPSBtMjE7XG4gIG91dFs4XSA9IG0yMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA2KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDcpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggOClcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpIHtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0wMjtcbiAgb3V0WzNdID0gbTEwO1xuICBvdXRbNF0gPSBtMTE7XG4gIG91dFs1XSA9IG0xMjtcbiAgb3V0WzZdID0gbTIwO1xuICBvdXRbN10gPSBtMjE7XG4gIG91dFs4XSA9IG0yMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBtYXQzIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAxO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMiA9IGFbNV07XG4gICAgb3V0WzFdID0gYVszXTtcbiAgICBvdXRbMl0gPSBhWzZdO1xuICAgIG91dFszXSA9IGEwMTtcbiAgICBvdXRbNV0gPSBhWzddO1xuICAgIG91dFs2XSA9IGEwMjtcbiAgICBvdXRbN10gPSBhMTI7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzNdO1xuICAgIG91dFsyXSA9IGFbNl07XG4gICAgb3V0WzNdID0gYVsxXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbN107XG4gICAgb3V0WzZdID0gYVsyXTtcbiAgICBvdXRbN10gPSBhWzVdO1xuICAgIG91dFs4XSA9IGFbOF07XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEludmVydHMgYSBtYXQzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxO1xuICB2YXIgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMDtcbiAgdmFyIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMDsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjE7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYjAxICogZGV0O1xuICBvdXRbMV0gPSAoLWEyMiAqIGEwMSArIGEwMiAqIGEyMSkgKiBkZXQ7XG4gIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0O1xuICBvdXRbM10gPSBiMTEgKiBkZXQ7XG4gIG91dFs0XSA9IChhMjIgKiBhMDAgLSBhMDIgKiBhMjApICogZGV0O1xuICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXQ7XG4gIG91dFs2XSA9IGIyMSAqIGRldDtcbiAgb3V0WzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogZGV0O1xuICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICBvdXRbMF0gPSBhMTEgKiBhMjIgLSBhMTIgKiBhMjE7XG4gIG91dFsxXSA9IGEwMiAqIGEyMSAtIGEwMSAqIGEyMjtcbiAgb3V0WzJdID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICBvdXRbM10gPSBhMTIgKiBhMjAgLSBhMTAgKiBhMjI7XG4gIG91dFs0XSA9IGEwMCAqIGEyMiAtIGEwMiAqIGEyMDtcbiAgb3V0WzVdID0gYTAyICogYTEwIC0gYTAwICogYTEyO1xuICBvdXRbNl0gPSBhMTAgKiBhMjEgLSBhMTEgKiBhMjA7XG4gIG91dFs3XSA9IGEwMSAqIGEyMCAtIGEwMCAqIGEyMTtcbiAgb3V0WzhdID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgcmV0dXJuIGEwMCAqIChhMjIgKiBhMTEgLSBhMTIgKiBhMjEpICsgYTAxICogKC1hMjIgKiBhMTAgKyBhMTIgKiBhMjApICsgYTAyICogKGEyMSAqIGExMCAtIGExMSAqIGEyMCk7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gbWF0MydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMCA9IGJbMF0sXG4gICAgICBiMDEgPSBiWzFdLFxuICAgICAgYjAyID0gYlsyXTtcbiAgdmFyIGIxMCA9IGJbM10sXG4gICAgICBiMTEgPSBiWzRdLFxuICAgICAgYjEyID0gYls1XTtcbiAgdmFyIGIyMCA9IGJbNl0sXG4gICAgICBiMjEgPSBiWzddLFxuICAgICAgYjIyID0gYls4XTtcbiAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gIG91dFsyXSA9IGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMjtcbiAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICBvdXRbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjE7XG4gIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcbiAgb3V0WzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xuICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2xhdGUgYSBtYXQzIGJ5IHRoZSBnaXZlbiB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXHJcbiAqIEBwYXJhbSB7dmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV0sXG4gICAgICBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF0sXG4gICAgICB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdO1xuICBvdXRbMF0gPSBhMDA7XG4gIG91dFsxXSA9IGEwMTtcbiAgb3V0WzJdID0gYTAyO1xuICBvdXRbM10gPSBhMTA7XG4gIG91dFs0XSA9IGExMTtcbiAgb3V0WzVdID0gYTEyO1xuICBvdXRbNl0gPSB4ICogYTAwICsgeSAqIGExMCArIGEyMDtcbiAgb3V0WzddID0geCAqIGEwMSArIHkgKiBhMTEgKyBhMjE7XG4gIG91dFs4XSA9IHggKiBhMDIgKyB5ICogYTEyICsgYTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXQzIGJ5IHRoZSBnaXZlbiBhbmdsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdLFxuICAgICAgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdLFxuICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYyAqIGEwMCArIHMgKiBhMTA7XG4gIG91dFsxXSA9IGMgKiBhMDEgKyBzICogYTExO1xuICBvdXRbMl0gPSBjICogYTAyICsgcyAqIGExMjtcbiAgb3V0WzNdID0gYyAqIGExMCAtIHMgKiBhMDA7XG4gIG91dFs0XSA9IGMgKiBhMTEgLSBzICogYTAxO1xuICBvdXRbNV0gPSBjICogYTEyIC0gcyAqIGEwMjtcbiAgb3V0WzZdID0gYTIwO1xuICBvdXRbN10gPSBhMjE7XG4gIG91dFs4XSA9IGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbjtcbi8qKlxyXG4gKiBTY2FsZXMgdGhlIG1hdDMgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdO1xuICBvdXRbMF0gPSB4ICogYVswXTtcbiAgb3V0WzFdID0geCAqIGFbMV07XG4gIG91dFsyXSA9IHggKiBhWzJdO1xuICBvdXRbM10gPSB5ICogYVszXTtcbiAgb3V0WzRdID0geSAqIGFbNF07XG4gIG91dFs1XSA9IHkgKiBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDMuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQzLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7dmVjMn0gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHYpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gdlswXTtcbiAgb3V0WzddID0gdlsxXTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDMuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQzLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IC1zO1xuICBvdXRbNF0gPSBjO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDMuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB2WzFdO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcGllcyB0aGUgdmFsdWVzIGZyb20gYSBtYXQyZCBpbnRvIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gY29weVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQyZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gYVsyXTtcbiAgb3V0WzRdID0gYVszXTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gYVs0XTtcbiAgb3V0WzddID0gYVs1XTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4qIENhbGN1bGF0ZXMgYSAzeDMgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuKlxyXG4qIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuKiBAcGFyYW0ge3F1YXR9IHEgUXVhdGVybmlvbiB0byBjcmVhdGUgbWF0cml4IGZyb21cclxuKlxyXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcclxuKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0KG91dCwgcSkge1xuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHl4ID0geSAqIHgyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB6eCA9IHogKiB4MjtcbiAgdmFyIHp5ID0geiAqIHkyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICBvdXRbM10gPSB5eCAtIHd6O1xuICBvdXRbNl0gPSB6eCArIHd5O1xuICBvdXRbMV0gPSB5eCArIHd6O1xuICBvdXRbNF0gPSAxIC0geHggLSB6ejtcbiAgb3V0WzddID0genkgLSB3eDtcbiAgb3V0WzJdID0genggLSB3eTtcbiAgb3V0WzVdID0genkgKyB3eDtcbiAgb3V0WzhdID0gMSAtIHh4IC0geXk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XHJcbipcclxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiogQHBhcmFtIHttYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cclxuKlxyXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcclxuKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSAyRCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggV2lkdGggb2YgeW91ciBnbCBjb250ZXh0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgSGVpZ2h0IG9mIGdsIGNvbnRleHRcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3Rpb24ob3V0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIG91dFswXSA9IDIgLyB3aWR0aDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLTIgLyBoZWlnaHQ7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IC0xO1xuICBvdXRbN10gPSAxO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuICdtYXQzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgKyBhWzZdICsgJywgJyArIGFbN10gKyAnLCAnICsgYVs4XSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcclxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9iKGEpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSwgYVs2XSwgYVs3XSwgYVs4XSk7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0MydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICBvdXRbOF0gPSBhWzhdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQzJ3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl0gKiBzY2FsZTtcbiAgb3V0WzddID0gYVs3XSArIGJbN10gKiBzY2FsZTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge21hdDN9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge21hdDN9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdLFxuICAgICAgYTYgPSBhWzZdLFxuICAgICAgYTcgPSBhWzddLFxuICAgICAgYTggPSBhWzhdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdLFxuICAgICAgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdLFxuICAgICAgYjYgPSBiWzZdLFxuICAgICAgYjcgPSBiWzddLFxuICAgICAgYjggPSBiWzhdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiYgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJiBNYXRoLmFicyhhOCAtIGI4KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOCksIE1hdGguYWJzKGI4KSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogNHg0IE1hdHJpeDxicj5Gb3JtYXQ6IGNvbHVtbi1tYWpvciwgd2hlbiB0eXBlZCBvdXQgaXQgbG9va3MgbGlrZSByb3ctbWFqb3I8YnI+VGhlIG1hdHJpY2VzIGFyZSBiZWluZyBwb3N0IG11bHRpcGxpZWQuXHJcbiAqIEBtb2R1bGUgbWF0NFxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0NFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gYSBtYXRyaXggdG8gY2xvbmVcclxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hdDQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMyBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMiBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcclxuICogQHJldHVybnMge21hdDR9IEEgbmV3IG1hdDRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMDIsIG0wMywgbTEwLCBtMTEsIG0xMiwgbTEzLCBtMjAsIG0yMSwgbTIyLCBtMjMsIG0zMCwgbTMxLCBtMzIsIG0zMykge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMDM7XG4gIG91dFs0XSA9IG0xMDtcbiAgb3V0WzVdID0gbTExO1xuICBvdXRbNl0gPSBtMTI7XG4gIG91dFs3XSA9IG0xMztcbiAgb3V0WzhdID0gbTIwO1xuICBvdXRbOV0gPSBtMjE7XG4gIG91dFsxMF0gPSBtMjI7XG4gIG91dFsxMV0gPSBtMjM7XG4gIG91dFsxMl0gPSBtMzA7XG4gIG91dFsxM10gPSBtMzE7XG4gIG91dFsxNF0gPSBtMzI7XG4gIG91dFsxNV0gPSBtMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0NCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMyBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMiBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIG0wMCwgbTAxLCBtMDIsIG0wMywgbTEwLCBtMTEsIG0xMiwgbTEzLCBtMjAsIG0yMSwgbTIyLCBtMjMsIG0zMCwgbTMxLCBtMzIsIG0zMykge1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMDM7XG4gIG91dFs0XSA9IG0xMDtcbiAgb3V0WzVdID0gbTExO1xuICBvdXRbNl0gPSBtMTI7XG4gIG91dFs3XSA9IG0xMztcbiAgb3V0WzhdID0gbTIwO1xuICBvdXRbOV0gPSBtMjE7XG4gIG91dFsxMF0gPSBtMjI7XG4gIG91dFsxMV0gPSBtMjM7XG4gIG91dFsxMl0gPSBtMzA7XG4gIG91dFsxM10gPSBtMzE7XG4gIG91dFsxNF0gPSBtMzI7XG4gIG91dFsxNV0gPSBtMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdO1xuICAgIHZhciBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddO1xuICAgIHZhciBhMjMgPSBhWzExXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYTAxO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYTAyO1xuICAgIG91dFs5XSA9IGExMjtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGEwMztcbiAgICBvdXRbMTNdID0gYTEzO1xuICAgIG91dFsxNF0gPSBhMjM7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYVsxXTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYVsyXTtcbiAgICBvdXRbOV0gPSBhWzZdO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGFbM107XG4gICAgb3V0WzEzXSA9IGFbN107XG4gICAgb3V0WzE0XSA9IGFbMTFdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogSW52ZXJ0cyBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgdmFyIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgb3V0WzFdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsyXSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICBvdXRbM10gPSAoYTIyICogYjA0IC0gYTIxICogYjA1IC0gYTIzICogYjAzKSAqIGRldDtcbiAgb3V0WzRdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs1XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICBvdXRbNl0gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldDtcbiAgb3V0WzddID0gKGEyMCAqIGIwNSAtIGEyMiAqIGIwMiArIGEyMyAqIGIwMSkgKiBkZXQ7XG4gIG91dFs4XSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuICBvdXRbOV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgb3V0WzEwXSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuICBvdXRbMTFdID0gKGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxMl0gPSAoYTExICogYjA3IC0gYTEwICogYjA5IC0gYTEyICogYjA2KSAqIGRldDtcbiAgb3V0WzEzXSA9IChhMDAgKiBiMDkgLSBhMDEgKiBiMDcgKyBhMDIgKiBiMDYpICogZGV0O1xuICBvdXRbMTRdID0gKGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxNV0gPSAoYTIwICogYjAzIC0gYTIxICogYjAxICsgYTIyICogYjAwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgb3V0WzBdID0gYTExICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpO1xuICBvdXRbMV0gPSAtKGEwMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XG4gIG91dFsyXSA9IGEwMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTExICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKTtcbiAgb3V0WzNdID0gLShhMDEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICBvdXRbNF0gPSAtKGExMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSk7XG4gIG91dFs1XSA9IGEwMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKTtcbiAgb3V0WzZdID0gLShhMDAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICBvdXRbN10gPSBhMDAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7XG4gIG91dFs4XSA9IGExMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKTtcbiAgb3V0WzldID0gLShhMDAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkpO1xuICBvdXRbMTBdID0gYTAwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpO1xuICBvdXRbMTFdID0gLShhMDAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICBvdXRbMTJdID0gLShhMTAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkpO1xuICBvdXRbMTNdID0gYTAwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpO1xuICBvdXRbMTRdID0gLShhMDAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSkpO1xuICBvdXRbMTVdID0gYTAwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICByZXR1cm4gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07IC8vIENhY2hlIG9ubHkgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgc2Vjb25kIG1hdHJpeFxuXG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbMV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzJdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFszXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbNF07XG4gIGIxID0gYls1XTtcbiAgYjIgPSBiWzZdO1xuICBiMyA9IGJbN107XG4gIG91dFs0XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbNV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzZdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFs3XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbOF07XG4gIGIxID0gYls5XTtcbiAgYjIgPSBiWzEwXTtcbiAgYjMgPSBiWzExXTtcbiAgb3V0WzhdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFs5XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMTBdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFsxMV0gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzEyXTtcbiAgYjEgPSBiWzEzXTtcbiAgYjIgPSBiWzE0XTtcbiAgYjMgPSBiWzE1XTtcbiAgb3V0WzEyXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbMTNdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsxNF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzE1XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zbGF0ZSBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcclxuICogQHBhcmFtIHt2ZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gIH0gZWxzZSB7XG4gICAgYTAwID0gYVswXTtcbiAgICBhMDEgPSBhWzFdO1xuICAgIGEwMiA9IGFbMl07XG4gICAgYTAzID0gYVszXTtcbiAgICBhMTAgPSBhWzRdO1xuICAgIGExMSA9IGFbNV07XG4gICAgYTEyID0gYVs2XTtcbiAgICBhMTMgPSBhWzddO1xuICAgIGEyMCA9IGFbOF07XG4gICAgYTIxID0gYVs5XTtcbiAgICBhMjIgPSBhWzEwXTtcbiAgICBhMjMgPSBhWzExXTtcbiAgICBvdXRbMF0gPSBhMDA7XG4gICAgb3V0WzFdID0gYTAxO1xuICAgIG91dFsyXSA9IGEwMjtcbiAgICBvdXRbM10gPSBhMDM7XG4gICAgb3V0WzRdID0gYTEwO1xuICAgIG91dFs1XSA9IGExMTtcbiAgICBvdXRbNl0gPSBhMTI7XG4gICAgb3V0WzddID0gYTEzO1xuICAgIG91dFs4XSA9IGEyMDtcbiAgICBvdXRbOV0gPSBhMjE7XG4gICAgb3V0WzEwXSA9IGEyMjtcbiAgICBvdXRbMTFdID0gYTIzO1xuICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzIG5vdCB1c2luZyB2ZWN0b3JpemF0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7dmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdLFxuICAgICAgeiA9IHZbMl07XG4gIG91dFswXSA9IGFbMF0gKiB4O1xuICBvdXRbMV0gPSBhWzFdICogeDtcbiAgb3V0WzJdID0gYVsyXSAqIHg7XG4gIG91dFszXSA9IGFbM10gKiB4O1xuICBvdXRbNF0gPSBhWzRdICogeTtcbiAgb3V0WzVdID0gYVs1XSAqIHk7XG4gIG91dFs2XSA9IGFbNl0gKiB5O1xuICBvdXRbN10gPSBhWzddICogeTtcbiAgb3V0WzhdID0gYVs4XSAqIHo7XG4gIG91dFs5XSA9IGFbOV0gKiB6O1xuICBvdXRbMTBdID0gYVsxMF0gKiB6O1xuICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgZ2l2ZW4gYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG4gIHZhciBhMDAsIGEwMSwgYTAyLCBhMDM7XG4gIHZhciBhMTAsIGExMSwgYTEyLCBhMTM7XG4gIHZhciBhMjAsIGEyMSwgYTIyLCBhMjM7XG4gIHZhciBiMDAsIGIwMSwgYjAyO1xuICB2YXIgYjEwLCBiMTEsIGIxMjtcbiAgdmFyIGIyMCwgYjIxLCBiMjI7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjO1xuICBhMDAgPSBhWzBdO1xuICBhMDEgPSBhWzFdO1xuICBhMDIgPSBhWzJdO1xuICBhMDMgPSBhWzNdO1xuICBhMTAgPSBhWzRdO1xuICBhMTEgPSBhWzVdO1xuICBhMTIgPSBhWzZdO1xuICBhMTMgPSBhWzddO1xuICBhMjAgPSBhWzhdO1xuICBhMjEgPSBhWzldO1xuICBhMjIgPSBhWzEwXTtcbiAgYTIzID0gYVsxMV07IC8vIENvbnN0cnVjdCB0aGUgZWxlbWVudHMgb2YgdGhlIHJvdGF0aW9uIG1hdHJpeFxuXG4gIGIwMCA9IHggKiB4ICogdCArIGM7XG4gIGIwMSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBiMDIgPSB6ICogeCAqIHQgLSB5ICogcztcbiAgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIGIxMSA9IHkgKiB5ICogdCArIGM7XG4gIGIxMiA9IHogKiB5ICogdCArIHggKiBzO1xuICBiMjAgPSB4ICogeiAqIHQgKyB5ICogcztcbiAgYjIxID0geSAqIHogKiB0IC0geCAqIHM7XG4gIGIyMiA9IHogKiB6ICogdCArIGM7IC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYTAwICogYjAwICsgYTEwICogYjAxICsgYTIwICogYjAyO1xuICBvdXRbMV0gPSBhMDEgKiBiMDAgKyBhMTEgKiBiMDEgKyBhMjEgKiBiMDI7XG4gIG91dFsyXSA9IGEwMiAqIGIwMCArIGExMiAqIGIwMSArIGEyMiAqIGIwMjtcbiAgb3V0WzNdID0gYTAzICogYjAwICsgYTEzICogYjAxICsgYTIzICogYjAyO1xuICBvdXRbNF0gPSBhMDAgKiBiMTAgKyBhMTAgKiBiMTEgKyBhMjAgKiBiMTI7XG4gIG91dFs1XSA9IGEwMSAqIGIxMCArIGExMSAqIGIxMSArIGEyMSAqIGIxMjtcbiAgb3V0WzZdID0gYTAyICogYjEwICsgYTEyICogYjExICsgYTIyICogYjEyO1xuICBvdXRbN10gPSBhMDMgKiBiMTAgKyBhMTMgKiBiMTEgKyBhMjMgKiBiMTI7XG4gIG91dFs4XSA9IGEwMCAqIGIyMCArIGExMCAqIGIyMSArIGEyMCAqIGIyMjtcbiAgb3V0WzldID0gYTAxICogYjIwICsgYTExICogYjIxICsgYTIxICogYjIyO1xuICBvdXRbMTBdID0gYTAyICogYjIwICsgYTEyICogYjIxICsgYTIyICogYjIyO1xuICBvdXRbMTFdID0gYTAzICogYjIwICsgYTEzICogYjIxICsgYTIzICogYjIyO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTEwID0gYVs0XTtcbiAgdmFyIGExMSA9IGFbNV07XG4gIHZhciBhMTIgPSBhWzZdO1xuICB2YXIgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF07XG4gIHZhciBhMjEgPSBhWzldO1xuICB2YXIgYTIyID0gYVsxMF07XG4gIHZhciBhMjMgPSBhWzExXTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFs0XSA9IGExMCAqIGMgKyBhMjAgKiBzO1xuICBvdXRbNV0gPSBhMTEgKiBjICsgYTIxICogcztcbiAgb3V0WzZdID0gYTEyICogYyArIGEyMiAqIHM7XG4gIG91dFs3XSA9IGExMyAqIGMgKyBhMjMgKiBzO1xuICBvdXRbOF0gPSBhMjAgKiBjIC0gYTEwICogcztcbiAgb3V0WzldID0gYTIxICogYyAtIGExMSAqIHM7XG4gIG91dFsxMF0gPSBhMjIgKiBjIC0gYTEyICogcztcbiAgb3V0WzExXSA9IGEyMyAqIGMgLSBhMTMgKiBzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMjAgPSBhWzhdO1xuICB2YXIgYTIxID0gYVs5XTtcbiAgdmFyIGEyMiA9IGFbMTBdO1xuICB2YXIgYTIzID0gYVsxMV07XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjIC0gYTIwICogcztcbiAgb3V0WzFdID0gYTAxICogYyAtIGEyMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgLSBhMjIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjIC0gYTIzICogcztcbiAgb3V0WzhdID0gYTAwICogcyArIGEyMCAqIGM7XG4gIG91dFs5XSA9IGEwMSAqIHMgKyBhMjEgKiBjO1xuICBvdXRbMTBdID0gYTAyICogcyArIGEyMiAqIGM7XG4gIG91dFsxMV0gPSBhMDMgKiBzICsgYTIzICogYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMDAgPSBhWzBdO1xuICB2YXIgYTAxID0gYVsxXTtcbiAgdmFyIGEwMiA9IGFbMl07XG4gIHZhciBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XTtcbiAgdmFyIGExMSA9IGFbNV07XG4gIHZhciBhMTIgPSBhWzZdO1xuICB2YXIgYTEzID0gYVs3XTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzBdID0gYTAwICogYyArIGExMCAqIHM7XG4gIG91dFsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzO1xuICBvdXRbMl0gPSBhMDIgKiBjICsgYTEyICogcztcbiAgb3V0WzNdID0gYTAzICogYyArIGExMyAqIHM7XG4gIG91dFs0XSA9IGExMCAqIGMgLSBhMDAgKiBzO1xuICBvdXRbNV0gPSBhMTEgKiBjIC0gYTAxICogcztcbiAgb3V0WzZdID0gYTEyICogYyAtIGEwMiAqIHM7XG4gIG91dFs3XSA9IGExMyAqIGMgLSBhMDMgKiBzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHYpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHt2ZWMzfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gdlsxXTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IHZbMl07XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZSBhcm91bmQgYSBnaXZlbiBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCwgYXhpcyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjOyAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gIG91dFsxXSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBvdXRbMl0gPSB6ICogeCAqIHQgLSB5ICogcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIG91dFs1XSA9IHkgKiB5ICogdCArIGM7XG4gIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4ICogeiAqIHQgKyB5ICogcztcbiAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gIG91dFsxMF0gPSB6ICogeiAqIHQgKyBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZVgoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVhSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IHM7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IC1zO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5yb3RhdGVZKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21ZUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAtcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gcztcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlWihkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWlJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLXM7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiBhbmQgdmVjdG9yIHRyYW5zbGF0aW9uXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XHJcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3ZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIHEsIHYpIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgb3V0WzBdID0gMSAtICh5eSArIHp6KTtcbiAgb3V0WzFdID0geHkgKyB3ejtcbiAgb3V0WzJdID0geHogLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geHkgLSB3ejtcbiAgb3V0WzVdID0gMSAtICh4eCArIHp6KTtcbiAgb3V0WzZdID0geXogKyB3eDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geHogKyB3eTtcbiAgb3V0WzldID0geXogLSB3eDtcbiAgb3V0WzEwXSA9IDEgLSAoeHggKyB5eSk7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDQgZnJvbSBhIGR1YWwgcXVhdC5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgTWF0cml4XHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQyKG91dCwgYSkge1xuICB2YXIgdHJhbnNsYXRpb24gPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgdmFyIG1hZ25pdHVkZSA9IGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiArIGJ3ICogYnc7IC8vT25seSBzY2FsZSBpZiBpdCBtYWtlcyBzZW5zZVxuXG4gIGlmIChtYWduaXR1ZGUgPiAwKSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyIC8gbWFnbml0dWRlO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDIgLyBtYWduaXR1ZGU7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMjtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIH1cblxuICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIGEsIHRyYW5zbGF0aW9uKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgY29tcG9uZW50IG9mIGEgdHJhbnNmb3JtYXRpb25cclxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvbixcclxuICogIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqICBvcmlnaW5hbGx5IHN1cHBsaWVkLlxyXG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXQgVmVjdG9yIHRvIHJlY2VpdmUgdHJhbnNsYXRpb24gY29tcG9uZW50XHJcbiAqIEBwYXJhbSAge21hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXHJcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKG91dCwgbWF0KSB7XG4gIG91dFswXSA9IG1hdFsxMl07XG4gIG91dFsxXSA9IG1hdFsxM107XG4gIG91dFsyXSA9IG1hdFsxNF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgc2NhbGluZyBmYWN0b3IgY29tcG9uZW50IG9mIGEgdHJhbnNmb3JtYXRpb25cclxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlXHJcbiAqICB3aXRoIGEgbm9ybWFsaXplZCBRdWF0ZXJuaW9uIHBhcmFtdGVyLCB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmVcclxuICogIHRoZSBzYW1lIGFzIHRoZSBzY2FsaW5nIHZlY3RvclxyXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cclxuICogQHBhcmFtICB7dmVjM30gb3V0IFZlY3RvciB0byByZWNlaXZlIHNjYWxpbmcgZmFjdG9yIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gIHttYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxyXG4gKiBAcmV0dXJuIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsaW5nKG91dCwgbWF0KSB7XG4gIHZhciBtMTEgPSBtYXRbMF07XG4gIHZhciBtMTIgPSBtYXRbMV07XG4gIHZhciBtMTMgPSBtYXRbMl07XG4gIHZhciBtMjEgPSBtYXRbNF07XG4gIHZhciBtMjIgPSBtYXRbNV07XG4gIHZhciBtMjMgPSBtYXRbNl07XG4gIHZhciBtMzEgPSBtYXRbOF07XG4gIHZhciBtMzIgPSBtYXRbOV07XG4gIHZhciBtMzMgPSBtYXRbMTBdO1xuICBvdXRbMF0gPSBNYXRoLmh5cG90KG0xMSwgbTEyLCBtMTMpO1xuICBvdXRbMV0gPSBNYXRoLmh5cG90KG0yMSwgbTIyLCBtMjMpO1xuICBvdXRbMl0gPSBNYXRoLmh5cG90KG0zMSwgbTMyLCBtMzMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcm90YXRpb25hbCBjb21wb25lbnRcclxuICogIG9mIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoXHJcbiAqICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbiwgdGhlIHJldHVybmVkIHF1YXRlcm5pb24gd2lsbCBiZSB0aGVcclxuICogIHNhbWUgYXMgdGhlIHF1YXRlcm5pb24gb3JpZ2luYWxseSBzdXBwbGllZC5cclxuICogQHBhcmFtIHtxdWF0fSBvdXQgUXVhdGVybmlvbiB0byByZWNlaXZlIHRoZSByb3RhdGlvbiBjb21wb25lbnRcclxuICogQHBhcmFtIHttYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxyXG4gKiBAcmV0dXJuIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3RhdGlvbihvdXQsIG1hdCkge1xuICB2YXIgc2NhbGluZyA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBnZXRTY2FsaW5nKHNjYWxpbmcsIG1hdCk7XG4gIHZhciBpczEgPSAxIC8gc2NhbGluZ1swXTtcbiAgdmFyIGlzMiA9IDEgLyBzY2FsaW5nWzFdO1xuICB2YXIgaXMzID0gMSAvIHNjYWxpbmdbMl07XG4gIHZhciBzbTExID0gbWF0WzBdICogaXMxO1xuICB2YXIgc20xMiA9IG1hdFsxXSAqIGlzMjtcbiAgdmFyIHNtMTMgPSBtYXRbMl0gKiBpczM7XG4gIHZhciBzbTIxID0gbWF0WzRdICogaXMxO1xuICB2YXIgc20yMiA9IG1hdFs1XSAqIGlzMjtcbiAgdmFyIHNtMjMgPSBtYXRbNl0gKiBpczM7XG4gIHZhciBzbTMxID0gbWF0WzhdICogaXMxO1xuICB2YXIgc20zMiA9IG1hdFs5XSAqIGlzMjtcbiAgdmFyIHNtMzMgPSBtYXRbMTBdICogaXMzO1xuICB2YXIgdHJhY2UgPSBzbTExICsgc20yMiArIHNtMzM7XG4gIHZhciBTID0gMDtcblxuICBpZiAodHJhY2UgPiAwKSB7XG4gICAgUyA9IE1hdGguc3FydCh0cmFjZSArIDEuMCkgKiAyO1xuICAgIG91dFszXSA9IDAuMjUgKiBTO1xuICAgIG91dFswXSA9IChzbTIzIC0gc20zMikgLyBTO1xuICAgIG91dFsxXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFsyXSA9IChzbTEyIC0gc20yMSkgLyBTO1xuICB9IGVsc2UgaWYgKHNtMTEgPiBzbTIyICYmIHNtMTEgPiBzbTMzKSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTExIC0gc20yMiAtIHNtMzMpICogMjtcbiAgICBvdXRbM10gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMF0gPSAwLjI1ICogUztcbiAgICBvdXRbMV0gPSAoc20xMiArIHNtMjEpIC8gUztcbiAgICBvdXRbMl0gPSAoc20zMSArIHNtMTMpIC8gUztcbiAgfSBlbHNlIGlmIChzbTIyID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20yMiAtIHNtMTEgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMzEgLSBzbTEzKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzFdID0gMC4yNSAqIFM7XG4gICAgb3V0WzJdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gIH0gZWxzZSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTMzIC0gc20xMSAtIHNtMjIpICogMjtcbiAgICBvdXRbM10gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgICBvdXRbMF0gPSAoc20zMSArIHNtMTMpIC8gUztcbiAgICBvdXRbMV0gPSAoc20yMyArIHNtMzIpIC8gUztcbiAgICBvdXRbMl0gPSAwLjI1ICogUztcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcclxuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcclxuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3ZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gcyBTY2FsaW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZShvdXQsIHEsIHYsIHMpIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgb3V0WzBdID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gIG91dFsxXSA9ICh4eSArIHd6KSAqIHN4O1xuICBvdXRbMl0gPSAoeHogLSB3eSkgKiBzeDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gKHh5IC0gd3opICogc3k7XG4gIG91dFs1XSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICBvdXRbNl0gPSAoeXogKyB3eCkgKiBzeTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHh6ICsgd3kpICogc3o7XG4gIG91dFs5XSA9ICh5eiAtIHd4KSAqIHN6O1xuICBvdXRbMTBdID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZSwgcm90YXRpbmcgYW5kIHNjYWxpbmcgYXJvdW5kIHRoZSBnaXZlbiBvcmlnaW5cclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG9yaWdpbik7XHJcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XHJcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG5lZ2F0aXZlT3JpZ2luKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHt2ZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBvIFRoZSBvcmlnaW4gdmVjdG9yIGFyb3VuZCB3aGljaCB0byBzY2FsZSBhbmQgcm90YXRlXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlT3JpZ2luKG91dCwgcSwgdiwgcywgbykge1xuICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB4eSA9IHggKiB5MjtcbiAgdmFyIHh6ID0geCAqIHoyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB5eiA9IHkgKiB6MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICB2YXIgc3ggPSBzWzBdO1xuICB2YXIgc3kgPSBzWzFdO1xuICB2YXIgc3ogPSBzWzJdO1xuICB2YXIgb3ggPSBvWzBdO1xuICB2YXIgb3kgPSBvWzFdO1xuICB2YXIgb3ogPSBvWzJdO1xuICB2YXIgb3V0MCA9ICgxIC0gKHl5ICsgenopKSAqIHN4O1xuICB2YXIgb3V0MSA9ICh4eSArIHd6KSAqIHN4O1xuICB2YXIgb3V0MiA9ICh4eiAtIHd5KSAqIHN4O1xuICB2YXIgb3V0NCA9ICh4eSAtIHd6KSAqIHN5O1xuICB2YXIgb3V0NSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICB2YXIgb3V0NiA9ICh5eiArIHd4KSAqIHN5O1xuICB2YXIgb3V0OCA9ICh4eiArIHd5KSAqIHN6O1xuICB2YXIgb3V0OSA9ICh5eiAtIHd4KSAqIHN6O1xuICB2YXIgb3V0MTAgPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzBdID0gb3V0MDtcbiAgb3V0WzFdID0gb3V0MTtcbiAgb3V0WzJdID0gb3V0MjtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gb3V0NDtcbiAgb3V0WzVdID0gb3V0NTtcbiAgb3V0WzZdID0gb3V0NjtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gb3V0ODtcbiAgb3V0WzldID0gb3V0OTtcbiAgb3V0WzEwXSA9IG91dDEwO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF0gKyBveCAtIChvdXQwICogb3ggKyBvdXQ0ICogb3kgKyBvdXQ4ICogb3opO1xuICBvdXRbMTNdID0gdlsxXSArIG95IC0gKG91dDEgKiBveCArIG91dDUgKiBveSArIG91dDkgKiBveik7XG4gIG91dFsxNF0gPSB2WzJdICsgb3ogLSAob3V0MiAqIG94ICsgb3V0NiAqIG95ICsgb3V0MTAgKiBveik7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYSA0eDQgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXR9IHEgUXVhdGVybmlvbiB0byBjcmVhdGUgbWF0cml4IGZyb21cclxuICpcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0KG91dCwgcSkge1xuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHl4ID0geSAqIHgyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB6eCA9IHogKiB4MjtcbiAgdmFyIHp5ID0geiAqIHkyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICBvdXRbMV0gPSB5eCArIHd6O1xuICBvdXRbMl0gPSB6eCAtIHd5O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB5eCAtIHd6O1xuICBvdXRbNV0gPSAxIC0geHggLSB6ejtcbiAgb3V0WzZdID0genkgKyB3eDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0genggKyB3eTtcbiAgb3V0WzldID0genkgLSB3eDtcbiAgb3V0WzEwXSA9IDEgLSB4eCAtIHl5O1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgZnJ1c3R1bSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtOdW1iZXJ9IGxlZnQgTGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IHRvcCBUb3AgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJ1c3R1bShvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KTtcbiAgdmFyIHRiID0gMSAvICh0b3AgLSBib3R0b20pO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSBuZWFyICogMiAqIHJsO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBuZWFyICogMiAqIHRiO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICBvdXRbOV0gPSAodG9wICsgYm90dG9tKSAqIHRiO1xuICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAqIDIgKiBuZjtcbiAgb3V0WzE1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLlxyXG4gKiBQYXNzaW5nIG51bGwvdW5kZWZpbmVkL25vIHZhbHVlIGZvciBmYXIgd2lsbCBnZW5lcmF0ZSBpbmZpbml0ZSBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcclxuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcclxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bSwgY2FuIGJlIG51bGwgb3IgSW5maW5pdHlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlKG91dCwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcbiAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICBuZjtcbiAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gZjtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzExXSA9IC0xO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNV0gPSAwO1xuXG4gIGlmIChmYXIgIT0gbnVsbCAmJiBmYXIgIT09IEluZmluaXR5KSB7XG4gICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTRdID0gMiAqIGZhciAqIG5lYXIgKiBuZjtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMTBdID0gLTE7XG4gICAgb3V0WzE0XSA9IC0yICogbmVhcjtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZmllbGQgb2Ygdmlldy5cclxuICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBnZW5lcmF0aW5nIHByb2plY3Rpb24gbWF0cmljZXMgdG8gYmUgdXNlZFxyXG4gKiB3aXRoIHRoZSBzdGlsbCBleHBlcmllbWVudGFsIFdlYlZSIEFQSS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge09iamVjdH0gZm92IE9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiB1cERlZ3JlZXMsIGRvd25EZWdyZWVzLCBsZWZ0RGVncmVlcywgcmlnaHREZWdyZWVzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlRnJvbUZpZWxkT2ZWaWV3KG91dCwgZm92LCBuZWFyLCBmYXIpIHtcbiAgdmFyIHVwVGFuID0gTWF0aC50YW4oZm92LnVwRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBkb3duVGFuID0gTWF0aC50YW4oZm92LmRvd25EZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIGxlZnRUYW4gPSBNYXRoLnRhbihmb3YubGVmdERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgcmlnaHRUYW4gPSBNYXRoLnRhbihmb3YucmlnaHREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHhTY2FsZSA9IDIuMCAvIChsZWZ0VGFuICsgcmlnaHRUYW4pO1xuICB2YXIgeVNjYWxlID0gMi4wIC8gKHVwVGFuICsgZG93blRhbik7XG4gIG91dFswXSA9IHhTY2FsZTtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgb3V0WzRdID0gMC4wO1xuICBvdXRbNV0gPSB5U2NhbGU7XG4gIG91dFs2XSA9IDAuMDtcbiAgb3V0WzddID0gMC4wO1xuICBvdXRbOF0gPSAtKChsZWZ0VGFuIC0gcmlnaHRUYW4pICogeFNjYWxlICogMC41KTtcbiAgb3V0WzldID0gKHVwVGFuIC0gZG93blRhbikgKiB5U2NhbGUgKiAwLjU7XG4gIG91dFsxMF0gPSBmYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxMV0gPSAtMS4wO1xuICBvdXRbMTJdID0gMC4wO1xuICBvdXRbMTNdID0gMC4wO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzE1XSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9ydGhvKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpO1xuICB2YXIgYnQgPSAxIC8gKGJvdHRvbSAtIHRvcCk7XG4gIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gIG91dFswXSA9IC0yICogbHI7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IC0yICogYnQ7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAyICogbmY7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gKGxlZnQgKyByaWdodCkgKiBscjtcbiAgb3V0WzEzXSA9ICh0b3AgKyBib3R0b20pICogYnQ7XG4gIG91dFsxNF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXMuXHJcbiAqIElmIHlvdSB3YW50IGEgbWF0cml4IHRoYXQgYWN0dWFsbHkgbWFrZXMgYW4gb2JqZWN0IGxvb2sgYXQgYW5vdGhlciBvYmplY3QsIHlvdSBzaG91bGQgdXNlIHRhcmdldFRvIGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHt2ZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcclxuICogQHBhcmFtIHt2ZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbjtcbiAgdmFyIGV5ZXggPSBleWVbMF07XG4gIHZhciBleWV5ID0gZXllWzFdO1xuICB2YXIgZXlleiA9IGV5ZVsyXTtcbiAgdmFyIHVweCA9IHVwWzBdO1xuICB2YXIgdXB5ID0gdXBbMV07XG4gIHZhciB1cHogPSB1cFsyXTtcbiAgdmFyIGNlbnRlcnggPSBjZW50ZXJbMF07XG4gIHZhciBjZW50ZXJ5ID0gY2VudGVyWzFdO1xuICB2YXIgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgfVxuXG4gIHowID0gZXlleCAtIGNlbnRlcng7XG4gIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gIHoyID0gZXlleiAtIGNlbnRlcno7XG4gIGxlbiA9IDEgLyBNYXRoLmh5cG90KHowLCB6MSwgejIpO1xuICB6MCAqPSBsZW47XG4gIHoxICo9IGxlbjtcbiAgejIgKj0gbGVuO1xuICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7XG4gIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSBNYXRoLmh5cG90KHgwLCB4MSwgeDIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeDAgPSAwO1xuICAgIHgxID0gMDtcbiAgICB4MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG4gIGxlbiA9IE1hdGguaHlwb3QoeTAsIHkxLCB5Mik7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICB5MCA9IDA7XG4gICAgeTEgPSAwO1xuICAgIHkyID0gMDtcbiAgfSBlbHNlIHtcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHkwICo9IGxlbjtcbiAgICB5MSAqPSBsZW47XG4gICAgeTIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHkwO1xuICBvdXRbMl0gPSB6MDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geDE7XG4gIG91dFs1XSA9IHkxO1xuICBvdXRbNl0gPSB6MTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geDI7XG4gIG91dFs5XSA9IHkyO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopO1xuICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBtYXRyaXggdGhhdCBtYWtlcyBzb21ldGhpbmcgbG9vayBhdCBzb21ldGhpbmcgZWxzZS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge3ZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXHJcbiAqIEBwYXJhbSB7dmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxyXG4gKiBAcGFyYW0ge3ZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRhcmdldFRvKG91dCwgZXllLCB0YXJnZXQsIHVwKSB7XG4gIHZhciBleWV4ID0gZXllWzBdLFxuICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgIGV5ZXogPSBleWVbMl0sXG4gICAgICB1cHggPSB1cFswXSxcbiAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgdXB6ID0gdXBbMl07XG4gIHZhciB6MCA9IGV5ZXggLSB0YXJnZXRbMF0sXG4gICAgICB6MSA9IGV5ZXkgLSB0YXJnZXRbMV0sXG4gICAgICB6MiA9IGV5ZXogLSB0YXJnZXRbMl07XG4gIHZhciBsZW4gPSB6MCAqIHowICsgejEgKiB6MSArIHoyICogejI7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgejAgKj0gbGVuO1xuICAgIHoxICo9IGxlbjtcbiAgICB6MiAqPSBsZW47XG4gIH1cblxuICB2YXIgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxLFxuICAgICAgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyLFxuICAgICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSB4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDI7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgeDAgKj0gbGVuO1xuICAgIHgxICo9IGxlbjtcbiAgICB4MiAqPSBsZW47XG4gIH1cblxuICBvdXRbMF0gPSB4MDtcbiAgb3V0WzFdID0geDE7XG4gIG91dFsyXSA9IHgyO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB6MSAqIHgyIC0gejIgKiB4MTtcbiAgb3V0WzVdID0gejIgKiB4MCAtIHowICogeDI7XG4gIG91dFs2XSA9IHowICogeDEgLSB6MSAqIHgwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB6MDtcbiAgb3V0WzldID0gejE7XG4gIG91dFsxMF0gPSB6MjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSBleWV4O1xuICBvdXRbMTNdID0gZXlleTtcbiAgb3V0WzE0XSA9IGV5ZXo7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuO1xuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuICdtYXQ0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgKyBhWzZdICsgJywgJyArIGFbN10gKyAnLCAnICsgYVs4XSArICcsICcgKyBhWzldICsgJywgJyArIGFbMTBdICsgJywgJyArIGFbMTFdICsgJywgJyArIGFbMTJdICsgJywgJyArIGFbMTNdICsgJywgJyArIGFbMTRdICsgJywgJyArIGFbMTVdICsgJyknO1xufVxuLyoqXHJcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddLCBhWzhdLCBhWzldLCBhWzEwXSwgYVsxMV0sIGFbMTJdLCBhWzEzXSwgYVsxNF0sIGFbMTVdKTtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQ0J3NcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl07XG4gIG91dFs3XSA9IGFbN10gKyBiWzddO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XTtcbiAgb3V0WzldID0gYVs5XSArIGJbOV07XG4gIG91dFsxMF0gPSBhWzEwXSArIGJbMTBdO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdICsgYlsxMl07XG4gIG91dFsxM10gPSBhWzEzXSArIGJbMTNdO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdICsgYlsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICBvdXRbOV0gPSBhWzldIC0gYls5XTtcbiAgb3V0WzEwXSA9IGFbMTBdIC0gYlsxMF07XG4gIG91dFsxMV0gPSBhWzExXSAtIGJbMTFdO1xuICBvdXRbMTJdID0gYVsxMl0gLSBiWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdIC0gYlsxM107XG4gIG91dFsxNF0gPSBhWzE0XSAtIGJbMTRdO1xuICBvdXRbMTVdID0gYVsxNV0gLSBiWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIG91dFs2XSA9IGFbNl0gKiBiO1xuICBvdXRbN10gPSBhWzddICogYjtcbiAgb3V0WzhdID0gYVs4XSAqIGI7XG4gIG91dFs5XSA9IGFbOV0gKiBiO1xuICBvdXRbMTBdID0gYVsxMF0gKiBiO1xuICBvdXRbMTFdID0gYVsxMV0gKiBiO1xuICBvdXRbMTJdID0gYVsxMl0gKiBiO1xuICBvdXRbMTNdID0gYVsxM10gKiBiO1xuICBvdXRbMTRdID0gYVsxNF0gKiBiO1xuICBvdXRbMTVdID0gYVsxNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDQncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XSAqIHNjYWxlO1xuICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XSAqIHNjYWxlO1xuICBvdXRbOV0gPSBhWzldICsgYls5XSAqIHNjYWxlO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXSAqIHNjYWxlO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXSAqIHNjYWxlO1xuICBvdXRbMTJdID0gYVsxMl0gKyBiWzEyXSAqIHNjYWxlO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXSAqIHNjYWxlO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XSAqIHNjYWxlO1xuICBvdXRbMTVdID0gYVsxNV0gKyBiWzE1XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7bWF0NH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XSAmJiBhWzhdID09PSBiWzhdICYmIGFbOV0gPT09IGJbOV0gJiYgYVsxMF0gPT09IGJbMTBdICYmIGFbMTFdID09PSBiWzExXSAmJiBhWzEyXSA9PT0gYlsxMl0gJiYgYVsxM10gPT09IGJbMTNdICYmIGFbMTRdID09PSBiWzE0XSAmJiBhWzE1XSA9PT0gYlsxNV07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHttYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XTtcbiAgdmFyIGE4ID0gYVs4XSxcbiAgICAgIGE5ID0gYVs5XSxcbiAgICAgIGExMCA9IGFbMTBdLFxuICAgICAgYTExID0gYVsxMV07XG4gIHZhciBhMTIgPSBhWzEyXSxcbiAgICAgIGExMyA9IGFbMTNdLFxuICAgICAgYTE0ID0gYVsxNF0sXG4gICAgICBhMTUgPSBhWzE1XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgdmFyIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XTtcbiAgdmFyIGI4ID0gYls4XSxcbiAgICAgIGI5ID0gYls5XSxcbiAgICAgIGIxMCA9IGJbMTBdLFxuICAgICAgYjExID0gYlsxMV07XG4gIHZhciBiMTIgPSBiWzEyXSxcbiAgICAgIGIxMyA9IGJbMTNdLFxuICAgICAgYjE0ID0gYlsxNF0sXG4gICAgICBiMTUgPSBiWzE1XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSkgJiYgTWF0aC5hYnMoYTggLSBiOCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpICYmIE1hdGguYWJzKGE5IC0gYjkpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE5KSwgTWF0aC5hYnMoYjkpKSAmJiBNYXRoLmFicyhhMTAgLSBiMTApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMCksIE1hdGguYWJzKGIxMCkpICYmIE1hdGguYWJzKGExMSAtIGIxMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTExKSwgTWF0aC5hYnMoYjExKSkgJiYgTWF0aC5hYnMoYTEyIC0gYjEyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTIpLCBNYXRoLmFicyhiMTIpKSAmJiBNYXRoLmFicyhhMTMgLSBiMTMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMyksIE1hdGguYWJzKGIxMykpICYmIE1hdGguYWJzKGExNCAtIGIxNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTE0KSwgTWF0aC5hYnMoYjE0KSkgJiYgTWF0aC5hYnMoYTE1IC0gYjE1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTUpLCBNYXRoLmFicyhiMTUpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAzIERpbWVuc2lvbmFsIFZlY3RvclxyXG4gKiBAbW9kdWxlIHZlYzNcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMzXHJcbiAqXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gY2xvbmVcclxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeik7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMyB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHopIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gY2VpbFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGZsb29yXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIHJvdW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjMydzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBuZWdhdGVcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGludmVydFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBOb3JtYWxpemUgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIG91dFsyXSA9IGFbMl0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn1cbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXTtcbiAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheCAqIGJ5IC0gYXkgKiBieDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdO1xuICB2YXIgYXkgPSBhWzFdO1xuICB2YXIgYXogPSBhWzJdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgaGVybWl0ZSBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGhlcm1pdGUob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDE7XG4gIHZhciBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQ7XG4gIHZhciBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKTtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGJlemllcihvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgdmFyIGludmVyc2VGYWN0b3IgPSAxIC0gdDtcbiAgdmFyIGludmVyc2VGYWN0b3JUaW1lc1R3byA9IGludmVyc2VGYWN0b3IgKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yVGltZXMyID0gdCAqIHQ7XG4gIHZhciBmYWN0b3IxID0gaW52ZXJzZUZhY3RvclRpbWVzVHdvICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvcjIgPSAzICogdCAqIGludmVyc2VGYWN0b3JUaW1lc1R3bztcbiAgdmFyIGZhY3RvcjMgPSAzICogZmFjdG9yVGltZXMyICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiB0O1xuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIHZhciB6ID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgLSAxLjA7XG4gIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMS4wIC0geiAqIHopICogc2NhbGU7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlO1xuICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHpTY2FsZTtcbiAgb3V0WzJdID0geiAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDQuXHJcbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICB2YXIgdyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XTtcbiAgdyA9IHcgfHwgMS4wO1xuICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgb3V0WzFdID0gKG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdKSAvIHc7XG4gIG91dFsyXSA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pIC8gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHttYXQzfSBtIHRoZSAzeDMgbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIHF1YXRcclxuICogQ2FuIGFsc28gYmUgdXNlZCBmb3IgZHVhbCBxdWF0ZXJuaW9ucy4gKE11bHRpcGx5IGl0IHdpdGggdGhlIHJlYWwgcGFydClcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1RdWF0KG91dCwgYSwgcSkge1xuICAvLyBiZW5jaG1hcmtzOiBodHRwczovL2pzcGVyZi5jb20vcXVhdGVybmlvbi10cmFuc2Zvcm0tdmVjMy1pbXBsZW1lbnRhdGlvbnMtZml4ZWRcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTsgLy8gdmFyIHF2ZWMgPSBbcXgsIHF5LCBxel07XG4gIC8vIHZhciB1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIGEpO1xuXG4gIHZhciB1dnggPSBxeSAqIHogLSBxeiAqIHksXG4gICAgICB1dnkgPSBxeiAqIHggLSBxeCAqIHosXG4gICAgICB1dnogPSBxeCAqIHkgLSBxeSAqIHg7IC8vIHZhciB1dXYgPSB2ZWMzLmNyb3NzKFtdLCBxdmVjLCB1dik7XG5cbiAgdmFyIHV1dnggPSBxeSAqIHV2eiAtIHF6ICogdXZ5LFxuICAgICAgdXV2eSA9IHF6ICogdXZ4IC0gcXggKiB1dnosXG4gICAgICB1dXZ6ID0gcXggKiB1dnkgLSBxeSAqIHV2eDsgLy8gdmVjMy5zY2FsZSh1diwgdXYsIDIgKiB3KTtcblxuICB2YXIgdzIgPSBxdyAqIDI7XG4gIHV2eCAqPSB3MjtcbiAgdXZ5ICo9IHcyO1xuICB1dnogKj0gdzI7IC8vIHZlYzMuc2NhbGUodXV2LCB1dXYsIDIpO1xuXG4gIHV1dnggKj0gMjtcbiAgdXV2eSAqPSAyO1xuICB1dXZ6ICo9IDI7IC8vIHJldHVybiB2ZWMzLmFkZChvdXQsIGEsIHZlYzMuYWRkKG91dCwgdXYsIHV1dikpO1xuXG4gIG91dFswXSA9IHggKyB1dnggKyB1dXZ4O1xuICBvdXRbMV0gPSB5ICsgdXZ5ICsgdXV2eTtcbiAgb3V0WzJdID0geiArIHV2eiArIHV1dno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgeC1heGlzXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCBiLCBjKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXTtcbiAgclsxXSA9IHBbMV0gKiBNYXRoLmNvcyhjKSAtIHBbMl0gKiBNYXRoLnNpbihjKTtcbiAgclsyXSA9IHBbMV0gKiBNYXRoLnNpbihjKSArIHBbMl0gKiBNYXRoLmNvcyhjKTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgeS1heGlzXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCBiLCBjKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKGMpICsgcFswXSAqIE1hdGguY29zKGMpO1xuICByWzFdID0gcFsxXTtcbiAgclsyXSA9IHBbMl0gKiBNYXRoLmNvcyhjKSAtIHBbMF0gKiBNYXRoLnNpbihjKTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgei1heGlzXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCBiLCBjKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXSAqIE1hdGguY29zKGMpIC0gcFsxXSAqIE1hdGguc2luKGMpO1xuICByWzFdID0gcFswXSAqIE1hdGguc2luKGMpICsgcFsxXSAqIE1hdGguY29zKGMpO1xuICByWzJdID0gcFsyXTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAzRCB2ZWN0b3JzXHJcbiAqIEBwYXJhbSB7dmVjM30gYSBUaGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgdGVtcEEgPSBmcm9tVmFsdWVzKGFbMF0sIGFbMV0sIGFbMl0pO1xuICB2YXIgdGVtcEIgPSBmcm9tVmFsdWVzKGJbMF0sIGJbMV0sIGJbMl0pO1xuICBub3JtYWxpemUodGVtcEEsIHRlbXBBKTtcbiAgbm9ybWFsaXplKHRlbXBCLCB0ZW1wQik7XG4gIHZhciBjb3NpbmUgPSBkb3QodGVtcEEsIHRlbXBCKTtcblxuICBpZiAoY29zaW5lID4gMS4wKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAoY29zaW5lIDwgLTEuMCkge1xuICAgIHJldHVybiBNYXRoLlBJO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgfVxufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gemVyb1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIG91dFsyXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuICd2ZWMzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjM3MuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMy4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMzcyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMztcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIHZlY1syXSA9IGFbaSArIDJdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgICBhW2kgKyAyXSA9IHZlY1syXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiA0IERpbWVuc2lvbmFsIFZlY3RvclxyXG4gKiBAbW9kdWxlIHZlYzRcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWM0XHJcbiAqXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6LCB3KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjNCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHosIHcpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICBvdXRbM10gPSBhWzNdICogYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNlaWxcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguY2VpbChhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGZsb29yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5mbG9vcihhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5taW4oYVszXSwgYlszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gcm91bmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLnJvdW5kKGFbMl0pO1xuICBvdXRbM10gPSBNYXRoLnJvdW5kKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyBhIHZlYzQgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjNCdzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHosIHcpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gbmVnYXRlXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IC1hWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICBvdXRbM10gPSAxLjAgLyBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSB4ICogbGVuO1xuICBvdXRbMV0gPSB5ICogbGVuO1xuICBvdXRbMl0gPSB6ICogbGVuO1xuICBvdXRbM10gPSB3ICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjcm9zcy1wcm9kdWN0IG9mIHRocmVlIHZlY3RvcnMgaW4gYSA0LWRpbWVuc2lvbmFsIHNwYWNlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gcmVzdWx0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gVSB0aGUgZmlyc3QgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gViB0aGUgc2Vjb25kIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzR9IFcgdGhlIHRoaXJkIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gcmVzdWx0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCB1LCB2LCB3KSB7XG4gIHZhciBBID0gdlswXSAqIHdbMV0gLSB2WzFdICogd1swXSxcbiAgICAgIEIgPSB2WzBdICogd1syXSAtIHZbMl0gKiB3WzBdLFxuICAgICAgQyA9IHZbMF0gKiB3WzNdIC0gdlszXSAqIHdbMF0sXG4gICAgICBEID0gdlsxXSAqIHdbMl0gLSB2WzJdICogd1sxXSxcbiAgICAgIEUgPSB2WzFdICogd1szXSAtIHZbM10gKiB3WzFdLFxuICAgICAgRiA9IHZbMl0gKiB3WzNdIC0gdlszXSAqIHdbMl07XG4gIHZhciBHID0gdVswXTtcbiAgdmFyIEggPSB1WzFdO1xuICB2YXIgSSA9IHVbMl07XG4gIHZhciBKID0gdVszXTtcbiAgb3V0WzBdID0gSCAqIEYgLSBJICogRSArIEogKiBEO1xuICBvdXRbMV0gPSAtKEcgKiBGKSArIEkgKiBDIC0gSiAqIEI7XG4gIG91dFsyXSA9IEcgKiBFIC0gSCAqIEMgKyBKICogQTtcbiAgb3V0WzNdID0gLShHICogRCkgKyBIICogQiAtIEkgKiBBO1xuICByZXR1cm4gb3V0O1xufVxuO1xuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF07XG4gIHZhciBheSA9IGFbMV07XG4gIHZhciBheiA9IGFbMl07XG4gIHZhciBhdyA9IGFbM107XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gIG91dFszXSA9IGF3ICsgdCAqIChiWzNdIC0gYXcpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDsgLy8gTWFyc2FnbGlhLCBHZW9yZ2UuIENob29zaW5nIGEgUG9pbnQgZnJvbSB0aGUgU3VyZmFjZSBvZiBhXG4gIC8vIFNwaGVyZS4gQW5uLiBNYXRoLiBTdGF0aXN0LiA0MyAoMTk3MiksIG5vLiAyLCA2NDUtLTY0Ni5cbiAgLy8gaHR0cDovL3Byb2plY3RldWNsaWQub3JnL2V1Y2xpZC5hb21zLzExNzc2OTI2NDQ7XG5cbiAgdmFyIHYxLCB2MiwgdjMsIHY0O1xuICB2YXIgczEsIHMyO1xuXG4gIGRvIHtcbiAgICB2MSA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMxID0gdjEgKiB2MSArIHYyICogdjI7XG4gIH0gd2hpbGUgKHMxID49IDEpO1xuXG4gIGRvIHtcbiAgICB2MyA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjQgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMyID0gdjMgKiB2MyArIHY0ICogdjQ7XG4gIH0gd2hpbGUgKHMyID49IDEpO1xuXG4gIHZhciBkID0gTWF0aC5zcXJ0KCgxIC0gczEpIC8gczIpO1xuICBvdXRbMF0gPSBzY2FsZSAqIHYxO1xuICBvdXRbMV0gPSBzY2FsZSAqIHYyO1xuICBvdXRbMl0gPSBzY2FsZSAqIHYzICogZDtcbiAgb3V0WzNdID0gc2NhbGUgKiB2NCAqIGQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl0sXG4gICAgICB3ID0gYVszXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSAqIHc7XG4gIG91dFsyXSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSAqIHc7XG4gIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtxdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107IC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG5cbiAgdmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuICB2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG4gIHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcbiAgdmFyIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejsgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG4gIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNCB0byB6ZXJvXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAndmVjNCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGl2aWRlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZERpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjNHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjNC4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gNDtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIHZlY1syXSA9IGFbaSArIDJdO1xuICAgICAgdmVjWzNdID0gYVtpICsgM107XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgICAgYVtpICsgM10gPSB2ZWNbM107XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQzIGZyb20gXCIuL21hdDMuanNcIjtcbmltcG9ydCAqIGFzIHZlYzMgZnJvbSBcIi4vdmVjMy5qc1wiO1xuaW1wb3J0ICogYXMgdmVjNCBmcm9tIFwiLi92ZWM0LmpzXCI7XG4vKipcclxuICogUXVhdGVybmlvblxyXG4gKiBAbW9kdWxlIHF1YXRcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IHF1YXRcclxuICpcclxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgcXVhdCB0byB0aGUgaWRlbnRpdHkgcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAwO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxyXG4gKiB0aGVuIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3ZlYzN9IGF4aXMgdGhlIGF4aXMgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXhpc0FuZ2xlKG91dCwgYXhpcywgcmFkKSB7XG4gIHJhZCA9IHJhZCAqIDAuNTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICBvdXRbMF0gPSBzICogYXhpc1swXTtcbiAgb3V0WzFdID0gcyAqIGF4aXNbMV07XG4gIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICBvdXRbM10gPSBNYXRoLmNvcyhyYWQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldHMgdGhlIHJvdGF0aW9uIGF4aXMgYW5kIGFuZ2xlIGZvciBhIGdpdmVuXHJcbiAqICBxdWF0ZXJuaW9uLiBJZiBhIHF1YXRlcm5pb24gaXMgY3JlYXRlZCB3aXRoXHJcbiAqICBzZXRBeGlzQW5nbGUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzYW1lXHJcbiAqICB2YWx1ZXMgYXMgcHJvdmlkaWVkIGluIHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXIgbGlzdFxyXG4gKiAgT1IgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdmFsdWVzLlxyXG4gKiBFeGFtcGxlOiBUaGUgcXVhdGVybmlvbiBmb3JtZWQgYnkgYXhpcyBbMCwgMCwgMV0gYW5kXHJcbiAqICBhbmdsZSAtOTAgaXMgdGhlIHNhbWUgYXMgdGhlIHF1YXRlcm5pb24gZm9ybWVkIGJ5XHJcbiAqICBbMCwgMCwgMV0gYW5kIDI3MC4gVGhpcyBtZXRob2QgZmF2b3JzIHRoZSBsYXR0ZXIuXHJcbiAqIEBwYXJhbSAge3ZlYzN9IG91dF9heGlzICBWZWN0b3IgcmVjZWl2aW5nIHRoZSBheGlzIG9mIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSAge3F1YXR9IHEgICAgIFF1YXRlcm5pb24gdG8gYmUgZGVjb21wb3NlZFxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBBbmdsZSwgaW4gcmFkaWFucywgb2YgdGhlIHJvdGF0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXhpc0FuZ2xlKG91dF9heGlzLCBxKSB7XG4gIHZhciByYWQgPSBNYXRoLmFjb3MocVszXSkgKiAyLjA7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkIC8gMi4wKTtcblxuICBpZiAocyA+IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICBvdXRfYXhpc1swXSA9IHFbMF0gLyBzO1xuICAgIG91dF9heGlzWzFdID0gcVsxXSAvIHM7XG4gICAgb3V0X2F4aXNbMl0gPSBxWzJdIC8gcztcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBzIGlzIHplcm8sIHJldHVybiBhbnkgYXhpcyAobm8gcm90YXRpb24gLSBheGlzIGRvZXMgbm90IG1hdHRlcilcbiAgICBvdXRfYXhpc1swXSA9IDE7XG4gICAgb3V0X2F4aXNbMV0gPSAwO1xuICAgIG91dF9heGlzWzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiByYWQ7XG59XG4vKipcclxuICogR2V0cyB0aGUgYW5ndWxhciBkaXN0YW5jZSBiZXR3ZWVuIHR3byB1bml0IHF1YXRlcm5pb25zXHJcbiAqXHJcbiAqIEBwYXJhbSAge3F1YXR9IGEgICAgIE9yaWdpbiB1bml0IHF1YXRlcm5pb24gXHJcbiAqIEBwYXJhbSAge3F1YXR9IGIgICAgIERlc3RpbmF0aW9uIHVuaXQgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBBbmdsZSwgaW4gcmFkaWFucywgYmV0d2VlbiB0aGUgdHdvIHF1YXRlcm5pb25zXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5nbGUoYSwgYikge1xuICB2YXIgZG90cHJvZHVjdCA9IGRvdChhLCBiKTtcbiAgcmV0dXJuIE1hdGguYWNvcygyICogZG90cHJvZHVjdCAqIGRvdHByb2R1Y3QgLSAxKTtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBxdWF0J3NcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFggYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYng7XG4gIG91dFsxXSA9IGF5ICogYncgKyBheiAqIGJ4O1xuICBvdXRbMl0gPSBheiAqIGJ3IC0gYXkgKiBieDtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYng7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBZIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcclxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHJhZCAqPSAwLjU7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieSA9IE1hdGguc2luKHJhZCksXG4gICAgICBidyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGF4ICogYncgLSBheiAqIGJ5O1xuICBvdXRbMV0gPSBheSAqIGJ3ICsgYXcgKiBieTtcbiAgb3V0WzJdID0gYXogKiBidyArIGF4ICogYnk7XG4gIG91dFszXSA9IGF3ICogYncgLSBheSAqIGJ5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgWiBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnogPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3ICsgYXkgKiBiejtcbiAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBXIGNvbXBvbmVudCBvZiBhIHF1YXQgZnJvbSB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cy5cclxuICogQXNzdW1lcyB0aGF0IHF1YXRlcm5pb24gaXMgMSB1bml0IGluIGxlbmd0aC5cclxuICogQW55IGV4aXN0aW5nIFcgY29tcG9uZW50IHdpbGwgYmUgaWdub3JlZC5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlVyhvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gTWF0aC5zcXJ0KE1hdGguYWJzKDEuMCAtIHggKiB4IC0geSAqIHkgLSB6ICogeikpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2YgYSB1bml0IHF1YXRlcm5pb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgdGhlIGV4cG9uZW50aWFsIG9mXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleHAob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl0sXG4gICAgICB3ID0gYVszXTtcbiAgdmFyIHIgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcbiAgdmFyIGV0ID0gTWF0aC5leHAodyk7XG4gIHZhciBzID0gciA+IDAgPyBldCAqIE1hdGguc2luKHIpIC8gciA6IDA7XG4gIG91dFswXSA9IHggKiBzO1xuICBvdXRbMV0gPSB5ICogcztcbiAgb3V0WzJdID0geiAqIHM7XG4gIG91dFszXSA9IGV0ICogTWF0aC5jb3Mocik7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiBhIHVuaXQgcXVhdGVybmlvbi5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxuKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciB0ID0gciA+IDAgPyBNYXRoLmF0YW4yKHIsIHcpIC8gciA6IDA7XG4gIG91dFswXSA9IHggKiB0O1xuICBvdXRbMV0gPSB5ICogdDtcbiAgb3V0WzJdID0geiAqIHQ7XG4gIG91dFszXSA9IDAuNSAqIE1hdGgubG9nKHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIHNjYWxhciBwb3dlciBvZiBhIHVuaXQgcXVhdGVybmlvbi5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBxdWF0ZXJuaW9uIGJ5XHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwb3cob3V0LCBhLCBiKSB7XG4gIGxuKG91dCwgYSk7XG4gIHNjYWxlKG91dCwgb3V0LCBiKTtcbiAgZXhwKG91dCwgb3V0KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgLy8gYmVuY2htYXJrczpcbiAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgdmFyIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxOyAvLyBjYWxjIGNvc2luZVxuXG4gIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidzsgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG5cbiAgaWYgKGNvc29tIDwgMC4wKSB7XG4gICAgY29zb20gPSAtY29zb207XG4gICAgYnggPSAtYng7XG4gICAgYnkgPSAtYnk7XG4gICAgYnogPSAtYno7XG4gICAgYncgPSAtYnc7XG4gIH0gLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuXG5cbiAgaWYgKDEuMCAtIGNvc29tID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIC8vIHN0YW5kYXJkIGNhc2UgKHNsZXJwKVxuICAgIG9tZWdhID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTtcbiAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICBzY2FsZTEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207XG4gIH0gZWxzZSB7XG4gICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZVxuICAgIC8vICAuLi4gc28gd2UgY2FuIGRvIGEgbGluZWFyIGludGVycG9sYXRpb25cbiAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgIHNjYWxlMSA9IHQ7XG4gIH0gLy8gY2FsY3VsYXRlIGZpbmFsIHZhbHVlc1xuXG5cbiAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgb3V0WzFdID0gc2NhbGUwICogYXkgKyBzY2FsZTEgKiBieTtcbiAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdW5pdCBxdWF0ZXJuaW9uXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQpIHtcbiAgLy8gSW1wbGVtZW50YXRpb24gb2YgaHR0cDovL3BsYW5uaW5nLmNzLnVpdWMuZWR1L25vZGUxOTguaHRtbFxuICAvLyBUT0RPOiBDYWxsaW5nIHJhbmRvbSAzIHRpbWVzIGlzIHByb2JhYmx5IG5vdCB0aGUgZmFzdGVzdCBzb2x1dGlvblxuICB2YXIgdTEgPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgdmFyIHUyID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gIHZhciB1MyA9IGdsTWF0cml4LlJBTkRPTSgpO1xuICB2YXIgc3FydDFNaW51c1UxID0gTWF0aC5zcXJ0KDEgLSB1MSk7XG4gIHZhciBzcXJ0VTEgPSBNYXRoLnNxcnQodTEpO1xuICBvdXRbMF0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdTIpO1xuICBvdXRbMV0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLmNvcygyLjAgKiBNYXRoLlBJICogdTIpO1xuICBvdXRbMl0gPSBzcXJ0VTEgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdTMpO1xuICBvdXRbM10gPSBzcXJ0VTEgKiBNYXRoLmNvcygyLjAgKiBNYXRoLlBJICogdTMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgZG90ID0gYTAgKiBhMCArIGExICogYTEgKyBhMiAqIGEyICsgYTMgKiBhMztcbiAgdmFyIGludkRvdCA9IGRvdCA/IDEuMCAvIGRvdCA6IDA7IC8vIFRPRE86IFdvdWxkIGJlIGZhc3RlciB0byByZXR1cm4gWzAsMCwwLDBdIGltbWVkaWF0ZWx5IGlmIGRvdCA9PSAwXG5cbiAgb3V0WzBdID0gLWEwICogaW52RG90O1xuICBvdXRbMV0gPSAtYTEgKiBpbnZEb3Q7XG4gIG91dFsyXSA9IC1hMiAqIGludkRvdDtcbiAgb3V0WzNdID0gYTMgKiBpbnZEb3Q7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgcXVhdFxyXG4gKiBJZiB0aGUgcXVhdGVybmlvbiBpcyBub3JtYWxpemVkLCB0aGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHF1YXQuaW52ZXJzZSBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGNvbmp1Z2F0ZSBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIDN4MyByb3RhdGlvbiBtYXRyaXguXHJcbiAqXHJcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXHJcbiAqIHRvIHJlbm9ybWFsaXplIHRoZSBxdWF0ZXJuaW9uIHlvdXJzZWxmIHdoZXJlIG5lY2Vzc2FyeS5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7bWF0M30gbSByb3RhdGlvbiBtYXRyaXhcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MyhvdXQsIG0pIHtcbiAgLy8gQWxnb3JpdGhtIGluIEtlbiBTaG9lbWFrZSdzIGFydGljbGUgaW4gMTk4NyBTSUdHUkFQSCBjb3Vyc2Ugbm90ZXNcbiAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07XG4gIHZhciBmUm9vdDtcblxuICBpZiAoZlRyYWNlID4gMC4wKSB7XG4gICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgIGZSb290ID0gTWF0aC5zcXJ0KGZUcmFjZSArIDEuMCk7IC8vIDJ3XG5cbiAgICBvdXRbM10gPSAwLjUgKiBmUm9vdDtcbiAgICBmUm9vdCA9IDAuNSAvIGZSb290OyAvLyAxLyg0dylcblxuICAgIG91dFswXSA9IChtWzVdIC0gbVs3XSkgKiBmUm9vdDtcbiAgICBvdXRbMV0gPSAobVs2XSAtIG1bMl0pICogZlJvb3Q7XG4gICAgb3V0WzJdID0gKG1bMV0gLSBtWzNdKSAqIGZSb290O1xuICB9IGVsc2Uge1xuICAgIC8vIHx3fCA8PSAxLzJcbiAgICB2YXIgaSA9IDA7XG4gICAgaWYgKG1bNF0gPiBtWzBdKSBpID0gMTtcbiAgICBpZiAobVs4XSA+IG1baSAqIDMgKyBpXSkgaSA9IDI7XG4gICAgdmFyIGogPSAoaSArIDEpICUgMztcbiAgICB2YXIgayA9IChpICsgMikgJSAzO1xuICAgIGZSb290ID0gTWF0aC5zcXJ0KG1baSAqIDMgKyBpXSAtIG1baiAqIDMgKyBqXSAtIG1bayAqIDMgKyBrXSArIDEuMCk7XG4gICAgb3V0W2ldID0gMC41ICogZlJvb3Q7XG4gICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICBvdXRbM10gPSAobVtqICogMyArIGtdIC0gbVtrICogMyArIGpdKSAqIGZSb290O1xuICAgIG91dFtqXSA9IChtW2ogKiAzICsgaV0gKyBtW2kgKiAzICsgal0pICogZlJvb3Q7XG4gICAgb3V0W2tdID0gKG1bayAqIDMgKyBpXSArIG1baSAqIDMgKyBrXSkgKiBmUm9vdDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gZXVsZXIgYW5nbGUgeCwgeSwgei5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7eH0gQW5nbGUgdG8gcm90YXRlIGFyb3VuZCBYIGF4aXMgaW4gZGVncmVlcy5cclxuICogQHBhcmFtIHt5fSBBbmdsZSB0byByb3RhdGUgYXJvdW5kIFkgYXhpcyBpbiBkZWdyZWVzLlxyXG4gKiBAcGFyYW0ge3p9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWiBheGlzIGluIGRlZ3JlZXMuXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUV1bGVyKG91dCwgeCwgeSwgeikge1xuICB2YXIgaGFsZlRvUmFkID0gMC41ICogTWF0aC5QSSAvIDE4MC4wO1xuICB4ICo9IGhhbGZUb1JhZDtcbiAgeSAqPSBoYWxmVG9SYWQ7XG4gIHogKj0gaGFsZlRvUmFkO1xuICB2YXIgc3ggPSBNYXRoLnNpbih4KTtcbiAgdmFyIGN4ID0gTWF0aC5jb3MoeCk7XG4gIHZhciBzeSA9IE1hdGguc2luKHkpO1xuICB2YXIgY3kgPSBNYXRoLmNvcyh5KTtcbiAgdmFyIHN6ID0gTWF0aC5zaW4oeik7XG4gIHZhciBjeiA9IE1hdGguY29zKHopO1xuICBvdXRbMF0gPSBzeCAqIGN5ICogY3ogLSBjeCAqIHN5ICogc3o7XG4gIG91dFsxXSA9IGN4ICogc3kgKiBjeiArIHN4ICogY3kgKiBzejtcbiAgb3V0WzJdID0gY3ggKiBjeSAqIHN6IC0gc3ggKiBzeSAqIGN6O1xuICBvdXRbM10gPSBjeCAqIGN5ICogY3ogKyBzeCAqIHN5ICogc3o7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHF1YXRlbmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAncXVhdCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBjbG9uZSA9IHZlYzQuY2xvbmU7XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZnJvbVZhbHVlcyA9IHZlYzQuZnJvbVZhbHVlcztcbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgcXVhdCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIHNvdXJjZSBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGNvcHkgPSB2ZWM0LmNvcHk7XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgcXVhdCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzZXQgPSB2ZWM0LnNldDtcbi8qKlxyXG4gKiBBZGRzIHR3byBxdWF0J3NcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGFkZCA9IHZlYzQuYWRkO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIFNjYWxlcyBhIHF1YXQgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNjYWxlID0gdmVjNC5zY2FsZTtcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gcXVhdCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRvdCA9IHZlYzQuZG90O1xuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlcnAgPSB2ZWM0LmxlcnA7XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCB2YXIgbGVuZ3RoID0gdmVjNC5sZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Lmxlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHF1YXRcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3F1YXJlZExlbmd0aCA9IHZlYzQuc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogTm9ybWFsaXplIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG5vcm1hbGl6ZSA9IHZlYzQubm9ybWFsaXplO1xuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBhIFRoZSBmaXJzdCBxdWF0ZXJuaW9uLlxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgVGhlIHNlY29uZCBxdWF0ZXJuaW9uLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCB2YXIgZXhhY3RFcXVhbHMgPSB2ZWM0LmV4YWN0RXF1YWxzO1xuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7cXVhdH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgdmFyIGVxdWFscyA9IHZlYzQuZXF1YWxzO1xuLyoqXHJcbiAqIFNldHMgYSBxdWF0ZXJuaW9uIHRvIHJlcHJlc2VudCB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZnJvbSBvbmVcclxuICogdmVjdG9yIHRvIGFub3RoZXIuXHJcbiAqXHJcbiAqIEJvdGggdmVjdG9ycyBhcmUgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aC5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uLlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGluaXRpYWwgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgZGVzdGluYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCB2YXIgcm90YXRpb25UbyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRtcHZlYzMgPSB2ZWMzLmNyZWF0ZSgpO1xuICB2YXIgeFVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDEsIDAsIDApO1xuICB2YXIgeVVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcblxuICAgIGlmIChkb3QgPCAtMC45OTk5OTkpIHtcbiAgICAgIHZlYzMuY3Jvc3ModG1wdmVjMywgeFVuaXRWZWMzLCBhKTtcbiAgICAgIGlmICh2ZWMzLmxlbih0bXB2ZWMzKSA8IDAuMDAwMDAxKSB2ZWMzLmNyb3NzKHRtcHZlYzMsIHlVbml0VmVjMywgYSk7XG4gICAgICB2ZWMzLm5vcm1hbGl6ZSh0bXB2ZWMzLCB0bXB2ZWMzKTtcbiAgICAgIHNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGVsc2UgaWYgKGRvdCA+IDAuOTk5OTk5KSB7XG4gICAgICBvdXRbMF0gPSAwO1xuICAgICAgb3V0WzFdID0gMDtcbiAgICAgIG91dFsyXSA9IDA7XG4gICAgICBvdXRbM10gPSAxO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCBhLCBiKTtcbiAgICAgIG91dFswXSA9IHRtcHZlYzNbMF07XG4gICAgICBvdXRbMV0gPSB0bXB2ZWMzWzFdO1xuICAgICAgb3V0WzJdID0gdG1wdmVjM1syXTtcbiAgICAgIG91dFszXSA9IDEgKyBkb3Q7XG4gICAgICByZXR1cm4gbm9ybWFsaXplKG91dCwgb3V0KTtcbiAgICB9XG4gIH07XG59KCk7XG4vKipcclxuICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7cXVhdH0gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IHZhciBzcWxlcnAgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZW1wMSA9IGNyZWF0ZSgpO1xuICB2YXIgdGVtcDIgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgICBzbGVycCh0ZW1wMSwgYSwgZCwgdCk7XG4gICAgc2xlcnAodGVtcDIsIGIsIGMsIHQpO1xuICAgIHNsZXJwKG91dCwgdGVtcDEsIHRlbXAyLCAyICogdCAqICgxIC0gdCkpO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG59KCk7XG4vKipcclxuICogU2V0cyB0aGUgc3BlY2lmaWVkIHF1YXRlcm5pb24gd2l0aCB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW5cclxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXHJcbiAqIHBlcnBlbmRpY3VsYXIgdG8gYWxsIG90aGVyIHNwZWNpZmllZCBheGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IHZpZXcgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB2aWV3aW5nIGRpcmVjdGlvblxyXG4gKiBAcGFyYW0ge3ZlYzN9IHJpZ2h0IHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBcInJpZ2h0XCIgZGlyZWN0aW9uXHJcbiAqIEBwYXJhbSB7dmVjM30gdXAgICAgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvY2FsIFwidXBcIiBkaXJlY3Rpb25cclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IHZhciBzZXRBeGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbWF0ciA9IG1hdDMuY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCB2aWV3LCByaWdodCwgdXApIHtcbiAgICBtYXRyWzBdID0gcmlnaHRbMF07XG4gICAgbWF0clszXSA9IHJpZ2h0WzFdO1xuICAgIG1hdHJbNl0gPSByaWdodFsyXTtcbiAgICBtYXRyWzFdID0gdXBbMF07XG4gICAgbWF0cls0XSA9IHVwWzFdO1xuICAgIG1hdHJbN10gPSB1cFsyXTtcbiAgICBtYXRyWzJdID0gLXZpZXdbMF07XG4gICAgbWF0cls1XSA9IC12aWV3WzFdO1xuICAgIG1hdHJbOF0gPSAtdmlld1syXTtcbiAgICByZXR1cm4gbm9ybWFsaXplKG91dCwgZnJvbU1hdDMob3V0LCBtYXRyKSk7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5pbXBvcnQgKiBhcyBxdWF0IGZyb20gXCIuL3F1YXQuanNcIjtcbmltcG9ydCAqIGFzIG1hdDQgZnJvbSBcIi4vbWF0NC5qc1wiO1xuLyoqXHJcbiAqIER1YWwgUXVhdGVybmlvbjxicj5cclxuICogRm9ybWF0OiBbcmVhbCwgZHVhbF08YnI+XHJcbiAqIFF1YXRlcm5pb24gZm9ybWF0OiBYWVpXPGJyPlxyXG4gKiBNYWtlIHN1cmUgdG8gaGF2ZSBub3JtYWxpemVkIGR1YWwgcXVhdGVybmlvbnMsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb25zIG1heSBub3Qgd29yayBhcyBpbnRlbmRlZC48YnI+XHJcbiAqIEBtb2R1bGUgcXVhdDJcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IGR1YWwgcXVhdFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGEgbmV3IGR1YWwgcXVhdGVybmlvbiBbcmVhbCAtPiByb3RhdGlvbiwgZHVhbCAtPiB0cmFuc2xhdGlvbl1cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIGRxWzBdID0gMDtcbiAgICBkcVsxXSA9IDA7XG4gICAgZHFbMl0gPSAwO1xuICAgIGRxWzRdID0gMDtcbiAgICBkcVs1XSA9IDA7XG4gICAgZHFbNl0gPSAwO1xuICAgIGRxWzddID0gMDtcbiAgfVxuXG4gIGRxWzNdID0gMTtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gYSBkdWFsIHF1YXRlcm5pb24gdG8gY2xvbmVcclxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG4gIGRxWzBdID0gYVswXTtcbiAgZHFbMV0gPSBhWzFdO1xuICBkcVsyXSA9IGFbMl07XG4gIGRxWzNdID0gYVszXTtcbiAgZHFbNF0gPSBhWzRdO1xuICBkcVs1XSA9IGFbNV07XG4gIGRxWzZdID0gYVs2XTtcbiAgZHFbN10gPSBhWzddO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geTEgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MSBXIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geDIgWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkyIFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdzIgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIsIHcyKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuICBkcVswXSA9IHgxO1xuICBkcVsxXSA9IHkxO1xuICBkcVsyXSA9IHoxO1xuICBkcVszXSA9IHcxO1xuICBkcVs0XSA9IHgyO1xuICBkcVs1XSA9IHkyO1xuICBkcVs2XSA9IHoyO1xuICBkcVs3XSA9IHcyO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzIChxdWF0IGFuZCB0cmFuc2xhdGlvbilcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHgxIFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gejEgWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcxIFcgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MiBZIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gbmV3IGR1YWwgcXVhdGVybmlvblxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblZhbHVlcyh4MSwgeTEsIHoxLCB3MSwgeDIsIHkyLCB6Mikge1xuICB2YXIgZHEgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg4KTtcbiAgZHFbMF0gPSB4MTtcbiAgZHFbMV0gPSB5MTtcbiAgZHFbMl0gPSB6MTtcbiAgZHFbM10gPSB3MTtcbiAgdmFyIGF4ID0geDIgKiAwLjUsXG4gICAgICBheSA9IHkyICogMC41LFxuICAgICAgYXogPSB6MiAqIDAuNTtcbiAgZHFbNF0gPSBheCAqIHcxICsgYXkgKiB6MSAtIGF6ICogeTE7XG4gIGRxWzVdID0gYXkgKiB3MSArIGF6ICogeDEgLSBheCAqIHoxO1xuICBkcVs2XSA9IGF6ICogdzEgKyBheCAqIHkxIC0gYXkgKiB4MTtcbiAgZHFbN10gPSAtYXggKiB4MSAtIGF5ICogeTEgLSBheiAqIHoxO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgcXVhdGVybmlvbiBhbmQgYSB0cmFuc2xhdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0fSBxIGEgbm9ybWFsaXplZCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7dmVjM30gdCB0cmFubGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIHEsIHQpIHtcbiAgdmFyIGF4ID0gdFswXSAqIDAuNSxcbiAgICAgIGF5ID0gdFsxXSAqIDAuNSxcbiAgICAgIGF6ID0gdFsyXSAqIDAuNSxcbiAgICAgIGJ4ID0gcVswXSxcbiAgICAgIGJ5ID0gcVsxXSxcbiAgICAgIGJ6ID0gcVsyXSxcbiAgICAgIGJ3ID0gcVszXTtcbiAgb3V0WzBdID0gYng7XG4gIG91dFsxXSA9IGJ5O1xuICBvdXRbMl0gPSBiejtcbiAgb3V0WzNdID0gYnc7XG4gIG91dFs0XSA9IGF4ICogYncgKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzVdID0gYXkgKiBidyArIGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbNl0gPSBheiAqIGJ3ICsgYXggKiBieSAtIGF5ICogYng7XG4gIG91dFs3XSA9IC1heCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgdHJhbnNsYXRpb25cclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7dmVjM30gdCB0cmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge3F1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdCkge1xuICBvdXRbMF0gPSAwO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICBvdXRbNF0gPSB0WzBdICogMC41O1xuICBvdXRbNV0gPSB0WzFdICogMC41O1xuICBvdXRbNl0gPSB0WzJdICogMC41O1xuICBvdXRbN10gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBkdWFsIHF1YXQgZnJvbSBhIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdH0gcSB0aGUgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCBxKSB7XG4gIG91dFswXSA9IHFbMF07XG4gIG91dFsxXSA9IHFbMV07XG4gIG91dFsyXSA9IHFbMl07XG4gIG91dFszXSA9IHFbM107XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSBhIG1hdHJpeCAoNHg0KVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0NChvdXQsIGEpIHtcbiAgLy9UT0RPIE9wdGltaXplIHRoaXNcbiAgdmFyIG91dGVyID0gcXVhdC5jcmVhdGUoKTtcbiAgbWF0NC5nZXRSb3RhdGlvbihvdXRlciwgYSk7XG4gIHZhciB0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG1hdDQuZ2V0VHJhbnNsYXRpb24odCwgYSk7XG4gIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG91dCwgb3V0ZXIsIHQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBkdWFsIHF1YXQgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgc291cmNlIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCBhIGR1YWwgcXVhdCB0byB0aGUgaWRlbnRpdHkgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBkdWFsIHF1YXQgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geTEgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MSBXIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geDIgWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkyIFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdzIgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIsIHcyKSB7XG4gIG91dFswXSA9IHgxO1xuICBvdXRbMV0gPSB5MTtcbiAgb3V0WzJdID0gejE7XG4gIG91dFszXSA9IHcxO1xuICBvdXRbNF0gPSB4MjtcbiAgb3V0WzVdID0geTI7XG4gIG91dFs2XSA9IHoyO1xuICBvdXRbN10gPSB3MjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXRzIHRoZSByZWFsIHBhcnQgb2YgYSBkdWFsIHF1YXRcclxuICogQHBhcmFtICB7cXVhdH0gb3V0IHJlYWwgcGFydFxyXG4gKiBAcGFyYW0gIHtxdWF0Mn0gYSBEdWFsIFF1YXRlcm5pb25cclxuICogQHJldHVybiB7cXVhdH0gcmVhbCBwYXJ0XHJcbiAqL1xuXG5leHBvcnQgdmFyIGdldFJlYWwgPSBxdWF0LmNvcHk7XG4vKipcclxuICogR2V0cyB0aGUgZHVhbCBwYXJ0IG9mIGEgZHVhbCBxdWF0XHJcbiAqIEBwYXJhbSAge3F1YXR9IG91dCBkdWFsIHBhcnRcclxuICogQHBhcmFtICB7cXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm4ge3F1YXR9IGR1YWwgcGFydFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldER1YWwob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbNF07XG4gIG91dFsxXSA9IGFbNV07XG4gIG91dFsyXSA9IGFbNl07XG4gIG91dFszXSA9IGFbN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSByZWFsIGNvbXBvbmVudCBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gcSBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIHRoZSByZWFsIHBhcnRcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNldFJlYWwgPSBxdWF0LmNvcHk7XG4vKipcclxuICogU2V0IHRoZSBkdWFsIGNvbXBvbmVudCBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gcSBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIHRoZSBkdWFsIHBhcnRcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0RHVhbChvdXQsIHEpIHtcbiAgb3V0WzRdID0gcVswXTtcbiAgb3V0WzVdID0gcVsxXTtcbiAgb3V0WzZdID0gcVsyXTtcbiAgb3V0WzddID0gcVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXRzIHRoZSB0cmFuc2xhdGlvbiBvZiBhIG5vcm1hbGl6ZWQgZHVhbCBxdWF0XHJcbiAqIEBwYXJhbSAge3ZlYzN9IG91dCB0cmFuc2xhdGlvblxyXG4gKiBAcGFyYW0gIHtxdWF0Mn0gYSBEdWFsIFF1YXRlcm5pb24gdG8gYmUgZGVjb21wb3NlZFxyXG4gKiBAcmV0dXJuIHt2ZWMzfSB0cmFuc2xhdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKG91dCwgYSkge1xuICB2YXIgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdO1xuICBvdXRbMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICBvdXRbMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyO1xuICBvdXRbMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zbGF0ZXMgYSBkdWFsIHF1YXQgYnkgdGhlIGdpdmVuIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHRyYW5zbGF0ZVxyXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIGF4MSA9IGFbMF0sXG4gICAgICBheTEgPSBhWzFdLFxuICAgICAgYXoxID0gYVsyXSxcbiAgICAgIGF3MSA9IGFbM10sXG4gICAgICBieDEgPSB2WzBdICogMC41LFxuICAgICAgYnkxID0gdlsxXSAqIDAuNSxcbiAgICAgIGJ6MSA9IHZbMl0gKiAwLjUsXG4gICAgICBheDIgPSBhWzRdLFxuICAgICAgYXkyID0gYVs1XSxcbiAgICAgIGF6MiA9IGFbNl0sXG4gICAgICBhdzIgPSBhWzddO1xuICBvdXRbMF0gPSBheDE7XG4gIG91dFsxXSA9IGF5MTtcbiAgb3V0WzJdID0gYXoxO1xuICBvdXRbM10gPSBhdzE7XG4gIG91dFs0XSA9IGF3MSAqIGJ4MSArIGF5MSAqIGJ6MSAtIGF6MSAqIGJ5MSArIGF4MjtcbiAgb3V0WzVdID0gYXcxICogYnkxICsgYXoxICogYngxIC0gYXgxICogYnoxICsgYXkyO1xuICBvdXRbNl0gPSBhdzEgKiBiejEgKyBheDEgKiBieTEgLSBheTEgKiBieDEgKyBhejI7XG4gIG91dFs3XSA9IC1heDEgKiBieDEgLSBheTEgKiBieTEgLSBhejEgKiBiejEgKyBhdzI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgdGhlIFggYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGhvdyBmYXIgc2hvdWxkIHRoZSByb3RhdGlvbiBiZVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XSxcbiAgICAgIGF4MSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnksXG4gICAgICBheTEgPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6LFxuICAgICAgYXoxID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCxcbiAgICAgIGF3MSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHF1YXQucm90YXRlWChvdXQsIGEsIHJhZCk7XG4gIGJ4ID0gb3V0WzBdO1xuICBieSA9IG91dFsxXTtcbiAgYnogPSBvdXRbMl07XG4gIGJ3ID0gb3V0WzNdO1xuICBvdXRbNF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzVdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFs2XSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbN10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCB0aGUgWSBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgaG93IGZhciBzaG91bGQgdGhlIHJvdGF0aW9uIGJlXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYXgxID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSxcbiAgICAgIGF5MSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnosXG4gICAgICBhejEgPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4LFxuICAgICAgYXcxID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcXVhdC5yb3RhdGVZKG91dCwgYSwgcmFkKTtcbiAgYnggPSBvdXRbMF07XG4gIGJ5ID0gb3V0WzFdO1xuICBieiA9IG91dFsyXTtcbiAgYncgPSBvdXRbM107XG4gIG91dFs0XSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbNV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzZdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFs3XSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIHRoZSBaIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcclxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBob3cgZmFyIHNob3VsZCB0aGUgcm90YXRpb24gYmVcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgcmFkKSB7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBheDEgPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5LFxuICAgICAgYXkxID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieixcbiAgICAgIGF6MSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngsXG4gICAgICBhdzEgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICBxdWF0LnJvdGF0ZVoob3V0LCBhLCByYWQpO1xuICBieCA9IG91dFswXTtcbiAgYnkgPSBvdXRbMV07XG4gIGJ6ID0gb3V0WzJdO1xuICBidyA9IG91dFszXTtcbiAgb3V0WzRdID0gYXgxICogYncgKyBhdzEgKiBieCArIGF5MSAqIGJ6IC0gYXoxICogYnk7XG4gIG91dFs1XSA9IGF5MSAqIGJ3ICsgYXcxICogYnkgKyBhejEgKiBieCAtIGF4MSAqIGJ6O1xuICBvdXRbNl0gPSBhejEgKiBidyArIGF3MSAqIGJ6ICsgYXgxICogYnkgLSBheTEgKiBieDtcbiAgb3V0WzddID0gYXcxICogYncgLSBheDEgKiBieCAtIGF5MSAqIGJ5IC0gYXoxICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBieSBhIGdpdmVuIHF1YXRlcm5pb24gKGEgKiBxKVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge3F1YXR9IHEgcXVhdGVybmlvbiB0byByb3RhdGUgYnlcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVCeVF1YXRBcHBlbmQob3V0LCBhLCBxKSB7XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM10sXG4gICAgICBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIG91dFswXSA9IGF4ICogcXcgKyBhdyAqIHF4ICsgYXkgKiBxeiAtIGF6ICogcXk7XG4gIG91dFsxXSA9IGF5ICogcXcgKyBhdyAqIHF5ICsgYXogKiBxeCAtIGF4ICogcXo7XG4gIG91dFsyXSA9IGF6ICogcXcgKyBhdyAqIHF6ICsgYXggKiBxeSAtIGF5ICogcXg7XG4gIG91dFszXSA9IGF3ICogcXcgLSBheCAqIHF4IC0gYXkgKiBxeSAtIGF6ICogcXo7XG4gIGF4ID0gYVs0XTtcbiAgYXkgPSBhWzVdO1xuICBheiA9IGFbNl07XG4gIGF3ID0gYVs3XTtcbiAgb3V0WzRdID0gYXggKiBxdyArIGF3ICogcXggKyBheSAqIHF6IC0gYXogKiBxeTtcbiAgb3V0WzVdID0gYXkgKiBxdyArIGF3ICogcXkgKyBheiAqIHF4IC0gYXggKiBxejtcbiAgb3V0WzZdID0gYXogKiBxdyArIGF3ICogcXogKyBheCAqIHF5IC0gYXkgKiBxeDtcbiAgb3V0WzddID0gYXcgKiBxdyAtIGF4ICogcXggLSBheSAqIHF5IC0gYXogKiBxejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGJ5IGEgZ2l2ZW4gcXVhdGVybmlvbiAocSAqIGEpXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IHEgcXVhdGVybmlvbiB0byByb3RhdGUgYnlcclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZUJ5UXVhdFByZXBlbmQob3V0LCBxLCBhKSB7XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM10sXG4gICAgICBieCA9IGFbMF0sXG4gICAgICBieSA9IGFbMV0sXG4gICAgICBieiA9IGFbMl0sXG4gICAgICBidyA9IGFbM107XG4gIG91dFswXSA9IHF4ICogYncgKyBxdyAqIGJ4ICsgcXkgKiBieiAtIHF6ICogYnk7XG4gIG91dFsxXSA9IHF5ICogYncgKyBxdyAqIGJ5ICsgcXogKiBieCAtIHF4ICogYno7XG4gIG91dFsyXSA9IHF6ICogYncgKyBxdyAqIGJ6ICsgcXggKiBieSAtIHF5ICogYng7XG4gIG91dFszXSA9IHF3ICogYncgLSBxeCAqIGJ4IC0gcXkgKiBieSAtIHF6ICogYno7XG4gIGJ4ID0gYVs0XTtcbiAgYnkgPSBhWzVdO1xuICBieiA9IGFbNl07XG4gIGJ3ID0gYVs3XTtcbiAgb3V0WzRdID0gcXggKiBidyArIHF3ICogYnggKyBxeSAqIGJ6IC0gcXogKiBieTtcbiAgb3V0WzVdID0gcXkgKiBidyArIHF3ICogYnkgKyBxeiAqIGJ4IC0gcXggKiBiejtcbiAgb3V0WzZdID0gcXogKiBidyArIHF3ICogYnogKyBxeCAqIGJ5IC0gcXkgKiBieDtcbiAgb3V0WzddID0gcXcgKiBidyAtIHF4ICogYnggLSBxeSAqIGJ5IC0gcXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCBhIGdpdmVuIGF4aXMuIERvZXMgdGhlIG5vcm1hbGlzYXRpb24gYXV0b21hdGljYWxseVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge3ZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIGhvdyBmYXIgdGhlIHJvdGF0aW9uIHNob3VsZCBiZVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZUFyb3VuZEF4aXMob3V0LCBhLCBheGlzLCByYWQpIHtcbiAgLy9TcGVjaWFsIGNhc2UgZm9yIHJhZCA9IDBcbiAgaWYgKE1hdGguYWJzKHJhZCkgPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIGNvcHkob3V0LCBhKTtcbiAgfVxuXG4gIHZhciBheGlzTGVuZ3RoID0gTWF0aC5oeXBvdChheGlzWzBdLCBheGlzWzFdLCBheGlzWzJdKTtcbiAgcmFkID0gcmFkICogMC41O1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBieCA9IHMgKiBheGlzWzBdIC8gYXhpc0xlbmd0aDtcbiAgdmFyIGJ5ID0gcyAqIGF4aXNbMV0gLyBheGlzTGVuZ3RoO1xuICB2YXIgYnogPSBzICogYXhpc1syXSAvIGF4aXNMZW5ndGg7XG4gIHZhciBidyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBheDEgPSBhWzBdLFxuICAgICAgYXkxID0gYVsxXSxcbiAgICAgIGF6MSA9IGFbMl0sXG4gICAgICBhdzEgPSBhWzNdO1xuICBvdXRbMF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzFdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFsyXSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbM10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgdmFyIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgb3V0WzRdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzVdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzZdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzddID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBkdWFsIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBkdWFsIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYXgwID0gYVswXSxcbiAgICAgIGF5MCA9IGFbMV0sXG4gICAgICBhejAgPSBhWzJdLFxuICAgICAgYXcwID0gYVszXSxcbiAgICAgIGJ4MSA9IGJbNF0sXG4gICAgICBieTEgPSBiWzVdLFxuICAgICAgYnoxID0gYls2XSxcbiAgICAgIGJ3MSA9IGJbN10sXG4gICAgICBheDEgPSBhWzRdLFxuICAgICAgYXkxID0gYVs1XSxcbiAgICAgIGF6MSA9IGFbNl0sXG4gICAgICBhdzEgPSBhWzddLFxuICAgICAgYngwID0gYlswXSxcbiAgICAgIGJ5MCA9IGJbMV0sXG4gICAgICBiejAgPSBiWzJdLFxuICAgICAgYncwID0gYlszXTtcbiAgb3V0WzBdID0gYXgwICogYncwICsgYXcwICogYngwICsgYXkwICogYnowIC0gYXowICogYnkwO1xuICBvdXRbMV0gPSBheTAgKiBidzAgKyBhdzAgKiBieTAgKyBhejAgKiBieDAgLSBheDAgKiBiejA7XG4gIG91dFsyXSA9IGF6MCAqIGJ3MCArIGF3MCAqIGJ6MCArIGF4MCAqIGJ5MCAtIGF5MCAqIGJ4MDtcbiAgb3V0WzNdID0gYXcwICogYncwIC0gYXgwICogYngwIC0gYXkwICogYnkwIC0gYXowICogYnowO1xuICBvdXRbNF0gPSBheDAgKiBidzEgKyBhdzAgKiBieDEgKyBheTAgKiBiejEgLSBhejAgKiBieTEgKyBheDEgKiBidzAgKyBhdzEgKiBieDAgKyBheTEgKiBiejAgLSBhejEgKiBieTA7XG4gIG91dFs1XSA9IGF5MCAqIGJ3MSArIGF3MCAqIGJ5MSArIGF6MCAqIGJ4MSAtIGF4MCAqIGJ6MSArIGF5MSAqIGJ3MCArIGF3MSAqIGJ5MCArIGF6MSAqIGJ4MCAtIGF4MSAqIGJ6MDtcbiAgb3V0WzZdID0gYXowICogYncxICsgYXcwICogYnoxICsgYXgwICogYnkxIC0gYXkwICogYngxICsgYXoxICogYncwICsgYXcxICogYnowICsgYXgxICogYnkwIC0gYXkxICogYngwO1xuICBvdXRbN10gPSBhdzAgKiBidzEgLSBheDAgKiBieDEgLSBheTAgKiBieTEgLSBhejAgKiBiejEgKyBhdzEgKiBidzAgLSBheDEgKiBieDAgLSBheTEgKiBieTAgLSBhejEgKiBiejA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Mi5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIFNjYWxlcyBhIGR1YWwgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0XHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgdGhlIGR1YWwgcXVhdCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIGR1YWwgcXVhdCBieVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBkdWFsIHF1YXQncyAoVGhlIGRvdCBwcm9kdWN0IG9mIHRoZSByZWFsIHBhcnRzKVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRvdCA9IHF1YXQuZG90O1xuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gZHVhbCBxdWF0cydzXHJcbiAqIE5PVEU6IFRoZSByZXN1bHRpbmcgZHVhbCBxdWF0ZXJuaW9ucyB3b24ndCBhbHdheXMgYmUgbm9ybWFsaXplZCAoVGhlIGVycm9yIGlzIG1vc3Qgbm90aWNlYWJsZSB3aGVuIHQgPSAwLjUpXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdFxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgbXQgPSAxIC0gdDtcbiAgaWYgKGRvdChhLCBiKSA8IDApIHQgPSAtdDtcbiAgb3V0WzBdID0gYVswXSAqIG10ICsgYlswXSAqIHQ7XG4gIG91dFsxXSA9IGFbMV0gKiBtdCArIGJbMV0gKiB0O1xuICBvdXRbMl0gPSBhWzJdICogbXQgKyBiWzJdICogdDtcbiAgb3V0WzNdID0gYVszXSAqIG10ICsgYlszXSAqIHQ7XG4gIG91dFs0XSA9IGFbNF0gKiBtdCArIGJbNF0gKiB0O1xuICBvdXRbNV0gPSBhWzVdICogbXQgKyBiWzVdICogdDtcbiAgb3V0WzZdID0gYVs2XSAqIG10ICsgYls2XSAqIHQ7XG4gIG91dFs3XSA9IGFbN10gKiBtdCArIGJbN10gKiB0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBkdWFsIHF1YXQuIElmIHRoZXkgYXJlIG5vcm1hbGl6ZWQsIGNvbmp1Z2F0ZSBpcyBjaGVhcGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIGR1YWwgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIHNxbGVuID0gc3F1YXJlZExlbmd0aChhKTtcbiAgb3V0WzBdID0gLWFbMF0gLyBzcWxlbjtcbiAgb3V0WzFdID0gLWFbMV0gLyBzcWxlbjtcbiAgb3V0WzJdID0gLWFbMl0gLyBzcWxlbjtcbiAgb3V0WzNdID0gYVszXSAvIHNxbGVuO1xuICBvdXRbNF0gPSAtYVs0XSAvIHNxbGVuO1xuICBvdXRbNV0gPSAtYVs1XSAvIHNxbGVuO1xuICBvdXRbNl0gPSAtYVs2XSAvIHNxbGVuO1xuICBvdXRbN10gPSBhWzddIC8gc3FsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgZHVhbCBxdWF0XHJcbiAqIElmIHRoZSBkdWFsIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCwgdGhpcyBmdW5jdGlvbiBpcyBmYXN0ZXIgdGhhbiBxdWF0Mi5pbnZlcnNlIGFuZCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25qdWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IC1hWzRdO1xuICBvdXRbNV0gPSAtYVs1XTtcbiAgb3V0WzZdID0gLWFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbmd0aCA9IHF1YXQubGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdDIubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXVhcmVkTGVuZ3RoID0gcXVhdC5zcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdDIuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogTm9ybWFsaXplIGEgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIGR1YWwgcXVhdGVybmlvbiB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgbWFnbml0dWRlID0gc3F1YXJlZExlbmd0aChhKTtcblxuICBpZiAobWFnbml0dWRlID4gMCkge1xuICAgIG1hZ25pdHVkZSA9IE1hdGguc3FydChtYWduaXR1ZGUpO1xuICAgIHZhciBhMCA9IGFbMF0gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGExID0gYVsxXSAvIG1hZ25pdHVkZTtcbiAgICB2YXIgYTIgPSBhWzJdIC8gbWFnbml0dWRlO1xuICAgIHZhciBhMyA9IGFbM10gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGIwID0gYVs0XTtcbiAgICB2YXIgYjEgPSBhWzVdO1xuICAgIHZhciBiMiA9IGFbNl07XG4gICAgdmFyIGIzID0gYVs3XTtcbiAgICB2YXIgYV9kb3RfYiA9IGEwICogYjAgKyBhMSAqIGIxICsgYTIgKiBiMiArIGEzICogYjM7XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gKGIwIC0gYTAgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgICBvdXRbNV0gPSAoYjEgLSBhMSAqIGFfZG90X2IpIC8gbWFnbml0dWRlO1xuICAgIG91dFs2XSA9IChiMiAtIGEyICogYV9kb3RfYikgLyBtYWduaXR1ZGU7XG4gICAgb3V0WzddID0gKGIzIC0gYTMgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGR1YWwgcXVhdGVuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgZHVhbCBxdWF0ZXJuaW9uIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1YWwgcXVhdFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAncXVhdDIoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnLCAnICsgYVs0XSArICcsICcgKyBhWzVdICsgJywgJyArIGFbNl0gKyAnLCAnICsgYVs3XSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkdWFsIHF1YXRlcm5pb25zIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZmlyc3QgZHVhbCBxdWF0ZXJuaW9uLlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBiIHRoZSBzZWNvbmQgZHVhbCBxdWF0ZXJuaW9uLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN107XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgdGhlIGZpcnN0IGR1YWwgcXVhdC5cclxuICogQHBhcmFtIHtxdWF0Mn0gYiB0aGUgc2Vjb25kIGR1YWwgcXVhdC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGR1YWwgcXVhdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSk7XG59IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogMiBEaW1lbnNpb25hbCBWZWN0b3JcclxuICogQG1vZHVsZSB2ZWMyXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjMlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHkpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjZWlsXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGZsb29yXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byByb3VuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIGEgdmVjMiBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjMidzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufVxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcclxuICogTm90ZSB0aGF0IHRoZSBjcm9zcyBwcm9kdWN0IG11c3QgYnkgZGVmaW5pdGlvbiBwcm9kdWNlIGEgM0QgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIHogPSBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdO1xuICBvdXRbMF0gPSBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV07XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlO1xuICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7bWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDIob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge21hdDJkfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MmQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0M1xyXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHttYXQzfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVszXSAqIHkgKyBtWzZdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XHJcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzAnXHJcbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgMkQgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IFRoZSByZWNlaXZpbmcgdmVjMlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgVGhlIHZlYzIgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIGIsIGMpIHtcbiAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICB2YXIgcDAgPSBhWzBdIC0gYlswXSxcbiAgICAgIHAxID0gYVsxXSAtIGJbMV0sXG4gICAgICBzaW5DID0gTWF0aC5zaW4oYyksXG4gICAgICBjb3NDID0gTWF0aC5jb3MoYyk7IC8vcGVyZm9ybSByb3RhdGlvbiBhbmQgdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSBwMCAqIGNvc0MgLSBwMSAqIHNpbkMgKyBiWzBdO1xuICBvdXRbMV0gPSBwMCAqIHNpbkMgKyBwMSAqIGNvc0MgKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0d28gMkQgdmVjdG9yc1xyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgVGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMyfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFuZ2xlKGEsIGIpIHtcbiAgdmFyIHgxID0gYVswXSxcbiAgICAgIHkxID0gYVsxXSxcbiAgICAgIHgyID0gYlswXSxcbiAgICAgIHkyID0gYlsxXTtcbiAgdmFyIGxlbjEgPSB4MSAqIHgxICsgeTEgKiB5MTtcblxuICBpZiAobGVuMSA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbjEgPSAxIC8gTWF0aC5zcXJ0KGxlbjEpO1xuICB9XG5cbiAgdmFyIGxlbjIgPSB4MiAqIHgyICsgeTIgKiB5MjtcblxuICBpZiAobGVuMiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbjIgPSAxIC8gTWF0aC5zcXJ0KGxlbjIpO1xuICB9XG5cbiAgdmFyIGNvc2luZSA9ICh4MSAqIHgyICsgeTEgKiB5MikgKiBsZW4xICogbGVuMjtcblxuICBpZiAoY29zaW5lID4gMS4wKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAoY29zaW5lIDwgLTEuMCkge1xuICAgIHJldHVybiBNYXRoLlBJO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgfVxufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gemVyb1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAndmVjMignICsgYVswXSArICcsICcgKyBhWzFdICsgJyknO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgZXhhY3RseSBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHt2ZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpdmlkZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMycy5cclxuICpcclxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMyLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcclxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzJzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxyXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAyO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgQ2lyY2xlQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2NpcmNsZV9idWNrZXQnO1xuaW1wb3J0IHsgcG9seWdvbkludGVyc2VjdHNCdWZmZXJlZFBvaW50IH0gZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMnO1xuaW1wb3J0IHsgZ2V0TWF4aW11bVBhaW50VmFsdWUsIHRyYW5zbGF0ZURpc3RhbmNlLCB0cmFuc2xhdGUgfSBmcm9tICcuLi9xdWVyeV91dGlscyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2NpcmNsZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBMYXlvdXQsIFBvc3NpYmx5RXZhbHVhdGVkIH0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5pbXBvcnQgeyB2ZWM0IH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlU3RhdGUgfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0J1Y2tldCwgQnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUge0xheW91dFByb3BzLCBQYWludFByb3BzfSBmcm9tICcuL2NpcmNsZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBDaXJjbGVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8TGF5b3V0UHJvcHM+O1xuICAgIGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+O1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoYnVja2V0OiBCdWNrZXQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjaXJjbGVCdWNrZXQ6IENpcmNsZUJ1Y2tldDxDaXJjbGVTdHlsZUxheWVyPiA9IChidWNrZXQ6IGFueSk7XG4gICAgICAgIHJldHVybiBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnY2lyY2xlLXJhZGl1cycsIHRoaXMsIGNpcmNsZUJ1Y2tldCkgK1xuICAgICAgICAgICAgZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2NpcmNsZS1zdHJva2Utd2lkdGgnLCB0aGlzLCBjaXJjbGVCdWNrZXQpICtcbiAgICAgICAgICAgIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUG9seWdvbiA9IHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgdHJhbnNmb3JtLmFuZ2xlLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcmFkaXVzJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgY29uc3Qgc3Ryb2tlID0gdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1zdHJva2Utd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgICAgICBjb25zdCBzaXplICA9IHJhZGl1cyArIHN0cm9rZTtcblxuICAgICAgICAvLyBGb3IgcGl0Y2gtYWxpZ25tZW50OiBtYXAsIGNvbXBhcmUgZmVhdHVyZSBnZW9tZXRyeSB0byBxdWVyeSBnZW9tZXRyeSBpbiB0aGUgcGxhbmUgb2YgdGhlIHRpbGVcbiAgICAgICAgLy8gLy8gT3RoZXJ3aXNlLCBjb21wYXJlIGdlb21ldHJ5IGluIHRoZSBwbGFuZSBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgLy8gLy8gQSBjaXJjbGUgd2l0aCBmaXhlZCBzY2FsaW5nIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydCBnZXRzIGxhcmdlciBpbiB0aWxlIHNwYWNlIGFzIGl0IG1vdmVzIGludG8gdGhlIGRpc3RhbmNlXG4gICAgICAgIC8vIC8vIEEgY2lyY2xlIHdpdGggZml4ZWQgc2NhbGluZyByZWxhdGl2ZSB0byB0aGUgbWFwIGdldHMgc21hbGxlciBpbiB2aWV3cG9ydCBzcGFjZSBhcyBpdCBtb3ZlcyBpbnRvIHRoZSBkaXN0YW5jZVxuICAgICAgICBjb25zdCBhbGlnbldpdGhNYXAgPSB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRQb2x5Z29uID0gYWxpZ25XaXRoTWFwID8gdHJhbnNsYXRlZFBvbHlnb24gOiBwcm9qZWN0UXVlcnlHZW9tZXRyeSh0cmFuc2xhdGVkUG9seWdvbiwgcGl4ZWxQb3NNYXRyaXgpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFNpemUgPSBhbGlnbldpdGhNYXAgPyBzaXplICogcGl4ZWxzVG9UaWxlVW5pdHMgOiBzaXplO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBnZW9tZXRyeSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiByaW5nKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFBvaW50ID0gYWxpZ25XaXRoTWFwID8gcG9pbnQgOiBwcm9qZWN0UG9pbnQocG9pbnQsIHBpeGVsUG9zTWF0cml4KTtcblxuICAgICAgICAgICAgICAgIGxldCBhZGp1c3RlZFNpemUgPSB0cmFuc2Zvcm1lZFNpemU7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkQ2VudGVyID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbcG9pbnQueCwgcG9pbnQueSwgMCwgMV0sIHBpeGVsUG9zTWF0cml4KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1zY2FsZScpID09PSAndmlld3BvcnQnICYmIHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkanVzdGVkU2l6ZSAqPSBwcm9qZWN0ZWRDZW50ZXJbM10gLyB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtc2NhbGUnKSA9PT0gJ21hcCcgJiYgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFNpemUgKj0gdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBwcm9qZWN0ZWRDZW50ZXJbM107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludCh0cmFuc2Zvcm1lZFBvbHlnb24sIHRyYW5zZm9ybWVkUG9pbnQsIGFkanVzdGVkU2l6ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHA6IFBvaW50LCBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3QgcG9pbnQgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwLngsIHAueSwgMCwgMV0sIHBpeGVsUG9zTWF0cml4KTtcbiAgICByZXR1cm4gbmV3IFBvaW50KHBvaW50WzBdIC8gcG9pbnRbM10sIHBvaW50WzFdIC8gcG9pbnRbM10pO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0UXVlcnlHZW9tZXRyeShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXkpIHtcbiAgICByZXR1cm4gcXVlcnlHZW9tZXRyeS5tYXAoKHApID0+IHtcbiAgICAgICAgcmV0dXJuIHByb2plY3RQb2ludChwLCBwaXhlbFBvc01hdHJpeCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENpcmNsZVN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ2lyY2xlQnVja2V0IGZyb20gJy4vY2lyY2xlX2J1Y2tldCc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuaW1wb3J0IHR5cGUgSGVhdG1hcFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllcic7XG5cbmNsYXNzIEhlYXRtYXBCdWNrZXQgZXh0ZW5kcyBDaXJjbGVCdWNrZXQ8SGVhdG1hcFN0eWxlTGF5ZXI+IHtcbiAgICAvLyBOZWVkZWQgZm9yIGZsb3cgdG8gYWNjZXB0IG9taXQ6IFsnbGF5ZXJzJ10gYmVsb3csIGR1ZSB0b1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy80MjYyXG4gICAgbGF5ZXJzOiBBcnJheTxIZWF0bWFwU3R5bGVMYXllcj47XG59XG5cbnJlZ2lzdGVyKCdIZWF0bWFwQnVja2V0JywgSGVhdG1hcEJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgSGVhdG1hcEJ1Y2tldDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuXG5leHBvcnQgdHlwZSBTaXplID0ge1xuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXJcbn07XG5cbnR5cGUgUG9pbnQgPSB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlclxufTtcblxuZnVuY3Rpb24gY3JlYXRlSW1hZ2UoaW1hZ2U6ICosIHt3aWR0aCwgaGVpZ2h0fTogU2l6ZSwgY2hhbm5lbHM6IG51bWJlciwgZGF0YT86IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQgKiBjaGFubmVscyk7XG4gICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoICE9PSB3aWR0aCAqIGhlaWdodCAqIGNoYW5uZWxzKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdtaXNtYXRjaGVkIGltYWdlIHNpemUnKTtcbiAgICB9XG4gICAgaW1hZ2Uud2lkdGggPSB3aWR0aDtcbiAgICBpbWFnZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgaW1hZ2UuZGF0YSA9IGRhdGE7XG4gICAgcmV0dXJuIGltYWdlO1xufVxuXG5mdW5jdGlvbiByZXNpemVJbWFnZShpbWFnZTogKiwge3dpZHRoLCBoZWlnaHR9OiBTaXplLCBjaGFubmVsczogbnVtYmVyKSB7XG4gICAgaWYgKHdpZHRoID09PSBpbWFnZS53aWR0aCAmJiBoZWlnaHQgPT09IGltYWdlLmhlaWdodCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3SW1hZ2UgPSBjcmVhdGVJbWFnZSh7fSwge3dpZHRoLCBoZWlnaHR9LCBjaGFubmVscyk7XG5cbiAgICBjb3B5SW1hZ2UoaW1hZ2UsIG5ld0ltYWdlLCB7eDogMCwgeTogMH0sIHt4OiAwLCB5OiAwfSwge1xuICAgICAgICB3aWR0aDogTWF0aC5taW4oaW1hZ2Uud2lkdGgsIHdpZHRoKSxcbiAgICAgICAgaGVpZ2h0OiBNYXRoLm1pbihpbWFnZS5oZWlnaHQsIGhlaWdodClcbiAgICB9LCBjaGFubmVscyk7XG5cbiAgICBpbWFnZS53aWR0aCA9IHdpZHRoO1xuICAgIGltYWdlLmhlaWdodCA9IGhlaWdodDtcbiAgICBpbWFnZS5kYXRhID0gbmV3SW1hZ2UuZGF0YTtcbn1cblxuZnVuY3Rpb24gY29weUltYWdlKHNyY0ltZzogKiwgZHN0SW1nOiAqLCBzcmNQdDogUG9pbnQsIGRzdFB0OiBQb2ludCwgc2l6ZTogU2l6ZSwgY2hhbm5lbHM6IG51bWJlcikge1xuICAgIGlmIChzaXplLndpZHRoID09PSAwIHx8IHNpemUuaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBkc3RJbWc7XG4gICAgfVxuXG4gICAgaWYgKHNpemUud2lkdGggPiBzcmNJbWcud2lkdGggfHxcbiAgICAgICAgc2l6ZS5oZWlnaHQgPiBzcmNJbWcuaGVpZ2h0IHx8XG4gICAgICAgIHNyY1B0LnggPiBzcmNJbWcud2lkdGggLSBzaXplLndpZHRoIHx8XG4gICAgICAgIHNyY1B0LnkgPiBzcmNJbWcuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBzb3VyY2UgY29vcmRpbmF0ZXMgZm9yIGltYWdlIGNvcHknKTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZS53aWR0aCA+IGRzdEltZy53aWR0aCB8fFxuICAgICAgICBzaXplLmhlaWdodCA+IGRzdEltZy5oZWlnaHQgfHxcbiAgICAgICAgZHN0UHQueCA+IGRzdEltZy53aWR0aCAtIHNpemUud2lkdGggfHxcbiAgICAgICAgZHN0UHQueSA+IGRzdEltZy5oZWlnaHQgLSBzaXplLmhlaWdodCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzIGZvciBpbWFnZSBjb3B5Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3JjRGF0YSA9IHNyY0ltZy5kYXRhO1xuICAgIGNvbnN0IGRzdERhdGEgPSBkc3RJbWcuZGF0YTtcblxuICAgIGFzc2VydChzcmNEYXRhICE9PSBkc3REYXRhKTtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKykge1xuICAgICAgICBjb25zdCBzcmNPZmZzZXQgPSAoKHNyY1B0LnkgKyB5KSAqIHNyY0ltZy53aWR0aCArIHNyY1B0LngpICogY2hhbm5lbHM7XG4gICAgICAgIGNvbnN0IGRzdE9mZnNldCA9ICgoZHN0UHQueSArIHkpICogZHN0SW1nLndpZHRoICsgZHN0UHQueCkgKiBjaGFubmVscztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplLndpZHRoICogY2hhbm5lbHM7IGkrKykge1xuICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQgKyBpXSA9IHNyY0RhdGFbc3JjT2Zmc2V0ICsgaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZHN0SW1nO1xufVxuXG5leHBvcnQgY2xhc3MgQWxwaGFJbWFnZSB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBkYXRhOiBVaW50OEFycmF5O1xuXG4gICAgY29uc3RydWN0b3Ioc2l6ZTogU2l6ZSwgZGF0YT86IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSkge1xuICAgICAgICBjcmVhdGVJbWFnZSh0aGlzLCBzaXplLCAxLCBkYXRhKTtcbiAgICB9XG5cbiAgICByZXNpemUoc2l6ZTogU2l6ZSkge1xuICAgICAgICByZXNpemVJbWFnZSh0aGlzLCBzaXplLCAxKTtcbiAgICB9XG5cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHBoYUltYWdlKHt3aWR0aDogdGhpcy53aWR0aCwgaGVpZ2h0OiB0aGlzLmhlaWdodH0sIG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb3B5KHNyY0ltZzogQWxwaGFJbWFnZSwgZHN0SW1nOiBBbHBoYUltYWdlLCBzcmNQdDogUG9pbnQsIGRzdFB0OiBQb2ludCwgc2l6ZTogU2l6ZSkge1xuICAgICAgICBjb3B5SW1hZ2Uoc3JjSW1nLCBkc3RJbWcsIHNyY1B0LCBkc3RQdCwgc2l6ZSwgMSk7XG4gICAgfVxufVxuXG4vLyBOb3QgcHJlbXVsdGlwbGllZCwgYmVjYXVzZSBJbWFnZURhdGEgaXMgbm90IHByZW11bHRpcGxpZWQuXG4vLyBVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wgbXVzdCBiZSB1c2VkIHdoZW4gdXBsb2FkaW5nIHRvIGEgdGV4dHVyZS5cbmV4cG9ydCBjbGFzcyBSR0JBSW1hZ2Uge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvLyBkYXRhIG11c3QgYmUgYSBVaW50OEFycmF5IGluc3RlYWQgb2YgVWludDhDbGFtcGVkQXJyYXkgYmVjYXVzZSB0ZXhJbWFnZTJEIGRvZXMgbm90XG4gICAgLy8gc3VwcG9ydCBVaW50OENsYW1wZWRBcnJheSBpbiBhbGwgYnJvd3NlcnNcbiAgICBkYXRhOiBVaW50OEFycmF5O1xuXG4gICAgY29uc3RydWN0b3Ioc2l6ZTogU2l6ZSwgZGF0YT86IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSkge1xuICAgICAgICBjcmVhdGVJbWFnZSh0aGlzLCBzaXplLCA0LCBkYXRhKTtcbiAgICB9XG5cbiAgICByZXNpemUoc2l6ZTogU2l6ZSkge1xuICAgICAgICByZXNpemVJbWFnZSh0aGlzLCBzaXplLCA0KTtcbiAgICB9XG5cbiAgICByZXBsYWNlKGRhdGE6IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSwgY29weT86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXQoZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUkdCQUltYWdlKHt3aWR0aDogdGhpcy53aWR0aCwgaGVpZ2h0OiB0aGlzLmhlaWdodH0sIG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb3B5KHNyY0ltZzogUkdCQUltYWdlIHwgSW1hZ2VEYXRhLCBkc3RJbWc6IFJHQkFJbWFnZSwgc3JjUHQ6IFBvaW50LCBkc3RQdDogUG9pbnQsIHNpemU6IFNpemUpIHtcbiAgICAgICAgY29weUltYWdlKHNyY0ltZywgZHN0SW1nLCBzcmNQdCwgZHN0UHQsIHNpemUsIDQpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0FscGhhSW1hZ2UnLCBBbHBoYUltYWdlKTtcbnJlZ2lzdGVyKCdSR0JBSW1hZ2UnLCBSR0JBSW1hZ2UpO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJoZWF0bWFwLXJhZGl1c1wiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImhlYXRtYXAtd2VpZ2h0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaGVhdG1hcC1pbnRlbnNpdHlcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImhlYXRtYXAtY29sb3JcIjogQ29sb3JSYW1wUHJvcGVydHksXG4gICAgXCJoZWF0bWFwLW9wYWNpdHlcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImhlYXRtYXAtcmFkaXVzXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtcmFkaXVzXCJdKSxcbiAgICBcImhlYXRtYXAtd2VpZ2h0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtd2VpZ2h0XCJdKSxcbiAgICBcImhlYXRtYXAtaW50ZW5zaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oZWF0bWFwXCJdW1wiaGVhdG1hcC1pbnRlbnNpdHlcIl0pLFxuICAgIFwiaGVhdG1hcC1jb2xvclwiOiBuZXcgQ29sb3JSYW1wUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtY29sb3JcIl0pLFxuICAgIFwiaGVhdG1hcC1vcGFjaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oZWF0bWFwXCJdW1wiaGVhdG1hcC1vcGFjaXR5XCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBSR0JBSW1hZ2UgfSBmcm9tICcuL2ltYWdlJztcblxuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXgnO1xuXG4vKipcbiAqIEdpdmVuIGFuIGV4cHJlc3Npb24gdGhhdCBzaG91bGQgZXZhbHVhdGUgdG8gYSBjb2xvciByYW1wLCByZXR1cm5cbiAqIGEgMjU2eDEgcHggUkdCQSBpbWFnZSByZXByZXNlbnRpbmcgdGhhdCByYW1wIGV4cHJlc3Npb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVuZGVyQ29sb3JSYW1wKGV4cHJlc3Npb246IFN0eWxlUHJvcGVydHlFeHByZXNzaW9uLCBjb2xvclJhbXBFdmFsdWF0aW9uUGFyYW1ldGVyOiBzdHJpbmcpOiBSR0JBSW1hZ2Uge1xuICAgIGNvbnN0IGNvbG9yUmFtcERhdGEgPSBuZXcgVWludDhBcnJheSgyNTYgKiA0KTtcbiAgICBjb25zdCBldmFsdWF0aW9uR2xvYmFscyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IDI1NjsgaSsrLCBqICs9IDQpIHtcbiAgICAgICAgZXZhbHVhdGlvbkdsb2JhbHNbY29sb3JSYW1wRXZhbHVhdGlvblBhcmFtZXRlcl0gPSBpIC8gMjU1O1xuICAgICAgICBjb25zdCBweENvbG9yID0gZXhwcmVzc2lvbi5ldmFsdWF0ZSgoZXZhbHVhdGlvbkdsb2JhbHM6IGFueSkpO1xuICAgICAgICAvLyB0aGUgY29sb3JzIGFyZSBiZWluZyB1bnByZW11bHRpcGxpZWQgYmVjYXVzZSBDb2xvciB1c2VzXG4gICAgICAgIC8vIHByZW11bHRpcGxpZWQgdmFsdWVzLCBhbmQgdGhlIFRleHR1cmUgY2xhc3MgZXhwZWN0cyB1bnByZW11bHRpcGxpZWQgb25lc1xuICAgICAgICBjb2xvclJhbXBEYXRhW2ogKyAwXSA9IE1hdGguZmxvb3IocHhDb2xvci5yICogMjU1IC8gcHhDb2xvci5hKTtcbiAgICAgICAgY29sb3JSYW1wRGF0YVtqICsgMV0gPSBNYXRoLmZsb29yKHB4Q29sb3IuZyAqIDI1NSAvIHB4Q29sb3IuYSk7XG4gICAgICAgIGNvbG9yUmFtcERhdGFbaiArIDJdID0gTWF0aC5mbG9vcihweENvbG9yLmIgKiAyNTUgLyBweENvbG9yLmEpO1xuICAgICAgICBjb2xvclJhbXBEYXRhW2ogKyAzXSA9IE1hdGguZmxvb3IocHhDb2xvci5hICogMjU1KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IDI1NiwgaGVpZ2h0OiAxfSwgY29sb3JSYW1wRGF0YSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5cbmltcG9ydCBIZWF0bWFwQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2hlYXRtYXBfYnVja2V0JztcbmltcG9ydCB7IFJHQkFJbWFnZSB9IGZyb20gJy4uLy4uL3V0aWwvaW1hZ2UnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHJlbmRlckNvbG9yUmFtcCBmcm9tICcuLi8uLi91dGlsL2NvbG9yX3JhbXAnO1xuaW1wb3J0IHsgVHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkIH0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIFRleHR1cmUgZnJvbSAnLi4vLi4vcmVuZGVyL3RleHR1cmUnO1xuaW1wb3J0IHR5cGUgRnJhbWVidWZmZXIgZnJvbSAnLi4vLi4vZ2wvZnJhbWVidWZmZXInO1xuaW1wb3J0IHR5cGUge1BhaW50UHJvcHN9IGZyb20gJy4vaGVhdG1hcF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBIZWF0bWFwU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuXG4gICAgaGVhdG1hcEZibzogP0ZyYW1lYnVmZmVyO1xuICAgIGNvbG9yUmFtcDogUkdCQUltYWdlO1xuICAgIGNvbG9yUmFtcFRleHR1cmU6ID9UZXh0dXJlO1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY3JlYXRlQnVja2V0KG9wdGlvbnM6IGFueSkge1xuICAgICAgICByZXR1cm4gbmV3IEhlYXRtYXBCdWNrZXQob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIGNvbG9yIHJhbXAgdGV4dHVyZSBpcyBnZW5lcmF0ZWQgZm9yIGRlZmF1bHQgaGVhdG1hcCBjb2xvciB0b29cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2hlYXRtYXAtY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb2xvclJhbXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVDb2xvclJhbXAoKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2hlYXRtYXAtY29sb3InXS52YWx1ZS5leHByZXNzaW9uO1xuICAgICAgICB0aGlzLmNvbG9yUmFtcCA9IHJlbmRlckNvbG9yUmFtcChleHByZXNzaW9uLCAnaGVhdG1hcERlbnNpdHknKTtcbiAgICAgICAgdGhpcy5jb2xvclJhbXBUZXh0dXJlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhlYXRtYXBGYm8pIHtcbiAgICAgICAgICAgIHRoaXMuaGVhdG1hcEZiby5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmhlYXRtYXBGYm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZSgpOiBib29sZWFuICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWludC5nZXQoJ2hlYXRtYXAtb3BhY2l0eScpICE9PSAwICYmIHRoaXMudmlzaWJpbGl0eSAhPT0gJ25vbmUnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGVhdG1hcFN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiXSksXG4gICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIl0pLFxuICAgIFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiXSksXG4gICAgXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCJdKSxcbiAgICBcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIl0pLFxuICAgIFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2hpbGxzaGFkZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZCB9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9oaWxsc2hhZGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgSGlsbHNoYWRlU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGhhc09mZnNjcmVlblBhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhaW50LmdldCgnaGlsbHNoYWRlLWV4YWdnZXJhdGlvbicpICE9PSAwICYmIHRoaXMudmlzaWJpbGl0eSAhPT0gJ25vbmUnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGlsbHNoYWRlU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheSc7XG5cbmNvbnN0IGxheW91dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG5dLCA0KTtcblxuZXhwb3J0IGRlZmF1bHQgbGF5b3V0O1xuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gbGF5b3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBlYXJjdXQ7XG5cbmZ1bmN0aW9uIGVhcmN1dChkYXRhLCBob2xlSW5kaWNlcywgZGltKSB7XG5cbiAgICBkaW0gPSBkaW0gfHwgMjtcblxuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGgsXG4gICAgICAgIG91dGVyTm9kZSA9IGxpbmtlZExpc3QoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSksXG4gICAgICAgIHRyaWFuZ2xlcyA9IFtdO1xuXG4gICAgaWYgKCFvdXRlck5vZGUgfHwgb3V0ZXJOb2RlLm5leHQgPT09IG91dGVyTm9kZS5wcmV2KSByZXR1cm4gdHJpYW5nbGVzO1xuXG4gICAgdmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cbiAgICBpZiAoaGFzSG9sZXMpIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSk7XG5cbiAgICAvLyBpZiB0aGUgc2hhcGUgaXMgbm90IHRvbyBzaW1wbGUsIHdlJ2xsIHVzZSB6LW9yZGVyIGN1cnZlIGhhc2ggbGF0ZXI7IGNhbGN1bGF0ZSBwb2x5Z29uIGJib3hcbiAgICBpZiAoZGF0YS5sZW5ndGggPiA4MCAqIGRpbSkge1xuICAgICAgICBtaW5YID0gbWF4WCA9IGRhdGFbMF07XG4gICAgICAgIG1pblkgPSBtYXhZID0gZGF0YVsxXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltKSB7XG4gICAgICAgICAgICB4ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHkgPSBkYXRhW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuICAgICAgICBpbnZTaXplID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcbiAgICAgICAgaW52U2l6ZSA9IGludlNpemUgIT09IDAgPyAxIC8gaW52U2l6ZSA6IDA7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSBicmVhaztcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgaW52U2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIGludlNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChpbnZTaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0ZXggbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXG4gICAgICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7XG4gICAgICAgICAgICBzdG9wID0gbmV4dC5uZXh0O1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhciA9IG5leHQ7XG5cbiAgICAgICAgLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcbiAgICAgICAgaWYgKGVhciA9PT0gc3RvcCkge1xuICAgICAgICAgICAgLy8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cbiAgICAgICAgICAgIGlmICghcGFzcykge1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0pO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAyKTtcblxuICAgICAgICAgICAgLy8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d29cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMikge1xuICAgICAgICAgICAgICAgIHNwbGl0RWFyY3V0KGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXG5mdW5jdGlvbiBpc0VhcihlYXIpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuICAgIHZhciBwID0gZWFyLm5leHQubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBlYXIucHJldikge1xuICAgICAgICBpZiAocG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyB0cmlhbmdsZSBiYm94OyBtaW4gJiBtYXggYXJlIGNhbGN1bGF0ZWQgbGlrZSB0aGlzIGZvciBzcGVlZFxuICAgIHZhciBtaW5UWCA9IGEueCA8IGIueCA/IChhLnggPCBjLnggPyBhLnggOiBjLngpIDogKGIueCA8IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1pblRZID0gYS55IDwgYi55ID8gKGEueSA8IGMueSA/IGEueSA6IGMueSkgOiAoYi55IDwgYy55ID8gYi55IDogYy55KSxcbiAgICAgICAgbWF4VFggPSBhLnggPiBiLnggPyAoYS54ID4gYy54ID8gYS54IDogYy54KSA6IChiLnggPiBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtYXhUWSA9IGEueSA+IGIueSA/IChhLnkgPiBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA+IGMueSA/IGIueSA6IGMueSk7XG5cbiAgICAvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuICAgIHZhciBtaW5aID0gek9yZGVyKG1pblRYLCBtaW5UWSwgbWluWCwgbWluWSwgaW52U2l6ZSksXG4gICAgICAgIG1heFogPSB6T3JkZXIobWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBwID0gZWFyLnByZXZaLFxuICAgICAgICBuID0gZWFyLm5leHRaO1xuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gYm90aCBkaXJlY3Rpb25zXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblogJiYgbiAmJiBuLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAucHJldlo7XG5cbiAgICAgICAgaWYgKG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkpICYmXG4gICAgICAgICAgICBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIG4gPSBuLm5leHRaO1xuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgd2hpbGUgKG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkpICYmXG4gICAgICAgICAgICBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIG4gPSBuLm5leHRaO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBnbyB0aHJvdWdoIGFsbCBwb2x5Z29uIG5vZGVzIGFuZCBjdXJlIHNtYWxsIGxvY2FsIHNlbGYtaW50ZXJzZWN0aW9uc1xuZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzLCBkaW0pIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGEgPSBwLnByZXYsXG4gICAgICAgICAgICBiID0gcC5uZXh0Lm5leHQ7XG5cbiAgICAgICAgaWYgKCFlcXVhbHMoYSwgYikgJiYgaW50ZXJzZWN0cyhhLCBwLCBwLm5leHQsIGIpICYmIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSkge1xuXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChhLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocC5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGIuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHAubmV4dCk7XG5cbiAgICAgICAgICAgIHAgPSBzdGFydCA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gZmlsdGVyUG9pbnRzKHApO1xufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuZnVuY3Rpb24gc3BsaXRFYXJjdXQoc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgLy8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cbiAgICB2YXIgYSA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGIgPSBhLm5leHQubmV4dDtcbiAgICAgICAgd2hpbGUgKGIgIT09IGEucHJldikge1xuICAgICAgICAgICAgaWYgKGEuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbChhLCBiKSkge1xuICAgICAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHNwbGl0UG9seWdvbihhLCBiKTtcblxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBjb2xpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgICAgICAgICAgICAgYSA9IGZpbHRlclBvaW50cyhhLCBhLm5leHQpO1xuICAgICAgICAgICAgICAgIGMgPSBmaWx0ZXJQb2ludHMoYywgYy5uZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIgPSBiLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEubmV4dDtcbiAgICB9IHdoaWxlIChhICE9PSBzdGFydCk7XG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSkge1xuICAgIHZhciBxdWV1ZSA9IFtdLFxuICAgICAgICBpLCBsZW4sIHN0YXJ0LCBlbmQsIGxpc3Q7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICBsaXN0ID0gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlKTtcbiAgICAgICAgaWYgKGxpc3QgPT09IGxpc3QubmV4dCkgbGlzdC5zdGVpbmVyID0gdHJ1ZTtcbiAgICAgICAgcXVldWUucHVzaChnZXRMZWZ0bW9zdChsaXN0KSk7XG4gICAgfVxuXG4gICAgcXVldWUuc29ydChjb21wYXJlWCk7XG5cbiAgICAvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbGltaW5hdGVIb2xlKHF1ZXVlW2ldLCBvdXRlck5vZGUpO1xuICAgICAgICBvdXRlck5vZGUgPSBmaWx0ZXJQb2ludHMob3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dGVyTm9kZTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoYSwgYikge1xuICAgIHJldHVybiBhLnggLSBiLng7XG59XG5cbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICBvdXRlck5vZGUgPSBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpO1xuICAgIGlmIChvdXRlck5vZGUpIHtcbiAgICAgICAgdmFyIGIgPSBzcGxpdFBvbHlnb24ob3V0ZXJOb2RlLCBob2xlKTtcbiAgICAgICAgZmlsdGVyUG9pbnRzKGIsIGIubmV4dCk7XG4gICAgfVxufVxuXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXG5mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICB2YXIgcCA9IG91dGVyTm9kZSxcbiAgICAgICAgaHggPSBob2xlLngsXG4gICAgICAgIGh5ID0gaG9sZS55LFxuICAgICAgICBxeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbTtcblxuICAgIC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcbiAgICAvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XG4gICAgZG8ge1xuICAgICAgICBpZiAoaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55ICYmIHAubmV4dC55ICE9PSBwLnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtOyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsZWZ0bW9zdCBlbmRwb2ludFxuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIHBvaW50IG9mIHRoZSBtaW5pbXVtIGFuZ2xlIHdpdGggdGhlIHJheSBhcyBjb25uZWN0aW9uIHBvaW50XG5cbiAgICB2YXIgc3RvcCA9IG0sXG4gICAgICAgIG14ID0gbS54LFxuICAgICAgICBteSA9IG0ueSxcbiAgICAgICAgdGFuTWluID0gSW5maW5pdHksXG4gICAgICAgIHRhbjtcblxuICAgIHAgPSBtO1xuXG4gICAgZG8ge1xuICAgICAgICBpZiAoaHggPj0gcC54ICYmIHAueCA+PSBteCAmJiBoeCAhPT0gcC54ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmIChsb2NhbGx5SW5zaWRlKHAsIGhvbGUpICYmXG4gICAgICAgICAgICAgICAgKHRhbiA8IHRhbk1pbiB8fCAodGFuID09PSB0YW5NaW4gJiYgKHAueCA+IG0ueCB8fCAocC54ID09PSBtLnggJiYgc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkpKSkpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdG9wKTtcblxuICAgIHJldHVybiBtO1xufVxuXG4vLyB3aGV0aGVyIHNlY3RvciBpbiB2ZXJ0ZXggbSBjb250YWlucyBzZWN0b3IgaW4gdmVydGV4IHAgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXNcbmZ1bmN0aW9uIHNlY3RvckNvbnRhaW5zU2VjdG9yKG0sIHApIHtcbiAgICByZXR1cm4gYXJlYShtLnByZXYsIG0sIHAucHJldikgPCAwICYmIGFyZWEocC5uZXh0LCBtLCBtLm5leHQpIDwgMDtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxU2l6ZSA9IGluU2l6ZTtcblxuICAgICAgICAgICAgd2hpbGUgKHBTaXplID4gMCB8fCAocVNpemUgPiAwICYmIHEpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocFNpemUgIT09IDAgJiYgKHFTaXplID09PSAwIHx8ICFxIHx8IHAueiA8PSBxLnopKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3hcbmZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgLy8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuICAgIHggPSAzMjc2NyAqICh4IC0gbWluWCkgKiBpbnZTaXplO1xuICAgIHkgPSAzMjc2NyAqICh5IC0gbWluWSkgKiBpbnZTaXplO1xuXG4gICAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB4ID0gKHggfCAoeCA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB5ID0gKHkgfCAoeSA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICByZXR1cm4geCB8ICh5IDw8IDEpO1xufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdChzdGFydCkge1xuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGxlZnRtb3N0ID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC54IDwgbGVmdG1vc3QueCB8fCAocC54ID09PSBsZWZ0bW9zdC54ICYmIHAueSA8IGxlZnRtb3N0LnkpKSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiYgLy8gZG9uZXMndCBpbnRlcnNlY3Qgb3RoZXIgZWRnZXNcbiAgICAgICAgICAgKGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSAmJiBtaWRkbGVJbnNpZGUoYSwgYikgJiYgLy8gbG9jYWxseSB2aXNpYmxlXG4gICAgICAgICAgICAoYXJlYShhLnByZXYsIGEsIGIucHJldikgfHwgYXJlYShhLCBiLnByZXYsIGIpKSB8fCAvLyBkb2VzIG5vdCBjcmVhdGUgb3Bwb3NpdGUtZmFjaW5nIHNlY3RvcnNcbiAgICAgICAgICAgIGVxdWFscyhhLCBiKSAmJiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA+IDAgJiYgYXJlYShiLnByZXYsIGIsIGIubmV4dCkgPiAwKTsgLy8gc3BlY2lhbCB6ZXJvLWxlbmd0aCBjYXNlXG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xuICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHtcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5mdW5jdGlvbiBpbnRlcnNlY3RzKHAxLCBxMSwgcDIsIHEyKSB7XG4gICAgdmFyIG8xID0gc2lnbihhcmVhKHAxLCBxMSwgcDIpKTtcbiAgICB2YXIgbzIgPSBzaWduKGFyZWEocDEsIHExLCBxMikpO1xuICAgIHZhciBvMyA9IHNpZ24oYXJlYShwMiwgcTIsIHAxKSk7XG4gICAgdmFyIG80ID0gc2lnbihhcmVhKHAyLCBxMiwgcTEpKTtcblxuICAgIGlmIChvMSAhPT0gbzIgJiYgbzMgIT09IG80KSByZXR1cm4gdHJ1ZTsgLy8gZ2VuZXJhbCBjYXNlXG5cbiAgICBpZiAobzEgPT09IDAgJiYgb25TZWdtZW50KHAxLCBwMiwgcTEpKSByZXR1cm4gdHJ1ZTsgLy8gcDEsIHExIGFuZCBwMiBhcmUgY29sbGluZWFyIGFuZCBwMiBsaWVzIG9uIHAxcTFcbiAgICBpZiAobzIgPT09IDAgJiYgb25TZWdtZW50KHAxLCBxMiwgcTEpKSByZXR1cm4gdHJ1ZTsgLy8gcDEsIHExIGFuZCBxMiBhcmUgY29sbGluZWFyIGFuZCBxMiBsaWVzIG9uIHAxcTFcbiAgICBpZiAobzMgPT09IDAgJiYgb25TZWdtZW50KHAyLCBwMSwgcTIpKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBwMSBhcmUgY29sbGluZWFyIGFuZCBwMSBsaWVzIG9uIHAycTJcbiAgICBpZiAobzQgPT09IDAgJiYgb25TZWdtZW50KHAyLCBxMSwgcTIpKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBxMSBhcmUgY29sbGluZWFyIGFuZCBxMSBsaWVzIG9uIHAycTJcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gZm9yIGNvbGxpbmVhciBwb2ludHMgcCwgcSwgciwgY2hlY2sgaWYgcG9pbnQgcSBsaWVzIG9uIHNlZ21lbnQgcHJcbmZ1bmN0aW9uIG9uU2VnbWVudChwLCBxLCByKSB7XG4gICAgcmV0dXJuIHEueCA8PSBNYXRoLm1heChwLngsIHIueCkgJiYgcS54ID49IE1hdGgubWluKHAueCwgci54KSAmJiBxLnkgPD0gTWF0aC5tYXgocC55LCByLnkpICYmIHEueSA+PSBNYXRoLm1pbihwLnksIHIueSk7XG59XG5cbmZ1bmN0aW9uIHNpZ24obnVtKSB7XG4gICAgcmV0dXJuIG51bSA+IDAgPyAxIDogbnVtIDwgMCA/IC0xIDogMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxuICAgICAgICAgICAgICAgIChweCA8IChwLm5leHQueCAtIHAueCkgKiAocHkgLSBwLnkpIC8gKHAubmV4dC55IC0gcC55KSArIHAueCkpXG4gICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oYSwgYikge1xuICAgIHZhciBhMiA9IG5ldyBOb2RlKGEuaSwgYS54LCBhLnkpLFxuICAgICAgICBiMiA9IG5ldyBOb2RlKGIuaSwgYi54LCBiLnkpLFxuICAgICAgICBhbiA9IGEubmV4dCxcbiAgICAgICAgYnAgPSBiLnByZXY7XG5cbiAgICBhLm5leHQgPSBiO1xuICAgIGIucHJldiA9IGE7XG5cbiAgICBhMi5uZXh0ID0gYW47XG4gICAgYW4ucHJldiA9IGEyO1xuXG4gICAgYjIubmV4dCA9IGEyO1xuICAgIGEyLnByZXYgPSBiMjtcblxuICAgIGJwLm5leHQgPSBiMjtcbiAgICBiMi5wcmV2ID0gYnA7XG5cbiAgICByZXR1cm4gYjI7XG59XG5cbi8vIGNyZWF0ZSBhIG5vZGUgYW5kIG9wdGlvbmFsbHkgbGluayBpdCB3aXRoIHByZXZpb3VzIG9uZSAoaW4gYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBpbnNlcnROb2RlKGksIHgsIHksIGxhc3QpIHtcbiAgICB2YXIgcCA9IG5ldyBOb2RlKGksIHgsIHkpO1xuXG4gICAgaWYgKCFsYXN0KSB7XG4gICAgICAgIHAucHJldiA9IHA7XG4gICAgICAgIHAubmV4dCA9IHA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBwLm5leHQgPSBsYXN0Lm5leHQ7XG4gICAgICAgIHAucHJldiA9IGxhc3Q7XG4gICAgICAgIGxhc3QubmV4dC5wcmV2ID0gcDtcbiAgICAgICAgbGFzdC5uZXh0ID0gcDtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUocCkge1xuICAgIHAubmV4dC5wcmV2ID0gcC5wcmV2O1xuICAgIHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG4gICAgaWYgKHAucHJldlopIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuICAgIGlmIChwLm5leHRaKSBwLm5leHRaLnByZXZaID0gcC5wcmV2Wjtcbn1cblxuZnVuY3Rpb24gTm9kZShpLCB4LCB5KSB7XG4gICAgLy8gdmVydGV4IGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRleCBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgdGhpcy5uZXh0ID0gbnVsbDtcblxuICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcbiAgICB0aGlzLnogPSBudWxsO1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxuICAgIHRoaXMucHJldlogPSBudWxsO1xuICAgIHRoaXMubmV4dFogPSBudWxsO1xuXG4gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcbiAgICB0aGlzLnN0ZWluZXIgPSBmYWxzZTtcbn1cblxuLy8gcmV0dXJuIGEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvbHlnb24gYXJlYSBhbmQgaXRzIHRyaWFuZ3VsYXRpb24gYXJlYTtcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cbmVhcmN1dC5kZXZpYXRpb24gPSBmdW5jdGlvbiAoZGF0YSwgaG9sZUluZGljZXMsIGRpbSwgdHJpYW5nbGVzKSB7XG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuICAgIHZhciBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblxuICAgIHZhciBwb2x5Z29uQXJlYSA9IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSkpO1xuICAgIGlmIChoYXNIb2xlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBwb2x5Z29uQXJlYSAtPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyaWFuZ2xlc0FyZWEgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGEgPSB0cmlhbmdsZXNbaV0gKiBkaW07XG4gICAgICAgIHZhciBiID0gdHJpYW5nbGVzW2kgKyAxXSAqIGRpbTtcbiAgICAgICAgdmFyIGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xuICAgICAgICB0cmlhbmdsZXNBcmVhICs9IE1hdGguYWJzKFxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2NdKSAqIChkYXRhW2IgKyAxXSAtIGRhdGFbYSArIDFdKSAtXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxuICAgICAgICBNYXRoLmFicygodHJpYW5nbGVzQXJlYSAtIHBvbHlnb25BcmVhKSAvIHBvbHlnb25BcmVhKTtcbn07XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xuICAgICAgICBzdW0gKz0gKGRhdGFbal0gLSBkYXRhW2ldKSAqIChkYXRhW2kgKyAxXSArIGRhdGFbaiArIDFdKTtcbiAgICAgICAgaiA9IGk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbi8vIHR1cm4gYSBwb2x5Z29uIGluIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZm9ybSAoZS5nLiBhcyBpbiBHZW9KU09OKSBpbnRvIGEgZm9ybSBFYXJjdXQgYWNjZXB0c1xuZWFyY3V0LmZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBkaW0gPSBkYXRhWzBdWzBdLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0ge3ZlcnRpY2VzOiBbXSwgaG9sZXM6IFtdLCBkaW1lbnNpb25zOiBkaW19LFxuICAgICAgICBob2xlSW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaW07IGQrKykgcmVzdWx0LnZlcnRpY2VzLnB1c2goZGF0YVtpXVtqXVtkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBob2xlSW5kZXggKz0gZGF0YVtpIC0gMV0ubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0LmhvbGVzLnB1c2goaG9sZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyLCBrLCBsZWZ0LCByaWdodCwgY29tcGFyZSkge1xuICAgIHF1aWNrc2VsZWN0U3RlcChhcnIsIGssIGxlZnQgfHwgMCwgcmlnaHQgfHwgKGFyci5sZW5ndGggLSAxKSwgY29tcGFyZSB8fCBkZWZhdWx0Q29tcGFyZSk7XG59XG5cbmZ1bmN0aW9uIHF1aWNrc2VsZWN0U3RlcChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKSB7XG5cbiAgICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgICAgICAgIHZhciBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIHZhciBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIHogPSBNYXRoLmxvZyhuKTtcbiAgICAgICAgICAgIHZhciBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIHZhciBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIHZhciBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHZhciBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIG0pICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHQgPSBhcnJba107XG4gICAgICAgIHZhciBpID0gbGVmdDtcbiAgICAgICAgdmFyIGogPSByaWdodDtcblxuICAgICAgICBzd2FwKGFyciwgbGVmdCwgayk7XG4gICAgICAgIGlmIChjb21wYXJlKGFycltyaWdodF0sIHQpID4gMCkgc3dhcChhcnIsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXAoYXJyLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltpXSwgdCkgPCAwKSBpKys7XG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJbal0sIHQpID4gMCkgai0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnIsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXAoYXJyLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIHZhciB0bXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRtcDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBxdWlja3NlbGVjdCBmcm9tICdxdWlja3NlbGVjdCc7XG5cbmltcG9ydCB7IGNhbGN1bGF0ZVNpZ25lZEFyZWEgfSBmcm9tICcuL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzOiBBcnJheTxBcnJheTxQb2ludD4+LCBtYXhSaW5nczogbnVtYmVyKSB7XG4gICAgY29uc3QgbGVuID0gcmluZ3MubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiA8PSAxKSByZXR1cm4gW3JpbmdzXTtcblxuICAgIGNvbnN0IHBvbHlnb25zID0gW107XG4gICAgbGV0IHBvbHlnb24sXG4gICAgICAgIGNjdztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXJlYSA9IGNhbGN1bGF0ZVNpZ25lZEFyZWEocmluZ3NbaV0pO1xuICAgICAgICBpZiAoYXJlYSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgKHJpbmdzW2ldOiBhbnkpLmFyZWEgPSBNYXRoLmFicyhhcmVhKTtcblxuICAgICAgICBpZiAoY2N3ID09PSB1bmRlZmluZWQpIGNjdyA9IGFyZWEgPCAwO1xuXG4gICAgICAgIGlmIChjY3cgPT09IGFyZWEgPCAwKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICAgIHBvbHlnb24gPSBbcmluZ3NbaV1dO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAocG9seWdvbjogYW55KS5wdXNoKHJpbmdzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcblxuICAgIC8vIEVhcmN1dCBwZXJmb3JtYW5jZSBkZWdyYWRlcyB3aXRoIHRoZSAjIG9mIHJpbmdzIGluIGEgcG9seWdvbi4gRm9yIHRoaXNcbiAgICAvLyByZWFzb24sIHdlIGxpbWl0IHN0cmlwIG91dCBhbGwgYnV0IHRoZSBgbWF4UmluZ3NgIGxhcmdlc3QgcmluZ3MuXG4gICAgaWYgKG1heFJpbmdzID4gMSkge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBvbHlnb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbnNbal0ubGVuZ3RoIDw9IG1heFJpbmdzKSBjb250aW51ZTtcbiAgICAgICAgICAgIHF1aWNrc2VsZWN0KHBvbHlnb25zW2pdLCBtYXhSaW5ncywgMSwgcG9seWdvbnNbal0ubGVuZ3RoIC0gMSwgY29tcGFyZUFyZWFzKTtcbiAgICAgICAgICAgIHBvbHlnb25zW2pdID0gcG9seWdvbnNbal0uc2xpY2UoMCwgbWF4UmluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25zO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlQXJlYXMoYSwgYikge1xuICAgIHJldHVybiBiLmFyZWEgLSBhLmFyZWE7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgRmlsbFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBMaW5lU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHR5cGUge1xuICAgIEJ1Y2tldEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldCc7XG5cbnR5cGUgUGF0dGVyblN0eWxlTGF5ZXJzID1cbiAgICBBcnJheTxMaW5lU3R5bGVMYXllcj4gfFxuICAgIEFycmF5PEZpbGxTdHlsZUxheWVyPiB8XG4gICAgQXJyYXk8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+O1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzUGF0dGVybih0eXBlOiBzdHJpbmcsIGxheWVyczogUGF0dGVyblN0eWxlTGF5ZXJzLCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBwYXR0ZXJucyA9IG9wdGlvbnMucGF0dGVybkRlcGVuZGVuY2llcztcbiAgICBsZXQgaGFzUGF0dGVybiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgY29uc3QgcGF0dGVyblByb3BlcnR5ID0gbGF5ZXIucGFpbnQuZ2V0KGAke3R5cGV9LXBhdHRlcm5gKTtcbiAgICAgICAgaWYgKCFwYXR0ZXJuUHJvcGVydHkuaXNDb25zdGFudCgpKSB7XG4gICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnN0YW50UGF0dGVybiA9IHBhdHRlcm5Qcm9wZXJ0eS5jb25zdGFudE9yKG51bGwpO1xuICAgICAgICBpZiAoY29uc3RhbnRQYXR0ZXJuKSB7XG4gICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhdHRlcm5zW2NvbnN0YW50UGF0dGVybi50b10gPSAgdHJ1ZTtcbiAgICAgICAgICAgIHBhdHRlcm5zW2NvbnN0YW50UGF0dGVybi5mcm9tXSA9ICB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc1BhdHRlcm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRQYXR0ZXJuRGVwZW5kZW5jaWVzKHR5cGU6IHN0cmluZywgbGF5ZXJzOiBQYXR0ZXJuU3R5bGVMYXllcnMsIHBhdHRlcm5GZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCB6b29tOiBudW1iZXIsIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycykge1xuICAgIGNvbnN0IHBhdHRlcm5zID0gb3B0aW9ucy5wYXR0ZXJuRGVwZW5kZW5jaWVzO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldChgJHt0eXBlfS1wYXR0ZXJuYCk7XG5cbiAgICAgICAgY29uc3QgcGF0dGVyblByb3BlcnR5VmFsdWUgPSBwYXR0ZXJuUHJvcGVydHkudmFsdWU7XG4gICAgICAgIGlmIChwYXR0ZXJuUHJvcGVydHlWYWx1ZS5raW5kICE9PSBcImNvbnN0YW50XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IHBhdHRlcm5Qcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tOiB6b29tIC0gMX0sIHBhdHRlcm5GZWF0dXJlLCB7fSk7XG4gICAgICAgICAgICBjb25zdCBtaWQgPSBwYXR0ZXJuUHJvcGVydHlWYWx1ZS5ldmFsdWF0ZSh7em9vbX0sIHBhdHRlcm5GZWF0dXJlLCB7fSk7XG4gICAgICAgICAgICBjb25zdCBtYXggPSBwYXR0ZXJuUHJvcGVydHlWYWx1ZS5ldmFsdWF0ZSh7em9vbTogem9vbSArIDF9LCBwYXR0ZXJuRmVhdHVyZSwge30pO1xuICAgICAgICAgICAgLy8gYWRkIHRvIHBhdHRlcm5EZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIHBhdHRlcm5zW21pbl0gPSB0cnVlO1xuICAgICAgICAgICAgcGF0dGVybnNbbWlkXSA9IHRydWU7XG4gICAgICAgICAgICBwYXR0ZXJuc1ttYXhdID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gc2F2ZSBmb3IgbGF5b3V0XG4gICAgICAgICAgICBwYXR0ZXJuRmVhdHVyZS5wYXR0ZXJuc1tsYXllci5pZF0gPSB7IG1pbiwgbWlkLCBtYXggfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybkZlYXR1cmU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBGaWxsTGF5b3V0QXJyYXkgfSBmcm9tICcuLi9hcnJheV90eXBlcyc7XG5cbmltcG9ydCB7IG1lbWJlcnMgYXMgbGF5b3V0QXR0cmlidXRlcyB9IGZyb20gJy4vZmlsbF9hdHRyaWJ1dGVzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL3NlZ21lbnQnO1xuaW1wb3J0IHsgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQgfSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgTGluZUluZGV4QXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSB9IGZyb20gJy4uL2luZGV4X2FycmF5X3R5cGUnO1xuaW1wb3J0IGVhcmN1dCBmcm9tICdlYXJjdXQnO1xuaW1wb3J0IGNsYXNzaWZ5UmluZ3MgZnJvbSAnLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5ncyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5jb25zdCBFQVJDVVRfTUFYX1JJTkdTID0gNTAwO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IHtoYXNQYXR0ZXJuLCBhZGRQYXR0ZXJuRGVwZW5kZW5jaWVzfSBmcm9tICcuL3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzJztcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vbG9hZF9nZW9tZXRyeSc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcblxuaW1wb3J0IHR5cGUge1xuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRQYXJhbWV0ZXJzLFxuICAgIEJ1Y2tldEZlYXR1cmUsXG4gICAgSW5kZXhlZEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBGaWxsU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcblxuY2xhc3MgRmlsbEJ1Y2tldCBpbXBsZW1lbnRzIEJ1Y2tldCB7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcjtcbiAgICBsYXllcnM6IEFycmF5PEZpbGxTdHlsZUxheWVyPjtcbiAgICBsYXllcklkczogQXJyYXk8c3RyaW5nPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVyczogQXJyYXk8RmlsbFN0eWxlTGF5ZXI+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgcGF0dGVybkZlYXR1cmVzOiBBcnJheTxCdWNrZXRGZWF0dXJlPjtcblxuICAgIGxheW91dFZlcnRleEFycmF5OiBGaWxsTGF5b3V0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBpbmRleEFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXk7XG4gICAgaW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTI6IExpbmVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyMjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8RmlsbFN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHNlZ21lbnRzMjogU2VnbWVudFZlY3RvcjtcbiAgICB1cGxvYWRlZDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJ1Y2tldFBhcmFtZXRlcnM8RmlsbFN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG9wdGlvbnMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0aW9ucy5sYXllcnM7XG4gICAgICAgIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAobGF5ZXIgPT4gbGF5ZXIuaWQpO1xuICAgICAgICB0aGlzLmluZGV4ID0gb3B0aW9ucy5pbmRleDtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGF0dGVybkZlYXR1cmVzID0gW107XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBGaWxsTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkyID0gbmV3IExpbmVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uU2V0KGxheW91dEF0dHJpYnV0ZXMsIG9wdGlvbnMubGF5ZXJzLCBvcHRpb25zLnpvb20pO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5zZWdtZW50czIgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmhhc1BhdHRlcm4gPSBoYXNQYXR0ZXJuKCdmaWxsJywgdGhpcy5sYXllcnMsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBmaWxsU29ydEtleSA9IHRoaXMubGF5ZXJzWzBdLmxheW91dC5nZXQoJ2ZpbGwtc29ydC1rZXknKTtcbiAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZXMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSksIGZlYXR1cmUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBsb2FkR2VvbWV0cnkoZmVhdHVyZSk7XG4gICAgICAgICAgICBjb25zdCBzb3J0S2V5ID0gZmlsbFNvcnRLZXkgP1xuICAgICAgICAgICAgICAgIGZpbGxTb3J0S2V5LmV2YWx1YXRlKGZlYXR1cmUsIHt9KSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge30sXG4gICAgICAgICAgICAgICAgc29ydEtleVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMucHVzaChidWNrZXRGZWF0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxsU29ydEtleSkge1xuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGEuc29ydEtleSBpcyBhbHdheXMgYSBudW1iZXIgd2hlbiBpbiB1c2VcbiAgICAgICAgICAgICAgICByZXR1cm4gKChhLnNvcnRLZXk6IGFueSk6IG51bWJlcikgLSAoKGIuc29ydEtleTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBidWNrZXRGZWF0dXJlIG9mIGJ1Y2tldEZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb25zdCB7Z2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSA9IGJ1Y2tldEZlYXR1cmU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuRmVhdHVyZSA9IGFkZFBhdHRlcm5EZXBlbmRlbmNpZXMoJ2ZpbGwnLCB0aGlzLmxheWVycywgYnVja2V0RmVhdHVyZSwgdGhpcy56b29tLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAvLyBwYXR0ZXJuIGZlYXR1cmVzIGFyZSBhZGRlZCBvbmx5IG9uY2UgdGhlIHBhdHRlcm4gaXMgbG9hZGVkIGludG8gdGhlIGltYWdlIGF0bGFzXG4gICAgICAgICAgICAgICAgLy8gc28gYXJlIHN0b3JlZCBkdXJpbmcgcG9wdWxhdGUgdW50aWwgbGF0ZXIgdXBkYXRlZCB3aXRoIHBvc2l0aW9ucyBieSB0aWxlIHdvcmtlciBpbiBhZGRGZWF0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybkZlYXR1cmVzLnB1c2gocGF0dGVybkZlYXR1cmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoYnVja2V0RmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCB7fSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1tpbmRleF0uZmVhdHVyZTtcbiAgICAgICAgICAgIG9wdGlvbnMuZmVhdHVyZUluZGV4Lmluc2VydChmZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmVzKG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHRoaXMucGF0dGVybkZlYXR1cmVzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoZmVhdHVyZSwgZmVhdHVyZS5nZW9tZXRyeSwgZmVhdHVyZS5pbmRleCwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlcjIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzMi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgaW5kZXg6IG51bWJlciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIGNsYXNzaWZ5UmluZ3MoZ2VvbWV0cnksIEVBUkNVVF9NQVhfUklOR1MpKSB7XG4gICAgICAgICAgICBsZXQgbnVtVmVydGljZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBudW1WZXJ0aWNlcyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJpYW5nbGVTZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlcywgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlSW5kZXggPSB0cmlhbmdsZVNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGhvbGVJbmRpY2VzID0gW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyaW5nICE9PSBwb2x5Z29uWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvbGVJbmRpY2VzLnB1c2goZmxhdHRlbmVkLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVTZWdtZW50ID0gdGhpcy5zZWdtZW50czIucHJlcGFyZVNlZ21lbnQocmluZy5sZW5ndGgsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVJbmRleCA9IGxpbmVTZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socmluZ1swXS54LCByaW5nWzBdLnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheTIuZW1wbGFjZUJhY2sobGluZUluZGV4ICsgcmluZy5sZW5ndGggLSAxLCBsaW5lSW5kZXgpO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbMF0ueCk7XG4gICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1swXS55KTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHJpbmdbaV0ueCwgcmluZ1tpXS55KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5Mi5lbXBsYWNlQmFjayhsaW5lSW5kZXggKyBpIC0gMSwgbGluZUluZGV4ICsgaSk7XG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbaV0ueCk7XG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbaV0ueSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGluZVNlZ21lbnQudmVydGV4TGVuZ3RoICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxpbmVTZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGVhcmN1dChmbGF0dGVuZWQsIGhvbGVJbmRpY2VzKTtcbiAgICAgICAgICAgIGFzc2VydChpbmRpY2VzLmxlbmd0aCAlIDMgPT09IDApO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ldLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tpICsgMV0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2kgKyAyXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyaWFuZ2xlU2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gbnVtVmVydGljZXM7XG4gICAgICAgICAgICB0cmlhbmdsZVNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBpbmRleCwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0ZpbGxCdWNrZXQnLCBGaWxsQnVja2V0LCB7b21pdDogWydsYXllcnMnLCAncGF0dGVybkZlYXR1cmVzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsbEJ1Y2tldDtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0JztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5leHBvcnQgdHlwZSBMYXlvdXRQcm9wcyA9IHt8XG4gICAgXCJmaWxsLXNvcnQta2V5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJmaWxsLXNvcnQta2V5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2ZpbGxcIl1bXCJmaWxsLXNvcnQta2V5XCJdKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImZpbGwtYW50aWFsaWFzXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiZmlsbC1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiZmlsbC1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiZmlsbC1vdXRsaW5lLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJmaWxsLXRyYW5zbGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImZpbGwtcGF0dGVyblwiOiBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5PHN0cmluZz4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJmaWxsLWFudGlhbGlhc1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtYW50aWFsaWFzXCJdKSxcbiAgICBcImZpbGwtb3BhY2l0eVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLW9wYWNpdHlcIl0pLFxuICAgIFwiZmlsbC1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLWNvbG9yXCJdKSxcbiAgICBcImZpbGwtb3V0bGluZS1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLW91dGxpbmUtY29sb3JcIl0pLFxuICAgIFwiZmlsbC10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwiZmlsbC1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLXBhdHRlcm5cIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgRmlsbEJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9maWxsX2J1Y2tldCc7XG5pbXBvcnQgeyBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbiB9IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJztcbmltcG9ydCB7IHRyYW5zbGF0ZURpc3RhbmNlLCB0cmFuc2xhdGUgfSBmcm9tICcuLi9xdWVyeV91dGlscyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgTGF5b3V0LCBQb3NzaWJseUV2YWx1YXRlZCB9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVTdGF0ZSB9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7QnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7TGF5b3V0UHJvcHMsIFBhaW50UHJvcHN9IGZyb20gJy4vZmlsbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgRmlsbFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdW5ldmFsdWF0ZWRMYXlvdXQ6IExheW91dDxMYXlvdXRQcm9wcz47XG4gICAgbGF5b3V0OiBQb3NzaWJseUV2YWx1YXRlZDxMYXlvdXRQcm9wcz47XG5cbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICBzdXBlci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcblxuICAgICAgICBjb25zdCBvdXRsaW5lQ29sb3IgPSB0aGlzLnBhaW50Ll92YWx1ZXNbJ2ZpbGwtb3V0bGluZS1jb2xvciddO1xuICAgICAgICBpZiAob3V0bGluZUNvbG9yLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcgJiYgb3V0bGluZUNvbG9yLnZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnQuX3ZhbHVlc1snZmlsbC1vdXRsaW5lLWNvbG9yJ10gPSB0aGlzLnBhaW50Ll92YWx1ZXNbJ2ZpbGwtY29sb3InXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChwYXJhbWV0ZXJzOiBCdWNrZXRQYXJhbWV0ZXJzPCo+KSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsbEJ1Y2tldChwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnZmlsbC10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24odHJhbnNsYXRlZFBvbHlnb24sIGdlb21ldHJ5KTtcbiAgICB9XG5cbiAgICBpc1RpbGVDbGlwcGVkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGxTdHlsZUxheWVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5JztcblxuY29uc3QgbGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgICAgICAgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX25vcm1hbF9lZCcsICAgIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdJbnQxNid9LFxuXSwgNCk7XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbmV4cG9ydCBjb25zdCB7bWVtYmVycywgc2l6ZSwgYWxpZ25tZW50fSA9IGxheW91dDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDIpIHJlYWRUYWcocGJmLCBmZWF0dXJlKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMykgZmVhdHVyZS50eXBlID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gNCkgZmVhdHVyZS5fZ2VvbWV0cnkgPSBwYmYucG9zO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnKHBiZiwgZmVhdHVyZSkge1xuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciBrZXkgPSBmZWF0dXJlLl9rZXlzW3BiZi5yZWFkVmFyaW50KCldLFxuICAgICAgICAgICAgdmFsdWUgPSBmZWF0dXJlLl92YWx1ZXNbcGJmLnJlYWRWYXJpbnQoKV07XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgfVxufVxuXG5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGxpbmVzID0gW10sXG4gICAgICAgIGxpbmU7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXG4gICAgICAgICAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lLnB1c2gobmV3IFBvaW50KHgsIHkpKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcbiAgICAgICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uY2xvbmUoKSk7IC8vIGNsb3NlUG9seWdvblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB4MSA9IEluZmluaXR5LFxuICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgeTEgPSBJbmZpbml0eSxcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXSxcbiAgICAgICAgaSwgajtcblxuICAgIGZ1bmN0aW9uIHByb2plY3QobGluZSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICBjYXNlIDE6XG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcG9pbnRzW2ldID0gY29vcmRzW2ldWzBdO1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkcyA9IHBvaW50cztcbiAgICAgICAgcHJvamVjdChjb29yZHMpO1xuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgMjpcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcHJvamVjdChjb29yZHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAzOlxuICAgICAgICBjb29yZHMgPSBjbGFzc2lmeVJpbmdzKGNvb3Jkcyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0KGNvb3Jkc1tpXVtqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSAnTXVsdGknICsgdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgIH07XG5cbiAgICBpZiAoJ2lkJyBpbiB0aGlzKSB7XG4gICAgICAgIHJlc3VsdC5pZCA9IHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGNsYXNzaWZpZXMgYW4gYXJyYXkgb2YgcmluZ3MgaW50byBwb2x5Z29ucyB3aXRoIG91dGVyIHJpbmdzIGFuZCBob2xlc1xuXG5mdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzKSB7XG4gICAgdmFyIGxlbiA9IHJpbmdzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPD0gMSkgcmV0dXJuIFtyaW5nc107XG5cbiAgICB2YXIgcG9seWdvbnMgPSBbXSxcbiAgICAgICAgcG9seWdvbixcbiAgICAgICAgY2N3O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJlYSA9IHNpZ25lZEFyZWEocmluZ3NbaV0pO1xuICAgICAgICBpZiAoYXJlYSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gdW5kZWZpbmVkKSBjY3cgPSBhcmVhIDwgMDtcblxuICAgICAgICBpZiAoY2N3ID09PSBhcmVhIDwgMCkge1xuICAgICAgICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gICAgICAgICAgICBwb2x5Z29uID0gW3JpbmdzW2ldXTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9seWdvbi5wdXNoKHJpbmdzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcblxuICAgIHJldHVybiBwb2x5Z29ucztcbn1cblxuZnVuY3Rpb24gc2lnbmVkQXJlYShyaW5nKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMSwgcDEsIHAyOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgcDIgPSByaW5nW2pdO1xuICAgICAgICBzdW0gKz0gKHAyLnggLSBwMS54KSAqIChwMS55ICsgcDIueSk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlTGF5ZXI7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVMYXllcihwYmYsIGVuZCkge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMudmVyc2lvbiA9IDE7XG4gICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IDQwOTY7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9rZXlzID0gW107XG4gICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgdGhpcy5fZmVhdHVyZXMgPSBbXTtcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRMYXllciwgdGhpcywgZW5kKTtcblxuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiByZWFkTGF5ZXIodGFnLCBsYXllciwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMTUpIGxheWVyLnZlcnNpb24gPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMSkgbGF5ZXIubmFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA1KSBsYXllci5leHRlbnQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgbGF5ZXIuX2ZlYXR1cmVzLnB1c2gocGJmLnBvcyk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBsYXllci5fa2V5cy5wdXNoKHBiZi5yZWFkU3RyaW5nKCkpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgbGF5ZXIuX3ZhbHVlcy5wdXNoKHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSB7XG4gICAgdmFyIHZhbHVlID0gbnVsbCxcbiAgICAgICAgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIgdGFnID0gcGJmLnJlYWRWYXJpbnQoKSA+PiAzO1xuXG4gICAgICAgIHZhbHVlID0gdGFnID09PSAxID8gcGJmLnJlYWRTdHJpbmcoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDIgPyBwYmYucmVhZEZsb2F0KCkgOlxuICAgICAgICAgICAgdGFnID09PSAzID8gcGJmLnJlYWREb3VibGUoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDQgPyBwYmYucmVhZFZhcmludDY0KCkgOlxuICAgICAgICAgICAgdGFnID09PSA1ID8gcGJmLnJlYWRWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDYgPyBwYmYucmVhZFNWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDcgPyBwYmYucmVhZEJvb2xlYW4oKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZXR1cm4gZmVhdHVyZSBgaWAgZnJvbSB0aGlzIGxheWVyIGFzIGEgYFZlY3RvclRpbGVGZWF0dXJlYFxuVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24oaSkge1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMnKTtcblxuICAgIHRoaXMuX3BiZi5wb3MgPSB0aGlzLl9mZWF0dXJlc1tpXTtcblxuICAgIHZhciBlbmQgPSB0aGlzLl9wYmYucmVhZFZhcmludCgpICsgdGhpcy5fcGJmLnBvcztcbiAgICByZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZiwgZW5kLCB0aGlzLmV4dGVudCwgdGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVsYXllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGUocGJmLCBlbmQpIHtcbiAgICB0aGlzLmxheWVycyA9IHBiZi5yZWFkRmllbGRzKHJlYWRUaWxlLCB7fSwgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZFRpbGUodGFnLCBsYXllcnMsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDMpIHtcbiAgICAgICAgdmFyIGxheWVyID0gbmV3IFZlY3RvclRpbGVMYXllcihwYmYsIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zKTtcbiAgICAgICAgaWYgKGxheWVyLmxlbmd0aCkgbGF5ZXJzW2xheWVyLm5hbWVdID0gbGF5ZXI7XG4gICAgfVxufVxuXG4iLCJtb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzJyk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkgfSBmcm9tICcuLi9hcnJheV90eXBlcyc7XG5cbmltcG9ydCB7IG1lbWJlcnMgYXMgbGF5b3V0QXR0cmlidXRlcyB9IGZyb20gJy4vZmlsbF9leHRydXNpb25fYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9zZWdtZW50JztcbmltcG9ydCB7IFByb2dyYW1Db25maWd1cmF0aW9uU2V0IH0gZnJvbSAnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFRyaWFuZ2xlSW5kZXhBcnJheSB9IGZyb20gJy4uL2luZGV4X2FycmF5X3R5cGUnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9leHRlbnQnO1xuaW1wb3J0IGVhcmN1dCBmcm9tICdlYXJjdXQnO1xuaW1wb3J0IG12dCBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmNvbnN0IHZlY3RvclRpbGVGZWF0dXJlVHlwZXMgPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXM7XG5pbXBvcnQgY2xhc3NpZnlSaW5ncyBmcm9tICcuLi8uLi91dGlsL2NsYXNzaWZ5X3JpbmdzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmNvbnN0IEVBUkNVVF9NQVhfUklOR1MgPSA1MDA7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQge2hhc1BhdHRlcm4sIGFkZFBhdHRlcm5EZXBlbmRlbmNpZXN9IGZyb20gJy4vcGF0dGVybl9idWNrZXRfZmVhdHVyZXMnO1xuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuLi9sb2FkX2dlb21ldHJ5JztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0JztcblxuaW1wb3J0IHR5cGUgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi8uLi9zb3VyY2Uvc291cmNlX3N0YXRlJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi8uLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuXG5jb25zdCBGQUNUT1IgPSBNYXRoLnBvdygyLCAxMyk7XG5cbmZ1bmN0aW9uIGFkZFZlcnRleCh2ZXJ0ZXhBcnJheSwgeCwgeSwgbngsIG55LCBueiwgdCwgZSkge1xuICAgIHZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAvLyBhX3Bvc1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICAvLyBhX25vcm1hbF9lZDogMy1jb21wb25lbnQgbm9ybWFsIGFuZCAxLWNvbXBvbmVudCBlZGdlZGlzdGFuY2VcbiAgICAgICAgTWF0aC5mbG9vcihueCAqIEZBQ1RPUikgKiAyICsgdCxcbiAgICAgICAgbnkgKiBGQUNUT1IgKiAyLFxuICAgICAgICBueiAqIEZBQ1RPUiAqIDIsXG4gICAgICAgIC8vIGVkZ2VkaXN0YW5jZSAodXNlZCBmb3Igd3JhcHBpbmcgcGF0dGVybnMgYXJvdW5kIGV4dHJ1c2lvbiBzaWRlcylcbiAgICAgICAgTWF0aC5yb3VuZChlKVxuICAgICk7XG59XG5cbmNsYXNzIEZpbGxFeHRydXNpb25CdWNrZXQgaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgbGF5ZXJzOiBBcnJheTxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PEZpbGxFeHRydXNpb25TdHlsZUxheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IEZpbGxFeHRydXNpb25MYXlvdXRBcnJheTtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuICAgIGZlYXR1cmVzOiBBcnJheTxCdWNrZXRGZWF0dXJlPjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJ1Y2tldFBhcmFtZXRlcnM8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG9wdGlvbnMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0aW9ucy5sYXllcnM7XG4gICAgICAgIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAobGF5ZXIgPT4gbGF5ZXIuaWQpO1xuICAgICAgICB0aGlzLmluZGV4ID0gb3B0aW9ucy5pbmRleDtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChsYXlvdXRBdHRyaWJ1dGVzLCBvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcCgobCkgPT4gbC5pZCk7XG5cbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuICAgICAgICB0aGlzLmhhc1BhdHRlcm4gPSBoYXNQYXR0ZXJuKCdmaWxsLWV4dHJ1c2lvbicsIHRoaXMubGF5ZXJzLCBvcHRpb25zKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSksIGZlYXR1cmUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBsb2FkR2VvbWV0cnkoZmVhdHVyZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5GZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge31cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmVhdHVyZS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuRmVhdHVyZS5pZCA9IGZlYXR1cmUuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goYWRkUGF0dGVybkRlcGVuZGVuY2llcygnZmlsbC1leHRydXNpb24nLCB0aGlzLmxheWVycywgcGF0dGVybkZlYXR1cmUsIHRoaXMuem9vbSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUocGF0dGVybkZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwge30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvcHRpb25zLmZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4LCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEZlYXR1cmVzKG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHRoaXMuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtnZW9tZXRyeX0gPSBmZWF0dXJlO1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGdlb21ldHJ5LCBmZWF0dXJlLmluZGV4LCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGluZGV4OiBudW1iZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBjbGFzc2lmeVJpbmdzKGdlb21ldHJ5LCBFQVJDVVRfTUFYX1JJTkdTKSkge1xuICAgICAgICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgbnVtVmVydGljZXMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGlzRW50aXJlbHlPdXRzaWRlKHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBlZGdlRGlzdGFuY2UgPSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCByaW5nLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAxID0gcmluZ1twXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwMiA9IHJpbmdbcCAtIDFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQm91bmRhcnlFZGdlKHAxLCBwMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyA0ID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcnAgPSBwMS5zdWIocDIpLl9wZXJwKCkuX3VuaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0ID0gcDIuZGlzdChwMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkZ2VEaXN0YW5jZSArIGRpc3QgPiAzMjc2OCkgZWRnZURpc3RhbmNlID0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMS54LCBwMS55LCBwZXJwLngsIHBlcnAueSwgMCwgMCwgZWRnZURpc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDEueCwgcDEueSwgcGVycC54LCBwZXJwLnksIDAsIDEsIGVkZ2VEaXN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlRGlzdGFuY2UgKz0gZGlzdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMi54LCBwMi55LCBwZXJwLngsIHBlcnAueSwgMCwgMCwgZWRnZURpc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDIueCwgcDIueSwgcGVycC54LCBwZXJwLnksIDAsIDEsIGVkZ2VEaXN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b21SaWdodCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKMw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKQXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKCIDAgIDEgw6LClMKCIENvdW50ZXItY2xvY2t3aXNlIHdpbmRpbmcgb3JkZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKCICAgICAgw6LClMKCIFRyaWFuZ2xlIDE6IDAgPT4gMiA9PiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKCIDIgIDMgw6LClMKCIFRyaWFuZ2xlIDI6IDEgPT4gMiA9PiAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKUw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGJvdHRvbVJpZ2h0LCBib3R0b21SaWdodCArIDIsIGJvdHRvbVJpZ2h0ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGJvdHRvbVJpZ2h0ICsgMSwgYm90dG9tUmlnaHQgKyAyLCBib3R0b21SaWdodCArIDMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyBudW1WZXJ0aWNlcyA+IFNlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlcywgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9Pbmx5IHRyaWFuZ3VsYXRlIGFuZCBkcmF3IHRoZSBhcmVhIG9mIHRoZSBmZWF0dXJlIGlmIGl0IGlzIGEgcG9seWdvblxuICAgICAgICAgICAgLy9PdGhlciBmZWF0dXJlIHR5cGVzIChlLmcuIExpbmVTdHJpbmcpIGRvIG5vdCBoYXZlIGFyZWEsIHNvIHRyaWFuZ3VsYXRpb24gaXMgcG9pbnRsZXNzIC8gdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAodmVjdG9yVGlsZUZlYXR1cmVUeXBlc1tmZWF0dXJlLnR5cGVdICE9PSAnUG9seWdvbicpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaG9sZUluZGljZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlSW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJpbmcgIT09IHBvbHlnb25bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaG9sZUluZGljZXMucHVzaChmbGF0dGVuZWQubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSByaW5nW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwLngsIHAueSwgMCwgMCwgMSwgMSwgMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocC54KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocC55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBlYXJjdXQoZmxhdHRlbmVkLCBob2xlSW5kaWNlcyk7XG4gICAgICAgICAgICBhc3NlcnQoaW5kaWNlcy5sZW5ndGggJSAzID09PSAwKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzLmxlbmd0aDsgaiArPSAzKSB7XG4gICAgICAgICAgICAgICAgLy8gQ291bnRlci1jbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2pdLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tqICsgMl0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ogKyAxXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IG51bVZlcnRpY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgZmVhdHVyZSwgaW5kZXgsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdGaWxsRXh0cnVzaW9uQnVja2V0JywgRmlsbEV4dHJ1c2lvbkJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJywgJ2ZlYXR1cmVzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsbEV4dHJ1c2lvbkJ1Y2tldDtcblxuZnVuY3Rpb24gaXNCb3VuZGFyeUVkZ2UocDEsIHAyKSB7XG4gICAgcmV0dXJuIChwMS54ID09PSBwMi54ICYmIChwMS54IDwgMCB8fCBwMS54ID4gRVhURU5UKSkgfHxcbiAgICAgICAgKHAxLnkgPT09IHAyLnkgJiYgKHAxLnkgPCAwIHx8IHAxLnkgPiBFWFRFTlQpKTtcbn1cblxuZnVuY3Rpb24gaXNFbnRpcmVseU91dHNpZGUocmluZykge1xuICAgIHJldHVybiByaW5nLmV2ZXJ5KHAgPT4gcC54IDwgMCkgfHxcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueCA+IEVYVEVOVCkgfHxcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueSA8IDApIHx8XG4gICAgICAgIHJpbmcuZXZlcnkocCA9PiBwLnkgPiBFWFRFTlQpO1xufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjogQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eTxzdHJpbmc+LFxuICAgIFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiZmlsbC1leHRydXNpb24tYmFzZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tcGF0dGVyblwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5cbmltcG9ydCBGaWxsRXh0cnVzaW9uQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldCc7XG5pbXBvcnQgeyBwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24sIHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uIH0gZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMnO1xuaW1wb3J0IHsgdHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZSB9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWQgfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcbmltcG9ydCB7dmVjNH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlU3RhdGUgfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0J1Y2tldFBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0JztcbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNsYXNzIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsbEV4dHJ1c2lvbkJ1Y2tldChwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBpczNEKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXkpOiBib29sZWFuIHwgbnVtYmVyIHtcblxuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUG9seWdvbiA9IHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1oZWlnaHQnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLWJhc2UnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuXG4gICAgICAgIGNvbnN0IHByb2plY3RlZFF1ZXJ5R2VvbWV0cnkgPSBwcm9qZWN0UXVlcnlHZW9tZXRyeSh0cmFuc2xhdGVkUG9seWdvbiwgcGl4ZWxQb3NNYXRyaXgsIHRyYW5zZm9ybSwgMCk7XG5cbiAgICAgICAgY29uc3QgcHJvamVjdGVkID0gcHJvamVjdEV4dHJ1c2lvbihnZW9tZXRyeSwgYmFzZSwgaGVpZ2h0LCBwaXhlbFBvc01hdHJpeCk7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZEJhc2UgPSBwcm9qZWN0ZWRbMF07XG4gICAgICAgIGNvbnN0IHByb2plY3RlZFRvcCA9IHByb2plY3RlZFsxXTtcbiAgICAgICAgcmV0dXJuIGNoZWNrSW50ZXJzZWN0aW9uKHByb2plY3RlZEJhc2UsIHByb2plY3RlZFRvcCwgcHJvamVjdGVkUXVlcnlHZW9tZXRyeSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkb3QoYSwgYikge1xuICAgIHJldHVybiBhLnggKiBiLnggKyBhLnkgKiBiLnk7XG59XG5cbmZ1bmN0aW9uIGdldEludGVyc2VjdGlvbkRpc3RhbmNlKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PiwgcHJvamVjdGVkRmFjZTogQXJyYXk8UG9pbnQ+KSB7XG5cbiAgICBpZiAocHJvamVjdGVkUXVlcnlHZW9tZXRyeS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRm9yIHBvaW50IHF1ZXJpZXMgY2FsY3VsYXRlIHRoZSB6IGF0IHdoaWNoIHRoZSBwb2ludCBpbnRlcnNlY3RzIHRoZSBmYWNlXG4gICAgICAgIC8vIHVzaW5nIGJhcnljZW50cmljIGNvb3JkaW5hdGVzLlxuXG4gICAgICAgIC8vIEZpbmQgdGhlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG9mIHRoZSBwcm9qZWN0ZWQgcG9pbnQgd2l0aGluIHRoZSBmaXJzdFxuICAgICAgICAvLyB0cmlhbmdsZSBvZiB0aGUgZmFjZSwgdXNpbmcgb25seSB0aGUgeHkgcGxhbmUuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZVxuICAgICAgICAvLyBwb2ludCBpcyBvdXRzaWRlIHRoZSBmaXJzdCB0cmlhbmdsZSBiZWNhdXNlIGFsbCB0aGUgdHJpYW5nbGVzIGluIHRoZSBmYWNlXG4gICAgICAgIC8vIGFyZSBpbiB0aGUgc2FtZSBwbGFuZS5cbiAgICAgICAgY29uc3QgYSA9IHByb2plY3RlZEZhY2VbMF07XG4gICAgICAgIGNvbnN0IGIgPSBwcm9qZWN0ZWRGYWNlWzFdO1xuICAgICAgICBjb25zdCBjID0gcHJvamVjdGVkRmFjZVszXTtcbiAgICAgICAgY29uc3QgcCA9IHByb2plY3RlZFF1ZXJ5R2VvbWV0cnlbMF07XG5cbiAgICAgICAgY29uc3QgYWIgPSBiLnN1YihhKTtcbiAgICAgICAgY29uc3QgYWMgPSBjLnN1YihhKTtcbiAgICAgICAgY29uc3QgYXAgPSBwLnN1YihhKTtcblxuICAgICAgICBjb25zdCBkb3RBQkFCID0gZG90KGFiLCBhYik7XG4gICAgICAgIGNvbnN0IGRvdEFCQUMgPSBkb3QoYWIsIGFjKTtcbiAgICAgICAgY29uc3QgZG90QUNBQyA9IGRvdChhYywgYWMpO1xuICAgICAgICBjb25zdCBkb3RBUEFCID0gZG90KGFwLCBhYik7XG4gICAgICAgIGNvbnN0IGRvdEFQQUMgPSBkb3QoYXAsIGFjKTtcbiAgICAgICAgY29uc3QgZGVub20gPSBkb3RBQkFCICogZG90QUNBQyAtIGRvdEFCQUMgKiBkb3RBQkFDO1xuICAgICAgICBjb25zdCB2ID0gKGRvdEFDQUMgKiBkb3RBUEFCIC0gZG90QUJBQyAqIGRvdEFQQUMpIC8gZGVub207XG4gICAgICAgIGNvbnN0IHcgPSAoZG90QUJBQiAqIGRvdEFQQUMgLSBkb3RBQkFDICogZG90QVBBQikgLyBkZW5vbTtcbiAgICAgICAgY29uc3QgdSA9IDEgLSB2IC0gdztcblxuICAgICAgICAvLyBVc2UgdGhlIGJhcnljZW50cmljIHdlaWdodGluZyBhbG9uZyB3aXRoIHRoZSBvcmlnaW5hbCB0cmlhbmdsZSB6IGNvb3JkaW5hdGVzIHRvIGdldCB0aGUgcG9pbnQgb2YgaW50ZXJzZWN0aW9uLlxuICAgICAgICByZXR1cm4gYS56ICogdSArIGIueiAqIHYgKyBjLnogKiB3O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGNvdW50cyBhcyBjbG9zZXN0IGlzIGxlc3MgY2xlYXIgd2hlbiB0aGUgcXVlcnkgaXMgYSBib3guIFRoaXNcbiAgICAgICAgLy8gcmV0dXJucyB0aGUgZGlzdGFuY2UgdG8gdGhlIG5lYXJlc3QgcG9pbnQgb24gdGhlIGZhY2UsIHdoZXRoZXIgaXQgaXNcbiAgICAgICAgLy8gd2l0aGluIHRoZSBxdWVyeSBvciBub3QuIEl0IGNvdWxkIGJlIG1vcmUgY29ycmVjdCB0byByZXR1cm4gdGhlXG4gICAgICAgIC8vIGRpc3RhbmNlIHRvIHRoZSBjbG9zZXN0IHBvaW50IHdpdGhpbiB0aGUgcXVlcnkgYm94IGJ1dCB0aGlzIHdvdWxkIGJlXG4gICAgICAgIC8vIG1vcmUgY29tcGxpY2F0ZWQgYW5kIGV4cGVuc2l2ZSB0byBjYWxjdWxhdGUgd2l0aCBsaXR0bGUgYmVuZWZpdC5cbiAgICAgICAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvamVjdGVkRmFjZSkge1xuICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gTWF0aC5taW4oY2xvc2VzdERpc3RhbmNlLCBwLnopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9zZXN0RGlzdGFuY2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbihwcm9qZWN0ZWRCYXNlOiBBcnJheTxQb2ludD4sIHByb2plY3RlZFRvcDogQXJyYXk8UG9pbnQ+LCBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4pIHtcbiAgICBsZXQgY2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICBpZiAocG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24ocHJvamVjdGVkUXVlcnlHZW9tZXRyeSwgcHJvamVjdGVkVG9wKSkge1xuICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBnZXRJbnRlcnNlY3Rpb25EaXN0YW5jZShwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LCBwcm9qZWN0ZWRUb3BbMF0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcHJvamVjdGVkVG9wLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGNvbnN0IHJpbmdUb3AgPSBwcm9qZWN0ZWRUb3Bbcl07XG4gICAgICAgIGNvbnN0IHJpbmdCYXNlID0gcHJvamVjdGVkQmFzZVtyXTtcbiAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCByaW5nVG9wLmxlbmd0aCAtIDE7IHArKykge1xuICAgICAgICAgICAgY29uc3QgdG9wQSA9IHJpbmdUb3BbcF07XG4gICAgICAgICAgICBjb25zdCB0b3BCID0gcmluZ1RvcFtwICsgMV07XG4gICAgICAgICAgICBjb25zdCBiYXNlQSA9IHJpbmdCYXNlW3BdO1xuICAgICAgICAgICAgY29uc3QgYmFzZUIgPSByaW5nQmFzZVtwICsgMV07XG4gICAgICAgICAgICBjb25zdCBmYWNlID0gW3RvcEEsIHRvcEIsIGJhc2VCLCBiYXNlQSwgdG9wQV07XG4gICAgICAgICAgICBpZiAocG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnksIGZhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gTWF0aC5taW4oY2xvc2VzdERpc3RhbmNlLCBnZXRJbnRlcnNlY3Rpb25EaXN0YW5jZShwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LCBmYWNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvc2VzdERpc3RhbmNlID09PSBJbmZpbml0eSA/IGZhbHNlIDogY2xvc2VzdERpc3RhbmNlO1xufVxuXG4vKlxuICogUHJvamVjdCB0aGUgZ2VvbWV0cnkgdXNpbmcgbWF0cml4IGBtYC4gVGhpcyBpcyBlc3NlbnRpYWxseSBkb2luZ1xuICogYHZlYzQudHJhbnNmb3JtTWF0NChbXSwgW3AueCwgcC55LCB6LCAxXSwgbSlgIGJ1dCB0aGUgbXVsdGlwbGljYXRpb25cbiAqIGlzIGlubGluZWQgc28gdGhhdCBwYXJ0cyBvZiB0aGUgcHJvamVjdGlvbiB0aGF0IGFyZSB0aGUgc2FtZSBhY3Jvc3NcbiAqIGRpZmZlcmVudCBwb2ludHMgY2FuIG9ubHkgYmUgZG9uZSBvbmNlLiBUaGlzIHByb2R1Y2VkIGEgbWVhc3VyYWJsZVxuICogcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHByb2plY3RFeHRydXNpb24oZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIHpCYXNlOiBudW1iZXIsIHpUb3A6IG51bWJlciwgbTogRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3QgcHJvamVjdGVkQmFzZSA9IFtdO1xuICAgIGNvbnN0IHByb2plY3RlZFRvcCA9IFtdO1xuXG4gICAgY29uc3QgYmFzZVhaID0gbVs4XSAqIHpCYXNlO1xuICAgIGNvbnN0IGJhc2VZWiA9IG1bOV0gKiB6QmFzZTtcbiAgICBjb25zdCBiYXNlWlogPSBtWzEwXSAqIHpCYXNlO1xuICAgIGNvbnN0IGJhc2VXWiA9IG1bMTFdICogekJhc2U7XG4gICAgY29uc3QgdG9wWFogPSBtWzhdICogelRvcDtcbiAgICBjb25zdCB0b3BZWiA9IG1bOV0gKiB6VG9wO1xuICAgIGNvbnN0IHRvcFpaID0gbVsxMF0gKiB6VG9wO1xuICAgIGNvbnN0IHRvcFdaID0gbVsxMV0gKiB6VG9wO1xuXG4gICAgZm9yIChjb25zdCByIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHJpbmdCYXNlID0gW107XG4gICAgICAgIGNvbnN0IHJpbmdUb3AgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHIpIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBwLng7XG4gICAgICAgICAgICBjb25zdCB5ID0gcC55O1xuXG4gICAgICAgICAgICBjb25zdCBzWCA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgICAgICAgICAgIGNvbnN0IHNZID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICAgICAgICAgICAgY29uc3Qgc1ogPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxNF07XG4gICAgICAgICAgICBjb25zdCBzVyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzE1XTtcblxuICAgICAgICAgICAgY29uc3QgYmFzZVggPSBzWCArIGJhc2VYWjtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VZID0gc1kgKyBiYXNlWVo7XG4gICAgICAgICAgICBjb25zdCBiYXNlWiA9IHNaICsgYmFzZVpaO1xuICAgICAgICAgICAgY29uc3QgYmFzZVcgPSBzVyArIGJhc2VXWjtcblxuICAgICAgICAgICAgY29uc3QgdG9wWCA9IHNYICsgdG9wWFo7XG4gICAgICAgICAgICBjb25zdCB0b3BZID0gc1kgKyB0b3BZWjtcbiAgICAgICAgICAgIGNvbnN0IHRvcFogPSBzWiArIHRvcFpaO1xuICAgICAgICAgICAgY29uc3QgdG9wVyA9IHNXICsgdG9wV1o7XG5cbiAgICAgICAgICAgIGNvbnN0IGIgPSBuZXcgUG9pbnQoYmFzZVggLyBiYXNlVywgYmFzZVkgLyBiYXNlVyk7XG4gICAgICAgICAgICBiLnogPSBiYXNlWiAvIGJhc2VXO1xuICAgICAgICAgICAgcmluZ0Jhc2UucHVzaChiKTtcblxuICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBQb2ludCh0b3BYIC8gdG9wVywgdG9wWSAvIHRvcFcpO1xuICAgICAgICAgICAgdC56ID0gdG9wWiAvIHRvcFc7XG4gICAgICAgICAgICByaW5nVG9wLnB1c2godCk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvamVjdGVkQmFzZS5wdXNoKHJpbmdCYXNlKTtcbiAgICAgICAgcHJvamVjdGVkVG9wLnB1c2gocmluZ1RvcCk7XG4gICAgfVxuICAgIHJldHVybiBbcHJvamVjdGVkQmFzZSwgcHJvamVjdGVkVG9wXTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFF1ZXJ5R2VvbWV0cnkocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LCBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5LCB0cmFuc2Zvcm06IFRyYW5zZm9ybSwgejogbnVtYmVyKSB7XG4gICAgY29uc3QgcHJvamVjdGVkUXVlcnlHZW9tZXRyeSA9IFtdO1xuICAgIGZvciAoY29uc3QgcCBvZiBxdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHYgPSBbcC54LCBwLnksIHosIDFdO1xuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQodiwgdiwgcGl4ZWxQb3NNYXRyaXgpO1xuICAgICAgICBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LnB1c2gobmV3IFBvaW50KHZbMF0gLyB2WzNdLCB2WzFdIC8gdlszXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvamVjdGVkUXVlcnlHZW9tZXRyeTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsaW5lTGF5b3V0QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc19ub3JtYWwnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfZGF0YScsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50OCd9XG5dLCA0KTtcblxuZXhwb3J0IGRlZmF1bHQgbGluZUxheW91dEF0dHJpYnV0ZXM7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBsaW5lTGF5b3V0QXR0cmlidXRlcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IExpbmVMYXlvdXRBcnJheSB9IGZyb20gJy4uL2FycmF5X3R5cGVzJztcblxuaW1wb3J0IHsgbWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9saW5lX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudCc7XG5pbXBvcnQgeyBQcm9ncmFtQ29uZmlndXJhdGlvblNldCB9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBUcmlhbmdsZUluZGV4QXJyYXkgfSBmcm9tICcuLi9pbmRleF9hcnJheV90eXBlJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZXh0ZW50JztcbmltcG9ydCBtdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5jb25zdCB2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzID0gbXZ0LlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IHtoYXNQYXR0ZXJuLCBhZGRQYXR0ZXJuRGVwZW5kZW5jaWVzfSBmcm9tICcuL3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzJztcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vbG9hZF9nZW9tZXRyeSc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcblxuaW1wb3J0IHR5cGUge1xuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRQYXJhbWV0ZXJzLFxuICAgIEJ1Y2tldEZlYXR1cmUsXG4gICAgSW5kZXhlZEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBMaW5lU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1NlZ21lbnR9IGZyb20gJy4uL3NlZ21lbnQnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcblxuLy8gTk9URSBPTiBFWFRSVURFIFNDQUxFOlxuLy8gc2NhbGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3Igc28gdGhhdCB0aGUgbm9ybWFsIGxlbmd0aCBpcyB0aGlzIHZhbHVlLlxuLy8gY29udGFpbnMgdGhlIFwidGV4dHVyZVwiIG5vcm1hbHMgKC0xLi4xKS4gdGhpcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBleHRydWRlXG4vLyBub3JtYWxzIGZvciBsaW5lIGpvaW5zLCBiZWNhdXNlIHRoZSB4LXZhbHVlIHJlbWFpbnMgMCBmb3IgdGhlIHRleHR1cmVcbi8vIG5vcm1hbCBhcnJheSwgd2hpbGUgdGhlIGV4dHJ1ZGUgbm9ybWFsIGFjdHVhbGx5IG1vdmVzIHRoZSB2ZXJ0ZXggdG8gY3JlYXRlXG4vLyB0aGUgYWN1dGUvYmV2ZWxsZWQgbGluZSBqb2luLlxuY29uc3QgRVhUUlVERV9TQ0FMRSA9IDYzO1xuXG4vKlxuICogU2hhcnAgY29ybmVycyBjYXVzZSBkYXNoZWQgbGluZXMgdG8gdGlsdCBiZWNhdXNlIHRoZSBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZVxuICogaXMgdGhlIHNhbWUgYXQgYm90aCB0aGUgaW5uZXIgYW5kIG91dGVyIGNvcm5lcnMuIFRvIGltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2ZcbiAqIGRhc2hlZCBsaW5lcyB3ZSBhZGQgZXh0cmEgcG9pbnRzIG5lYXIgc2hhcnAgY29ybmVycyBzbyB0aGF0IGEgc21hbGxlciBwYXJ0XG4gKiBvZiB0aGUgbGluZSBpcyB0aWx0ZWQuXG4gKlxuICogQ09TX0hBTEZfU0hBUlBfQ09STkVSIGNvbnRyb2xzIGhvdyBzaGFycCBhIGNvcm5lciBoYXMgdG8gYmUgZm9yIHVzIHRvIGFkZCBhblxuICogZXh0cmEgdmVydGV4LiBUaGUgZGVmYXVsdCBpcyA3NSBkZWdyZWVzLlxuICpcbiAqIFRoZSBuZXdseSBjcmVhdGVkIHZlcnRpY2VzIGFyZSBwbGFjZWQgU0hBUlBfQ09STkVSX09GRlNFVCBwaXhlbHMgZnJvbSB0aGUgY29ybmVyLlxuICovXG5jb25zdCBDT1NfSEFMRl9TSEFSUF9DT1JORVIgPSBNYXRoLmNvcyg3NSAvIDIgKiAoTWF0aC5QSSAvIDE4MCkpO1xuY29uc3QgU0hBUlBfQ09STkVSX09GRlNFVCA9IDE1O1xuXG4vLyBBbmdsZSBwZXIgdHJpYW5nbGUgZm9yIGFwcHJveGltYXRpbmcgcm91bmQgbGluZSBqb2lucy5cbmNvbnN0IERFR19QRVJfVFJJQU5HTEUgPSAyMDtcblxuLy8gVGhlIG51bWJlciBvZiBiaXRzIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbGluZSBkaXN0YW5jZSBpbiB0aGUgYnVmZmVyLlxuY29uc3QgTElORV9ESVNUQU5DRV9CVUZGRVJfQklUUyA9IDE1O1xuXG4vLyBXZSBkb24ndCBoYXZlIGVub3VnaCBiaXRzIGZvciB0aGUgbGluZSBkaXN0YW5jZSBhcyB3ZSdkIGxpa2UgdG8gaGF2ZSwgc29cbi8vIHVzZSB0aGlzIHZhbHVlIHRvIHNjYWxlIHRoZSBsaW5lIGRpc3RhbmNlIChpbiB0aWxlIHVuaXRzKSBkb3duIHRvIGEgc21hbGxlclxuLy8gdmFsdWUuIFRoaXMgbGV0cyB1cyBzdG9yZSBsb25nZXIgZGlzdGFuY2VzIHdoaWxlIHNhY3JpZmljaW5nIHByZWNpc2lvbi5cbmNvbnN0IExJTkVfRElTVEFOQ0VfU0NBTEUgPSAxIC8gMjtcblxuLy8gVGhlIG1heGltdW0gbGluZSBkaXN0YW5jZSwgaW4gdGlsZSB1bml0cywgdGhhdCBmaXRzIGluIHRoZSBidWZmZXIuXG5jb25zdCBNQVhfTElORV9ESVNUQU5DRSA9IE1hdGgucG93KDIsIExJTkVfRElTVEFOQ0VfQlVGRkVSX0JJVFMgLSAxKSAvIExJTkVfRElTVEFOQ0VfU0NBTEU7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTGluZUJ1Y2tldCBpbXBsZW1lbnRzIEJ1Y2tldCB7XG4gICAgZGlzdGFuY2U6IG51bWJlcjtcbiAgICB0b3RhbERpc3RhbmNlOiBudW1iZXI7XG4gICAgc2NhbGVkRGlzdGFuY2U6IG51bWJlcjtcbiAgICBjbGlwU3RhcnQ6IG51bWJlcjtcbiAgICBjbGlwRW5kOiBudW1iZXI7XG5cbiAgICBlMTogbnVtYmVyO1xuICAgIGUyOiBudW1iZXI7XG5cbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVyczogQXJyYXk8TGluZVN0eWxlTGF5ZXI+O1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxhbnk+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgcGF0dGVybkZlYXR1cmVzOiBBcnJheTxCdWNrZXRGZWF0dXJlPjtcblxuICAgIGxheW91dFZlcnRleEFycmF5OiBMaW5lTGF5b3V0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBpbmRleEFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXk7XG4gICAgaW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuXG4gICAgaGFzUGF0dGVybjogYm9vbGVhbjtcbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbnM6IFByb2dyYW1Db25maWd1cmF0aW9uU2V0PExpbmVTdHlsZUxheWVyPjtcbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICB1cGxvYWRlZDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJ1Y2tldFBhcmFtZXRlcnM8TGluZVN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG9wdGlvbnMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0aW9ucy5sYXllcnM7XG4gICAgICAgIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAobGF5ZXIgPT4gbGF5ZXIuaWQpO1xuICAgICAgICB0aGlzLmluZGV4ID0gb3B0aW9ucy5pbmRleDtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGF0dGVybkZlYXR1cmVzID0gW107XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBMaW5lTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChsYXlvdXRBdHRyaWJ1dGVzLCBvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKChsKSA9PiBsLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKChsKSA9PiBsLmlkKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gaGFzUGF0dGVybignbGluZScsIHRoaXMubGF5ZXJzLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGluZVNvcnRLZXkgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQuZ2V0KCdsaW5lLXNvcnQta2V5Jyk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmVzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9IG9mIGZlYXR1cmVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20pLCBmZWF0dXJlKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuICAgICAgICAgICAgY29uc3Qgc29ydEtleSA9IGxpbmVTb3J0S2V5ID9cbiAgICAgICAgICAgICAgICBsaW5lU29ydEtleS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkgOlxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZTogQnVja2V0RmVhdHVyZSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgICAgIHNvcnRLZXlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnB1c2goYnVja2V0RmVhdHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZVNvcnRLZXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBhLnNvcnRLZXkgaXMgYWx3YXlzIGEgbnVtYmVyIHdoZW4gaW4gdXNlXG4gICAgICAgICAgICAgICAgcmV0dXJuICgoYS5zb3J0S2V5OiBhbnkpOiBudW1iZXIpIC0gKChiLnNvcnRLZXk6IGFueSk6IG51bWJlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYnVja2V0RmVhdHVyZSBvZiBidWNrZXRGZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3Qge2dlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gPSBidWNrZXRGZWF0dXJlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybkJ1Y2tldEZlYXR1cmUgPSBhZGRQYXR0ZXJuRGVwZW5kZW5jaWVzKCdsaW5lJywgdGhpcy5sYXllcnMsIGJ1Y2tldEZlYXR1cmUsIHRoaXMuem9vbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgLy8gcGF0dGVybiBmZWF0dXJlcyBhcmUgYWRkZWQgb25seSBvbmNlIHRoZSBwYXR0ZXJuIGlzIGxvYWRlZCBpbnRvIHRoZSBpbWFnZSBhdGxhc1xuICAgICAgICAgICAgICAgIC8vIHNvIGFyZSBzdG9yZWQgZHVyaW5nIHBvcHVsYXRlIHVudGlsIGxhdGVyIHVwZGF0ZWQgd2l0aCBwb3NpdGlvbnMgYnkgdGlsZSB3b3JrZXIgaW4gYWRkRmVhdHVyZXNcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcy5wdXNoKHBhdHRlcm5CdWNrZXRGZWF0dXJlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwge30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXNbaW5kZXhdLmZlYXR1cmU7XG4gICAgICAgICAgICBvcHRpb25zLmZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhzdGF0ZXMsIHZ0TGF5ZXIsIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBhZGRGZWF0dXJlcyhvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiB0aGlzLnBhdHRlcm5GZWF0dXJlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGZlYXR1cmUuZ2VvbWV0cnksIGZlYXR1cmUuaW5kZXgsIGltYWdlUG9zaXRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICB1cGxvYWRQZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQ7XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBhZGRGZWF0dXJlKGZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBpbmRleDogbnVtYmVyLCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQ7XG4gICAgICAgIGNvbnN0IGpvaW4gPSBsYXlvdXQuZ2V0KCdsaW5lLWpvaW4nKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgICAgIGNvbnN0IGNhcCA9IGxheW91dC5nZXQoJ2xpbmUtY2FwJyk7XG4gICAgICAgIGNvbnN0IG1pdGVyTGltaXQgPSBsYXlvdXQuZ2V0KCdsaW5lLW1pdGVyLWxpbWl0Jyk7XG4gICAgICAgIGNvbnN0IHJvdW5kTGltaXQgPSBsYXlvdXQuZ2V0KCdsaW5lLXJvdW5kLWxpbWl0Jyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZExpbmUobGluZSwgZmVhdHVyZSwgam9pbiwgY2FwLCBtaXRlckxpbWl0LCByb3VuZExpbWl0LCBpbmRleCwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkTGluZSh2ZXJ0aWNlczogQXJyYXk8UG9pbnQ+LCBmZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCBqb2luOiBzdHJpbmcsIGNhcDogc3RyaW5nLCBtaXRlckxpbWl0OiBudW1iZXIsIHJvdW5kTGltaXQ6IG51bWJlciwgaW5kZXg6IG51bWJlciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgdGhpcy5kaXN0YW5jZSA9IDA7XG4gICAgICAgIHRoaXMuc2NhbGVkRGlzdGFuY2UgPSAwO1xuICAgICAgICB0aGlzLnRvdGFsRGlzdGFuY2UgPSAwO1xuXG4gICAgICAgIGlmICghIWZlYXR1cmUucHJvcGVydGllcyAmJlxuICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KCdtYXBib3hfY2xpcF9zdGFydCcpICYmXG4gICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoJ21hcGJveF9jbGlwX2VuZCcpKSB7XG5cbiAgICAgICAgICAgIHRoaXMuY2xpcFN0YXJ0ID0gK2ZlYXR1cmUucHJvcGVydGllc1snbWFwYm94X2NsaXBfc3RhcnQnXTtcbiAgICAgICAgICAgIHRoaXMuY2xpcEVuZCA9ICtmZWF0dXJlLnByb3BlcnRpZXNbJ21hcGJveF9jbGlwX2VuZCddO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIGRpc3RhbmNlLCBpbiB0aWxlIHVuaXRzLCBvZiB0aGlzIHRpbGVkIGxpbmUgZmVhdHVyZVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsRGlzdGFuY2UgKz0gdmVydGljZXNbaV0uZGlzdCh2ZXJ0aWNlc1tpICsgMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNQb2x5Z29uID0gdmVjdG9yVGlsZUZlYXR1cmVUeXBlc1tmZWF0dXJlLnR5cGVdID09PSAnUG9seWdvbic7XG5cbiAgICAgICAgLy8gSWYgdGhlIGxpbmUgaGFzIGR1cGxpY2F0ZSB2ZXJ0aWNlcyBhdCB0aGUgZW5kcywgYWRqdXN0IHN0YXJ0L2xlbmd0aCB0byByZW1vdmUgdGhlbS5cbiAgICAgICAgbGV0IGxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGxlbiA+PSAyICYmIHZlcnRpY2VzW2xlbiAtIDFdLmVxdWFscyh2ZXJ0aWNlc1tsZW4gLSAyXSkpIHtcbiAgICAgICAgICAgIGxlbi0tO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaXJzdCA9IDA7XG4gICAgICAgIHdoaWxlIChmaXJzdCA8IGxlbiAtIDEgJiYgdmVydGljZXNbZmlyc3RdLmVxdWFscyh2ZXJ0aWNlc1tmaXJzdCArIDFdKSkge1xuICAgICAgICAgICAgZmlyc3QrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIGdlb21ldHJ5LlxuICAgICAgICBpZiAobGVuIDwgKGlzUG9seWdvbiA/IDMgOiAyKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChqb2luID09PSAnYmV2ZWwnKSBtaXRlckxpbWl0ID0gMS4wNTtcblxuICAgICAgICBjb25zdCBzaGFycENvcm5lck9mZnNldCA9IFNIQVJQX0NPUk5FUl9PRkZTRVQgKiAoRVhURU5UIC8gKDUxMiAqIHRoaXMub3ZlcnNjYWxpbmcpKTtcblxuICAgICAgICAvLyB3ZSBjb3VsZCBiZSBtb3JlIHByZWNpc2UsIGJ1dCBpdCB3b3VsZCBvbmx5IHNhdmUgYSBuZWdsaWdpYmxlIGFtb3VudCBvZiBzcGFjZVxuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChsZW4gKiAxMCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcblxuICAgICAgICBsZXQgY3VycmVudFZlcnRleDtcbiAgICAgICAgbGV0IHByZXZWZXJ0ZXggPSAoKHVuZGVmaW5lZDogYW55KTogUG9pbnQpO1xuICAgICAgICBsZXQgbmV4dFZlcnRleCA9ICgodW5kZWZpbmVkOiBhbnkpOiBQb2ludCk7XG4gICAgICAgIGxldCBwcmV2Tm9ybWFsID0gKCh1bmRlZmluZWQ6IGFueSk6IFBvaW50KTtcbiAgICAgICAgbGV0IG5leHROb3JtYWwgPSAoKHVuZGVmaW5lZDogYW55KTogUG9pbnQpO1xuXG4gICAgICAgIC8vIHRoZSBsYXN0IHR3byB2ZXJ0aWNlcyBhZGRlZFxuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IC0xO1xuXG4gICAgICAgIGlmIChpc1BvbHlnb24pIHtcbiAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tsZW4gLSAyXTtcbiAgICAgICAgICAgIG5leHROb3JtYWwgPSB2ZXJ0aWNlc1tmaXJzdF0uc3ViKGN1cnJlbnRWZXJ0ZXgpLl91bml0KCkuX3BlcnAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7XG5cbiAgICAgICAgICAgIG5leHRWZXJ0ZXggPSBpc1BvbHlnb24gJiYgaSA9PT0gbGVuIC0gMSA/XG4gICAgICAgICAgICAgICAgdmVydGljZXNbZmlyc3QgKyAxXSA6IC8vIGlmIHRoZSBsaW5lIGlzIGNsb3NlZCwgd2UgdHJlYXQgdGhlIGxhc3QgdmVydGV4IGxpa2UgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgdmVydGljZXNbaSArIDFdOyAvLyBqdXN0IHRoZSBuZXh0IHZlcnRleFxuXG4gICAgICAgICAgICAvLyBpZiB0d28gY29uc2VjdXRpdmUgdmVydGljZXMgZXhpc3QsIHNraXAgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgICAgICBpZiAobmV4dFZlcnRleCAmJiB2ZXJ0aWNlc1tpXS5lcXVhbHMobmV4dFZlcnRleCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAobmV4dE5vcm1hbCkgcHJldk5vcm1hbCA9IG5leHROb3JtYWw7XG4gICAgICAgICAgICBpZiAoY3VycmVudFZlcnRleCkgcHJldlZlcnRleCA9IGN1cnJlbnRWZXJ0ZXg7XG5cbiAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBub3JtYWwgdG93YXJkcyB0aGUgbmV4dCB2ZXJ0ZXggaW4gdGhpcyBsaW5lLiBJbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBuZXh0IHZlcnRleCwgcHJldGVuZCB0aGF0IHRoZSBsaW5lIGlzIGNvbnRpbnVpbmcgc3RyYWlnaHQsXG4gICAgICAgICAgICAvLyBtZWFuaW5nIHRoYXQgd2UgYXJlIGp1c3QgdXNpbmcgdGhlIHByZXZpb3VzIG5vcm1hbC5cbiAgICAgICAgICAgIG5leHROb3JtYWwgPSBuZXh0VmVydGV4ID8gbmV4dFZlcnRleC5zdWIoY3VycmVudFZlcnRleCkuX3VuaXQoKS5fcGVycCgpIDogcHJldk5vcm1hbDtcblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIG5vcm1hbCwgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGFcbiAgICAgICAgICAgIC8vIG5vbi1jbG9zZWQgbGluZSwgc28gd2UncmUgZG9pbmcgYSBzdHJhaWdodCBcImpvaW5cIi5cbiAgICAgICAgICAgIHByZXZOb3JtYWwgPSBwcmV2Tm9ybWFsIHx8IG5leHROb3JtYWw7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgbm9ybWFsIG9mIHRoZSBqb2luIGV4dHJ1c2lvbi4gSXQgaXMgdGhlIGFuZ2xlIGJpc2VjdG9yXG4gICAgICAgICAgICAvLyBvZiB0aGUgc2VnbWVudHMgYmV0d2VlbiB0aGUgcHJldmlvdXMgbGluZSBhbmQgdGhlIG5leHQgbGluZS5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIDE4MMOCwrAgYW5nbGVzLCB0aGUgcHJldiBhbmQgbmV4dCBub3JtYWxzIGNhbmNlbCBlYWNoIG90aGVyIG91dDpcbiAgICAgICAgICAgIC8vIHByZXZOb3JtYWwgKyBuZXh0Tm9ybWFsID0gKDAsIDApLCBpdHMgbWFnbml0dWRlIGlzIDAsIHNvIHRoZSB1bml0IHZlY3RvciB3b3VsZCBiZVxuICAgICAgICAgICAgLy8gdW5kZWZpbmVkLiBJbiB0aGF0IGNhc2UsIHdlJ3JlIGtlZXBpbmcgdGhlIGpvaW5Ob3JtYWwgYXQgKDAsIDApLCBzbyB0aGF0IHRoZSBjb3NIYWxmQW5nbGVcbiAgICAgICAgICAgIC8vIGJlbG93IHdpbGwgYWxzbyBiZWNvbWUgMCBhbmQgbWl0ZXJMZW5ndGggd2lsbCBiZWNvbWUgSW5maW5pdHkuXG4gICAgICAgICAgICBsZXQgam9pbk5vcm1hbCA9IHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpO1xuICAgICAgICAgICAgaWYgKGpvaW5Ob3JtYWwueCAhPT0gMCB8fCBqb2luTm9ybWFsLnkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBqb2luTm9ybWFsLl91bml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiAgam9pbk5vcm1hbCAgICAgcHJldk5vcm1hbFxuICAgICAgICAgICAgICogICAgICAgICAgICAgw6LChsKWICAgICAgw6LChsKRXG4gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAuX19fX19fX18uIHByZXZWZXJ0ZXhcbiAgICAgICAgICAgICAqICAgICAgICAgICAgICAgIHxcbiAgICAgICAgICAgICAqIG5leHROb3JtYWwgIMOiwobCkCAgfCAgY3VycmVudFZlcnRleFxuICAgICAgICAgICAgICogICAgICAgICAgICAgICAgfFxuICAgICAgICAgICAgICogICAgIG5leHRWZXJ0ZXggIVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgY29zaW5lcyBvZiB0aGUgYW5nbGUgKGFuZCBpdHMgaGFsZikgdXNpbmcgZG90IHByb2R1Y3RcbiAgICAgICAgICAgIGNvbnN0IGNvc0FuZ2xlID0gcHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC54ICsgcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC55O1xuICAgICAgICAgICAgY29uc3QgY29zSGFsZkFuZ2xlID0gam9pbk5vcm1hbC54ICogbmV4dE5vcm1hbC54ICsgam9pbk5vcm1hbC55ICogbmV4dE5vcm1hbC55O1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWl0ZXIgKHRoZSByYXRpbyBvZiB0aGUgbWl0ZXIgdG8gdGhlIHdpZHRoKVxuICAgICAgICAgICAgLy8gYXMgdGhlIGludmVyc2Ugb2YgY29zaW5lIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIG5leHQgYW5kIGpvaW4gbm9ybWFsc1xuICAgICAgICAgICAgY29uc3QgbWl0ZXJMZW5ndGggPSBjb3NIYWxmQW5nbGUgIT09IDAgPyAxIC8gY29zSGFsZkFuZ2xlIDogSW5maW5pdHk7XG5cbiAgICAgICAgICAgIC8vIGFwcHJveGltYXRlIGFuZ2xlIGZyb20gY29zaW5lXG4gICAgICAgICAgICBjb25zdCBhcHByb3hBbmdsZSA9IDIgKiBNYXRoLnNxcnQoMiAtIDIgKiBjb3NIYWxmQW5nbGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc1NoYXJwQ29ybmVyID0gY29zSGFsZkFuZ2xlIDwgQ09TX0hBTEZfU0hBUlBfQ09STkVSICYmIHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVUdXJuc0xlZnQgPSBwcmV2Tm9ybWFsLnggKiBuZXh0Tm9ybWFsLnkgLSBwcmV2Tm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnggPiAwO1xuXG4gICAgICAgICAgICBpZiAoaXNTaGFycENvcm5lciAmJiBpID4gZmlyc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2U2VnbWVudExlbmd0aCA9IGN1cnJlbnRWZXJ0ZXguZGlzdChwcmV2VmVydGV4KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldlNlZ21lbnRMZW5ndGggPiAyICogc2hhcnBDb3JuZXJPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UHJldlZlcnRleCA9IGN1cnJlbnRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXguc3ViKHByZXZWZXJ0ZXgpLl9tdWx0KHNoYXJwQ29ybmVyT2Zmc2V0IC8gcHJldlNlZ21lbnRMZW5ndGgpLl9yb3VuZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZShwcmV2VmVydGV4LCBuZXdQcmV2VmVydGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KG5ld1ByZXZWZXJ0ZXgsIHByZXZOb3JtYWwsIDAsIDAsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2VmVydGV4ID0gbmV3UHJldlZlcnRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRoZSBqb2luIGlmIGEgbWlkZGxlIHZlcnRleCwgb3RoZXJ3aXNlIHRoZSBjYXAuXG4gICAgICAgICAgICBjb25zdCBtaWRkbGVWZXJ0ZXggPSBwcmV2VmVydGV4ICYmIG5leHRWZXJ0ZXg7XG4gICAgICAgICAgICBsZXQgY3VycmVudEpvaW4gPSBtaWRkbGVWZXJ0ZXggPyBqb2luIDogaXNQb2x5Z29uID8gJ2J1dHQnIDogY2FwO1xuXG4gICAgICAgICAgICBpZiAobWlkZGxlVmVydGV4ICYmIGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoIDwgcm91bmRMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdtaXRlcic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaXRlckxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ2Zha2Vyb3VuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicgJiYgbWl0ZXJMZW5ndGggPiBtaXRlckxpbWl0KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnYmV2ZWwnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbWF4aW11bSBleHRydWRlIGxlbmd0aCBpcyAxMjggLyA2MyA9IDIgdGltZXMgdGhlIHdpZHRoIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgLy8gc28gaWYgbWl0ZXJMZW5ndGggPj0gMiB3ZSBuZWVkIHRvIGRyYXcgYSBkaWZmZXJlbnQgdHlwZSBvZiBiZXZlbCBoZXJlLlxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA+IDIpIGN1cnJlbnRKb2luID0gJ2ZsaXBiZXZlbCc7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbWl0ZXJMZW5ndGggaXMgcmVhbGx5IHNtYWxsIGFuZCB0aGUgbGluZSBiZXZlbCB3b3VsZG4ndCBiZSB2aXNpYmxlLFxuICAgICAgICAgICAgICAgIC8vIGp1c3QgZHJhdyBhIG1pdGVyIGpvaW4gdG8gc2F2ZSBhIHRyaWFuZ2xlLlxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IG1pdGVyTGltaXQpIGN1cnJlbnRKb2luID0gJ21pdGVyJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBmYXIgYWxvbmcgdGhlIGxpbmUgdGhlIGN1cnJlbnRWZXJ0ZXggaXNcbiAgICAgICAgICAgIGlmIChwcmV2VmVydGV4KSB0aGlzLnVwZGF0ZURpc3RhbmNlKHByZXZWZXJ0ZXgsIGN1cnJlbnRWZXJ0ZXgpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicpIHtcblxuICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX211bHQobWl0ZXJMZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBqb2luTm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2ZsaXBiZXZlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBtaXRlciBpcyB0b28gYmlnLCBmbGlwIHRoZSBkaXJlY3Rpb24gdG8gbWFrZSBhIGJldmVsZWQgam9pblxuXG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbW9zdCBwYXJhbGxlbCBsaW5lc1xuICAgICAgICAgICAgICAgICAgICBqb2luTm9ybWFsID0gbmV4dE5vcm1hbC5tdWx0KC0xKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJldmVsTGVuZ3RoID0gbWl0ZXJMZW5ndGggKiBwcmV2Tm9ybWFsLmFkZChuZXh0Tm9ybWFsKS5tYWcoKSAvIHByZXZOb3JtYWwuc3ViKG5leHROb3JtYWwpLm1hZygpO1xuICAgICAgICAgICAgICAgICAgICBqb2luTm9ybWFsLl9wZXJwKCkuX211bHQoYmV2ZWxMZW5ndGggKiAobGluZVR1cm5zTGVmdCA/IC0xIDogMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGpvaW5Ob3JtYWwubXVsdCgtMSksIDAsIDAsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnYmV2ZWwnIHx8IGN1cnJlbnRKb2luID09PSAnZmFrZXJvdW5kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IC1NYXRoLnNxcnQobWl0ZXJMZW5ndGggKiBtaXRlckxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldEEgPSBsaW5lVHVybnNMZWZ0ID8gb2Zmc2V0IDogMDtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRCID0gbGluZVR1cm5zTGVmdCA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYSBiZXZlbFxuICAgICAgICAgICAgICAgIGlmIChwcmV2VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBwcmV2Tm9ybWFsLCBvZmZzZXRBLCBvZmZzZXRCLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdmYWtlcm91bmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBqb2luIGFuZ2xlIGlzIHNoYXJwIGVub3VnaCB0aGF0IGEgcm91bmQgam9pbiB3b3VsZCBiZSB2aXNpYmxlLlxuICAgICAgICAgICAgICAgICAgICAvLyBCZXZlbCBqb2lucyBmaWxsIHRoZSBnYXAgYmV0d2VlbiBzZWdtZW50cyB3aXRoIGEgc2luZ2xlIHBpZSBzbGljZSB0cmlhbmdsZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcm91bmQgam9pbiBieSBhZGRpbmcgbXVsdGlwbGUgcGllIHNsaWNlcy4gVGhlIGpvaW4gaXNuJ3QgYWN0dWFsbHkgcm91bmQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBsb29rcyBsaWtlIGl0IGlzIGF0IHRoZSBzaXplcyB3ZSByZW5kZXIgbGluZXMgYXQuXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGljayB0aGUgbnVtYmVyIG9mIHRyaWFuZ2xlcyBmb3IgYXBwcm94aW1hdGluZyByb3VuZCBqb2luIGJ5IGJhc2VkIG9uIHRoZSBhbmdsZSBiZXR3ZWVuIG5vcm1hbHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IE1hdGgucm91bmQoKGFwcHJveEFuZ2xlICogMTgwIC8gTWF0aC5QSSkgLyBERUdfUEVSX1RSSUFOR0xFKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtID0gMTsgbSA8IG47IG0rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBtIC8gbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9PSAwLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHByb3hpbWF0ZSBzcGhlcmljYWwgaW50ZXJwb2xhdGlvbiBodHRwczovL29ic2VydmFibGVocS5jb20vQG1vdXJuZXIvYXBwcm94aW1hdGluZy1nZW9tZXRyaWMtc2xlcnBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0MiA9IHQgLSAwLjU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQSA9IDEuMDkwNCArIGNvc0FuZ2xlICogKC0zLjI0NTIgKyBjb3NBbmdsZSAqICgzLjU1NjQ1IC0gY29zQW5nbGUgKiAxLjQzNTE5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQiA9IDAuODQ4MDEzICsgY29zQW5nbGUgKiAoLTEuMDYwMjEgKyBjb3NBbmdsZSAqIDAuMjE1NjM4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArIHQgKiB0MiAqICh0IC0gMSkgKiAoQSAqIHQyICogdDIgKyBCKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJ1ZGUgPSBuZXh0Tm9ybWFsLnN1YihwcmV2Tm9ybWFsKS5fbXVsdCh0KS5fYWRkKHByZXZOb3JtYWwpLl91bml0KCkuX211bHQobGluZVR1cm5zTGVmdCA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEhhbGZWZXJ0ZXgoY3VycmVudFZlcnRleCwgZXh0cnVkZS54LCBleHRydWRlLnksIGZhbHNlLCBsaW5lVHVybnNMZWZ0LCAwLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgbmV4dE5vcm1hbCwgLW9mZnNldEEsIC1vZmZzZXRCLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdidXR0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBqb2luTm9ybWFsLCAwLCAwLCBzZWdtZW50KTsgLy8gYnV0dCBjYXBcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBwcmV2VmVydGV4ID8gMSA6IC0xOyAvLyBjbG9zaW5nIG9yIHN0YXJ0aW5nIHNxdWFyZSBjYXBcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbCwgb2Zmc2V0LCBvZmZzZXQsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocHJldlZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYnV0dFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgcHJldk5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHJvdW5kIGNhcCBvciBsaW5lam9pbiBhdCBlbmQgb2Ygc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgcHJldk5vcm1hbCwgMSwgMSwgc2VnbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCByb3VuZCBjYXAgYmVmb3JlIGZpcnN0IHNlZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIG5leHROb3JtYWwsIC0xLCAtMSwgc2VnbWVudCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBuZXh0Tm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1NoYXJwQ29ybmVyICYmIGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNlZ21lbnRMZW5ndGggPSBjdXJyZW50VmVydGV4LmRpc3QobmV4dFZlcnRleCk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRTZWdtZW50TGVuZ3RoID4gMiAqIHNoYXJwQ29ybmVyT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0N1cnJlbnRWZXJ0ZXggPSBjdXJyZW50VmVydGV4LmFkZChuZXh0VmVydGV4LnN1YihjdXJyZW50VmVydGV4KS5fbXVsdChzaGFycENvcm5lck9mZnNldCAvIG5leHRTZWdtZW50TGVuZ3RoKS5fcm91bmQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzdGFuY2UoY3VycmVudFZlcnRleCwgbmV3Q3VycmVudFZlcnRleCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChuZXdDdXJyZW50VmVydGV4LCBuZXh0Tm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFZlcnRleCA9IG5ld0N1cnJlbnRWZXJ0ZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgZmVhdHVyZSwgaW5kZXgsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHdvIHZlcnRpY2VzIHRvIHRoZSBidWZmZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHAgdGhlIGxpbmUgdmVydGV4IHRvIGFkZCBidWZmZXIgdmVydGljZXMgZm9yXG4gICAgICogQHBhcmFtIG5vcm1hbCB2ZXJ0ZXggbm9ybWFsXG4gICAgICogQHBhcmFtIGVuZExlZnQgZXh0cnVkZSB0byBzaGlmdCB0aGUgbGVmdCB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmVcbiAgICAgKiBAcGFyYW0gZW5kUmlnaHQgZXh0cnVkZSB0byBzaGlmdCB0aGUgbGVmdCB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmVcbiAgICAgKiBAcGFyYW0gc2VnbWVudCB0aGUgc2VnbWVudCBvYmplY3QgdG8gYWRkIHRoZSB2ZXJ0ZXggdG9cbiAgICAgKiBAcGFyYW0gcm91bmQgd2hldGhlciB0aGlzIGlzIGEgcm91bmQgY2FwXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRDdXJyZW50VmVydGV4KHA6IFBvaW50LCBub3JtYWw6IFBvaW50LCBlbmRMZWZ0OiBudW1iZXIsIGVuZFJpZ2h0OiBudW1iZXIsIHNlZ21lbnQ6IFNlZ21lbnQsIHJvdW5kOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgLy8gbGVmdCBhbmQgcmlnaHQgZXh0cnVkZSB2ZWN0b3JzLCBwZXJwZW5kaWN1bGFybHkgc2hpZnRlZCBieSBlbmRMZWZ0L2VuZFJpZ2h0XG4gICAgICAgIGNvbnN0IGxlZnRYID0gbm9ybWFsLnggKyBub3JtYWwueSAqIGVuZExlZnQ7XG4gICAgICAgIGNvbnN0IGxlZnRZID0gbm9ybWFsLnkgLSBub3JtYWwueCAqIGVuZExlZnQ7XG4gICAgICAgIGNvbnN0IHJpZ2h0WCA9IC1ub3JtYWwueCArIG5vcm1hbC55ICogZW5kUmlnaHQ7XG4gICAgICAgIGNvbnN0IHJpZ2h0WSA9IC1ub3JtYWwueSAtIG5vcm1hbC54ICogZW5kUmlnaHQ7XG5cbiAgICAgICAgdGhpcy5hZGRIYWxmVmVydGV4KHAsIGxlZnRYLCBsZWZ0WSwgcm91bmQsIGZhbHNlLCBlbmRMZWZ0LCBzZWdtZW50KTtcbiAgICAgICAgdGhpcy5hZGRIYWxmVmVydGV4KHAsIHJpZ2h0WCwgcmlnaHRZLCByb3VuZCwgdHJ1ZSwgLWVuZFJpZ2h0LCBzZWdtZW50KTtcblxuICAgICAgICAvLyBUaGVyZSBpcyBhIG1heGltdW0gXCJkaXN0YW5jZSBhbG9uZyB0aGUgbGluZVwiIHRoYXQgd2UgY2FuIHN0b3JlIGluIHRoZSBidWZmZXJzLlxuICAgICAgICAvLyBXaGVuIHdlIGdldCBjbG9zZSB0byB0aGUgZGlzdGFuY2UsIHJlc2V0IGl0IHRvIHplcm8gYW5kIGFkZCB0aGUgdmVydGV4IGFnYWluIHdpdGhcbiAgICAgICAgLy8gYSBkaXN0YW5jZSBvZiB6ZXJvLiBUaGUgbWF4IGRpc3RhbmNlIGlzIGRldGVybWluZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzIHdlIGFsbG9jYXRlXG4gICAgICAgIC8vIHRvIGBsaW5lc29mYXJgLlxuICAgICAgICBpZiAodGhpcy5kaXN0YW5jZSA+IE1BWF9MSU5FX0RJU1RBTkNFIC8gMiAmJiB0aGlzLnRvdGFsRGlzdGFuY2UgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzdGFuY2UgPSAwO1xuICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KHAsIG5vcm1hbCwgZW5kTGVmdCwgZW5kUmlnaHQsIHNlZ21lbnQsIHJvdW5kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEhhbGZWZXJ0ZXgoe3gsIHl9OiBQb2ludCwgZXh0cnVkZVg6IG51bWJlciwgZXh0cnVkZVk6IG51bWJlciwgcm91bmQ6IGJvb2xlYW4sIHVwOiBib29sZWFuLCBkaXI6IG51bWJlciwgc2VnbWVudDogU2VnbWVudCkge1xuICAgICAgICAvLyBzY2FsZSBkb3duIHNvIHRoYXQgd2UgY2FuIHN0b3JlIGxvbmdlciBkaXN0YW5jZXMgd2hpbGUgc2FjcmlmaWNpbmcgcHJlY2lzaW9uLlxuICAgICAgICBjb25zdCBsaW5lc29mYXIgPSB0aGlzLnNjYWxlZERpc3RhbmNlICogTElORV9ESVNUQU5DRV9TQ0FMRTtcblxuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgLy8gYV9wb3Nfbm9ybWFsXG4gICAgICAgICAgICAvLyBFbmNvZGUgcm91bmQvdXAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHNcbiAgICAgICAgICAgICh4IDw8IDEpICsgKHJvdW5kID8gMSA6IDApLFxuICAgICAgICAgICAgKHkgPDwgMSkgKyAodXAgPyAxIDogMCksXG4gICAgICAgICAgICAvLyBhX2RhdGFcbiAgICAgICAgICAgIC8vIGFkZCAxMjggdG8gc3RvcmUgYSBieXRlIGluIGFuIHVuc2lnbmVkIGJ5dGVcbiAgICAgICAgICAgIE1hdGgucm91bmQoRVhUUlVERV9TQ0FMRSAqIGV4dHJ1ZGVYKSArIDEyOCxcbiAgICAgICAgICAgIE1hdGgucm91bmQoRVhUUlVERV9TQ0FMRSAqIGV4dHJ1ZGVZKSArIDEyOCxcbiAgICAgICAgICAgIC8vIEVuY29kZSB0aGUgLTEvMC8xIGRpcmVjdGlvbiB2YWx1ZSBpbnRvIHRoZSBmaXJzdCB0d28gYml0cyBvZiAueiBvZiBhX2RhdGEuXG4gICAgICAgICAgICAvLyBDb21iaW5lIGl0IHdpdGggdGhlIGxvd2VyIDYgYml0cyBvZiBgbGluZXNvZmFyYCAoc2hpZnRlZCBieSAyIGJpdGVzIHRvIG1ha2VcbiAgICAgICAgICAgIC8vIHJvb20gZm9yIHRoZSBkaXJlY3Rpb24gdmFsdWUpLiBUaGUgdXBwZXIgOCBiaXRzIG9mIGBsaW5lc29mYXJgIGFyZSBwbGFjZWQgaW5cbiAgICAgICAgICAgIC8vIHRoZSBgd2AgY29tcG9uZW50LlxuICAgICAgICAgICAgKChkaXIgPT09IDAgPyAwIDogKGRpciA8IDAgPyAtMSA6IDEpKSArIDEpIHwgKChsaW5lc29mYXIgJiAweDNGKSA8PCAyKSxcbiAgICAgICAgICAgIGxpbmVzb2ZhciA+PiA2KTtcblxuICAgICAgICBjb25zdCBlID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGgrKztcbiAgICAgICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh0aGlzLmUxLCB0aGlzLmUyLCBlKTtcbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwKSB7XG4gICAgICAgICAgICB0aGlzLmUyID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZTEgPSBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlRGlzdGFuY2UocHJldjogUG9pbnQsIG5leHQ6IFBvaW50KSB7XG4gICAgICAgIHRoaXMuZGlzdGFuY2UgKz0gcHJldi5kaXN0KG5leHQpO1xuXG4gICAgICAgIC8vIEtub3dpbmcgdGhlIHJhdGlvIG9mIHRoZSBmdWxsIGxpbmVzdHJpbmcgY292ZXJlZCBieSB0aGlzIHRpbGVkIGZlYXR1cmUsIGFzIHdlbGxcbiAgICAgICAgLy8gYXMgdGhlIHRvdGFsIGRpc3RhbmNlIChpbiB0aWxlIHVuaXRzKSBvZiB0aGlzIHRpbGVkIGZlYXR1cmUsIGFuZCB0aGUgZGlzdGFuY2VcbiAgICAgICAgLy8gKGluIHRpbGUgdW5pdHMpIG9mIHRoZSBjdXJyZW50IHZlcnRleCwgd2UgY2FuIGRldGVybWluZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2VcbiAgICAgICAgLy8gb2YgdGhpcyB2ZXJ0ZXggYWxvbmcgdGhlIGZ1bGwgbGluZXN0cmluZyBmZWF0dXJlIGFuZCBzY2FsZSBpdCB0byBbMCwgMl4xNSlcbiAgICAgICAgdGhpcy5zY2FsZWREaXN0YW5jZSA9IHRoaXMudG90YWxEaXN0YW5jZSA+IDAgP1xuICAgICAgICAgICAgKHRoaXMuY2xpcFN0YXJ0ICsgKHRoaXMuY2xpcEVuZCAtIHRoaXMuY2xpcFN0YXJ0KSAqIHRoaXMuZGlzdGFuY2UgLyB0aGlzLnRvdGFsRGlzdGFuY2UpICAqIChNQVhfTElORV9ESVNUQU5DRSAtIDEpIDpcbiAgICAgICAgICAgIHRoaXMuZGlzdGFuY2U7XG4gICAgfVxufVxuXG5yZWdpc3RlcignTGluZUJ1Y2tldCcsIExpbmVCdWNrZXQsIHtvbWl0OiBbJ2xheWVycycsICdwYXR0ZXJuRmVhdHVyZXMnXX0pO1xuXG5leHBvcnQgZGVmYXVsdCBMaW5lQnVja2V0O1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmV4cG9ydCB0eXBlIExheW91dFByb3BzID0ge3xcbiAgICBcImxpbmUtY2FwXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwiYnV0dFwiIHwgXCJyb3VuZFwiIHwgXCJzcXVhcmVcIj4sXG4gICAgXCJsaW5lLWpvaW5cIjogRGF0YURyaXZlblByb3BlcnR5PFwiYmV2ZWxcIiB8IFwicm91bmRcIiB8IFwibWl0ZXJcIj4sXG4gICAgXCJsaW5lLW1pdGVyLWxpbWl0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLXNvcnQta2V5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJsaW5lLWNhcFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2xpbmVcIl1bXCJsaW5lLWNhcFwiXSksXG4gICAgXCJsaW5lLWpvaW5cIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtam9pblwiXSksXG4gICAgXCJsaW5lLW1pdGVyLWxpbWl0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtbWl0ZXItbGltaXRcIl0pLFxuICAgIFwibGluZS1yb3VuZC1saW1pdFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2xpbmVcIl1bXCJsaW5lLXJvdW5kLWxpbWl0XCJdKSxcbiAgICBcImxpbmUtc29ydC1rZXlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtc29ydC1rZXlcIl0pLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwibGluZS1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwibGluZS10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJsaW5lLXdpZHRoXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1nYXAtd2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLW9mZnNldFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtZGFzaGFycmF5XCI6IENyb3NzRmFkZWRQcm9wZXJ0eTxBcnJheTxudW1iZXI+PixcbiAgICBcImxpbmUtcGF0dGVyblwiOiBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5PHN0cmluZz4sXG4gICAgXCJsaW5lLWdyYWRpZW50XCI6IENvbG9yUmFtcFByb3BlcnR5LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwibGluZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtb3BhY2l0eVwiXSksXG4gICAgXCJsaW5lLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtY29sb3JcIl0pLFxuICAgIFwibGluZS10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwibGluZS13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXdpZHRoXCJdKSxcbiAgICBcImxpbmUtZ2FwLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZ2FwLXdpZHRoXCJdKSxcbiAgICBcImxpbmUtb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtb2Zmc2V0XCJdKSxcbiAgICBcImxpbmUtYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLWJsdXJcIl0pLFxuICAgIFwibGluZS1kYXNoYXJyYXlcIjogbmV3IENyb3NzRmFkZWRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1kYXNoYXJyYXlcIl0pLFxuICAgIFwibGluZS1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXBhdHRlcm5cIl0pLFxuICAgIFwibGluZS1ncmFkaWVudFwiOiBuZXcgQ29sb3JSYW1wUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZ3JhZGllbnRcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5pbXBvcnQgTGluZUJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldCc7XG5pbXBvcnQgeyBSR0JBSW1hZ2UgfSBmcm9tICcuLi8uLi91dGlsL2ltYWdlJztcbmltcG9ydCB7IHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUgfSBmcm9tICcuLi8uLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cyc7XG5pbXBvcnQgeyBnZXRNYXhpbXVtUGFpbnRWYWx1ZSwgdHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZSB9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCByZW5kZXJDb2xvclJhbXAgZnJvbSAnLi4vLi4vdXRpbC9jb2xvcl9yYW1wJztcbmltcG9ydCB7IFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBMYXlvdXQsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhRHJpdmVuUHJvcGVydHkgfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlU3RhdGUgfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0J1Y2tldCwgQnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUge0xheW91dFByb3BzLCBQYWludFByb3BzfSBmcm9tICcuL2xpbmVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4uLy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBMaW5lRmxvb3J3aWR0aFByb3BlcnR5IGV4dGVuZHMgRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4ge1xuICAgIHVzZUludGVnZXJab29tOiB0cnVlO1xuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZSwgcGFyYW1ldGVycykge1xuICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKE1hdGguZmxvb3IocGFyYW1ldGVycy56b29tKSwge1xuICAgICAgICAgICAgbm93OiBwYXJhbWV0ZXJzLm5vdyxcbiAgICAgICAgICAgIGZhZGVEdXJhdGlvbjogcGFyYW1ldGVycy5mYWRlRHVyYXRpb24sXG4gICAgICAgICAgICB6b29tSGlzdG9yeTogcGFyYW1ldGVycy56b29tSGlzdG9yeSxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IHBhcmFtZXRlcnMudHJhbnNpdGlvblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnBvc3NpYmx5RXZhbHVhdGUodmFsdWUsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKHZhbHVlLCBnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpIHtcbiAgICAgICAgZ2xvYmFscyA9IGV4dGVuZCh7fSwgZ2xvYmFscywge3pvb206IE1hdGguZmxvb3IoZ2xvYmFscy56b29tKX0pO1xuICAgICAgICByZXR1cm4gc3VwZXIuZXZhbHVhdGUodmFsdWUsIGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgfVxufVxuXG5jb25zdCBsaW5lRmxvb3J3aWR0aFByb3BlcnR5ID0gbmV3IExpbmVGbG9vcndpZHRoUHJvcGVydHkocHJvcGVydGllcy5wYWludC5wcm9wZXJ0aWVzWydsaW5lLXdpZHRoJ10uc3BlY2lmaWNhdGlvbik7XG5saW5lRmxvb3J3aWR0aFByb3BlcnR5LnVzZUludGVnZXJab29tID0gdHJ1ZTtcblxuY2xhc3MgTGluZVN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdW5ldmFsdWF0ZWRMYXlvdXQ6IExheW91dDxMYXlvdXRQcm9wcz47XG4gICAgbGF5b3V0OiBQb3NzaWJseUV2YWx1YXRlZDxMYXlvdXRQcm9wcz47XG5cbiAgICBncmFkaWVudDogP1JHQkFJbWFnZTtcbiAgICBncmFkaWVudFRleHR1cmU6ID9UZXh0dXJlO1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2xpbmUtZ3JhZGllbnQnKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVHcmFkaWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZUdyYWRpZW50KCkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzWydsaW5lLWdyYWRpZW50J10udmFsdWUuZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5ncmFkaWVudCA9IHJlbmRlckNvbG9yUmFtcChleHByZXNzaW9uLCAnbGluZVByb2dyZXNzJyk7XG4gICAgICAgIHRoaXMuZ3JhZGllbnRUZXh0dXJlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICBzdXBlci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcblxuICAgICAgICAodGhpcy5wYWludC5fdmFsdWVzOiBhbnkpWydsaW5lLWZsb29yd2lkdGgnXSA9XG4gICAgICAgICAgICBsaW5lRmxvb3J3aWR0aFByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50Ll92YWx1ZXNbJ2xpbmUtd2lkdGgnXS52YWx1ZSwgcGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKGJ1Y2tldDogQnVja2V0KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbGluZUJ1Y2tldDogTGluZUJ1Y2tldCA9IChidWNrZXQ6IGFueSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZ2V0TGluZVdpZHRoKFxuICAgICAgICAgICAgZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2xpbmUtd2lkdGgnLCB0aGlzLCBsaW5lQnVja2V0KSxcbiAgICAgICAgICAgIGdldE1heGltdW1QYWludFZhbHVlKCdsaW5lLWdhcC13aWR0aCcsIHRoaXMsIGxpbmVCdWNrZXQpKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2xpbmUtb2Zmc2V0JywgdGhpcywgbGluZUJ1Y2tldCk7XG4gICAgICAgIHJldHVybiB3aWR0aCAvIDIgKyBNYXRoLmFicyhvZmZzZXQpICsgdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGggPSBwaXhlbHNUb1RpbGVVbml0cyAvIDIgKiBnZXRMaW5lV2lkdGgoXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnbGluZS13aWR0aCcpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnbGluZS1nYXAtd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpKTtcbiAgICAgICAgY29uc3QgbGluZU9mZnNldCA9IHRoaXMucGFpbnQuZ2V0KCdsaW5lLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIGlmIChsaW5lT2Zmc2V0KSB7XG4gICAgICAgICAgICBnZW9tZXRyeSA9IG9mZnNldExpbmUoZ2VvbWV0cnksIGxpbmVPZmZzZXQgKiBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZSh0cmFuc2xhdGVkUG9seWdvbiwgZ2VvbWV0cnksIGhhbGZXaWR0aCk7XG4gICAgfVxuXG4gICAgaXNUaWxlQ2xpcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaW5lU3R5bGVMYXllcjtcblxuZnVuY3Rpb24gZ2V0TGluZVdpZHRoKGxpbmVXaWR0aCwgbGluZUdhcFdpZHRoKSB7XG4gICAgaWYgKGxpbmVHYXBXaWR0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGxpbmVHYXBXaWR0aCArIDIgKiBsaW5lV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxpbmVXaWR0aDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldExpbmUocmluZ3MsIG9mZnNldCkge1xuICAgIGNvbnN0IG5ld1JpbmdzID0gW107XG4gICAgY29uc3QgemVybyA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHJpbmdzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSByaW5nc1trXTtcbiAgICAgICAgY29uc3QgbmV3UmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2kgLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYyA9IHJpbmdbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgYVRvQiA9IGkgPT09IDAgPyB6ZXJvIDogYi5zdWIoYSkuX3VuaXQoKS5fcGVycCgpO1xuICAgICAgICAgICAgY29uc3QgYlRvQyA9IGkgPT09IHJpbmcubGVuZ3RoIC0gMSA/IHplcm8gOiBjLnN1YihiKS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgICAgICAgICBjb25zdCBleHRydWRlID0gYVRvQi5fYWRkKGJUb0MpLl91bml0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvc0hhbGZBbmdsZSA9IGV4dHJ1ZGUueCAqIGJUb0MueCArIGV4dHJ1ZGUueSAqIGJUb0MueTtcbiAgICAgICAgICAgIGV4dHJ1ZGUuX211bHQoMSAvIGNvc0hhbGZBbmdsZSk7XG5cbiAgICAgICAgICAgIG5ld1JpbmcucHVzaChleHRydWRlLl9tdWx0KG9mZnNldCkuX2FkZChiKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3UmluZ3MucHVzaChuZXdSaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JpbmdzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5leHBvcnQgY29uc3Qgc3ltYm9sTGF5b3V0QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc19vZmZzZXQnLCAgY29tcG9uZW50czogNCwgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX2RhdGEnLCAgICAgICAgY29tcG9uZW50czogNCwgdHlwZTogJ1VpbnQxNid9XG5dKTtcblxuZXhwb3J0IGNvbnN0IGR5bmFtaWNMYXlvdXRBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7IG5hbWU6ICdhX3Byb2plY3RlZF9wb3MnLCBjb21wb25lbnRzOiAzLCB0eXBlOiAnRmxvYXQzMicgfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBwbGFjZW1lbnRPcGFjaXR5QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAgeyBuYW1lOiAnYV9mYWRlX29wYWNpdHknLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnVWludDMyJyB9XG5dLCA0KTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHsgbmFtZTogJ2FfcGxhY2VkJywgY29tcG9uZW50czogMiwgdHlwZTogJ1VpbnQ4JyB9LFxuICAgIHsgbmFtZTogJ2Ffc2hpZnQnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnRmxvYXQzMid9XG5dKTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkJveCA9IGNyZWF0ZUxheW91dChbXG4gICAgLy8gdGhlIGJveCBpcyBjZW50ZXJlZCBhcm91bmQgdGhlIGFuY2hvciBwb2ludFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclBvaW50WCcgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JQb2ludFknIH0sXG5cbiAgICAvLyBkaXN0YW5jZXMgdG8gdGhlIGVkZ2VzIGZyb20gdGhlIGFuY2hvclxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3gxJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3kxJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3gyJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3kyJyB9LFxuXG4gICAgLy8gdGhlIGluZGV4IG9mIHRoZSBmZWF0dXJlIGluIHRoZSBvcmlnaW5hbCB2ZWN0b3J0aWxlXG4gICAgeyB0eXBlOiAnVWludDMyJywgbmFtZTogJ2ZlYXR1cmVJbmRleCcgfSxcbiAgICAvLyB0aGUgc291cmNlIGxheWVyIHRoZSBmZWF0dXJlIGFwcGVhcnMgaW5cbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnc291cmNlTGF5ZXJJbmRleCcgfSxcbiAgICAvLyB0aGUgYnVja2V0IHRoZSBmZWF0dXJlIGFwcGVhcnMgaW5cbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnYnVja2V0SW5kZXgnIH0sXG5cbiAgICAvLyBjb2xsaXNpb24gY2lyY2xlcyBmb3IgbGluZXMgc3RvcmUgdGhlaXIgZGlzdGFuY2UgdG8gdGhlIGFuY2hvciBpbiB0aWxlIHVuaXRzXG4gICAgLy8gc28gdGhhdCB0aGV5IGNhbiBiZSBpZ25vcmVkIGlmIHRoZSBwcm9qZWN0ZWQgbGFiZWwgZG9lc24ndCBleHRlbmQgaW50b1xuICAgIC8vIHRoZSBib3ggYXJlYVxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3JhZGl1cycgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdzaWduZWREaXN0YW5jZUZyb21BbmNob3InIH1cbl0pO1xuXG5leHBvcnQgY29uc3QgY29sbGlzaW9uQm94TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFsgLy8gdXNlZCB0byByZW5kZXIgY29sbGlzaW9uIGJveGVzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICB7bmFtZTogJ2FfcG9zJywgICAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9hbmNob3JfcG9zJywgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX2V4dHJ1ZGUnLCAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBjb2xsaXNpb25DaXJjbGVMYXlvdXQgPSBjcmVhdGVMYXlvdXQoWyAvLyB1c2VkIHRvIHJlbmRlciBjb2xsaXNpb24gY2lyY2xlcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAge25hbWU6ICdhX3BvcycsICAgICAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfYW5jaG9yX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9leHRydWRlJywgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgY29uc3QgcGxhY2VtZW50ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JYJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclknIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ2dseXBoU3RhcnRJbmRleCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtR2x5cGhzJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQzMicsIG5hbWU6ICd2ZXJ0ZXhTdGFydEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQzMicsIG5hbWU6ICdsaW5lU3RhcnRJbmRleCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MzInLCBuYW1lOiAnbGluZUxlbmd0aCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnc2VnbWVudCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnbG93ZXJTaXplJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICd1cHBlclNpemUnIH0sXG4gICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdsaW5lT2Zmc2V0WCcgfSxcbiAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ2xpbmVPZmZzZXRZJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQ4JywgbmFtZTogJ3dyaXRpbmdNb2RlJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQ4JywgbmFtZTogJ3BsYWNlZE9yaWVudGF0aW9uJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQ4JywgbmFtZTogJ2hpZGRlbicgfSxcbiAgICB7IHR5cGU6ICdVaW50MzInLCBuYW1lOiAnY3Jvc3NUaWxlSUQnfVxuXSk7XG5cbmV4cG9ydCBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGNyZWF0ZUxheW91dChbXG4gICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yWCcgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JZJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3JpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2NlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCcgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3ZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdrZXknIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ3RleHRCb3hTdGFydEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICd0ZXh0Qm94RW5kSW5kZXgnIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ3ZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgnIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ3ZlcnRpY2FsVGV4dEJveEVuZEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdpY29uQm94U3RhcnRJbmRleCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnaWNvbkJveEVuZEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdmZWF0dXJlSW5kZXgnIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ251bUhvcml6b250YWxHbHlwaFZlcnRpY2VzJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdudW1WZXJ0aWNhbEdseXBoVmVydGljZXMnIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ251bUljb25WZXJ0aWNlcycgfSxcbiAgICB7IHR5cGU6ICdVaW50MzInLCBuYW1lOiAnY3Jvc3NUaWxlSUQnIH0sXG4gICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICd0ZXh0Qm94U2NhbGUnfSxcbiAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ3JhZGlhbFRleHRPZmZzZXQnfVxuXSk7XG5cbmV4cG9ydCBjb25zdCBnbHlwaE9mZnNldCA9IGNyZWF0ZUxheW91dChbXG4gICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdvZmZzZXRYJyB9XG5dKTtcblxuZXhwb3J0IGNvbnN0IGxpbmVWZXJ0ZXggPSBjcmVhdGVMYXlvdXQoW1xuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3gnIH0sXG4gICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAneScgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICd0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcicgfVxuXSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBwbHVnaW4gYXMgcnRsVGV4dFBsdWdpbiB9IGZyb20gJy4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4nO1xuXG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVRleHQodGV4dDogc3RyaW5nLCBsYXllcjogU3ltYm9sU3R5bGVMYXllciwgZmVhdHVyZTogRmVhdHVyZSkge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtdHJhbnNmb3JtJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgIGlmICh0cmFuc2Zvcm0gPT09ICd1cHBlcmNhc2UnKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nKSB7XG4gICAgICAgIHRleHQgPSBydGxUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZyh0ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odGV4dDogRm9ybWF0dGVkLCBsYXllcjogU3ltYm9sU3R5bGVMYXllciwgZmVhdHVyZTogRmVhdHVyZSk6IEZvcm1hdHRlZCB7XG4gICAgdGV4dC5zZWN0aW9ucy5mb3JFYWNoKHNlY3Rpb24gPT4ge1xuICAgICAgICBzZWN0aW9uLnRleHQgPSB0cmFuc2Zvcm1UZXh0KHNlY3Rpb24udGV4dCwgbGF5ZXIsIGZlYXR1cmUpO1xuICAgIH0pO1xuICAgIHJldHVybiB0ZXh0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1N5bWJvbEZlYXR1cmV9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZmVhdHVyZXM6IEFycmF5PFN5bWJvbEZlYXR1cmU+KTogQXJyYXk8U3ltYm9sRmVhdHVyZT4ge1xuICAgIGNvbnN0IGxlZnRJbmRleDoge1tzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgY29uc3QgcmlnaHRJbmRleDoge1tzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgY29uc3QgbWVyZ2VkRmVhdHVyZXMgPSBbXTtcbiAgICBsZXQgbWVyZ2VkSW5kZXggPSAwO1xuXG4gICAgZnVuY3Rpb24gYWRkKGspIHtcbiAgICAgICAgbWVyZ2VkRmVhdHVyZXMucHVzaChmZWF0dXJlc1trXSk7XG4gICAgICAgIG1lcmdlZEluZGV4Kys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tUmlnaHQobGVmdEtleTogc3RyaW5nLCByaWdodEtleTogc3RyaW5nLCBnZW9tKSB7XG4gICAgICAgIGNvbnN0IGkgPSByaWdodEluZGV4W2xlZnRLZXldO1xuICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtsZWZ0S2V5XTtcbiAgICAgICAgcmlnaHRJbmRleFtyaWdodEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnBvcCgpO1xuICAgICAgICBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXSA9IG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLmNvbmNhdChnZW9tWzBdKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tTGVmdChsZWZ0S2V5OiBzdHJpbmcsIHJpZ2h0S2V5OiBzdHJpbmcsIGdlb20pIHtcbiAgICAgICAgY29uc3QgaSA9IGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbcmlnaHRLZXldO1xuICAgICAgICBsZWZ0SW5kZXhbbGVmdEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnNoaWZ0KCk7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdID0gZ2VvbVswXS5jb25jYXQobWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXkodGV4dCwgZ2VvbSwgb25SaWdodCkge1xuICAgICAgICBjb25zdCBwb2ludCA9IG9uUmlnaHQgPyBnZW9tWzBdW2dlb21bMF0ubGVuZ3RoIC0gMV0gOiBnZW9tWzBdWzBdO1xuICAgICAgICByZXR1cm4gYCR7dGV4dH06JHtwb2ludC54fToke3BvaW50Lnl9YDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGZlYXR1cmVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1trXTtcbiAgICAgICAgY29uc3QgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBmZWF0dXJlLnRleHQgPyBmZWF0dXJlLnRleHQudG9TdHJpbmcoKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICBhZGQoayk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlZnRLZXkgPSBnZXRLZXkodGV4dCwgZ2VvbSksXG4gICAgICAgICAgICByaWdodEtleSA9IGdldEtleSh0ZXh0LCBnZW9tLCB0cnVlKTtcblxuICAgICAgICBpZiAoKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkgJiYgKHJpZ2h0S2V5IGluIGxlZnRJbmRleCkgJiYgKHJpZ2h0SW5kZXhbbGVmdEtleV0gIT09IGxlZnRJbmRleFtyaWdodEtleV0pKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgYWRqYWNlbnQgdG8gYm90aCBlbmRzIG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlIGFsbCB0aHJlZVxuICAgICAgICAgICAgY29uc3QgaiA9IG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuICAgICAgICAgICAgY29uc3QgaSA9IG1lcmdlRnJvbVJpZ2h0KGxlZnRLZXksIHJpZ2h0S2V5LCBtZXJnZWRGZWF0dXJlc1tqXS5nZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbbGVmdEtleV07XG4gICAgICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtyaWdodEtleV07XG5cbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbZ2V0S2V5KHRleHQsIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5LCB0cnVlKV0gPSBpO1xuICAgICAgICAgICAgbWVyZ2VkRmVhdHVyZXNbal0uZ2VvbWV0cnkgPSAobnVsbDogYW55KTtcblxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWVyZ2VhYmxlIGxpbmUgYWRqYWNlbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlXG4gICAgICAgICAgICBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyaWdodEtleSBpbiBsZWZ0SW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1lcmdlYWJsZSBsaW5lIGFkamFjZW50IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2VcbiAgICAgICAgICAgIG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBhZGphY2VudCBsaW5lcywgYWRkIGFzIGEgbmV3IGl0ZW1cbiAgICAgICAgICAgIGFkZChrKTtcbiAgICAgICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IG1lcmdlZEluZGV4IC0gMTtcbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbcmlnaHRLZXldID0gbWVyZ2VkSW5kZXggLSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZEZlYXR1cmVzLmZpbHRlcigoZikgPT4gZi5nZW9tZXRyeSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIGNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbixcbn0gZnJvbSAnLi9zY3JpcHRfZGV0ZWN0aW9uJztcblxuZXhwb3J0IGNvbnN0IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcCA9IHtcbiAgICAnISc6ICfDr8K4wpUnLFxuICAgICcjJzogJ8OvwrzCgycsXG4gICAgJyQnOiAnw6/CvMKEJyxcbiAgICAnJSc6ICfDr8K8woUnLFxuICAgICcmJzogJ8OvwrzChicsXG4gICAgJygnOiAnw6/CuMK1JyxcbiAgICAnKSc6ICfDr8K4wrYnLFxuICAgICcqJzogJ8OvwrzCiicsXG4gICAgJysnOiAnw6/CvMKLJyxcbiAgICAnLCc6ICfDr8K4wpAnLFxuICAgICctJzogJ8OvwrjCsicsXG4gICAgJy4nOiAnw6PCg8K7JyxcbiAgICAnLyc6ICfDr8K8wo8nLFxuICAgICc6JzogJ8OvwrjCkycsXG4gICAgJzsnOiAnw6/CuMKUJyxcbiAgICAnPCc6ICfDr8K4wr8nLFxuICAgICc9JzogJ8OvwrzCnScsXG4gICAgJz4nOiAnw6/CucKAJyxcbiAgICAnPyc6ICfDr8K4wpYnLFxuICAgICdAJzogJ8OvwrzCoCcsXG4gICAgJ1snOiAnw6/CucKHJyxcbiAgICAnXFxcXCc6ICfDr8K8wrwnLFxuICAgICddJzogJ8OvwrnCiCcsXG4gICAgJ14nOiAnw6/CvMK+JyxcbiAgICAnXyc6ICfDr8K4wrMnLFxuICAgICdgJzogJ8Ovwr3CgCcsXG4gICAgJ3snOiAnw6/CuMK3JyxcbiAgICAnfCc6ICfDosKAwpUnLFxuICAgICd9JzogJ8OvwrjCuCcsXG4gICAgJ34nOiAnw6/CvcKeJyxcbiAgICAnw4LCoic6ICfDr8K/wqAnLFxuICAgICfDgsKjJzogJ8Ovwr/CoScsXG4gICAgJ8OCwqUnOiAnw6/Cv8KlJyxcbiAgICAnw4LCpic6ICfDr8K/wqQnLFxuICAgICfDgsKsJzogJ8Ovwr/CoicsXG4gICAgJ8OCwq8nOiAnw6/Cv8KjJyxcbiAgICAnw6LCgMKTJzogJ8OvwrjCsicsXG4gICAgJ8OiwoDClCc6ICfDr8K4wrEnLFxuICAgICfDosKAwpgnOiAnw6/CucKDJyxcbiAgICAnw6LCgMKZJzogJ8OvwrnChCcsXG4gICAgJ8OiwoDCnCc6ICfDr8K5woEnLFxuICAgICfDosKAwp0nOiAnw6/CucKCJyxcbiAgICAnw6LCgMKmJzogJ8OvwrjCmScsXG4gICAgJ8OiwoDCpyc6ICfDo8KDwrsnLFxuICAgICfDosKCwqknOiAnw6/Cv8KmJyxcbiAgICAnw6PCgMKBJzogJ8OvwrjCkScsXG4gICAgJ8OjwoDCgic6ICfDr8K4wpInLFxuICAgICfDo8KAwognOiAnw6/CuMK/JyxcbiAgICAnw6PCgMKJJzogJ8OvwrnCgCcsXG4gICAgJ8OjwoDCiic6ICfDr8K4wr0nLFxuICAgICfDo8KAwosnOiAnw6/CuMK+JyxcbiAgICAnw6PCgMKMJzogJ8OvwrnCgScsXG4gICAgJ8OjwoDCjSc6ICfDr8K5woInLFxuICAgICfDo8KAwo4nOiAnw6/CucKDJyxcbiAgICAnw6PCgMKPJzogJ8OvwrnChCcsXG4gICAgJ8OjwoDCkCc6ICfDr8K4wrsnLFxuICAgICfDo8KAwpEnOiAnw6/CuMK8JyxcbiAgICAnw6PCgMKUJzogJ8OvwrjCuScsXG4gICAgJ8OjwoDClSc6ICfDr8K4wronLFxuICAgICfDo8KAwpYnOiAnw6/CuMKXJyxcbiAgICAnw6PCgMKXJzogJ8OvwrjCmCcsXG4gICAgJ8OvwrzCgSc6ICfDr8K4wpUnLFxuICAgICfDr8K8wognOiAnw6/CuMK1JyxcbiAgICAnw6/CvMKJJzogJ8OvwrjCticsXG4gICAgJ8OvwrzCjCc6ICfDr8K4wpAnLFxuICAgICfDr8K8wo0nOiAnw6/CuMKyJyxcbiAgICAnw6/CvMKOJzogJ8OjwoPCuycsXG4gICAgJ8OvwrzCmic6ICfDr8K4wpMnLFxuICAgICfDr8K8wpsnOiAnw6/CuMKUJyxcbiAgICAnw6/CvMKcJzogJ8OvwrjCvycsXG4gICAgJ8OvwrzCnic6ICfDr8K5woAnLFxuICAgICfDr8K8wp8nOiAnw6/CuMKWJyxcbiAgICAnw6/CvMK7JzogJ8OvwrnChycsXG4gICAgJ8OvwrzCvSc6ICfDr8K5wognLFxuICAgICfDr8K8wr8nOiAnw6/CuMKzJyxcbiAgICAnw6/CvcKbJzogJ8OvwrjCtycsXG4gICAgJ8Ovwr3CnCc6ICfDosKAwpUnLFxuICAgICfDr8K9wp0nOiAnw6/CuMK4JyxcbiAgICAnw6/CvcKfJzogJ8OvwrjCtScsXG4gICAgJ8Ovwr3CoCc6ICfDr8K4wrYnLFxuICAgICfDr8K9wqEnOiAnw6/CuMKSJyxcbiAgICAnw6/CvcKiJzogJ8OvwrnCgScsXG4gICAgJ8Ovwr3Coyc6ICfDr8K5woInXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKGlucHV0OiBzdHJpbmcpIHtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSArIDEpIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IHByZXZDaGFyQ29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSAtIDEpIHx8IG51bGw7XG5cbiAgICAgICAgY29uc3QgY2FuUmVwbGFjZVB1bmN0dWF0aW9uID0gKFxuICAgICAgICAgICAgKCFuZXh0Q2hhckNvZGUgfHwgIWNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihuZXh0Q2hhckNvZGUpIHx8IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpICsgMV1dKSAmJlxuICAgICAgICAgICAgKCFwcmV2Q2hhckNvZGUgfHwgIWNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihwcmV2Q2hhckNvZGUpIHx8IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpIC0gMV1dKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjYW5SZXBsYWNlUHVuY3R1YXRpb24gJiYgdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW2lucHV0W2ldXSkge1xuICAgICAgICAgICAgb3V0cHV0ICs9IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaW5wdXRbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuXG4iLCIvLyBAZmxvd1xuLy8gT05FX0VNIGNvbnN0YW50IHVzZWQgdG8gZ28gYmV0d2VlbiBcImVtXCIgdW5pdHMgdXNlZCBpbiBzdHlsZSBzcGVjIGFuZCBcInBvaW50c1wiIHVzZWQgaW50ZXJuYWxseSBmb3IgbGF5b3V0XG5cbmV4cG9ydCBkZWZhdWx0IDI0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBjaGFySGFzVXByaWdodFZlcnRpY2FsT3JpZW50YXRpb24sXG4gICAgY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcsXG4gICAgY2hhckluQ29tcGxleFNoYXBpbmdTY3JpcHRcbn0gZnJvbSAnLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uJztcbmltcG9ydCB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uIGZyb20gJy4uL3V0aWwvdmVydGljYWxpemVfcHVuY3R1YXRpb24nO1xuaW1wb3J0IHsgcGx1Z2luIGFzIHJ0bFRleHRQbHVnaW4gfSBmcm9tICcuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi9vbmVfZW0nO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5jb25zdCBXcml0aW5nTW9kZSA9IHtcbiAgICBob3Jpem9udGFsOiAxLFxuICAgIHZlcnRpY2FsOiAyLFxuICAgIGhvcml6b250YWxPbmx5OiAzXG59O1xuXG5leHBvcnQgeyBzaGFwZVRleHQsIHNoYXBlSWNvbiwgZ2V0QW5jaG9yQWxpZ25tZW50LCBXcml0aW5nTW9kZSB9O1xuXG4vLyBUaGUgcG9zaXRpb24gb2YgYSBnbHlwaCByZWxhdGl2ZSB0byB0aGUgdGV4dCdzIGFuY2hvciBwb2ludC5cbmV4cG9ydCB0eXBlIFBvc2l0aW9uZWRHbHlwaCA9IHtcbiAgICBnbHlwaDogbnVtYmVyLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdmVydGljYWw6IGJvb2xlYW4sXG4gICAgc2NhbGU6IG51bWJlcixcbiAgICBmb250U3RhY2s6IHN0cmluZyxcbiAgICBzZWN0aW9uSW5kZXg6IG51bWJlclxufTtcblxuLy8gQSBjb2xsZWN0aW9uIG9mIHBvc2l0aW9uZWQgZ2x5cGhzIGFuZCBzb21lIG1ldGFkYXRhXG5leHBvcnQgdHlwZSBTaGFwaW5nID0ge1xuICAgIHBvc2l0aW9uZWRHbHlwaHM6IEFycmF5PFBvc2l0aW9uZWRHbHlwaD4sXG4gICAgdG9wOiBudW1iZXIsXG4gICAgYm90dG9tOiBudW1iZXIsXG4gICAgbGVmdDogbnVtYmVyLFxuICAgIHJpZ2h0OiBudW1iZXIsXG4gICAgd3JpdGluZ01vZGU6IDEgfCAyLFxuICAgIGxpbmVDb3VudDogbnVtYmVyLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB5T2Zmc2V0OiBudW1iZXIsXG59O1xuXG5leHBvcnQgdHlwZSBTeW1ib2xBbmNob3IgPSAnY2VudGVyJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wJyB8ICdib3R0b20nIHwgJ3RvcC1sZWZ0JyB8ICd0b3AtcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JyB8ICdib3R0b20tcmlnaHQnO1xuZXhwb3J0IHR5cGUgVGV4dEp1c3RpZnkgPSAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCc7XG5cbmNsYXNzIFRhZ2dlZFN0cmluZyB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHNlY3Rpb25JbmRleDogQXJyYXk8bnVtYmVyPiAvLyBtYXBzIGVhY2ggY2hhcmFjdGVyIGluICd0ZXh0JyB0byBpdHMgY29ycmVzcG9uZGluZyBlbnRyeSBpbiAnc2VjdGlvbnMnXG4gICAgc2VjdGlvbnM6IEFycmF5PHsgc2NhbGU6IG51bWJlciwgZm9udFN0YWNrOiBzdHJpbmcgfT5cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLnNlY3Rpb25JbmRleCA9IFtdO1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gW107XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21GZWF0dXJlKHRleHQ6IEZvcm1hdHRlZCwgZGVmYXVsdEZvbnRTdGFjazogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0LnNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gdGV4dC5zZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIHJlc3VsdC5zZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzY2FsZTogc2VjdGlvbi5zY2FsZSB8fCAxLFxuICAgICAgICAgICAgICAgIGZvbnRTdGFjazogc2VjdGlvbi5mb250U3RhY2sgfHwgZGVmYXVsdEZvbnRTdGFja1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQudGV4dCArPSBzZWN0aW9uLnRleHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNlY3Rpb24udGV4dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZWN0aW9uSW5kZXgucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRTZWN0aW9uKGluZGV4OiBudW1iZXIpOiB7IHNjYWxlOiBudW1iZXIsIGZvbnRTdGFjazogc3RyaW5nIH0ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9uc1t0aGlzLnNlY3Rpb25JbmRleFtpbmRleF1dO1xuICAgIH1cblxuICAgIGdldFNlY3Rpb25JbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbkluZGV4W2luZGV4XTtcbiAgICB9XG5cbiAgICBnZXRDaGFyQ29kZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKCkge1xuICAgICAgICB0aGlzLnRleHQgPSB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKHRoaXMudGV4dCk7XG4gICAgfVxuXG4gICAgdHJpbSgpIHtcbiAgICAgICAgbGV0IGJlZ2lubmluZ1doaXRlc3BhY2UgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDtcbiAgICAgICAgICAgIGkgPCB0aGlzLnRleHQubGVuZ3RoICYmIHdoaXRlc3BhY2VbdGhpcy50ZXh0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICAgICAgaSsrKSB7XG4gICAgICAgICAgICBiZWdpbm5pbmdXaGl0ZXNwYWNlKys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyYWlsaW5nV2hpdGVzcGFjZSA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRleHQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGkgPj0gMCAmJiBpID49IGJlZ2lubmluZ1doaXRlc3BhY2UgJiYgd2hpdGVzcGFjZVt0aGlzLnRleHQuY2hhckNvZGVBdChpKV07XG4gICAgICAgICAgICBpLS0pIHtcbiAgICAgICAgICAgIHRyYWlsaW5nV2hpdGVzcGFjZS0tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zdWJzdHJpbmcoYmVnaW5uaW5nV2hpdGVzcGFjZSwgdHJhaWxpbmdXaGl0ZXNwYWNlKTtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXggPSB0aGlzLnNlY3Rpb25JbmRleC5zbGljZShiZWdpbm5pbmdXaGl0ZXNwYWNlLCB0cmFpbGluZ1doaXRlc3BhY2UpO1xuICAgIH1cblxuICAgIHN1YnN0cmluZyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IFRhZ2dlZFN0cmluZyB7XG4gICAgICAgIGNvbnN0IHN1YnN0cmluZyA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgc3Vic3RyaW5nLnRleHQgPSB0aGlzLnRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICBzdWJzdHJpbmcuc2VjdGlvbkluZGV4ID0gdGhpcy5zZWN0aW9uSW5kZXguc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIHN1YnN0cmluZy5zZWN0aW9ucyA9IHRoaXMuc2VjdGlvbnM7XG4gICAgICAgIHJldHVybiBzdWJzdHJpbmc7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG5cbiAgICBnZXRNYXhTY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbkluZGV4LnJlZHVjZSgobWF4LCBpbmRleCkgPT4gTWF0aC5tYXgobWF4LCB0aGlzLnNlY3Rpb25zW2luZGV4XS5zY2FsZSksIDApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYnJlYWtMaW5lcyhpbnB1dDogVGFnZ2VkU3RyaW5nLCBsaW5lQnJlYWtQb2ludHM6IEFycmF5PG51bWJlcj4pOiBBcnJheTxUYWdnZWRTdHJpbmc+IHtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGNvbnN0IHRleHQgPSBpbnB1dC50ZXh0O1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgZm9yIChjb25zdCBsaW5lQnJlYWsgb2YgbGluZUJyZWFrUG9pbnRzKSB7XG4gICAgICAgIGxpbmVzLnB1c2goaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCBsaW5lQnJlYWspKTtcbiAgICAgICAgc3RhcnQgPSBsaW5lQnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaChpbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRleHQubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gc2hhcGVUZXh0KHRleHQ6IEZvcm1hdHRlZCxcbiAgICAgICAgICAgICAgICAgICBnbHlwaHM6IHtbc3RyaW5nXToge1tudW1iZXJdOiA/U3R5bGVHbHlwaH19LFxuICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGb250U3RhY2s6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yOiBTeW1ib2xBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgdGV4dEp1c3RpZnk6IFRleHRKdXN0aWZ5LFxuICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IDEgfCAyLFxuICAgICAgICAgICAgICAgICAgIGFsbG93VmVydGljYWxQbGFjZW1lbnQ6IGJvb2xlYW4pOiBTaGFwaW5nIHwgZmFsc2Uge1xuICAgIGNvbnN0IGxvZ2ljYWxJbnB1dCA9IFRhZ2dlZFN0cmluZy5mcm9tRmVhdHVyZSh0ZXh0LCBkZWZhdWx0Rm9udFN0YWNrKTtcblxuICAgIGlmICh3cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwpIHtcbiAgICAgICAgbG9naWNhbElucHV0LnZlcnRpY2FsaXplUHVuY3R1YXRpb24oKTtcbiAgICB9XG5cbiAgICBsZXQgbGluZXM6IEFycmF5PFRhZ2dlZFN0cmluZz47XG5cbiAgICBjb25zdCB7cHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0LCBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHR9ID0gcnRsVGV4dFBsdWdpbjtcbiAgICBpZiAocHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0ICYmIGxvZ2ljYWxJbnB1dC5zZWN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gQmlkaSBkb2Vzbid0IGhhdmUgdG8gYmUgc3R5bGUtYXdhcmVcbiAgICAgICAgbGluZXMgPSBbXTtcbiAgICAgICAgY29uc3QgdW50YWdnZWRMaW5lcyA9XG4gICAgICAgICAgICBwcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQobG9naWNhbElucHV0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lTGluZUJyZWFrcyhsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaHMpKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHVudGFnZ2VkTGluZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ2dlZExpbmUgPSBuZXcgVGFnZ2VkU3RyaW5nKCk7XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnRleHQgPSBsaW5lO1xuICAgICAgICAgICAgdGFnZ2VkTGluZS5zZWN0aW9ucyA9IGxvZ2ljYWxJbnB1dC5zZWN0aW9ucztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRhZ2dlZExpbmUuc2VjdGlvbkluZGV4LnB1c2goMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaW5lcy5wdXNoKHRhZ2dlZExpbmUpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQpIHtcbiAgICAgICAgLy8gTmVlZCB2ZXJzaW9uIG9mIG1hcGJveC1nbC1ydGwtdGV4dCB3aXRoIHN0eWxlIHN1cHBvcnQgZm9yIGNvbWJpbmluZyBSVEwgdGV4dFxuICAgICAgICAvLyB3aXRoIGZvcm1hdHRpbmdcbiAgICAgICAgbGluZXMgPSBbXTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkTGluZXMgPVxuICAgICAgICAgICAgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0KGxvZ2ljYWxJbnB1dC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxJbnB1dC5zZWN0aW9uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lTGluZUJyZWFrcyhsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaHMpKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHByb2Nlc3NlZExpbmVzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdnZWRMaW5lID0gbmV3IFRhZ2dlZFN0cmluZygpO1xuICAgICAgICAgICAgdGFnZ2VkTGluZS50ZXh0ID0gbGluZVswXTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUuc2VjdGlvbkluZGV4ID0gbGluZVsxXTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUuc2VjdGlvbnMgPSBsb2dpY2FsSW5wdXQuc2VjdGlvbnM7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKHRhZ2dlZExpbmUpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMgPSBicmVha0xpbmVzKGxvZ2ljYWxJbnB1dCwgZGV0ZXJtaW5lTGluZUJyZWFrcyhsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaHMpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbmVkR2x5cGhzID0gW107XG4gICAgY29uc3Qgc2hhcGluZyA9IHtcbiAgICAgICAgcG9zaXRpb25lZEdseXBocyxcbiAgICAgICAgdGV4dDogbG9naWNhbElucHV0LnRvU3RyaW5nKCksXG4gICAgICAgIHRvcDogdHJhbnNsYXRlWzFdLFxuICAgICAgICBib3R0b206IHRyYW5zbGF0ZVsxXSxcbiAgICAgICAgbGVmdDogdHJhbnNsYXRlWzBdLFxuICAgICAgICByaWdodDogdHJhbnNsYXRlWzBdLFxuICAgICAgICB3cml0aW5nTW9kZSxcbiAgICAgICAgbGluZUNvdW50OiBsaW5lcy5sZW5ndGgsXG4gICAgICAgIHlPZmZzZXQ6IC0xNyAvLyB0aGUgeSBvZmZzZXQgKnNob3VsZCogYmUgcGFydCBvZiB0aGUgZm9udCBtZXRhZGF0YVxuICAgIH07XG5cbiAgICBzaGFwZUxpbmVzKHNoYXBpbmcsIGdseXBocywgbGluZXMsIGxpbmVIZWlnaHQsIHRleHRBbmNob3IsIHRleHRKdXN0aWZ5LCB3cml0aW5nTW9kZSwgc3BhY2luZywgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCk7XG4gICAgaWYgKCFwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHNoYXBpbmc7XG59XG5cbi8vIHVzaW5nIGNvbXB1dGVkIHByb3BlcnRpZXMgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8zODBcbi8qIGVzbGludCBuby11c2VsZXNzLWNvbXB1dGVkLWtleTogMCAqL1xuXG5jb25zdCB3aGl0ZXNwYWNlOiB7W251bWJlcl06IGJvb2xlYW59ID0ge1xuICAgIFsweDA5XTogdHJ1ZSwgLy8gdGFiXG4gICAgWzB4MGFdOiB0cnVlLCAvLyBuZXdsaW5lXG4gICAgWzB4MGJdOiB0cnVlLCAvLyB2ZXJ0aWNhbCB0YWJcbiAgICBbMHgwY106IHRydWUsIC8vIGZvcm0gZmVlZFxuICAgIFsweDBkXTogdHJ1ZSwgLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgWzB4MjBdOiB0cnVlLCAvLyBzcGFjZVxufTtcblxuY29uc3QgYnJlYWthYmxlOiB7W251bWJlcl06IGJvb2xlYW59ID0ge1xuICAgIFsweDBhXTogICB0cnVlLCAvLyBuZXdsaW5lXG4gICAgWzB4MjBdOiAgIHRydWUsIC8vIHNwYWNlXG4gICAgWzB4MjZdOiAgIHRydWUsIC8vIGFtcGVyc2FuZFxuICAgIFsweDI4XTogICB0cnVlLCAvLyBsZWZ0IHBhcmVudGhlc2lzXG4gICAgWzB4MjldOiAgIHRydWUsIC8vIHJpZ2h0IHBhcmVudGhlc2lzXG4gICAgWzB4MmJdOiAgIHRydWUsIC8vIHBsdXMgc2lnblxuICAgIFsweDJkXTogICB0cnVlLCAvLyBoeXBoZW4tbWludXNcbiAgICBbMHgyZl06ICAgdHJ1ZSwgLy8gc29saWR1c1xuICAgIFsweGFkXTogICB0cnVlLCAvLyBzb2Z0IGh5cGhlblxuICAgIFsweGI3XTogICB0cnVlLCAvLyBtaWRkbGUgZG90XG4gICAgWzB4MjAwYl06IHRydWUsIC8vIHplcm8td2lkdGggc3BhY2VcbiAgICBbMHgyMDEwXTogdHJ1ZSwgLy8gaHlwaGVuXG4gICAgWzB4MjAxM106IHRydWUsIC8vIGVuIGRhc2hcbiAgICBbMHgyMDI3XTogdHJ1ZSAgLy8gaW50ZXJwdW5jdFxuICAgIC8vIE1hbnkgb3RoZXIgY2hhcmFjdGVycyBtYXkgYmUgcmVhc29uYWJsZSBicmVha3BvaW50c1xuICAgIC8vIENvbnNpZGVyIFwibmV1dHJhbCBvcmllbnRhdGlvblwiIGNoYXJhY3RlcnMgYXQgc2NyaXB0RGV0ZWN0aW9uLmNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvblxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzY1OFxufTtcblxuZnVuY3Rpb24gZGV0ZXJtaW5lQXZlcmFnZUxpbmVXaWR0aChsb2dpY2FsSW5wdXQ6IFRhZ2dlZFN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tzdHJpbmddOiB7W251bWJlcl06ID9TdHlsZUdseXBofX0pIHtcbiAgICBsZXQgdG90YWxXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbG9naWNhbElucHV0Lmxlbmd0aCgpOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsb2dpY2FsSW5wdXQuZ2V0U2VjdGlvbihpbmRleCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGdseXBoTWFwW3NlY3Rpb24uZm9udFN0YWNrXTtcbiAgICAgICAgY29uc3QgZ2x5cGggPSBwb3NpdGlvbnMgJiYgcG9zaXRpb25zW2xvZ2ljYWxJbnB1dC5nZXRDaGFyQ29kZShpbmRleCldO1xuICAgICAgICBpZiAoIWdseXBoKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIHRvdGFsV2lkdGggKz0gZ2x5cGgubWV0cmljcy5hZHZhbmNlICogc2VjdGlvbi5zY2FsZSArIHNwYWNpbmc7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZUNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsV2lkdGggLyBtYXhXaWR0aCkpO1xuICAgIHJldHVybiB0b3RhbFdpZHRoIC8gbGluZUNvdW50O1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVCYWRuZXNzKGxpbmVXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5hbHR5OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGFzdEJyZWFrOiBib29sZWFuKSB7XG4gICAgY29uc3QgcmFnZ2VkbmVzcyA9IE1hdGgucG93KGxpbmVXaWR0aCAtIHRhcmdldFdpZHRoLCAyKTtcbiAgICBpZiAoaXNMYXN0QnJlYWspIHtcbiAgICAgICAgLy8gRmF2b3IgZmluYWxzIGxpbmVzIHNob3J0ZXIgdGhhbiBhdmVyYWdlIG92ZXIgbG9uZ2VyIHRoYW4gYXZlcmFnZVxuICAgICAgICBpZiAobGluZVdpZHRoIDwgdGFyZ2V0V2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiByYWdnZWRuZXNzIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByYWdnZWRuZXNzICogMjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByYWdnZWRuZXNzICsgTWF0aC5hYnMocGVuYWx0eSkgKiBwZW5hbHR5O1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVQZW5hbHR5KGNvZGVQb2ludDogbnVtYmVyLCBuZXh0Q29kZVBvaW50OiBudW1iZXIsIHBlbmFsaXphYmxlSWRlb2dyYXBoaWNCcmVhazogYm9vbGVhbikge1xuICAgIGxldCBwZW5hbHR5ID0gMDtcbiAgICAvLyBGb3JjZSBicmVhayBvbiBuZXdsaW5lXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gMHgwYSkge1xuICAgICAgICBwZW5hbHR5IC09IDEwMDAwO1xuICAgIH1cbiAgICAvLyBQZW5hbGl6ZSBicmVha3MgYmV0d2VlbiBjaGFyYWN0ZXJzIHRoYXQgYWxsb3cgaWRlb2dyYXBoaWMgYnJlYWtpbmcgYmVjYXVzZVxuICAgIC8vIHRoZXkgYXJlIGxlc3MgcHJlZmVyYWJsZSB0aGFuIGJyZWFrcyBhdCBzcGFjZXMgKG9yIHplcm8gd2lkdGggc3BhY2VzKS5cbiAgICBpZiAocGVuYWxpemFibGVJZGVvZ3JhcGhpY0JyZWFrKSB7XG4gICAgICAgIHBlbmFsdHkgKz0gMTUwO1xuICAgIH1cblxuICAgIC8vIFBlbmFsaXplIG9wZW4gcGFyZW50aGVzaXMgYXQgZW5kIG9mIGxpbmVcbiAgICBpZiAoY29kZVBvaW50ID09PSAweDI4IHx8IGNvZGVQb2ludCA9PT0gMHhmZjA4KSB7XG4gICAgICAgIHBlbmFsdHkgKz0gNTA7XG4gICAgfVxuXG4gICAgLy8gUGVuYWxpemUgY2xvc2UgcGFyZW50aGVzaXMgYXQgYmVnaW5uaW5nIG9mIGxpbmVcbiAgICBpZiAobmV4dENvZGVQb2ludCA9PT0gMHgyOSB8fCBuZXh0Q29kZVBvaW50ID09PSAweGZmMDkpIHtcbiAgICAgICAgcGVuYWx0eSArPSA1MDtcbiAgICB9XG4gICAgcmV0dXJuIHBlbmFsdHk7XG59XG5cbnR5cGUgQnJlYWsgPSB7XG4gICAgaW5kZXg6IG51bWJlcixcbiAgICB4OiBudW1iZXIsXG4gICAgcHJpb3JCcmVhazogP0JyZWFrLFxuICAgIGJhZG5lc3M6IG51bWJlclxufTtcblxuZnVuY3Rpb24gZXZhbHVhdGVCcmVhayhicmVha0luZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrWDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxCcmVha3M6IEFycmF5PEJyZWFrPixcbiAgICAgICAgICAgICAgICAgICAgICAgcGVuYWx0eTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3RCcmVhazogYm9vbGVhbik6IEJyZWFrIHtcbiAgICAvLyBXZSBjb3VsZCBza2lwIGV2YWx1YXRpbmcgYnJlYWtzIHdoZXJlIHRoZSBsaW5lIGxlbmd0aCAoYnJlYWtYIC0gcHJpb3JCcmVhay54KSA+IG1heFdpZHRoXG4gICAgLy8gIC4uLmJ1dCBpbiBmYWN0IHdlIGFsbG93IGxpbmVzIGxvbmdlciB0aGFuIG1heFdpZHRoIChpZiB0aGVyZSdzIG5vIGJyZWFrIHBvaW50cylcbiAgICAvLyAgLi4uYW5kIHdoZW4gdGFyZ2V0V2lkdGggYW5kIG1heFdpZHRoIGFyZSBjbG9zZSwgc3RyaWN0bHkgZW5mb3JjaW5nIG1heFdpZHRoIGNhbiBnaXZlXG4gICAgLy8gICAgIG1vcmUgbG9wc2lkZWQgcmVzdWx0cy5cblxuICAgIGxldCBiZXN0UHJpb3JCcmVhazogP0JyZWFrID0gbnVsbDtcbiAgICBsZXQgYmVzdEJyZWFrQmFkbmVzcyA9IGNhbGN1bGF0ZUJhZG5lc3MoYnJlYWtYLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspO1xuXG4gICAgZm9yIChjb25zdCBwb3RlbnRpYWxCcmVhayBvZiBwb3RlbnRpYWxCcmVha3MpIHtcbiAgICAgICAgY29uc3QgbGluZVdpZHRoID0gYnJlYWtYIC0gcG90ZW50aWFsQnJlYWsueDtcbiAgICAgICAgY29uc3QgYnJlYWtCYWRuZXNzID1cbiAgICAgICAgICAgIGNhbGN1bGF0ZUJhZG5lc3MobGluZVdpZHRoLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspICsgcG90ZW50aWFsQnJlYWsuYmFkbmVzcztcbiAgICAgICAgaWYgKGJyZWFrQmFkbmVzcyA8PSBiZXN0QnJlYWtCYWRuZXNzKSB7XG4gICAgICAgICAgICBiZXN0UHJpb3JCcmVhayA9IHBvdGVudGlhbEJyZWFrO1xuICAgICAgICAgICAgYmVzdEJyZWFrQmFkbmVzcyA9IGJyZWFrQmFkbmVzcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGluZGV4OiBicmVha0luZGV4LFxuICAgICAgICB4OiBicmVha1gsXG4gICAgICAgIHByaW9yQnJlYWs6IGJlc3RQcmlvckJyZWFrLFxuICAgICAgICBiYWRuZXNzOiBiZXN0QnJlYWtCYWRuZXNzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbGVhc3RCYWRCcmVha3MobGFzdExpbmVCcmVhazogP0JyZWFrKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgaWYgKCFsYXN0TGluZUJyZWFrKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGxlYXN0QmFkQnJlYWtzKGxhc3RMaW5lQnJlYWsucHJpb3JCcmVhaykuY29uY2F0KGxhc3RMaW5lQnJlYWsuaW5kZXgpO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVMaW5lQnJlYWtzKGxvZ2ljYWxJbnB1dDogVGFnZ2VkU3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W3N0cmluZ106IHtbbnVtYmVyXTogP1N0eWxlR2x5cGh9fSk6IEFycmF5PG51bWJlcj4ge1xuICAgIGlmICghbWF4V2lkdGgpXG4gICAgICAgIHJldHVybiBbXTtcblxuICAgIGlmICghbG9naWNhbElucHV0KVxuICAgICAgICByZXR1cm4gW107XG5cbiAgICBjb25zdCBwb3RlbnRpYWxMaW5lQnJlYWtzID0gW107XG4gICAgY29uc3QgdGFyZ2V0V2lkdGggPSBkZXRlcm1pbmVBdmVyYWdlTGluZVdpZHRoKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBoTWFwKTtcblxuICAgIGNvbnN0IGhhc1NlcnZlclN1Z2dlc3RlZEJyZWFrcG9pbnRzID0gbG9naWNhbElucHV0LnRleHQuaW5kZXhPZihcIlxcdTIwMGJcIikgPj0gMDtcblxuICAgIGxldCBjdXJyZW50WCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvZ2ljYWxJbnB1dC5sZW5ndGgoKTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsb2dpY2FsSW5wdXQuZ2V0U2VjdGlvbihpKTtcbiAgICAgICAgY29uc3QgY29kZVBvaW50ID0gbG9naWNhbElucHV0LmdldENoYXJDb2RlKGkpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBnbHlwaE1hcFtzZWN0aW9uLmZvbnRTdGFja107XG4gICAgICAgIGNvbnN0IGdseXBoID0gcG9zaXRpb25zICYmIHBvc2l0aW9uc1tjb2RlUG9pbnRdO1xuXG4gICAgICAgIGlmIChnbHlwaCAmJiAhd2hpdGVzcGFjZVtjb2RlUG9pbnRdKVxuICAgICAgICAgICAgY3VycmVudFggKz0gZ2x5cGgubWV0cmljcy5hZHZhbmNlICogc2VjdGlvbi5zY2FsZSArIHNwYWNpbmc7XG5cbiAgICAgICAgLy8gSWRlb2dyYXBoaWMgY2hhcmFjdGVycywgc3BhY2VzLCBhbmQgd29yZC1icmVha2luZyBwdW5jdHVhdGlvbiB0aGF0IG9mdGVuIGFwcGVhciB3aXRob3V0XG4gICAgICAgIC8vIHN1cnJvdW5kaW5nIHNwYWNlcy5cbiAgICAgICAgaWYgKChpIDwgbG9naWNhbElucHV0Lmxlbmd0aCgpIC0gMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW9ncmFwaGljQnJlYWsgPSBjaGFyQWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjb2RlUG9pbnQpO1xuICAgICAgICAgICAgaWYgKGJyZWFrYWJsZVtjb2RlUG9pbnRdIHx8IGlkZW9ncmFwaGljQnJlYWspIHtcblxuICAgICAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MucHVzaChcbiAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVCcmVhayhcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVQZW5hbHR5KGNvZGVQb2ludCwgbG9naWNhbElucHV0LmdldENoYXJDb2RlKGkgKyAxKSwgaWRlb2dyYXBoaWNCcmVhayAmJiBoYXNTZXJ2ZXJTdWdnZXN0ZWRCcmVha3BvaW50cyksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYXN0QmFkQnJlYWtzKFxuICAgICAgICBldmFsdWF0ZUJyZWFrKFxuICAgICAgICAgICAgbG9naWNhbElucHV0Lmxlbmd0aCgpLFxuICAgICAgICAgICAgY3VycmVudFgsXG4gICAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgdHJ1ZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRBbmNob3JBbGlnbm1lbnQoYW5jaG9yOiBTeW1ib2xBbmNob3IpIHtcbiAgICBsZXQgaG9yaXpvbnRhbEFsaWduID0gMC41LCB2ZXJ0aWNhbEFsaWduID0gMC41O1xuXG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIHZlcnRpY2FsQWxpZ24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICB2ZXJ0aWNhbEFsaWduID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduIH07XG59XG5cbmZ1bmN0aW9uIHNoYXBlTGluZXMoc2hhcGluZzogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXA6IHtbc3RyaW5nXToge1tudW1iZXJdOiA/U3R5bGVHbHlwaH19LFxuICAgICAgICAgICAgICAgICAgICBsaW5lczogQXJyYXk8VGFnZ2VkU3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yOiBTeW1ib2xBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZ5OiBUZXh0SnVzdGlmeSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IDEgfCAyLFxuICAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93VmVydGljYWxQbGFjZW1lbnQ6IGJvb2xlYW4pIHtcblxuICAgIGxldCB4ID0gMDtcbiAgICBsZXQgeSA9IHNoYXBpbmcueU9mZnNldDtcblxuICAgIGxldCBtYXhMaW5lTGVuZ3RoID0gMDtcbiAgICBjb25zdCBwb3NpdGlvbmVkR2x5cGhzID0gc2hhcGluZy5wb3NpdGlvbmVkR2x5cGhzO1xuXG4gICAgY29uc3QganVzdGlmeSA9XG4gICAgICAgIHRleHRKdXN0aWZ5ID09PSAncmlnaHQnID8gMSA6XG4gICAgICAgIHRleHRKdXN0aWZ5ID09PSAnbGVmdCcgPyAwIDogMC41O1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGxpbmUudHJpbSgpO1xuXG4gICAgICAgIGNvbnN0IGxpbmVNYXhTY2FsZSA9IGxpbmUuZ2V0TWF4U2NhbGUoKTtcblxuICAgICAgICBpZiAoIWxpbmUubGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIHkgKz0gbGluZUhlaWdodDsgLy8gU3RpbGwgbmVlZCBhIGxpbmUgZmVlZCBhZnRlciBlbXB0eSBsaW5lXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gcG9zaXRpb25lZEdseXBocy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGgoKTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gbGluZS5nZXRTZWN0aW9uKGkpO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkluZGV4ID0gbGluZS5nZXRTZWN0aW9uSW5kZXgoaSk7XG4gICAgICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBsaW5lLmdldENoYXJDb2RlKGkpO1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYmFzZWxpbmUsIGJ1dCBzaW5jZSB3ZSdyZSBsYXlpbmcgb3V0XG4gICAgICAgICAgICAvLyBhdCAyNCBwb2ludHMsIHdlIGNhbiBjYWxjdWxhdGUgaG93IG11Y2ggaXQgd2lsbCBtb3ZlIHdoZW5cbiAgICAgICAgICAgIC8vIHdlIHNjYWxlIHVwIG9yIGRvd24uXG4gICAgICAgICAgICBjb25zdCBiYXNlbGluZU9mZnNldCA9IChsaW5lTWF4U2NhbGUgLSBzZWN0aW9uLnNjYWxlKSAqIDI0O1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZ2x5cGhNYXBbc2VjdGlvbi5mb250U3RhY2tdO1xuICAgICAgICAgICAgY29uc3QgZ2x5cGggPSBwb3NpdGlvbnMgJiYgcG9zaXRpb25zW2NvZGVQb2ludF07XG5cbiAgICAgICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWwgfHxcbiAgICAgICAgICAgICAgICAvLyBEb24ndCB2ZXJ0aWNhbGl6ZSBnbHlwaHMgdGhhdCBoYXZlIG5vIHVwcmlnaHQgb3JpZW50YXRpb24gaWYgdmVydGljYWwgcGxhY2VtZW50IGlzIGRpc2FibGVkLlxuICAgICAgICAgICAgICAgICghYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAhY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNvZGVQb2ludCkpIHx8XG4gICAgICAgICAgICAgICAgLy8gSWYgdmVydGljYWwgcGxhY2VtZW50IGlzIGViYWJsZWQsIGRvbid0IHZlcnRpY2FsaXplIGdseXBocyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIGZyb20gY29tcGxleCB0ZXh0IGxheW91dCBzY3JpcHQsIG9yIHdoaXRlc3BhY2VzLlxuICAgICAgICAgICAgICAgIChhbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICh3aGl0ZXNwYWNlW2NvZGVQb2ludF0gfHwgY2hhckluQ29tcGxleFNoYXBpbmdTY3JpcHQoY29kZVBvaW50KSkpKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25lZEdseXBocy5wdXNoKHtnbHlwaDogY29kZVBvaW50LCB4LCB5OiB5ICsgYmFzZWxpbmVPZmZzZXQsIHZlcnRpY2FsOiBmYWxzZSwgc2NhbGU6IHNlY3Rpb24uc2NhbGUsIGZvbnRTdGFjazogc2VjdGlvbi5mb250U3RhY2ssIHNlY3Rpb25JbmRleH0pO1xuICAgICAgICAgICAgICAgIHggKz0gZ2x5cGgubWV0cmljcy5hZHZhbmNlICogc2VjdGlvbi5zY2FsZSArIHNwYWNpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHMucHVzaCh7Z2x5cGg6IGNvZGVQb2ludCwgeCwgeTogeSArIGJhc2VsaW5lT2Zmc2V0LCB2ZXJ0aWNhbDogdHJ1ZSwgc2NhbGU6IHNlY3Rpb24uc2NhbGUsIGZvbnRTdGFjazogc2VjdGlvbi5mb250U3RhY2ssIHNlY3Rpb25JbmRleH0pO1xuICAgICAgICAgICAgICAgIHggKz0gT05FX0VNICogc2VjdGlvbi5zY2FsZSArIHNwYWNpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGp1c3RpZnkgaWYgd2UgcGxhY2VkIGF0IGxlYXN0IG9uZSBnbHlwaFxuICAgICAgICBpZiAocG9zaXRpb25lZEdseXBocy5sZW5ndGggIT09IGxpbmVTdGFydEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0geCAtIHNwYWNpbmc7XG4gICAgICAgICAgICBtYXhMaW5lTGVuZ3RoID0gTWF0aC5tYXgobGluZUxlbmd0aCwgbWF4TGluZUxlbmd0aCk7XG5cbiAgICAgICAgICAgIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGdseXBoTWFwLCBsaW5lU3RhcnRJbmRleCwgcG9zaXRpb25lZEdseXBocy5sZW5ndGggLSAxLCBqdXN0aWZ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHggPSAwO1xuICAgICAgICB5ICs9IGxpbmVIZWlnaHQgKiBsaW5lTWF4U2NhbGU7XG4gICAgfVxuXG4gICAgY29uc3Qge2hvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbn0gPSBnZXRBbmNob3JBbGlnbm1lbnQodGV4dEFuY2hvcik7XG4gICAgYWxpZ24ocG9zaXRpb25lZEdseXBocywganVzdGlmeSwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBtYXhMaW5lTGVuZ3RoLCBsaW5lSGVpZ2h0LCBsaW5lcy5sZW5ndGgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBib3VuZGluZyBib3hcbiAgICBjb25zdCBoZWlnaHQgPSB5IC0gc2hhcGluZy55T2Zmc2V0O1xuXG4gICAgc2hhcGluZy50b3AgKz0gLXZlcnRpY2FsQWxpZ24gKiBoZWlnaHQ7XG4gICAgc2hhcGluZy5ib3R0b20gPSBzaGFwaW5nLnRvcCArIGhlaWdodDtcbiAgICBzaGFwaW5nLmxlZnQgKz0gLWhvcml6b250YWxBbGlnbiAqIG1heExpbmVMZW5ndGg7XG4gICAgc2hhcGluZy5yaWdodCA9IHNoYXBpbmcubGVmdCArIG1heExpbmVMZW5ndGg7XG59XG5cbi8vIGp1c3RpZnkgcmlnaHQgPSAxLCBsZWZ0ID0gMCwgY2VudGVyID0gMC41XG5mdW5jdGlvbiBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzOiBBcnJheTxQb3NpdGlvbmVkR2x5cGg+LFxuICAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXA6IHtbc3RyaW5nXToge1tudW1iZXJdOiA/U3R5bGVHbHlwaH19LFxuICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgIGVuZDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAganVzdGlmeTogMSB8IDAgfCAwLjUpIHtcbiAgICBpZiAoIWp1c3RpZnkpXG4gICAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IGxhc3RQb3NpdGlvbmVkR2x5cGggPSBwb3NpdGlvbmVkR2x5cGhzW2VuZF07XG4gICAgY29uc3QgcG9zaXRpb25zID0gZ2x5cGhNYXBbbGFzdFBvc2l0aW9uZWRHbHlwaC5mb250U3RhY2tdO1xuICAgIGNvbnN0IGdseXBoID0gcG9zaXRpb25zICYmIHBvc2l0aW9uc1tsYXN0UG9zaXRpb25lZEdseXBoLmdseXBoXTtcbiAgICBpZiAoZ2x5cGgpIHtcbiAgICAgICAgY29uc3QgbGFzdEFkdmFuY2UgPSBnbHlwaC5tZXRyaWNzLmFkdmFuY2UgKiBsYXN0UG9zaXRpb25lZEdseXBoLnNjYWxlO1xuICAgICAgICBjb25zdCBsaW5lSW5kZW50ID0gKHBvc2l0aW9uZWRHbHlwaHNbZW5kXS54ICsgbGFzdEFkdmFuY2UpICoganVzdGlmeTtcblxuICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHtcbiAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHNbal0ueCAtPSBsaW5lSW5kZW50O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhbGlnbihwb3NpdGlvbmVkR2x5cGhzOiBBcnJheTxQb3NpdGlvbmVkR2x5cGg+LFxuICAgICAgICAgICAgICAganVzdGlmeTogbnVtYmVyLFxuICAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiBudW1iZXIsXG4gICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBudW1iZXIsXG4gICAgICAgICAgICAgICBtYXhMaW5lTGVuZ3RoOiBudW1iZXIsXG4gICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICBsaW5lQ291bnQ6IG51bWJlcikge1xuICAgIGNvbnN0IHNoaWZ0WCA9IChqdXN0aWZ5IC0gaG9yaXpvbnRhbEFsaWduKSAqIG1heExpbmVMZW5ndGg7XG4gICAgY29uc3Qgc2hpZnRZID0gKC12ZXJ0aWNhbEFsaWduICogbGluZUNvdW50ICsgMC41KSAqIGxpbmVIZWlnaHQ7XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS54ICs9IHNoaWZ0WDtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS55ICs9IHNoaWZ0WTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFBvc2l0aW9uZWRJY29uID0ge1xuICAgIGltYWdlOiBJbWFnZVBvc2l0aW9uLFxuICAgIHRvcDogbnVtYmVyLFxuICAgIGJvdHRvbTogbnVtYmVyLFxuICAgIGxlZnQ6IG51bWJlcixcbiAgICByaWdodDogbnVtYmVyXG59O1xuXG5mdW5jdGlvbiBzaGFwZUljb24oaW1hZ2U6IEltYWdlUG9zaXRpb24sIGljb25PZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sIGljb25BbmNob3I6IFN5bWJvbEFuY2hvcik6IFBvc2l0aW9uZWRJY29uIHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudChpY29uQW5jaG9yKTtcbiAgICBjb25zdCBkeCA9IGljb25PZmZzZXRbMF07XG4gICAgY29uc3QgZHkgPSBpY29uT2Zmc2V0WzFdO1xuICAgIGNvbnN0IHgxID0gZHggLSBpbWFnZS5kaXNwbGF5U2l6ZVswXSAqIGhvcml6b250YWxBbGlnbjtcbiAgICBjb25zdCB4MiA9IHgxICsgaW1hZ2UuZGlzcGxheVNpemVbMF07XG4gICAgY29uc3QgeTEgPSBkeSAtIGltYWdlLmRpc3BsYXlTaXplWzFdICogdmVydGljYWxBbGlnbjtcbiAgICBjb25zdCB5MiA9IHkxICsgaW1hZ2UuZGlzcGxheVNpemVbMV07XG4gICAgcmV0dXJuIHtpbWFnZSwgdG9wOiB5MSwgYm90dG9tOiB5MiwgbGVmdDogeDEsIHJpZ2h0OiB4Mn07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuY2xhc3MgQW5jaG9yIGV4dGVuZHMgUG9pbnQge1xuICAgIGFuZ2xlOiBhbnk7XG4gICAgc2VnbWVudDogbnVtYmVyIHwgdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHg6IG51bWJlciwgeTogbnVtYmVyLCBhbmdsZTogbnVtYmVyLCBzZWdtZW50PzogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKHgsIHkpO1xuICAgICAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XG4gICAgICAgIGlmIChzZWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudCA9IHNlZ21lbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcy54LCB0aGlzLnksIHRoaXMuYW5nbGUsIHRoaXMuc2VnbWVudCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignQW5jaG9yJywgQW5jaG9yKTtcblxuZXhwb3J0IGRlZmF1bHQgQW5jaG9yO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgbnVtYmVyIGFzIGludGVycG9sYXRlIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUnO1xuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5cbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbHVlLCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWV9IGZyb20gJy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0ludGVycG9sYXRpb25UeXBlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUnO1xuXG5jb25zdCBTSVpFX1BBQ0tfRkFDVE9SID0gMjU2O1xuXG5leHBvcnQgeyBnZXRTaXplRGF0YSwgZXZhbHVhdGVTaXplRm9yRmVhdHVyZSwgZXZhbHVhdGVTaXplRm9yWm9vbSwgU0laRV9QQUNLX0ZBQ1RPUiB9O1xuXG5leHBvcnQgdHlwZSBTaXplRGF0YSA9IHtcbiAgICBraW5kOiAnY29uc3RhbnQnLFxuICAgIGxheW91dFNpemU6IG51bWJlclxufSB8IHtcbiAgICBraW5kOiAnc291cmNlJ1xufSB8IHtcbiAgICBraW5kOiAnY2FtZXJhJyxcbiAgICBtaW5ab29tOiBudW1iZXIsXG4gICAgbWF4Wm9vbTogbnVtYmVyLFxuICAgIG1pblNpemU6IG51bWJlcixcbiAgICBtYXhTaXplOiBudW1iZXIsXG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZVxufSB8IHtcbiAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICBtaW5ab29tOiBudW1iZXIsXG4gICAgbWF4Wm9vbTogbnVtYmVyLFxuICAgIGludGVycG9sYXRpb25UeXBlOiA/SW50ZXJwb2xhdGlvblR5cGVcbn07XG5cbi8vIEZvciB7dGV4dCxpY29ufS1zaXplLCBnZXQgdGhlIGJ1Y2tldC1sZXZlbCBkYXRhIHRoYXQgd2lsbCBiZSBuZWVkZWQgYnlcbi8vIHRoZSBwYWludGVyIHRvIHNldCBzeW1ib2wtc2l6ZS1yZWxhdGVkIHVuaWZvcm1zXG5mdW5jdGlvbiBnZXRTaXplRGF0YSh0aWxlWm9vbTogbnVtYmVyLCB2YWx1ZTogUHJvcGVydHlWYWx1ZTxudW1iZXIsIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+Pik6IFNpemVEYXRhIHtcbiAgICBjb25zdCB7ZXhwcmVzc2lvbn0gPSB2YWx1ZTtcblxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0U2l6ZSA9IGV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRpbGVab29tICsgMSkpO1xuICAgICAgICByZXR1cm4ge2tpbmQ6ICdjb25zdGFudCcsIGxheW91dFNpemV9O1xuXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIHJldHVybiB7a2luZDogJ3NvdXJjZSd9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qge3pvb21TdG9wcywgaW50ZXJwb2xhdGlvblR5cGV9ID0gZXhwcmVzc2lvbjtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgY292ZXJpbmcgem9vbSBzdG9wcyBmb3Igem9vbS1kZXBlbmRlbnQgdmFsdWVzXG4gICAgICAgIGxldCBsb3dlciA9IDA7XG4gICAgICAgIHdoaWxlIChsb3dlciA8IHpvb21TdG9wcy5sZW5ndGggJiYgem9vbVN0b3BzW2xvd2VyXSA8PSB0aWxlWm9vbSkgbG93ZXIrKztcbiAgICAgICAgbG93ZXIgPSBNYXRoLm1heCgwLCBsb3dlciAtIDEpO1xuICAgICAgICBsZXQgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgd2hpbGUgKHVwcGVyIDwgem9vbVN0b3BzLmxlbmd0aCAmJiB6b29tU3RvcHNbdXBwZXJdIDwgdGlsZVpvb20gKyAxKSB1cHBlcisrO1xuICAgICAgICB1cHBlciA9IE1hdGgubWluKHpvb21TdG9wcy5sZW5ndGggLSAxLCB1cHBlcik7XG5cbiAgICAgICAgY29uc3QgbWluWm9vbSA9IHpvb21TdG9wc1tsb3dlcl07XG4gICAgICAgIGNvbnN0IG1heFpvb20gPSB6b29tU3RvcHNbdXBwZXJdO1xuXG4gICAgICAgIC8vIFdlJ2QgbGlrZSB0byBiZSBhYmxlIHRvIHVzZSBDYW1lcmFFeHByZXNzaW9uIG9yIENvbXBvc2l0ZUV4cHJlc3Npb24gaW4gdGhlc2VcbiAgICAgICAgLy8gcmV0dXJuIHR5cGVzIHJhdGhlciB0aGFuIEV4cHJlc3Npb25TcGVjaWZpY2F0aW9uLCBidXQgdGhlIGZvcm1lciBhcmUgbm90XG4gICAgICAgIC8vIHRyYW5zZmVycmFibGUgYWNyb3NzIFdlYiBXb3JrZXIgYm91bmRhcmllcy5cbiAgICAgICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB7a2luZDogJ2NvbXBvc2l0ZScsIG1pblpvb20sIG1heFpvb20sIGludGVycG9sYXRpb25UeXBlfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZvciBjYW1lcmEgZnVuY3Rpb25zLCBhbHNvIHNhdmUgb2ZmIHRoZSBmdW5jdGlvbiB2YWx1ZXNcbiAgICAgICAgLy8gZXZhbHVhdGVkIGF0IHRoZSBjb3ZlcmluZyB6b29tIGxldmVsc1xuICAgICAgICBjb25zdCBtaW5TaXplID0gZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMobWluWm9vbSkpO1xuICAgICAgICBjb25zdCBtYXhTaXplID0gZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMobWF4Wm9vbSkpO1xuXG4gICAgICAgIHJldHVybiB7a2luZDogJ2NhbWVyYScsIG1pblpvb20sIG1heFpvb20sIG1pblNpemUsIG1heFNpemUsIGludGVycG9sYXRpb25UeXBlfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlU2l6ZUZvckZlYXR1cmUoc2l6ZURhdGE6IFNpemVEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dVNpemUsIHVTaXplVH06IHsgdVNpemU6IG51bWJlciwgdVNpemVUOiBudW1iZXIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2xvd2VyU2l6ZSwgdXBwZXJTaXplfTogeyBsb3dlclNpemU6IG51bWJlciwgdXBwZXJTaXplOiBudW1iZXJ9KSB7XG4gICAgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIHJldHVybiBsb3dlclNpemUgLyBTSVpFX1BBQ0tfRkFDVE9SO1xuICAgIH0gZWxzZSBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGxvd2VyU2l6ZSAvIFNJWkVfUEFDS19GQUNUT1IsIHVwcGVyU2l6ZSAvIFNJWkVfUEFDS19GQUNUT1IsIHVTaXplVCk7XG4gICAgfVxuICAgIHJldHVybiB1U2l6ZTtcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVTaXplRm9yWm9vbShzaXplRGF0YTogU2l6ZURhdGEsIHpvb206IG51bWJlcikge1xuICAgIGxldCB1U2l6ZVQgPSAwO1xuICAgIGxldCB1U2l6ZSA9IDA7XG5cbiAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICB1U2l6ZSA9IHNpemVEYXRhLmxheW91dFNpemU7XG5cbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmtpbmQgIT09ICdzb3VyY2UnKSB7XG4gICAgICAgIGNvbnN0IHtpbnRlcnBvbGF0aW9uVHlwZSwgbWluWm9vbSwgbWF4Wm9vbX0gPSBzaXplRGF0YTtcblxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBjb3VsZCBnZXQgdGhlIGV4YWN0IHZhbHVlIG9mIHRoZSBjYW1lcmEgZnVuY3Rpb25cbiAgICAgICAgLy8gYXQgeiA9IHRyLnpvb20sIHdlIGludGVudGlvbmFsbHkgZG8gbm90OiBpbnN0ZWFkLCB3ZSBpbnRlcnBvbGF0ZVxuICAgICAgICAvLyBiZXR3ZWVuIHRoZSBjYW1lcmEgZnVuY3Rpb24gdmFsdWVzIGF0IGEgcGFpciBvZiB6b29tIHN0b3BzIGNvdmVyaW5nXG4gICAgICAgIC8vIFt0aWxlWm9vbSwgdGlsZVpvb20gKyAxXSBpbiBvcmRlciB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhpc1xuICAgICAgICAvLyByZXN0cmljdGlvbiBvbiBjb21wb3NpdGUgZnVuY3Rpb25zXG4gICAgICAgIGNvbnN0IHQgPSAhaW50ZXJwb2xhdGlvblR5cGUgPyAwIDogY2xhbXAoXG4gICAgICAgICAgICBJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0aW9uRmFjdG9yKGludGVycG9sYXRpb25UeXBlLCB6b29tLCBtaW5ab29tLCBtYXhab29tKSwgMCwgMSk7XG5cbiAgICAgICAgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjYW1lcmEnKSB7XG4gICAgICAgICAgICB1U2l6ZSA9IGludGVycG9sYXRlKHNpemVEYXRhLm1pblNpemUsIHNpemVEYXRhLm1heFNpemUsIHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdVNpemVUID0gdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7dVNpemVULCB1U2l6ZX07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBzeW1ib2xMYXlvdXRBdHRyaWJ1dGVzLFxuICAgIGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXMsXG4gICAgY29sbGlzaW9uQm94TGF5b3V0LFxuICAgIGNvbGxpc2lvbkNpcmNsZUxheW91dCxcbiAgICBkeW5hbWljTGF5b3V0QXR0cmlidXRlc1xufSBmcm9tICcuL3N5bWJvbF9hdHRyaWJ1dGVzJztcblxuaW1wb3J0IHsgU3ltYm9sTGF5b3V0QXJyYXksXG4gICAgU3ltYm9sRHluYW1pY0xheW91dEFycmF5LFxuICAgIFN5bWJvbE9wYWNpdHlBcnJheSxcbiAgICBDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSxcbiAgICBDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheSxcbiAgICBDb2xsaXNpb25WZXJ0ZXhBcnJheSxcbiAgICBQbGFjZWRTeW1ib2xBcnJheSxcbiAgICBTeW1ib2xJbnN0YW5jZUFycmF5LFxuICAgIEdseXBoT2Zmc2V0QXJyYXksXG4gICAgU3ltYm9sTGluZVZlcnRleEFycmF5XG59IGZyb20gJy4uL2FycmF5X3R5cGVzJztcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudCc7XG5pbXBvcnQgeyBQcm9ncmFtQ29uZmlndXJhdGlvblNldCB9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBUcmlhbmdsZUluZGV4QXJyYXksIExpbmVJbmRleEFycmF5IH0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZSc7XG5pbXBvcnQgdHJhbnNmb3JtVGV4dCBmcm9tICcuLi8uLi9zeW1ib2wvdHJhbnNmb3JtX3RleHQnO1xuaW1wb3J0IG1lcmdlTGluZXMgZnJvbSAnLi4vLi4vc3ltYm9sL21lcmdlbGluZXMnO1xuaW1wb3J0IHthbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlfSBmcm9tICcuLi8uLi91dGlsL3NjcmlwdF9kZXRlY3Rpb24nO1xuaW1wb3J0IHsgV3JpdGluZ01vZGUgfSBmcm9tICcuLi8uLi9zeW1ib2wvc2hhcGluZyc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnknO1xuaW1wb3J0IG12dCBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmNvbnN0IHZlY3RvclRpbGVGZWF0dXJlVHlwZXMgPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXM7XG5pbXBvcnQge3ZlcnRpY2FsaXplZENoYXJhY3Rlck1hcH0gZnJvbSAnLi4vLi4vdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbic7XG5pbXBvcnQgQW5jaG9yIGZyb20gJy4uLy4uL3N5bWJvbC9hbmNob3InO1xuaW1wb3J0IHsgZ2V0U2l6ZURhdGEgfSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX3NpemUnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgSW5kZXhlZEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7Q29sbGlzaW9uQm94QXJyYXksIENvbGxpc2lvbkJveCwgU3ltYm9sSW5zdGFuY2V9IGZyb20gJy4uL2FycmF5X3R5cGVzJztcbmltcG9ydCB0eXBlIHsgU3RydWN0QXJyYXksIFN0cnVjdEFycmF5TWVtYmVyIH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuaW1wb3J0IFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUge1N5bWJvbFF1YWR9IGZyb20gJy4uLy4uL3N5bWJvbC9xdWFkcyc7XG5pbXBvcnQgdHlwZSB7U2l6ZURhdGF9IGZyb20gJy4uLy4uL3N5bWJvbC9zeW1ib2xfc2l6ZSc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcblxuZXhwb3J0IHR5cGUgU2luZ2xlQ29sbGlzaW9uQm94ID0ge1xuICAgIHgxOiBudW1iZXI7XG4gICAgeTE6IG51bWJlcjtcbiAgICB4MjogbnVtYmVyO1xuICAgIHkyOiBudW1iZXI7XG4gICAgYW5jaG9yUG9pbnRYOiBudW1iZXI7XG4gICAgYW5jaG9yUG9pbnRZOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBDb2xsaXNpb25BcnJheXMgPSB7XG4gICAgdGV4dEJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICB2ZXJ0aWNhbFRleHRCb3g/OiBTaW5nbGVDb2xsaXNpb25Cb3g7XG4gICAgaWNvbkJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICB0ZXh0Q2lyY2xlcz86IEFycmF5PG51bWJlcj47XG4gICAgdGV4dEZlYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICB2ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXg/OiBudW1iZXI7XG4gICAgaWNvbkZlYXR1cmVJbmRleD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEZlYXR1cmUgPSB7fFxuICAgIHNvcnRLZXk6IG51bWJlciB8IHZvaWQsXG4gICAgdGV4dDogRm9ybWF0dGVkIHwgdm9pZCxcbiAgICBpY29uOiBzdHJpbmcgfCB2b2lkLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgIHByb3BlcnRpZXM6IE9iamVjdCxcbiAgICB0eXBlOiAnUG9pbnQnIHwgJ0xpbmVTdHJpbmcnIHwgJ1BvbHlnb24nLFxuICAgIGlkPzogYW55XG58fTtcblxuLy8gT3BhY2l0eSBhcnJheXMgYXJlIGZyZXF1ZW50bHkgdXBkYXRlZCBidXQgZG9uJ3QgY29udGFpbiBhIGxvdCBvZiBpbmZvcm1hdGlvbiwgc28gd2UgcGFjayB0aGVtXG4vLyB0aWdodC4gRWFjaCBVaW50MzIgaXMgYWN0dWFsbHkgZm91ciBkdXBsaWNhdGUgVWludDhzIGZvciB0aGUgZm91ciBjb3JuZXJzIG9mIGEgZ2x5cGhcbi8vIDcgYml0cyBhcmUgZm9yIHRoZSBjdXJyZW50IG9wYWNpdHksIGFuZCB0aGUgbG93ZXN0IGJpdCBpcyB0aGUgdGFyZ2V0IG9wYWNpdHlcblxuLy8gYWN0dWFsbHkgZGVmaW5lZCBpbiBzeW1ib2xfYXR0cmlidXRlcy5qc1xuLy8gY29uc3QgcGxhY2VtZW50T3BhY2l0eUF0dHJpYnV0ZXMgPSBbXG4vLyAgICAgeyBuYW1lOiAnYV9mYWRlX29wYWNpdHknLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnVWludDMyJyB9XG4vLyBdO1xuY29uc3Qgc2hhZGVyT3BhY2l0eUF0dHJpYnV0ZXMgPSBbXG4gICAgeyBuYW1lOiAnYV9mYWRlX29wYWNpdHknLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnVWludDgnLCBvZmZzZXQ6IDAgfVxuXTtcblxuZnVuY3Rpb24gYWRkVmVydGV4KGFycmF5LCBhbmNob3JYLCBhbmNob3JZLCBveCwgb3ksIHR4LCB0eSwgc2l6ZVZlcnRleCkge1xuICAgIGFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAvLyBhX3Bvc19vZmZzZXRcbiAgICAgICAgYW5jaG9yWCxcbiAgICAgICAgYW5jaG9yWSxcbiAgICAgICAgTWF0aC5yb3VuZChveCAqIDMyKSxcbiAgICAgICAgTWF0aC5yb3VuZChveSAqIDMyKSxcblxuICAgICAgICAvLyBhX2RhdGFcbiAgICAgICAgdHgsIC8vIHggY29vcmRpbmF0ZSBvZiBzeW1ib2wgb24gZ2x5cGggYXRsYXMgdGV4dHVyZVxuICAgICAgICB0eSwgLy8geSBjb29yZGluYXRlIG9mIHN5bWJvbCBvbiBnbHlwaCBhdGxhcyB0ZXh0dXJlXG4gICAgICAgIHNpemVWZXJ0ZXggPyBzaXplVmVydGV4WzBdIDogMCxcbiAgICAgICAgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMV0gOiAwXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gYWRkRHluYW1pY0F0dHJpYnV0ZXMoZHluYW1pY0xheW91dFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheSwgcDogUG9pbnQsIGFuZ2xlOiBudW1iZXIpIHtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socC54LCBwLnksIGFuZ2xlKTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socC54LCBwLnksIGFuZ2xlKTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socC54LCBwLnksIGFuZ2xlKTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socC54LCBwLnksIGFuZ2xlKTtcbn1cblxuZXhwb3J0IGNsYXNzIFN5bWJvbEJ1ZmZlcnMge1xuICAgIGxheW91dFZlcnRleEFycmF5OiBTeW1ib2xMYXlvdXRBcnJheTtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbnM6IFByb2dyYW1Db25maWd1cmF0aW9uU2V0PFN5bWJvbFN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuXG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5OiBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgb3BhY2l0eVZlcnRleEFycmF5OiBTeW1ib2xPcGFjaXR5QXJyYXk7XG4gICAgb3BhY2l0eVZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXk6IENvbGxpc2lvblZlcnRleEFycmF5O1xuICAgIGNvbGxpc2lvblZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgcGxhY2VkU3ltYm9sQXJyYXk6IFBsYWNlZFN5bWJvbEFycmF5O1xuXG4gICAgY29uc3RydWN0b3IocHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxTeW1ib2xTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IFN5bWJvbExheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBwcm9ncmFtQ29uZmlndXJhdGlvbnM7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QXJyYXkgPSBuZXcgU3ltYm9sT3BhY2l0eUFycmF5KCk7XG4gICAgICAgIHRoaXMucGxhY2VkU3ltYm9sQXJyYXkgPSBuZXcgUGxhY2VkU3ltYm9sQXJyYXkoKTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCwgZHluYW1pY0luZGV4QnVmZmVyOiBib29sZWFuLCB1cGxvYWQ/OiBib29sZWFuLCB1cGRhdGU/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh1cGxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgc3ltYm9sTGF5b3V0QXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSwgZHluYW1pY0luZGV4QnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0QXR0cmlidXRlcy5tZW1iZXJzLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMub3BhY2l0eVZlcnRleEFycmF5LCBzaGFkZXJPcGFjaXR5QXR0cmlidXRlcywgdHJ1ZSk7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcGVyZm9ybWFuY2UgaGFjayBzbyB0aGF0IHdlIGNhbiB3cml0ZSB0byBvcGFjaXR5VmVydGV4QXJyYXkgd2l0aCB1aW50MzJzXG4gICAgICAgICAgICAvLyBldmVuIHRob3VnaCB0aGUgc2hhZGVycyByZWFkIHVpbnQ4c1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyLml0ZW1TaXplID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBsb2FkIHx8IHVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1N5bWJvbEJ1ZmZlcnMnLCBTeW1ib2xCdWZmZXJzKTtcblxuY2xhc3MgQ29sbGlzaW9uQnVmZmVycyB7XG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIGxheW91dEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheSB8IExpbmVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuXG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXk6IENvbGxpc2lvblZlcnRleEFycmF5O1xuICAgIGNvbGxpc2lvblZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgY29uc3RydWN0b3IoTGF5b3V0QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5PixcbiAgICAgICAgICAgICAgICBsYXlvdXRBdHRyaWJ1dGVzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj4sXG4gICAgICAgICAgICAgICAgSW5kZXhBcnJheTogQ2xhc3M8VHJpYW5nbGVJbmRleEFycmF5IHwgTGluZUluZGV4QXJyYXk+KSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5sYXlvdXRBdHRyaWJ1dGVzID0gbGF5b3V0QXR0cmlidXRlcztcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IEluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXkgPSBuZXcgQ29sbGlzaW9uVmVydGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMubGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uVmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgY29sbGlzaW9uVmVydGV4QXR0cmlidXRlcy5tZW1iZXJzLCB0cnVlKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignQ29sbGlzaW9uQnVmZmVycycsIENvbGxpc2lvbkJ1ZmZlcnMpO1xuXG4vKipcbiAqIFVubGlrZSBvdGhlciBidWNrZXRzLCB3aGljaCBzaW1wbHkgaW1wbGVtZW50ICNhZGRGZWF0dXJlIHdpdGggdHlwZS1zcGVjaWZpY1xuICogbG9naWMgZm9yIChlc3NlbnRpYWxseSkgdHJpYW5ndWxhdGluZyBmZWF0dXJlIGdlb21ldHJpZXMsIFN5bWJvbEJ1Y2tldFxuICogcmVxdWlyZXMgc3BlY2lhbGl6ZWQgYmVoYXZpb3I6XG4gKlxuICogMS4gV29ya2VyVGlsZSNwYXJzZSgpLCB0aGUgbG9naWNhbCBvd25lciBvZiB0aGUgYnVja2V0IGNyZWF0aW9uIHByb2Nlc3MsXG4gKiAgICBjYWxscyBTeW1ib2xCdWNrZXQjcG9wdWxhdGUoKSwgd2hpY2ggcmVzb2x2ZXMgdGV4dCBhbmQgaWNvbiB0b2tlbnMgb25cbiAqICAgIGVhY2ggZmVhdHVyZSwgYWRkcyBlYWNoIGdseXBocyBhbmQgc3ltYm9scyBuZWVkZWQgdG8gdGhlIHBhc3NlZC1pblxuICogICAgY29sbGVjdGlvbnMgb3B0aW9ucy5nbHlwaERlcGVuZGVuY2llcyBhbmQgb3B0aW9ucy5pY29uRGVwZW5kZW5jaWVzLCBhbmRcbiAqICAgIHN0b3JlcyB0aGUgZmVhdHVyZSBkYXRhIGZvciB1c2UgaW4gc3Vic2VxdWVudCBzdGVwICh0aGlzLmZlYXR1cmVzKS5cbiAqXG4gKiAyLiBXb3JrZXJUaWxlIGFzeW5jaHJvbm91c2x5IHJlcXVlc3RzIGZyb20gdGhlIG1haW4gdGhyZWFkIGFsbCBvZiB0aGUgZ2x5cGhzXG4gKiAgICBhbmQgaWNvbnMgbmVlZGVkIChieSB0aGlzIGJ1Y2tldCBhbmQgYW55IG90aGVycykuIFdoZW4gZ2x5cGhzIGFuZCBpY29uc1xuICogICAgaGF2ZSBiZWVuIHJlY2VpdmVkLCB0aGUgV29ya2VyVGlsZSBjcmVhdGVzIGEgQ29sbGlzaW9uSW5kZXggYW5kIGludm9rZXM6XG4gKlxuICogMy4gcGVyZm9ybVN5bWJvbExheW91dChidWNrZXQsIHN0YWNrcywgaWNvbnMpIHBlcmZvcm0gdGV4dHMgc2hhcGluZyBhbmRcbiAqICAgIGxheW91dCBvbiBhIFN5bWJvbCBCdWNrZXQuIFRoaXMgc3RlcCBwb3B1bGF0ZXM6XG4gKiAgICAgIGB0aGlzLnN5bWJvbEluc3RhbmNlc2A6IG1ldGFkYXRhIG9uIGdlbmVyYXRlZCBzeW1ib2xzXG4gKiAgICAgIGB0aGlzLmNvbGxpc2lvbkJveEFycmF5YDogY29sbGlzaW9uIGRhdGEgZm9yIHVzZSBieSBmb3JlZ3JvdW5kXG4gKiAgICAgIGB0aGlzLnRleHRgOiBTeW1ib2xCdWZmZXJzIGZvciB0ZXh0IHN5bWJvbHNcbiAqICAgICAgYHRoaXMuaWNvbnNgOiBTeW1ib2xCdWZmZXJzIGZvciBpY29uc1xuICogICAgICBgdGhpcy5jb2xsaXNpb25Cb3hgOiBEZWJ1ZyBTeW1ib2xCdWZmZXJzIGZvciBjb2xsaXNpb24gYm94ZXNcbiAqICAgICAgYHRoaXMuY29sbGlzaW9uQ2lyY2xlYDogRGVidWcgU3ltYm9sQnVmZmVycyBmb3IgY29sbGlzaW9uIGNpcmNsZXNcbiAqICAgIFRoZSByZXN1bHRzIGFyZSBzZW50IHRvIHRoZSBmb3JlZ3JvdW5kIGZvciByZW5kZXJpbmdcbiAqXG4gKiA0LiBwZXJmb3JtU3ltYm9sUGxhY2VtZW50KGJ1Y2tldCwgY29sbGlzaW9uSW5kZXgpIGlzIHJ1biBvbiB0aGUgZm9yZWdyb3VuZCxcbiAqICAgIGFuZCB1c2VzIHRoZSBDb2xsaXNpb25JbmRleCBhbG9uZyB3aXRoIGN1cnJlbnQgY2FtZXJhIHNldHRpbmdzIHRvIGRldGVybWluZVxuICogICAgd2hpY2ggc3ltYm9scyBjYW4gYWN0dWFsbHkgc2hvdyBvbiB0aGUgbWFwLiBDb2xsaWRlZCBzeW1ib2xzIGFyZSBoaWRkZW5cbiAqICAgIHVzaW5nIGEgZHluYW1pYyBcIk9wYWNpdHlWZXJ0ZXhBcnJheVwiLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN5bWJvbEJ1Y2tldCBpbXBsZW1lbnRzIEJ1Y2tldCB7XG4gICAgc3RhdGljIE1BWF9HTFlQSFM6IG51bWJlcjtcbiAgICBzdGF0aWMgYWRkRHluYW1pY0F0dHJpYnV0ZXM6IHR5cGVvZiBhZGREeW5hbWljQXR0cmlidXRlcztcblxuICAgIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheTtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcjtcbiAgICBsYXllcnM6IEFycmF5PFN5bWJvbFN0eWxlTGF5ZXI+O1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxTeW1ib2xTdHlsZUxheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBzZGZJY29uczogYm9vbGVhbjtcbiAgICBpY29uc05lZWRMaW5lYXI6IGJvb2xlYW47XG4gICAgYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyO1xuICAgIGp1c3RSZWxvYWRlZDogYm9vbGVhbjtcbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuXG4gICAgdGV4dFNpemVEYXRhOiBTaXplRGF0YTtcbiAgICBpY29uU2l6ZURhdGE6IFNpemVEYXRhO1xuXG4gICAgZ2x5cGhPZmZzZXRBcnJheTogR2x5cGhPZmZzZXRBcnJheTtcbiAgICBsaW5lVmVydGV4QXJyYXk6IFN5bWJvbExpbmVWZXJ0ZXhBcnJheTtcbiAgICBmZWF0dXJlczogQXJyYXk8U3ltYm9sRmVhdHVyZT47XG4gICAgc3ltYm9sSW5zdGFuY2VzOiBTeW1ib2xJbnN0YW5jZUFycmF5O1xuICAgIGNvbGxpc2lvbkFycmF5czogQXJyYXk8Q29sbGlzaW9uQXJyYXlzPjtcbiAgICBwaXhlbFJhdGlvOiBudW1iZXI7XG4gICAgdGlsZVBpeGVsUmF0aW86IG51bWJlcjtcbiAgICBjb21wYXJlVGV4dDoge1tzdHJpbmddOiBBcnJheTxQb2ludD59O1xuICAgIGZhZGVTdGFydFRpbWU6IG51bWJlcjtcbiAgICBzb3J0RmVhdHVyZXNCeUtleTogYm9vbGVhbjtcbiAgICBzb3J0RmVhdHVyZXNCeVk6IGJvb2xlYW47XG4gICAgc29ydGVkQW5nbGU6IG51bWJlcjtcbiAgICBmZWF0dXJlU29ydE9yZGVyOiBBcnJheTxudW1iZXI+O1xuXG4gICAgdGV4dDogU3ltYm9sQnVmZmVycztcbiAgICBpY29uOiBTeW1ib2xCdWZmZXJzO1xuICAgIGNvbGxpc2lvbkJveDogQ29sbGlzaW9uQnVmZmVycztcbiAgICBjb2xsaXNpb25DaXJjbGU6IENvbGxpc2lvbkJ1ZmZlcnM7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyO1xuICAgIHNvdXJjZUlEOiBzdHJpbmc7XG4gICAgc3ltYm9sSW5zdGFuY2VJbmRleGVzOiBBcnJheTxudW1iZXI+O1xuICAgIHdyaXRpbmdNb2RlczogQXJyYXk8bnVtYmVyPjtcbiAgICBhbGxvd1ZlcnRpY2FsUGxhY2VtZW50OiBib29sZWFuO1xuICAgIGhhc1BhaW50T3ZlcnJpZGVzOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQnVja2V0UGFyYW1ldGVyczxTeW1ib2xTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gb3B0aW9ucy5jb2xsaXNpb25Cb3hBcnJheTtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW8gPSBvcHRpb25zLnBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuc291cmNlTGF5ZXJJbmRleCA9IG9wdGlvbnMuc291cmNlTGF5ZXJJbmRleDtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzUGFpbnRPdmVycmlkZXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzWzBdO1xuICAgICAgICBjb25zdCB1bmV2YWx1YXRlZExheW91dFZhbHVlcyA9IGxheWVyLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzO1xuXG4gICAgICAgIHRoaXMudGV4dFNpemVEYXRhID0gZ2V0U2l6ZURhdGEodGhpcy56b29tLCB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10pO1xuICAgICAgICB0aGlzLmljb25TaXplRGF0YSA9IGdldFNpemVEYXRhKHRoaXMuem9vbSwgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQ7XG4gICAgICAgIGNvbnN0IHNvcnRLZXkgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtc29ydC1rZXknKTtcbiAgICAgICAgY29uc3Qgek9yZGVyID0gbGF5b3V0LmdldCgnc3ltYm9sLXotb3JkZXInKTtcbiAgICAgICAgdGhpcy5zb3J0RmVhdHVyZXNCeUtleSA9IHpPcmRlciAhPT0gJ3ZpZXdwb3J0LXknICYmIHNvcnRLZXkuY29uc3RhbnRPcigxKSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB6T3JkZXJCeVZpZXdwb3J0WSA9IHpPcmRlciA9PT0gJ3ZpZXdwb3J0LXknIHx8ICh6T3JkZXIgPT09ICdhdXRvJyAmJiAhdGhpcy5zb3J0RmVhdHVyZXNCeUtleSk7XG4gICAgICAgIHRoaXMuc29ydEZlYXR1cmVzQnlZID0gek9yZGVyQnlWaWV3cG9ydFkgJiYgKGxheW91dC5nZXQoJ3RleHQtYWxsb3ctb3ZlcmxhcCcpIHx8IGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpIHx8XG4gICAgICAgICAgICBsYXlvdXQuZ2V0KCd0ZXh0LWlnbm9yZS1wbGFjZW1lbnQnKSB8fCBsYXlvdXQuZ2V0KCdpY29uLWlnbm9yZS1wbGFjZW1lbnQnKSk7XG5cbiAgICAgICAgaWYgKGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ3BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy53cml0aW5nTW9kZXMgPSBsYXlvdXQuZ2V0KCd0ZXh0LXdyaXRpbmctbW9kZScpLm1hcCh3bSA9PiBXcml0aW5nTW9kZVt3bV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKChsKSA9PiBsLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKChsKSA9PiBsLmlkKTtcblxuICAgICAgICB0aGlzLnNvdXJjZUlEID0gb3B0aW9ucy5zb3VyY2VJRDtcbiAgICB9XG5cbiAgICBjcmVhdGVBcnJheXMoKSB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5ZXJzWzBdLmxheW91dDtcbiAgICAgICAgdGhpcy5oYXNQYWludE92ZXJyaWRlcyA9IFN5bWJvbFN0eWxlTGF5ZXIuaGFzUGFpbnRPdmVycmlkZXMobGF5b3V0KTtcblxuICAgICAgICB0aGlzLnRleHQgPSBuZXcgU3ltYm9sQnVmZmVycyhuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQoc3ltYm9sTGF5b3V0QXR0cmlidXRlcy5tZW1iZXJzLCB0aGlzLmxheWVycywgdGhpcy56b29tLCBwcm9wZXJ0eSA9PiAvXnRleHQvLnRlc3QocHJvcGVydHkpKSk7XG4gICAgICAgIHRoaXMuaWNvbiA9IG5ldyBTeW1ib2xCdWZmZXJzKG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChzeW1ib2xMYXlvdXRBdHRyaWJ1dGVzLm1lbWJlcnMsIHRoaXMubGF5ZXJzLCB0aGlzLnpvb20sIHByb3BlcnR5ID0+IC9eaWNvbi8udGVzdChwcm9wZXJ0eSkpKTtcblxuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveCA9IG5ldyBDb2xsaXNpb25CdWZmZXJzKENvbGxpc2lvbkJveExheW91dEFycmF5LCBjb2xsaXNpb25Cb3hMYXlvdXQubWVtYmVycywgTGluZUluZGV4QXJyYXkpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkNpcmNsZSA9IG5ldyBDb2xsaXNpb25CdWZmZXJzKENvbGxpc2lvbkNpcmNsZUxheW91dEFycmF5LCBjb2xsaXNpb25DaXJjbGVMYXlvdXQubWVtYmVycywgVHJpYW5nbGVJbmRleEFycmF5KTtcblxuICAgICAgICB0aGlzLmdseXBoT2Zmc2V0QXJyYXkgPSBuZXcgR2x5cGhPZmZzZXRBcnJheSgpO1xuICAgICAgICB0aGlzLmxpbmVWZXJ0ZXhBcnJheSA9IG5ldyBTeW1ib2xMaW5lVmVydGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5zeW1ib2xJbnN0YW5jZXMgPSBuZXcgU3ltYm9sSW5zdGFuY2VBcnJheSgpO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZUdseXBoRGVwZW5kZW5jaWVzKHRleHQ6IHN0cmluZywgc3RhY2s6IHtbbnVtYmVyXTogYm9vbGVhbn0sIHRleHRBbG9uZ0xpbmU6IGJvb2xlYW4sIGFsbG93VmVydGljYWxQbGFjZW1lbnQ6IGJvb2xlYW4sIGRvZXNBbGxvd1ZlcnRpY2FsV3JpdGluZ01vZGU6IGJvb2xlYW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdGFja1t0ZXh0LmNoYXJDb2RlQXQoaSldID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICgodGV4dEFsb25nTGluZSB8fCBhbGxvd1ZlcnRpY2FsUGxhY2VtZW50KSAmJiBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxDaGFyID0gdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW3RleHQuY2hhckF0KGkpXTtcbiAgICAgICAgICAgICAgICBpZiAodmVydGljYWxDaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrW3ZlcnRpY2FsQ2hhci5jaGFyQ29kZUF0KDApXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXM6IEFycmF5PEluZGV4ZWRGZWF0dXJlPiwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbMF07XG4gICAgICAgIGNvbnN0IGxheW91dCA9IGxheWVyLmxheW91dDtcblxuICAgICAgICBjb25zdCB0ZXh0Rm9udCA9IGxheW91dC5nZXQoJ3RleHQtZm9udCcpO1xuICAgICAgICBjb25zdCB0ZXh0RmllbGQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWZpZWxkJyk7XG4gICAgICAgIGNvbnN0IGljb25JbWFnZSA9IGxheW91dC5nZXQoJ2ljb24taW1hZ2UnKTtcbiAgICAgICAgY29uc3QgaGFzVGV4dCA9XG4gICAgICAgICAgICAodGV4dEZpZWxkLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHwgdGV4dEZpZWxkLnZhbHVlLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID4gMCkgJiZcbiAgICAgICAgICAgICh0ZXh0Rm9udC52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8IHRleHRGb250LnZhbHVlLnZhbHVlLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBoYXNJY29uID0gaWNvbkltYWdlLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHwgaWNvbkltYWdlLnZhbHVlLnZhbHVlICYmIGljb25JbWFnZS52YWx1ZS52YWx1ZS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBzeW1ib2xTb3J0S2V5ID0gbGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5Jyk7XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIGlmICghaGFzVGV4dCAmJiAhaGFzSWNvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWNvbnMgPSBvcHRpb25zLmljb25EZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IG9wdGlvbnMuZ2x5cGhEZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICghbGF5ZXIuX2ZlYXR1cmVGaWx0ZXIoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHQ6IEZvcm1hdHRlZCB8IHZvaWQ7XG4gICAgICAgICAgICBpZiAoaGFzVGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIEV4cHJlc3Npb24gZXZhbHVhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgY29lcmNlIHRvIEZvcm1hdHRlZFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBwbGFpbiBzdHJpbmcgdG9rZW4gZXZhbHVhdGlvbiBza2lwcyB0aGF0IHBhdGh3YXkgc28gZG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBoZXJlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVG9rZW5zID0gbGF5ZXIuZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKCd0ZXh0LWZpZWxkJywgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRyYW5zZm9ybVRleHQocmVzb2x2ZWRUb2tlbnMgaW5zdGFuY2VvZiBGb3JtYXR0ZWQgP1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFRva2VucyA6XG4gICAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZC5mcm9tU3RyaW5nKHJlc29sdmVkVG9rZW5zKSxcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIsIGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaWNvbjtcbiAgICAgICAgICAgIGlmIChoYXNJY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbiA9IGxheWVyLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucygnaWNvbi1pbWFnZScsIGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRleHQgJiYgIWljb24pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc29ydEtleSA9IHRoaXMuc29ydEZlYXR1cmVzQnlLZXkgP1xuICAgICAgICAgICAgICAgIHN5bWJvbFNvcnRLZXkuZXZhbHVhdGUoZmVhdHVyZSwge30pIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEZlYXR1cmU6IFN5bWJvbEZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBpY29uLFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGxvYWRHZW9tZXRyeShmZWF0dXJlKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdmVjdG9yVGlsZUZlYXR1cmVUeXBlc1tmZWF0dXJlLnR5cGVdLFxuICAgICAgICAgICAgICAgIHNvcnRLZXlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZlYXR1cmUuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sRmVhdHVyZS5pZCA9IGZlYXR1cmUuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goc3ltYm9sRmVhdHVyZSk7XG5cbiAgICAgICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbnNbaWNvbl0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRTdGFjayA9IHRleHRGb250LmV2YWx1YXRlKGZlYXR1cmUsIHt9KS5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dEFsb25nTGluZSA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JztcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQgPSB0aGlzLndyaXRpbmdNb2RlcyAmJiB0aGlzLndyaXRpbmdNb2Rlcy5pbmRleE9mKFdyaXRpbmdNb2RlLnZlcnRpY2FsKSA+PSAwO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0ZXh0LnNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvZXNBbGxvd1ZlcnRpY2FsV3JpdGluZ01vZGUgPSBhbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlKHRleHQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25Gb250ID0gc2VjdGlvbi5mb250U3RhY2sgfHwgZm9udFN0YWNrO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uU3RhY2sgPSBzdGFja3Nbc2VjdGlvbkZvbnRdID0gc3RhY2tzW3NlY3Rpb25Gb250XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHbHlwaERlcGVuZGVuY2llcyhzZWN0aW9uLnRleHQsIHNlY3Rpb25TdGFjaywgdGV4dEFsb25nTGluZSwgdGhpcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50LCBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpID09PSAnbGluZScpIHtcbiAgICAgICAgICAgIC8vIE1lcmdlIGFkamFjZW50IGxpbmVzIHdpdGggdGhlIHNhbWUgdGV4dCB0byBpbXByb3ZlIGxhYmVsbGluZy5cbiAgICAgICAgICAgIC8vIEl0J3MgYmV0dGVyIHRvIHBsYWNlIGxhYmVscyBvbiBvbmUgbG9uZyBsaW5lIHRoYW4gb24gbWFueSBzaG9ydCBzZWdtZW50cy5cbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMgPSBtZXJnZUxpbmVzKHRoaXMuZmVhdHVyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydEZlYXR1cmVzQnlLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGEuc29ydEtleSBpcyBhbHdheXMgYSBudW1iZXIgd2hlbiBzb3J0RmVhdHVyZXNCeUtleSBpcyB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuICgoYS5zb3J0S2V5OiBhbnkpOiBudW1iZXIpIC0gKChiLnNvcnRLZXk6IGFueSk6IG51bWJlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnRleHQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5sYXllcnMsIGltYWdlUG9zaXRpb25zKTtcbiAgICAgICAgdGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhzdGF0ZXMsIHZ0TGF5ZXIsIHRoaXMubGF5ZXJzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICB1cGxvYWRQZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCB8fCB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3gudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25DaXJjbGUudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dC51cGxvYWQoY29udGV4dCwgdGhpcy5zb3J0RmVhdHVyZXNCeVksICF0aGlzLnVwbG9hZGVkLCB0aGlzLnRleHQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkKTtcbiAgICAgICAgdGhpcy5pY29uLnVwbG9hZChjb250ZXh0LCB0aGlzLnNvcnRGZWF0dXJlc0J5WSwgIXRoaXMudXBsb2FkZWQsIHRoaXMuaWNvbi5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQpO1xuICAgICAgICB0aGlzLnVwbG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRleHQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmljb24uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ2lyY2xlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBhZGRUb0xpbmVWZXJ0ZXhBcnJheShhbmNob3I6IEFuY2hvciwgbGluZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gdGhpcy5saW5lVmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICBpZiAoYW5jaG9yLnNlZ21lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IHN1bUZvcndhcmRMZW5ndGggPSBhbmNob3IuZGlzdChsaW5lW2FuY2hvci5zZWdtZW50ICsgMV0pO1xuICAgICAgICAgICAgbGV0IHN1bUJhY2t3YXJkTGVuZ3RoID0gYW5jaG9yLmRpc3QobGluZVthbmNob3Iuc2VnbWVudF0pO1xuICAgICAgICAgICAgY29uc3QgdmVydGljZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBhbmNob3Iuc2VnbWVudCArIDE7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmVydGljZXNbaV0gPSB7IHg6IGxpbmVbaV0ueCwgeTogbGluZVtpXS55LCB0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcjogc3VtRm9yd2FyZExlbmd0aCB9O1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGluZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bUZvcndhcmRMZW5ndGggKz0gbGluZVtpICsgMV0uZGlzdChsaW5lW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYW5jaG9yLnNlZ21lbnQgfHwgMDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHsgeDogbGluZVtpXS54LCB5OiBsaW5lW2ldLnksIHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yOiBzdW1CYWNrd2FyZExlbmd0aCB9O1xuICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdW1CYWNrd2FyZExlbmd0aCArPSBsaW5lW2kgLSAxXS5kaXN0KGxpbmVbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleCA9IHZlcnRpY2VzW2ldO1xuICAgICAgICAgICAgICAgIHRoaXMubGluZVZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBsaW5lTGVuZ3RoOiB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5sZW5ndGggLSBsaW5lU3RhcnRJbmRleFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFkZFN5bWJvbHMoYXJyYXlzOiBTeW1ib2xCdWZmZXJzLFxuICAgICAgICAgICAgICAgcXVhZHM6IEFycmF5PFN5bWJvbFF1YWQ+LFxuICAgICAgICAgICAgICAgc2l6ZVZlcnRleDogYW55LFxuICAgICAgICAgICAgICAgbGluZU9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgIGFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICB3cml0aW5nTW9kZTogYW55LFxuICAgICAgICAgICAgICAgbGFiZWxBbmNob3I6IEFuY2hvcixcbiAgICAgICAgICAgICAgIGxpbmVTdGFydEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICBsaW5lTGVuZ3RoOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaW5kZXhBcnJheSA9IGFycmF5cy5pbmRleEFycmF5O1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhBcnJheSA9IGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgZHluYW1pY0xheW91dFZlcnRleEFycmF5ID0gYXJyYXlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTtcblxuICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQgKiBxdWFkcy5sZW5ndGgsIGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYXJyYXlzLmluZGV4QXJyYXksIGZlYXR1cmUuc29ydEtleSk7XG4gICAgICAgIGNvbnN0IGdseXBoT2Zmc2V0QXJyYXlTdGFydCA9IHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHZlcnRleFN0YXJ0SW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICBjb25zdCBhbmdsZSA9ICh0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgd3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSA/IE1hdGguUEkgLyAyIDogMDtcblxuICAgICAgICBjb25zdCBhZGRTeW1ib2wgPSAoc3ltYm9sOiBTeW1ib2xRdWFkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0bCA9IHN5bWJvbC50bCxcbiAgICAgICAgICAgICAgICB0ciA9IHN5bWJvbC50cixcbiAgICAgICAgICAgICAgICBibCA9IHN5bWJvbC5ibCxcbiAgICAgICAgICAgICAgICBiciA9IHN5bWJvbC5icixcbiAgICAgICAgICAgICAgICB0ZXggPSBzeW1ib2wudGV4O1xuXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICBjb25zdCB5ID0gc3ltYm9sLmdseXBoT2Zmc2V0WzFdO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LCB0bC54LCB5ICsgdGwueSwgdGV4LngsIHRleC55LCBzaXplVmVydGV4KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSwgdHIueCwgeSArIHRyLnksIHRleC54ICsgdGV4LncsIHRleC55LCBzaXplVmVydGV4KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSwgYmwueCwgeSArIGJsLnksIHRleC54LCB0ZXgueSArIHRleC5oLCBzaXplVmVydGV4KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSwgYnIueCwgeSArIGJyLnksIHRleC54ICsgdGV4LncsIHRleC55ICsgdGV4LmgsIHNpemVWZXJ0ZXgpO1xuXG4gICAgICAgICAgICBhZGREeW5hbWljQXR0cmlidXRlcyhkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGxhYmVsQW5jaG9yLCBhbmdsZSk7XG5cbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAxLCBpbmRleCArIDIsIGluZGV4ICsgMyk7XG5cbiAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSAyO1xuXG4gICAgICAgICAgICB0aGlzLmdseXBoT2Zmc2V0QXJyYXkuZW1wbGFjZUJhY2soc3ltYm9sLmdseXBoT2Zmc2V0WzBdKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZmVhdHVyZS50ZXh0ICYmIGZlYXR1cmUudGV4dC5zZWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBmZWF0dXJlLnRleHQuc2VjdGlvbnM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhaW50T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uSW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9wdWxhdGVQYWludEFycmF5Rm9yU2VjdGlvbiA9IChzZWN0aW9uSW5kZXg/OiBudW1iZXIsIGxhc3RTZWN0aW9uOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbkluZGV4ICE9PSB1bmRlZmluZWQgJiYgKGN1cnJlbnRTZWN0aW9uSW5kZXggIT09IHNlY3Rpb25JbmRleCB8fCBsYXN0U2VjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5cy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyhhcnJheXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBmZWF0dXJlLmluZGV4LCB7fSwgc2VjdGlvbnNbY3VycmVudFNlY3Rpb25JbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uSW5kZXggPSBzZWN0aW9uSW5kZXg7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ltYm9sIG9mIHF1YWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlUGFpbnRBcnJheUZvclNlY3Rpb24oc3ltYm9sLnNlY3Rpb25JbmRleCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBhZGRTeW1ib2woc3ltYm9sKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSBwYWludCBhcnJheXMgZm9yIHRoZSBsYXN0IHNlY3Rpb24uXG4gICAgICAgICAgICAgICAgcG9wdWxhdGVQYWludEFycmF5Rm9yU2VjdGlvbihjdXJyZW50U2VjdGlvbkluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzeW1ib2wgb2YgcXVhZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3ltYm9sKHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFycmF5cy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyhhcnJheXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBmZWF0dXJlLmluZGV4LCB7fSwgc2VjdGlvbnNbMF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbCBvZiBxdWFkcykge1xuICAgICAgICAgICAgICAgIGFkZFN5bWJvbChzeW1ib2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJyYXlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGZlYXR1cmUuaW5kZXgsIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFycmF5cy5wbGFjZWRTeW1ib2xBcnJheS5lbXBsYWNlQmFjayhsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LFxuICAgICAgICAgICAgZ2x5cGhPZmZzZXRBcnJheVN0YXJ0LCB0aGlzLmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoIC0gZ2x5cGhPZmZzZXRBcnJheVN0YXJ0LCB2ZXJ0ZXhTdGFydEluZGV4LFxuICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXgsIGxpbmVMZW5ndGgsIChsYWJlbEFuY2hvci5zZWdtZW50OiBhbnkpLFxuICAgICAgICAgICAgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMF0gOiAwLCBzaXplVmVydGV4ID8gc2l6ZVZlcnRleFsxXSA6IDAsXG4gICAgICAgICAgICBsaW5lT2Zmc2V0WzBdLCBsaW5lT2Zmc2V0WzFdLFxuICAgICAgICAgICAgd3JpdGluZ01vZGUsXG4gICAgICAgICAgICAvLyBwbGFjZWRPcmllbnRhdGlvbiBpcyBudWxsIGluaXRpYWxseTsgd2lsbCBiZSB1cGRhdGVkIHRvIGhvcml6b250YWwoMSkvdmVydGljYWwoMikgaWYgcGxhY2VkXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgKGZhbHNlOiBhbnkpLFxuICAgICAgICAgICAgLy8gVGhlIGNyb3NzVGlsZUlEIGlzIG9ubHkgZmlsbGVkL3VzZWQgb24gdGhlIGZvcmVncm91bmQgZm9yIGR5bmFtaWMgdGV4dCBhbmNob3JzXG4gICAgICAgICAgICAwKTtcbiAgICB9XG5cbiAgICBfYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBcnJheTogU3RydWN0QXJyYXksIHBvaW50OiBQb2ludCwgYW5jaG9yWDogbnVtYmVyLCBhbmNob3JZOiBudW1iZXIsIGV4dHJ1ZGU6IFBvaW50KSB7XG4gICAgICAgIGNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICByZXR1cm4gbGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAvLyBwb3NcbiAgICAgICAgICAgIHBvaW50LngsXG4gICAgICAgICAgICBwb2ludC55LFxuICAgICAgICAgICAgLy8gYV9hbmNob3JfcG9zXG4gICAgICAgICAgICBhbmNob3JYLFxuICAgICAgICAgICAgYW5jaG9yWSxcbiAgICAgICAgICAgIC8vIGV4dHJ1ZGVcbiAgICAgICAgICAgIE1hdGgucm91bmQoZXh0cnVkZS54KSxcbiAgICAgICAgICAgIE1hdGgucm91bmQoZXh0cnVkZS55KSk7XG4gICAgfVxuXG4gICAgYWRkQ29sbGlzaW9uRGVidWdWZXJ0aWNlcyh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBhcnJheXM6IENvbGxpc2lvbkJ1ZmZlcnMsIGJveEFuY2hvclBvaW50OiBQb2ludCwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBpc0NpcmNsZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYXJyYXlzLmluZGV4QXJyYXkpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgIGNvbnN0IGxheW91dFZlcnRleEFycmF5ID0gYXJyYXlzLmxheW91dFZlcnRleEFycmF5O1xuICAgICAgICBjb25zdCBjb2xsaXNpb25WZXJ0ZXhBcnJheSA9IGFycmF5cy5jb2xsaXNpb25WZXJ0ZXhBcnJheTtcblxuICAgICAgICBjb25zdCBhbmNob3JYID0gc3ltYm9sSW5zdGFuY2UuYW5jaG9yWDtcbiAgICAgICAgY29uc3QgYW5jaG9yWSA9IHN5bWJvbEluc3RhbmNlLmFuY2hvclk7XG5cbiAgICAgICAgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGNvbGxpc2lvblZlcnRleEFycmF5LCBib3hBbmNob3JQb2ludCwgYW5jaG9yWCwgYW5jaG9yWSwgbmV3IFBvaW50KHgxLCB5MSkpO1xuICAgICAgICB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgY29sbGlzaW9uVmVydGV4QXJyYXksIGJveEFuY2hvclBvaW50LCBhbmNob3JYLCBhbmNob3JZLCBuZXcgUG9pbnQoeDIsIHkxKSk7XG4gICAgICAgIHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBcnJheSwgYm94QW5jaG9yUG9pbnQsIGFuY2hvclgsIGFuY2hvclksIG5ldyBQb2ludCh4MiwgeTIpKTtcbiAgICAgICAgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGNvbGxpc2lvblZlcnRleEFycmF5LCBib3hBbmNob3JQb2ludCwgYW5jaG9yWCwgYW5jaG9yWSwgbmV3IFBvaW50KHgxLCB5MikpO1xuXG4gICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgIGlmIChpc0NpcmNsZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5ID0gKGFycmF5cy5pbmRleEFycmF5OiBhbnkpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAxLCBpbmRleCArIDIpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAyLCBpbmRleCArIDMpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhBcnJheTogTGluZUluZGV4QXJyYXkgPSAoYXJyYXlzLmluZGV4QXJyYXk6IGFueSk7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4ICsgMik7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMiwgaW5kZXggKyAzKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAzLCBpbmRleCk7XG5cbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IDQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGREZWJ1Z0NvbGxpc2lvbkJveGVzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlKSB7XG4gICAgICAgIGZvciAobGV0IGIgPSBzdGFydEluZGV4OyBiIDwgZW5kSW5kZXg7IGIrKykge1xuICAgICAgICAgICAgY29uc3QgYm94OiBDb2xsaXNpb25Cb3ggPSAodGhpcy5jb2xsaXNpb25Cb3hBcnJheS5nZXQoYik6IGFueSk7XG4gICAgICAgICAgICBjb25zdCB4MSA9IGJveC54MTtcbiAgICAgICAgICAgIGNvbnN0IHkxID0gYm94LnkxO1xuICAgICAgICAgICAgY29uc3QgeDIgPSBib3gueDI7XG4gICAgICAgICAgICBjb25zdCB5MiA9IGJveC55MjtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHJhZGl1cyA+IDAsIHRoaXMgY29sbGlzaW9uIGJveCBpcyBhY3R1YWxseSBhIGNpcmNsZVxuICAgICAgICAgICAgLy8gVGhlIGRhdGEgd2UgYWRkIHRvIHRoZSBidWZmZXJzIGlzIGV4YWN0bHkgdGhlIHNhbWUsIGJ1dCB3ZSdsbCByZW5kZXIgd2l0aCBhIGRpZmZlcmVudCBzaGFkZXIuXG4gICAgICAgICAgICBjb25zdCBpc0NpcmNsZSA9IGJveC5yYWRpdXMgPiAwO1xuICAgICAgICAgICAgdGhpcy5hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKHgxLCB5MSwgeDIsIHkyLCBpc0NpcmNsZSA/IHRoaXMuY29sbGlzaW9uQ2lyY2xlIDogdGhpcy5jb2xsaXNpb25Cb3gsIGJveC5hbmNob3JQb2ludCwgc3ltYm9sSW5zdGFuY2UsIGlzQ2lyY2xlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyhzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UudGV4dEJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMoc3ltYm9sSW5zdGFuY2UudmVydGljYWxUZXh0Qm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UudmVydGljYWxUZXh0Qm94RW5kSW5kZXgsIHN5bWJvbEluc3RhbmNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyhzeW1ib2xJbnN0YW5jZS5pY29uQm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBmbGF0IGFycmF5cyBhcmUgbWVhbnQgdG8gYmUgcXVpY2tlciB0byBpdGVyYXRlIG92ZXIgdGhhbiB0aGUgc291cmNlXG4gICAgLy8gQ29sbGlzaW9uQm94QXJyYXlcbiAgICBfZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlc0ZvclN5bWJvbChjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksIHRleHRTdGFydEluZGV4OiBudW1iZXIsIHRleHRFbmRJbmRleDogbnVtYmVyLCB2ZXJ0aWNhbFRleHRTdGFydEluZGV4OiBudW1iZXIsIHZlcnRpY2FsVGV4dEVuZEluZGV4OiBudW1iZXIsIGljb25TdGFydEluZGV4OiBudW1iZXIsIGljb25FbmRJbmRleDogbnVtYmVyKTogQ29sbGlzaW9uQXJyYXlzIHtcbiAgICAgICAgY29uc3QgY29sbGlzaW9uQXJyYXlzID0ge307XG4gICAgICAgIGZvciAobGV0IGsgPSB0ZXh0U3RhcnRJbmRleDsgayA8IHRleHRFbmRJbmRleDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoayk6IGFueSk7XG4gICAgICAgICAgICBpZiAoYm94LnJhZGl1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94ID0geyB4MTogYm94LngxLCB5MTogYm94LnkxLCB4MjogYm94LngyLCB5MjogYm94LnkyLCBhbmNob3JQb2ludFg6IGJveC5hbmNob3JQb2ludFgsIGFuY2hvclBvaW50WTogYm94LmFuY2hvclBvaW50WSB9O1xuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0RmVhdHVyZUluZGV4ID0gYm94LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghY29sbGlzaW9uQXJyYXlzLnRleHRDaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0Q2lyY2xlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25BcnJheXMudGV4dEZlYXR1cmVJbmRleCA9IGJveC5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZWQgPSAxOyAvLyBNYXkgYmUgdXBkYXRlZCBhdCBjb2xsaXNpb24gZGV0ZWN0aW9uIHRpbWVcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25BcnJheXMudGV4dENpcmNsZXMucHVzaChib3guYW5jaG9yUG9pbnRYLCBib3guYW5jaG9yUG9pbnRZLCBib3gucmFkaXVzLCBib3guc2lnbmVkRGlzdGFuY2VGcm9tQW5jaG9yLCB1c2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gdmVydGljYWxUZXh0U3RhcnRJbmRleDsgayA8IHZlcnRpY2FsVGV4dEVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGlmIChib3gucmFkaXVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEJveCA9IHsgeDE6IGJveC54MSwgeTE6IGJveC55MSwgeDI6IGJveC54MiwgeTI6IGJveC55MiwgYW5jaG9yUG9pbnRYOiBib3guYW5jaG9yUG9pbnRYLCBhbmNob3JQb2ludFk6IGJveC5hbmNob3JQb2ludFkgfTtcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0RmVhdHVyZUluZGV4ID0gYm94LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgayA9IGljb25TdGFydEluZGV4OyBrIDwgaWNvbkVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIC8vIEFuIGljb24gY2FuIG9ubHkgaGF2ZSBvbmUgYm94IG5vdywgc28gdGhpcyBpbmRleGluZyBpcyBhIGJpdCB2ZXN0aWdpYWwuLi5cbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGlmIChib3gucmFkaXVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLmljb25Cb3ggPSB7IHgxOiBib3gueDEsIHkxOiBib3gueTEsIHgyOiBib3gueDIsIHkyOiBib3gueTIsIGFuY2hvclBvaW50WDogYm94LmFuY2hvclBvaW50WCwgYW5jaG9yUG9pbnRZOiBib3guYW5jaG9yUG9pbnRZIH07XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLmljb25GZWF0dXJlSW5kZXggPSBib3guZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBPbmx5IG9uZSBib3ggYWxsb3dlZCBwZXIgaW5zdGFuY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGlzaW9uQXJyYXlzO1xuICAgIH1cblxuICAgIGRlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXMoY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5KSB7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQXJyYXlzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gdGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25BcnJheXMucHVzaCh0aGlzLl9kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzRm9yU3ltYm9sKFxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnRleHRCb3hTdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnRleHRCb3hFbmRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsVGV4dEJveEVuZEluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmljb25Cb3hTdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmljb25Cb3hFbmRJbmRleFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNUZXh0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGhhc0ljb25EYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uLnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaGFzQ29sbGlzaW9uQm94RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGlzaW9uQm94LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaGFzQ29sbGlzaW9uQ2lyY2xlRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGlzaW9uQ2lyY2xlLnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgYWRkSW5kaWNlc0ZvclBsYWNlZFRleHRTeW1ib2wocGxhY2VkVGV4dFN5bWJvbEluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGxhY2VkU3ltYm9sID0gdGhpcy50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChwbGFjZWRUZXh0U3ltYm9sSW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gcGxhY2VkU3ltYm9sLnZlcnRleFN0YXJ0SW5kZXggKyBwbGFjZWRTeW1ib2wubnVtR2x5cGhzICogNDtcbiAgICAgICAgZm9yIChsZXQgdmVydGV4SW5kZXggPSBwbGFjZWRTeW1ib2wudmVydGV4U3RhcnRJbmRleDsgdmVydGV4SW5kZXggPCBlbmRJbmRleDsgdmVydGV4SW5kZXggKz0gNCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4SW5kZXgsIHZlcnRleEluZGV4ICsgMSwgdmVydGV4SW5kZXggKyAyKTtcbiAgICAgICAgICAgIHRoaXMudGV4dC5pbmRleEFycmF5LmVtcGxhY2VCYWNrKHZlcnRleEluZGV4ICsgMSwgdmVydGV4SW5kZXggKyAyLCB2ZXJ0ZXhJbmRleCArIDMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0U29ydGVkU3ltYm9sSW5kZXhlcyhhbmdsZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnNvcnRlZEFuZ2xlID09PSBhbmdsZSAmJiB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIGNvbnN0IHJvdGF0ZWRZcyA9IFtdO1xuICAgICAgICBjb25zdCBmZWF0dXJlSW5kZXhlcyA9IFtdO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gdGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgcm90YXRlZFlzLnB1c2goTWF0aC5yb3VuZChzaW4gKiBzeW1ib2xJbnN0YW5jZS5hbmNob3JYICsgY29zICogc3ltYm9sSW5zdGFuY2UuYW5jaG9yWSkgfCAwKTtcbiAgICAgICAgICAgIGZlYXR1cmVJbmRleGVzLnB1c2goc3ltYm9sSW5zdGFuY2UuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5zb3J0KChhSW5kZXgsIGJJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChyb3RhdGVkWXNbYUluZGV4XSAtIHJvdGF0ZWRZc1tiSW5kZXhdKSB8fFxuICAgICAgICAgICAgICAgICAgIChmZWF0dXJlSW5kZXhlc1tiSW5kZXhdIC0gZmVhdHVyZUluZGV4ZXNbYUluZGV4XSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgc29ydEZlYXR1cmVzKGFuZ2xlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNvcnRGZWF0dXJlc0J5WSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5zb3J0ZWRBbmdsZSA9PT0gYW5nbGUpIHJldHVybjtcblxuICAgICAgICAvLyBUaGUgY3VycmVudCBhcHByb2FjaCB0byBzb3J0aW5nIGRvZXNuJ3Qgc29ydCBhY3Jvc3Mgc2VnbWVudHMgc28gZG9uJ3QgdHJ5LlxuICAgICAgICAvLyBTb3J0aW5nIHdpdGhpbiBzZWdtZW50cyBzZXBhcmF0ZWx5IHNlZW1lZCBub3QgdG8gYmUgd29ydGggdGhlIGNvbXBsZXhpdHkuXG4gICAgICAgIGlmICh0aGlzLnRleHQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSB8fCB0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSBzeW1ib2xzIGFyZSBhbGxvd2VkIHRvIG92ZXJsYXAgc29ydCB0aGVtIGJ5IHRoZWlyIHZlcnRpY2FsIHNjcmVlbiBwb3NpdGlvbi5cbiAgICAgICAgLy8gVGhlIGluZGV4IGFycmF5IGJ1ZmZlciBpcyByZXdyaXR0ZW4gdG8gcmVmZXJlbmNlIHRoZSAodW5jaGFuZ2VkKSB2ZXJ0aWNlcyBpbiB0aGVcbiAgICAgICAgLy8gc29ydGVkIG9yZGVyLlxuXG4gICAgICAgIC8vIFRvIGF2b2lkIHNvcnRpbmcgdGhlIGFjdHVhbCBzeW1ib2xJbnN0YW5jZSBhcnJheSB3ZSBzb3J0IGFuIGFycmF5IG9mIGluZGV4ZXMuXG4gICAgICAgIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzID0gdGhpcy5nZXRTb3J0ZWRTeW1ib2xJbmRleGVzKGFuZ2xlKTtcbiAgICAgICAgdGhpcy5zb3J0ZWRBbmdsZSA9IGFuZ2xlO1xuXG4gICAgICAgIHRoaXMudGV4dC5pbmRleEFycmF5LmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaWNvbi5pbmRleEFycmF5LmNsZWFyKCk7XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlU29ydE9yZGVyID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZVNvcnRPcmRlci5wdXNoKHN5bWJvbEluc3RhbmNlLmZlYXR1cmVJbmRleCk7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgICAgICAgXS5mb3JFYWNoKChpbmRleCwgaSwgYXJyYXkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCBhIGdpdmVuIGluZGV4IHRoZSBmaXJzdCB0aW1lIGl0IHNob3dzIHVwLFxuICAgICAgICAgICAgICAgIC8vIHRvIGF2b2lkIGR1cGxpY2F0ZSBvcGFjaXR5IGVudHJpZXMgd2hlbiBtdWx0aXBsZSBqdXN0aWZpY2F0aW9uc1xuICAgICAgICAgICAgICAgIC8vIHNoYXJlIHRoZSBzYW1lIGdseXBocy5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBhcnJheS5pbmRleE9mKGluZGV4KSA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRUZXh0U3ltYm9sKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRUZXh0U3ltYm9sKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGxhY2VkSWNvbiA9IHRoaXMuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5nZXQoaSk7XG4gICAgICAgICAgICBpZiAocGxhY2VkSWNvbi5udW1HbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXhJbmRleCA9IHBsYWNlZEljb24udmVydGV4U3RhcnRJbmRleDtcbiAgICAgICAgICAgICAgICB0aGlzLmljb24uaW5kZXhBcnJheS5lbXBsYWNlQmFjayh2ZXJ0ZXhJbmRleCwgdmVydGV4SW5kZXggKyAxLCB2ZXJ0ZXhJbmRleCArIDIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbi5pbmRleEFycmF5LmVtcGxhY2VCYWNrKHZlcnRleEluZGV4ICsgMSwgdmVydGV4SW5kZXggKyAyLCB2ZXJ0ZXhJbmRleCArIDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudGV4dC5pbmRleEJ1ZmZlcikgdGhpcy50ZXh0LmluZGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy50ZXh0LmluZGV4QXJyYXkpO1xuICAgICAgICBpZiAodGhpcy5pY29uLmluZGV4QnVmZmVyKSB0aGlzLmljb24uaW5kZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLmljb24uaW5kZXhBcnJheSk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignU3ltYm9sQnVja2V0JywgU3ltYm9sQnVja2V0LCB7XG4gICAgb21pdDogWydsYXllcnMnLCAnY29sbGlzaW9uQm94QXJyYXknLCAnZmVhdHVyZXMnLCAnY29tcGFyZVRleHQnXVxufSk7XG5cbi8vIHRoaXMgY29uc3RhbnQgaXMgYmFzZWQgb24gdGhlIHNpemUgb2YgU3RydWN0QXJyYXkgaW5kZXhlcyB1c2VkIGluIGEgc3ltYm9sXG4vLyBidWNrZXQtLW5hbWVseSwgZ2x5cGhPZmZzZXRBcnJheVN0YXJ0XG4vLyBlZyB0aGUgbWF4IHZhbGlkIFVJbnQxNiBpcyA2NSw1MzVcbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMjkwNyBmb3IgbW90aXZhdGlvblxuLy8gbGluZVN0YXJ0SW5kZXggYW5kIHRleHRCb3hTdGFydEluZGV4IGNvdWxkIHBvdGVudGlhbGx5IGJlIGNvbmNlcm5zXG4vLyBidXQgd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1hbnkgZmV3ZXIgYm94ZXMvbGluZXMgdGhhbiBnbHlwaHNcblN5bWJvbEJ1Y2tldC5NQVhfR0xZUEhTID0gNjU1MzU7XG5cblN5bWJvbEJ1Y2tldC5hZGREeW5hbWljQXR0cmlidXRlcyA9IGFkZER5bmFtaWNBdHRyaWJ1dGVzO1xuXG5leHBvcnQgZGVmYXVsdCBTeW1ib2xCdWNrZXQ7XG5leHBvcnQgeyBhZGREeW5hbWljQXR0cmlidXRlcyB9O1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBkZWZhdWx0IHJlc29sdmVUb2tlbnM7XG5cbi8qKlxuICogUmVwbGFjZSB0b2tlbnMgaW4gYSBzdHJpbmcgdGVtcGxhdGUgd2l0aCB2YWx1ZXMgaW4gYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIHByb3BlcnRpZXMgYSBrZXkvdmFsdWUgcmVsYXRpb25zaGlwIGJldHdlZW4gdG9rZW5zIGFuZCByZXBsYWNlbWVudHNcbiAqIEBwYXJhbSB0ZXh0IHRoZSB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEByZXR1cm5zIHRoZSB0ZW1wbGF0ZSB3aXRoIHRva2VucyByZXBsYWNlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRva2Vucyhwcm9wZXJ0aWVzOiB7K1tzdHJpbmddOiBtaXhlZH0sIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgveyhbXnt9XSspfS9nLCAobWF0Y2gsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gcHJvcGVydGllcyA/IFN0cmluZyhwcm9wZXJ0aWVzW2tleV0pIDogJyc7XG4gICAgfSk7XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuaW1wb3J0IHtcbiAgICBDb2xvclR5cGVcbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcInBvaW50XCIgfCBcImxpbmVcIiB8IFwibGluZS1jZW50ZXJcIj4sXG4gICAgXCJzeW1ib2wtc3BhY2luZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwic3ltYm9sLXNvcnQta2V5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwic3ltYm9sLXotb3JkZXJcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJhdXRvXCIgfCBcInZpZXdwb3J0LXlcIiB8IFwic291cmNlXCI+LFxuICAgIFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1vcHRpb25hbFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImljb24tcm90YXRpb24tYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCIgfCBcImF1dG9cIj4sXG4gICAgXCJpY29uLXNpemVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLXRleHQtZml0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibm9uZVwiIHwgXCJ3aWR0aFwiIHwgXCJoZWlnaHRcIiB8IFwiYm90aFwiPixcbiAgICBcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4sXG4gICAgXCJpY29uLWltYWdlXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxzdHJpbmc+LFxuICAgIFwiaWNvbi1yb3RhdGVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLXBhZGRpbmdcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24ta2VlcC11cHJpZ2h0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1vZmZzZXRcIjogRGF0YURyaXZlblByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiaWNvbi1hbmNob3JcIjogRGF0YURyaXZlblByb3BlcnR5PFwiY2VudGVyXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiIHwgXCJ0b3AtbGVmdFwiIHwgXCJ0b3AtcmlnaHRcIiB8IFwiYm90dG9tLWxlZnRcIiB8IFwiYm90dG9tLXJpZ2h0XCI+LFxuICAgIFwiaWNvbi1waXRjaC1hbGlnbm1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIiB8IFwiYXV0b1wiPixcbiAgICBcInRleHQtcGl0Y2gtYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCIgfCBcImF1dG9cIj4sXG4gICAgXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiIHwgXCJhdXRvXCI+LFxuICAgIFwidGV4dC1maWVsZFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Rm9ybWF0dGVkPixcbiAgICBcInRleHQtZm9udFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8QXJyYXk8c3RyaW5nPj4sXG4gICAgXCJ0ZXh0LXNpemVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LW1heC13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtbGluZS1oZWlnaHRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtbGV0dGVyLXNwYWNpbmdcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWp1c3RpZnlcIjogRGF0YURyaXZlblByb3BlcnR5PFwiYXV0b1wiIHwgXCJsZWZ0XCIgfCBcImNlbnRlclwiIHwgXCJyaWdodFwiPixcbiAgICBcInRleHQtcmFkaWFsLW9mZnNldFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtdmFyaWFibGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PEFycmF5PFwiY2VudGVyXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiIHwgXCJ0b3AtbGVmdFwiIHwgXCJ0b3AtcmlnaHRcIiB8IFwiYm90dG9tLWxlZnRcIiB8IFwiYm90dG9tLXJpZ2h0XCI+PixcbiAgICBcInRleHQtYW5jaG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxcImNlbnRlclwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcInRvcFwiIHwgXCJib3R0b21cIiB8IFwidG9wLWxlZnRcIiB8IFwidG9wLXJpZ2h0XCIgfCBcImJvdHRvbS1sZWZ0XCIgfCBcImJvdHRvbS1yaWdodFwiPixcbiAgICBcInRleHQtbWF4LWFuZ2xlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LXdyaXRpbmctbW9kZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxBcnJheTxcImhvcml6b250YWxcIiB8IFwidmVydGljYWxcIj4+LFxuICAgIFwidGV4dC1yb3RhdGVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LXBhZGRpbmdcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQta2VlcC11cHJpZ2h0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwidGV4dC10cmFuc2Zvcm1cIjogRGF0YURyaXZlblByb3BlcnR5PFwibm9uZVwiIHwgXCJ1cHBlcmNhc2VcIiB8IFwibG93ZXJjYXNlXCI+LFxuICAgIFwidGV4dC1vZmZzZXRcIjogRGF0YURyaXZlblByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwidGV4dC1hbGxvdy1vdmVybGFwXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwidGV4dC1vcHRpb25hbFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbnx9O1xuXG5jb25zdCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC1wbGFjZW1lbnRcIl0pLFxuICAgIFwic3ltYm9sLXNwYWNpbmdcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJzeW1ib2wtc3BhY2luZ1wiXSksXG4gICAgXCJzeW1ib2wtYXZvaWQtZWRnZXNcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJzeW1ib2wtYXZvaWQtZWRnZXNcIl0pLFxuICAgIFwic3ltYm9sLXNvcnQta2V5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC1zb3J0LWtleVwiXSksXG4gICAgXCJzeW1ib2wtei1vcmRlclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC16LW9yZGVyXCJdKSxcbiAgICBcImljb24tYWxsb3ctb3ZlcmxhcFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tYWxsb3ctb3ZlcmxhcFwiXSksXG4gICAgXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0pLFxuICAgIFwiaWNvbi1vcHRpb25hbFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tb3B0aW9uYWxcIl0pLFxuICAgIFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXSksXG4gICAgXCJpY29uLXNpemVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1zaXplXCJdKSxcbiAgICBcImljb24tdGV4dC1maXRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXRleHQtZml0XCJdKSxcbiAgICBcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tdGV4dC1maXQtcGFkZGluZ1wiXSksXG4gICAgXCJpY29uLWltYWdlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24taW1hZ2VcIl0pLFxuICAgIFwiaWNvbi1yb3RhdGVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1yb3RhdGVcIl0pLFxuICAgIFwiaWNvbi1wYWRkaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1wYWRkaW5nXCJdKSxcbiAgICBcImljb24ta2VlcC11cHJpZ2h0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1rZWVwLXVwcmlnaHRcIl0pLFxuICAgIFwiaWNvbi1vZmZzZXRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1vZmZzZXRcIl0pLFxuICAgIFwiaWNvbi1hbmNob3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1hbmNob3JcIl0pLFxuICAgIFwiaWNvbi1waXRjaC1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXBpdGNoLWFsaWdubWVudFwiXSksXG4gICAgXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICBcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0pLFxuICAgIFwidGV4dC1maWVsZFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWZpZWxkXCJdKSxcbiAgICBcInRleHQtZm9udFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWZvbnRcIl0pLFxuICAgIFwidGV4dC1zaXplXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtc2l6ZVwiXSksXG4gICAgXCJ0ZXh0LW1heC13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LW1heC13aWR0aFwiXSksXG4gICAgXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1saW5lLWhlaWdodFwiXSksXG4gICAgXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbGV0dGVyLXNwYWNpbmdcIl0pLFxuICAgIFwidGV4dC1qdXN0aWZ5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtanVzdGlmeVwiXSksXG4gICAgXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1yYWRpYWwtb2Zmc2V0XCJdKSxcbiAgICBcInRleHQtdmFyaWFibGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC12YXJpYWJsZS1hbmNob3JcIl0pLFxuICAgIFwidGV4dC1hbmNob3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1hbmNob3JcIl0pLFxuICAgIFwidGV4dC1tYXgtYW5nbGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LW1heC1hbmdsZVwiXSksXG4gICAgXCJ0ZXh0LXdyaXRpbmctbW9kZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtd3JpdGluZy1tb2RlXCJdKSxcbiAgICBcInRleHQtcm90YXRlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcm90YXRlXCJdKSxcbiAgICBcInRleHQtcGFkZGluZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcGFkZGluZ1wiXSksXG4gICAgXCJ0ZXh0LWtlZXAtdXByaWdodFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQta2VlcC11cHJpZ2h0XCJdKSxcbiAgICBcInRleHQtdHJhbnNmb3JtXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtdHJhbnNmb3JtXCJdKSxcbiAgICBcInRleHQtb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtb2Zmc2V0XCJdKSxcbiAgICBcInRleHQtYWxsb3ctb3ZlcmxhcFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtYWxsb3ctb3ZlcmxhcFwiXSksXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl0pLFxuICAgIFwidGV4dC1vcHRpb25hbFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtb3B0aW9uYWxcIl0pLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiaWNvbi1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaWNvbi1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJpY29uLWhhbG8td2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLWhhbG8tYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24tdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiaWNvbi10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwidGV4dC1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWhhbG8tYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiaWNvbi1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi1vcGFjaXR5XCJdKSxcbiAgICBcImljb24tY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWNvbG9yXCJdKSxcbiAgICBcImljb24taGFsby1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24taGFsby1jb2xvclwiXSksXG4gICAgXCJpY29uLWhhbG8td2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWhhbG8td2lkdGhcIl0pLFxuICAgIFwiaWNvbi1oYWxvLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWhhbG8tYmx1clwiXSksXG4gICAgXCJpY29uLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi10cmFuc2xhdGVcIl0pLFxuICAgIFwiaWNvbi10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwidGV4dC1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC1vcGFjaXR5XCJdKSxcbiAgICBcInRleHQtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWNvbG9yXCJdLCB7IHJ1bnRpbWVUeXBlOiBDb2xvclR5cGUsIGdldE92ZXJyaWRlOiAobykgPT4gby50ZXh0Q29sb3IsIGhhc092ZXJyaWRlOiAobykgPT4gISFvLnRleHRDb2xvciB9KSxcbiAgICBcInRleHQtaGFsby1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtaGFsby1jb2xvclwiXSksXG4gICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWhhbG8td2lkdGhcIl0pLFxuICAgIFwidGV4dC1oYWxvLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWhhbG8tYmx1clwiXSksXG4gICAgXCJ0ZXh0LXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC10cmFuc2xhdGVcIl0pLFxuICAgIFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFpvb21Db25zdGFudEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9leHByZXNzaW9uJztcbmltcG9ydCB7IE51bGxUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGUvcHJvcGVydGllcyc7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uLy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdFNlY3Rpb25PdmVycmlkZTxUPiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgZGVmYXVsdFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD47XG5cbiAgICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPikge1xuICAgICAgICBhc3NlcnQoZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy50eXBlID0gZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcyA/IGRlZmF1bHRWYWx1ZS5wcm9wZXJ0eS5vdmVycmlkZXMucnVudGltZVR5cGUgOiBOdWxsVHlwZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAoY3R4LmZvcm1hdHRlZFNlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlcyA9IHRoaXMuZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcztcbiAgICAgICAgICAgIGlmIChvdmVycmlkZXMgJiYgb3ZlcnJpZGVzLmhhc092ZXJyaWRlKGN0eC5mb3JtYXR0ZWRTZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZXMuZ2V0T3ZlcnJpZGUoY3R4LmZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN0eC5mZWF0dXJlICYmIGN0eC5mZWF0dXJlU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZS5ldmFsdWF0ZShjdHguZmVhdHVyZSwgY3R4LmZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvbi5kZWZhdWx0O1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRWYWx1ZS5pc0NvbnN0YW50KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHI6IFpvb21Db25zdGFudEV4cHJlc3Npb248J3NvdXJjZSc+ID0gKCh0aGlzLmRlZmF1bHRWYWx1ZS52YWx1ZSk6IGFueSk7XG4gICAgICAgICAgICBmbihleHByLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5ub3QgYmUgc3RhdGljYWxseSBldmFsdWF0ZWQsIGFzIHRoZSBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgZXZhbHVhdGlvbiBjb250ZXh0LlxuICAgIHBvc3NpYmxlT3V0cHV0cygpOiBBcnJheTxWYWx1ZSB8IHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5yZWdpc3RlcignRm9ybWF0U2VjdGlvbk92ZXJyaWRlJywgRm9ybWF0U2VjdGlvbk92ZXJyaWRlLCB7b21pdDogWydkZWZhdWx0VmFsdWUnXX0pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgU3ltYm9sQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IHJlc29sdmVUb2tlbnMgZnJvbSAnLi4vLi4vdXRpbC9yZXNvbHZlX3Rva2Vucyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHtcbiAgICBUcmFuc2l0aW9uYWJsZSxcbiAgICBUcmFuc2l0aW9uaW5nLFxuICAgIExheW91dCxcbiAgICBQb3NzaWJseUV2YWx1YXRlZCxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUsXG4gICAgUHJvcGVydHlWYWx1ZVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHtcbiAgICBpc0V4cHJlc3Npb24sXG4gICAgU3R5bGVFeHByZXNzaW9uLFxuICAgIFpvb21Db25zdGFudEV4cHJlc3Npb24sXG4gICAgWm9vbURlcGVuZGVudEV4cHJlc3Npb25cbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcblxuaW1wb3J0IHR5cGUge0J1Y2tldFBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0JztcbmltcG9ydCB0eXBlIHtMYXlvdXRQcm9wcywgUGFpbnRQcm9wc30gZnJvbSAnLi9zeW1ib2xfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUsIFNvdXJjZUV4cHJlc3Npb24sIENvbXBvc2l0ZUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9leHByZXNzaW9uJztcbmltcG9ydCB7Rm9ybWF0dGVkVHlwZX0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdmFsdWVzJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5pbXBvcnQgRm9ybWF0U2VjdGlvbk92ZXJyaWRlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9mb3JtYXRfc2VjdGlvbl9vdmVycmlkZSc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvZm9ybWF0JztcbmltcG9ydCBMaXRlcmFsIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9saXRlcmFsJztcblxuY2xhc3MgU3ltYm9sU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF91bmV2YWx1YXRlZExheW91dDogTGF5b3V0PExheW91dFByb3BzPjtcbiAgICBsYXlvdXQ6IFBvc3NpYmx5RXZhbHVhdGVkPExheW91dFByb3BzPjtcblxuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1snaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9ICdtYXAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID0gJ3ZpZXdwb3J0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1sndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9ICdtYXAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID0gJ3ZpZXdwb3J0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHVuc3BlY2lmaWVkLCBgKi1waXRjaC1hbGlnbm1lbnRgIGluaGVyaXRzIGAqLXJvdGF0aW9uLWFsaWdubWVudGBcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXBpdGNoLWFsaWdubWVudCddID0gdGhpcy5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ2ljb24tcGl0Y2gtYWxpZ25tZW50JykgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1snaWNvbi1waXRjaC1hbGlnbm1lbnQnXSA9IHRoaXMubGF5b3V0LmdldCgnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ3BvaW50Jykge1xuICAgICAgICAgICAgY29uc3Qgd3JpdGluZ01vZGVzID0gdGhpcy5sYXlvdXQuZ2V0KCd0ZXh0LXdyaXRpbmctbW9kZScpO1xuICAgICAgICAgICAgaWYgKHdyaXRpbmdNb2Rlcykge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBkdXBsaWNhdGVzLCBwcmVzZXJ2aW5nIG9yZGVyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVkdXBlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiB3cml0aW5nTW9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZHVwZWQuaW5kZXhPZihtKSA8IDApIGRlZHVwZWQucHVzaChtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1sndGV4dC13cml0aW5nLW1vZGUnXSA9IGRlZHVwZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtd3JpdGluZy1tb2RlJ10gPSBbJ2hvcml6b250YWwnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldFBhaW50T3ZlcnJpZGVzKCk7XG4gICAgfVxuXG4gICAgZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKG5hbWU6ICosIGZlYXR1cmU6IEZlYXR1cmUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmxheW91dC5nZXQobmFtZSkuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgICAgICBjb25zdCB1bmV2YWx1YXRlZCA9IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXNbbmFtZV07XG4gICAgICAgIGlmICghdW5ldmFsdWF0ZWQuaXNEYXRhRHJpdmVuKCkgJiYgIWlzRXhwcmVzc2lvbih1bmV2YWx1YXRlZC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlVG9rZW5zKGZlYXR1cmUucHJvcGVydGllcywgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChwYXJhbWV0ZXJzOiBCdWNrZXRQYXJhbWV0ZXJzPCo+KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3ltYm9sQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUoKTogYm9vbGVhbiB7XG4gICAgICAgIGFzc2VydChmYWxzZSk7IC8vIFNob3VsZCB0YWtlIGEgZGlmZmVyZW50IHBhdGggaW4gRmVhdHVyZUluZGV4XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBfc2V0UGFpbnRPdmVycmlkZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgb3ZlcnJpZGFibGUgb2YgcHJvcGVydGllcy5wYWludC5vdmVycmlkYWJsZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sU3R5bGVMYXllci5oYXNQYWludE92ZXJyaWRlKHRoaXMubGF5b3V0LCBvdmVycmlkYWJsZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlbiA9IHRoaXMucGFpbnQuZ2V0KG92ZXJyaWRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlID0gbmV3IEZvcm1hdFNlY3Rpb25PdmVycmlkZShvdmVycmlkZW4pO1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVFeHByZXNzaW9uID0gbmV3IFN0eWxlRXhwcmVzc2lvbihvdmVycmlkZSwgb3ZlcnJpZGVuLnByb3BlcnR5LnNwZWNpZmljYXRpb24pO1xuICAgICAgICAgICAgbGV0IGV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlbi52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnIHx8IG92ZXJyaWRlbi52YWx1ZS5raW5kID09PSAnc291cmNlJykge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSAobmV3IFpvb21Db25zdGFudEV4cHJlc3Npb24oJ3NvdXJjZScsIHN0eWxlRXhwcmVzc2lvbik6IFNvdXJjZUV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gKG5ldyBab29tRGVwZW5kZW50RXhwcmVzc2lvbignY29tcG9zaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVuLnZhbHVlLnpvb21TdG9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZW4udmFsdWUuX2ludGVycG9sYXRpb25UeXBlKTogQ29tcG9zaXRlRXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhaW50Ll92YWx1ZXNbb3ZlcnJpZGFibGVdID0gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZShvdmVycmlkZW4ucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVuLnBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2hhbmRsZU92ZXJyaWRhYmxlUGFpbnRQcm9wZXJ0eVVwZGF0ZTxULCBSPihuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsIFI+LCBuZXdWYWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0IHx8IG9sZFZhbHVlLmlzRGF0YURyaXZlbigpIHx8IG5ld1ZhbHVlLmlzRGF0YURyaXZlbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN5bWJvbFN0eWxlTGF5ZXIuaGFzUGFpbnRPdmVycmlkZSh0aGlzLmxheW91dCwgbmFtZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGhhc1BhaW50T3ZlcnJpZGUobGF5b3V0OiBQb3NzaWJseUV2YWx1YXRlZDxMYXlvdXRQcm9wcz4sIHByb3BlcnR5TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRleHRGaWVsZCA9IGxheW91dC5nZXQoJ3RleHQtZmllbGQnKTtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0aWVzLnBhaW50LnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgbGV0IGhhc092ZXJyaWRlcyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrU2VjdGlvbnMgPSAoc2VjdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5vdmVycmlkZXMgJiYgcHJvcGVydHkub3ZlcnJpZGVzLmhhc092ZXJyaWRlKHNlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc092ZXJyaWRlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRleHRGaWVsZC52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnICYmIHRleHRGaWVsZC52YWx1ZS52YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCkge1xuICAgICAgICAgICAgY2hlY2tTZWN0aW9ucyh0ZXh0RmllbGQudmFsdWUudmFsdWUuc2VjdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKHRleHRGaWVsZC52YWx1ZS5raW5kID09PSAnc291cmNlJykge1xuXG4gICAgICAgICAgICBjb25zdCBjaGVja0V4cHJlc3Npb24gPSAoZXhwcmVzc2lvbjogRXhwcmVzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPdmVycmlkZXMpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTGl0ZXJhbCAmJiB0eXBlT2YoZXhwcmVzc2lvbi52YWx1ZSkgPT09IEZvcm1hdHRlZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkOiBGb3JtYXR0ZWQgPSAoKGV4cHJlc3Npb24udmFsdWUpOiBhbnkpO1xuICAgICAgICAgICAgICAgICAgICBjaGVja1NlY3Rpb25zKGZvcm1hdHRlZC5zZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgRm9ybWF0RXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBjaGVja1NlY3Rpb25zKGV4cHJlc3Npb24uc2VjdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uZWFjaENoaWxkKGNoZWNrRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgZXhwcjogWm9vbUNvbnN0YW50RXhwcmVzc2lvbjwnc291cmNlJz4gPSAoKHRleHRGaWVsZC52YWx1ZSk6IGFueSk7XG4gICAgICAgICAgICBpZiAoZXhwci5fc3R5bGVFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tFeHByZXNzaW9uKGV4cHIuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNPdmVycmlkZXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGhhc1BhaW50T3ZlcnJpZGVzKGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+KTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3Qgb3ZlcnJpZGFibGUgb2YgcHJvcGVydGllcy5wYWludC5vdmVycmlkYWJsZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmIChTeW1ib2xTdHlsZUxheWVyLmhhc1BhaW50T3ZlcnJpZGUobGF5b3V0LCBvdmVycmlkYWJsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTeW1ib2xTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbiAgICBcImJhY2tncm91bmQtcGF0dGVyblwiOiBDcm9zc0ZhZGVkUHJvcGVydHk8c3RyaW5nPixcbiAgICBcImJhY2tncm91bmQtb3BhY2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfYmFja2dyb3VuZFwiXVtcImJhY2tncm91bmQtY29sb3JcIl0pLFxuICAgIFwiYmFja2dyb3VuZC1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfYmFja2dyb3VuZFwiXVtcImJhY2tncm91bmQtcGF0dGVyblwiXSksXG4gICAgXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2JhY2tncm91bmRcIl1bXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz5cbn0+KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHsgVHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkIH0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgQmFja2dyb3VuZFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tncm91bmRTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJyYXN0ZXItb3BhY2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwicmFzdGVyLWh1ZS1yb3RhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWF4XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItc2F0dXJhdGlvblwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwicmFzdGVyLWNvbnRyYXN0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItcmVzYW1wbGluZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcImxpbmVhclwiIHwgXCJuZWFyZXN0XCI+LFxuICAgIFwicmFzdGVyLWZhZGUtZHVyYXRpb25cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcInJhc3Rlci1vcGFjaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItb3BhY2l0eVwiXSksXG4gICAgXCJyYXN0ZXItaHVlLXJvdGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLWh1ZS1yb3RhdGVcIl0pLFxuICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWluXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIl0pLFxuICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWF4XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIl0pLFxuICAgIFwicmFzdGVyLXNhdHVyYXRpb25cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1zYXR1cmF0aW9uXCJdKSxcbiAgICBcInJhc3Rlci1jb250cmFzdFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLWNvbnRyYXN0XCJdKSxcbiAgICBcInJhc3Rlci1yZXNhbXBsaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItcmVzYW1wbGluZ1wiXSksXG4gICAgXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLWZhZGUtZHVyYXRpb25cIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz5cbn0+KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9yYXN0ZXJfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWQgfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge1BhaW50UHJvcHN9IGZyb20gJy4vcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNsYXNzIFJhc3RlclN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlclN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vLi4vdWkvbWFwJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxudHlwZSBDdXN0b21SZW5kZXJNZXRob2QgPSAoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgbWF0cml4OiBBcnJheTxudW1iZXI+KSA9PiB2b2lkO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY3VzdG9tIHN0eWxlIGxheWVycy4gVGhpcyBpcyBhIHNwZWNpZmljYXRpb24gZm9yXG4gKiBpbXBsZW1lbnRlcnMgdG8gbW9kZWw6IGl0IGlzIG5vdCBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogQ3VzdG9tIGxheWVycyBhbGxvdyBhIHVzZXIgdG8gcmVuZGVyIGRpcmVjdGx5IGludG8gdGhlIG1hcCdzIEdMIGNvbnRleHQgdXNpbmcgdGhlIG1hcCdzIGNhbWVyYS5cbiAqIFRoZXNlIGxheWVycyBjYW4gYmUgYWRkZWQgYmV0d2VlbiBhbnkgcmVndWxhciBsYXllcnMgdXNpbmcge0BsaW5rIE1hcCNhZGRMYXllcn0uXG4gKlxuICogQ3VzdG9tIGxheWVycyBtdXN0IGhhdmUgYSB1bmlxdWUgYGlkYCBhbmQgbXVzdCBoYXZlIHRoZSBgdHlwZWAgb2YgYFwiY3VzdG9tXCJgLlxuICogVGhleSBtdXN0IGltcGxlbWVudCBgcmVuZGVyYCBhbmQgbWF5IGltcGxlbWVudCBgcHJlcmVuZGVyYCwgYG9uQWRkYCBhbmQgYG9uUmVtb3ZlYC5cbiAqIFRoZXkgY2FuIHRyaWdnZXIgcmVuZGVyaW5nIHVzaW5nIHtAbGluayBNYXAjdHJpZ2dlclJlcGFpbnR9XG4gKiBhbmQgdGhleSBzaG91bGQgYXBwcm9wcmlhdGVseSBoYW5kbGUge0BsaW5rIE1hcC5ldmVudDp3ZWJnbGNvbnRleHRsb3N0fSBhbmRcbiAqIHtAbGluayBNYXAuZXZlbnQ6d2ViZ2xjb250ZXh0cmVzdG9yZWR9LlxuICpcbiAqIFRoZSBgcmVuZGVyaW5nTW9kZWAgcHJvcGVydHkgY29udHJvbHMgd2hldGhlciB0aGUgbGF5ZXIgaXMgdHJlYXRlZCBhcyBhIGBcIjJkXCJgIG9yIGBcIjNkXCJgIG1hcCBsYXllci4gVXNlOlxuICogLSBgXCJyZW5kZXJpbmdNb2RlXCI6IFwiM2RcImAgdG8gdXNlIHRoZSBkZXB0aCBidWZmZXIgYW5kIHNoYXJlIGl0IHdpdGggb3RoZXIgbGF5ZXJzXG4gKiAtIGBcInJlbmRlcmluZ01vZGVcIjogXCIyZFwiYCB0byBhZGQgYSBsYXllciB3aXRoIG5vIGRlcHRoLiBJZiB5b3UgbmVlZCB0byB1c2UgdGhlIGRlcHRoIGJ1ZmZlciBmb3IgYSBgXCIyZFwiYCBsYXllciB5b3UgbXVzdCB1c2UgYW4gb2Zmc2NyZWVuXG4gKiAgIGZyYW1lYnVmZmVyIGFuZCB7QGxpbmsgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UjcHJlcmVuZGVyfVxuICpcbiAqIEBpbnRlcmZhY2UgQ3VzdG9tTGF5ZXJJbnRlcmZhY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBBIHVuaXF1ZSBsYXllciBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSBsYXllcidzIHR5cGUuIE11c3QgYmUgYFwiY3VzdG9tXCJgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbmRlcmluZ01vZGUgRWl0aGVyIGBcIjJkXCJgIG9yIGBcIjNkXCJgLiBEZWZhdWx0cyB0byBgXCIyZFwiYC5cbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gbGF5ZXIgaW1wbGVtZW50ZWQgYXMgRVM2IGNsYXNzXG4gKiBjbGFzcyBOdWxsSXNsYW5kTGF5ZXIge1xuICogICAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgICAgICB0aGlzLmlkID0gJ251bGwtaXNsYW5kJztcbiAqICAgICAgICAgdGhpcy50eXBlID0gJ2N1c3RvbSc7XG4gKiAgICAgICAgIHRoaXMucmVuZGVyaW5nTW9kZSA9ICcyZCc7XG4gKiAgICAgfVxuICpcbiAqICAgICBvbkFkZChtYXAsIGdsKSB7XG4gKiAgICAgICAgIGNvbnN0IHZlcnRleFNvdXJjZSA9IGBcbiAqICAgICAgICAgdW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xuICogICAgICAgICB2b2lkIG1haW4oKSB7XG4gKiAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNCgwLjUsIDAuNSwgMC4wLCAxLjApO1xuICogICAgICAgICAgICAgZ2xfUG9pbnRTaXplID0gMjAuMDtcbiAqICAgICAgICAgfWA7XG4gKlxuICogICAgICAgICBjb25zdCBmcmFnbWVudFNvdXJjZSA9IGBcbiAqICAgICAgICAgdm9pZCBtYWluKCkge1xuICogICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjAsIDAuMCwgMC4wLCAxLjApO1xuICogICAgICAgICB9YDtcbiAqXG4gKiAgICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKTtcbiAqICAgICAgICAgZ2wuc2hhZGVyU291cmNlKHZlcnRleFNoYWRlciwgdmVydGV4U291cmNlKTtcbiAqICAgICAgICAgZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICogICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpO1xuICogICAgICAgICBnbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U291cmNlKTtcbiAqICAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcik7XG4gKlxuICogICAgICAgICB0aGlzLnByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gKiAgICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHZlcnRleFNoYWRlcik7XG4gKiAgICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAqICAgICAgICAgZ2wubGlua1Byb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAqICAgICB9XG4gKlxuICogICAgIHJlbmRlcihnbCwgbWF0cml4KSB7XG4gKiAgICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAqICAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDRmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBcInVfbWF0cml4XCIpLCBmYWxzZSwgbWF0cml4KTtcbiAqICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIDEpO1xuICogICAgIH1cbiAqIH1cbiAqXG4gKiBtYXAub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAqICAgICBtYXAuYWRkTGF5ZXIobmV3IE51bGxJc2xhbmRMYXllcigpKTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBsYXllciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgTWFwIHdpdGgge0BsaW5rIE1hcCNhZGRMYXllcn0uIFRoaXNcbiAqIGdpdmVzIHRoZSBsYXllciBhIGNoYW5jZSB0byBpbml0aWFsaXplIGdsIHJlc291cmNlcyBhbmQgcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIEN1c3RvbUxheWVySW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uQWRkXG4gKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXAgdGhpcyBjdXN0b20gbGF5ZXIgd2FzIGp1c3QgYWRkZWQgdG8uXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIGdsIGNvbnRleHQgZm9yIHRoZSBtYXAuXG4gKi9cblxuLyoqXG4gKiBPcHRpb25hbCBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGxheWVyIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgTWFwIHdpdGgge0BsaW5rIE1hcCNyZW1vdmVMYXllcn0uIFRoaXNcbiAqIGdpdmVzIHRoZSBsYXllciBhIGNoYW5jZSB0byBjbGVhbiB1cCBnbCByZXNvdXJjZXMgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIGxheWVyIHdhcyBqdXN0IGFkZGVkIHRvLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBnbCBjb250ZXh0IGZvciB0aGUgbWFwLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCBkdXJpbmcgYSByZW5kZXIgZnJhbWUgdG8gYWxsb3cgYSBsYXllciB0byBwcmVwYXJlIHJlc291cmNlcyBvciByZW5kZXIgaW50byBhIHRleHR1cmUuXG4gKlxuICogVGhlIGxheWVyIGNhbm5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY3VycmVudCBHTCBzdGF0ZSBhbmQgbXVzdCBiaW5kIGEgZnJhbWVidWZmZXIgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBwcmVyZW5kZXJcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgbWFwJ3MgZ2wgY29udGV4dC5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gbWF0cml4IFRoZSBtYXAncyBjYW1lcmEgbWF0cml4LiBJdCBwcm9qZWN0cyBzcGhlcmljYWwgbWVyY2F0b3JcbiAqIGNvb3JkaW5hdGVzIHRvIGdsIGNvb3JkaW5hdGVzLiBUaGUgbWVyY2F0b3IgY29vcmRpbmF0ZSBgWzAsIDBdYCByZXByZXNlbnRzIHRoZVxuICogdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBtZXJjYXRvciB3b3JsZCBhbmQgYFsxLCAxXWAgcmVwcmVzZW50cyB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lci4gV2hlblxuICogdGhlIGByZW5kZXJpbmdNb2RlYCBpcyBgXCIzZFwiYCwgdGhlIHogY29vcmRpbmF0ZSBpcyBjb25mb3JtYWwuIEEgYm94IHdpdGggaWRlbnRpY2FsIHgsIHksIGFuZCB6XG4gKiBsZW5ndGhzIGluIG1lcmNhdG9yIHVuaXRzIHdvdWxkIGJlIHJlbmRlcmVkIGFzIGEgY3ViZS4ge0BsaW5rIE1lcmNhdG9yQ29vcmRpbmF0ZX0uZnJvbUxhdExuZ1xuICogY2FuIGJlIHVzZWQgdG8gcHJvamVjdCBhIGBMbmdMYXRgIHRvIGEgbWVyY2F0b3IgY29vcmRpbmF0ZS5cbiAqL1xuXG4vKipcbiAqIENhbGxlZCBkdXJpbmcgYSByZW5kZXIgZnJhbWUgYWxsb3dpbmcgdGhlIGxheWVyIHRvIGRyYXcgaW50byB0aGUgR0wgY29udGV4dC5cbiAqXG4gKiBUaGUgbGF5ZXIgY2FuIGFzc3VtZSBibGVuZGluZyBhbmQgZGVwdGggc3RhdGUgaXMgc2V0IHRvIGFsbG93IHRoZSBsYXllciB0byBwcm9wZXJseVxuICogYmxlbmQgYW5kIGNsaXAgb3RoZXIgbGF5ZXJzLiBUaGUgbGF5ZXIgY2Fubm90IG1ha2UgYW55IG90aGVyIGFzc3VtcHRpb25zIGFib3V0IHRoZVxuICogY3VycmVudCBHTCBzdGF0ZS5cbiAqXG4gKiBJZiB0aGUgbGF5ZXIgbmVlZHMgdG8gcmVuZGVyIHRvIGEgdGV4dHVyZSwgaXQgc2hvdWxkIGltcGxlbWVudCB0aGUgYHByZXJlbmRlcmAgbWV0aG9kXG4gKiB0byBkbyB0aGlzIGFuZCBvbmx5IHVzZSB0aGUgYHJlbmRlcmAgbWV0aG9kIGZvciBkcmF3aW5nIGRpcmVjdGx5IGludG8gdGhlIG1haW4gZnJhbWVidWZmZXIuXG4gKlxuICogVGhlIGJsZW5kIGZ1bmN0aW9uIGlzIHNldCB0byBgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSlgLiBUaGlzIGV4cGVjdHNcbiAqIGNvbG9ycyB0byBiZSBwcm92aWRlZCBpbiBwcmVtdWx0aXBsaWVkIGFscGhhIGZvcm0gd2hlcmUgdGhlIGByYCwgYGdgIGFuZCBgYmAgdmFsdWVzIGFyZSBhbHJlYWR5XG4gKiBtdWx0aXBsaWVkIGJ5IHRoZSBgYWAgdmFsdWUuIElmIHlvdSBhcmUgdW5hYmxlIHRvIHByb3ZpZGUgY29sb3JzIGluIHByZW11bHRpcGxpZWQgZm9ybSB5b3VcbiAqIG1heSB3YW50IHRvIGNoYW5nZSB0aGUgYmxlbmQgZnVuY3Rpb24gdG9cbiAqIGBnbC5ibGVuZEZ1bmNTZXBhcmF0ZShnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSlgLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIEN1c3RvbUxheWVySW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHJlbmRlclxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBtYXAncyBnbCBjb250ZXh0LlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBtYXRyaXggVGhlIG1hcCdzIGNhbWVyYSBtYXRyaXguIEl0IHByb2plY3RzIHNwaGVyaWNhbCBtZXJjYXRvclxuICogY29vcmRpbmF0ZXMgdG8gZ2wgY29vcmRpbmF0ZXMuIFRoZSBzcGhlcmljYWwgbWVyY2F0b3IgY29vcmRpbmF0ZSBgWzAsIDBdYCByZXByZXNlbnRzIHRoZVxuICogdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBtZXJjYXRvciB3b3JsZCBhbmQgYFsxLCAxXWAgcmVwcmVzZW50cyB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lci4gV2hlblxuICogdGhlIGByZW5kZXJpbmdNb2RlYCBpcyBgXCIzZFwiYCwgdGhlIHogY29vcmRpbmF0ZSBpcyBjb25mb3JtYWwuIEEgYm94IHdpdGggaWRlbnRpY2FsIHgsIHksIGFuZCB6XG4gKiBsZW5ndGhzIGluIG1lcmNhdG9yIHVuaXRzIHdvdWxkIGJlIHJlbmRlcmVkIGFzIGEgY3ViZS4ge0BsaW5rIE1lcmNhdG9yQ29vcmRpbmF0ZX0uZnJvbUxhdExuZ1xuICogY2FuIGJlIHVzZWQgdG8gcHJvamVjdCBhIGBMbmdMYXRgIHRvIGEgbWVyY2F0b3IgY29vcmRpbmF0ZS5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UgPSB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgIHJlbmRlcmluZ01vZGU6IFwiMmRcIiB8IFwiM2RcIixcbiAgICByZW5kZXI6IEN1c3RvbVJlbmRlck1ldGhvZCxcbiAgICBwcmVyZW5kZXI6ID9DdXN0b21SZW5kZXJNZXRob2QsXG4gICAgb25BZGQ6ID8obWFwOiBNYXAsIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpID0+IHZvaWQsXG4gICAgb25SZW1vdmU6ID8obWFwOiBNYXAsIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpID0+IHZvaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ3VzdG9tU3R5bGVMYXllcihsYXllck9iamVjdDogQ3VzdG9tTGF5ZXJJbnRlcmZhY2UpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBjb25zdCBpZCA9IGxheWVyT2JqZWN0LmlkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgbWVzc2FnZTogYGxheWVycy4ke2lkfTogbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImlkXCJgXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsYXllck9iamVjdC5yZW5kZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgbGF5ZXJzLiR7aWR9OiBtaXNzaW5nIHJlcXVpcmVkIG1ldGhvZCBcInJlbmRlclwiYFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXJPYmplY3QucmVuZGVyaW5nTW9kZSAmJlxuICAgICAgICBsYXllck9iamVjdC5yZW5kZXJpbmdNb2RlICE9PSAnMmQnICYmXG4gICAgICAgIGxheWVyT2JqZWN0LnJlbmRlcmluZ01vZGUgIT09ICczZCcpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgbWVzc2FnZTogYGxheWVycy4ke2lkfTogcHJvcGVydHkgXCJyZW5kZXJpbmdNb2RlXCIgbXVzdCBiZSBlaXRoZXIgXCIyZFwiIG9yIFwiM2RcImBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuY2xhc3MgQ3VzdG9tU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuXG4gICAgaW1wbGVtZW50YXRpb246IEN1c3RvbUxheWVySW50ZXJmYWNlO1xuXG4gICAgY29uc3RydWN0b3IoaW1wbGVtZW50YXRpb246IEN1c3RvbUxheWVySW50ZXJmYWNlKSB7XG4gICAgICAgIHN1cGVyKGltcGxlbWVudGF0aW9uLCB7fSk7XG4gICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbjtcbiAgICB9XG5cbiAgICBpczNEKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBsZW1lbnRhdGlvbi5yZW5kZXJpbmdNb2RlID09PSAnM2QnO1xuICAgIH1cblxuICAgIGhhc09mZnNjcmVlblBhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltcGxlbWVudGF0aW9uLnByZXJlbmRlciAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKCkge31cbiAgICB1cGRhdGVUcmFuc2l0aW9ucygpIHt9XG4gICAgaGFzVHJhbnNpdGlvbigpIHt9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGFzc2VydChmYWxzZSwgXCJDdXN0b20gbGF5ZXJzIGNhbm5vdCBiZSBzZXJpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIGlmICh0aGlzLmltcGxlbWVudGF0aW9uLm9uQWRkKSB7XG4gICAgICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uLm9uQWRkKG1hcCwgbWFwLnBhaW50ZXIuY29udGV4dC5nbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblJlbW92ZShtYXA6IE1hcCkge1xuICAgICAgICBpZiAodGhpcy5pbXBsZW1lbnRhdGlvbi5vblJlbW92ZSkge1xuICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvbi5vblJlbW92ZShtYXAsIG1hcC5wYWludGVyLmNvbnRleHQuZ2wpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21TdHlsZUxheWVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGNpcmNsZSBmcm9tICcuL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgaGVhdG1hcCBmcm9tICcuL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGhpbGxzaGFkZSBmcm9tICcuL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgZmlsbCBmcm9tICcuL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGZpbGxFeHRydXNpb24gZnJvbSAnLi9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcic7XG5pbXBvcnQgbGluZSBmcm9tICcuL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHN5bWJvbCBmcm9tICcuL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgYmFja2dyb3VuZCBmcm9tICcuL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHJhc3RlciBmcm9tICcuL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllcic7XG5pbXBvcnQgQ3VzdG9tU3R5bGVMYXllciBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4vc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNvbnN0IHN1YmNsYXNzZXMgPSB7XG4gICAgY2lyY2xlLFxuICAgIGhlYXRtYXAsXG4gICAgaGlsbHNoYWRlLFxuICAgIGZpbGwsXG4gICAgJ2ZpbGwtZXh0cnVzaW9uJzogZmlsbEV4dHJ1c2lvbixcbiAgICBsaW5lLFxuICAgIHN5bWJvbCxcbiAgICBiYWNrZ3JvdW5kLFxuICAgIHJhc3RlclxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlU3R5bGVMYXllcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UpIHtcbiAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21TdHlsZUxheWVyKGxheWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IHN1YmNsYXNzZXNbbGF5ZXIudHlwZV0obGF5ZXIpO1xuICAgIH1cbn1cblxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwb3RwYWNrKGJveGVzKSB7XG5cbiAgICAvLyBjYWxjdWxhdGUgdG90YWwgYm94IGFyZWEgYW5kIG1heGltdW0gYm94IHdpZHRoXG4gICAgbGV0IGFyZWEgPSAwO1xuICAgIGxldCBtYXhXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGJveCBvZiBib3hlcykge1xuICAgICAgICBhcmVhICs9IGJveC53ICogYm94Lmg7XG4gICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGJveC53KTtcbiAgICB9XG5cbiAgICAvLyBzb3J0IHRoZSBib3hlcyBmb3IgaW5zZXJ0aW9uIGJ5IGhlaWdodCwgZGVzY2VuZGluZ1xuICAgIGJveGVzLnNvcnQoKGEsIGIpID0+IGIuaCAtIGEuaCk7XG5cbiAgICAvLyBhaW0gZm9yIGEgc3F1YXJpc2ggcmVzdWx0aW5nIGNvbnRhaW5lcixcbiAgICAvLyBzbGlnaHRseSBhZGp1c3RlZCBmb3Igc3ViLTEwMCUgc3BhY2UgdXRpbGl6YXRpb25cbiAgICBjb25zdCBzdGFydFdpZHRoID0gTWF0aC5tYXgoTWF0aC5jZWlsKE1hdGguc3FydChhcmVhIC8gMC45NSkpLCBtYXhXaWR0aCk7XG5cbiAgICAvLyBzdGFydCB3aXRoIGEgc2luZ2xlIGVtcHR5IHNwYWNlLCB1bmJvdW5kZWQgYXQgdGhlIGJvdHRvbVxuICAgIGNvbnN0IHNwYWNlcyA9IFt7eDogMCwgeTogMCwgdzogc3RhcnRXaWR0aCwgaDogSW5maW5pdHl9XTtcblxuICAgIGxldCB3aWR0aCA9IDA7XG4gICAgbGV0IGhlaWdodCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGJveCBvZiBib3hlcykge1xuICAgICAgICAvLyBsb29rIHRocm91Z2ggc3BhY2VzIGJhY2t3YXJkcyBzbyB0aGF0IHdlIGNoZWNrIHNtYWxsZXIgc3BhY2VzIGZpcnN0XG4gICAgICAgIGZvciAobGV0IGkgPSBzcGFjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VzW2ldO1xuXG4gICAgICAgICAgICAvLyBsb29rIGZvciBlbXB0eSBzcGFjZXMgdGhhdCBjYW4gYWNjb21tb2RhdGUgdGhlIGN1cnJlbnQgYm94XG4gICAgICAgICAgICBpZiAoYm94LncgPiBzcGFjZS53IHx8IGJveC5oID4gc3BhY2UuaCkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIGZvdW5kIHRoZSBzcGFjZTsgYWRkIHRoZSBib3ggdG8gaXRzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAgICAgICAgLy8gfC0tLS0tLS18LS0tLS0tLXxcbiAgICAgICAgICAgIC8vIHwgIGJveCAgfCAgICAgICB8XG4gICAgICAgICAgICAvLyB8X19fX19fX3wgICAgICAgfFxuICAgICAgICAgICAgLy8gfCAgICAgICAgIHNwYWNlIHxcbiAgICAgICAgICAgIC8vIHxfX19fX19fX19fX19fX198XG4gICAgICAgICAgICBib3gueCA9IHNwYWNlLng7XG4gICAgICAgICAgICBib3gueSA9IHNwYWNlLnk7XG5cbiAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgYm94LnkgKyBib3guaCk7XG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBib3gueCArIGJveC53KTtcblxuICAgICAgICAgICAgaWYgKGJveC53ID09PSBzcGFjZS53ICYmIGJveC5oID09PSBzcGFjZS5oKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2UgbWF0Y2hlcyB0aGUgYm94IGV4YWN0bHk7IHJlbW92ZSBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBzcGFjZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBzcGFjZXMubGVuZ3RoKSBzcGFjZXNbaV0gPSBsYXN0O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJveC5oID09PSBzcGFjZS5oKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2UgbWF0Y2hlcyB0aGUgYm94IGhlaWdodDsgdXBkYXRlIGl0IGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgLy8gfC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfFxuICAgICAgICAgICAgICAgIC8vIHwgIGJveCAgfCB1cGRhdGVkIHNwYWNlIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX3xfX19fX19fX19fX19fX198XG4gICAgICAgICAgICAgICAgc3BhY2UueCArPSBib3gudztcbiAgICAgICAgICAgICAgICBzcGFjZS53IC09IGJveC53O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJveC53ID09PSBzcGFjZS53KSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2UgbWF0Y2hlcyB0aGUgYm94IHdpZHRoOyB1cGRhdGUgaXQgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICAvLyB8LS0tLS0tLS0tLS0tLS0tfFxuICAgICAgICAgICAgICAgIC8vIHwgICAgICBib3ggICAgICB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICAvLyB8IHVwZGF0ZWQgc3BhY2UgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19fX19fX19fX198XG4gICAgICAgICAgICAgICAgc3BhY2UueSArPSBib3guaDtcbiAgICAgICAgICAgICAgICBzcGFjZS5oIC09IGJveC5oO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgYm94IHNwbGl0cyB0aGUgc3BhY2UgaW50byB0d28gc3BhY2VzXG4gICAgICAgICAgICAgICAgLy8gfC0tLS0tLS18LS0tLS0tLS0tLS18XG4gICAgICAgICAgICAgICAgLy8gfCAgYm94ICB8IG5ldyBzcGFjZSB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX198X19fX19fX19fX198XG4gICAgICAgICAgICAgICAgLy8gfCB1cGRhdGVkIHNwYWNlICAgICB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX19fX198XG4gICAgICAgICAgICAgICAgc3BhY2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB4OiBzcGFjZS54ICsgYm94LncsXG4gICAgICAgICAgICAgICAgICAgIHk6IHNwYWNlLnksXG4gICAgICAgICAgICAgICAgICAgIHc6IHNwYWNlLncgLSBib3gudyxcbiAgICAgICAgICAgICAgICAgICAgaDogYm94LmhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzcGFjZS55ICs9IGJveC5oO1xuICAgICAgICAgICAgICAgIHNwYWNlLmggLT0gYm94Lmg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHc6IHdpZHRoLCAvLyBjb250YWluZXIgd2lkdGhcbiAgICAgICAgaDogaGVpZ2h0LCAvLyBjb250YWluZXIgaGVpZ2h0XG4gICAgICAgIGZpbGw6IChhcmVhIC8gKHdpZHRoICogaGVpZ2h0KSkgfHwgMCAvLyBzcGFjZSB1dGlsaXphdGlvblxuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBSR0JBSW1hZ2UgfSBmcm9tICcuLi91dGlsL2ltYWdlJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCBwb3RwYWNrIGZyb20gJ3BvdHBhY2snO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UnO1xuaW1wb3J0IHR5cGUgSW1hZ2VNYW5hZ2VyIGZyb20gJy4vaW1hZ2VfbWFuYWdlcic7XG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5cbmNvbnN0IHBhZGRpbmcgPSAxO1xuXG50eXBlIFJlY3QgPSB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB3OiBudW1iZXIsXG4gICAgaDogbnVtYmVyXG59O1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VQb3NpdGlvbiB7XG4gICAgcGFkZGVkUmVjdDogUmVjdDtcbiAgICBwaXhlbFJhdGlvOiBudW1iZXI7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocGFkZGVkUmVjdDogUmVjdCwge3BpeGVsUmF0aW8sIHZlcnNpb259OiBTdHlsZUltYWdlKSB7XG4gICAgICAgIHRoaXMucGFkZGVkUmVjdCA9IHBhZGRlZFJlY3Q7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgfVxuXG4gICAgZ2V0IHRsKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnggKyBwYWRkaW5nLFxuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnkgKyBwYWRkaW5nXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZ2V0IGJyKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnggKyB0aGlzLnBhZGRlZFJlY3QudyAtIHBhZGRpbmcsXG4gICAgICAgICAgICB0aGlzLnBhZGRlZFJlY3QueSArIHRoaXMucGFkZGVkUmVjdC5oIC0gcGFkZGluZ1xuICAgICAgICBdO1xuICAgIH1cblxuICAgIGdldCB0bGJyKCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy50bC5jb25jYXQodGhpcy5icik7XG4gICAgfVxuXG4gICAgZ2V0IGRpc3BsYXlTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgKHRoaXMucGFkZGVkUmVjdC53IC0gcGFkZGluZyAqIDIpIC8gdGhpcy5waXhlbFJhdGlvLFxuICAgICAgICAgICAgKHRoaXMucGFkZGVkUmVjdC5oIC0gcGFkZGluZyAqIDIpIC8gdGhpcy5waXhlbFJhdGlvXG4gICAgICAgIF07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUF0bGFzIHtcbiAgICBpbWFnZTogUkdCQUltYWdlO1xuICAgIGljb25Qb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn07XG4gICAgcGF0dGVyblBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufTtcbiAgICBoYXZlUmVuZGVyQ2FsbGJhY2tzOiBBcnJheTxzdHJpbmc+O1xuICAgIHVwbG9hZGVkOiA/Ym9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGljb25zOiB7W3N0cmluZ106IFN0eWxlSW1hZ2V9LCBwYXR0ZXJuczoge1tzdHJpbmddOiBTdHlsZUltYWdlfSkge1xuICAgICAgICBjb25zdCBpY29uUG9zaXRpb25zID0ge30sIHBhdHRlcm5Qb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5oYXZlUmVuZGVyQ2FsbGJhY2tzID0gW107XG5cbiAgICAgICAgY29uc3QgYmlucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuYWRkSW1hZ2VzKGljb25zLCBpY29uUG9zaXRpb25zLCBiaW5zKTtcbiAgICAgICAgdGhpcy5hZGRJbWFnZXMocGF0dGVybnMsIHBhdHRlcm5Qb3NpdGlvbnMsIGJpbnMpO1xuXG4gICAgICAgIGNvbnN0IHt3LCBofSA9IHBvdHBhY2soYmlucyk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IHcgfHwgMSwgaGVpZ2h0OiBoIHx8IDF9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGljb25zKSB7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSBpY29uc1tpZF07XG4gICAgICAgICAgICBjb25zdCBiaW4gPSBpY29uUG9zaXRpb25zW2lkXS5wYWRkZWRSZWN0O1xuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgeTogMH0sIHt4OiBiaW4ueCArIHBhZGRpbmcsIHk6IGJpbi55ICsgcGFkZGluZ30sIHNyYy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHBhdHRlcm5zW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHBhdHRlcm5Qb3NpdGlvbnNbaWRdLnBhZGRlZFJlY3Q7XG4gICAgICAgICAgICBjb25zdCB4ID0gYmluLnggKyBwYWRkaW5nLFxuICAgICAgICAgICAgICAgIHkgPSBiaW4ueSArIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgdyA9IHNyYy5kYXRhLndpZHRoLFxuICAgICAgICAgICAgICAgIGggPSBzcmMuZGF0YS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IDAsIHk6IDB9LCB7eCwgeX0sIHNyYy5kYXRhKTtcbiAgICAgICAgICAgIC8vIEFkZCAxIHBpeGVsIHdyYXBwZWQgcGFkZGluZyBvbiBlYWNoIHNpZGUgb2YgdGhlIGltYWdlLlxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7IHg6IDAsIHk6IGggLSAxIH0sIHsgeCwgeTogeSAtIDEgfSwgeyB3aWR0aDogdywgaGVpZ2h0OiAxIH0pOyAvLyBUXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHsgeDogMCwgeTogICAgIDAgfSwgeyB4LCB5OiB5ICsgaCB9LCB7IHdpZHRoOiB3LCBoZWlnaHQ6IDEgfSk7IC8vIEJcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwgeyB4OiB3IC0gMSwgeTogMCB9LCB7IHg6IHggLSAxLCB5IH0sIHsgd2lkdGg6IDEsIGhlaWdodDogaCB9KTsgLy8gTFxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7IHg6IDAsICAgICB5OiAwIH0sIHsgeDogeCArIHcsIHkgfSwgeyB3aWR0aDogMSwgaGVpZ2h0OiBoIH0pOyAvLyBSXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgIHRoaXMuaWNvblBvc2l0aW9ucyA9IGljb25Qb3NpdGlvbnM7XG4gICAgICAgIHRoaXMucGF0dGVyblBvc2l0aW9ucyA9IHBhdHRlcm5Qb3NpdGlvbnM7XG4gICAgfVxuXG4gICAgYWRkSW1hZ2VzKGltYWdlczoge1tzdHJpbmddOiBTdHlsZUltYWdlfSwgcG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259LCBiaW5zOiBBcnJheTxSZWN0Pikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGltYWdlcykge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gaW1hZ2VzW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHtcbiAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgdzogc3JjLmRhdGEud2lkdGggKyAyICogcGFkZGluZyxcbiAgICAgICAgICAgICAgICBoOiBzcmMuZGF0YS5oZWlnaHQgKyAyICogcGFkZGluZyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBiaW5zLnB1c2goYmluKTtcbiAgICAgICAgICAgIHBvc2l0aW9uc1tpZF0gPSBuZXcgSW1hZ2VQb3NpdGlvbihiaW4sIHNyYyk7XG5cbiAgICAgICAgICAgIGlmIChzcmMuaGFzUmVuZGVyQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MucHVzaChpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXRjaFVwZGF0ZWRJbWFnZXMoaW1hZ2VNYW5hZ2VyOiBJbWFnZU1hbmFnZXIsIHRleHR1cmU6IFRleHR1cmUpIHtcbiAgICAgICAgaW1hZ2VNYW5hZ2VyLmRpc3BhdGNoUmVuZGVyQ2FsbGJhY2tzKHRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBpbWFnZU1hbmFnZXIudXBkYXRlZEltYWdlcykge1xuICAgICAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWRJbWFnZSh0aGlzLmljb25Qb3NpdGlvbnNbbmFtZV0sIGltYWdlTWFuYWdlci5nZXRJbWFnZShuYW1lKSwgdGV4dHVyZSk7XG4gICAgICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZEltYWdlKHRoaXMucGF0dGVyblBvc2l0aW9uc1tuYW1lXSwgaW1hZ2VNYW5hZ2VyLmdldEltYWdlKG5hbWUpLCB0ZXh0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhdGNoVXBkYXRlZEltYWdlKHBvc2l0aW9uOiA/SW1hZ2VQb3NpdGlvbiwgaW1hZ2U6ID9TdHlsZUltYWdlLCB0ZXh0dXJlOiBUZXh0dXJlKSB7XG4gICAgICAgIGlmICghcG9zaXRpb24gfHwgIWltYWdlKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uLnZlcnNpb24gPT09IGltYWdlLnZlcnNpb24pIHJldHVybjtcblxuICAgICAgICBwb3NpdGlvbi52ZXJzaW9uID0gaW1hZ2UudmVyc2lvbjtcbiAgICAgICAgY29uc3QgW3gsIHldID0gcG9zaXRpb24udGw7XG4gICAgICAgIHRleHR1cmUudXBkYXRlKGltYWdlLmRhdGEsIHVuZGVmaW5lZCwge3gsIHl9KTtcbiAgICB9XG5cbn1cblxucmVnaXN0ZXIoJ0ltYWdlUG9zaXRpb24nLCBJbWFnZVBvc2l0aW9uKTtcbnJlZ2lzdGVyKCdJbWFnZUF0bGFzJywgSW1hZ2VBdGxhcyk7XG5cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cnO1xuY29uc3QgeyBIVE1MSW1hZ2VFbGVtZW50LCBIVE1MQ2FudmFzRWxlbWVudCwgSFRNTFZpZGVvRWxlbWVudCwgSW1hZ2VEYXRhIH0gPSB3aW5kb3c7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7UkdCQUltYWdlLCBBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcblxuZXhwb3J0IHR5cGUgVGV4dHVyZUZvcm1hdCA9XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ1JHQkEnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdBTFBIQSc+O1xuZXhwb3J0IHR5cGUgVGV4dHVyZUZpbHRlciA9XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0xJTkVBUic+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0xJTkVBUl9NSVBNQVBfTkVBUkVTVCc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ05FQVJFU1QnPjtcbmV4cG9ydCB0eXBlIFRleHR1cmVXcmFwID1cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnUkVQRUFUJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnQ0xBTVBfVE9fRURHRSc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ01JUlJPUkVEX1JFUEVBVCc+O1xuXG50eXBlIEVtcHR5SW1hZ2UgPSB7XG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBkYXRhOiBudWxsXG59XG5cbmV4cG9ydCB0eXBlIFRleHR1cmVJbWFnZSA9XG4gICAgfCBSR0JBSW1hZ2VcbiAgICB8IEFscGhhSW1hZ2VcbiAgICB8IEhUTUxJbWFnZUVsZW1lbnRcbiAgICB8IEhUTUxDYW52YXNFbGVtZW50XG4gICAgfCBIVE1MVmlkZW9FbGVtZW50XG4gICAgfCBJbWFnZURhdGFcbiAgICB8IEVtcHR5SW1hZ2U7XG5cbmNsYXNzIFRleHR1cmUge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgc2l6ZTogW251bWJlciwgbnVtYmVyXTtcbiAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG4gICAgZm9ybWF0OiBUZXh0dXJlRm9ybWF0O1xuICAgIGZpbHRlcjogP1RleHR1cmVGaWx0ZXI7XG4gICAgd3JhcDogP1RleHR1cmVXcmFwO1xuICAgIHVzZU1pcG1hcDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGltYWdlOiBUZXh0dXJlSW1hZ2UsIGZvcm1hdDogVGV4dHVyZUZvcm1hdCwgb3B0aW9uczogP3sgcHJlbXVsdGlwbHk/OiBib29sZWFuLCB1c2VNaXBtYXA/OiBib29sZWFuIH0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGNvbnRleHQuZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZShpbWFnZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdXBkYXRlKGltYWdlOiBUZXh0dXJlSW1hZ2UsIG9wdGlvbnM6ID97cHJlbXVsdGlwbHk/OiBib29sZWFuLCB1c2VNaXBtYXA/OiBib29sZWFufSwgcG9zaXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0pIHtcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gaW1hZ2U7XG4gICAgICAgIGNvbnN0IHJlc2l6ZSA9ICghdGhpcy5zaXplIHx8IHRoaXMuc2l6ZVswXSAhPT0gd2lkdGggfHwgdGhpcy5zaXplWzFdICE9PSBoZWlnaHQpICYmICFwb3NpdGlvbjtcbiAgICAgICAgY29uc3Qge2NvbnRleHR9ID0gdGhpcztcbiAgICAgICAgY29uc3Qge2dsfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgdGhpcy51c2VNaXBtYXAgPSBCb29sZWFuKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VNaXBtYXApO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuXG4gICAgICAgIGNvbnRleHQucGl4ZWxTdG9yZVVucGFja0ZsaXBZLnNldChmYWxzZSk7XG4gICAgICAgIGNvbnRleHQucGl4ZWxTdG9yZVVucGFjay5zZXQoMSk7XG4gICAgICAgIGNvbnRleHQucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0KHRoaXMuZm9ybWF0ID09PSBnbC5SR0JBICYmICghb3B0aW9ucyB8fCBvcHRpb25zLnByZW11bHRpcGx5ICE9PSBmYWxzZSkpO1xuXG4gICAgICAgIGlmIChyZXNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IFt3aWR0aCwgaGVpZ2h0XTtcblxuICAgICAgICAgICAgaWYgKGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZS5kYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gcG9zaXRpb24gfHwgeyB4OiAwLCB5OiAwfTtcbiAgICAgICAgICAgIGlmIChpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIHgsIHksIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnVzZU1pcG1hcCAmJiB0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSkge1xuICAgICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKGZpbHRlcjogVGV4dHVyZUZpbHRlciwgd3JhcDogVGV4dHVyZVdyYXAsIG1pbkZpbHRlcjogP1RleHR1cmVGaWx0ZXIpIHtcbiAgICAgICAgY29uc3Qge2NvbnRleHR9ID0gdGhpcztcbiAgICAgICAgY29uc3Qge2dsfSA9IGNvbnRleHQ7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKG1pbkZpbHRlciA9PT0gZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUICYmICF0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSkge1xuICAgICAgICAgICAgbWluRmlsdGVyID0gZ2wuTElORUFSO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdGhpcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXIpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIG1pbkZpbHRlciB8fCBmaWx0ZXIpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod3JhcCAhPT0gdGhpcy53cmFwKSB7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCB3cmFwKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIHdyYXApO1xuICAgICAgICAgICAgdGhpcy53cmFwID0gd3JhcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzU2l6ZVBvd2VyT2ZUd28oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemVbMF0gPT09IHRoaXMuc2l6ZVsxXSAmJiAoTWF0aC5sb2codGhpcy5zaXplWzBdKSAvIE1hdGguTE4yKSAlIDEgPT09IDA7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3Qge2dsfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSAobnVsbDogYW55KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRleHR1cmU7XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGJmO1xuXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKTtcblxuZnVuY3Rpb24gUGJmKGJ1Zikge1xuICAgIHRoaXMuYnVmID0gQXJyYXlCdWZmZXIuaXNWaWV3ICYmIEFycmF5QnVmZmVyLmlzVmlldyhidWYpID8gYnVmIDogbmV3IFVpbnQ4QXJyYXkoYnVmIHx8IDApO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5idWYubGVuZ3RoO1xufVxuXG5QYmYuVmFyaW50ICA9IDA7IC8vIHZhcmludDogaW50MzIsIGludDY0LCB1aW50MzIsIHVpbnQ2NCwgc2ludDMyLCBzaW50NjQsIGJvb2wsIGVudW1cblBiZi5GaXhlZDY0ID0gMTsgLy8gNjQtYml0OiBkb3VibGUsIGZpeGVkNjQsIHNmaXhlZDY0XG5QYmYuQnl0ZXMgICA9IDI7IC8vIGxlbmd0aC1kZWxpbWl0ZWQ6IHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG5QYmYuRml4ZWQzMiA9IDU7IC8vIDMyLWJpdDogZmxvYXQsIGZpeGVkMzIsIHNmaXhlZDMyXG5cbnZhciBTSElGVF9MRUZUXzMyID0gKDEgPDwgMTYpICogKDEgPDwgMTYpLFxuICAgIFNISUZUX1JJR0hUXzMyID0gMSAvIFNISUZUX0xFRlRfMzI7XG5cblBiZi5wcm90b3R5cGUgPSB7XG5cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5idWYgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gUkVBRElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcmVhZEZpZWxkczogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQsIGVuZCkge1xuICAgICAgICBlbmQgPSBlbmQgfHwgdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5yZWFkVmFyaW50KCksXG4gICAgICAgICAgICAgICAgdGFnID0gdmFsID4+IDMsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnBvcztcblxuICAgICAgICAgICAgdGhpcy50eXBlID0gdmFsICYgMHg3O1xuICAgICAgICAgICAgcmVhZEZpZWxkKHRhZywgcmVzdWx0LCB0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucG9zID09PSBzdGFydFBvcykgdGhpcy5za2lwKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgcmVhZE1lc3NhZ2U6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGaWVsZHMocmVhZEZpZWxkLCByZXN1bHQsIHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MpO1xuICAgIH0sXG5cbiAgICByZWFkRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkSW50MzIodGhpcy5idWYsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpICsgcmVhZEludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZEZsb2F0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IGllZWU3NTQucmVhZCh0aGlzLmJ1ZiwgdGhpcy5wb3MsIHRydWUsIDIzLCA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSBpZWVlNzU0LnJlYWQodGhpcy5idWYsIHRoaXMucG9zLCB0cnVlLCA1MiwgOCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ6IGZ1bmN0aW9uKGlzU2lnbmVkKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYjtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgID0gIGIgJiAweDdmOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCA3OyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCAxNDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCAyMTsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zXTsgICB2YWwgfD0gKGIgJiAweDBmKSA8PCAyODtcblxuICAgICAgICByZXR1cm4gcmVhZFZhcmludFJlbWFpbmRlcih2YWwsIGlzU2lnbmVkLCB0aGlzKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHsgLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2Mi4wLjFcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFZhcmludCh0cnVlKTtcbiAgICB9LFxuXG4gICAgcmVhZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbnVtID0gdGhpcy5yZWFkVmFyaW50KCk7XG4gICAgICAgIHJldHVybiBudW0gJSAyID09PSAxID8gKG51bSArIDEpIC8gLTIgOiBudW0gLyAyOyAvLyB6aWd6YWcgZW5jb2RpbmdcbiAgICB9LFxuXG4gICAgcmVhZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgfSxcblxuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyxcbiAgICAgICAgICAgIHN0ciA9IHJlYWRVdGY4KHRoaXMuYnVmLCB0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIHJlYWRCeXRlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcblxuICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uKGFyciwgaXNTaWduZWQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KGlzU2lnbmVkKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KGlzU2lnbmVkKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRCb29sZWFuOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZsb2F0OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgIGlmICh0eXBlID09PSBQYmYuVmFyaW50KSB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gPiAweDdmKSB7fVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuQnl0ZXMpIHRoaXMucG9zID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDY0KSB0aGlzLnBvcyArPSA4O1xuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCB0eXBlOiAnICsgdHlwZSk7XG4gICAgfSxcblxuICAgIC8vID09PSBXUklUSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB3cml0ZVRhZzogZnVuY3Rpb24odGFnLCB0eXBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoKHRhZyA8PCAzKSB8IHR5cGUpO1xuICAgIH0sXG5cbiAgICByZWFsbG9jOiBmdW5jdGlvbihtaW4pIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDE2O1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikgbGVuZ3RoICo9IDI7XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgICAgICAgICAgYnVmLnNldCh0aGlzLmJ1Zik7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhbCA9ICt2YWwgfHwgMDtcblxuICAgICAgICBpZiAodmFsID4gMHhmZmZmZmZmIHx8IHZhbCA8IDApIHtcbiAgICAgICAgICAgIHdyaXRlQmlnVmFyaW50KHZhbCwgdGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG5cbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICAgICAgICAgdmFsICYgMHg3ZiAgfCAodmFsID4gMHg3ZiA/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+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG4gICAgICAgICAgICBjID0gMHhEQzAwIHwgYyAmIDB4M0ZGO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiB3cml0ZVV0ZjgoYnVmLCBzdHIsIHBvcykge1xuICAgIGZvciAodmFyIGkgPSAwLCBjLCBsZWFkOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTsgLy8gY29kZSBwb2ludFxuXG4gICAgICAgIGlmIChjID4gMHhEN0ZGICYmIGMgPCAweEUwMDApIHtcbiAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweERDMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBsZWFkIC0gMHhEODAwIDw8IDEwIHwgYyAtIDB4REMwMCB8IDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPiAweERCRkYgfHwgKGkgKyAxID09PSBzdHIubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhFRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChsZWFkKSB7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gMHhFRjtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJGO1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IGM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHg2IHwgMHhDMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4QyB8IDB4RTA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHgxMiB8IDB4RjA7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4QyAmIDB4M0YgfCAweDgwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDYgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjICYgMHgzRiB8IDB4ODA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvcztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IEFscGhhSW1hZ2UgfSBmcm9tICcuLi91dGlsL2ltYWdlJztcblxuaW1wb3J0IFByb3RvYnVmIGZyb20gJ3BiZic7XG5jb25zdCBib3JkZXIgPSAzO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi9zdHlsZV9nbHlwaCc7XG5cbmZ1bmN0aW9uIHJlYWRGb250c3RhY2tzKHRhZzogbnVtYmVyLCBnbHlwaHM6IEFycmF5PFN0eWxlR2x5cGg+LCBwYmY6IFByb3RvYnVmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkge1xuICAgICAgICBwYmYucmVhZE1lc3NhZ2UocmVhZEZvbnRzdGFjaywgZ2x5cGhzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRGb250c3RhY2sodGFnOiBudW1iZXIsIGdseXBoczogQXJyYXk8U3R5bGVHbHlwaD4sIHBiZjogUHJvdG9idWYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIGNvbnN0IHtpZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBsZWZ0LCB0b3AsIGFkdmFuY2V9ID0gcGJmLnJlYWRNZXNzYWdlKHJlYWRHbHlwaCwge30pO1xuICAgICAgICBnbHlwaHMucHVzaCh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGJpdG1hcDogbmV3IEFscGhhSW1hZ2Uoe1xuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCArIDIgKiBib3JkZXIsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKyAyICogYm9yZGVyXG4gICAgICAgICAgICB9LCBiaXRtYXApLFxuICAgICAgICAgICAgbWV0cmljczoge3dpZHRoLCBoZWlnaHQsIGxlZnQsIHRvcCwgYWR2YW5jZX1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkR2x5cGgodGFnOiBudW1iZXIsIGdseXBoOiBPYmplY3QsIHBiZjogUHJvdG9idWYpIHtcbiAgICBpZiAodGFnID09PSAxKSBnbHlwaC5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBnbHlwaC5iaXRtYXAgPSBwYmYucmVhZEJ5dGVzKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBnbHlwaC53aWR0aCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBnbHlwaC5oZWlnaHQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgZ2x5cGgubGVmdCA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNikgZ2x5cGgudG9wID0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA3KSBnbHlwaC5hZHZhbmNlID0gcGJmLnJlYWRWYXJpbnQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGRhdGE6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSk6IEFycmF5PFN0eWxlR2x5cGg+IHtcbiAgICByZXR1cm4gbmV3IFByb3RvYnVmKGRhdGEpLnJlYWRGaWVsZHMocmVhZEZvbnRzdGFja3MsIFtdKTtcbn1cblxuZXhwb3J0IGNvbnN0IEdMWVBIX1BCRl9CT1JERVIgPSBib3JkZXI7XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIEludm9rZXMgdGhlIHdyYXBwZWQgZnVuY3Rpb24gaW4gYSBub24tYmxvY2tpbmcgd2F5IHdoZW4gdHJpZ2dlcigpIGlzIGNhbGxlZC4gSW52b2NhdGlvbiByZXF1ZXN0c1xuICogYXJlIGlnbm9yZWQgdW50aWwgdGhlIGZ1bmN0aW9uIHdhcyBhY3R1YWxseSBpbnZva2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFRocm90dGxlZEludm9rZXIge1xuICAgIF9jaGFubmVsOiBNZXNzYWdlQ2hhbm5lbDtcbiAgICBfdHJpZ2dlcmVkOiBib29sZWFuO1xuICAgIF9jYWxsYmFjazogRnVuY3Rpb25cblxuICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLl90cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwucG9ydDIub25tZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJpZ2dlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmlnZ2VyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UodHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGhyb3R0bGVkSW52b2tlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGJpbmRBbGwgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZSB9IGZyb20gJy4vd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgVGhyb3R0bGVkSW52b2tlciBmcm9tICcuL3Rocm90dGxlZF9pbnZva2VyJztcblxuaW1wb3J0IHR5cGUge1RyYW5zZmVyYWJsZX0gZnJvbSAnLi4vdHlwZXMvdHJhbnNmZXJhYmxlJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0FjdG9yIGRlc2lnbiBwYXR0ZXJuXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FjdG9yX21vZGVsKVxuICogdGhhdCBtYWludGFpbnMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFzeW5jaHJvbm91cyB0YXNrcyBhbmQgdGhlIG9iamVjdHNcbiAqIHRoYXQgc3BpbiB0aGVtIG9mZiAtIGluIHRoaXMgY2FzZSwgdGFza3MgbGlrZSBwYXJzaW5nIHBhcnRzIG9mIHN0eWxlcyxcbiAqIG93bmVkIGJ5IHRoZSBzdHlsZXNcbiAqXG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gdGFyZ2V0XG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gcGFyZW50XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IG1hcElkIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBNYXAgaW5zdGFuY2UgdXNpbmcgdGhpcyBBY3Rvci5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIEFjdG9yIHtcbiAgICB0YXJnZXQ6IGFueTtcbiAgICBwYXJlbnQ6IGFueTtcbiAgICBtYXBJZDogP251bWJlcjtcbiAgICBjYWxsYmFja3M6IHsgbnVtYmVyOiBhbnkgfTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdGFza3M6IHsgbnVtYmVyOiBhbnkgfTtcbiAgICB0YXNrUXVldWU6IEFycmF5PG51bWJlcj47XG4gICAgY2FuY2VsQ2FsbGJhY2tzOiB7IG51bWJlcjogQ2FuY2VsYWJsZSB9O1xuICAgIGludm9rZXI6IFRocm90dGxlZEludm9rZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IGFueSwgcGFyZW50OiBhbnksIG1hcElkOiA/bnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5tYXBJZCA9IG1hcElkO1xuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IHt9O1xuICAgICAgICB0aGlzLnRhc2tzID0ge307XG4gICAgICAgIHRoaXMudGFza1F1ZXVlID0gW107XG4gICAgICAgIHRoaXMuY2FuY2VsQ2FsbGJhY2tzID0ge307XG4gICAgICAgIGJpbmRBbGwoWydyZWNlaXZlJywgJ3Byb2Nlc3MnXSwgdGhpcyk7XG4gICAgICAgIHRoaXMuaW52b2tlciA9IG5ldyBUaHJvdHRsZWRJbnZva2VyKHRoaXMucHJvY2Vzcyk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgZnJvbSBhIG1haW4tdGhyZWFkIG1hcCB0byBhIFdvcmtlciBvciBmcm9tIGEgV29ya2VyIGJhY2sgdG9cbiAgICAgKiBhIG1haW4tdGhyZWFkIG1hcCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgbWV0aG9kIHRvIGludm9rZSBvciAnW3NvdXJjZS10eXBlXS5bc291cmNlLW5hbWVdLm5hbWUnIGZvciBhIG1ldGhvZCBvbiBhIFdvcmtlclNvdXJjZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0TWFwSWQgQSBwYXJ0aWN1bGFyIG1hcElkIHRvIHdoaWNoIHRvIHNlbmQgdGhpcyBtZXNzYWdlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2VuZCh0eXBlOiBzdHJpbmcsIGRhdGE6IG1peGVkLCBjYWxsYmFjazogP0Z1bmN0aW9uLCB0YXJnZXRNYXBJZDogP3N0cmluZyk6ID9DYW5jZWxhYmxlIHtcbiAgICAgICAgLy8gV2UncmUgdXNpbmcgYSBzdHJpbmcgSUQgaW5zdGVhZCBvZiBudW1iZXJzIGJlY2F1c2UgdGhleSBhcmUgYmVpbmcgdXNlZCBhcyBvYmplY3Qga2V5c1xuICAgICAgICAvLyBhbnl3YXksIGFuZCB0aHVzIHN0cmluZ2lmaWVkIGltcGxpY2l0bHkuIFdlIHVzZSByYW5kb20gSURzIGJlY2F1c2UgYW4gYWN0b3IgbWF5IHJlY2VpdmVcbiAgICAgICAgLy8gbWVzc2FnZSBmcm9tIG11bHRpcGxlIG90aGVyIGFjdG9ycyB3aGljaCBjb3VsZCBydW4gaW4gZGlmZmVyZW50IGV4ZWN1dGlvbiBjb250ZXh0LiBBXG4gICAgICAgIC8vIGxpbmVhcmx5IGluY3JlYXNpbmcgSUQgY291bGQgcHJvZHVjZSBjb2xsaXNpb25zLlxuICAgICAgICBjb25zdCBpZCA9IE1hdGgucm91bmQoKE1hdGgucmFuZG9tKCkgKiAxZTE4KSkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygwLCAxMCk7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVyczogQXJyYXk8VHJhbnNmZXJhYmxlPiA9IFtdO1xuICAgICAgICB0aGlzLnRhcmdldC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBoYXNDYWxsYmFjazogISFjYWxsYmFjayxcbiAgICAgICAgICAgIHRhcmdldE1hcElkLFxuICAgICAgICAgICAgc291cmNlTWFwSWQ6IHRoaXMubWFwSWQsXG4gICAgICAgICAgICBkYXRhOiBzZXJpYWxpemUoZGF0YSwgYnVmZmVycylcbiAgICAgICAgfSwgYnVmZmVycyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjYWxsYmFjayB0byBudWxsIHNvIHRoYXQgaXQgbmV2ZXIgZmlyZXMgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgYWJvcnRlZC5cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJzxjYW5jZWw+JyxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWFwSWQsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVjZWl2ZShtZXNzYWdlOiBPYmplY3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICAgIGlkID0gZGF0YS5pZDtcblxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS50YXJnZXRNYXBJZCAmJiB0aGlzLm1hcElkICE9PSBkYXRhLnRhcmdldE1hcElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnPGNhbmNlbD4nKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9yaWdpbmFsIHJlcXVlc3QgZnJvbSB0aGUgcXVldWUuIFRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiBpdFxuICAgICAgICAgICAgLy8gaGFzbid0IGJlZW4ga2lja2VkIG9mZiB5ZXQuIFRoZSBpZCB3aWxsIHJlbWFpbiBpbiB0aGUgcXVldWUsIGJ1dCBiZWNhdXNlXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIHRhc2ssIGl0IHdpbGwgYmUgZHJvcHBlZCBvbmNlIGl0J3MgdGltZSB0byBleGVjdXRlIGl0LlxuICAgICAgICAgICAgZGVsZXRlIHRoaXMudGFza3NbaWRdO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsID0gdGhpcy5jYW5jZWxDYWxsYmFja3NbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FuY2VsQ2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgIGlmIChjYW5jZWwpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB0YXNrcyB0aGF0IHdlIG5lZWQgdG8gcHJvY2VzcyBiZWZvcmUgYWN0dWFsbHkgcHJvY2Vzc2luZyB0aGVtLiBUaGlzXG4gICAgICAgICAgICAvLyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB3YW50IHRvIGtlZXAgcmVjZWl2aW5nIG1lc3NhZ2VzLCBhbmQgaW4gcGFydGljdWxhcixcbiAgICAgICAgICAgIC8vIDxjYW5jZWw+IG1lc3NhZ2VzLiBTb21lIHRhc2tzIG1heSB0YWtlIGEgd2hpbGUgaW4gdGhlIHdvcmtlciB0aHJlYWQsIHNvIGJlZm9yZVxuICAgICAgICAgICAgLy8gZXhlY3V0aW5nIHRoZSBuZXh0IHRhc2sgaW4gb3VyIHF1ZXVlLCBwb3N0TWVzc2FnZSBwcmVlbXB0cyB0aGlzIGFuZCA8Y2FuY2VsPlxuICAgICAgICAgICAgLy8gbWVzc2FnZXMgY2FuIGJlIHByb2Nlc3NlZC4gV2UncmUgdXNpbmcgYSBNZXNzYWdlQ2hhbm5lbCBvYmplY3QgdG8gZ2V0IHRocm90dGxlIHRoZVxuICAgICAgICAgICAgLy8gcHJvY2VzcygpIGZsb3cgdG8gb25lIGF0IGEgdGltZS5cbiAgICAgICAgICAgIHRoaXMudGFza3NbaWRdID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMudGFza1F1ZXVlLnB1c2goaWQpO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VyLnRyaWdnZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3MoKSB7XG4gICAgICAgIGlmICghdGhpcy50YXNrUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRhc2tRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBjb25zdCB0YXNrID0gdGhpcy50YXNrc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRhc2tzW2lkXTtcbiAgICAgICAgLy8gU2NoZWR1bGUgYW5vdGhlciBwcm9jZXNzIGNhbGwgaWYgd2Uga25vdyB0aGVyZSdzIG1vcmUgdG8gcHJvY2VzcyBfYmVmb3JlXyBpbnZva2luZyB0aGVcbiAgICAgICAgLy8gY3VycmVudCB0YXNrLiBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHByb2Nlc3NpbmcgY29udGludWVzIGV2ZW4gaWYgdGhlIGN1cnJlbnQgdGFza1xuICAgICAgICAvLyBkb2Vzbid0IGV4ZWN1dGUgc3VjY2Vzc2Z1bGx5LlxuICAgICAgICBpZiAodGhpcy50YXNrUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmludm9rZXIudHJpZ2dlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFzaykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHRhc2sgSUQgZG9lc24ndCBoYXZlIGFzc29jaWF0ZWQgdGFzayBkYXRhIGFueW1vcmUsIGl0IHdhcyBjYW5jZWxlZC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXNrLnR5cGUgPT09ICc8cmVzcG9uc2U+Jykge1xuICAgICAgICAgICAgLy8gVGhlIGRvbmUoKSBmdW5jdGlvbiBpbiB0aGUgY291bnRlcnBhcnQgaGFzIGJlZW4gY2FsbGVkLCBhbmQgd2UgYXJlIG5vd1xuICAgICAgICAgICAgLy8gZmlyaW5nIHRoZSBjYWxsYmFjayBpbiB0aGUgb3JpZ2luYXRpbmcgYWN0b3IsIGlmIHRoZXJlIGlzIG9uZS5cbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5jYWxsYmFja3NbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGdldCBhIHJlc3BvbnNlLCBidXQgZG9uJ3QgaGF2ZSBhIGNhbGxiYWNrLCB0aGUgcmVxdWVzdCB3YXMgY2FuY2VsZWQuXG4gICAgICAgICAgICAgICAgaWYgKHRhc2suZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGVzZXJpYWxpemUodGFzay5lcnJvcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRlc2VyaWFsaXplKHRhc2suZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGRvbmUgPSB0YXNrLmhhc0NhbGxiYWNrID8gKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FuY2VsQ2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXJzOiBBcnJheTxUcmFuc2ZlcmFibGU+ID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJzxyZXNwb25zZT4nLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VNYXBJZDogdGhpcy5tYXBJZCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVyciA/IHNlcmlhbGl6ZShlcnIpIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogc2VyaWFsaXplKGRhdGEsIGJ1ZmZlcnMpXG4gICAgICAgICAgICAgICAgfSwgYnVmZmVycyk7XG4gICAgICAgICAgICB9IDogKF8pID0+IHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IChkZXNlcmlhbGl6ZSh0YXNrLmRhdGEpOiBhbnkpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50W3Rhc2sudHlwZV0pIHtcbiAgICAgICAgICAgICAgICAvLyB0YXNrLnR5cGUgPT0gJ2xvYWRUaWxlJywgJ3JlbW92ZVRpbGUnLCBldGMuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB0aGlzLnBhcmVudFt0YXNrLnR5cGVdKHRhc2suc291cmNlTWFwSWQsIHBhcmFtcywgZG9uZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGFyZW50LmdldFdvcmtlclNvdXJjZSkge1xuICAgICAgICAgICAgICAgIC8vIHRhc2sudHlwZSA9PSBzb3VyY2V0eXBlLm1ldGhvZFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSB0YXNrLnR5cGUuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY29wZSA9ICh0aGlzLnBhcmVudDogYW55KS5nZXRXb3JrZXJTb3VyY2UodGFzay5zb3VyY2VNYXBJZCwga2V5c1swXSwgcGFyYW1zLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzY29wZVtrZXlzWzFdXShwYXJhbXMsIGRvbmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBObyBmdW5jdGlvbiB3YXMgZm91bmQuXG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGZ1bmN0aW9uICR7dGFzay50eXBlfWApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFjb21wbGV0ZWQgJiYgY2FsbGJhY2sgJiYgY2FsbGJhY2suY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxsb3dzIGNhbmNlbGluZyB0aGUgdGFzayBhcyBsb25nIGFzIGl0IGhhc24ndCBiZWVuIGNvbXBsZXRlZCB5ZXQuXG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxDYWxsYmFja3NbaWRdID0gY2FsbGJhY2suY2FuY2VsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5yZWNlaXZlLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBY3RvcjtcbiIsImV4cG9ydCB7IGdldFVSTCwgZ2V0VGlsZUJCb3gsIGdldE1lcmNDb29yZHMgfTtcblxuXG4vKipcbiAqIGdldFVSTFxuICpcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgYmFzZVVybCAgQmFzZSB1cmwgb2YgdGhlIFdNUyBzZXJ2ZXJcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgbGF5ZXIgICAgTGF5ZXIgbmFtZVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICAgICAgICBUaWxlIHpvb21cbiAqIEBwYXJhbSAgICB7T2JqZWN0fSAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLmZvcm1hdD0naW1hZ2UvcG5nJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuc2VydmljZT0nV01TJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMudmVyc2lvbj0nMS4xLjEnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5yZXF1ZXN0PSdHZXRNYXAnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zcnM9J0VQU0c6Mzg1NyddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLndpZHRoPScyNTYnXVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICBbb3B0aW9ucy5oZWlnaHQ9JzI1NiddXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIHVybFxuICogQGV4YW1wbGVcbiAqIHZhciBiYXNlVXJsID0gJ2h0dHA6Ly9nZW9kYXRhLnN0YXRlLm5qLnVzL2ltYWdlcnl3bXMvTmF0dXJhbDIwMTUnO1xuICogdmFyIGxheWVyID0gJ05hdHVyYWwyMDE1JztcbiAqIHZhciB1cmwgPSB3aG9vdHMuZ2V0VVJMKGJhc2VVcmwsIGxheWVyLCAxNTQzMDgsIDE5NzE2NywgMTkpO1xuICovXG5mdW5jdGlvbiBnZXRVUkwoYmFzZVVybCwgbGF5ZXIsIHgsIHksIHosIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciB1cmwgPSBiYXNlVXJsICsgJz8nICsgW1xuICAgICAgICAnYmJveD0nICAgICsgZ2V0VGlsZUJCb3goeCwgeSwgeiksXG4gICAgICAgICdmb3JtYXQ9JyAgKyAob3B0aW9ucy5mb3JtYXQgfHwgJ2ltYWdlL3BuZycpLFxuICAgICAgICAnc2VydmljZT0nICsgKG9wdGlvbnMuc2VydmljZSB8fCAnV01TJyksXG4gICAgICAgICd2ZXJzaW9uPScgKyAob3B0aW9ucy52ZXJzaW9uIHx8ICcxLjEuMScpLFxuICAgICAgICAncmVxdWVzdD0nICsgKG9wdGlvbnMucmVxdWVzdCB8fCAnR2V0TWFwJyksXG4gICAgICAgICdzcnM9JyAgICAgKyAob3B0aW9ucy5zcnMgfHwgJ0VQU0c6Mzg1NycpLFxuICAgICAgICAnd2lkdGg9JyAgICsgKG9wdGlvbnMud2lkdGggfHwgMjU2KSxcbiAgICAgICAgJ2hlaWdodD0nICArIChvcHRpb25zLmhlaWdodCB8fCAyNTYpLFxuICAgICAgICAnbGF5ZXJzPScgICsgbGF5ZXJcbiAgICBdLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB1cmw7XG59XG5cblxuLyoqXG4gKiBnZXRUaWxlQkJveFxuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgVGlsZSBjb29yZGluYXRlIHhcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeSAgVGlsZSBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIFN0cmluZyBvZiB0aGUgYm91bmRpbmcgYm94XG4gKi9cbmZ1bmN0aW9uIGdldFRpbGVCQm94KHgsIHksIHopIHtcbiAgICAvLyBmb3IgR29vZ2xlL09TTSB0aWxlIHNjaGVtZSB3ZSBuZWVkIHRvIGFsdGVyIHRoZSB5XG4gICAgeSA9IChNYXRoLnBvdygyLCB6KSAtIHkgLSAxKTtcblxuICAgIHZhciBtaW4gPSBnZXRNZXJjQ29vcmRzKHggKiAyNTYsIHkgKiAyNTYsIHopLFxuICAgICAgICBtYXggPSBnZXRNZXJjQ29vcmRzKCh4ICsgMSkgKiAyNTYsICh5ICsgMSkgKiAyNTYsIHopO1xuXG4gICAgcmV0dXJuIG1pblswXSArICcsJyArIG1pblsxXSArICcsJyArIG1heFswXSArICcsJyArIG1heFsxXTtcbn1cblxuXG4vKipcbiAqIGdldE1lcmNDb29yZHNcbiAqXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggIFBpeGVsIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBQaXhlbCBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge0FycmF5fSAgIFt4LCB5XVxuICovXG5mdW5jdGlvbiBnZXRNZXJjQ29vcmRzKHgsIHksIHopIHtcbiAgICB2YXIgcmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyNTYpIC8gTWF0aC5wb3coMiwgeiksXG4gICAgICAgIG1lcmNfeCA9ICh4ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApLFxuICAgICAgICBtZXJjX3kgPSAoeSAqIHJlc29sdXRpb24gLSAyICogTWF0aC5QSSAgKiA2Mzc4MTM3IC8gMi4wKTtcblxuICAgIHJldHVybiBbbWVyY194LCBtZXJjX3ldO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdCBmcm9tICcuL2xuZ19sYXQnO1xuXG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi9sbmdfbGF0JztcblxuLyoqXG4gKiBBIGBMbmdMYXRCb3VuZHNgIG9iamVjdCByZXByZXNlbnRzIGEgZ2VvZ3JhcGhpY2FsIGJvdW5kaW5nIGJveCxcbiAqIGRlZmluZWQgYnkgaXRzIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IHBvaW50cyBpbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICpcbiAqIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBhIGBudWxsYCBib3VuZGluZyBib3ggaXMgY3JlYXRlZC5cbiAqXG4gKiBOb3RlIHRoYXQgYW55IE1hcGJveCBHTCBtZXRob2QgdGhhdCBhY2NlcHRzIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IGFzIGFuIGFyZ3VtZW50IG9yIG9wdGlvblxuICogY2FuIGFsc28gYWNjZXB0IGFuIGBBcnJheWAgb2YgdHdvIHtAbGluayBMbmdMYXRMaWtlfSBjb25zdHJ1Y3RzIGFuZCB3aWxsIHBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbi5cbiAqIFRoaXMgZmxleGlibGUgdHlwZSBpcyBkb2N1bWVudGVkIGFzIHtAbGluayBMbmdMYXRCb3VuZHNMaWtlfS5cbiAqXG4gKiBAcGFyYW0ge0xuZ0xhdExpa2V9IFtzd10gVGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gW25lXSBUaGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICogQGV4YW1wbGVcbiAqIHZhciBzdyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpO1xuICogdmFyIG5lID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMik7XG4gKiB2YXIgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhzdywgbmUpO1xuICovXG5jbGFzcyBMbmdMYXRCb3VuZHMge1xuICAgIF9uZTogTG5nTGF0O1xuICAgIF9zdzogTG5nTGF0O1xuXG4gICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB0b28gZmxleGlibGUgdG8gdHlwZS4gSXQgc2hvdWxkIG5vdCBiZSBzbyBmbGV4aWJsZS5cbiAgICBjb25zdHJ1Y3RvcihzdzogYW55LCBuZTogYW55KSB7XG4gICAgICAgIGlmICghc3cpIHtcbiAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgfSBlbHNlIGlmIChuZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTb3V0aFdlc3Qoc3cpLnNldE5vcnRoRWFzdChuZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3cubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXRoV2VzdChbc3dbMF0sIHN3WzFdXSkuc2V0Tm9ydGhFYXN0KFtzd1syXSwgc3dbM11dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U291dGhXZXN0KHN3WzBdKS5zZXROb3J0aEVhc3Qoc3dbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbmVcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXROb3J0aEVhc3QobmU6IExuZ0xhdExpa2UpIHtcbiAgICAgICAgdGhpcy5fbmUgPSBuZSBpbnN0YW5jZW9mIExuZ0xhdCA/IG5ldyBMbmdMYXQobmUubG5nLCBuZS5sYXQpIDogTG5nTGF0LmNvbnZlcnQobmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBzd1xuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFNvdXRoV2VzdChzdzogTG5nTGF0TGlrZSkge1xuICAgICAgICB0aGlzLl9zdyA9IHN3IGluc3RhbmNlb2YgTG5nTGF0ID8gbmV3IExuZ0xhdChzdy5sbmcsIHN3LmxhdCkgOiBMbmdMYXQuY29udmVydChzdyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dGVuZCB0aGUgYm91bmRzIHRvIGluY2x1ZGUgYSBnaXZlbiBMbmdMYXQgb3IgTG5nTGF0Qm91bmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXR8TG5nTGF0Qm91bmRzfSBvYmogb2JqZWN0IHRvIGV4dGVuZCB0b1xuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IGB0aGlzYFxuICAgICAqL1xuICAgIGV4dGVuZChvYmo6IExuZ0xhdCB8IExuZ0xhdEJvdW5kcykge1xuICAgICAgICBjb25zdCBzdyA9IHRoaXMuX3N3LFxuICAgICAgICAgICAgbmUgPSB0aGlzLl9uZTtcbiAgICAgICAgbGV0IHN3MiwgbmUyO1xuXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBMbmdMYXQpIHtcbiAgICAgICAgICAgIHN3MiA9IG9iajtcbiAgICAgICAgICAgIG5lMiA9IG9iajtcblxuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcykge1xuICAgICAgICAgICAgc3cyID0gb2JqLl9zdztcbiAgICAgICAgICAgIG5lMiA9IG9iai5fbmU7XG5cbiAgICAgICAgICAgIGlmICghc3cyIHx8ICFuZTIpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iai5ldmVyeShBcnJheS5pc0FycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbmQoTG5nTGF0Qm91bmRzLmNvbnZlcnQob2JqKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kKExuZ0xhdC5jb252ZXJ0KG9iaikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdyAmJiAhbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N3ID0gbmV3IExuZ0xhdChzdzIubG5nLCBzdzIubGF0KTtcbiAgICAgICAgICAgIHRoaXMuX25lID0gbmV3IExuZ0xhdChuZTIubG5nLCBuZTIubGF0KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3cubG5nID0gTWF0aC5taW4oc3cyLmxuZywgc3cubG5nKTtcbiAgICAgICAgICAgIHN3LmxhdCA9IE1hdGgubWluKHN3Mi5sYXQsIHN3LmxhdCk7XG4gICAgICAgICAgICBuZS5sbmcgPSBNYXRoLm1heChuZTIubG5nLCBuZS5sbmcpO1xuICAgICAgICAgICAgbmUubGF0ID0gTWF0aC5tYXgobmUyLmxhdCwgbmUubGF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlIGVxdWlkaXN0YW50IGZyb20gdGhlIGJvdW5kaW5nIGJveCdzIGNvcm5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgYm91bmRpbmcgYm94J3MgY2VudGVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldENlbnRlcigpOyAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTYzNjUsIGxhdDogNDAuNzgzMTV9XG4gICAgICovXG4gICAgZ2V0Q2VudGVyKCk6IExuZ0xhdCB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KCh0aGlzLl9zdy5sbmcgKyB0aGlzLl9uZS5sbmcpIC8gMiwgKHRoaXMuX3N3LmxhdCArIHRoaXMuX25lLmxhdCkgLyAyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldFNvdXRoV2VzdCgpOiBMbmdMYXQgeyByZXR1cm4gdGhpcy5fc3c7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0Tm9ydGhFYXN0KCk6IExuZ0xhdCB7IHJldHVybiB0aGlzLl9uZTsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBub3J0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIG5vcnRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXROb3J0aFdlc3QoKTogTG5nTGF0IHsgcmV0dXJuIG5ldyBMbmdMYXQodGhpcy5nZXRXZXN0KCksIHRoaXMuZ2V0Tm9ydGgoKSk7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgc291dGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBzb3V0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0U291dGhFYXN0KCk6IExuZ0xhdCB7IHJldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0RWFzdCgpLCB0aGlzLmdldFNvdXRoKCkpOyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHdlc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB3ZXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXRXZXN0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdy5sbmc7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgc291dGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzb3V0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0U291dGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N3LmxhdDsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBlYXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZWFzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0RWFzdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbmUubG5nOyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIG5vcnRoIGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbm9ydGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldE5vcnRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9uZS5sYXQ7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gVGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheSwgY29uc2lzdGluZyBvZiB0aGVcbiAgICAgKiAgIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IGNvb3JkaW5hdGVzIG9mIHRoZSBib3VuZGluZyByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbnVtYmVycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi50b0FycmF5KCk7IC8vID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dXG4gICAgICovXG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLl9zdy50b0FycmF5KCksIHRoaXMuX25lLnRvQXJyYXkoKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBib3VuZGluZyBib3ggcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYm91bmRpbmcgYm94IHJlcHJlc2VudHMgYXMgYSBzdHJpbmcgb2YgdGhlIGZvcm1hdFxuICAgICAqICAgYCdMbmdMYXRCb3VuZHMoTG5nTGF0KGxuZywgbGF0KSwgTG5nTGF0KGxuZywgbGF0KSknYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi50b1N0cmluZygpOyAvLyA9IFwiTG5nTGF0Qm91bmRzKExuZ0xhdCgtNzMuOTg3NiwgNDAuNzY2MSksIExuZ0xhdCgtNzMuOTM5NywgNDAuODAwMikpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBMbmdMYXRCb3VuZHMoJHt0aGlzLl9zdy50b1N0cmluZygpfSwgJHt0aGlzLl9uZS50b1N0cmluZygpfSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBib3VuZGluZyBib3ggaXMgYW4gZW1wdHkvYG51bGxgLXR5cGUgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYm91bmRzIGhhdmUgYmVlbiBkZWZpbmVkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICovXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICEodGhpcy5fc3cgJiYgdGhpcy5fbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGFycmF5IHRvIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogSWYgYSBgTG5nTGF0Qm91bmRzYCBvYmplY3QgaXMgcGFzc2VkIGluLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBJbnRlcm5hbGx5LCB0aGUgZnVuY3Rpb24gY2FsbHMgYExuZ0xhdCNjb252ZXJ0YCB0byBjb252ZXJ0IGFycmF5cyB0byBgTG5nTGF0YCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IGlucHV0IEFuIGFycmF5IG9mIHR3byBjb29yZGluYXRlcyB0byBjb252ZXJ0LCBvciBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gQSBuZXcgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LCBpZiBhIGNvbnZlcnNpb24gb2NjdXJyZWQsIG9yIHRoZSBvcmlnaW5hbCBgTG5nTGF0Qm91bmRzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYXJyID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dO1xuICAgICAqIHZhciBsbGIgPSBtYXBib3hnbC5MbmdMYXRCb3VuZHMuY29udmVydChhcnIpO1xuICAgICAqIGxsYjsgICAvLyA9IExuZ0xhdEJvdW5kcyB7X3N3OiBMbmdMYXQge2xuZzogLTczLjk4NzYsIGxhdDogNDAuNzY2MX0sIF9uZTogTG5nTGF0IHtsbmc6IC03My45Mzk3LCBsYXQ6IDQwLjgwMDJ9fVxuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0KGlucHV0OiBMbmdMYXRCb3VuZHNMaWtlKTogTG5nTGF0Qm91bmRzIHtcbiAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcykgcmV0dXJuIGlucHV0O1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyhpbnB1dCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEge0BsaW5rIExuZ0xhdEJvdW5kc30gb2JqZWN0LCBhbiBhcnJheSBvZiB7QGxpbmsgTG5nTGF0TGlrZX0gb2JqZWN0cyBpbiBbc3csIG5lXSBvcmRlcixcbiAqIG9yIGFuIGFycmF5IG9mIG51bWJlcnMgaW4gW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gb3JkZXIuXG4gKlxuICogQHR5cGVkZWYge0xuZ0xhdEJvdW5kcyB8IFtMbmdMYXRMaWtlLCBMbmdMYXRMaWtlXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfSBMbmdMYXRCb3VuZHNMaWtlXG4gKiBAZXhhbXBsZVxuICogdmFyIHYxID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhcbiAqICAgbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTg3NiwgNDAuNzY2MSksXG4gKiAgIG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpXG4gKiApO1xuICogdmFyIHYyID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKVxuICogdmFyIHYzID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dO1xuICovXG5leHBvcnQgdHlwZSBMbmdMYXRCb3VuZHNMaWtlID0gTG5nTGF0Qm91bmRzIHwgW0xuZ0xhdExpa2UsIExuZ0xhdExpa2VdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBkZWZhdWx0IExuZ0xhdEJvdW5kcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHdyYXAgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuL2xuZ19sYXRfYm91bmRzJztcblxuLyoqXG4gKiBBIGBMbmdMYXRgIG9iamVjdCByZXByZXNlbnRzIGEgZ2l2ZW4gbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBjb29yZGluYXRlLCBtZWFzdXJlZCBpbiBkZWdyZWVzLlxuICpcbiAqIE1hcGJveCBHTCB1c2VzIGxvbmdpdHVkZSwgbGF0aXR1ZGUgY29vcmRpbmF0ZSBvcmRlciAoYXMgb3Bwb3NlZCB0byBsYXRpdHVkZSwgbG9uZ2l0dWRlKSB0byBtYXRjaCBHZW9KU09OLlxuICpcbiAqIE5vdGUgdGhhdCBhbnkgTWFwYm94IEdMIG1ldGhvZCB0aGF0IGFjY2VwdHMgYSBgTG5nTGF0YCBvYmplY3QgYXMgYW4gYXJndW1lbnQgb3Igb3B0aW9uXG4gKiBjYW4gYWxzbyBhY2NlcHQgYW4gYEFycmF5YCBvZiB0d28gbnVtYmVycyBhbmQgd2lsbCBwZXJmb3JtIGFuIGltcGxpY2l0IGNvbnZlcnNpb24uXG4gKiBUaGlzIGZsZXhpYmxlIHR5cGUgaXMgZG9jdW1lbnRlZCBhcyB7QGxpbmsgTG5nTGF0TGlrZX0uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxuZyBMb25naXR1ZGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0IExhdGl0dWRlLCBtZWFzdXJlZCBpbiBkZWdyZWVzLlxuICogQGV4YW1wbGVcbiAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICogQHNlZSBbR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICogQHNlZSBbQ3JlYXRlIGEgdGltZWxpbmUgYW5pbWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RpbWVsaW5lLWFuaW1hdGlvbi8pXG4gKi9cbmNsYXNzIExuZ0xhdCB7XG4gICAgbG5nOiBudW1iZXI7XG4gICAgbGF0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGlzTmFOKGxuZykgfHwgaXNOYU4obGF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIExuZ0xhdCBvYmplY3Q6ICgke2xuZ30sICR7bGF0fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxuZyA9ICtsbmc7XG4gICAgICAgIHRoaXMubGF0ID0gK2xhdDtcbiAgICAgICAgaWYgKHRoaXMubGF0ID4gOTAgfHwgdGhpcy5sYXQgPCAtOTApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBMbmdMYXQgbGF0aXR1ZGUgdmFsdWU6IG11c3QgYmUgYmV0d2VlbiAtOTAgYW5kIDkwJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IGBMbmdMYXRgIG9iamVjdCB3aG9zZSBsb25naXR1ZGUgaXMgd3JhcHBlZCB0byB0aGUgcmFuZ2UgKC0xODAsIDE4MCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgd3JhcHBlZCBgTG5nTGF0YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KDI4Ni4wMjUxLCA0MC43NzM2KTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IGxsLndyYXAoKTtcbiAgICAgKiB3cmFwcGVkLmxuZzsgLy8gPSAtNzMuOTc0OVxuICAgICAqL1xuICAgIHdyYXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KHdyYXAodGhpcy5sbmcsIC0xODAsIDE4MCksIHRoaXMubGF0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBUaGUgY29vcmRpbmF0ZXMgcmVwcmVzZXRlZCBhcyBhbiBhcnJheSBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gICAgICogbGwudG9BcnJheSgpOyAvLyA9IFstNzMuOTc0OSwgNDAuNzczNl1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gW3RoaXMubG5nLCB0aGlzLmxhdF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29vcmRpbmF0ZXMgcmVwcmVzZW50IGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvb3JkaW5hdGVzIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQgYCdMbmdMYXQobG5nLCBsYXQpJ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KTtcbiAgICAgKiBsbC50b1N0cmluZygpOyAvLyA9IFwiTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgTG5nTGF0KCR7dGhpcy5sbmd9LCAke3RoaXMubGF0fSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBgTG5nTGF0Qm91bmRzYCBmcm9tIHRoZSBjb29yZGluYXRlcyBleHRlbmRlZCBieSBhIGdpdmVuIGByYWRpdXNgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MF0gRGlzdGFuY2UgaW4gbWV0ZXJzIGZyb20gdGhlIGNvb3JkaW5hdGVzIHRvIGV4dGVuZCB0aGUgYm91bmRzLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IEEgbmV3IGBMbmdMYXRCb3VuZHNgIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvb3JkaW5hdGVzIGV4dGVuZGVkIGJ5IHRoZSBgcmFkaXVzYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICAgICAqIGxsLnRvQm91bmRzKDEwMCkudG9BcnJheSgpOyAvLyA9IFtbLTczLjk3NTAxODYyMTQxMzI4LCA0MC43NzM1MTAxNjg0NzIyOV0sIFstNzMuOTc0NzgxMzc4NTg2NzMsIDQwLjc3MzY4OTgzMTUyNzcxXV1cbiAgICAgKi9cbiAgICB0b0JvdW5kcyhyYWRpdXM/OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGNvbnN0IGVhcnRoQ2lyY3VtZmVyZW5jZUluTWV0ZXJzQXRFcXVhdG9yID0gNDAwNzUwMTc7XG4gICAgICAgIGNvbnN0IGxhdEFjY3VyYWN5ID0gMzYwICogcmFkaXVzIC8gZWFydGhDaXJjdW1mZXJlbmNlSW5NZXRlcnNBdEVxdWF0b3IsXG4gICAgICAgICAgICBsbmdBY2N1cmFjeSA9IGxhdEFjY3VyYWN5IC8gTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5sYXQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0Qm91bmRzKG5ldyBMbmdMYXQodGhpcy5sbmcgLSBsbmdBY2N1cmFjeSwgdGhpcy5sYXQgLSBsYXRBY2N1cmFjeSksXG4gICAgICAgICAgICBuZXcgTG5nTGF0KHRoaXMubG5nICsgbG5nQWNjdXJhY3ksIHRoaXMubGF0ICsgbGF0QWNjdXJhY3kpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBhcnJheSBvZiB0d28gbnVtYmVycyBvciBhbiBvYmplY3Qgd2l0aCBgbG5nYCBhbmQgYGxhdGAgb3IgYGxvbmAgYW5kIGBsYXRgIHByb3BlcnRpZXNcbiAgICAgKiB0byBhIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIElmIGEgYExuZ0xhdGAgb2JqZWN0IGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBpbnB1dCBBbiBhcnJheSBvZiB0d28gbnVtYmVycyBvciBvYmplY3QgdG8gY29udmVydCwgb3IgYSBgTG5nTGF0YCBvYmplY3QgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IEEgbmV3IGBMbmdMYXRgIG9iamVjdCwgaWYgYSBjb252ZXJzaW9uIG9jY3VycmVkLCBvciB0aGUgb3JpZ2luYWwgYExuZ0xhdGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFyciA9IFstNzMuOTc0OSwgNDAuNzczNl07XG4gICAgICogdmFyIGxsID0gbWFwYm94Z2wuTG5nTGF0LmNvbnZlcnQoYXJyKTtcbiAgICAgKiBsbDsgICAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTc0OSwgbGF0OiA0MC43NzM2fVxuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0KGlucHV0OiBMbmdMYXRMaWtlKTogTG5nTGF0IHtcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTG5nTGF0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIChpbnB1dC5sZW5ndGggPT09IDIgfHwgaW5wdXQubGVuZ3RoID09PSAzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoTnVtYmVyKGlucHV0WzBdKSwgTnVtYmVyKGlucHV0WzFdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChcbiAgICAgICAgICAgICAgICAvLyBmbG93IGNhbid0IHJlZmluZSB0aGlzIHRvIGhhdmUgb25lIG9mIGxuZyBvciBsYXQsIHNvIHdlIGhhdmUgdG8gY2FzdCB0byBhbnlcbiAgICAgICAgICAgICAgICBOdW1iZXIoJ2xuZycgaW4gaW5wdXQgPyAoaW5wdXQ6IGFueSkubG5nIDogKGlucHV0OiBhbnkpLmxvbiksXG4gICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0LmxhdClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYExuZ0xhdExpa2VgIGFyZ3VtZW50IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgTG5nTGF0IGluc3RhbmNlLCBhbiBvYmplY3Qge2xuZzogPGxuZz4sIGxhdDogPGxhdD59LCBhbiBvYmplY3Qge2xvbjogPGxuZz4sIGxhdDogPGxhdD59LCBvciBhbiBhcnJheSBvZiBbPGxuZz4sIDxsYXQ+XVwiKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgTG5nTGF0fSBvYmplY3QsIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLFxuICogb3IgYW4gb2JqZWN0IHdpdGggYGxuZ2AgYW5kIGBsYXRgIG9yIGBsb25gIGFuZCBgbGF0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEB0eXBlZGVmIHtMbmdMYXQgfCB7bG5nOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IHtsb246IG51bWJlciwgbGF0OiBudW1iZXJ9IHwgW251bWJlciwgbnVtYmVyXX0gTG5nTGF0TGlrZVxuICogQGV4YW1wbGVcbiAqIHZhciB2MSA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTEyMi40MjA2NzksIDM3Ljc3MjUzNyk7XG4gKiB2YXIgdjIgPSBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN107XG4gKiB2YXIgdjMgPSB7bG9uOiAtMTIyLjQyMDY3OSwgbGF0OiAzNy43NzI1Mzd9O1xuICovXG5leHBvcnQgdHlwZSBMbmdMYXRMaWtlID0gTG5nTGF0IHwge2xuZzogbnVtYmVyLCBsYXQ6IG51bWJlcn0gfCB7bG9uOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IFtudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBkZWZhdWx0IExuZ0xhdDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0JztcblxuLypcbiAqIFRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSB3b3JsZCBpbiBtZXRlcnMgYXQgdGhlIGVxdWF0b3IuXG4gKi9cbmNvbnN0IGNpcmN1bWZlcmVuY2VBdEVxdWF0b3IgPSAyICogTWF0aC5QSSAqIDYzNzgxMzc7XG5cbi8qXG4gKiBUaGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgd29ybGQgaW4gbWV0ZXJzIGF0IHRoZSBnaXZlbiBsYXRpdHVkZS5cbiAqL1xuZnVuY3Rpb24gY2lyY3VtZmVyZW5jZUF0TGF0aXR1ZGUobGF0aXR1ZGU6IG51bWJlcikge1xuICAgIHJldHVybiBjaXJjdW1mZXJlbmNlQXRFcXVhdG9yICogTWF0aC5jb3MobGF0aXR1ZGUgKiBNYXRoLlBJIC8gMTgwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yWGZyb21MbmcobG5nOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCArIGxuZykgLyAzNjA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvcllmcm9tTGF0KGxhdDogbnVtYmVyKSB7XG4gICAgcmV0dXJuICgxODAgLSAoMTgwIC8gTWF0aC5QSSAqIE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgbGF0ICogTWF0aC5QSSAvIDM2MCkpKSkgLyAzNjA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoYWx0aXR1ZGU6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYWx0aXR1ZGUgLyBjaXJjdW1mZXJlbmNlQXRMYXRpdHVkZShsYXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG5nRnJvbU1lcmNhdG9yWCh4OiBudW1iZXIpIHtcbiAgICByZXR1cm4geCAqIDM2MCAtIDE4MDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhdEZyb21NZXJjYXRvclkoeTogbnVtYmVyKSB7XG4gICAgY29uc3QgeTIgPSAxODAgLSB5ICogMzYwO1xuICAgIHJldHVybiAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbHRpdHVkZUZyb21NZXJjYXRvclooejogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICByZXR1cm4geiAqIGNpcmN1bWZlcmVuY2VBdExhdGl0dWRlKGxhdEZyb21NZXJjYXRvclkoeSkpO1xufVxuXG4vKipcbiAqIERldGVybWluZSB0aGUgTWVyY2F0b3Igc2NhbGUgZmFjdG9yIGZvciBhIGdpdmVuIGxhdGl0dWRlLCBzZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01lcmNhdG9yX3Byb2plY3Rpb24jU2NhbGVfZmFjdG9yXG4gKlxuICogQXQgdGhlIGVxdWF0b3IgdGhlIHNjYWxlIGZhY3RvciB3aWxsIGJlIDEsIHdoaWNoIGluY3JlYXNlcyBhdCBoaWdoZXIgbGF0aXR1ZGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsYXQgTGF0aXR1ZGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHNjYWxlIGZhY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyY2F0b3JTY2FsZShsYXQ6IG51bWJlcikge1xuICAgIHJldHVybiAxIC8gTWF0aC5jb3MobGF0ICogTWF0aC5QSSAvIDE4MCk7XG59XG5cbi8qKlxuICogQSBgTWVyY2F0b3JDb29yZGluYXRlYCBvYmplY3QgcmVwcmVzZW50cyBhIHByb2plY3RlZCB0aHJlZSBkaW1lbnNpb25hbCBwb3NpdGlvbi5cbiAqXG4gKiBgTWVyY2F0b3JDb29yZGluYXRlYCB1c2VzIHRoZSB3ZWIgbWVyY2F0b3IgcHJvamVjdGlvbiAoW0VQU0c6Mzg1N10oaHR0cHM6Ly9lcHNnLmlvLzM4NTcpKSB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCB1bml0czpcbiAqIC0gdGhlIHNpemUgb2YgMSB1bml0IGlzIHRoZSB3aWR0aCBvZiB0aGUgcHJvamVjdGVkIHdvcmxkIGluc3RlYWQgb2YgdGhlIFwibWVyY2F0b3IgbWV0ZXJcIlxuICogLSB0aGUgb3JpZ2luIG9mIHRoZSBjb29yZGluYXRlIHNwYWNlIGlzIGF0IHRoZSBub3J0aC13ZXN0IGNvcm5lciBpbnN0ZWFkIG9mIHRoZSBtaWRkbGVcbiAqXG4gKiBGb3IgZXhhbXBsZSwgYE1lcmNhdG9yQ29vcmRpbmF0ZSgwLCAwLCAwKWAgaXMgdGhlIG5vcnRoLXdlc3QgY29ybmVyIG9mIHRoZSBtZXJjYXRvciB3b3JsZCBhbmRcbiAqIGBNZXJjYXRvckNvb3JkaW5hdGUoMSwgMSwgMClgIGlzIHRoZSBzb3V0aC1lYXN0IGNvcm5lci4gSWYgeW91IGFyZSBmYW1pbGlhciB3aXRoXG4gKiBbdmVjdG9yIHRpbGVzXShodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3ZlY3Rvci10aWxlLXNwZWMpIGl0IG1heSBiZSBoZWxwZnVsIHRvIHRoaW5rXG4gKiBvZiB0aGUgY29vcmRpbmF0ZSBzcGFjZSBhcyB0aGUgYDAvMC8wYCB0aWxlIHdpdGggYW4gZXh0ZW50IG9mIGAxYC5cbiAqXG4gKiBUaGUgYHpgIGRpbWVuc2lvbiBvZiBgTWVyY2F0b3JDb29yZGluYXRlYCBpcyBjb25mb3JtYWwuIEEgY3ViZSBpbiB0aGUgbWVyY2F0b3IgY29vcmRpbmF0ZSBzcGFjZSB3b3VsZCBiZSByZW5kZXJlZCBhcyBhIGN1YmUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHggY29tcG9uZW50IG9mIHRoZSBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IFRoZSB5IGNvbXBvbmVudCBvZiB0aGUgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0geiBUaGUgeiBjb21wb25lbnQgb2YgdGhlIHBvc2l0aW9uLlxuICogQGV4YW1wbGVcbiAqIHZhciBudWxsSXNsYW5kID0gbmV3IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZSgwLjUsIDAuNSwgMCk7XG4gKlxuICogQHNlZSBbQWRkIGEgY3VzdG9tIHN0eWxlIGxheWVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2N1c3RvbS1zdHlsZS1sYXllci8pXG4gKi9cbmNsYXNzIE1lcmNhdG9yQ29vcmRpbmF0ZSB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB6OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyID0gMCkge1xuICAgICAgICB0aGlzLnggPSAreDtcbiAgICAgICAgdGhpcy55ID0gK3k7XG4gICAgICAgIHRoaXMueiA9ICt6O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2plY3QgYSBgTG5nTGF0YCB0byBhIGBNZXJjYXRvckNvb3JkaW5hdGVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBsbmdMYXRMaWtlIFRoZSBsb2NhdGlvbiB0byBwcm9qZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbHRpdHVkZSBUaGUgYWx0aXR1ZGUgaW4gbWV0ZXJzIG9mIHRoZSBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7TWVyY2F0b3JDb29yZGluYXRlfSBUaGUgcHJvamVjdGVkIG1lcmNhdG9yIGNvb3JkaW5hdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgY29vcmQgPSBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCh7IGxuZzogMCwgbGF0OiAwfSwgMCk7XG4gICAgICogY29vcmQ7IC8vIE1lcmNhdG9yQ29vcmRpbmF0ZSgwLjUsIDAuNSwgMClcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUxuZ0xhdChsbmdMYXRMaWtlOiBMbmdMYXRMaWtlLCBhbHRpdHVkZTogbnVtYmVyID0gMCkge1xuICAgICAgICBjb25zdCBsbmdMYXQgPSBMbmdMYXQuY29udmVydChsbmdMYXRMaWtlKTtcblxuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShcbiAgICAgICAgICAgICAgICBtZXJjYXRvclhmcm9tTG5nKGxuZ0xhdC5sbmcpLFxuICAgICAgICAgICAgICAgIG1lcmNhdG9yWWZyb21MYXQobG5nTGF0LmxhdCksXG4gICAgICAgICAgICAgICAgbWVyY2F0b3JaZnJvbUFsdGl0dWRlKGFsdGl0dWRlLCBsbmdMYXQubGF0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYExuZ0xhdGAgZm9yIHRoZSBjb29yZGluYXRlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBjb29yZCA9IG5ldyBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUoMC41LCAwLjUsIDApO1xuICAgICAqIHZhciBsYXRMbmcgPSBjb29yZC50b0xuZ0xhdCgpOyAvLyBMbmdMYXQoMCwgMClcbiAgICAgKi9cbiAgICB0b0xuZ0xhdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoXG4gICAgICAgICAgICAgICAgbG5nRnJvbU1lcmNhdG9yWCh0aGlzLngpLFxuICAgICAgICAgICAgICAgIGxhdEZyb21NZXJjYXRvclkodGhpcy55KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzIG9mIHRoZSBjb29yZGluYXRlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGFsdGl0dWRlIGluIG1ldGVycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBjb29yZCA9IG5ldyBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUoMCwgMCwgMC4wMik7XG4gICAgICogY29vcmQudG9BbHRpdHVkZSgpOyAvLyA2OTE0LjI4MTk1NjI5NTMzOVxuICAgICAqL1xuICAgIHRvQWx0aXR1ZGUoKSB7XG4gICAgICAgIHJldHVybiBhbHRpdHVkZUZyb21NZXJjYXRvcloodGhpcy56LCB0aGlzLnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIG9mIDEgbWV0ZXIgaW4gYE1lcmNhdG9yQ29vcmRpbmF0ZWAgdW5pdHMgYXQgdGhpcyBsYXRpdHVkZS5cbiAgICAgKlxuICAgICAqIEZvciBjb29yZGluYXRlcyBpbiByZWFsIHdvcmxkIHVuaXRzIHVzaW5nIG1ldGVycywgdGhpcyBuYXR1cmFsbHkgcHJvdmlkZXMgdGhlIHNjYWxlXG4gICAgICogdG8gdHJhbnNmb3JtIGludG8gYE1lcmNhdG9yQ29vcmRpbmF0ZWBzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gRGlzdGFuY2Ugb2YgMSBtZXRlciBpbiBgTWVyY2F0b3JDb29yZGluYXRlYCB1bml0cy5cbiAgICAgKi9cbiAgICBtZXRlckluTWVyY2F0b3JDb29yZGluYXRlVW5pdHMoKSB7XG4gICAgICAgIC8vIDEgbWV0ZXIgLyBjaXJjdW1mZXJlbmNlIGF0IGVxdWF0b3IgaW4gbWV0ZXJzICogTWVyY2F0b3IgcHJvamVjdGlvbiBzY2FsZSBmYWN0b3IgYXQgdGhpcyBsYXRpdHVkZVxuICAgICAgICByZXR1cm4gMSAvIGNpcmN1bWZlcmVuY2VBdEVxdWF0b3IgKiBtZXJjYXRvclNjYWxlKGxhdEZyb21NZXJjYXRvclkodGhpcy55KSk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lcmNhdG9yQ29vcmRpbmF0ZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Z2V0VGlsZUJCb3h9IGZyb20gJ0BtYXBib3gvd2hvb3RzLWpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZSc7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuZXhwb3J0IGNsYXNzIENhbm9uaWNhbFRpbGVJRCB7XG4gICAgejogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAga2V5OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydCh6ID49IDAgJiYgeiA8PSAyNSk7XG4gICAgICAgIGFzc2VydCh4ID49IDAgJiYgeCA8IE1hdGgucG93KDIsIHopKTtcbiAgICAgICAgYXNzZXJ0KHkgPj0gMCAmJiB5IDwgTWF0aC5wb3coMiwgeikpO1xuICAgICAgICB0aGlzLnogPSB6O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB0aGlzLmtleSA9IGNhbGN1bGF0ZUtleSgwLCB6LCB4LCB5KTtcbiAgICB9XG5cbiAgICBlcXVhbHMoaWQ6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgICAgICByZXR1cm4gdGhpcy56ID09PSBpZC56ICYmIHRoaXMueCA9PT0gaWQueCAmJiB0aGlzLnkgPT09IGlkLnk7XG4gICAgfVxuXG4gICAgLy8gZ2l2ZW4gYSBsaXN0IG9mIHVybHMsIGNob29zZSBhIHVybCB0ZW1wbGF0ZSBhbmQgcmV0dXJuIGEgdGlsZSBVUkxcbiAgICB1cmwodXJsczogQXJyYXk8c3RyaW5nPiwgc2NoZW1lOiA/c3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBnZXRUaWxlQkJveCh0aGlzLngsIHRoaXMueSwgdGhpcy56KTtcbiAgICAgICAgY29uc3QgcXVhZGtleSA9IGdldFF1YWRrZXkodGhpcy56LCB0aGlzLngsIHRoaXMueSk7XG5cbiAgICAgICAgcmV0dXJuIHVybHNbKHRoaXMueCArIHRoaXMueSkgJSB1cmxzLmxlbmd0aF1cbiAgICAgICAgICAgIC5yZXBsYWNlKCd7cHJlZml4fScsICh0aGlzLnggJSAxNikudG9TdHJpbmcoMTYpICsgKHRoaXMueSAlIDE2KS50b1N0cmluZygxNikpXG4gICAgICAgICAgICAucmVwbGFjZSgne3p9JywgU3RyaW5nKHRoaXMueikpXG4gICAgICAgICAgICAucmVwbGFjZSgne3h9JywgU3RyaW5nKHRoaXMueCkpXG4gICAgICAgICAgICAucmVwbGFjZSgne3l9JywgU3RyaW5nKHNjaGVtZSA9PT0gJ3RtcycgPyAoTWF0aC5wb3coMiwgdGhpcy56KSAtIHRoaXMueSAtIDEpIDogdGhpcy55KSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7cXVhZGtleX0nLCBxdWFka2V5KVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3tiYm94LWVwc2ctMzg1N30nLCBiYm94KTtcbiAgICB9XG5cbiAgICBnZXRUaWxlUG9pbnQoY29vcmQ6IE1lcmNhdG9yQ29vcmRpbmF0ZSkge1xuICAgICAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIHRoaXMueik7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgICAgICAoY29vcmQueCAqIHRpbGVzQXRab29tIC0gdGhpcy54KSAqIEVYVEVOVCxcbiAgICAgICAgICAgIChjb29yZC55ICogdGlsZXNBdFpvb20gLSB0aGlzLnkpICogRVhURU5UKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbndyYXBwZWRUaWxlSUQge1xuICAgIHdyYXA6IG51bWJlcjtcbiAgICBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRDtcbiAgICBrZXk6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHdyYXA6IG51bWJlciwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgdGhpcy53cmFwID0gd3JhcDtcbiAgICAgICAgdGhpcy5jYW5vbmljYWwgPSBjYW5vbmljYWw7XG4gICAgICAgIHRoaXMua2V5ID0gY2FsY3VsYXRlS2V5KHdyYXAsIGNhbm9uaWNhbC56LCBjYW5vbmljYWwueCwgY2Fub25pY2FsLnkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE92ZXJzY2FsZWRUaWxlSUQge1xuICAgIG92ZXJzY2FsZWRaOiBudW1iZXI7XG4gICAgd3JhcDogbnVtYmVyO1xuICAgIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEO1xuICAgIGtleTogbnVtYmVyO1xuICAgIHBvc01hdHJpeDogRmxvYXQzMkFycmF5O1xuXG4gICAgY29uc3RydWN0b3Iob3ZlcnNjYWxlZFo6IG51bWJlciwgd3JhcDogbnVtYmVyLCB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydChvdmVyc2NhbGVkWiA+PSB6KTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGVkWiA9IG92ZXJzY2FsZWRaO1xuICAgICAgICB0aGlzLndyYXAgPSB3cmFwO1xuICAgICAgICB0aGlzLmNhbm9uaWNhbCA9IG5ldyBDYW5vbmljYWxUaWxlSUQoeiwgK3gsICt5KTtcbiAgICAgICAgdGhpcy5rZXkgPSBjYWxjdWxhdGVLZXkod3JhcCwgb3ZlcnNjYWxlZFosIHgsIHkpO1xuICAgIH1cblxuICAgIGVxdWFscyhpZDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVyc2NhbGVkWiA9PT0gaWQub3ZlcnNjYWxlZFogJiYgdGhpcy53cmFwID09PSBpZC53cmFwICYmIHRoaXMuY2Fub25pY2FsLmVxdWFscyhpZC5jYW5vbmljYWwpO1xuICAgIH1cblxuICAgIHNjYWxlZFRvKHRhcmdldFo6IG51bWJlcikge1xuICAgICAgICBhc3NlcnQodGFyZ2V0WiA8PSB0aGlzLm92ZXJzY2FsZWRaKTtcbiAgICAgICAgY29uc3QgekRpZmZlcmVuY2UgPSB0aGlzLmNhbm9uaWNhbC56IC0gdGFyZ2V0WjtcbiAgICAgICAgaWYgKHRhcmdldFogPiB0aGlzLmNhbm9uaWNhbC56KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodGFyZ2V0WiwgdGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0YXJnZXRaLCB0aGlzLndyYXAsIHRhcmdldFosIHRoaXMuY2Fub25pY2FsLnggPj4gekRpZmZlcmVuY2UsIHRoaXMuY2Fub25pY2FsLnkgPj4gekRpZmZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNDaGlsZE9mKHBhcmVudDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICBpZiAocGFyZW50LndyYXAgIT09IHRoaXMud3JhcCkge1xuICAgICAgICAgICAgLy8gV2UgY2FuJ3QgYmUgYSBjaGlsZCBpZiB3ZSdyZSBpbiBhIGRpZmZlcmVudCB3b3JsZCBjb3B5XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgekRpZmZlcmVuY2UgPSB0aGlzLmNhbm9uaWNhbC56IC0gcGFyZW50LmNhbm9uaWNhbC56O1xuICAgICAgICAvLyBXZSdyZSBmaXJzdCB0ZXN0aW5nIGZvciB6ID09IDAsIHRvIGF2b2lkIGEgMzIgYml0IHNoaWZ0LCB3aGljaCBpcyB1bmRlZmluZWQuXG4gICAgICAgIHJldHVybiBwYXJlbnQub3ZlcnNjYWxlZFogPT09IDAgfHwgKFxuICAgICAgICAgICAgcGFyZW50Lm92ZXJzY2FsZWRaIDwgdGhpcy5vdmVyc2NhbGVkWiAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC5jYW5vbmljYWwueCA9PT0gKHRoaXMuY2Fub25pY2FsLnggPj4gekRpZmZlcmVuY2UpICYmXG4gICAgICAgICAgICAgICAgcGFyZW50LmNhbm9uaWNhbC55ID09PSAodGhpcy5jYW5vbmljYWwueSA+PiB6RGlmZmVyZW5jZSkpO1xuICAgIH1cblxuICAgIGNoaWxkcmVuKHNvdXJjZU1heFpvb206IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5vdmVyc2NhbGVkWiA+PSBzb3VyY2VNYXhab29tKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gYSBzaW5nbGUgdGlsZSBjb29yZCByZXByZXNlbnRpbmcgYSBhbiBvdmVyc2NhbGVkIHRpbGVcbiAgICAgICAgICAgIHJldHVybiBbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGhpcy5vdmVyc2NhbGVkWiArIDEsIHRoaXMud3JhcCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeiA9IHRoaXMuY2Fub25pY2FsLnogKyAxO1xuICAgICAgICBjb25zdCB4ID0gdGhpcy5jYW5vbmljYWwueCAqIDI7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLmNhbm9uaWNhbC55ICogMjtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRoaXMud3JhcCwgeiwgeCwgeSksXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHggKyAxLCB5KSxcbiAgICAgICAgICAgIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRoaXMud3JhcCwgeiwgeCwgeSArIDEpLFxuICAgICAgICAgICAgbmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgdGhpcy53cmFwLCB6LCB4ICsgMSwgeSArIDEpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgaXNMZXNzVGhhbihyaHM6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgaWYgKHRoaXMud3JhcCA8IHJocy53cmFwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMud3JhcCA+IHJocy53cmFwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPCByaHMub3ZlcnNjYWxlZFopIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5vdmVyc2NhbGVkWiA+IHJocy5vdmVyc2NhbGVkWikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbm9uaWNhbC54IDwgcmhzLmNhbm9uaWNhbC54KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuY2Fub25pY2FsLnggPiByaHMuY2Fub25pY2FsLngpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5jYW5vbmljYWwueSA8IHJocy5jYW5vbmljYWwueSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB3cmFwcGVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodGhpcy5vdmVyc2NhbGVkWiwgMCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSk7XG4gICAgfVxuXG4gICAgdW53cmFwVG8od3JhcDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aGlzLm92ZXJzY2FsZWRaLCB3cmFwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KTtcbiAgICB9XG5cbiAgICBvdmVyc2NhbGVGYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdygyLCB0aGlzLm92ZXJzY2FsZWRaIC0gdGhpcy5jYW5vbmljYWwueik7XG4gICAgfVxuXG4gICAgdG9VbndyYXBwZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW53cmFwcGVkVGlsZUlEKHRoaXMud3JhcCwgdGhpcy5jYW5vbmljYWwpO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5vdmVyc2NhbGVkWn0vJHt0aGlzLmNhbm9uaWNhbC54fS8ke3RoaXMuY2Fub25pY2FsLnl9YDtcbiAgICB9XG5cbiAgICBnZXRUaWxlUG9pbnQoY29vcmQ6IE1lcmNhdG9yQ29vcmRpbmF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWwuZ2V0VGlsZVBvaW50KG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoY29vcmQueCAtIHRoaXMud3JhcCwgY29vcmQueSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlS2V5KHdyYXA6IG51bWJlciwgejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHdyYXAgKj0gMjtcbiAgICBpZiAod3JhcCA8IDApIHdyYXAgPSB3cmFwICogLTEgLSAxO1xuICAgIGNvbnN0IGRpbSA9IDEgPDwgejtcbiAgICByZXR1cm4gKChkaW0gKiBkaW0gKiB3cmFwICsgZGltICogeSArIHgpICogMzIpICsgejtcbn1cblxuZnVuY3Rpb24gZ2V0UXVhZGtleSh6LCB4LCB5KSB7XG4gICAgbGV0IHF1YWRrZXkgPSAnJywgbWFzaztcbiAgICBmb3IgKGxldCBpID0gejsgaSA+IDA7IGktLSkge1xuICAgICAgICBtYXNrID0gMSA8PCAoaSAtIDEpO1xuICAgICAgICBxdWFka2V5ICs9ICgoeCAmIG1hc2sgPyAxIDogMCkgKyAoeSAmIG1hc2sgPyAyIDogMCkpO1xuICAgIH1cbiAgICByZXR1cm4gcXVhZGtleTtcbn1cblxucmVnaXN0ZXIoJ0Nhbm9uaWNhbFRpbGVJRCcsIENhbm9uaWNhbFRpbGVJRCk7XG5yZWdpc3RlcignT3ZlcnNjYWxlZFRpbGVJRCcsIE92ZXJzY2FsZWRUaWxlSUQsIHtvbWl0OiBbJ3Bvc01hdHJpeCddfSk7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgUkdCQUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5cbmltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuLy8gREVNRGF0YSBpcyBhIGRhdGEgc3RydWN0dXJlIGZvciBkZWNvZGluZywgYmFja2ZpbGxpbmcsIGFuZCBzdG9yaW5nIGVsZXZhdGlvbiBkYXRhIGZvciBwcm9jZXNzaW5nIGluIHRoZSBoaWxsc2hhZGUgc2hhZGVyc1xuLy8gZGF0YSBjYW4gYmUgcG9wdWxhdGVkIGVpdGhlciBmcm9tIGEgcG5ncmF3IGltYWdlIHRpbGUgb3IgZnJvbSBzZXJsaWF6ZWQgZGF0YSBzZW50IGJhY2sgZnJvbSBhIHdvcmtlci4gV2hlbiBkYXRhIGlzIGluaXRpYWxseVxuLy8gbG9hZGVkIGZyb20gYSBpbWFnZSB0aWxlLCB3ZSBkZWNvZGUgdGhlIHBpeGVsIHZhbHVlcyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZGVjb2RpbmcgZm9ybXVsYSwgYnV0IHdlIHN0b3JlIHRoZVxuLy8gZWxldmF0aW9uIGRhdGEgYXMgYW4gSW50MzIgdmFsdWUuIHdlIGFkZCA2NTUzNiAoMl4xNikgdG8gZWxpbWluYXRlIG5lZ2F0aXZlIHZhbHVlcyBhbmQgZW5hYmxlIHRoZSB1c2Ugb2Zcbi8vIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBjcmVhdGluZyB0aGUgdGV4dHVyZSB1c2VkIGluIHRoZSBoaWxsc2hhZGVQcmVwYXJlIHN0ZXAuXG5cbi8vIERFTURhdGEgYWxzbyBoYW5kbGVzIHRoZSBiYWNrZmlsbGluZyBvZiBkYXRhIGZyb20gYSB0aWxlJ3MgbmVpZ2hib3JpbmcgdGlsZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIGEgcGl4ZWwncyA4XG4vLyBzdXJyb3VuZGluZyBwaXhlbCB2YWx1ZXMgdG8gY29tcHV0ZSB0aGUgc2xvcGUgYXQgdGhhdCBwaXhlbCwgYW5kIHdlIGNhbm5vdCBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgc2xvcGUgYXQgcGl4ZWxzIG9uIGFcbi8vIHRpbGUncyBlZGdlIHdpdGhvdXQgYmFja2ZpbGxpbmcgZnJvbSBuZWlnaGJvcmluZyB0aWxlcy5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgREVNRGF0YSB7XG4gICAgdWlkOiBzdHJpbmc7XG4gICAgZGF0YTogSW50MzJBcnJheTtcbiAgICBzdHJpZGU6IG51bWJlcjtcbiAgICBkaW06IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHVpZDogc3RyaW5nLCBkYXRhOiBSR0JBSW1hZ2UsIGVuY29kaW5nOiBcIm1hcGJveFwiIHwgXCJ0ZXJyYXJpdW1cIikge1xuICAgICAgICB0aGlzLnVpZCA9IHVpZDtcbiAgICAgICAgaWYgKGRhdGEuaGVpZ2h0ICE9PSBkYXRhLndpZHRoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignREVNIHRpbGVzIG11c3QgYmUgc3F1YXJlJyk7XG4gICAgICAgIGlmIChlbmNvZGluZyAmJiBlbmNvZGluZyAhPT0gXCJtYXBib3hcIiAmJiBlbmNvZGluZyAhPT0gXCJ0ZXJyYXJpdW1cIikgcmV0dXJuIHdhcm5PbmNlKFxuICAgICAgICAgICAgYFwiJHtlbmNvZGluZ31cIiBpcyBub3QgYSB2YWxpZCBlbmNvZGluZyB0eXBlLiBWYWxpZCB0eXBlcyBpbmNsdWRlIFwibWFwYm94XCIgYW5kIFwidGVycmFyaXVtXCIuYFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkaW0gPSB0aGlzLmRpbSA9IGRhdGEuaGVpZ2h0O1xuICAgICAgICB0aGlzLnN0cmlkZSA9IHRoaXMuZGltICsgMjtcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IEludDMyQXJyYXkodGhpcy5zdHJpZGUgKiB0aGlzLnN0cmlkZSk7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gZGF0YS5kYXRhO1xuICAgICAgICBjb25zdCB1bnBhY2sgPSBlbmNvZGluZyA9PT0gXCJ0ZXJyYXJpdW1cIiA/IHRoaXMuX3VucGFja1RlcnJhcml1bSA6IHRoaXMuX3VucGFja01hcGJveDtcbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBkaW07IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBkaW07IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB5ICogZGltICsgeDtcbiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSAqIDQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoeCwgeSwgdW5wYWNrKHBpeGVsc1tqXSwgcGl4ZWxzW2ogKyAxXSwgcGl4ZWxzW2ogKyAyXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgZmxhc2hpbmcgc2VhbXMgYmV0d2VlbiB0aWxlcywgaGVyZSB3ZSBhcmUgaW5pdGlhbGx5IHBvcHVsYXRpbmcgYSAxcHggYm9yZGVyIG9mIHBpeGVscyBhcm91bmQgdGhlIGltYWdlXG4gICAgICAgIC8vIHdpdGggdGhlIGRhdGEgb2YgdGhlIG5lYXJlc3QgcGl4ZWwgZnJvbSB0aGUgaW1hZ2UuIHRoaXMgZGF0YSBpcyBldmVudHVhbGx5IHJlcGxhY2VkIHdoZW4gdGhlIHRpbGUncyBuZWlnaGJvcmluZ1xuICAgICAgICAvLyB0aWxlcyBhcmUgbG9hZGVkIGFuZCB0aGUgYWNjdXJhdGUgZGF0YSBjYW4gYmUgYmFja2ZpbGxlZCB1c2luZyBERU1EYXRhI2JhY2tmaWxsQm9yZGVyXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgZGltOyB4KyspIHtcbiAgICAgICAgICAgIC8vIGxlZnQgdmVydGljYWwgYm9yZGVyXG4gICAgICAgICAgICB0aGlzLnNldCgtMSwgeCwgdGhpcy5nZXQoMCwgeCkpO1xuICAgICAgICAgICAgLy8gcmlnaHQgdmVydGljYWwgYm9yZGVyXG4gICAgICAgICAgICB0aGlzLnNldChkaW0sIHgsIHRoaXMuZ2V0KGRpbSAtIDEsIHgpKTtcbiAgICAgICAgICAgIC8vIGxlZnQgaG9yaXpvbnRhbCBib3JkZXJcbiAgICAgICAgICAgIHRoaXMuc2V0KHgsIC0xLCB0aGlzLmdldCh4LCAwKSk7XG4gICAgICAgICAgICAvLyByaWdodCBob3Jpem9udGFsIGJvcmRlclxuICAgICAgICAgICAgdGhpcy5zZXQoeCwgZGltLCB0aGlzLmdldCh4LCBkaW0gLSAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29ybmVyc1xuICAgICAgICB0aGlzLnNldCgtMSwgLTEsIHRoaXMuZ2V0KDAsIDApKTtcbiAgICAgICAgdGhpcy5zZXQoZGltLCAtMSwgdGhpcy5nZXQoZGltIC0gMSwgMCkpO1xuICAgICAgICB0aGlzLnNldCgtMSwgZGltLCB0aGlzLmdldCgwLCBkaW0gLSAxKSk7XG4gICAgICAgIHRoaXMuc2V0KGRpbSwgZGltLCB0aGlzLmdldChkaW0gLSAxLCBkaW0gLSAxKSk7XG4gICAgfVxuXG4gICAgc2V0KHg6IG51bWJlciwgeTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0aGlzLl9pZHgoeCwgeSldID0gdmFsdWUgKyA2NTUzNjtcbiAgICB9XG5cbiAgICBnZXQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLl9pZHgoeCwgeSldIC0gNjU1MzY7XG4gICAgfVxuXG4gICAgX2lkeCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBpZiAoeCA8IC0xIHx8IHggPj0gdGhpcy5kaW0gKyAxIHx8ICB5IDwgLTEgfHwgeSA+PSB0aGlzLmRpbSArIDEpIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2Ugc291cmNlIGNvb3JkaW5hdGVzIGZvciBERU0gZGF0YScpO1xuICAgICAgICByZXR1cm4gKHkgKyAxKSAqIHRoaXMuc3RyaWRlICsgKHggKyAxKTtcbiAgICB9XG5cbiAgICBfdW5wYWNrTWFwYm94KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAgICAgLy8gdW5wYWNraW5nIGZvcm11bGEgZm9yIG1hcGJveC50ZXJyYWluLXJnYjpcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cubWFwYm94LmNvbS9oZWxwL2FjY2Vzcy1lbGV2YXRpb24tZGF0YS8jbWFwYm94LXRlcnJhaW4tcmdiXG4gICAgICAgIHJldHVybiAoKHIgKiAyNTYgKiAyNTYgKyBnICogMjU2LjAgKyBiKSAvIDEwLjAgLSAxMDAwMC4wKTtcbiAgICB9XG5cbiAgICBfdW5wYWNrVGVycmFyaXVtKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAgICAgLy8gdW5wYWNraW5nIGZvcm11bGEgZm9yIG1hcHplbiB0ZXJyYXJpdW06XG4gICAgICAgIC8vIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vcHVibGljLWRhdGFzZXRzL3RlcnJhaW4vXG4gICAgICAgIHJldHVybiAoKHIgKiAyNTYgKyBnICsgYiAvIDI1NikgLSAzMjc2OC4wKTtcbiAgICB9XG5cbiAgICBnZXRQaXhlbHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUkdCQUltYWdlKHt3aWR0aDogdGhpcy5zdHJpZGUsIGhlaWdodDogdGhpcy5zdHJpZGV9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSk7XG4gICAgfVxuXG4gICAgYmFja2ZpbGxCb3JkZXIoYm9yZGVyVGlsZTogREVNRGF0YSwgZHg6IG51bWJlciwgZHk6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5kaW0gIT09IGJvcmRlclRpbGUuZGltKSB0aHJvdyBuZXcgRXJyb3IoJ2RlbSBkaW1lbnNpb24gbWlzbWF0Y2gnKTtcblxuICAgICAgICBsZXQgeE1pbiA9IGR4ICogdGhpcy5kaW0sXG4gICAgICAgICAgICB4TWF4ID0gZHggKiB0aGlzLmRpbSArIHRoaXMuZGltLFxuICAgICAgICAgICAgeU1pbiA9IGR5ICogdGhpcy5kaW0sXG4gICAgICAgICAgICB5TWF4ID0gZHkgKiB0aGlzLmRpbSArIHRoaXMuZGltO1xuXG4gICAgICAgIHN3aXRjaCAoZHgpIHtcbiAgICAgICAgY2FzZSAtMTpcbiAgICAgICAgICAgIHhNaW4gPSB4TWF4IC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB4TWF4ID0geE1pbiArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZHkpIHtcbiAgICAgICAgY2FzZSAtMTpcbiAgICAgICAgICAgIHlNaW4gPSB5TWF4IC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB5TWF4ID0geU1pbiArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG94ID0gLWR4ICogdGhpcy5kaW07XG4gICAgICAgIGNvbnN0IG95ID0gLWR5ICogdGhpcy5kaW07XG4gICAgICAgIGZvciAobGV0IHkgPSB5TWluOyB5IDwgeU1heDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHgsIHksIGJvcmRlclRpbGUuZ2V0KHggKyBveCwgeSArIG95KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdERU1EYXRhJywgREVNRGF0YSk7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVMYXlvdXQoW1xuICAgIHsgbmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMiB9LFxuICAgIHsgbmFtZTogJ2FfdGV4dHVyZV9wb3MnLCB0eXBlOiAnSW50MTYnLCBjb21wb25lbnRzOiAyIH1cbl0pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5fSBmcm9tICcuL2FycmF5X3R5cGVzJztcbmltcG9ydCB0eXBlIFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlJztcbmltcG9ydCB0eXBlIHtUeXBlZFN0eWxlTGF5ZXJ9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3R5cGVkX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIEZlYXR1cmVJbmRleCBmcm9tICcuL2ZlYXR1cmVfaW5kZXgnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuXG5leHBvcnQgdHlwZSBCdWNrZXRQYXJhbWV0ZXJzPExheWVyOiBUeXBlZFN0eWxlTGF5ZXI+ID0ge1xuICAgIGluZGV4OiBudW1iZXIsXG4gICAgbGF5ZXJzOiBBcnJheTxMYXllcj4sXG4gICAgem9vbTogbnVtYmVyLFxuICAgIHBpeGVsUmF0aW86IG51bWJlcixcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyLFxuICAgIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSxcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgc291cmNlSUQ6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBQb3B1bGF0ZVBhcmFtZXRlcnMgPSB7XG4gICAgZmVhdHVyZUluZGV4OiBGZWF0dXJlSW5kZXgsXG4gICAgaWNvbkRlcGVuZGVuY2llczoge30sXG4gICAgcGF0dGVybkRlcGVuZGVuY2llczoge30sXG4gICAgZ2x5cGhEZXBlbmRlbmNpZXM6IHt9XG59XG5cbmV4cG9ydCB0eXBlIEluZGV4ZWRGZWF0dXJlID0ge1xuICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxufVxuXG5leHBvcnQgdHlwZSBCdWNrZXRGZWF0dXJlID0ge3xcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICBwcm9wZXJ0aWVzOiBPYmplY3QsXG4gICAgdHlwZTogMSB8IDIgfCAzLFxuICAgIGlkPzogYW55LFxuICAgICtwYXR0ZXJuczoge1tzdHJpbmddOiB7XCJtaW5cIjogc3RyaW5nLCBcIm1pZFwiOiBzdHJpbmcsIFwibWF4XCI6IHN0cmluZ319LFxuICAgIHNvcnRLZXk/OiBudW1iZXJcbnx9O1xuXG4vKipcbiAqIFRoZSBgQnVja2V0YCBpbnRlcmZhY2UgaXMgdGhlIHNpbmdsZSBwb2ludCBvZiBrbm93bGVkZ2UgYWJvdXQgdHVybmluZyB2ZWN0b3JcbiAqIHRpbGVzIGludG8gV2ViR0wgYnVmZmVycy5cbiAqXG4gKiBgQnVja2V0YCBpcyBhbiBhYnN0cmFjdCBpbnRlcmZhY2UuIEFuIGltcGxlbWVudGF0aW9uIGV4aXN0cyBmb3IgZWFjaCBzdHlsZSBsYXllciB0eXBlLlxuICogQ3JlYXRlIGEgYnVja2V0IHZpYSB0aGUgYFN0eWxlTGF5ZXIjY3JlYXRlQnVja2V0YCBtZXRob2QuXG4gKlxuICogVGhlIGNvbmNyZXRlIGJ1Y2tldCB0eXBlcywgdXNpbmcgbGF5b3V0IG9wdGlvbnMgZnJvbSB0aGUgc3R5bGUgbGF5ZXIsXG4gKiB0cmFuc2Zvcm0gZmVhdHVyZSBnZW9tZXRyaWVzIGludG8gdmVydGV4IGFuZCBpbmRleCBkYXRhIGZvciB1c2UgYnkgdGhlXG4gKiB2ZXJ0ZXggc2hhZGVyLiAgVGhleSBhbHNvICh2aWEgYFByb2dyYW1Db25maWd1cmF0aW9uYCkgdXNlIGZlYXR1cmVcbiAqIHByb3BlcnRpZXMgYW5kIHRoZSB6b29tIGxldmVsIHRvIHBvcHVsYXRlIHRoZSBhdHRyaWJ1dGVzIG5lZWRlZCBmb3JcbiAqIGRhdGEtZHJpdmVuIHN0eWxpbmcuXG4gKlxuICogQnVja2V0cyBhcmUgZGVzaWduZWQgdG8gYmUgYnVpbHQgb24gYSB3b3JrZXIgdGhyZWFkIGFuZCB0aGVuIHNlcmlhbGl6ZWQgYW5kXG4gKiB0cmFuc2ZlcnJlZCBiYWNrIHRvIHRoZSBtYWluIHRocmVhZCBmb3IgcmVuZGVyaW5nLiAgT24gdGhlIHdvcmtlciBzaWRlLCBhXG4gKiBidWNrZXQncyB2ZXJ0ZXgsIGluZGV4LCBhbmQgYXR0cmlidXRlIGRhdGEgaXMgc3RvcmVkIGluIGBidWNrZXQuYXJyYXlzOlxuICogQXJyYXlHcm91cGAuICBXaGVuIGEgYnVja2V0J3MgZGF0YSBpcyBzZXJpYWxpemVkIGFuZCBzZW50IGJhY2sgdG8gdGhlIG1haW5cbiAqIHRocmVhZCwgaXMgZ2V0cyBkZXNlcmlhbGl6ZWQgKHVzaW5nIGBuZXcgQnVja2V0KHNlcmlhbGl6ZWRCdWNrZXREYXRhKWAsIHdpdGhcbiAqIHRoZSBhcnJheSBkYXRhIG5vdyBzdG9yZWQgaW4gYGJ1Y2tldC5idWZmZXJzOiBCdWZmZXJHcm91cGAuICBCdWZmZXJHcm91cHNcbiAqIGhvbGQgdGhlIHNhbWUgZGF0YSBhcyBBcnJheUdyb3VwcywgYnV0IGFyZSB0dW5lZCBmb3IgY29uc3VtcHRpb24gYnkgV2ViR0wuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXQge1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgK2xheWVyczogQXJyYXk8YW55PjtcbiAgICArc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PGFueT47XG4gICAgK3N0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgcG9wdWxhdGUoZmVhdHVyZXM6IEFycmF5PEluZGV4ZWRGZWF0dXJlPiwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKTogdm9pZDtcbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KTogdm9pZDtcbiAgICBpc0VtcHR5KCk6IGJvb2xlYW47XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCk6IHZvaWQ7XG4gICAgdXBsb2FkUGVuZGluZygpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZSB0aGUgV2ViR0wgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVycy4gTm90ZSB0aGF0IGJlY2F1c2VcbiAgICAgKiBidWNrZXRzIGFyZSBzaGFyZWQgYmV0d2VlbiBsYXllcnMgaGF2aW5nIHRoZSBzYW1lIGxheW91dCBwcm9wZXJ0aWVzLCB0aGV5XG4gICAgICogbXVzdCBiZSBkZXN0cm95ZWQgaW4gZ3JvdXBzIChhbGwgYnVja2V0cyBmb3IgYSB0aWxlLCBvciBhbGwgc3ltYm9sIGJ1Y2tldHMpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZShpbnB1dDogQXJyYXk8QnVja2V0Piwgc3R5bGU6IFN0eWxlKToge1tzdHJpbmddOiBCdWNrZXR9IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcblxuICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1hcCdzIHN0eWxlIGhhcyBiZWVuIHNldCB0byBudWxsIHdoaWxlXG4gICAgLy8gdGhpcyBidWNrZXQgaGFzIGJlZW4gcGFyc2luZy5cbiAgICBpZiAoIXN0eWxlKSByZXR1cm4gb3V0cHV0O1xuXG4gICAgZm9yIChjb25zdCBidWNrZXQgb2YgaW5wdXQpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gYnVja2V0LmxheWVySWRzXG4gICAgICAgICAgICAubWFwKChpZCkgPT4gc3R5bGUuZ2V0TGF5ZXIoaWQpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICBpZiAobGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsb29rIHVwIFN0eWxlTGF5ZXIgb2JqZWN0cyBmcm9tIGxheWVyIGlkcyAoc2luY2Ugd2UgZG9uJ3RcbiAgICAgICAgLy8gd2FudCB0byB3YXN0ZSB0aW1lIHNlcmlhbGl6aW5nL2NvcHlpbmcgdGhlbSBmcm9tIHRoZSB3b3JrZXIpXG4gICAgICAgIChidWNrZXQ6IGFueSkubGF5ZXJzID0gbGF5ZXJzO1xuICAgICAgICBpZiAoKGJ1Y2tldDogYW55KS5zdGF0ZURlcGVuZGVudExheWVySWRzKSB7XG4gICAgICAgICAgICAoYnVja2V0OiBhbnkpLnN0YXRlRGVwZW5kZW50TGF5ZXJzID0gKGJ1Y2tldDogYW55KS5zdGF0ZURlcGVuZGVudExheWVySWRzLm1hcCgobElkKSA9PiBsYXllcnMuZmlsdGVyKChsKSA9PiBsLmlkID09PSBsSWQpWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgb3V0cHV0W2xheWVyLmlkXSA9IGJ1Y2tldDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG59XG4iLCIvLyBAZmxvdyBzdHJpY3RcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jbGFzcyBEaWN0aW9uYXJ5Q29kZXIge1xuICAgIF9zdHJpbmdUb051bWJlcjogeyBbc3RyaW5nXTogbnVtYmVyIH07XG4gICAgX251bWJlclRvU3RyaW5nOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3Ioc3RyaW5nczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlciA9IHt9O1xuICAgICAgICB0aGlzLl9udW1iZXJUb1N0cmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZyA9IHN0cmluZ3NbaV07XG4gICAgICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlcltzdHJpbmddID0gaTtcbiAgICAgICAgICAgIHRoaXMuX251bWJlclRvU3RyaW5nW2ldID0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5jb2RlKHN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgIGFzc2VydChzdHJpbmcgaW4gdGhpcy5fc3RyaW5nVG9OdW1iZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nVG9OdW1iZXJbc3RyaW5nXTtcbiAgICB9XG5cbiAgICBkZWNvZGUobjogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydChuIDwgdGhpcy5fbnVtYmVyVG9TdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclRvU3RyaW5nW25dO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGljdGlvbmFyeUNvZGVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHtHZW9KU09OR2VvbWV0cnl9IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5cbmNsYXNzIEZlYXR1cmUge1xuICAgIHR5cGU6ICdGZWF0dXJlJztcbiAgICBfZ2VvbWV0cnk6ID9HZW9KU09OR2VvbWV0cnk7XG4gICAgcHJvcGVydGllczoge307XG4gICAgaWQ6IG51bWJlciB8IHN0cmluZyB8IHZvaWQ7XG5cbiAgICBfdmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlO1xuXG4gICAgY29uc3RydWN0b3IodmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLCB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudHlwZSA9ICdGZWF0dXJlJztcblxuICAgICAgICB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZSA9IHZlY3RvclRpbGVGZWF0dXJlO1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3ogPSB6O1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3ggPSB4O1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3kgPSB5O1xuXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHZlY3RvclRpbGVGZWF0dXJlLnByb3BlcnRpZXM7XG5cbiAgICAgICAgaWYgKHZlY3RvclRpbGVGZWF0dXJlLmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSB2ZWN0b3JUaWxlRmVhdHVyZS5pZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBnZW9tZXRyeSgpOiA/R2VvSlNPTkdlb21ldHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuX2dlb21ldHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb21ldHJ5ID0gdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUudG9HZW9KU09OKFxuICAgICAgICAgICAgICAgICh0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZTogYW55KS5feCxcbiAgICAgICAgICAgICAgICAodGhpcy5fdmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3ksXG4gICAgICAgICAgICAgICAgKHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlOiBhbnkpLl96KS5nZW9tZXRyeTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2VvbWV0cnk7XG4gICAgfVxuXG4gICAgc2V0IGdlb21ldHJ5KGc6ID9HZW9KU09OR2VvbWV0cnkpIHtcbiAgICAgICAgdGhpcy5fZ2VvbWV0cnkgPSBnO1xuICAgIH1cblxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QganNvbiA9IHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiB0aGlzLmdlb21ldHJ5XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gJ19nZW9tZXRyeScgfHwgaSA9PT0gJ192ZWN0b3JUaWxlRmVhdHVyZScpIGNvbnRpbnVlO1xuICAgICAgICAgICAganNvbltpXSA9ICh0aGlzOiBhbnkpW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmVhdHVyZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcblxuZXhwb3J0IHR5cGUgRmVhdHVyZVN0YXRlcyA9IHtbZmVhdHVyZV9pZDogc3RyaW5nXTogRmVhdHVyZVN0YXRlfTtcbmV4cG9ydCB0eXBlIExheWVyRmVhdHVyZVN0YXRlcyA9IHtbbGF5ZXI6IHN0cmluZ106IEZlYXR1cmVTdGF0ZXN9O1xuXG4vKipcbiAqIFNvdXJjZUZlYXR1cmVTdGF0ZSBtYW5hZ2VzIHRoZSBzdGF0ZSBhbmQgcGVuZGluZyBjaGFuZ2VzXG4gKiB0byBmZWF0dXJlcyBpbiBhIHNvdXJjZSwgc2VwYXJhdGVkIGJ5IHNvdXJjZSBsYXllci5cbiAqIHN0YXRlQ2hhbmdlcyBhbmQgZGVsZXRlZFN0YXRlcyBiYXRjaCBhbGwgY2hhbmdlcyB0byB0aGUgdGlsZSAodXBkYXRlcyBhbmQgcmVtb3ZlcywgcmVzcGVjdGl2ZWx5KVxuICogYmV0d2VlbiBjb2FsZXNjZSgpIGV2ZW50cy4gYWRkRmVhdHVyZVN0YXRlKCkgYW5kIHJlbW92ZUZlYXR1cmVTdGF0ZSgpIGFsc28gdXBkYXRlIHRoZWlyIGNvdW50ZXJwYXJ0J3NcbiAqIGxpc3Qgb2YgY2hhbmdlcywgc3VjaCB0aGF0IGNvYWxlc2NlKCkgY2FuIGFwcGx5IHRoZSBwcm9wZXIgc3RhdGUgY2hhbmdlcyB3aGlsZSBhZ25vc3RpYyB0byB0aGUgb3JkZXIgb2Ygb3BlcmF0aW9ucy5cbiAqIEluIGRlbGV0ZWRTdGF0ZXMsIGFsbCBudWxsJ3MgZGVub3RlIGNvbXBsZXRlIHJlbW92YWwgb2Ygc3RhdGUgYXQgdGhhdCBzY29wZVxuICogQHByaXZhdGVcbiovXG5jbGFzcyBTb3VyY2VGZWF0dXJlU3RhdGUge1xuICAgIHN0YXRlOiBMYXllckZlYXR1cmVTdGF0ZXM7XG4gICAgc3RhdGVDaGFuZ2VzOiBMYXllckZlYXR1cmVTdGF0ZXM7XG4gICAgZGVsZXRlZFN0YXRlczoge307XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcyA9IHt9O1xuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXMgPSB7fTtcbiAgICB9XG5cbiAgICB1cGRhdGVTdGF0ZShzb3VyY2VMYXllcjogc3RyaW5nLCBmZWF0dXJlSWQ6IG51bWJlciwgbmV3U3RhdGU6IE9iamVjdCkge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gU3RyaW5nKGZlYXR1cmVJZCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSA9IHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdIHx8IHt9O1xuICAgICAgICBleHRlbmQodGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdLCBuZXdTdGF0ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZnQgaW4gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZnQgIT09IGZlYXR1cmUpIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZnRdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVEZWxldGlvblF1ZXVlZCA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gJiYgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSA9PT0gbnVsbDtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlRGVsZXRpb25RdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3U3RhdGVbcHJvcF0pIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1bcHJvcF0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRpb25JblF1ZXVlID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSAmJiB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdICYmIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XSA9PT0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0aW9uSW5RdWV1ZSkgZGVsZXRlIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXI6IHN0cmluZywgZmVhdHVyZUlkPzogbnVtYmVyLCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJEZWxldGVkID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbDtcbiAgICAgICAgaWYgKHNvdXJjZUxheWVyRGVsZXRlZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBTdHJpbmcoZmVhdHVyZUlkKTtcblxuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSB8fCB7fTtcblxuICAgICAgICBpZiAoa2V5ICYmIGZlYXR1cmVJZCAhPT0gdW5kZWZpbmVkICYmIGZlYXR1cmVJZCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdIHx8IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmVhdHVyZUlkICE9PSB1bmRlZmluZWQgJiYgZmVhdHVyZUlkID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUluUXVldWUgPSB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl0gJiYgdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZUluUXVldWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdKSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdW2tleV0gPSBudWxsO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGdldFN0YXRlKHNvdXJjZUxheWVyOiBzdHJpbmcsIGZlYXR1cmVJZDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBTdHJpbmcoZmVhdHVyZUlkKTtcbiAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdIHx8IHt9O1xuICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdIHx8IHt9O1xuXG4gICAgICAgIGNvbnN0IHJlY29uY2lsZWRTdGF0ZSA9IGV4dGVuZCh7fSwgYmFzZVtmZWF0dXJlXSwgY2hhbmdlc1tmZWF0dXJlXSk7XG5cbiAgICAgICAgLy9yZXR1cm4gZW1wdHkgb2JqZWN0IGlmIHRoZSB3aG9sZSBzb3VyY2UgbGF5ZXIgaXMgYXdhaXRpbmcgZGVsZXRpb25cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPT09IG51bGwpIHJldHVybiB7fTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZURlbGV0aW9ucyA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZUlkXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlRGVsZXRpb25zID09PSBudWxsKSByZXR1cm4ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZmVhdHVyZURlbGV0aW9ucykgZGVsZXRlIHJlY29uY2lsZWRTdGF0ZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb25jaWxlZFN0YXRlO1xuICAgIH1cblxuICAgIGluaXRpYWxpemVUaWxlU3RhdGUodGlsZTogVGlsZSwgcGFpbnRlcjogYW55KSB7XG4gICAgICAgIHRpbGUuc2V0RmVhdHVyZVN0YXRlKHRoaXMuc3RhdGUsIHBhaW50ZXIpO1xuICAgIH1cblxuICAgIGNvYWxlc2NlQ2hhbmdlcyh0aWxlczoge1thbnldOiBUaWxlfSwgcGFpbnRlcjogYW55KSB7XG4gICAgICAgIC8vdHJhY2sgY2hhbmdlcyB3aXRoIGZ1bGwgc3RhdGUgb2JqZWN0cywgYnV0IG9ubHkgZm9yIGZlYXR1cmVzIHRoYXQgZ290IG1vZGlmaWVkXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzQ2hhbmdlZDogTGF5ZXJGZWF0dXJlU3RhdGVzID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VMYXllciBpbiB0aGlzLnN0YXRlQ2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gfHwge307XG4gICAgICAgICAgICBjb25zdCBsYXllclN0YXRlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIGluIHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0pIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgZXh0ZW5kKHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdLCB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0pO1xuICAgICAgICAgICAgICAgIGxheWVyU3RhdGVzW2ZlYXR1cmVdID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmZWF0dXJlc0NoYW5nZWRbc291cmNlTGF5ZXJdID0gbGF5ZXJTdGF0ZXM7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVyIGluIHRoaXMuZGVsZXRlZFN0YXRlcykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gfHwge307XG4gICAgICAgICAgICBjb25zdCBsYXllclN0YXRlcyA9IHt9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZnQgaW4gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJTdGF0ZXNbZnRdID0ge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2Z0XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIGluIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlV2hvbGVGZWF0dXJlU3RhdGUgPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID09PSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlV2hvbGVGZWF0dXJlU3RhdGUpIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXllclN0YXRlc1tmZWF0dXJlXSA9IHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmVhdHVyZXNDaGFuZ2VkW3NvdXJjZUxheWVyXSA9IGZlYXR1cmVzQ2hhbmdlZFtzb3VyY2VMYXllcl0gfHwge307XG4gICAgICAgICAgICBleHRlbmQoZmVhdHVyZXNDaGFuZ2VkW3NvdXJjZUxheWVyXSwgbGF5ZXJTdGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMgPSB7fTtcbiAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzID0ge307XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGZlYXR1cmVzQ2hhbmdlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW2lkXTtcbiAgICAgICAgICAgIHRpbGUuc2V0RmVhdHVyZVN0YXRlKGZlYXR1cmVzQ2hhbmdlZCwgcGFpbnRlcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNvdXJjZUZlYXR1cmVTdGF0ZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuL2xvYWRfZ2VvbWV0cnknO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuL2V4dGVudCc7XG5pbXBvcnQgZmVhdHVyZUZpbHRlciBmcm9tICcuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyJztcbmltcG9ydCBHcmlkIGZyb20gJ2dyaWQtaW5kZXgnO1xuaW1wb3J0IERpY3Rpb25hcnlDb2RlciBmcm9tICcuLi91dGlsL2RpY3Rpb25hcnlfY29kZXInO1xuaW1wb3J0IHZ0IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuaW1wb3J0IFByb3RvYnVmIGZyb20gJ3BiZic7XG5pbXBvcnQgR2VvSlNPTkZlYXR1cmUgZnJvbSAnLi4vdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb24nO1xuaW1wb3J0IHsgYXJyYXlzSW50ZXJzZWN0IH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE92ZXJzY2FsZWRUaWxlSUQgfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCBTb3VyY2VGZWF0dXJlU3RhdGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQge3BvbHlnb25JbnRlcnNlY3RzQm94fSBmcm9tICcuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cyc7XG5cbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVGaWx0ZXJ9IGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXInO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0ZpbHRlclNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5pbXBvcnQgeyBGZWF0dXJlSW5kZXhBcnJheSB9IGZyb20gJy4vYXJyYXlfdHlwZXMnO1xuXG50eXBlIFF1ZXJ5UGFyYW1ldGVycyA9IHtcbiAgICBzY2FsZTogbnVtYmVyLFxuICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgdGlsZVNpemU6IG51bWJlcixcbiAgICBxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgY2FtZXJhUXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgIHF1ZXJ5UGFkZGluZzogbnVtYmVyLFxuICAgIHBhcmFtczoge1xuICAgICAgICBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgICAgIGxheWVyczogQXJyYXk8c3RyaW5nPixcbiAgICB9XG59XG5cbmNsYXNzIEZlYXR1cmVJbmRleCB7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgejogbnVtYmVyO1xuICAgIGdyaWQ6IEdyaWQ7XG4gICAgZ3JpZDNEOiBHcmlkO1xuICAgIGZlYXR1cmVJbmRleEFycmF5OiBGZWF0dXJlSW5kZXhBcnJheTtcblxuICAgIHJhd1RpbGVEYXRhOiBBcnJheUJ1ZmZlcjtcbiAgICBidWNrZXRMYXllcklEczogQXJyYXk8QXJyYXk8c3RyaW5nPj47XG5cbiAgICB2dExheWVyczoge1tzdHJpbmddOiBWZWN0b3JUaWxlTGF5ZXJ9O1xuICAgIHNvdXJjZUxheWVyQ29kZXI6IERpY3Rpb25hcnlDb2RlcjtcblxuICAgIGNvbnN0cnVjdG9yKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCxcbiAgICAgICAgICAgICAgICBncmlkPzogR3JpZCxcbiAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXhBcnJheT86IEZlYXR1cmVJbmRleEFycmF5KSB7XG4gICAgICAgIHRoaXMudGlsZUlEID0gdGlsZUlEO1xuICAgICAgICB0aGlzLnggPSB0aWxlSUQuY2Fub25pY2FsLng7XG4gICAgICAgIHRoaXMueSA9IHRpbGVJRC5jYW5vbmljYWwueTtcbiAgICAgICAgdGhpcy56ID0gdGlsZUlELmNhbm9uaWNhbC56O1xuICAgICAgICB0aGlzLmdyaWQgPSBncmlkIHx8IG5ldyBHcmlkKEVYVEVOVCwgMTYsIDApO1xuICAgICAgICB0aGlzLmdyaWQzRCA9IG5ldyBHcmlkKEVYVEVOVCwgMTYsIDApO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleEFycmF5ID0gZmVhdHVyZUluZGV4QXJyYXkgfHwgbmV3IEZlYXR1cmVJbmRleEFycmF5KCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0KGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLCBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgZmVhdHVyZUluZGV4OiBudW1iZXIsIHNvdXJjZUxheWVySW5kZXg6IG51bWJlciwgYnVja2V0SW5kZXg6IG51bWJlciwgaXMzRD86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5mZWF0dXJlSW5kZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIHRoaXMuZmVhdHVyZUluZGV4QXJyYXkuZW1wbGFjZUJhY2soZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IGlzM0QgPyB0aGlzLmdyaWQzRCA6IHRoaXMuZ3JpZDtcblxuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IGdlb21ldHJ5Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCByaW5nID0gZ2VvbWV0cnlbcl07XG5cbiAgICAgICAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gcmluZ1tpXTtcbiAgICAgICAgICAgICAgICBiYm94WzBdID0gTWF0aC5taW4oYmJveFswXSwgcC54KTtcbiAgICAgICAgICAgICAgICBiYm94WzFdID0gTWF0aC5taW4oYmJveFsxXSwgcC55KTtcbiAgICAgICAgICAgICAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgcC54KTtcbiAgICAgICAgICAgICAgICBiYm94WzNdID0gTWF0aC5tYXgoYmJveFszXSwgcC55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGJib3hbMF0gPCBFWFRFTlQgJiZcbiAgICAgICAgICAgICAgICBiYm94WzFdIDwgRVhURU5UICYmXG4gICAgICAgICAgICAgICAgYmJveFsyXSA+PSAwICYmXG4gICAgICAgICAgICAgICAgYmJveFszXSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZ3JpZC5pbnNlcnQoa2V5LCBiYm94WzBdLCBiYm94WzFdLCBiYm94WzJdLCBiYm94WzNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRWVExheWVycygpOiB7W3N0cmluZ106IFZlY3RvclRpbGVMYXllcn0ge1xuICAgICAgICBpZiAoIXRoaXMudnRMYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMudnRMYXllcnMgPSBuZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYodGhpcy5yYXdUaWxlRGF0YSkpLmxheWVycztcbiAgICAgICAgICAgIHRoaXMuc291cmNlTGF5ZXJDb2RlciA9IG5ldyBEaWN0aW9uYXJ5Q29kZXIodGhpcy52dExheWVycyA/IE9iamVjdC5rZXlzKHRoaXMudnRMYXllcnMpLnNvcnQoKSA6IFsnX2dlb2pzb25UaWxlTGF5ZXInXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudnRMYXllcnM7XG4gICAgfVxuXG4gICAgLy8gRmluZHMgbm9uLXN5bWJvbCBmZWF0dXJlcyBpbiB0aGlzIHRpbGUgYXQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uLlxuICAgIHF1ZXJ5KGFyZ3M6IFF1ZXJ5UGFyYW1ldGVycywgc3R5bGVMYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0sIHNvdXJjZUZlYXR1cmVTdGF0ZTogU291cmNlRmVhdHVyZVN0YXRlKToge1tzdHJpbmddOiBBcnJheTx7IGZlYXR1cmVJbmRleDogbnVtYmVyLCBmZWF0dXJlOiBHZW9KU09ORmVhdHVyZSB9Pn0ge1xuICAgICAgICB0aGlzLmxvYWRWVExheWVycygpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3MucGFyYW1zIHx8IHt9LFxuICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHMgPSBFWFRFTlQgLyBhcmdzLnRpbGVTaXplIC8gYXJncy5zY2FsZSxcbiAgICAgICAgICAgIGZpbHRlciA9IGZlYXR1cmVGaWx0ZXIocGFyYW1zLmZpbHRlcik7XG5cbiAgICAgICAgY29uc3QgcXVlcnlHZW9tZXRyeSA9IGFyZ3MucXVlcnlHZW9tZXRyeTtcbiAgICAgICAgY29uc3QgcXVlcnlQYWRkaW5nID0gYXJncy5xdWVyeVBhZGRpbmcgKiBwaXhlbHNUb1RpbGVVbml0cztcblxuICAgICAgICBjb25zdCBib3VuZHMgPSBnZXRCb3VuZHMocXVlcnlHZW9tZXRyeSk7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nID0gdGhpcy5ncmlkLnF1ZXJ5KGJvdW5kcy5taW5YIC0gcXVlcnlQYWRkaW5nLCBib3VuZHMubWluWSAtIHF1ZXJ5UGFkZGluZywgYm91bmRzLm1heFggKyBxdWVyeVBhZGRpbmcsIGJvdW5kcy5tYXhZICsgcXVlcnlQYWRkaW5nKTtcblxuICAgICAgICBjb25zdCBjYW1lcmFCb3VuZHMgPSBnZXRCb3VuZHMoYXJncy5jYW1lcmFRdWVyeUdlb21ldHJ5KTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmczRCA9IHRoaXMuZ3JpZDNELnF1ZXJ5KFxuICAgICAgICAgICAgICAgIGNhbWVyYUJvdW5kcy5taW5YIC0gcXVlcnlQYWRkaW5nLCBjYW1lcmFCb3VuZHMubWluWSAtIHF1ZXJ5UGFkZGluZywgY2FtZXJhQm91bmRzLm1heFggKyBxdWVyeVBhZGRpbmcsIGNhbWVyYUJvdW5kcy5tYXhZICsgcXVlcnlQYWRkaW5nLFxuICAgICAgICAgICAgICAgIChieDEsIGJ5MSwgYngyLCBieTIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RzQm94KGFyZ3MuY2FtZXJhUXVlcnlHZW9tZXRyeSwgYngxIC0gcXVlcnlQYWRkaW5nLCBieTEgLSBxdWVyeVBhZGRpbmcsIGJ4MiArIHF1ZXJ5UGFkZGluZywgYnkyICsgcXVlcnlQYWRkaW5nKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBtYXRjaGluZzNEKSB7XG4gICAgICAgICAgICBtYXRjaGluZy5wdXNoKGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRjaGluZy5zb3J0KHRvcERvd25GZWF0dXJlQ29tcGFyYXRvcik7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIGxldCBwcmV2aW91c0luZGV4O1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1hdGNoaW5nLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IG1hdGNoaW5nW2tdO1xuXG4gICAgICAgICAgICAvLyBkb24ndCBjaGVjayB0aGUgc2FtZSBmZWF0dXJlIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHByZXZpb3VzSW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcHJldmlvdXNJbmRleCA9IGluZGV4O1xuXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZmVhdHVyZUluZGV4QXJyYXkuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlR2VvbWV0cnkgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5sb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBtYXRjaC5idWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICBtYXRjaC5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIG1hdGNoLmZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgcGFyYW1zLmxheWVycyxcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVycyxcbiAgICAgICAgICAgICAgICAoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIHN0eWxlTGF5ZXI6IFN0eWxlTGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmZWF0dXJlR2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVHZW9tZXRyeSA9IGxvYWRHZW9tZXRyeShmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgZmVhdHVyZVN0YXRlID0ge307XG4gICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgZmVhdHVyZS1zdGF0ZWAgZXhwcmVzc2lvbiBldmFsdWF0aW9uIHJlcXVpcmVzIGZlYXR1cmUgc3RhdGUgdG8gYmUgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGUgPSBzb3VyY2VGZWF0dXJlU3RhdGUuZ2V0U3RhdGUoc3R5bGVMYXllci5zb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInLCBmZWF0dXJlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVMYXllci5xdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnksIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgZmVhdHVyZUdlb21ldHJ5LCB0aGlzLnosIGFyZ3MudHJhbnNmb3JtLCBwaXhlbHNUb1RpbGVVbml0cywgYXJncy5waXhlbFBvc01hdHJpeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgbG9hZE1hdGNoaW5nRmVhdHVyZShcbiAgICAgICAgcmVzdWx0OiB7W3N0cmluZ106IEFycmF5PHsgZmVhdHVyZUluZGV4OiBudW1iZXIsIGZlYXR1cmU6IEdlb0pTT05GZWF0dXJlIH0+fSxcbiAgICAgICAgYnVja2V0SW5kZXg6IG51bWJlcixcbiAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICBmZWF0dXJlSW5kZXg6IG51bWJlcixcbiAgICAgICAgZmlsdGVyOiBGZWF0dXJlRmlsdGVyLFxuICAgICAgICBmaWx0ZXJMYXllcklEczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgc3R5bGVMYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgIGludGVyc2VjdGlvblRlc3Q/OiAoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIHN0eWxlTGF5ZXI6IFN0eWxlTGF5ZXIpID0+IGJvb2xlYW4gfCBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBsYXllcklEcyA9IHRoaXMuYnVja2V0TGF5ZXJJRHNbYnVja2V0SW5kZXhdO1xuICAgICAgICBpZiAoZmlsdGVyTGF5ZXJJRHMgJiYgIWFycmF5c0ludGVyc2VjdChmaWx0ZXJMYXllcklEcywgbGF5ZXJJRHMpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyTmFtZSA9IHRoaXMuc291cmNlTGF5ZXJDb2Rlci5kZWNvZGUoc291cmNlTGF5ZXJJbmRleCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gdGhpcy52dExheWVyc1tzb3VyY2VMYXllck5hbWVdO1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gc291cmNlTGF5ZXIuZmVhdHVyZShmZWF0dXJlSW5kZXgpO1xuXG4gICAgICAgIGlmICghZmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnRpbGVJRC5vdmVyc2NhbGVkWiksIGZlYXR1cmUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgbGF5ZXJJRHMubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVySUQgPSBsYXllcklEc1tsXTtcblxuICAgICAgICAgICAgaWYgKGZpbHRlckxheWVySURzICYmIGZpbHRlckxheWVySURzLmluZGV4T2YobGF5ZXJJRCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0eWxlTGF5ZXIgPSBzdHlsZUxheWVyc1tsYXllcklEXTtcbiAgICAgICAgICAgIGlmICghc3R5bGVMYXllcikgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvblogPSAhaW50ZXJzZWN0aW9uVGVzdCB8fCBpbnRlcnNlY3Rpb25UZXN0KGZlYXR1cmUsIHN0eWxlTGF5ZXIpO1xuICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3Rpb25aKSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGZvciBub24tc3ltYm9sIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGdlb2pzb25GZWF0dXJlID0gbmV3IEdlb0pTT05GZWF0dXJlKGZlYXR1cmUsIHRoaXMueiwgdGhpcy54LCB0aGlzLnkpO1xuICAgICAgICAgICAgKGdlb2pzb25GZWF0dXJlOiBhbnkpLmxheWVyID0gc3R5bGVMYXllci5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIGxldCBsYXllclJlc3VsdCA9IHJlc3VsdFtsYXllcklEXTtcbiAgICAgICAgICAgIGlmIChsYXllclJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJSZXN1bHQgPSByZXN1bHRbbGF5ZXJJRF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxheWVyUmVzdWx0LnB1c2goeyBmZWF0dXJlSW5kZXgsIGZlYXR1cmU6IGdlb2pzb25GZWF0dXJlLCBpbnRlcnNlY3Rpb25aIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzZXQgb2Ygc3ltYm9sIGluZGV4ZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb29rZWQgdXAsXG4gICAgLy8gcmV0dXJuIGEgbWF0Y2hpbmcgc2V0IG9mIEdlb0pTT05GZWF0dXJlc1xuICAgIGxvb2t1cFN5bWJvbEZlYXR1cmVzKHN5bWJvbEZlYXR1cmVJbmRleGVzOiBBcnJheTxudW1iZXI+LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclNwZWM6IEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyTGF5ZXJJRHM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVMYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHRoaXMubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyID0gZmVhdHVyZUZpbHRlcihmaWx0ZXJTcGVjKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbEZlYXR1cmVJbmRleCBvZiBzeW1ib2xGZWF0dXJlSW5kZXhlcykge1xuICAgICAgICAgICAgdGhpcy5sb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBidWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgZmlsdGVyTGF5ZXJJRHMsXG4gICAgICAgICAgICAgICAgc3R5bGVMYXllcnNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGhhc0xheWVyKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEcyBvZiB0aGlzLmJ1Y2tldExheWVySURzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySUQgb2YgbGF5ZXJJRHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQgPT09IGxheWVySUQpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoXG4gICAgJ0ZlYXR1cmVJbmRleCcsXG4gICAgRmVhdHVyZUluZGV4LFxuICAgIHsgb21pdDogWydyYXdUaWxlRGF0YScsICdzb3VyY2VMYXllckNvZGVyJ10gfVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgRmVhdHVyZUluZGV4O1xuXG5mdW5jdGlvbiBnZXRCb3VuZHMoZ2VvbWV0cnk6IEFycmF5PFBvaW50Pikge1xuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHAueCk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwLnkpO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcC54KTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHAueSk7XG4gICAgfVxuICAgIHJldHVybiB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfTtcbn1cblxuZnVuY3Rpb24gdG9wRG93bkZlYXR1cmVDb21wYXJhdG9yKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGE7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyB1bmlxdWVJZCwgZGVlcEVxdWFsLCBwYXJzZUNhY2hlQ29udHJvbCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBkZXNlcmlhbGl6ZSBhcyBkZXNlcmlhbGl6ZUJ1Y2tldCB9IGZyb20gJy4uL2RhdGEvYnVja2V0JztcbmltcG9ydCBGZWF0dXJlSW5kZXggZnJvbSAnLi4vZGF0YS9mZWF0dXJlX2luZGV4JztcbmltcG9ydCBHZW9KU09ORmVhdHVyZSBmcm9tICcuLi91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbic7XG5pbXBvcnQgZmVhdHVyZUZpbHRlciBmcm9tICcuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyJztcbmltcG9ydCBTeW1ib2xCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgeyBSYXN0ZXJCb3VuZHNBcnJheSwgQ29sbGlzaW9uQm94QXJyYXkgfSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcbmltcG9ydCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzIGZyb20gJy4uL2RhdGEvcmFzdGVyX2JvdW5kc19hdHRyaWJ1dGVzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50JztcbmltcG9ydCB7IFRyaWFuZ2xlSW5kZXhBcnJheSB9IGZyb20gJy4uL2RhdGEvaW5kZXhfYXJyYXlfdHlwZSc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgU291cmNlRmVhdHVyZVN0YXRlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xuXG5jb25zdCBDTE9DS19TS0VXX1JFVFJZX1RJTUVPVVQgPSAzMDAwMDtcblxuaW1wb3J0IHR5cGUge0J1Y2tldH0gZnJvbSAnLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7V29ya2VyVGlsZVJlc3VsdH0gZnJvbSAnLi93b3JrZXJfc291cmNlJztcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3InO1xuaW1wb3J0IHR5cGUgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhJztcbmltcG9ydCB0eXBlIHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcbmltcG9ydCB0eXBlIEltYWdlQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7TWFza30gZnJvbSAnLi4vcmVuZGVyL3RpbGVfbWFzayc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vZ2wvaW5kZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUgRnJhbWVidWZmZXIgZnJvbSAnLi4vZ2wvZnJhbWVidWZmZXInO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0xheWVyRmVhdHVyZVN0YXRlc30gZnJvbSAnLi9zb3VyY2Vfc3RhdGUnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuaW1wb3J0IHR5cGUge0ZpbHRlclNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBUaWxlU3RhdGUgPVxuICAgIHwgJ2xvYWRpbmcnICAgLy8gVGlsZSBkYXRhIGlzIGluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcuXG4gICAgfCAnbG9hZGVkJyAgICAvLyBUaWxlIGRhdGEgaGFzIGJlZW4gbG9hZGVkLiBUaWxlIGNhbiBiZSByZW5kZXJlZC5cbiAgICB8ICdyZWxvYWRpbmcnIC8vIFRpbGUgZGF0YSBoYXMgYmVlbiBsb2FkZWQgYW5kIGlzIGJlaW5nIHVwZGF0ZWQuIFRpbGUgY2FuIGJlIHJlbmRlcmVkLlxuICAgIHwgJ3VubG9hZGVkJyAgLy8gVGlsZSBkYXRhIGhhcyBiZWVuIGRlbGV0ZWQuXG4gICAgfCAnZXJyb3JlZCcgICAvLyBUaWxlIGRhdGEgd2FzIG5vdCBsb2FkZWQgYmVjYXVzZSBvZiBhbiBlcnJvci5cbiAgICB8ICdleHBpcmVkJzsgIC8qIFRpbGUgZGF0YSB3YXMgcHJldmlvdXNseSBsb2FkZWQsIGJ1dCBoYXMgZXhwaXJlZCBwZXIgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBIVFRQIGhlYWRlcnMgYW5kIGlzIGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcuICovXG5cbi8qKlxuICogQSB0aWxlIG9iamVjdCBpcyB0aGUgY29tYmluYXRpb24gb2YgYSBDb29yZGluYXRlLCB3aGljaCBkZWZpbmVzXG4gKiBpdHMgcGxhY2UsIGFzIHdlbGwgYXMgYSB1bmlxdWUgSUQgYW5kIGRhdGEgdHJhY2tpbmcgZm9yIGl0cyBjb250ZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVGlsZSB7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIHVpZDogbnVtYmVyO1xuICAgIHVzZXM6IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIGJ1Y2tldHM6IHtbc3RyaW5nXTogQnVja2V0fTtcbiAgICBsYXRlc3RGZWF0dXJlSW5kZXg6ID9GZWF0dXJlSW5kZXg7XG4gICAgbGF0ZXN0UmF3VGlsZURhdGE6ID9BcnJheUJ1ZmZlcjtcbiAgICBpbWFnZUF0bGFzOiA/SW1hZ2VBdGxhcztcbiAgICBpbWFnZUF0bGFzVGV4dHVyZTogVGV4dHVyZTtcbiAgICBnbHlwaEF0bGFzSW1hZ2U6ID9BbHBoYUltYWdlO1xuICAgIGdseXBoQXRsYXNUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGV4cGlyYXRpb25UaW1lOiBhbnk7XG4gICAgZXhwaXJlZFJlcXVlc3RDb3VudDogbnVtYmVyO1xuICAgIHN0YXRlOiBUaWxlU3RhdGU7XG4gICAgdGltZUFkZGVkOiBhbnk7XG4gICAgZmFkZUVuZFRpbWU6IGFueTtcbiAgICBjb2xsaXNpb25Cb3hBcnJheTogP0NvbGxpc2lvbkJveEFycmF5O1xuICAgIHJlZG9XaGVuRG9uZTogYm9vbGVhbjtcbiAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW47XG4gICAgcGxhY2VtZW50U291cmNlOiBhbnk7XG4gICAgYWN0b3I6ID9BY3RvcjtcbiAgICB2dExheWVyczoge1tzdHJpbmddOiBWZWN0b3JUaWxlTGF5ZXJ9O1xuICAgIG1hc2s6IE1hc2s7XG5cbiAgICBuZWlnaGJvcmluZ1RpbGVzOiA/T2JqZWN0O1xuICAgIGRlbTogP0RFTURhdGE7XG4gICAgYWJvcnRlZDogP2Jvb2xlYW47XG4gICAgbWFza2VkQm91bmRzQnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIG1hc2tlZEluZGV4QnVmZmVyOiA/SW5kZXhCdWZmZXI7XG4gICAgc2VnbWVudHM6ID9TZWdtZW50VmVjdG9yO1xuICAgIG5lZWRzSGlsbHNoYWRlUHJlcGFyZTogP2Jvb2xlYW47XG4gICAgcmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgdGV4dHVyZTogYW55O1xuICAgIGZibzogP0ZyYW1lYnVmZmVyO1xuICAgIGRlbVRleHR1cmU6ID9UZXh0dXJlO1xuICAgIHJlZnJlc2hlZFVwb25FeHBpcmF0aW9uOiBib29sZWFuO1xuICAgIHJlbG9hZENhbGxiYWNrOiBhbnk7XG4gICAgcmVzb3VyY2VUaW1pbmc6ID9BcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPjtcbiAgICBxdWVyeVBhZGRpbmc6IG51bWJlcjtcblxuICAgIHN5bWJvbEZhZGVIb2xkVW50aWw6ID9udW1iZXI7XG4gICAgaGFzU3ltYm9sQnVja2V0czogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEXG4gICAgICogQHBhcmFtIHNpemVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICAgICAgdGhpcy51aWQgPSB1bmlxdWVJZCgpO1xuICAgICAgICB0aGlzLnVzZXMgPSAwO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5idWNrZXRzID0ge307XG4gICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBudWxsO1xuICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IDA7XG4gICAgICAgIHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcmVzcG9uc2Ugd2FzIGFscmVhZHkgZXhwaXJlZCB3aGVuXG4gICAgICAgIC8vIHJlY2VpdmVkLiBXZSdyZSB1c2luZyB0aGlzIHRvIGFkZCBhIGRlbGF5IHdoZW4gbWFraW5nIGEgbmV3IHJlcXVlc3RcbiAgICAgICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIHJldHJ5aW5nIGltbWVkaWF0ZWx5IGluIGNhc2Ugb2YgYSBzZXJ2ZXJcbiAgICAgICAgLy8gc2VydmluZyBleHBpcmVkIHRpbGVzLlxuICAgICAgICB0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSAnbG9hZGluZyc7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGYWRlRHVyYXRpb24oZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBmYWRlRW5kVGltZSA9IGR1cmF0aW9uICsgdGhpcy50aW1lQWRkZWQ7XG4gICAgICAgIGlmIChmYWRlRW5kVGltZSA8IGJyb3dzZXIubm93KCkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuZmFkZUVuZFRpbWUgJiYgZmFkZUVuZFRpbWUgPCB0aGlzLmZhZGVFbmRUaW1lKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5mYWRlRW5kVGltZSA9IGZhZGVFbmRUaW1lO1xuICAgIH1cblxuICAgIHdhc1JlcXVlc3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICdlcnJvcmVkJyB8fCB0aGlzLnN0YXRlID09PSAnbG9hZGVkJyB8fCB0aGlzLnN0YXRlID09PSAncmVsb2FkaW5nJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGRhdGEgb2JqZWN0IHdpdGggYSAnYnVmZmVycycgcHJvcGVydHksIGxvYWQgaXQgaW50b1xuICAgICAqIHRoaXMgdGlsZSdzIGVsZW1lbnRHcm91cHMgYW5kIGJ1ZmZlcnMgcHJvcGVydGllcyBhbmQgc2V0IGxvYWRlZFxuICAgICAqIHRvIHRydWUuIElmIHRoZSBkYXRhIGlzIG51bGwsIGxpa2UgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHlcbiAgICAgKiBHZW9KU09OIHRpbGUsIG5vLW9wIGJ1dCBzdGlsbCBzZXQgbG9hZGVkIHRvIHRydWUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKiBAcGFyYW0gcGFpbnRlclxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2FkVmVjdG9yRGF0YShkYXRhOiBXb3JrZXJUaWxlUmVzdWx0LCBwYWludGVyOiBhbnksIGp1c3RSZWxvYWRlZDogP2Jvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSAnbG9hZGVkJztcblxuICAgICAgICAvLyBlbXB0eSBHZW9KU09OIHRpbGVcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gbmV3IENvbGxpc2lvbkJveEFycmF5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5mZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4ID0gZGF0YS5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICBpZiAoZGF0YS5yYXdUaWxlRGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgdmVjdG9yIHRpbGVzIGhhdmUgcmF3VGlsZURhdGEsIGFuZCB0aGV5IHdvbid0IHVwZGF0ZSBpdCBmb3JcbiAgICAgICAgICAgICAgICAvLyAncmVsb2FkVGlsZSdcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdFJhd1RpbGVEYXRhID0gZGF0YS5yYXdUaWxlRGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSA9IGRhdGEucmF3VGlsZURhdGE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGF0ZXN0UmF3VGlsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiByYXdUaWxlRGF0YSBoYXNuJ3QgdXBkYXRlZCwgaG9sZCBvbnRvIGEgcG9pbnRlciB0byB0aGUgbGFzdFxuICAgICAgICAgICAgICAgIC8vIG9uZSB3ZSByZWNlaXZlZFxuICAgICAgICAgICAgICAgIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnJhd1RpbGVEYXRhID0gdGhpcy5sYXRlc3RSYXdUaWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gZGF0YS5jb2xsaXNpb25Cb3hBcnJheTtcbiAgICAgICAgdGhpcy5idWNrZXRzID0gZGVzZXJpYWxpemVCdWNrZXQoZGF0YS5idWNrZXRzLCBwYWludGVyLnN0eWxlKTtcblxuICAgICAgICB0aGlzLmhhc1N5bWJvbEJ1Y2tldHMgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICBpZiAoYnVja2V0IGluc3RhbmNlb2YgU3ltYm9sQnVja2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNTeW1ib2xCdWNrZXRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoanVzdFJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5qdXN0UmVsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVlcnlQYWRkaW5nID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IE1hdGgubWF4KHRoaXMucXVlcnlQYWRkaW5nLCBwYWludGVyLnN0eWxlLmdldExheWVyKGlkKS5xdWVyeVJhZGl1cyhidWNrZXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcyA9IGRhdGEuaW1hZ2VBdGxhcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5nbHlwaEF0bGFzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc0ltYWdlID0gZGF0YS5nbHlwaEF0bGFzSW1hZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIGFueSBkYXRhIG9yIFdlYkdMIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgdGlsZS5cbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdW5sb2FkVmVjdG9yRGF0YSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIHRoaXMuYnVja2V0c1tpZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlQXRsYXNUZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXNUZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nbHlwaEF0bGFzVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgIH1cblxuICAgIHVubG9hZERFTURhdGEoKSB7XG4gICAgICAgIHRoaXMuZGVtID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZWlnaGJvcmluZ1RpbGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgfVxuXG4gICAgZ2V0QnVja2V0KGxheWVyOiBTdHlsZUxheWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Y2tldHNbbGF5ZXIuaWRdO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgaWYgKGJ1Y2tldC51cGxvYWRQZW5kaW5nKCkpIHtcbiAgICAgICAgICAgICAgICBidWNrZXQudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBpZiAodGhpcy5pbWFnZUF0bGFzICYmICF0aGlzLmltYWdlQXRsYXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhc1RleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmltYWdlQXRsYXMuaW1hZ2UsIGdsLlJHQkEpO1xuICAgICAgICAgICAgdGhpcy5pbWFnZUF0bGFzLnVwbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdseXBoQXRsYXNJbWFnZSkge1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMuZ2x5cGhBdGxhc0ltYWdlLCBnbC5BTFBIQSk7XG4gICAgICAgICAgICB0aGlzLmdseXBoQXRsYXNJbWFnZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcmVwYXJlKGltYWdlTWFuYWdlcjogSW1hZ2VNYW5hZ2VyKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcy5wYXRjaFVwZGF0ZWRJbWFnZXMoaW1hZ2VNYW5hZ2VyLCB0aGlzLmltYWdlQXRsYXNUZXh0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFF1ZXJpZXMgbm9uLXN5bWJvbCBmZWF0dXJlcyByZW5kZXJlZCBmb3IgdGhpcyB0aWxlLlxuICAgIC8vIFN5bWJvbCBmZWF0dXJlcyBhcmUgcXVlcmllZCBnbG9iYWxseVxuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhsYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZlYXR1cmVTdGF0ZTogU291cmNlRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IGZpbHRlcjogRmlsdGVyU3BlY2lmaWNhdGlvbiwgbGF5ZXJzOiBBcnJheTxzdHJpbmc+IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQaXRjaFNjYWxlRmFjdG9yOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXkpOiB7W3N0cmluZ106IEFycmF5PHsgZmVhdHVyZUluZGV4OiBudW1iZXIsIGZlYXR1cmU6IEdlb0pTT05GZWF0dXJlIH0+fSB7XG4gICAgICAgIGlmICghdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXggfHwgIXRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnJhd1RpbGVEYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5xdWVyeSh7XG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgY2FtZXJhUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICBwaXhlbFBvc01hdHJpeCxcbiAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgIHF1ZXJ5UGFkZGluZzogdGhpcy5xdWVyeVBhZGRpbmcgKiBtYXhQaXRjaFNjYWxlRmFjdG9yXG4gICAgICAgIH0sIGxheWVycywgc291cmNlRmVhdHVyZVN0YXRlKTtcbiAgICB9XG5cbiAgICBxdWVyeVNvdXJjZUZlYXR1cmVzKHJlc3VsdDogQXJyYXk8R2VvSlNPTkZlYXR1cmU+LCBwYXJhbXM6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMubGF0ZXN0RmVhdHVyZUluZGV4IHx8ICF0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHZ0TGF5ZXJzID0gdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBwYXJhbXMgPyBwYXJhbXMuc291cmNlTGF5ZXIgOiAnJztcbiAgICAgICAgY29uc3QgbGF5ZXIgPSB2dExheWVycy5fZ2VvanNvblRpbGVMYXllciB8fCB2dExheWVyc1tzb3VyY2VMYXllcl07XG5cbiAgICAgICAgaWYgKCFsYXllcikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGZlYXR1cmVGaWx0ZXIocGFyYW1zICYmIHBhcmFtcy5maWx0ZXIpO1xuICAgICAgICBjb25zdCB7eiwgeCwgeX0gPSB0aGlzLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGNvb3JkID0ge3osIHgsIHl9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBsYXllci5mZWF0dXJlKGkpO1xuICAgICAgICAgICAgaWYgKGZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLCBmZWF0dXJlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdlb2pzb25GZWF0dXJlID0gbmV3IEdlb0pTT05GZWF0dXJlKGZlYXR1cmUsIHosIHgsIHkpO1xuICAgICAgICAgICAgICAgIChnZW9qc29uRmVhdHVyZTogYW55KS50aWxlID0gY29vcmQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VvanNvbkZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJNYXNrKCkge1xuICAgICAgICBpZiAodGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zZWdtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXNrZWRCb3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMubWFza2VkQm91bmRzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hc2tlZEJvdW5kc0J1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXNrZWRJbmRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5tYXNrZWRJbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tYXNrZWRJbmRleEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldE1hc2sobWFzazogTWFzaywgY29udGV4dDogQ29udGV4dCkge1xuXG4gICAgICAgIC8vIGRvbid0IHJlZG8gYnVmZmVyIHdvcmsgaWYgdGhlIG1hc2sgaXMgdGhlIHNhbWU7XG4gICAgICAgIGlmIChkZWVwRXF1YWwodGhpcy5tYXNrLCBtYXNrKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMubWFzayA9IG1hc2s7XG4gICAgICAgIHRoaXMuY2xlYXJNYXNrKCk7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byByZW5kZXIgdGhlIGZ1bGwgdGlsZSwgYW5kIGtlZXBpbmcgdGhlIHNlZ21lbnRzL3ZlcnRpY2VzL2luZGljZXMgZW1wdHkgbWVhbnNcbiAgICAgICAgLy8gdXNpbmcgdGhlIGdsb2JhbCBzaGFyZWQgYnVmZmVycyBmb3IgY292ZXJpbmcgdGhlIGVudGlyZSB0aWxlLlxuICAgICAgICBpZiAoZGVlcEVxdWFsKG1hc2ssIHsnMCc6IHRydWV9KSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1hc2tlZEJvdW5kc0FycmF5ID0gbmV3IFJhc3RlckJvdW5kc0FycmF5KCk7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyYXkgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG5cbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzZWdtZW50IHNvIHRoYXQgd2Ugd2lsbCB1cGxvYWQgKGVtcHR5KSBidWZmZXJzIGV2ZW4gd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvXG4gICAgICAgIC8vIGRyYXcgZm9yIHRoaXMgdGlsZS5cbiAgICAgICAgdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCgwLCBtYXNrZWRCb3VuZHNBcnJheSwgaW5kZXhBcnJheSk7XG5cbiAgICAgICAgY29uc3QgbWFza0FycmF5ID0gT2JqZWN0LmtleXMobWFzayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFza0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBtYXNrQ29vcmQgPSBtYXNrWyttYXNrQXJyYXlbaV1dO1xuICAgICAgICAgICAgY29uc3QgdmVydGV4RXh0ZW50ID0gRVhURU5UID4+IG1hc2tDb29yZC56O1xuICAgICAgICAgICAgY29uc3QgdGxWZXJ0ZXggPSBuZXcgUG9pbnQobWFza0Nvb3JkLnggKiB2ZXJ0ZXhFeHRlbnQsIG1hc2tDb29yZC55ICogdmVydGV4RXh0ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGJyVmVydGV4ID0gbmV3IFBvaW50KHRsVmVydGV4LnggKyB2ZXJ0ZXhFeHRlbnQsIHRsVmVydGV4LnkgKyB2ZXJ0ZXhFeHRlbnQpO1xuXG4gICAgICAgICAgICAvLyBub3Qgc3VyZSB3aHkgZmxvdyBpcyBjb21wbGFpbmluZyBoZXJlIGJlY2F1c2UgaXQgZG9lc24ndCBjb21wbGFpbiBhdCBMNDAxXG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gKHRoaXMuc2VnbWVudHM6IGFueSkucHJlcGFyZVNlZ21lbnQoNCwgbWFza2VkQm91bmRzQXJyYXksIGluZGV4QXJyYXkpO1xuXG4gICAgICAgICAgICBtYXNrZWRCb3VuZHNBcnJheS5lbXBsYWNlQmFjayh0bFZlcnRleC54LCB0bFZlcnRleC55LCB0bFZlcnRleC54LCB0bFZlcnRleC55KTtcbiAgICAgICAgICAgIG1hc2tlZEJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKGJyVmVydGV4LngsIHRsVmVydGV4LnksIGJyVmVydGV4LngsIHRsVmVydGV4LnkpO1xuICAgICAgICAgICAgbWFza2VkQm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGxWZXJ0ZXgueCwgYnJWZXJ0ZXgueSwgdGxWZXJ0ZXgueCwgYnJWZXJ0ZXgueSk7XG4gICAgICAgICAgICBtYXNrZWRCb3VuZHNBcnJheS5lbXBsYWNlQmFjayhiclZlcnRleC54LCBiclZlcnRleC55LCBiclZlcnRleC54LCBiclZlcnRleC55KTtcblxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG4gICAgICAgICAgICAvLyAwLCAxLCAyXG4gICAgICAgICAgICAvLyAxLCAyLCAzXG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKG9mZnNldCwgb2Zmc2V0ICsgMSwgb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKG9mZnNldCArIDEsIG9mZnNldCArIDIsIG9mZnNldCArIDMpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFza2VkQm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIobWFza2VkQm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMubWFza2VkSW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKGluZGV4QXJyYXkpO1xuICAgIH1cblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnbG9hZGVkJyB8fCB0aGlzLnN0YXRlID09PSAncmVsb2FkaW5nJyB8fCB0aGlzLnN0YXRlID09PSAnZXhwaXJlZCc7XG4gICAgfVxuXG4gICAgcGF0dGVybnNMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlQXRsYXMgJiYgISFPYmplY3Qua2V5cyh0aGlzLmltYWdlQXRsYXMucGF0dGVyblBvc2l0aW9ucykubGVuZ3RoO1xuICAgIH1cblxuICAgIHNldEV4cGlyeURhdGEoZGF0YTogYW55KSB7XG4gICAgICAgIGNvbnN0IHByaW9yID0gdGhpcy5leHBpcmF0aW9uVGltZTtcblxuICAgICAgICBpZiAoZGF0YS5jYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZENDID0gcGFyc2VDYWNoZUNvbnRyb2woZGF0YS5jYWNoZUNvbnRyb2wpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZENDWydtYXgtYWdlJ10pIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBEYXRlLm5vdygpICsgcGFyc2VkQ0NbJ21heC1hZ2UnXSAqIDEwMDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5leHBpcmVzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoZGF0YS5leHBpcmVzKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBpc0V4cGlyZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUgPiBub3cpIHtcbiAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXByaW9yKSB7XG4gICAgICAgICAgICAgICAgaXNFeHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5leHBpcmF0aW9uVGltZSA8IHByaW9yKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwaXJpbmcgZGF0ZSBpcyBnb2luZyBiYWNrd2FyZHM6XG4gICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5leHBpcmF0aW9uVGltZSAtIHByaW9yO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkZWx0YSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgaXMgc2VydmluZyB0aGUgc2FtZSBleHBpcmVkIHJlc291cmNlIG92ZXIgYW5kIG92ZXI6IGZhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgICAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgZWl0aGVyIHRoZSBjbGllbnQgb3IgdGhlIHNlcnZlciBjbG9jayBpcyB3cm9uZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGludGVycG9sYXRlIGEgdmFsaWQgZXhwaXJhdGlvbiBkYXRlIChmcm9tIHRoZSBjbGllbnQgUE9WKVxuICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZpbmcgYSBtaW5pbXVtIHRpbWVvdXQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBub3cgKyBNYXRoLm1heChkZWx0YSwgQ0xPQ0tfU0tFV19SRVRSWV9USU1FT1VUKTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzRXhwaXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCsrO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnZXhwaXJlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRFeHBpcnlUaW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxMDAwICogKDEgPDwgTWF0aC5taW4odGhpcy5leHBpcmVkUmVxdWVzdENvdW50IC0gMSwgMzEpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWF4IHZhbHVlIGZvciBgc2V0VGltZW91dGAgaW1wbGVtZW50YXRpb25zIGlzIGEgMzIgYml0IGludGVnZXI7IGNhcCB0aGlzIGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuZXhwaXJhdGlvblRpbWUgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgTWF0aC5wb3coMiwgMzEpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGZWF0dXJlU3RhdGUoc3RhdGVzOiBMYXllckZlYXR1cmVTdGF0ZXMsIHBhaW50ZXI6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMubGF0ZXN0RmVhdHVyZUluZGV4IHx8XG4gICAgICAgICAgICAhdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgfHxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXRlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2dExheWVycyA9IHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LmxvYWRWVExheWVycygpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgLy8gQnVja2V0cyBhcmUgZ3JvdXBlZCBieSBjb21tb24gc291cmNlLWxheWVyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllcklkID0gYnVja2V0LmxheWVyc1swXVsnc291cmNlTGF5ZXInXSB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB2dExheWVyc1tzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVyU3RhdGVzID0gc3RhdGVzW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllciB8fCAhc291cmNlTGF5ZXJTdGF0ZXMgfHwgT2JqZWN0LmtleXMoc291cmNlTGF5ZXJTdGF0ZXMpLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGJ1Y2tldC51cGRhdGUoc291cmNlTGF5ZXJTdGF0ZXMsIHNvdXJjZUxheWVyLCB0aGlzLmltYWdlQXRsYXMgJiYgdGhpcy5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnMgfHwge30pO1xuICAgICAgICAgICAgaWYgKHBhaW50ZXIgJiYgcGFpbnRlci5zdHlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlQYWRkaW5nID0gTWF0aC5tYXgodGhpcy5xdWVyeVBhZGRpbmcsIHBhaW50ZXIuc3R5bGUuZ2V0TGF5ZXIoaWQpLnF1ZXJ5UmFkaXVzKGJ1Y2tldCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9sZGluZ0ZvckZhZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBzeW1ib2xGYWRlRmluaXNoZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsIHx8IHRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCA8IGJyb3dzZXIubm93KCk7XG4gICAgfVxuXG4gICAgY2xlYXJGYWRlSG9sZCgpIHtcbiAgICAgICAgdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHNldEhvbGREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCA9IGJyb3dzZXIubm93KCkgKyBkdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpbGU7XG4iLCJcbmV4cG9ydCBkZWZhdWx0IFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ21pbnpvb20nLCAnbWF4em9vbScsICdmaWx0ZXInLCAnbGF5b3V0J107XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBjaGVja01heEFuZ2xlO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIEFuY2hvciBmcm9tICcuL2FuY2hvcic7XG5cbi8qKlxuICogTGFiZWxzIHBsYWNlZCBhcm91bmQgcmVhbGx5IHNoYXJwIGFuZ2xlcyBhcmVuJ3QgcmVhZGFibGUuIENoZWNrIGlmIGFueVxuICogcGFydCBvZiB0aGUgcG90ZW50aWFsIGxhYmVsIGhhcyBhIGNvbWJpbmVkIGFuZ2xlIHRoYXQgaXMgdG9vIGJpZy5cbiAqXG4gKiBAcGFyYW0gbGluZVxuICogQHBhcmFtIGFuY2hvciBUaGUgcG9pbnQgb24gdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAqIEBwYXJhbSBsYWJlbExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBpbiBnZW9tZXRyeSB1bml0cy5cbiAqIEBwYXJhbSB3aW5kb3dTaXplIFRoZSBjaGVjayBmYWlscyBpZiB0aGUgY29tYmluZWQgYW5nbGVzIHdpdGhpbiBhIHBhcnQgb2YgdGhlIGxpbmUgdGhhdCBpcyBgd2luZG93U2l6ZWAgbG9uZyBpcyB0b28gYmlnLlxuICogQHBhcmFtIG1heEFuZ2xlIFRoZSBtYXhpbXVtIGNvbWJpbmVkIGFuZ2xlIHRoYXQgYW55IHdpbmRvdyBhbG9uZyB0aGUgbGFiZWwgaXMgYWxsb3dlZCB0byBoYXZlLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYmUgcGxhY2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja01heEFuZ2xlKGxpbmU6IEFycmF5PFBvaW50PiwgYW5jaG9yOiBBbmNob3IsIGxhYmVsTGVuZ3RoOiBudW1iZXIsIHdpbmRvd1NpemU6IG51bWJlciwgbWF4QW5nbGU6IG51bWJlcikge1xuXG4gICAgLy8gaG9yaXpvbnRhbCBsYWJlbHMgYWx3YXlzIHBhc3NcbiAgICBpZiAoYW5jaG9yLnNlZ21lbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG5cbiAgICBsZXQgcCA9IGFuY2hvcjtcbiAgICBsZXQgaW5kZXggPSBhbmNob3Iuc2VnbWVudCArIDE7XG4gICAgbGV0IGFuY2hvckRpc3RhbmNlID0gMDtcblxuICAgIC8vIG1vdmUgYmFja3dhcmRzIGFsb25nIHRoZSBsaW5lIHRvIHRoZSBmaXJzdCBzZWdtZW50IHRoZSBsYWJlbCBhcHBlYXJzIG9uXG4gICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlID4gLWxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICBpbmRleC0tO1xuXG4gICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgLT0gbGluZVtpbmRleF0uZGlzdChwKTtcbiAgICAgICAgcCA9IGxpbmVbaW5kZXhdO1xuICAgIH1cblxuICAgIGFuY2hvckRpc3RhbmNlICs9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcbiAgICBpbmRleCsrO1xuXG4gICAgLy8gc3RvcmUgcmVjZW50IGNvcm5lcnMgYW5kIHRoZWlyIHRvdGFsIGFuZ2xlIGRpZmZlcmVuY2VcbiAgICBjb25zdCByZWNlbnRDb3JuZXJzID0gW107XG4gICAgbGV0IHJlY2VudEFuZ2xlRGVsdGEgPSAwO1xuXG4gICAgLy8gbW92ZSBmb3J3YXJkcyBieSB0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBhbmQgY2hlY2sgYW5nbGVzIGFsb25nIHRoZSB3YXlcbiAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPCBsYWJlbExlbmd0aCAvIDIpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IGxpbmVbaW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGxpbmVbaW5kZXhdO1xuICAgICAgICBjb25zdCBuZXh0ID0gbGluZVtpbmRleCArIDFdO1xuXG4gICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgaWYgKCFuZXh0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGFuZ2xlRGVsdGEgPSBwcmV2LmFuZ2xlVG8oY3VycmVudCkgLSBjdXJyZW50LmFuZ2xlVG8obmV4dCk7XG4gICAgICAgIC8vIHJlc3RyaWN0IGFuZ2xlIHRvIC1waS4ucGkgcmFuZ2VcbiAgICAgICAgYW5nbGVEZWx0YSA9IE1hdGguYWJzKCgoYW5nbGVEZWx0YSArIDMgKiBNYXRoLlBJKSAlIChNYXRoLlBJICogMikpIC0gTWF0aC5QSSk7XG5cbiAgICAgICAgcmVjZW50Q29ybmVycy5wdXNoKHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBhbmNob3JEaXN0YW5jZSxcbiAgICAgICAgICAgIGFuZ2xlRGVsdGFcbiAgICAgICAgfSk7XG4gICAgICAgIHJlY2VudEFuZ2xlRGVsdGEgKz0gYW5nbGVEZWx0YTtcblxuICAgICAgICAvLyByZW1vdmUgY29ybmVycyB0aGF0IGFyZSBmYXIgZW5vdWdoIGF3YXkgZnJvbSB0aGUgbGlzdCBvZiByZWNlbnQgYW5jaG9yc1xuICAgICAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgLSByZWNlbnRDb3JuZXJzWzBdLmRpc3RhbmNlID4gd2luZG93U2l6ZSkge1xuICAgICAgICAgICAgcmVjZW50QW5nbGVEZWx0YSAtPSByZWNlbnRDb3JuZXJzLnNoaWZ0KCkuYW5nbGVEZWx0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBzdW0gb2YgYW5nbGVzIHdpdGhpbiB0aGUgd2luZG93IGFyZWEgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlLiBjaGVjayBmYWlscy5cbiAgICAgICAgaWYgKHJlY2VudEFuZ2xlRGVsdGEgPiBtYXhBbmdsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGFuY2hvckRpc3RhbmNlICs9IGN1cnJlbnQuZGlzdChuZXh0KTtcbiAgICB9XG5cbiAgICAvLyBubyBwYXJ0IG9mIHRoZSBsaW5lIGhhZCBhbiBhbmdsZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZC4gY2hlY2sgcGFzc2VzLlxuICAgIHJldHVybiB0cnVlO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgbnVtYmVyIGFzIGludGVycG9sYXRlIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcblxuaW1wb3J0IEFuY2hvciBmcm9tICcuLi9zeW1ib2wvYW5jaG9yJztcbmltcG9ydCBjaGVja01heEFuZ2xlIGZyb20gJy4vY2hlY2tfbWF4X2FuZ2xlJztcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7U2hhcGluZywgUG9zaXRpb25lZEljb259IGZyb20gJy4vc2hhcGluZyc7XG5cbmV4cG9ydCB7IGdldEFuY2hvcnMsIGdldENlbnRlckFuY2hvciB9O1xuXG5mdW5jdGlvbiBnZXRMaW5lTGVuZ3RoKGxpbmU6IEFycmF5PFBvaW50Pik6IG51bWJlciB7XG4gICAgbGV0IGxpbmVMZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZS5sZW5ndGggLSAxOyBrKyspIHtcbiAgICAgICAgbGluZUxlbmd0aCArPSBsaW5lW2tdLmRpc3QobGluZVtrICsgMV0pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZUxlbmd0aDtcbn1cblxuZnVuY3Rpb24gZ2V0QW5nbGVXaW5kb3dTaXplKHNoYXBlZFRleHQ6ID9TaGFwaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoU2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveFNjYWxlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBzaGFwZWRUZXh0ID9cbiAgICAgICAgMyAvIDUgKiBnbHlwaFNpemUgKiBib3hTY2FsZSA6XG4gICAgICAgIDA7XG59XG5cbmZ1bmN0aW9uIGdldFNoYXBlZExhYmVsTGVuZ3RoKHNoYXBlZFRleHQ6ID9TaGFwaW5nLCBzaGFwZWRJY29uOiA/UG9zaXRpb25lZEljb24pOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgICAgc2hhcGVkVGV4dCA/IHNoYXBlZFRleHQucmlnaHQgLSBzaGFwZWRUZXh0LmxlZnQgOiAwLFxuICAgICAgICBzaGFwZWRJY29uID8gc2hhcGVkSWNvbi5yaWdodCAtIHNoYXBlZEljb24ubGVmdCA6IDApO1xufVxuXG5mdW5jdGlvbiBnZXRDZW50ZXJBbmNob3IobGluZTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgIG1heEFuZ2xlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dDogP1NoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogP1Bvc2l0aW9uZWRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoU2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGJveFNjYWxlOiBudW1iZXIpIHtcbiAgICBjb25zdCBhbmdsZVdpbmRvd1NpemUgPSBnZXRBbmdsZVdpbmRvd1NpemUoc2hhcGVkVGV4dCwgZ2x5cGhTaXplLCBib3hTY2FsZSk7XG4gICAgY29uc3QgbGFiZWxMZW5ndGggPSBnZXRTaGFwZWRMYWJlbExlbmd0aChzaGFwZWRUZXh0LCBzaGFwZWRJY29uKSAqIGJveFNjYWxlO1xuXG4gICAgbGV0IHByZXZEaXN0YW5jZSA9IDA7XG4gICAgY29uc3QgY2VudGVyRGlzdGFuY2UgPSBnZXRMaW5lTGVuZ3RoKGxpbmUpIC8gMjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspIHtcblxuICAgICAgICBjb25zdCBhID0gbGluZVtpXSxcbiAgICAgICAgICAgIGIgPSBsaW5lW2kgKyAxXTtcblxuICAgICAgICBjb25zdCBzZWdtZW50RGlzdGFuY2UgPSBhLmRpc3QoYik7XG5cbiAgICAgICAgaWYgKHByZXZEaXN0YW5jZSArIHNlZ21lbnREaXN0YW5jZSA+IGNlbnRlckRpc3RhbmNlKSB7XG4gICAgICAgICAgICAvLyBUaGUgY2VudGVyIGlzIG9uIHRoaXMgc2VnbWVudFxuICAgICAgICAgICAgY29uc3QgdCA9IChjZW50ZXJEaXN0YW5jZSAtIHByZXZEaXN0YW5jZSkgLyBzZWdtZW50RGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgeCA9IGludGVycG9sYXRlKGEueCwgYi54LCB0KSxcbiAgICAgICAgICAgICAgICB5ID0gaW50ZXJwb2xhdGUoYS55LCBiLnksIHQpO1xuXG4gICAgICAgICAgICBjb25zdCBhbmNob3IgPSBuZXcgQW5jaG9yKHgsIHksIGIuYW5nbGVUbyhhKSwgaSk7XG4gICAgICAgICAgICBhbmNob3IuX3JvdW5kKCk7XG4gICAgICAgICAgICBpZiAoIWFuZ2xlV2luZG93U2l6ZSB8fCBjaGVja01heEFuZ2xlKGxpbmUsIGFuY2hvciwgbGFiZWxMZW5ndGgsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuY2hvcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHJldkRpc3RhbmNlICs9IHNlZ21lbnREaXN0YW5jZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEFuY2hvcnMobGluZTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIG1heEFuZ2xlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHQ6ID9TaGFwaW5nLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRJY29uOiA/UG9zaXRpb25lZEljb24sXG4gICAgICAgICAgICAgICAgICAgIGdseXBoU2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBib3hTY2FsZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBvdmVyc2NhbGluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB0aWxlRXh0ZW50OiBudW1iZXIpIHtcblxuICAgIC8vIFJlc2FtcGxlIGEgbGluZSB0byBnZXQgYW5jaG9yIHBvaW50cyBmb3IgbGFiZWxzIGFuZCBjaGVjayB0aGF0IGVhY2hcbiAgICAvLyBwb3RlbnRpYWwgbGFiZWwgcGFzc2VzIHRleHQtbWF4LWFuZ2xlIGNoZWNrIGFuZCBoYXMgZW5vdWdoIGZyb29tIHRvIGZpdFxuICAgIC8vIG9uIHRoZSBsaW5lLlxuXG4gICAgY29uc3QgYW5nbGVXaW5kb3dTaXplID0gZ2V0QW5nbGVXaW5kb3dTaXplKHNoYXBlZFRleHQsIGdseXBoU2l6ZSwgYm94U2NhbGUpO1xuICAgIGNvbnN0IHNoYXBlZExhYmVsTGVuZ3RoID0gZ2V0U2hhcGVkTGFiZWxMZW5ndGgoc2hhcGVkVGV4dCwgc2hhcGVkSWNvbik7XG4gICAgY29uc3QgbGFiZWxMZW5ndGggPSBzaGFwZWRMYWJlbExlbmd0aCAqIGJveFNjYWxlO1xuXG4gICAgLy8gSXMgdGhlIGxpbmUgY29udGludWVkIGZyb20gb3V0c2lkZSB0aGUgdGlsZSBib3VuZGFyeT9cbiAgICBjb25zdCBpc0xpbmVDb250aW51ZWQgPSBsaW5lWzBdLnggPT09IDAgfHwgbGluZVswXS54ID09PSB0aWxlRXh0ZW50IHx8IGxpbmVbMF0ueSA9PT0gMCB8fCBsaW5lWzBdLnkgPT09IHRpbGVFeHRlbnQ7XG5cbiAgICAvLyBJcyB0aGUgbGFiZWwgbG9uZywgcmVsYXRpdmUgdG8gdGhlIHNwYWNpbmc/XG4gICAgLy8gSWYgc28sIGFkanVzdCB0aGUgc3BhY2luZyBzbyB0aGVyZSBpcyBhbHdheXMgYSBtaW5pbXVtIHNwYWNlIG9mIGBzcGFjaW5nIC8gNGAgYmV0d2VlbiBsYWJlbCBlZGdlcy5cbiAgICBpZiAoc3BhY2luZyAtIGxhYmVsTGVuZ3RoIDwgc3BhY2luZyAvIDQpIHtcbiAgICAgICAgc3BhY2luZyA9IGxhYmVsTGVuZ3RoICsgc3BhY2luZyAvIDQ7XG4gICAgfVxuXG4gICAgLy8gT2Zmc2V0IHRoZSBmaXJzdCBhbmNob3IgYnk6XG4gICAgLy8gRWl0aGVyIGhhbGYgdGhlIGxhYmVsIGxlbmd0aCBwbHVzIGEgZml4ZWQgZXh0cmEgb2Zmc2V0IGlmIHRoZSBsaW5lIGlzIG5vdCBjb250aW51ZWRcbiAgICAvLyBPciBoYWxmIHRoZSBzcGFjaW5nIGlmIHRoZSBsaW5lIGlzIGNvbnRpbnVlZC5cblxuICAgIC8vIEZvciBub24tY29udGludWVkIGxpbmVzLCBhZGQgYSBiaXQgb2YgZml4ZWQgZXh0cmEgb2Zmc2V0IHRvIGF2b2lkIGNvbGxpc2lvbnMgYXQgVCBpbnRlcnNlY3Rpb25zLlxuICAgIGNvbnN0IGZpeGVkRXh0cmFPZmZzZXQgPSBnbHlwaFNpemUgKiAyO1xuXG4gICAgY29uc3Qgb2Zmc2V0ID0gIWlzTGluZUNvbnRpbnVlZCA/XG4gICAgICAgICgoc2hhcGVkTGFiZWxMZW5ndGggLyAyICsgZml4ZWRFeHRyYU9mZnNldCkgKiBib3hTY2FsZSAqIG92ZXJzY2FsaW5nKSAlIHNwYWNpbmcgOlxuICAgICAgICAoc3BhY2luZyAvIDIgKiBvdmVyc2NhbGluZykgJSBzcGFjaW5nO1xuXG4gICAgcmV0dXJuIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGlzTGluZUNvbnRpbnVlZCwgZmFsc2UsIHRpbGVFeHRlbnQpO1xufVxuXG5mdW5jdGlvbiByZXNhbXBsZShsaW5lLCBvZmZzZXQsIHNwYWNpbmcsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUsIGxhYmVsTGVuZ3RoLCBpc0xpbmVDb250aW51ZWQsIHBsYWNlQXRNaWRkbGUsIHRpbGVFeHRlbnQpIHtcblxuICAgIGNvbnN0IGhhbGZMYWJlbExlbmd0aCA9IGxhYmVsTGVuZ3RoIC8gMjtcbiAgICBjb25zdCBsaW5lTGVuZ3RoID0gZ2V0TGluZUxlbmd0aChsaW5lKTtcblxuICAgIGxldCBkaXN0YW5jZSA9IDAsXG4gICAgICAgIG1hcmtlZERpc3RhbmNlID0gb2Zmc2V0IC0gc3BhY2luZztcblxuICAgIGxldCBhbmNob3JzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG5cbiAgICAgICAgY29uc3QgYSA9IGxpbmVbaV0sXG4gICAgICAgICAgICBiID0gbGluZVtpICsgMV07XG5cbiAgICAgICAgY29uc3Qgc2VnbWVudERpc3QgPSBhLmRpc3QoYiksXG4gICAgICAgICAgICBhbmdsZSA9IGIuYW5nbGVUbyhhKTtcblxuICAgICAgICB3aGlsZSAobWFya2VkRGlzdGFuY2UgKyBzcGFjaW5nIDwgZGlzdGFuY2UgKyBzZWdtZW50RGlzdCkge1xuICAgICAgICAgICAgbWFya2VkRGlzdGFuY2UgKz0gc3BhY2luZztcblxuICAgICAgICAgICAgY29uc3QgdCA9IChtYXJrZWREaXN0YW5jZSAtIGRpc3RhbmNlKSAvIHNlZ21lbnREaXN0LFxuICAgICAgICAgICAgICAgIHggPSBpbnRlcnBvbGF0ZShhLngsIGIueCwgdCksXG4gICAgICAgICAgICAgICAgeSA9IGludGVycG9sYXRlKGEueSwgYi55LCB0KTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcG9pbnQgaXMgd2l0aGluIHRoZSB0aWxlIGJvdW5kYXJpZXMgYW5kIHRoYXRcbiAgICAgICAgICAgIC8vIHRoZSBsYWJlbCB3b3VsZCBmaXQgYmVmb3JlIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgbGluZVxuICAgICAgICAgICAgLy8gaWYgcGxhY2VkIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICBpZiAoeCA+PSAwICYmIHggPCB0aWxlRXh0ZW50ICYmIHkgPj0gMCAmJiB5IDwgdGlsZUV4dGVudCAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZWREaXN0YW5jZSAtIGhhbGZMYWJlbExlbmd0aCA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZERpc3RhbmNlICsgaGFsZkxhYmVsTGVuZ3RoIDw9IGxpbmVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSBuZXcgQW5jaG9yKHgsIHksIGFuZ2xlLCBpKTtcbiAgICAgICAgICAgICAgICBhbmNob3IuX3JvdW5kKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFuZ2xlV2luZG93U2l6ZSB8fCBjaGVja01heEFuZ2xlKGxpbmUsIGFuY2hvciwgbGFiZWxMZW5ndGgsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaChhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3RhbmNlICs9IHNlZ21lbnREaXN0O1xuICAgIH1cblxuICAgIGlmICghcGxhY2VBdE1pZGRsZSAmJiAhYW5jaG9ycy5sZW5ndGggJiYgIWlzTGluZUNvbnRpbnVlZCkge1xuICAgICAgICAvLyBUaGUgZmlyc3QgYXR0ZW1wdCBhdCBmaW5kaW5nIGFuY2hvcnMgYXQgd2hpY2ggbGFiZWxzIGNhbiBiZSBwbGFjZWQgZmFpbGVkLlxuICAgICAgICAvLyBUcnkgYWdhaW4sIGJ1dCB0aGlzIHRpbWUganVzdCB0cnkgcGxhY2luZyBvbmUgYW5jaG9yIGF0IHRoZSBtaWRkbGUgb2YgdGhlIGxpbmUuXG4gICAgICAgIC8vIFRoaXMgaGFzIHRoZSBtb3N0IGVmZmVjdCBmb3Igc2hvcnQgbGluZXMgaW4gb3ZlcnNjYWxlZCB0aWxlcywgc2luY2UgdGhlXG4gICAgICAgIC8vIGluaXRpYWwgb2Zmc2V0IHVzZWQgaW4gb3ZlcnNjYWxlZCB0aWxlcyBpcyBjYWxjdWxhdGVkIHRvIGFsaWduIGxhYmVscyB3aXRoIHBvc2l0aW9ucyBpblxuICAgICAgICAvLyBwYXJlbnQgdGlsZXMgaW5zdGVhZCBvZiBwbGFjaW5nIHRoZSBsYWJlbCBhcyBjbG9zZSB0byB0aGUgYmVnaW5uaW5nIGFzIHBvc3NpYmxlLlxuICAgICAgICBhbmNob3JzID0gcmVzYW1wbGUobGluZSwgZGlzdGFuY2UgLyAyLCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCB0cnVlLCB0aWxlRXh0ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jaG9ycztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xpcExpbmU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFydCBvZiBhIG11bHRpbGluZSB0aGF0IGludGVyc2VjdHMgd2l0aCB0aGUgcHJvdmlkZWQgcmVjdGFuZ3VsYXIgYm94LlxuICpcbiAqIEBwYXJhbSBsaW5lc1xuICogQHBhcmFtIHgxIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGJveFxuICogQHBhcmFtIHkxIHRoZSB0b3AgZWRnZSBvZiB0aGUgYm94XG4gKiBAcGFyYW0geDIgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGJveFxuICogQHBhcmFtIHkyIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgYm94XG4gKiBAcmV0dXJucyBsaW5lc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xpcExpbmUobGluZXM6IEFycmF5PEFycmF5PFBvaW50Pj4sIHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpOiBBcnJheTxBcnJheTxQb2ludD4+IHtcbiAgICBjb25zdCBjbGlwcGVkTGluZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgbGluZXMubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2xdO1xuICAgICAgICBsZXQgY2xpcHBlZExpbmU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgbGV0IHAwID0gbGluZVtpXTtcbiAgICAgICAgICAgIGxldCBwMSA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgICAgICBpZiAocDAueCA8IHgxICYmIHAxLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludCh4MSwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgxIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHgxLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDEgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnkgPCB5MSAmJiBwMS55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkxIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTEpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTEgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC54ID49IHgyICYmIHAxLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHgyLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDIgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHgyLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDIgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnkgPj0geTIgJiYgcDEueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkyIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTIpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkyIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTIpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNsaXBwZWRMaW5lIHx8ICFwMC5lcXVhbHMoY2xpcHBlZExpbmVbY2xpcHBlZExpbmUubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgY2xpcHBlZExpbmUgPSBbcDBdO1xuICAgICAgICAgICAgICAgIGNsaXBwZWRMaW5lcy5wdXNoKGNsaXBwZWRMaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xpcHBlZExpbmUucHVzaChwMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcHBlZExpbmVzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgeyBHTFlQSF9QQkZfQk9SREVSIH0gZnJvbSAnLi4vc3R5bGUvcGFyc2VfZ2x5cGhfcGJmJztcblxuaW1wb3J0IHR5cGUgQW5jaG9yIGZyb20gJy4vYW5jaG9yJztcbmltcG9ydCB0eXBlIHtQb3NpdGlvbmVkSWNvbiwgU2hhcGluZ30gZnJvbSAnLi9zaGFwaW5nJztcbmltcG9ydCB0eXBlIFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0dseXBoUG9zaXRpb259IGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcyc7XG5pbXBvcnQgT05FX0VNIGZyb20gJy4vb25lX2VtJztcblxuLyoqXG4gKiBBIHRleHR1cmVkIHF1YWQgZm9yIHJlbmRlcmluZyBhIHNpbmdsZSBpY29uIG9yIGdseXBoLlxuICpcbiAqIFRoZSB6b29tIHJhbmdlIHRoZSBnbHlwaCBjYW4gYmUgc2hvd24gaXMgZGVmaW5lZCBieSBtaW5TY2FsZSBhbmQgbWF4U2NhbGUuXG4gKlxuICogQHBhcmFtIHRsIFRoZSBvZmZzZXQgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0gdHIgVGhlIG9mZnNldCBvZiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0gYmwgVGhlIG9mZnNldCBvZiB0aGUgYm90dG9tIGxlZnQgY29ybmVyIGZyb20gdGhlIGFuY2hvci5cbiAqIEBwYXJhbSBiciBUaGUgb2Zmc2V0IG9mIHRoZSBib3R0b20gcmlnaHQgY29ybmVyIGZyb20gdGhlIGFuY2hvci5cbiAqIEBwYXJhbSB0ZXggVGhlIHRleHR1cmUgY29vcmRpbmF0ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IHR5cGUgU3ltYm9sUXVhZCA9IHtcbiAgICB0bDogUG9pbnQsXG4gICAgdHI6IFBvaW50LFxuICAgIGJsOiBQb2ludCxcbiAgICBicjogUG9pbnQsXG4gICAgdGV4OiB7XG4gICAgICAgIHg6IG51bWJlcixcbiAgICAgICAgeTogbnVtYmVyLFxuICAgICAgICB3OiBudW1iZXIsXG4gICAgICAgIGg6IG51bWJlclxuICAgIH0sXG4gICAgd3JpdGluZ01vZGU6IGFueSB8IHZvaWQsXG4gICAgZ2x5cGhPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgc2VjdGlvbkluZGV4OiBudW1iZXJcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYW4gaWNvbi5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJY29uUXVhZHMoYW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24sXG4gICAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgYWxvbmdMaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHQ6IFNoYXBpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IEZlYXR1cmUpOiBBcnJheTxTeW1ib2xRdWFkPiB7XG4gICAgY29uc3QgaW1hZ2UgPSBzaGFwZWRJY29uLmltYWdlO1xuICAgIGNvbnN0IGxheW91dCA9IGxheWVyLmxheW91dDtcblxuICAgIC8vIElmIHlvdSBoYXZlIGEgMTBweCBpY29uIHRoYXQgaXNuJ3QgcGVyZmVjdGx5IGFsaWduZWQgdG8gdGhlIHBpeGVsIGdyaWQgaXQgd2lsbCBjb3ZlciAxMSBhY3R1YWxcbiAgICAvLyBwaXhlbHMuIFRoZSBxdWFkIG5lZWRzIHRvIGJlIHBhZGRlZCB0byBhY2NvdW50IGZvciB0aGlzLCBvdGhlcndpc2UgdGhleSdsbCBsb29rIHNsaWdodGx5IGNsaXBwZWRcbiAgICAvLyBvbiBvbmUgZWRnZSBpbiBzb21lIGNhc2VzLlxuICAgIGNvbnN0IGJvcmRlciA9IDE7XG5cbiAgICBjb25zdCB0b3AgPSBzaGFwZWRJY29uLnRvcCAtIGJvcmRlciAvIGltYWdlLnBpeGVsUmF0aW87XG4gICAgY29uc3QgbGVmdCA9IHNoYXBlZEljb24ubGVmdCAtIGJvcmRlciAvIGltYWdlLnBpeGVsUmF0aW87XG4gICAgY29uc3QgYm90dG9tID0gc2hhcGVkSWNvbi5ib3R0b20gKyBib3JkZXIgLyBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGNvbnN0IHJpZ2h0ID0gc2hhcGVkSWNvbi5yaWdodCArIGJvcmRlciAvIGltYWdlLnBpeGVsUmF0aW87XG4gICAgbGV0IHRsLCB0ciwgYnIsIGJsO1xuXG4gICAgLy8gdGV4dC1maXQgbW9kZVxuICAgIGlmIChsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgIT09ICdub25lJyAmJiBzaGFwZWRUZXh0KSB7XG4gICAgICAgIGNvbnN0IGljb25XaWR0aCA9IChyaWdodCAtIGxlZnQpLFxuICAgICAgICAgICAgaWNvbkhlaWdodCA9IChib3R0b20gLSB0b3ApLFxuICAgICAgICAgICAgc2l6ZSA9IGxheW91dC5nZXQoJ3RleHQtc2l6ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KSAvIDI0LFxuICAgICAgICAgICAgdGV4dExlZnQgPSBzaGFwZWRUZXh0LmxlZnQgKiBzaXplLFxuICAgICAgICAgICAgdGV4dFJpZ2h0ID0gc2hhcGVkVGV4dC5yaWdodCAqIHNpemUsXG4gICAgICAgICAgICB0ZXh0VG9wID0gc2hhcGVkVGV4dC50b3AgKiBzaXplLFxuICAgICAgICAgICAgdGV4dEJvdHRvbSA9IHNoYXBlZFRleHQuYm90dG9tICogc2l6ZSxcbiAgICAgICAgICAgIHRleHRXaWR0aCA9IHRleHRSaWdodCAtIHRleHRMZWZ0LFxuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHRleHRCb3R0b20gLSB0ZXh0VG9wLFxuICAgICAgICAgICAgcGFkVCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpWzBdLFxuICAgICAgICAgICAgcGFkUiA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpWzFdLFxuICAgICAgICAgICAgcGFkQiA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpWzJdLFxuICAgICAgICAgICAgcGFkTCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpWzNdLFxuICAgICAgICAgICAgb2Zmc2V0WSA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ3dpZHRoJyA/ICh0ZXh0SGVpZ2h0IC0gaWNvbkhlaWdodCkgKiAwLjUgOiAwLFxuICAgICAgICAgICAgb2Zmc2V0WCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ2hlaWdodCcgPyAodGV4dFdpZHRoIC0gaWNvbldpZHRoKSAqIDAuNSA6IDAsXG4gICAgICAgICAgICB3aWR0aCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ3dpZHRoJyB8fCBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgPT09ICdib3RoJyA/IHRleHRXaWR0aCA6IGljb25XaWR0aCxcbiAgICAgICAgICAgIGhlaWdodCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ2hlaWdodCcgfHwgbGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpID09PSAnYm90aCcgPyB0ZXh0SGVpZ2h0IDogaWNvbkhlaWdodDtcbiAgICAgICAgdGwgPSBuZXcgUG9pbnQodGV4dExlZnQgKyBvZmZzZXRYIC0gcGFkTCwgICAgICAgICB0ZXh0VG9wICsgb2Zmc2V0WSAtIHBhZFQpO1xuICAgICAgICB0ciA9IG5ldyBQb2ludCh0ZXh0TGVmdCArIG9mZnNldFggKyBwYWRSICsgd2lkdGgsIHRleHRUb3AgKyBvZmZzZXRZIC0gcGFkVCk7XG4gICAgICAgIGJyID0gbmV3IFBvaW50KHRleHRMZWZ0ICsgb2Zmc2V0WCArIHBhZFIgKyB3aWR0aCwgdGV4dFRvcCArIG9mZnNldFkgKyBwYWRCICsgaGVpZ2h0KTtcbiAgICAgICAgYmwgPSBuZXcgUG9pbnQodGV4dExlZnQgKyBvZmZzZXRYIC0gcGFkTCwgICAgICAgICB0ZXh0VG9wICsgb2Zmc2V0WSArIHBhZEIgKyBoZWlnaHQpO1xuICAgIC8vIE5vcm1hbCBpY29uIHNpemUgbW9kZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRsID0gbmV3IFBvaW50KGxlZnQsIHRvcCk7XG4gICAgICAgIHRyID0gbmV3IFBvaW50KHJpZ2h0LCB0b3ApO1xuICAgICAgICBiciA9IG5ldyBQb2ludChyaWdodCwgYm90dG9tKTtcbiAgICAgICAgYmwgPSBuZXcgUG9pbnQobGVmdCwgYm90dG9tKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbmdsZSA9IGxheWVyLmxheW91dC5nZXQoJ2ljb24tcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSwge30pICogTWF0aC5QSSAvIDE4MDtcblxuICAgIGlmIChhbmdsZSkge1xuICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgdGwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgdHIuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgYmwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgYnIuX21hdE11bHQobWF0cml4KTtcbiAgICB9XG5cbiAgICAvLyBJY29uIHF1YWQgaXMgcGFkZGVkLCBzbyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFsc28gbmVlZCB0byBiZSBwYWRkZWQuXG4gICAgcmV0dXJuIFt7dGwsIHRyLCBibCwgYnIsIHRleDogaW1hZ2UucGFkZGVkUmVjdCwgd3JpdGluZ01vZGU6IHVuZGVmaW5lZCwgZ2x5cGhPZmZzZXQ6IFswLCAwXSwgc2VjdGlvbkluZGV4OiAwfV07XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYSB0ZXh0IGxhYmVsLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdseXBoUXVhZHMoYW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgIHNoYXBpbmc6IFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgICAgIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLFxuICAgICAgICAgICAgICAgICAgICAgICBhbG9uZ0xpbmU6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uczoge1tzdHJpbmddOiB7W251bWJlcl06IEdseXBoUG9zaXRpb259fSxcbiAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbik6IEFycmF5PFN5bWJvbFF1YWQ+IHtcblxuICAgIGNvbnN0IHRleHRSb3RhdGUgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KSAqIE1hdGguUEkgLyAxODA7XG5cbiAgICBjb25zdCBwb3NpdGlvbmVkR2x5cGhzID0gc2hhcGluZy5wb3NpdGlvbmVkR2x5cGhzO1xuICAgIGNvbnN0IHF1YWRzID0gW107XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25lZEdseXBoID0gcG9zaXRpb25lZEdseXBoc1trXTtcbiAgICAgICAgY29uc3QgZ2x5cGhQb3NpdGlvbnMgPSBwb3NpdGlvbnNbcG9zaXRpb25lZEdseXBoLmZvbnRTdGFja107XG4gICAgICAgIGNvbnN0IGdseXBoID0gZ2x5cGhQb3NpdGlvbnMgJiYgZ2x5cGhQb3NpdGlvbnNbcG9zaXRpb25lZEdseXBoLmdseXBoXTtcbiAgICAgICAgaWYgKCFnbHlwaCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgcmVjdCA9IGdseXBoLnJlY3Q7XG4gICAgICAgIGlmICghcmVjdCkgY29udGludWU7XG5cbiAgICAgICAgLy8gVGhlIHJlY3RzIGhhdmUgYW4gYWRkZGl0aW9uYWwgYnVmZmVyIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZWlyIHNpemUuXG4gICAgICAgIGNvbnN0IGdseXBoUGFkZGluZyA9IDEuMDtcbiAgICAgICAgY29uc3QgcmVjdEJ1ZmZlciA9IEdMWVBIX1BCRl9CT1JERVIgKyBnbHlwaFBhZGRpbmc7XG5cbiAgICAgICAgY29uc3QgaGFsZkFkdmFuY2UgPSBnbHlwaC5tZXRyaWNzLmFkdmFuY2UgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLyAyO1xuXG4gICAgICAgIGNvbnN0IGdseXBoT2Zmc2V0ID0gYWxvbmdMaW5lID9cbiAgICAgICAgICAgIFtwb3NpdGlvbmVkR2x5cGgueCArIGhhbGZBZHZhbmNlLCBwb3NpdGlvbmVkR2x5cGgueV0gOlxuICAgICAgICAgICAgWzAsIDBdO1xuXG4gICAgICAgIGxldCBidWlsdEluT2Zmc2V0ID0gYWxvbmdMaW5lID9cbiAgICAgICAgICAgIFswLCAwXSA6XG4gICAgICAgICAgICBbcG9zaXRpb25lZEdseXBoLnggKyBoYWxmQWR2YW5jZSArIHRleHRPZmZzZXRbMF0sIHBvc2l0aW9uZWRHbHlwaC55ICsgdGV4dE9mZnNldFsxXV07XG5cbiAgICAgICAgY29uc3Qgcm90YXRlVmVydGljYWxHbHlwaCA9IChhbG9uZ0xpbmUgfHwgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCkgJiYgcG9zaXRpb25lZEdseXBoLnZlcnRpY2FsO1xuXG4gICAgICAgIGxldCB2ZXJ0aWNhbGl6ZWRMYWJlbE9mZnNldCA9IFswLCAwXTtcbiAgICAgICAgaWYgKHJvdGF0ZVZlcnRpY2FsR2x5cGgpIHtcbiAgICAgICAgICAgIC8vIFZlcnRpY2FsIFBPSSBsYWJlbHMgdGhhdCBhcmUgcm90YXRlZCA5MGRlZyBDVyBhbmQgd2hvc2UgZ2x5cGhzIG11c3QgcHJlc2VydmUgdXByaWdodCBvcmllbnRhdGlvblxuICAgICAgICAgICAgLy8gbmVlZCB0byBiZSByb3RhdGVkIDkwZGVnIENDVy4gQWZ0ZXIgYSBxdWFkIGlzIHJvdGF0ZWQsIGl0IGlzIHRyYW5zbGF0ZWQgdG8gdGhlIG9yaWdpbmFsIGJ1aWx0LWluIG9mZnNldC5cbiAgICAgICAgICAgIHZlcnRpY2FsaXplZExhYmVsT2Zmc2V0ID0gYnVpbHRJbk9mZnNldDtcbiAgICAgICAgICAgIGJ1aWx0SW5PZmZzZXQgPSBbMCwgMF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IChnbHlwaC5tZXRyaWNzLmxlZnQgLSByZWN0QnVmZmVyKSAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZSAtIGhhbGZBZHZhbmNlICsgYnVpbHRJbk9mZnNldFswXTtcbiAgICAgICAgY29uc3QgeTEgPSAoLWdseXBoLm1ldHJpY3MudG9wIC0gcmVjdEJ1ZmZlcikgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgKyBidWlsdEluT2Zmc2V0WzFdO1xuICAgICAgICBjb25zdCB4MiA9IHgxICsgcmVjdC53ICogcG9zaXRpb25lZEdseXBoLnNjYWxlO1xuICAgICAgICBjb25zdCB5MiA9IHkxICsgcmVjdC5oICogcG9zaXRpb25lZEdseXBoLnNjYWxlO1xuXG4gICAgICAgIGNvbnN0IHRsID0gbmV3IFBvaW50KHgxLCB5MSk7XG4gICAgICAgIGNvbnN0IHRyID0gbmV3IFBvaW50KHgyLCB5MSk7XG4gICAgICAgIGNvbnN0IGJsID0gbmV3IFBvaW50KHgxLCB5Mik7XG4gICAgICAgIGNvbnN0IGJyID0gbmV3IFBvaW50KHgyLCB5Mik7XG5cbiAgICAgICAgaWYgKHJvdGF0ZVZlcnRpY2FsR2x5cGgpIHtcbiAgICAgICAgICAgIC8vIFZlcnRpY2FsLXN1cHBvcnRpbmcgZ2x5cGhzIGFyZSBsYWlkIG91dCBpbiAyNHgyNCBwb2ludCBib3hlcyAoMSBzcXVhcmUgZW0pXG4gICAgICAgICAgICAvLyBJbiBob3Jpem9udGFsIG9yaWVudGF0aW9uLCB0aGUgeSB2YWx1ZXMgZm9yIGdseXBocyBhcmUgYmVsb3cgdGhlIG1pZGxpbmVcbiAgICAgICAgICAgIC8vIGFuZCB3ZSB1c2UgYSBcInlPZmZzZXRcIiBvZiAtMTcgdG8gcHVsbCB0aGVtIHVwIHRvIHRoZSBtaWRkbGUuXG4gICAgICAgICAgICAvLyBCeSByb3RhdGluZyBjb3VudGVyLWNsb2Nrd2lzZSBhcm91bmQgdGhlIHBvaW50IGF0IHRoZSBjZW50ZXIgb2YgdGhlIGxlZnRcbiAgICAgICAgICAgIC8vIGVkZ2Ugb2YgYSAyNHgyNCBsYXlvdXQgYm94IGNlbnRlcmVkIGJlbG93IHRoZSBtaWRsaW5lLCB3ZSBhbGlnbiB0aGUgY2VudGVyXG4gICAgICAgICAgICAvLyBvZiB0aGUgZ2x5cGhzIHdpdGggdGhlIGhvcml6b250YWwgbWlkbGluZSwgc28gdGhlIHlPZmZzZXQgaXMgbm8gbG9uZ2VyXG4gICAgICAgICAgICAvLyBuZWNlc3NhcnksIGJ1dCB3ZSBhbHNvIHB1bGwgdGhlIGdseXBoIHRvIHRoZSBsZWZ0IGFsb25nIHRoZSB4IGF4aXMuXG4gICAgICAgICAgICAvLyBUaGUgeSBjb29yZGluYXRlIGluY2x1ZGVzIGJhc2VsaW5lIHlPZmZzZXQsIHRodXMgbmVlZHMgdG8gYmUgYWNjb3VudGVkXG4gICAgICAgICAgICAvLyBmb3Igd2hlbiBnbHlwaCBpcyByb3RhdGVkIGFuZCB0cmFuc2xhdGVkLlxuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gbmV3IFBvaW50KC1oYWxmQWR2YW5jZSwgaGFsZkFkdmFuY2UgLSBzaGFwaW5nLnlPZmZzZXQpO1xuICAgICAgICAgICAgY29uc3QgdmVydGljYWxSb3RhdGlvbiA9IC1NYXRoLlBJIC8gMjtcblxuICAgICAgICAgICAgLy8geEhhbGZXaWRodE9mZnNldGNvcnJlY3Rpb24gaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gZnVsbC13aWR0aCBhbmQgaGFsZi13aWR0aFxuICAgICAgICAgICAgLy8gYWR2YW5jZSwgc2hvdWxkIGJlIDAgZm9yIGZ1bGwtd2lkdGggZ2x5cGhzIGFuZCB3aWxsIHB1bGwgdXAgaGFsZi13aWR0aCBnbHlwaHMuXG4gICAgICAgICAgICBjb25zdCB4SGFsZldpZGh0T2Zmc2V0Y29ycmVjdGlvbiA9IE9ORV9FTSAvIDIgLSBoYWxmQWR2YW5jZTtcbiAgICAgICAgICAgIGNvbnN0IHhPZmZzZXRDb3JyZWN0aW9uID0gbmV3IFBvaW50KDUgLSBzaGFwaW5nLnlPZmZzZXQgLSB4SGFsZldpZGh0T2Zmc2V0Y29ycmVjdGlvbiwgMCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbE9mZnNldENvcnJlY3Rpb24gPSBuZXcgUG9pbnQoLi4udmVydGljYWxpemVkTGFiZWxPZmZzZXQpO1xuICAgICAgICAgICAgdGwuX3JvdGF0ZUFyb3VuZCh2ZXJ0aWNhbFJvdGF0aW9uLCBjZW50ZXIpLl9hZGQoeE9mZnNldENvcnJlY3Rpb24pLl9hZGQodmVydGljYWxPZmZzZXRDb3JyZWN0aW9uKTtcbiAgICAgICAgICAgIHRyLl9yb3RhdGVBcm91bmQodmVydGljYWxSb3RhdGlvbiwgY2VudGVyKS5fYWRkKHhPZmZzZXRDb3JyZWN0aW9uKS5fYWRkKHZlcnRpY2FsT2Zmc2V0Q29ycmVjdGlvbik7XG4gICAgICAgICAgICBibC5fcm90YXRlQXJvdW5kKHZlcnRpY2FsUm90YXRpb24sIGNlbnRlcikuX2FkZCh4T2Zmc2V0Q29ycmVjdGlvbikuX2FkZCh2ZXJ0aWNhbE9mZnNldENvcnJlY3Rpb24pO1xuICAgICAgICAgICAgYnIuX3JvdGF0ZUFyb3VuZCh2ZXJ0aWNhbFJvdGF0aW9uLCBjZW50ZXIpLl9hZGQoeE9mZnNldENvcnJlY3Rpb24pLl9hZGQodmVydGljYWxPZmZzZXRDb3JyZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXh0Um90YXRlKSB7XG4gICAgICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbih0ZXh0Um90YXRlKSxcbiAgICAgICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyh0ZXh0Um90YXRlKSxcbiAgICAgICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgICAgIHRsLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgICAgICB0ci5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICAgICAgYmwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIGJyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICBxdWFkcy5wdXNoKHt0bCwgdHIsIGJsLCBiciwgdGV4OiByZWN0LCB3cml0aW5nTW9kZTogc2hhcGluZy53cml0aW5nTW9kZSwgZ2x5cGhPZmZzZXQsIHNlY3Rpb25JbmRleDogcG9zaXRpb25lZEdseXBoLnNlY3Rpb25JbmRleH0pO1xuICAgIH1cblxuICAgIHJldHVybiBxdWFkcztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBBbmNob3IgZnJvbSAnLi9hbmNob3InO1xuXG4vKipcbiAqIEEgQ29sbGlzaW9uRmVhdHVyZSByZXByZXNlbnRzIHRoZSBhcmVhIG9mIHRoZSB0aWxlIGNvdmVyZWQgYnkgYSBzaW5nbGUgbGFiZWwuXG4gKiBJdCBpcyB1c2VkIHdpdGggQ29sbGlzaW9uSW5kZXggdG8gY2hlY2sgaWYgdGhlIGxhYmVsIG92ZXJsYXBzIHdpdGggYW55XG4gKiBwcmV2aW91cyBsYWJlbHMuIEEgQ29sbGlzaW9uRmVhdHVyZSBpcyBtb3N0bHkganVzdCBhIHNldCBvZiBDb2xsaXNpb25Cb3hcbiAqIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29sbGlzaW9uRmVhdHVyZSB7XG4gICAgYm94U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGJveEVuZEluZGV4OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBDb2xsaXNpb25GZWF0dXJlLCBhZGRpbmcgaXRzIGNvbGxpc2lvbiBib3ggZGF0YSB0byB0aGUgZ2l2ZW4gY29sbGlzaW9uQm94QXJyYXkgaW4gdGhlIHByb2Nlc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgZ2VvbWV0cnkgdGhlIGxhYmVsIGlzIHBsYWNlZCBvbi5cbiAgICAgKiBAcGFyYW0gYW5jaG9yIFRoZSBwb2ludCBhbG9uZyB0aGUgbGluZSBhcm91bmQgd2hpY2ggdGhlIGxhYmVsIGlzIGFuY2hvcmVkLlxuICAgICAqIEBwYXJhbSBzaGFwZWQgVGhlIHRleHQgb3IgaWNvbiBzaGFwaW5nIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIHVzZWQgdG8gY29udmVydCBmcm9tIGdseXBoIG1ldHJpY3MgdW5pdHMgdG8gZ2VvbWV0cnkgdW5pdHMuXG4gICAgICogQHBhcmFtIHBhZGRpbmcgVGhlIGFtb3VudCBvZiBwYWRkaW5nIHRvIGFkZCBhcm91bmQgdGhlIGxhYmVsIGVkZ2VzLlxuICAgICAqIEBwYXJhbSBhbGlnbkxpbmUgV2hldGhlciB0aGUgbGFiZWwgaXMgYWxpZ25lZCB3aXRoIHRoZSBsaW5lIG9yIHRoZSB2aWV3cG9ydC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgbGluZTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgIGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHNoYXBlZDogT2JqZWN0LFxuICAgICAgICAgICAgICAgIGJveFNjYWxlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGFsaWduTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBvdmVyc2NhbGluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHJvdGF0ZTogbnVtYmVyKSB7XG4gICAgICAgIGxldCB5MSA9IHNoYXBlZC50b3AgKiBib3hTY2FsZSAtIHBhZGRpbmc7XG4gICAgICAgIGxldCB5MiA9IHNoYXBlZC5ib3R0b20gKiBib3hTY2FsZSArIHBhZGRpbmc7XG4gICAgICAgIGxldCB4MSA9IHNoYXBlZC5sZWZ0ICogYm94U2NhbGUgLSBwYWRkaW5nO1xuICAgICAgICBsZXQgeDIgPSBzaGFwZWQucmlnaHQgKiBib3hTY2FsZSArIHBhZGRpbmc7XG5cbiAgICAgICAgdGhpcy5ib3hTdGFydEluZGV4ID0gY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgICAgIGlmIChhbGlnbkxpbmUpIHtcblxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IHkyIC0geTE7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSB4MiAtIHgxO1xuXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNldCBtaW5pbXVtIGJveCBoZWlnaHQgdG8gYXZvaWQgdmVyeSBtYW55IHNtYWxsIGxhYmVsc1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KDEwICogYm94U2NhbGUsIGhlaWdodCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRMaW5lQ29sbGlzaW9uQ2lyY2xlcyhjb2xsaXNpb25Cb3hBcnJheSwgbGluZSwgYW5jaG9yLCAoYW5jaG9yLnNlZ21lbnQ6IGFueSksIGxlbmd0aCwgaGVpZ2h0LCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBvdmVyc2NhbGluZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyb3RhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBY2NvdW50IGZvciAqLXJvdGF0ZSBpbiBwb2ludCBjb2xsaXNpb24gYm94ZXNcbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzYwNzVcbiAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGFjY291bnQgZm9yIGljb24tdGV4dC1maXRcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRsID0gbmV3IFBvaW50KHgxLCB5MSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHIgPSBuZXcgUG9pbnQoeDIsIHkxKTtcbiAgICAgICAgICAgICAgICBjb25zdCBibCA9IG5ldyBQb2ludCh4MSwgeTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyID0gbmV3IFBvaW50KHgyLCB5Mik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVSYWRpYW5zID0gcm90YXRlICogTWF0aC5QSSAvIDE4MDtcblxuICAgICAgICAgICAgICAgIHRsLl9yb3RhdGUocm90YXRlUmFkaWFucyk7XG4gICAgICAgICAgICAgICAgdHIuX3JvdGF0ZShyb3RhdGVSYWRpYW5zKTtcbiAgICAgICAgICAgICAgICBibC5fcm90YXRlKHJvdGF0ZVJhZGlhbnMpO1xuICAgICAgICAgICAgICAgIGJyLl9yb3RhdGUocm90YXRlUmFkaWFucyk7XG5cbiAgICAgICAgICAgICAgICAvLyBDb2xsaXNpb24gZmVhdHVyZXMgcmVxdWlyZSBhbiBcIm9uLWF4aXNcIiBnZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAvLyBzbyB0YWtlIHRoZSBlbnZlbG9wZSBvZiB0aGUgcm90YXRlZCBnZW9tZXRyeVxuICAgICAgICAgICAgICAgIC8vIChtYXkgYmUgcXVpdGUgbGFyZ2UgZm9yIHdpZGUgbGFiZWxzIHJvdGF0ZWQgNDUgZGVncmVlcylcbiAgICAgICAgICAgICAgICB4MSA9IE1hdGgubWluKHRsLngsIHRyLngsIGJsLngsIGJyLngpO1xuICAgICAgICAgICAgICAgIHgyID0gTWF0aC5tYXgodGwueCwgdHIueCwgYmwueCwgYnIueCk7XG4gICAgICAgICAgICAgICAgeTEgPSBNYXRoLm1pbih0bC55LCB0ci55LCBibC55LCBici55KTtcbiAgICAgICAgICAgICAgICB5MiA9IE1hdGgubWF4KHRsLnksIHRyLnksIGJsLnksIGJyLnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXkuZW1wbGFjZUJhY2soYW5jaG9yLngsIGFuY2hvci55LCB4MSwgeTEsIHgyLCB5MiwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICAwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYm94RW5kSW5kZXggPSBjb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgc2V0IG9mIENvbGxpc2lvbkJveCBvYmplY3RzIGZvciBhIGxpbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWxMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgbGFiZWwgaW4gZ2VvbWV0cnkgdW5pdHMuXG4gICAgICogQHBhcmFtIGFuY2hvciBUaGUgcG9pbnQgYWxvbmcgdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAgICAgKiBAcGFyYW0gYm94U2l6ZSBUaGUgc2l6ZSBvZiB0aGUgY29sbGlzaW9uIGJveGVzIHRoYXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZExpbmVDb2xsaXNpb25DaXJjbGVzKGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxMZW5ndGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveFNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY2FsaW5nOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGJveFNpemUgLyAyO1xuICAgICAgICBjb25zdCBuQm94ZXMgPSBNYXRoLmZsb29yKGxhYmVsTGVuZ3RoIC8gc3RlcCkgfHwgMTtcbiAgICAgICAgLy8gV2UgY2FsY3VsYXRlIGxpbmUgY29sbGlzaW9uIGNpcmNsZXMgb3V0IHRvIDMwMCUgb2Ygd2hhdCB3b3VsZCBub3JtYWxseSBiZSBvdXJcbiAgICAgICAgLy8gbWF4IHNpemUsIHRvIGFsbG93IGNvbGxpc2lvbiBkZXRlY3Rpb24gdG8gd29yayBvbiBsYWJlbHMgdGhhdCBleHBhbmQgYXNcbiAgICAgICAgLy8gdGhleSBtb3ZlIGludG8gdGhlIGRpc3RhbmNlXG4gICAgICAgIC8vIFZlcnRpY2FsbHkgb3JpZW50ZWQgbGFiZWxzIGluIHRoZSBkaXN0YW50IGZpZWxkIGNhbiBleHRlbmQgcGFzdCB0aGlzIHBhZGRpbmdcbiAgICAgICAgLy8gVGhpcyBpcyBhIG5vdGljZWFibGUgcHJvYmxlbSBpbiBvdmVyc2NhbGVkIHRpbGVzIHdoZXJlIHRoZSBwaXRjaCAwLWJhc2VkXG4gICAgICAgIC8vIHN5bWJvbCBzcGFjaW5nIHdpbGwgcHV0IGxhYmVscyB2ZXJ5IGNsb3NlIHRvZ2V0aGVyIGluIGEgcGl0Y2hlZCBtYXAuXG4gICAgICAgIC8vIFRvIHJlZHVjZSB0aGUgY29zdCBvZiBhZGRpbmcgZXh0cmEgY29sbGlzaW9uIGNpcmNsZXMsIHdlIHNsb3dseSBpbmNyZWFzZVxuICAgICAgICAvLyB0aGVtIGZvciBvdmVyc2NhbGVkIHRpbGVzLlxuICAgICAgICBjb25zdCBvdmVyc2NhbGluZ1BhZGRpbmdGYWN0b3IgPSAxICsgLjQgKiBNYXRoLmxvZyhvdmVyc2NhbGluZykgLyBNYXRoLkxOMjtcbiAgICAgICAgY29uc3QgblBpdGNoUGFkZGluZ0JveGVzID0gTWF0aC5mbG9vcihuQm94ZXMgKiBvdmVyc2NhbGluZ1BhZGRpbmdGYWN0b3IgLyAyKTtcblxuICAgICAgICAvLyBvZmZzZXQgdGhlIGNlbnRlciBvZiB0aGUgZmlyc3QgYm94IGJ5IGhhbGYgYSBib3ggc28gdGhhdCB0aGUgZWRnZSBvZiB0aGVcbiAgICAgICAgLy8gYm94IGlzIGF0IHRoZSBlZGdlIG9mIHRoZSBsYWJlbC5cbiAgICAgICAgY29uc3QgZmlyc3RCb3hPZmZzZXQgPSAtYm94U2l6ZSAvIDI7XG5cbiAgICAgICAgbGV0IHAgPSBhbmNob3I7XG4gICAgICAgIGxldCBpbmRleCA9IHNlZ21lbnQgKyAxO1xuICAgICAgICBsZXQgYW5jaG9yRGlzdGFuY2UgPSBmaXJzdEJveE9mZnNldDtcbiAgICAgICAgY29uc3QgbGFiZWxTdGFydERpc3RhbmNlID0gLWxhYmVsTGVuZ3RoIC8gMjtcbiAgICAgICAgY29uc3QgcGFkZGluZ1N0YXJ0RGlzdGFuY2UgPSBsYWJlbFN0YXJ0RGlzdGFuY2UgLSBsYWJlbExlbmd0aCAvIDQ7XG4gICAgICAgIC8vIG1vdmUgYmFja3dhcmRzIGFsb25nIHRoZSBsaW5lIHRvIHRoZSBmaXJzdCBzZWdtZW50IHRoZSBsYWJlbCBhcHBlYXJzIG9uXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGluZGV4LS07XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yRGlzdGFuY2UgPiBsYWJlbFN0YXJ0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrTWF4QW5nbGUgc2hvdWxkIGhhdmUgYWxyZWFkeSBjYXVnaHQgdGhpc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgZG9lc24ndCBleHRlbmQgZmFyIGVub3VnaCBiYWNrIGZvciBhbGwgb2Ygb3VyIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBnb3QgZmFyIGVub3VnaCB0byBzaG93IHRoZSBsYWJlbCB1bmRlciBtb3N0IGNvbmRpdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmNob3JEaXN0YW5jZSAtPSBsaW5lW2luZGV4XS5kaXN0KHApO1xuICAgICAgICAgICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPiBwYWRkaW5nU3RhcnREaXN0YW5jZSk7XG5cbiAgICAgICAgbGV0IHNlZ21lbnRMZW5ndGggPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IC1uUGl0Y2hQYWRkaW5nQm94ZXM7IGkgPCBuQm94ZXMgKyBuUGl0Y2hQYWRkaW5nQm94ZXM7IGkrKykge1xuXG4gICAgICAgICAgICAvLyB0aGUgZGlzdGFuY2UgdGhlIGJveCB3aWxsIGJlIGZyb20gdGhlIGFuY2hvclxuICAgICAgICAgICAgY29uc3QgYm94T2Zmc2V0ID0gaSAqIHN0ZXA7XG4gICAgICAgICAgICBsZXQgYm94RGlzdGFuY2VUb0FuY2hvciA9IGxhYmVsU3RhcnREaXN0YW5jZSArIGJveE9mZnNldDtcblxuICAgICAgICAgICAgLy8gbWFrZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBwaXRjaCBwYWRkaW5nIGJveGVzIGJpZ2dlclxuICAgICAgICAgICAgaWYgKGJveE9mZnNldCA8IDApIGJveERpc3RhbmNlVG9BbmNob3IgKz0gYm94T2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGJveE9mZnNldCA+IGxhYmVsTGVuZ3RoKSBib3hEaXN0YW5jZVRvQW5jaG9yICs9IGJveE9mZnNldCAtIGxhYmVsTGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoYm94RGlzdGFuY2VUb0FuY2hvciA8IGFuY2hvckRpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgZG9lc24ndCBleHRlbmQgZmFyIGVub3VnaCBiYWNrIGZvciB0aGlzIGJveCwgc2tpcCBpdFxuICAgICAgICAgICAgICAgIC8vIChUaGlzIGNvdWxkIGFsbG93IGZvciBsaW5lIGNvbGxpc2lvbnMgb24gZGlzdGFudCB0aWxlcylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGJveCBpcyBub3Qgb24gdGhlIGN1cnJlbnQgc2VnbWVudC4gTW92ZSB0byB0aGUgbmV4dCBzZWdtZW50LlxuICAgICAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlICsgc2VnbWVudExlbmd0aCA8IGJveERpc3RhbmNlVG9BbmNob3IpIHtcbiAgICAgICAgICAgICAgICBhbmNob3JEaXN0YW5jZSArPSBzZWdtZW50TGVuZ3RoO1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpc24ndCBlbm91Z2ggcm9vbSBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxID49IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZWdtZW50TGVuZ3RoID0gbGluZVtpbmRleF0uZGlzdChsaW5lW2luZGV4ICsgMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgZGlzdGFuY2UgdGhlIGJveCB3aWxsIGJlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VnbWVudFxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudEJveERpc3RhbmNlID0gYm94RGlzdGFuY2VUb0FuY2hvciAtIGFuY2hvckRpc3RhbmNlO1xuXG4gICAgICAgICAgICBjb25zdCBwMCA9IGxpbmVbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgcDEgPSBsaW5lW2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBib3hBbmNob3JQb2ludCA9IHAxLnN1YihwMCkuX3VuaXQoKS5fbXVsdChzZWdtZW50Qm94RGlzdGFuY2UpLl9hZGQocDApLl9yb3VuZCgpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgYm94IGlzIHdpdGhpbiBib3hTaXplIG9mIHRoZSBhbmNob3IsIGZvcmNlIHRoZSBib3ggdG8gYmUgdXNlZFxuICAgICAgICAgICAgLy8gKHNvIGV2ZW4gMC13aWR0aCBsYWJlbHMgdXNlIGF0IGxlYXN0IG9uZSBib3gpXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSAuOCBtdWx0aXBsaWNhdGlvbiBnaXZlcyB1cyBhIGxpdHRsZSBiaXQgb2YgY29uc2VydmF0aXZlXG4gICAgICAgICAgICAvLyBwYWRkaW5nIGluIGNob29zaW5nIHdoaWNoIGJveGVzIHRvIHVzZSAoc2VlIENvbGxpc2lvbkluZGV4I3BsYWNlZENvbGxpc2lvbkNpcmNsZXMpXG4gICAgICAgICAgICBjb25zdCBwYWRkZWRBbmNob3JEaXN0YW5jZSA9IE1hdGguYWJzKGJveERpc3RhbmNlVG9BbmNob3IgLSBmaXJzdEJveE9mZnNldCkgPCBzdGVwID9cbiAgICAgICAgICAgICAgICAwIDpcbiAgICAgICAgICAgICAgICAoYm94RGlzdGFuY2VUb0FuY2hvciAtIGZpcnN0Qm94T2Zmc2V0KSAqIDAuODtcblxuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXkuZW1wbGFjZUJhY2soYm94QW5jaG9yUG9pbnQueCwgYm94QW5jaG9yUG9pbnQueSxcbiAgICAgICAgICAgICAgICAtYm94U2l6ZSAvIDIsIC1ib3hTaXplIC8gMiwgYm94U2l6ZSAvIDIsIGJveFNpemUgLyAyLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgYm94U2l6ZSAvIDIsIHBhZGRlZEFuY2hvckRpc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sbGlzaW9uRmVhdHVyZTtcbiIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVF1ZXVlIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhID0gW10sIGNvbXBhcmUgPSBkZWZhdWx0Q29tcGFyZSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9ICh0aGlzLmxlbmd0aCA+PiAxKSAtIDE7IGkgPj0gMDsgaS0tKSB0aGlzLl9kb3duKGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChpdGVtKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzLl91cCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHBvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuZGF0YVswXTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gdGhpcy5kYXRhLnBvcCgpO1xuICAgICAgICB0aGlzLmxlbmd0aC0tO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVswXSA9IGJvdHRvbTtcbiAgICAgICAgICAgIHRoaXMuX2Rvd24oMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9wO1xuICAgIH1cblxuICAgIHBlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbMF07XG4gICAgfVxuXG4gICAgX3VwKHBvcykge1xuICAgICAgICBjb25zdCB7ZGF0YSwgY29tcGFyZX0gPSB0aGlzO1xuICAgICAgICBjb25zdCBpdGVtID0gZGF0YVtwb3NdO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSAocG9zIC0gMSkgPj4gMTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkYXRhW3BhcmVudF07XG4gICAgICAgICAgICBpZiAoY29tcGFyZShpdGVtLCBjdXJyZW50KSA+PSAwKSBicmVhaztcbiAgICAgICAgICAgIGRhdGFbcG9zXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICBwb3MgPSBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW3Bvc10gPSBpdGVtO1xuICAgIH1cblxuICAgIF9kb3duKHBvcykge1xuICAgICAgICBjb25zdCB7ZGF0YSwgY29tcGFyZX0gPSB0aGlzO1xuICAgICAgICBjb25zdCBoYWxmTGVuZ3RoID0gdGhpcy5sZW5ndGggPj4gMTtcbiAgICAgICAgY29uc3QgaXRlbSA9IGRhdGFbcG9zXTtcblxuICAgICAgICB3aGlsZSAocG9zIDwgaGFsZkxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGxlZnQgPSAocG9zIDw8IDEpICsgMTtcbiAgICAgICAgICAgIGxldCBiZXN0ID0gZGF0YVtsZWZ0XTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbGVmdCArIDE7XG5cbiAgICAgICAgICAgIGlmIChyaWdodCA8IHRoaXMubGVuZ3RoICYmIGNvbXBhcmUoZGF0YVtyaWdodF0sIGJlc3QpIDwgMCkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgICAgICAgICBiZXN0ID0gZGF0YVtyaWdodF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tcGFyZShiZXN0LCBpdGVtKSA+PSAwKSBicmVhaztcblxuICAgICAgICAgICAgZGF0YVtwb3NdID0gYmVzdDtcbiAgICAgICAgICAgIHBvcyA9IGxlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW3Bvc10gPSBpdGVtO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBRdWV1ZSBmcm9tICd0aW55cXVldWUnO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgeyBkaXN0VG9TZWdtZW50U3F1YXJlZCB9IGZyb20gJy4vaW50ZXJzZWN0aW9uX3Rlc3RzJztcblxuLyoqXG4gKiBGaW5kcyBhbiBhcHByb3hpbWF0aW9uIG9mIGEgcG9seWdvbidzIFBvbGUgT2YgSW5hY2Nlc3NpYmlsaXkgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9sZV9vZl9pbmFjY2Vzc2liaWxpdHlcbiAqIFRoaXMgaXMgYSBjb3B5IG9mIGh0dHA6Ly9naXRodWIuY29tL21hcGJveC9wb2x5bGFiZWwgYWRhcHRlZCB0byB1c2UgUG9pbnRzXG4gKlxuICogQHBhcmFtIHBvbHlnb25SaW5ncyBmaXJzdCBpdGVtIGluIGFycmF5IGlzIHRoZSBvdXRlciByaW5nIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgdGhlIGxpc3Qgb2YgaG9sZXMsIHNob3VsZCBiZSBhbiBlbGVtZW50IG9mIHRoZSByZXN1bHQgb2YgdXRpbC9jbGFzc2lmeV9yaW5nc1xuICogQHBhcmFtIHByZWNpc2lvbiBTcGVjaWZpZWQgaW4gaW5wdXQgY29vcmRpbmF0ZSB1bml0cy4gSWYgMCByZXR1cm5zIGFmdGVyIGZpcnN0IHJ1biwgaWYgPiAwIHJlcGVhdGVkbHkgbmFycm93cyB0aGUgc2VhcmNoIHNwYWNlIHVudGlsIHRoZSByYWRpdXMgb2YgdGhlIGFyZWEgc2VhcmNoZWQgZm9yIHRoZSBiZXN0IHBvbGUgaXMgbGVzcyB0aGFuIHByZWNpc2lvblxuICogQHBhcmFtIGRlYnVnIFByaW50IHNvbWUgc3RhdGlzdGljcyB0byB0aGUgY29uc29sZSBkdXJpbmcgZXhlY3V0aW9uXG4gKiBAcmV0dXJucyBQb2xlIG9mIEluYWNjZXNzaWJpbGl5LlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBvbHlnb25SaW5nczogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgcHJlY2lzaW9uPzogbnVtYmVyID0gMSwgZGVidWc/OiBib29sZWFuID0gZmFsc2UpOiBQb2ludCB7XG4gICAgLy8gZmluZCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBvdXRlciByaW5nXG4gICAgbGV0IG1pblggPSBJbmZpbml0eSwgbWluWSA9IEluZmluaXR5LCBtYXhYID0gLUluZmluaXR5LCBtYXhZID0gLUluZmluaXR5O1xuICAgIGNvbnN0IG91dGVyUmluZyA9IHBvbHlnb25SaW5nc1swXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGVyUmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwID0gb3V0ZXJSaW5nW2ldO1xuICAgICAgICBpZiAoIWkgfHwgcC54IDwgbWluWCkgbWluWCA9IHAueDtcbiAgICAgICAgaWYgKCFpIHx8IHAueSA8IG1pblkpIG1pblkgPSBwLnk7XG4gICAgICAgIGlmICghaSB8fCBwLnggPiBtYXhYKSBtYXhYID0gcC54O1xuICAgICAgICBpZiAoIWkgfHwgcC55ID4gbWF4WSkgbWF4WSA9IHAueTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IG1heFggLSBtaW5YO1xuICAgIGNvbnN0IGhlaWdodCA9IG1heFkgLSBtaW5ZO1xuICAgIGNvbnN0IGNlbGxTaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG4gICAgbGV0IGggPSBjZWxsU2l6ZSAvIDI7XG5cbiAgICAvLyBhIHByaW9yaXR5IHF1ZXVlIG9mIGNlbGxzIGluIG9yZGVyIG9mIHRoZWlyIFwicG90ZW50aWFsXCIgKG1heCBkaXN0YW5jZSB0byBwb2x5Z29uKVxuICAgIGNvbnN0IGNlbGxRdWV1ZSA9IG5ldyBRdWV1ZShbXSwgY29tcGFyZU1heCk7XG5cbiAgICBpZiAoY2VsbFNpemUgPT09IDApIHJldHVybiBuZXcgUG9pbnQobWluWCwgbWluWSk7XG5cbiAgICAvLyBjb3ZlciBwb2x5Z29uIHdpdGggaW5pdGlhbCBjZWxsc1xuICAgIGZvciAobGV0IHggPSBtaW5YOyB4IDwgbWF4WDsgeCArPSBjZWxsU2l6ZSkge1xuICAgICAgICBmb3IgKGxldCB5ID0gbWluWTsgeSA8IG1heFk7IHkgKz0gY2VsbFNpemUpIHtcbiAgICAgICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKHggKyBoLCB5ICsgaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0YWtlIGNlbnRyb2lkIGFzIHRoZSBmaXJzdCBiZXN0IGd1ZXNzXG4gICAgbGV0IGJlc3RDZWxsID0gZ2V0Q2VudHJvaWRDZWxsKHBvbHlnb25SaW5ncyk7XG4gICAgbGV0IG51bVByb2JlcyA9IGNlbGxRdWV1ZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoY2VsbFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAvLyBwaWNrIHRoZSBtb3N0IHByb21pc2luZyBjZWxsIGZyb20gdGhlIHF1ZXVlXG4gICAgICAgIGNvbnN0IGNlbGwgPSBjZWxsUXVldWUucG9wKCk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBiZXN0IGNlbGwgaWYgd2UgZm91bmQgYSBiZXR0ZXIgb25lXG4gICAgICAgIGlmIChjZWxsLmQgPiBiZXN0Q2VsbC5kIHx8ICFiZXN0Q2VsbC5kKSB7XG4gICAgICAgICAgICBiZXN0Q2VsbCA9IGNlbGw7XG4gICAgICAgICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKCdmb3VuZCBiZXN0ICVkIGFmdGVyICVkIHByb2JlcycsIE1hdGgucm91bmQoMWU0ICogY2VsbC5kKSAvIDFlNCwgbnVtUHJvYmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRvIG5vdCBkcmlsbCBkb3duIGZ1cnRoZXIgaWYgdGhlcmUncyBubyBjaGFuY2Ugb2YgYSBiZXR0ZXIgc29sdXRpb25cbiAgICAgICAgaWYgKGNlbGwubWF4IC0gYmVzdENlbGwuZCA8PSBwcmVjaXNpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNwbGl0IHRoZSBjZWxsIGludG8gZm91ciBjZWxsc1xuICAgICAgICBoID0gY2VsbC5oIC8gMjtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggLSBoLCBjZWxsLnAueSAtIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbChjZWxsLnAueCArIGgsIGNlbGwucC55IC0gaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54IC0gaCwgY2VsbC5wLnkgKyBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggKyBoLCBjZWxsLnAueSArIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBudW1Qcm9iZXMgKz0gNDtcbiAgICB9XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coYG51bSBwcm9iZXM6ICR7bnVtUHJvYmVzfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgYmVzdCBkaXN0YW5jZTogJHtiZXN0Q2VsbC5kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0Q2VsbC5wO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlTWF4KGEsIGIpIHtcbiAgICByZXR1cm4gYi5tYXggLSBhLm1heDtcbn1cblxuZnVuY3Rpb24gQ2VsbCh4LCB5LCBoLCBwb2x5Z29uKSB7XG4gICAgdGhpcy5wID0gbmV3IFBvaW50KHgsIHkpO1xuICAgIHRoaXMuaCA9IGg7IC8vIGhhbGYgdGhlIGNlbGwgc2l6ZVxuICAgIHRoaXMuZCA9IHBvaW50VG9Qb2x5Z29uRGlzdCh0aGlzLnAsIHBvbHlnb24pOyAvLyBkaXN0YW5jZSBmcm9tIGNlbGwgY2VudGVyIHRvIHBvbHlnb25cbiAgICB0aGlzLm1heCA9IHRoaXMuZCArIHRoaXMuaCAqIE1hdGguU1FSVDI7IC8vIG1heCBkaXN0YW5jZSB0byBwb2x5Z29uIHdpdGhpbiBhIGNlbGxcbn1cblxuLy8gc2lnbmVkIGRpc3RhbmNlIGZyb20gcG9pbnQgdG8gcG9seWdvbiBvdXRsaW5lIChuZWdhdGl2ZSBpZiBwb2ludCBpcyBvdXRzaWRlKVxuZnVuY3Rpb24gcG9pbnRUb1BvbHlnb25EaXN0KHAsIHBvbHlnb24pIHtcbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gICAgbGV0IG1pbkRpc3RTcSA9IEluZmluaXR5O1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBwb2x5Z29uLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBwb2x5Z29uW2tdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDE7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYiA9IHJpbmdbal07XG5cbiAgICAgICAgICAgIGlmICgoYS55ID4gcC55ICE9PSBiLnkgPiBwLnkpICYmXG4gICAgICAgICAgICAgICAgKHAueCA8IChiLnggLSBhLngpICogKHAueSAtIGEueSkgLyAoYi55IC0gYS55KSArIGEueCkpIGluc2lkZSA9ICFpbnNpZGU7XG5cbiAgICAgICAgICAgIG1pbkRpc3RTcSA9IE1hdGgubWluKG1pbkRpc3RTcSwgZGlzdFRvU2VnbWVudFNxdWFyZWQocCwgYSwgYikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChpbnNpZGUgPyAxIDogLTEpICogTWF0aC5zcXJ0KG1pbkRpc3RTcSk7XG59XG5cbi8vIGdldCBwb2x5Z29uIGNlbnRyb2lkXG5mdW5jdGlvbiBnZXRDZW50cm9pZENlbGwocG9seWdvbikge1xuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSAwO1xuICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb25bMF07XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBvaW50cy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IGIgPSBwb2ludHNbal07XG4gICAgICAgIGNvbnN0IGYgPSBhLnggKiBiLnkgLSBiLnggKiBhLnk7XG4gICAgICAgIHggKz0gKGEueCArIGIueCkgKiBmO1xuICAgICAgICB5ICs9IChhLnkgKyBiLnkpICogZjtcbiAgICAgICAgYXJlYSArPSBmICogMztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDZWxsKHggLyBhcmVhLCB5IC8gYXJlYSwgMCwgcG9seWdvbik7XG59XG4iLCIvKipcbiAqIEpTIEltcGxlbWVudGF0aW9uIG9mIE11cm11ckhhc2gzIChyMTM2KSAoYXMgb2YgTWF5IDIwLCAyMDExKVxuICogXG4gKiBAYXV0aG9yIDxhIGhyZWY9XCJtYWlsdG86Z2FyeS5jb3VydEBnbWFpbC5jb21cIj5HYXJ5IENvdXJ0PC9hPlxuICogQHNlZSBodHRwOi8vZ2l0aHViLmNvbS9nYXJ5Y291cnQvbXVybXVyaGFzaC1qc1xuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmFhcHBsZWJ5QGdtYWlsLmNvbVwiPkF1c3RpbiBBcHBsZWJ5PC9hPlxuICogQHNlZSBodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9zaXRlL211cm11cmhhc2gvXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQVNDSUkgb25seVxuICogQHBhcmFtIHtudW1iZXJ9IHNlZWQgUG9zaXRpdmUgaW50ZWdlciBvbmx5XG4gKiBAcmV0dXJuIHtudW1iZXJ9IDMyLWJpdCBwb3NpdGl2ZSBpbnRlZ2VyIGhhc2ggXG4gKi9cblxuZnVuY3Rpb24gbXVybXVyaGFzaDNfMzJfZ2Moa2V5LCBzZWVkKSB7XG5cdHZhciByZW1haW5kZXIsIGJ5dGVzLCBoMSwgaDFiLCBjMSwgYzFiLCBjMiwgYzJiLCBrMSwgaTtcblx0XG5cdHJlbWFpbmRlciA9IGtleS5sZW5ndGggJiAzOyAvLyBrZXkubGVuZ3RoICUgNFxuXHRieXRlcyA9IGtleS5sZW5ndGggLSByZW1haW5kZXI7XG5cdGgxID0gc2VlZDtcblx0YzEgPSAweGNjOWUyZDUxO1xuXHRjMiA9IDB4MWI4NzM1OTM7XG5cdGkgPSAwO1xuXHRcblx0d2hpbGUgKGkgPCBieXRlcykge1xuXHQgIFx0azEgPSBcblx0ICBcdCAgKChrZXkuY2hhckNvZGVBdChpKSAmIDB4ZmYpKSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDgpIHxcblx0ICBcdCAgKChrZXkuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMTYpIHxcblx0ICBcdCAgKChrZXkuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMjQpO1xuXHRcdCsraTtcblx0XHRcblx0XHRrMSA9ICgoKChrMSAmIDB4ZmZmZikgKiBjMSkgKyAoKCgoazEgPj4+IDE2KSAqIGMxKSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXHRcdGsxID0gKGsxIDw8IDE1KSB8IChrMSA+Pj4gMTcpO1xuXHRcdGsxID0gKCgoKGsxICYgMHhmZmZmKSAqIGMyKSArICgoKChrMSA+Pj4gMTYpICogYzIpICYgMHhmZmZmKSA8PCAxNikpKSAmIDB4ZmZmZmZmZmY7XG5cblx0XHRoMSBePSBrMTtcbiAgICAgICAgaDEgPSAoaDEgPDwgMTMpIHwgKGgxID4+PiAxOSk7XG5cdFx0aDFiID0gKCgoKGgxICYgMHhmZmZmKSAqIDUpICsgKCgoKGgxID4+PiAxNikgKiA1KSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXHRcdGgxID0gKCgoaDFiICYgMHhmZmZmKSArIDB4NmI2NCkgKyAoKCgoaDFiID4+PiAxNikgKyAweGU2NTQpICYgMHhmZmZmKSA8PCAxNikpO1xuXHR9XG5cdFxuXHRrMSA9IDA7XG5cdFxuXHRzd2l0Y2ggKHJlbWFpbmRlcikge1xuXHRcdGNhc2UgMzogazEgXj0gKGtleS5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuXHRcdGNhc2UgMjogazEgXj0gKGtleS5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4ZmYpIDw8IDg7XG5cdFx0Y2FzZSAxOiBrMSBePSAoa2V5LmNoYXJDb2RlQXQoaSkgJiAweGZmKTtcblx0XHRcblx0XHRrMSA9ICgoKGsxICYgMHhmZmZmKSAqIGMxKSArICgoKChrMSA+Pj4gMTYpICogYzEpICYgMHhmZmZmKSA8PCAxNikpICYgMHhmZmZmZmZmZjtcblx0XHRrMSA9IChrMSA8PCAxNSkgfCAoazEgPj4+IDE3KTtcblx0XHRrMSA9ICgoKGsxICYgMHhmZmZmKSAqIGMyKSArICgoKChrMSA+Pj4gMTYpICogYzIpICYgMHhmZmZmKSA8PCAxNikpICYgMHhmZmZmZmZmZjtcblx0XHRoMSBePSBrMTtcblx0fVxuXHRcblx0aDEgXj0ga2V5Lmxlbmd0aDtcblxuXHRoMSBePSBoMSA+Pj4gMTY7XG5cdGgxID0gKCgoaDEgJiAweGZmZmYpICogMHg4NWViY2E2YikgKyAoKCgoaDEgPj4+IDE2KSAqIDB4ODVlYmNhNmIpICYgMHhmZmZmKSA8PCAxNikpICYgMHhmZmZmZmZmZjtcblx0aDEgXj0gaDEgPj4+IDEzO1xuXHRoMSA9ICgoKChoMSAmIDB4ZmZmZikgKiAweGMyYjJhZTM1KSArICgoKChoMSA+Pj4gMTYpICogMHhjMmIyYWUzNSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0aDEgXj0gaDEgPj4+IDE2O1xuXG5cdHJldHVybiBoMSA+Pj4gMDtcbn1cblxuaWYodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBtb2R1bGUuZXhwb3J0cyA9IG11cm11cmhhc2gzXzMyX2djXG59IiwiLyoqXG4gKiBKUyBJbXBsZW1lbnRhdGlvbiBvZiBNdXJtdXJIYXNoMlxuICogXG4gKiBAYXV0aG9yIDxhIGhyZWY9XCJtYWlsdG86Z2FyeS5jb3VydEBnbWFpbC5jb21cIj5HYXJ5IENvdXJ0PC9hPlxuICogQHNlZSBodHRwOi8vZ2l0aHViLmNvbS9nYXJ5Y291cnQvbXVybXVyaGFzaC1qc1xuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmFhcHBsZWJ5QGdtYWlsLmNvbVwiPkF1c3RpbiBBcHBsZWJ5PC9hPlxuICogQHNlZSBodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9zaXRlL211cm11cmhhc2gvXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgQVNDSUkgb25seVxuICogQHBhcmFtIHtudW1iZXJ9IHNlZWQgUG9zaXRpdmUgaW50ZWdlciBvbmx5XG4gKiBAcmV0dXJuIHtudW1iZXJ9IDMyLWJpdCBwb3NpdGl2ZSBpbnRlZ2VyIGhhc2hcbiAqL1xuXG5mdW5jdGlvbiBtdXJtdXJoYXNoMl8zMl9nYyhzdHIsIHNlZWQpIHtcbiAgdmFyXG4gICAgbCA9IHN0ci5sZW5ndGgsXG4gICAgaCA9IHNlZWQgXiBsLFxuICAgIGkgPSAwLFxuICAgIGs7XG4gIFxuICB3aGlsZSAobCA+PSA0KSB7XG4gIFx0ayA9IFxuICBcdCAgKChzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmYpKSB8XG4gIFx0ICAoKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4KSB8XG4gIFx0ICAoKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCAxNikgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMjQpO1xuICAgIFxuICAgIGsgPSAoKChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGsgPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuICAgIGsgXj0gayA+Pj4gMjQ7XG4gICAgayA9ICgoKGsgJiAweGZmZmYpICogMHg1YmQxZTk5NSkgKyAoKCgoayA+Pj4gMTYpICogMHg1YmQxZTk5NSkgJiAweGZmZmYpIDw8IDE2KSk7XG5cblx0aCA9ICgoKGggJiAweGZmZmYpICogMHg1YmQxZTk5NSkgKyAoKCgoaCA+Pj4gMTYpICogMHg1YmQxZTk5NSkgJiAweGZmZmYpIDw8IDE2KSkgXiBrO1xuXG4gICAgbCAtPSA0O1xuICAgICsraTtcbiAgfVxuICBcbiAgc3dpdGNoIChsKSB7XG4gIGNhc2UgMzogaCBePSAoc3RyLmNoYXJDb2RlQXQoaSArIDIpICYgMHhmZikgPDwgMTY7XG4gIGNhc2UgMjogaCBePSAoc3RyLmNoYXJDb2RlQXQoaSArIDEpICYgMHhmZikgPDwgODtcbiAgY2FzZSAxOiBoIF49IChzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmYpO1xuICAgICAgICAgIGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuICB9XG5cbiAgaCBePSBoID4+PiAxMztcbiAgaCA9ICgoKGggJiAweGZmZmYpICogMHg1YmQxZTk5NSkgKyAoKCgoaCA+Pj4gMTYpICogMHg1YmQxZTk5NSkgJiAweGZmZmYpIDw8IDE2KSk7XG4gIGggXj0gaCA+Pj4gMTU7XG5cbiAgcmV0dXJuIGggPj4+IDA7XG59XG5cbmlmKHR5cGVvZiBtb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IG11cm11cmhhc2gyXzMyX2djXG59XG4iLCJ2YXIgbXVybXVyMyA9IHJlcXVpcmUoXCIuL211cm11cmhhc2gzX2djLmpzXCIpXG52YXIgbXVybXVyMiA9IHJlcXVpcmUoXCIuL211cm11cmhhc2gyX2djLmpzXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gbXVybXVyM1xubW9kdWxlLmV4cG9ydHMubXVybXVyMyA9IG11cm11cjNcbm1vZHVsZS5leHBvcnRzLm11cm11cjIgPSBtdXJtdXIyXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQW5jaG9yIGZyb20gJy4vYW5jaG9yJztcblxuaW1wb3J0IHsgZ2V0QW5jaG9ycywgZ2V0Q2VudGVyQW5jaG9yIH0gZnJvbSAnLi9nZXRfYW5jaG9ycyc7XG5pbXBvcnQgY2xpcExpbmUgZnJvbSAnLi9jbGlwX2xpbmUnO1xuaW1wb3J0IHsgc2hhcGVUZXh0LCBzaGFwZUljb24sIFdyaXRpbmdNb2RlIH0gZnJvbSAnLi9zaGFwaW5nJztcbmltcG9ydCB7IGdldEdseXBoUXVhZHMsIGdldEljb25RdWFkcyB9IGZyb20gJy4vcXVhZHMnO1xuaW1wb3J0IENvbGxpc2lvbkZlYXR1cmUgZnJvbSAnLi9jb2xsaXNpb25fZmVhdHVyZSc7XG5pbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQge1xuICAgIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUsXG4gICAgYWxsb3dzTGV0dGVyU3BhY2luZ1xufSBmcm9tICcuLi91dGlsL3NjcmlwdF9kZXRlY3Rpb24nO1xuaW1wb3J0IGZpbmRQb2xlT2ZJbmFjY2Vzc2liaWxpdHkgZnJvbSAnLi4vdXRpbC9maW5kX3BvbGVfb2ZfaW5hY2Nlc3NpYmlsaXR5JztcbmltcG9ydCBjbGFzc2lmeVJpbmdzIGZyb20gJy4uL3V0aWwvY2xhc3NpZnlfcmluZ3MnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgU3ltYm9sQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQge1NJWkVfUEFDS19GQUNUT1J9IGZyb20gJy4vc3ltYm9sX3NpemUnO1xuaW1wb3J0IE9ORV9FTSBmcm9tICcuL29uZV9lbSc7XG5cbmltcG9ydCB0eXBlIHtTaGFwaW5nLCBQb3NpdGlvbmVkSWNvbiwgVGV4dEp1c3RpZnl9IGZyb20gJy4vc2hhcGluZyc7XG5pbXBvcnQgdHlwZSB7Q29sbGlzaW9uQm94QXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHR5cGUge1N5bWJvbEZlYXR1cmV9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlJztcbmltcG9ydCB0eXBlIHtTdHlsZUdseXBofSBmcm9tICcuLi9zdHlsZS9zdHlsZV9nbHlwaCc7XG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcbmltcG9ydCB0eXBlIHtHbHlwaFBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvZ2x5cGhfYXRsYXMnO1xuaW1wb3J0IHR5cGUge1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZX0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcyc7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBtdXJtdXIzIGZyb20gJ211cm11cmhhc2gtanMnO1xuXG4vLyBUaGUgc3ltYm9sIGxheW91dCBwcm9jZXNzIG5lZWRzIGB0ZXh0LXNpemVgIGV2YWx1YXRlZCBhdCB1cCB0byBmaXZlIGRpZmZlcmVudCB6b29tIGxldmVscywgYW5kXG4vLyBgaWNvbi1zaXplYCBhdCB1cCB0byB0aHJlZTpcbi8vXG4vLyAgIDEuIGB0ZXh0LXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQuIFVzZWQgdG8gY2FsY3VsYXRlIGEgcGVyLWZlYXR1cmUgc2l6ZSBmb3Igc291cmNlIGB0ZXh0LXNpemVgXG4vLyAgICAgICBleHByZXNzaW9ucywgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgYm94IGRpbWVuc2lvbnMgZm9yIGljb24tdGV4dC1maXQuXG4vLyAgIDIuIGBpY29uLXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQuIFVzZWQgdG8gY2FsY3VsYXRlIGEgcGVyLWZlYXR1cmUgc2l6ZSBmb3Igc291cmNlIGBpY29uLXNpemVgXG4vLyAgICAgICBleHByZXNzaW9ucy5cbi8vICAgMy4gYHRleHQtc2l6ZWAgYW5kIGBpY29uLXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQsIHBsdXMgb25lLiBVc2VkIHRvIGNhbGN1bGF0ZSBjb2xsaXNpb24gYm94ZXMuXG4vLyAgIDQuIGB0ZXh0LXNpemVgIGF0IHpvb20gbGV2ZWwgMTguIFVzZWQgZm9yIHNvbWV0aGluZyBsaW5lLXN5bWJvbC1wbGFjZW1lbnQtcmVsYXRlZC5cbi8vICAgNS4gIEZvciBjb21wb3NpdGUgYCotc2l6ZWAgZXhwcmVzc2lvbnM6IHR3byB6b29tIGxldmVscyBvZiBjdXJ2ZSBzdG9wcyB0aGF0IFwiY292ZXJcIiB0aGUgem9vbSBsZXZlbCBvZiB0aGVcbi8vICAgICAgIGJ1Y2tldC4gVGhlc2UgZ28gaW50byBhIHZlcnRleCBidWZmZXIgYW5kIGFyZSB1c2VkIGJ5IHRoZSBzaGFkZXIgdG8gaW50ZXJwb2xhdGUgdGhlIHNpemUgYXQgcmVuZGVyIHRpbWUuXG4vL1xuLy8gKDEpIGFuZCAoMikgYXJlIHN0b3JlZCBpbiBgYnVja2V0LmxheWVyc1swXS5sYXlvdXRgLiBUaGUgcmVtYWluZGVyIGFyZSBiZWxvdy5cbi8vXG50eXBlIFNpemVzID0ge1xuICAgIGxheW91dFRleHRTaXplOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPiwgLy8gKDMpXG4gICAgbGF5b3V0SWNvblNpemU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCAvLyAoMylcbiAgICB0ZXh0TWF4U2l6ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4sICAgIC8vICg0KVxuICAgIGNvbXBvc2l0ZVRleHRTaXplczogW1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPl0sIC8vICg1KVxuICAgIGNvbXBvc2l0ZUljb25TaXplczogW1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPl0sIC8vICg1KVxufTtcblxuZXhwb3J0IHR5cGUgVGV4dEFuY2hvciA9ICdjZW50ZXInIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbScgfCAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCc7XG5cbi8vIFRoZSByYWRpYWwgb2Zmc2V0IGlzIHRvIHRoZSBlZGdlIG9mIHRoZSB0ZXh0IGJveFxuLy8gSW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9uLCB0aGUgZWRnZSBvZiB0aGUgdGV4dCBib3ggaXMgd2hlcmUgZ2x5cGhzIHN0YXJ0XG4vLyBCdXQgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiwgdGhlIGdseXBocyBhcHBlYXIgdG8gXCJzdGFydFwiIGF0IHRoZSBiYXNlbGluZVxuLy8gV2UgZG9uJ3QgYWN0dWFsbHkgbG9hZCBiYXNlbGluZSBkYXRhLCBidXQgd2UgYXNzdW1lIGFuIG9mZnNldCBvZiBPTkVfRU0gLSAxN1xuLy8gKHNlZSBcInlPZmZzZXRcIiBpbiBzaGFwaW5nLmpzKVxuY29uc3QgYmFzZWxpbmVPZmZzZXQgPSA3O1xuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVSYWRpYWxPZmZzZXQoYW5jaG9yOiBUZXh0QW5jaG9yLCByYWRpYWxPZmZzZXQ6IG51bWJlcikge1xuICAgIGxldCB4ID0gMCwgeSA9IDA7XG4gICAgLy8gc29sdmUgZm9yIHIgd2hlcmUgcl4yICsgcl4yID0gcmFkaWFsT2Zmc2V0XjJcbiAgICBjb25zdCBoeXBvdGVudXNlID0gcmFkaWFsT2Zmc2V0IC8gTWF0aC5zcXJ0KDIpO1xuXG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgeSA9IGh5cG90ZW51c2UgLSBiYXNlbGluZU9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIHkgPSAtaHlwb3RlbnVzZSArIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgICB5ID0gLXJhZGlhbE9mZnNldCArIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICd0b3AnOlxuICAgICAgICB5ID0gcmFkaWFsT2Zmc2V0IC0gYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICB4ID0gLWh5cG90ZW51c2U7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIHggPSBoeXBvdGVudXNlO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgeCA9IHJhZGlhbE9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgICB4ID0gLXJhZGlhbE9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4LCB5XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcmZvcm1TeW1ib2xMYXlvdXQoYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W3N0cmluZ106IHtbbnVtYmVyXTogP1N0eWxlR2x5cGh9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhQb3NpdGlvbnM6IHtbc3RyaW5nXToge1tudW1iZXJdOiBHbHlwaFBvc2l0aW9ufX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWFwOiB7W3N0cmluZ106IFN0eWxlSW1hZ2V9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzOiBib29sZWFuKSB7XG4gICAgYnVja2V0LmNyZWF0ZUFycmF5cygpO1xuXG4gICAgY29uc3QgdGlsZVNpemUgPSA1MTIgKiBidWNrZXQub3ZlcnNjYWxpbmc7XG4gICAgYnVja2V0LnRpbGVQaXhlbFJhdGlvID0gRVhURU5UIC8gdGlsZVNpemU7XG4gICAgYnVja2V0LmNvbXBhcmVUZXh0ID0ge307XG4gICAgYnVja2V0Lmljb25zTmVlZExpbmVhciA9IGZhbHNlO1xuXG4gICAgY29uc3QgbGF5b3V0ID0gYnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG4gICAgY29uc3QgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXMgPSBidWNrZXQubGF5ZXJzWzBdLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzO1xuXG4gICAgY29uc3Qgc2l6ZXMgPSB7fTtcblxuICAgIGlmIChidWNrZXQudGV4dFNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgIGNvbnN0IHttaW5ab29tLCBtYXhab29tfSA9IGJ1Y2tldC50ZXh0U2l6ZURhdGE7XG4gICAgICAgIHNpemVzLmNvbXBvc2l0ZVRleHRTaXplcyA9IFtcbiAgICAgICAgICAgIHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWyd0ZXh0LXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhtaW5ab29tKSksXG4gICAgICAgICAgICB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMobWF4Wm9vbSkpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgaWYgKGJ1Y2tldC5pY29uU2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgY29uc3Qge21pblpvb20sIG1heFpvb219ID0gYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlSWNvblNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pblpvb20pKSxcbiAgICAgICAgICAgIHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWydpY29uLXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhtYXhab29tKSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBzaXplcy5sYXlvdXRUZXh0U2l6ZSA9IHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWyd0ZXh0LXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhidWNrZXQuem9vbSArIDEpKTtcbiAgICBzaXplcy5sYXlvdXRJY29uU2l6ZSA9IHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWydpY29uLXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhidWNrZXQuem9vbSArIDEpKTtcbiAgICBzaXplcy50ZXh0TWF4U2l6ZSA9IHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWyd0ZXh0LXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycygxOCkpO1xuXG4gICAgY29uc3QgbGluZUhlaWdodCA9IGxheW91dC5nZXQoJ3RleHQtbGluZS1oZWlnaHQnKSAqIE9ORV9FTTtcbiAgICBjb25zdCB0ZXh0QWxvbmdMaW5lID0gbGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCcgJiYgbGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnO1xuICAgIGNvbnN0IGtlZXBVcHJpZ2h0ID0gbGF5b3V0LmdldCgndGV4dC1rZWVwLXVwcmlnaHQnKTtcblxuICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBidWNrZXQuZmVhdHVyZXMpIHtcbiAgICAgICAgY29uc3QgZm9udHN0YWNrID0gbGF5b3V0LmdldCgndGV4dC1mb250JykuZXZhbHVhdGUoZmVhdHVyZSwge30pLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgZ2x5cGhQb3NpdGlvbk1hcCA9IGdseXBoUG9zaXRpb25zO1xuXG4gICAgICAgIGNvbnN0IHNoYXBlZFRleHRPcmllbnRhdGlvbnMgPSB7XG4gICAgICAgICAgICBob3Jpem9udGFsOiB7fSxcbiAgICAgICAgICAgIHZlcnRpY2FsOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGZlYXR1cmUudGV4dDtcbiAgICAgICAgbGV0IHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICBjb25zdCB1bmZvcm1hdHRlZFRleHQgPSB0ZXh0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBzcGFjaW5nID0gbGF5b3V0LmdldCgndGV4dC1sZXR0ZXItc3BhY2luZycpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KSAqIE9ORV9FTTtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNpbmdJZkFsbG93ZWQgPSBhbGxvd3NMZXR0ZXJTcGFjaW5nKHVuZm9ybWF0dGVkVGV4dCkgPyBzcGFjaW5nIDogMDtcblxuICAgICAgICAgICAgY29uc3QgdGV4dEFuY2hvciA9IGxheW91dC5nZXQoJ3RleHQtYW5jaG9yJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVUZXh0QW5jaG9yID0gbGF5b3V0LmdldCgndGV4dC12YXJpYWJsZS1hbmNob3InKTtcbiAgICAgICAgICAgIGNvbnN0IHJhZGlhbE9mZnNldCA9IGxheW91dC5nZXQoJ3RleHQtcmFkaWFsLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcblxuICAgICAgICAgICAgaWYgKCF2YXJpYWJsZVRleHRBbmNob3IpIHtcbiAgICAgICAgICAgICAgICAvLyBMYXllcnMgd2l0aCB2YXJpYWJsZSBhbmNob3JzIHVzZSB0aGUgYHRleHQtcmFkaWFsLW9mZnNldGAgcHJvcGVydHkgYW5kIHRoZSBbeCwgeV0gb2Zmc2V0IHZlY3RvclxuICAgICAgICAgICAgICAgIC8vIGlzIGNhbGN1bGF0ZWQgYXQgcGxhY2VtZW50IHRpbWUgaW5zdGVhZCBvZiBsYXlvdXQgdGltZVxuICAgICAgICAgICAgICAgIGlmIChyYWRpYWxPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0eWxlIHNwZWMgc2F5cyBkb24ndCB1c2UgYHRleHQtb2Zmc2V0YCBhbmQgYHRleHQtcmFkaWFsLW9mZnNldGAgdG9nZXRoZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGRvZXNuJ3QgYWN0dWFsbHkgc3BlY2lmeSB3aGF0IGhhcHBlbnMgaWYgeW91IHVzZSBib3RoLiBXZSBnbyB3aXRoIHRoZSByYWRpYWwgb2Zmc2V0LlxuICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gZXZhbHVhdGVSYWRpYWxPZmZzZXQodGV4dEFuY2hvciwgcmFkaWFsT2Zmc2V0ICogT05FX0VNKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gKGxheW91dC5nZXQoJ3RleHQtb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30pLm1hcCh0ID0+IHQgKiBPTkVfRU0pOiBhbnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHRKdXN0aWZ5ID0gdGV4dEFsb25nTGluZSA/XG4gICAgICAgICAgICAgICAgXCJjZW50ZXJcIiA6XG4gICAgICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1qdXN0aWZ5JykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuXG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ3BvaW50JyA/XG4gICAgICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1tYXgtd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkgKiBPTkVfRU0gOlxuICAgICAgICAgICAgICAgIDA7XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZFZlcnRpY2FsU2hhcGluZ0ZvclBvaW50TGFiZWxJZk5lZWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSh1bmZvcm1hdHRlZFRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIFBPSSBsYWJlbCBwbGFjZW1lbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3Igc2NyaXB0cyB0aGF0IHN1cHBvcnQgdmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGluZyBtb2RlLCB0aHVzLCBkZWZhdWx0IGxlZnQganVzdGlmaWNhdGlvbiBpcyB1c2VkLiBJZiBMYXRpblxuICAgICAgICAgICAgICAgICAgICAvLyBzY3JpcHRzIHdvdWxkIG5lZWQgdG8gYmUgc3VwcG9ydGVkLCB0aGlzIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCBvdGhlciBqdXN0aWZpY2F0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgdGV4dEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVmdCcsIHNwYWNpbmdJZkFsbG93ZWQsIHRleHRPZmZzZXQsIFdyaXRpbmdNb2RlLnZlcnRpY2FsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGxheWVyIHVzZXMgdGV4dC12YXJpYWJsZS1hbmNob3IsIGdlbmVyYXRlIHNoYXBpbmdzIGZvciBhbGwganVzdGlmaWNhdGlvbiBwb3NzaWJpbGl0aWVzLlxuICAgICAgICAgICAgaWYgKCF0ZXh0QWxvbmdMaW5lICYmIHZhcmlhYmxlVGV4dEFuY2hvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGp1c3RpZmljYXRpb25zID0gdGV4dEp1c3RpZnkgPT09IFwiYXV0b1wiID9cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVUZXh0QW5jaG9yLm1hcChhID0+IGdldEFuY2hvckp1c3RpZmljYXRpb24oYSkpIDpcbiAgICAgICAgICAgICAgICAgICAgW3RleHRKdXN0aWZ5XTtcblxuICAgICAgICAgICAgICAgIGxldCBzaW5nbGVMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqdXN0aWZpY2F0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqdXN0aWZpY2F0aW9uOiBUZXh0SnVzdGlmeSA9IGp1c3RpZmljYXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW2p1c3RpZmljYXRpb25dKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmdsZUxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzaGFwaW5nIGZvciB0aGUgZmlyc3QganVzdGlmaWNhdGlvbiB3YXMgb25seSBhIHNpbmdsZSBsaW5lLCB3ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHJlLXVzZSBpdCBmb3IgdGhlIG90aGVyIGp1c3RpZmljYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWxbanVzdGlmaWNhdGlvbl0gPSBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWxbMF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB1c2luZyB0ZXh0LXZhcmlhYmxlLWFuY2hvciBmb3IgdGhlIGxheWVyLCB3ZSB1c2UgYSBjZW50ZXIgYW5jaG9yIGZvciBhbGwgc2hhcGluZ3MgYW5kIGFwcGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb2Zmc2V0cyBmb3IgdGhlIGFuY2hvciBpbiB0aGUgcGxhY2VtZW50IHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFwaW5nID0gc2hhcGVUZXh0KHRleHQsIGdseXBoTWFwLCBmb250c3RhY2ssIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmaWNhdGlvbiwgc3BhY2luZ0lmQWxsb3dlZCwgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWxbanVzdGlmaWNhdGlvbl0gPSBzaGFwaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUxpbmUgPSBzaGFwaW5nLmxpbmVDb3VudCA9PT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGFkZFZlcnRpY2FsU2hhcGluZ0ZvclBvaW50TGFiZWxJZk5lZWRlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dEp1c3RpZnkgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZ5ID0gZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbih0ZXh0QW5jaG9yKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBIb3Jpem9udGFsIHBvaW50IG9yIGxpbmUgbGFiZWwuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGluZyA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgdGV4dEFuY2hvciwgdGV4dEp1c3RpZnksIHNwYWNpbmdJZkFsbG93ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0LCBXcml0aW5nTW9kZS5ob3Jpem9udGFsLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNoYXBpbmcpIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFt0ZXh0SnVzdGlmeV0gPSBzaGFwaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gVmVydGljYWwgcG9pbnQgbGFiZWwgKGlmIGFsbG93VmVydGljYWxQbGFjZW1lbnQgaXMgZW5hYmxlZCkuXG4gICAgICAgICAgICAgICAgYWRkVmVydGljYWxTaGFwaW5nRm9yUG9pbnRMYWJlbElmTmVlZGVkKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbGl6ZWQgbGluZSBsYWJlbC5cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSh1bmZvcm1hdHRlZFRleHQpICYmIHRleHRBbG9uZ0xpbmUgJiYga2VlcFVwcmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgdGV4dEFuY2hvciwgdGV4dEp1c3RpZnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ0lmQWxsb3dlZCwgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUudmVydGljYWwsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaGFwZWRJY29uO1xuICAgICAgICBpZiAoZmVhdHVyZS5pY29uKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IGltYWdlTWFwW2ZlYXR1cmUuaWNvbl07XG4gICAgICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBzaGFwZWRJY29uID0gc2hhcGVJY29uKFxuICAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uc1tmZWF0dXJlLmljb25dLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KSxcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldCgnaWNvbi1hbmNob3InKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkpO1xuICAgICAgICAgICAgICAgIGlmIChidWNrZXQuc2RmSWNvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuc2RmSWNvbnMgPSBpbWFnZS5zZGY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidWNrZXQuc2RmSWNvbnMgIT09IGltYWdlLnNkZikge1xuICAgICAgICAgICAgICAgICAgICB3YXJuT25jZSgnU3R5bGUgc2hlZXQgd2FybmluZzogQ2Fubm90IG1peCBTREYgYW5kIG5vbi1TREYgaWNvbnMgaW4gb25lIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2UucGl4ZWxSYXRpbyAhPT0gYnVja2V0LnBpeGVsUmF0aW8pIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb25zTmVlZExpbmVhciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlvdXQuZ2V0KCdpY29uLXJvdGF0ZScpLmNvbnN0YW50T3IoMSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb25zTmVlZExpbmVhciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCkubGVuZ3RoIHx8IHNoYXBlZEljb24pIHtcbiAgICAgICAgICAgIGFkZEZlYXR1cmUoYnVja2V0LCBmZWF0dXJlLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLCBzaGFwZWRJY29uLCBnbHlwaFBvc2l0aW9uTWFwLCBzaXplcywgdGV4dE9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0NvbGxpc2lvbkJveGVzKSB7XG4gICAgICAgIGJ1Y2tldC5nZW5lcmF0ZUNvbGxpc2lvbkRlYnVnQnVmZmVycygpO1xuICAgIH1cbn1cblxuLy8gQ2hvb3NlIHRoZSBqdXN0aWZpY2F0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBUZXh0QW5jaG9yXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbihhbmNob3I6IFRleHRBbmNob3IpOiBUZXh0SnVzdGlmeSAge1xuICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICB9XG4gICAgcmV0dXJuICdjZW50ZXInO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgZmVhdHVyZSBhbmQgaXRzIHNoYXBlZCB0ZXh0IGFuZCBpY29uIGRhdGEsIGFkZCBhICdzeW1ib2xcbiAqIGluc3RhbmNlJyBmb3IgZWFjaCBfcG9zc2libGVfIHBsYWNlbWVudCBvZiB0aGUgc3ltYm9sIGZlYXR1cmUuXG4gKiAoQXQgcmVuZGVyIHRpbWVQbGFjZVN5bWJvbHMjcGxhY2UoKSBzZWxlY3RzIHdoaWNoIG9mIHRoZXNlIGluc3RhbmNlcyB0b1xuICogc2hvdyBvciBoaWRlIGJhc2VkIG9uIGNvbGxpc2lvbnMgd2l0aCBzeW1ib2xzIGluIG90aGVyIGxheWVycy4pXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRGZWF0dXJlKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBTeW1ib2xGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zOiBhbnksXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246IFBvc2l0aW9uZWRJY29uIHwgdm9pZCxcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhQb3NpdGlvbk1hcDoge1tzdHJpbmddOiB7W251bWJlcl06IEdseXBoUG9zaXRpb259fSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgbGF5b3V0VGV4dFNpemUgPSBzaXplcy5sYXlvdXRUZXh0U2l6ZS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgY29uc3QgbGF5b3V0SWNvblNpemUgPSBzaXplcy5sYXlvdXRJY29uU2l6ZS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG5cbiAgICAvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBsYWJlbHMgdGhhdCBqdW1wIGFyb3VuZCB3aGVuIHpvb21pbmcgd2UgbmVlZFxuICAgIC8vIHRvIHVzZSBhIHRleHQtc2l6ZSB2YWx1ZSB0aGF0IGlzIHRoZSBzYW1lIGZvciBhbGwgem9vbSBsZXZlbHMuXG4gICAgLy8gYnVja2V0IGNhbGN1bGF0ZXMgdGV4dC1zaXplIGF0IGEgaGlnaCB6b29tIGxldmVsIHNvIHRoYXQgYWxsIHRpbGVzIGNhblxuICAgIC8vIHVzZSB0aGUgc2FtZSB2YWx1ZSB3aGVuIGNhbGN1bGF0aW5nIGFuY2hvciBwb3NpdGlvbnMuXG4gICAgbGV0IHRleHRNYXhTaXplID0gc2l6ZXMudGV4dE1heFNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgIGlmICh0ZXh0TWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRleHRNYXhTaXplID0gbGF5b3V0VGV4dFNpemU7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0gYnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG4gICAgY29uc3QgaWNvbk9mZnNldCA9IGxheW91dC5nZXQoJ2ljb24tb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgIGNvbnN0IGRlZmF1bHRIb3Jpem9udGFsU2hhcGluZyA9IGdldERlZmF1bHRIb3Jpem9udGFsU2hhcGluZyhzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWwpO1xuICAgIGNvbnN0IGdseXBoU2l6ZSA9IDI0LFxuICAgICAgICBmb250U2NhbGUgPSBsYXlvdXRUZXh0U2l6ZSAvIGdseXBoU2l6ZSxcbiAgICAgICAgdGV4dEJveFNjYWxlID0gYnVja2V0LnRpbGVQaXhlbFJhdGlvICogZm9udFNjYWxlLFxuICAgICAgICB0ZXh0TWF4Qm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiB0ZXh0TWF4U2l6ZSAvIGdseXBoU2l6ZSxcbiAgICAgICAgaWNvbkJveFNjYWxlID0gYnVja2V0LnRpbGVQaXhlbFJhdGlvICogbGF5b3V0SWNvblNpemUsXG4gICAgICAgIHN5bWJvbE1pbkRpc3RhbmNlID0gYnVja2V0LnRpbGVQaXhlbFJhdGlvICogbGF5b3V0LmdldCgnc3ltYm9sLXNwYWNpbmcnKSxcbiAgICAgICAgdGV4dFBhZGRpbmcgPSBsYXlvdXQuZ2V0KCd0ZXh0LXBhZGRpbmcnKSAqIGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgaWNvblBhZGRpbmcgPSBsYXlvdXQuZ2V0KCdpY29uLXBhZGRpbmcnKSAqIGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgdGV4dE1heEFuZ2xlID0gbGF5b3V0LmdldCgndGV4dC1tYXgtYW5nbGUnKSAvIDE4MCAqIE1hdGguUEksXG4gICAgICAgIHRleHRBbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCcsXG4gICAgICAgIGljb25BbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCcsXG4gICAgICAgIHN5bWJvbFBsYWNlbWVudCA9IGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSxcbiAgICAgICAgdGV4dFJlcGVhdERpc3RhbmNlID0gc3ltYm9sTWluRGlzdGFuY2UgLyAyO1xuXG4gICAgY29uc3QgYWRkU3ltYm9sQXRBbmNob3IgPSAobGluZSwgYW5jaG9yKSA9PiB7XG4gICAgICAgIGlmIChhbmNob3IueCA8IDAgfHwgYW5jaG9yLnggPj0gRVhURU5UIHx8IGFuY2hvci55IDwgMCB8fCBhbmNob3IueSA+PSBFWFRFTlQpIHtcbiAgICAgICAgICAgIC8vIFN5bWJvbCBsYXllcnMgYXJlIGRyYXduIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMsIFdlIGZpbHRlciBvdXQgc3ltYm9sc1xuICAgICAgICAgICAgLy8gb3V0c2lkZSBvdXIgdGlsZSBib3VuZGFyaWVzICh3aGljaCBtYXkgYmUgaW5jbHVkZWQgaW4gdmVjdG9yIHRpbGUgYnVmZmVycylcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlLWRyYXdpbmcgc3ltYm9scy5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFN5bWJvbChidWNrZXQsIGFuY2hvciwgbGluZSwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucywgc2hhcGVkSWNvbiwgYnVja2V0LmxheWVyc1swXSxcbiAgICAgICAgICAgIGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheSwgZmVhdHVyZS5pbmRleCwgZmVhdHVyZS5zb3VyY2VMYXllckluZGV4LCBidWNrZXQuaW5kZXgsXG4gICAgICAgICAgICB0ZXh0Qm94U2NhbGUsIHRleHRQYWRkaW5nLCB0ZXh0QWxvbmdMaW5lLCB0ZXh0T2Zmc2V0LFxuICAgICAgICAgICAgaWNvbkJveFNjYWxlLCBpY29uUGFkZGluZywgaWNvbkFsb25nTGluZSwgaWNvbk9mZnNldCxcbiAgICAgICAgICAgIGZlYXR1cmUsIGdseXBoUG9zaXRpb25NYXAsIHNpemVzKTtcbiAgICB9O1xuXG4gICAgaWYgKHN5bWJvbFBsYWNlbWVudCA9PT0gJ2xpbmUnKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjbGlwTGluZShmZWF0dXJlLmdlb21ldHJ5LCAwLCAwLCBFWFRFTlQsIEVYVEVOVCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvcnMgPSBnZXRBbmNob3JzKFxuICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgdGV4dE1heEFuZ2xlLFxuICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwgfHwgZGVmYXVsdEhvcml6b250YWxTaGFwaW5nLFxuICAgICAgICAgICAgICAgIHNoYXBlZEljb24sXG4gICAgICAgICAgICAgICAgZ2x5cGhTaXplLFxuICAgICAgICAgICAgICAgIHRleHRNYXhCb3hTY2FsZSxcbiAgICAgICAgICAgICAgICBidWNrZXQub3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICAgICAgRVhURU5UXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbmNob3Igb2YgYW5jaG9ycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlZFRleHQgPSBkZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmc7XG4gICAgICAgICAgICAgICAgaWYgKCFzaGFwZWRUZXh0IHx8ICFhbmNob3JJc1Rvb0Nsb3NlKGJ1Y2tldCwgc2hhcGVkVGV4dC50ZXh0LCB0ZXh0UmVwZWF0RGlzdGFuY2UsIGFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3ltYm9sQXRBbmNob3IobGluZSwgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN5bWJvbFBsYWNlbWVudCA9PT0gJ2xpbmUtY2VudGVyJykge1xuICAgICAgICAvLyBObyBjbGlwcGluZywgbXVsdGlwbGUgbGluZXMgcGVyIGZlYXR1cmUgYXJlIGFsbG93ZWRcbiAgICAgICAgLy8gXCJsaW5lc1wiIHdpdGggb25seSBvbmUgcG9pbnQgYXJlIGlnbm9yZWQgYXMgaW4gY2xpcExpbmVzXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZ2V0Q2VudGVyQW5jaG9yKFxuICAgICAgICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0TWF4QW5nbGUsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwgfHwgZGVmYXVsdEhvcml6b250YWxTaGFwaW5nLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRJY29uLFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFNpemUsXG4gICAgICAgICAgICAgICAgICAgIHRleHRNYXhCb3hTY2FsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmVhdHVyZS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIGNsYXNzaWZ5UmluZ3MoZmVhdHVyZS5nZW9tZXRyeSwgMCkpIHtcbiAgICAgICAgICAgIC8vIDE2IGhlcmUgcmVwcmVzZW50cyAyIHBpeGVsc1xuICAgICAgICAgICAgY29uc3QgcG9pID0gZmluZFBvbGVPZkluYWNjZXNzaWJpbGl0eShwb2x5Z29uLCAxNik7XG4gICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihwb2x5Z29uWzBdLCBuZXcgQW5jaG9yKHBvaS54LCBwb2kueSwgMCkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzgwOFxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgYWRkU3ltYm9sQXRBbmNob3IobGluZSwgbmV3IEFuY2hvcihsaW5lWzBdLngsIGxpbmVbMF0ueSwgMCkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludHMgb2YgZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpIHtcbiAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihbcG9pbnRdLCBuZXcgQW5jaG9yKHBvaW50LngsIHBvaW50LnksIDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgTUFYX1BBQ0tFRF9TSVpFID0gNjU1MzU7XG5cbmZ1bmN0aW9uIGFkZFRleHRWZXJ0aWNlcyhidWNrZXQ6IFN5bWJvbEJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I6IFBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHQ6IFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBTeW1ib2xGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGluZUFycmF5OiB7bGluZVN0YXJ0SW5kZXg6IG51bWJlciwgbGluZUxlbmd0aDogbnVtYmVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nTW9kZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudFR5cGVzOiBBcnJheTwndmVydGljYWwnIHwgJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnPixcbiAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlczoge1tzdHJpbmddOiBudW1iZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25NYXA6IHtbc3RyaW5nXToge1tudW1iZXJdOiBHbHlwaFBvc2l0aW9ufX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzKSB7XG4gICAgY29uc3QgZ2x5cGhRdWFkcyA9IGdldEdseXBoUXVhZHMoYW5jaG9yLCBzaGFwZWRUZXh0LCB0ZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLCB0ZXh0QWxvbmdMaW5lLCBmZWF0dXJlLCBnbHlwaFBvc2l0aW9uTWFwLCBidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCk7XG5cbiAgICBjb25zdCBzaXplRGF0YSA9IGJ1Y2tldC50ZXh0U2l6ZURhdGE7XG4gICAgbGV0IHRleHRTaXplRGF0YSA9IG51bGw7XG5cbiAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgdGV4dFNpemVEYXRhID0gW1xuICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIGxheWVyLmxheW91dC5nZXQoJ3RleHQtc2l6ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KVxuICAgICAgICBdO1xuICAgICAgICBpZiAodGV4dFNpemVEYXRhWzBdID4gTUFYX1BBQ0tFRF9TSVpFKSB7XG4gICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJ0ZXh0LXNpemVcIiBpcyA+PSAyNTYuIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuYCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgIHRleHRTaXplRGF0YSA9IFtcbiAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBzaXplcy5jb21wb3NpdGVUZXh0U2l6ZXNbMF0uZXZhbHVhdGUoZmVhdHVyZSwge30pLFxuICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIHNpemVzLmNvbXBvc2l0ZVRleHRTaXplc1sxXS5ldmFsdWF0ZShmZWF0dXJlLCB7fSlcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHRleHRTaXplRGF0YVswXSA+IE1BWF9QQUNLRURfU0laRSB8fCB0ZXh0U2l6ZURhdGFbMV0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcInRleHQtc2l6ZVwiIGlzID49IDI1Ni4gUmVkdWNlIHlvdXIgXCJ0ZXh0LXNpemVcIi5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1Y2tldC5hZGRTeW1ib2xzKFxuICAgICAgICBidWNrZXQudGV4dCxcbiAgICAgICAgZ2x5cGhRdWFkcyxcbiAgICAgICAgdGV4dFNpemVEYXRhLFxuICAgICAgICB0ZXh0T2Zmc2V0LFxuICAgICAgICB0ZXh0QWxvbmdMaW5lLFxuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB3cml0aW5nTW9kZSxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBsaW5lQXJyYXkubGluZVN0YXJ0SW5kZXgsXG4gICAgICAgIGxpbmVBcnJheS5saW5lTGVuZ3RoKTtcblxuICAgIC8vIFRoZSBwbGFjZWRTeW1ib2xBcnJheSBpcyB1c2VkIGF0IHJlbmRlciB0aW1lIGluIGRyYXdUaWxlU3ltYm9sc1xuICAgIC8vIFRoZXNlIGluZGljZXMgYWxsb3cgYWNjZXNzIHRvIHRoZSBhcnJheSBhdCBjb2xsaXNpb24gZGV0ZWN0aW9uIHRpbWVcbiAgICBmb3IgKGNvbnN0IHBsYWNlbWVudFR5cGUgb2YgcGxhY2VtZW50VHlwZXMpIHtcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXNbcGxhY2VtZW50VHlwZV0gPSBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIHJldHVybiBnbHlwaFF1YWRzLmxlbmd0aCAqIDQ7XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRIb3Jpem9udGFsU2hhcGluZyhob3Jpem9udGFsU2hhcGluZzoge1tUZXh0SnVzdGlmeV06IFNoYXBpbmd9KTogU2hhcGluZyB8IG51bGwge1xuICAgIC8vIFdlIGRvbid0IGNhcmUgd2hpY2ggc2hhcGluZyB3ZSBnZXQgYmVjYXVzZSB0aGlzIGlzIHVzZWQgZm9yIGNvbGxpc2lvbiBwdXJwb3Nlc1xuICAgIC8vIGFuZCBhbGwgdGhlIGp1c3RpZmljYXRpb25zIGhhdmUgdGhlIHNhbWUgY29sbGlzaW9uIGJveFxuICAgIGZvciAoY29uc3QganVzdGlmaWNhdGlvbjogYW55IGluIGhvcml6b250YWxTaGFwaW5nKSB7XG4gICAgICAgIHJldHVybiBob3Jpem9udGFsU2hhcGluZ1tqdXN0aWZpY2F0aW9uXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIGxhYmVsICYgaWNvbiBwbGFjZW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkU3ltYm9sKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgIGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgIGxpbmU6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zOiBhbnksXG4gICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24gfCB2b2lkLFxuICAgICAgICAgICAgICAgICAgIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLFxuICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0ZXh0Qm94U2NhbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0ZXh0UGFkZGluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHRleHRBbG9uZ0xpbmU6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICBpY29uQm94U2NhbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBpY29uUGFkZGluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIGljb25BbG9uZ0xpbmU6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgaWNvbk9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBTeW1ib2xGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25NYXA6IHtbc3RyaW5nXToge1tudW1iZXJdOiBHbHlwaFBvc2l0aW9ufX0sXG4gICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzKSB7XG4gICAgY29uc3QgbGluZUFycmF5ID0gYnVja2V0LmFkZFRvTGluZVZlcnRleEFycmF5KGFuY2hvciwgbGluZSk7XG5cbiAgICBsZXQgdGV4dENvbGxpc2lvbkZlYXR1cmUsIGljb25Db2xsaXNpb25GZWF0dXJlLCB2ZXJ0aWNhbFRleHRDb2xsaXNpb25GZWF0dXJlO1xuXG4gICAgbGV0IG51bUljb25WZXJ0aWNlcyA9IDA7XG4gICAgbGV0IG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzID0gMDtcbiAgICBsZXQgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID0gMDtcbiAgICBjb25zdCBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcyA9IHt9O1xuICAgIGxldCBrZXkgPSBtdXJtdXIzKCcnKTtcbiAgICBjb25zdCByYWRpYWxUZXh0T2Zmc2V0ID0gKGxheWVyLmxheW91dC5nZXQoJ3RleHQtcmFkaWFsLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KSB8fCAwKSAqIE9ORV9FTTtcblxuICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsKSB7XG4gICAgICAgIGNvbnN0IHRleHRSb3RhdGlvbiA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbFRleHRSb3RhdGlvbiA9IHRleHRSb3RhdGlvbiArIDkwLjA7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsU2hhcGluZyA9IHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWw7XG4gICAgICAgIHZlcnRpY2FsVGV4dENvbGxpc2lvbkZlYXR1cmUgPSBuZXcgQ29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheSwgbGluZSwgYW5jaG9yLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCB2ZXJ0aWNhbFNoYXBpbmcsIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUsIGJ1Y2tldC5vdmVyc2NhbGluZywgdmVydGljYWxUZXh0Um90YXRpb24pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QganVzdGlmaWNhdGlvbjogYW55IGluIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCkge1xuICAgICAgICBjb25zdCBzaGFwaW5nID0gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW2p1c3RpZmljYXRpb25dO1xuXG4gICAgICAgIGlmICghdGV4dENvbGxpc2lvbkZlYXR1cmUpIHtcbiAgICAgICAgICAgIGtleSA9IG11cm11cjMoc2hhcGluZy50ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRSb3RhdGUgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcbiAgICAgICAgICAgIC8vIEFzIGEgY29sbGlzaW9uIGFwcHJveGltYXRpb24sIHdlIGNhbiB1c2UgZWl0aGVyIHRoZSB2ZXJ0aWNhbCBvciBhbnkgb2YgdGhlIGhvcml6b250YWwgdmVyc2lvbnMgb2YgdGhlIGZlYXR1cmVcbiAgICAgICAgICAgIC8vIFdlJ3JlIGNvdW50aW5nIG9uIGFsbCB2ZXJzaW9ucyBoYXZpbmcgc2ltaWxhciBkaW1lbnNpb25zXG4gICAgICAgICAgICB0ZXh0Q29sbGlzaW9uRmVhdHVyZSA9IG5ldyBDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkJveEFycmF5LCBsaW5lLCBhbmNob3IsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsIHNoYXBpbmcsIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUsIGJ1Y2tldC5vdmVyc2NhbGluZywgdGV4dFJvdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaW5nbGVMaW5lID0gc2hhcGluZy5saW5lQ291bnQgPT09IDE7XG4gICAgICAgIG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzICs9IGFkZFRleHRWZXJ0aWNlcyhcbiAgICAgICAgICAgIGJ1Y2tldCwgYW5jaG9yLCBzaGFwaW5nLCBsYXllciwgdGV4dEFsb25nTGluZSwgZmVhdHVyZSwgdGV4dE9mZnNldCwgbGluZUFycmF5LFxuICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCA/IFdyaXRpbmdNb2RlLmhvcml6b250YWwgOiBXcml0aW5nTW9kZS5ob3Jpem9udGFsT25seSxcbiAgICAgICAgICAgIHNpbmdsZUxpbmUgPyAoT2JqZWN0LmtleXMoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsKTogYW55KSA6IFtqdXN0aWZpY2F0aW9uXSxcbiAgICAgICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLCBnbHlwaFBvc2l0aW9uTWFwLCBzaXplcyk7XG5cbiAgICAgICAgaWYgKHNpbmdsZUxpbmUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwpIHtcbiAgICAgICAgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzICs9IGFkZFRleHRWZXJ0aWNlcyhcbiAgICAgICAgICAgIGJ1Y2tldCwgYW5jaG9yLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsLCBsYXllciwgdGV4dEFsb25nTGluZSwgZmVhdHVyZSxcbiAgICAgICAgICAgIHRleHRPZmZzZXQsIGxpbmVBcnJheSwgV3JpdGluZ01vZGUudmVydGljYWwsIFsndmVydGljYWwnXSwgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMsIGdseXBoUG9zaXRpb25NYXAsIHNpemVzKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0Qm94U3RhcnRJbmRleCA9IHRleHRDb2xsaXNpb25GZWF0dXJlID8gdGV4dENvbGxpc2lvbkZlYXR1cmUuYm94U3RhcnRJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG4gICAgY29uc3QgdGV4dEJveEVuZEluZGV4ID0gdGV4dENvbGxpc2lvbkZlYXR1cmUgPyB0ZXh0Q29sbGlzaW9uRmVhdHVyZS5ib3hFbmRJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG5cbiAgICBjb25zdCB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4ID0gdmVydGljYWxUZXh0Q29sbGlzaW9uRmVhdHVyZSA/IHZlcnRpY2FsVGV4dENvbGxpc2lvbkZlYXR1cmUuYm94U3RhcnRJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG4gICAgY29uc3QgdmVydGljYWxUZXh0Qm94RW5kSW5kZXggPSB2ZXJ0aWNhbFRleHRDb2xsaXNpb25GZWF0dXJlID8gdmVydGljYWxUZXh0Q29sbGlzaW9uRmVhdHVyZS5ib3hFbmRJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoc2hhcGVkSWNvbikge1xuICAgICAgICBjb25zdCBpY29uUXVhZHMgPSBnZXRJY29uUXVhZHMoYW5jaG9yLCBzaGFwZWRJY29uLCBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uQWxvbmdMaW5lLCBnZXREZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlKTtcbiAgICAgICAgY29uc3QgaWNvblJvdGF0ZSA9IGxheWVyLmxheW91dC5nZXQoJ2ljb24tcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgICAgICBpY29uQ29sbGlzaW9uRmVhdHVyZSA9IG5ldyBDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkJveEFycmF5LCBsaW5lLCBhbmNob3IsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsIHNoYXBlZEljb24sIGljb25Cb3hTY2FsZSwgaWNvblBhZGRpbmcsIC8qYWxpZ24gYm94ZXMgdG8gbGluZSovZmFsc2UsIGJ1Y2tldC5vdmVyc2NhbGluZywgaWNvblJvdGF0ZSk7XG5cbiAgICAgICAgbnVtSWNvblZlcnRpY2VzID0gaWNvblF1YWRzLmxlbmd0aCAqIDQ7XG5cbiAgICAgICAgY29uc3Qgc2l6ZURhdGEgPSBidWNrZXQuaWNvblNpemVEYXRhO1xuICAgICAgICBsZXQgaWNvblNpemVEYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgIGljb25TaXplRGF0YSA9IFtcbiAgICAgICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1zaXplJykuZXZhbHVhdGUoZmVhdHVyZSwge30pXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGljb25TaXplRGF0YVswXSA+IE1BWF9QQUNLRURfU0laRSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcImljb24tc2l6ZVwiIGlzID49IDI1Ni4gUmVkdWNlIHlvdXIgXCJpY29uLXNpemVcIi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaXplRGF0YS5raW5kID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICAgICAgaWNvblNpemVEYXRhID0gW1xuICAgICAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBzaXplcy5jb21wb3NpdGVJY29uU2l6ZXNbMF0uZXZhbHVhdGUoZmVhdHVyZSwge30pLFxuICAgICAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBzaXplcy5jb21wb3NpdGVJY29uU2l6ZXNbMV0uZXZhbHVhdGUoZmVhdHVyZSwge30pXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGljb25TaXplRGF0YVswXSA+IE1BWF9QQUNLRURfU0laRSB8fCBpY29uU2l6ZURhdGFbMV0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAyNTYuIFJlZHVjZSB5b3VyIFwiaWNvbi1zaXplXCIuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWNrZXQuYWRkU3ltYm9scyhcbiAgICAgICAgICAgIGJ1Y2tldC5pY29uLFxuICAgICAgICAgICAgaWNvblF1YWRzLFxuICAgICAgICAgICAgaWNvblNpemVEYXRhLFxuICAgICAgICAgICAgaWNvbk9mZnNldCxcbiAgICAgICAgICAgIGljb25BbG9uZ0xpbmUsXG4gICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBsaW5lQXJyYXkubGluZVN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBsaW5lQXJyYXkubGluZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgaWNvbkJveFN0YXJ0SW5kZXggPSBpY29uQ29sbGlzaW9uRmVhdHVyZSA/IGljb25Db2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IGljb25Cb3hFbmRJbmRleCA9IGljb25Db2xsaXNpb25GZWF0dXJlID8gaWNvbkNvbGxpc2lvbkZlYXR1cmUuYm94RW5kSW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGJ1Y2tldC5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCA+PSBTeW1ib2xCdWNrZXQuTUFYX0dMWVBIUykgd2Fybk9uY2UoXG4gICAgICAgIFwiVG9vIG1hbnkgZ2x5cGhzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCJcbiAgICApO1xuXG4gICAgYnVja2V0LnN5bWJvbEluc3RhbmNlcy5lbXBsYWNlQmFjayhcbiAgICAgICAgYW5jaG9yLngsXG4gICAgICAgIGFuY2hvci55LFxuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5yaWdodCA+PSAwID8gcGxhY2VkVGV4dFN5bWJvbEluZGljZXMucmlnaHQgOiAtMSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMuY2VudGVyID49IDAgPyBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5jZW50ZXIgOiAtMSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMubGVmdCA+PSAwID8gcGxhY2VkVGV4dFN5bWJvbEluZGljZXMubGVmdCA6IC0xLFxuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy52ZXJ0aWNhbCB8fCAtMSxcbiAgICAgICAga2V5LFxuICAgICAgICB0ZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgdGV4dEJveEVuZEluZGV4LFxuICAgICAgICB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LFxuICAgICAgICB2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCxcbiAgICAgICAgaWNvbkJveFN0YXJ0SW5kZXgsXG4gICAgICAgIGljb25Cb3hFbmRJbmRleCxcbiAgICAgICAgZmVhdHVyZUluZGV4LFxuICAgICAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICBudW1JY29uVmVydGljZXMsXG4gICAgICAgIDAsXG4gICAgICAgIHRleHRCb3hTY2FsZSxcbiAgICAgICAgcmFkaWFsVGV4dE9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIGFuY2hvcklzVG9vQ2xvc2UoYnVja2V0OiBhbnksIHRleHQ6IHN0cmluZywgcmVwZWF0RGlzdGFuY2U6IG51bWJlciwgYW5jaG9yOiBQb2ludCkge1xuICAgIGNvbnN0IGNvbXBhcmVUZXh0ID0gYnVja2V0LmNvbXBhcmVUZXh0O1xuICAgIGlmICghKHRleHQgaW4gY29tcGFyZVRleHQpKSB7XG4gICAgICAgIGNvbXBhcmVUZXh0W3RleHRdID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3RoZXJBbmNob3JzID0gY29tcGFyZVRleHRbdGV4dF07XG4gICAgICAgIGZvciAobGV0IGsgPSBvdGhlckFuY2hvcnMubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcbiAgICAgICAgICAgIGlmIChhbmNob3IuZGlzdChvdGhlckFuY2hvcnNba10pIDwgcmVwZWF0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIHdpdGhpbiByZXBlYXREaXN0YW5jZSBvZiBvbmUgYW5jaG9yLCBzdG9wIGxvb2tpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBhbmNob3IgaXMgbm90IHdpdGhpbiByZXBlYXREaXN0YW5jZSBvZiBhbnkgb3RoZXIgYW5jaG9yLCBhZGQgdG8gYXJyYXlcbiAgICBjb21wYXJlVGV4dFt0ZXh0XS5wdXNoKGFuY2hvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiXG5pbXBvcnQgcmVmUHJvcGVydGllcyBmcm9tICcuL3V0aWwvcmVmX3Byb3BlcnRpZXMnO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwpXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBsZXQgc3RyID0gJ1snO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiBvYmopIHtcbiAgICAgICAgICAgIHN0ciArPSBgJHtzdHJpbmdpZnkodmFsKX0sYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7c3RyfV1gO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopLnNvcnQoKTtcblxuICAgIGxldCBzdHIgPSAneyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0ciArPSBgJHtKU09OLnN0cmluZ2lmeShrZXlzW2ldKX06JHtzdHJpbmdpZnkob2JqW2tleXNbaV1dKX0sYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3N0cn19YDtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5KGxheWVyKSB7XG4gICAgbGV0IGtleSA9ICcnO1xuICAgIGZvciAoY29uc3QgayBvZiByZWZQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGtleSArPSBgLyR7c3RyaW5naWZ5KGxheWVyW2tdKX1gO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBncm91cEJ5TGF5b3V0O1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGxheWVycywgcmV0dXJuIGFuIGFycmF5IG9mIGFycmF5cyBvZiBsYXllcnMgd2hlcmUgYWxsXG4gKiBsYXllcnMgaW4gZWFjaCBncm91cCBoYXZlIGlkZW50aWNhbCBsYXlvdXQtYWZmZWN0aW5nIHByb3BlcnRpZXMuIFRoZXNlXG4gKiBhcmUgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZXJlIGZvcm1lcmx5IHVzZWQgYnkgZXhwbGljaXQgYHJlZmAgbWVjaGFuaXNtXG4gKiBmb3IgbGF5ZXJzOiAndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ21pbnpvb20nLCAnbWF4em9vbScsXG4gKiAnZmlsdGVyJywgYW5kICdsYXlvdXQnLlxuICpcbiAqIFRoZSBpbnB1dCBpcyBub3QgbW9kaWZpZWQuIFRoZSBvdXRwdXQgbGF5ZXJzIGFyZSByZWZlcmVuY2VzIHRvIHRoZVxuICogaW5wdXQgbGF5ZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5PExheWVyPn0gbGF5ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gW2NhY2hlZEtleXNdIC0gYW4gb2JqZWN0IHRvIGtlZXAgYWxyZWFkeSBjYWxjdWxhdGVkIGtleXMuXG4gKiBAcmV0dXJucyB7QXJyYXk8QXJyYXk8TGF5ZXI+Pn1cbiAqL1xuZnVuY3Rpb24gZ3JvdXBCeUxheW91dChsYXllcnMsIGNhY2hlZEtleXMpIHtcbiAgICBjb25zdCBncm91cHMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgY29uc3QgayA9IChjYWNoZWRLZXlzICYmIGNhY2hlZEtleXNbbGF5ZXJzW2ldLmlkXSkgfHwgZ2V0S2V5KGxheWVyc1tpXSk7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgY2FjaGUgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgIGlmIChjYWNoZWRLZXlzKVxuICAgICAgICAgICAgY2FjaGVkS2V5c1tsYXllcnNbaV0uaWRdID0gaztcblxuICAgICAgICBsZXQgZ3JvdXAgPSBncm91cHNba107XG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW2tdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChsYXllcnNbaV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrIGluIGdyb3Vwcykge1xuICAgICAgICByZXN1bHQucHVzaChncm91cHNba10pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuL3N0eWxlX2xheWVyJztcbmltcG9ydCBjcmVhdGVTdHlsZUxheWVyIGZyb20gJy4vY3JlYXRlX3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCBmZWF0dXJlRmlsdGVyIGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXInO1xuaW1wb3J0IGdyb3VwQnlMYXlvdXQgZnJvbSAnLi4vc3R5bGUtc3BlYy9ncm91cF9ieV9sYXlvdXQnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZWRTdHlsZUxheWVyfSBmcm9tICcuL3N0eWxlX2xheWVyL3R5cGVkX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBMYXllckNvbmZpZ3MgPSB7IFtzdHJpbmddOiBMYXllclNwZWNpZmljYXRpb24gfTtcbmV4cG9ydCB0eXBlIEZhbWlseTxMYXllcjogVHlwZWRTdHlsZUxheWVyPiA9IEFycmF5PExheWVyPjtcblxuY2xhc3MgU3R5bGVMYXllckluZGV4IHtcbiAgICBmYW1pbGllc0J5U291cmNlOiB7IFtzb3VyY2U6IHN0cmluZ106IHsgW3NvdXJjZUxheWVyOiBzdHJpbmddOiBBcnJheTxGYW1pbHk8Kj4+IH0gfTtcbiAgICBrZXlDYWNoZTogeyBbc291cmNlOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAgIF9sYXllckNvbmZpZ3M6IExheWVyQ29uZmlncztcbiAgICBfbGF5ZXJzOiB7IFtzdHJpbmddOiBTdHlsZUxheWVyIH07XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllckNvbmZpZ3M6ID9BcnJheTxMYXllclNwZWNpZmljYXRpb24+KSB7XG4gICAgICAgIHRoaXMua2V5Q2FjaGUgPSB7fTtcbiAgICAgICAgaWYgKGxheWVyQ29uZmlncykge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKGxheWVyQ29uZmlncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXBsYWNlKGxheWVyQ29uZmlnczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPikge1xuICAgICAgICB0aGlzLl9sYXllckNvbmZpZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMudXBkYXRlKGxheWVyQ29uZmlncywgW10pO1xuICAgIH1cblxuICAgIHVwZGF0ZShsYXllckNvbmZpZ3M6IEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4sIHJlbW92ZWRJZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllckNvbmZpZyBvZiBsYXllckNvbmZpZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyQ29uZmlnc1tsYXllckNvbmZpZy5pZF0gPSBsYXllckNvbmZpZztcblxuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJDb25maWcuaWRdID0gY3JlYXRlU3R5bGVMYXllcihsYXllckNvbmZpZyk7XG4gICAgICAgICAgICBsYXllci5fZmVhdHVyZUZpbHRlciA9IGZlYXR1cmVGaWx0ZXIobGF5ZXIuZmlsdGVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmtleUNhY2hlW2xheWVyQ29uZmlnLmlkXSlcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5rZXlDYWNoZVtsYXllckNvbmZpZy5pZF07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiByZW1vdmVkSWRzKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5rZXlDYWNoZVtpZF07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbGF5ZXJDb25maWdzW2lkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mYW1pbGllc0J5U291cmNlID0ge307XG5cbiAgICAgICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBCeUxheW91dCh2YWx1ZXModGhpcy5fbGF5ZXJDb25maWdzKSwgdGhpcy5rZXlDYWNoZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllckNvbmZpZ3Mgb2YgZ3JvdXBzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcnMgPSBsYXllckNvbmZpZ3MubWFwKChsYXllckNvbmZpZykgPT4gdGhpcy5fbGF5ZXJzW2xheWVyQ29uZmlnLmlkXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzWzBdO1xuICAgICAgICAgICAgaWYgKGxheWVyLnZpc2liaWxpdHkgPT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGxheWVyLnNvdXJjZSB8fCAnJztcbiAgICAgICAgICAgIGxldCBzb3VyY2VHcm91cCA9IHRoaXMuZmFtaWxpZXNCeVNvdXJjZVtzb3VyY2VJZF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZUdyb3VwKSB7XG4gICAgICAgICAgICAgICAgc291cmNlR3JvdXAgPSB0aGlzLmZhbWlsaWVzQnlTb3VyY2Vbc291cmNlSWRdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVySWQgPSBsYXllci5zb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICAgICAgbGV0IHNvdXJjZUxheWVyRmFtaWxpZXMgPSBzb3VyY2VHcm91cFtzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlTGF5ZXJGYW1pbGllcykge1xuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVyRmFtaWxpZXMgPSBzb3VyY2VHcm91cFtzb3VyY2VMYXllcklkXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzb3VyY2VMYXllckZhbWlsaWVzLnB1c2gobGF5ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3R5bGVMYXllckluZGV4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgQWxwaGFJbWFnZSB9IGZyb20gJy4uL3V0aWwvaW1hZ2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IHBvdHBhY2sgZnJvbSAncG90cGFjayc7XG5cbmltcG9ydCB0eXBlIHtHbHlwaE1ldHJpY3MsIFN0eWxlR2x5cGh9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2dseXBoJztcblxuY29uc3QgcGFkZGluZyA9IDE7XG5cbnR5cGUgUmVjdCA9IHtcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHc6IG51bWJlcixcbiAgICBoOiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIEdseXBoUG9zaXRpb24gPSB7XG4gICAgcmVjdDogUmVjdCxcbiAgICBtZXRyaWNzOiBHbHlwaE1ldHJpY3Ncbn07XG5cbmV4cG9ydCB0eXBlIEdseXBoUG9zaXRpb25zID0geyBbc3RyaW5nXTogeyBbbnVtYmVyXTogR2x5cGhQb3NpdGlvbiB9IH1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2x5cGhBdGxhcyB7XG4gICAgaW1hZ2U6IEFscGhhSW1hZ2U7XG4gICAgcG9zaXRpb25zOiBHbHlwaFBvc2l0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKHN0YWNrczogeyBbc3RyaW5nXTogeyBbbnVtYmVyXTogP1N0eWxlR2x5cGggfSB9KSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHt9O1xuICAgICAgICBjb25zdCBiaW5zID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBzdGFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdseXBocyA9IHN0YWNrc1tzdGFja107XG4gICAgICAgICAgICBjb25zdCBzdGFja1Bvc2l0aW9ucyA9IHBvc2l0aW9uc1tzdGFja10gPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBnbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBnbHlwaHNbK2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoIXNyYyB8fCBzcmMuYml0bWFwLndpZHRoID09PSAwIHx8IHNyYy5iaXRtYXAuaGVpZ2h0ID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJpbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICAgICAgdzogc3JjLmJpdG1hcC53aWR0aCArIDIgKiBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICBoOiBzcmMuYml0bWFwLmhlaWdodCArIDIgKiBwYWRkaW5nXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBiaW5zLnB1c2goYmluKTtcbiAgICAgICAgICAgICAgICBzdGFja1Bvc2l0aW9uc1tpZF0gPSB7cmVjdDogYmluLCBtZXRyaWNzOiBzcmMubWV0cmljc307XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7dywgaH0gPSBwb3RwYWNrKGJpbnMpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBBbHBoYUltYWdlKHt3aWR0aDogdyB8fCAxLCBoZWlnaHQ6IGggfHwgMX0pO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhY2sgaW4gc3RhY2tzKSB7XG4gICAgICAgICAgICBjb25zdCBnbHlwaHMgPSBzdGFja3Nbc3RhY2tdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGdseXBocykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGdseXBoc1sraWRdO1xuICAgICAgICAgICAgICAgIGlmICghc3JjIHx8IHNyYy5iaXRtYXAud2lkdGggPT09IDAgfHwgc3JjLmJpdG1hcC5oZWlnaHQgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbiA9IHBvc2l0aW9uc1tzdGFja11baWRdLnJlY3Q7XG4gICAgICAgICAgICAgICAgQWxwaGFJbWFnZS5jb3B5KHNyYy5iaXRtYXAsIGltYWdlLCB7eDogMCwgeTogMH0sIHt4OiBiaW4ueCArIHBhZGRpbmcsIHk6IGJpbi55ICsgcGFkZGluZ30sIHNyYy5iaXRtYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdHbHlwaEF0bGFzJywgR2x5cGhBdGxhcyk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRmVhdHVyZUluZGV4IGZyb20gJy4uL2RhdGEvZmVhdHVyZV9pbmRleCc7XG5cbmltcG9ydCB7IHBlcmZvcm1TeW1ib2xMYXlvdXQgfSBmcm9tICcuLi9zeW1ib2wvc3ltYm9sX2xheW91dCc7XG5pbXBvcnQgeyBDb2xsaXNpb25Cb3hBcnJheSB9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IERpY3Rpb25hcnlDb2RlciBmcm9tICcuLi91dGlsL2RpY3Rpb25hcnlfY29kZXInO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0JztcbmltcG9ydCBGaWxsQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0JztcbmltcG9ydCBGaWxsRXh0cnVzaW9uQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldCc7XG5pbXBvcnQgeyB3YXJuT25jZSwgbWFwT2JqZWN0LCB2YWx1ZXMgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IEltYWdlQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcbmltcG9ydCBHbHlwaEF0bGFzIGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCB7IE92ZXJzY2FsZWRUaWxlSUQgfSBmcm9tICcuL3RpbGVfaWQnO1xuXG5pbXBvcnQgdHlwZSB7QnVja2V0fSBmcm9tICcuLi9kYXRhL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4JztcbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZSc7XG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHR5cGUge1xuICAgIFdvcmtlclRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlclRpbGVDYWxsYmFjayxcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UnO1xuXG5jbGFzcyBXb3JrZXJUaWxlIHtcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQ7XG4gICAgdWlkOiBzdHJpbmc7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIHBpeGVsUmF0aW86IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIHNvdXJjZTogc3RyaW5nO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgc2hvd0NvbGxpc2lvbkJveGVzOiBib29sZWFuO1xuICAgIGNvbGxlY3RSZXNvdXJjZVRpbWluZzogYm9vbGVhbjtcbiAgICByZXR1cm5EZXBlbmRlbmNpZXM6IGJvb2xlYW47XG5cbiAgICBzdGF0dXM6ICdwYXJzaW5nJyB8ICdkb25lJztcbiAgICBkYXRhOiBWZWN0b3JUaWxlO1xuICAgIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheTtcblxuICAgIGFib3J0OiA/KCkgPT4gdm9pZDtcbiAgICByZWxvYWRDYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrO1xuICAgIHZlY3RvclRpbGU6IFZlY3RvclRpbGU7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMudGlsZUlEID0gbmV3IE92ZXJzY2FsZWRUaWxlSUQocGFyYW1zLnRpbGVJRC5vdmVyc2NhbGVkWiwgcGFyYW1zLnRpbGVJRC53cmFwLCBwYXJhbXMudGlsZUlELmNhbm9uaWNhbC56LCBwYXJhbXMudGlsZUlELmNhbm9uaWNhbC54LCBwYXJhbXMudGlsZUlELmNhbm9uaWNhbC55KTtcbiAgICAgICAgdGhpcy51aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICB0aGlzLnpvb20gPSBwYXJhbXMuem9vbTtcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvID0gcGFyYW1zLnBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSBwYXJhbXMudGlsZVNpemU7XG4gICAgICAgIHRoaXMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IHRoaXMudGlsZUlELm92ZXJzY2FsZUZhY3RvcigpO1xuICAgICAgICB0aGlzLnNob3dDb2xsaXNpb25Cb3hlcyA9IHBhcmFtcy5zaG93Q29sbGlzaW9uQm94ZXM7XG4gICAgICAgIHRoaXMuY29sbGVjdFJlc291cmNlVGltaW5nID0gISFwYXJhbXMuY29sbGVjdFJlc291cmNlVGltaW5nO1xuICAgICAgICB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA9ICEhcGFyYW1zLnJldHVybkRlcGVuZGVuY2llcztcbiAgICB9XG5cbiAgICBwYXJzZShkYXRhOiBWZWN0b3JUaWxlLCBsYXllckluZGV4OiBTdHlsZUxheWVySW5kZXgsIGFjdG9yOiBBY3RvciwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdwYXJzaW5nJztcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gbmV3IENvbGxpc2lvbkJveEFycmF5KCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyQ29kZXIgPSBuZXcgRGljdGlvbmFyeUNvZGVyKE9iamVjdC5rZXlzKGRhdGEubGF5ZXJzKS5zb3J0KCkpO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IG5ldyBGZWF0dXJlSW5kZXgodGhpcy50aWxlSUQpO1xuICAgICAgICBmZWF0dXJlSW5kZXguYnVja2V0TGF5ZXJJRHMgPSBbXTtcblxuICAgICAgICBjb25zdCBidWNrZXRzOiB7W3N0cmluZ106IEJ1Y2tldH0gPSB7fTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgZmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgaWNvbkRlcGVuZGVuY2llczoge30sXG4gICAgICAgICAgICBwYXR0ZXJuRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgICAgICAgIGdseXBoRGVwZW5kZW5jaWVzOiB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGxheWVyRmFtaWxpZXMgPSBsYXllckluZGV4LmZhbWlsaWVzQnlTb3VyY2VbdGhpcy5zb3VyY2VdO1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVySWQgaW4gbGF5ZXJGYW1pbGllcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBkYXRhLmxheWVyc1tzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNvdXJjZUxheWVyLnZlcnNpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZShgVmVjdG9yIHRpbGUgc291cmNlIFwiJHt0aGlzLnNvdXJjZX1cIiBsYXllciBcIiR7c291cmNlTGF5ZXJJZH1cIiBgICtcbiAgICAgICAgICAgICAgICAgICAgYGRvZXMgbm90IHVzZSB2ZWN0b3IgdGlsZSBzcGVjIHYyIGFuZCB0aGVyZWZvcmUgbWF5IGhhdmUgc29tZSByZW5kZXJpbmcgZXJyb3JzLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllckluZGV4ID0gc291cmNlTGF5ZXJDb2Rlci5lbmNvZGUoc291cmNlTGF5ZXJJZCk7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZUxheWVyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBzb3VyY2VMYXllci5mZWF0dXJlKGluZGV4KTtcbiAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKHsgZmVhdHVyZSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXggfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZmFtaWx5IG9mIGxheWVyRmFtaWxpZXNbc291cmNlTGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IGZhbWlseVswXTtcblxuICAgICAgICAgICAgICAgIGFzc2VydChsYXllci5zb3VyY2UgPT09IHRoaXMuc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIubWluem9vbSAmJiB0aGlzLnpvb20gPCBNYXRoLmZsb29yKGxheWVyLm1pbnpvb20pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIubWF4em9vbSAmJiB0aGlzLnpvb20gPj0gbGF5ZXIubWF4em9vbSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyLnZpc2liaWxpdHkgPT09ICdub25lJykgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICByZWNhbGN1bGF0ZUxheWVycyhmYW1pbHksIHRoaXMuem9vbSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidWNrZXQgPSBidWNrZXRzW2xheWVyLmlkXSA9IGxheWVyLmNyZWF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBmZWF0dXJlSW5kZXguYnVja2V0TGF5ZXJJRHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBsYXllcnM6IGZhbWlseSxcbiAgICAgICAgICAgICAgICAgICAgem9vbTogdGhpcy56b29tLFxuICAgICAgICAgICAgICAgICAgICBwaXhlbFJhdGlvOiB0aGlzLnBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIG92ZXJzY2FsaW5nOiB0aGlzLm92ZXJzY2FsaW5nLFxuICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogdGhpcy5jb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSUQ6IHRoaXMuc291cmNlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBidWNrZXQucG9wdWxhdGUoZmVhdHVyZXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEcy5wdXNoKGZhbWlseS5tYXAoKGwpID0+IGwuaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlcnJvcjogP0Vycm9yO1xuICAgICAgICBsZXQgZ2x5cGhNYXA6ID97W3N0cmluZ106IHtbbnVtYmVyXTogP1N0eWxlR2x5cGh9fTtcbiAgICAgICAgbGV0IGljb25NYXA6ID97W3N0cmluZ106IFN0eWxlSW1hZ2V9O1xuICAgICAgICBsZXQgcGF0dGVybk1hcDogP3tbc3RyaW5nXTogU3R5bGVJbWFnZX07XG5cbiAgICAgICAgY29uc3Qgc3RhY2tzID0gbWFwT2JqZWN0KG9wdGlvbnMuZ2x5cGhEZXBlbmRlbmNpZXMsIChnbHlwaHMpID0+IE9iamVjdC5rZXlzKGdseXBocykubWFwKE51bWJlcikpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3RhY2tzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQoJ2dldEdseXBocycsIHt1aWQ6IHRoaXMudWlkLCBzdGFja3N9LCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgbWF5YmVQcmVwYXJlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbHlwaE1hcCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWNvbnMgPSBPYmplY3Qua2V5cyhvcHRpb25zLmljb25EZXBlbmRlbmNpZXMpO1xuICAgICAgICBpZiAoaWNvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhY3Rvci5zZW5kKCdnZXRJbWFnZXMnLCB7aWNvbnN9LCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICBpY29uTWFwID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBtYXliZVByZXBhcmUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGljb25NYXAgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMob3B0aW9ucy5wYXR0ZXJuRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgaWYgKHBhdHRlcm5zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0SW1hZ2VzJywge2ljb25zOiBwYXR0ZXJuc30sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5NYXAgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0dGVybk1hcCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgbWF5YmVQcmVwYXJlLmNhbGwodGhpcyk7XG5cbiAgICAgICAgZnVuY3Rpb24gbWF5YmVQcmVwYXJlKCkge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2x5cGhNYXAgJiYgaWNvbk1hcCAmJiBwYXR0ZXJuTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhBdGxhcyA9IG5ldyBHbHlwaEF0bGFzKGdseXBoTWFwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUF0bGFzID0gbmV3IEltYWdlQXRsYXMoaWNvbk1hcCwgcGF0dGVybk1hcCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBidWNrZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IGJ1Y2tldHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldCBpbnN0YW5jZW9mIFN5bWJvbEJ1Y2tldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVMYXllcnMoYnVja2V0LmxheWVycywgdGhpcy56b29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TeW1ib2xMYXlvdXQoYnVja2V0LCBnbHlwaE1hcCwgZ2x5cGhBdGxhcy5wb3NpdGlvbnMsIGljb25NYXAsIGltYWdlQXRsYXMuaWNvblBvc2l0aW9ucywgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1Y2tldC5oYXNQYXR0ZXJuICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoYnVja2V0IGluc3RhbmNlb2YgTGluZUJ1Y2tldCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCBpbnN0YW5jZW9mIEZpbGxCdWNrZXQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQgaW5zdGFuY2VvZiBGaWxsRXh0cnVzaW9uQnVja2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVMYXllcnMoYnVja2V0LmxheWVycywgdGhpcy56b29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5hZGRGZWF0dXJlcyhvcHRpb25zLCBpbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnZG9uZSc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRzOiB2YWx1ZXMoYnVja2V0cykuZmlsdGVyKGIgPT4gIWIuaXNFbXB0eSgpKSxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogdGhpcy5jb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhBdGxhc0ltYWdlOiBnbHlwaEF0bGFzLmltYWdlLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZUF0bGFzLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHVzZWQgZm9yIGJlbmNobWFya2luZzpcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXA6IHRoaXMucmV0dXJuRGVwZW5kZW5jaWVzID8gZ2x5cGhNYXAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpY29uTWFwOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IGljb25NYXAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uczogdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPyBnbHlwaEF0bGFzLnBvc2l0aW9ucyA6IG51bGxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVjYWxjdWxhdGVMYXllcnMobGF5ZXJzOiAkUmVhZE9ubHlBcnJheTxTdHlsZUxheWVyPiwgem9vbTogbnVtYmVyKSB7XG4gICAgLy8gTGF5ZXJzIGFyZSBzaGFyZWQgYW5kIG1heSBoYXZlIGJlZW4gdXNlZCBieSBhIFdvcmtlclRpbGUgd2l0aCBhIGRpZmZlcmVudCB6b29tLlxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoem9vbSk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgbGF5ZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycyk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBXb3JrZXJUaWxlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1JlcXVlc3RQYXJhbWV0ZXJzfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuXG4vLyBXcmFwcyBwZXJmb3JtYW5jZSB0byBmYWNpbGl0YXRlIHRlc3Rpbmdcbi8vIE5vdCBpbmNvcnBvcmF0ZWQgaW50byBicm93c2VyLmpzIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBwb2lzb25vdXMgd2hlbiB1c2VkIG91dHNpZGUgdGhlIG1haW4gdGhyZWFkXG5jb25zdCBwZXJmb3JtYW5jZUV4aXN0cyA9IHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCc7XG5jb25zdCB3cmFwcGVyID0ge307XG5cbndyYXBwZXIuZ2V0RW50cmllc0J5TmFtZSA9ICh1cmw6IHN0cmluZykgPT4ge1xuICAgIGlmIChwZXJmb3JtYW5jZUV4aXN0cyAmJiBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKVxuICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSh1cmwpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xufTtcblxud3JhcHBlci5tYXJrID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGlmIChwZXJmb3JtYW5jZUV4aXN0cyAmJiBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZS5tYXJrKVxuICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2UubWFyayhuYW1lKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbn07XG5cbndyYXBwZXIubWVhc3VyZSA9IChuYW1lOiBzdHJpbmcsIHN0YXJ0TWFyazogc3RyaW5nLCBlbmRNYXJrOiBzdHJpbmcpID0+IHtcbiAgICBpZiAocGVyZm9ybWFuY2VFeGlzdHMgJiYgcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2UubWVhc3VyZSlcbiAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm1lYXN1cmUobmFtZSwgc3RhcnRNYXJrLCBlbmRNYXJrKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbn07XG5cbndyYXBwZXIuY2xlYXJNYXJrcyA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBpZiAocGVyZm9ybWFuY2VFeGlzdHMgJiYgcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcylcbiAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MobmFtZSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG59O1xuXG53cmFwcGVyLmNsZWFyTWVhc3VyZXMgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHBlcmZvcm1hbmNlRXhpc3RzICYmIHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMpXG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKG5hbWUpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBTYWZlIHdyYXBwZXIgZm9yIHRoZSBwZXJmb3JtYW5jZSByZXNvdXJjZSB0aW1pbmcgQVBJIGluIHdlYiB3b3JrZXJzIHdpdGggZ3JhY2VmdWwgZGVncmFkYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlcXVlc3RQYXJhbWV0ZXJzfSByZXF1ZXN0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQZXJmb3JtYW5jZSB7XG4gICAgX21hcmtzOiB7c3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIG1lYXN1cmU6IHN0cmluZ307XG5cbiAgICBjb25zdHJ1Y3RvciAocmVxdWVzdDogUmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5fbWFya3MgPSB7XG4gICAgICAgICAgICBzdGFydDogW3JlcXVlc3QudXJsLCAnc3RhcnQnXS5qb2luKCcjJyksXG4gICAgICAgICAgICBlbmQ6IFtyZXF1ZXN0LnVybCwgJ2VuZCddLmpvaW4oJyMnKSxcbiAgICAgICAgICAgIG1lYXN1cmU6IHJlcXVlc3QudXJsLnRvU3RyaW5nKClcbiAgICAgICAgfTtcblxuICAgICAgICB3cmFwcGVyLm1hcmsodGhpcy5fbWFya3Muc3RhcnQpO1xuICAgIH1cblxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgd3JhcHBlci5tYXJrKHRoaXMuX21hcmtzLmVuZCk7XG4gICAgICAgIGxldCByZXNvdXJjZVRpbWluZ0RhdGEgPSB3cmFwcGVyLmdldEVudHJpZXNCeU5hbWUodGhpcy5fbWFya3MubWVhc3VyZSk7XG5cbiAgICAgICAgLy8gZmFsbGJhY2sgaWYgd2ViIHdvcmtlciBpbXBsZW1lbnRhdGlvbiBvZiBwZXJmLmdldEVudHJpZXNCeU5hbWUgcmV0dXJucyBlbXB0eVxuICAgICAgICBpZiAocmVzb3VyY2VUaW1pbmdEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgd3JhcHBlci5tZWFzdXJlKHRoaXMuX21hcmtzLm1lYXN1cmUsIHRoaXMuX21hcmtzLnN0YXJ0LCB0aGlzLl9tYXJrcy5lbmQpO1xuICAgICAgICAgICAgcmVzb3VyY2VUaW1pbmdEYXRhID0gd3JhcHBlci5nZXRFbnRyaWVzQnlOYW1lKHRoaXMuX21hcmtzLm1lYXN1cmUpO1xuXG4gICAgICAgICAgICAvLyBjbGVhbnVwXG4gICAgICAgICAgICB3cmFwcGVyLmNsZWFyTWFya3ModGhpcy5fbWFya3Muc3RhcnQpO1xuICAgICAgICAgICAgd3JhcHBlci5jbGVhck1hcmtzKHRoaXMuX21hcmtzLmVuZCk7XG4gICAgICAgICAgICB3cmFwcGVyLmNsZWFyTWVhc3VyZXModGhpcy5fbWFya3MubWVhc3VyZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb3VyY2VUaW1pbmdEYXRhO1xuICAgIH1cbn1cblxud3JhcHBlci5QZXJmb3JtYW5jZSA9IFBlcmZvcm1hbmNlO1xuXG5leHBvcnQgZGVmYXVsdCB3cmFwcGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgZ2V0QXJyYXlCdWZmZXIgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuXG5pbXBvcnQgdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5pbXBvcnQgUHJvdG9idWYgZnJvbSAncGJmJztcbmltcG9ydCBXb3JrZXJUaWxlIGZyb20gJy4vd29ya2VyX3RpbGUnO1xuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCBwZXJmb3JtYW5jZSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlJztcblxuaW1wb3J0IHR5cGUge1xuICAgIFdvcmtlclNvdXJjZSxcbiAgICBXb3JrZXJUaWxlUGFyYW1ldGVycyxcbiAgICBXb3JrZXJUaWxlQ2FsbGJhY2ssXG4gICAgVGlsZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UnO1xuXG5pbXBvcnQgdHlwZSBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXJJbmRleCBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcl9pbmRleCc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcblxuZXhwb3J0IHR5cGUgTG9hZFZlY3RvclRpbGVSZXN1bHQgPSB7XG4gICAgdmVjdG9yVGlsZTogVmVjdG9yVGlsZTtcbiAgICByYXdEYXRhOiBBcnJheUJ1ZmZlcjtcbiAgICBleHBpcmVzPzogYW55O1xuICAgIGNhY2hlQ29udHJvbD86IGFueTtcbiAgICByZXNvdXJjZVRpbWluZz86IEFycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+O1xufTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgTG9hZFZlY3RvckRhdGFDYWxsYmFja1xuICogQHBhcmFtIGVycm9yXG4gKiBAcGFyYW0gdmVjdG9yVGlsZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IHR5cGUgTG9hZFZlY3RvckRhdGFDYWxsYmFjayA9IENhbGxiYWNrPD9Mb2FkVmVjdG9yVGlsZVJlc3VsdD47XG5cbmV4cG9ydCB0eXBlIEFib3J0VmVjdG9yRGF0YSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBMb2FkVmVjdG9yRGF0YSA9IChwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogTG9hZFZlY3RvckRhdGFDYWxsYmFjaykgPT4gP0Fib3J0VmVjdG9yRGF0YTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkVmVjdG9yVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogTG9hZFZlY3RvckRhdGFDYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBnZXRBcnJheUJ1ZmZlcihwYXJhbXMucmVxdWVzdCwgKGVycjogP0Vycm9yLCBkYXRhOiA/QXJyYXlCdWZmZXIsIGNhY2hlQ29udHJvbDogP3N0cmluZywgZXhwaXJlczogP3N0cmluZykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICAgICAgICB2ZWN0b3JUaWxlOiBuZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYoZGF0YSkpLFxuICAgICAgICAgICAgICAgIHJhd0RhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgIGV4cGlyZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIFRoZSB7QGxpbmsgV29ya2VyU291cmNlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN1cHBvcnRzIHtAbGluayBWZWN0b3JUaWxlU291cmNlfS5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZWFzaWx5IHJldXNlZCB0byBzdXBwb3J0IGN1c3RvbSBzb3VyY2UgdHlwZXNcbiAqIGZvciBkYXRhIGZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkL2NvbnZlcnRlZCBpbnRvIGFuIGluLW1lbW9yeSBWZWN0b3JUaWxlXG4gKiByZXByZXNlbnRhdGlvbi4gIFRvIGRvIHNvLCBjcmVhdGUgaXQgd2l0aFxuICogYG5ldyBWZWN0b3JUaWxlV29ya2VyU291cmNlKGFjdG9yLCBzdHlsZUxheWVycywgY3VzdG9tTG9hZFZlY3RvckRhdGFGdW5jdGlvbilgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UgaW1wbGVtZW50cyBXb3JrZXJTb3VyY2Uge1xuICAgIGFjdG9yOiBBY3RvcjtcbiAgICBsYXllckluZGV4OiBTdHlsZUxheWVySW5kZXg7XG4gICAgbG9hZFZlY3RvckRhdGE6IExvYWRWZWN0b3JEYXRhO1xuICAgIGxvYWRpbmc6IHsgW3N0cmluZ106IFdvcmtlclRpbGUgfTtcbiAgICBsb2FkZWQ6IHsgW3N0cmluZ106IFdvcmtlclRpbGUgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBbbG9hZFZlY3RvckRhdGFdIE9wdGlvbmFsIG1ldGhvZCBmb3IgY3VzdG9tIGxvYWRpbmcgb2YgYSBWZWN0b3JUaWxlXG4gICAgICogb2JqZWN0IGJhc2VkIG9uIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIG1haW4tdGhyZWFkIFNvdXJjZS4gU2VlXG4gICAgICoge0BsaW5rIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UjbG9hZFRpbGV9LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHlcbiAgICAgKiBsb2FkcyB0aGUgcGJmIGF0IGBwYXJhbXMudXJsYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhY3RvcjogQWN0b3IsIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleCwgbG9hZFZlY3RvckRhdGE6ID9Mb2FkVmVjdG9yRGF0YSkge1xuICAgICAgICB0aGlzLmFjdG9yID0gYWN0b3I7XG4gICAgICAgIHRoaXMubGF5ZXJJbmRleCA9IGxheWVySW5kZXg7XG4gICAgICAgIHRoaXMubG9hZFZlY3RvckRhdGEgPSBsb2FkVmVjdG9yRGF0YSB8fCBsb2FkVmVjdG9yVGlsZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0ge307XG4gICAgICAgIHRoaXMubG9hZGVkID0ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI2xvYWRUaWxlfS4gRGVsZWdhdGVzIHRvXG4gICAgICoge0BsaW5rIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UjbG9hZFZlY3RvckRhdGF9ICh3aGljaCBieSBkZWZhdWx0IGV4cGVjdHNcbiAgICAgKiBhIGBwYXJhbXMudXJsYCBwcm9wZXJ0eSkgZm9yIGZldGNoaW5nIGFuZCBwcm9kdWNpbmcgYSBWZWN0b3JUaWxlIG9iamVjdC5cbiAgICAgKi9cbiAgICBsb2FkVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVpZCA9IHBhcmFtcy51aWQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvYWRpbmcpXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB7fTtcblxuICAgICAgICBjb25zdCBwZXJmID0gKHBhcmFtcyAmJiBwYXJhbXMucmVxdWVzdCAmJiBwYXJhbXMucmVxdWVzdC5jb2xsZWN0UmVzb3VyY2VUaW1pbmcpID9cbiAgICAgICAgICAgIG5ldyBwZXJmb3JtYW5jZS5QZXJmb3JtYW5jZShwYXJhbXMucmVxdWVzdCkgOiBmYWxzZTtcblxuICAgICAgICBjb25zdCB3b3JrZXJUaWxlID0gdGhpcy5sb2FkaW5nW3VpZF0gPSBuZXcgV29ya2VyVGlsZShwYXJhbXMpO1xuICAgICAgICB3b3JrZXJUaWxlLmFib3J0ID0gdGhpcy5sb2FkVmVjdG9yRGF0YShwYXJhbXMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nW3VpZF07XG5cbiAgICAgICAgICAgIGlmIChlcnIgfHwgIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgd29ya2VyVGlsZS5zdGF0dXMgPSAnZG9uZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRbdWlkXSA9IHdvcmtlclRpbGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhd1RpbGVEYXRhID0gcmVzcG9uc2UucmF3RGF0YTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IHt9O1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmV4cGlyZXMpIGNhY2hlQ29udHJvbC5leHBpcmVzID0gcmVzcG9uc2UuZXhwaXJlcztcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5jYWNoZUNvbnRyb2wpIGNhY2hlQ29udHJvbC5jYWNoZUNvbnRyb2wgPSByZXNwb25zZS5jYWNoZUNvbnRyb2w7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nID0ge307XG4gICAgICAgICAgICBpZiAocGVyZikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nRGF0YSA9IHBlcmYuZmluaXNoKCk7XG4gICAgICAgICAgICAgICAgLy8gaXQncyBuZWNlc3NhcnkgdG8gZXZhbCB0aGUgcmVzdWx0IG9mIGdldEVudHJpZXNCeU5hbWUoKSBoZXJlIHZpYSBwYXJzZS9zdHJpbmdpZnlcbiAgICAgICAgICAgICAgICAvLyBsYXRlIGV2YWx1YXRpb24gaW4gdGhlIG1haW4gdGhyZWFkIGNhdXNlcyBUeXBlRXJyb3I6IGlsbGVnYWwgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVRpbWluZ0RhdGEpXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlVGltaW5nLnJlc291cmNlVGltaW5nID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZVRpbWluZ0RhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29ya2VyVGlsZS52ZWN0b3JUaWxlID0gcmVzcG9uc2UudmVjdG9yVGlsZTtcbiAgICAgICAgICAgIHdvcmtlclRpbGUucGFyc2UocmVzcG9uc2UudmVjdG9yVGlsZSwgdGhpcy5sYXllckluZGV4LCB0aGlzLmFjdG9yLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFyZXN1bHQpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuXG4gICAgICAgICAgICAgICAgLy8gVHJhbnNmZXJyaW5nIGEgY29weSBvZiByYXdUaWxlRGF0YSBiZWNhdXNlIHRoZSB3b3JrZXIgbmVlZHMgdG8gcmV0YWluIGl0cyBjb3B5LlxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGV4dGVuZCh7cmF3VGlsZURhdGE6IHJhd1RpbGVEYXRhLnNsaWNlKDApfSwgcmVzdWx0LCBjYWNoZUNvbnRyb2wsIHJlc291cmNlVGltaW5nKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0aGlzLmxvYWRlZCB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkW3VpZF0gPSB3b3JrZXJUaWxlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjcmVsb2FkVGlsZX0uXG4gICAgICovXG4gICAgcmVsb2FkVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZCxcbiAgICAgICAgICAgIHZ0U291cmNlID0gdGhpcztcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyVGlsZSA9IGxvYWRlZFt1aWRdO1xuICAgICAgICAgICAgd29ya2VyVGlsZS5zaG93Q29sbGlzaW9uQm94ZXMgPSBwYXJhbXMuc2hvd0NvbGxpc2lvbkJveGVzO1xuXG4gICAgICAgICAgICBjb25zdCBkb25lID0gKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZENhbGxiYWNrID0gd29ya2VyVGlsZS5yZWxvYWRDYWxsYmFjaztcbiAgICAgICAgICAgICAgICBpZiAocmVsb2FkQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlclRpbGUucmVsb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlclRpbGUucGFyc2Uod29ya2VyVGlsZS52ZWN0b3JUaWxlLCB2dFNvdXJjZS5sYXllckluZGV4LCB2dFNvdXJjZS5hY3RvciwgcmVsb2FkQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHdvcmtlclRpbGUuc3RhdHVzID09PSAncGFyc2luZycpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnJlbG9hZENhbGxiYWNrID0gZG9uZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod29ya2VyVGlsZS5zdGF0dXMgPT09ICdkb25lJykge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBubyB2ZWN0b3IgdGlsZSBkYXRhIG9uIHRoZSBpbml0aWFsIGxvYWQsIGRvbid0IHRyeSBhbmQgcmUtcGFyc2UgdGlsZVxuICAgICAgICAgICAgICAgIGlmICh3b3JrZXJUaWxlLnZlY3RvclRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyVGlsZS5wYXJzZSh3b3JrZXJUaWxlLnZlY3RvclRpbGUsIHRoaXMubGF5ZXJJbmRleCwgdGhpcy5hY3RvciwgZG9uZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNhYm9ydFRpbGV9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAgKi9cbiAgICBhYm9ydFRpbGUocGFyYW1zOiBUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5sb2FkaW5nLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRpbmcgJiYgbG9hZGluZ1t1aWRdICYmIGxvYWRpbmdbdWlkXS5hYm9ydCkge1xuICAgICAgICAgICAgbG9hZGluZ1t1aWRdLmFib3J0KCk7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGluZ1t1aWRdO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI3JlbW92ZVRpbGV9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAgKi9cbiAgICByZW1vdmVUaWxlKHBhcmFtczogVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGVkW3VpZF07XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlY3RvclRpbGVXb3JrZXJTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhJztcblxuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvcic7XG5pbXBvcnQgdHlwZSB7XG4gICAgV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyREVNVGlsZUNhbGxiYWNrLFxuICAgIFRpbGVQYXJhbWV0ZXJzXG59IGZyb20gJy4vd29ya2VyX3NvdXJjZSc7XG5cbmNsYXNzIFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2Uge1xuICAgIGFjdG9yOiBBY3RvcjtcbiAgICBsb2FkZWQ6IHtbc3RyaW5nXTogREVNRGF0YX07XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB7fTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZShwYXJhbXM6IFdvcmtlckRFTVRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyREVNVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHt1aWQsIGVuY29kaW5nLCByYXdJbWFnZURhdGF9ID0gcGFyYW1zO1xuICAgICAgICBjb25zdCBkZW0gPSBuZXcgREVNRGF0YSh1aWQsIHJhd0ltYWdlRGF0YSwgZW5jb2RpbmcpO1xuXG4gICAgICAgIHRoaXMubG9hZGVkID0gdGhpcy5sb2FkZWQgfHwge307XG4gICAgICAgIHRoaXMubG9hZGVkW3VpZF0gPSBkZW07XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRlbSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVGlsZShwYXJhbXM6IFRpbGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgZGVsZXRlIGxvYWRlZFt1aWRdO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlO1xuIiwibW9kdWxlLmV4cG9ydHMuUkFESVVTID0gNjM3ODEzNztcbm1vZHVsZS5leHBvcnRzLkZMQVRURU5JTkcgPSAxLzI5OC4yNTcyMjM1NjM7XG5tb2R1bGUuZXhwb3J0cy5QT0xBUl9SQURJVVMgPSA2MzU2NzUyLjMxNDI7XG4iLCJ2YXIgd2dzODQgPSByZXF1aXJlKCd3Z3M4NCcpO1xuXG5tb2R1bGUuZXhwb3J0cy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xubW9kdWxlLmV4cG9ydHMucmluZyA9IHJpbmdBcmVhO1xuXG5mdW5jdGlvbiBnZW9tZXRyeShfKSB7XG4gICAgdmFyIGFyZWEgPSAwLCBpO1xuICAgIHN3aXRjaCAoXy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgICAgICAgcmV0dXJuIHBvbHlnb25BcmVhKF8uY29vcmRpbmF0ZXMpO1xuICAgICAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IF8uY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcmVhICs9IHBvbHlnb25BcmVhKF8uY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZWE7XG4gICAgICAgIGNhc2UgJ1BvaW50JzpcbiAgICAgICAgY2FzZSAnTXVsdGlQb2ludCc6XG4gICAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGNhc2UgJ0dlb21ldHJ5Q29sbGVjdGlvbic6XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgXy5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJlYSArPSBnZW9tZXRyeShfLmdlb21ldHJpZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZWE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwb2x5Z29uQXJlYShjb29yZHMpIHtcbiAgICB2YXIgYXJlYSA9IDA7XG4gICAgaWYgKGNvb3JkcyAmJiBjb29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhcmVhICs9IE1hdGguYWJzKHJpbmdBcmVhKGNvb3Jkc1swXSkpO1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJlYSAtPSBNYXRoLmFicyhyaW5nQXJlYShjb29yZHNbaV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJlYTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGFwcHJveGltYXRlIGFyZWEgb2YgdGhlIHBvbHlnb24gd2VyZSBpdCBwcm9qZWN0ZWQgb250b1xuICogICAgIHRoZSBlYXJ0aC4gIE5vdGUgdGhhdCB0aGlzIGFyZWEgd2lsbCBiZSBwb3NpdGl2ZSBpZiByaW5nIGlzIG9yaWVudGVkXG4gKiAgICAgY2xvY2t3aXNlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBuZWdhdGl2ZS5cbiAqXG4gKiBSZWZlcmVuY2U6XG4gKiBSb2JlcnQuIEcuIENoYW1iZXJsYWluIGFuZCBXaWxsaWFtIEguIER1cXVldHRlLCBcIlNvbWUgQWxnb3JpdGhtcyBmb3JcbiAqICAgICBQb2x5Z29ucyBvbiBhIFNwaGVyZVwiLCBKUEwgUHVibGljYXRpb24gMDctMDMsIEpldCBQcm9wdWxzaW9uXG4gKiAgICAgTGFib3JhdG9yeSwgUGFzYWRlbmEsIENBLCBKdW5lIDIwMDcgaHR0cDovL3Rycy1uZXcuanBsLm5hc2EuZ292L2RzcGFjZS9oYW5kbGUvMjAxNC80MDQwOVxuICpcbiAqIFJldHVybnM6XG4gKiB7ZmxvYXR9IFRoZSBhcHByb3hpbWF0ZSBzaWduZWQgZ2VvZGVzaWMgYXJlYSBvZiB0aGUgcG9seWdvbiBpbiBzcXVhcmVcbiAqICAgICBtZXRlcnMuXG4gKi9cblxuZnVuY3Rpb24gcmluZ0FyZWEoY29vcmRzKSB7XG4gICAgdmFyIHAxLCBwMiwgcDMsIGxvd2VySW5kZXgsIG1pZGRsZUluZGV4LCB1cHBlckluZGV4LCBpLFxuICAgIGFyZWEgPSAwLFxuICAgIGNvb3Jkc0xlbmd0aCA9IGNvb3Jkcy5sZW5ndGg7XG5cbiAgICBpZiAoY29vcmRzTGVuZ3RoID4gMikge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBjb29yZHNMZW5ndGggLSAyKSB7Ly8gaSA9IE4tMlxuICAgICAgICAgICAgICAgIGxvd2VySW5kZXggPSBjb29yZHNMZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIG1pZGRsZUluZGV4ID0gY29vcmRzTGVuZ3RoIC0xO1xuICAgICAgICAgICAgICAgIHVwcGVySW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSBjb29yZHNMZW5ndGggLSAxKSB7Ly8gaSA9IE4tMVxuICAgICAgICAgICAgICAgIGxvd2VySW5kZXggPSBjb29yZHNMZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIG1pZGRsZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB1cHBlckluZGV4ID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGkgPSAwIHRvIE4tM1xuICAgICAgICAgICAgICAgIGxvd2VySW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIG1pZGRsZUluZGV4ID0gaSsxO1xuICAgICAgICAgICAgICAgIHVwcGVySW5kZXggPSBpKzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwMSA9IGNvb3Jkc1tsb3dlckluZGV4XTtcbiAgICAgICAgICAgIHAyID0gY29vcmRzW21pZGRsZUluZGV4XTtcbiAgICAgICAgICAgIHAzID0gY29vcmRzW3VwcGVySW5kZXhdO1xuICAgICAgICAgICAgYXJlYSArPSAoIHJhZChwM1swXSkgLSByYWQocDFbMF0pICkgKiBNYXRoLnNpbiggcmFkKHAyWzFdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcmVhID0gYXJlYSAqIHdnczg0LlJBRElVUyAqIHdnczg0LlJBRElVUyAvIDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZWE7XG59XG5cbmZ1bmN0aW9uIHJhZChfKSB7XG4gICAgcmV0dXJuIF8gKiBNYXRoLlBJIC8gMTgwO1xufSIsInZhciBnZW9qc29uQXJlYSA9IHJlcXVpcmUoJ0BtYXBib3gvZ2VvanNvbi1hcmVhJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmV3aW5kO1xuXG5mdW5jdGlvbiByZXdpbmQoZ2osIG91dGVyKSB7XG4gICAgc3dpdGNoICgoZ2ogJiYgZ2oudHlwZSkgfHwgbnVsbCkge1xuICAgICAgICBjYXNlICdGZWF0dXJlQ29sbGVjdGlvbic6XG4gICAgICAgICAgICBnai5mZWF0dXJlcyA9IGdqLmZlYXR1cmVzLm1hcChjdXJyeU91dGVyKHJld2luZCwgb3V0ZXIpKTtcbiAgICAgICAgICAgIHJldHVybiBnajtcbiAgICAgICAgY2FzZSAnR2VvbWV0cnlDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIGdqLmdlb21ldHJpZXMgPSBnai5nZW9tZXRyaWVzLm1hcChjdXJyeU91dGVyKHJld2luZCwgb3V0ZXIpKTtcbiAgICAgICAgICAgIHJldHVybiBnajtcbiAgICAgICAgY2FzZSAnRmVhdHVyZSc6XG4gICAgICAgICAgICBnai5nZW9tZXRyeSA9IHJld2luZChnai5nZW9tZXRyeSwgb3V0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGdqO1xuICAgICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgICAgIHJldHVybiBjb3JyZWN0KGdqLCBvdXRlcik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZ2o7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjdXJyeU91dGVyKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oXykgeyByZXR1cm4gYShfLCBiKTsgfTtcbn1cblxuZnVuY3Rpb24gY29ycmVjdChfLCBvdXRlcikge1xuICAgIGlmIChfLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBfLmNvb3JkaW5hdGVzID0gY29ycmVjdFJpbmdzKF8uY29vcmRpbmF0ZXMsIG91dGVyKTtcbiAgICB9IGVsc2UgaWYgKF8udHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgXy5jb29yZGluYXRlcyA9IF8uY29vcmRpbmF0ZXMubWFwKGN1cnJ5T3V0ZXIoY29ycmVjdFJpbmdzLCBvdXRlcikpO1xuICAgIH1cbiAgICByZXR1cm4gXztcbn1cblxuZnVuY3Rpb24gY29ycmVjdFJpbmdzKF8sIG91dGVyKSB7XG4gICAgb3V0ZXIgPSAhIW91dGVyO1xuICAgIF9bMF0gPSB3aW5kKF9bMF0sIG91dGVyKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IF8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgX1tpXSA9IHdpbmQoX1tpXSwgIW91dGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIF87XG59XG5cbmZ1bmN0aW9uIHdpbmQoXywgZGlyKSB7XG4gICAgcmV0dXJuIGN3KF8pID09PSBkaXIgPyBfIDogXy5yZXZlcnNlKCk7XG59XG5cbmZ1bmN0aW9uIGN3KF8pIHtcbiAgICByZXR1cm4gZ2VvanNvbkFyZWEucmluZyhfKSA+PSAwO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgbXZ0IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuY29uc3QgdG9HZW9KU09OID0gbXZ0LlZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT047XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcblxuLy8gVGhlIGZlYXR1cmUgdHlwZSB1c2VkIGJ5IGdlb2pzb24tdnQgYW5kIHN1cGVyY2x1c3Rlci4gU2hvdWxkIGJlIGV4dHJhY3RlZCB0b1xuLy8gZ2xvYmFsIHR5cGUgYW5kIHVzZWQgaW4gbW9kdWxlIGRlZmluaXRpb25zIGZvciB0aG9zZSB0d28gbW9kdWxlcy5cbnR5cGUgRmVhdHVyZSA9IHtcbiAgICB0eXBlOiAxLFxuICAgIGlkOiBtaXhlZCxcbiAgICB0YWdzOiB7W3N0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW59LFxuICAgIGdlb21ldHJ5OiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbn0gfCB7XG4gICAgdHlwZTogMiB8IDMsXG4gICAgaWQ6IG1peGVkLFxuICAgIHRhZ3M6IHtbc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn0sXG4gICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFtudW1iZXIsIG51bWJlcl0+Pixcbn1cblxuY2xhc3MgRmVhdHVyZVdyYXBwZXIgaW1wbGVtZW50cyBWZWN0b3JUaWxlRmVhdHVyZSB7XG4gICAgX2ZlYXR1cmU6IEZlYXR1cmU7XG5cbiAgICBleHRlbnQ6IG51bWJlcjtcbiAgICB0eXBlOiAxIHwgMiB8IDM7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBwcm9wZXJ0aWVzOiB7W3N0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW59O1xuXG4gICAgY29uc3RydWN0b3IoZmVhdHVyZTogRmVhdHVyZSkge1xuICAgICAgICB0aGlzLl9mZWF0dXJlID0gZmVhdHVyZTtcblxuICAgICAgICB0aGlzLmV4dGVudCA9IEVYVEVOVDtcbiAgICAgICAgdGhpcy50eXBlID0gZmVhdHVyZS50eXBlO1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3M7XG5cbiAgICAgICAgLy8gSWYgdGhlIGZlYXR1cmUgaGFzIGEgdG9wLWxldmVsIGBpZGAgcHJvcGVydHksIGNvcHkgaXQgb3ZlciwgYnV0IG9ubHlcbiAgICAgICAgLy8gaWYgaXQgY2FuIGJlIGNvZXJjZWQgdG8gYW4gaW50ZWdlciwgYmVjYXVzZSB0aGlzIHdyYXBwZXIgaXMgdXNlZCBmb3JcbiAgICAgICAgLy8gc2VyaWFsaXppbmcgZ2VvanNvbiBmZWF0dXJlIGRhdGEgaW50byB2ZWN0b3IgdGlsZSBQQkYgZGF0YSwgYW5kIHRoZVxuICAgICAgICAvLyB2ZWN0b3IgdGlsZSBzcGVjIG9ubHkgc3VwcG9ydHMgaW50ZWdlciB2YWx1ZXMgZm9yIGZlYXR1cmUgaWRzIC0tXG4gICAgICAgIC8vIGFsbG93aW5nIG5vbi1pbnRlZ2VyIHZhbHVlcyBoZXJlIHJlc3VsdHMgaW4gYSBub24tY29tcGxpYW50IFBCRlxuICAgICAgICAvLyB0aGF0IGNhdXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBpcyBwYXJzZWQgd2l0aCB2ZWN0b3ItdGlsZS1qc1xuICAgICAgICBpZiAoJ2lkJyBpbiBmZWF0dXJlICYmICFpc05hTihmZWF0dXJlLmlkKSkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHBhcnNlSW50KGZlYXR1cmUuaWQsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRHZW9tZXRyeSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZlYXR1cmUudHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgdGhpcy5fZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5LnB1c2goW25ldyBQb2ludChwb2ludFswXSwgcG9pbnRbMV0pXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHRoaXMuX2ZlYXR1cmUuZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSaW5nID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiByaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1JpbmcucHVzaChuZXcgUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LnB1c2gobmV3UmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b0dlb0pTT04oeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdG9HZW9KU09OLmNhbGwodGhpcywgeCwgeSwgeik7XG4gICAgfVxufVxuXG5jbGFzcyBHZW9KU09OV3JhcHBlciBpbXBsZW1lbnRzIFZlY3RvclRpbGUsIFZlY3RvclRpbGVMYXllciB7XG4gICAgbGF5ZXJzOiB7W3N0cmluZ106IFZlY3RvclRpbGVMYXllcn07XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGV4dGVudDogbnVtYmVyO1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIF9mZWF0dXJlczogQXJyYXk8RmVhdHVyZT47XG5cbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlczogQXJyYXk8RmVhdHVyZT4pIHtcbiAgICAgICAgdGhpcy5sYXllcnMgPSB7ICdfZ2VvanNvblRpbGVMYXllcic6IHRoaXMgfTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgdGhpcy5leHRlbnQgPSBFWFRFTlQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLl9mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICAgIH1cblxuICAgIGZlYXR1cmUoaTogbnVtYmVyKTogVmVjdG9yVGlsZUZlYXR1cmUge1xuICAgICAgICByZXR1cm4gbmV3IEZlYXR1cmVXcmFwcGVyKHRoaXMuX2ZlYXR1cmVzW2ldKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb0pTT05XcmFwcGVyO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKVxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnQG1hcGJveC92ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlXG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXJcblxuLy8gY29uZm9ybSB0byB2ZWN0b3J0aWxlIGFwaVxuZnVuY3Rpb24gR2VvSlNPTldyYXBwZXIgKGZlYXR1cmVzLCBvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzXG4gIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoXG59XG5cbkdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldLCB0aGlzLm9wdGlvbnMuZXh0ZW50KVxufVxuXG5mdW5jdGlvbiBGZWF0dXJlV3JhcHBlciAoZmVhdHVyZSwgZXh0ZW50KSB7XG4gIHRoaXMuaWQgPSB0eXBlb2YgZmVhdHVyZS5pZCA9PT0gJ251bWJlcicgPyBmZWF0dXJlLmlkIDogdW5kZWZpbmVkXG4gIHRoaXMudHlwZSA9IGZlYXR1cmUudHlwZVxuICB0aGlzLnJhd0dlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSAxID8gW2ZlYXR1cmUuZ2VvbWV0cnldIDogZmVhdHVyZS5nZW9tZXRyeVxuICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3NcbiAgdGhpcy5leHRlbnQgPSBleHRlbnQgfHwgNDA5NlxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmluZ3MgPSB0aGlzLnJhd0dlb21ldHJ5XG4gIHRoaXMuZ2VvbWV0cnkgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG4gICAgdmFyIG5ld1JpbmcgPSBbXVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSlcbiAgICB9XG4gICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZ2VvbWV0cnlcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5nZW9tZXRyeSkgdGhpcy5sb2FkR2VvbWV0cnkoKVxuXG4gIHZhciByaW5ncyA9IHRoaXMuZ2VvbWV0cnlcbiAgdmFyIHgxID0gSW5maW5pdHlcbiAgdmFyIHgyID0gLUluZmluaXR5XG4gIHZhciB5MSA9IEluZmluaXR5XG4gIHZhciB5MiA9IC1JbmZpbml0eVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjb29yZCA9IHJpbmdbal1cblxuICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueClcbiAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvb3JkLngpXG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb29yZC55KVxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXVxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OID0gVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTlxuIiwidmFyIFBiZiA9IHJlcXVpcmUoJ3BiZicpXG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2xpYi9nZW9qc29uX3dyYXBwZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21WZWN0b3JUaWxlSnMgPSBmcm9tVmVjdG9yVGlsZUpzXG5tb2R1bGUuZXhwb3J0cy5mcm9tR2VvanNvblZ0ID0gZnJvbUdlb2pzb25WdFxubW9kdWxlLmV4cG9ydHMuR2VvSlNPTldyYXBwZXIgPSBHZW9KU09OV3JhcHBlclxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZlY3Rvci10aWxlLWpzLWNyZWF0ZWQgdGlsZSB0byBwYmZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGlsZVxuICogQHJldHVybiB7QnVmZmVyfSB1bmNvbXByZXNzZWQsIHBiZi1zZXJpYWxpemVkIHRpbGUgZGF0YVxuICovXG5mdW5jdGlvbiBmcm9tVmVjdG9yVGlsZUpzICh0aWxlKSB7XG4gIHZhciBvdXQgPSBuZXcgUGJmKClcbiAgd3JpdGVUaWxlKHRpbGUsIG91dClcbiAgcmV0dXJuIG91dC5maW5pc2goKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYSBnZW9qc29uLXZ0LWNyZWF0ZWQgdGlsZSB0byBwYmYuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGxheWVycyAtIEFuIG9iamVjdCBtYXBwaW5nIGxheWVyIG5hbWVzIHRvIGdlb2pzb24tdnQtY3JlYXRlZCB2ZWN0b3IgdGlsZSBvYmplY3RzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIHZlY3Rvci10aWxlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBhbmQgZXh0ZW50IHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSBgbGF5ZXJzYC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52ZXJzaW9uPTFdIC0gVmVyc2lvbiBvZiB2ZWN0b3ItdGlsZSBzcGVjIHVzZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5leHRlbnQ9NDA5Nl0gLSBFeHRlbnQgb2YgdGhlIHZlY3RvciB0aWxlXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IHVuY29tcHJlc3NlZCwgcGJmLXNlcmlhbGl6ZWQgdGlsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZyb21HZW9qc29uVnQgKGxheWVycywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgbCA9IHt9XG4gIGZvciAodmFyIGsgaW4gbGF5ZXJzKSB7XG4gICAgbFtrXSA9IG5ldyBHZW9KU09OV3JhcHBlcihsYXllcnNba10uZmVhdHVyZXMsIG9wdGlvbnMpXG4gICAgbFtrXS5uYW1lID0ga1xuICAgIGxba10udmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvblxuICAgIGxba10uZXh0ZW50ID0gb3B0aW9ucy5leHRlbnRcbiAgfVxuICByZXR1cm4gZnJvbVZlY3RvclRpbGVKcyh7bGF5ZXJzOiBsfSlcbn1cblxuZnVuY3Rpb24gd3JpdGVUaWxlICh0aWxlLCBwYmYpIHtcbiAgZm9yICh2YXIga2V5IGluIHRpbGUubGF5ZXJzKSB7XG4gICAgcGJmLndyaXRlTWVzc2FnZSgzLCB3cml0ZUxheWVyLCB0aWxlLmxheWVyc1trZXldKVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlTGF5ZXIgKGxheWVyLCBwYmYpIHtcbiAgcGJmLndyaXRlVmFyaW50RmllbGQoMTUsIGxheWVyLnZlcnNpb24gfHwgMSlcbiAgcGJmLndyaXRlU3RyaW5nRmllbGQoMSwgbGF5ZXIubmFtZSB8fCAnJylcbiAgcGJmLndyaXRlVmFyaW50RmllbGQoNSwgbGF5ZXIuZXh0ZW50IHx8IDQwOTYpXG5cbiAgdmFyIGlcbiAgdmFyIGNvbnRleHQgPSB7XG4gICAga2V5czogW10sXG4gICAgdmFsdWVzOiBbXSxcbiAgICBrZXljYWNoZToge30sXG4gICAgdmFsdWVjYWNoZToge31cbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCBsYXllci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnRleHQuZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoaSlcbiAgICBwYmYud3JpdGVNZXNzYWdlKDIsIHdyaXRlRmVhdHVyZSwgY29udGV4dClcbiAgfVxuXG4gIHZhciBrZXlzID0gY29udGV4dC5rZXlzXG4gIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGJmLndyaXRlU3RyaW5nRmllbGQoMywga2V5c1tpXSlcbiAgfVxuXG4gIHZhciB2YWx1ZXMgPSBjb250ZXh0LnZhbHVlc1xuICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGJmLndyaXRlTWVzc2FnZSg0LCB3cml0ZVZhbHVlLCB2YWx1ZXNbaV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVGZWF0dXJlIChjb250ZXh0LCBwYmYpIHtcbiAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmVcblxuICBpZiAoZmVhdHVyZS5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcGJmLndyaXRlVmFyaW50RmllbGQoMSwgZmVhdHVyZS5pZClcbiAgfVxuXG4gIHBiZi53cml0ZU1lc3NhZ2UoMiwgd3JpdGVQcm9wZXJ0aWVzLCBjb250ZXh0KVxuICBwYmYud3JpdGVWYXJpbnRGaWVsZCgzLCBmZWF0dXJlLnR5cGUpXG4gIHBiZi53cml0ZU1lc3NhZ2UoNCwgd3JpdGVHZW9tZXRyeSwgZmVhdHVyZSlcbn1cblxuZnVuY3Rpb24gd3JpdGVQcm9wZXJ0aWVzIChjb250ZXh0LCBwYmYpIHtcbiAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmVcbiAgdmFyIGtleXMgPSBjb250ZXh0LmtleXNcbiAgdmFyIHZhbHVlcyA9IGNvbnRleHQudmFsdWVzXG4gIHZhciBrZXljYWNoZSA9IGNvbnRleHQua2V5Y2FjaGVcbiAgdmFyIHZhbHVlY2FjaGUgPSBjb250ZXh0LnZhbHVlY2FjaGVcblxuICBmb3IgKHZhciBrZXkgaW4gZmVhdHVyZS5wcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGtleUluZGV4ID0ga2V5Y2FjaGVba2V5XVxuICAgIGlmICh0eXBlb2Yga2V5SW5kZXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KVxuICAgICAga2V5SW5kZXggPSBrZXlzLmxlbmd0aCAtIDFcbiAgICAgIGtleWNhY2hlW2tleV0gPSBrZXlJbmRleFxuICAgIH1cbiAgICBwYmYud3JpdGVWYXJpbnQoa2V5SW5kZXgpXG5cbiAgICB2YXIgdmFsdWUgPSBmZWF0dXJlLnByb3BlcnRpZXNba2V5XVxuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdib29sZWFuJyAmJiB0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICB9XG4gICAgdmFyIHZhbHVlS2V5ID0gdHlwZSArICc6JyArIHZhbHVlXG4gICAgdmFyIHZhbHVlSW5kZXggPSB2YWx1ZWNhY2hlW3ZhbHVlS2V5XVxuICAgIGlmICh0eXBlb2YgdmFsdWVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICAgICAgdmFsdWVJbmRleCA9IHZhbHVlcy5sZW5ndGggLSAxXG4gICAgICB2YWx1ZWNhY2hlW3ZhbHVlS2V5XSA9IHZhbHVlSW5kZXhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KHZhbHVlSW5kZXgpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWFuZCAoY21kLCBsZW5ndGgpIHtcbiAgcmV0dXJuIChsZW5ndGggPDwgMykgKyAoY21kICYgMHg3KVxufVxuXG5mdW5jdGlvbiB6aWd6YWcgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSBeIChudW0gPj4gMzEpXG59XG5cbmZ1bmN0aW9uIHdyaXRlR2VvbWV0cnkgKGZlYXR1cmUsIHBiZikge1xuICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpXG4gIHZhciB0eXBlID0gZmVhdHVyZS50eXBlXG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgdmFyIHJpbmdzID0gZ2VvbWV0cnkubGVuZ3RoXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3M7IHIrKykge1xuICAgIHZhciByaW5nID0gZ2VvbWV0cnlbcl1cbiAgICB2YXIgY291bnQgPSAxXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgIGNvdW50ID0gcmluZy5sZW5ndGhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMSwgY291bnQpKSAvLyBtb3ZldG9cbiAgICAvLyBkbyBub3Qgd3JpdGUgcG9seWdvbiBjbG9zaW5nIHBhdGggYXMgbGluZXRvXG4gICAgdmFyIGxpbmVDb3VudCA9IHR5cGUgPT09IDMgPyByaW5nLmxlbmd0aCAtIDEgOiByaW5nLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHtcbiAgICAgIGlmIChpID09PSAxICYmIHR5cGUgIT09IDEpIHtcbiAgICAgICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMiwgbGluZUNvdW50IC0gMSkpIC8vIGxpbmV0b1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gcmluZ1tpXS54IC0geFxuICAgICAgdmFyIGR5ID0gcmluZ1tpXS55IC0geVxuICAgICAgcGJmLndyaXRlVmFyaW50KHppZ3phZyhkeCkpXG4gICAgICBwYmYud3JpdGVWYXJpbnQoemlnemFnKGR5KSlcbiAgICAgIHggKz0gZHhcbiAgICAgIHkgKz0gZHlcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgIHBiZi53cml0ZVZhcmludChjb21tYW5kKDcsIDEpKSAvLyBjbG9zZXBhdGhcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVWYWx1ZSAodmFsdWUsIHBiZikge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCB2YWx1ZSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBwYmYud3JpdGVCb29sZWFuRmllbGQoNywgdmFsdWUpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodmFsdWUgJSAxICE9PSAwKSB7XG4gICAgICBwYmYud3JpdGVEb3VibGVGaWVsZCgzLCB2YWx1ZSlcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgcGJmLndyaXRlU1ZhcmludEZpZWxkKDYsIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgcmlnaHQsIGRlcHRoKSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBub2RlU2l6ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbSA9IChsZWZ0ICsgcmlnaHQpID4+IDE7XG5cbiAgICBzZWxlY3QoaWRzLCBjb29yZHMsIG0sIGxlZnQsIHJpZ2h0LCBkZXB0aCAlIDIpO1xuXG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgbSAtIDEsIGRlcHRoICsgMSk7XG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbSArIDEsIHJpZ2h0LCBkZXB0aCArIDEpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3QoaWRzLCBjb29yZHMsIGssIGxlZnQsIHJpZ2h0LCBpbmMpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGluYyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ID0gY29vcmRzWzIgKiBrICsgaW5jXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0O1xuICAgICAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvb3Jkc1syICogcmlnaHQgKyBpbmNdID4gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb29yZHNbMiAqIGkgKyBpbmNdIDwgdCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvb3Jkc1syICogaiArIGluY10gPiB0KSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29vcmRzWzIgKiBsZWZ0ICsgaW5jXSA9PT0gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwSXRlbShpZHMsIGNvb3JkcywgaSwgaikge1xuICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGksIDIgKiBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGkgKyAxLCAyICogaiArIDEpO1xufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIGNvbnN0IHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShpZHMsIGNvb3JkcywgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbm9kZVNpemUpIHtcbiAgICBjb25zdCBzdGFjayA9IFswLCBpZHMubGVuZ3RoIC0gMSwgMF07XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHgsIHk7XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB4ID0gY29vcmRzWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB5ID0gY29vcmRzWzIgKiBpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmICh4ID49IG1pblggJiYgeCA8PSBtYXhYICYmIHkgPj0gbWluWSAmJiB5IDw9IG1heFkpIHJlc3VsdC5wdXNoKGlkc1ttXSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEF4aXMgPSAoYXhpcyArIDEpICUgMjtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1pblggPD0geCA6IG1pblkgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBtYXhYID49IHggOiBtYXhZID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdpdGhpbihpZHMsIGNvb3JkcywgcXgsIHF5LCByLCBub2RlU2l6ZSkge1xuICAgIGNvbnN0IHN0YWNrID0gWzAsIGlkcy5sZW5ndGggLSAxLCAwXTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCByMiA9IHIgKiByO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBheGlzID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNxRGlzdChjb29yZHNbMiAqIGldLCBjb29yZHNbMiAqIGkgKyAxXSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICBjb25zdCB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmIChzcURpc3QoeCwgeSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICBjb25zdCBuZXh0QXhpcyA9IChheGlzICsgMSkgJSAyO1xuXG4gICAgICAgIGlmIChheGlzID09PSAwID8gcXggLSByIDw9IHggOiBxeSAtIHIgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBxeCArIHIgPj0geCA6IHF5ICsgciA+PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG0gKyAxKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gocmlnaHQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzcURpc3QoYXgsIGF5LCBieCwgYnkpIHtcbiAgICBjb25zdCBkeCA9IGF4IC0gYng7XG4gICAgY29uc3QgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIlxuaW1wb3J0IHNvcnQgZnJvbSAnLi9zb3J0JztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcbmltcG9ydCB3aXRoaW4gZnJvbSAnLi93aXRoaW4nO1xuXG5jb25zdCBkZWZhdWx0R2V0WCA9IHAgPT4gcFswXTtcbmNvbnN0IGRlZmF1bHRHZXRZID0gcCA9PiBwWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBLREJ1c2gge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgZ2V0WCA9IGRlZmF1bHRHZXRYLCBnZXRZID0gZGVmYXVsdEdldFksIG5vZGVTaXplID0gNjQsIEFycmF5VHlwZSA9IEZsb2F0NjRBcnJheSkge1xuICAgICAgICB0aGlzLm5vZGVTaXplID0gbm9kZVNpemU7XG4gICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICAgIGNvbnN0IEluZGV4QXJyYXlUeXBlID0gcG9pbnRzLmxlbmd0aCA8IDY1NTM2ID8gVWludDE2QXJyYXkgOiBVaW50MzJBcnJheTtcblxuICAgICAgICBjb25zdCBpZHMgPSB0aGlzLmlkcyA9IG5ldyBJbmRleEFycmF5VHlwZShwb2ludHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHMgPSBuZXcgQXJyYXlUeXBlKHBvaW50cy5sZW5ndGggKiAyKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWRzW2ldID0gaTtcbiAgICAgICAgICAgIGNvb3Jkc1syICogaV0gPSBnZXRYKHBvaW50c1tpXSk7XG4gICAgICAgICAgICBjb29yZHNbMiAqIGkgKyAxXSA9IGdldFkocG9pbnRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvcnQoaWRzLCBjb29yZHMsIG5vZGVTaXplLCAwLCBpZHMubGVuZ3RoIC0gMSwgMCk7XG4gICAgfVxuXG4gICAgcmFuZ2UobWluWCwgbWluWSwgbWF4WCwgbWF4WSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UodGhpcy5pZHMsIHRoaXMuY29vcmRzLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9XG5cbiAgICB3aXRoaW4oeCwgeSwgcikge1xuICAgICAgICByZXR1cm4gd2l0aGluKHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgeCwgeSwgciwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgS0RCdXNoIGZyb20gJ2tkYnVzaCc7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG1pblpvb206IDAsICAgLy8gbWluIHpvb20gdG8gZ2VuZXJhdGUgY2x1c3RlcnMgb25cbiAgICBtYXhab29tOiAxNiwgIC8vIG1heCB6b29tIGxldmVsIHRvIGNsdXN0ZXIgdGhlIHBvaW50cyBvblxuICAgIHJhZGl1czogNDAsICAgLy8gY2x1c3RlciByYWRpdXMgaW4gcGl4ZWxzXG4gICAgZXh0ZW50OiA1MTIsICAvLyB0aWxlIGV4dGVudCAocmFkaXVzIGlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gaXQpXG4gICAgbm9kZVNpemU6IDY0LCAvLyBzaXplIG9mIHRoZSBLRC10cmVlIGxlYWYgbm9kZSwgYWZmZWN0cyBwZXJmb3JtYW5jZVxuICAgIGxvZzogZmFsc2UsICAgLy8gd2hldGhlciB0byBsb2cgdGltaW5nIGluZm9cblxuICAgIC8vIGEgcmVkdWNlIGZ1bmN0aW9uIGZvciBjYWxjdWxhdGluZyBjdXN0b20gY2x1c3RlciBwcm9wZXJ0aWVzXG4gICAgcmVkdWNlOiBudWxsLCAvLyAoYWNjdW11bGF0ZWQsIHByb3BzKSA9PiB7IGFjY3VtdWxhdGVkLnN1bSArPSBwcm9wcy5zdW07IH1cblxuICAgIC8vIHByb3BlcnRpZXMgdG8gdXNlIGZvciBpbmRpdmlkdWFsIHBvaW50cyB3aGVuIHJ1bm5pbmcgdGhlIHJlZHVjZXJcbiAgICBtYXA6IHByb3BzID0+IHByb3BzIC8vIHByb3BzID0+ICh7c3VtOiBwcm9wcy5teV92YWx1ZX0pXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdXBlcmNsdXN0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKE9iamVjdC5jcmVhdGUoZGVmYXVsdE9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50cmVlcyA9IG5ldyBBcnJheSh0aGlzLm9wdGlvbnMubWF4Wm9vbSArIDEpO1xuICAgIH1cblxuICAgIGxvYWQocG9pbnRzKSB7XG4gICAgICAgIGNvbnN0IHtsb2csIG1pblpvb20sIG1heFpvb20sIG5vZGVTaXplfSA9IHRoaXMub3B0aW9ucztcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICBjb25zdCB0aW1lcklkID0gYHByZXBhcmUgJHsgIHBvaW50cy5sZW5ndGggIH0gcG9pbnRzYDtcbiAgICAgICAgaWYgKGxvZykgY29uc29sZS50aW1lKHRpbWVySWQpO1xuXG4gICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICAgIC8vIGdlbmVyYXRlIGEgY2x1c3RlciBvYmplY3QgZm9yIGVhY2ggcG9pbnQgYW5kIGluZGV4IGlucHV0IHBvaW50cyBpbnRvIGEgS0QtdHJlZVxuICAgICAgICBsZXQgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghcG9pbnRzW2ldLmdlb21ldHJ5KSBjb250aW51ZTtcbiAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2goY3JlYXRlUG9pbnRDbHVzdGVyKHBvaW50c1tpXSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJlZXNbbWF4Wm9vbSArIDFdID0gbmV3IEtEQnVzaChjbHVzdGVycywgZ2V0WCwgZ2V0WSwgbm9kZVNpemUsIEZsb2F0MzJBcnJheSk7XG5cbiAgICAgICAgaWYgKGxvZykgY29uc29sZS50aW1lRW5kKHRpbWVySWQpO1xuXG4gICAgICAgIC8vIGNsdXN0ZXIgcG9pbnRzIG9uIG1heCB6b29tLCB0aGVuIGNsdXN0ZXIgdGhlIHJlc3VsdHMgb24gcHJldmlvdXMgem9vbSwgZXRjLjtcbiAgICAgICAgLy8gcmVzdWx0cyBpbiBhIGNsdXN0ZXIgaGllcmFyY2h5IGFjcm9zcyB6b29tIGxldmVsc1xuICAgICAgICBmb3IgKGxldCB6ID0gbWF4Wm9vbTsgeiA+PSBtaW5ab29tOyB6LS0pIHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9ICtEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgc2V0IG9mIGNsdXN0ZXJzIGZvciB0aGUgem9vbSBhbmQgaW5kZXggdGhlbSB3aXRoIGEgS0QtdHJlZVxuICAgICAgICAgICAgY2x1c3RlcnMgPSB0aGlzLl9jbHVzdGVyKGNsdXN0ZXJzLCB6KTtcbiAgICAgICAgICAgIHRoaXMudHJlZXNbel0gPSBuZXcgS0RCdXNoKGNsdXN0ZXJzLCBnZXRYLCBnZXRZLCBub2RlU2l6ZSwgRmxvYXQzMkFycmF5KTtcblxuICAgICAgICAgICAgaWYgKGxvZykgY29uc29sZS5sb2coJ3olZDogJWQgY2x1c3RlcnMgaW4gJWRtcycsIHosIGNsdXN0ZXJzLmxlbmd0aCwgK0RhdGUubm93KCkgLSBub3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvZykgY29uc29sZS50aW1lRW5kKCd0b3RhbCB0aW1lJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2V0Q2x1c3RlcnMoYmJveCwgem9vbSkge1xuICAgICAgICBsZXQgbWluTG5nID0gKChiYm94WzBdICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgICAgIGNvbnN0IG1pbkxhdCA9IE1hdGgubWF4KC05MCwgTWF0aC5taW4oOTAsIGJib3hbMV0pKTtcbiAgICAgICAgbGV0IG1heExuZyA9IGJib3hbMl0gPT09IDE4MCA/IDE4MCA6ICgoYmJveFsyXSArIDE4MCkgJSAzNjAgKyAzNjApICUgMzYwIC0gMTgwO1xuICAgICAgICBjb25zdCBtYXhMYXQgPSBNYXRoLm1heCgtOTAsIE1hdGgubWluKDkwLCBiYm94WzNdKSk7XG5cbiAgICAgICAgaWYgKGJib3hbMl0gLSBiYm94WzBdID49IDM2MCkge1xuICAgICAgICAgICAgbWluTG5nID0gLTE4MDtcbiAgICAgICAgICAgIG1heExuZyA9IDE4MDtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5MbmcgPiBtYXhMbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVhc3Rlcm5IZW0gPSB0aGlzLmdldENsdXN0ZXJzKFttaW5MbmcsIG1pbkxhdCwgMTgwLCBtYXhMYXRdLCB6b29tKTtcbiAgICAgICAgICAgIGNvbnN0IHdlc3Rlcm5IZW0gPSB0aGlzLmdldENsdXN0ZXJzKFstMTgwLCBtaW5MYXQsIG1heExuZywgbWF4TGF0XSwgem9vbSk7XG4gICAgICAgICAgICByZXR1cm4gZWFzdGVybkhlbS5jb25jYXQod2VzdGVybkhlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmVlID0gdGhpcy50cmVlc1t0aGlzLl9saW1pdFpvb20oem9vbSldO1xuICAgICAgICBjb25zdCBpZHMgPSB0cmVlLnJhbmdlKGxuZ1gobWluTG5nKSwgbGF0WShtYXhMYXQpLCBsbmdYKG1heExuZyksIGxhdFkobWluTGF0KSk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gdHJlZS5wb2ludHNbaWRdO1xuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjLm51bVBvaW50cyA/IGdldENsdXN0ZXJKU09OKGMpIDogdGhpcy5wb2ludHNbYy5pbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbHVzdGVycztcbiAgICB9XG5cbiAgICBnZXRDaGlsZHJlbihjbHVzdGVySWQpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luSWQgPSBjbHVzdGVySWQgPj4gNTtcbiAgICAgICAgY29uc3Qgb3JpZ2luWm9vbSA9IGNsdXN0ZXJJZCAlIDMyO1xuICAgICAgICBjb25zdCBlcnJvck1zZyA9ICdObyBjbHVzdGVyIHdpdGggdGhlIHNwZWNpZmllZCBpZC4nO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmVlc1tvcmlnaW5ab29tXTtcbiAgICAgICAgaWYgKCFpbmRleCkgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcblxuICAgICAgICBjb25zdCBvcmlnaW4gPSBpbmRleC5wb2ludHNbb3JpZ2luSWRdO1xuICAgICAgICBpZiAoIW9yaWdpbikgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcblxuICAgICAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLnJhZGl1cyAvICh0aGlzLm9wdGlvbnMuZXh0ZW50ICogTWF0aC5wb3coMiwgb3JpZ2luWm9vbSAtIDEpKTtcbiAgICAgICAgY29uc3QgaWRzID0gaW5kZXgud2l0aGluKG9yaWdpbi54LCBvcmlnaW4ueSwgcik7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gaW5kZXgucG9pbnRzW2lkXTtcbiAgICAgICAgICAgIGlmIChjLnBhcmVudElkID09PSBjbHVzdGVySWQpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlckpTT04oYykgOiB0aGlzLnBvaW50c1tjLmluZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICB9XG5cbiAgICBnZXRMZWF2ZXMoY2x1c3RlcklkLCBsaW1pdCwgb2Zmc2V0KSB7XG4gICAgICAgIGxpbWl0ID0gbGltaXQgfHwgMTA7XG4gICAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICAgIGNvbnN0IGxlYXZlcyA9IFtdO1xuICAgICAgICB0aGlzLl9hcHBlbmRMZWF2ZXMobGVhdmVzLCBjbHVzdGVySWQsIGxpbWl0LCBvZmZzZXQsIDApO1xuXG4gICAgICAgIHJldHVybiBsZWF2ZXM7XG4gICAgfVxuXG4gICAgZ2V0VGlsZSh6LCB4LCB5KSB7XG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVzW3RoaXMuX2xpbWl0Wm9vbSh6KV07XG4gICAgICAgIGNvbnN0IHoyID0gTWF0aC5wb3coMiwgeik7XG4gICAgICAgIGNvbnN0IHtleHRlbnQsIHJhZGl1c30gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHAgPSByYWRpdXMgLyBleHRlbnQ7XG4gICAgICAgIGNvbnN0IHRvcCA9ICh5IC0gcCkgLyB6MjtcbiAgICAgICAgY29uc3QgYm90dG9tID0gKHkgKyAxICsgcCkgLyB6MjtcblxuICAgICAgICBjb25zdCB0aWxlID0ge1xuICAgICAgICAgICAgZmVhdHVyZXM6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxuICAgICAgICAgICAgdHJlZS5yYW5nZSgoeCAtIHApIC8gejIsIHRvcCwgKHggKyAxICsgcCkgLyB6MiwgYm90dG9tKSxcbiAgICAgICAgICAgIHRyZWUucG9pbnRzLCB4LCB5LCB6MiwgdGlsZSk7XG5cbiAgICAgICAgaWYgKHggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICB0cmVlLnJhbmdlKDEgLSBwIC8gejIsIHRvcCwgMSwgYm90dG9tKSxcbiAgICAgICAgICAgICAgICB0cmVlLnBvaW50cywgejIsIHksIHoyLCB0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCA9PT0gejIgLSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXG4gICAgICAgICAgICAgICAgdHJlZS5yYW5nZSgwLCB0b3AsIHAgLyB6MiwgYm90dG9tKSxcbiAgICAgICAgICAgICAgICB0cmVlLnBvaW50cywgLTEsIHksIHoyLCB0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aWxlLmZlYXR1cmVzLmxlbmd0aCA/IHRpbGUgOiBudWxsO1xuICAgIH1cblxuICAgIGdldENsdXN0ZXJFeHBhbnNpb25ab29tKGNsdXN0ZXJJZCkge1xuICAgICAgICBsZXQgY2x1c3Rlclpvb20gPSAoY2x1c3RlcklkICUgMzIpIC0gMTtcbiAgICAgICAgd2hpbGUgKGNsdXN0ZXJab29tIDw9IHRoaXMub3B0aW9ucy5tYXhab29tKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oY2x1c3RlcklkKTtcbiAgICAgICAgICAgIGNsdXN0ZXJab29tKys7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9PSAxKSBicmVhaztcbiAgICAgICAgICAgIGNsdXN0ZXJJZCA9IGNoaWxkcmVuWzBdLnByb3BlcnRpZXMuY2x1c3Rlcl9pZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2x1c3Rlclpvb207XG4gICAgfVxuXG4gICAgX2FwcGVuZExlYXZlcyhyZXN1bHQsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgc2tpcHBlZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oY2x1c3RlcklkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGNoaWxkLnByb3BlcnRpZXM7XG5cbiAgICAgICAgICAgIGlmIChwcm9wcyAmJiBwcm9wcy5jbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgKyBwcm9wcy5wb2ludF9jb3VudCA8PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgd2hvbGUgY2x1c3RlclxuICAgICAgICAgICAgICAgICAgICBza2lwcGVkICs9IHByb3BzLnBvaW50X2NvdW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVudGVyIHRoZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0aGlzLl9hcHBlbmRMZWF2ZXMocmVzdWx0LCBwcm9wcy5jbHVzdGVyX2lkLCBsaW1pdCwgb2Zmc2V0LCBza2lwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCB0aGUgY2x1c3RlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcHBlZCA8IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgYSBzaW5nbGUgcG9pbnRcbiAgICAgICAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNpbmdsZSBwb2ludFxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSBsaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2tpcHBlZDtcbiAgICB9XG5cbiAgICBfYWRkVGlsZUZlYXR1cmVzKGlkcywgcG9pbnRzLCB4LCB5LCB6MiwgdGlsZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgZiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBbW1xuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy5leHRlbnQgKiAoYy54ICogejIgLSB4KSksXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChjLnkgKiB6MiAtIHkpKVxuICAgICAgICAgICAgICAgIF1dLFxuICAgICAgICAgICAgICAgIHRhZ3M6IGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlclByb3BlcnRpZXMoYykgOiB0aGlzLnBvaW50c1tjLmluZGV4XS5wcm9wZXJ0aWVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaWQgPSBjLm51bVBvaW50cyA/IGMuaWQgOiB0aGlzLnBvaW50c1tjLmluZGV4XS5pZDtcbiAgICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZi5pZCA9IGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlsZS5mZWF0dXJlcy5wdXNoKGYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xpbWl0Wm9vbSh6KSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluWm9vbSwgTWF0aC5taW4oeiwgdGhpcy5vcHRpb25zLm1heFpvb20gKyAxKSk7XG4gICAgfVxuXG4gICAgX2NsdXN0ZXIocG9pbnRzLCB6b29tKSB7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gW107XG4gICAgICAgIGNvbnN0IHtyYWRpdXMsIGV4dGVudCwgcmVkdWNlfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgciA9IHJhZGl1cyAvIChleHRlbnQgKiBNYXRoLnBvdygyLCB6b29tKSk7XG5cbiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggcG9pbnRcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBwb2ludHNbaV07XG4gICAgICAgICAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHZpc2l0ZWQgdGhlIHBvaW50IGF0IHRoaXMgem9vbSBsZXZlbCwgc2tpcCBpdFxuICAgICAgICAgICAgaWYgKHAuem9vbSA8PSB6b29tKSBjb250aW51ZTtcbiAgICAgICAgICAgIHAuem9vbSA9IHpvb207XG5cbiAgICAgICAgICAgIC8vIGZpbmQgYWxsIG5lYXJieSBwb2ludHNcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVzW3pvb20gKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IG5laWdoYm9ySWRzID0gdHJlZS53aXRoaW4ocC54LCBwLnksIHIpO1xuXG4gICAgICAgICAgICBsZXQgbnVtUG9pbnRzID0gcC5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIGxldCB3eCA9IHAueCAqIG51bVBvaW50cztcbiAgICAgICAgICAgIGxldCB3eSA9IHAueSAqIG51bVBvaW50cztcblxuICAgICAgICAgICAgbGV0IGNsdXN0ZXJQcm9wZXJ0aWVzID0gcmVkdWNlICYmIG51bVBvaW50cyA+IDEgPyB0aGlzLl9tYXAocCwgdHJ1ZSkgOiBudWxsO1xuXG4gICAgICAgICAgICAvLyBlbmNvZGUgYm90aCB6b29tIGFuZCBwb2ludCBpbmRleCBvbiB3aGljaCB0aGUgY2x1c3RlciBvcmlnaW5hdGVkXG4gICAgICAgICAgICBjb25zdCBpZCA9IChpIDw8IDUpICsgKHpvb20gKyAxKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBuZWlnaGJvcklkIG9mIG5laWdoYm9ySWRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYiA9IHRyZWUucG9pbnRzW25laWdoYm9ySWRdO1xuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgbmVpZ2hib3JzIHRoYXQgYXJlIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgICAgICAgICAgICAgaWYgKGIuem9vbSA8PSB6b29tKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tOyAvLyBzYXZlIHRoZSB6b29tIChzbyBpdCBkb2Vzbid0IGdldCBwcm9jZXNzZWQgdHdpY2UpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBudW1Qb2ludHMyID0gYi5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgICAgICB3eCArPSBiLnggKiBudW1Qb2ludHMyOyAvLyBhY2N1bXVsYXRlIGNvb3JkaW5hdGVzIGZvciBjYWxjdWxhdGluZyB3ZWlnaHRlZCBjZW50ZXJcbiAgICAgICAgICAgICAgICB3eSArPSBiLnkgKiBudW1Qb2ludHMyO1xuXG4gICAgICAgICAgICAgICAgbnVtUG9pbnRzICs9IG51bVBvaW50czI7XG4gICAgICAgICAgICAgICAgYi5wYXJlbnRJZCA9IGlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZHVjZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzKSBjbHVzdGVyUHJvcGVydGllcyA9IHRoaXMuX21hcChwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVkdWNlKGNsdXN0ZXJQcm9wZXJ0aWVzLCB0aGlzLl9tYXAoYikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bVBvaW50cyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2gocCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHAucGFyZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKGNyZWF0ZUNsdXN0ZXIod3ggLyBudW1Qb2ludHMsIHd5IC8gbnVtUG9pbnRzLCBpZCwgbnVtUG9pbnRzLCBjbHVzdGVyUHJvcGVydGllcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH1cblxuICAgIF9tYXAocG9pbnQsIGNsb25lKSB7XG4gICAgICAgIGlmIChwb2ludC5udW1Qb2ludHMpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9uZSA/IGV4dGVuZCh7fSwgcG9pbnQucHJvcGVydGllcykgOiBwb2ludC5wcm9wZXJ0aWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gdGhpcy5wb2ludHNbcG9pbnQuaW5kZXhdLnByb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMub3B0aW9ucy5tYXAob3JpZ2luYWwpO1xuICAgICAgICByZXR1cm4gY2xvbmUgJiYgcmVzdWx0ID09PSBvcmlnaW5hbCA/IGV4dGVuZCh7fSwgcmVzdWx0KSA6IHJlc3VsdDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsdXN0ZXIoeCwgeSwgaWQsIG51bVBvaW50cywgcHJvcGVydGllcykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHgsIC8vIHdlaWdodGVkIGNsdXN0ZXIgY2VudGVyXG4gICAgICAgIHksXG4gICAgICAgIHpvb206IEluZmluaXR5LCAvLyB0aGUgbGFzdCB6b29tIHRoZSBjbHVzdGVyIHdhcyBwcm9jZXNzZWQgYXRcbiAgICAgICAgaWQsIC8vIGVuY29kZXMgaW5kZXggb2YgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBjbHVzdGVyIGFuZCBpdHMgem9vbSBsZXZlbFxuICAgICAgICBwYXJlbnRJZDogLTEsIC8vIHBhcmVudCBjbHVzdGVyIGlkXG4gICAgICAgIG51bVBvaW50cyxcbiAgICAgICAgcHJvcGVydGllc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvaW50Q2x1c3RlcihwLCBpZCkge1xuICAgIGNvbnN0IFt4LCB5XSA9IHAuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogbG5nWCh4KSwgLy8gcHJvamVjdGVkIHBvaW50IGNvb3JkaW5hdGVzXG4gICAgICAgIHk6IGxhdFkoeSksXG4gICAgICAgIHpvb206IEluZmluaXR5LCAvLyB0aGUgbGFzdCB6b29tIHRoZSBwb2ludCB3YXMgcHJvY2Vzc2VkIGF0XG4gICAgICAgIGluZGV4OiBpZCwgLy8gaW5kZXggb2YgdGhlIHNvdXJjZSBmZWF0dXJlIGluIHRoZSBvcmlnaW5hbCBpbnB1dCBhcnJheSxcbiAgICAgICAgcGFyZW50SWQ6IC0xIC8vIHBhcmVudCBjbHVzdGVyIGlkXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2x1c3RlckpTT04oY2x1c3Rlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgaWQ6IGNsdXN0ZXIuaWQsXG4gICAgICAgIHByb3BlcnRpZXM6IGdldENsdXN0ZXJQcm9wZXJ0aWVzKGNsdXN0ZXIpLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbeExuZyhjbHVzdGVyLngpLCB5TGF0KGNsdXN0ZXIueSldXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbHVzdGVyUHJvcGVydGllcyhjbHVzdGVyKSB7XG4gICAgY29uc3QgY291bnQgPSBjbHVzdGVyLm51bVBvaW50cztcbiAgICBjb25zdCBhYmJyZXYgPVxuICAgICAgICBjb3VudCA+PSAxMDAwMCA/IGAke01hdGgucm91bmQoY291bnQgLyAxMDAwKSAgfWtgIDpcbiAgICAgICAgY291bnQgPj0gMTAwMCA/IGAke01hdGgucm91bmQoY291bnQgLyAxMDApIC8gMTAgIH1rYCA6IGNvdW50O1xuICAgIHJldHVybiBleHRlbmQoZXh0ZW5kKHt9LCBjbHVzdGVyLnByb3BlcnRpZXMpLCB7XG4gICAgICAgIGNsdXN0ZXI6IHRydWUsXG4gICAgICAgIGNsdXN0ZXJfaWQ6IGNsdXN0ZXIuaWQsXG4gICAgICAgIHBvaW50X2NvdW50OiBjb3VudCxcbiAgICAgICAgcG9pbnRfY291bnRfYWJicmV2aWF0ZWQ6IGFiYnJldlxuICAgIH0pO1xufVxuXG4vLyBsb25naXR1ZGUvbGF0aXR1ZGUgdG8gc3BoZXJpY2FsIG1lcmNhdG9yIGluIFswLi4xXSByYW5nZVxuZnVuY3Rpb24gbG5nWChsbmcpIHtcbiAgICByZXR1cm4gbG5nIC8gMzYwICsgMC41O1xufVxuZnVuY3Rpb24gbGF0WShsYXQpIHtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihsYXQgKiBNYXRoLlBJIC8gMTgwKTtcbiAgICBjb25zdCB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG4gICAgcmV0dXJuIHkgPCAwID8gMCA6IHkgPiAxID8gMSA6IHk7XG59XG5cbi8vIHNwaGVyaWNhbCBtZXJjYXRvciB0byBsb25naXR1ZGUvbGF0aXR1ZGVcbmZ1bmN0aW9uIHhMbmcoeCkge1xuICAgIHJldHVybiAoeCAtIDAuNSkgKiAzNjA7XG59XG5mdW5jdGlvbiB5TGF0KHkpIHtcbiAgICBjb25zdCB5MiA9ICgxODAgLSB5ICogMzYwKSAqIE1hdGguUEkgLyAxODA7XG4gICAgcmV0dXJuIDM2MCAqIE1hdGguYXRhbihNYXRoLmV4cCh5MikpIC8gTWF0aC5QSSAtIDkwO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjKSB7XG4gICAgZm9yIChjb25zdCBpZCBpbiBzcmMpIGRlc3RbaWRdID0gc3JjW2lkXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cblxuZnVuY3Rpb24gZ2V0WChwKSB7XG4gICAgcmV0dXJuIHAueDtcbn1cbmZ1bmN0aW9uIGdldFkocCkge1xuICAgIHJldHVybiBwLnk7XG59XG4iLCJcbi8vIGNhbGN1bGF0ZSBzaW1wbGlmaWNhdGlvbiBkYXRhIHVzaW5nIG9wdGltaXplZCBEb3VnbGFzLVBldWNrZXIgYWxnb3JpdGhtXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNpbXBsaWZ5KGNvb3JkcywgZmlyc3QsIGxhc3QsIHNxVG9sZXJhbmNlKSB7XG4gICAgdmFyIG1heFNxRGlzdCA9IHNxVG9sZXJhbmNlO1xuICAgIHZhciBtaWQgPSAobGFzdCAtIGZpcnN0KSA+PiAxO1xuICAgIHZhciBtaW5Qb3NUb01pZCA9IGxhc3QgLSBmaXJzdDtcbiAgICB2YXIgaW5kZXg7XG5cbiAgICB2YXIgYXggPSBjb29yZHNbZmlyc3RdO1xuICAgIHZhciBheSA9IGNvb3Jkc1tmaXJzdCArIDFdO1xuICAgIHZhciBieCA9IGNvb3Jkc1tsYXN0XTtcbiAgICB2YXIgYnkgPSBjb29yZHNbbGFzdCArIDFdO1xuXG4gICAgZm9yICh2YXIgaSA9IGZpcnN0ICsgMzsgaSA8IGxhc3Q7IGkgKz0gMykge1xuICAgICAgICB2YXIgZCA9IGdldFNxU2VnRGlzdChjb29yZHNbaV0sIGNvb3Jkc1tpICsgMV0sIGF4LCBheSwgYngsIGJ5KTtcblxuICAgICAgICBpZiAoZCA+IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgbWF4U3FEaXN0ID0gZDtcblxuICAgICAgICB9IGVsc2UgaWYgKGQgPT09IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgLy8gYSB3b3JrYXJvdW5kIHRvIGVuc3VyZSB3ZSBjaG9vc2UgYSBwaXZvdCBjbG9zZSB0byB0aGUgbWlkZGxlIG9mIHRoZSBsaXN0LFxuICAgICAgICAgICAgLy8gcmVkdWNpbmcgcmVjdXJzaW9uIGRlcHRoLCBmb3IgY2VydGFpbiBkZWdlbmVyYXRlIGlucHV0c1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9nZW9qc29uLXZ0L2lzc3Vlcy8xMDRcbiAgICAgICAgICAgIHZhciBwb3NUb01pZCA9IE1hdGguYWJzKGkgLSBtaWQpO1xuICAgICAgICAgICAgaWYgKHBvc1RvTWlkIDwgbWluUG9zVG9NaWQpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgbWluUG9zVG9NaWQgPSBwb3NUb01pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYXhTcURpc3QgPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICBpZiAoaW5kZXggLSBmaXJzdCA+IDMpIHNpbXBsaWZ5KGNvb3JkcywgZmlyc3QsIGluZGV4LCBzcVRvbGVyYW5jZSk7XG4gICAgICAgIGNvb3Jkc1tpbmRleCArIDJdID0gbWF4U3FEaXN0O1xuICAgICAgICBpZiAobGFzdCAtIGluZGV4ID4gMykgc2ltcGxpZnkoY29vcmRzLCBpbmRleCwgbGFzdCwgc3FUb2xlcmFuY2UpO1xuICAgIH1cbn1cblxuLy8gc3F1YXJlIGRpc3RhbmNlIGZyb20gYSBwb2ludCB0byBhIHNlZ21lbnRcbmZ1bmN0aW9uIGdldFNxU2VnRGlzdChweCwgcHksIHgsIHksIGJ4LCBieSkge1xuXG4gICAgdmFyIGR4ID0gYnggLSB4O1xuICAgIHZhciBkeSA9IGJ5IC0geTtcblxuICAgIGlmIChkeCAhPT0gMCB8fCBkeSAhPT0gMCkge1xuXG4gICAgICAgIHZhciB0ID0gKChweCAtIHgpICogZHggKyAocHkgLSB5KSAqIGR5KSAvIChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cbiAgICAgICAgaWYgKHQgPiAxKSB7XG4gICAgICAgICAgICB4ID0gYng7XG4gICAgICAgICAgICB5ID0gYnk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgeCArPSBkeCAqIHQ7XG4gICAgICAgICAgICB5ICs9IGR5ICogdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGR4ID0gcHggLSB4O1xuICAgIGR5ID0gcHkgLSB5O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVGZWF0dXJlKGlkLCB0eXBlLCBnZW9tLCB0YWdzKSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGlkOiB0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IGlkLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBnZW9tZXRyeTogZ2VvbSxcbiAgICAgICAgdGFnczogdGFncyxcbiAgICAgICAgbWluWDogSW5maW5pdHksXG4gICAgICAgIG1pblk6IEluZmluaXR5LFxuICAgICAgICBtYXhYOiAtSW5maW5pdHksXG4gICAgICAgIG1heFk6IC1JbmZpbml0eVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIGNhbGNCQm94KGZlYXR1cmUpIHtcbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgdmFyIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcgfHwgdHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb21baV0pO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdlb21baV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbVtpXVtqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGZlYXR1cmUubWluWCA9IE1hdGgubWluKGZlYXR1cmUubWluWCwgZ2VvbVtpXSk7XG4gICAgICAgIGZlYXR1cmUubWluWSA9IE1hdGgubWluKGZlYXR1cmUubWluWSwgZ2VvbVtpICsgMV0pO1xuICAgICAgICBmZWF0dXJlLm1heFggPSBNYXRoLm1heChmZWF0dXJlLm1heFgsIGdlb21baV0pO1xuICAgICAgICBmZWF0dXJlLm1heFkgPSBNYXRoLm1heChmZWF0dXJlLm1heFksIGdlb21baSArIDFdKTtcbiAgICB9XG59XG4iLCJcbmltcG9ydCBzaW1wbGlmeSBmcm9tICcuL3NpbXBsaWZ5JztcbmltcG9ydCBjcmVhdGVGZWF0dXJlIGZyb20gJy4vZmVhdHVyZSc7XG5cbi8vIGNvbnZlcnRzIEdlb0pTT04gZmVhdHVyZSBpbnRvIGFuIGludGVybWVkaWF0ZSBwcm9qZWN0ZWQgSlNPTiB2ZWN0b3IgZm9ybWF0IHdpdGggc2ltcGxpZmljYXRpb24gZGF0YVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb252ZXJ0KGRhdGEsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBbXTtcbiAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEuZmVhdHVyZXNbaV0sIG9wdGlvbnMsIGkpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCBvcHRpb25zKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNpbmdsZSBnZW9tZXRyeSBvciBhIGdlb21ldHJ5IGNvbGxlY3Rpb25cbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtnZW9tZXRyeTogZGF0YX0sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBmZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGdlb2pzb24sIG9wdGlvbnMsIGluZGV4KSB7XG4gICAgaWYgKCFnZW9qc29uLmdlb21ldHJ5KSByZXR1cm47XG5cbiAgICB2YXIgY29vcmRzID0gZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICB2YXIgdHlwZSA9IGdlb2pzb24uZ2VvbWV0cnkudHlwZTtcbiAgICB2YXIgdG9sZXJhbmNlID0gTWF0aC5wb3cob3B0aW9ucy50b2xlcmFuY2UgLyAoKDEgPDwgb3B0aW9ucy5tYXhab29tKSAqIG9wdGlvbnMuZXh0ZW50KSwgMik7XG4gICAgdmFyIGdlb21ldHJ5ID0gW107XG4gICAgdmFyIGlkID0gZ2VvanNvbi5pZDtcbiAgICBpZiAob3B0aW9ucy5wcm9tb3RlSWQpIHtcbiAgICAgICAgaWQgPSBnZW9qc29uLnByb3BlcnRpZXNbb3B0aW9ucy5wcm9tb3RlSWRdO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5nZW5lcmF0ZUlkKSB7XG4gICAgICAgIGlkID0gaW5kZXggfHwgMDtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgY29udmVydFBvaW50KGNvb3JkcywgZ2VvbWV0cnkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRQb2ludChjb29yZHNbaV0sIGdlb21ldHJ5KTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgY29udmVydExpbmUoY29vcmRzLCBnZW9tZXRyeSwgdG9sZXJhbmNlLCBmYWxzZSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmxpbmVNZXRyaWNzKSB7XG4gICAgICAgICAgICAvLyBleHBsb2RlIGludG8gbGluZXN0cmluZ3MgdG8gYmUgYWJsZSB0byB0cmFjayBtZXRyaWNzXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgICAgICBjb252ZXJ0TGluZShjb29yZHNbaV0sIGdlb21ldHJ5LCB0b2xlcmFuY2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZUZlYXR1cmUoaWQsICdMaW5lU3RyaW5nJywgZ2VvbWV0cnksIGdlb2pzb24ucHJvcGVydGllcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udmVydExpbmVzKGNvb3JkcywgZ2VvbWV0cnksIHRvbGVyYW5jZSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBjb252ZXJ0TGluZXMoY29vcmRzLCBnZW9tZXRyeSwgdG9sZXJhbmNlLCB0cnVlKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvbHlnb24gPSBbXTtcbiAgICAgICAgICAgIGNvbnZlcnRMaW5lcyhjb29yZHNbaV0sIHBvbHlnb24sIHRvbGVyYW5jZSwgdHJ1ZSk7XG4gICAgICAgICAgICBnZW9tZXRyeS5wdXNoKHBvbHlnb24pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvanNvbi5nZW9tZXRyeS5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvanNvbi5nZW9tZXRyeS5nZW9tZXRyaWVzW2ldLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGdlb2pzb24ucHJvcGVydGllc1xuICAgICAgICAgICAgfSwgb3B0aW9ucywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuJyk7XG4gICAgfVxuXG4gICAgZmVhdHVyZXMucHVzaChjcmVhdGVGZWF0dXJlKGlkLCB0eXBlLCBnZW9tZXRyeSwgZ2VvanNvbi5wcm9wZXJ0aWVzKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQb2ludChjb29yZHMsIG91dCkge1xuICAgIG91dC5wdXNoKHByb2plY3RYKGNvb3Jkc1swXSkpO1xuICAgIG91dC5wdXNoKHByb2plY3RZKGNvb3Jkc1sxXSkpO1xuICAgIG91dC5wdXNoKDApO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0TGluZShyaW5nLCBvdXQsIHRvbGVyYW5jZSwgaXNQb2x5Z29uKSB7XG4gICAgdmFyIHgwLCB5MDtcbiAgICB2YXIgc2l6ZSA9IDA7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHggPSBwcm9qZWN0WChyaW5nW2pdWzBdKTtcbiAgICAgICAgdmFyIHkgPSBwcm9qZWN0WShyaW5nW2pdWzFdKTtcblxuICAgICAgICBvdXQucHVzaCh4KTtcbiAgICAgICAgb3V0LnB1c2goeSk7XG4gICAgICAgIG91dC5wdXNoKDApO1xuXG4gICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgaWYgKGlzUG9seWdvbikge1xuICAgICAgICAgICAgICAgIHNpemUgKz0gKHgwICogeSAtIHggKiB5MCkgLyAyOyAvLyBhcmVhXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNpemUgKz0gTWF0aC5zcXJ0KE1hdGgucG93KHggLSB4MCwgMikgKyBNYXRoLnBvdyh5IC0geTAsIDIpKTsgLy8gbGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeDAgPSB4O1xuICAgICAgICB5MCA9IHk7XG4gICAgfVxuXG4gICAgdmFyIGxhc3QgPSBvdXQubGVuZ3RoIC0gMztcbiAgICBvdXRbMl0gPSAxO1xuICAgIHNpbXBsaWZ5KG91dCwgMCwgbGFzdCwgdG9sZXJhbmNlKTtcbiAgICBvdXRbbGFzdCArIDJdID0gMTtcblxuICAgIG91dC5zaXplID0gTWF0aC5hYnMoc2l6ZSk7XG4gICAgb3V0LnN0YXJ0ID0gMDtcbiAgICBvdXQuZW5kID0gb3V0LnNpemU7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRMaW5lcyhyaW5ncywgb3V0LCB0b2xlcmFuY2UsIGlzUG9seWdvbikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGdlb20gPSBbXTtcbiAgICAgICAgY29udmVydExpbmUocmluZ3NbaV0sIGdlb20sIHRvbGVyYW5jZSwgaXNQb2x5Z29uKTtcbiAgICAgICAgb3V0LnB1c2goZ2VvbSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9qZWN0WCh4KSB7XG4gICAgcmV0dXJuIHggLyAzNjAgKyAwLjU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3RZKHkpIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4oeSAqIE1hdGguUEkgLyAxODApO1xuICAgIHZhciB5MiA9IDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSTtcbiAgICByZXR1cm4geTIgPCAwID8gMCA6IHkyID4gMSA/IDEgOiB5Mjtcbn1cbiIsIlxuaW1wb3J0IGNyZWF0ZUZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBtaW5BbGwsIG1heEFsbCwgb3B0aW9ucykge1xuXG4gICAgazEgLz0gc2NhbGU7XG4gICAgazIgLz0gc2NhbGU7XG5cbiAgICBpZiAobWluQWxsID49IGsxICYmIG1heEFsbCA8IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgZWxzZSBpZiAobWF4QWxsIDwgazEgfHwgbWluQWxsID49IGsyKSByZXR1cm4gbnVsbDsgLy8gdHJpdmlhbCByZWplY3RcblxuICAgIHZhciBjbGlwcGVkID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTtcbiAgICAgICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeTtcbiAgICAgICAgdmFyIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG1pbiA9IGF4aXMgPT09IDAgPyBmZWF0dXJlLm1pblggOiBmZWF0dXJlLm1pblk7XG4gICAgICAgIHZhciBtYXggPSBheGlzID09PSAwID8gZmVhdHVyZS5tYXhYIDogZmVhdHVyZS5tYXhZO1xuXG4gICAgICAgIGlmIChtaW4gPj0gazEgJiYgbWF4IDwgazIpIHsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICAgICAgICAgIGNsaXBwZWQucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG1heCA8IGsxIHx8IG1pbiA+PSBrMikgeyAvLyB0cml2aWFsIHJlamVjdFxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV3R2VvbWV0cnkgPSBbXTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgICAgIGNsaXBQb2ludHMoZ2VvbWV0cnksIG5ld0dlb21ldHJ5LCBrMSwgazIsIGF4aXMpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICBjbGlwTGluZShnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcywgZmFsc2UsIG9wdGlvbnMubGluZU1ldHJpY3MpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lcyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcywgZmFsc2UpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICBjbGlwTGluZXMoZ2VvbWV0cnksIG5ld0dlb21ldHJ5LCBrMSwgazIsIGF4aXMsIHRydWUpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2VvbWV0cnkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9seWdvbiA9IFtdO1xuICAgICAgICAgICAgICAgIGNsaXBMaW5lcyhnZW9tZXRyeVtqXSwgcG9seWdvbiwgazEsIGsyLCBheGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAocG9seWdvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3R2VvbWV0cnkubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5saW5lTWV0cmljcyAmJiB0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmV3R2VvbWV0cnkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5pZCwgdHlwZSwgbmV3R2VvbWV0cnlbal0sIGZlYXR1cmUudGFncykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChuZXdHZW9tZXRyeS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBuZXdHZW9tZXRyeVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9IG5ld0dlb21ldHJ5Lmxlbmd0aCA9PT0gMyA/ICdQb2ludCcgOiAnTXVsdGlQb2ludCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsaXBwZWQucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUuaWQsIHR5cGUsIG5ld0dlb21ldHJ5LCBmZWF0dXJlLnRhZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb20sIG5ld0dlb20sIGsxLCBrMiwgYXhpcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB2YXIgYSA9IGdlb21baSArIGF4aXNdO1xuXG4gICAgICAgIGlmIChhID49IGsxICYmIGEgPD0gazIpIHtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2kgKyAxXSk7XG4gICAgICAgICAgICBuZXdHZW9tLnB1c2goZ2VvbVtpICsgMl0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjbGlwTGluZShnZW9tLCBuZXdHZW9tLCBrMSwgazIsIGF4aXMsIGlzUG9seWdvbiwgdHJhY2tNZXRyaWNzKSB7XG5cbiAgICB2YXIgc2xpY2UgPSBuZXdTbGljZShnZW9tKTtcbiAgICB2YXIgaW50ZXJzZWN0ID0gYXhpcyA9PT0gMCA/IGludGVyc2VjdFggOiBpbnRlcnNlY3RZO1xuICAgIHZhciBsZW4gPSBnZW9tLnN0YXJ0O1xuICAgIHZhciBzZWdMZW4sIHQ7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoIC0gMzsgaSArPSAzKSB7XG4gICAgICAgIHZhciBheCA9IGdlb21baV07XG4gICAgICAgIHZhciBheSA9IGdlb21baSArIDFdO1xuICAgICAgICB2YXIgYXogPSBnZW9tW2kgKyAyXTtcbiAgICAgICAgdmFyIGJ4ID0gZ2VvbVtpICsgM107XG4gICAgICAgIHZhciBieSA9IGdlb21baSArIDRdO1xuICAgICAgICB2YXIgYSA9IGF4aXMgPT09IDAgPyBheCA6IGF5O1xuICAgICAgICB2YXIgYiA9IGF4aXMgPT09IDAgPyBieCA6IGJ5O1xuICAgICAgICB2YXIgZXhpdGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRyYWNrTWV0cmljcykgc2VnTGVuID0gTWF0aC5zcXJ0KE1hdGgucG93KGF4IC0gYngsIDIpICsgTWF0aC5wb3coYXkgLSBieSwgMikpO1xuXG4gICAgICAgIGlmIChhIDwgazEpIHtcbiAgICAgICAgICAgIC8vIC0tLXwtLT4gIHwgKGxpbmUgZW50ZXJzIHRoZSBjbGlwIHJlZ2lvbiBmcm9tIHRoZSBsZWZ0KVxuICAgICAgICAgICAgaWYgKGIgPiBrMSkge1xuICAgICAgICAgICAgICAgIHQgPSBpbnRlcnNlY3Qoc2xpY2UsIGF4LCBheSwgYngsIGJ5LCBrMSk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0cmljcykgc2xpY2Uuc3RhcnQgPSBsZW4gKyBzZWdMZW4gKiB0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGEgPiBrMikge1xuICAgICAgICAgICAgLy8gfCAgPC0tfC0tLSAobGluZSBlbnRlcnMgdGhlIGNsaXAgcmVnaW9uIGZyb20gdGhlIHJpZ2h0KVxuICAgICAgICAgICAgaWYgKGIgPCBrMikge1xuICAgICAgICAgICAgICAgIHQgPSBpbnRlcnNlY3Qoc2xpY2UsIGF4LCBheSwgYngsIGJ5LCBrMik7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0cmljcykgc2xpY2Uuc3RhcnQgPSBsZW4gKyBzZWdMZW4gKiB0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkUG9pbnQoc2xpY2UsIGF4LCBheSwgYXopO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiIDwgazEgJiYgYSA+PSBrMSkge1xuICAgICAgICAgICAgLy8gPC0tfC0tLSAgfCBvciA8LS18LS0tLS18LS0tIChsaW5lIGV4aXRzIHRoZSBjbGlwIHJlZ2lvbiBvbiB0aGUgbGVmdClcbiAgICAgICAgICAgIHQgPSBpbnRlcnNlY3Qoc2xpY2UsIGF4LCBheSwgYngsIGJ5LCBrMSk7XG4gICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiID4gazIgJiYgYSA8PSBrMikge1xuICAgICAgICAgICAgLy8gfCAgLS0tfC0tPiBvciAtLS18LS0tLS18LS0+IChsaW5lIGV4aXRzIHRoZSBjbGlwIHJlZ2lvbiBvbiB0aGUgcmlnaHQpXG4gICAgICAgICAgICB0ID0gaW50ZXJzZWN0KHNsaWNlLCBheCwgYXksIGJ4LCBieSwgazIpO1xuICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNQb2x5Z29uICYmIGV4aXRlZCkge1xuICAgICAgICAgICAgaWYgKHRyYWNrTWV0cmljcykgc2xpY2UuZW5kID0gbGVuICsgc2VnTGVuICogdDtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChzbGljZSk7XG4gICAgICAgICAgICBzbGljZSA9IG5ld1NsaWNlKGdlb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyYWNrTWV0cmljcykgbGVuICs9IHNlZ0xlbjtcbiAgICB9XG5cbiAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcbiAgICB2YXIgbGFzdCA9IGdlb20ubGVuZ3RoIC0gMztcbiAgICBheCA9IGdlb21bbGFzdF07XG4gICAgYXkgPSBnZW9tW2xhc3QgKyAxXTtcbiAgICBheiA9IGdlb21bbGFzdCArIDJdO1xuICAgIGEgPSBheGlzID09PSAwID8gYXggOiBheTtcbiAgICBpZiAoYSA+PSBrMSAmJiBhIDw9IGsyKSBhZGRQb2ludChzbGljZSwgYXgsIGF5LCBheik7XG5cbiAgICAvLyBjbG9zZSB0aGUgcG9seWdvbiBpZiBpdHMgZW5kcG9pbnRzIGFyZSBub3QgdGhlIHNhbWUgYWZ0ZXIgY2xpcHBpbmdcbiAgICBsYXN0ID0gc2xpY2UubGVuZ3RoIC0gMztcbiAgICBpZiAoaXNQb2x5Z29uICYmIGxhc3QgPj0gMyAmJiAoc2xpY2VbbGFzdF0gIT09IHNsaWNlWzBdIHx8IHNsaWNlW2xhc3QgKyAxXSAhPT0gc2xpY2VbMV0pKSB7XG4gICAgICAgIGFkZFBvaW50KHNsaWNlLCBzbGljZVswXSwgc2xpY2VbMV0sIHNsaWNlWzJdKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdGhlIGZpbmFsIHNsaWNlXG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICBuZXdHZW9tLnB1c2goc2xpY2UpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbmV3U2xpY2UobGluZSkge1xuICAgIHZhciBzbGljZSA9IFtdO1xuICAgIHNsaWNlLnNpemUgPSBsaW5lLnNpemU7XG4gICAgc2xpY2Uuc3RhcnQgPSBsaW5lLnN0YXJ0O1xuICAgIHNsaWNlLmVuZCA9IGxpbmUuZW5kO1xuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gY2xpcExpbmVzKGdlb20sIG5ld0dlb20sIGsxLCBrMiwgYXhpcywgaXNQb2x5Z29uKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNsaXBMaW5lKGdlb21baV0sIG5ld0dlb20sIGsxLCBrMiwgYXhpcywgaXNQb2x5Z29uLCBmYWxzZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRQb2ludChvdXQsIHgsIHksIHopIHtcbiAgICBvdXQucHVzaCh4KTtcbiAgICBvdXQucHVzaCh5KTtcbiAgICBvdXQucHVzaCh6KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WChvdXQsIGF4LCBheSwgYngsIGJ5LCB4KSB7XG4gICAgdmFyIHQgPSAoeCAtIGF4KSAvIChieCAtIGF4KTtcbiAgICBvdXQucHVzaCh4KTtcbiAgICBvdXQucHVzaChheSArIChieSAtIGF5KSAqIHQpO1xuICAgIG91dC5wdXNoKDEpO1xuICAgIHJldHVybiB0O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RZKG91dCwgYXgsIGF5LCBieCwgYnksIHkpIHtcbiAgICB2YXIgdCA9ICh5IC0gYXkpIC8gKGJ5IC0gYXkpO1xuICAgIG91dC5wdXNoKGF4ICsgKGJ4IC0gYXgpICogdCk7XG4gICAgb3V0LnB1c2goeSk7XG4gICAgb3V0LnB1c2goMSk7XG4gICAgcmV0dXJuIHQ7XG59XG4iLCJcbmltcG9ydCBjbGlwIGZyb20gJy4vY2xpcCc7XG5pbXBvcnQgY3JlYXRlRmVhdHVyZSBmcm9tICcuL2ZlYXR1cmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3cmFwKGZlYXR1cmVzLCBvcHRpb25zKSB7XG4gICAgdmFyIGJ1ZmZlciA9IG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQ7XG4gICAgdmFyIG1lcmdlZCA9IGZlYXR1cmVzO1xuICAgIHZhciBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIDEsIC0xIC0gYnVmZmVyLCBidWZmZXIsICAgICAwLCAtMSwgMiwgb3B0aW9ucyk7IC8vIGxlZnQgd29ybGQgY29weVxuICAgIHZhciByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCAtMSwgMiwgb3B0aW9ucyk7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcblxuICAgIGlmIChsZWZ0IHx8IHJpZ2h0KSB7XG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIC0xLCAyLCBvcHRpb25zKSB8fCBbXTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcblxuICAgICAgICBpZiAobGVmdCkgbWVyZ2VkID0gc2hpZnRGZWF0dXJlQ29vcmRzKGxlZnQsIDEpLmNvbmNhdChtZXJnZWQpOyAvLyBtZXJnZSBsZWZ0IGludG8gY2VudGVyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3RmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50JyB8fCB0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeSwgb2Zmc2V0KTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBuZXdQb2x5Z29uID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBmZWF0dXJlLmdlb21ldHJ5W2pdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BvbHlnb24ucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdW2tdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChuZXdQb2x5Z29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0ZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLmlkLCB0eXBlLCBuZXdHZW9tZXRyeSwgZmVhdHVyZS50YWdzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBzaGlmdENvb3Jkcyhwb2ludHMsIG9mZnNldCkge1xuICAgIHZhciBuZXdQb2ludHMgPSBbXTtcbiAgICBuZXdQb2ludHMuc2l6ZSA9IHBvaW50cy5zaXplO1xuXG4gICAgaWYgKHBvaW50cy5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1BvaW50cy5zdGFydCA9IHBvaW50cy5zdGFydDtcbiAgICAgICAgbmV3UG9pbnRzLmVuZCA9IHBvaW50cy5lbmQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgbmV3UG9pbnRzLnB1c2gocG9pbnRzW2ldICsgb2Zmc2V0LCBwb2ludHNbaSArIDFdLCBwb2ludHNbaSArIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50cztcbn1cbiIsIlxuLy8gVHJhbnNmb3JtcyB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBmZWF0dXJlIGluIHRoZSBnaXZlbiB0aWxlIGZyb21cbi8vIG1lcmNhdG9yLXByb2plY3RlZCBzcGFjZSBpbnRvIChleHRlbnQgeCBleHRlbnQpIHRpbGUgc3BhY2UuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHRpbGUsIGV4dGVudCkge1xuICAgIGlmICh0aWxlLnRyYW5zZm9ybWVkKSByZXR1cm4gdGlsZTtcblxuICAgIHZhciB6MiA9IDEgPDwgdGlsZS56LFxuICAgICAgICB0eCA9IHRpbGUueCxcbiAgICAgICAgdHkgPSB0aWxlLnksXG4gICAgICAgIGksIGosIGs7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IHRpbGUuZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgZmVhdHVyZS5nZW9tZXRyeSA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGogKz0gMikge1xuICAgICAgICAgICAgICAgIGZlYXR1cmUuZ2VvbWV0cnkucHVzaCh0cmFuc2Zvcm1Qb2ludChnZW9tW2pdLCBnZW9tW2ogKyAxXSwgZXh0ZW50LCB6MiwgdHgsIHR5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciByaW5nID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGdlb21bal0ubGVuZ3RoOyBrICs9IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmluZy5wdXNoKHRyYW5zZm9ybVBvaW50KGdlb21bal1ba10sIGdlb21bal1bayArIDFdLCBleHRlbnQsIHoyLCB0eCwgdHkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS5wdXNoKHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGlsZS50cmFuc2Zvcm1lZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQoeCwgeSwgZXh0ZW50LCB6MiwgdHgsIHR5KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgTWF0aC5yb3VuZChleHRlbnQgKiAoeCAqIHoyIC0gdHgpKSxcbiAgICAgICAgTWF0aC5yb3VuZChleHRlbnQgKiAoeSAqIHoyIC0gdHkpKV07XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHosIHR4LCB0eSwgb3B0aW9ucykge1xuICAgIHZhciB0b2xlcmFuY2UgPSB6ID09PSBvcHRpb25zLm1heFpvb20gPyAwIDogb3B0aW9ucy50b2xlcmFuY2UgLyAoKDEgPDwgeikgKiBvcHRpb25zLmV4dGVudCk7XG4gICAgdmFyIHRpbGUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxuICAgICAgICBudW1TaW1wbGlmaWVkOiAwLFxuICAgICAgICBudW1GZWF0dXJlczogMCxcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB4OiB0eCxcbiAgICAgICAgeTogdHksXG4gICAgICAgIHo6IHosXG4gICAgICAgIHRyYW5zZm9ybWVkOiBmYWxzZSxcbiAgICAgICAgbWluWDogMixcbiAgICAgICAgbWluWTogMSxcbiAgICAgICAgbWF4WDogLTEsXG4gICAgICAgIG1heFk6IDBcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGlsZS5udW1GZWF0dXJlcysrO1xuICAgICAgICBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmVzW2ldLCB0b2xlcmFuY2UsIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtaW5YID0gZmVhdHVyZXNbaV0ubWluWDtcbiAgICAgICAgdmFyIG1pblkgPSBmZWF0dXJlc1tpXS5taW5ZO1xuICAgICAgICB2YXIgbWF4WCA9IGZlYXR1cmVzW2ldLm1heFg7XG4gICAgICAgIHZhciBtYXhZID0gZmVhdHVyZXNbaV0ubWF4WTtcblxuICAgICAgICBpZiAobWluWCA8IHRpbGUubWluWCkgdGlsZS5taW5YID0gbWluWDtcbiAgICAgICAgaWYgKG1pblkgPCB0aWxlLm1pblkpIHRpbGUubWluWSA9IG1pblk7XG4gICAgICAgIGlmIChtYXhYID4gdGlsZS5tYXhYKSB0aWxlLm1heFggPSBtYXhYO1xuICAgICAgICBpZiAobWF4WSA+IHRpbGUubWF4WSkgdGlsZS5tYXhZID0gbWF4WTtcbiAgICB9XG4gICAgcmV0dXJuIHRpbGU7XG59XG5cbmZ1bmN0aW9uIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZSwgdG9sZXJhbmNlLCBvcHRpb25zKSB7XG5cbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGUsXG4gICAgICAgIHNpbXBsaWZpZWQgPSBbXTtcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2kgKyAxXSk7XG4gICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIGFkZExpbmUoc2ltcGxpZmllZCwgZ2VvbSwgdGlsZSwgdG9sZXJhbmNlLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFkZExpbmUoc2ltcGxpZmllZCwgZ2VvbVtpXSwgdGlsZSwgdG9sZXJhbmNlLCB0eXBlID09PSAnUG9seWdvbicsIGkgPT09IDApO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG5cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBnZW9tLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICB2YXIgcG9seWdvbiA9IGdlb21ba107XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFkZExpbmUoc2ltcGxpZmllZCwgcG9seWdvbltpXSwgdGlsZSwgdG9sZXJhbmNlLCB0cnVlLCBpID09PSAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW1wbGlmaWVkLmxlbmd0aCkge1xuICAgICAgICB2YXIgdGFncyA9IGZlYXR1cmUudGFncyB8fCBudWxsO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnICYmIG9wdGlvbnMubGluZU1ldHJpY3MpIHtcbiAgICAgICAgICAgIHRhZ3MgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLnRhZ3MpIHRhZ3Nba2V5XSA9IGZlYXR1cmUudGFnc1trZXldO1xuICAgICAgICAgICAgdGFnc1snbWFwYm94X2NsaXBfc3RhcnQnXSA9IGdlb20uc3RhcnQgLyBnZW9tLnNpemU7XG4gICAgICAgICAgICB0YWdzWydtYXBib3hfY2xpcF9lbmQnXSA9IGdlb20uZW5kIC8gZ2VvbS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aWxlRmVhdHVyZSA9IHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBzaW1wbGlmaWVkLFxuICAgICAgICAgICAgdHlwZTogdHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nID8gMyA6XG4gICAgICAgICAgICAgICAgdHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnID8gMiA6IDEsXG4gICAgICAgICAgICB0YWdzOiB0YWdzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChmZWF0dXJlLmlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aWxlRmVhdHVyZS5pZCA9IGZlYXR1cmUuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5mZWF0dXJlcy5wdXNoKHRpbGVGZWF0dXJlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZExpbmUocmVzdWx0LCBnZW9tLCB0aWxlLCB0b2xlcmFuY2UsIGlzUG9seWdvbiwgaXNPdXRlcikge1xuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZTtcblxuICAgIGlmICh0b2xlcmFuY2UgPiAwICYmIChnZW9tLnNpemUgPCAoaXNQb2x5Z29uID8gc3FUb2xlcmFuY2UgOiB0b2xlcmFuY2UpKSkge1xuICAgICAgICB0aWxlLm51bVBvaW50cyArPSBnZW9tLmxlbmd0aCAvIDM7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmluZyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGlmICh0b2xlcmFuY2UgPT09IDAgfHwgZ2VvbVtpICsgMl0gPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgICAgICByaW5nLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICByaW5nLnB1c2goZ2VvbVtpICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgfVxuXG4gICAgaWYgKGlzUG9seWdvbikgcmV3aW5kKHJpbmcsIGlzT3V0ZXIpO1xuXG4gICAgcmVzdWx0LnB1c2gocmluZyk7XG59XG5cbmZ1bmN0aW9uIHJld2luZChyaW5nLCBjbG9ja3dpc2UpIHtcbiAgICB2YXIgYXJlYSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMjsgaSA8IGxlbjsgaiA9IGksIGkgKz0gMikge1xuICAgICAgICBhcmVhICs9IChyaW5nW2ldIC0gcmluZ1tqXSkgKiAocmluZ1tpICsgMV0gKyByaW5nW2ogKyAxXSk7XG4gICAgfVxuICAgIGlmIChhcmVhID4gMCA9PT0gY2xvY2t3aXNlKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoOyBpIDwgbGVuIC8gMjsgaSArPSAyKSB7XG4gICAgICAgICAgICB2YXIgeCA9IHJpbmdbaV07XG4gICAgICAgICAgICB2YXIgeSA9IHJpbmdbaSArIDFdO1xuICAgICAgICAgICAgcmluZ1tpXSA9IHJpbmdbbGVuIC0gMiAtIGldO1xuICAgICAgICAgICAgcmluZ1tpICsgMV0gPSByaW5nW2xlbiAtIDEgLSBpXTtcbiAgICAgICAgICAgIHJpbmdbbGVuIC0gMiAtIGldID0geDtcbiAgICAgICAgICAgIHJpbmdbbGVuIC0gMSAtIGldID0geTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIlxuaW1wb3J0IGNvbnZlcnQgZnJvbSAnLi9jb252ZXJ0JzsgICAgIC8vIEdlb0pTT04gY29udmVyc2lvbiBhbmQgcHJlcHJvY2Vzc2luZ1xuaW1wb3J0IGNsaXAgZnJvbSAnLi9jbGlwJzsgICAgICAgICAgIC8vIHN0cmlwZSBjbGlwcGluZyBhbGdvcml0aG1cbmltcG9ydCB3cmFwIGZyb20gJy4vd3JhcCc7ICAgICAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuaW1wb3J0IHRyYW5zZm9ybSBmcm9tICcuL3RyYW5zZm9ybSc7IC8vIGNvb3JkaW5hdGUgdHJhbnNmb3JtYXRpb25cbmltcG9ydCBjcmVhdGVUaWxlIGZyb20gJy4vdGlsZSc7ICAgICAvLyBmaW5hbCBzaW1wbGlmaWVkIHRpbGUgZ2VuZXJhdGlvblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZW9qc29udnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgIHZhciBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZSgncHJlcHJvY2VzcyBkYXRhJyk7XG5cbiAgICBpZiAob3B0aW9ucy5tYXhab29tIDwgMCB8fCBvcHRpb25zLm1heFpvb20gPiAyNCkgdGhyb3cgbmV3IEVycm9yKCdtYXhab29tIHNob3VsZCBiZSBpbiB0aGUgMC0yNCByYW5nZScpO1xuICAgIGlmIChvcHRpb25zLnByb21vdGVJZCAmJiBvcHRpb25zLmdlbmVyYXRlSWQpIHRocm93IG5ldyBFcnJvcigncHJvbW90ZUlkIGFuZCBnZW5lcmF0ZUlkIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLicpO1xuXG4gICAgdmFyIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zKTtcblxuICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICB0aGlzLnRpbGVDb29yZHMgPSBbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3ByZXByb2Nlc3MgZGF0YScpO1xuICAgICAgICBjb25zb2xlLmxvZygnaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkJywgb3B0aW9ucy5pbmRleE1heFpvb20sIG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB7fTtcbiAgICAgICAgdGhpcy50b3RhbCA9IDA7XG4gICAgfVxuXG4gICAgZmVhdHVyZXMgPSB3cmFwKGZlYXR1cmVzLCBvcHRpb25zKTtcblxuICAgIC8vIHN0YXJ0IHNsaWNpbmcgZnJvbSB0aGUgdG9wIHRpbGUgZG93blxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHRoaXMuc3BsaXRUaWxlKGZlYXR1cmVzLCAwLCAwLCAwKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSBjb25zb2xlLmxvZygnZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkJywgdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcywgdGhpcy50aWxlc1swXS5udW1Qb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aWxlcyBnZW5lcmF0ZWQ6JywgdGhpcy50b3RhbCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0cykpO1xuICAgIH1cbn1cblxuR2VvSlNPTlZULnByb3RvdHlwZS5vcHRpb25zID0ge1xuICAgIG1heFpvb206IDE0LCAgICAgICAgICAgIC8vIG1heCB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBvblxuICAgIGluZGV4TWF4Wm9vbTogNSwgICAgICAgIC8vIG1heCB6b29tIGluIHRoZSB0aWxlIGluZGV4XG4gICAgaW5kZXhNYXhQb2ludHM6IDEwMDAwMCwgLy8gbWF4IG51bWJlciBvZiBwb2ludHMgcGVyIHRpbGUgaW4gdGhlIHRpbGUgaW5kZXhcbiAgICB0b2xlcmFuY2U6IDMsICAgICAgICAgICAvLyBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyKVxuICAgIGV4dGVudDogNDA5NiwgICAgICAgICAgIC8vIHRpbGUgZXh0ZW50XG4gICAgYnVmZmVyOiA2NCwgICAgICAgICAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgbGluZU1ldHJpY3M6IGZhbHNlLCAgICAgLy8gd2hldGhlciB0byBjYWxjdWxhdGUgbGluZSBtZXRyaWNzXG4gICAgcHJvbW90ZUlkOiBudWxsLCAgICAgICAgLy8gbmFtZSBvZiBhIGZlYXR1cmUgcHJvcGVydHkgdG8gYmUgcHJvbW90ZWQgdG8gZmVhdHVyZS5pZFxuICAgIGdlbmVyYXRlSWQ6IGZhbHNlLCAgICAgIC8vIHdoZXRoZXIgdG8gZ2VuZXJhdGUgZmVhdHVyZSBpZHMuIENhbm5vdCBiZSB1c2VkIHdpdGggcHJvbW90ZUlkXG4gICAgZGVidWc6IDAgICAgICAgICAgICAgICAgLy8gbG9nZ2luZyBsZXZlbCAoMCwgMSBvciAyKVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5zcGxpdFRpbGUgPSBmdW5jdGlvbiAoZmVhdHVyZXMsIHosIHgsIHksIGN6LCBjeCwgY3kpIHtcblxuICAgIHZhciBzdGFjayA9IFtmZWF0dXJlcywgeiwgeCwgeV0sXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHByb2Nlc3NpbmcgcXVldWVcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB6ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGZlYXR1cmVzID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgdmFyIHoyID0gMSA8PCB6LFxuICAgICAgICAgICAgaWQgPSB0b0lEKHosIHgsIHkpLFxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdO1xuXG4gICAgICAgIGlmICghdGlsZSkge1xuICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdjcmVhdGlvbicpO1xuXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF0gPSBjcmVhdGVUaWxlKGZlYXR1cmVzLCB6LCB4LCB5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMudGlsZUNvb3Jkcy5wdXNoKHt6OiB6LCB4OiB4LCB5OiB5fSk7XG5cbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB6LCB4LCB5LCB0aWxlLm51bUZlYXR1cmVzLCB0aWxlLm51bVBvaW50cywgdGlsZS5udW1TaW1wbGlmaWVkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKCdjcmVhdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJ3onICsgejtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRzW2tleV0gPSAodGhpcy5zdGF0c1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBnZW9tZXRyeSBpbiB0aWxlIHNvIHRoYXQgd2UgY2FuIGRyaWxsIGRvd24gbGF0ZXIgaWYgd2Ugc3RvcCBub3dcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBmZWF0dXJlcztcblxuICAgICAgICAvLyBpZiBpdCdzIHRoZSBmaXJzdC1wYXNzIHRpbGluZ1xuICAgICAgICBpZiAoIWN6KSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5pbmRleE1heFpvb20gfHwgdGlsZS5udW1Qb2ludHMgPD0gb3B0aW9ucy5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIGJhc2Ugem9vbSBvciBvdXIgdGFyZ2V0IHRpbGUgem9vbVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIGl0J3Mgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSB0YXJnZXQgdGlsZVxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xuICAgICAgICAgICAgaWYgKHggIT09IE1hdGguZmxvb3IoY3ggLyBtKSB8fCB5ICE9PSBNYXRoLmZsb29yKGN5IC8gbSkpIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2Ugc2xpY2UgZnVydGhlciBkb3duLCBubyBuZWVkIHRvIGtlZXAgc291cmNlIGdlb21ldHJ5XG4gICAgICAgIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgICAgIGsyID0gMC41IC0gazEsXG4gICAgICAgICAgICBrMyA9IDAuNSArIGsxLFxuICAgICAgICAgICAgazQgPSAxICsgazEsXG4gICAgICAgICAgICB0bCwgYmwsIHRyLCBiciwgbGVmdCwgcmlnaHQ7XG5cbiAgICAgICAgdGwgPSBibCA9IHRyID0gYnIgPSBudWxsO1xuXG4gICAgICAgIGxlZnQgID0gY2xpcChmZWF0dXJlcywgejIsIHggLSBrMSwgeCArIGszLCAwLCB0aWxlLm1pblgsIHRpbGUubWF4WCwgb3B0aW9ucyk7XG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgejIsIHggKyBrMiwgeCArIGs0LCAwLCB0aWxlLm1pblgsIHRpbGUubWF4WCwgb3B0aW9ucyk7XG4gICAgICAgIGZlYXR1cmVzID0gbnVsbDtcblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgdGwgPSBjbGlwKGxlZnQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgdGlsZS5taW5ZLCB0aWxlLm1heFksIG9wdGlvbnMpO1xuICAgICAgICAgICAgYmwgPSBjbGlwKGxlZnQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgdGlsZS5taW5ZLCB0aWxlLm1heFksIG9wdGlvbnMpO1xuICAgICAgICAgICAgbGVmdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHRyID0gY2xpcChyaWdodCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBiciA9IGNsaXAocmlnaHQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgdGlsZS5taW5ZLCB0aWxlLm1heFksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmlnaHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdjbGlwcGluZycpO1xuXG4gICAgICAgIHN0YWNrLnB1c2godGwgfHwgW10sIHogKyAxLCB4ICogMiwgICAgIHkgKiAyKTtcbiAgICAgICAgc3RhY2sucHVzaChibCB8fCBbXSwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIgKyAxKTtcbiAgICAgICAgc3RhY2sucHVzaCh0ciB8fCBbXSwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIpO1xuICAgICAgICBzdGFjay5wdXNoKGJyIHx8IFtdLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMiArIDEpO1xuICAgIH1cbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uICh6LCB4LCB5KSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoeiA8IDAgfHwgeiA+IDI0KSByZXR1cm4gbnVsbDtcblxuICAgIHZhciB6MiA9IDEgPDwgejtcbiAgICB4ID0gKCh4ICUgejIpICsgejIpICUgejI7IC8vIHdyYXAgdGlsZSB4IGNvb3JkaW5hdGVcblxuICAgIHZhciBpZCA9IHRvSUQoeiwgeCwgeSk7XG4gICAgaWYgKHRoaXMudGlsZXNbaWRdKSByZXR1cm4gdHJhbnNmb3JtKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2RyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkJywgeiwgeCwgeSk7XG5cbiAgICB2YXIgejAgPSB6LFxuICAgICAgICB4MCA9IHgsXG4gICAgICAgIHkwID0geSxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgd2hpbGUgKCFwYXJlbnQgJiYgejAgPiAwKSB7XG4gICAgICAgIHowLS07XG4gICAgICAgIHgwID0gTWF0aC5mbG9vcih4MCAvIDIpO1xuICAgICAgICB5MCA9IE1hdGguZmxvb3IoeTAgLyAyKTtcbiAgICAgICAgcGFyZW50ID0gdGhpcy50aWxlc1t0b0lEKHowLCB4MCwgeTApXTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LnNvdXJjZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBhIHBhcmVudCB0aWxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGdlb21ldHJ5LCB3ZSBjYW4gZHJpbGwgZG93biBmcm9tIGl0XG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2ZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZCcsIHowLCB4MCwgeTApO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdkcmlsbGluZyBkb3duJyk7XG4gICAgdGhpcy5zcGxpdFRpbGUocGFyZW50LnNvdXJjZSwgejAsIHgwLCB5MCwgeiwgeCwgeSk7XG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdkcmlsbGluZyBkb3duJyk7XG5cbiAgICByZXR1cm4gdGhpcy50aWxlc1tpZF0gPyB0cmFuc2Zvcm0odGhpcy50aWxlc1tpZF0sIGV4dGVudCkgOiBudWxsO1xufTtcblxuZnVuY3Rpb24gdG9JRCh6LCB4LCB5KSB7XG4gICAgcmV0dXJuICgoKDEgPDwgeikgKiB5ICsgeCkgKiAzMikgKyB6O1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIGRlc3RbaV0gPSBzcmNbaV07XG4gICAgcmV0dXJuIGRlc3Q7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBnZXRKU09OIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcblxuaW1wb3J0IHBlcmZvcm1hbmNlIGZyb20gJy4uL3V0aWwvcGVyZm9ybWFuY2UnO1xuaW1wb3J0IHJld2luZCBmcm9tICdAbWFwYm94L2dlb2pzb24tcmV3aW5kJztcbmltcG9ydCBHZW9KU09OV3JhcHBlciBmcm9tICcuL2dlb2pzb25fd3JhcHBlcic7XG5pbXBvcnQgdnRwYmYgZnJvbSAndnQtcGJmJztcbmltcG9ydCBTdXBlcmNsdXN0ZXIgZnJvbSAnc3VwZXJjbHVzdGVyJztcbmltcG9ydCBnZW9qc29udnQgZnJvbSAnZ2VvanNvbi12dCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSBmcm9tICcuL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UnO1xuaW1wb3J0IHsgY3JlYXRlRXhwcmVzc2lvbiB9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBXb3JrZXJUaWxlUGFyYW1ldGVycyxcbiAgICBXb3JrZXJUaWxlQ2FsbGJhY2ssXG59IGZyb20gJy4uL3NvdXJjZS93b3JrZXJfc291cmNlJztcblxuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvcic7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVySW5kZXggZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXgnO1xuXG5pbXBvcnQgdHlwZSB7TG9hZFZlY3RvckRhdGFDYWxsYmFja30gZnJvbSAnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdFBhcmFtZXRlcnMsIFJlc3BvbnNlQ2FsbGJhY2sgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IHR5cGUgeyBDYWxsYmFjayB9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcbmltcG9ydCB0eXBlIHtHZW9KU09ORmVhdHVyZX0gZnJvbSAnQG1hcGJveC9nZW9qc29uLXR5cGVzJztcblxuZXhwb3J0IHR5cGUgTG9hZEdlb0pTT05QYXJhbWV0ZXJzID0ge1xuICAgIHJlcXVlc3Q/OiBSZXF1ZXN0UGFyYW1ldGVycyxcbiAgICBkYXRhPzogc3RyaW5nLFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIGNsdXN0ZXI6IGJvb2xlYW4sXG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucz86IE9iamVjdCxcbiAgICBnZW9qc29uVnRPcHRpb25zPzogT2JqZWN0LFxuICAgIGNsdXN0ZXJQcm9wZXJ0aWVzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgdHlwZSBMb2FkR2VvSlNPTiA9IChwYXJhbXM6IExvYWRHZW9KU09OUGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8T2JqZWN0PikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBHZW9KU09OSW5kZXgge1xuICAgIGdldFRpbGUoejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IE9iamVjdDtcblxuICAgIC8vIHN1cGVyY2x1c3RlciBtZXRob2RzXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkOiBudW1iZXIpOiBudW1iZXI7XG4gICAgZ2V0Q2hpbGRyZW4oY2x1c3RlcklkOiBudW1iZXIpOiBBcnJheTxHZW9KU09ORmVhdHVyZT47XG4gICAgZ2V0TGVhdmVzKGNsdXN0ZXJJZDogbnVtYmVyLCBsaW1pdDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcik6IEFycmF5PEdlb0pTT05GZWF0dXJlPjtcbn1cblxuZnVuY3Rpb24gbG9hZEdlb0pTT05UaWxlKHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBMb2FkVmVjdG9yRGF0YUNhbGxiYWNrKSB7XG4gICAgY29uc3QgY2Fub25pY2FsID0gcGFyYW1zLnRpbGVJRC5jYW5vbmljYWw7XG5cbiAgICBpZiAoIXRoaXMuX2dlb0pTT05JbmRleCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbnVsbCk7ICAvLyB3ZSBjb3VsZG4ndCBsb2FkIHRoZSBmaWxlXG4gICAgfVxuXG4gICAgY29uc3QgZ2VvSlNPTlRpbGUgPSB0aGlzLl9nZW9KU09OSW5kZXguZ2V0VGlsZShjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55KTtcbiAgICBpZiAoIWdlb0pTT05UaWxlKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTsgLy8gbm90aGluZyBpbiB0aGUgZ2l2ZW4gdGlsZVxuICAgIH1cblxuICAgIGNvbnN0IGdlb2pzb25XcmFwcGVyID0gbmV3IEdlb0pTT05XcmFwcGVyKGdlb0pTT05UaWxlLmZlYXR1cmVzKTtcblxuICAgIC8vIEVuY29kZSB0aGUgZ2VvanNvbi12dCB0aWxlIGludG8gYmluYXJ5IHZlY3RvciB0aWxlIGZvcm0uICBUaGlzXG4gICAgLy8gaXMgYSBjb252ZW5pZW5jZSB0aGF0IGFsbG93cyBgRmVhdHVyZUluZGV4YCB0byBvcGVyYXRlIHRoZSBzYW1lIHdheVxuICAgIC8vIGFjcm9zcyBgVmVjdG9yVGlsZVNvdXJjZWAgYW5kIGBHZW9KU09OU291cmNlYCBkYXRhLlxuICAgIGxldCBwYmYgPSB2dHBiZihnZW9qc29uV3JhcHBlcik7XG4gICAgaWYgKHBiZi5ieXRlT2Zmc2V0ICE9PSAwIHx8IHBiZi5ieXRlTGVuZ3RoICE9PSBwYmYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSB3aXRoIG5vZGUgQnVmZmVyIChodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3BiZi9pc3N1ZXMvMzUpXG4gICAgICAgIHBiZiA9IG5ldyBVaW50OEFycmF5KHBiZik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICB2ZWN0b3JUaWxlOiBnZW9qc29uV3JhcHBlcixcbiAgICAgICAgcmF3RGF0YTogcGJmLmJ1ZmZlclxuICAgIH0pO1xufVxuXG5leHBvcnQgdHlwZSBTb3VyY2VTdGF0ZSA9XG4gICAgfCAnSWRsZScgICAgICAgICAgICAvLyBTb3VyY2UgZW1wdHkgb3IgZGF0YSBsb2FkZWRcbiAgICB8ICdDb2FsZXNjaW5nJyAgICAgIC8vIERhdGEgZmluaXNoZWQgbG9hZGluZywgYnV0IGRpc2NhcmQgJ2xvYWREYXRhJyBtZXNzYWdlcyB1bnRpbCByZWNlaXZpbmcgJ2NvYWxlc2NlZCdcbiAgICB8ICdOZWVkc0xvYWREYXRhJzsgIC8vICdsb2FkRGF0YScgcmVjZWl2ZWQgd2hpbGUgY29hbGVzY2luZywgdHJpZ2dlciBvbmUgbW9yZSAnbG9hZERhdGEnIG9uIHJlY2VpdmluZyAnY29hbGVzY2VkJ1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgV29ya2VyU291cmNlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN1cHBvcnRzIHtAbGluayBHZW9KU09OU291cmNlfS5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZWFzaWx5IHJldXNlZCB0byBzdXBwb3J0IGN1c3RvbSBzb3VyY2UgdHlwZXNcbiAqIGZvciBkYXRhIGZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkL2NvbnZlcnRlZCBpbnRvIGFuIGluLW1lbW9yeSBHZW9KU09OXG4gKiByZXByZXNlbnRhdGlvbi4gIFRvIGRvIHNvLCBjcmVhdGUgaXQgd2l0aFxuICogYG5ldyBHZW9KU09OV29ya2VyU291cmNlKGFjdG9yLCBsYXllckluZGV4LCBjdXN0b21Mb2FkR2VvSlNPTkZ1bmN0aW9uKWAuXG4gKiBGb3IgYSBmdWxsIGV4YW1wbGUsIHNlZSBbbWFwYm94LWdsLXRvcG9qc29uXShodHRwczovL2dpdGh1Yi5jb20vZGV2ZWxvcG1lbnRzZWVkL21hcGJveC1nbC10b3BvanNvbikuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgR2VvSlNPTldvcmtlclNvdXJjZSBleHRlbmRzIFZlY3RvclRpbGVXb3JrZXJTb3VyY2Uge1xuICAgIGxvYWRHZW9KU09OOiBMb2FkR2VvSlNPTjtcbiAgICBfc3RhdGU6IFNvdXJjZVN0YXRlO1xuICAgIF9wZW5kaW5nQ2FsbGJhY2s6IENhbGxiYWNrPHtcbiAgICAgICAgcmVzb3VyY2VUaW1pbmc/OiB7W3N0cmluZ106IEFycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+fSxcbiAgICAgICAgYWJhbmRvbmVkPzogYm9vbGVhbiB9PjtcbiAgICBfcGVuZGluZ0xvYWREYXRhUGFyYW1zOiBMb2FkR2VvSlNPTlBhcmFtZXRlcnM7XG4gICAgX2dlb0pTT05JbmRleDogR2VvSlNPTkluZGV4XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gW2xvYWRHZW9KU09OXSBPcHRpb25hbCBtZXRob2QgZm9yIGN1c3RvbSBsb2FkaW5nL3BhcnNpbmcgb2ZcbiAgICAgKiBHZW9KU09OIGJhc2VkIG9uIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIG1haW4tdGhyZWFkIFNvdXJjZS5cbiAgICAgKiBTZWUge0BsaW5rIEdlb0pTT05Xb3JrZXJTb3VyY2UjbG9hZEdlb0pTT059LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjdG9yOiBBY3RvciwgbGF5ZXJJbmRleDogU3R5bGVMYXllckluZGV4LCBsb2FkR2VvSlNPTjogP0xvYWRHZW9KU09OKSB7XG4gICAgICAgIHN1cGVyKGFjdG9yLCBsYXllckluZGV4LCBsb2FkR2VvSlNPTlRpbGUpO1xuICAgICAgICBpZiAobG9hZEdlb0pTT04pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEdlb0pTT04gPSBsb2FkR2VvSlNPTjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgKGlmIGFwcHJvcHJpYXRlKSwgcGFyc2VzLCBhbmQgaW5kZXggZ2VvanNvbiBkYXRhIGludG8gdGlsZXMuIFRoaXNcbiAgICAgKiBwcmVwYXJhdG9yeSBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRUaWxlfVxuICAgICAqIGNhbiBjb3JyZWN0bHkgc2VydmUgdXAgdGlsZXMuXG4gICAgICpcbiAgICAgKiBEZWZlcnMgdG8ge0BsaW5rIEdlb0pTT05Xb3JrZXJTb3VyY2UjbG9hZEdlb0pTT059IGZvciB0aGUgZmV0Y2hpbmcvcGFyc2luZyxcbiAgICAgKiBleHBlY3RpbmcgYGNhbGxiYWNrKGVycm9yLCBkYXRhKWAgdG8gYmUgY2FsbGVkIHdpdGggZWl0aGVyIGFuIGVycm9yIG9yIGFcbiAgICAgKiBwYXJzZWQgR2VvSlNPTiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBXaGVuIGBsb2FkRGF0YWAgcmVxdWVzdHMgY29tZSBpbiBmYXN0ZXIgdGhhbiB0aGV5IGNhbiBiZSBwcm9jZXNzZWQsXG4gICAgICogdGhleSBhcmUgY29hbGVzY2VkIGludG8gYSBzaW5nbGUgcmVxdWVzdCB1c2luZyB0aGUgbGF0ZXN0IGRhdGEuXG4gICAgICogU2VlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2NvYWxlc2NlfVxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBjYWxsYmFja1xuICAgICAqL1xuICAgIGxvYWREYXRhKHBhcmFtczogTG9hZEdlb0pTT05QYXJhbWV0ZXJzLCBjYWxsYmFjazogQ2FsbGJhY2s8e1xuICAgICAgICByZXNvdXJjZVRpbWluZz86IHtbc3RyaW5nXTogQXJyYXk8UGVyZm9ybWFuY2VSZXNvdXJjZVRpbWluZz59LFxuICAgICAgICBhYmFuZG9uZWQ/OiBib29sZWFuIH0+KSB7XG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIFRlbGwgdGhlIGZvcmVncm91bmQgdGhlIHByZXZpb3VzIGNhbGwgaGFzIGJlZW4gYWJhbmRvbmVkXG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2sobnVsbCwgeyBhYmFuZG9uZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGVuZGluZ0NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdMb2FkRGF0YVBhcmFtcyA9IHBhcmFtcztcblxuICAgICAgICBpZiAodGhpcy5fc3RhdGUgJiZcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlICE9PSAnSWRsZScpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ05lZWRzTG9hZERhdGEnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnQ29hbGVzY2luZyc7XG4gICAgICAgICAgICB0aGlzLl9sb2FkRGF0YSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb246IGNhbGxlZCBkaXJlY3RseSBieSBgbG9hZERhdGFgXG4gICAgICogb3IgYnkgYGNvYWxlc2NlYCB1c2luZyBzdG9yZWQgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBfbG9hZERhdGEoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcGVuZGluZ0NhbGxiYWNrIHx8ICF0aGlzLl9wZW5kaW5nTG9hZERhdGFQYXJhbXMpIHtcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLl9wZW5kaW5nQ2FsbGJhY2s7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BlbmRpbmdMb2FkRGF0YVBhcmFtcztcbiAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdDYWxsYmFjaztcbiAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdMb2FkRGF0YVBhcmFtcztcblxuICAgICAgICBjb25zdCBwZXJmID0gKHBhcmFtcyAmJiBwYXJhbXMucmVxdWVzdCAmJiBwYXJhbXMucmVxdWVzdC5jb2xsZWN0UmVzb3VyY2VUaW1pbmcpID9cbiAgICAgICAgICAgIG5ldyBwZXJmb3JtYW5jZS5QZXJmb3JtYW5jZShwYXJhbXMucmVxdWVzdCkgOiBmYWxzZTtcblxuICAgICAgICB0aGlzLmxvYWRHZW9KU09OKHBhcmFtcywgKGVycjogP0Vycm9yLCBkYXRhOiA/T2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyIHx8ICFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYElucHV0IGRhdGEgZ2l2ZW4gdG8gJyR7cGFyYW1zLnNvdXJjZX0nIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LmApKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV3aW5kKGRhdGEsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvSlNPTkluZGV4ID0gcGFyYW1zLmNsdXN0ZXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1cGVyY2x1c3RlcihnZXRTdXBlcmNsdXN0ZXJPcHRpb25zKHBhcmFtcykpLmxvYWQoZGF0YS5mZWF0dXJlcykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvanNvbnZ0KGRhdGEsIHBhcmFtcy5nZW9qc29uVnRPcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB7fTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChwZXJmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nRGF0YSA9IHBlcmYuZmluaXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgbmVjZXNzYXJ5IHRvIGV2YWwgdGhlIHJlc3VsdCBvZiBnZXRFbnRyaWVzQnlOYW1lKCkgaGVyZSB2aWEgcGFyc2Uvc3RyaW5naWZ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGxhdGUgZXZhbHVhdGlvbiBpbiB0aGUgbWFpbiB0aHJlYWQgY2F1c2VzIFR5cGVFcnJvcjogaWxsZWdhbCBpbnZvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVRpbWluZ0RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZVRpbWluZyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc291cmNlVGltaW5nW3BhcmFtcy5zb3VyY2VdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZVRpbWluZ0RhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGlsZSBwcm9jZXNzaW5nIGBsb2FkRGF0YWAsIHdlIGNvYWxlc2NlIGFsbCBmdXJ0aGVyXG4gICAgICogYGxvYWREYXRhYCBtZXNzYWdlcyBpbnRvIGEgc2luZ2xlIGNhbGwgdG8gX2xvYWREYXRhXG4gICAgICogdGhhdCB3aWxsIGhhcHBlbiBvbmNlIHdlJ3ZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlXG4gICAgICogZmlyc3QgbWVzc2FnZS4ge0BsaW5rIEdlb0pTT05Tb3VyY2UjX3VwZGF0ZVdvcmtlckRhdGF9XG4gICAgICogaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgdXMgdGhlIGBjb2FsZXNjZWAgbWVzc2FnZVxuICAgICAqIGF0IHRoZSB0aW1lIGl0IHJlY2VpdmVzIGEgcmVzcG9uc2UgZnJvbSBgbG9hZERhdGFgXG4gICAgICpcbiAgICAgKiAgICAgICAgICBTdGF0ZTogSWRsZVxuICAgICAqICAgICAgICAgIMOiwobCkSAgICAgICAgICB8XG4gICAgICogICAgICdjb2FsZXNjZScgICAnbG9hZERhdGEnXG4gICAgICogICAgICAgICAgfCAgICAgKHRyaWdnZXJzIGxvYWQpXG4gICAgICogICAgICAgICAgfCAgICAgICAgICDDosKGwpNcbiAgICAgKiAgICAgICAgU3RhdGU6IENvYWxlc2NpbmdcbiAgICAgKiAgICAgICAgICDDosKGwpEgICAgICAgICAgfFxuICAgICAqICAgKHRyaWdnZXJzIGxvYWQpICAgfFxuICAgICAqICAgICAnY29hbGVzY2UnICAgJ2xvYWREYXRhJ1xuICAgICAqICAgICAgICAgIHwgICAgICAgICAgw6LChsKTXG4gICAgICogICAgICAgIFN0YXRlOiBOZWVkc0xvYWREYXRhXG4gICAgICovXG4gICAgY29hbGVzY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ0NvYWxlc2NpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdJZGxlJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ05lZWRzTG9hZERhdGEnKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdDb2FsZXNjaW5nJztcbiAgICAgICAgICAgIHRoaXMuX2xvYWREYXRhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNyZWxvYWRUaWxlfS5cbiAgICAqXG4gICAgKiBJZiB0aGUgdGlsZSBpcyBsb2FkZWQsIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UuXG4gICAgKiBPdGhlcndpc2UsIHN1Y2ggYXMgYWZ0ZXIgYSBzZXREYXRhKCkgY2FsbCwgd2UgbG9hZCB0aGUgdGlsZSBmcmVzaC5cbiAgICAqXG4gICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgKiBAcGFyYW0gcGFyYW1zLnVpZCBUaGUgVUlEIGZvciB0aGlzIHRpbGUuXG4gICAgKi9cbiAgICByZWxvYWRUaWxlKHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuXG4gICAgICAgIGlmIChsb2FkZWQgJiYgbG9hZGVkW3VpZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5yZWxvYWRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhbmQgcGFyc2UgR2VvSlNPTiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBhcmFtcy4gIENhbGxzIGBjYWxsYmFja2BcbiAgICAgKiB3aXRoIGAoZXJyLCBkYXRhKWAsIHdoZXJlIGBkYXRhYCBpcyBhIHBhcnNlZCBHZW9KU09OIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEdlb0pTT04gaXMgbG9hZGVkIGFuZCBwYXJzZWQgZnJvbSBgcGFyYW1zLnVybGAgaWYgaXQgZXhpc3RzLCBvciBlbHNlXG4gICAgICogZXhwZWN0ZWQgYXMgYSBsaXRlcmFsIChzdHJpbmcgb3Igb2JqZWN0KSBgcGFyYW1zLmRhdGFgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBbcGFyYW1zLnVybF0gQSBVUkwgdG8gdGhlIHJlbW90ZSBHZW9KU09OIGRhdGEuXG4gICAgICogQHBhcmFtIFtwYXJhbXMuZGF0YV0gTGl0ZXJhbCBHZW9KU09OIGRhdGEuIE11c3QgYmUgcHJvdmlkZWQgaWYgYHBhcmFtcy51cmxgIGlzIG5vdC5cbiAgICAgKi9cbiAgICBsb2FkR2VvSlNPTihwYXJhbXM6IExvYWRHZW9KU09OUGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8T2JqZWN0Pikge1xuICAgICAgICAvLyBCZWNhdXNlIG9mIHNhbWUgb3JpZ2luIGlzc3VlcywgdXJscyBtdXN0IGVpdGhlciBpbmNsdWRlIGFuIGV4cGxpY2l0XG4gICAgICAgIC8vIG9yaWdpbiBvciBhYnNvbHV0ZSBwYXRoLlxuICAgICAgICAvLyBpZTogL2Zvby9iYXIuanNvbiBvciBodHRwOi8vZXhhbXBsZS5jb20vYmFyLmpzb25cbiAgICAgICAgLy8gYnV0IG5vdCAuLi9mb28vYmFyLmpzb25cbiAgICAgICAgaWYgKHBhcmFtcy5yZXF1ZXN0KSB7XG4gICAgICAgICAgICBnZXRKU09OKHBhcmFtcy5yZXF1ZXN0LCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgSlNPTi5wYXJzZShwYXJhbXMuZGF0YSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYElucHV0IGRhdGEgZ2l2ZW4gdG8gJyR7cGFyYW1zLnNvdXJjZX0nIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LmApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYElucHV0IGRhdGEgZ2l2ZW4gdG8gJyR7cGFyYW1zLnNvdXJjZX0nIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LmApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZVNvdXJjZShwYXJhbXM6IHtzb3VyY2U6IHN0cmluZ30sIGNhbGxiYWNrOiBDYWxsYmFjazxtaXhlZD4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdDYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gRG9uJ3QgbGVhayBjYWxsYmFja3NcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFjayhudWxsLCB7IGFiYW5kb25lZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGdldENsdXN0ZXJFeHBhbnNpb25ab29tKHBhcmFtczoge2NsdXN0ZXJJZDogbnVtYmVyfSwgY2FsbGJhY2s6IENhbGxiYWNrPG51bWJlcj4pIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhpcy5fZ2VvSlNPTkluZGV4LmdldENsdXN0ZXJFeHBhbnNpb25ab29tKHBhcmFtcy5jbHVzdGVySWQpKTtcbiAgICB9XG5cbiAgICBnZXRDbHVzdGVyQ2hpbGRyZW4ocGFyYW1zOiB7Y2x1c3RlcklkOiBudW1iZXJ9LCBjYWxsYmFjazogQ2FsbGJhY2s8QXJyYXk8R2VvSlNPTkZlYXR1cmU+Pikge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzLl9nZW9KU09OSW5kZXguZ2V0Q2hpbGRyZW4ocGFyYW1zLmNsdXN0ZXJJZCkpO1xuICAgIH1cblxuICAgIGdldENsdXN0ZXJMZWF2ZXMocGFyYW1zOiB7Y2x1c3RlcklkOiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyfSwgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PEdlb0pTT05GZWF0dXJlPj4pIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhpcy5fZ2VvSlNPTkluZGV4LmdldExlYXZlcyhwYXJhbXMuY2x1c3RlcklkLCBwYXJhbXMubGltaXQsIHBhcmFtcy5vZmZzZXQpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFN1cGVyY2x1c3Rlck9wdGlvbnMoe3N1cGVyY2x1c3Rlck9wdGlvbnMsIGNsdXN0ZXJQcm9wZXJ0aWVzfSkge1xuICAgIGlmICghY2x1c3RlclByb3BlcnRpZXMgfHwgIXN1cGVyY2x1c3Rlck9wdGlvbnMpIHJldHVybiBzdXBlcmNsdXN0ZXJPcHRpb25zO1xuXG4gICAgY29uc3QgbWFwRXhwcmVzc2lvbnMgPSB7fTtcbiAgICBjb25zdCByZWR1Y2VFeHByZXNzaW9ucyA9IHt9O1xuICAgIGNvbnN0IGdsb2JhbHMgPSB7YWNjdW11bGF0ZWQ6IG51bGwsIHpvb206IDB9O1xuICAgIGNvbnN0IGZlYXR1cmUgPSB7cHJvcGVydGllczogbnVsbH07XG4gICAgY29uc3QgcHJvcGVydHlOYW1lcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJQcm9wZXJ0aWVzKTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIHByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgY29uc3QgW29wZXJhdG9yLCBtYXBFeHByZXNzaW9uXSA9IGNsdXN0ZXJQcm9wZXJ0aWVzW2tleV07XG5cbiAgICAgICAgY29uc3QgbWFwRXhwcmVzc2lvblBhcnNlZCA9IGNyZWF0ZUV4cHJlc3Npb24obWFwRXhwcmVzc2lvbik7XG4gICAgICAgIGNvbnN0IHJlZHVjZUV4cHJlc3Npb25QYXJzZWQgPSBjcmVhdGVFeHByZXNzaW9uKFxuICAgICAgICAgICAgdHlwZW9mIG9wZXJhdG9yID09PSAnc3RyaW5nJyA/IFtvcGVyYXRvciwgWydhY2N1bXVsYXRlZCddLCBbJ2dldCcsIGtleV1dIDogb3BlcmF0b3IpO1xuXG4gICAgICAgIGFzc2VydChtYXBFeHByZXNzaW9uUGFyc2VkLnJlc3VsdCA9PT0gJ3N1Y2Nlc3MnKTtcbiAgICAgICAgYXNzZXJ0KHJlZHVjZUV4cHJlc3Npb25QYXJzZWQucmVzdWx0ID09PSAnc3VjY2VzcycpO1xuXG4gICAgICAgIG1hcEV4cHJlc3Npb25zW2tleV0gPSBtYXBFeHByZXNzaW9uUGFyc2VkLnZhbHVlO1xuICAgICAgICByZWR1Y2VFeHByZXNzaW9uc1trZXldID0gcmVkdWNlRXhwcmVzc2lvblBhcnNlZC52YWx1ZTtcbiAgICB9XG5cbiAgICBzdXBlcmNsdXN0ZXJPcHRpb25zLm1hcCA9IChwb2ludFByb3BlcnRpZXMpID0+IHtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzID0gcG9pbnRQcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXNba2V5XSA9IG1hcEV4cHJlc3Npb25zW2tleV0uZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgfTtcbiAgICBzdXBlcmNsdXN0ZXJPcHRpb25zLnJlZHVjZSA9IChhY2N1bXVsYXRlZCwgY2x1c3RlclByb3BlcnRpZXMpID0+IHtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzID0gY2x1c3RlclByb3BlcnRpZXM7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgICAgIGdsb2JhbHMuYWNjdW11bGF0ZWQgPSBhY2N1bXVsYXRlZFtrZXldO1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRba2V5XSA9IHJlZHVjZUV4cHJlc3Npb25zW2tleV0uZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHN1cGVyY2x1c3Rlck9wdGlvbnM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb0pTT05Xb3JrZXJTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvcic7XG5cbmltcG9ydCBTdHlsZUxheWVySW5kZXggZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXgnO1xuaW1wb3J0IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UgZnJvbSAnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlJztcbmltcG9ydCBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlIGZyb20gJy4vcmFzdGVyX2RlbV90aWxlX3dvcmtlcl9zb3VyY2UnO1xuaW1wb3J0IEdlb0pTT05Xb3JrZXJTb3VyY2UgZnJvbSAnLi9nZW9qc29uX3dvcmtlcl9zb3VyY2UnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcGx1Z2luIGFzIGdsb2JhbFJUTFRleHRQbHVnaW4gfSBmcm9tICcuL3J0bF90ZXh0X3BsdWdpbic7XG5pbXBvcnQgeyBlbmZvcmNlQ2FjaGVTaXplTGltaXQgfSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZSc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBXb3JrZXJTb3VyY2UsXG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxuICAgIFdvcmtlckRFTVRpbGVDYWxsYmFjayxcbiAgICBUaWxlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9zb3VyY2Uvd29ya2VyX3NvdXJjZSc7XG5cbmltcG9ydCB0eXBlIHtXb3JrZXJHbG9iYWxTY29wZUludGVyZmFjZX0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29ya2VyIHtcbiAgICBzZWxmOiBXb3JrZXJHbG9iYWxTY29wZUludGVyZmFjZTtcbiAgICBhY3RvcjogQWN0b3I7XG4gICAgbGF5ZXJJbmRleGVzOiB7IFtzdHJpbmddOiBTdHlsZUxheWVySW5kZXggfTtcbiAgICB3b3JrZXJTb3VyY2VUeXBlczogeyBbc3RyaW5nXTogQ2xhc3M8V29ya2VyU291cmNlPiB9O1xuICAgIHdvcmtlclNvdXJjZXM6IHsgW3N0cmluZ106IHsgW3N0cmluZ106IHsgW3N0cmluZ106IFdvcmtlclNvdXJjZSB9IH0gfTtcbiAgICBkZW1Xb3JrZXJTb3VyY2VzOiB7IFtzdHJpbmddOiB7IFtzdHJpbmddOiBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlIH0gfTtcbiAgICByZWZlcnJlcjogP3N0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHNlbGY6IFdvcmtlckdsb2JhbFNjb3BlSW50ZXJmYWNlKSB7XG4gICAgICAgIHRoaXMuc2VsZiA9IHNlbGY7XG4gICAgICAgIHRoaXMuYWN0b3IgPSBuZXcgQWN0b3Ioc2VsZiwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5sYXllckluZGV4ZXMgPSB7fTtcblxuICAgICAgICB0aGlzLndvcmtlclNvdXJjZVR5cGVzID0ge1xuICAgICAgICAgICAgdmVjdG9yOiBWZWN0b3JUaWxlV29ya2VyU291cmNlLFxuICAgICAgICAgICAgZ2VvanNvbjogR2VvSlNPTldvcmtlclNvdXJjZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFttYXBJZF1bc291cmNlVHlwZV1bc291cmNlTmFtZV0gPT4gd29ya2VyIHNvdXJjZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLndvcmtlclNvdXJjZXMgPSB7fTtcbiAgICAgICAgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzID0ge307XG5cbiAgICAgICAgdGhpcy5zZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlID0gKG5hbWU6IHN0cmluZywgV29ya2VyU291cmNlOiBDbGFzczxXb3JrZXJTb3VyY2U+KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy53b3JrZXJTb3VyY2VUeXBlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV29ya2VyIHNvdXJjZSB3aXRoIG5hbWUgXCIke25hbWV9XCIgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VUeXBlc1tuYW1lXSA9IFdvcmtlclNvdXJjZTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNlbGYucmVnaXN0ZXJSVExUZXh0UGx1Z2luID0gKHJ0bFRleHRQbHVnaW46IHthcHBseUFyYWJpY1NoYXBpbmc6IEZ1bmN0aW9uLCBwcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQ6IEZ1bmN0aW9uLCBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ/OiBGdW5jdGlvbn0pID0+IHtcbiAgICAgICAgICAgIGlmIChnbG9iYWxSVExUZXh0UGx1Z2luLmlzTG9hZGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JUTCB0ZXh0IHBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnbG9iYWxSVExUZXh0UGx1Z2luWydhcHBseUFyYWJpY1NoYXBpbmcnXSA9IHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nO1xuICAgICAgICAgICAgZ2xvYmFsUlRMVGV4dFBsdWdpblsncHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0J10gPSBydGxUZXh0UGx1Z2luLnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dDtcbiAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW5bJ3Byb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dCddID0gcnRsVGV4dFBsdWdpbi5wcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0UmVmZXJyZXIobWFwSUQ6IHN0cmluZywgcmVmZXJyZXI6IHN0cmluZykge1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gcmVmZXJyZXI7XG4gICAgfVxuXG4gICAgc2V0TGF5ZXJzKG1hcElkOiBzdHJpbmcsIGxheWVyczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPiwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdldExheWVySW5kZXgobWFwSWQpLnJlcGxhY2UobGF5ZXJzKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICB1cGRhdGVMYXllcnMobWFwSWQ6IHN0cmluZywgcGFyYW1zOiB7bGF5ZXJzOiBBcnJheTxMYXllclNwZWNpZmljYXRpb24+LCByZW1vdmVkSWRzOiBBcnJheTxzdHJpbmc+fSwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdldExheWVySW5kZXgobWFwSWQpLnVwZGF0ZShwYXJhbXMubGF5ZXJzLCBwYXJhbXMucmVtb3ZlZElkcyk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgbG9hZFRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycyAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSwgcGFyYW1zLnNvdXJjZSkubG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgbG9hZERFTVRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBXb3JrZXJERU1UaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlckRFTVRpbGVDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdldERFTVdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnNvdXJjZSkubG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmVsb2FkVGlsZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlLCBwYXJhbXMuc291cmNlKS5yZWxvYWRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGFib3J0VGlsZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFRpbGVQYXJhbWV0ZXJzICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlLCBwYXJhbXMuc291cmNlKS5hYm9ydFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVGlsZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFRpbGVQYXJhbWV0ZXJzICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlLCBwYXJhbXMuc291cmNlKS5yZW1vdmVUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJlbW92ZURFTVRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBUaWxlUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmdldERFTVdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnNvdXJjZSkucmVtb3ZlVGlsZShwYXJhbXMpO1xuICAgIH1cblxuICAgIHJlbW92ZVNvdXJjZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IHtzb3VyY2U6IHN0cmluZ30gJiB7dHlwZTogc3RyaW5nfSwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICBhc3NlcnQocGFyYW1zLnNvdXJjZSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdIHx8XG4gICAgICAgICAgICAhdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVtwYXJhbXMudHlwZV0gfHxcbiAgICAgICAgICAgICF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3BhcmFtcy50eXBlXVtwYXJhbXMuc291cmNlXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVtwYXJhbXMudHlwZV1bcGFyYW1zLnNvdXJjZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3BhcmFtcy50eXBlXVtwYXJhbXMuc291cmNlXTtcblxuICAgICAgICBpZiAod29ya2VyLnJlbW92ZVNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3b3JrZXIucmVtb3ZlU291cmNlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSB7QGxpbmsgV29ya2VyU291cmNlfSBzY3JpcHQgYXQgcGFyYW1zLnVybC4gIFRoZSBzY3JpcHQgaXMgcnVuXG4gICAgICogKHVzaW5nIGltcG9ydFNjcmlwdHMpIHdpdGggYHJlZ2lzdGVyV29ya2VyU291cmNlYCBpbiBzY29wZSwgd2hpY2ggaXMgYVxuICAgICAqIGZ1bmN0aW9uIHRha2luZyBgKG5hbWUsIHdvcmtlclNvdXJjZU9iamVjdClgLlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGxvYWRXb3JrZXJTb3VyY2UobWFwOiBzdHJpbmcsIHBhcmFtczogeyB1cmw6IHN0cmluZyB9LCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZi5pbXBvcnRTY3JpcHRzKHBhcmFtcy51cmwpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRSVExUZXh0UGx1Z2luKG1hcDogc3RyaW5nLCBwbHVnaW5VUkw6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWdsb2JhbFJUTFRleHRQbHVnaW4uaXNMb2FkZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZi5pbXBvcnRTY3JpcHRzKHBsdWdpblVSTCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZ2xvYmFsUlRMVGV4dFBsdWdpbi5pc0xvYWRlZCgpID9cbiAgICAgICAgICAgICAgICAgICAgbnVsbCA6XG4gICAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihgUlRMIFRleHQgUGx1Z2luIGZhaWxlZCB0byBpbXBvcnQgc2NyaXB0cyBmcm9tICR7cGx1Z2luVVJMfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExheWVySW5kZXgobWFwSWQ6IHN0cmluZykge1xuICAgICAgICBsZXQgbGF5ZXJJbmRleGVzID0gdGhpcy5sYXllckluZGV4ZXNbbWFwSWRdO1xuICAgICAgICBpZiAoIWxheWVySW5kZXhlcykge1xuICAgICAgICAgICAgbGF5ZXJJbmRleGVzID0gdGhpcy5sYXllckluZGV4ZXNbbWFwSWRdID0gbmV3IFN0eWxlTGF5ZXJJbmRleCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllckluZGV4ZXM7XG4gICAgfVxuXG4gICAgZ2V0V29ya2VyU291cmNlKG1hcElkOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdKVxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSA9IHt9O1xuICAgICAgICBpZiAoIXRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV0pXG4gICAgICAgICAgICB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdID0ge307XG5cbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdW3NvdXJjZV0pIHtcbiAgICAgICAgICAgIC8vIHVzZSBhIHdyYXBwZWQgYWN0b3Igc28gdGhhdCB3ZSBjYW4gYXR0YWNoIGEgdGFyZ2V0IG1hcElkIHBhcmFtXG4gICAgICAgICAgICAvLyB0byBhbnkgbWVzc2FnZXMgaW52b2tlZCBieSB0aGUgV29ya2VyU291cmNlXG4gICAgICAgICAgICBjb25zdCBhY3RvciA9IHtcbiAgICAgICAgICAgICAgICBzZW5kOiAodHlwZSwgZGF0YSwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rvci5zZW5kKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCBtYXBJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXVtzb3VyY2VdID0gbmV3ICh0aGlzLndvcmtlclNvdXJjZVR5cGVzW3R5cGVdOiBhbnkpKChhY3RvcjogYW55KSwgdGhpcy5nZXRMYXllckluZGV4KG1hcElkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXVtzb3VyY2VdO1xuICAgIH1cblxuICAgIGdldERFTVdvcmtlclNvdXJjZShtYXBJZDogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuZGVtV29ya2VyU291cmNlc1ttYXBJZF0pXG4gICAgICAgICAgICB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdID0ge307XG5cbiAgICAgICAgaWYgKCF0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdW3NvdXJjZV0pIHtcbiAgICAgICAgICAgIHRoaXMuZGVtV29ya2VyU291cmNlc1ttYXBJZF1bc291cmNlXSA9IG5ldyBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW21hcElkXVtzb3VyY2VdO1xuICAgIH1cblxuICAgIGVuZm9yY2VDYWNoZVNpemVMaW1pdChtYXBJZDogc3RyaW5nLCBsaW1pdDogbnVtYmVyKSB7XG4gICAgICAgIGVuZm9yY2VDYWNoZVNpemVMaW1pdChsaW1pdCk7XG4gICAgfVxufVxuXG4vKiBnbG9iYWwgc2VsZiwgV29ya2VyR2xvYmFsU2NvcGUgKi9cbmlmICh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmXG4gICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlKSB7XG4gICAgc2VsZi53b3JrZXIgPSBuZXcgV29ya2VyKHNlbGYpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGlzU3VwcG9ydGVkO1xufSBlbHNlIGlmICh3aW5kb3cpIHtcbiAgICB3aW5kb3cubWFwYm94Z2wgPSB3aW5kb3cubWFwYm94Z2wgfHwge307XG4gICAgd2luZG93Lm1hcGJveGdsLnN1cHBvcnRlZCA9IGlzU3VwcG9ydGVkO1xufVxuXG4vKipcbiAqIFRlc3Qgd2hldGhlciB0aGUgY3VycmVudCBicm93c2VyIHN1cHBvcnRzIE1hcGJveCBHTCBKU1xuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gUmV0dXJuIGBmYWxzZWBcbiAqICAgaWYgdGhlIHBlcmZvcm1hbmNlIG9mIE1hcGJveCBHTCBKUyB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgd29yc2UgdGhhblxuICogICBleHBlY3RlZCAoaS5lLiBhIHNvZnR3YXJlIHJlbmRlcmVyIGlzIHdvdWxkIGJlIHVzZWQpXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1N1cHBvcnRlZChvcHRpb25zKSB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgICBpc0Jyb3dzZXIoKSAmJlxuICAgICAgICBpc0FycmF5U3VwcG9ydGVkKCkgJiZcbiAgICAgICAgaXNGdW5jdGlvblN1cHBvcnRlZCgpICYmXG4gICAgICAgIGlzT2JqZWN0U3VwcG9ydGVkKCkgJiZcbiAgICAgICAgaXNKU09OU3VwcG9ydGVkKCkgJiZcbiAgICAgICAgaXNXb3JrZXJTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc1VpbnQ4Q2xhbXBlZEFycmF5U3VwcG9ydGVkKCkgJiZcbiAgICAgICAgaXNBcnJheUJ1ZmZlclN1cHBvcnRlZCgpICYmXG4gICAgICAgIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZWQob3B0aW9ucyAmJiBvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5U3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIEFycmF5LnByb3RvdHlwZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLm1hcCAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuc29tZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCAmJlxuICAgICAgICBBcnJheS5pc0FycmF5XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvblN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdFN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBPYmplY3Qua2V5cyAmJlxuICAgICAgICBPYmplY3QuY3JlYXRlICYmXG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJlxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyAmJlxuICAgICAgICBPYmplY3QuaXNTZWFsZWQgJiZcbiAgICAgICAgT2JqZWN0LmlzRnJvemVuICYmXG4gICAgICAgIE9iamVjdC5pc0V4dGVuc2libGUgJiZcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiZcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnNlYWwgJiZcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJlxuICAgICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnNcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0pTT05TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdKU09OJyBpbiB3aW5kb3cgJiYgJ3BhcnNlJyBpbiBKU09OICYmICdzdHJpbmdpZnknIGluIEpTT047XG59XG5cbmZ1bmN0aW9uIGlzV29ya2VyU3VwcG9ydGVkKCkge1xuICAgIGlmICghKCdXb3JrZXInIGluIHdpbmRvdyAmJiAnQmxvYicgaW4gd2luZG93ICYmICdVUkwnIGluIHdpbmRvdykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoWycnXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICB2YXIgd29ya2VyVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgc3VwcG9ydGVkO1xuICAgIHZhciB3b3JrZXI7XG5cbiAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVSTCk7XG4gICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAod29ya2VyKSB7XG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB9XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJVUkwpO1xuXG4gICAgcmV0dXJuIHN1cHBvcnRlZDtcbn1cblxuLy8gSUUxMSBvbmx5IHN1cHBvcnRzIGBVaW50OENsYW1wZWRBcnJheWAgYXMgb2YgdmVyc2lvblxuLy8gW0tCMjkyOTQzN10oaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjkyOTQzNylcbmZ1bmN0aW9uIGlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdVaW50OENsYW1wZWRBcnJheScgaW4gd2luZG93O1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQvaXNzdWVzLzE5XG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG59XG5cbnZhciBpc1dlYkdMU3VwcG9ydGVkQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuXG4gICAgaWYgKGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XSA9IGlzV2ViR0xTdXBwb3J0ZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XTtcbn1cblxuaXNTdXBwb3J0ZWQud2ViR0xDb250ZXh0QXR0cmlidXRlcyA9IHtcbiAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgIGFscGhhOiB0cnVlLFxuICAgIHN0ZW5jaWw6IHRydWUsXG4gICAgZGVwdGg6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzV2ViR0xTdXBwb3J0ZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuXG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBPYmplY3QuY3JlYXRlKGlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO1xuICAgIGF0dHJpYnV0ZXMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ7XG5cbiAgICBpZiAoY2FudmFzLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIGNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcylcbiAgICAgICAgKTtcblxuICAgIH0gZWxzZSBpZiAoY2FudmFzLnN1cHBvcnRzQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY2FudmFzLnN1cHBvcnRzQ29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgY2FudmFzLnN1cHBvcnRzQ29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcylcbiAgICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmNvbnN0IERPTSA9IHt9O1xuZXhwb3J0IGRlZmF1bHQgRE9NO1xuXG5ET00uY3JlYXRlID0gZnVuY3Rpb24gKHRhZ05hbWU6IHN0cmluZywgY2xhc3NOYW1lOiA/c3RyaW5nLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGVsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgaWYgKGNsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSBlbC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgaWYgKGNvbnRhaW5lcikgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsKTtcbiAgICByZXR1cm4gZWw7XG59O1xuXG5ET00uY3JlYXRlTlMgPSBmdW5jdGlvbiAobmFtZXNwYWNlVVJJOiBzdHJpbmcsIHRhZ05hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGVsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHRhZ05hbWUpO1xuICAgIHJldHVybiBlbDtcbn07XG5cbmNvbnN0IGRvY1N0eWxlID0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcblxuZnVuY3Rpb24gdGVzdFByb3AocHJvcHMpIHtcbiAgICBpZiAoIWRvY1N0eWxlKSByZXR1cm4gcHJvcHNbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocHJvcHNbaV0gaW4gZG9jU3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHNbMF07XG59XG5cbmNvbnN0IHNlbGVjdFByb3AgPSB0ZXN0UHJvcChbJ3VzZXJTZWxlY3QnLCAnTW96VXNlclNlbGVjdCcsICdXZWJraXRVc2VyU2VsZWN0JywgJ21zVXNlclNlbGVjdCddKTtcbmxldCB1c2VyU2VsZWN0O1xuXG5ET00uZGlzYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY1N0eWxlICYmIHNlbGVjdFByb3ApIHtcbiAgICAgICAgdXNlclNlbGVjdCA9IGRvY1N0eWxlW3NlbGVjdFByb3BdO1xuICAgICAgICBkb2NTdHlsZVtzZWxlY3RQcm9wXSA9ICdub25lJztcbiAgICB9XG59O1xuXG5ET00uZW5hYmxlRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jU3R5bGUgJiYgc2VsZWN0UHJvcCkge1xuICAgICAgICBkb2NTdHlsZVtzZWxlY3RQcm9wXSA9IHVzZXJTZWxlY3Q7XG4gICAgfVxufTtcblxuY29uc3QgdHJhbnNmb3JtUHJvcCA9IHRlc3RQcm9wKFsndHJhbnNmb3JtJywgJ1dlYmtpdFRyYW5zZm9ybSddKTtcblxuRE9NLnNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uKGVsOiBIVE1MRWxlbWVudCwgdmFsdWU6IHN0cmluZykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy83NzU0XG4gICAgLy8gJEZsb3dGaXhNZVxuICAgIGVsLnN0eWxlW3RyYW5zZm9ybVByb3BdID0gdmFsdWU7XG59O1xuXG4vLyBGZWF0dXJlIGRldGVjdGlvbiBmb3Ige3Bhc3NpdmU6IGZhbHNlfSBzdXBwb3J0IGluIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyLlxubGV0IHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcblxudHJ5IHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjg1XG4gICAgLy8gJEZsb3dGaXhNZVxuICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIFwicGFzc2l2ZVwiLCB7XG4gICAgICAgIGdldCgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIiwgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsIG9wdGlvbnMsIG9wdGlvbnMpO1xufSBjYXRjaCAoZXJyKSB7XG4gICAgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xufVxuXG5ET00uYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKHRhcmdldDogKiwgdHlwZTogKiwgY2FsbGJhY2s6ICosIG9wdGlvbnM6IHtwYXNzaXZlPzogYm9vbGVhbiwgY2FwdHVyZT86IGJvb2xlYW59ID0ge30pIHtcbiAgICBpZiAoJ3Bhc3NpdmUnIGluIG9wdGlvbnMgJiYgcGFzc2l2ZVN1cHBvcnRlZCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMuY2FwdHVyZSk7XG4gICAgfVxufTtcblxuRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbih0YXJnZXQ6ICosIHR5cGU6ICosIGNhbGxiYWNrOiAqLCBvcHRpb25zOiB7cGFzc2l2ZT86IGJvb2xlYW4sIGNhcHR1cmU/OiBib29sZWFufSA9IHt9KSB7XG4gICAgaWYgKCdwYXNzaXZlJyBpbiBvcHRpb25zICYmIHBhc3NpdmVTdXBwb3J0ZWQpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrLCBvcHRpb25zLmNhcHR1cmUpO1xuICAgIH1cbn07XG5cbi8vIFN1cHByZXNzIHRoZSBuZXh0IGNsaWNrLCBidXQgb25seSBpZiBpdCdzIGltbWVkaWF0ZS5cbmNvbnN0IHN1cHByZXNzQ2xpY2s6IE1vdXNlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG59O1xuXG5ET00uc3VwcHJlc3NDbGljayA9IGZ1bmN0aW9uKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG4gICAgfSwgMCk7XG59O1xuXG5ET00ubW91c2VQb3MgPSBmdW5jdGlvbiAoZWw6IEhUTUxFbGVtZW50LCBlOiBNb3VzZUV2ZW50IHwgd2luZG93LlRvdWNoRXZlbnQgfCBUb3VjaCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0ID0gd2luZG93LlRvdWNoRXZlbnQgJiYgKGUgaW5zdGFuY2VvZiB3aW5kb3cuVG91Y2hFdmVudCkgPyBlLnRvdWNoZXNbMF0gOiBlO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIHQuY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgICAgIHQuY2xpZW50WSAtIHJlY3QudG9wIC0gZWwuY2xpZW50VG9wXG4gICAgKTtcbn07XG5cbkRPTS50b3VjaFBvcyA9IGZ1bmN0aW9uIChlbDogSFRNTEVsZW1lbnQsIGU6IFRvdWNoRXZlbnQpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHBvaW50cyA9IFtdO1xuICAgIGNvbnN0IHRvdWNoZXMgPSAoZS50eXBlID09PSAndG91Y2hlbmQnKSA/IGUuY2hhbmdlZFRvdWNoZXMgOiBlLnRvdWNoZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKG5ldyBQb2ludChcbiAgICAgICAgICAgIHRvdWNoZXNbaV0uY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgICAgICAgICB0b3VjaGVzW2ldLmNsaWVudFkgLSByZWN0LnRvcCAtIGVsLmNsaWVudFRvcFxuICAgICAgICApKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbn07XG5cbkRPTS5tb3VzZUJ1dHRvbiA9IGZ1bmN0aW9uIChlOiBNb3VzZUV2ZW50KSB7XG4gICAgYXNzZXJ0KGUudHlwZSA9PT0gJ21vdXNlZG93bicgfHwgZS50eXBlID09PSAnbW91c2V1cCcpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93Lkluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVkJyAmJiBlLmJ1dHRvbiA9PT0gMiAmJiBlLmN0cmxLZXkgJiZcbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoJ01BQycpID49IDApIHtcbiAgICAgICAgLy8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzEzMTpcbiAgICAgICAgLy8gRmlyZWZveCAoZGV0ZWN0ZWQgYnkgSW5zdGFsbFRyaWdnZXIpIG9uIE1hYyBkZXRlcm1pbmVzIGUuYnV0dG9uID0gMiB3aGVuXG4gICAgICAgIC8vIHVzaW5nIENvbnRyb2wgKyBsZWZ0IGNsaWNrXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gZS5idXR0b247XG59O1xuXG5ET00ucmVtb3ZlID0gZnVuY3Rpb24obm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgZ2V0SlNPTiwgZ2V0SW1hZ2UsIFJlc291cmNlVHlwZSB9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgeyBSR0JBSW1hZ2UgfSBmcm9tICcuLi91dGlsL2ltYWdlJztcblxuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4vc3R5bGVfaW1hZ2UnO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RNYW5hZ2VyfSBmcm9tICcuLi91dGlsL21hcGJveCc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYmFzZVVSTDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFjazx7W3N0cmluZ106IFN0eWxlSW1hZ2V9Pik6IENhbmNlbGFibGUge1xuICAgIGxldCBqc29uOiBhbnksIGltYWdlLCBlcnJvcjtcbiAgICBjb25zdCBmb3JtYXQgPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW8gPiAxID8gJ0AyeCcgOiAnJztcblxuICAgIGxldCBqc29uUmVxdWVzdCA9IGdldEpTT04ocmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChyZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTcHJpdGVVUkwoYmFzZVVSTCwgZm9ybWF0LCAnLmpzb24nKSwgUmVzb3VyY2VUeXBlLlNwcml0ZUpTT04pLCAoZXJyOiA/RXJyb3IsIGRhdGE6ID9PYmplY3QpID0+IHtcbiAgICAgICAganNvblJlcXVlc3QgPSBudWxsO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIGpzb24gPSBkYXRhO1xuICAgICAgICAgICAgbWF5YmVDb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgaW1hZ2VSZXF1ZXN0ID0gZ2V0SW1hZ2UocmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChyZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTcHJpdGVVUkwoYmFzZVVSTCwgZm9ybWF0LCAnLnBuZycpLCBSZXNvdXJjZVR5cGUuU3ByaXRlSW1hZ2UpLCAoZXJyLCBpbWcpID0+IHtcbiAgICAgICAgaW1hZ2VSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICBpbWFnZSA9IGltZztcbiAgICAgICAgICAgIG1heWJlQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbWF5YmVDb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAoanNvbiAmJiBpbWFnZSkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1hZ2UpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4ganNvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCB4LCB5LCBzZGYsIHBpeGVsUmF0aW99ID0ganNvbltpZF07XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoLCBoZWlnaHR9KTtcbiAgICAgICAgICAgICAgICBSR0JBSW1hZ2UuY29weShpbWFnZURhdGEsIGRhdGEsIHt4LCB5fSwge3g6IDAsIHk6IDB9LCB7d2lkdGgsIGhlaWdodH0pO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtpZF0gPSB7ZGF0YSwgcGl4ZWxSYXRpbywgc2RmfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIGlmIChqc29uUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGpzb25SZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIGpzb25SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbWFnZVJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgaW1hZ2VSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuXG5leHBvcnQgdHlwZSBTdHlsZUltYWdlID0ge1xuICAgIGRhdGE6IFJHQkFJbWFnZSxcbiAgICBwaXhlbFJhdGlvOiBudW1iZXIsXG4gICAgc2RmOiBib29sZWFuLFxuICAgIHZlcnNpb246IG51bWJlcixcbiAgICBoYXNSZW5kZXJDYWxsYmFjaz86IGJvb2xlYW4sXG4gICAgdXNlckltYWdlPzogU3R5bGVJbWFnZUludGVyZmFjZVxufTtcblxuZXhwb3J0IHR5cGUgU3R5bGVJbWFnZUludGVyZmFjZSA9IHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGRhdGE6IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSxcbiAgICByZW5kZXI/OiAoKSA9PiB2b2lkLFxuICAgIG9uQWRkPzogKG1hcDogTWFwLCBpZDogc3RyaW5nKSA9PiB2b2lkLFxuICAgIG9uUmVtb3ZlPzogKCkgPT4gdm9pZFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclN0eWxlSW1hZ2UoaW1hZ2U6IFN0eWxlSW1hZ2UpIHtcbiAgICBjb25zdCB7dXNlckltYWdlfSA9IGltYWdlO1xuICAgIGlmICh1c2VySW1hZ2UgJiYgdXNlckltYWdlLnJlbmRlcikge1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gdXNlckltYWdlLnJlbmRlcigpO1xuICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgaW1hZ2UuZGF0YS5yZXBsYWNlKG5ldyBVaW50OEFycmF5KHVzZXJJbWFnZS5kYXRhLmJ1ZmZlcikpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHN0eWxlIGltYWdlcy4gVGhpcyBpcyBhIHNwZWNpZmljYXRpb24gZm9yXG4gKiBpbXBsZW1lbnRlcnMgdG8gbW9kZWw6IGl0IGlzIG5vdCBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogSW1hZ2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBjYW4gYmUgcmVkcmF3biBmb3IgZXZlcnkgZnJhbWUuIFRoZXkgY2FuIGJlIHVzZWQgdG8gYW5pbWF0ZVxuICogaWNvbnMgYW5kIHBhdHRlcm5zIG9yIG1ha2UgdGhlbSByZXNwb25kIHRvIHVzZXIgaW5wdXQuIFN0eWxlIGltYWdlcyBjYW4gaW1wbGVtZW50IGFcbiAqIHtAbGluayBTdHlsZUltYWdlSW50ZXJmYWNlI3JlbmRlcn0gbWV0aG9kLiBUaGUgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSBmcmFtZSBhbmRcbiAqIGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgaW1hZ2UuXG4gKlxuICogQGludGVyZmFjZSBTdHlsZUltYWdlSW50ZXJmYWNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHRcbiAqIEBwcm9wZXJ0eSB7VWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5fSBkYXRhXG4gKlxuICogQHNlZSBbQWRkIGFuIGFuaW1hdGVkIGljb24gdG8gdGhlIG1hcC5dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS1hbmltYXRlZC8pXG4gKlxuICogQGV4YW1wbGVcbiAqIHZhciBmbGFzaGluZ1NxdWFyZSA9IHtcbiAqICAgICB3aWR0aDogNjQsXG4gKiAgICAgaGVpZ2h0OiA2NCxcbiAqICAgICBkYXRhOiBuZXcgVWludDhBcnJheSg2NCAqIDY0ICogNCksXG4gKlxuICogICAgIG9uQWRkOiBmdW5jdGlvbihtYXApIHtcbiAqICAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gKiAgICAgfSxcbiAqXG4gKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgLy8ga2VlcCByZXBhaW50aW5nIHdoaWxlIHRoZSBpY29uIGlzIG9uIHRoZSBtYXBcbiAqICAgICAgICAgdGhpcy5tYXAudHJpZ2dlclJlcGFpbnQoKTtcbiAqXG4gKiAgICAgICAgIC8vIGFsdGVybmF0ZSBiZXR3ZWVuIGJsYWNrIGFuZCB3aGl0ZSBiYXNlZCBvbiB0aGUgdGltZVxuICogICAgICAgICB2YXIgdmFsdWUgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKSAlIDIgPT09IDAgID8gMjU1IDogMDtcbiAqXG4gKiAgICAgICAgIC8vIGNoZWNrIGlmIGltYWdlIG5lZWRzIHRvIGJlIGNoYW5nZWRcbiAqICAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnByZXZpb3VzVmFsdWUpIHtcbiAqICAgICAgICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IHZhbHVlO1xuICpcbiAqICAgICAgICAgICAgIHZhciBieXRlc1BlclBpeGVsID0gNDtcbiAqICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gKiAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCB0aGlzLmhlaWdodDsgeSsrKSB7XG4gKiAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAoeSAqIHRoaXMud2lkdGggKyB4KSAqIGJ5dGVzUGVyUGl4ZWw7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAwXSA9IHZhbHVlO1xuICogICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZTtcbiAqICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW29mZnNldCArIDJdID0gdmFsdWU7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAzXSA9IDI1NTtcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICB9XG4gKlxuICogICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW1hZ2UgY2hhbmdlZFxuICogICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gKiAgICAgICAgIH1cbiAqICAgICB9XG4gKiAgfVxuICpcbiAqICBtYXAuYWRkSW1hZ2UoJ2ZsYXNoaW5nX3NxdWFyZScsIGZsYXNoaW5nU3F1YXJlKTtcbiAqL1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGJlZm9yZSBldmVyeSBmcmFtZSB3aGVyZSB0aGUgaWNvbiB3aWxsIGJlIHVzZWQuXG4gKiBUaGUgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHVwZGF0ZSB0aGUgaW1hZ2UncyBgZGF0YWAgbWVtYmVyIHdpdGggYSBuZXcgaW1hZ2UuXG4gKlxuICogSWYgdGhlIG1ldGhvZCB1cGRhdGVzIHRoZSBpbWFnZSBpdCBtdXN0IHJldHVybiBgdHJ1ZWAgdG8gY29tbWl0IHRoZSBjaGFuZ2UuXG4gKiBJZiB0aGUgbWV0aG9kIHJldHVybnMgYGZhbHNlYCBvciBub3RoaW5nIHRoZSBpbWFnZSBpcyBhc3N1bWVkIHRvIG5vdCBoYXZlIGNoYW5nZWQuXG4gKlxuICogSWYgdXBkYXRlcyBhcmUgaW5mcmVxdWVudCBpdCBtYXliZSBlYXNpZXIgdG8gdXNlIHtAbGluayBNYXAjdXBkYXRlSW1hZ2V9IHRvIHVwZGF0ZVxuICogdGhlIGltYWdlIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIFN0eWxlSW1hZ2VJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgcmVuZGVyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBtZXRob2QgdXBkYXRlZCB0aGUgaW1hZ2UuIGBmYWxzZWAgaWYgdGhlIGltYWdlIHdhcyBub3QgY2hhbmdlZC5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgbGF5ZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjYWRkSW1hZ2V9LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIFN0eWxlSW1hZ2VJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25BZGRcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcCB0aGlzIGN1c3RvbSBsYXllciB3YXMganVzdCBhZGRlZCB0by5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgaWNvbiBpcyByZW1vdmVkIGZyb20gdGhlIG1hcCB3aXRoIHtAbGluayBNYXAjcmVtb3ZlSW1hZ2V9LlxuICogVGhpcyBnaXZlcyB0aGUgaW1hZ2UgYSBjaGFuY2UgdG8gY2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBldmVudCBsaXN0ZW5lcnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICovXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgcG90cGFjayBmcm9tICdwb3RwYWNrJztcblxuaW1wb3J0IHsgRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHsgUkdCQUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5pbXBvcnQgeyBJbWFnZVBvc2l0aW9uIH0gZnJvbSAnLi9pbWFnZV9hdGxhcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtyZW5kZXJTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZSc7XG5pbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZSc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge0Jpbn0gZnJvbSAncG90cGFjayc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcblxudHlwZSBQYXR0ZXJuID0ge1xuICAgIGJpbjogQmluLFxuICAgIHBvc2l0aW9uOiBJbWFnZVBvc2l0aW9uXG59O1xuXG4vLyBXaGVuIGNvcGllZCBpbnRvIHRoZSBhdGxhcyB0ZXh0dXJlLCBpbWFnZSBkYXRhIGlzIHBhZGRlZCBieSBvbmUgcGl4ZWwgb24gZWFjaCBzaWRlLiBJY29uXG4vLyBpbWFnZXMgYXJlIHBhZGRlZCB3aXRoIGZ1bGx5IHRyYW5zcGFyZW50IHBpeGVscywgd2hpbGUgcGF0dGVybiBpbWFnZXMgYXJlIHBhZGRlZCB3aXRoIGFcbi8vIGNvcHkgb2YgdGhlIGltYWdlIGRhdGEgd3JhcHBlZCBmcm9tIHRoZSBvcHBvc2l0ZSBzaWRlLiBJbiBib3RoIGNhc2VzLCB0aGlzIGVuc3VyZXMgdGhlXG4vLyBjb3JyZWN0IGJlaGF2aW9yIG9mIEdMX0xJTkVBUiB0ZXh0dXJlIHNhbXBsaW5nIG1vZGUuXG5jb25zdCBwYWRkaW5nID0gMTtcblxuLypcbiAgICBJbWFnZU1hbmFnZXIgZG9lcyB0aHJlZSB0aGluZ3M6XG5cbiAgICAgICAgMS4gVHJhY2tzIHJlcXVlc3RzIGZvciBpY29uIGltYWdlcyBmcm9tIHRpbGUgd29ya2VycyBhbmQgc2VuZHMgcmVzcG9uc2VzIHdoZW4gdGhlIHJlcXVlc3RzIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgIDIuIEJ1aWxkcyBhIHRleHR1cmUgYXRsYXMgZm9yIHBhdHRlcm4gaW1hZ2VzLlxuICAgICAgICAzLiBSZXJlbmRlcnMgcmVuZGVyYWJsZSBpbWFnZXMgb25jZSBwZXIgZnJhbWVcblxuICAgIFRoZXNlIGFyZSBkaXNwYXJhdGUgcmVzcG9uc2liaWxpdGllcyBhbmQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgaGFuZGxlZCBieSBkaWZmZXJlbnQgY2xhc3Nlcy4gV2hlbiB3ZSBpbXBsZW1lbnRcbiAgICBkYXRhLWRyaXZlbiBzdXBwb3J0IGZvciBgKi1wYXR0ZXJuYCwgd2UnbGwgbGlrZWx5IHVzZSBwZXItYnVja2V0IHBhdHRlcm4gYXRsYXNlcywgYW5kIHRoYXQgd291bGQgYmUgYSBnb29kIHRpbWVcbiAgICB0byByZWZhY3RvciB0aGlzLlxuKi9cbmNsYXNzIEltYWdlTWFuYWdlciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGltYWdlczoge1tzdHJpbmddOiBTdHlsZUltYWdlfTtcbiAgICB1cGRhdGVkSW1hZ2VzOiB7W3N0cmluZ106IGJvb2xlYW59O1xuICAgIGNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZToge1tzdHJpbmddOiBib29sZWFufTtcbiAgICBsb2FkZWQ6IGJvb2xlYW47XG4gICAgcmVxdWVzdG9yczogQXJyYXk8e2lkczogQXJyYXk8c3RyaW5nPiwgY2FsbGJhY2s6IENhbGxiYWNrPHtbc3RyaW5nXTogU3R5bGVJbWFnZX0+fT47XG5cbiAgICBwYXR0ZXJuczoge1tzdHJpbmddOiBQYXR0ZXJufTtcbiAgICBhdGxhc0ltYWdlOiBSR0JBSW1hZ2U7XG4gICAgYXRsYXNUZXh0dXJlOiA/VGV4dHVyZTtcbiAgICBkaXJ0eTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmltYWdlcyA9IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZWRJbWFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWUgPSB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0b3JzID0gW107XG5cbiAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHt9O1xuICAgICAgICB0aGlzLmF0bGFzSW1hZ2UgPSBuZXcgUkdCQUltYWdlKHt3aWR0aDogMSwgaGVpZ2h0OiAxfSk7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGlzTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gICAgfVxuXG4gICAgc2V0TG9hZGVkKGxvYWRlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5sb2FkZWQgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7XG5cbiAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7aWRzLCBjYWxsYmFja30gb2YgdGhpcy5yZXF1ZXN0b3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGlkcywgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0b3JzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRJbWFnZShpZDogc3RyaW5nKTogP1N0eWxlSW1hZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbaWRdO1xuICAgIH1cblxuICAgIGFkZEltYWdlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pbWFnZXNbaWRdKTtcbiAgICAgICAgdGhpcy5pbWFnZXNbaWRdID0gaW1hZ2U7XG4gICAgfVxuXG4gICAgdXBkYXRlSW1hZ2UoaWQ6IHN0cmluZywgaW1hZ2U6IFN0eWxlSW1hZ2UpIHtcbiAgICAgICAgY29uc3Qgb2xkSW1hZ2UgPSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgIGFzc2VydChvbGRJbWFnZSk7XG4gICAgICAgIGFzc2VydChvbGRJbWFnZS5kYXRhLndpZHRoID09PSBpbWFnZS5kYXRhLndpZHRoKTtcbiAgICAgICAgYXNzZXJ0KG9sZEltYWdlLmRhdGEuaGVpZ2h0ID09PSBpbWFnZS5kYXRhLmhlaWdodCk7XG4gICAgICAgIGltYWdlLnZlcnNpb24gPSBvbGRJbWFnZS52ZXJzaW9uICsgMTtcbiAgICAgICAgdGhpcy5pbWFnZXNbaWRdID0gaW1hZ2U7XG4gICAgICAgIHRoaXMudXBkYXRlZEltYWdlc1tpZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJlbW92ZUltYWdlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW1hZ2VzW2lkXSk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5wYXR0ZXJuc1tpZF07XG5cbiAgICAgICAgaWYgKGltYWdlLnVzZXJJbWFnZSAmJiBpbWFnZS51c2VySW1hZ2Uub25SZW1vdmUpIHtcbiAgICAgICAgICAgIGltYWdlLnVzZXJJbWFnZS5vblJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGlzdEltYWdlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaW1hZ2VzKTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZXMoaWRzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tzdHJpbmddOiBTdHlsZUltYWdlfT4pIHtcbiAgICAgICAgLy8gSWYgdGhlIHNwcml0ZSBoYXMgYmVlbiBsb2FkZWQsIG9yIGlmIGFsbCB0aGUgaWNvbiBkZXBlbmRlbmNpZXMgYXJlIGFscmVhZHkgcHJlc2VudFxuICAgICAgICAvLyAoaS5lLiBpZiB0aGV5J3ZlIGJlZW4gYWRkZWRlZCB2aWEgcnVudGltZSBzdHlsaW5nKSwgdGhlbiBub3RpZnkgdGhlIHJlcXVlc3RvciBpbW1lZGlhdGVseS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkZWxheSBub3RpZmljYXRpb24gdW50aWwgdGhlIHNwcml0ZSBpcyBsb2FkZWQuIEF0IHRoYXQgcG9pbnQsIGlmIGFueSBvZiB0aGVcbiAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGFyZSBzdGlsbCB1bmF2YWlsYWJsZSwgd2UnbGwganVzdCBhc3N1bWUgdGhleSBhcmUgcGVybWFuZW50bHkgbWlzc2luZy5cbiAgICAgICAgbGV0IGhhc0FsbERlcGVuZGVuY2llcyA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5pc0xvYWRlZCgpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbWFnZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FsbERlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0xvYWRlZCgpIHx8IGhhc0FsbERlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGlkcywgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0b3JzLnB1c2goe2lkcywgY2FsbGJhY2t9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9ub3RpZnkoaWRzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tzdHJpbmddOiBTdHlsZUltYWdlfT4pIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmltYWdlc1tpZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdzdHlsZWltYWdlbWlzc2luZycsIHsgaWQgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgaW1hZ2Ugc28gdGhhdCBvdXIgb3duIGNvcHkgb2YgaXRzIEFycmF5QnVmZmVyIGRvZXNuJ3QgZ2V0IHRyYW5zZmVycmVkLlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlW2lkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW1hZ2UuZGF0YS5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBwaXhlbFJhdGlvOiBpbWFnZS5waXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBzZGY6IGltYWdlLnNkZixcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogaW1hZ2UudmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgaGFzUmVuZGVyQ2FsbGJhY2s6IEJvb2xlYW4oaW1hZ2UudXNlckltYWdlICYmIGltYWdlLnVzZXJJbWFnZS5yZW5kZXIpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoYEltYWdlIFwiJHtpZH1cIiBjb3VsZCBub3QgYmUgbG9hZGVkLiBQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIGFkZGVkIHRoZSBpbWFnZSB3aXRoIG1hcC5hZGRJbWFnZSgpIG9yIGEgXCJzcHJpdGVcIiBwcm9wZXJ0eSBpbiB5b3VyIHN0eWxlLiBZb3UgY2FuIHByb3ZpZGUgbWlzc2luZyBpbWFnZXMgYnkgbGlzdGVuaW5nIGZvciB0aGUgXCJzdHlsZWltYWdlbWlzc2luZ1wiIG1hcCBldmVudC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICAvLyBQYXR0ZXJuIHN0dWZmXG5cbiAgICBnZXRQaXhlbFNpemUoKSB7XG4gICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHRoaXMuYXRsYXNJbWFnZTtcbiAgICAgICAgcmV0dXJuIHt3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG5cbiAgICBnZXRQYXR0ZXJuKGlkOiBzdHJpbmcpOiA/SW1hZ2VQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLnBhdHRlcm5zW2lkXTtcblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuZ2V0SW1hZ2UoaWQpO1xuICAgICAgICBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuICYmIHBhdHRlcm4ucG9zaXRpb24udmVyc2lvbiA9PT0gaW1hZ2UudmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4ucG9zaXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhdHRlcm4pIHtcbiAgICAgICAgICAgIGNvbnN0IHcgPSBpbWFnZS5kYXRhLndpZHRoICsgcGFkZGluZyAqIDI7XG4gICAgICAgICAgICBjb25zdCBoID0gaW1hZ2UuZGF0YS5oZWlnaHQgKyBwYWRkaW5nICogMjtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHt3LCBoLCB4OiAwLCB5OiAwfTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IEltYWdlUG9zaXRpb24oYmluLCBpbWFnZSk7XG4gICAgICAgICAgICB0aGlzLnBhdHRlcm5zW2lkXSA9IHtiaW4sIHBvc2l0aW9ufTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdHRlcm4ucG9zaXRpb24udmVyc2lvbiA9IGltYWdlLnZlcnNpb247XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVQYXR0ZXJuQXRsYXMoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wYXR0ZXJuc1tpZF0ucG9zaXRpb247XG4gICAgfVxuXG4gICAgYmluZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgaWYgKCF0aGlzLmF0bGFzVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5hdGxhc1RleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmF0bGFzSW1hZ2UsIGdsLlJHQkEpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlLnVwZGF0ZSh0aGlzLmF0bGFzSW1hZ2UpO1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdGxhc1RleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgIH1cblxuICAgIF91cGRhdGVQYXR0ZXJuQXRsYXMoKSB7XG4gICAgICAgIGNvbnN0IGJpbnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBiaW5zLnB1c2godGhpcy5wYXR0ZXJuc1tpZF0uYmluKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHt3LCBofSA9IHBvdHBhY2soYmlucyk7XG5cbiAgICAgICAgY29uc3QgZHN0ID0gdGhpcy5hdGxhc0ltYWdlO1xuICAgICAgICBkc3QucmVzaXplKHt3aWR0aDogdyB8fCAxLCBoZWlnaHQ6IGggfHwgMX0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5wYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3Qge2Jpbn0gPSB0aGlzLnBhdHRlcm5zW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IHggPSBiaW4ueCArIHBhZGRpbmc7XG4gICAgICAgICAgICBjb25zdCB5ID0gYmluLnkgKyBwYWRkaW5nO1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5pbWFnZXNbaWRdLmRhdGE7XG4gICAgICAgICAgICBjb25zdCB3ID0gc3JjLndpZHRoO1xuICAgICAgICAgICAgY29uc3QgaCA9IHNyYy5oZWlnaHQ7XG5cbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYywgZHN0LCB7IHg6IDAsIHk6IDAgfSwgeyB4LCB5IH0sIHsgd2lkdGg6IHcsIGhlaWdodDogaCB9KTtcblxuICAgICAgICAgICAgLy8gQWRkIDEgcGl4ZWwgd3JhcHBlZCBwYWRkaW5nIG9uIGVhY2ggc2lkZSBvZiB0aGUgaW1hZ2UuXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwgeyB4OiAwLCB5OiBoIC0gMSB9LCB7IHgsIHk6IHkgLSAxIH0sIHsgd2lkdGg6IHcsIGhlaWdodDogMSB9KTsgLy8gVFxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHsgeDogMCwgeTogICAgIDAgfSwgeyB4LCB5OiB5ICsgaCB9LCB7IHdpZHRoOiB3LCBoZWlnaHQ6IDEgfSk7IC8vIEJcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYywgZHN0LCB7IHg6IHcgLSAxLCB5OiAwIH0sIHsgeDogeCAtIDEsIHkgfSwgeyB3aWR0aDogMSwgaGVpZ2h0OiBoIH0pOyAvLyBMXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwgeyB4OiAwLCAgICAgeTogMCB9LCB7IHg6IHggKyB3LCB5IH0sIHsgd2lkdGg6IDEsIGhlaWdodDogaCB9KTsgLy8gUlxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgYmVnaW5GcmFtZSgpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWUgPSB7fTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaFJlbmRlckNhbGxiYWNrcyhpZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcblxuICAgICAgICAgICAgLy8gdGhlIGNhbGxiYWNrIGZvciB0aGUgaW1hZ2Ugd2FzIGFscmVhZHkgZGlzcGF0Y2hlZCBmb3IgYSBkaWZmZXJlbnQgZnJhbWVcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZVtpZF0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWVbaWRdID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgICAgICBhc3NlcnQoaW1hZ2UpO1xuXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gcmVuZGVyU3R5bGVJbWFnZShpbWFnZSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSW1hZ2UoaWQsIGltYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VNYW5hZ2VyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgZ2V0QXJyYXlCdWZmZXIsIFJlc291cmNlVHlwZSB9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5cbmltcG9ydCBwYXJzZUdseXBoUEJGIGZyb20gJy4vcGFyc2VfZ2x5cGhfcGJmJztcblxuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4vc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RNYW5hZ2VyfSBmcm9tICcuLi91dGlsL21hcGJveCc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGZvbnRzdGFjazogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFRlbXBsYXRlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2s8e1tudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0+KSB7XG4gICAgY29uc3QgYmVnaW4gPSByYW5nZSAqIDI1NjtcbiAgICBjb25zdCBlbmQgPSBiZWdpbiArIDI1NTtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KFxuICAgICAgICByZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVHbHlwaHNVUkwodXJsVGVtcGxhdGUpXG4gICAgICAgICAgICAucmVwbGFjZSgne2ZvbnRzdGFja30nLCBmb250c3RhY2spXG4gICAgICAgICAgICAucmVwbGFjZSgne3JhbmdlfScsIGAke2JlZ2lufS0ke2VuZH1gKSxcbiAgICAgICAgUmVzb3VyY2VUeXBlLkdseXBocyk7XG5cbiAgICBnZXRBcnJheUJ1ZmZlcihyZXF1ZXN0LCAoZXJyOiA/RXJyb3IsIGRhdGE6ID9BcnJheUJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGdseXBocyA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIHBhcnNlR2x5cGhQQkYoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBnbHlwaHNbZ2x5cGguaWRdID0gZ2x5cGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGdseXBocyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUaW55U0RGO1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IFRpbnlTREY7XG5cbnZhciBJTkYgPSAxZTIwO1xuXG5mdW5jdGlvbiBUaW55U0RGKGZvbnRTaXplLCBidWZmZXIsIHJhZGl1cywgY3V0b2ZmLCBmb250RmFtaWx5LCBmb250V2VpZ2h0KSB7XG4gICAgdGhpcy5mb250U2l6ZSA9IGZvbnRTaXplIHx8IDI0O1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyID09PSB1bmRlZmluZWQgPyAzIDogYnVmZmVyO1xuICAgIHRoaXMuY3V0b2ZmID0gY3V0b2ZmIHx8IDAuMjU7XG4gICAgdGhpcy5mb250RmFtaWx5ID0gZm9udEZhbWlseSB8fCAnc2Fucy1zZXJpZic7XG4gICAgdGhpcy5mb250V2VpZ2h0ID0gZm9udFdlaWdodCB8fCAnbm9ybWFsJztcbiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cyB8fCA4O1xuICAgIHZhciBzaXplID0gdGhpcy5zaXplID0gdGhpcy5mb250U2l6ZSArIHRoaXMuYnVmZmVyICogMjtcblxuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSBzaXplO1xuXG4gICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHRoaXMuY3R4LmZvbnQgPSB0aGlzLmZvbnRXZWlnaHQgKyAnICcgKyB0aGlzLmZvbnRTaXplICsgJ3B4ICcgKyB0aGlzLmZvbnRGYW1pbHk7XG4gICAgdGhpcy5jdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gJ2JsYWNrJztcblxuICAgIC8vIHRlbXBvcmFyeSBhcnJheXMgZm9yIHRoZSBkaXN0YW5jZSB0cmFuc2Zvcm1cbiAgICB0aGlzLmdyaWRPdXRlciA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIHNpemUpO1xuICAgIHRoaXMuZ3JpZElubmVyID0gbmV3IEZsb2F0NjRBcnJheShzaXplICogc2l6ZSk7XG4gICAgdGhpcy5mID0gbmV3IEZsb2F0NjRBcnJheShzaXplKTtcbiAgICB0aGlzLmQgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUpO1xuICAgIHRoaXMueiA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSArIDEpO1xuICAgIHRoaXMudiA9IG5ldyBJbnQxNkFycmF5KHNpemUpO1xuXG4gICAgLy8gaGFjayBhcm91bmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODUyXG4gICAgdGhpcy5taWRkbGUgPSBNYXRoLnJvdW5kKChzaXplIC8gMikgKiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdHZWNrby8nKSA+PSAwID8gMS4yIDogMSkpO1xufVxuXG5UaW55U0RGLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGNoYXIpIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaXplLCB0aGlzLnNpemUpO1xuICAgIHRoaXMuY3R4LmZpbGxUZXh0KGNoYXIsIHRoaXMuYnVmZmVyLCB0aGlzLm1pZGRsZSk7XG5cbiAgICB2YXIgaW1nRGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSk7XG4gICAgdmFyIGFscGhhQ2hhbm5lbCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLnNpemUgKiB0aGlzLnNpemUpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNpemUgKiB0aGlzLnNpemU7IGkrKykge1xuICAgICAgICB2YXIgYSA9IGltZ0RhdGEuZGF0YVtpICogNCArIDNdIC8gMjU1OyAvLyBhbHBoYSB2YWx1ZVxuICAgICAgICB0aGlzLmdyaWRPdXRlcltpXSA9IGEgPT09IDEgPyAwIDogYSA9PT0gMCA/IElORiA6IE1hdGgucG93KE1hdGgubWF4KDAsIDAuNSAtIGEpLCAyKTtcbiAgICAgICAgdGhpcy5ncmlkSW5uZXJbaV0gPSBhID09PSAxID8gSU5GIDogYSA9PT0gMCA/IDAgOiBNYXRoLnBvdyhNYXRoLm1heCgwLCBhIC0gMC41KSwgMik7XG4gICAgfVxuXG4gICAgZWR0KHRoaXMuZ3JpZE91dGVyLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSwgdGhpcy5mLCB0aGlzLmQsIHRoaXMudiwgdGhpcy56KTtcbiAgICBlZHQodGhpcy5ncmlkSW5uZXIsIHRoaXMuc2l6ZSwgdGhpcy5zaXplLCB0aGlzLmYsIHRoaXMuZCwgdGhpcy52LCB0aGlzLnopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2l6ZSAqIHRoaXMuc2l6ZTsgaSsrKSB7XG4gICAgICAgIHZhciBkID0gdGhpcy5ncmlkT3V0ZXJbaV0gLSB0aGlzLmdyaWRJbm5lcltpXTtcbiAgICAgICAgYWxwaGFDaGFubmVsW2ldID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKDI1NSAtIDI1NSAqIChkIC8gdGhpcy5yYWRpdXMgKyB0aGlzLmN1dG9mZikpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFscGhhQ2hhbm5lbDtcbn07XG5cbi8vIDJEIEV1Y2xpZGVhbiBkaXN0YW5jZSB0cmFuc2Zvcm0gYnkgRmVsemVuc3p3YWxiICYgSHV0dGVubG9jaGVyIGh0dHBzOi8vY3MuYnJvd24uZWR1L35wZmYvcGFwZXJzL2R0LWZpbmFsLnBkZlxuZnVuY3Rpb24gZWR0KGRhdGEsIHdpZHRoLCBoZWlnaHQsIGYsIGQsIHYsIHopIHtcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZlt5XSA9IGRhdGFbeSAqIHdpZHRoICsgeF07XG4gICAgICAgIH1cbiAgICAgICAgZWR0MWQoZiwgZCwgdiwgeiwgaGVpZ2h0KTtcbiAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBkYXRhW3kgKiB3aWR0aCArIHhdID0gZFt5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGZbeF0gPSBkYXRhW3kgKiB3aWR0aCArIHhdO1xuICAgICAgICB9XG4gICAgICAgIGVkdDFkKGYsIGQsIHYsIHosIHdpZHRoKTtcbiAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGRhdGFbeSAqIHdpZHRoICsgeF0gPSBNYXRoLnNxcnQoZFt4XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIDFEIHNxdWFyZWQgZGlzdGFuY2UgdHJhbnNmb3JtXG5mdW5jdGlvbiBlZHQxZChmLCBkLCB2LCB6LCBuKSB7XG4gICAgdlswXSA9IDA7XG4gICAgelswXSA9IC1JTkY7XG4gICAgelsxXSA9ICtJTkY7XG5cbiAgICBmb3IgKHZhciBxID0gMSwgayA9IDA7IHEgPCBuOyBxKyspIHtcbiAgICAgICAgdmFyIHMgPSAoKGZbcV0gKyBxICogcSkgLSAoZlt2W2tdXSArIHZba10gKiB2W2tdKSkgLyAoMiAqIHEgLSAyICogdltrXSk7XG4gICAgICAgIHdoaWxlIChzIDw9IHpba10pIHtcbiAgICAgICAgICAgIGstLTtcbiAgICAgICAgICAgIHMgPSAoKGZbcV0gKyBxICogcSkgLSAoZlt2W2tdXSArIHZba10gKiB2W2tdKSkgLyAoMiAqIHEgLSAyICogdltrXSk7XG4gICAgICAgIH1cbiAgICAgICAgaysrO1xuICAgICAgICB2W2tdID0gcTtcbiAgICAgICAgeltrXSA9IHM7XG4gICAgICAgIHpbayArIDFdID0gK0lORjtcbiAgICB9XG5cbiAgICBmb3IgKHEgPSAwLCBrID0gMDsgcSA8IG47IHErKykge1xuICAgICAgICB3aGlsZSAoeltrICsgMV0gPCBxKSBrKys7XG4gICAgICAgIGRbcV0gPSAocSAtIHZba10pICogKHEgLSB2W2tdKSArIGZbdltrXV07XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGxvYWRHbHlwaFJhbmdlIGZyb20gJy4uL3N0eWxlL2xvYWRfZ2x5cGhfcmFuZ2UnO1xuXG5pbXBvcnQgVGlueVNERiBmcm9tICdAbWFwYm94L3Rpbnktc2RmJztcbmltcG9ydCBpc0NoYXIgZnJvbSAnLi4vdXRpbC9pc19jaGFyX2luX3VuaWNvZGVfYmxvY2snO1xuaW1wb3J0IHsgYXN5bmNBbGwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgQWxwaGFJbWFnZSB9IGZyb20gJy4uL3V0aWwvaW1hZ2UnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RNYW5hZ2VyfSBmcm9tICcuLi91dGlsL21hcGJveCc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcblxudHlwZSBFbnRyeSA9IHtcbiAgICAvLyBudWxsIG1lYW5zIHdlJ3ZlIHJlcXVlc3RlZCB0aGUgcmFuZ2UsIGJ1dCB0aGUgZ2x5cGggd2Fzbid0IGluY2x1ZGVkIGluIHRoZSByZXN1bHQuXG4gICAgZ2x5cGhzOiB7W2lkOiBudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0sXG4gICAgcmVxdWVzdHM6IHtbcmFuZ2U6IG51bWJlcl06IEFycmF5PENhbGxiYWNrPHtbbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9Pj59LFxuICAgIHRpbnlTREY/OiBUaW55U0RGXG59O1xuXG5jbGFzcyBHbHlwaE1hbmFnZXIge1xuICAgIHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcjtcbiAgICBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6ID9zdHJpbmc7XG4gICAgZW50cmllczoge1tzdHJpbmddOiBFbnRyeX07XG4gICAgdXJsOiA/c3RyaW5nO1xuXG4gICAgLy8gZXhwb3NlZCBhcyBzdGF0aWNzIHRvIGVuYWJsZSBzdHViYmluZyBpbiB1bml0IHRlc3RzXG4gICAgc3RhdGljIGxvYWRHbHlwaFJhbmdlOiB0eXBlb2YgbG9hZEdseXBoUmFuZ2U7XG4gICAgc3RhdGljIFRpbnlTREY6IENsYXNzPFRpbnlTREY+O1xuXG4gICAgY29uc3RydWN0b3IocmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyLCBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWFuYWdlciA9IHJlcXVlc3RNYW5hZ2VyO1xuICAgICAgICB0aGlzLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA9IGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0ge307XG4gICAgfVxuXG4gICAgc2V0VVJMKHVybDogP3N0cmluZykge1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG5cbiAgICBnZXRHbHlwaHMoZ2x5cGhzOiB7W3N0YWNrOiBzdHJpbmddOiBBcnJheTxudW1iZXI+fSwgY2FsbGJhY2s6IENhbGxiYWNrPHtbc3RhY2s6IHN0cmluZ106IHtbaWQ6IG51bWJlcl06ID9TdHlsZUdseXBofX0+KSB7XG4gICAgICAgIGNvbnN0IGFsbCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhY2sgaW4gZ2x5cGhzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdseXBoc1tzdGFja10pIHtcbiAgICAgICAgICAgICAgICBhbGwucHVzaCh7c3RhY2ssIGlkfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3luY0FsbChhbGwsICh7c3RhY2ssIGlkfSwgY2FsbGJhY2s6IENhbGxiYWNrPHtzdGFjazogc3RyaW5nLCBpZDogbnVtYmVyLCBnbHlwaDogP1N0eWxlR2x5cGh9PikgPT4ge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzW3N0YWNrXTtcbiAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IHRoaXMuZW50cmllc1tzdGFja10gPSB7XG4gICAgICAgICAgICAgICAgICAgIGdseXBoczoge30sXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBnbHlwaCA9IGVudHJ5LmdseXBoc1tpZF07XG4gICAgICAgICAgICBpZiAoZ2x5cGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBofSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbHlwaCA9IHRoaXMuX3RpbnlTREYoZW50cnksIHN0YWNrLCBpZCk7XG4gICAgICAgICAgICBpZiAoZ2x5cGgpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS5nbHlwaHNbaWRdID0gZ2x5cGg7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge3N0YWNrLCBpZCwgZ2x5cGh9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gTWF0aC5mbG9vcihpZCAvIDI1Nik7XG4gICAgICAgICAgICBpZiAocmFuZ2UgKiAyNTYgPiA2NTUzNSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignZ2x5cGhzID4gNjU1MzUgbm90IHN1cHBvcnRlZCcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXF1ZXN0cyA9IGVudHJ5LnJlcXVlc3RzW3JhbmdlXTtcbiAgICAgICAgICAgIGlmICghcmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0cyA9IGVudHJ5LnJlcXVlc3RzW3JhbmdlXSA9IFtdO1xuICAgICAgICAgICAgICAgIEdseXBoTWFuYWdlci5sb2FkR2x5cGhSYW5nZShzdGFjaywgcmFuZ2UsICh0aGlzLnVybDogYW55KSwgdGhpcy5yZXF1ZXN0TWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgKGVyciwgcmVzcG9uc2U6ID97W251bWJlcl06IFN0eWxlR2x5cGggfCBudWxsfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RvZXNDaGFyU3VwcG9ydExvY2FsR2x5cGgoK2lkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2x5cGhzWytpZF0gPSByZXNwb25zZVsraWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYiBvZiByZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGVudHJ5LnJlcXVlc3RzW3JhbmdlXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlcXVlc3RzLnB1c2goKGVyciwgcmVzdWx0OiA/e1tudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge3N0YWNrLCBpZCwgZ2x5cGg6IHJlc3VsdFtpZF0gfHwgbnVsbH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAoZXJyLCBnbHlwaHM6ID9BcnJheTx7c3RhY2s6IHN0cmluZywgaWQ6IG51bWJlciwgZ2x5cGg6ID9TdHlsZUdseXBofT4pID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChnbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qge3N0YWNrLCBpZCwgZ2x5cGh9IG9mIGdseXBocykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgZ2x5cGggc28gdGhhdCBvdXIgb3duIGNvcHkgb2YgaXRzIEFycmF5QnVmZmVyIGRvZXNuJ3QgZ2V0IHRyYW5zZmVycmVkLlxuICAgICAgICAgICAgICAgICAgICAocmVzdWx0W3N0YWNrXSB8fCAocmVzdWx0W3N0YWNrXSA9IHt9KSlbaWRdID0gZ2x5cGggJiYge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGdseXBoLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwOiBnbHlwaC5iaXRtYXAuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3M6IGdseXBoLm1ldHJpY3NcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZG9lc0NoYXJTdXBwb3J0TG9jYWxHbHlwaChpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbiAgICAgICAgcmV0dXJuICEhdGhpcy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIChpc0NoYXJbJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnXShpZCkgfHxcbiAgICAgICAgICAgICAgICBpc0NoYXJbJ0hhbmd1bCBTeWxsYWJsZXMnXShpZCkgfHxcbiAgICAgICAgICAgICAgICBpc0NoYXJbJ0hpcmFnYW5hJ10oaWQpIHx8XG4gICAgICAgICAgICAgICAgaXNDaGFyWydLYXRha2FuYSddKGlkKSk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbmV3LWNhcCAqL1xuICAgIH1cblxuICAgIF90aW55U0RGKGVudHJ5OiBFbnRyeSwgc3RhY2s6IHN0cmluZywgaWQ6IG51bWJlcik6ID9TdHlsZUdseXBoIHtcbiAgICAgICAgY29uc3QgZmFtaWx5ID0gdGhpcy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7XG4gICAgICAgIGlmICghZmFtaWx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2RvZXNDaGFyU3VwcG9ydExvY2FsR2x5cGgoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGlueVNERiA9IGVudHJ5LnRpbnlTREY7XG4gICAgICAgIGlmICghdGlueVNERikge1xuICAgICAgICAgICAgbGV0IGZvbnRXZWlnaHQgPSAnNDAwJztcbiAgICAgICAgICAgIGlmICgvYm9sZC9pLnRlc3Qoc3RhY2spKSB7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCA9ICc5MDAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvbWVkaXVtL2kudGVzdChzdGFjaykpIHtcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0ID0gJzUwMCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9saWdodC9pLnRlc3Qoc3RhY2spKSB7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCA9ICcyMDAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlueVNERiA9IGVudHJ5LnRpbnlTREYgPSBuZXcgR2x5cGhNYW5hZ2VyLlRpbnlTREYoMjQsIDMsIDgsIC4yNSwgZmFtaWx5LCBmb250V2VpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGJpdG1hcDogbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiAzMCwgaGVpZ2h0OiAzMH0sIHRpbnlTREYuZHJhdyhTdHJpbmcuZnJvbUNoYXJDb2RlKGlkKSkpLFxuICAgICAgICAgICAgbWV0cmljczoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDI0LFxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgdG9wOiAtOCxcbiAgICAgICAgICAgICAgICBhZHZhbmNlOiAyNFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuR2x5cGhNYW5hZ2VyLmxvYWRHbHlwaFJhbmdlID0gbG9hZEdseXBoUmFuZ2U7XG5HbHlwaE1hbmFnZXIuVGlueVNERiA9IFRpbnlTREY7XG5cbmV4cG9ydCBkZWZhdWx0IEdseXBoTWFuYWdlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0JztcblxuaW1wb3J0IHsgZW5kc1dpdGgsIGV4dGVuZCwgc3BoZXJpY2FsVG9DYXJ0ZXNpYW4gfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQge1xuICAgIHZhbGlkYXRlU3R5bGUsXG4gICAgdmFsaWRhdGVMaWdodCxcbiAgICBlbWl0VmFsaWRhdGlvbkVycm9yc1xufSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuaW1wb3J0IHsgbnVtYmVyIGFzIGludGVycG9sYXRlIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcblxuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3N0eWxlLXNwZWMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUge1N0eWxlU2V0dGVyT3B0aW9uc30gZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xuaW1wb3J0IHsgUHJvcGVydGllcywgVHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhQ29uc3RhbnRQcm9wZXJ0eSB9IGZyb20gJy4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBQcm9wZXJ0eSxcbiAgICBQcm9wZXJ0eVZhbHVlLFxuICAgIFRyYW5zaXRpb25QYXJhbWV0ZXJzXG59IGZyb20gJy4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIHtMaWdodFNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG50eXBlIExpZ2h0UG9zaXRpb24gPSB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB6OiBudW1iZXJcbn07XG5cbmNsYXNzIExpZ2h0UG9zaXRpb25Qcm9wZXJ0eSBpbXBsZW1lbnRzIFByb3BlcnR5PFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgTGlnaHRQb3NpdGlvbj4ge1xuICAgIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHN0eWxlU3BlYy5saWdodC5wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlOiBQcm9wZXJ0eVZhbHVlPFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgTGlnaHRQb3NpdGlvbj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogTGlnaHRQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiBzcGhlcmljYWxUb0NhcnRlc2lhbih2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBMaWdodFBvc2l0aW9uLCBiOiBMaWdodFBvc2l0aW9uLCB0OiBudW1iZXIpOiBMaWdodFBvc2l0aW9uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IGludGVycG9sYXRlKGEueCwgYi54LCB0KSxcbiAgICAgICAgICAgIHk6IGludGVycG9sYXRlKGEueSwgYi55LCB0KSxcbiAgICAgICAgICAgIHo6IGludGVycG9sYXRlKGEueiwgYi56LCB0KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbnR5cGUgUHJvcHMgPSB7fFxuICAgIFwiYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwicG9zaXRpb25cIjogTGlnaHRQb3NpdGlvblByb3BlcnR5LFxuICAgIFwiY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJhbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5hbmNob3IpLFxuICAgIFwicG9zaXRpb25cIjogbmV3IExpZ2h0UG9zaXRpb25Qcm9wZXJ0eSgpLFxuICAgIFwiY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5jb2xvciksXG4gICAgXCJpbnRlbnNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5pbnRlbnNpdHkpLFxufSk7XG5cbmNvbnN0IFRSQU5TSVRJT05fU1VGRklYID0gJy10cmFuc2l0aW9uJztcblxuLypcbiAqIFJlcHJlc2VudHMgdGhlIGxpZ2h0IHVzZWQgdG8gbGlnaHQgZXh0cnVkZWQgZmVhdHVyZXMuXG4gKi9cbmNsYXNzIExpZ2h0IGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX3RyYW5zaXRpb25hYmxlOiBUcmFuc2l0aW9uYWJsZTxQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmc6IFRyYW5zaXRpb25pbmc8UHJvcHM+O1xuICAgIHByb3BlcnRpZXM6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxpZ2h0T3B0aW9ucz86IExpZ2h0U3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZSA9IG5ldyBUcmFuc2l0aW9uYWJsZShwcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5zZXRMaWdodChsaWdodE9wdGlvbnMpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudW50cmFuc2l0aW9uZWQoKTtcbiAgICB9XG5cbiAgICBnZXRMaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNlcmlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHNldExpZ2h0KGxpZ2h0PzogTGlnaHRTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVMaWdodCwgbGlnaHQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbGlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGlnaHRbbmFtZV07XG4gICAgICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUuc2V0VHJhbnNpdGlvbihuYW1lLnNsaWNlKDAsIC1UUkFOU0lUSU9OX1NVRkZJWC5sZW5ndGgpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmcgPSB0aGlzLl90cmFuc2l0aW9uYWJsZS50cmFuc2l0aW9uZWQocGFyYW1ldGVycywgdGhpcy5fdHJhbnNpdGlvbmluZyk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmcuaGFzVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHRoaXMuX3RyYW5zaXRpb25pbmcucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGU6IEZ1bmN0aW9uLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM/OiB7dmFsaWRhdGU/OiBib29sZWFufSkge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnZhbGlkYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwgZXh0ZW5kKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI0MDdcbiAgICAgICAgICAgIHN0eWxlOiB7Z2x5cGhzOiB0cnVlLCBzcHJpdGU6IHRydWV9LFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaWdodDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuLyoqXG4gKiBBIExpbmVBdGxhcyBsZXRzIHVzIHJldXNlIHJlbmRlcmVkIGRhc2hlZCBsaW5lc1xuICogYnkgd3JpdGluZyBtYW55IG9mIHRoZW0gdG8gYSB0ZXh0dXJlIGFuZCB0aGVuIGZldGNoaW5nIHRoZWlyIHBvc2l0aW9uc1xuICogdXNpbmcgLmdldERhc2guXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMaW5lQXRsYXMge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgbmV4dFJvdzogbnVtYmVyO1xuICAgIGJ5dGVzOiBudW1iZXI7XG4gICAgZGF0YTogVWludDhBcnJheTtcbiAgICBwb3NpdGlvbnM6IHtbc3RyaW5nXTogYW55fTtcbiAgICBkaXJ0eTogYm9vbGVhbjtcbiAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG5cbiAgICBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLm5leHRSb3cgPSAwO1xuXG4gICAgICAgIHRoaXMuYnl0ZXMgPSA0O1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiB0aGlzLmJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvciBjcmVhdGUgYSBkYXNoIGxpbmUgcGF0dGVybi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZGFzaGFycmF5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByb3VuZCB3aGV0aGVyIHRvIGFkZCBjaXJjbGUgY2FwcyBpbiBiZXR3ZWVuIGRhc2ggc2VnbWVudHNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBwb3NpdGlvbiBvZiBkYXNoIHRleHR1cmUgaW4geyB5LCBoZWlnaHQsIHdpZHRoIH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldERhc2goZGFzaGFycmF5OiBBcnJheTxudW1iZXI+LCByb3VuZDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBrZXkgPSBkYXNoYXJyYXkuam9pbihcIixcIikgKyBTdHJpbmcocm91bmQpO1xuXG4gICAgICAgIGlmICghdGhpcy5wb3NpdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnNba2V5XSA9IHRoaXMuYWRkRGFzaChkYXNoYXJyYXksIHJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBhZGREYXNoKGRhc2hhcnJheTogQXJyYXk8bnVtYmVyPiwgcm91bmQ6IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCBuID0gcm91bmQgPyA3IDogMDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gMiAqIG4gKyAxO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAxMjg7XG5cbiAgICAgICAgaWYgKHRoaXMubmV4dFJvdyArIGhlaWdodCA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnTGluZUF0bGFzIG91dCBvZiBzcGFjZScpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXNoYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxlbmd0aCArPSBkYXNoYXJyYXlbaV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHJldGNoID0gdGhpcy53aWR0aCAvIGxlbmd0aDtcbiAgICAgICAgY29uc3QgaGFsZldpZHRoID0gc3RyZXRjaCAvIDI7XG5cbiAgICAgICAgLy8gSWYgZGFzaGFycmF5IGhhcyBhbiBvZGQgbGVuZ3RoLCBib3RoIHRoZSBmaXJzdCBhbmQgbGFzdCBwYXJ0c1xuICAgICAgICAvLyBhcmUgZGFzaGVzIGFuZCBzaG91bGQgYmUgam9pbmVkIHNlYW1sZXNzbHkuXG4gICAgICAgIGNvbnN0IG9kZExlbmd0aCA9IGRhc2hhcnJheS5sZW5ndGggJSAyID09PSAxO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAtbjsgeSA8PSBuOyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMubmV4dFJvdyArIG4gKyB5O1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLndpZHRoICogcm93O1xuXG4gICAgICAgICAgICBsZXQgbGVmdCA9IG9kZExlbmd0aCA/IC1kYXNoYXJyYXlbZGFzaGFycmF5Lmxlbmd0aCAtIDFdIDogMDtcbiAgICAgICAgICAgIGxldCByaWdodCA9IGRhc2hhcnJheVswXTtcbiAgICAgICAgICAgIGxldCBwYXJ0SW5kZXggPSAxO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGg7IHgrKykge1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHJpZ2h0IDwgeCAvIHN0cmV0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0ICsgZGFzaGFycmF5W3BhcnRJbmRleF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9kZExlbmd0aCAmJiBwYXJ0SW5kZXggPT09IGRhc2hhcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodCArPSBkYXNoYXJyYXlbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXJ0SW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0TGVmdCA9IE1hdGguYWJzKHggLSBsZWZ0ICogc3RyZXRjaCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdFJpZ2h0ID0gTWF0aC5hYnMoeCAtIHJpZ2h0ICogc3RyZXRjaCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdCA9IE1hdGgubWluKGRpc3RMZWZ0LCBkaXN0UmlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc2lkZSA9IChwYXJ0SW5kZXggJSAyKSA9PT0gMTtcbiAgICAgICAgICAgICAgICBsZXQgc2lnbmVkRGlzdGFuY2U7XG5cbiAgICAgICAgICAgICAgICBpZiAocm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNpcmNsZSBjYXBzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RNaWRkbGUgPSBuID8geSAvIG4gKiAoaGFsZldpZHRoICsgMSkgOiAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0RWRnZSA9IGhhbGZXaWR0aCAtIE1hdGguYWJzKGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdCAqIGRpc3QgKyBkaXN0RWRnZSAqIGRpc3RFZGdlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gaGFsZldpZHRoIC0gTWF0aC5zcXJ0KGRpc3QgKiBkaXN0ICsgZGlzdE1pZGRsZSAqIGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSAoaW5zaWRlID8gMSA6IC0xKSAqIGRpc3Q7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhWzMgKyAoaW5kZXggKyB4KSAqIDRdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBzaWduZWREaXN0YW5jZSArIG9mZnNldCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zID0ge1xuICAgICAgICAgICAgeTogKHRoaXMubmV4dFJvdyArIG4gKyAwLjUpIC8gdGhpcy5oZWlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IDIgKiBuIC8gdGhpcy5oZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogbGVuZ3RoXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5uZXh0Um93ICs9IGhlaWdodDtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG5cbiAgICBiaW5kKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLlJFUEVBVCk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5SRVBFQVQpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuZGF0YSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpbmVBdGxhcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHVuaXF1ZUlkLCBhc3luY0FsbCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgQWN0b3IgZnJvbSAnLi9hY3Rvcic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIFdvcmtlclBvb2wgZnJvbSAnLi93b3JrZXJfcG9vbCc7XG5cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgZnJvbSBhIHtAbGluayBTb3VyY2V9IHRvIGFuIGFzc29jaWF0ZWRcbiAqIHtAbGluayBXb3JrZXJTb3VyY2V9LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIERpc3BhdGNoZXIge1xuICAgIHdvcmtlclBvb2w6IFdvcmtlclBvb2w7XG4gICAgYWN0b3JzOiBBcnJheTxBY3Rvcj47XG4gICAgY3VycmVudEFjdG9yOiBudW1iZXI7XG4gICAgaWQ6IG51bWJlcjtcblxuICAgIC8vIGV4cG9zZWQgdG8gYWxsb3cgc3R1YmJpbmcgaW4gdW5pdCB0ZXN0c1xuICAgIHN0YXRpYyBBY3RvcjogQ2xhc3M8QWN0b3I+O1xuXG4gICAgY29uc3RydWN0b3Iod29ya2VyUG9vbDogV29ya2VyUG9vbCwgcGFyZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy53b3JrZXJQb29sID0gd29ya2VyUG9vbDtcbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0b3IgPSAwO1xuICAgICAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5hY3F1aXJlKHRoaXMuaWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaV07XG4gICAgICAgICAgICBjb25zdCBhY3RvciA9IG5ldyBEaXNwYXRjaGVyLkFjdG9yKHdvcmtlciwgcGFyZW50LCB0aGlzLmlkKTtcbiAgICAgICAgICAgIGFjdG9yLm5hbWUgPSBgV29ya2VyICR7aX1gO1xuICAgICAgICAgICAgdGhpcy5hY3RvcnMucHVzaChhY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHRoaXMuYWN0b3JzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byBhbGwgV29ya2Vycy5cbiAgICAgKi9cbiAgICBicm9hZGNhc3QodHlwZTogc3RyaW5nLCBkYXRhOiBtaXhlZCwgY2I/OiBGdW5jdGlvbikge1xuICAgICAgICBhc3NlcnQodGhpcy5hY3RvcnMubGVuZ3RoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgYXN5bmNBbGwodGhpcy5hY3RvcnMsIChhY3RvciwgZG9uZSkgPT4ge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCh0eXBlLCBkYXRhLCBkb25lKTtcbiAgICAgICAgfSwgY2IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjcXVpcmVzIGFuIGFjdG9yIHRvIGRpc3BhdGNoIG1lc3NhZ2VzIHRvLiBUaGUgYWN0b3JzIGFyZSBkaXN0cmlidXRlZCBpbiByb3VuZC1yb2JpbiBmYXNoaW9uLlxuICAgICAqIEByZXR1cm5zIEFuIGFjdG9yIG9iamVjdCBiYWNrZWQgYnkgYSB3ZWIgd29ya2VyIGZvciBwcm9jZXNzaW5nIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGdldEFjdG9yKCk6IEFjdG9yIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuYWN0b3JzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuY3VycmVudEFjdG9yID0gKHRoaXMuY3VycmVudEFjdG9yICsgMSkgJSB0aGlzLmFjdG9ycy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdG9yc1t0aGlzLmN1cnJlbnRBY3Rvcl07XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLmFjdG9ycy5mb3JFYWNoKChhY3RvcikgPT4geyBhY3Rvci5yZW1vdmUoKTsgfSk7XG4gICAgICAgIHRoaXMuYWN0b3JzID0gW107XG4gICAgICAgIHRoaXMud29ya2VyUG9vbC5yZWxlYXNlKHRoaXMuaWQpO1xuICAgIH1cbn1cblxuRGlzcGF0Y2hlci5BY3RvciA9IEFjdG9yO1xuXG5leHBvcnQgZGVmYXVsdCBEaXNwYXRjaGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgcGljaywgZXh0ZW5kIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHsgZ2V0SlNPTiwgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5cbmltcG9ydCB0eXBlIHtSZXF1ZXN0TWFuYWdlcn0gZnJvbSAnLi4vdXRpbC9tYXBib3gnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSB7VGlsZUpTT059IGZyb20gJy4uL3R5cGVzL3RpbGVqc29uJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9uczogYW55LCByZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXIsIGNhbGxiYWNrOiBDYWxsYmFjazxUaWxlSlNPTj4pOiBDYW5jZWxhYmxlIHtcbiAgICBjb25zdCBsb2FkZWQgPSBmdW5jdGlvbihlcnI6ID9FcnJvciwgdGlsZUpTT046ID9PYmplY3QpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAodGlsZUpTT04pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gcGljayhcbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBzb3VyY2Ugb3B0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBUaWxlSlNPTlxuICAgICAgICAgICAgICAgIGV4dGVuZCh0aWxlSlNPTiwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgWyd0aWxlcycsICdtaW56b29tJywgJ21heHpvb20nLCAnYXR0cmlidXRpb24nLCAnbWFwYm94X2xvZ28nLCAnYm91bmRzJywgJ3NjaGVtZScsICd0aWxlU2l6ZScsICdlbmNvZGluZyddXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAodGlsZUpTT04udmVjdG9yX2xheWVycykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC52ZWN0b3JMYXllcnMgPSB0aWxlSlNPTi52ZWN0b3JfbGF5ZXJzO1xuICAgICAgICAgICAgICAgIHJlc3VsdC52ZWN0b3JMYXllcklkcyA9IHJlc3VsdC52ZWN0b3JMYXllcnMubWFwKChsYXllcikgPT4geyByZXR1cm4gbGF5ZXIuaWQ7IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBvbmx5IGNhbm9uaWNhbGl6ZSB0aWxlIHRpbGVzZXQgaWYgc291cmNlIGlzIGRlY2xhcmVkIHVzaW5nIGEgdGlsZWpzb24gdXJsXG4gICAgICAgICAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudGlsZXMgPSByZXF1ZXN0TWFuYWdlci5jYW5vbmljYWxpemVUaWxlc2V0KHJlc3VsdCwgb3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgcmV0dXJuIGdldEpTT04ocmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChyZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTb3VyY2VVUkwob3B0aW9ucy51cmwpLCBSZXNvdXJjZVR5cGUuU291cmNlKSwgbG9hZGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYnJvd3Nlci5mcmFtZSgoKSA9PiBsb2FkZWQobnVsbCwgb3B0aW9ucykpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJztcbmltcG9ydCB7bWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdH0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQnO1xuXG5jbGFzcyBUaWxlQm91bmRzIHtcbiAgICBib3VuZHM6IExuZ0xhdEJvdW5kcztcbiAgICBtaW56b29tOiBudW1iZXI7XG4gICAgbWF4em9vbTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbWluem9vbTogP251bWJlciwgbWF4em9vbTogP251bWJlcikge1xuICAgICAgICB0aGlzLmJvdW5kcyA9IExuZ0xhdEJvdW5kcy5jb252ZXJ0KHRoaXMudmFsaWRhdGVCb3VuZHMoYm91bmRzKSk7XG4gICAgICAgIHRoaXMubWluem9vbSA9IG1pbnpvb20gfHwgMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gbWF4em9vbSB8fCAyNDtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUJvdW5kcyhib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYm91bmRzIHByb3BlcnR5IGNvbnRhaW5zIHZhbGlkIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGVzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShib3VuZHMpIHx8IGJvdW5kcy5sZW5ndGggIT09IDQpIHJldHVybiBbLTE4MCwgLTkwLCAxODAsIDkwXTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLm1heCgtMTgwLCBib3VuZHNbMF0pLCBNYXRoLm1heCgtOTAsIGJvdW5kc1sxXSksIE1hdGgubWluKDE4MCwgYm91bmRzWzJdKSwgTWF0aC5taW4oOTAsIGJvdW5kc1szXSldO1xuICAgIH1cblxuICAgIGNvbnRhaW5zKHRpbGVJRDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IHdvcmxkU2l6ZSA9IE1hdGgucG93KDIsIHRpbGVJRC56KTtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSB7XG4gICAgICAgICAgICBtaW5YOiBNYXRoLmZsb29yKG1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0V2VzdCgpKSAqIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICBtaW5ZOiBNYXRoLmZsb29yKG1lcmNhdG9yWWZyb21MYXQodGhpcy5ib3VuZHMuZ2V0Tm9ydGgoKSkgKiB3b3JsZFNpemUpLFxuICAgICAgICAgICAgbWF4WDogTWF0aC5jZWlsKG1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0RWFzdCgpKSAqIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICBtYXhZOiBNYXRoLmNlaWwobWVyY2F0b3JZZnJvbUxhdCh0aGlzLmJvdW5kcy5nZXRTb3V0aCgpKSAqIHdvcmxkU2l6ZSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGl0ID0gdGlsZUlELnggPj0gbGV2ZWwubWluWCAmJiB0aWxlSUQueCA8IGxldmVsLm1heFggJiYgdGlsZUlELnkgPj0gbGV2ZWwubWluWSAmJiB0aWxlSUQueSA8IGxldmVsLm1heFk7XG4gICAgICAgIHJldHVybiBoaXQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUaWxlQm91bmRzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgRXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuXG5pbXBvcnQgeyBleHRlbmQsIHBpY2sgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IGxvYWRUaWxlSlNPTiBmcm9tICcuL2xvYWRfdGlsZWpzb24nO1xuaW1wb3J0IHsgcG9zdFR1cm5zdGlsZUV2ZW50LCBwb3N0TWFwTG9hZEV2ZW50IH0gZnJvbSAnLi4vdXRpbC9tYXBib3gnO1xuaW1wb3J0IFRpbGVCb3VuZHMgZnJvbSAnLi90aWxlX2JvdW5kcyc7XG5pbXBvcnQgeyBSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB7IGNhY2hlRW50cnlQb3NzaWJseUFkZGVkIH0gZnJvbSAnLi4vdXRpbC90aWxlX3JlcXVlc3RfY2FjaGUnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZSc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XG5pbXBvcnQgdHlwZSB7VmVjdG9yU291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNsYXNzIFZlY3RvclRpbGVTb3VyY2UgZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcbiAgICB0eXBlOiAndmVjdG9yJztcbiAgICBpZDogc3RyaW5nO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgc2NoZW1lOiBzdHJpbmc7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcblxuICAgIF9vcHRpb25zOiBWZWN0b3JTb3VyY2VTcGVjaWZpY2F0aW9uO1xuICAgIF9jb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgICBtYXA6IE1hcDtcbiAgICBib3VuZHM6ID9bbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICB0aWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICB0aWxlQm91bmRzOiBUaWxlQm91bmRzO1xuICAgIHJlcGFyc2VPdmVyc2NhbGVkOiBib29sZWFuO1xuICAgIGlzVGlsZUNsaXBwZWQ6IGJvb2xlYW47XG4gICAgX3RpbGVKU09OUmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgX2xvYWRlZDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFZlY3RvclNvdXJjZVNwZWNpZmljYXRpb24gJiB7Y29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFufSwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgICAgdGhpcy50eXBlID0gJ3ZlY3Rvcic7XG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLnNjaGVtZSA9ICd4eXonO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1RpbGVDbGlwcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgZXh0ZW5kKHRoaXMsIHBpY2sob3B0aW9ucywgWyd1cmwnLCAnc2NoZW1lJywgJ3RpbGVTaXplJ10pKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IGV4dGVuZCh7IHR5cGU6ICd2ZWN0b3InIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IG9wdGlvbnMuY29sbGVjdFJlc291cmNlVGltaW5nO1xuXG4gICAgICAgIGlmICh0aGlzLnRpbGVTaXplICE9PSA1MTIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmVjdG9yIHRpbGUgc291cmNlcyBtdXN0IGhhdmUgYSB0aWxlU2l6ZSBvZiA1MTInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0RXZlbnRlZFBhcmVudChldmVudGVkUGFyZW50KTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBsb2FkVGlsZUpTT04odGhpcy5fb3B0aW9ucywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCAoZXJyLCB0aWxlSlNPTikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxlSlNPTikge1xuICAgICAgICAgICAgICAgIGV4dGVuZCh0aGlzLCB0aWxlSlNPTik7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGVKU09OLmJvdW5kcykgdGhpcy50aWxlQm91bmRzID0gbmV3IFRpbGVCb3VuZHModGlsZUpTT04uYm91bmRzLCB0aGlzLm1pbnpvb20sIHRoaXMubWF4em9vbSk7XG4gICAgICAgICAgICAgICAgcG9zdFR1cm5zdGlsZUV2ZW50KHRpbGVKU09OLnRpbGVzLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIuX2N1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICAgICAgICBwb3N0TWFwTG9hZEV2ZW50KHRpbGVKU09OLnRpbGVzLCB0aGlzLm1hcC5fZ2V0TWFwSWQoKSwgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9za3VUb2tlbiwgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9jdXN0b21BY2Nlc3NUb2tlbik7XG5cbiAgICAgICAgICAgICAgICAvLyBgY29udGVudGAgaXMgaW5jbHVkZWQgaGVyZSB0byBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYFN0eWxlI191cGRhdGVTb3VyY2VzYCBpcyBjYWxsZWRcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIFRpbGVKU09OIGFycml2ZXMuIHRoaXMgbWFrZXMgc3VyZSB0aGUgdGlsZXMgbmVlZGVkIGFyZSBsb2FkZWQgb25jZSBUaWxlSlNPTiBhcnJpdmVzXG4gICAgICAgICAgICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9wdWxsLzQzNDcjZGlzY3Vzc2lvbl9yMTA0NDE4MDg4XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnfSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ2NvbnRlbnQnfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgfVxuXG4gICAgaGFzVGlsZSh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnRpbGVCb3VuZHMgfHwgdGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHRpbGVJRC5jYW5vbmljYWwpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbGVKU09OUmVxdWVzdCkge1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgdGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVUaWxlVVJMKHRpbGUudGlsZUlELmNhbm9uaWNhbC51cmwodGhpcy50aWxlcywgdGhpcy5zY2hlbWUpLCB0aGlzLnVybCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlRpbGUpLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICB6b29tOiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplICogdGlsZS50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCksXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBwaXhlbFJhdGlvOiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IHRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlcyxcbiAgICAgICAgfTtcbiAgICAgICAgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nID0gdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nO1xuXG4gICAgICAgIGlmICghdGlsZS5hY3RvciB8fCB0aWxlLnN0YXRlID09PSAnZXhwaXJlZCcpIHtcbiAgICAgICAgICAgIHRpbGUuYWN0b3IgPSB0aGlzLmRpc3BhdGNoZXIuZ2V0QWN0b3IoKTtcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdCA9IHRpbGUuYWN0b3Iuc2VuZCgnbG9hZFRpbGUnLCBwYXJhbXMsIGRvbmUuYmluZCh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGlsZS5zdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICAvLyBzY2hlZHVsZSB0aWxlIHJlbG9hZGluZyBhZnRlciBpdCBoYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgICAgIHRpbGUucmVsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdCA9IHRpbGUuYWN0b3Iuc2VuZCgncmVsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXNvdXJjZVRpbWluZylcbiAgICAgICAgICAgICAgICB0aWxlLnJlc291cmNlVGltaW5nID0gZGF0YS5yZXNvdXJjZVRpbWluZztcblxuICAgICAgICAgICAgaWYgKHRoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzICYmIGRhdGEpIHRpbGUuc2V0RXhwaXJ5RGF0YShkYXRhKTtcbiAgICAgICAgICAgIHRpbGUubG9hZFZlY3RvckRhdGEoZGF0YSwgdGhpcy5tYXAucGFpbnRlcik7XG5cbiAgICAgICAgICAgIGNhY2hlRW50cnlQb3NzaWJseUFkZGVkKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5yZWxvYWRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFRpbGUodGlsZSwgdGlsZS5yZWxvYWRDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgdGlsZS5yZWxvYWRDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYm9ydFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICBpZiAodGlsZS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICB0aWxlLnJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlLmFjdG9yKSB7XG4gICAgICAgICAgICB0aWxlLmFjdG9yLnNlbmQoJ2Fib3J0VGlsZScsIHsgdWlkOiB0aWxlLnVpZCwgdHlwZTogdGhpcy50eXBlLCBzb3VyY2U6IHRoaXMuaWQgfSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgaWYgKHRpbGUuYWN0b3IpIHtcbiAgICAgICAgICAgIHRpbGUuYWN0b3Iuc2VuZCgncmVtb3ZlVGlsZScsIHsgdWlkOiB0aWxlLnVpZCwgdHlwZTogdGhpcy50eXBlLCBzb3VyY2U6IHRoaXMuaWQgfSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlY3RvclRpbGVTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBleHRlbmQsIHBpY2sgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgeyBnZXRJbWFnZSwgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCB7IEV2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkIH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBsb2FkVGlsZUpTT04gZnJvbSAnLi9sb2FkX3RpbGVqc29uJztcbmltcG9ydCB7IHBvc3RUdXJuc3RpbGVFdmVudCwgcG9zdE1hcExvYWRFdmVudCB9IGZyb20gJy4uL3V0aWwvbWFwYm94JztcbmltcG9ydCBUaWxlQm91bmRzIGZyb20gJy4vdGlsZV9ib3VuZHMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUnO1xuXG5pbXBvcnQgeyBjYWNoZUVudHJ5UG9zc2libHlBZGRlZCB9IGZyb20gJy4uL3V0aWwvdGlsZV9yZXF1ZXN0X2NhY2hlJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuaW1wb3J0IHR5cGUge1xuICAgIFJhc3RlclNvdXJjZVNwZWNpZmljYXRpb24sXG4gICAgUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgUmFzdGVyVGlsZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgaW1wbGVtZW50cyBTb3VyY2Uge1xuICAgIHR5cGU6ICdyYXN0ZXInIHwgJ3Jhc3Rlci1kZW0nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWluem9vbTogbnVtYmVyO1xuICAgIG1heHpvb206IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbiAgICBzY2hlbWU6IHN0cmluZztcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuXG4gICAgYm91bmRzOiA/W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgdGlsZUJvdW5kczogVGlsZUJvdW5kcztcbiAgICByb3VuZFpvb206IGJvb2xlYW47XG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgICBtYXA6IE1hcDtcbiAgICB0aWxlczogQXJyYXk8c3RyaW5nPjtcblxuICAgIF9sb2FkZWQ6IGJvb2xlYW47XG4gICAgX29wdGlvbnM6IFJhc3RlclNvdXJjZVNwZWNpZmljYXRpb24gfCBSYXN0ZXJERU1Tb3VyY2VTcGVjaWZpY2F0aW9uO1xuICAgIF90aWxlSlNPTlJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogUmFzdGVyU291cmNlU3BlY2lmaWNhdGlvbiB8IFJhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgdGhpcy50eXBlID0gJ3Jhc3Rlcic7XG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLnJvdW5kWm9vbSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NoZW1lID0gJ3h5eic7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoeyB0eXBlOiAncmFzdGVyJyB9LCBvcHRpb25zKTtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIHBpY2sob3B0aW9ucywgWyd1cmwnLCAnc2NoZW1lJywgJ3RpbGVTaXplJ10pKTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBsb2FkVGlsZUpTT04odGhpcy5fb3B0aW9ucywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCAoZXJyLCB0aWxlSlNPTikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxlSlNPTikge1xuICAgICAgICAgICAgICAgIGV4dGVuZCh0aGlzLCB0aWxlSlNPTik7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGVKU09OLmJvdW5kcykgdGhpcy50aWxlQm91bmRzID0gbmV3IFRpbGVCb3VuZHModGlsZUpTT04uYm91bmRzLCB0aGlzLm1pbnpvb20sIHRoaXMubWF4em9vbSk7XG5cbiAgICAgICAgICAgICAgICBwb3N0VHVybnN0aWxlRXZlbnQodGlsZUpTT04udGlsZXMpO1xuICAgICAgICAgICAgICAgIHBvc3RNYXBMb2FkRXZlbnQodGlsZUpTT04udGlsZXMsIHRoaXMubWFwLl9nZXRNYXBJZCgpLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIuX3NrdVRva2VuKTtcblxuICAgICAgICAgICAgICAgIC8vIGBjb250ZW50YCBpcyBpbmNsdWRlZCBoZXJlIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBgU3R5bGUjX3VwZGF0ZVNvdXJjZXNgIGlzIGNhbGxlZFxuICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgVGlsZUpTT04gYXJyaXZlcy4gdGhpcyBtYWtlcyBzdXJlIHRoZSB0aWxlcyBuZWVkZWQgYXJlIGxvYWRlZCBvbmNlIFRpbGVKU09OIGFycml2ZXNcbiAgICAgICAgICAgICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL3B1bGwvNDM0NyNkaXNjdXNzaW9uX3IxMDQ0MTgwODhcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YSd9KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZDtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xuICAgIH1cblxuICAgIGhhc1RpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0aWxlSUQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHRoaXMudXJsLCB0aGlzLnRpbGVTaXplKTtcbiAgICAgICAgdGlsZS5yZXF1ZXN0ID0gZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuVGlsZSksIChlcnIsIGltZykgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcblxuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGltZykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5fcmVmcmVzaEV4cGlyZWRUaWxlcykgdGlsZS5zZXRFeHBpcnlEYXRhKGltZyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIChpbWc6IGFueSkuY2FjaGVDb250cm9sO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAoaW1nOiBhbnkpLmV4cGlyZXM7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLm1hcC5wYWludGVyLmdldFRpbGVUZXh0dXJlKGltZy53aWR0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUudXBkYXRlKGltZywgeyB1c2VNaXBtYXA6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgaW1nLCBnbC5SR0JBLCB7IHVzZU1pcG1hcDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyZihnbC5URVhUVVJFXzJELCBjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuXG4gICAgICAgICAgICAgICAgY2FjaGVFbnRyeVBvc3NpYmx5QWRkZWQodGhpcy5kaXNwYXRjaGVyKTtcblxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhYm9ydFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGlmICh0aWxlLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBpZiAodGlsZS50ZXh0dXJlKSB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0aWxlLnRleHR1cmUpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlclRpbGVTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBnZXRJbWFnZSwgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgeyBPdmVyc2NhbGVkVGlsZUlEIH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCBSYXN0ZXJUaWxlU291cmNlIGZyb20gJy4vcmFzdGVyX3RpbGVfc291cmNlJztcbi8vIGVuc3VyZSBERU1EYXRhIGlzIHJlZ2lzdGVyZWQgZm9yIHdvcmtlciB0cmFuc2ZlciBvbiBtYWluIHRocmVhZDpcbmltcG9ydCAnLi4vZGF0YS9kZW1fZGF0YSc7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUge1Jhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBSYXN0ZXJERU1UaWxlU291cmNlIGV4dGVuZHMgUmFzdGVyVGlsZVNvdXJjZSBpbXBsZW1lbnRzIFNvdXJjZSB7XG4gICAgZW5jb2Rpbmc6IFwibWFwYm94XCIgfCBcInRlcnJhcml1bVwiO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvbiwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdyYXN0ZXItZGVtJztcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoeyB0eXBlOiAncmFzdGVyLWRlbScgfSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nIHx8IFwibWFwYm94XCI7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3Jhc3Rlci1kZW0nLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgdGlsZXM6IHRoaXMudGlsZXMsXG4gICAgICAgICAgICBib3VuZHM6IHRoaXMuYm91bmRzLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHRoaXMudXJsLCB0aGlzLnRpbGVTaXplKTtcbiAgICAgICAgdGlsZS5yZXF1ZXN0ID0gZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuVGlsZSksIGltYWdlTG9hZGVkLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRpbGUubmVpZ2hib3JpbmdUaWxlcyA9IHRoaXMuX2dldE5laWdoYm9yaW5nVGlsZXModGlsZS50aWxlSUQpO1xuICAgICAgICBmdW5jdGlvbiBpbWFnZUxvYWRlZChlcnIsIGltZykge1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMpIHRpbGUuc2V0RXhwaXJ5RGF0YShpbWcpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAoaW1nOiBhbnkpLmNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgICAgICBkZWxldGUgKGltZzogYW55KS5leHBpcmVzO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmF3SW1hZ2VEYXRhID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkOiB0aWxlLnRpbGVJRCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICByYXdJbWFnZURhdGEsXG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiB0aGlzLmVuY29kaW5nXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICghdGlsZS5hY3RvciB8fCB0aWxlLnN0YXRlID09PSAnZXhwaXJlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5hY3RvciA9IHRoaXMuZGlzcGF0Y2hlci5nZXRBY3RvcigpO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmFjdG9yLnNlbmQoJ2xvYWRERU1UaWxlJywgcGFyYW1zLCBkb25lLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCBkZW0pIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZW0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLmRlbSA9IGRlbTtcbiAgICAgICAgICAgICAgICB0aWxlLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2dldE5laWdoYm9yaW5nVGlsZXModGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IHRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGRpbSA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KTtcblxuICAgICAgICBjb25zdCBweCA9IChjYW5vbmljYWwueCAtIDEgKyBkaW0pICUgZGltO1xuICAgICAgICBjb25zdCBweHcgPSBjYW5vbmljYWwueCA9PT0gMCA/IHRpbGVJRC53cmFwIC0gMSA6IHRpbGVJRC53cmFwO1xuICAgICAgICBjb25zdCBueCA9IChjYW5vbmljYWwueCArIDEgKyBkaW0pICUgZGltO1xuICAgICAgICBjb25zdCBueHcgPSBjYW5vbmljYWwueCArIDEgPT09IGRpbSA/IHRpbGVJRC53cmFwICsgMSA6IHRpbGVJRC53cmFwO1xuXG4gICAgICAgIGNvbnN0IG5laWdoYm9yaW5nVGlsZXMgPSB7fTtcbiAgICAgICAgLy8gYWRkIGFkamFjZW50IHRpbGVzXG4gICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBweHcsIGNhbm9uaWNhbC56LCBweCwgY2Fub25pY2FsLnkpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgbnh3LCBjYW5vbmljYWwueiwgbngsIGNhbm9uaWNhbC55KS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcblxuICAgICAgICAvLyBBZGQgdXBwZXIgbmVpZ2hib3JpbmdUaWxlc1xuICAgICAgICBpZiAoY2Fub25pY2FsLnkgPiAwKSB7XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55IC0gMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgdGlsZUlELndyYXAsIGNhbm9uaWNhbC56LCBjYW5vbmljYWwueCwgY2Fub25pY2FsLnkgLSAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBueHcsIGNhbm9uaWNhbC56LCBueCwgY2Fub25pY2FsLnkgLSAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgbG93ZXIgbmVpZ2hib3JpbmdUaWxlc1xuICAgICAgICBpZiAoY2Fub25pY2FsLnkgKyAxIDwgZGltKSB7XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55ICsgMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgdGlsZUlELndyYXAsIGNhbm9uaWNhbC56LCBjYW5vbmljYWwueCwgY2Fub25pY2FsLnkgKyAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBueHcsIGNhbm9uaWNhbC56LCBueCwgY2Fub25pY2FsLnkgKyAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZWlnaGJvcmluZ1RpbGVzO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICBpZiAodGlsZS5kZW1UZXh0dXJlKSB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0aWxlLmRlbVRleHR1cmUpO1xuICAgICAgICBpZiAodGlsZS5mYm8pIHtcbiAgICAgICAgICAgIHRpbGUuZmJvLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLmZibztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZS5kZW0pIGRlbGV0ZSB0aWxlLmRlbTtcbiAgICAgICAgZGVsZXRlIHRpbGUubmVpZ2hib3JpbmdUaWxlcztcblxuICAgICAgICB0aWxlLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgICAgaWYgKHRpbGUuYWN0b3IpIHtcbiAgICAgICAgICAgIHRpbGUuYWN0b3Iuc2VuZCgncmVtb3ZlREVNVGlsZScsIHsgdWlkOiB0aWxlLnVpZCwgc291cmNlOiB0aGlzLmlkIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlckRFTVRpbGVTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCB7IFJlc291cmNlVHlwZSB9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZSc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3InO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTiwgR2VvSlNPTkZlYXR1cmV9IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTlNvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG4vKipcbiAqIEEgc291cmNlIGNvbnRhaW5pbmcgR2VvSlNPTi5cbiAqIChTZWUgdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzLWdlb2pzb24pIGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIG9wdGlvbnMuKVxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywge1xuICogICAgIHR5cGU6ICdnZW9qc29uJyxcbiAqICAgICBkYXRhOiAnaHR0cHM6Ly9kMmFkNmI0dXI3eXZwcS5jbG91ZGZyb250Lm5ldC9uYXR1cmFsZWFydGgtMy4zLjAvbmVfMTBtX3BvcnRzLmdlb2pzb24nXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICdnZW9qc29uJyxcbiAqICAgIGRhdGE6IHtcbiAqICAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICogICAgICAgIFwiZmVhdHVyZXNcIjogW3tcbiAqICAgICAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICogICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge30sXG4gKiAgICAgICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogW1xuICogICAgICAgICAgICAgICAgICAgIC03Ni41MzA2MzI5NzI3MTcyOSxcbiAqICAgICAgICAgICAgICAgICAgICAzOS4xODE3NDA3Nzk5NDEwOFxuICogICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICB9XG4gKiAgICAgICAgfV1cbiAqICAgIH1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuZ2V0U291cmNlKCdzb21lIGlkJykuc2V0RGF0YSh7XG4gKiAgIFwidHlwZVwiOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gKiAgIFwiZmVhdHVyZXNcIjogW3tcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7IFwibmFtZVwiOiBcIk51bGwgSXNsYW5kXCIgfSxcbiAqICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gKiAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbIDAsIDAgXVxuICogICAgICAgfVxuICogICB9XVxuICogfSk7XG4gKiBAc2VlIFtEcmF3IEdlb0pTT04gcG9pbnRzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dlb2pzb24tbWFya2Vycy8pXG4gKiBAc2VlIFtBZGQgYSBHZW9KU09OIGxpbmVdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2VvanNvbi1saW5lLylcbiAqIEBzZWUgW0NyZWF0ZSBhIGhlYXRtYXAgZnJvbSBwb2ludHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaGVhdG1hcC8pXG4gKiBAc2VlIFtDcmVhdGUgYW5kIHN0eWxlIGNsdXN0ZXJzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NsdXN0ZXIvKVxuICovXG5jbGFzcyBHZW9KU09OU291cmNlIGV4dGVuZHMgRXZlbnRlZCBpbXBsZW1lbnRzIFNvdXJjZSB7XG4gICAgdHlwZTogJ2dlb2pzb24nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWluem9vbTogbnVtYmVyO1xuICAgIG1heHpvb206IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIGF0dHJpYnV0aW9uOiBzdHJpbmc7XG5cbiAgICBpc1RpbGVDbGlwcGVkOiBib29sZWFuO1xuICAgIHJlcGFyc2VPdmVyc2NhbGVkOiBib29sZWFuO1xuICAgIF9kYXRhOiBHZW9KU09OIHwgc3RyaW5nO1xuICAgIF9vcHRpb25zOiBhbnk7XG4gICAgd29ya2VyT3B0aW9uczogYW55O1xuICAgIG1hcDogTWFwO1xuICAgIGFjdG9yOiBBY3RvcjtcbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIF9jb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XG4gICAgX3Jlc291cmNlVGltaW5nOiBBcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPjtcbiAgICBfcmVtb3ZlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogR2VvSlNPTlNvdXJjZVNwZWNpZmljYXRpb24gJiB7d29ya2VyT3B0aW9ucz86IGFueSwgY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFufSwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcblxuICAgICAgICAvLyBgdHlwZWAgaXMgYSBwcm9wZXJ0eSByYXRoZXIgdGhhbiBhIGNvbnN0YW50IHRvIG1ha2UgaXQgZWFzeSBmb3IgM3JkXG4gICAgICAgIC8vIHBhcnRpZXMgdG8gdXNlIEdlb0pTT05Tb3VyY2UgdG8gYnVpbGQgdGhlaXIgb3duIHNvdXJjZSB0eXBlcy5cbiAgICAgICAgdGhpcy50eXBlID0gJ2dlb2pzb24nO1xuXG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDE4O1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLmlzVGlsZUNsaXBwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmFjdG9yID0gZGlzcGF0Y2hlci5nZXRBY3RvcigpO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IChvcHRpb25zLmRhdGE6IGFueSk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IG9wdGlvbnMuY29sbGVjdFJlc291cmNlVGltaW5nO1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVRpbWluZyA9IFtdO1xuXG4gICAgICAgIGlmIChvcHRpb25zLm1heHpvb20gIT09IHVuZGVmaW5lZCkgdGhpcy5tYXh6b29tID0gb3B0aW9ucy5tYXh6b29tO1xuICAgICAgICBpZiAob3B0aW9ucy50eXBlKSB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0aW9uKSB0aGlzLmF0dHJpYnV0aW9uID0gb3B0aW9ucy5hdHRyaWJ1dGlvbjtcblxuICAgICAgICBjb25zdCBzY2FsZSA9IEVYVEVOVCAvIHRoaXMudGlsZVNpemU7XG5cbiAgICAgICAgLy8gc2VudCB0byB0aGUgd29ya2VyLCBhbG9uZyB3aXRoIGB1cmw6IC4uLmAgb3IgYGRhdGE6IGxpdGVyYWwgZ2VvanNvbmAsXG4gICAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGxvYWQvcGFyc2UvaW5kZXggdGhlIGdlb2pzb24gZGF0YVxuICAgICAgICAvLyBleHRlbmRpbmcgd2l0aCBgb3B0aW9ucy53b3JrZXJPcHRpb25zYCBoZWxwcyB0byBtYWtlIGl0IGVhc3kgZm9yXG4gICAgICAgIC8vIHRoaXJkLXBhcnR5IHNvdXJjZXMgdG8gaGFjay9yZXVzZSBHZW9KU09OU291cmNlLlxuICAgICAgICB0aGlzLndvcmtlck9wdGlvbnMgPSBleHRlbmQoe1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgY2x1c3Rlcjogb3B0aW9ucy5jbHVzdGVyIHx8IGZhbHNlLFxuICAgICAgICAgICAgZ2VvanNvblZ0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcjogKG9wdGlvbnMuYnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJ1ZmZlciA6IDEyOCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICB0b2xlcmFuY2U6IChvcHRpb25zLnRvbGVyYW5jZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy50b2xlcmFuY2UgOiAwLjM3NSkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICBleHRlbnQ6IEVYVEVOVCxcbiAgICAgICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICAgICAgbGluZU1ldHJpY3M6IG9wdGlvbnMubGluZU1ldHJpY3MgfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVJZDogb3B0aW9ucy5nZW5lcmF0ZUlkIHx8IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3VwZXJjbHVzdGVyT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIG1heFpvb206IG9wdGlvbnMuY2x1c3Rlck1heFpvb20gIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgICAgIE1hdGgubWluKG9wdGlvbnMuY2x1c3Rlck1heFpvb20sIHRoaXMubWF4em9vbSAtIDEpIDpcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubWF4em9vbSAtIDEpLFxuICAgICAgICAgICAgICAgIGV4dGVudDogRVhURU5ULFxuICAgICAgICAgICAgICAgIHJhZGl1czogKG9wdGlvbnMuY2x1c3RlclJhZGl1cyB8fCA1MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICBsb2c6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2x1c3RlclByb3BlcnRpZXM6IG9wdGlvbnMuY2x1c3RlclByb3BlcnRpZXNcbiAgICAgICAgfSwgb3B0aW9ucy53b3JrZXJPcHRpb25zKTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVdvcmtlckRhdGEoKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGE6IE9iamVjdCA9IHsgZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJyB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJiB0aGlzLl9yZXNvdXJjZVRpbWluZyAmJiAodGhpcy5fcmVzb3VyY2VUaW1pbmcubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnJlc291cmNlVGltaW5nID0gdGhpcy5fcmVzb3VyY2VUaW1pbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWx0aG91Z2ggR2VvSlNPTiBzb3VyY2VzIGNvbnRhaW4gbm8gbWV0YWRhdGEsIHdlIGZpcmUgdGhpcyBldmVudCB0byBsZXQgdGhlIFNvdXJjZUNhY2hlXG4gICAgICAgICAgICAvLyBrbm93IGl0cyBvayB0byBzdGFydCByZXF1ZXN0aW5nIHRpbGVzLlxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIGRhdGEpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIEdlb0pTT04gZGF0YSBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBkYXRhIEEgR2VvSlNPTiBkYXRhIG9iamVjdCBvciBhIFVSTCB0byBvbmUuIFRoZSBsYXR0ZXIgaXMgcHJlZmVyYWJsZSBpbiB0aGUgY2FzZSBvZiBsYXJnZSBHZW9KU09OIGZpbGVzLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgc2V0RGF0YShkYXRhOiBHZW9KU09OIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVdvcmtlckRhdGEoKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGE6IE9iamVjdCA9IHsgZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ2NvbnRlbnQnIH07XG4gICAgICAgICAgICBpZiAodGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nICYmIHRoaXMuX3Jlc291cmNlVGltaW5nICYmICh0aGlzLl9yZXNvdXJjZVRpbWluZy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIGRhdGEucmVzb3VyY2VUaW1pbmcgPSB0aGlzLl9yZXNvdXJjZVRpbWluZztcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvdXJjZVRpbWluZyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIGRhdGEpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGNsdXN0ZXJlZCBzb3VyY2VzLCBmZXRjaGVzIHRoZSB6b29tIGF0IHdoaWNoIHRoZSBnaXZlbiBjbHVzdGVyIGV4cGFuZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2x1c3RlcklkIFRoZSB2YWx1ZSBvZiB0aGUgY2x1c3RlcidzIGBjbHVzdGVyX2lkYCBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgem9vbSB2YWx1ZSBpcyByZXRyaWV2ZWQgKGAoZXJyb3IsIHpvb20pID0+IHsgLi4uIH1gKS5cbiAgICAgKiBAcmV0dXJucyB7R2VvSlNPTlNvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIGdldENsdXN0ZXJFeHBhbnNpb25ab29tKGNsdXN0ZXJJZDogbnVtYmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8bnVtYmVyPikge1xuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoJ2dlb2pzb24uZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20nLCB7IGNsdXN0ZXJJZCwgc291cmNlOiB0aGlzLmlkIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGNsdXN0ZXJlZCBzb3VyY2VzLCBmZXRjaGVzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2x1c3RlciBvbiB0aGUgbmV4dCB6b29tIGxldmVsIChhcyBhbiBhcnJheSBvZiBHZW9KU09OIGZlYXR1cmVzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbHVzdGVySWQgVGhlIHZhbHVlIG9mIHRoZSBjbHVzdGVyJ3MgYGNsdXN0ZXJfaWRgIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmZWF0dXJlcyBhcmUgcmV0cmlldmVkIChgKGVycm9yLCBmZWF0dXJlcykgPT4geyAuLi4gfWApLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgZ2V0Q2x1c3RlckNoaWxkcmVuKGNsdXN0ZXJJZDogbnVtYmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8QXJyYXk8R2VvSlNPTkZlYXR1cmU+Pikge1xuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoJ2dlb2pzb24uZ2V0Q2x1c3RlckNoaWxkcmVuJywgeyBjbHVzdGVySWQsIHNvdXJjZTogdGhpcy5pZCB9LCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjbHVzdGVyZWQgc291cmNlcywgZmV0Y2hlcyB0aGUgb3JpZ2luYWwgcG9pbnRzIHRoYXQgYmVsb25nIHRvIHRoZSBjbHVzdGVyIChhcyBhbiBhcnJheSBvZiBHZW9KU09OIGZlYXR1cmVzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbHVzdGVySWQgVGhlIHZhbHVlIG9mIHRoZSBjbHVzdGVyJ3MgYGNsdXN0ZXJfaWRgIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdG8gcmV0dXJuLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG51bWJlciBvZiBmZWF0dXJlcyB0byBza2lwIChlLmcuIGZvciBwYWdpbmF0aW9uKS5cbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZmVhdHVyZXMgYXJlIHJldHJpZXZlZCAoYChlcnJvciwgZmVhdHVyZXMpID0+IHsgLi4uIH1gKS5cbiAgICAgKiBAcmV0dXJucyB7R2VvSlNPTlNvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIGdldENsdXN0ZXJMZWF2ZXMoY2x1c3RlcklkOiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8QXJyYXk8R2VvSlNPTkZlYXR1cmU+Pikge1xuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoJ2dlb2pzb24uZ2V0Q2x1c3RlckxlYXZlcycsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGNsdXN0ZXJJZCxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgb2Zmc2V0XG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgV29ya2VyU291cmNlJ3MgZ2VvanNvbi5sb2FkRGF0YSB0YXJnZXQsIHdoaWNoXG4gICAgICogaGFuZGxlcyBsb2FkaW5nIHRoZSBnZW9qc29uIGRhdGEgYW5kIHByZXBhcmluZyB0byBzZXJ2ZSBpdCB1cCBhcyB0aWxlcyxcbiAgICAgKiB1c2luZyBnZW9qc29uLXZ0IG9yIHN1cGVyY2x1c3RlciBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKi9cbiAgICBfdXBkYXRlV29ya2VyRGF0YShjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBleHRlbmQoe30sIHRoaXMud29ya2VyT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kYXRhO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnJlcXVlc3QgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChicm93c2VyLnJlc29sdmVVUkwoZGF0YSksIFJlc291cmNlVHlwZS5Tb3VyY2UpO1xuICAgICAgICAgICAgb3B0aW9ucy5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9IHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFyZ2V0IHt0aGlzLnR5cGV9LmxvYWREYXRhIHJhdGhlciB0aGFuIGxpdGVyYWxseSBnZW9qc29uLmxvYWREYXRhLFxuICAgICAgICAvLyBzbyB0aGF0IG90aGVyIGdlb2pzb24tbGlrZSBzb3VyY2UgdHlwZXMgY2FuIGVhc2lseSByZXVzZSB0aGlzXG4gICAgICAgIC8vIGltcGxlbWVudGF0aW9uXG4gICAgICAgIHRoaXMuYWN0b3Iuc2VuZChgJHt0aGlzLnR5cGV9LmxvYWREYXRhYCwgb3B0aW9ucywgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVtb3ZlZCB8fCAocmVzdWx0ICYmIHJlc3VsdC5hYmFuZG9uZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5yZXNvdXJjZVRpbWluZyAmJiByZXN1bHQucmVzb3VyY2VUaW1pbmdbdGhpcy5pZF0pXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgPSByZXN1bHQucmVzb3VyY2VUaW1pbmdbdGhpcy5pZF0uc2xpY2UoMCk7XG4gICAgICAgICAgICAvLyBBbnkgYGxvYWREYXRhYCBjYWxscyB0aGF0IHBpbGVkIHVwIHdoaWxlIHdlIHdlcmUgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgLy8gdGhpcyBvbmUgd2lsbCBnZXQgY29hbGVzY2VkIGludG8gYSBzaW5nbGUgY2FsbCB3aGVuIHRoaXNcbiAgICAgICAgICAgIC8vICdjb2FsZXNjZScgbWVzc2FnZSBpcyBwcm9jZXNzZWQuXG4gICAgICAgICAgICAvLyBXZSB3b3VsZCBzZWxmLXNlbmQgZnJvbSB0aGUgd29ya2VyIGlmIHdlIGhhZCBhY2Nlc3MgdG8gaXRzXG4gICAgICAgICAgICAvLyBtZXNzYWdlIHF1ZXVlLiBXYWl0aW5nIGluc3RlYWQgZm9yIHRoZSAnY29hbGVzY2UnIHRvIHJvdW5kLXRyaXBcbiAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGZvcmVncm91bmQganVzdCBtZWFucyB3ZSdyZSB0aHJvdHRsaW5nIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIC8vIHRvIHJ1biBhdCBhIGxpdHRsZSBsZXNzIHRoYW4gZnVsbC10aHJvdHRsZS5cbiAgICAgICAgICAgIHRoaXMuYWN0b3Iuc2VuZChgJHt0aGlzLnR5cGV9LmNvYWxlc2NlYCwgeyBzb3VyY2U6IG9wdGlvbnMuc291cmNlIH0sIG51bGwpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gIXRpbGUuYWN0b3IgPyAnbG9hZFRpbGUnIDogJ3JlbG9hZFRpbGUnO1xuICAgICAgICB0aWxlLmFjdG9yID0gdGhpcy5hY3RvcjtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICB6b29tOiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgcGl4ZWxSYXRpbzogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzOiB0aGlzLm1hcC5zaG93Q29sbGlzaW9uQm94ZXNcbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLnJlcXVlc3QgPSB0aGlzLmFjdG9yLnNlbmQobWVzc2FnZSwgcGFyYW1zLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuICAgICAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5sb2FkVmVjdG9yRGF0YShkYXRhLCB0aGlzLm1hcC5wYWludGVyLCBtZXNzYWdlID09PSAncmVsb2FkVGlsZScpO1xuXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFib3J0VGlsZSh0aWxlOiBUaWxlKSB7XG4gICAgICAgIGlmICh0aWxlLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5hYm9ydGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG4gICAgICAgIHRoaXMuYWN0b3Iuc2VuZCgncmVtb3ZlVGlsZScsIHsgdWlkOiB0aWxlLnVpZCwgdHlwZTogdGhpcy50eXBlLCBzb3VyY2U6IHRoaXMuaWQgfSk7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoJ3JlbW92ZVNvdXJjZScsIHsgdHlwZTogdGhpcy50eXBlLCBzb3VyY2U6IHRoaXMuaWQgfSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCB0aGlzLl9vcHRpb25zLCB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9kYXRhXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb0pTT05Tb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBDYW5vbmljYWxUaWxlSUQgfSBmcm9tICcuL3RpbGVfaWQnO1xuaW1wb3J0IHsgRXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHsgZ2V0SW1hZ2UsIFJlc291cmNlVHlwZSB9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCB7IFJhc3RlckJvdW5kc0FycmF5IH0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5pbXBvcnQgcmFzdGVyQm91bmRzQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZSc7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB0eXBlIHtDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9ufSBmcm9tICcuL2NhbnZhc19zb3VyY2UnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4uL3V0aWwvZGlzcGF0Y2hlcic7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIHtcbiAgICBJbWFnZVNvdXJjZVNwZWNpZmljYXRpb24sXG4gICAgVmlkZW9Tb3VyY2VTcGVjaWZpY2F0aW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG50eXBlIENvb3JkaW5hdGVzID0gW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dO1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyBhbiBpbWFnZS5cbiAqIChTZWUgdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzLWltYWdlKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICdpbWFnZScsXG4gKiAgICB1cmw6ICdodHRwczovL3d3dy5tYXBib3guY29tL2ltYWdlcy9mb28ucG5nJyxcbiAqICAgIGNvb3JkaW5hdGVzOiBbXG4gKiAgICAgICAgWy03Ni41NCwgMzkuMThdLFxuICogICAgICAgIFstNzYuNTIsIDM5LjE4XSxcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xN10sXG4gKiAgICAgICAgWy03Ni41NCwgMzkuMTddXG4gKiAgICBdXG4gKiB9KTtcbiAqXG4gKiAvLyB1cGRhdGUgY29vcmRpbmF0ZXNcbiAqIHZhciBteVNvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKTtcbiAqIG15U291cmNlLnNldENvb3JkaW5hdGVzKFtcbiAqICAgICBbLTc2LjU0MzM1NzM3MjI4Mzk0LCAzOS4xODU3OTkwNzIyOTc0OF0sXG4gKiAgICAgWy03Ni41MjgwMzY1OTQzOTA4NywgMzkuMTgzODM2NDg0NzU4N10sXG4gKiAgICAgWy03Ni41Mjk1Mzg2MzE0MzkyLCAzOS4xNzY4MzM5MjUwNzYwNl0sXG4gKiAgICAgWy03Ni41NDUyMDI3MzIwODYxOCwgMzkuMTc4NzYzNDQxMDY2NDJdXG4gKiBdKTtcbiAqXG4gKiAvLyB1cGRhdGUgdXJsIGFuZCBjb29yZGluYXRlcyBzaW11bHRhbmVvdXNseVxuICogbXlTb3VyY2UudXBkYXRlSW1hZ2Uoe1xuICogICAgdXJsOiAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9pbWFnZXMvYmFyLnBuZycsXG4gKiAgICBjb29yZGluYXRlczogW1xuICogICAgICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICAgICBbLTc2LjUyODAzNjU5NDM5MDg3LCAzOS4xODM4MzY0ODQ3NTg3XSxcbiAqICAgICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqICAgIF1cbiAqIH0pXG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKiBAc2VlIFtBZGQgYW4gaW1hZ2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaW1hZ2Utb24tYS1tYXAvKVxuICovXG5jbGFzcyBJbWFnZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgaW1wbGVtZW50cyBTb3VyY2Uge1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBpZDogc3RyaW5nO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcblxuICAgIGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcztcbiAgICB0aWxlczoge1tzdHJpbmddOiBUaWxlfTtcbiAgICBvcHRpb25zOiBhbnk7XG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgICBtYXA6IE1hcDtcbiAgICB0ZXh0dXJlOiBUZXh0dXJlIHwgbnVsbDtcbiAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudDtcbiAgICB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRDtcbiAgICBfYm91bmRzQXJyYXk6IFJhc3RlckJvdW5kc0FycmF5O1xuICAgIGJvdW5kc0J1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIGJvdW5kc1NlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIF9sb2FkZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IEltYWdlU291cmNlU3BlY2lmaWNhdGlvbiB8IFZpZGVvU291cmNlU3BlY2lmaWNhdGlvbiB8IENhbnZhc1NvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gb3B0aW9ucy5jb29yZGluYXRlcztcblxuICAgICAgICB0aGlzLnR5cGUgPSAnaW1hZ2UnO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSAwO1xuICAgICAgICB0aGlzLm1heHpvb20gPSAyMjtcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBsb2FkKG5ld0Nvb3JkaW5hdGVzPzogQ29vcmRpbmF0ZXMsIHN1Y2Nlc3NDYWxsYmFjaz86ICgpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcblxuICAgICAgICB0aGlzLnVybCA9IHRoaXMub3B0aW9ucy51cmw7XG5cbiAgICAgICAgZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodGhpcy51cmwsIFJlc291cmNlVHlwZS5JbWFnZSksIChlcnIsIGltYWdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Nvb3JkaW5hdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBuZXdDb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoTG9hZGluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgaW1hZ2UgVVJMIGFuZCwgb3B0aW9uYWxseSwgdGhlIGNvb3JkaW5hdGVzLiBUbyBhdm9pZCBoYXZpbmcgdGhlIGltYWdlIGZsYXNoIGFmdGVyIGNoYW5naW5nLFxuICAgICAqIHNldCB0aGUgYHJhc3Rlci1mYWRlLWR1cmF0aW9uYCBwYWludCBwcm9wZXJ0eSBvbiB0aGUgcmFzdGVyIGxheWVyIHRvIDAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy51cmxdIFJlcXVpcmVkIGltYWdlIFVSTC5cbiAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSBbb3B0aW9ucy5jb29yZGluYXRlc10gRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIGltYWdlLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtJbWFnZVNvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIHVwZGF0ZUltYWdlKG9wdGlvbnM6IHt1cmw6IHN0cmluZywgY29vcmRpbmF0ZXM/OiBDb29yZGluYXRlc30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlIHx8ICFvcHRpb25zLnVybCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLmxvYWQob3B0aW9ucy5jb29yZGluYXRlcywgKCkgPT4geyB0aGlzLnRleHR1cmUgPSBudWxsOyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX2ZpbmlzaExvYWRpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ30pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpbWFnZSdzIGNvb3JkaW5hdGVzIGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyxcbiAgICAgKiAgIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIG51bWJlcnMsIHdoaWNoIGRlZmluZSB0aGUgY29ybmVycyBvZiB0aGUgaW1hZ2UuXG4gICAgICogICBUaGUgY29vcmRpbmF0ZXMgc3RhcnQgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UgYW5kIHByb2NlZWQgaW4gY2xvY2t3aXNlIG9yZGVyLlxuICAgICAqICAgVGhleSBkbyBub3QgaGF2ZSB0byByZXByZXNlbnQgYSByZWN0YW5nbGUuXG4gICAgICogQHJldHVybnMge0ltYWdlU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgc2V0Q29vcmRpbmF0ZXMoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzKSB7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcztcblxuICAgICAgICAvLyBDYWxjdWxhdGUgd2hpY2ggbWVyY2F0b3IgdGlsZSBpcyBzdWl0YWJsZSBmb3IgcmVuZGVyaW5nIHRoZSB2aWRlbyBpblxuICAgICAgICAvLyBhbmQgY3JlYXRlIGEgYnVmZmVyIHdpdGggdGhlIGNvcm5lciBjb29yZGluYXRlcy4gVGhlc2UgY29vcmRpbmF0ZXNcbiAgICAgICAgLy8gbWF5IGJlIG91dHNpZGUgdGhlIHRpbGUsIGJlY2F1c2UgcmFzdGVyIHRpbGVzIGFyZW4ndCBjbGlwcGVkIHdoZW4gcmVuZGVyaW5nLlxuXG4gICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgZ2VvIGNvb3JkaW5hdGVzIGludG8gKHpvb20gMCkgdGlsZSBzcGFjZSBjb29yZGluYXRlc1xuICAgICAgICBjb25zdCBjb3JuZXJDb29yZHMgPSBjb29yZGluYXRlcy5tYXAoTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQpO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0aWxlIHdlJ2xsIHVzZSB0byBob2xkIHRoaXMgaW1hZ2Unc1xuICAgICAgICAvLyByZW5kZXIgZGF0YVxuICAgICAgICB0aGlzLnRpbGVJRCA9IGdldENvb3JkaW5hdGVzQ2VudGVyVGlsZUlEKGNvcm5lckNvb3Jkcyk7XG5cbiAgICAgICAgLy8gQ29uc3RyYWluIG1pbi9tYXggem9vbSB0byBvdXIgdGlsZSdzIHpvb20gbGV2ZWwgaW4gb3JkZXIgdG8gZm9yY2VcbiAgICAgICAgLy8gU291cmNlQ2FjaGUgdG8gcmVxdWVzdCB0aGlzIHRpbGUgKG5vIG1hdHRlciB3aGF0IHRoZSBtYXAncyB6b29tXG4gICAgICAgIC8vIGxldmVsKVxuICAgICAgICB0aGlzLm1pbnpvb20gPSB0aGlzLm1heHpvb20gPSB0aGlzLnRpbGVJRC56O1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgY29ybmVyIGNvb3JkaW5hdGVzIGludG8gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2Ygb3VyXG4gICAgICAgIC8vIHRpbGUuXG4gICAgICAgIGNvbnN0IHRpbGVDb29yZHMgPSBjb3JuZXJDb29yZHMubWFwKChjb29yZCkgPT4gdGhpcy50aWxlSUQuZ2V0VGlsZVBvaW50KGNvb3JkKS5fcm91bmQoKSk7XG5cbiAgICAgICAgdGhpcy5fYm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGlsZUNvb3Jkc1swXS54LCB0aWxlQ29vcmRzWzBdLnksIDAsIDApO1xuICAgICAgICB0aGlzLl9ib3VuZHNBcnJheS5lbXBsYWNlQmFjayh0aWxlQ29vcmRzWzFdLngsIHRpbGVDb29yZHNbMV0ueSwgRVhURU5ULCAwKTtcbiAgICAgICAgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGlsZUNvb3Jkc1szXS54LCB0aWxlQ29vcmRzWzNdLnksIDAsIEVYVEVOVCk7XG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRpbGVDb29yZHNbMl0ueCwgdGlsZUNvb3Jkc1syXS55LCBFWFRFTlQsIEVYVEVOVCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ib3VuZHNCdWZmZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOidzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ2NvbnRlbnQnfSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoID09PSAwIHx8ICF0aGlzLmltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kc0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLl9ib3VuZHNBcnJheSwgcmFzdGVyQm91bmRzQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNTZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmltYWdlLCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHcgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMudGlsZXNbd107XG4gICAgICAgICAgICBpZiAodGlsZS5zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYSBzaW5nbGUgdGlsZSAtLSB3aG9vc2UgY29vcmRpbmF0ZXMgYXJlIHRoaXMudGlsZUlEIC0tIHRoYXRcbiAgICAgICAgLy8gY292ZXJzIHRoZSBpbWFnZSB3ZSB3YW50IHRvIHJlbmRlci4gIElmIHRoYXQncyB0aGUgb25lIGJlaW5nXG4gICAgICAgIC8vIHJlcXVlc3RlZCwgc2V0IGl0IHVwIHdpdGggdGhlIGltYWdlOyBvdGhlcndpc2UsIG1hcmsgdGhlIHRpbGUgYXNcbiAgICAgICAgLy8gYGVycm9yZWRgIHRvIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBubyBkYXRhIGZvciBpdC5cbiAgICAgICAgLy8gSWYgdGhlIHdvcmxkIHdyYXBzLCB3ZSBtYXkgaGF2ZSBtdWx0aXBsZSBcIndyYXBwZWRcIiBjb3BpZXMgb2YgdGhlXG4gICAgICAgIC8vIHNpbmdsZSB0aWxlLlxuICAgICAgICBpZiAodGhpcy50aWxlSUQgJiYgdGhpcy50aWxlSUQuZXF1YWxzKHRpbGUudGlsZUlELmNhbm9uaWNhbCkpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZXNbU3RyaW5nKHRpbGUudGlsZUlELndyYXApXSA9IHRpbGU7XG4gICAgICAgICAgICB0aWxlLmJ1Y2tldHMgPSB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBjb29yZGluYXRlcywgZ2V0IHRoZWlyIGNlbnRlciBhcyBhIGNvb3JkaW5hdGUuXG4gKlxuICogQHJldHVybnMgY2VudGVycG9pbnRcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZGluYXRlc0NlbnRlclRpbGVJRChjb29yZHM6IEFycmF5PE1lcmNhdG9yQ29vcmRpbmF0ZT4pIHtcbiAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG5cbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgY29vcmQueCk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBjb29yZC55KTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGNvb3JkLngpO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgY29vcmQueSk7XG4gICAgfVxuXG4gICAgY29uc3QgZHggPSBtYXhYIC0gbWluWDtcbiAgICBjb25zdCBkeSA9IG1heFkgLSBtaW5ZO1xuICAgIGNvbnN0IGRNYXggPSBNYXRoLm1heChkeCwgZHkpO1xuICAgIGNvbnN0IHpvb20gPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKC1NYXRoLmxvZyhkTWF4KSAvIE1hdGguTE4yKSk7XG4gICAgY29uc3QgdGlsZXNBdFpvb20gPSBNYXRoLnBvdygyLCB6b29tKTtcblxuICAgIHJldHVybiBuZXcgQ2Fub25pY2FsVGlsZUlEKFxuICAgICAgICAgICAgem9vbSxcbiAgICAgICAgICAgIE1hdGguZmxvb3IoKG1pblggKyBtYXhYKSAvIDIgKiB0aWxlc0F0Wm9vbSksXG4gICAgICAgICAgICBNYXRoLmZsb29yKChtaW5ZICsgbWF4WSkgLyAyICogdGlsZXNBdFpvb20pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBnZXRWaWRlbywgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcblxuaW1wb3J0IEltYWdlU291cmNlIGZyb20gJy4vaW1hZ2Vfc291cmNlJztcbmltcG9ydCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzIGZyb20gJy4uL2RhdGEvcmFzdGVyX2JvdW5kc19hdHRyaWJ1dGVzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZSc7XG5pbXBvcnQgeyBFcnJvckV2ZW50IH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4uL3V0aWwvZGlzcGF0Y2hlcic7XG5pbXBvcnQgdHlwZSB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCB0eXBlIHtWaWRlb1NvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB2aWRlby5cbiAqIChTZWUgdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzLXZpZGVvKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICd2aWRlbycsXG4gKiAgICB1cmw6IFtcbiAqICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL2Fzc2V0cy9iYWx0aW1vcmUtc21va2UubXA0JyxcbiAqICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL2Fzc2V0cy9iYWx0aW1vcmUtc21va2Uud2VibSdcbiAqICAgIF0sXG4gKiAgICBjb29yZGluYXRlczogW1xuICogICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMTddLFxuICogICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgXVxuICogfSk7XG4gKlxuICogLy8gdXBkYXRlXG4gKiB2YXIgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKiBAc2VlIFtBZGQgYSB2aWRlb10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS92aWRlby1vbi1hLW1hcC8pXG4gKi9cbmNsYXNzIFZpZGVvU291cmNlIGV4dGVuZHMgSW1hZ2VTb3VyY2Uge1xuICAgIG9wdGlvbnM6IFZpZGVvU291cmNlU3BlY2lmaWNhdGlvbjtcbiAgICB1cmxzOiBBcnJheTxzdHJpbmc+O1xuICAgIHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50O1xuICAgIHJvdW5kWm9vbTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogVmlkZW9Tb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KTtcbiAgICAgICAgdGhpcy5yb3VuZFpvb20gPSB0cnVlO1xuICAgICAgICB0aGlzLnR5cGUgPSAndmlkZW8nO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIHRoaXMudXJscyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHVybCBvZiBvcHRpb25zLnVybHMpIHtcbiAgICAgICAgICAgIHRoaXMudXJscy5wdXNoKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlNvdXJjZSkudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFZpZGVvKHRoaXMudXJscywgKGVyciwgdmlkZW8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlbykge1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW8gPSB2aWRlbztcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvLmxvb3AgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgcmVwYWludGluZyB3aGVuIHZpZGVvIHN0YXJ0cyBwbGF5aW5nLiBoYXNUcmFuc2l0aW9uKCkgd2lsbCB0aGVuIHJldHVyblxuICAgICAgICAgICAgICAgIC8vIHRydWUgdG8gdHJpZ2dlciBhZGRpdGlvbmFsIGZyYW1lcyBhcyBsb25nIGFzIHRoZSB2aWRlb3MgY29udGludWVzIHBsYXlpbmcuXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSB2aWRlby5cbiAgICAgKi9cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ucGF1c2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlzIHRoZSB2aWRlby5cbiAgICAgKi9cbiAgICBwbGF5KCkge1xuICAgICAgICBpZiAodGhpcy52aWRlbykge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHBsYXliYWNrIHRvIGEgdGltZXN0YW1wLCBpbiBzZWNvbmRzLlxuICAgICAqL1xuICAgIHNlZWsoc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICBjb25zdCBzZWVrYWJsZVJhbmdlID0gdGhpcy52aWRlby5zZWVrYWJsZTtcbiAgICAgICAgICAgIGlmIChzZWNvbmRzIDwgc2Vla2FibGVSYW5nZS5zdGFydCgwKSB8fCBzZWNvbmRzID4gc2Vla2FibGVSYW5nZS5lbmQoMCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgUGxheWJhY2sgZm9yIHRoaXMgdmlkZW8gY2FuIGJlIHNldCBvbmx5IGJldHdlZW4gdGhlICR7c2Vla2FibGVSYW5nZS5zdGFydCgwKX0gYW5kICR7c2Vla2FibGVSYW5nZS5lbmQoMCl9LXNlY29uZCBtYXJrLmApKSk7XG4gICAgICAgICAgICB9IGVsc2UgdGhpcy52aWRlby5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGB2aWRlb2AgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MVmlkZW9FbGVtZW50fSBUaGUgSFRNTCBgdmlkZW9gIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0VmlkZW8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcCkgcmV0dXJuO1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aWRlbydzIGNvb3JkaW5hdGVzIGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHNldENvb3JkaW5hdGVzXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIFZpZGVvU291cmNlXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIHZpZGVvLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZGVvIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtWaWRlb1NvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIC8vIHNldENvb3JkaW5hdGVzIGluaGVyaXRlZCBmcm9tIEltYWdlU291cmNlXG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoID09PSAwIHx8IHRoaXMudmlkZW8ucmVhZHlTdGF0ZSA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gbm90IGVub3VnaCBkYXRhIGZvciBjdXJyZW50IHBvc2l0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kc0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLl9ib3VuZHNBcnJheSwgcmFzdGVyQm91bmRzQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNTZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLnZpZGVvLCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmlkZW8ucGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnZpZGVvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdyBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy50aWxlc1t3XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgICAgICAgdXJsczogdGhpcy51cmxzLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlbyAmJiAhdGhpcy52aWRlby5wYXVzZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWRlb1NvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBJbWFnZVNvdXJjZSBmcm9tICcuL2ltYWdlX3NvdXJjZSc7XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50JztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCB7IEVycm9yRXZlbnQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9zdHlsZS1zcGVjL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB0eXBlIHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuXG5leHBvcnQgdHlwZSBDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9uID0ge3xcbiAgICBcInR5cGVcIjogXCJjYW52YXNcIixcbiAgICBcImNvb3JkaW5hdGVzXCI6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICBcImFuaW1hdGVcIj86IGJvb2xlYW4sXG4gICAgXCJjYW52YXNcIjogc3RyaW5nIHwgSFRNTENhbnZhc0VsZW1lbnRcbnx9O1xuXG4vKipcbiAqIE9wdGlvbnMgdG8gYWRkIGEgY2FudmFzIHNvdXJjZSB0eXBlIHRvIHRoZSBtYXAuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FudmFzU291cmNlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgU291cmNlIHR5cGUuIE11c3QgYmUgYFwiY2FudmFzXCJgLlxuICogQHByb3BlcnR5IHtzdHJpbmd8SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyBDYW52YXMgc291cmNlIGZyb20gd2hpY2ggdG8gcmVhZCBwaXhlbHMuIENhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIElEIG9mIHRoZSBjYW52YXMgZWxlbWVudCwgb3IgdGhlIGBIVE1MQ2FudmFzRWxlbWVudGAgaXRzZWxmLlxuICogQHByb3BlcnR5IHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgZGVub3Rpbmcgd2hlcmUgdG8gcGxhY2UgdGhlIGNvcm5lcnMgb2YgdGhlIGNhbnZhcywgc3BlY2lmaWVkIGluIGBbbG9uZ2l0dWRlLCBsYXRpdHVkZV1gIHBhaXJzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYW5pbWF0ZT10cnVlXSBXaGV0aGVyIHRoZSBjYW52YXMgc291cmNlIGlzIGFuaW1hdGVkLiBJZiB0aGUgY2FudmFzIGlzIHN0YXRpYyAoaS5lLiBwaXhlbHMgZG8gbm90IG5lZWQgdG8gYmUgcmUtcmVhZCBvbiBldmVyeSBmcmFtZSksIGBhbmltYXRlYCBzaG91bGQgYmUgc2V0IHRvIGBmYWxzZWAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqL1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYW4gSFRNTCBjYW52YXMuIFNlZSB7QGxpbmsgQ2FudmFzU291cmNlT3B0aW9uc30gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICdjYW52YXMnLFxuICogICAgY2FudmFzOiAnaWRPZk15SFRNTENhbnZhcycsXG4gKiAgICBhbmltYXRlOiB0cnVlLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAqICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZVxuICogdmFyIG15U291cmNlID0gbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpO1xuICogbXlTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICogICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICBbLTc2LjUyODAzNjU5NDM5MDg3LCAzOS4xODM4MzY0ODQ3NTg3XSxcbiAqICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqIF0pO1xuICpcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICovXG5jbGFzcyBDYW52YXNTb3VyY2UgZXh0ZW5kcyBJbWFnZVNvdXJjZSB7XG4gICAgb3B0aW9uczogQ2FudmFzU291cmNlU3BlY2lmaWNhdGlvbjtcbiAgICBhbmltYXRlOiBib29sZWFuO1xuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBwbGF5OiAoKSA9PiB2b2lkO1xuICAgIHBhdXNlOiAoKSA9PiB2b2lkO1xuICAgIF9wbGF5aW5nOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KTtcblxuICAgICAgICAvLyBXZSBidWlsZCBpbiBzb21lIHZhbGlkYXRpb24gaGVyZSwgc2luY2UgY2FudmFzIHNvdXJjZXMgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBzdHlsZSBzcGVjOlxuICAgICAgICBpZiAoIW9wdGlvbnMuY29vcmRpbmF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgVmFsaWRhdGlvbkVycm9yKGBzb3VyY2VzLiR7aWR9YCwgbnVsbCwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJjb29yZGluYXRlc1wiJykpKTtcbiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zLmNvb3JkaW5hdGVzKSB8fCBvcHRpb25zLmNvb3JkaW5hdGVzLmxlbmd0aCAhPT0gNCB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29vcmRpbmF0ZXMuc29tZShjID0+ICFBcnJheS5pc0FycmF5KGMpIHx8IGMubGVuZ3RoICE9PSAyIHx8IGMuc29tZShsID0+IHR5cGVvZiBsICE9PSAnbnVtYmVyJykpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdcImNvb3JkaW5hdGVzXCIgcHJvcGVydHkgbXVzdCBiZSBhbiBhcnJheSBvZiA0IGxvbmdpdHVkZS9sYXRpdHVkZSBhcnJheSBwYWlycycpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlICYmIHR5cGVvZiBvcHRpb25zLmFuaW1hdGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHtpZH1gLCBudWxsLCAnb3B0aW9uYWwgXCJhbmltYXRlXCIgcHJvcGVydHkgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUnKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHtpZH1gLCBudWxsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImNhbnZhc1wiJykpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5jYW52YXMgIT09ICdzdHJpbmcnICYmICEob3B0aW9ucy5jYW52YXMgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdcImNhbnZhc1wiIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhlIGNhbnZhcyBlbGVtZW50IGZyb20gd2hpY2ggdG8gcmVhZCwgb3IgYW4gSFRNTENhbnZhc0VsZW1lbnQgaW5zdGFuY2UnKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5hbmltYXRlID0gb3B0aW9ucy5hbmltYXRlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmFuaW1hdGUgOiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgYW5pbWF0aW9uLiBUaGUgaW1hZ2Ugd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGUgY2FudmFzIHRvIHRoZSBtYXAgb24gZWFjaCBmcmFtZS5cbiAgICAgKiBAbWV0aG9kIHBsYXlcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgQ2FudmFzU291cmNlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBhbmltYXRpb24uIFRoZSBtYXAgd2lsbCBkaXNwbGF5IGEgc3RhdGljIGNvcHkgb2YgdGhlIGNhbnZhcyBpbWFnZS5cbiAgICAgKiBAbWV0aG9kIHBhdXNlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqL1xuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSAodGhpcy5vcHRpb25zLmNhbnZhcyBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCkgP1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYW52YXMgOlxuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdDYW52YXMgZGltZW5zaW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8uJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0Q2FudmFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXM7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFuaW1hdGUpIHRoaXMucGxheSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjYW52YXMncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBzZXRDb29yZGluYXRlc1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBDYW52YXNTb3VyY2VcbiAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyxcbiAgICAgKiAgIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIG51bWJlcnMsIHdoaWNoIGRlZmluZSB0aGUgY29ybmVycyBvZiB0aGUgY2FudmFzLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhcyBhbmQgcHJvY2VlZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXG4gICAgICogICBUaGV5IGRvIG5vdCBoYXZlIHRvIHJlcHJlc2VudCBhIHJlY3RhbmdsZS5cbiAgICAgKiBAcmV0dXJucyB7Q2FudmFzU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgLy8gc2V0Q29vcmRpbmF0ZXMgaW5oZXJpdGVkIGZyb20gSW1hZ2VTb3VyY2VcblxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIGxldCByZXNpemUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzLndpZHRoICE9PSB0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgICAgICByZXNpemUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodDtcbiAgICAgICAgICAgIHJlc2l6ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFzSW52YWxpZERpbWVuc2lvbnMoKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90IGVub3VnaCBkYXRhIGZvciBjdXJyZW50IHBvc2l0aW9uXG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzU2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5jYW52YXMsIGdsLlJHQkEsIHsgcHJlbXVsdGlwbHk6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzaXplIHx8IHRoaXMuX3BsYXlpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS51cGRhdGUodGhpcy5jYW52YXMsIHsgcHJlbXVsdGlwbHk6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHcgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMudGlsZXNbd107XG4gICAgICAgICAgICBpZiAodGlsZS5zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnY2FudmFzJyxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXlpbmc7XG4gICAgfVxuXG4gICAgX2hhc0ludmFsaWREaW1lbnNpb25zKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHggb2YgW3RoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHRdKSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4oeCkgfHwgeCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYW52YXNTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBiaW5kQWxsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4vdGlsZV9pZCc7XG5cbi8qKlxuICogVGhlIGBTb3VyY2VgIGludGVyZmFjZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggc291cmNlIHR5cGUsIGluY2x1ZGluZyBcImNvcmVcIiB0eXBlcyAoYHZlY3RvcmAsIGByYXN0ZXJgLFxuICogYHZpZGVvYCwgZXRjLikgYW5kIGFsbCBjdXN0b20sIHRoaXJkLXBhcnR5IHR5cGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gTXVzdCBub3QgYmUgdXNlZCBieSBhbnkgZXhpc3Rpbmcgc291cmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU291cmNlIG9wdGlvbnMsIHNwZWNpZmljIHRvIHRoZSBzb3VyY2UgdHlwZSAoZXhjZXB0IGZvciBgb3B0aW9ucy50eXBlYCwgd2hpY2ggaXMgYWx3YXlzXG4gKiByZXF1aXJlZCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIFRoZSBzb3VyY2UgdHlwZSwgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIGBuYW1lYCB1c2VkIGluIHtAbGluayBTdHlsZSNhZGRTb3VyY2VUeXBlfS5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlciBBIHtAbGluayBEaXNwYXRjaGVyfSBpbnN0YW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgd29ya2Vycy5cbiAqXG4gKiBAZmlyZXMgZGF0YSB3aXRoIGB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ31gIHRvIGluZGljYXRlIHRoYXQgYW55IG5lY2Vzc2FyeSBtZXRhZGF0YVxuICogaGFzIGJlZW4gbG9hZGVkIHNvIHRoYXQgaXQncyBva2F5IHRvIGNhbGwgYGxvYWRUaWxlYDsgYW5kIHdpdGggYHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9YFxuICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgc291cmNlIGRhdGEgaGFzIGNoYW5nZWQsIHNvIHRoYXQgYW55IGN1cnJlbnQgY2FjaGVzIHNob3VsZCBiZSBmbHVzaGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gIE11c3QgbWF0Y2ggdGhlIGlkIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWluem9vbVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heHpvb21cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNUaWxlQ2xpcHBlZCBgZmFsc2VgIGlmIHRpbGVzIGNhbiBiZSBkcmF3biBvdXRzaWRlIHRoZWlyIGJvdW5kYXJpZXMsIGB0cnVlYCBpZiB0aGV5IGNhbm5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwYXJzZU92ZXJzY2FsZWQgYHRydWVgIGlmIHRpbGVzIHNob3VsZCBiZSBzZW50IGJhY2sgdG8gdGhlIHdvcmtlciBmb3IgZWFjaCBvdmVyem9vbWVkIHpvb21cbiAqIGxldmVsLCBgZmFsc2VgIGlmIG5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRab29tIGB0cnVlYCBpZiB6b29tIGxldmVscyBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGluIHRoZSBzb3VyY2UgZGF0YSwgYGZhbHNlYFxuICogaWYgdGhleSBhcmUgZmxvb3ItZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb3VyY2Uge1xuICAgICt0eXBlOiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtaW56b29tOiBudW1iZXIsXG4gICAgbWF4em9vbTogbnVtYmVyLFxuICAgIHRpbGVTaXplOiBudW1iZXIsXG4gICAgYXR0cmlidXRpb24/OiBzdHJpbmcsXG5cbiAgICByb3VuZFpvb20/OiBib29sZWFuLFxuICAgIGlzVGlsZUNsaXBwZWQ/OiBib29sZWFuLFxuICAgIG1hcGJveF9sb2dvPzogYm9vbGVhbixcbiAgICB0aWxlSUQ/OiBDYW5vbmljYWxUaWxlSUQ7XG4gICAgcmVwYXJzZU92ZXJzY2FsZWQ/OiBib29sZWFuLFxuICAgIHZlY3RvckxheWVySWRzPzogQXJyYXk8c3RyaW5nPixcblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbjtcbiAgICBsb2FkZWQoKTogYm9vbGVhbjtcblxuICAgIGZpcmUoZXZlbnQ6IEV2ZW50KTogbWl4ZWQ7XG5cbiAgICArb25BZGQ/OiAobWFwOiBNYXApID0+IHZvaWQ7XG4gICAgK29uUmVtb3ZlPzogKG1hcDogTWFwKSA9PiB2b2lkO1xuXG4gICAgbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KTogdm9pZDtcbiAgICAraGFzVGlsZT86ICh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpID0+IGJvb2xlYW47XG4gICAgK2Fib3J0VGlsZT86ICh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pID0+IHZvaWQ7XG4gICAgK3VubG9hZFRpbGU/OiAodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQSBwbGFpbiAoc3RyaW5naWZpYWJsZSkgSlMgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc291cmNlLlxuICAgICAqIENyZWF0aW5nIGEgc291cmNlIHVzaW5nIHRoZSByZXR1cm5lZCBvYmplY3QgYXMgdGhlIGBvcHRpb25zYCBzaG91bGQgcmVzdWx0IGluIGEgU291cmNlIHRoYXQgaXNcbiAgICAgKiBlcXVpdmFsZW50IHRvIHRoaXMgb25lLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2VyaWFsaXplKCk6IE9iamVjdDtcblxuICAgICtwcmVwYXJlPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBTb3VyY2VTdGF0aWNzID0ge1xuICAgIC8qXG4gICAgICogQW4gb3B0aW9uYWwgVVJMIHRvIGEgc2NyaXB0IHdoaWNoLCB3aGVuIHJ1biBieSBhIFdvcmtlciwgcmVnaXN0ZXJzIGEge0BsaW5rIFdvcmtlclNvdXJjZX1cbiAgICAgKiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBTb3VyY2UgdHlwZSBieSBjYWxsaW5nIGBzZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlKHdvcmtlclNvdXJjZTogV29ya2VyU291cmNlKWAuXG4gICAgICovXG4gICAgd29ya2VyU291cmNlVVJMPzogVVJMO1xufTtcblxuZXhwb3J0IHR5cGUgU291cmNlQ2xhc3MgPSBDbGFzczxTb3VyY2U+ICYgU291cmNlU3RhdGljcztcblxuaW1wb3J0IHZlY3RvciBmcm9tICcuLi9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlJztcbmltcG9ydCByYXN0ZXIgZnJvbSAnLi4vc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZSc7XG5pbXBvcnQgcmFzdGVyRGVtIGZyb20gJy4uL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfc291cmNlJztcbmltcG9ydCBnZW9qc29uIGZyb20gJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZSc7XG5pbXBvcnQgdmlkZW8gZnJvbSAnLi4vc291cmNlL3ZpZGVvX3NvdXJjZSc7XG5pbXBvcnQgaW1hZ2UgZnJvbSAnLi4vc291cmNlL2ltYWdlX3NvdXJjZSc7XG5pbXBvcnQgY2FudmFzIGZyb20gJy4uL3NvdXJjZS9jYW52YXNfc291cmNlJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jb25zdCBzb3VyY2VUeXBlcyA9IHtcbiAgICB2ZWN0b3IsXG4gICAgcmFzdGVyLFxuICAgICdyYXN0ZXItZGVtJzogcmFzdGVyRGVtLFxuICAgIGdlb2pzb24sXG4gICAgdmlkZW8sXG4gICAgaW1hZ2UsXG4gICAgY2FudmFzXG59O1xuXG4vKlxuICogQ3JlYXRlcyBhIHRpbGVkIGRhdGEgc291cmNlIGluc3RhbmNlIGdpdmVuIGFuIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBpZFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBBIHNvdXJjZSBkZWZpbml0aW9uIG9iamVjdCBjb21wbGlhbnQgd2l0aFxuICogW2BtYXBib3gtZ2wtc3R5bGUtc3BlY2BdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpIG9yLCBmb3IgYSB0aGlyZC1wYXJ0eSBzb3VyY2UgdHlwZSxcbiAgKiB3aXRoIHRoYXQgdHlwZSdzIHJlcXVpcmVtZW50cy5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlclxuICogQHJldHVybnMge1NvdXJjZX1cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZSA9IGZ1bmN0aW9uKGlkOiBzdHJpbmcsIHNwZWNpZmljYXRpb246IFNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgc291cmNlVHlwZXNbc3BlY2lmaWNhdGlvbi50eXBlXShpZCwgKHNwZWNpZmljYXRpb246IGFueSksIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgaWYgKHNvdXJjZS5pZCAhPT0gaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBTb3VyY2UgaWQgdG8gYmUgJHtpZH0gaW5zdGVhZCBvZiAke3NvdXJjZS5pZH1gKTtcbiAgICB9XG5cbiAgICBiaW5kQWxsKFsnbG9hZCcsICdhYm9ydCcsICd1bmxvYWQnLCAnc2VyaWFsaXplJywgJ3ByZXBhcmUnXSwgc291cmNlKTtcbiAgICByZXR1cm4gc291cmNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvdXJjZVR5cGVzW25hbWVdO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFR5cGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCB0eXBlOiBDbGFzczxTb3VyY2U+KSB7XG4gICAgc291cmNlVHlwZXNbbmFtZV0gPSB0eXBlO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RvciB7XG4gICAgc2VuZCh0eXBlOiBzdHJpbmcsIGRhdGE6IE9iamVjdCwgY2FsbGJhY2s6IENhbGxiYWNrPGFueT4pOiB2b2lkO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDb2xsaXNpb25JbmRleCBmcm9tICcuLi9zeW1ib2wvY29sbGlzaW9uX2luZGV4JztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHsgUmV0YWluZWRRdWVyeURhdGEgfSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcbmltcG9ydCB0eXBlIHtGaWx0ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IG1hdDQgfSBmcm9tICdnbC1tYXRyaXgnO1xuXG4vKlxuICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgZnJvbSB0aWxlIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IHBpeGVsIGNvb3JkaW5hdGVzLlxuICovXG5mdW5jdGlvbiBnZXRQaXhlbFBvc01hdHJpeCh0cmFuc2Zvcm0sIHRpbGVJRCkge1xuICAgIGNvbnN0IHQgPSBtYXQ0LmlkZW50aXR5KFtdKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZSh0LCB0LCBbMSwgMSwgMF0pO1xuICAgIG1hdDQuc2NhbGUodCwgdCwgW3RyYW5zZm9ybS53aWR0aCAqIDAuNSwgdHJhbnNmb3JtLmhlaWdodCAqIDAuNSwgMV0pO1xuICAgIHJldHVybiBtYXQ0Lm11bHRpcGx5KHQsIHQsIHRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZUlELnRvVW53cmFwcGVkKCkpKTtcbn1cblxuZnVuY3Rpb24gcXVlcnlJbmNsdWRlczNETGF5ZXIobGF5ZXJzPzogQXJyYXk8c3RyaW5nPiwgc3R5bGVMYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0sIHNvdXJjZUlEOiBzdHJpbmcpIHtcbiAgICBpZiAobGF5ZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gc3R5bGVMYXllcnNbbGF5ZXJJRF07XG4gICAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuc291cmNlID09PSBzb3VyY2VJRCAmJiBsYXllci50eXBlID09PSAnZmlsbC1leHRydXNpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzdHlsZUxheWVycykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBzdHlsZUxheWVyc1trZXldO1xuICAgICAgICAgICAgaWYgKGxheWVyLnNvdXJjZSA9PT0gc291cmNlSUQgJiYgbGF5ZXIudHlwZSA9PT0gJ2ZpbGwtZXh0cnVzaW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVMYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sIGxheWVyczogQXJyYXk8c3RyaW5nPiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG5cbiAgICBjb25zdCBoYXMzRExheWVyID0gcXVlcnlJbmNsdWRlczNETGF5ZXIocGFyYW1zICYmIHBhcmFtcy5sYXllcnMsIHN0eWxlTGF5ZXJzLCBzb3VyY2VDYWNoZS5pZCk7XG5cbiAgICBjb25zdCBtYXhQaXRjaFNjYWxlRmFjdG9yID0gdHJhbnNmb3JtLm1heFBpdGNoU2NhbGVGYWN0b3IoKTtcbiAgICBjb25zdCB0aWxlc0luID0gc291cmNlQ2FjaGUudGlsZXNJbihxdWVyeUdlb21ldHJ5LCBtYXhQaXRjaFNjYWxlRmFjdG9yLCBoYXMzRExheWVyKTtcblxuICAgIHRpbGVzSW4uc29ydChzb3J0VGlsZXNJbik7XG5cbiAgICBjb25zdCByZW5kZXJlZEZlYXR1cmVMYXllcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRpbGVJbiBvZiB0aWxlc0luKSB7XG4gICAgICAgIHJlbmRlcmVkRmVhdHVyZUxheWVycy5wdXNoKHtcbiAgICAgICAgICAgIHdyYXBwZWRUaWxlSUQ6IHRpbGVJbi50aWxlSUQud3JhcHBlZCgpLmtleSxcbiAgICAgICAgICAgIHF1ZXJ5UmVzdWx0czogdGlsZUluLnRpbGUucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLl9zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aWxlSW4ucXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICB0aWxlSW4uY2FtZXJhUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICB0aWxlSW4uc2NhbGUsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICBtYXhQaXRjaFNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgIGdldFBpeGVsUG9zTWF0cml4KHNvdXJjZUNhY2hlLnRyYW5zZm9ybSwgdGlsZUluLnRpbGVJRCkpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG1lcmdlUmVuZGVyZWRGZWF0dXJlTGF5ZXJzKHJlbmRlcmVkRmVhdHVyZUxheWVycyk7XG5cbiAgICAvLyBNZXJnZSBzdGF0ZSBmcm9tIFNvdXJjZUNhY2hlIGludG8gdGhlIHJlc3VsdHNcbiAgICBmb3IgKGNvbnN0IGxheWVySUQgaW4gcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdFtsYXllcklEXS5mb3JFYWNoKChmZWF0dXJlV3JhcHBlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVXcmFwcGVyLmZlYXR1cmU7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNvdXJjZUNhY2hlLmdldEZlYXR1cmVTdGF0ZShmZWF0dXJlLmxheWVyWydzb3VyY2UtbGF5ZXInXSwgZmVhdHVyZS5pZCk7XG4gICAgICAgICAgICBmZWF0dXJlLnNvdXJjZSA9IGZlYXR1cmUubGF5ZXIuc291cmNlO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5zb3VyY2VMYXllciA9IGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmVhdHVyZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzKHN0eWxlTGF5ZXJzOiB7W3N0cmluZ106IFN0eWxlTGF5ZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlczoge1tzdHJpbmddOiBTb3VyY2VDYWNoZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sIGxheWVyczogQXJyYXk8c3RyaW5nPiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkluZGV4OiBDb2xsaXNpb25JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFF1ZXJ5RGF0YToge1tudW1iZXJdOiBSZXRhaW5lZFF1ZXJ5RGF0YX0pIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBjb25zdCByZW5kZXJlZFN5bWJvbHMgPSBjb2xsaXNpb25JbmRleC5xdWVyeVJlbmRlcmVkU3ltYm9scyhxdWVyeUdlb21ldHJ5KTtcbiAgICBjb25zdCBidWNrZXRRdWVyeURhdGEgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGJ1Y2tldEluc3RhbmNlSWQgb2YgT2JqZWN0LmtleXMocmVuZGVyZWRTeW1ib2xzKS5tYXAoTnVtYmVyKSkge1xuICAgICAgICBidWNrZXRRdWVyeURhdGEucHVzaChyZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXRJbnN0YW5jZUlkXSk7XG4gICAgfVxuICAgIGJ1Y2tldFF1ZXJ5RGF0YS5zb3J0KHNvcnRUaWxlc0luKTtcblxuICAgIGZvciAoY29uc3QgcXVlcnlEYXRhIG9mIGJ1Y2tldFF1ZXJ5RGF0YSkge1xuICAgICAgICBjb25zdCBidWNrZXRTeW1ib2xzID0gcXVlcnlEYXRhLmZlYXR1cmVJbmRleC5sb29rdXBTeW1ib2xGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICByZW5kZXJlZFN5bWJvbHNbcXVlcnlEYXRhLmJ1Y2tldEluc3RhbmNlSWRdLFxuICAgICAgICAgICAgICAgIHF1ZXJ5RGF0YS5idWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICBxdWVyeURhdGEuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVyLFxuICAgICAgICAgICAgICAgIHBhcmFtcy5sYXllcnMsXG4gICAgICAgICAgICAgICAgc3R5bGVMYXllcnMpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBpbiBidWNrZXRTeW1ib2xzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRGZWF0dXJlcyA9IHJlc3VsdFtsYXllcklEXSA9IHJlc3VsdFtsYXllcklEXSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyU3ltYm9scyA9IGJ1Y2tldFN5bWJvbHNbbGF5ZXJJRF07XG4gICAgICAgICAgICBsYXllclN5bWJvbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1hdGNoIHRvcERvd25GZWF0dXJlQ29tcGFyYXRvciBmcm9tIEZlYXR1cmVJbmRleCwgYnV0IHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gbW9zdCByZWNlbnQgc29ydGluZyBvZiBmZWF0dXJlcyBmcm9tIGJ1Y2tldC5zb3J0RmVhdHVyZXNcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlU29ydE9yZGVyID0gcXVlcnlEYXRhLmZlYXR1cmVTb3J0T3JkZXI7XG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVTb3J0T3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcXVlcnlSZW5kZXJlZFN5bWJvbHMgZG9jdW1lbnRhdGlvbiBzYXlzIHdlJ2xsIHJldHVybiBmZWF0dXJlcyBpblxuICAgICAgICAgICAgICAgICAgICAvLyBcInRvcC10by1ib3R0b21cIiByZW5kZXJpbmcgb3JkZXIgKGFrYSBsYXN0LXRvLWZpcnN0KS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsbHkgdGhlcmUgY2FuIGJlIG11bHRpcGxlIHN5bWJvbCBpbnN0YW5jZXMgcGVyIGZlYXR1cmUsIHNvXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNvcnQgZWFjaCBmZWF0dXJlIGJhc2VkIG9uIHRoZSBmaXJzdCBtYXRjaGluZyBzeW1ib2wgaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZEEgPSBmZWF0dXJlU29ydE9yZGVyLmluZGV4T2YoYS5mZWF0dXJlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRCID0gZmVhdHVyZVNvcnRPcmRlci5pbmRleE9mKGIuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHNvcnRlZEEgPj0gMCk7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChzb3J0ZWRCID49IDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydGVkQiAtIHNvcnRlZEE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnVja2V0IGhhc24ndCBiZWVuIHJlLXNvcnRlZCBiYXNlZCBvbiBhbmdsZSwgc28gdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIG9mIHRoZSBvcmRlciB0aGUgZmVhdHVyZXMgYXBwZWFyZWQgaW4gdGhlIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmZlYXR1cmVJbmRleCAtIGEuZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzeW1ib2xGZWF0dXJlIG9mIGxheWVyU3ltYm9scykge1xuICAgICAgICAgICAgICAgIHJlc3VsdEZlYXR1cmVzLnB1c2goc3ltYm9sRmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXJnZSBzdGF0ZSBmcm9tIFNvdXJjZUNhY2hlIGludG8gdGhlIHJlc3VsdHNcbiAgICBmb3IgKGNvbnN0IGxheWVyTmFtZSBpbiByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0W2xheWVyTmFtZV0uZm9yRWFjaCgoZmVhdHVyZVdyYXBwZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlV3JhcHBlci5mZWF0dXJlO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBzdHlsZUxheWVyc1tsYXllck5hbWVdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gc291cmNlQ2FjaGUuZ2V0RmVhdHVyZVN0YXRlKGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddLCBmZWF0dXJlLmlkKTtcbiAgICAgICAgICAgIGZlYXR1cmUuc291cmNlID0gZmVhdHVyZS5sYXllci5zb3VyY2U7XG4gICAgICAgICAgICBpZiAoZmVhdHVyZS5sYXllclsnc291cmNlLWxheWVyJ10pIHtcbiAgICAgICAgICAgICAgICBmZWF0dXJlLnNvdXJjZUxheWVyID0gZmVhdHVyZS5sYXllclsnc291cmNlLWxheWVyJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmZWF0dXJlLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIHBhcmFtczogYW55KSB7XG4gICAgY29uc3QgdGlsZXMgPSBzb3VyY2VDYWNoZS5nZXRSZW5kZXJhYmxlSWRzKCkubWFwKChpZCkgPT4ge1xuICAgICAgICByZXR1cm4gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoaWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBjb25zdCBkYXRhVGlsZXMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aWxlc1tpXTtcbiAgICAgICAgY29uc3QgZGF0YUlEID0gdGlsZS50aWxlSUQuY2Fub25pY2FsLmtleTtcbiAgICAgICAgaWYgKCFkYXRhVGlsZXNbZGF0YUlEXSkge1xuICAgICAgICAgICAgZGF0YVRpbGVzW2RhdGFJRF0gPSB0cnVlO1xuICAgICAgICAgICAgdGlsZS5xdWVyeVNvdXJjZUZlYXR1cmVzKHJlc3VsdCwgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNvcnRUaWxlc0luKGEsIGIpIHtcbiAgICBjb25zdCBpZEEgPSBhLnRpbGVJRDtcbiAgICBjb25zdCBpZEIgPSBiLnRpbGVJRDtcbiAgICByZXR1cm4gKGlkQS5vdmVyc2NhbGVkWiAtIGlkQi5vdmVyc2NhbGVkWikgfHwgKGlkQS5jYW5vbmljYWwueSAtIGlkQi5jYW5vbmljYWwueSkgfHwgKGlkQS53cmFwIC0gaWRCLndyYXApIHx8IChpZEEuY2Fub25pY2FsLnggLSBpZEIuY2Fub25pY2FsLngpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVJlbmRlcmVkRmVhdHVyZUxheWVycyh0aWxlcykge1xuICAgIC8vIE1lcmdlIHJlc3VsdHMgZnJvbSBhbGwgdGlsZXMsIGJ1dCBpZiB0d28gdGlsZXMgc2hhcmUgdGhlIHNhbWVcbiAgICAvLyB3cmFwcGVkIElELCBkb24ndCBkdXBsaWNhdGUgZmVhdHVyZXMgYmV0d2VlbiB0aGUgdHdvIHRpbGVzXG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3Qgd3JhcHBlZElETGF5ZXJNYXAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgY29uc3QgcXVlcnlSZXN1bHRzID0gdGlsZS5xdWVyeVJlc3VsdHM7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRJRCA9IHRpbGUud3JhcHBlZFRpbGVJRDtcbiAgICAgICAgY29uc3Qgd3JhcHBlZElETGF5ZXJzID0gd3JhcHBlZElETGF5ZXJNYXBbd3JhcHBlZElEXSA9IHdyYXBwZWRJRExheWVyTWFwW3dyYXBwZWRJRF0gfHwge307XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBpbiBxdWVyeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVGZWF0dXJlcyA9IHF1ZXJ5UmVzdWx0c1tsYXllcklEXTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRJREZlYXR1cmVzID0gd3JhcHBlZElETGF5ZXJzW2xheWVySURdID0gd3JhcHBlZElETGF5ZXJzW2xheWVySURdIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RmVhdHVyZXMgPSByZXN1bHRbbGF5ZXJJRF0gPSByZXN1bHRbbGF5ZXJJRF0gfHwgW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRpbGVGZWF0dXJlIG9mIHRpbGVGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgIGlmICghd3JhcHBlZElERmVhdHVyZXNbdGlsZUZlYXR1cmUuZmVhdHVyZUluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICB3cmFwcGVkSURGZWF0dXJlc1t0aWxlRmVhdHVyZS5mZWF0dXJlSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0RmVhdHVyZXMucHVzaCh0aWxlRmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBPdmVyc2NhbGVkVGlsZUlEIH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlJztcblxuLyoqXG4gKiBBIFtsZWFzdC1yZWNlbnRseS11c2VkIGNhY2hlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhY2hlX2FsZ29yaXRobXMpXG4gKiB3aXRoIGhhc2ggbG9va3VwIG1hZGUgcG9zc2libGUgYnkga2VlcGluZyBhIGxpc3Qgb2Yga2V5cyBpbiBwYXJhbGxlbCB0b1xuICogYW4gYXJyYXkgb2YgZGljdGlvbmFyeSBvZiB2YWx1ZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUaWxlQ2FjaGUge1xuICAgIG1heDogbnVtYmVyO1xuICAgIGRhdGE6IHtba2V5OiBudW1iZXIgfCBzdHJpbmddOiBBcnJheTx7IHZhbHVlOiBUaWxlLCB0aW1lb3V0OiA/VGltZW91dElEfT59O1xuICAgIG9yZGVyOiBBcnJheTxudW1iZXI+O1xuICAgIG9uUmVtb3ZlOiAoZWxlbWVudDogVGlsZSkgPT4gdm9pZDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IG51bWJlciBvZiBwZXJtaXR0ZWQgdmFsdWVzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25SZW1vdmUgY2FsbGJhY2sgY2FsbGVkIHdpdGggaXRlbXMgd2hlbiB0aGV5IGV4cGlyZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1heDogbnVtYmVyLCBvblJlbW92ZTogKGVsZW1lbnQ6IFRpbGUpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIHRoaXMub25SZW1vdmUgPSBvblJlbW92ZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBjYWNoZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZW1vdmVkRGF0YSBvZiB0aGlzLmRhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkRGF0YS50aW1lb3V0KSBjbGVhclRpbWVvdXQocmVtb3ZlZERhdGEudGltZW91dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5vcmRlciA9IFtdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGtleSwgdmFsdWUgY29tYmluYXRpb24gdG8gdGhlIGNhY2hlLCB0cmltbWluZyBpdHMgc2l6ZSBpZiB0aGlzIHB1c2hlc1xuICAgICAqIGl0IG92ZXIgbWF4IGxlbmd0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIGxvb2t1cCBrZXkgZm9yIHRoZSBpdGVtXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIGFueSB2YWx1ZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgZGF0YTogVGlsZSwgZXhwaXJ5VGltZW91dDogbnVtYmVyIHwgdm9pZCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aWxlSUQud3JhcHBlZCgpLmtleTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhV3JhcHBlciA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgdGltZW91dDogdW5kZWZpbmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGV4cGlyeVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YVdyYXBwZXIudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRpbGVJRCwgZGF0YVdyYXBwZXIpO1xuICAgICAgICAgICAgfSwgZXhwaXJ5VGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKGRhdGFXcmFwcGVyKTtcbiAgICAgICAgdGhpcy5vcmRlci5wdXNoKGtleSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWREYXRhID0gdGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodGhpcy5vcmRlclswXSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZERhdGEpIHRoaXMub25SZW1vdmUocmVtb3ZlZERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIGBrZXlgIGlzIHByZXNlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgdG8gYmUgbG9va2VkLXVwXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGNhY2hlIGhhcyB0aGlzIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBoYXModGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aWxlSUQud3JhcHBlZCgpLmtleSBpbiB0aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBhIHNwZWNpZmljIGtleSBhbmQgcmVtb3ZlIGRhdGEgZnJvbSBjYWNoZS5cbiAgICAgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyBgbnVsbGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgdG8gbG9vayB1cFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgZGF0YSwgb3IgbnVsbCBpZiBpdCBpc24ndCBmb3VuZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0QW5kUmVtb3ZlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6ID9UaWxlIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyh0aWxlSUQpKSB7IHJldHVybiBudWxsOyB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aWxlSUQud3JhcHBlZCgpLmtleSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBHZXQgYW5kIHJlbW92ZSB0aGUgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKi9cbiAgICBfZ2V0QW5kUmVtb3ZlQnlLZXkoa2V5OiBudW1iZXIpOiA/VGlsZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFba2V5XS5zaGlmdCgpO1xuICAgICAgICBpZiAoZGF0YS50aW1lb3V0KSBjbGVhclRpbWVvdXQoZGF0YS50aW1lb3V0KTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhW2tleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGtleSksIDEpO1xuXG4gICAgICAgIHJldHVybiBkYXRhLnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYSBzcGVjaWZpYyBrZXkgd2l0aG91dCByZW1vdmluZyBkYXRhXG4gICAgICogZnJvbSB0aGUgY2FjaGUuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCByZXR1cm5zIGBudWxsYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSUQgdGhlIGtleSB0byBsb29rIHVwXG4gICAgICogQHJldHVybnMgeyp9IHRoZSBkYXRhLCBvciBudWxsIGlmIGl0IGlzbid0IGZvdW5kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogP1RpbGUge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKHRpbGVJRCkpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhW3RpbGVJRC53cmFwcGVkKCkua2V5XVswXTtcbiAgICAgICAgcmV0dXJuIGRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEga2V5L3ZhbHVlIGNvbWJpbmF0aW9uIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSUQgdGhlIGtleSBmb3IgdGhlIHBhaXIgdG8gZGVsZXRlXG4gICAgICogQHBhcmFtIHtUaWxlfSB2YWx1ZSBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkLCByZW1vdmUgdGhhdCBleGFjdCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7VGlsZUNhY2hlfSB0aGlzIGNhY2hlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZW1vdmUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB2YWx1ZTogP3sgdmFsdWU6IFRpbGUsIHRpbWVvdXQ6ID9UaW1lb3V0SUR9KSB7XG4gICAgICAgIGlmICghdGhpcy5oYXModGlsZUlEKSkgeyByZXR1cm4gdGhpczsgfVxuICAgICAgICBjb25zdCBrZXkgPSB0aWxlSUQud3JhcHBlZCgpLmtleTtcblxuICAgICAgICBjb25zdCBkYXRhSW5kZXggPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gMCA6IHRoaXMuZGF0YVtrZXldLmluZGV4T2YodmFsdWUpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhW2tleV1bZGF0YUluZGV4XTtcbiAgICAgICAgdGhpcy5kYXRhW2tleV0uc3BsaWNlKGRhdGFJbmRleCwgMSk7XG4gICAgICAgIGlmIChkYXRhLnRpbWVvdXQpIGNsZWFyVGltZW91dChkYXRhLnRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5kYXRhW2tleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblJlbW92ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGtleSksIDEpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgbWF4IHNpemUgb2YgdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCB0aGUgbWF4IHNpemUgb2YgdGhlIGNhY2hlXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0TWF4U2l6ZShtYXg6IG51bWJlcik6IFRpbGVDYWNoZSB7XG4gICAgICAgIHRoaXMubWF4ID0gbWF4O1xuXG4gICAgICAgIHdoaWxlICh0aGlzLm9yZGVyLmxlbmd0aCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkRGF0YSA9IHRoaXMuX2dldEFuZFJlbW92ZUJ5S2V5KHRoaXMub3JkZXJbMF0pO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWREYXRhKSB0aGlzLm9uUmVtb3ZlKHJlbW92ZWREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGlsZUNhY2hlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheSc7XG5pbXBvcnQgdHlwZSB7VHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9pbmRleF9hcnJheV90eXBlJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5cbmNsYXNzIEluZGV4QnVmZmVyIHtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIGJ1ZmZlcjogV2ViR0xCdWZmZXI7XG4gICAgZHluYW1pY0RyYXc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBhcnJheTogVHJpYW5nbGVJbmRleEFycmF5IHwgTGluZUluZGV4QXJyYXkgfCBMaW5lU3RyaXBJbmRleEFycmF5LCBkeW5hbWljRHJhdz86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmR5bmFtaWNEcmF3ID0gQm9vbGVhbihkeW5hbWljRHJhdyk7XG5cbiAgICAgICAgLy8gVGhlIGJvdW5kIGluZGV4IGJ1ZmZlciBpcyBwYXJ0IG9mIHZlcnRleCBhcnJheSBvYmplY3Qgc3RhdGUuIFdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gbW9kaWZ5IHdoYXRldmVyIFZBTyBoYXBwZW5zIHRvIGJlIGN1cnJlbnRseSBib3VuZCwgc28gbWFrZSBzdXJlIHRoZSBkZWZhdWx0XG4gICAgICAgIC8vIHZlcnRleCBhcnJheSBwcm92aWRlZCBieSB0aGUgY29udGV4dCBpcyBib3VuZCBpbnN0ZWFkLlxuICAgICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCk7XG5cbiAgICAgICAgY29udGV4dC5iaW5kRWxlbWVudEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhcnJheS5hcnJheUJ1ZmZlciwgdGhpcy5keW5hbWljRHJhdyA/IGdsLkRZTkFNSUNfRFJBVyA6IGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICBpZiAoIXRoaXMuZHluYW1pY0RyYXcpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBhcnJheS5hcnJheUJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kRWxlbWVudEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGEoYXJyYXk6IFN0cnVjdEFycmF5KSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBhc3NlcnQodGhpcy5keW5hbWljRHJhdyk7XG4gICAgICAgIC8vIFRoZSByaWdodCBWQU8gd2lsbCBnZXQgdGhpcyBidWZmZXIgcmUtYm91bmQgbGF0ZXIgaW4gVmVydGV4QXJyYXlPYmplY3QjYmluZFxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU2MjBcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuYmluZFZBTygpO1xuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCwgYXJyYXkuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5idWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEluZGV4QnVmZmVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgU3RydWN0QXJyYXksXG4gICAgU3RydWN0QXJyYXlNZW1iZXJcbn0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5pbXBvcnQgdHlwZSBQcm9ncmFtIGZyb20gJy4uL3JlbmRlci9wcm9ncmFtJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5cbi8qKlxuICogQGVudW0ge3N0cmluZ30gQXR0cmlidXRlVHlwZVxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5jb25zdCBBdHRyaWJ1dGVUeXBlID0ge1xuICAgIEludDg6ICAgJ0JZVEUnLFxuICAgIFVpbnQ4OiAgJ1VOU0lHTkVEX0JZVEUnLFxuICAgIEludDE2OiAgJ1NIT1JUJyxcbiAgICBVaW50MTY6ICdVTlNJR05FRF9TSE9SVCcsXG4gICAgSW50MzI6ICAnSU5UJyxcbiAgICBVaW50MzI6ICdVTlNJR05FRF9JTlQnLFxuICAgIEZsb2F0MzI6ICdGTE9BVCdcbn07XG5cbi8qKlxuICogVGhlIGBWZXJ0ZXhCdWZmZXJgIGNsYXNzIHR1cm5zIGEgYFN0cnVjdEFycmF5YCBpbnRvIGEgV2ViR0wgYnVmZmVyLiBFYWNoIG1lbWJlciBvZiB0aGUgU3RydWN0QXJyYXknc1xuICogU3RydWN0IHR5cGUgaXMgY29udmVydGVkIHRvIGEgV2ViR0wgYXRyaWJ1dGUuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBWZXJ0ZXhCdWZmZXIge1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIGF0dHJpYnV0ZXM6ICRSZWFkT25seUFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBpdGVtU2l6ZTogbnVtYmVyO1xuICAgIGR5bmFtaWNEcmF3OiA/Ym9vbGVhbjtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIGJ1ZmZlcjogV2ViR0xCdWZmZXI7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZHluYW1pY0RyYXcgV2hldGhlciB0aGlzIGJ1ZmZlciB3aWxsIGJlIHJlcGVhdGVkbHkgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBhcnJheTogU3RydWN0QXJyYXksIGF0dHJpYnV0ZXM6ICRSZWFkT25seUFycmF5PFN0cnVjdEFycmF5TWVtYmVyPiwgZHluYW1pY0RyYXc/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLml0ZW1TaXplID0gYXJyYXkuYnl0ZXNQZXJFbGVtZW50O1xuICAgICAgICB0aGlzLmR5bmFtaWNEcmF3ID0gZHluYW1pY0RyYXc7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICBjb250ZXh0LmJpbmRWZXJ0ZXhCdWZmZXIuc2V0KHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGFycmF5LmFycmF5QnVmZmVyLCB0aGlzLmR5bmFtaWNEcmF3ID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgICAgIGlmICghdGhpcy5keW5hbWljRHJhdykge1xuICAgICAgICAgICAgZGVsZXRlIGFycmF5LmFycmF5QnVmZmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZCgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRWZXJ0ZXhCdWZmZXIuc2V0KHRoaXMuYnVmZmVyKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEYXRhKGFycmF5OiBTdHJ1Y3RBcnJheSkge1xuICAgICAgICBhc3NlcnQoYXJyYXkubGVuZ3RoID09PSB0aGlzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIGFycmF5LmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbmFibGVBdHRyaWJ1dGVzKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFByb2dyYW08Kj4pIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlciA9IHRoaXMuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYkluZGV4OiBudW1iZXIgfCB2b2lkID0gcHJvZ3JhbS5hdHRyaWJ1dGVzW21lbWJlci5uYW1lXTtcbiAgICAgICAgICAgIGlmIChhdHRyaWJJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoYXR0cmliSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBhdHRyaWJ1dGUgcG9pbnRlcnMgaW4gYSBXZWJHTCBjb250ZXh0XG4gICAgICogQHBhcmFtIGdsIFRoZSBXZWJHTCBjb250ZXh0XG4gICAgICogQHBhcmFtIHByb2dyYW0gVGhlIGFjdGl2ZSBXZWJHTCBwcm9ncmFtXG4gICAgICogQHBhcmFtIHZlcnRleE9mZnNldCBJbmRleCBvZiB0aGUgc3RhcnRpbmcgdmVydGV4IG9mIHRoZSBzZWdtZW50XG4gICAgICovXG4gICAgc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogUHJvZ3JhbTwqPiwgdmVydGV4T2Zmc2V0OiA/bnVtYmVyKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJJbmRleDogbnVtYmVyIHwgdm9pZCA9IHByb2dyYW0uYXR0cmlidXRlc1ttZW1iZXIubmFtZV07XG5cbiAgICAgICAgICAgIGlmIChhdHRyaWJJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIG1lbWJlci5jb21wb25lbnRzLFxuICAgICAgICAgICAgICAgICAgICAoZ2w6IGFueSlbQXR0cmlidXRlVHlwZVttZW1iZXIudHlwZV1dLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyLm9mZnNldCArICh0aGlzLml0ZW1TaXplICogKHZlcnRleE9mZnNldCB8fCAwKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgR0wgYnVmZmVyIGJvdW5kIHRvIHRoZSBnaXZlbiBXZWJHTCBjb250ZXh0XG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVydGV4QnVmZmVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtcbiAgICBCbGVuZEZ1bmNUeXBlLFxuICAgIEJsZW5kRXF1YXRpb25UeXBlLFxuICAgIENvbG9yTWFza1R5cGUsXG4gICAgRGVwdGhSYW5nZVR5cGUsXG4gICAgRGVwdGhNYXNrVHlwZSxcbiAgICBTdGVuY2lsRnVuY1R5cGUsXG4gICAgU3RlbmNpbE9wVHlwZSxcbiAgICBEZXB0aEZ1bmNUeXBlLFxuICAgIFRleHR1cmVVbml0VHlwZSxcbiAgICBWaWV3cG9ydFR5cGUsXG4gICAgQ3VsbEZhY2VNb2RlVHlwZSxcbiAgICBGcm9udEZhY2VUeXBlLFxufSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZTxUPiB7XG4gICAgY3VycmVudDogVDtcbiAgICBkZWZhdWx0OiBUO1xuICAgIGRpcnR5OiBib29sZWFuO1xuICAgIGdldCgpOiBUO1xuICAgIHNldERlZmF1bHQoKTogdm9pZDtcbiAgICBzZXQodmFsdWU6IFQpOiB2b2lkO1xufVxuXG5jbGFzcyBCYXNlVmFsdWU8VD4gaW1wbGVtZW50cyBWYWx1ZTxUPiB7XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgICBjdXJyZW50OiBUO1xuICAgIGRlZmF1bHQ6IFQ7XG4gICAgZGlydHk6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmdldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5kZWZhdWx0O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0KCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50O1xuICAgIH1cbiAgICBzZXQodmFsdWU6IFQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGluIGNoaWxkIGNsYXNzZXM7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdCgpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdDsgLy8gb3ZlcnJpZGVuIGluIGNoaWxkIGNsYXNzZXNcbiAgICB9XG4gICAgc2V0RGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5zZXQodGhpcy5kZWZhdWx0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhckNvbG9yIGV4dGVuZHMgQmFzZVZhbHVlPENvbG9yPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBDb2xvciB7XG4gICAgICAgIHJldHVybiBDb2xvci50cmFuc3BhcmVudDtcbiAgICB9XG4gICAgc2V0KHY6IENvbG9yKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2LnIgPT09IGMuciAmJiB2LmcgPT09IGMuZyAmJiB2LmIgPT09IGMuYiAmJiB2LmEgPT09IGMuYSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmNsZWFyQ29sb3Iodi5yLCB2LmcsIHYuYiwgdi5hKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFyRGVwdGggZXh0ZW5kcyBCYXNlVmFsdWU8bnVtYmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgc2V0KHY6IG51bWJlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY2xlYXJEZXB0aCh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFyU3RlbmNpbCBleHRlbmRzIEJhc2VWYWx1ZTxudW1iZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBzZXQodjogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5jbGVhclN0ZW5jaWwodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvck1hc2sgZXh0ZW5kcyBCYXNlVmFsdWU8Q29sb3JNYXNrVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogQ29sb3JNYXNrVHlwZSB7XG4gICAgICAgIHJldHVybiBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07XG4gICAgfVxuICAgIHNldCh2OiBDb2xvck1hc2tUeXBlKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdID09PSBjWzBdICYmIHZbMV0gPT09IGNbMV0gJiYgdlsyXSA9PT0gY1syXSAmJiB2WzNdID09PSBjWzNdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY29sb3JNYXNrKHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwdGhNYXNrIGV4dGVuZHMgQmFzZVZhbHVlPERlcHRoTWFza1R5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IERlcHRoTWFza1R5cGUge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2V0KHY6IERlcHRoTWFza1R5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmRlcHRoTWFzayh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0ZW5jaWxNYXNrIGV4dGVuZHMgQmFzZVZhbHVlPG51bWJlcj4ge1xuICAgIGdldERlZmF1bHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDB4RkY7XG4gICAgfVxuICAgIHNldCh2OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLnN0ZW5jaWxNYXNrKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RlbmNpbEZ1bmMgZXh0ZW5kcyBCYXNlVmFsdWU8U3RlbmNpbEZ1bmNUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBTdGVuY2lsRnVuY1R5cGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnVuYzogdGhpcy5nbC5BTFdBWVMsXG4gICAgICAgICAgICByZWY6IDAsXG4gICAgICAgICAgICBtYXNrOiAweEZGXG4gICAgICAgIH07XG4gICAgfVxuICAgIHNldCh2OiBTdGVuY2lsRnVuY1R5cGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHYuZnVuYyA9PT0gYy5mdW5jICYmIHYucmVmID09PSBjLnJlZiAmJiB2Lm1hc2sgPT09IGMubWFzayAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLnN0ZW5jaWxGdW5jKHYuZnVuYywgdi5yZWYsIHYubWFzayk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGVuY2lsT3AgZXh0ZW5kcyBCYXNlVmFsdWU8U3RlbmNpbE9wVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogU3RlbmNpbE9wVHlwZSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgcmV0dXJuIFtnbC5LRUVQLCBnbC5LRUVQLCBnbC5LRUVQXTtcbiAgICB9XG4gICAgc2V0KHY6IFN0ZW5jaWxPcFR5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiB2WzJdID09PSBjWzJdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuc3RlbmNpbE9wKHZbMF0sIHZbMV0sIHZbMl0pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RlbmNpbFRlc3QgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwdGhSYW5nZSBleHRlbmRzIEJhc2VWYWx1ZTxEZXB0aFJhbmdlVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogRGVwdGhSYW5nZVR5cGUge1xuICAgICAgICByZXR1cm4gWzAsIDFdO1xuICAgIH1cbiAgICBzZXQodjogRGVwdGhSYW5nZVR5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmRlcHRoUmFuZ2UodlswXSwgdlsxXSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aFRlc3QgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aEZ1bmMgZXh0ZW5kcyBCYXNlVmFsdWU8RGVwdGhGdW5jVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogRGVwdGhGdW5jVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkxFU1M7XG4gICAgfVxuICAgIHNldCh2OiBEZXB0aEZ1bmNUeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5kZXB0aEZ1bmModik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbGVuZCBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmxlbmRGdW5jIGV4dGVuZHMgQmFzZVZhbHVlPEJsZW5kRnVuY1R5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IEJsZW5kRnVuY1R5cGUge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHJldHVybiBbZ2wuT05FLCBnbC5aRVJPXTtcbiAgICB9XG4gICAgc2V0KHY6IEJsZW5kRnVuY1R5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmJsZW5kRnVuYyh2WzBdLCB2WzFdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsZW5kQ29sb3IgZXh0ZW5kcyBCYXNlVmFsdWU8Q29sb3I+IHtcbiAgICBnZXREZWZhdWx0KCk6IENvbG9yIHtcbiAgICAgICAgcmV0dXJuIENvbG9yLnRyYW5zcGFyZW50O1xuICAgIH1cbiAgICBzZXQodjogQ29sb3IpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHYuciA9PT0gYy5yICYmIHYuZyA9PT0gYy5nICYmIHYuYiA9PT0gYy5iICYmIHYuYSA9PT0gYy5hICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuYmxlbmRDb2xvcih2LnIsIHYuZywgdi5iLCB2LmEpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmxlbmRFcXVhdGlvbiBleHRlbmRzIEJhc2VWYWx1ZTxCbGVuZEVxdWF0aW9uVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogQmxlbmRFcXVhdGlvblR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5GVU5DX0FERDtcbiAgICB9XG4gICAgc2V0KHY6IEJsZW5kRXF1YXRpb25UeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5ibGVuZEVxdWF0aW9uKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VsbEZhY2UgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VsbEZhY2VTaWRlIGV4dGVuZHMgQmFzZVZhbHVlPEN1bGxGYWNlTW9kZVR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IEN1bGxGYWNlTW9kZVR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5CQUNLO1xuICAgIH1cbiAgICBzZXQodjogQ3VsbEZhY2VNb2RlVHlwZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY3VsbEZhY2Uodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGcm9udEZhY2UgZXh0ZW5kcyBCYXNlVmFsdWU8RnJvbnRGYWNlVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogRnJvbnRGYWNlVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkNDVztcbiAgICB9XG4gICAgc2V0KHY6IEZyb250RmFjZVR5cGUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmZyb250RmFjZSh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyYW0gZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMUHJvZ3JhbT4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xQcm9ncmFtIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xQcm9ncmFtKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aXZlVGV4dHVyZVVuaXQgZXh0ZW5kcyBCYXNlVmFsdWU8VGV4dHVyZVVuaXRUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBUZXh0dXJlVW5pdFR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5URVhUVVJFMDtcbiAgICB9XG4gICAgc2V0KHY6IFRleHR1cmVVbml0VHlwZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZpZXdwb3J0IGV4dGVuZHMgQmFzZVZhbHVlPFZpZXdwb3J0VHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogVmlld3BvcnRUeXBlIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICByZXR1cm4gWzAsIDAsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodF07XG4gICAgfVxuICAgIHNldCh2OiBWaWV3cG9ydFR5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiB2WzJdID09PSBjWzJdICYmIHZbM10gPT09IGNbM10gJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC52aWV3cG9ydCh2WzBdLCB2WzFdLCB2WzJdLCB2WzNdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRGcmFtZWJ1ZmZlciBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xGcmFtZWJ1ZmZlcj4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xGcmFtZWJ1ZmZlciB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMRnJhbWVidWZmZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kUmVuZGVyYnVmZmVyIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTFJlbmRlcmJ1ZmZlcj4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xSZW5kZXJidWZmZXIge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTFJlbmRlcmJ1ZmZlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuYmluZFJlbmRlcmJ1ZmZlcihnbC5SRU5ERVJCVUZGRVIsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZFRleHR1cmUgZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMVGV4dHVyZT4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xUZXh0dXJlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xUZXh0dXJlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRWZXJ0ZXhCdWZmZXIgZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMQnVmZmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTEJ1ZmZlciB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMQnVmZmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kRWxlbWVudEJ1ZmZlciBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xCdWZmZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IFdlYkdMQnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xCdWZmZXIpIHtcbiAgICAgICAgLy8gQWx3YXlzIHJlYmluZFxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZFZlcnRleEFycmF5T0VTIGV4dGVuZHMgQmFzZVZhbHVlPGFueT4ge1xuICAgIHZhbzogYW55O1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgICAgdGhpcy52YW8gPSBjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0O1xuICAgIH1cbiAgICBnZXREZWZhdWx0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy52YW8gfHwgdiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMudmFvLmJpbmRWZXJ0ZXhBcnJheU9FUyh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpeGVsU3RvcmVVbnBhY2sgZXh0ZW5kcyBCYXNlVmFsdWU8bnVtYmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gNDtcbiAgICB9XG4gICAgc2V0KHY6IG51bWJlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCAodjogYW55KSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaXhlbFN0b3JlVW5wYWNrRmxpcFkgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19GTElQX1lfV0VCR0wsICh2OiBhbnkpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuY2xhc3MgRnJhbWVidWZmZXJBdHRhY2htZW50PFQ+IGV4dGVuZHMgQmFzZVZhbHVlPD9UPiB7XG4gICAgcGFyZW50OiBXZWJHTEZyYW1lYnVmZmVyO1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBwYXJlbnQ6IFdlYkdMRnJhbWVidWZmZXIpIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICBnZXREZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvckF0dGFjaG1lbnQgZXh0ZW5kcyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQ8V2ViR0xUZXh0dXJlPiB7XG4gICAgc2V0RGlydHkoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMVGV4dHVyZSk6IHZvaWQge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KHRoaXMucGFyZW50KTtcbiAgICAgICAgLy8gbm90ZTogaXQncyBwb3NzaWJsZSB0byBhdHRhY2ggYSByZW5kZXJidWZmZXIgdG8gdGhlIGNvbG9yXG4gICAgICAgIC8vIGF0dGFjaG1lbnQgcG9pbnQsIGJ1dCB0aHVzIGZhciBNQkdMIG9ubHkgdXNlcyB0ZXh0dXJlcyBmb3IgY29sb3JcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHYsIDApO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwdGhBdHRhY2htZW50IGV4dGVuZHMgRnJhbWVidWZmZXJBdHRhY2htZW50PFdlYkdMUmVuZGVyYnVmZmVyPiB7XG4gICAgc2V0KHY6ID9XZWJHTFJlbmRlcmJ1ZmZlcik6IHZvaWQge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KHRoaXMucGFyZW50KTtcbiAgICAgICAgLy8gbm90ZTogaXQncyBwb3NzaWJsZSB0byBhdHRhY2ggYSB0ZXh0dXJlIHRvIHRoZSBkZXB0aCBhdHRhY2htZW50XG4gICAgICAgIC8vIHBvaW50LCBidXQgdGh1cyBmYXIgTUJHTCBvbmx5IHVzZXMgcmVuZGVyYnVmZmVycyBmb3IgZGVwdGhcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZ2wuREVQVEhfQVRUQUNITUVOVCwgZ2wuUkVOREVSQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgeyBDb2xvckF0dGFjaG1lbnQsIERlcHRoQXR0YWNobWVudCB9IGZyb20gJy4vdmFsdWUnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XG5cbmNsYXNzIEZyYW1lYnVmZmVyIHtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgZnJhbWVidWZmZXI6IFdlYkdMRnJhbWVidWZmZXI7XG4gICAgY29sb3JBdHRhY2htZW50OiBDb2xvckF0dGFjaG1lbnQ7XG4gICAgZGVwdGhBdHRhY2htZW50OiBEZXB0aEF0dGFjaG1lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGZibyA9IHRoaXMuZnJhbWVidWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG4gICAgICAgIHRoaXMuY29sb3JBdHRhY2htZW50ID0gbmV3IENvbG9yQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgICAgICB0aGlzLmRlcHRoQXR0YWNobWVudCA9IG5ldyBEZXB0aEF0dGFjaG1lbnQoY29udGV4dCwgZmJvKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcblxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gdGhpcy5jb2xvckF0dGFjaG1lbnQuZ2V0KCk7XG4gICAgICAgIGlmICh0ZXh0dXJlKSBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO1xuXG4gICAgICAgIGNvbnN0IHJlbmRlcmJ1ZmZlciA9IHRoaXMuZGVwdGhBdHRhY2htZW50LmdldCgpO1xuICAgICAgICBpZiAocmVuZGVyYnVmZmVyKSBnbC5kZWxldGVSZW5kZXJidWZmZXIocmVuZGVyYnVmZmVyKTtcblxuICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZyYW1lYnVmZmVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgRGVwdGhGdW5jVHlwZSwgRGVwdGhNYXNrVHlwZSwgRGVwdGhSYW5nZVR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQUxXQVlTID0gMHgwMjA3O1xuXG5jbGFzcyBEZXB0aE1vZGUge1xuICAgIGZ1bmM6IERlcHRoRnVuY1R5cGU7XG4gICAgbWFzazogRGVwdGhNYXNrVHlwZTtcbiAgICByYW5nZTogRGVwdGhSYW5nZVR5cGU7XG5cbiAgICAvLyBEZXB0aE1hc2sgZW51bXNcbiAgICBzdGF0aWMgUmVhZE9ubHk6IGJvb2xlYW47XG4gICAgc3RhdGljIFJlYWRXcml0ZTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGRlcHRoRnVuYzogRGVwdGhGdW5jVHlwZSwgZGVwdGhNYXNrOiBEZXB0aE1hc2tUeXBlLCBkZXB0aFJhbmdlOiBEZXB0aFJhbmdlVHlwZSkge1xuICAgICAgICB0aGlzLmZ1bmMgPSBkZXB0aEZ1bmM7XG4gICAgICAgIHRoaXMubWFzayA9IGRlcHRoTWFzaztcbiAgICAgICAgdGhpcy5yYW5nZSA9IGRlcHRoUmFuZ2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGRpc2FibGVkOiAkUmVhZE9ubHk8RGVwdGhNb2RlPjtcbn1cblxuRGVwdGhNb2RlLlJlYWRPbmx5ID0gZmFsc2U7XG5EZXB0aE1vZGUuUmVhZFdyaXRlID0gdHJ1ZTtcblxuRGVwdGhNb2RlLmRpc2FibGVkID0gbmV3IERlcHRoTW9kZShBTFdBWVMsIERlcHRoTW9kZS5SZWFkT25seSwgWzAsIDFdKTtcblxuZXhwb3J0IGRlZmF1bHQgRGVwdGhNb2RlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgU3RlbmNpbE9wQ29uc3RhbnQsIFN0ZW5jaWxUZXN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IEFMV0FZUyA9IDB4MDIwNztcbmNvbnN0IEtFRVAgPSAweDFFMDA7XG5cbmNsYXNzIFN0ZW5jaWxNb2RlIHtcbiAgICB0ZXN0OiBTdGVuY2lsVGVzdDtcbiAgICByZWY6IG51bWJlcjtcbiAgICBtYXNrOiBudW1iZXI7XG4gICAgZmFpbDogU3RlbmNpbE9wQ29uc3RhbnQ7XG4gICAgZGVwdGhGYWlsOiBTdGVuY2lsT3BDb25zdGFudDtcbiAgICBwYXNzOiBTdGVuY2lsT3BDb25zdGFudDtcblxuICAgIGNvbnN0cnVjdG9yKHRlc3Q6IFN0ZW5jaWxUZXN0LCByZWY6IG51bWJlciwgbWFzazogbnVtYmVyLCBmYWlsOiBTdGVuY2lsT3BDb25zdGFudCxcbiAgICAgICAgZGVwdGhGYWlsOiBTdGVuY2lsT3BDb25zdGFudCwgcGFzczogU3RlbmNpbE9wQ29uc3RhbnQpIHtcbiAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMubWFzayA9IG1hc2s7XG4gICAgICAgIHRoaXMuZmFpbCA9IGZhaWw7XG4gICAgICAgIHRoaXMuZGVwdGhGYWlsID0gZGVwdGhGYWlsO1xuICAgICAgICB0aGlzLnBhc3MgPSBwYXNzO1xuICAgIH1cblxuICAgIHN0YXRpYyBkaXNhYmxlZDogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPjtcbn1cblxuU3RlbmNpbE1vZGUuZGlzYWJsZWQgPSBuZXcgU3RlbmNpbE1vZGUoeyBmdW5jOiBBTFdBWVMsIG1hc2s6IDAgfSwgMCwgMCwgS0VFUCwgS0VFUCwgS0VFUCk7XG5cbmV4cG9ydCBkZWZhdWx0IFN0ZW5jaWxNb2RlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSB7QmxlbmRGdW5jVHlwZSwgQ29sb3JNYXNrVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IFpFUk8gPSAweDAwMDA7XG5jb25zdCBPTkUgPSAweDAwMDE7XG5jb25zdCBPTkVfTUlOVVNfU1JDX0FMUEhBID0gMHgwMzAzO1xuXG5jbGFzcyBDb2xvck1vZGUge1xuICAgIGJsZW5kRnVuY3Rpb246IEJsZW5kRnVuY1R5cGU7XG4gICAgYmxlbmRDb2xvcjogQ29sb3I7XG4gICAgbWFzazogQ29sb3JNYXNrVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGJsZW5kRnVuY3Rpb246IEJsZW5kRnVuY1R5cGUsIGJsZW5kQ29sb3I6IENvbG9yLCBtYXNrOiBDb2xvck1hc2tUeXBlKSB7XG4gICAgICAgIHRoaXMuYmxlbmRGdW5jdGlvbiA9IGJsZW5kRnVuY3Rpb247XG4gICAgICAgIHRoaXMuYmxlbmRDb2xvciA9IGJsZW5kQ29sb3I7XG4gICAgICAgIHRoaXMubWFzayA9IG1hc2s7XG4gICAgfVxuXG4gICAgc3RhdGljIFJlcGxhY2U6IEJsZW5kRnVuY1R5cGU7XG5cbiAgICBzdGF0aWMgZGlzYWJsZWQ6ICRSZWFkT25seTxDb2xvck1vZGU+O1xuICAgIHN0YXRpYyB1bmJsZW5kZWQ6ICRSZWFkT25seTxDb2xvck1vZGU+O1xuICAgIHN0YXRpYyBhbHBoYUJsZW5kZWQ6ICRSZWFkT25seTxDb2xvck1vZGU+O1xufVxuXG5Db2xvck1vZGUuUmVwbGFjZSA9IFtPTkUsIFpFUk9dO1xuXG5Db2xvck1vZGUuZGlzYWJsZWQgPSBuZXcgQ29sb3JNb2RlKENvbG9yTW9kZS5SZXBsYWNlLCBDb2xvci50cmFuc3BhcmVudCwgW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlXSk7XG5Db2xvck1vZGUudW5ibGVuZGVkID0gbmV3IENvbG9yTW9kZShDb2xvck1vZGUuUmVwbGFjZSwgQ29sb3IudHJhbnNwYXJlbnQsIFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXSk7XG5Db2xvck1vZGUuYWxwaGFCbGVuZGVkID0gbmV3IENvbG9yTW9kZShbT05FLCBPTkVfTUlOVVNfU1JDX0FMUEhBXSwgQ29sb3IudHJhbnNwYXJlbnQsIFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXSk7XG5cbmV4cG9ydCBkZWZhdWx0IENvbG9yTW9kZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtDdWxsRmFjZU1vZGVUeXBlLCBGcm9udEZhY2VUeXBlfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQkFDSyA9IDB4MDQwNTtcbmNvbnN0IENDVyA9IDB4MDkwMTtcblxuY2xhc3MgQ3VsbEZhY2VNb2RlIHtcbiAgICBlbmFibGU6IGJvb2xlYW47XG4gICAgbW9kZTogQ3VsbEZhY2VNb2RlVHlwZTtcbiAgICBmcm9udEZhY2U6IEZyb250RmFjZVR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihlbmFibGU6IGJvb2xlYW4sIG1vZGU6IEN1bGxGYWNlTW9kZVR5cGUsIGZyb250RmFjZTogRnJvbnRGYWNlVHlwZSkge1xuICAgICAgICB0aGlzLmVuYWJsZSA9IGVuYWJsZTtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy5mcm9udEZhY2UgPSBmcm9udEZhY2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGRpc2FibGVkOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPjtcbiAgICBzdGF0aWMgYmFja0NDVzogJFJlYWRPbmx5PEN1bGxGYWNlTW9kZT47XG59XG5cbkN1bGxGYWNlTW9kZS5kaXNhYmxlZCA9IG5ldyBDdWxsRmFjZU1vZGUoZmFsc2UsIEJBQ0ssIENDVyk7XG5DdWxsRmFjZU1vZGUuYmFja0NDVyA9IG5ldyBDdWxsRmFjZU1vZGUodHJ1ZSwgQkFDSywgQ0NXKTtcblxuZXhwb3J0IGRlZmF1bHQgQ3VsbEZhY2VNb2RlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCBJbmRleEJ1ZmZlciBmcm9tICcuL2luZGV4X2J1ZmZlcic7XG5cbmltcG9ydCBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCBGcmFtZWJ1ZmZlciBmcm9tICcuL2ZyYW1lYnVmZmVyJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi9kZXB0aF9tb2RlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgQ29sb3JNb2RlIGZyb20gJy4vY29sb3JfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4vY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IENsZWFyQ29sb3IsIENsZWFyRGVwdGgsIENsZWFyU3RlbmNpbCwgQ29sb3JNYXNrLCBEZXB0aE1hc2ssIFN0ZW5jaWxNYXNrLCBTdGVuY2lsRnVuYywgU3RlbmNpbE9wLCBTdGVuY2lsVGVzdCwgRGVwdGhSYW5nZSwgRGVwdGhUZXN0LCBEZXB0aEZ1bmMsIEJsZW5kLCBCbGVuZEZ1bmMsIEJsZW5kQ29sb3IsIEJsZW5kRXF1YXRpb24sIEN1bGxGYWNlLCBDdWxsRmFjZVNpZGUsIEZyb250RmFjZSwgUHJvZ3JhbSwgQWN0aXZlVGV4dHVyZVVuaXQsIFZpZXdwb3J0LCBCaW5kRnJhbWVidWZmZXIsIEJpbmRSZW5kZXJidWZmZXIsIEJpbmRUZXh0dXJlLCBCaW5kVmVydGV4QnVmZmVyLCBCaW5kRWxlbWVudEJ1ZmZlciwgQmluZFZlcnRleEFycmF5T0VTLCBQaXhlbFN0b3JlVW5wYWNrLCBQaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSwgUGl4ZWxTdG9yZVVucGFja0ZsaXBZIH0gZnJvbSAnLi92YWx1ZSc7XG5cbmltcG9ydCB0eXBlIHtUcmlhbmdsZUluZGV4QXJyYXksIExpbmVJbmRleEFycmF5LCBMaW5lU3RyaXBJbmRleEFycmF5fSBmcm9tICcuLi9kYXRhL2luZGV4X2FycmF5X3R5cGUnO1xuaW1wb3J0IHR5cGUge1xuICAgIFN0cnVjdEFycmF5LFxuICAgIFN0cnVjdEFycmF5TWVtYmVyXG59IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbnR5cGUgQ2xlYXJBcmdzID0ge1xuICAgIGNvbG9yPzogQ29sb3IsXG4gICAgZGVwdGg/OiBudW1iZXIsXG4gICAgc3RlbmNpbD86IG51bWJlclxufTtcblxuY2xhc3MgQ29udGV4dCB7XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgICBleHRWZXJ0ZXhBcnJheU9iamVjdDogYW55O1xuICAgIGN1cnJlbnROdW1BdHRyaWJ1dGVzOiA/bnVtYmVyO1xuXG4gICAgY2xlYXJDb2xvcjogQ2xlYXJDb2xvcjtcbiAgICBjbGVhckRlcHRoOiBDbGVhckRlcHRoO1xuICAgIGNsZWFyU3RlbmNpbDogQ2xlYXJTdGVuY2lsO1xuICAgIGNvbG9yTWFzazogQ29sb3JNYXNrO1xuICAgIGRlcHRoTWFzazogRGVwdGhNYXNrO1xuICAgIHN0ZW5jaWxNYXNrOiBTdGVuY2lsTWFzaztcbiAgICBzdGVuY2lsRnVuYzogU3RlbmNpbEZ1bmM7XG4gICAgc3RlbmNpbE9wOiBTdGVuY2lsT3A7XG4gICAgc3RlbmNpbFRlc3Q6IFN0ZW5jaWxUZXN0O1xuICAgIGRlcHRoUmFuZ2U6IERlcHRoUmFuZ2U7XG4gICAgZGVwdGhUZXN0OiBEZXB0aFRlc3Q7XG4gICAgZGVwdGhGdW5jOiBEZXB0aEZ1bmM7XG4gICAgYmxlbmQ6IEJsZW5kO1xuICAgIGJsZW5kRnVuYzogQmxlbmRGdW5jO1xuICAgIGJsZW5kQ29sb3I6IEJsZW5kQ29sb3I7XG4gICAgYmxlbmRFcXVhdGlvbjogQmxlbmRFcXVhdGlvbjtcbiAgICBjdWxsRmFjZTogQ3VsbEZhY2U7XG4gICAgY3VsbEZhY2VTaWRlOiBDdWxsRmFjZVNpZGU7XG4gICAgZnJvbnRGYWNlOiBGcm9udEZhY2U7XG4gICAgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgICBhY3RpdmVUZXh0dXJlOiBBY3RpdmVUZXh0dXJlVW5pdDtcbiAgICB2aWV3cG9ydDogVmlld3BvcnQ7XG4gICAgYmluZEZyYW1lYnVmZmVyOiBCaW5kRnJhbWVidWZmZXI7XG4gICAgYmluZFJlbmRlcmJ1ZmZlcjogQmluZFJlbmRlcmJ1ZmZlcjtcbiAgICBiaW5kVGV4dHVyZTogQmluZFRleHR1cmU7XG4gICAgYmluZFZlcnRleEJ1ZmZlcjogQmluZFZlcnRleEJ1ZmZlcjtcbiAgICBiaW5kRWxlbWVudEJ1ZmZlcjogQmluZEVsZW1lbnRCdWZmZXI7XG4gICAgYmluZFZlcnRleEFycmF5T0VTOiBCaW5kVmVydGV4QXJyYXlPRVM7XG4gICAgcGl4ZWxTdG9yZVVucGFjazogUGl4ZWxTdG9yZVVucGFjaztcbiAgICBwaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYTogUGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGE7XG4gICAgcGl4ZWxTdG9yZVVucGFja0ZsaXBZOiBQaXhlbFN0b3JlVW5wYWNrRmxpcFk7XG5cbiAgICBleHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWM6IGFueTtcbiAgICBleHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXg6IGFueTtcbiAgICBleHRUZXh0dXJlSGFsZkZsb2F0OiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb2xvciA9IG5ldyBDbGVhckNvbG9yKHRoaXMpO1xuICAgICAgICB0aGlzLmNsZWFyRGVwdGggPSBuZXcgQ2xlYXJEZXB0aCh0aGlzKTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwgPSBuZXcgQ2xlYXJTdGVuY2lsKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbG9yTWFzayA9IG5ldyBDb2xvck1hc2sodGhpcyk7XG4gICAgICAgIHRoaXMuZGVwdGhNYXNrID0gbmV3IERlcHRoTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsTWFzayA9IG5ldyBTdGVuY2lsTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsRnVuYyA9IG5ldyBTdGVuY2lsRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsT3AgPSBuZXcgU3RlbmNpbE9wKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0ID0gbmV3IFN0ZW5jaWxUZXN0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoUmFuZ2UgPSBuZXcgRGVwdGhSYW5nZSh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXB0aFRlc3QgPSBuZXcgRGVwdGhUZXN0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoRnVuYyA9IG5ldyBEZXB0aEZ1bmModGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmQgPSBuZXcgQmxlbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmRGdW5jID0gbmV3IEJsZW5kRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZENvbG9yID0gbmV3IEJsZW5kQ29sb3IodGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmRFcXVhdGlvbiA9IG5ldyBCbGVuZEVxdWF0aW9uKHRoaXMpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlID0gbmV3IEN1bGxGYWNlKHRoaXMpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZSA9IG5ldyBDdWxsRmFjZVNpZGUodGhpcyk7XG4gICAgICAgIHRoaXMuZnJvbnRGYWNlID0gbmV3IEZyb250RmFjZSh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbmV3IFByb2dyYW0odGhpcyk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGV4dHVyZSA9IG5ldyBBY3RpdmVUZXh0dXJlVW5pdCh0aGlzKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCh0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kRnJhbWVidWZmZXIgPSBuZXcgQmluZEZyYW1lYnVmZmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRSZW5kZXJidWZmZXIgPSBuZXcgQmluZFJlbmRlcmJ1ZmZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVGV4dHVyZSA9IG5ldyBCaW5kVGV4dHVyZSh0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVmVydGV4QnVmZmVyID0gbmV3IEJpbmRWZXJ0ZXhCdWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZEVsZW1lbnRCdWZmZXIgPSBuZXcgQmluZEVsZW1lbnRCdWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZFZlcnRleEFycmF5T0VTID0gdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCAmJiBuZXcgQmluZFZlcnRleEFycmF5T0VTKHRoaXMpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2sgPSBuZXcgUGl4ZWxTdG9yZVVucGFjayh0aGlzKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSA9IG5ldyBQaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSh0aGlzKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkgPSBuZXcgUGl4ZWxTdG9yZVVucGFja0ZsaXBZKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljID0gKFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnKSB8fFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJykgfHxcbiAgICAgICAgICAgIGdsLmdldEV4dGVuc2lvbignV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXggPSBnbC5nZXRQYXJhbWV0ZXIodGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUhhbGZGbG9hdCA9IGdsLmdldEV4dGVuc2lvbignT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcpO1xuICAgICAgICBpZiAodGhpcy5leHRUZXh0dXJlSGFsZkZsb2F0KSB7XG4gICAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLnVuYmluZFZBTygpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb2xvci5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xlYXJEZXB0aC5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb2xvck1hc2suc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlcHRoTWFzay5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc3RlbmNpbE1hc2suc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxGdW5jLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsT3Auc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5kZXB0aFJhbmdlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5kZXB0aFRlc3Quc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlcHRoRnVuYy5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYmxlbmQuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmJsZW5kRnVuYy5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYmxlbmRDb2xvci5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYmxlbmRFcXVhdGlvbi5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY3VsbEZhY2Uuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZnJvbnRGYWNlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVUZXh0dXJlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5iaW5kRnJhbWVidWZmZXIuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2suc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHNldERpcnR5KCkge1xuICAgICAgICB0aGlzLmNsZWFyQ29sb3IuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsZWFyRGVwdGguZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29sb3JNYXNrLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXB0aE1hc2suZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVuY2lsRnVuYy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RlbmNpbE9wLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVwdGhUZXN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXB0aEZ1bmMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ibGVuZEZ1bmMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kRXF1YXRpb24uZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1bGxGYWNlLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdWxsRmFjZVNpZGUuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmZyb250RmFjZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMucHJvZ3JhbS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYWN0aXZlVGV4dHVyZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlld3BvcnQuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRGcmFtZWJ1ZmZlci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZFRleHR1cmUuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhCdWZmZXIuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRFbGVtZW50QnVmZmVyLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuZXh0VmVydGV4QXJyYXlPYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZFZlcnRleEFycmF5T0VTLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2suZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNyZWF0ZUluZGV4QnVmZmVyKGFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXkgfCBMaW5lSW5kZXhBcnJheSB8IExpbmVTdHJpcEluZGV4QXJyYXksIGR5bmFtaWNEcmF3PzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gbmV3IEluZGV4QnVmZmVyKHRoaXMsIGFycmF5LCBkeW5hbWljRHJhdyk7XG4gICAgfVxuXG4gICAgY3JlYXRlVmVydGV4QnVmZmVyKGFycmF5OiBTdHJ1Y3RBcnJheSwgYXR0cmlidXRlczogJFJlYWRPbmx5QXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+LCBkeW5hbWljRHJhdz86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXhCdWZmZXIodGhpcywgYXJyYXksIGF0dHJpYnV0ZXMsIGR5bmFtaWNEcmF3KTtcbiAgICB9XG5cbiAgICBjcmVhdGVSZW5kZXJidWZmZXIoc3RvcmFnZUZvcm1hdDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgY29uc3QgcmJvID0gZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5zZXQocmJvKTtcbiAgICAgICAgZ2wucmVuZGVyYnVmZmVyU3RvcmFnZShnbC5SRU5ERVJCVUZGRVIsIHN0b3JhZ2VGb3JtYXQsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmJpbmRSZW5kZXJidWZmZXIuc2V0KG51bGwpO1xuXG4gICAgICAgIHJldHVybiByYm87XG4gICAgfVxuXG4gICAgY3JlYXRlRnJhbWVidWZmZXIod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFtZWJ1ZmZlcih0aGlzLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBjbGVhcih7Y29sb3IsIGRlcHRofTogQ2xlYXJBcmdzKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgbGV0IG1hc2sgPSAwO1xuXG4gICAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgICAgbWFzayB8PSBnbC5DT0xPUl9CVUZGRVJfQklUO1xuICAgICAgICAgICAgdGhpcy5jbGVhckNvbG9yLnNldChjb2xvcik7XG4gICAgICAgICAgICB0aGlzLmNvbG9yTWFzay5zZXQoW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVwdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBtYXNrIHw9IGdsLkRFUFRIX0JVRkZFUl9CSVQ7XG5cbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHBsYXRmb3JtcyB3aGVyZSBjbGVhckRlcHRoIGRvZXNuJ3Qgc2VlbSB0byB3b3JrXG4gICAgICAgICAgICAvLyB3aXRob3V0IHJlc2V0aW5nIHRoZSBkZXB0aFJhbmdlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM0MzdcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYW5nZS5zZXQoWzAsIDFdKTtcblxuICAgICAgICAgICAgdGhpcy5jbGVhckRlcHRoLnNldChkZXB0aCk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoTWFzay5zZXQodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWUgbm90ZSBpbiBQYWludGVyI2NsZWFyU3RlbmNpbDogaW1wbGVtZW50IHRoaXMgdGhlIGVhc3kgd2F5IG9uY2UgR1BVIGJ1Zy93b3JrYXJvdW5kIGlzIGZpeGVkIHVwc3RyZWFtXG4gICAgICAgIC8vIGlmICh0eXBlb2Ygc3RlbmNpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gICAgIG1hc2sgfD0gZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuICAgICAgICAvLyAgICAgdGhpcy5jbGVhclN0ZW5jaWwuc2V0KHN0ZW5jaWwpO1xuICAgICAgICAvLyAgICAgdGhpcy5zdGVuY2lsTWFzay5zZXQoMHhGRik7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBnbC5jbGVhcihtYXNrKTtcbiAgICB9XG5cbiAgICBzZXRDdWxsRmFjZShjdWxsRmFjZU1vZGU6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+KSB7XG4gICAgICAgIGlmIChjdWxsRmFjZU1vZGUuZW5hYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5jdWxsRmFjZS5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdWxsRmFjZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZS5zZXQoY3VsbEZhY2VNb2RlLm1vZGUpO1xuICAgICAgICAgICAgdGhpcy5mcm9udEZhY2Uuc2V0KGN1bGxGYWNlTW9kZS5mcm9udEZhY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGVwdGhNb2RlKGRlcHRoTW9kZTogJFJlYWRPbmx5PERlcHRoTW9kZT4pIHtcbiAgICAgICAgaWYgKGRlcHRoTW9kZS5mdW5jID09PSB0aGlzLmdsLkFMV0FZUyAmJiAhZGVwdGhNb2RlLm1hc2spIHtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhUZXN0LnNldChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlcHRoVGVzdC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoRnVuYy5zZXQoZGVwdGhNb2RlLmZ1bmMpO1xuICAgICAgICAgICAgdGhpcy5kZXB0aE1hc2suc2V0KGRlcHRoTW9kZS5tYXNrKTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYW5nZS5zZXQoZGVwdGhNb2RlLnJhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFN0ZW5jaWxNb2RlKHN0ZW5jaWxNb2RlOiAkUmVhZE9ubHk8U3RlbmNpbE1vZGU+KSB7XG4gICAgICAgIGlmIChzdGVuY2lsTW9kZS50ZXN0LmZ1bmMgPT09IHRoaXMuZ2wuQUxXQVlTICYmICFzdGVuY2lsTW9kZS5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LnNldChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LnNldCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbE1hc2suc2V0KHN0ZW5jaWxNb2RlLm1hc2spO1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsT3Auc2V0KFtzdGVuY2lsTW9kZS5mYWlsLCBzdGVuY2lsTW9kZS5kZXB0aEZhaWwsIHN0ZW5jaWxNb2RlLnBhc3NdKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbEZ1bmMuc2V0KHtcbiAgICAgICAgICAgICAgICBmdW5jOiBzdGVuY2lsTW9kZS50ZXN0LmZ1bmMsXG4gICAgICAgICAgICAgICAgcmVmOiBzdGVuY2lsTW9kZS5yZWYsXG4gICAgICAgICAgICAgICAgbWFzazogc3RlbmNpbE1vZGUudGVzdC5tYXNrXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbG9yTW9kZShjb2xvck1vZGU6ICRSZWFkT25seTxDb2xvck1vZGU+KSB7XG4gICAgICAgIGlmIChkZWVwRXF1YWwoY29sb3JNb2RlLmJsZW5kRnVuY3Rpb24sIENvbG9yTW9kZS5SZXBsYWNlKSkge1xuICAgICAgICAgICAgdGhpcy5ibGVuZC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ibGVuZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmJsZW5kRnVuYy5zZXQoY29sb3JNb2RlLmJsZW5kRnVuY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5ibGVuZENvbG9yLnNldChjb2xvck1vZGUuYmxlbmRDb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbG9yTWFzay5zZXQoY29sb3JNb2RlLm1hc2spO1xuICAgIH1cblxuICAgIHVuYmluZFZBTygpIHtcbiAgICAgICAgLy8gVW5iaW5kaW5nIHRoZSBWQU8gcHJldmVudHMgb3RoZXIgdGhpbmdzIChjdXN0b20gbGF5ZXJzLCBuZXcgYnVmZmVyIGNyZWF0aW9uKSBmcm9tXG4gICAgICAgIC8vIHVuaW50ZW50aW9uYWxseSBjaGFuZ2luZyB0aGUgc3RhdGUgb2YgdGhlIGxhc3QgVkFPIHVzZWQuXG4gICAgICAgIGlmICh0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRleHQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBjcmVhdGUgYXMgY3JlYXRlU291cmNlIH0gZnJvbSAnLi9zb3VyY2UnO1xuXG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IHsgRXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IFRpbGVDYWNoZSBmcm9tICcuL3RpbGVfY2FjaGUnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZSc7XG5pbXBvcnQgeyBrZXlzRGlmZmVyZW5jZSB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB7IE92ZXJzY2FsZWRUaWxlSUQgfSBmcm9tICcuL3RpbGVfaWQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFNvdXJjZUZlYXR1cmVTdGF0ZSBmcm9tICcuL3NvdXJjZV9zdGF0ZSc7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge1RpbGVTdGF0ZX0gZnJvbSAnLi90aWxlJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUge1NvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG4vKipcbiAqIGBTb3VyY2VDYWNoZWAgaXMgcmVzcG9uc2libGUgZm9yXG4gKlxuICogIC0gY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYFNvdXJjZWBcbiAqICAtIGZvcndhcmRpbmcgZXZlbnRzIGZyb20gYFNvdXJjZWBcbiAqICAtIGNhY2hpbmcgdGlsZXMgbG9hZGVkIGZyb20gYW4gaW5zdGFuY2Ugb2YgYFNvdXJjZWBcbiAqICAtIGxvYWRpbmcgdGhlIHRpbGVzIG5lZWRlZCB0byByZW5kZXIgYSBnaXZlbiB2aWV3cG9ydFxuICogIC0gdW5sb2FkaW5nIHRoZSBjYWNoZWQgdGlsZXMgbm90IG5lZWRlZCB0byByZW5kZXIgYSBnaXZlbiB2aWV3cG9ydFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFNvdXJjZUNhY2hlIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIG1hcDogTWFwO1xuICAgIHN0eWxlOiBTdHlsZTtcblxuICAgIF9zb3VyY2U6IFNvdXJjZTtcbiAgICBfc291cmNlTG9hZGVkOiBib29sZWFuO1xuICAgIF9zb3VyY2VFcnJvcmVkOiBib29sZWFuO1xuICAgIF90aWxlczoge1thbnldOiBUaWxlfTtcbiAgICBfcHJldkxuZzogbnVtYmVyIHwgdm9pZDtcbiAgICBfY2FjaGU6IFRpbGVDYWNoZTtcbiAgICBfdGltZXJzOiB7W2FueV06IFRpbWVvdXRJRH07XG4gICAgX2NhY2hlVGltZXJzOiB7W2FueV06IFRpbWVvdXRJRH07XG4gICAgX21heFRpbGVDYWNoZVNpemU6ID9udW1iZXI7XG4gICAgX3BhdXNlZDogYm9vbGVhbjtcbiAgICBfc2hvdWxkUmVsb2FkT25SZXN1bWU6IGJvb2xlYW47XG4gICAgX2NvdmVyZWRUaWxlczoge1thbnldOiBib29sZWFufTtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBfaXNJZFJlbmRlcmFibGU6IChpZDogbnVtYmVyLCBzeW1ib2xMYXllcj86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgdXNlZDogYm9vbGVhbjtcbiAgICBfc3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZTtcblxuICAgIHN0YXRpYyBtYXhVbmRlcnpvb21pbmc6IG51bWJlcjtcbiAgICBzdGF0aWMgbWF4T3Zlcnpvb21pbmc6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuXG4gICAgICAgIHRoaXMub24oJ2RhdGEnLCAoZSkgPT4ge1xuICAgICAgICAgICAgLy8gdGhpcy5fc291cmNlTG9hZGVkIHNpZ25pZmllcyB0aGF0IHRoZSBUaWxlSlNPTiBpcyBsb2FkZWQgaWYgYXBwbGljYWJsZS5cbiAgICAgICAgICAgIC8vIGlmIHRoZSBzb3VyY2UgdHlwZSBkb2VzIG5vdCBjb21lIHdpdGggYSBUaWxlSlNPTiwgdGhlIGZsYWcgc2lnbmlmaWVzIHRoZVxuICAgICAgICAgICAgLy8gc291cmNlIGRhdGEgaGFzIGxvYWRlZCAoaS5lIGdlb2pzb24gaGFzIGJlZW4gdGlsZWQgb24gdGhlIHdvcmtlciBhbmQgaXMgcmVhZHkpXG4gICAgICAgICAgICBpZiAoZS5kYXRhVHlwZSA9PT0gJ3NvdXJjZScgJiYgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ21ldGFkYXRhJykgdGhpcy5fc291cmNlTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gZm9yIHNvdXJjZXMgd2l0aCBtdXRhYmxlIGRhdGEsIHRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgdW5kZXJseWluZyBkYXRhXG4gICAgICAgICAgICAvLyB0byBhIHNvdXJjZSBpcyBjaGFuZ2VkLiAoaS5lLiBHZW9KU09OU291cmNlI3NldERhdGEgYW5kIEltYWdlU291cmNlI3NlckNvb3JkaW5hdGVzKVxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZUxvYWRlZCAmJiAhdGhpcy5fcGF1c2VkICYmIGUuZGF0YVR5cGUgPT09IFwic291cmNlXCIgJiYgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VFcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fc291cmNlID0gY3JlYXRlU291cmNlKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCB0aGlzKTtcblxuICAgICAgICB0aGlzLl90aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLl9jYWNoZSA9IG5ldyBUaWxlQ2FjaGUoMCwgdGhpcy5fdW5sb2FkVGlsZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fdGltZXJzID0ge307XG4gICAgICAgIHRoaXMuX2NhY2hlVGltZXJzID0ge307XG4gICAgICAgIHRoaXMuX21heFRpbGVDYWNoZVNpemUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2NvdmVyZWRUaWxlcyA9IHt9O1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IG5ldyBTb3VyY2VGZWF0dXJlU3RhdGUoKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IG1hcCA/IG1hcC5fbWF4VGlsZUNhY2hlU2l6ZSA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlLm9uQWRkKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2Uub25BZGQobWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVtb3ZlKG1hcDogTWFwKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlLm9uUmVtb3ZlKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2Uub25SZW1vdmUobWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIG5vIHRpbGUgZGF0YSBpcyBwZW5kaW5nLCB0aWxlcyB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzXG4gICAgICogYW4gYWRkaXRpb25hbCBBUEkgY2FsbCBpcyByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VFcnJvcmVkKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIGlmICghdGhpcy5fc291cmNlTG9hZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZS5sb2FkZWQoKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgZm9yIChjb25zdCB0IGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbdF07XG4gICAgICAgICAgICBpZiAodGlsZS5zdGF0ZSAhPT0gJ2xvYWRlZCcgJiYgdGlsZS5zdGF0ZSAhPT0gJ2Vycm9yZWQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRTb3VyY2UoKTogU291cmNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcGF1c2VkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNob3VsZFJlbG9hZCA9IHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lO1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHNob3VsZFJlbG9hZCkgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtKSB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgX2xvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLmxvYWRUaWxlKHRpbGUsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBfdW5sb2FkVGlsZSh0aWxlOiBUaWxlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UudW5sb2FkVGlsZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2UudW5sb2FkVGlsZSh0aWxlLCAoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgX2Fib3J0VGlsZSh0aWxlOiBUaWxlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5hYm9ydFRpbGUodGlsZSwgKCkgPT4ge30pO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5zZXJpYWxpemUoKTtcbiAgICB9XG5cbiAgICBwcmVwYXJlKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgICh0aGlzLl9zb3VyY2UucHJlcGFyZSkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlLnByZXBhcmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N0YXRlLmNvYWxlc2NlQ2hhbmdlcyh0aGlzLl90aWxlcywgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCk7XG4gICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2ldO1xuICAgICAgICAgICAgdGlsZS51cGxvYWQoY29udGV4dCk7XG4gICAgICAgICAgICB0aWxlLnByZXBhcmUodGhpcy5tYXAuc3R5bGUuaW1hZ2VNYW5hZ2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbGwgdGlsZSBpZHMgb3JkZXJlZCB3aXRoIHotb3JkZXIsIGFuZCBjYXN0IHRvIG51bWJlcnNcbiAgICAgKi9cbiAgICBnZXRJZHMoKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl90aWxlcykubWFwKE51bWJlcikuc29ydChjb21wYXJlS2V5Wm9vbSk7XG4gICAgfVxuXG4gICAgZ2V0UmVuZGVyYWJsZUlkcyhzeW1ib2xMYXllcj86IGJvb2xlYW4pOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgaWRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0lkUmVuZGVyYWJsZSgraWQsIHN5bWJvbExheWVyKSkgaWRzLnB1c2goK2lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3ltYm9sTGF5ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBpZHMuc29ydCgoYV8sIGJfKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IHRoaXMuX3RpbGVzW2FfXS50aWxlSUQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMuX3RpbGVzW2JfXS50aWxlSUQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZEEgPSAobmV3IFBvaW50KGEuY2Fub25pY2FsLngsIGEuY2Fub25pY2FsLnkpKS5fcm90YXRlKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQiA9IChuZXcgUG9pbnQoYi5jYW5vbmljYWwueCwgYi5jYW5vbmljYWwueSkpLl9yb3RhdGUodGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm92ZXJzY2FsZWRaIC0gYi5vdmVyc2NhbGVkWiB8fCByb3RhdGVkQi55IC0gcm90YXRlZEEueSB8fCByb3RhdGVkQi54IC0gcm90YXRlZEEueDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZHMuc29ydChjb21wYXJlS2V5Wm9vbSk7XG4gICAgfVxuXG4gICAgaGFzUmVuZGVyYWJsZVBhcmVudCh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgY29uc3QgcGFyZW50VGlsZSA9IHRoaXMuZmluZExvYWRlZFBhcmVudCh0aWxlSUQsIDApO1xuICAgICAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzSWRSZW5kZXJhYmxlKHBhcmVudFRpbGUudGlsZUlELmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF9pc0lkUmVuZGVyYWJsZShpZDogbnVtYmVyLCBzeW1ib2xMYXllcj86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVzW2lkXSAmJiB0aGlzLl90aWxlc1tpZF0uaGFzRGF0YSgpICYmXG4gICAgICAgICAgICAhdGhpcy5fY292ZXJlZFRpbGVzW2lkXSAmJiAoc3ltYm9sTGF5ZXIgfHwgIXRoaXMuX3RpbGVzW2lkXS5ob2xkaW5nRm9yRmFkZSgpKTtcbiAgICB9XG5cbiAgICByZWxvYWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhY2hlLnJlc2V0KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGlsZXNbaV0uc3RhdGUgIT09IFwiZXJyb3JlZFwiKSB0aGlzLl9yZWxvYWRUaWxlKGksICdyZWxvYWRpbmcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZWxvYWRUaWxlKGlkOiBzdHJpbmcgfCBudW1iZXIsIHN0YXRlOiBUaWxlU3RhdGUpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcblxuICAgICAgICAvLyB0aGlzIHBvdGVudGlhbGx5IGRvZXMgbm90IGFkZHJlc3MgYWxsIHVuZGVybHlpbmdcbiAgICAgICAgLy8gaXNzdWVzIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy80MjUyXG4gICAgICAgIC8vIC0gaGFyZCB0byB0ZWxsIHdpdGhvdXQgcmVwcm8gc3RlcHNcbiAgICAgICAgaWYgKCF0aWxlKSByZXR1cm47XG5cbiAgICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBcImxvYWRpbmdcIiB0aWxlcyBhbmQgXCJyZWxvYWRpbmdcIiBvciBcImV4cGlyZWRcIlxuICAgICAgICAvLyB0aWxlcyBpcyB0aGF0IFwicmVsb2FkaW5nXCIvXCJleHBpcmVkXCIgdGlsZXMgYXJlIFwicmVuZGVyYWJsZVwiLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIGEgXCJsb2FkaW5nXCIgdGlsZSBjYW5ub3QgYmVjb21lIGEgXCJyZWxvYWRpbmdcIiB0aWxlIHdpdGhvdXRcbiAgICAgICAgLy8gZmlyc3QgYmVjb21pbmcgYSBcImxvYWRlZFwiIHRpbGUuXG4gICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWRUaWxlKHRpbGUsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlLCBpZCwgc3RhdGUpKTtcbiAgICB9XG5cbiAgICBfdGlsZUxvYWRlZCh0aWxlOiBUaWxlLCBpZDogc3RyaW5nIHwgbnVtYmVyLCBwcmV2aW91c1N0YXRlOiBUaWxlU3RhdGUsIGVycjogP0Vycm9yKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgICAgICAgICBpZiAoKGVycjogYW55KS5zdGF0dXMgIT09IDQwNCkgdGhpcy5fc291cmNlLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyLCB7dGlsZX0pKTtcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHRyeSBsb2FkaW5nIHBhcmVudC9jaGlsZHJlbiB0aWxlcyBpZiBhIHRpbGUgZG9lc24ndCBleGlzdCAoNDA0KVxuICAgICAgICAgICAgZWxzZSB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aWxlLnRpbWVBZGRlZCA9IGJyb3dzZXIubm93KCk7XG4gICAgICAgIGlmIChwcmV2aW91c1N0YXRlID09PSAnZXhwaXJlZCcpIHRpbGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoaWQsIHRpbGUpO1xuICAgICAgICBpZiAodGhpcy5nZXRTb3VyY2UoKS50eXBlID09PSAncmFzdGVyLWRlbScgJiYgdGlsZS5kZW0pIHRoaXMuX2JhY2tmaWxsREVNKHRpbGUpO1xuICAgICAgICB0aGlzLl9zdGF0ZS5pbml0aWFsaXplVGlsZVN0YXRlKHRpbGUsIHRoaXMubWFwID8gdGhpcy5tYXAucGFpbnRlciA6IG51bGwpO1xuXG4gICAgICAgIHRoaXMuX3NvdXJjZS5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHRpbGUsIGNvb3JkOiB0aWxlLnRpbGVJRH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEZvciByYXN0ZXIgdGVycmFpbiBzb3VyY2UsIGJhY2tmaWxsIERFTSB0byBlbGltaW5hdGUgdmlzaWJsZSB0aWxlIGJvdW5kYXJpZXNcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBfYmFja2ZpbGxERU0odGlsZTogVGlsZSkge1xuICAgICAgICBjb25zdCByZW5kZXJhYmxlcyA9IHRoaXMuZ2V0UmVuZGVyYWJsZUlkcygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJJZCA9IHJlbmRlcmFibGVzW2ldO1xuICAgICAgICAgICAgaWYgKHRpbGUubmVpZ2hib3JpbmdUaWxlcyAmJiB0aWxlLm5laWdoYm9yaW5nVGlsZXNbYm9yZGVySWRdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyVGlsZSA9IHRoaXMuZ2V0VGlsZUJ5SUQoYm9yZGVySWQpO1xuICAgICAgICAgICAgICAgIGZpbGxCb3JkZXIodGlsZSwgYm9yZGVyVGlsZSk7XG4gICAgICAgICAgICAgICAgZmlsbEJvcmRlcihib3JkZXJUaWxlLCB0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGZpbGxCb3JkZXIodGlsZSwgYm9yZGVyVGlsZSkge1xuICAgICAgICAgICAgdGlsZS5uZWVkc0hpbGxzaGFkZVByZXBhcmUgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGR4ID0gYm9yZGVyVGlsZS50aWxlSUQuY2Fub25pY2FsLnggLSB0aWxlLnRpbGVJRC5jYW5vbmljYWwueDtcbiAgICAgICAgICAgIGNvbnN0IGR5ID0gYm9yZGVyVGlsZS50aWxlSUQuY2Fub25pY2FsLnkgLSB0aWxlLnRpbGVJRC5jYW5vbmljYWwueTtcbiAgICAgICAgICAgIGNvbnN0IGRpbSA9IE1hdGgucG93KDIsIHRpbGUudGlsZUlELmNhbm9uaWNhbC56KTtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlcklkID0gYm9yZGVyVGlsZS50aWxlSUQua2V5O1xuICAgICAgICAgICAgaWYgKGR4ID09PSAwICYmIGR5ID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR4KSA+IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIGRlbHRhIGNvb3JkaW5hdGUgZm9yIHdvcmxkIHdyYXBhcm91bmQuXG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR4ICsgZGltKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBkeCArPSBkaW07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhkeCAtIGRpbSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZHggLT0gZGltO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYm9yZGVyVGlsZS5kZW0gfHwgIXRpbGUuZGVtKSByZXR1cm47XG4gICAgICAgICAgICB0aWxlLmRlbS5iYWNrZmlsbEJvcmRlcihib3JkZXJUaWxlLmRlbSwgZHgsIGR5KTtcbiAgICAgICAgICAgIGlmICh0aWxlLm5laWdoYm9yaW5nVGlsZXMgJiYgdGlsZS5uZWlnaGJvcmluZ1RpbGVzW2JvcmRlcklkXSlcbiAgICAgICAgICAgICAgICB0aWxlLm5laWdoYm9yaW5nVGlsZXNbYm9yZGVySWRdLmJhY2tmaWxsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIHNwZWNpZmljIHRpbGUgYnkgVGlsZUlEXG4gICAgICovXG4gICAgZ2V0VGlsZSh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiBUaWxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGlsZUJ5SUQodGlsZUlELmtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc3BlY2lmaWMgdGlsZSBieSBpZFxuICAgICAqL1xuICAgIGdldFRpbGVCeUlEKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBUaWxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVzW2lkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXQgdGhlIHpvb20gbGV2ZWwgYWRqdXN0ZWQgZm9yIHRoZSBkaWZmZXJlbmNlIGluIG1hcCBhbmQgc291cmNlIHRpbGVzaXplc1xuICAgICAqL1xuICAgIGdldFpvb20odHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnpvb20gKyB0cmFuc2Zvcm0uc2NhbGVab29tKHRyYW5zZm9ybS50aWxlU2l6ZSAvIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGEgZ2l2ZW4gc2V0IG9mIHRpbGVzLCByZXRhaW4gY2hpbGRyZW4gdGhhdCBhcmUgbG9hZGVkIGFuZCBoYXZlIGEgem9vbVxuICAgICAqIGJldHdlZW4gYHpvb21gIChleGNsdXNpdmUpIGFuZCBgbWF4Q292ZXJpbmdab29tYCAoaW5jbHVzaXZlKVxuICAgICAqL1xuICAgIF9yZXRhaW5Mb2FkZWRDaGlsZHJlbihcbiAgICAgICAgaWRlYWxUaWxlczoge1thbnldOiBPdmVyc2NhbGVkVGlsZUlEfSxcbiAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICBtYXhDb3ZlcmluZ1pvb206IG51bWJlcixcbiAgICAgICAgcmV0YWluOiB7W2FueV06IE92ZXJzY2FsZWRUaWxlSUR9XG4gICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuXG4gICAgICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIHJlbmRlcmFibGUgdGlsZXMgdXAgdG8gbWF4Q292ZXJpbmdab29tXG4gICAgICAgICAgICBpZiAocmV0YWluW2lkXSB8fFxuICAgICAgICAgICAgICAgICF0aWxlLmhhc0RhdGEoKSB8fFxuICAgICAgICAgICAgICAgIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIDw9IHpvb20gfHxcbiAgICAgICAgICAgICAgICB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiA+IG1heENvdmVyaW5nWm9vbVxuICAgICAgICAgICAgKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHBhcmVudHMgYW5kIHJldGFpbiB0aGUgdG9wbW9zdCBsb2FkZWQgb25lIGlmIGZvdW5kXG4gICAgICAgICAgICBsZXQgdG9wbW9zdExvYWRlZElEID0gdGlsZS50aWxlSUQ7XG4gICAgICAgICAgICB3aGlsZSAodGlsZSAmJiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiA+IHpvb20gKyAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SUQgPSB0aWxlLnRpbGVJRC5zY2FsZWRUbyh0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIDEpO1xuXG4gICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW3BhcmVudElELmtleV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgICAgICAgICB0b3Btb3N0TG9hZGVkSUQgPSBwYXJlbnRJRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBhbmNlc3RvcnMgb2YgdGhlIHRvcG1vc3QgbG9hZGVkIGNoaWxkIHRvIHNlZSBpZiB0aGVyZSdzIG9uZSB0aGF0IG5lZWRlZCBpdFxuICAgICAgICAgICAgbGV0IHRpbGVJRCA9IHRvcG1vc3RMb2FkZWRJRDtcbiAgICAgICAgICAgIHdoaWxlICh0aWxlSUQub3ZlcnNjYWxlZFogPiB6b29tKSB7XG4gICAgICAgICAgICAgICAgdGlsZUlEID0gdGlsZUlELnNjYWxlZFRvKHRpbGVJRC5vdmVyc2NhbGVkWiAtIDEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlkZWFsVGlsZXNbdGlsZUlELmtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBwYXJlbnQgdGhhdCBuZWVkZWQgYSBsb2FkZWQgY2hpbGQ7IHJldGFpbiB0aGF0IGNoaWxkXG4gICAgICAgICAgICAgICAgICAgIHJldGFpblt0b3Btb3N0TG9hZGVkSUQua2V5XSA9IHRvcG1vc3RMb2FkZWRJRDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIGxvYWRlZCBwYXJlbnQgb2YgdGhlIGdpdmVuIHRpbGUgKHVwIHRvIG1pbkNvdmVyaW5nWm9vbSlcbiAgICAgKi9cbiAgICBmaW5kTG9hZGVkUGFyZW50KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgbWluQ292ZXJpbmdab29tOiBudW1iZXIpOiA/VGlsZSB7XG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlSUQub3ZlcnNjYWxlZFogLSAxOyB6ID49IG1pbkNvdmVyaW5nWm9vbTsgei0tKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aWxlSUQuc2NhbGVkVG8oeik7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaWQgPSBTdHJpbmcocGFyZW50LmtleSk7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICAgICAgaWYgKHRpbGUgJiYgdGlsZS5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZS5oYXMocGFyZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5nZXQocGFyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIHRpbGUgY2FjaGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld3BvcnQncyBzaXplXG4gICAgICogb3IgdGhlIG1heFRpbGVDYWNoZVNpemUgb3B0aW9uIHBhc3NlZCBkdXJpbmcgbWFwIGNyZWF0aW9uXG4gICAgICpcbiAgICAgKiBMYXJnZXIgdmlld3BvcnRzIHVzZSBtb3JlIHRpbGVzIGFuZCBuZWVkIGxhcmdlciBjYWNoZXMuIExhcmdlciB2aWV3cG9ydHNcbiAgICAgKiBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgZm91bmQgb24gZGV2aWNlcyB3aXRoIG1vcmUgbWVtb3J5IGFuZCBvbiBwYWdlcyB3aGVyZVxuICAgICAqIHRoZSBtYXAgaXMgbW9yZSBpbXBvcnRhbnQuXG4gICAgICovXG4gICAgdXBkYXRlQ2FjaGVTaXplKHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG4gICAgICAgIGNvbnN0IHdpZHRoSW5UaWxlcyA9IE1hdGguY2VpbCh0cmFuc2Zvcm0ud2lkdGggLyB0aGlzLl9zb3VyY2UudGlsZVNpemUpICsgMTtcbiAgICAgICAgY29uc3QgaGVpZ2h0SW5UaWxlcyA9IE1hdGguY2VpbCh0cmFuc2Zvcm0uaGVpZ2h0IC8gdGhpcy5fc291cmNlLnRpbGVTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGFwcHJveFRpbGVzSW5WaWV3ID0gd2lkdGhJblRpbGVzICogaGVpZ2h0SW5UaWxlcztcbiAgICAgICAgY29uc3QgY29tbW9uWm9vbVJhbmdlID0gNTtcblxuICAgICAgICBjb25zdCB2aWV3RGVwZW5kZW50TWF4U2l6ZSA9IE1hdGguZmxvb3IoYXBwcm94VGlsZXNJblZpZXcgKiBjb21tb25ab29tUmFuZ2UpO1xuICAgICAgICBjb25zdCBtYXhTaXplID0gdHlwZW9mIHRoaXMuX21heFRpbGVDYWNoZVNpemUgPT09ICdudW1iZXInID8gTWF0aC5taW4odGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSwgdmlld0RlcGVuZGVudE1heFNpemUpIDogdmlld0RlcGVuZGVudE1heFNpemU7XG5cbiAgICAgICAgdGhpcy5fY2FjaGUuc2V0TWF4U2l6ZShtYXhTaXplKTtcbiAgICB9XG5cbiAgICBoYW5kbGVXcmFwSnVtcChsbmc6IG51bWJlcikge1xuICAgICAgICAvLyBPbiB0b3Agb2YgdGhlIHJlZ3VsYXIgei94L3kgdmFsdWVzLCBUaWxlSURzIGhhdmUgYSBgd3JhcGAgdmFsdWUgdGhhdCBzcGVjaWZ5XG4gICAgICAgIC8vIHdoaWNoIGNwcHkgb2YgdGhlIHdvcmxkIHRoZSB0aWxlIGJlbG9uZ3MgdG8uIEZvciBleGFtcGxlLCBhdCBgbG5nOiAxMGAgeW91XG4gICAgICAgIC8vIG1pZ2h0IHJlbmRlciB6L3gveS8wIHdoaWxlIGF0IGBsbmc6IDM3MGAgeW91IHdvdWxkIHJlbmRlciB6L3gveS8xLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIGxuZyB2YWx1ZXMgZ2V0IHdyYXBwZWQgKGdvaW5nIGZyb20gYGxuZzogMzcwYCB0byBgbG9uZzogMTBgKSB5b3UgZXhwZWN0XG4gICAgICAgIC8vIHRvIHNlZSB0aGUgc2FtZSB0aGluZyBvbiB0aGUgc2NyZWVuICgzNzAgZGVncmVlcyBhbmQgMTAgZGVncmVlcyBpcyB0aGUgc2FtZVxuICAgICAgICAvLyBwbGFjZSBpbiB0aGUgd29ybGQpIGJ1dCBhbGwgdGhlIFRpbGVJRHMgd2lsbCBoYXZlIGRpZmZlcmVudCB3cmFwIHZhbHVlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gbWFrZSB0aGlzIHRyYW5zaXRpb24gc2VhbWxlc3MsIHdlIGNhbGN1bGF0ZSB0aGUgcm91bmRlZCBkaWZmZXJlbmNlIG9mXG4gICAgICAgIC8vIFwid29ybGRzXCIgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgZnJhbWUuIElmIHRoZSBtYXAgcGFubmVkIGJ5XG4gICAgICAgIC8vIGEgd29ybGQsIHRoZW4gd2UgY2FuIGFzc2lnbiBhbGwgdGhlIHRpbGVzIG5ldyBUaWxlSURzIHdpdGggdXBkYXRlZCB3cmFwIHZhbHVlcy5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGFzc2lnbiB6L3gveS8xIGEgbmV3IGlkOiB6L3gveS8wLiBJdCBpcyB0aGUgc2FtZSB0aWxlLCBqdXN0IHJlbmRlcmVkXG4gICAgICAgIC8vIGluIGEgZGlmZmVyZW50IHBvc2l0aW9uLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcmV1c2UgdGhlIHRpbGVzIGF0IG1vcmUgaWRlYWwgbG9jYXRpb25zIGFuZCBwcmV2ZW50IGZsaWNrZXJpbmcuXG4gICAgICAgIGNvbnN0IHByZXZMbmcgPSB0aGlzLl9wcmV2TG5nID09PSB1bmRlZmluZWQgPyBsbmcgOiB0aGlzLl9wcmV2TG5nO1xuICAgICAgICBjb25zdCBsbmdEaWZmZXJlbmNlID0gbG5nIC0gcHJldkxuZztcbiAgICAgICAgY29uc3Qgd29ybGREaWZmZXJlbmNlID0gbG5nRGlmZmVyZW5jZSAvIDM2MDtcbiAgICAgICAgY29uc3Qgd3JhcERlbHRhID0gTWF0aC5yb3VuZCh3b3JsZERpZmZlcmVuY2UpO1xuICAgICAgICB0aGlzLl9wcmV2TG5nID0gbG5nO1xuXG4gICAgICAgIGlmICh3cmFwRGVsdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1trZXldO1xuICAgICAgICAgICAgICAgIHRpbGUudGlsZUlEID0gdGlsZS50aWxlSUQudW53cmFwVG8odGlsZS50aWxlSUQud3JhcCArIHdyYXBEZWx0YSk7XG4gICAgICAgICAgICAgICAgdGlsZXNbdGlsZS50aWxlSUQua2V5XSA9IHRpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90aWxlcyA9IHRpbGVzO1xuXG4gICAgICAgICAgICAvLyBSZXNldCB0aWxlIHJlbG9hZCB0aW1lcnNcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGltZXJzKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tpZF0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90aW1lcnNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKGlkLCB0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGlsZXMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgdmlld3BvcnQgYW5kIGFkZHMgbmV3IHRpbGVzIHRoYXRcbiAgICAgKiBhcmUgaW5zaWRlIHRoZSB2aWV3cG9ydC5cbiAgICAgKi9cbiAgICB1cGRhdGUodHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIGlmICghdGhpcy5fc291cmNlTG9hZGVkIHx8IHRoaXMuX3BhdXNlZCkgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlU2l6ZSh0cmFuc2Zvcm0pO1xuICAgICAgICB0aGlzLmhhbmRsZVdyYXBKdW1wKHRoaXMudHJhbnNmb3JtLmNlbnRlci5sbmcpO1xuXG4gICAgICAgIC8vIENvdmVyZWQgaXMgYSBsaXN0IG9mIHJldGFpbmVkIHRpbGVzIHdobydzIGFyZWFzIGFyZSBmdWxseSBjb3ZlcmVkIGJ5IG90aGVyLFxuICAgICAgICAvLyBiZXR0ZXIsIHJldGFpbmVkIHRpbGVzLiBUaGV5IGFyZSBub3QgZHJhd24gc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fY292ZXJlZFRpbGVzID0ge307XG5cbiAgICAgICAgbGV0IGlkZWFsVGlsZUlEcztcbiAgICAgICAgaWYgKCF0aGlzLnVzZWQpIHtcbiAgICAgICAgICAgIGlkZWFsVGlsZUlEcyA9IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZS50aWxlSUQpIHtcbiAgICAgICAgICAgIGlkZWFsVGlsZUlEcyA9IHRyYW5zZm9ybS5nZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXModGhpcy5fc291cmNlLnRpbGVJRClcbiAgICAgICAgICAgICAgICAubWFwKCh1bndyYXBwZWQpID0+IG5ldyBPdmVyc2NhbGVkVGlsZUlEKHVud3JhcHBlZC5jYW5vbmljYWwueiwgdW53cmFwcGVkLndyYXAsIHVud3JhcHBlZC5jYW5vbmljYWwueiwgdW53cmFwcGVkLmNhbm9uaWNhbC54LCB1bndyYXBwZWQuY2Fub25pY2FsLnkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlkZWFsVGlsZUlEcyA9IHRyYW5zZm9ybS5jb3ZlcmluZ1RpbGVzKHtcbiAgICAgICAgICAgICAgICB0aWxlU2l6ZTogdGhpcy5fc291cmNlLnRpbGVTaXplLFxuICAgICAgICAgICAgICAgIG1pbnpvb206IHRoaXMuX3NvdXJjZS5taW56b29tLFxuICAgICAgICAgICAgICAgIG1heHpvb206IHRoaXMuX3NvdXJjZS5tYXh6b29tLFxuICAgICAgICAgICAgICAgIHJvdW5kWm9vbTogdGhpcy5fc291cmNlLnJvdW5kWm9vbSxcbiAgICAgICAgICAgICAgICByZXBhcnNlT3ZlcnNjYWxlZDogdGhpcy5fc291cmNlLnJlcGFyc2VPdmVyc2NhbGVkXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5oYXNUaWxlKSB7XG4gICAgICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gaWRlYWxUaWxlSURzLmZpbHRlcigoY29vcmQpID0+ICh0aGlzLl9zb3VyY2UuaGFzVGlsZTogYW55KShjb29yZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBvdmVyem9vbWluZy91bmRlcnpvb21pbmcgYW1vdW50cy5cbiAgICAgICAgY29uc3Qgem9vbSA9ICh0aGlzLl9zb3VyY2Uucm91bmRab29tID8gTWF0aC5yb3VuZCA6IE1hdGguZmxvb3IpKHRoaXMuZ2V0Wm9vbSh0cmFuc2Zvcm0pKTtcbiAgICAgICAgY29uc3QgbWluQ292ZXJpbmdab29tID0gTWF0aC5tYXgoem9vbSAtIFNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nLCB0aGlzLl9zb3VyY2UubWluem9vbSk7XG4gICAgICAgIGNvbnN0IG1heENvdmVyaW5nWm9vbSA9IE1hdGgubWF4KHpvb20gKyBTb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcsICB0aGlzLl9zb3VyY2UubWluem9vbSk7XG5cbiAgICAgICAgLy8gUmV0YWluIGlzIGEgbGlzdCBvZiB0aWxlcyB0aGF0IHdlIHNob3VsZG4ndCBkZWxldGUsIGV2ZW4gaWYgdGhleSBhcmUgbm90XG4gICAgICAgIC8vIHRoZSBtb3N0IGlkZWFsIHRpbGUgZm9yIHRoZSBjdXJyZW50IHZpZXdwb3J0LiBUaGlzIG1heSBpbmNsdWRlIHRpbGVzIGxpa2VcbiAgICAgICAgLy8gcGFyZW50IG9yIGNoaWxkIHRpbGVzIHRoYXQgYXJlICphbHJlYWR5KiBsb2FkZWQuXG4gICAgICAgIGNvbnN0IHJldGFpbiA9IHRoaXMuX3VwZGF0ZVJldGFpbmVkVGlsZXMoaWRlYWxUaWxlSURzLCB6b29tKTtcblxuICAgICAgICBpZiAoaXNSYXN0ZXJUeXBlKHRoaXMuX3NvdXJjZS50eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50c0ZvckZhZGluZyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgZmFkaW5nVGlsZXMgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKHJldGFpbik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVJRCA9IHJldGFpbltpZF07XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHRpbGVJRC5rZXkgPT09ICtpZCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICAgICAgICAgIGlmICghdGlsZSB8fCB0aWxlLmZhZGVFbmRUaW1lICYmIHRpbGUuZmFkZUVuZFRpbWUgPD0gYnJvd3Nlci5ub3coKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGlsZSBpcyBsb2FkZWQgYnV0IHN0aWxsIGZhZGluZyBpbiwgZmluZCBwYXJlbnRzIHRvIGNyb3NzLWZhZGUgd2l0aCBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFRpbGUgPSB0aGlzLmZpbmRMb2FkZWRQYXJlbnQodGlsZUlELCBtaW5Db3ZlcmluZ1pvb20pO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRpbGUocGFyZW50VGlsZS50aWxlSUQpO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRzRm9yRmFkaW5nW3BhcmVudFRpbGUudGlsZUlELmtleV0gPSBwYXJlbnRUaWxlLnRpbGVJRDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmYWRpbmdUaWxlc1tpZF0gPSB0aWxlSUQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciB0aWxlcyB0aGF0IGFyZSBzdGlsbCBmYWRpbmcgaW4sIGFsc28gZmluZCBjaGlsZHJlbiB0byBjcm9zcy1mYWRlIHdpdGhcbiAgICAgICAgICAgIHRoaXMuX3JldGFpbkxvYWRlZENoaWxkcmVuKGZhZGluZ1RpbGVzLCB6b29tLCBtYXhDb3ZlcmluZ1pvb20sIHJldGFpbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gcGFyZW50c0ZvckZhZGluZykge1xuICAgICAgICAgICAgICAgIGlmICghcmV0YWluW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIHRpbGUgaXMgb25seSBuZWVkZWQgZm9yIGZhZGluZywgbWFyayBpdCBhcyBjb3ZlcmVkIHNvIHRoYXQgaXQgaXNuJ3QgcmVuZGVyZWQgb24gaXQncyBvd24uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvdmVyZWRUaWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRhaW5baWRdID0gcGFyZW50c0ZvckZhZGluZ1tpZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXRhaW5lZElkIGluIHJldGFpbikge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJldGFpbmVkIHRpbGVzIGFsd2F5cyBjbGVhciBhbnkgZXhpc3RpbmcgZmFkZSBob2xkc1xuICAgICAgICAgICAgLy8gc28gdGhhdCBpZiB0aGV5J3JlIHJlbW92ZWQgYWdhaW4gdGhlaXIgZmFkZSB0aW1lciBzdGFydHMgZnJlc2guXG4gICAgICAgICAgICB0aGlzLl90aWxlc1tyZXRhaW5lZElkXS5jbGVhckZhZGVIb2xkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRpbGVzIHdlIGRvbid0IG5lZWQgYW55bW9yZS5cbiAgICAgICAgY29uc3QgcmVtb3ZlID0ga2V5c0RpZmZlcmVuY2UodGhpcy5fdGlsZXMsIHJldGFpbik7XG4gICAgICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHJlbW92ZSkge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW3RpbGVJRF07XG4gICAgICAgICAgICBpZiAodGlsZS5oYXNTeW1ib2xCdWNrZXRzICYmICF0aWxlLmhvbGRpbmdGb3JGYWRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnNldEhvbGREdXJhdGlvbih0aGlzLm1hcC5fZmFkZUR1cmF0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRpbGUuaGFzU3ltYm9sQnVja2V0cyB8fCB0aWxlLnN5bWJvbEZhZGVGaW5pc2hlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlVGlsZSh0aWxlSUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVsZWFzZVN5bWJvbEZhZGVUaWxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbGVzW2lkXS5ob2xkaW5nRm9yRmFkZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlVGlsZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlUmV0YWluZWRUaWxlcyhpZGVhbFRpbGVJRHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+LCB6b29tOiBudW1iZXIpOiB7IFtzdHJpbmddOiBPdmVyc2NhbGVkVGlsZUlEfSB7XG4gICAgICAgIGNvbnN0IHJldGFpbiA9IHt9O1xuICAgICAgICBjb25zdCBjaGVja2VkOiB7W251bWJlcl06IGJvb2xlYW4gfSA9IHt9O1xuICAgICAgICBjb25zdCBtaW5Db3ZlcmluZ1pvb20gPSBNYXRoLm1heCh6b29tIC0gU291cmNlQ2FjaGUubWF4T3Zlcnpvb21pbmcsIHRoaXMuX3NvdXJjZS5taW56b29tKTtcbiAgICAgICAgY29uc3QgbWF4Q292ZXJpbmdab29tID0gTWF0aC5tYXgoem9vbSArIFNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZywgIHRoaXMuX3NvdXJjZS5taW56b29tKTtcblxuICAgICAgICBjb25zdCBtaXNzaW5nVGlsZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgaWRlYWxUaWxlSURzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fYWRkVGlsZSh0aWxlSUQpO1xuXG4gICAgICAgICAgICAvLyByZXRhaW4gdGhlIHRpbGUgZXZlbiBpZiBpdCdzIG5vdCBsb2FkZWQgYmVjYXVzZSBpdCdzIGFuIGlkZWFsIHRpbGUuXG4gICAgICAgICAgICByZXRhaW5bdGlsZUlELmtleV0gPSB0aWxlSUQ7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmhhc0RhdGEoKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmICh6b29tIDwgdGhpcy5fc291cmNlLm1heHpvb20pIHtcbiAgICAgICAgICAgICAgICAvLyBzYXZlIG1pc3NpbmcgdGlsZXMgdGhhdCBwb3RlbnRpYWxseSBoYXZlIGxvYWRlZCBjaGlsZHJlblxuICAgICAgICAgICAgICAgIG1pc3NpbmdUaWxlc1t0aWxlSUQua2V5XSA9IHRpbGVJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldGFpbiBhbnkgbG9hZGVkIGNoaWxkcmVuIG9mIGlkZWFsIHRpbGVzIHVwIHRvIG1heENvdmVyaW5nWm9vbVxuICAgICAgICB0aGlzLl9yZXRhaW5Mb2FkZWRDaGlsZHJlbihtaXNzaW5nVGlsZXMsIHpvb20sIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiBpZGVhbFRpbGVJRHMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlELmtleV07XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmhhc0RhdGEoKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIFRoZSB0aWxlIHdlIHJlcXVpcmUgaXMgbm90IHlldCBsb2FkZWQgb3IgZG9lcyBub3QgZXhpc3Q7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGZpbmQgY2hpbGRyZW4gdGhhdCBmdWxseSBjb3ZlciBpdC5cblxuICAgICAgICAgICAgaWYgKHpvb20gKyAxID4gdGhpcy5fc291cmNlLm1heHpvb20pIHtcbiAgICAgICAgICAgICAgICAvLyBXZSdyZSBsb29raW5nIGZvciBhbiBvdmVyem9vbWVkIGNoaWxkIHRpbGUuXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDb29yZCA9IHRpbGVJRC5jaGlsZHJlbih0aGlzLl9zb3VyY2UubWF4em9vbSlbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRUaWxlID0gdGhpcy5nZXRUaWxlKGNoaWxkQ29vcmQpO1xuICAgICAgICAgICAgICAgIGlmICghIWNoaWxkVGlsZSAmJiBjaGlsZFRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltjaGlsZENvb3JkLmtleV0gPSBjaGlsZENvb3JkO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdGlsZSBpcyBjb3ZlcmVkIGJ5IG92ZXJ6b29tZWQgY2hpbGRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFsbCA0IGltbWVkaWF0ZSBjaGlsZHJlbiBhcmUgbG9hZGVkIChpLmUuIHRoZSBtaXNzaW5nIGlkZWFsIHRpbGUgaXMgY292ZXJlZClcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRpbGVJRC5jaGlsZHJlbih0aGlzLl9zb3VyY2UubWF4em9vbSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmV0YWluW2NoaWxkcmVuWzBdLmtleV0gJiZcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2NoaWxkcmVuWzFdLmtleV0gJiZcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2NoaWxkcmVuWzJdLmtleV0gJiZcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2NoaWxkcmVuWzNdLmtleV0pIGNvbnRpbnVlOyAvLyB0aWxlIGlzIGNvdmVyZWQgYnkgY2hpbGRyZW5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgY291bGRuJ3QgZmluZCBjaGlsZCB0aWxlcyB0aGF0IGVudGlyZWx5IGNvdmVyIHRoZSBpZGVhbCB0aWxlOyBsb29rIGZvciBwYXJlbnRzIG5vdy5cblxuICAgICAgICAgICAgLy8gQXMgd2UgYXNjZW5kIHVwIHRoZSB0aWxlIHB5cmFtaWQgb2YgdGhlIGlkZWFsIHRpbGUsIHdlIGNoZWNrIHdoZXRoZXIgdGhlIHBhcmVudFxuICAgICAgICAgICAgLy8gdGlsZSBoYXMgYmVlbiBwcmV2aW91c2x5IHJlcXVlc3RlZCAoYW5kIGVycm9yZWQgYmVjYXVzZSB3ZSBvbmx5IGxvb3Agb3ZlciB0aWxlcyB3aXRoIG5vIGRhdGEpXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byByZXF1ZXN0IGl0cyBwYXJlbnQuXG4gICAgICAgICAgICBsZXQgcGFyZW50V2FzUmVxdWVzdGVkID0gdGlsZS53YXNSZXF1ZXN0ZWQoKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgb3ZlcnNjYWxlZFogPSB0aWxlSUQub3ZlcnNjYWxlZFogLSAxOyBvdmVyc2NhbGVkWiA+PSBtaW5Db3ZlcmluZ1pvb207IC0tb3ZlcnNjYWxlZFopIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRpbGVJRC5zY2FsZWRUbyhvdmVyc2NhbGVkWik7XG5cbiAgICAgICAgICAgICAgICAvLyBCcmVhayBwYXJlbnQgdGlsZSBhc2NlbnQgaWYgdGhpcyByb3V0ZSBoYXMgYmVlbiBwcmV2aW91c2x5IGNoZWNrZWQgYnkgYW5vdGhlciBjaGlsZC5cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZFtwYXJlbnRJZC5rZXldKSBicmVhaztcbiAgICAgICAgICAgICAgICBjaGVja2VkW3BhcmVudElkLmtleV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuZ2V0VGlsZShwYXJlbnRJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlICYmIHBhcmVudFdhc1JlcXVlc3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy5fYWRkVGlsZShwYXJlbnRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltwYXJlbnRJZC5rZXldID0gcGFyZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgdmFsdWVzLCBzaW5jZSB0aGV5J3JlIHRoZSBwYXJlbnQgb2YgdGhlIG5leHQgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBwYXJlbnQgdGlsZSBhc2NlbnQgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50V2FzUmVxdWVzdGVkID0gdGlsZS53YXNSZXF1ZXN0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpKSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0YWluO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHRpbGUsIGdpdmVuIGl0cyBjb29yZGluYXRlLCB0byB0aGUgcHlyYW1pZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRUaWxlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IFRpbGUge1xuICAgICAgICBsZXQgdGlsZSA9IHRoaXMuX3RpbGVzW3RpbGVJRC5rZXldO1xuICAgICAgICBpZiAodGlsZSlcbiAgICAgICAgICAgIHJldHVybiB0aWxlO1xuXG4gICAgICAgIHRpbGUgPSB0aGlzLl9jYWNoZS5nZXRBbmRSZW1vdmUodGlsZUlEKTtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcih0aWxlSUQua2V5LCB0aWxlKTtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgdGlsZUlEIGJlY2F1c2UgdGhlIGNhY2hlZCB0aWxlIGNvdWxkIGhhdmUgaGFkIGEgZGlmZmVyZW50IHdyYXAgdmFsdWVcbiAgICAgICAgICAgIHRpbGUudGlsZUlEID0gdGlsZUlEO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUuaW5pdGlhbGl6ZVRpbGVTdGF0ZSh0aWxlLCB0aGlzLm1hcCA/IHRoaXMubWFwLnBhaW50ZXIgOiBudWxsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZVRpbWVyc1t0aWxlSUQua2V5XSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jYWNoZVRpbWVyc1t0aWxlSUQua2V5XSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlVGltZXJzW3RpbGVJRC5rZXldO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcih0aWxlSUQua2V5LCB0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IEJvb2xlYW4odGlsZSk7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICB0aWxlID0gbmV3IFRpbGUodGlsZUlELCB0aGlzLl9zb3VyY2UudGlsZVNpemUgKiB0aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5fbG9hZFRpbGUodGlsZSwgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIHRpbGUsIHRpbGVJRC5rZXksIHRpbGUuc3RhdGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBzaWxlbmNlIGZsb3cuXG4gICAgICAgIGlmICghdGlsZSkgcmV0dXJuIChudWxsOiBhbnkpO1xuXG4gICAgICAgIHRpbGUudXNlcysrO1xuICAgICAgICB0aGlzLl90aWxlc1t0aWxlSUQua2V5XSA9IHRpbGU7XG4gICAgICAgIGlmICghY2FjaGVkKSB0aGlzLl9zb3VyY2UuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge3RpbGUsIGNvb3JkOiB0aWxlLnRpbGVJRCwgZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuXG4gICAgICAgIHJldHVybiB0aWxlO1xuICAgIH1cblxuICAgIF9zZXRUaWxlUmVsb2FkVGltZXIoaWQ6IHN0cmluZyB8IG51bWJlciwgdGlsZTogVGlsZSkge1xuICAgICAgICBpZiAoaWQgaW4gdGhpcy5fdGltZXJzKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW2lkXSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdGltZXJzW2lkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4cGlyeVRpbWVvdXQgPSB0aWxlLmdldEV4cGlyeVRpbWVvdXQoKTtcbiAgICAgICAgaWYgKGV4cGlyeVRpbWVvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyc1tpZF0gPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRUaWxlKGlkLCAnZXhwaXJlZCcpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90aW1lcnNbaWRdO1xuICAgICAgICAgICAgfSwgZXhwaXJ5VGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSB0aWxlLCBnaXZlbiBpdHMgaWQsIGZyb20gdGhlIHB5cmFtaWRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZW1vdmVUaWxlKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgaWYgKCF0aWxlKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRpbGUudXNlcy0tO1xuICAgICAgICBkZWxldGUgdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICBpZiAodGhpcy5fdGltZXJzW2lkXSkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tpZF0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RpbWVyc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGlsZS51c2VzID4gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodGlsZS5oYXNEYXRhKCkgJiYgdGlsZS5zdGF0ZSAhPT0gJ3JlbG9hZGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmFkZCh0aWxlLnRpbGVJRCwgdGlsZSwgdGlsZS5nZXRFeHBpcnlUaW1lb3V0KCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2Fib3J0VGlsZSh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMuX3VubG9hZFRpbGUodGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIHRpbGVzIGZyb20gdGhpcyBweXJhbWlkXG4gICAgICovXG4gICAgY2xlYXJUaWxlcygpIHtcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcylcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZVRpbGUoaWQpO1xuXG4gICAgICAgIHRoaXMuX2NhY2hlLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIHRocm91Z2ggb3VyIGN1cnJlbnQgdGlsZXMgYW5kIGF0dGVtcHQgdG8gZmluZCB0aGUgdGlsZXMgdGhhdFxuICAgICAqIGNvdmVyIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHBvaW50UXVlcnlHZW9tZXRyeSBjb29yZGluYXRlcyBvZiB0aGUgY29ybmVycyBvZiBib3VuZGluZyByZWN0YW5nbGVcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gcmVzdWx0IGl0ZW1zIGhhdmUge3RpbGUsIG1pblgsIG1heFgsIG1pblksIG1heFl9LCB3aGVyZSBtaW4vbWF4IGJvdW5kaW5nIHZhbHVlcyBhcmUgdGhlIGdpdmVuIGJvdW5kcyB0cmFuc2Zvcm1lZCBpbiBpbnRvIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoaXMgdGlsZS5cbiAgICAgKi9cbiAgICB0aWxlc0luKHBvaW50UXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LCBtYXhQaXRjaFNjYWxlRmFjdG9yOiBudW1iZXIsIGhhczNETGF5ZXI6IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCB0aWxlUmVzdWx0cyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtO1xuICAgICAgICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIHRpbGVSZXN1bHRzO1xuXG4gICAgICAgIGNvbnN0IGNhbWVyYVBvaW50UXVlcnlHZW9tZXRyeSA9IGhhczNETGF5ZXIgP1xuICAgICAgICAgICAgdHJhbnNmb3JtLmdldENhbWVyYVF1ZXJ5R2VvbWV0cnkocG9pbnRRdWVyeUdlb21ldHJ5KSA6XG4gICAgICAgICAgICBwb2ludFF1ZXJ5R2VvbWV0cnk7XG5cbiAgICAgICAgY29uc3QgcXVlcnlHZW9tZXRyeSA9IHBvaW50UXVlcnlHZW9tZXRyeS5tYXAoKHApID0+IHRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUocCkpO1xuICAgICAgICBjb25zdCBjYW1lcmFRdWVyeUdlb21ldHJ5ID0gY2FtZXJhUG9pbnRRdWVyeUdlb21ldHJ5Lm1hcCgocCkgPT4gdHJhbnNmb3JtLnBvaW50Q29vcmRpbmF0ZShwKSk7XG5cbiAgICAgICAgY29uc3QgaWRzID0gdGhpcy5nZXRJZHMoKTtcblxuICAgICAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGNhbWVyYVF1ZXJ5R2VvbWV0cnkpIHtcbiAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBwLngpO1xuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHAueSk7XG4gICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcC54KTtcbiAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBwLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZHNbaV1dO1xuICAgICAgICAgICAgaWYgKHRpbGUuaG9sZGluZ0ZvckZhZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIFRpbGVzIGhlbGQgZm9yIGZhZGluZyBhcmUgY292ZXJlZCBieSB0aWxlcyB0aGF0IGFyZSBjbG9zZXIgdG8gaWRlYWxcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRpbGVJRCA9IHRpbGUudGlsZUlEO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB0cmFuc2Zvcm0uem9vbSAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFkZGluZyA9IG1heFBpdGNoU2NhbGVGYWN0b3IgKiB0aWxlLnF1ZXJ5UGFkZGluZyAqIEVYVEVOVCAvIHRpbGUudGlsZVNpemUgLyBzY2FsZTtcblxuICAgICAgICAgICAgY29uc3QgdGlsZVNwYWNlQm91bmRzID0gW1xuICAgICAgICAgICAgICAgIHRpbGVJRC5nZXRUaWxlUG9pbnQobmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShtaW5YLCBtaW5ZKSksXG4gICAgICAgICAgICAgICAgdGlsZUlELmdldFRpbGVQb2ludChuZXcgTWVyY2F0b3JDb29yZGluYXRlKG1heFgsIG1heFkpKVxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYgKHRpbGVTcGFjZUJvdW5kc1swXS54IC0gcXVlcnlQYWRkaW5nIDwgRVhURU5UICYmIHRpbGVTcGFjZUJvdW5kc1swXS55IC0gcXVlcnlQYWRkaW5nIDwgRVhURU5UICYmXG4gICAgICAgICAgICAgICAgdGlsZVNwYWNlQm91bmRzWzFdLnggKyBxdWVyeVBhZGRpbmcgPj0gMCAmJiB0aWxlU3BhY2VCb3VuZHNbMV0ueSArIHF1ZXJ5UGFkZGluZyA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlU3BhY2VRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4gPSBxdWVyeUdlb21ldHJ5Lm1hcCgoYykgPT4gdGlsZUlELmdldFRpbGVQb2ludChjKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZVNwYWNlQ2FtZXJhUXVlcnlHZW9tZXRyeSA9IGNhbWVyYVF1ZXJ5R2VvbWV0cnkubWFwKChjKSA9PiB0aWxlSUQuZ2V0VGlsZVBvaW50KGMpKTtcblxuICAgICAgICAgICAgICAgIHRpbGVSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0aWxlLFxuICAgICAgICAgICAgICAgICAgICB0aWxlSUQsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IHRpbGVTcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYVF1ZXJ5R2VvbWV0cnk6IHRpbGVTcGFjZUNhbWVyYVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIHNjYWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGlsZVJlc3VsdHM7XG4gICAgfVxuXG4gICAgZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKHN5bWJvbExheWVyPzogYm9vbGVhbik6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+IHtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5nZXRSZW5kZXJhYmxlSWRzKHN5bWJvbExheWVyKS5tYXAoKGlkKSA9PiB0aGlzLl90aWxlc1tpZF0udGlsZUlEKTtcbiAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgICAgIGNvb3JkLnBvc01hdHJpeCA9IHRoaXMudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChjb29yZC50b1Vud3JhcHBlZCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UuaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1Jhc3RlclR5cGUodGhpcy5fc291cmNlLnR5cGUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS5mYWRlRW5kVGltZSAhPT0gdW5kZWZpbmVkICYmIHRpbGUuZmFkZUVuZFRpbWUgPj0gYnJvd3Nlci5ub3coKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHBhcnRpY3VsYXIgc3RhdGUgZm9yIGEgZmVhdHVyZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0RmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyPzogc3RyaW5nLCBmZWF0dXJlOiBudW1iZXIsIHN0YXRlOiBPYmplY3QpIHtcbiAgICAgICAgc291cmNlTGF5ZXIgPSBzb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICB0aGlzLl9zdGF0ZS51cGRhdGVTdGF0ZShzb3VyY2VMYXllciwgZmVhdHVyZSwgc3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIHN0YXRlIGtleSBmb3IgYSBmZWF0dXJlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXI/OiBzdHJpbmcsIGZlYXR1cmU/OiBudW1iZXIsIGtleT86IHN0cmluZykge1xuICAgICAgICBzb3VyY2VMYXllciA9IHNvdXJjZUxheWVyIHx8ICdfZ2VvanNvblRpbGVMYXllcic7XG4gICAgICAgIHRoaXMuX3N0YXRlLnJlbW92ZUZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgZmVhdHVyZSwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGVudGlyZSBzdGF0ZSBvYmplY3QgZm9yIGEgZmVhdHVyZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyPzogc3RyaW5nLCBmZWF0dXJlOiBudW1iZXIpIHtcbiAgICAgICAgc291cmNlTGF5ZXIgPSBzb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUuZ2V0U3RhdGUoc291cmNlTGF5ZXIsIGZlYXR1cmUpO1xuICAgIH1cbn1cblxuU291cmNlQ2FjaGUubWF4T3Zlcnpvb21pbmcgPSAxMDtcblNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZyA9IDM7XG5cbmZ1bmN0aW9uIGNvbXBhcmVLZXlab29tKGEsIGIpIHtcbiAgICByZXR1cm4gKChhICUgMzIpIC0gKGIgJSAzMikpIHx8IChiIC0gYSk7XG59XG5cbmZ1bmN0aW9uIGlzUmFzdGVyVHlwZSh0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdyYXN0ZXInIHx8IHR5cGUgPT09ICdpbWFnZScgfHwgdHlwZSA9PT0gJ3ZpZGVvJztcbn1cblxuZXhwb3J0IGRlZmF1bHQgU291cmNlQ2FjaGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3dpbmRvdyc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vLi4vJztcblxuaW1wb3J0IHR5cGUge1dvcmtlckludGVyZmFjZX0gZnJvbSAnLi4vd2ViX3dvcmtlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpOiBXb3JrZXJJbnRlcmZhY2Uge1xuICAgIHJldHVybiAobmV3IHdpbmRvdy5Xb3JrZXIobWFwYm94Z2wud29ya2VyVXJsKTogYW55KTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBXZWJXb3JrZXIgZnJvbSAnLi93ZWJfd29ya2VyJztcbmltcG9ydCB0eXBlIHtXb3JrZXJJbnRlcmZhY2V9IGZyb20gJy4vd2ViX3dvcmtlcic7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuL2Jyb3dzZXInO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSB3b3JrZXIgcG9vbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdvcmtlclBvb2wge1xuICAgIHN0YXRpYyB3b3JrZXJDb3VudDogbnVtYmVyO1xuXG4gICAgYWN0aXZlOiB7W251bWJlcl06IGJvb2xlYW59O1xuICAgIHdvcmtlcnM6IEFycmF5PFdvcmtlckludGVyZmFjZT47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB7fTtcbiAgICB9XG5cbiAgICBhY3F1aXJlKG1hcElkOiBudW1iZXIpOiBBcnJheTxXb3JrZXJJbnRlcmZhY2U+IHtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIC8vIExhemlseSBsb29rIHVwIHRoZSB2YWx1ZSBvZiBtYXBib3hnbC53b3JrZXJDb3VudCBzbyB0aGF0XG4gICAgICAgICAgICAvLyBjbGllbnQgY29kZSBoYXMgaGFkIGEgY2hhbmNlIHRvIHNldCBpdC5cbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMud29ya2Vycy5sZW5ndGggPCBXb3JrZXJQb29sLndvcmtlckNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy53b3JrZXJzLnB1c2gobmV3IFdlYldvcmtlcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlW21hcElkXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLndvcmtlcnMuc2xpY2UoKTtcbiAgICB9XG5cbiAgICByZWxlYXNlKG1hcElkOiBudW1iZXIpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlW21hcElkXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMud29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICAgICAgICAgICAgdy50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzID0gKG51bGw6IGFueSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGF2YWlsYWJsZUxvZ2ljYWxQcm9jZXNzb3JzID0gTWF0aC5mbG9vcihicm93c2VyLmhhcmR3YXJlQ29uY3VycmVuY3kgLyAyKTtcbldvcmtlclBvb2wud29ya2VyQ291bnQgPSBNYXRoLm1heChNYXRoLm1pbihhdmFpbGFibGVMb2dpY2FsUHJvY2Vzc29ycywgNiksIDEpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFdvcmtlclBvb2wgZnJvbSAnLi93b3JrZXJfcG9vbCc7XG5cbmxldCBnbG9iYWxXb3JrZXJQb29sO1xuXG4vKipcbiAqIENyZWF0ZXMgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybnMgdGhlIHNpbmdsZSwgZ2xvYmFsIFdvcmtlclBvb2wgaW5zdGFuY2VcbiAqIHRvIGJlIHNoYXJlZCBhY3Jvc3MgZWFjaCBNYXBcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEdsb2JhbFdvcmtlclBvb2wgKCkge1xuICAgIGlmICghZ2xvYmFsV29ya2VyUG9vbCkge1xuICAgICAgICBnbG9iYWxXb3JrZXJQb29sID0gbmV3IFdvcmtlclBvb2woKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbFdvcmtlclBvb2w7XG59XG4iLCJcbmltcG9ydCByZWZQcm9wZXJ0aWVzIGZyb20gJy4vdXRpbC9yZWZfcHJvcGVydGllcyc7XG5cbmZ1bmN0aW9uIGRlcmVmKGxheWVyLCBwYXJlbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgIGZvciAoY29uc3QgayBpbiBsYXllcikge1xuICAgICAgICBpZiAoayAhPT0gJ3JlZicpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IGxheWVyW2tdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVmUHJvcGVydGllcy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgIGlmIChrIGluIHBhcmVudCkge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gcGFyZW50W2tdO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZXJlZkxheWVycztcblxuLyoqXG4gKiBHaXZlbiBhbiBhcnJheSBvZiBsYXllcnMsIHNvbWUgb2Ygd2hpY2ggbWF5IGNvbnRhaW4gYHJlZmAgcHJvcGVydGllc1xuICogd2hvc2UgdmFsdWUgaXMgdGhlIGBpZGAgb2YgYW5vdGhlciBwcm9wZXJ0eSwgcmV0dXJuIGEgbmV3IGFycmF5IHdoZXJlXG4gKiBzdWNoIGxheWVycyBoYXZlIGJlZW4gYXVnbWVudGVkIHdpdGggdGhlICd0eXBlJywgJ3NvdXJjZScsIGV0Yy4gcHJvcGVydGllc1xuICogZnJvbSB0aGUgcGFyZW50IGxheWVyLCBhbmQgdGhlIGByZWZgIHByb3BlcnR5IGhhcyBiZWVuIHJlbW92ZWQuXG4gKlxuICogVGhlIGlucHV0IGlzIG5vdCBtb2RpZmllZC4gVGhlIG91dHB1dCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIHBvcnRpb25zXG4gKiBvZiB0aGUgaW5wdXQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXk8TGF5ZXI+fSBsYXllcnNcbiAqIEByZXR1cm5zIHtBcnJheTxMYXllcj59XG4gKi9cbmZ1bmN0aW9uIGRlcmVmTGF5ZXJzKGxheWVycykge1xuICAgIGxheWVycyA9IGxheWVycy5zbGljZSgpO1xuXG4gICAgY29uc3QgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXBbbGF5ZXJzW2ldLmlkXSA9IGxheWVyc1tpXTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoJ3JlZicgaW4gbGF5ZXJzW2ldKSB7XG4gICAgICAgICAgICBsYXllcnNbaV0gPSBkZXJlZihsYXllcnNbaV0sIG1hcFtsYXllcnNbaV0ucmVmXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJzO1xufVxuIiwiXG5pbXBvcnQgaXNFcXVhbCBmcm9tICcuL3V0aWwvZGVlcF9lcXVhbCc7XG5cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFN0eWxlJywgYXJnczogW3N0eWxlc2hlZXRdIH1cbiAgICAgKi9cbiAgICBzZXRTdHlsZTogJ3NldFN0eWxlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnYWRkTGF5ZXInLCBhcmdzOiBbbGF5ZXIsICdiZWZvcmVMYXllcklkJ10gfVxuICAgICAqL1xuICAgIGFkZExheWVyOiAnYWRkTGF5ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdyZW1vdmVMYXllcicsIGFyZ3M6IFsnbGF5ZXJJZCddIH1cbiAgICAgKi9cbiAgICByZW1vdmVMYXllcjogJ3JlbW92ZUxheWVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRQYWludFByb3BlcnR5OiAnc2V0UGFpbnRQcm9wZXJ0eScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheW91dFByb3BlcnR5JywgYXJnczogWydsYXllcklkJywgJ3Byb3AnLCB2YWx1ZV0gfVxuICAgICAqL1xuICAgIHNldExheW91dFByb3BlcnR5OiAnc2V0TGF5b3V0UHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRGaWx0ZXInLCBhcmdzOiBbJ2xheWVySWQnLCBmaWx0ZXJdIH1cbiAgICAgKi9cbiAgICBzZXRGaWx0ZXI6ICdzZXRGaWx0ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdhZGRTb3VyY2UnLCBhcmdzOiBbJ3NvdXJjZUlkJywgc291cmNlXSB9XG4gICAgICovXG4gICAgYWRkU291cmNlOiAnYWRkU291cmNlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAncmVtb3ZlU291cmNlJywgYXJnczogWydzb3VyY2VJZCddIH1cbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2U6ICdyZW1vdmVTb3VyY2UnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRHZW9KU09OU291cmNlRGF0YScsIGFyZ3M6IFsnc291cmNlSWQnLCBkYXRhXSB9XG4gICAgICovXG4gICAgc2V0R2VvSlNPTlNvdXJjZURhdGE6ICdzZXRHZW9KU09OU291cmNlRGF0YScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheWVyWm9vbVJhbmdlJywgYXJnczogWydsYXllcklkJywgMCwgMjJdIH1cbiAgICAgKi9cbiAgICBzZXRMYXllclpvb21SYW5nZTogJ3NldExheWVyWm9vbVJhbmdlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGF5ZXJQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRMYXllclByb3BlcnR5OiAnc2V0TGF5ZXJQcm9wZXJ0eScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldENlbnRlcicsIGFyZ3M6IFtbbG9uLCBsYXRdXSB9XG4gICAgICovXG4gICAgc2V0Q2VudGVyOiAnc2V0Q2VudGVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0Wm9vbScsIGFyZ3M6IFt6b29tXSB9XG4gICAgICovXG4gICAgc2V0Wm9vbTogJ3NldFpvb20nLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRCZWFyaW5nJywgYXJnczogW2JlYXJpbmddIH1cbiAgICAgKi9cbiAgICBzZXRCZWFyaW5nOiAnc2V0QmVhcmluZycsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFBpdGNoJywgYXJnczogW3BpdGNoXSB9XG4gICAgICovXG4gICAgc2V0UGl0Y2g6ICdzZXRQaXRjaCcsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFNwcml0ZScsIGFyZ3M6IFsnc3ByaXRlVXJsJ10gfVxuICAgICAqL1xuICAgIHNldFNwcml0ZTogJ3NldFNwcml0ZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEdseXBocycsIGFyZ3M6IFsnZ2x5cGhzVXJsJ10gfVxuICAgICAqL1xuICAgIHNldEdseXBoczogJ3NldEdseXBocycsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFRyYW5zaXRpb24nLCBhcmdzOiBbdHJhbnNpdGlvbl0gfVxuICAgICAqL1xuICAgIHNldFRyYW5zaXRpb246ICdzZXRUcmFuc2l0aW9uJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGlnaHRpbmcnLCBhcmdzOiBbbGlnaHRQcm9wZXJ0aWVzXSB9XG4gICAgICovXG4gICAgc2V0TGlnaHQ6ICdzZXRMaWdodCdcblxufTtcblxuZnVuY3Rpb24gYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5hZGRTb3VyY2UsIGFyZ3M6IFtzb3VyY2VJZCwgYWZ0ZXJbc291cmNlSWRdXSB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpIHtcbiAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5yZW1vdmVTb3VyY2UsIGFyZ3M6IFtzb3VyY2VJZF0gfSk7XG4gICAgc291cmNlc1JlbW92ZWRbc291cmNlSWRdID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKSB7XG4gICAgcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuICAgIGFkZFNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzKTtcbn1cblxuZnVuY3Rpb24gY2FuVXBkYXRlR2VvSlNPTihiZWZvcmUsIGFmdGVyLCBzb3VyY2VJZCkge1xuICAgIGxldCBwcm9wO1xuICAgIGZvciAocHJvcCBpbiBiZWZvcmVbc291cmNlSWRdKSB7XG4gICAgICAgIGlmICghYmVmb3JlW3NvdXJjZUlkXS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmIChwcm9wICE9PSAnZGF0YScgJiYgIWlzRXF1YWwoYmVmb3JlW3NvdXJjZUlkXVtwcm9wXSwgYWZ0ZXJbc291cmNlSWRdW3Byb3BdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAocHJvcCBpbiBhZnRlcltzb3VyY2VJZF0pIHtcbiAgICAgICAgaWYgKCFhZnRlcltzb3VyY2VJZF0uaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RhdGEnICYmICFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF1bcHJvcF0sIGFmdGVyW3NvdXJjZUlkXVtwcm9wXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGlmZlNvdXJjZXMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKSB7XG4gICAgYmVmb3JlID0gYmVmb3JlIHx8IHt9O1xuICAgIGFmdGVyID0gYWZ0ZXIgfHwge307XG5cbiAgICBsZXQgc291cmNlSWQ7XG5cbiAgICAvLyBsb29rIGZvciBzb3VyY2VzIHRvIHJlbW92ZVxuICAgIGZvciAoc291cmNlSWQgaW4gYmVmb3JlKSB7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkgY29udGludWU7XG4gICAgICAgIGlmICghYWZ0ZXIuaGFzT3duUHJvcGVydHkoc291cmNlSWQpKSB7XG4gICAgICAgICAgICByZW1vdmVTb3VyY2Uoc291cmNlSWQsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciBzb3VyY2VzIHRvIGFkZC91cGRhdGVcbiAgICBmb3IgKHNvdXJjZUlkIGluIGFmdGVyKSB7XG4gICAgICAgIGlmICghYWZ0ZXIuaGFzT3duUHJvcGVydHkoc291cmNlSWQpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFiZWZvcmUuaGFzT3duUHJvcGVydHkoc291cmNlSWQpKSB7XG4gICAgICAgICAgICBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlW3NvdXJjZUlkXSwgYWZ0ZXJbc291cmNlSWRdKSkge1xuICAgICAgICAgICAgaWYgKGJlZm9yZVtzb3VyY2VJZF0udHlwZSA9PT0gJ2dlb2pzb24nICYmIGFmdGVyW3NvdXJjZUlkXS50eXBlID09PSAnZ2VvanNvbicgJiYgY2FuVXBkYXRlR2VvSlNPTihiZWZvcmUsIGFmdGVyLCBzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRHZW9KU09OU291cmNlRGF0YSwgYXJnczogW3NvdXJjZUlkLCBhZnRlcltzb3VyY2VJZF0uZGF0YV0gfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vIHVwZGF0ZSBjb21tYW5kLCBtdXN0IHJlbW92ZSB0aGVuIGFkZFxuICAgICAgICAgICAgICAgIHVwZGF0ZVNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmUsIGFmdGVyLCBjb21tYW5kcywgbGF5ZXJJZCwga2xhc3MsIGNvbW1hbmQpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwge307XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCB7fTtcblxuICAgIGxldCBwcm9wO1xuXG4gICAgZm9yIChwcm9wIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVbcHJvcF0sIGFmdGVyW3Byb3BdKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQsIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlcltwcm9wXSwga2xhc3NdIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAocHJvcCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVbcHJvcF0sIGFmdGVyW3Byb3BdKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQsIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlcltwcm9wXSwga2xhc3NdIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwbHVja0lkKGxheWVyKSB7XG4gICAgcmV0dXJuIGxheWVyLmlkO1xufVxuZnVuY3Rpb24gaW5kZXhCeUlkKGdyb3VwLCBsYXllcikge1xuICAgIGdyb3VwW2xheWVyLmlkXSA9IGxheWVyO1xuICAgIHJldHVybiBncm91cDtcbn1cblxuZnVuY3Rpb24gZGlmZkxheWVycyhiZWZvcmUsIGFmdGVyLCBjb21tYW5kcykge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCBbXTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IFtdO1xuXG4gICAgLy8gb3JkZXIgb2YgbGF5ZXJzIGJ5IGlkXG4gICAgY29uc3QgYmVmb3JlT3JkZXIgPSBiZWZvcmUubWFwKHBsdWNrSWQpO1xuICAgIGNvbnN0IGFmdGVyT3JkZXIgPSBhZnRlci5tYXAocGx1Y2tJZCk7XG5cbiAgICAvLyBpbmRleCBvZiBsYXllciBieSBpZFxuICAgIGNvbnN0IGJlZm9yZUluZGV4ID0gYmVmb3JlLnJlZHVjZShpbmRleEJ5SWQsIHt9KTtcbiAgICBjb25zdCBhZnRlckluZGV4ID0gYWZ0ZXIucmVkdWNlKGluZGV4QnlJZCwge30pO1xuXG4gICAgLy8gdHJhY2sgb3JkZXIgb2YgbGF5ZXJzIGFzIGlmIHRoZXkgaGF2ZSBiZWVuIG11dGF0ZWRcbiAgICBjb25zdCB0cmFja2VyID0gYmVmb3JlT3JkZXIuc2xpY2UoKTtcblxuICAgIC8vIGxheWVycyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBkbyBub3QgbmVlZCB0byBiZSBkaWZmZWRcbiAgICBjb25zdCBjbGVhbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBsZXQgaSwgZCwgbGF5ZXJJZCwgYmVmb3JlTGF5ZXIsIGFmdGVyTGF5ZXIsIGluc2VydEJlZm9yZUxheWVySWQsIHByb3A7XG5cbiAgICAvLyByZW1vdmUgbGF5ZXJzXG4gICAgZm9yIChpID0gMCwgZCA9IDA7IGkgPCBiZWZvcmVPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllcklkID0gYmVmb3JlT3JkZXJbaV07XG4gICAgICAgIGlmICghYWZ0ZXJJbmRleC5oYXNPd25Qcm9wZXJ0eShsYXllcklkKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXSB9KTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIuaW5kZXhPZihsYXllcklkLCBkKSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsaW1pdCB3aGVyZSBpbiB0cmFja2VyIHdlIG5lZWQgdG8gbG9vayBmb3IgYSBtYXRjaFxuICAgICAgICAgICAgZCsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkL3Jlb3JkZXIgbGF5ZXJzXG4gICAgZm9yIChpID0gMCwgZCA9IDA7IGkgPCBhZnRlck9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIHdvcmsgYmFja3dhcmRzIGFzIGluc2VydCBpcyBiZWZvcmUgYW4gZXhpc3RpbmcgbGF5ZXJcbiAgICAgICAgbGF5ZXJJZCA9IGFmdGVyT3JkZXJbYWZ0ZXJPcmRlci5sZW5ndGggLSAxIC0gaV07XG5cbiAgICAgICAgaWYgKHRyYWNrZXJbdHJhY2tlci5sZW5ndGggLSAxIC0gaV0gPT09IGxheWVySWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChiZWZvcmVJbmRleC5oYXNPd25Qcm9wZXJ0eShsYXllcklkKSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYXllciBiZWZvcmUgd2UgaW5zZXJ0IGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uXG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5yZW1vdmVMYXllciwgYXJnczogW2xheWVySWRdIH0pO1xuICAgICAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sYXN0SW5kZXhPZihsYXllcklkLCB0cmFja2VyLmxlbmd0aCAtIGQpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHdoZXJlIGluIHRyYWNrZXIgd2UgbmVlZCB0byBsb29rIGZvciBhIG1hdGNoXG4gICAgICAgICAgICBkKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbGF5ZXIgYXQgY29ycmVjdCBwb3NpdGlvblxuICAgICAgICBpbnNlcnRCZWZvcmVMYXllcklkID0gdHJhY2tlclt0cmFja2VyLmxlbmd0aCAtIGldO1xuICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5hZGRMYXllciwgYXJnczogW2FmdGVySW5kZXhbbGF5ZXJJZF0sIGluc2VydEJlZm9yZUxheWVySWRdIH0pO1xuICAgICAgICB0cmFja2VyLnNwbGljZSh0cmFja2VyLmxlbmd0aCAtIGksIDAsIGxheWVySWQpO1xuICAgICAgICBjbGVhbltsYXllcklkXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGxheWVyc1xuICAgIGZvciAoaSA9IDA7IGkgPCBhZnRlck9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxheWVySWQgPSBhZnRlck9yZGVyW2ldO1xuICAgICAgICBiZWZvcmVMYXllciA9IGJlZm9yZUluZGV4W2xheWVySWRdO1xuICAgICAgICBhZnRlckxheWVyID0gYWZ0ZXJJbmRleFtsYXllcklkXTtcblxuICAgICAgICAvLyBubyBuZWVkIHRvIHVwZGF0ZSBpZiBwcmV2aW91c2x5IGFkZGVkIChuZXcgb3IgbW92ZWQpXG4gICAgICAgIGlmIChjbGVhbltsYXllcklkXSB8fCBpc0VxdWFsKGJlZm9yZUxheWVyLCBhZnRlckxheWVyKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gSWYgc291cmNlLCBzb3VyY2UtbGF5ZXIsIG9yIHR5cGUgaGF2ZSBjaGFuZ2VzLCB0aGVuIHJlbW92ZSB0aGUgbGF5ZXJcbiAgICAgICAgLy8gYW5kIGFkZCBpdCBiYWNrICdmcm9tIHNjcmF0Y2gnLlxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIuc291cmNlLCBhZnRlckxheWVyLnNvdXJjZSkgfHwgIWlzRXF1YWwoYmVmb3JlTGF5ZXJbJ3NvdXJjZS1sYXllciddLCBhZnRlckxheWVyWydzb3VyY2UtbGF5ZXInXSkgfHwgIWlzRXF1YWwoYmVmb3JlTGF5ZXIudHlwZSwgYWZ0ZXJMYXllci50eXBlKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXSB9KTtcbiAgICAgICAgICAgIC8vIHdlIGFkZCB0aGUgbGF5ZXIgYmFjayBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpdCB3YXMgYWxyZWFkeSBpbiwgc29cbiAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byB1cGRhdGUgdGhlIGB0cmFja2VyYFxuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlTGF5ZXJJZCA9IHRyYWNrZXJbdHJhY2tlci5sYXN0SW5kZXhPZihsYXllcklkKSArIDFdO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkTGF5ZXIsIGFyZ3M6IFthZnRlckxheWVyLCBpbnNlcnRCZWZvcmVMYXllcklkXSB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGF5b3V0LCBwYWludCwgZmlsdGVyLCBtaW56b29tLCBtYXh6b29tXG4gICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllci5sYXlvdXQsIGFmdGVyTGF5ZXIubGF5b3V0LCBjb21tYW5kcywgbGF5ZXJJZCwgbnVsbCwgb3BlcmF0aW9ucy5zZXRMYXlvdXRQcm9wZXJ0eSk7XG4gICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllci5wYWludCwgYWZ0ZXJMYXllci5wYWludCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVMYXllci5maWx0ZXIsIGFmdGVyTGF5ZXIuZmlsdGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0RmlsdGVyLCBhcmdzOiBbbGF5ZXJJZCwgYWZ0ZXJMYXllci5maWx0ZXJdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVMYXllci5taW56b29tLCBhZnRlckxheWVyLm1pbnpvb20pIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyLm1heHpvb20sIGFmdGVyTGF5ZXIubWF4em9vbSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyWm9vbVJhbmdlLCBhcmdzOiBbbGF5ZXJJZCwgYWZ0ZXJMYXllci5taW56b29tLCBhZnRlckxheWVyLm1heHpvb21dIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGFsbCBvdGhlciBsYXllciBwcm9wcywgaW5jbHVkaW5nIHBhaW50LipcbiAgICAgICAgZm9yIChwcm9wIGluIGJlZm9yZUxheWVyKSB7XG4gICAgICAgICAgICBpZiAoIWJlZm9yZUxheWVyLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnbGF5b3V0JyB8fCBwcm9wID09PSAncGFpbnQnIHx8IHByb3AgPT09ICdmaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgcHJvcCA9PT0gJ21ldGFkYXRhJyB8fCBwcm9wID09PSAnbWluem9vbScgfHwgcHJvcCA9PT0gJ21heHpvb20nKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2YoJ3BhaW50LicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdLCBjb21tYW5kcywgbGF5ZXJJZCwgcHJvcC5zbGljZSg2KSwgb3BlcmF0aW9ucy5zZXRQYWludFByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGF5ZXJQcm9wZXJ0eSwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyTGF5ZXJbcHJvcF1dIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBhZnRlckxheWVyKSB7XG4gICAgICAgICAgICBpZiAoIWFmdGVyTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkgfHwgYmVmb3JlTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdsYXlvdXQnIHx8IHByb3AgPT09ICdwYWludCcgfHwgcHJvcCA9PT0gJ2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICBwcm9wID09PSAnbWV0YWRhdGEnIHx8IHByb3AgPT09ICdtaW56b29tJyB8fCBwcm9wID09PSAnbWF4em9vbScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5kZXhPZigncGFpbnQuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0sIGNvbW1hbmRzLCBsYXllcklkLCBwcm9wLnNsaWNlKDYpLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclByb3BlcnR5LCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJMYXllcltwcm9wXV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogRGlmZiB0d28gc3R5bGVzaGVldFxuICpcbiAqIENyZWF0ZXMgc2VtYW50aWNseSBhd2FyZSBkaWZmcyB0aGF0IGNhbiBlYXNpbHkgYmUgYXBwbGllZCBhdCBydW50aW1lLlxuICogT3BlcmF0aW9ucyBwcm9kdWNlZCBieSB0aGUgZGlmZiBjbG9zZWx5IHJlc2VtYmxlIHRoZSBtYXBib3gtZ2wtanMgQVBJLiBBbnlcbiAqIGVycm9yIGNyZWF0aW5nIHRoZSBkaWZmIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSAnc2V0U3R5bGUnIG9wZXJhdGlvbi5cbiAqXG4gKiBFeGFtcGxlIGRpZmY6XG4gKiBbXG4gKiAgICAgeyBjb21tYW5kOiAnc2V0Q29uc3RhbnQnLCBhcmdzOiBbJ0B3YXRlcicsICcjMDAwMEZGJ10gfSxcbiAqICAgICB7IGNvbW1hbmQ6ICdzZXRQYWludFByb3BlcnR5JywgYXJnczogWydiYWNrZ3JvdW5kJywgJ2JhY2tncm91bmQtY29sb3InLCAnYmxhY2snXSB9XG4gKiBdXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gW2JlZm9yZV0gc3R5bGVzaGVldCB0byBjb21wYXJlIGZyb21cbiAqIEBwYXJhbSB7Kn0gYWZ0ZXIgc3R5bGVzaGVldCB0byBjb21wYXJlIHRvXG4gKiBAcmV0dXJucyBBcnJheSBsaXN0IG9mIGNoYW5nZXNcbiAqL1xuZnVuY3Rpb24gZGlmZlN0eWxlcyhiZWZvcmUsIGFmdGVyKSB7XG4gICAgaWYgKCFiZWZvcmUpIHJldHVybiBbeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdIH1dO1xuXG4gICAgbGV0IGNvbW1hbmRzID0gW107XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byB0b3AtbGV2ZWwgcHJvcGVydGllc1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnZlcnNpb24sIGFmdGVyLnZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gW3sgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXSB9XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmNlbnRlciwgYWZ0ZXIuY2VudGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0Q2VudGVyLCBhcmdzOiBbYWZ0ZXIuY2VudGVyXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnpvb20sIGFmdGVyLnpvb20pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRab29tLCBhcmdzOiBbYWZ0ZXIuem9vbV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5iZWFyaW5nLCBhZnRlci5iZWFyaW5nKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0QmVhcmluZywgYXJnczogW2FmdGVyLmJlYXJpbmddIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUucGl0Y2gsIGFmdGVyLnBpdGNoKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0UGl0Y2gsIGFyZ3M6IFthZnRlci5waXRjaF0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5zcHJpdGUsIGFmdGVyLnNwcml0ZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFNwcml0ZSwgYXJnczogW2FmdGVyLnNwcml0ZV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5nbHlwaHMsIGFmdGVyLmdseXBocykpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldEdseXBocywgYXJnczogW2FmdGVyLmdseXBoc10gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS50cmFuc2l0aW9uLCBhZnRlci50cmFuc2l0aW9uKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0VHJhbnNpdGlvbiwgYXJnczogW2FmdGVyLnRyYW5zaXRpb25dIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUubGlnaHQsIGFmdGVyLmxpZ2h0KSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGlnaHQsIGFyZ3M6IFthZnRlci5saWdodF0gfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgc291cmNlc2BcbiAgICAgICAgLy8gSWYgYSBzb3VyY2UgaXMgdG8gYmUgcmVtb3ZlZCwgd2UgYWxzby0tYmVmb3JlIHRoZSByZW1vdmVTb3VyY2VcbiAgICAgICAgLy8gY29tbWFuZC0tbmVlZCB0byByZW1vdmUgYWxsIHRoZSBzdHlsZSBsYXllcnMgdGhhdCBkZXBlbmQgb24gaXQuXG4gICAgICAgIGNvbnN0IHNvdXJjZXNSZW1vdmVkID0ge307XG5cbiAgICAgICAgLy8gRmlyc3QgY29sbGVjdCB0aGUge2FkZCxyZW1vdmV9U291cmNlIGNvbW1hbmRzXG4gICAgICAgIGNvbnN0IHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMgPSBbXTtcbiAgICAgICAgZGlmZlNvdXJjZXMoYmVmb3JlLnNvdXJjZXMsIGFmdGVyLnNvdXJjZXMsIHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcblxuICAgICAgICAvLyBQdXNoIGEgcmVtb3ZlTGF5ZXIgY29tbWFuZCBmb3IgZWFjaCBzdHlsZSBsYXllciB0aGF0IGRlcGVuZHMgb24gYVxuICAgICAgICAvLyBzb3VyY2UgdGhhdCdzIGJlaW5nIHJlbW92ZWQuXG4gICAgICAgIC8vIEFsc28sIGV4Y2x1ZGUgYW55IHN1Y2ggbGF5ZXJzIHRoZW0gZnJvbSB0aGUgaW5wdXQgdG8gYGRpZmZMYXllcnNgXG4gICAgICAgIC8vIGJlbG93LCBzbyB0aGF0IGRpZmZMYXllcnMgcHJvZHVjZXMgdGhlIGFwcHJvcHJpYXRlIGBhZGRMYXllcnNgXG4gICAgICAgIC8vIGNvbW1hbmRcbiAgICAgICAgY29uc3QgYmVmb3JlTGF5ZXJzID0gW107XG4gICAgICAgIGlmIChiZWZvcmUubGF5ZXJzKSB7XG4gICAgICAgICAgICBiZWZvcmUubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZXNSZW1vdmVkW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllci5pZF0gfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlTGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1hbmRzID0gY29tbWFuZHMuY29uY2F0KHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMpO1xuXG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2VzIHRvIGBsYXllcnNgXG4gICAgICAgIGRpZmZMYXllcnMoYmVmb3JlTGF5ZXJzLCBhZnRlci5sYXllcnMsIGNvbW1hbmRzKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHNldFN0eWxlXG4gICAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIGNvbXB1dGUgc3R5bGUgZGlmZjonLCBlKTtcbiAgICAgICAgY29tbWFuZHMgPSBbeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdIH1dO1xuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlmZlN0eWxlcztcbmV4cG9ydCB7IG9wZXJhdGlvbnMgfTtcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogR3JpZEluZGV4IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRlc3RpbmcgdGhlIGludGVyc2VjdGlvbiBvZlxuICogY2lyY2xlcyBhbmQgcmVjdGFuZ2xlcyBpbiBhIDJkIHBsYW5lLlxuICogSXQgaXMgb3B0aW1pemVkIGZvciByYXBpZCBpbnNlcnRpb24gYW5kIHF1ZXJ5aW5nLlxuICogR3JpZEluZGV4IHNwbGl0cyB0aGUgcGxhbmUgaW50byBhIHNldCBvZiBcImNlbGxzXCIgYW5kIGtlZXBzIHRyYWNrXG4gKiBvZiB3aGljaCBnZW9tZXRyaWVzIGludGVyc2VjdCB3aXRoIGVhY2ggY2VsbC4gQXQgcXVlcnkgdGltZSxcbiAqIGZ1bGwgZ2VvbWV0cnkgY29tcGFyaXNvbnMgYXJlIG9ubHkgZG9uZSBmb3IgaXRlbXMgdGhhdCBzaGFyZVxuICogYXQgbGVhc3Qgb25lIGNlbGwuIEFzIGxvbmcgYXMgdGhlIGdlb21ldHJpZXMgYXJlIHJlbGF0aXZlbHlcbiAqIHVuaWZvcm1seSBkaXN0cmlidXRlZCBhY3Jvc3MgdGhlIHBsYW5lLCB0aGlzIGdyZWF0bHkgcmVkdWNlc1xuICogdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyBuZWNlc3NhcnkuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgR3JpZEluZGV4IHtcbiAgICBjaXJjbGVLZXlzOiBBcnJheTxhbnk+O1xuICAgIGJveEtleXM6IEFycmF5PGFueT47XG4gICAgYm94Q2VsbHM6IEFycmF5PEFycmF5PG51bWJlcj4+O1xuICAgIGNpcmNsZUNlbGxzOiBBcnJheTxBcnJheTxudW1iZXI+PjtcbiAgICBiYm94ZXM6IEFycmF5PG51bWJlcj47XG4gICAgY2lyY2xlczogQXJyYXk8bnVtYmVyPjtcbiAgICB4Q2VsbENvdW50OiBudW1iZXI7XG4gICAgeUNlbGxDb3VudDogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgeFNjYWxlOiBudW1iZXI7XG4gICAgeVNjYWxlOiBudW1iZXI7XG4gICAgYm94VWlkOiBudW1iZXI7XG4gICAgY2lyY2xlVWlkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvciAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNlbGxTaXplOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYm94Q2VsbHMgPSB0aGlzLmJveENlbGxzID0gW107XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGxzID0gdGhpcy5jaXJjbGVDZWxscyA9IFtdO1xuXG4gICAgICAgIC8vIE1vcmUgY2VsbHMgLT4gZmV3ZXIgZ2VvbWV0cmllcyB0byBjaGVjayBwZXIgY2VsbCwgYnV0IGl0ZW1zIHRlbmRcbiAgICAgICAgLy8gdG8gYmUgc3BsaXQgYWNyb3NzIG1vcmUgY2VsbHMuXG4gICAgICAgIC8vIFN3ZWV0IHNwb3QgYWxsb3dzIG1vc3Qgc21hbGwgaXRlbXMgdG8gZml0IGluIG9uZSBjZWxsXG4gICAgICAgIHRoaXMueENlbGxDb3VudCA9IE1hdGguY2VpbCh3aWR0aCAvIGNlbGxTaXplKTtcbiAgICAgICAgdGhpcy55Q2VsbENvdW50ID0gTWF0aC5jZWlsKGhlaWdodCAvIGNlbGxTaXplKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueENlbGxDb3VudCAqIHRoaXMueUNlbGxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBib3hDZWxscy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGNpcmNsZUNlbGxzLnB1c2goW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2lyY2xlS2V5cyA9IFtdO1xuICAgICAgICB0aGlzLmJveEtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jaXJjbGVzID0gW107XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy54U2NhbGUgPSB0aGlzLnhDZWxsQ291bnQgLyB3aWR0aDtcbiAgICAgICAgdGhpcy55U2NhbGUgPSB0aGlzLnlDZWxsQ291bnQgLyBoZWlnaHQ7XG4gICAgICAgIHRoaXMuYm94VWlkID0gMDtcbiAgICAgICAgdGhpcy5jaXJjbGVVaWQgPSAwO1xuICAgIH1cblxuICAgIGtleXNMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJveEtleXMubGVuZ3RoICsgdGhpcy5jaXJjbGVLZXlzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpbnNlcnQoa2V5OiBhbnksIHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZm9yRWFjaENlbGwoeDEsIHkxLCB4MiwgeTIsIHRoaXMuX2luc2VydEJveENlbGwsIHRoaXMuYm94VWlkKyspO1xuICAgICAgICB0aGlzLmJveEtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHgxKTtcbiAgICAgICAgdGhpcy5iYm94ZXMucHVzaCh5MSk7XG4gICAgICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHkyKTtcbiAgICB9XG5cbiAgICBpbnNlcnRDaXJjbGUoa2V5OiBhbnksIHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlcikge1xuICAgICAgICAvLyBJbnNlcnQgY2lyY2xlIGludG8gZ3JpZCBmb3IgYWxsIGNlbGxzIGluIHRoZSBjaXJjdW1zY3JpYmluZyBzcXVhcmVcbiAgICAgICAgLy8gSXQncyBtb3JlIHRoYW4gbmVjZXNzYXJ5IChieSBhIGZhY3RvciBvZiA0L1BJKSwgYnV0IGZhc3QgdG8gaW5zZXJ0XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHggLSByYWRpdXMsIHkgLSByYWRpdXMsIHggKyByYWRpdXMsIHkgKyByYWRpdXMsIHRoaXMuX2luc2VydENpcmNsZUNlbGwsIHRoaXMuY2lyY2xlVWlkKyspO1xuICAgICAgICB0aGlzLmNpcmNsZUtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmNpcmNsZXMucHVzaCh4KTtcbiAgICAgICAgdGhpcy5jaXJjbGVzLnB1c2goeSk7XG4gICAgICAgIHRoaXMuY2lyY2xlcy5wdXNoKHJhZGl1cyk7XG4gICAgfVxuXG4gICAgX2luc2VydEJveENlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHVpZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYm94Q2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG4gICAgfVxuXG4gICAgX2luc2VydENpcmNsZUNlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHVpZDogbnVtYmVyKSAge1xuICAgICAgICB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF0ucHVzaCh1aWQpO1xuICAgIH1cblxuICAgIF9xdWVyeSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBoaXRUZXN0OiBib29sZWFuLCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgaWYgKHgyIDwgMCB8fCB4MSA+IHRoaXMud2lkdGggfHwgeTIgPCAwIHx8IHkxID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBoaXRUZXN0ID8gZmFsc2UgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHgxIDw9IDAgJiYgeTEgPD0gMCAmJiB0aGlzLndpZHRoIDw9IHgyICYmIHRoaXMuaGVpZ2h0IDw9IHkyKSB7XG4gICAgICAgICAgICBpZiAoaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgYm94VWlkID0gMDsgYm94VWlkIDwgdGhpcy5ib3hLZXlzLmxlbmd0aDsgYm94VWlkKyspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5ib3hLZXlzW2JveFVpZF0sXG4gICAgICAgICAgICAgICAgICAgIHgxOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0XSxcbiAgICAgICAgICAgICAgICAgICAgeTE6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgeDI6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgeTI6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAzXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgY2lyY2xlVWlkID0gMDsgY2lyY2xlVWlkIDwgdGhpcy5jaXJjbGVLZXlzLmxlbmd0aDsgY2lyY2xlVWlkKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gdGhpcy5jaXJjbGVzW2NpcmNsZVVpZCAqIDNdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLmNpcmNsZXNbY2lyY2xlVWlkICogMyArIDFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuY2lyY2xlc1tjaXJjbGVVaWQgKiAzICsgMl07XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdLFxuICAgICAgICAgICAgICAgICAgICB4MTogeCAtIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgeTE6IHkgLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgIHgyOiB4ICsgcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICB5MjogeSArIHJhZGl1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSA/IHJlc3VsdC5maWx0ZXIocHJlZGljYXRlKSA6IHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5QXJncyA9IHtcbiAgICAgICAgICAgICAgICBoaXRUZXN0LFxuICAgICAgICAgICAgICAgIHNlZW5VaWRzOiB7IGJveDoge30sIGNpcmNsZToge30gfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGwsIHJlc3VsdCwgcXVlcnlBcmdzLCBwcmVkaWNhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIGhpdFRlc3QgPyByZXN1bHQubGVuZ3RoID4gMCA6IHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9xdWVyeUNpcmNsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgcmFkaXVzOiBudW1iZXIsIGhpdFRlc3Q6IGJvb2xlYW4sIHByZWRpY2F0ZT86IGFueSkge1xuICAgICAgICAvLyBJbnNlcnQgY2lyY2xlIGludG8gZ3JpZCBmb3IgYWxsIGNlbGxzIGluIHRoZSBjaXJjdW1zY3JpYmluZyBzcXVhcmVcbiAgICAgICAgLy8gSXQncyBtb3JlIHRoYW4gbmVjZXNzYXJ5IChieSBhIGZhY3RvciBvZiA0L1BJKSwgYnV0IGZhc3QgdG8gaW5zZXJ0XG4gICAgICAgIGNvbnN0IHgxID0geCAtIHJhZGl1cztcbiAgICAgICAgY29uc3QgeDIgPSB4ICsgcmFkaXVzO1xuICAgICAgICBjb25zdCB5MSA9IHkgLSByYWRpdXM7XG4gICAgICAgIGNvbnN0IHkyID0geSArIHJhZGl1cztcbiAgICAgICAgaWYgKHgyIDwgMCB8fCB4MSA+IHRoaXMud2lkdGggfHwgeTIgPCAwIHx8IHkxID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBoaXRUZXN0ID8gZmFsc2UgOiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJveCBxdWVyeSBlYXJseSBleGl0cyBpZiB0aGUgYm91bmRpbmcgYm94IGlzIGxhcmdlciB0aGFuIHRoZSBncmlkLCBidXQgd2UgZG9uJ3QgZG9cbiAgICAgICAgLy8gdGhlIGVxdWl2YWxlbnQgY2FsY3VsYXRpb24gZm9yIGNpcmNsZSBxdWVyaWVzIGJlY2F1c2UgZWFybHkgZXhpdCBpcyBsZXNzIGxpa2VseVxuICAgICAgICAvLyBhbmQgdGhlIGNhbGN1bGF0aW9uIGlzIG1vcmUgZXhwZW5zaXZlXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBjb25zdCBxdWVyeUFyZ3MgPSB7XG4gICAgICAgICAgICBoaXRUZXN0LFxuICAgICAgICAgICAgY2lyY2xlOiB7IHgsIHksIHJhZGl1cyB9LFxuICAgICAgICAgICAgc2VlblVpZHM6IHsgYm94OiB7fSwgY2lyY2xlOiB7fSB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGxDaXJjbGUsIHJlc3VsdCwgcXVlcnlBcmdzLCBwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gaGl0VGVzdCA/IHJlc3VsdC5sZW5ndGggPiAwIDogcmVzdWx0O1xuICAgIH1cblxuICAgIHF1ZXJ5KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSk6IEFycmF5PGFueT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3F1ZXJ5KHgxLCB5MSwgeDIsIHkyLCBmYWxzZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBoaXRUZXN0KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSk6IGJvb2xlYW4gIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9xdWVyeSh4MSwgeTEsIHgyLCB5MiwgdHJ1ZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBoaXRUZXN0Q2lyY2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlciwgcHJlZGljYXRlPzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcXVlcnlDaXJjbGUoeCwgeSwgcmFkaXVzLCB0cnVlLCBwcmVkaWNhdGUpOiBhbnkpO1xuICAgIH1cblxuICAgIF9xdWVyeUNlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55LCBxdWVyeUFyZ3M6IGFueSwgcHJlZGljYXRlPzogYW55KSB7XG4gICAgICAgIGNvbnN0IHNlZW5VaWRzID0gcXVlcnlBcmdzLnNlZW5VaWRzO1xuICAgICAgICBjb25zdCBib3hDZWxsID0gdGhpcy5ib3hDZWxsc1tjZWxsSW5kZXhdO1xuICAgICAgICBpZiAoYm94Q2VsbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgYmJveGVzID0gdGhpcy5iYm94ZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJveFVpZCBvZiBib3hDZWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWVuVWlkcy5ib3hbYm94VWlkXSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkcy5ib3hbYm94VWlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGJveFVpZCAqIDQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoeDEgPD0gYmJveGVzW29mZnNldCArIDJdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHkxIDw9IGJib3hlc1tvZmZzZXQgKyAzXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICh4MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMF0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoeTIgPj0gYmJveGVzW29mZnNldCArIDFdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuYm94S2V5c1tib3hVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeUFyZ3MuaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5ib3hLZXlzW2JveFVpZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxOiBiYm94ZXNbb2Zmc2V0XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IGJib3hlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDI6IGJib3hlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI6IGJib3hlc1tvZmZzZXQgKyAzXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGwgPSB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChjaXJjbGVDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5jaXJjbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaXJjbGVVaWQgb2YgY2lyY2xlQ2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBjaXJjbGVVaWQgKiAzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlQW5kUmVjdENvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTEsXG4gICAgICAgICAgICAgICAgICAgICAgICB4MixcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeUFyZ3MuaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gY2lyY2xlc1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBjaXJjbGVzW29mZnNldCArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IGNpcmNsZXNbb2Zmc2V0ICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTogeCAtIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IHkgLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyOiB4ICsgcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MjogeSArIHJhZGl1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3F1ZXJ5Q2VsbENpcmNsZSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBjZWxsSW5kZXg6IG51bWJlciwgcmVzdWx0OiBhbnksIHF1ZXJ5QXJnczogYW55LCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY2lyY2xlID0gcXVlcnlBcmdzLmNpcmNsZTtcbiAgICAgICAgY29uc3Qgc2VlblVpZHMgPSBxdWVyeUFyZ3Muc2VlblVpZHM7XG4gICAgICAgIGNvbnN0IGJveENlbGwgPSB0aGlzLmJveENlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChib3hDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBiYm94ZXMgPSB0aGlzLmJib3hlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgYm94VWlkIG9mIGJveENlbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5VaWRzLmJveFtib3hVaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzLmJveFtib3hVaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYm94VWlkICogNDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZUFuZFJlY3RDb2xsaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS5yYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUodGhpcy5ib3hLZXlzW2JveFVpZF0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGwgPSB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChjaXJjbGVDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5jaXJjbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaXJjbGVVaWQgb2YgY2lyY2xlQ2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBjaXJjbGVVaWQgKiAzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlc0NvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLnksXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUucmFkaXVzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZm9yRWFjaENlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgZm46IGFueSwgYXJnMTogYW55LCBhcmcyPzogYW55LCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY3gxID0gdGhpcy5fY29udmVydFRvWENlbGxDb29yZCh4MSk7XG4gICAgICAgIGNvbnN0IGN5MSA9IHRoaXMuX2NvbnZlcnRUb1lDZWxsQ29vcmQoeTEpO1xuICAgICAgICBjb25zdCBjeDIgPSB0aGlzLl9jb252ZXJ0VG9YQ2VsbENvb3JkKHgyKTtcbiAgICAgICAgY29uc3QgY3kyID0gdGhpcy5fY29udmVydFRvWUNlbGxDb29yZCh5Mik7XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IGN4MTsgeCA8PSBjeDI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IGN5MTsgeSA8PSBjeTI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IHRoaXMueENlbGxDb3VudCAqIHkgKyB4O1xuICAgICAgICAgICAgICAgIGlmIChmbi5jYWxsKHRoaXMsIHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIGFyZzEsIGFyZzIsIHByZWRpY2F0ZSkpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jb252ZXJ0VG9YQ2VsbENvb3JkKHg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy54Q2VsbENvdW50IC0gMSwgTWF0aC5mbG9vcih4ICogdGhpcy54U2NhbGUpKSk7XG4gICAgfVxuXG4gICAgX2NvbnZlcnRUb1lDZWxsQ29vcmQoeTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnlDZWxsQ291bnQgLSAxLCBNYXRoLmZsb29yKHkgKiB0aGlzLnlTY2FsZSkpKTtcbiAgICB9XG5cbiAgICBfY2lyY2xlc0NvbGxpZGUoeDE6IG51bWJlciwgeTE6IG51bWJlciwgcjE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgcjI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkeCA9IHgyIC0geDE7XG4gICAgICAgIGNvbnN0IGR5ID0geTIgLSB5MTtcbiAgICAgICAgY29uc3QgYm90aFJhZGlpID0gcjEgKyByMjtcbiAgICAgICAgcmV0dXJuIChib3RoUmFkaWkgKiBib3RoUmFkaWkpID4gKGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICB9XG5cbiAgICBfY2lyY2xlQW5kUmVjdENvbGxpZGUoY2lyY2xlWDogbnVtYmVyLCBjaXJjbGVZOiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGhhbGZSZWN0V2lkdGggPSAoeDIgLSB4MSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0WCA9IE1hdGguYWJzKGNpcmNsZVggLSAoeDEgKyBoYWxmUmVjdFdpZHRoKSk7XG4gICAgICAgIGlmIChkaXN0WCA+IChoYWxmUmVjdFdpZHRoICsgcmFkaXVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFsZlJlY3RIZWlnaHQgPSAoeTIgLSB5MSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0WSA9IE1hdGguYWJzKGNpcmNsZVkgLSAoeTEgKyBoYWxmUmVjdEhlaWdodCkpO1xuICAgICAgICBpZiAoZGlzdFkgPiAoaGFsZlJlY3RIZWlnaHQgKyByYWRpdXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzdFggPD0gaGFsZlJlY3RXaWR0aCB8fCBkaXN0WSA8PSBoYWxmUmVjdEhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkeCA9IGRpc3RYIC0gaGFsZlJlY3RXaWR0aDtcbiAgICAgICAgY29uc3QgZHkgPSBkaXN0WSAtIGhhbGZSZWN0SGVpZ2h0O1xuICAgICAgICByZXR1cm4gKGR4ICogZHggKyBkeSAqIGR5IDw9IChyYWRpdXMgKiByYWRpdXMpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdyaWRJbmRleDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHsgbWF0NCwgdmVjNCB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgKiBhcyBzeW1ib2xTaXplIGZyb20gJy4vc3ltYm9sX3NpemUnO1xuaW1wb3J0IHsgYWRkRHluYW1pY0F0dHJpYnV0ZXMgfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9yZW5kZXIvcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgR2x5cGhPZmZzZXRBcnJheSxcbiAgICBTeW1ib2xMaW5lVmVydGV4QXJyYXksXG4gICAgU3ltYm9sRHluYW1pY0xheW91dEFycmF5XG59IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHsgV3JpdGluZ01vZGUgfSBmcm9tICcuLi9zeW1ib2wvc2hhcGluZyc7XG5cbmV4cG9ydCB7IHVwZGF0ZUxpbmVMYWJlbHMsIGhpZGVHbHlwaHMsIGdldExhYmVsUGxhbmVNYXRyaXgsIGdldEdsQ29vcmRNYXRyaXgsIHByb2plY3QsIHBsYWNlRmlyc3RBbmRMYXN0R2x5cGgsIHh5VHJhbnNmb3JtTWF0NCB9O1xuXG4vKlxuICogIyBPdmVydmlldyBvZiBjb29yZGluYXRlIHNwYWNlc1xuICpcbiAqICMjIFRpbGUgY29vcmRpbmF0ZSBzcGFjZXNcbiAqIEVhY2ggbGFiZWwgaGFzIGFuIGFuY2hvci4gU29tZSBsYWJlbHMgaGF2ZSBjb3JyZXNwb25kaW5nIGxpbmUgZ2VvbWV0cmllcy5cbiAqIFRoZSBwb2ludHMgZm9yIGJvdGggYW5jaG9ycyBhbmQgbGluZXMgYXJlIHN0b3JlZCBpbiB0aWxlIHVuaXRzLiBFYWNoIHRpbGUgaGFzIGl0J3Mgb3duXG4gKiBjb29yZGluYXRlIHNwYWNlIGdvaW5nIGZyb20gKDAsIDApIGF0IHRoZSB0b3AgbGVmdCB0byAoRVhURU5ULCBFWFRFTlQpIGF0IHRoZSBib3R0b20gcmlnaHQuXG4gKlxuICogIyMgR0wgY29vcmRpbmF0ZSBzcGFjZVxuICogQXQgdGhlIGVuZCBvZiBldmVyeXRoaW5nLCB0aGUgdmVydGV4IHNoYWRlciBuZWVkcyB0byBwcm9kdWNlIGEgcG9zaXRpb24gaW4gR0wgY29vcmRpbmF0ZSBzcGFjZSxcbiAqIHdoaWNoIGlzICgtMSwgMSkgYXQgdGhlIHRvcCBsZWZ0IGFuZCAoMSwgLTEpIGluIHRoZSBib3R0b20gcmlnaHQuXG4gKlxuICogIyMgTWFwIHBpeGVsIGNvb3JkaW5hdGUgc3BhY2VzXG4gKiBFYWNoIHRpbGUgaGFzIGEgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZS4gSXQncyBqdXN0IHRoZSB0aWxlIHVuaXRzIHNjYWxlZCBzbyB0aGF0IG9uZSB1bml0IGlzXG4gKiB3aGF0ZXZlciBjb3VudHMgYXMgMSBwaXhlbCBhdCB0aGUgY3VycmVudCB6b29tLlxuICogVGhpcyBzcGFjZSBpcyB1c2VkIGZvciBwaXRjaC1hbGlnbm1lbnQ9bWFwLCByb3RhdGlvbi1hbGlnbm1lbnQ9bWFwXG4gKlxuICogIyMgUm90YXRlZCBtYXAgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZXNcbiAqIExpa2UgdGhlIGFib3ZlLCBidXQgcm90YXRlZCBzbyBheGlzIG9mIHRoZSBzcGFjZSBhcmUgYWxpZ25lZCB3aXRoIHRoZSB2aWV3cG9ydCBpbnN0ZWFkIG9mIHRoZSB0aWxlLlxuICogVGhpcyBzcGFjZSBpcyB1c2VkIGZvciBwaXRjaC1hbGlnbm1lbnQ9bWFwLCByb3RhdGlvbi1hbGlnbm1lbnQ9dmlld3BvcnRcbiAqXG4gKiAjIyBWaWV3cG9ydCBwaXhlbCBjb29yZGluYXRlIHNwYWNlXG4gKiAoMCwgMCkgaXMgYXQgdGhlIHRvcCBsZWZ0IG9mIHRoZSBjYW52YXMgYW5kIChwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCkgaXMgYXQgdGhlIGJvdHRvbSByaWdodCBjb3JuZXJcbiAqIG9mIHRoZSBjYW52YXMuIFRoaXMgc3BhY2UgaXMgdXNlZCBmb3IgcGl0Y2gtYWxpZ25tZW50PXZpZXdwb3J0XG4gKlxuICpcbiAqICMgVmVydGV4IHByb2plY3Rpb25cbiAqIEl0IGdvZXMgcm91Z2hseSBsaWtlIHRoaXM6XG4gKiAxLiBwcm9qZWN0IHRoZSBhbmNob3IgYW5kIGxpbmUgZnJvbSB0aWxlIHVuaXRzIGludG8gdGhlIGNvcnJlY3QgbGFiZWwgY29vcmRpbmF0ZSBzcGFjZVxuICogICAgICAtIG1hcCBwaXhlbCBzcGFjZSAgICAgICAgICAgcGl0Y2gtYWxpZ25tZW50PW1hcCAgICAgICAgIHJvdGF0aW9uLWFsaWdubWVudD1tYXBcbiAqICAgICAgLSByb3RhdGVkIG1hcCBwaXhlbCBzcGFjZSAgIHBpdGNoLWFsaWdubWVudD1tYXAgICAgICAgICByb3RhdGlvbi1hbGlnbm1lbnQ9dmlld3BvcnRcbiAqICAgICAgLSB2aWV3cG9ydCBwaXhlbCBzcGFjZSAgICAgIHBpdGNoLWFsaWdubWVudD12aWV3cG9ydCAgICByb3RhdGlvbi1hbGlnbm1lbnQ9KlxuICogMi4gaWYgdGhlIGxhYmVsIGZvbGxvd3MgYSBsaW5lLCBmaW5kIHRoZSBwb2ludCBhbG9uZyB0aGUgbGluZSB0aGF0IGlzIHRoZSBjb3JyZWN0IGRpc3RhbmNlIGZyb20gdGhlIGFuY2hvci5cbiAqIDMuIGFkZCB0aGUgZ2x5cGgncyBjb3JuZXIgb2Zmc2V0IHRvIHRoZSBwb2ludCBmcm9tIHN0ZXAgM1xuICogNC4gY29udmVydCBmcm9tIHRoZSBsYWJlbCBjb29yZGluYXRlIHNwYWNlIHRvIGdsIGNvb3JkaW5hdGVzXG4gKlxuICogRm9yIGhvcml6b250YWwgbGFiZWxzIHdlIHdhbnQgdG8gZG8gc3RlcCAxIGluIHRoZSBzaGFkZXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKG5vIGNwdSB3b3JrKS5cbiAqICAgICAgVGhpcyBpcyB3aGF0IGB1X2xhYmVsX3BsYW5lX21hdHJpeGAgaXMgdXNlZCBmb3IuXG4gKiBGb3IgbGFiZWxzIGFsaWduZWQgd2l0aCBsaW5lcyB3ZSBoYXZlIHRvIHN0ZXBzIDEgYW5kIDIgb24gdGhlIGNwdSBzaW5jZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgbGluZSBnZW9tZXRyeS5cbiAqICAgICAgVGhpcyBpcyB3aGF0IGB1cGRhdGVMaW5lTGFiZWxzKC4uLilgIGRvZXMuXG4gKiAgICAgIFNpbmNlIHRoZSBjb252ZXJzaW9uIGlzIGhhbmRsZWQgb24gdGhlIGNwdSB3ZSBqdXN0IHNldCBgdV9sYWJlbF9wbGFuZV9tYXRyaXhgIHRvIGFuIGlkZW50aXR5IG1hdHJpeC5cbiAqXG4gKiBTdGVwcyAzIGFuZCA0IGFyZSBkb25lIGluIHRoZSBzaGFkZXJzIGZvciBhbGwgbGFiZWxzLlxuICovXG5cbi8qXG4gKiBSZXR1cm5zIGEgbWF0cml4IGZvciBjb252ZXJ0aW5nIGZyb20gdGlsZSB1bml0cyB0byB0aGUgY29ycmVjdCBsYWJlbCBjb29yZGluYXRlIHNwYWNlLlxuICovXG5mdW5jdGlvbiBnZXRMYWJlbFBsYW5lTWF0cml4KHBvc01hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcikge1xuICAgIGNvbnN0IG0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgIGlmIChwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMSAvIHBpeGVsc1RvVGlsZVVuaXRzLCAxIC8gcGl4ZWxzVG9UaWxlVW5pdHMsIDFdKTtcbiAgICAgICAgaWYgKCFyb3RhdGVXaXRoTWFwKSB7XG4gICAgICAgICAgICBtYXQ0LnJvdGF0ZVoobSwgbSwgdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdDQubXVsdGlwbHkobSwgdHJhbnNmb3JtLmxhYmVsUGxhbmVNYXRyaXgsIHBvc01hdHJpeCk7XG4gICAgfVxuICAgIHJldHVybiBtO1xufVxuXG4vKlxuICogUmV0dXJucyBhIG1hdHJpeCBmb3IgY29udmVydGluZyBmcm9tIHRoZSBjb3JyZWN0IGxhYmVsIGNvb3JkaW5hdGUgc3BhY2UgdG8gZ2wgY29vcmRzLlxuICovXG5mdW5jdGlvbiBnZXRHbENvb3JkTWF0cml4KHBvc01hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcikge1xuICAgIGlmIChwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgY29uc3QgbSA9IG1hdDQuY2xvbmUocG9zTWF0cml4KTtcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbcGl4ZWxzVG9UaWxlVW5pdHMsIHBpeGVsc1RvVGlsZVVuaXRzLCAxXSk7XG4gICAgICAgIGlmICghcm90YXRlV2l0aE1hcCkge1xuICAgICAgICAgICAgbWF0NC5yb3RhdGVaKG0sIG0sIC10cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0uZ2xDb29yZE1hdHJpeDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByb2plY3QocG9pbnQ6IFBvaW50LCBtYXRyaXg6IG1hdDQpIHtcbiAgICBjb25zdCBwb3MgPSBbcG9pbnQueCwgcG9pbnQueSwgMCwgMV07XG4gICAgeHlUcmFuc2Zvcm1NYXQ0KHBvcywgcG9zLCBtYXRyaXgpO1xuICAgIGNvbnN0IHcgPSBwb3NbM107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9pbnQ6IG5ldyBQb2ludChwb3NbMF0gLyB3LCBwb3NbMV0gLyB3KSxcbiAgICAgICAgc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhOiB3XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaXNWaXNpYmxlKGFuY2hvclBvczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgY2xpcHBpbmdCdWZmZXI6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCB4ID0gYW5jaG9yUG9zWzBdIC8gYW5jaG9yUG9zWzNdO1xuICAgIGNvbnN0IHkgPSBhbmNob3JQb3NbMV0gLyBhbmNob3JQb3NbM107XG4gICAgY29uc3QgaW5QYWRkZWRWaWV3cG9ydCA9IChcbiAgICAgICAgeCA+PSAtY2xpcHBpbmdCdWZmZXJbMF0gJiZcbiAgICAgICAgeCA8PSBjbGlwcGluZ0J1ZmZlclswXSAmJlxuICAgICAgICB5ID49IC1jbGlwcGluZ0J1ZmZlclsxXSAmJlxuICAgICAgICB5IDw9IGNsaXBwaW5nQnVmZmVyWzFdKTtcbiAgICByZXR1cm4gaW5QYWRkZWRWaWV3cG9ydDtcbn1cblxuLypcbiAqICBVcGRhdGUgdGhlIGBkeW5hbWljTGF5b3V0VmVydGV4QnVmZmVyYCBmb3IgdGhlIGJ1ZmZlciB3aXRoIHRoZSBjb3JyZWN0IGdseXBoIHBvc2l0aW9ucyBmb3IgdGhlIGN1cnJlbnQgbWFwIHZpZXcuXG4gKiAgVGhpcyBpcyBvbmx5IHJ1biBvbiBsYWJlbHMgdGhhdCBhcmUgYWxpZ25lZCB3aXRoIGxpbmVzLiBIb3Jpem9udGFsIGxhYmVscyBhcmUgaGFuZGxlZCBlbnRpcmVseSBpbiB0aGUgc2hhZGVyLlxuICovXG5mdW5jdGlvbiB1cGRhdGVMaW5lTGFiZWxzKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGV4dDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxQbGFuZU1hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xDb29yZE1hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwVXByaWdodDogYm9vbGVhbikge1xuXG4gICAgY29uc3Qgc2l6ZURhdGEgPSBpc1RleHQgPyBidWNrZXQudGV4dFNpemVEYXRhIDogYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICBjb25zdCBwYXJ0aWFsbHlFdmFsdWF0ZWRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhLCBwYWludGVyLnRyYW5zZm9ybS56b29tKTtcblxuICAgIGNvbnN0IGNsaXBwaW5nQnVmZmVyID0gWzI1NiAvIHBhaW50ZXIud2lkdGggKiAyICsgMSwgMjU2IC8gcGFpbnRlci5oZWlnaHQgKiAyICsgMV07XG5cbiAgICBjb25zdCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBpc1RleHQgP1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgOlxuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG5cbiAgICBjb25zdCBsaW5lVmVydGV4QXJyYXkgPSBidWNrZXQubGluZVZlcnRleEFycmF5O1xuICAgIGNvbnN0IHBsYWNlZFN5bWJvbHMgPSBpc1RleHQgPyBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheSA6IGJ1Y2tldC5pY29uLnBsYWNlZFN5bWJvbEFycmF5O1xuXG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSBwYWludGVyLnRyYW5zZm9ybS53aWR0aCAvIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodDtcblxuICAgIGxldCB1c2VWZXJ0aWNhbCA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBwbGFjZWRTeW1ib2xzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gcGxhY2VkU3ltYm9scy5nZXQocyk7XG4gICAgICAgIC8vIERvbid0IGRvIGNhbGN1bGF0aW9ucyBmb3IgdmVydGljYWwgZ2x5cGhzIHVubGVzcyB0aGUgcHJldmlvdXMgc3ltYm9sIHdhcyBob3Jpem9udGFsXG4gICAgICAgIC8vIGFuZCB3ZSBkZXRlcm1pbmVkIHRoYXQgdmVydGljYWwgZ2x5cGhzIHdlcmUgbmVjZXNzYXJ5LlxuICAgICAgICAvLyBBbHNvIGRvbid0IGRvIGNhbGN1bGF0aW9ucyBmb3Igc3ltYm9scyB0aGF0IGFyZSBjb2xsaWRlZCBhbmQgZnVsbHkgZmFkZWQgb3V0XG4gICAgICAgIGlmIChzeW1ib2wuaGlkZGVuIHx8IHN5bWJvbC53cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwgJiYgIXVzZVZlcnRpY2FsKSB7XG4gICAgICAgICAgICBoaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBd2t3YXJkLi4uIGJ1dCB3ZSdyZSBjb3VudGluZyBvbiB0aGUgcGFpcmVkIFwidmVydGljYWxcIiBzeW1ib2wgY29taW5nIGltbWVkaWF0ZWx5IGFmdGVyIGl0cyBob3Jpem9udGFsIGNvdW50ZXJwYXJ0XG4gICAgICAgIHVzZVZlcnRpY2FsID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgYW5jaG9yUG9zID0gW3N5bWJvbC5hbmNob3JYLCBzeW1ib2wuYW5jaG9yWSwgMCwgMV07XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChhbmNob3JQb3MsIGFuY2hvclBvcywgcG9zTWF0cml4KTtcblxuICAgICAgICAvLyBEb24ndCBib3RoZXIgY2FsY3VsYXRpbmcgdGhlIGNvcnJlY3QgcG9pbnQgZm9yIGludmlzaWJsZSBsYWJlbHMuXG4gICAgICAgIGlmICghaXNWaXNpYmxlKGFuY2hvclBvcywgY2xpcHBpbmdCdWZmZXIpKSB7XG4gICAgICAgICAgICBoaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbWVyYVRvQW5jaG9yRGlzdGFuY2UgPSBhbmNob3JQb3NbM107XG4gICAgICAgIGNvbnN0IHBlcnNwZWN0aXZlUmF0aW8gPSAwLjUgKyAwLjUgKiAoY2FtZXJhVG9BbmNob3JEaXN0YW5jZSAvIHBhaW50ZXIudHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UpO1xuXG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKHNpemVEYXRhLCBwYXJ0aWFsbHlFdmFsdWF0ZWRTaXplLCBzeW1ib2wpO1xuICAgICAgICBjb25zdCBwaXRjaFNjYWxlZEZvbnRTaXplID0gcGl0Y2hXaXRoTWFwID9cbiAgICAgICAgICAgIGZvbnRTaXplICogcGVyc3BlY3RpdmVSYXRpbyA6XG4gICAgICAgICAgICBmb250U2l6ZSAvIHBlcnNwZWN0aXZlUmF0aW87XG5cbiAgICAgICAgY29uc3QgdGlsZUFuY2hvclBvaW50ID0gbmV3IFBvaW50KHN5bWJvbC5hbmNob3JYLCBzeW1ib2wuYW5jaG9yWSk7XG4gICAgICAgIGNvbnN0IGFuY2hvclBvaW50ID0gcHJvamVjdCh0aWxlQW5jaG9yUG9pbnQsIGxhYmVsUGxhbmVNYXRyaXgpLnBvaW50O1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uQ2FjaGUgPSB7fTtcblxuICAgICAgICBjb25zdCBwbGFjZVVuZmxpcHBlZDogYW55ID0gcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBwaXRjaFNjYWxlZEZvbnRTaXplLCBmYWxzZSAvKnVuZmxpcHBlZCovLCBrZWVwVXByaWdodCwgcG9zTWF0cml4LCBsYWJlbFBsYW5lTWF0cml4LCBnbENvb3JkTWF0cml4LFxuICAgICAgICAgICAgYnVja2V0LmdseXBoT2Zmc2V0QXJyYXksIGxpbmVWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvKTtcblxuICAgICAgICB1c2VWZXJ0aWNhbCA9IHBsYWNlVW5mbGlwcGVkLnVzZVZlcnRpY2FsO1xuXG4gICAgICAgIGlmIChwbGFjZVVuZmxpcHBlZC5ub3RFbm91Z2hSb29tIHx8IHVzZVZlcnRpY2FsIHx8XG4gICAgICAgICAgICAocGxhY2VVbmZsaXBwZWQubmVlZHNGbGlwcGluZyAmJlxuICAgICAgICAgICAgIHBsYWNlR2x5cGhzQWxvbmdMaW5lKHN5bWJvbCwgcGl0Y2hTY2FsZWRGb250U2l6ZSwgdHJ1ZSAvKmZsaXBwZWQqLywga2VlcFVwcmlnaHQsIHBvc01hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCxcbiAgICAgICAgICAgICAgICAgYnVja2V0LmdseXBoT2Zmc2V0QXJyYXksIGxpbmVWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvKS5ub3RFbm91Z2hSb29tKSkge1xuICAgICAgICAgICAgaGlkZUdseXBocyhzeW1ib2wubnVtR2x5cGhzLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVGV4dCkge1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBsYWNlRmlyc3RBbmRMYXN0R2x5cGgoZm9udFNjYWxlOiBudW1iZXIsIGdseXBoT2Zmc2V0QXJyYXk6IEdseXBoT2Zmc2V0QXJyYXksIGxpbmVPZmZzZXRYOiBudW1iZXIsIGxpbmVPZmZzZXRZOiBudW1iZXIsIGZsaXA6IGJvb2xlYW4sIGFuY2hvclBvaW50OiBQb2ludCwgdGlsZUFuY2hvclBvaW50OiBQb2ludCwgc3ltYm9sOiBhbnksIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4OiBtYXQ0LCBwcm9qZWN0aW9uQ2FjaGU6IGFueSwgcmV0dXJuVGlsZURpc3RhbmNlOiBib29sZWFuKSB7XG4gICAgY29uc3QgZ2x5cGhFbmRJbmRleCA9IHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXggKyBzeW1ib2wubnVtR2x5cGhzO1xuICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4O1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleCArIHN5bWJvbC5saW5lTGVuZ3RoO1xuXG4gICAgY29uc3QgZmlyc3RHbHlwaE9mZnNldCA9IGdseXBoT2Zmc2V0QXJyYXkuZ2V0b2Zmc2V0WChzeW1ib2wuZ2x5cGhTdGFydEluZGV4KTtcbiAgICBjb25zdCBsYXN0R2x5cGhPZmZzZXQgPSBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoZ2x5cGhFbmRJbmRleCAtIDEpO1xuXG4gICAgY29uc3QgZmlyc3RQbGFjZWRHbHlwaCA9IHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZmlyc3RHbHlwaE9mZnNldCwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wuc2VnbWVudCxcbiAgICAgICAgbGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCwgbGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4LCBwcm9qZWN0aW9uQ2FjaGUsIHJldHVyblRpbGVEaXN0YW5jZSk7XG4gICAgaWYgKCFmaXJzdFBsYWNlZEdseXBoKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxhc3RQbGFjZWRHbHlwaCA9IHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogbGFzdEdseXBoT2Zmc2V0LCBsaW5lT2Zmc2V0WCwgbGluZU9mZnNldFksIGZsaXAsIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHN5bWJvbC5zZWdtZW50LFxuICAgICAgICBsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4LCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSwgcmV0dXJuVGlsZURpc3RhbmNlKTtcbiAgICBpZiAoIWxhc3RQbGFjZWRHbHlwaClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4geyBmaXJzdDogZmlyc3RQbGFjZWRHbHlwaCwgbGFzdDogbGFzdFBsYWNlZEdseXBoIH07XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVzT3JpZW50YXRpb25DaGFuZ2Uod3JpdGluZ01vZGUsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCwgYXNwZWN0UmF0aW8pIHtcbiAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWwpIHtcbiAgICAgICAgLy8gT24gdG9wIG9mIGNob29zaW5nIHdoZXRoZXIgdG8gZmxpcCwgY2hvb3NlIHdoZXRoZXIgdG8gcmVuZGVyIHRoaXMgdmVyc2lvbiBvZiB0aGUgZ2x5cGhzIG9yIHRoZSBhbHRlcm5hdGVcbiAgICAgICAgLy8gdmVydGljYWwgZ2x5cGhzLiBXZSBjYW4ndCBqdXN0IGZpbHRlciBvdXQgdmVydGljYWwgZ2x5cGhzIGluIHRoZSBob3Jpem9udGFsIHJhbmdlIGJlY2F1c2UgdGhlIGhvcml6b250YWxcbiAgICAgICAgLy8gYW5kIHZlcnRpY2FsIHZlcnNpb25zIGNhbiBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBwcm9qZWN0aW9ucyB3aGljaCBjb3VsZCBsZWFkIHRvIGFuZ2xlcyB3aGVyZSBib3RoIG9yXG4gICAgICAgIC8vIG5laXRoZXIgc2hvd2VkLlxuICAgICAgICBjb25zdCByaXNlID0gTWF0aC5hYnMobGFzdFBvaW50LnkgLSBmaXJzdFBvaW50LnkpO1xuICAgICAgICBjb25zdCBydW4gPSBNYXRoLmFicyhsYXN0UG9pbnQueCAtIGZpcnN0UG9pbnQueCkgKiBhc3BlY3RSYXRpbztcbiAgICAgICAgaWYgKHJpc2UgPiBydW4pIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVzZVZlcnRpY2FsOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsID8gZmlyc3RQb2ludC55IDwgbGFzdFBvaW50LnkgOiBmaXJzdFBvaW50LnggPiBsYXN0UG9pbnQueCkge1xuICAgICAgICAvLyBJbmNsdWRlcyBcImhvcml6b250YWxPbmx5XCIgY2FzZSBmb3IgbGFiZWxzIHdpdGhvdXQgdmVydGljYWwgZ2x5cGhzXG4gICAgICAgIHJldHVybiB7IG5lZWRzRmxpcHBpbmc6IHRydWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBmb250U2l6ZSwgZmxpcCwga2VlcFVwcmlnaHQsIHBvc01hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCwgZ2x5cGhPZmZzZXRBcnJheSwgbGluZVZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHByb2plY3Rpb25DYWNoZSwgYXNwZWN0UmF0aW8pIHtcbiAgICBjb25zdCBmb250U2NhbGUgPSBmb250U2l6ZSAvIDI0O1xuICAgIGNvbnN0IGxpbmVPZmZzZXRYID0gc3ltYm9sLmxpbmVPZmZzZXRYICogZm9udFNjYWxlO1xuICAgIGNvbnN0IGxpbmVPZmZzZXRZID0gc3ltYm9sLmxpbmVPZmZzZXRZICogZm9udFNjYWxlO1xuXG4gICAgbGV0IHBsYWNlZEdseXBocztcbiAgICBpZiAoc3ltYm9sLm51bUdseXBocyA+IDEpIHtcbiAgICAgICAgY29uc3QgZ2x5cGhFbmRJbmRleCA9IHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXggKyBzeW1ib2wubnVtR2x5cGhzO1xuICAgICAgICBjb25zdCBsaW5lU3RhcnRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleDtcbiAgICAgICAgY29uc3QgbGluZUVuZEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4ICsgc3ltYm9sLmxpbmVMZW5ndGg7XG5cbiAgICAgICAgLy8gUGxhY2UgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBnbHlwaCBpbiB0aGUgbGFiZWwgZmlyc3QsIHNvIHdlIGNhbiBmaWd1cmUgb3V0XG4gICAgICAgIC8vIHRoZSBvdmVyYWxsIG9yaWVudGF0aW9uIG9mIHRoZSBsYWJlbCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgZmxpcHBlZCBpbiBrZWVwVXByaWdodCBtb2RlXG4gICAgICAgIGNvbnN0IGZpcnN0QW5kTGFzdEdseXBoID0gcGxhY2VGaXJzdEFuZExhc3RHbHlwaChmb250U2NhbGUsIGdseXBoT2Zmc2V0QXJyYXksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSwgZmFsc2UpO1xuICAgICAgICBpZiAoIWZpcnN0QW5kTGFzdEdseXBoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBub3RFbm91Z2hSb29tOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHByb2plY3QoZmlyc3RBbmRMYXN0R2x5cGguZmlyc3QucG9pbnQsIGdsQ29vcmRNYXRyaXgpLnBvaW50O1xuICAgICAgICBjb25zdCBsYXN0UG9pbnQgPSBwcm9qZWN0KGZpcnN0QW5kTGFzdEdseXBoLmxhc3QucG9pbnQsIGdsQ29vcmRNYXRyaXgpLnBvaW50O1xuXG4gICAgICAgIGlmIChrZWVwVXByaWdodCAmJiAhZmxpcCkge1xuICAgICAgICAgICAgY29uc3Qgb3JpZW50YXRpb25DaGFuZ2UgPSByZXF1aXJlc09yaWVudGF0aW9uQ2hhbmdlKHN5bWJvbC53cml0aW5nTW9kZSwgZmlyc3RQb2ludCwgbGFzdFBvaW50LCBhc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICBpZiAob3JpZW50YXRpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50YXRpb25DaGFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwbGFjZWRHbHlwaHMgPSBbZmlyc3RBbmRMYXN0R2x5cGguZmlyc3RdO1xuICAgICAgICBmb3IgKGxldCBnbHlwaEluZGV4ID0gc3ltYm9sLmdseXBoU3RhcnRJbmRleCArIDE7IGdseXBoSW5kZXggPCBnbHlwaEVuZEluZGV4IC0gMTsgZ2x5cGhJbmRleCsrKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBmaXJzdCBhbmQgbGFzdCBnbHlwaCBmaXQgb24gdGhlIGxpbmUsIHdlJ3JlIHN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgZ2x5cGhzIGNhbiBiZSBwbGFjZWRcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICAgIHBsYWNlZEdseXBocy5wdXNoKHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZ2x5cGhPZmZzZXRBcnJheS5nZXRvZmZzZXRYKGdseXBoSW5kZXgpLCBsaW5lT2Zmc2V0WCwgbGluZU9mZnNldFksIGZsaXAsIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHN5bWJvbC5zZWdtZW50LFxuICAgICAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIHBsYWNlZEdseXBocy5wdXNoKGZpcnN0QW5kTGFzdEdseXBoLmxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9ubHkgYSBzaW5nbGUgZ2x5cGggdG8gcGxhY2VcbiAgICAgICAgLy8gU28sIGRldGVybWluZSB3aGV0aGVyIHRvIGZsaXAgYmFzZWQgb24gcHJvamVjdGVkIGFuZ2xlIG9mIHRoZSBsaW5lIHNlZ21lbnQgaXQncyBvblxuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgIWZsaXApIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBwcm9qZWN0KHRpbGVBbmNob3JQb2ludCwgcG9zTWF0cml4KS5wb2ludDtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVWZXJ0ZXhJbmRleCA9IChzeW1ib2wubGluZVN0YXJ0SW5kZXggKyBzeW1ib2wuc2VnbWVudCArIDEpO1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICAgICAgY29uc3QgdGlsZVNlZ21lbnRFbmQgPSBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgodGlsZVZlcnRleEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkodGlsZVZlcnRleEluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRWZXJ0ZXggPSBwcm9qZWN0KHRpbGVTZWdtZW50RW5kLCBwb3NNYXRyaXgpO1xuICAgICAgICAgICAgLy8gV2Uga25vdyB0aGUgYW5jaG9yIHdpbGwgYmUgaW4gdGhlIHZpZXdwb3J0LCBidXQgdGhlIGVuZCBvZiB0aGUgbGluZSBzZWdtZW50IG1heSBiZVxuICAgICAgICAgICAgLy8gYmVoaW5kIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLCBpbiB3aGljaCBjYXNlIHdlIGNhbiB1c2UgYSBwb2ludCBhdCBhbnkgYXJiaXRyYXJ5IChjbG9zZXIpXG4gICAgICAgICAgICAvLyBwb2ludCBvbiB0aGUgc2VnbWVudC5cbiAgICAgICAgICAgIGNvbnN0IGIgPSAocHJvamVjdGVkVmVydGV4LnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDApID9cbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRWZXJ0ZXgucG9pbnQgOlxuICAgICAgICAgICAgICAgIHByb2plY3RUcnVuY2F0ZWRMaW5lU2VnbWVudCh0aWxlQW5jaG9yUG9pbnQsIHRpbGVTZWdtZW50RW5kLCBhLCAxLCBwb3NNYXRyaXgpO1xuXG4gICAgICAgICAgICBjb25zdCBvcmllbnRhdGlvbkNoYW5nZSA9IHJlcXVpcmVzT3JpZW50YXRpb25DaGFuZ2Uoc3ltYm9sLndyaXRpbmdNb2RlLCBhLCBiLCBhc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICBpZiAob3JpZW50YXRpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50YXRpb25DaGFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICBjb25zdCBzaW5nbGVHbHlwaCA9IHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZ2x5cGhPZmZzZXRBcnJheS5nZXRvZmZzZXRYKHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXgpLCBsaW5lT2Zmc2V0WCwgbGluZU9mZnNldFksIGZsaXAsIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHN5bWJvbC5zZWdtZW50LFxuICAgICAgICAgICAgc3ltYm9sLmxpbmVTdGFydEluZGV4LCBzeW1ib2wubGluZVN0YXJ0SW5kZXggKyBzeW1ib2wubGluZUxlbmd0aCwgbGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4LCBwcm9qZWN0aW9uQ2FjaGUsIGZhbHNlKTtcbiAgICAgICAgaWYgKCFzaW5nbGVHbHlwaClcbiAgICAgICAgICAgIHJldHVybiB7IG5vdEVub3VnaFJvb206IHRydWUgfTtcblxuICAgICAgICBwbGFjZWRHbHlwaHMgPSBbc2luZ2xlR2x5cGhdO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZ2x5cGg6IGFueSBvZiBwbGFjZWRHbHlwaHMpIHtcbiAgICAgICAgYWRkRHluYW1pY0F0dHJpYnV0ZXMoZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBnbHlwaC5wb2ludCwgZ2x5cGguYW5nbGUpO1xuICAgIH1cbiAgICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIHByb2plY3RUcnVuY2F0ZWRMaW5lU2VnbWVudChwcmV2aW91c1RpbGVQb2ludDogUG9pbnQsIGN1cnJlbnRUaWxlUG9pbnQ6IFBvaW50LCBwcmV2aW91c1Byb2plY3RlZFBvaW50OiBQb2ludCwgbWluaW11bUxlbmd0aDogbnVtYmVyLCBwcm9qZWN0aW9uTWF0cml4OiBtYXQ0KSB7XG4gICAgLy8gV2UgYXJlIGFzc3VtaW5nIFwicHJldmlvdXNUaWxlUG9pbnRcIiB3b24ndCBwcm9qZWN0IHRvIGEgcG9pbnQgd2l0aGluIG9uZSB1bml0IG9mIHRoZSBjYW1lcmEgcGxhbmVcbiAgICAvLyBJZiBpdCBkaWQsIHRoYXQgd291bGQgbWVhbiBvdXIgbGFiZWwgZXh0ZW5kZWQgYWxsIHRoZSB3YXkgb3V0IGZyb20gd2l0aGluIHRoZSB2aWV3cG9ydCB0byBhICh2ZXJ5IGRpc3RhbnQpXG4gICAgLy8gcG9pbnQgbmVhciB0aGUgcGxhbmUgb2YgdGhlIGNhbWVyYS4gV2Ugd291bGRuJ3QgYmUgYWJsZSB0byByZW5kZXIgdGhlIGxhYmVsIGFueXdheSBvbmNlIGl0IGNyb3NzZWQgdGhlXG4gICAgLy8gcGxhbmUgb2YgdGhlIGNhbWVyYS5cbiAgICBjb25zdCBwcm9qZWN0ZWRVbml0VmVydGV4ID0gcHJvamVjdChwcmV2aW91c1RpbGVQb2ludC5hZGQocHJldmlvdXNUaWxlUG9pbnQuc3ViKGN1cnJlbnRUaWxlUG9pbnQpLl91bml0KCkpLCBwcm9qZWN0aW9uTWF0cml4KS5wb2ludDtcbiAgICBjb25zdCBwcm9qZWN0ZWRVbml0U2VnbWVudCA9IHByZXZpb3VzUHJvamVjdGVkUG9pbnQuc3ViKHByb2plY3RlZFVuaXRWZXJ0ZXgpO1xuXG4gICAgcmV0dXJuIHByZXZpb3VzUHJvamVjdGVkUG9pbnQuYWRkKHByb2plY3RlZFVuaXRTZWdtZW50Ll9tdWx0KG1pbmltdW1MZW5ndGggLyBwcm9qZWN0ZWRVbml0U2VnbWVudC5tYWcoKSkpO1xufVxuXG5mdW5jdGlvbiBwbGFjZUdseXBoQWxvbmdMaW5lKG9mZnNldFg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldFg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldFk6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yUG9pbnQ6IFBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlQW5jaG9yUG9pbnQ6IFBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JTZWdtZW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGFydEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVFbmRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmVydGV4QXJyYXk6IFN5bWJvbExpbmVWZXJ0ZXhBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxQbGFuZU1hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbkNhY2hlOiB7W251bWJlcl06IFBvaW50fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGlsZURpc3RhbmNlOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCBjb21iaW5lZE9mZnNldFggPSBmbGlwID9cbiAgICAgICAgb2Zmc2V0WCAtIGxpbmVPZmZzZXRYIDpcbiAgICAgICAgb2Zmc2V0WCArIGxpbmVPZmZzZXRYO1xuXG4gICAgbGV0IGRpciA9IGNvbWJpbmVkT2Zmc2V0WCA+IDAgPyAxIDogLTE7XG5cbiAgICBsZXQgYW5nbGUgPSAwO1xuICAgIGlmIChmbGlwKSB7XG4gICAgICAgIC8vIFRoZSBsYWJlbCBuZWVkcyB0byBiZSBmbGlwcGVkIHRvIGtlZXAgdGV4dCB1cHJpZ2h0LlxuICAgICAgICAvLyBJdGVyYXRlIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbi5cbiAgICAgICAgZGlyICo9IC0xO1xuICAgICAgICBhbmdsZSA9IE1hdGguUEk7XG4gICAgfVxuXG4gICAgaWYgKGRpciA8IDApIGFuZ2xlICs9IE1hdGguUEk7XG5cbiAgICBsZXQgY3VycmVudEluZGV4ID0gZGlyID4gMCA/XG4gICAgICAgIGxpbmVTdGFydEluZGV4ICsgYW5jaG9yU2VnbWVudCA6XG4gICAgICAgIGxpbmVTdGFydEluZGV4ICsgYW5jaG9yU2VnbWVudCArIDE7XG5cbiAgICBjb25zdCBpbml0aWFsSW5kZXggPSBjdXJyZW50SW5kZXg7XG4gICAgbGV0IGN1cnJlbnQgPSBhbmNob3JQb2ludDtcbiAgICBsZXQgcHJldiA9IGFuY2hvclBvaW50O1xuICAgIGxldCBkaXN0YW5jZVRvUHJldiA9IDA7XG4gICAgbGV0IGN1cnJlbnRTZWdtZW50RGlzdGFuY2UgPSAwO1xuICAgIGNvbnN0IGFic09mZnNldFggPSBNYXRoLmFicyhjb21iaW5lZE9mZnNldFgpO1xuXG4gICAgd2hpbGUgKGRpc3RhbmNlVG9QcmV2ICsgY3VycmVudFNlZ21lbnREaXN0YW5jZSA8PSBhYnNPZmZzZXRYKSB7XG4gICAgICAgIGN1cnJlbnRJbmRleCArPSBkaXI7XG5cbiAgICAgICAgLy8gb2Zmc2V0IGRvZXMgbm90IGZpdCBvbiB0aGUgcHJvamVjdGVkIGxpbmVcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IGxpbmVTdGFydEluZGV4IHx8IGN1cnJlbnRJbmRleCA+PSBsaW5lRW5kSW5kZXgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBwcmV2ID0gY3VycmVudDtcblxuICAgICAgICBjdXJyZW50ID0gcHJvamVjdGlvbkNhY2hlW2N1cnJlbnRJbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWZXJ0ZXggPSBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgoY3VycmVudEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkoY3VycmVudEluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gcHJvamVjdChjdXJyZW50VmVydGV4LCBsYWJlbFBsYW5lTWF0cml4KTtcbiAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcHJvamVjdGlvbkNhY2hlW2N1cnJlbnRJbmRleF0gPSBwcm9qZWN0aW9uLnBvaW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdmVydGV4IGlzIGJlaGluZCB0aGUgcGxhbmUgb2YgdGhlIGNhbWVyYSwgc28gd2UgY2FuJ3QgcHJvamVjdCBpdFxuICAgICAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlJ2xsIGNyZWF0ZSBhIHZlcnRleCBhbG9uZyB0aGUgbGluZSB0aGF0J3MgZmFyIGVub3VnaCB0byBpbmNsdWRlIHRoZSBnbHlwaFxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzTGluZVZlcnRleEluZGV4ID0gY3VycmVudEluZGV4IC0gZGlyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVGlsZVBvaW50ID0gZGlzdGFuY2VUb1ByZXYgPT09IDAgP1xuICAgICAgICAgICAgICAgICAgICB0aWxlQW5jaG9yUG9pbnQgOlxuICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgocHJldmlvdXNMaW5lVmVydGV4SW5kZXgpLCBsaW5lVmVydGV4QXJyYXkuZ2V0eShwcmV2aW91c0xpbmVWZXJ0ZXhJbmRleCkpO1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGNhY2hlIGJlY2F1c2UgdGhlIG5ldyB2ZXJ0ZXggbWlnaHQgbm90IGJlIGZhciBlbm91Z2ggb3V0IGZvciBmdXR1cmUgZ2x5cGhzIG9uIHRoZSBzYW1lIHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcHJvamVjdFRydW5jYXRlZExpbmVTZWdtZW50KHByZXZpb3VzVGlsZVBvaW50LCBjdXJyZW50VmVydGV4LCBwcmV2LCBhYnNPZmZzZXRYIC0gZGlzdGFuY2VUb1ByZXYgKyAxLCBsYWJlbFBsYW5lTWF0cml4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3RhbmNlVG9QcmV2ICs9IGN1cnJlbnRTZWdtZW50RGlzdGFuY2U7XG4gICAgICAgIGN1cnJlbnRTZWdtZW50RGlzdGFuY2UgPSBwcmV2LmRpc3QoY3VycmVudCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHBvaW50IGlzIG9uIHRoZSBjdXJyZW50IHNlZ21lbnQuIEludGVycG9sYXRlIHRvIGZpbmQgaXQuXG4gICAgY29uc3Qgc2VnbWVudEludGVycG9sYXRpb25UID0gKGFic09mZnNldFggLSBkaXN0YW5jZVRvUHJldikgLyBjdXJyZW50U2VnbWVudERpc3RhbmNlO1xuICAgIGNvbnN0IHByZXZUb0N1cnJlbnQgPSBjdXJyZW50LnN1YihwcmV2KTtcbiAgICBjb25zdCBwID0gcHJldlRvQ3VycmVudC5tdWx0KHNlZ21lbnRJbnRlcnBvbGF0aW9uVCkuX2FkZChwcmV2KTtcblxuICAgIC8vIG9mZnNldCB0aGUgcG9pbnQgZnJvbSB0aGUgbGluZSB0byB0ZXh0LW9mZnNldCBhbmQgaWNvbi1vZmZzZXRcbiAgICBwLl9hZGQocHJldlRvQ3VycmVudC5fdW5pdCgpLl9wZXJwKCkuX211bHQobGluZU9mZnNldFkgKiBkaXIpKTtcblxuICAgIGNvbnN0IHNlZ21lbnRBbmdsZSA9IGFuZ2xlICsgTWF0aC5hdGFuMihjdXJyZW50LnkgLSBwcmV2LnksIGN1cnJlbnQueCAtIHByZXYueCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwb2ludDogcCxcbiAgICAgICAgYW5nbGU6IHNlZ21lbnRBbmdsZSxcbiAgICAgICAgdGlsZURpc3RhbmNlOiByZXR1cm5UaWxlRGlzdGFuY2UgP1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXZUaWxlRGlzdGFuY2U6IChjdXJyZW50SW5kZXggLSBkaXIpID09PSBpbml0aWFsSW5kZXggPyAwIDogbGluZVZlcnRleEFycmF5LmdldHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yKGN1cnJlbnRJbmRleCAtIGRpciksXG4gICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRWaWV3cG9ydERpc3RhbmNlOiBhYnNPZmZzZXRYIC0gZGlzdGFuY2VUb1ByZXZcbiAgICAgICAgICAgIH0gOiBudWxsXG4gICAgfTtcbn1cblxuY29uc3QgaGlkZGVuR2x5cGhBdHRyaWJ1dGVzID0gbmV3IEZsb2F0MzJBcnJheShbLUluZmluaXR5LCAtSW5maW5pdHksIDAsIC1JbmZpbml0eSwgLUluZmluaXR5LCAwLCAtSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLUluZmluaXR5LCAtSW5maW5pdHksIDBdKTtcblxuLy8gSGlkZSB0aGVtIGJ5IG1vdmluZyB0aGVtIG9mZnNjcmVlbi4gV2Ugc3RpbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGUgYnVmZmVyXG4vLyBiZWNhdXNlIHRoZSBkeW5hbWljIGJ1ZmZlciBpcyBwYWlyZWQgd2l0aCBhIHN0YXRpYyBidWZmZXIgdGhhdCBkb2Vzbid0IGdldCB1cGRhdGVkLlxuZnVuY3Rpb24gaGlkZUdseXBocyhudW06IG51bWJlciwgZHluYW1pY0xheW91dFZlcnRleEFycmF5OiBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5yZXNpemUob2Zmc2V0ICsgNCk7XG4gICAgICAgIC8vIFNpbmNlIGFsbCBoaWRkZW4gZ2x5cGhzIGhhdmUgdGhlIHNhbWUgYXR0cmlidXRlcywgd2UgY2FuIGJ1aWxkIHVwIHRoZSBhcnJheSBmYXN0ZXIgd2l0aCBhIHNpbmdsZSBjYWxsIHRvIEZsb2F0MzJBcnJheS5zZXRcbiAgICAgICAgLy8gZm9yIGVhY2ggc2V0IG9mIGZvdXIgdmVydGljZXMsIGluc3RlYWQgb2YgY2FsbGluZyBhZGREeW5hbWljQXR0cmlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXguXG4gICAgICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5mbG9hdDMyLnNldChoaWRkZW5HbHlwaEF0dHJpYnV0ZXMsIG9mZnNldCAqIDMpO1xuICAgIH1cbn1cblxuLy8gRm9yIGxpbmUgbGFiZWwgbGF5b3V0LCB3ZSdyZSBub3QgdXNpbmcgeiBvdXRwdXQgYW5kIG91ciB3IGlucHV0IGlzIGFsd2F5cyAxXG4vLyBUaGlzIGN1c3RvbSBtYXRyaXggdHJhbnNmb3JtYXRpb24gaWdub3JlcyB0aG9zZSBjb21wb25lbnRzIHRvIG1ha2UgcHJvamVjdGlvbiBmYXN0ZXJcbmZ1bmN0aW9uIHh5VHJhbnNmb3JtTWF0NChvdXQ6IHZlYzQsIGE6IHZlYzQsIG06IG1hdDQpIHtcbiAgICBjb25zdCB4ID0gYVswXSwgeSA9IGFbMV07XG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzEzXTtcbiAgICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0ICogYXMgaW50ZXJzZWN0aW9uVGVzdHMgZnJvbSAnLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMnO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkX2luZGV4JztcbmltcG9ydCB7IG1hdDQgfSBmcm9tICdnbC1tYXRyaXgnO1xuXG5pbXBvcnQgKiBhcyBwcm9qZWN0aW9uIGZyb20gJy4uL3N5bWJvbC9wcm9qZWN0aW9uJztcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge1NpbmdsZUNvbGxpc2lvbkJveH0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgR2x5cGhPZmZzZXRBcnJheSxcbiAgICBTeW1ib2xMaW5lVmVydGV4QXJyYXlcbn0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5cbi8vIFdoZW4gYSBzeW1ib2wgY3Jvc3NlcyB0aGUgZWRnZSB0aGF0IGNhdXNlcyBpdCB0byBiZSBpbmNsdWRlZCBpblxuLy8gY29sbGlzaW9uIGRldGVjdGlvbiwgaXQgd2lsbCBjYXVzZSBjaGFuZ2VzIGluIHRoZSBzeW1ib2xzIGFyb3VuZFxuLy8gaXQuIFRoaXMgY29uc3RhbnQgc3BlY2lmaWVzIGhvdyBtYW55IHBpeGVscyB0byBwYWQgdGhlIGVkZ2Ugb2Zcbi8vIHRoZSB2aWV3cG9ydCBmb3IgY29sbGlzaW9uIGRldGVjdGlvbiBzbyB0aGF0IHRoZSBidWxrIG9mIHRoZSBjaGFuZ2VzXG4vLyBvY2N1ciBvZmZzY3JlZW4uIE1ha2luZyB0aGlzIGNvbnN0YW50IGdyZWF0ZXIgaW5jcmVhc2VzIGxhYmVsXG4vLyBzdGFiaWxpdHksIGJ1dCBpdCdzIGV4cGVuc2l2ZS5cbmNvbnN0IHZpZXdwb3J0UGFkZGluZyA9IDEwMDtcblxuLyoqXG4gKiBBIGNvbGxpc2lvbiBpbmRleCB1c2VkIHRvIHByZXZlbnQgc3ltYm9scyBmcm9tIG92ZXJsYXBwaW5nLiBJdCBrZWVwIHRyYWNrcyBvZlxuICogd2hlcmUgcHJldmlvdXMgc3ltYm9scyBoYXZlIGJlZW4gcGxhY2VkIGFuZCBpcyB1c2VkIHRvIGNoZWNrIGlmIGEgbmV3XG4gKiBzeW1ib2wgb3ZlcmxhcHMgd2l0aCBhbnkgcHJldmlvdXNseSBhZGRlZCBzeW1ib2xzLlxuICpcbiAqIFRoZXJlIGFyZSB0d28gc3RlcHMgdG8gaW5zZXJ0aW9uOiBmaXJzdCBwbGFjZUNvbGxpc2lvbkJveC9DaXJjbGVzIGNoZWNrcyBpZlxuICogdGhlcmUncyByb29tIGZvciBhIHN5bWJvbCwgdGhlbiBpbnNlcnRDb2xsaXNpb25Cb3gvQ2lyY2xlcyBhY3R1YWxseSBwdXRzIHRoZVxuICogc3ltYm9sIGluIHRoZSBpbmRleC4gVGhlIHR3byBzdGVwIHByb2Nlc3MgYWxsb3dzIHBhaXJlZCBzeW1ib2xzIHRvIGJlIGluc2VydGVkXG4gKiB0b2dldGhlciBldmVuIGlmIHRoZXkgb3ZlcmxhcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb2xsaXNpb25JbmRleCB7XG4gICAgZ3JpZDogR3JpZDtcbiAgICBpZ25vcmVkR3JpZDogR3JpZDtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBwaXRjaGZhY3RvcjogbnVtYmVyO1xuICAgIHNjcmVlblJpZ2h0Qm91bmRhcnk6IG51bWJlcjtcbiAgICBzY3JlZW5Cb3R0b21Cb3VuZGFyeTogbnVtYmVyO1xuICAgIGdyaWRSaWdodEJvdW5kYXJ5OiBudW1iZXI7XG4gICAgZ3JpZEJvdHRvbUJvdW5kYXJ5OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgIGdyaWQ6IEdyaWQgPSBuZXcgR3JpZCh0cmFuc2Zvcm0ud2lkdGggKyAyICogdmlld3BvcnRQYWRkaW5nLCB0cmFuc2Zvcm0uaGVpZ2h0ICsgMiAqIHZpZXdwb3J0UGFkZGluZywgMjUpLFxuICAgICAgICBpZ25vcmVkR3JpZDogR3JpZCA9IG5ldyBHcmlkKHRyYW5zZm9ybS53aWR0aCArIDIgKiB2aWV3cG9ydFBhZGRpbmcsIHRyYW5zZm9ybS5oZWlnaHQgKyAyICogdmlld3BvcnRQYWRkaW5nLCAyNSlcbiAgICApIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG5cbiAgICAgICAgdGhpcy5ncmlkID0gZ3JpZDtcbiAgICAgICAgdGhpcy5pZ25vcmVkR3JpZCA9IGlnbm9yZWRHcmlkO1xuICAgICAgICB0aGlzLnBpdGNoZmFjdG9yID0gTWF0aC5jb3ModHJhbnNmb3JtLl9waXRjaCkgKiB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcblxuICAgICAgICB0aGlzLnNjcmVlblJpZ2h0Qm91bmRhcnkgPSB0cmFuc2Zvcm0ud2lkdGggKyB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIHRoaXMuc2NyZWVuQm90dG9tQm91bmRhcnkgPSB0cmFuc2Zvcm0uaGVpZ2h0ICsgdmlld3BvcnRQYWRkaW5nO1xuICAgICAgICB0aGlzLmdyaWRSaWdodEJvdW5kYXJ5ID0gdHJhbnNmb3JtLndpZHRoICsgMiAqIHZpZXdwb3J0UGFkZGluZztcbiAgICAgICAgdGhpcy5ncmlkQm90dG9tQm91bmRhcnkgPSB0cmFuc2Zvcm0uaGVpZ2h0ICsgMiAqIHZpZXdwb3J0UGFkZGluZztcbiAgICB9XG5cbiAgICBwbGFjZUNvbGxpc2lvbkJveChjb2xsaXNpb25Cb3g6IFNpbmdsZUNvbGxpc2lvbkJveCwgYWxsb3dPdmVybGFwOiBib29sZWFuLCB0ZXh0UGl4ZWxSYXRpbzogbnVtYmVyLCBwb3NNYXRyaXg6IG1hdDQsIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlPzogYW55KTogeyBib3g6IEFycmF5PG51bWJlcj4sIG9mZnNjcmVlbjogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgcHJvamVjdGVkUG9pbnQgPSB0aGlzLnByb2plY3RBbmRHZXRQZXJzcGVjdGl2ZVJhdGlvKHBvc01hdHJpeCwgY29sbGlzaW9uQm94LmFuY2hvclBvaW50WCwgY29sbGlzaW9uQm94LmFuY2hvclBvaW50WSk7XG4gICAgICAgIGNvbnN0IHRpbGVUb1ZpZXdwb3J0ID0gdGV4dFBpeGVsUmF0aW8gKiBwcm9qZWN0ZWRQb2ludC5wZXJzcGVjdGl2ZVJhdGlvO1xuICAgICAgICBjb25zdCB0bFggPSBjb2xsaXNpb25Cb3gueDEgKiB0aWxlVG9WaWV3cG9ydCArIHByb2plY3RlZFBvaW50LnBvaW50Lng7XG4gICAgICAgIGNvbnN0IHRsWSA9IGNvbGxpc2lvbkJveC55MSAqIHRpbGVUb1ZpZXdwb3J0ICsgcHJvamVjdGVkUG9pbnQucG9pbnQueTtcbiAgICAgICAgY29uc3QgYnJYID0gY29sbGlzaW9uQm94LngyICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC54O1xuICAgICAgICBjb25zdCBiclkgPSBjb2xsaXNpb25Cb3gueTIgKiB0aWxlVG9WaWV3cG9ydCArIHByb2plY3RlZFBvaW50LnBvaW50Lnk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zaWRlR3JpZCh0bFgsIHRsWSwgYnJYLCBiclkpIHx8XG4gICAgICAgICAgICAoIWFsbG93T3ZlcmxhcCAmJiB0aGlzLmdyaWQuaGl0VGVzdCh0bFgsIHRsWSwgYnJYLCBiclksIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYm94OiBbXSxcbiAgICAgICAgICAgICAgICBvZmZzY3JlZW46IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJveDogW3RsWCwgdGxZLCBiclgsIGJyWV0sXG4gICAgICAgICAgICBvZmZzY3JlZW46IHRoaXMuaXNPZmZzY3JlZW4odGxYLCB0bFksIGJyWCwgYnJZKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFwcHJveGltYXRlVGlsZURpc3RhbmNlKHRpbGVEaXN0YW5jZTogYW55LCBsYXN0U2VnbWVudEFuZ2xlOiBudW1iZXIsIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIsIGNhbWVyYVRvQW5jaG9yRGlzdGFuY2U6IG51bWJlciwgcGl0Y2hXaXRoTWFwOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHF1aWNrIGFuZCBkaXJ0eSBzb2x1dGlvbiBmb3IgY2hvc2luZyB3aGljaCBjb2xsaXNpb24gY2lyY2xlcyB0byB1c2UgKHNpbmNlIGNvbGxpc2lvbiBjaXJjbGVzIGFyZVxuICAgICAgICAvLyBsYWlkIG91dCBpbiB0aWxlIHVuaXRzKS4gSWRlYWxseSwgSSB0aGluayB3ZSBzaG91bGQgZ2VuZXJhdGUgY29sbGlzaW9uIGNpcmNsZXMgb24gdGhlIGZseSBpbiB2aWV3cG9ydCBjb29yZGluYXRlc1xuICAgICAgICAvLyBhdCB0aGUgdGltZSB3ZSBkbyBjb2xsaXNpb24gZGV0ZWN0aW9uLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU0NzRcblxuICAgICAgICAvLyBpbmNpZGVuY2VTdHJldGNoIGlzIHRoZSByYXRpbyBvZiBob3cgbXVjaCB5IHNwYWNlIGEgbGFiZWwgdGFrZXMgdXAgb24gYSB0aWxlIHdoaWxlIGRyYXduIHBlcnBlbmRpY3VsYXIgdG8gdGhlIHZpZXdwb3J0IHZzXG4gICAgICAgIC8vICBob3cgbXVjaCBzcGFjZSBpdCB3b3VsZCB0YWtlIHVwIGlmIGl0IHdlcmUgZHJhd24gZmxhdCBvbiB0aGUgdGlsZVxuICAgICAgICAvLyBVc2luZyBsYXcgb2Ygc2luZXMsIGNhbWVyYV90b19hbmNob3Ivc2luKGdyb3VuZF9hbmdsZSkgPSBjYW1lcmFfdG9fY2VudGVyL3NpbihpbmNpZGVuY2VfYW5nbGUpXG4gICAgICAgIC8vIEluY2lkZW5jZSBhbmdsZSA5MCAtPiBoZWFkIG9uLCBzaW4oaW5jaWRlbmNlX2FuZ2xlKSA9IDEsIG5vIHN0cmV0Y2hcbiAgICAgICAgLy8gSW5jaWRlbmNlIGFuZ2xlIDEgLT4gdmVyeSBvYmxpcXVlLCBzaW4oaW5jaWRlbmNlX2FuZ2xlKSA9fiAwLCBsb3RzIG9mIHN0cmV0Y2hcbiAgICAgICAgLy8gZ3JvdW5kX2FuZ2xlID0gdV9waXRjaCArIFBJLzIgLT4gc2luKGdyb3VuZF9hbmdsZSkgPSBjb3ModV9waXRjaClcbiAgICAgICAgLy8gaW5jaWRlbmNlU3RyZXRjaCA9IDEgLyBzaW4oaW5jaWRlbmNlQW5nbGUpXG5cbiAgICAgICAgY29uc3QgaW5jaWRlbmNlU3RyZXRjaCA9IHBpdGNoV2l0aE1hcCA/IDEgOiBjYW1lcmFUb0FuY2hvckRpc3RhbmNlIC8gdGhpcy5waXRjaGZhY3RvcjtcbiAgICAgICAgY29uc3QgbGFzdFNlZ21lbnRUaWxlID0gdGlsZURpc3RhbmNlLmxhc3RTZWdtZW50Vmlld3BvcnREaXN0YW5jZSAqIHBpeGVsc1RvVGlsZVVuaXRzO1xuICAgICAgICByZXR1cm4gdGlsZURpc3RhbmNlLnByZXZUaWxlRGlzdGFuY2UgK1xuICAgICAgICAgICAgbGFzdFNlZ21lbnRUaWxlICtcbiAgICAgICAgICAgIChpbmNpZGVuY2VTdHJldGNoIC0gMSkgKiBsYXN0U2VnbWVudFRpbGUgKiBNYXRoLmFicyhNYXRoLnNpbihsYXN0U2VnbWVudEFuZ2xlKSk7XG4gICAgfVxuXG4gICAgcGxhY2VDb2xsaXNpb25DaXJjbGVzKGNvbGxpc2lvbkNpcmNsZXM6IEFycmF5PG51bWJlcj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93T3ZlcmxhcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFBpeGVsUmF0aW86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE9mZnNldEFycmF5OiBHbHlwaE9mZnNldEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb2xsaXNpb25DaXJjbGVzOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlPzogYW55KTogeyBjaXJjbGVzOiBBcnJheTxudW1iZXI+LCBvZmZzY3JlZW46IGJvb2xlYW4gfSB7XG4gICAgICAgIGNvbnN0IHBsYWNlZENvbGxpc2lvbkNpcmNsZXMgPSBbXTtcblxuICAgICAgICBjb25zdCBwcm9qZWN0ZWRBbmNob3IgPSB0aGlzLnByb2plY3RBbmNob3IocG9zTWF0cml4LCBzeW1ib2wuYW5jaG9yWCwgc3ltYm9sLmFuY2hvclkpO1xuXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25DYWNoZSA9IHt9O1xuICAgICAgICBjb25zdCBmb250U2NhbGUgPSBmb250U2l6ZSAvIDI0O1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0WCA9IHN5bWJvbC5saW5lT2Zmc2V0WCAqIGZvbnRTaXplO1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0WSA9IHN5bWJvbC5saW5lT2Zmc2V0WSAqIGZvbnRTaXplO1xuXG4gICAgICAgIGNvbnN0IHRpbGVVbml0QW5jaG9yUG9pbnQgPSBuZXcgUG9pbnQoc3ltYm9sLmFuY2hvclgsIHN5bWJvbC5hbmNob3JZKTtcbiAgICAgICAgLy8gcHJvamVjdGlvbi5wcm9qZWN0IGdlbmVyYXRlcyBOREMgY29vcmRpbmF0ZXMsIGFzIG9wcG9zZWQgdG8gdGhlXG4gICAgICAgIC8vIHBpeGVsLWJhc2VkIGdyaWQgY29vcmRpbmF0ZXMgZ2VuZXJhdGVkIGJ5IHRoaXMucHJvamVjdFBvaW50XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVBbmNob3JQb2ludCA9XG4gICAgICAgICAgICBwcm9qZWN0aW9uLnByb2plY3QodGlsZVVuaXRBbmNob3JQb2ludCwgbGFiZWxQbGFuZU1hdHJpeCkucG9pbnQ7XG4gICAgICAgIGNvbnN0IGZpcnN0QW5kTGFzdEdseXBoID0gcHJvamVjdGlvbi5wbGFjZUZpcnN0QW5kTGFzdEdseXBoKFxuICAgICAgICAgICAgZm9udFNjYWxlLFxuICAgICAgICAgICAgZ2x5cGhPZmZzZXRBcnJheSxcbiAgICAgICAgICAgIGxpbmVPZmZzZXRYLFxuICAgICAgICAgICAgbGluZU9mZnNldFksXG4gICAgICAgICAgICAvKmZsaXAqLyBmYWxzZSxcbiAgICAgICAgICAgIGxhYmVsUGxhbmVBbmNob3JQb2ludCxcbiAgICAgICAgICAgIHRpbGVVbml0QW5jaG9yUG9pbnQsXG4gICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICBsaW5lVmVydGV4QXJyYXksXG4gICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4LFxuICAgICAgICAgICAgcHJvamVjdGlvbkNhY2hlLFxuICAgICAgICAgICAgLypyZXR1cm4gdGlsZSBkaXN0YW5jZSovIHRydWUpO1xuXG4gICAgICAgIGxldCBjb2xsaXNpb25EZXRlY3RlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaW5HcmlkID0gZmFsc2U7XG4gICAgICAgIGxldCBlbnRpcmVseU9mZnNjcmVlbiA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgdGlsZVRvVmlld3BvcnQgPSBwcm9qZWN0ZWRBbmNob3IucGVyc3BlY3RpdmVSYXRpbyAqIHRleHRQaXhlbFJhdGlvO1xuICAgICAgICAvLyBwaXhlbHNUb1RpbGVVbml0cyBpcyB1c2VkIGZvciB0cmFuc2xhdGluZyBsaW5lIGdlb21ldHJ5IHRvIHRpbGUgdW5pdHNcbiAgICAgICAgLy8gLi4uIHNvIHdlIGNhcmUgYWJvdXQgJ3NjYWxlJyBidXQgbm90ICdwZXJzcGVjdGl2ZVJhdGlvJ1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHBpeGVsX3RvX3RpbGVfdW5pdHNcbiAgICAgICAgY29uc3QgcGl4ZWxzVG9UaWxlVW5pdHMgPSAxIC8gKHRleHRQaXhlbFJhdGlvICogc2NhbGUpO1xuXG4gICAgICAgIGxldCBmaXJzdFRpbGVEaXN0YW5jZSA9IDAsIGxhc3RUaWxlRGlzdGFuY2UgPSAwO1xuICAgICAgICBpZiAoZmlyc3RBbmRMYXN0R2x5cGgpIHtcbiAgICAgICAgICAgIGZpcnN0VGlsZURpc3RhbmNlID0gdGhpcy5hcHByb3hpbWF0ZVRpbGVEaXN0YW5jZShmaXJzdEFuZExhc3RHbHlwaC5maXJzdC50aWxlRGlzdGFuY2UsIGZpcnN0QW5kTGFzdEdseXBoLmZpcnN0LmFuZ2xlLCBwaXhlbHNUb1RpbGVVbml0cywgcHJvamVjdGVkQW5jaG9yLmNhbWVyYURpc3RhbmNlLCBwaXRjaFdpdGhNYXApO1xuICAgICAgICAgICAgbGFzdFRpbGVEaXN0YW5jZSA9IHRoaXMuYXBwcm94aW1hdGVUaWxlRGlzdGFuY2UoZmlyc3RBbmRMYXN0R2x5cGgubGFzdC50aWxlRGlzdGFuY2UsIGZpcnN0QW5kTGFzdEdseXBoLmxhc3QuYW5nbGUsIHBpeGVsc1RvVGlsZVVuaXRzLCBwcm9qZWN0ZWRBbmNob3IuY2FtZXJhRGlzdGFuY2UsIHBpdGNoV2l0aE1hcCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbGxpc2lvbkNpcmNsZXMubGVuZ3RoOyBrICs9IDUpIHtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvclBvaW50WCA9IGNvbGxpc2lvbkNpcmNsZXNba107XG4gICAgICAgICAgICBjb25zdCBhbmNob3JQb2ludFkgPSBjb2xsaXNpb25DaXJjbGVzW2sgKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVVbml0UmFkaXVzID0gY29sbGlzaW9uQ2lyY2xlc1trICsgMl07XG4gICAgICAgICAgICBjb25zdCBib3hTaWduZWREaXN0YW5jZUZyb21BbmNob3IgPSBjb2xsaXNpb25DaXJjbGVzW2sgKyAzXTtcbiAgICAgICAgICAgIGlmICghZmlyc3RBbmRMYXN0R2x5cGggfHxcbiAgICAgICAgICAgICAgICAoYm94U2lnbmVkRGlzdGFuY2VGcm9tQW5jaG9yIDwgLWZpcnN0VGlsZURpc3RhbmNlKSB8fFxuICAgICAgICAgICAgICAgIChib3hTaWduZWREaXN0YW5jZUZyb21BbmNob3IgPiBsYXN0VGlsZURpc3RhbmNlKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBsYWJlbCBlaXRoZXIgZG9lc24ndCBmaXQgb24gaXRzIGxpbmUgb3Igd2VcbiAgICAgICAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIHVzZSB0aGlzIGNpcmNsZSBiZWNhdXNlIHRoZSBsYWJlbFxuICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgZXh0ZW5kIHRoaXMgZmFyLiBFaXRoZXIgd2F5LCBtYXJrIHRoZSBjaXJjbGUgdW51c2VkLlxuICAgICAgICAgICAgICAgIG1hcmtDb2xsaXNpb25DaXJjbGVVc2VkKGNvbGxpc2lvbkNpcmNsZXMsIGssIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkUG9pbnQgPSB0aGlzLnByb2plY3RQb2ludChwb3NNYXRyaXgsIGFuY2hvclBvaW50WCwgYW5jaG9yUG9pbnRZKTtcbiAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHRpbGVVbml0UmFkaXVzICogdGlsZVRvVmlld3BvcnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGF0TGVhc3RPbmVDaXJjbGVQbGFjZWQgPSBwbGFjZWRDb2xsaXNpb25DaXJjbGVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoYXRMZWFzdE9uZUNpcmNsZVBsYWNlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gcHJvamVjdGVkUG9pbnQueCAtIHBsYWNlZENvbGxpc2lvbkNpcmNsZXNbcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcy5sZW5ndGggLSA0XTtcbiAgICAgICAgICAgICAgICBjb25zdCBkeSA9IHByb2plY3RlZFBvaW50LnkgLSBwbGFjZWRDb2xsaXNpb25DaXJjbGVzW3BsYWNlZENvbGxpc2lvbkNpcmNsZXMubGVuZ3RoIC0gM107XG4gICAgICAgICAgICAgICAgLy8gVGhlIGNpcmNsZSBlZGdlcyB0b3VjaCB3aGVuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZWlyIGNlbnRlcnMgaXMgMnggdGhlIHJhZGl1c1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGRpc3RhbmNlIGlzIDF4IHRoZSByYWRpdXMsIHRoZXkncmUgZG91YmxlZCB1cCwgYW5kIHdlIGNvdWxkIHJlbW92ZVxuICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IG90aGVyIGNpcmNsZSB3aGlsZSBrZWVwaW5nIHRoZW0gYWxsIGluIHRvdWNoLlxuICAgICAgICAgICAgICAgIC8vIFdlIGFjdHVhbGx5IHN0YXJ0IHJlbW92aW5nIGNpcmNsZXMgd2hlbiB0aGUgZGlzdGFuY2UgaXMgw6LCiMKaMnggdGhlIHJhZGl1czpcbiAgICAgICAgICAgICAgICAvLyAgdGhpbm5pbmcgdGhlIG51bWJlciBvZiBjaXJjbGVzIGFzIG11Y2ggYXMgcG9zc2libGUgaXMgYSBtYWpvciBwZXJmb3JtYW5jZSB3aW4sXG4gICAgICAgICAgICAgICAgLy8gIGFuZCB0aGUgc21hbGwgZ2FwcyBpbnRyb2R1Y2VkIGRvbid0IG1ha2UgYSB2ZXJ5IG5vdGljZWFibGUgZGlmZmVyZW5jZS5cbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWRUb29EZW5zZWx5ID0gcmFkaXVzICogcmFkaXVzICogMiA+IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZWRUb29EZW5zZWx5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0TGVhc3RPbmVNb3JlQ2lyY2xlID0gKGsgKyA4KSA8IGNvbGxpc2lvbkNpcmNsZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXRMZWFzdE9uZU1vcmVDaXJjbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRCb3hEaXN0YW5jZVRvQW5jaG9yID0gY29sbGlzaW9uQ2lyY2xlc1trICsgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5leHRCb3hEaXN0YW5jZVRvQW5jaG9yID4gLWZpcnN0VGlsZURpc3RhbmNlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRCb3hEaXN0YW5jZVRvQW5jaG9yIDwgbGFzdFRpbGVEaXN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIaWRlIHNpZ25pZmljYW50bHkgb3ZlcmxhcHBpbmcgY2lyY2xlcywgdW5sZXNzIHRoaXMgaXMgdGhlIGxhc3Qgb25lIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGtlZXAgaXQgaW4gcGxhY2UgZXZlbiBpZiBpdCdzIHRpZ2h0bHkgcGFja2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgb25lIGJlZm9yZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29sbGlzaW9uQ2lyY2xlVXNlZChjb2xsaXNpb25DaXJjbGVzLCBrLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb2xsaXNpb25Cb3hBcnJheUluZGV4ID0gayAvIDU7XG4gICAgICAgICAgICBwbGFjZWRDb2xsaXNpb25DaXJjbGVzLnB1c2gocHJvamVjdGVkUG9pbnQueCwgcHJvamVjdGVkUG9pbnQueSwgcmFkaXVzLCBjb2xsaXNpb25Cb3hBcnJheUluZGV4KTtcbiAgICAgICAgICAgIG1hcmtDb2xsaXNpb25DaXJjbGVVc2VkKGNvbGxpc2lvbkNpcmNsZXMsIGssIHRydWUpO1xuXG4gICAgICAgICAgICBjb25zdCB4MSA9IHByb2plY3RlZFBvaW50LnggLSByYWRpdXM7XG4gICAgICAgICAgICBjb25zdCB5MSA9IHByb2plY3RlZFBvaW50LnkgLSByYWRpdXM7XG4gICAgICAgICAgICBjb25zdCB4MiA9IHByb2plY3RlZFBvaW50LnggKyByYWRpdXM7XG4gICAgICAgICAgICBjb25zdCB5MiA9IHByb2plY3RlZFBvaW50LnkgKyByYWRpdXM7XG4gICAgICAgICAgICBlbnRpcmVseU9mZnNjcmVlbiA9IGVudGlyZWx5T2Zmc2NyZWVuICYmIHRoaXMuaXNPZmZzY3JlZW4oeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgICAgaW5HcmlkID0gaW5HcmlkIHx8IHRoaXMuaXNJbnNpZGVHcmlkKHgxLCB5MSwgeDIsIHkyKTtcblxuICAgICAgICAgICAgaWYgKCFhbGxvd092ZXJsYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncmlkLmhpdFRlc3RDaXJjbGUocHJvamVjdGVkUG9pbnQueCwgcHJvamVjdGVkUG9pbnQueSwgcmFkaXVzLCBjb2xsaXNpb25Hcm91cFByZWRpY2F0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93Q29sbGlzaW9uQ2lyY2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW46IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZWFybHkgZXhpdCBpZiB3ZSdyZSBzaG93aW5nIHRoZSBkZWJ1ZyBjaXJjbGVzIGJlY2F1c2Ugd2Ugc3RpbGwgd2FudCB0byBjYWxjdWxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNpcmNsZXMgYXJlIGluIHVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNpcmNsZXM6IChjb2xsaXNpb25EZXRlY3RlZCB8fCAhaW5HcmlkKSA/IFtdIDogcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcyxcbiAgICAgICAgICAgIG9mZnNjcmVlbjogZW50aXJlbHlPZmZzY3JlZW5cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWNhdXNlIHRoZSBnZW9tZXRyaWVzIGluIHRoZSBDb2xsaXNpb25JbmRleCBhcmUgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgc2hhcGUgb2ZcbiAgICAgKiBzeW1ib2xzIG9uIHRoZSBtYXAsIHdlIHVzZSB0aGUgQ29sbGlzaW9uSW5kZXggdG8gbG9vayB1cCB0aGUgc3ltYm9sIHBhcnQgb2ZcbiAgICAgKiBgcXVlcnlSZW5kZXJlZEZlYXR1cmVzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcXVlcnlSZW5kZXJlZFN5bWJvbHModmlld3BvcnRRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4pIHtcbiAgICAgICAgaWYgKHZpZXdwb3J0UXVlcnlHZW9tZXRyeS5sZW5ndGggPT09IDAgfHwgKHRoaXMuZ3JpZC5rZXlzTGVuZ3RoKCkgPT09IDAgJiYgdGhpcy5pZ25vcmVkR3JpZC5rZXlzTGVuZ3RoKCkgPT09IDApKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IFtdO1xuICAgICAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygdmlld3BvcnRRdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBncmlkUG9pbnQgPSBuZXcgUG9pbnQocG9pbnQueCArIHZpZXdwb3J0UGFkZGluZywgcG9pbnQueSArIHZpZXdwb3J0UGFkZGluZyk7XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZ3JpZFBvaW50LngpO1xuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIGdyaWRQb2ludC55KTtcbiAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBncmlkUG9pbnQueCk7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZ3JpZFBvaW50LnkpO1xuICAgICAgICAgICAgcXVlcnkucHVzaChncmlkUG9pbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdyaWQucXVlcnkobWluWCwgbWluWSwgbWF4WCwgbWF4WSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5pZ25vcmVkR3JpZC5xdWVyeShtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKSk7XG5cbiAgICAgICAgY29uc3Qgc2VlbkZlYXR1cmVzID0ge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZUtleSA9IGZlYXR1cmUua2V5O1xuICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IHNlZW4gZmVhdHVyZXMuXG4gICAgICAgICAgICBpZiAoc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNlZW5GZWF0dXJlc1tmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF1bZmVhdHVyZUtleS5mZWF0dXJlSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHF1ZXJ5IGludGVyc2VjdHMgd2l0aCB0aGUgZmVhdHVyZSBib3hcbiAgICAgICAgICAgIC8vIFwiQ29sbGlzaW9uIENpcmNsZXNcIiBmb3IgbGluZSBsYWJlbHMgYXJlIHRyZWF0ZWQgYXMgYm94ZXMgaGVyZVxuICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUncyBubyBhY3R1YWwgY29sbGlzaW9uIHRha2luZyBwbGFjZSwgdGhlIGNpcmNsZSB2cy4gc3F1YXJlXG4gICAgICAgICAgICAvLyBkaXN0aW5jdGlvbiBkb2Vzbid0IG1hdHRlciBhcyBtdWNoLCBhbmQgYm94IGdlb21ldHJ5IGlzIGVhc2llclxuICAgICAgICAgICAgLy8gdG8gd29yayB3aXRoLlxuICAgICAgICAgICAgY29uc3QgYmJveCA9IFtcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoZmVhdHVyZS54MSwgZmVhdHVyZS55MSksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KGZlYXR1cmUueDIsIGZlYXR1cmUueTEpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChmZWF0dXJlLngyLCBmZWF0dXJlLnkyKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoZmVhdHVyZS54MSwgZmVhdHVyZS55MilcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoIWludGVyc2VjdGlvblRlc3RzLnBvbHlnb25JbnRlcnNlY3RzUG9seWdvbihxdWVyeSwgYmJveCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF1bZmVhdHVyZUtleS5mZWF0dXJlSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHRbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdFtmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdLnB1c2goZmVhdHVyZUtleS5mZWF0dXJlSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpbnNlcnRDb2xsaXNpb25Cb3goY29sbGlzaW9uQm94OiBBcnJheTxudW1iZXI+LCBpZ25vcmVQbGFjZW1lbnQ6IGJvb2xlYW4sIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlciwgZmVhdHVyZUluZGV4OiBudW1iZXIsIGNvbGxpc2lvbkdyb3VwSUQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBncmlkID0gaWdub3JlUGxhY2VtZW50ID8gdGhpcy5pZ25vcmVkR3JpZCA6IHRoaXMuZ3JpZDtcblxuICAgICAgICBjb25zdCBrZXkgPSB7IGJ1Y2tldEluc3RhbmNlSWQsIGZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXBJRCB9O1xuICAgICAgICBncmlkLmluc2VydChrZXksIGNvbGxpc2lvbkJveFswXSwgY29sbGlzaW9uQm94WzFdLCBjb2xsaXNpb25Cb3hbMl0sIGNvbGxpc2lvbkJveFszXSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0Q29sbGlzaW9uQ2lyY2xlcyhjb2xsaXNpb25DaXJjbGVzOiBBcnJheTxudW1iZXI+LCBpZ25vcmVQbGFjZW1lbnQ6IGJvb2xlYW4sIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlciwgZmVhdHVyZUluZGV4OiBudW1iZXIsIGNvbGxpc2lvbkdyb3VwSUQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBncmlkID0gaWdub3JlUGxhY2VtZW50ID8gdGhpcy5pZ25vcmVkR3JpZCA6IHRoaXMuZ3JpZDtcblxuICAgICAgICBjb25zdCBrZXkgPSB7IGJ1Y2tldEluc3RhbmNlSWQsIGZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXBJRCB9O1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbGxpc2lvbkNpcmNsZXMubGVuZ3RoOyBrICs9IDQpIHtcbiAgICAgICAgICAgIGdyaWQuaW5zZXJ0Q2lyY2xlKGtleSwgY29sbGlzaW9uQ2lyY2xlc1trXSwgY29sbGlzaW9uQ2lyY2xlc1trICsgMV0sIGNvbGxpc2lvbkNpcmNsZXNbayArIDJdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2plY3RBbmNob3IocG9zTWF0cml4OiBtYXQ0LCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwID0gW3gsIHksIDAsIDFdO1xuICAgICAgICBwcm9qZWN0aW9uLnh5VHJhbnNmb3JtTWF0NChwLCBwLCBwb3NNYXRyaXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGVyc3BlY3RpdmVSYXRpbzogMC41ICsgMC41ICogKHRoaXMudHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBwWzNdKSxcbiAgICAgICAgICAgIGNhbWVyYURpc3RhbmNlOiBwWzNdXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvamVjdFBvaW50KHBvc01hdHJpeDogbWF0NCwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcCA9IFt4LCB5LCAwLCAxXTtcbiAgICAgICAgcHJvamVjdGlvbi54eVRyYW5zZm9ybU1hdDQocCwgcCwgcG9zTWF0cml4KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgICAgICgoKHBbMF0gLyBwWzNdICsgMSkgLyAyKSAqIHRoaXMudHJhbnNmb3JtLndpZHRoKSArIHZpZXdwb3J0UGFkZGluZyxcbiAgICAgICAgICAgICgoKC1wWzFdIC8gcFszXSArIDEpIC8gMikgKiB0aGlzLnRyYW5zZm9ybS5oZWlnaHQpICsgdmlld3BvcnRQYWRkaW5nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8ocG9zTWF0cml4OiBtYXQ0LCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwID0gW3gsIHksIDAsIDFdO1xuICAgICAgICBwcm9qZWN0aW9uLnh5VHJhbnNmb3JtTWF0NChwLCBwLCBwb3NNYXRyaXgpO1xuICAgICAgICBjb25zdCBhID0gbmV3IFBvaW50KFxuICAgICAgICAgICAgKCgocFswXSAvIHBbM10gKyAxKSAvIDIpICogdGhpcy50cmFuc2Zvcm0ud2lkdGgpICsgdmlld3BvcnRQYWRkaW5nLFxuICAgICAgICAgICAgKCgoLXBbMV0gLyBwWzNdICsgMSkgLyAyKSAqIHRoaXMudHJhbnNmb3JtLmhlaWdodCkgKyB2aWV3cG9ydFBhZGRpbmdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvaW50OiBhLFxuICAgICAgICAgICAgLy8gU2VlIHBlcnNwZWN0aXZlIHJhdGlvIGNvbW1lbnQgaW4gc3ltYm9sX3NkZi52ZXJ0ZXhcbiAgICAgICAgICAgIC8vIFdlJ3JlIGRvaW5nIGNvbGxpc2lvbiBkZXRlY3Rpb24gaW4gdmlld3BvcnQgc3BhY2Ugc28gd2UgbmVlZFxuICAgICAgICAgICAgLy8gdG8gc2NhbGUgZG93biBib3hlcyBpbiB0aGUgZGlzdGFuY2VcbiAgICAgICAgICAgIHBlcnNwZWN0aXZlUmF0aW86IDAuNSArIDAuNSAqICh0aGlzLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gcFszXSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpc09mZnNjcmVlbih4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB4MiA8IHZpZXdwb3J0UGFkZGluZyB8fCB4MSA+PSB0aGlzLnNjcmVlblJpZ2h0Qm91bmRhcnkgfHwgeTIgPCB2aWV3cG9ydFBhZGRpbmcgfHwgeTEgPiB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5O1xuICAgIH1cblxuICAgIGlzSW5zaWRlR3JpZCh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB4MiA+PSAwICYmIHgxIDwgdGhpcy5ncmlkUmlnaHRCb3VuZGFyeSAmJiB5MiA+PSAwICYmIHkxIDwgdGhpcy5ncmlkQm90dG9tQm91bmRhcnk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYXJrQ29sbGlzaW9uQ2lyY2xlVXNlZChjb2xsaXNpb25DaXJjbGVzOiBBcnJheTxudW1iZXI+LCBpbmRleDogbnVtYmVyLCB1c2VkOiBib29sZWFuKSB7XG4gICAgY29sbGlzaW9uQ2lyY2xlc1tpbmRleCArIDRdID0gdXNlZCA/IDEgOiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb25JbmRleDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuXG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBpeGVsIHZhbHVlIGF0IGEgdGhlIGdpdmVuIHpvb20gbGV2ZWwgdG8gdGlsZSB1bml0cy5cbiAqXG4gKiBUaGUgc2hhZGVycyBtb3N0bHkgY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgaW4gdGlsZSB1bml0cyBzbyBzdHlsZVxuICogcHJvcGVydGllcyBuZWVkIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHBpeGVscyB0byB0aWxlIHVuaXRzIHVzaW5nIHRoaXMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGEgdHJhbnNsYXRpb24gYnkgMzAgcGl4ZWxzIGF0IHpvb20gNi41IHdpbGwgYmUgYVxuICogdHJhbnNsYXRpb24gYnkgcGl4ZWxzVG9UaWxlVW5pdHMoMzAsIDYuNSkgdGlsZSB1bml0cy5cbiAqXG4gKiBAcmV0dXJucyB2YWx1ZSBpbiB0aWxlIHVuaXRzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0aWxlOiB7dGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlU2l6ZTogbnVtYmVyfSwgcGl4ZWxWYWx1ZTogbnVtYmVyLCB6OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwaXhlbFZhbHVlICogKEVYVEVOVCAvICh0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgeiAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKSkpO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbGxpc2lvbkluZGV4IGZyb20gJy4vY29sbGlzaW9uX2luZGV4JztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuL3N5bWJvbF9zaXplJztcbmltcG9ydCAqIGFzIHByb2plY3Rpb24gZnJvbSAnLi9wcm9qZWN0aW9uJztcbmltcG9ydCB7IGdldEFuY2hvckp1c3RpZmljYXRpb24sIGV2YWx1YXRlUmFkaWFsT2Zmc2V0IH0gZnJvbSAnLi9zeW1ib2xfbGF5b3V0JztcbmltcG9ydCB7IGdldEFuY2hvckFsaWdubWVudCwgV3JpdGluZ01vZGUgfSBmcm9tICcuL3NoYXBpbmcnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQsIHsgQ29sbGlzaW9uQXJyYXlzLCBTaW5nbGVDb2xsaXNpb25Cb3ggfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCB0eXBlIHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5LCBDb2xsaXNpb25WZXJ0ZXhBcnJheSwgU3ltYm9sSW5zdGFuY2V9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHR5cGUgRmVhdHVyZUluZGV4IGZyb20gJy4uL2RhdGEvZmVhdHVyZV9pbmRleCc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUge1RleHRBbmNob3J9IGZyb20gJy4vc3ltYm9sX2xheW91dCc7XG5cbmNsYXNzIE9wYWNpdHlTdGF0ZSB7XG4gICAgb3BhY2l0eTogbnVtYmVyO1xuICAgIHBsYWNlZDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcihwcmV2U3RhdGU6ID9PcGFjaXR5U3RhdGUsIGluY3JlbWVudDogbnVtYmVyLCBwbGFjZWQ6IGJvb2xlYW4sIHNraXBGYWRlOiA/Ym9vbGVhbikge1xuICAgICAgICBpZiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwcmV2U3RhdGUub3BhY2l0eSArIChwcmV2U3RhdGUucGxhY2VkID8gaW5jcmVtZW50IDogLWluY3JlbWVudCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSA9IChza2lwRmFkZSAmJiBwbGFjZWQpID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGFjZWQgPSBwbGFjZWQ7XG4gICAgfVxuICAgIGlzSGlkZGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGFjaXR5ID09PSAwICYmICF0aGlzLnBsYWNlZDtcbiAgICB9XG59XG5cbmNsYXNzIEpvaW50T3BhY2l0eVN0YXRlIHtcbiAgICB0ZXh0OiBPcGFjaXR5U3RhdGU7XG4gICAgaWNvbjogT3BhY2l0eVN0YXRlO1xuICAgIGNvbnN0cnVjdG9yKHByZXZTdGF0ZTogP0pvaW50T3BhY2l0eVN0YXRlLCBpbmNyZW1lbnQ6IG51bWJlciwgcGxhY2VkVGV4dDogYm9vbGVhbiwgcGxhY2VkSWNvbjogYm9vbGVhbiwgc2tpcEZhZGU6ID9ib29sZWFuKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IG5ldyBPcGFjaXR5U3RhdGUocHJldlN0YXRlID8gcHJldlN0YXRlLnRleHQgOiBudWxsLCBpbmNyZW1lbnQsIHBsYWNlZFRleHQsIHNraXBGYWRlKTtcbiAgICAgICAgdGhpcy5pY29uID0gbmV3IE9wYWNpdHlTdGF0ZShwcmV2U3RhdGUgPyBwcmV2U3RhdGUuaWNvbiA6IG51bGwsIGluY3JlbWVudCwgcGxhY2VkSWNvbiwgc2tpcEZhZGUpO1xuICAgIH1cbiAgICBpc0hpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5pc0hpZGRlbigpICYmIHRoaXMuaWNvbi5pc0hpZGRlbigpO1xuICAgIH1cbn1cblxuY2xhc3MgSm9pbnRQbGFjZW1lbnQge1xuICAgIHRleHQ6IGJvb2xlYW47XG4gICAgaWNvbjogYm9vbGVhbjtcbiAgICAvLyBza2lwRmFkZSA9IG91dHNpZGUgdmlld3BvcnQsIGJ1dCB3aXRoaW4gQ29sbGlzaW9uSW5kZXg6OnZpZXdwb3J0UGFkZGluZyBweCBvZiB0aGUgZWRnZVxuICAgIC8vIEJlY2F1c2UgdGhlc2Ugc3ltYm9scyBhcmVuJ3Qgb25zY3JlZW4geWV0LCB3ZSBjYW4gc2tpcCB0aGUgXCJmYWRlIGluXCIgYW5pbWF0aW9uLFxuICAgIC8vIGFuZCBpZiBhIHN1YnNlcXVlbnQgdmlld3BvcnQgY2hhbmdlIGJyaW5ncyB0aGVtIGludG8gdmlldywgdGhleSdsbCBiZSBmdWxseVxuICAgIC8vIHZpc2libGUgcmlnaHQgYXdheS5cbiAgICBza2lwRmFkZTogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0OiBib29sZWFuLCBpY29uOiBib29sZWFuLCBza2lwRmFkZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmljb24gPSBpY29uO1xuICAgICAgICB0aGlzLnNraXBGYWRlID0gc2tpcEZhZGU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmV0YWluZWRRdWVyeURhdGEge1xuICAgIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlcjtcbiAgICBmZWF0dXJlSW5kZXg6IEZlYXR1cmVJbmRleDtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgYnVja2V0SW5kZXg6IG51bWJlcjtcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQ7XG4gICAgZmVhdHVyZVNvcnRPcmRlcjogP0FycmF5PG51bWJlcj5cbiAgICBjb25zdHJ1Y3RvcihidWNrZXRJbnN0YW5jZUlkOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBGZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIHRoaXMuYnVja2V0SW5zdGFuY2VJZCA9IGJ1Y2tldEluc3RhbmNlSWQ7XG4gICAgICAgIHRoaXMuZmVhdHVyZUluZGV4ID0gZmVhdHVyZUluZGV4O1xuICAgICAgICB0aGlzLnNvdXJjZUxheWVySW5kZXggPSBzb3VyY2VMYXllckluZGV4O1xuICAgICAgICB0aGlzLmJ1Y2tldEluZGV4ID0gYnVja2V0SW5kZXg7XG4gICAgICAgIHRoaXMudGlsZUlEID0gdGlsZUlEO1xuICAgIH1cbn1cblxudHlwZSBDb2xsaXNpb25Hcm91cCA9IHsgSUQ6IG51bWJlciwgcHJlZGljYXRlPzogYW55IH07XG5cbmNsYXNzIENvbGxpc2lvbkdyb3VwcyB7XG4gICAgY29sbGlzaW9uR3JvdXBzOiB7W2dyb3VwTmFtZTogc3RyaW5nXTogQ29sbGlzaW9uR3JvdXB9O1xuICAgIG1heEdyb3VwSUQ6IG51bWJlcjtcbiAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jcm9zc1NvdXJjZUNvbGxpc2lvbnMgPSBjcm9zc1NvdXJjZUNvbGxpc2lvbnM7XG4gICAgICAgIHRoaXMubWF4R3JvdXBJRCA9IDA7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uR3JvdXBzID0ge307XG4gICAgfVxuXG4gICAgZ2V0KHNvdXJjZUlEOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gVGhlIHByZWRpY2F0ZS9ncm91cElEIG1lY2hhbmlzbSBhbGxvd3MgZm9yIGFyYml0cmFyeSBncm91cGluZyxcbiAgICAgICAgLy8gYnV0IHRoZSBjdXJyZW50IGludGVyZmFjZSBkZWZpbmVzIG9uZSBzb3VyY2UgPT0gb25lIGdyb3VwIHdoZW5cbiAgICAgICAgLy8gY3Jvc3NTb3VyY2VDb2xsaXNpb25zID09IHRydWUuXG4gICAgICAgIGlmICghdGhpcy5jcm9zc1NvdXJjZUNvbGxpc2lvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb2xsaXNpb25Hcm91cHNbc291cmNlSURdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEdyb3VwSUQgPSArK3RoaXMubWF4R3JvdXBJRDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkdyb3Vwc1tzb3VyY2VJRF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIElEOiBuZXh0R3JvdXBJRCxcbiAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmNvbGxpc2lvbkdyb3VwSUQgPT09IG5leHRHcm91cElEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxpc2lvbkdyb3Vwc1tzb3VyY2VJRF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBJRDogMCwgcHJlZGljYXRlOiBudWxsIH07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVZhcmlhYmxlTGF5b3V0T2Zmc2V0KGFuY2hvcjogVGV4dEFuY2hvciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHJhZGlhbE9mZnNldDogbnVtYmVyLCB0ZXh0Qm94U2NhbGU6IG51bWJlcik6IFBvaW50IHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudChhbmNob3IpO1xuICAgIGNvbnN0IHNoaWZ0WCA9IC0oaG9yaXpvbnRhbEFsaWduIC0gMC41KSAqIHdpZHRoO1xuICAgIGNvbnN0IHNoaWZ0WSA9IC0odmVydGljYWxBbGlnbiAtIDAuNSkgKiBoZWlnaHQ7XG4gICAgY29uc3Qgb2Zmc2V0ID0gZXZhbHVhdGVSYWRpYWxPZmZzZXQoYW5jaG9yLCByYWRpYWxPZmZzZXQpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIHNoaWZ0WCArIG9mZnNldFswXSAqIHRleHRCb3hTY2FsZSxcbiAgICAgICAgc2hpZnRZICsgb2Zmc2V0WzFdICogdGV4dEJveFNjYWxlXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gc2hpZnRWYXJpYWJsZUNvbGxpc2lvbkJveChjb2xsaXNpb25Cb3g6IFNpbmdsZUNvbGxpc2lvbkJveCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdFg6IG51bWJlciwgc2hpZnRZOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbiwgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlOiBudW1iZXIpIHtcbiAgICBjb25zdCB7eDEsIHgyLCB5MSwgeTIsIGFuY2hvclBvaW50WCwgYW5jaG9yUG9pbnRZfSA9IGNvbGxpc2lvbkJveDtcbiAgICBjb25zdCByb3RhdGVkT2Zmc2V0ID0gbmV3IFBvaW50KHNoaWZ0WCwgc2hpZnRZKTtcbiAgICBpZiAocm90YXRlV2l0aE1hcCkge1xuICAgICAgICByb3RhdGVkT2Zmc2V0Ll9yb3RhdGUocGl0Y2hXaXRoTWFwID8gYW5nbGUgOiAtYW5nbGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4MTogeDEgKyByb3RhdGVkT2Zmc2V0LngsXG4gICAgICAgIHkxOiB5MSArIHJvdGF0ZWRPZmZzZXQueSxcbiAgICAgICAgeDI6IHgyICsgcm90YXRlZE9mZnNldC54LFxuICAgICAgICB5MjogeTIgKyByb3RhdGVkT2Zmc2V0LnksXG4gICAgICAgIC8vIHN5bWJvbCBhbmNob3IgcG9pbnQgc3RheXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB0ZXh0LWFuY2hvclxuICAgICAgICBhbmNob3JQb2ludFgsXG4gICAgICAgIGFuY2hvclBvaW50WVxuICAgIH07XG59XG5cbmV4cG9ydCB0eXBlIFZhcmlhYmxlT2Zmc2V0ID0ge1xuICAgIHJhZGlhbE9mZnNldDogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgYW5jaG9yOiBUZXh0QW5jaG9yLFxuICAgIHRleHRCb3hTY2FsZTogbnVtYmVyLFxuICAgIHByZXZBbmNob3I/OiBUZXh0QW5jaG9yXG59O1xuXG5leHBvcnQgdHlwZSBDcm9zc1RpbGVJRCA9IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IGNsYXNzIFBsYWNlbWVudCB7XG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm07XG4gICAgY29sbGlzaW9uSW5kZXg6IENvbGxpc2lvbkluZGV4O1xuICAgIHBsYWNlbWVudHM6IHsgW0Nyb3NzVGlsZUlEXTogSm9pbnRQbGFjZW1lbnQgfTtcbiAgICBvcGFjaXRpZXM6IHsgW0Nyb3NzVGlsZUlEXTogSm9pbnRPcGFjaXR5U3RhdGUgfTtcbiAgICB2YXJpYWJsZU9mZnNldHM6IHtbQ3Jvc3NUaWxlSURdOiBWYXJpYWJsZU9mZnNldCB9O1xuICAgIHBsYWNlZE9yaWVudGF0aW9uczoge1tDcm9zc1RpbGVJRF06IG51bWJlciB9O1xuICAgIGNvbW1pdFRpbWU6IG51bWJlcjtcbiAgICBsYXN0UGxhY2VtZW50Q2hhbmdlVGltZTogbnVtYmVyO1xuICAgIHN0YWxlOiBib29sZWFuO1xuICAgIGZhZGVEdXJhdGlvbjogbnVtYmVyO1xuICAgIHJldGFpbmVkUXVlcnlEYXRhOiB7W251bWJlcl06IFJldGFpbmVkUXVlcnlEYXRhfTtcbiAgICBjb2xsaXNpb25Hcm91cHM6IENvbGxpc2lvbkdyb3VwcztcbiAgICBwcmV2UGxhY2VtZW50OiA/UGxhY2VtZW50O1xuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIGZhZGVEdXJhdGlvbjogbnVtYmVyLCBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW4sIHByZXZQbGFjZW1lbnQ/OiBQbGFjZW1lbnQpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm0uY2xvbmUoKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleCA9IG5ldyBDb2xsaXNpb25JbmRleCh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIHRoaXMucGxhY2VtZW50cyA9IHt9O1xuICAgICAgICB0aGlzLm9wYWNpdGllcyA9IHt9O1xuICAgICAgICB0aGlzLnZhcmlhYmxlT2Zmc2V0cyA9IHt9O1xuICAgICAgICB0aGlzLnN0YWxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tbWl0VGltZSA9IDA7XG4gICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gZmFkZUR1cmF0aW9uO1xuICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhID0ge307XG4gICAgICAgIHRoaXMuY29sbGlzaW9uR3JvdXBzID0gbmV3IENvbGxpc2lvbkdyb3Vwcyhjcm9zc1NvdXJjZUNvbGxpc2lvbnMpO1xuXG4gICAgICAgIHRoaXMucHJldlBsYWNlbWVudCA9IHByZXZQbGFjZW1lbnQ7XG4gICAgICAgIGlmIChwcmV2UGxhY2VtZW50KSB7XG4gICAgICAgICAgICBwcmV2UGxhY2VtZW50LnByZXZQbGFjZW1lbnQgPSB1bmRlZmluZWQ7IC8vIE9ubHkgaG9sZCBvbiB0byBvbmUgcGxhY2VtZW50IGJhY2tcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxhY2VkT3JpZW50YXRpb25zID0ge307XG4gICAgfVxuXG4gICAgcGxhY2VMYXllclRpbGUoc3R5bGVMYXllcjogU3R5bGVMYXllciwgdGlsZTogVGlsZSwgc2hvd0NvbGxpc2lvbkJveGVzOiBib29sZWFuLCBzZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH0pIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sQnVja2V0ID0gKCh0aWxlLmdldEJ1Y2tldChzdHlsZUxheWVyKTogYW55KTogU3ltYm9sQnVja2V0KTtcbiAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZUluZGV4ID0gdGlsZS5sYXRlc3RGZWF0dXJlSW5kZXg7XG4gICAgICAgIGlmICghc3ltYm9sQnVja2V0IHx8ICFidWNrZXRGZWF0dXJlSW5kZXggfHwgc3R5bGVMYXllci5pZCAhPT0gc3ltYm9sQnVja2V0LmxheWVySWRzWzBdKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNvbGxpc2lvbkJveEFycmF5ID0gdGlsZS5jb2xsaXNpb25Cb3hBcnJheTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSBzeW1ib2xCdWNrZXQubGF5ZXJzWzBdLmxheW91dDtcblxuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHRoaXMudHJhbnNmb3JtLnpvb20gLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgICAgIGNvbnN0IHRleHRQaXhlbFJhdGlvID0gdGlsZS50aWxlU2l6ZSAvIEVYVEVOVDtcblxuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZS50aWxlSUQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgY29uc3QgdGV4dExhYmVsUGxhbmVNYXRyaXggPSBwcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXgocG9zTWF0cml4LFxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnLFxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHRoaXMudHJhbnNmb3JtLnpvb20pKTtcblxuICAgICAgICBjb25zdCBpY29uTGFiZWxQbGFuZU1hdHJpeCA9IHByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeChwb3NNYXRyaXgsXG4gICAgICAgICAgICAgICAgbGF5b3V0LmdldCgnaWNvbi1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCcsXG4gICAgICAgICAgICAgICAgbGF5b3V0LmdldCgnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCcsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgdGhpcy50cmFuc2Zvcm0uem9vbSkpO1xuXG4gICAgICAgIC8vIEFzIGxvbmcgYXMgdGhpcyBwbGFjZW1lbnQgbGl2ZXMsIHdlIGhhdmUgdG8gaG9sZCBvbnRvIHRoaXMgYnVja2V0J3NcbiAgICAgICAgLy8gbWF0Y2hpbmcgRmVhdHVyZUluZGV4L2RhdGEgZm9yIHF1ZXJ5aW5nIHB1cnBvc2VzXG4gICAgICAgIHRoaXMucmV0YWluZWRRdWVyeURhdGFbc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdID0gbmV3IFJldGFpbmVkUXVlcnlEYXRhKFxuICAgICAgICAgICAgc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWQsXG4gICAgICAgICAgICBidWNrZXRGZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xCdWNrZXQuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEJ1Y2tldC5pbmRleCxcbiAgICAgICAgICAgIHRpbGUudGlsZUlEXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGxhY2VMYXllckJ1Y2tldChzeW1ib2xCdWNrZXQsIHBvc01hdHJpeCwgdGV4dExhYmVsUGxhbmVNYXRyaXgsIGljb25MYWJlbFBsYW5lTWF0cml4LCBzY2FsZSwgdGV4dFBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzLCB0aWxlLmhvbGRpbmdGb3JGYWRlKCksIHNlZW5Dcm9zc1RpbGVJRHMsIGNvbGxpc2lvbkJveEFycmF5KTtcbiAgICB9XG5cbiAgICBhdHRlbXB0QW5jaG9yUGxhY2VtZW50KGFuY2hvcjogVGV4dEFuY2hvciwgdGV4dEJveDogU2luZ2xlQ29sbGlzaW9uQm94LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlhbFRleHRPZmZzZXQ6IG51bWJlciwgdGV4dEJveFNjYWxlOiBudW1iZXIsIHJvdGF0ZVdpdGhNYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sIHRleHRQaXhlbFJhdGlvOiBudW1iZXIsIHBvc01hdHJpeDogbWF0NCwgY29sbGlzaW9uR3JvdXA6IENvbGxpc2lvbkdyb3VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsbG93T3ZlcmxhcDogYm9vbGVhbiwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgb3JpZW50YXRpb246IG51bWJlcik6ID97IGJveDogQXJyYXk8bnVtYmVyPiwgb2Zmc2NyZWVuOiBib29sZWFuIH0gIHtcblxuICAgICAgICBjb25zdCBzaGlmdCA9IGNhbGN1bGF0ZVZhcmlhYmxlTGF5b3V0T2Zmc2V0KGFuY2hvciwgd2lkdGgsIGhlaWdodCwgcmFkaWFsVGV4dE9mZnNldCwgdGV4dEJveFNjYWxlKTtcblxuICAgICAgICBjb25zdCBwbGFjZWRHbHlwaEJveGVzID0gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkJveChcbiAgICAgICAgICAgIHNoaWZ0VmFyaWFibGVDb2xsaXNpb25Cb3goXG4gICAgICAgICAgICAgICAgdGV4dEJveCwgc2hpZnQueCwgc2hpZnQueSxcbiAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHRoaXMudHJhbnNmb3JtLmFuZ2xlKSxcbiAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAsIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG5cbiAgICAgICAgaWYgKHBsYWNlZEdseXBoQm94ZXMuYm94Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2QW5jaG9yO1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBsYWJlbCB3YXMgcGxhY2VkIGluIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQsIHJlY29yZCB0aGUgYW5jaG9yIHBvc2l0aW9uXG4gICAgICAgICAgICAvLyB0byBhbGxvdyB1cyB0byBhbmltYXRlIHRoZSB0cmFuc2l0aW9uXG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2UGxhY2VtZW50ICYmXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0udGV4dCkge1xuICAgICAgICAgICAgICAgIHByZXZBbmNob3IgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXS5hbmNob3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgIT09IDApO1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0ge1xuICAgICAgICAgICAgICAgIHJhZGlhbE9mZnNldDogcmFkaWFsVGV4dE9mZnNldCxcbiAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgICAgIHRleHRCb3hTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmV2QW5jaG9yXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24oYnVja2V0LCBhbmNob3IsIHN5bWJvbEluc3RhbmNlLCBvcmllbnRhdGlvbik7XG5cbiAgICAgICAgICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRPcmllbnRhdGlvbihidWNrZXQsIG9yaWVudGF0aW9uLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gb3JpZW50YXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwbGFjZWRHbHlwaEJveGVzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGxhY2VMYXllckJ1Y2tldChidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgcG9zTWF0cml4OiBtYXQ0LCB0ZXh0TGFiZWxQbGFuZU1hdHJpeDogbWF0NCwgaWNvbkxhYmVsUGxhbmVNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICBzY2FsZTogbnVtYmVyLCB0ZXh0UGl4ZWxSYXRpbzogbnVtYmVyLCBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sIGhvbGRpbmdGb3JGYWRlOiBib29sZWFuLCBzZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH0sXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogP0NvbGxpc2lvbkJveEFycmF5KSB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IGJ1Y2tldC5sYXllcnNbMF0ubGF5b3V0O1xuICAgICAgICBjb25zdCBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShidWNrZXQudGV4dFNpemVEYXRhLCB0aGlzLnRyYW5zZm9ybS56b29tKTtcbiAgICAgICAgY29uc3QgdGV4dE9wdGlvbmFsID0gbGF5b3V0LmdldCgndGV4dC1vcHRpb25hbCcpO1xuICAgICAgICBjb25zdCBpY29uT3B0aW9uYWwgPSBsYXlvdXQuZ2V0KCdpY29uLW9wdGlvbmFsJyk7XG4gICAgICAgIGNvbnN0IHRleHRBbGxvd092ZXJsYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKTtcbiAgICAgICAgY29uc3QgaWNvbkFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICAvLyBUaGlzIGxvZ2ljIGlzIHNpbWlsYXIgdG8gdGhlIFwiZGVmYXVsdE9wYWNpdHlTdGF0ZVwiIGxvZ2ljIGJlbG93IGluIHVwZGF0ZUJ1Y2tldE9wYWNpdGllc1xuICAgICAgICAvLyBJZiB3ZSBrbm93IGEgc3ltYm9sIGlzIGFsd2F5cyBzdXBwb3NlZCB0byBzaG93LCBmb3JjZSBpdCB0byBiZSBtYXJrZWQgdmlzaWJsZSBldmVuIGlmXG4gICAgICAgIC8vIGl0IHdhc24ndCBwbGFjZWQgaW50byB0aGUgY29sbGlzaW9uIGluZGV4IChiZWNhdXNlIHNvbWUgb3IgYWxsIG9mIGl0IHdhcyBvdXRzaWRlIHRoZSByYW5nZVxuICAgICAgICAvLyBvZiB0aGUgY29sbGlzaW9uIGdyaWQpLlxuICAgICAgICAvLyBUaGVyZSBpcyBhIHN1YnRsZSBlZGdlIGNhc2UgaGVyZSB3ZSdyZSBhY2NlcHRpbmc6XG4gICAgICAgIC8vICBTeW1ib2wgQSBoYXMgdGV4dC1hbGxvdy1vdmVybGFwOiB0cnVlLCBpY29uLWFsbG93LW92ZXJsYXA6IHRydWUsIGljb24tb3B0aW9uYWw6IGZhbHNlXG4gICAgICAgIC8vICBBJ3MgaWNvbiBpcyBvdXRzaWRlIHRoZSBncmlkLCBzbyBkb2Vzbid0IGdldCBwbGFjZWRcbiAgICAgICAgLy8gIEEncyB0ZXh0IHdvdWxkIGJlIGluc2lkZSBncmlkLCBidXQgZG9lc24ndCBnZXQgcGxhY2VkIGJlY2F1c2Ugb2YgaWNvbi1vcHRpb25hbDogZmFsc2VcbiAgICAgICAgLy8gIFdlIHN0aWxsIHNob3cgQSBiZWNhdXNlIG9mIHRoZSBhbGxvdy1vdmVybGFwIHNldHRpbmdzLlxuICAgICAgICAvLyAgU3ltYm9sIEIgaGFzIGFsbG93LW92ZXJsYXA6IGZhbHNlLCBhbmQgZ2V0cyBwbGFjZWQgd2hlcmUgQSdzIHRleHQgd291bGQgYmVcbiAgICAgICAgLy8gIE9uIHBhbm5pbmcgaW4sIHRoZXJlIGlzIGEgc2hvcnQgcGVyaW9kIHdoZW4gU3ltYm9sIEIgYW5kIFN5bWJvbCBBIHdpbGwgb3ZlcmxhcFxuICAgICAgICAvLyAgVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiBvdXIgbm9ybWFsIHBvbGljeSBvZiBcImZhZGUgaW4gb24gcGFuXCIsIGJ1dCBzaG91bGQgbG9vayBsaWtlIGFueSBvdGhlclxuICAgICAgICAvLyAgY29sbGlzaW9uIGFuZCBob3BlZnVsbHkgbm90IGJlIHRvbyBub3RpY2VhYmxlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzcxNzJcbiAgICAgICAgY29uc3QgYWx3YXlzU2hvd1RleHQgPSB0ZXh0QWxsb3dPdmVybGFwICYmIChpY29uQWxsb3dPdmVybGFwIHx8ICFidWNrZXQuaGFzSWNvbkRhdGEoKSB8fCBpY29uT3B0aW9uYWwpO1xuICAgICAgICBjb25zdCBhbHdheXNTaG93SWNvbiA9IGljb25BbGxvd092ZXJsYXAgJiYgKHRleHRBbGxvd092ZXJsYXAgfHwgIWJ1Y2tldC5oYXNUZXh0RGF0YSgpIHx8IHRleHRPcHRpb25hbCk7XG5cbiAgICAgICAgY29uc3QgY29sbGlzaW9uR3JvdXAgPSB0aGlzLmNvbGxpc2lvbkdyb3Vwcy5nZXQoYnVja2V0LnNvdXJjZUlEKTtcblxuICAgICAgICBjb25zdCByb3RhdGVXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IHBpdGNoV2l0aE1hcCA9IGxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnO1xuICAgICAgICBjb25zdCB6T3JkZXJCeVZpZXdwb3J0WSA9IGxheW91dC5nZXQoJ3N5bWJvbC16LW9yZGVyJykgPT09ICd2aWV3cG9ydC15JztcblxuICAgICAgICBpZiAoIWJ1Y2tldC5jb2xsaXNpb25BcnJheXMgJiYgY29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBsYWNlU3ltYm9sID0gKHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSwgY29sbGlzaW9uQXJyYXlzOiBDb2xsaXNpb25BcnJheXMpID0+IHtcbiAgICAgICAgICAgIGlmIChzZWVuQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGhvbGRpbmdGb3JGYWRlKSB7XG4gICAgICAgICAgICAgICAgLy8gTWFyayBhbGwgc3ltYm9scyBmcm9tIHRoaXMgdGlsZSBhcyBcIm5vdCBwbGFjZWRcIiwgYnV0IGRvbid0IGFkZCB0byBzZWVuQ3Jvc3NUaWxlSURzLCBiZWNhdXNlIHdlIGRvbid0XG4gICAgICAgICAgICAgICAgLy8ga25vdyB5ZXQgaWYgd2UgaGF2ZSBhIGR1cGxpY2F0ZSBpbiBhIHBhcmVudCB0aWxlIHRoYXQgX3Nob3VsZF8gYmUgcGxhY2VkLlxuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBuZXcgSm9pbnRQbGFjZW1lbnQoZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcGxhY2VUZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGxhY2VJY29uID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgb2Zmc2NyZWVuID0gdHJ1ZTtcblxuICAgICAgICAgICAgbGV0IHBsYWNlZCA9IHsgYm94OiBudWxsLCBvZmZzY3JlZW46IG51bGwgfTtcbiAgICAgICAgICAgIGxldCBwbGFjZWRWZXJ0aWNhbCA9IHsgYm94OiBudWxsLCBvZmZzY3JlZW46IG51bGwgfTtcblxuICAgICAgICAgICAgbGV0IHBsYWNlZEdseXBoQm94ZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHBsYWNlZEdseXBoQ2lyY2xlcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcGxhY2VkSWNvbkJveGVzID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB0ZXh0RmVhdHVyZUluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGljb25GZWF0dXJlSW5kZXggPSAwO1xuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLnRleHRGZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0ZXh0RmVhdHVyZUluZGV4ID0gY29sbGlzaW9uQXJyYXlzLnRleHRGZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCkge1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCA9IGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRleHRCb3ggPSBjb2xsaXNpb25BcnJheXMudGV4dEJveDtcbiAgICAgICAgICAgIGlmICh0ZXh0Qm94KSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVQcmV2aW91c09yaWVudGF0aW9uSWZOb3RQbGFjZWQgPSAoaXNQbGFjZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzT3JpZW50YXRpb24gPSBXcml0aW5nTW9kZS5ob3Jpem9udGFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgIWlzUGxhY2VkICYmIHRoaXMucHJldlBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldlBsYWNlZE9yaWVudGF0aW9uID0gdGhpcy5wcmV2UGxhY2VtZW50LnBsYWNlZE9yaWVudGF0aW9uc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldlBsYWNlZE9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gcHJldlBsYWNlZE9yaWVudGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzT3JpZW50YXRpb24gPSBwcmV2UGxhY2VkT3JpZW50YXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrVXNlZE9yaWVudGF0aW9uKGJ1Y2tldCwgcHJldmlvdXNPcmllbnRhdGlvbiwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c09yaWVudGF0aW9uO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZVRleHRGb3JQbGFjZW1lbnRNb2RlcyA9IChwbGFjZUhvcml6b250YWxGbiwgcGxhY2VWZXJ0aWNhbEZuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBzeW1ib2xJbnN0YW5jZS5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPiAwICYmIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGxhY2VtZW50TW9kZSBvZiBidWNrZXQud3JpdGluZ01vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWNlbWVudE1vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZCA9IHBsYWNlVmVydGljYWxGbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRWZXJ0aWNhbCA9IHBsYWNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWQgPSBwbGFjZUhvcml6b250YWxGbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkICYmIHBsYWNlZC5ib3ggJiYgcGxhY2VkLmJveC5sZW5ndGgpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkID0gcGxhY2VIb3Jpem9udGFsRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VCb3ggPSAoY29sbGlzaW9uVGV4dEJveCwgb3JpZW50YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlZEZlYXR1cmUgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KGNvbGxpc2lvblRleHRCb3gsIGxheW91dC5nZXQoJ3RleHQtYWxsb3ctb3ZlcmxhcCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkRmVhdHVyZSAmJiBwbGFjZWRGZWF0dXJlLmJveCAmJiBwbGFjZWRGZWF0dXJlLmJveC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkT3JpZW50YXRpb24oYnVja2V0LCBvcmllbnRhdGlvbiwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IG9yaWVudGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlZEZlYXR1cmU7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VIb3Jpem9udGFsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlQm94KHRleHRCb3gsIFdyaXRpbmdNb2RlLmhvcml6b250YWwpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlVmVydGljYWwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbFRleHRCb3ggPSBjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0Qm94O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA+IDAgJiYgdmVydGljYWxUZXh0Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlQm94KHZlcnRpY2FsVGV4dEJveCwgV3JpdGluZ01vZGUudmVydGljYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgYm94OiBudWxsLCBvZmZzY3JlZW46IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBwbGFjZVRleHRGb3JQbGFjZW1lbnRNb2RlcyhwbGFjZUhvcml6b250YWwsIHBsYWNlVmVydGljYWwpO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcmV2aW91c09yaWVudGF0aW9uSWZOb3RQbGFjZWQocGxhY2VkICYmIHBsYWNlZC5ib3ggJiYgcGxhY2VkLmJveC5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBsYXlvdXQuZ2V0KCd0ZXh0LXZhcmlhYmxlLWFuY2hvcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3ltYm9sIHdhcyBpbiB0aGUgbGFzdCBwbGFjZW1lbnQsIHNoaWZ0IHRoZSBwcmV2aW91c2x5IHVzZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5jaG9yIHRvIHRoZSBmcm9udCBvZiB0aGUgYW5jaG9yIGxpc3QsIG9ubHkgaWYgdGhlIHByZXZpb3VzIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdGlsbCBpbiB0aGUgYW5jaG9yIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldlBsYWNlbWVudCAmJiB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk9mZnNldHMgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JzLmluZGV4T2YocHJldk9mZnNldHMuYW5jaG9yKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzID0gYW5jaG9ycy5maWx0ZXIoYW5jaG9yID0+IGFuY2hvciAhPT0gcHJldk9mZnNldHMuYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnVuc2hpZnQocHJldk9mZnNldHMuYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlQm94Rm9yVmFyaWFibGVBbmNob3JzID0gKGNvbGxpc2lvblRleHRCb3gsIG9yaWVudGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNvbGxpc2lvblRleHRCb3gueDIgLSBjb2xsaXNpb25UZXh0Qm94LngxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY29sbGlzaW9uVGV4dEJveC55MiAtIGNvbGxpc2lvblRleHRCb3gueTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Qm94U2NhbGUgPSBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U2NhbGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGFjZWRCb3g6ID97IGJveDogQXJyYXk8bnVtYmVyPiwgb2Zmc2NyZWVuOiBib29sZWFuIH0gID0geyBib3g6IFtdLCBvZmZzY3JlZW46IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZW1lbnRBdHRlbXB0cyA9IHRleHRBbGxvd092ZXJsYXAgPyBhbmNob3JzLmxlbmd0aCAqIDIgOiBhbmNob3JzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VtZW50QXR0ZW1wdHM7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGFuY2hvcnNbaSAlIGFuY2hvcnMubGVuZ3RoXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvd092ZXJsYXAgPSAoaSA+PSBhbmNob3JzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkQm94ID0gdGhpcy5hdHRlbXB0QW5jaG9yUGxhY2VtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3IsIGNvbGxpc2lvblRleHRCb3gsIHdpZHRoLCBoZWlnaHQsIHN5bWJvbEluc3RhbmNlLnJhZGlhbFRleHRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCb3hTY2FsZSwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB0ZXh0UGl4ZWxSYXRpbywgcG9zTWF0cml4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Hcm91cCwgYWxsb3dPdmVybGFwLCBzeW1ib2xJbnN0YW5jZSwgYnVja2V0LCBvcmllbnRhdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkQm94ICYmIHBsYWNlZEJveC5ib3ggJiYgcGxhY2VkQm94LmJveC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VkQm94O1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlSG9yaXpvbnRhbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFjZUJveEZvclZhcmlhYmxlQW5jaG9ycyh0ZXh0Qm94LCBXcml0aW5nTW9kZS5ob3Jpem9udGFsKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZVZlcnRpY2FsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxUZXh0Qm94ID0gY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEJveDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhc1BsYWNlZCA9IHBsYWNlZCAmJiBwbGFjZWQuYm94ICYmIHBsYWNlZC5ib3gubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICF3YXNQbGFjZWQgJiYgc3ltYm9sSW5zdGFuY2UubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMCAmJiB2ZXJ0aWNhbFRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VCb3hGb3JWYXJpYWJsZUFuY2hvcnModmVydGljYWxUZXh0Qm94LCBXcml0aW5nTW9kZS52ZXJ0aWNhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBib3g6IG51bGwsIG9mZnNjcmVlbjogbnVsbCB9O1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlVGV4dEZvclBsYWNlbWVudE1vZGVzKHBsYWNlSG9yaXpvbnRhbCwgcGxhY2VWZXJ0aWNhbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0ID0gcGxhY2VkLmJveDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbiA9IHBsYWNlZC5vZmZzY3JlZW47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2T3JpZW50YXRpb24gPSB1cGRhdGVQcmV2aW91c09yaWVudGF0aW9uSWZOb3RQbGFjZWQocGxhY2VkICYmIHBsYWNlZC5ib3gpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBnZXQgcGxhY2VkLCB3ZSBzdGlsbCBuZWVkIHRvIGNvcHkgb3VyIHBvc2l0aW9uIGZyb20gdGhlIGxhc3QgcGxhY2VtZW50IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBmYWRlIGFuaW1hdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGFjZVRleHQgJiYgdGhpcy5wcmV2UGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2T2Zmc2V0ID0gdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHByZXZPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24oYnVja2V0LCBwcmV2T2Zmc2V0LmFuY2hvciwgc3ltYm9sSW5zdGFuY2UsIHByZXZPcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGxhY2VkR2x5cGhCb3hlcyA9IHBsYWNlZDtcbiAgICAgICAgICAgIHBsYWNlVGV4dCA9IHBsYWNlZEdseXBoQm94ZXMgJiYgcGxhY2VkR2x5cGhCb3hlcy5ib3ggJiYgcGxhY2VkR2x5cGhCb3hlcy5ib3gubGVuZ3RoID4gMDtcblxuICAgICAgICAgICAgb2Zmc2NyZWVuID0gcGxhY2VkR2x5cGhCb3hlcyAmJiBwbGFjZWRHbHlwaEJveGVzLm9mZnNjcmVlbjtcbiAgICAgICAgICAgIGNvbnN0IHRleHRDaXJjbGVzID0gY29sbGlzaW9uQXJyYXlzLnRleHRDaXJjbGVzO1xuICAgICAgICAgICAgaWYgKHRleHRDaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkU3ltYm9sID0gYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9udFNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUoYnVja2V0LnRleHRTaXplRGF0YSwgcGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemUsIHBsYWNlZFN5bWJvbCk7XG4gICAgICAgICAgICAgICAgcGxhY2VkR2x5cGhDaXJjbGVzID0gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkNpcmNsZXModGV4dENpcmNsZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRTeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQubGluZVZlcnRleEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmdseXBoT2Zmc2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRMYWJlbFBsYW5lTWF0cml4LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uR3JvdXAucHJlZGljYXRlKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0ZXh0LWFsbG93LW92ZXJsYXAgaXMgc2V0LCBmb3JjZSBcInBsYWNlZENpcmNsZXNcIiB0byB0cnVlXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlb3J5IHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3Qgb25lIGNpcmNsZSBwbGFjZWRcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIGJ1dCBmb3Igbm93IHF1aXJrcyBpbiB0ZXh0LWFuY2hvclxuICAgICAgICAgICAgICAgIC8vIGFuZCB0ZXh0LW9mZnNldCBtYXkgcHJldmVudCB0aGF0IGZyb20gYmVpbmcgdHJ1ZS5cbiAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKSB8fCBwbGFjZWRHbHlwaENpcmNsZXMuY2lyY2xlcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIG9mZnNjcmVlbiA9IG9mZnNjcmVlbiAmJiBwbGFjZWRHbHlwaENpcmNsZXMub2Zmc2NyZWVuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLmljb25GZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpY29uRmVhdHVyZUluZGV4ID0gY29sbGlzaW9uQXJyYXlzLmljb25GZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLmljb25Cb3gpIHtcbiAgICAgICAgICAgICAgICBwbGFjZWRJY29uQm94ZXMgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KGNvbGxpc2lvbkFycmF5cy5pY29uQm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldCgnaWNvbi1hbGxvdy1vdmVybGFwJyksIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG4gICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VkSWNvbkJveGVzLmJveC5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIG9mZnNjcmVlbiA9IG9mZnNjcmVlbiAmJiBwbGFjZWRJY29uQm94ZXMub2Zmc2NyZWVuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpY29uV2l0aG91dFRleHQgPSB0ZXh0T3B0aW9uYWwgfHxcbiAgICAgICAgICAgICAgICAoc3ltYm9sSW5zdGFuY2UubnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMgPT09IDAgJiYgc3ltYm9sSW5zdGFuY2UubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID09PSAwKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRXaXRob3V0SWNvbiA9IGljb25PcHRpb25hbCB8fCBzeW1ib2xJbnN0YW5jZS5udW1JY29uVmVydGljZXMgPT09IDA7XG5cbiAgICAgICAgICAgIC8vIENvbWJpbmUgdGhlIHNjYWxlcyBmb3IgaWNvbnMgYW5kIHRleHQuXG4gICAgICAgICAgICBpZiAoIWljb25XaXRob3V0VGV4dCAmJiAhdGV4dFdpdGhvdXRJY29uKSB7XG4gICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VUZXh0ID0gcGxhY2VJY29uICYmIHBsYWNlVGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRleHRXaXRob3V0SWNvbikge1xuICAgICAgICAgICAgICAgIHBsYWNlVGV4dCA9IHBsYWNlSWNvbiAmJiBwbGFjZVRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpY29uV2l0aG91dFRleHQpIHtcbiAgICAgICAgICAgICAgICBwbGFjZUljb24gPSBwbGFjZUljb24gJiYgcGxhY2VUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGxhY2VUZXh0ICYmIHBsYWNlZEdseXBoQm94ZXMgJiYgcGxhY2VkR2x5cGhCb3hlcy5ib3gpIHtcbiAgICAgICAgICAgICAgICBpZiAocGxhY2VkVmVydGljYWwgJiYgcGxhY2VkVmVydGljYWwuYm94ICYmIHZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkJveChwbGFjZWRHbHlwaEJveGVzLmJveCwgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgdmVydGljYWxUZXh0RmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cC5JRCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3gocGxhY2VkR2x5cGhCb3hlcy5ib3gsIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQsIHRleHRGZWF0dXJlSW5kZXgsIGNvbGxpc2lvbkdyb3VwLklEKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwbGFjZUljb24gJiYgcGxhY2VkSWNvbkJveGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3gocGxhY2VkSWNvbkJveGVzLmJveCwgbGF5b3V0LmdldCgnaWNvbi1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgaWNvbkZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXAuSUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsYWNlVGV4dCAmJiBwbGFjZWRHbHlwaENpcmNsZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkNpcmNsZXMocGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMsIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQsIHRleHRGZWF0dXJlSW5kZXgsIGNvbGxpc2lvbkdyb3VwLklEKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXNzZXJ0KHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEICE9PSAwKTtcbiAgICAgICAgICAgIGFzc2VydChidWNrZXQuYnVja2V0SW5zdGFuY2VJZCAhPT0gMCk7XG5cbiAgICAgICAgICAgIHRoaXMucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBuZXcgSm9pbnRQbGFjZW1lbnQocGxhY2VUZXh0IHx8IGFsd2F5c1Nob3dUZXh0LCBwbGFjZUljb24gfHwgYWx3YXlzU2hvd0ljb24sIG9mZnNjcmVlbiB8fCBidWNrZXQuanVzdFJlbG9hZGVkKTtcbiAgICAgICAgICAgIHNlZW5Dcm9zc1RpbGVJRHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoek9yZGVyQnlWaWV3cG9ydFkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluZGV4ZXMgPSBidWNrZXQuZ2V0U29ydGVkU3ltYm9sSW5kZXhlcyh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3ltYm9sSW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluZGV4ID0gc3ltYm9sSW5kZXhlc1tpXTtcbiAgICAgICAgICAgICAgICBwbGFjZVN5bWJvbChidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmdldChzeW1ib2xJbmRleCksIGJ1Y2tldC5jb2xsaXNpb25BcnJheXNbc3ltYm9sSW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVja2V0LnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBsYWNlU3ltYm9sKGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpLCBidWNrZXQuY29sbGlzaW9uQXJyYXlzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Y2tldC5qdXN0UmVsb2FkZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXJrVXNlZEp1c3RpZmljYXRpb24oYnVja2V0OiBTeW1ib2xCdWNrZXQsIHBsYWNlZEFuY2hvcjogVGV4dEFuY2hvciwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBvcmllbnRhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGp1c3RpZmljYXRpb25zID0ge1xuICAgICAgICAgICAgXCJsZWZ0XCI6IHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBcImNlbnRlclwiOiBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBcInJpZ2h0XCI6IHN5bWJvbEluc3RhbmNlLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGF1dG9JbmRleDtcbiAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgYXV0b0luZGV4ID0gc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhdXRvSW5kZXggPSBqdXN0aWZpY2F0aW9uc1tnZXRBbmNob3JKdXN0aWZpY2F0aW9uKHBsYWNlZEFuY2hvcildO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IFtcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4XG4gICAgICAgIF07XG5cbiAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChhdXRvSW5kZXggPj0gMCAmJiBpbmRleCAhPT0gYXV0b0luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBtdWx0aXBsZSBqdXN0aWZpY2F0aW9ucyBhbmQgdGhpcyBvbmUgaXNuJ3QgaXQ6IHNoaWZ0IG9mZnNjcmVlblxuICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoaW5kZXgpLmNyb3NzVGlsZUlEID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgY2hvc2VuIGp1c3RpZmljYXRpb24gb3IgdGhlIGp1c3RpZmljYXRpb24gaXMgaGFyZHdpcmVkOiB1c2UgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGluZGV4KS5jcm9zc1RpbGVJRCA9IHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1hcmtVc2VkT3JpZW50YXRpb24oYnVja2V0OiBTeW1ib2xCdWNrZXQsIG9yaWVudGF0aW9uOiBudW1iZXIsIHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSkge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsID0gKG9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsIHx8IG9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsT25seSkgPyBvcmllbnRhdGlvbiA6IDA7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsID0gb3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsID8gb3JpZW50YXRpb24gOiAwO1xuXG4gICAgICAgIGNvbnN0IGhvcml6b250YWxJbmRleGVzID0gW1xuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4XG4gICAgICAgIF07XG5cbiAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBob3Jpem9udGFsSW5kZXhlcykge1xuICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGluZGV4KS5wbGFjZWRPcmllbnRhdGlvbiA9IGhvcml6b250YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpIHtcbiAgICAgICAgICAgIGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCkucGxhY2VkT3JpZW50YXRpb24gPSB2ZXJ0aWNhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbW1pdChub3c6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1pdFRpbWUgPSBub3c7XG5cbiAgICAgICAgY29uc3QgcHJldlBsYWNlbWVudCA9IHRoaXMucHJldlBsYWNlbWVudDtcbiAgICAgICAgbGV0IHBsYWNlbWVudENoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBpbmNyZW1lbnQgPSAocHJldlBsYWNlbWVudCAmJiB0aGlzLmZhZGVEdXJhdGlvbiAhPT0gMCkgP1xuICAgICAgICAgICAgKHRoaXMuY29tbWl0VGltZSAtIHByZXZQbGFjZW1lbnQuY29tbWl0VGltZSkgLyB0aGlzLmZhZGVEdXJhdGlvbiA6XG4gICAgICAgICAgICAxO1xuXG4gICAgICAgIGNvbnN0IHByZXZPcGFjaXRpZXMgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC5vcGFjaXRpZXMgOiB7fTtcbiAgICAgICAgY29uc3QgcHJldk9mZnNldHMgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHMgOiB7fTtcbiAgICAgICAgY29uc3QgcHJldk9yaWVudGF0aW9ucyA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50LnBsYWNlZE9yaWVudGF0aW9ucyA6IHt9O1xuXG4gICAgICAgIC8vIGFkZCB0aGUgb3BhY2l0aWVzIGZyb20gdGhlIGN1cnJlbnQgcGxhY2VtZW50LCBhbmQgY29weSB0aGVpciBjdXJyZW50IHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBwbGFjZW1lbnRcbiAgICAgICAgZm9yIChjb25zdCBjcm9zc1RpbGVJRCBpbiB0aGlzLnBsYWNlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGpvaW50UGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnRzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZPcGFjaXR5ID0gcHJldk9wYWNpdGllc1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICBpZiAocHJldk9wYWNpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBuZXcgSm9pbnRPcGFjaXR5U3RhdGUocHJldk9wYWNpdHksIGluY3JlbWVudCwgam9pbnRQbGFjZW1lbnQudGV4dCwgam9pbnRQbGFjZW1lbnQuaWNvbik7XG4gICAgICAgICAgICAgICAgcGxhY2VtZW50Q2hhbmdlZCA9IHBsYWNlbWVudENoYW5nZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgam9pbnRQbGFjZW1lbnQudGV4dCAhPT0gcHJldk9wYWNpdHkudGV4dC5wbGFjZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgam9pbnRQbGFjZW1lbnQuaWNvbiAhPT0gcHJldk9wYWNpdHkuaWNvbi5wbGFjZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShudWxsLCBpbmNyZW1lbnQsIGpvaW50UGxhY2VtZW50LnRleHQsIGpvaW50UGxhY2VtZW50Lmljb24sIGpvaW50UGxhY2VtZW50LnNraXBGYWRlKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDaGFuZ2VkID0gcGxhY2VtZW50Q2hhbmdlZCB8fCBqb2ludFBsYWNlbWVudC50ZXh0IHx8IGpvaW50UGxhY2VtZW50Lmljb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb3B5IGFuZCB1cGRhdGUgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIHBsYWNlbWVudCB0aGF0IGFyZW4ndCBpbiB0aGUgY3VycmVudCBwbGFjZW1lbnQgYnV0IGhhdmVuJ3QgZmluaXNoZWQgZmFkaW5nXG4gICAgICAgIGZvciAoY29uc3QgY3Jvc3NUaWxlSUQgaW4gcHJldk9wYWNpdGllcykge1xuICAgICAgICAgICAgY29uc3QgcHJldk9wYWNpdHkgPSBwcmV2T3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9pbnRPcGFjaXR5ID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKHByZXZPcGFjaXR5LCBpbmNyZW1lbnQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFqb2ludE9wYWNpdHkuaXNIaWRkZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBqb2ludE9wYWNpdHk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudENoYW5nZWQgPSBwbGFjZW1lbnRDaGFuZ2VkIHx8IHByZXZPcGFjaXR5LnRleHQucGxhY2VkIHx8IHByZXZPcGFjaXR5Lmljb24ucGxhY2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNyb3NzVGlsZUlEIGluIHByZXZPZmZzZXRzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmFyaWFibGVPZmZzZXRzW2Nyb3NzVGlsZUlEXSAmJiB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gJiYgIXRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXS5pc0hpZGRlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHNbY3Jvc3NUaWxlSURdID0gcHJldk9mZnNldHNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjcm9zc1RpbGVJRCBpbiBwcmV2T3JpZW50YXRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGxhY2VkT3JpZW50YXRpb25zW2Nyb3NzVGlsZUlEXSAmJiB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gJiYgIXRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXS5pc0hpZGRlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbY3Jvc3NUaWxlSURdID0gcHJldk9yaWVudGF0aW9uc1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIGlzIHRoZSB0aW1lIG9mIHRoZSBsYXN0IGNvbW1pdCgpIHRoYXRcbiAgICAgICAgLy8gcmVzdWx0ZWQgaW4gYSBwbGFjZW1lbnQgY2hhbmdlIC0tIGluIG90aGVyIHdvcmRzLCB0aGUgc3RhcnQgdGltZSBvZlxuICAgICAgICAvLyB0aGUgbGFzdCBzeW1ib2wgZmFkZSBhbmltYXRpb25cbiAgICAgICAgYXNzZXJ0KCFwcmV2UGxhY2VtZW50IHx8IHByZXZQbGFjZW1lbnQubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChwbGFjZW1lbnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lID0gbm93O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50Lmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIDogbm93O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlTGF5ZXJPcGFjaXRpZXMoc3R5bGVMYXllcjogU3R5bGVMYXllciwgdGlsZXM6IEFycmF5PFRpbGU+KSB7XG4gICAgICAgIGNvbnN0IHNlZW5Dcm9zc1RpbGVJRHMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB0aWxlIG9mIHRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xCdWNrZXQgPSAoKHRpbGUuZ2V0QnVja2V0KHN0eWxlTGF5ZXIpOiBhbnkpOiBTeW1ib2xCdWNrZXQpO1xuICAgICAgICAgICAgaWYgKHN5bWJvbEJ1Y2tldCAmJiB0aWxlLmxhdGVzdEZlYXR1cmVJbmRleCAmJiBzdHlsZUxheWVyLmlkID09PSBzeW1ib2xCdWNrZXQubGF5ZXJJZHNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1Y2tldE9wYWNpdGllcyhzeW1ib2xCdWNrZXQsIHNlZW5Dcm9zc1RpbGVJRHMsIHRpbGUuY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQnVja2V0T3BhY2l0aWVzKGJ1Y2tldDogU3ltYm9sQnVja2V0LCBzZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH0sIGNvbGxpc2lvbkJveEFycmF5OiA/Q29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNUZXh0RGF0YSgpKSBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNJY29uRGF0YSgpKSBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkpIGJ1Y2tldC5jb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25DaXJjbGVEYXRhKCkpIGJ1Y2tldC5jb2xsaXNpb25DaXJjbGUuY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlT3BhY2l0eVN0YXRlID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKG51bGwsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHRleHRBbGxvd092ZXJsYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKTtcbiAgICAgICAgY29uc3QgaWNvbkFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZVBsYWNlbWVudCA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG4gICAgICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIC8vIElmIGFsbG93LW92ZXJsYXAgaXMgdHJ1ZSwgd2UgY2FuIHNob3cgc3ltYm9scyBiZWZvcmUgcGxhY2VtZW50IHJ1bnMgb24gdGhlbVxuICAgICAgICAvLyBCdXQgd2UgaGF2ZSB0byB3YWl0IGZvciBwbGFjZW1lbnQgaWYgd2UgcG90ZW50aWFsbHkgZGVwZW5kIG9uIGEgcGFpcmVkIGljb24vdGV4dFxuICAgICAgICAvLyB3aXRoIGFsbG93LW92ZXJsYXA6IGZhbHNlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzcwMzJcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wYWNpdHlTdGF0ZSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShudWxsLCAwLFxuICAgICAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAgJiYgKGljb25BbGxvd092ZXJsYXAgfHwgIWJ1Y2tldC5oYXNJY29uRGF0YSgpIHx8IGxheW91dC5nZXQoJ2ljb24tb3B0aW9uYWwnKSksXG4gICAgICAgICAgICAgICAgaWNvbkFsbG93T3ZlcmxhcCAmJiAodGV4dEFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc1RleHREYXRhKCkgfHwgbGF5b3V0LmdldCgndGV4dC1vcHRpb25hbCcpKSxcbiAgICAgICAgICAgICAgICB0cnVlKTtcblxuICAgICAgICBpZiAoIWJ1Y2tldC5jb2xsaXNpb25BcnJheXMgJiYgY29sbGlzaW9uQm94QXJyYXkgJiYgKGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkgfHwgYnVja2V0Lmhhc0NvbGxpc2lvbkNpcmNsZURhdGEoKSkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgYnVja2V0LnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmdldChzKTtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgICAgICAgICBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMsXG4gICAgICAgICAgICAgICAgY3Jvc3NUaWxlSURcbiAgICAgICAgICAgIH0gPSBzeW1ib2xJbnN0YW5jZTtcblxuICAgICAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBzZWVuQ3Jvc3NUaWxlSURzW2Nyb3NzVGlsZUlEXTtcblxuICAgICAgICAgICAgbGV0IG9wYWNpdHlTdGF0ZSA9IHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHlTdGF0ZSA9IGR1cGxpY2F0ZU9wYWNpdHlTdGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9wYWNpdHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHlTdGF0ZSA9IGRlZmF1bHRPcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHN0YXRlIHNvIHRoYXQgZnV0dXJlIHBsYWNlbWVudHMgdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBvcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlZW5Dcm9zc1RpbGVJRHNbY3Jvc3NUaWxlSURdID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgaGFzVGV4dCA9IG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzID4gMCB8fCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPiAwO1xuICAgICAgICAgICAgY29uc3QgaGFzSWNvbiA9IHN5bWJvbEluc3RhbmNlLm51bUljb25WZXJ0aWNlcyA+IDA7XG5cbiAgICAgICAgICAgIGlmIChoYXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2VkT3BhY2l0eSA9IHBhY2tPcGFjaXR5KG9wYWNpdHlTdGF0ZS50ZXh0KTtcbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCB0ZXh0IGZhZGVzIGluL291dCBvbiBjb2xsaXNpb24gdGhlIHNhbWUgd2F5IGFzIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsIHRleHQuIFN3aXRjaCBiZXR3ZWVuIHZlcnRpY2FsL2hvcml6b250YWwgc2hvdWxkIGJlIGluc3RhbnRhbmVvdXNcbiAgICAgICAgICAgICAgICBjb25zdCBvcGFjaXR5RW50cnlDb3VudCA9IChudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyArIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcykgLyA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BhY2l0eUVudHJ5Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGFja2VkT3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgbGFiZWwgaXMgY29tcGxldGVseSBmYWRlZCwgbWFyayBpdCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8gaXRzIHBvc2l0aW9uIGF0IHJlbmRlciB0aW1lLiBJZiB0aGlzIGxheWVyIGhhcyB2YXJpYWJsZSBwbGFjZW1lbnQsIHNoaWZ0IHRoZSB2YXJpb3VzXG4gICAgICAgICAgICAgICAgLy8gc3ltYm9sIGluc3RhbmNlcyBhcHByb3ByaWF0ZWx5IHNvIHRoYXQgc3ltYm9scyBmcm9tIGJ1Y2tldHMgdGhhdCBoYXZlIHlldCB0byBiZSBwbGFjZWRcbiAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xIaWRkZW4gPSBvcGFjaXR5U3RhdGUudGV4dC5pc0hpZGRlbigpID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkT3JpZW50YXRpb24gPSB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxIaWRkZW4gPSAocGxhY2VkT3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWwgfHwgcGxhY2VkT3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWxPbmx5KSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxIaWRkZW4gPSBwbGFjZWRPcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUudmVydGljYWwgPyAxIDogMDtcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgICAgICAgICBdLmZvckVhY2goaW5kZXggPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGluZGV4KS5oaWRkZW4gPSBzeW1ib2xIaWRkZW4gfHwgaG9yaXpvbnRhbEhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KS5oaWRkZW4gPSBzeW1ib2xIaWRkZW4gfHwgdmVydGljYWxIaWRkZW47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk9mZnNldCA9IHRoaXMudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICBpZiAocHJldk9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsIHByZXZPZmZzZXQuYW5jaG9yLCBzeW1ib2xJbnN0YW5jZSwgcGxhY2VkT3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPcmllbnRhdGlvbiA9IHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICBpZiAocHJldk9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRKdXN0aWZpY2F0aW9uKGJ1Y2tldCwgJ2xlZnQnLCBzeW1ib2xJbnN0YW5jZSwgcHJldk9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrVXNlZE9yaWVudGF0aW9uKGJ1Y2tldCwgcHJldk9yaWVudGF0aW9uLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzSWNvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tlZE9wYWNpdHkgPSBwYWNrT3BhY2l0eShvcGFjaXR5U3RhdGUuaWNvbik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzeW1ib2xJbnN0YW5jZS5udW1JY29uVmVydGljZXMgLyA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb24ub3BhY2l0eVZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHBhY2tlZE9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWNrZXQuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5nZXQocykuaGlkZGVuID1cbiAgICAgICAgICAgICAgICAgICAgKG9wYWNpdHlTdGF0ZS5pY29uLmlzSGlkZGVuKCk6IGFueSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChidWNrZXQuaGFzQ29sbGlzaW9uQm94RGF0YSgpIHx8IGJ1Y2tldC5oYXNDb2xsaXNpb25DaXJjbGVEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xsaXNpb25BcnJheXMgPSBidWNrZXQuY29sbGlzaW9uQXJyYXlzW3NdO1xuICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2hpZnQgPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZU9mZnNldCA9IHRoaXMudmFyaWFibGVPZmZzZXRzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHNob3cgZWl0aGVyIHRoZSBjdXJyZW50bHkgcGxhY2VkIHBvc2l0aW9uIG9yIHRoZSBsYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWxseSBwbGFjZWQgcG9zaXRpb24gKHNvIHlvdSBjYW4gdmlzdWFsaXplIHdoYXQgY29sbGlzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgbWFkZSB0aGUgc3ltYm9sIGRpc2FwcGVhciwgYW5kIHRoZSBtb3N0IGxpa2VseSBwbGFjZSBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bWJvbCB0byBjb21lIGJhY2spXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gY2FsY3VsYXRlVmFyaWFibGVMYXlvdXRPZmZzZXQodmFyaWFibGVPZmZzZXQuYW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU9mZnNldC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVPZmZzZXQuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU9mZnNldC5yYWRpYWxPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlT2Zmc2V0LnRleHRCb3hTY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGVXaXRoTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdC5fcm90YXRlKHBpdGNoV2l0aE1hcCA/IHRoaXMudHJhbnNmb3JtLmFuZ2xlIDogLXRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG9mZnNldCAtPiB0aGlzIHN5bWJvbCBoYXNuJ3QgYmVlbiBwbGFjZWQgc2luY2UgY29taW5nIG9uLXNjcmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzaW5nbGUgYm94IGlzIHBhcnRpY3VsYXJseSBtZWFuaW5nZnVsIGFuZCBhbGwgb2YgdGhlbSB3b3VsZCBiZSB0b28gbm9pc3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBjZW50ZXIgYm94IGp1c3QgdG8gc2hvdyBzb21ldGhpbmcncyB0aGVyZSwgYnV0IG1hcmsgaXQgXCJub3QgdXNlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGJ1Y2tldC5jb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG9wYWNpdHlTdGF0ZS50ZXh0LnBsYWNlZCwgIXVzZWQsIHNoaWZ0LngsIHNoaWZ0LnkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy5pY29uQm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb2xsaXNpb25WZXJ0aWNlcyhidWNrZXQuY29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LCBvcGFjaXR5U3RhdGUuaWNvbi5wbGFjZWQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDaXJjbGVzID0gY29sbGlzaW9uQXJyYXlzLnRleHRDaXJjbGVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dENpcmNsZXMgJiYgYnVja2V0Lmhhc0NvbGxpc2lvbkNpcmNsZURhdGEoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0ZXh0Q2lyY2xlcy5sZW5ndGg7IGsgKz0gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdFVzZWQgPSBpc0R1cGxpY2F0ZSB8fCB0ZXh0Q2lyY2xlc1trICsgNF0gPT09IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoYnVja2V0LmNvbGxpc2lvbkNpcmNsZS5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgb3BhY2l0eVN0YXRlLnRleHQucGxhY2VkLCBub3RVc2VkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Y2tldC5zb3J0RmVhdHVyZXModGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXQuYnVja2V0SW5zdGFuY2VJZF0pIHtcbiAgICAgICAgICAgIHRoaXMucmV0YWluZWRRdWVyeURhdGFbYnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdLmZlYXR1cmVTb3J0T3JkZXIgPSBidWNrZXQuZmVhdHVyZVNvcnRPcmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChidWNrZXQuaGFzVGV4dERhdGEoKSAmJiBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVja2V0Lmhhc0ljb25EYXRhKCkgJiYgYnVja2V0Lmljb24ub3BhY2l0eVZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgYnVja2V0Lmljb24ub3BhY2l0eVZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkgJiYgYnVja2V0LmNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5jb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoYnVja2V0LmNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25DaXJjbGVEYXRhKCkgJiYgYnVja2V0LmNvbGxpc2lvbkNpcmNsZS5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5jb2xsaXNpb25DaXJjbGUuY29sbGlzaW9uVmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoYnVja2V0LmNvbGxpc2lvbkNpcmNsZS5jb2xsaXNpb25WZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aCA9PT0gYnVja2V0LnRleHQubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoIC8gNCk7XG4gICAgICAgIGFzc2VydChidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkubGVuZ3RoID09PSBidWNrZXQuaWNvbi5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggLyA0KTtcbiAgICB9XG5cbiAgICBzeW1ib2xGYWRlQ2hhbmdlKG5vdzogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhZGVEdXJhdGlvbiA9PT0gMCA/XG4gICAgICAgICAgICAxIDpcbiAgICAgICAgICAgIChub3cgLSB0aGlzLmNvbW1pdFRpbWUpIC8gdGhpcy5mYWRlRHVyYXRpb247XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbnMobm93OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhbGUgfHxcbiAgICAgICAgICAgIG5vdyAtIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgPCB0aGlzLmZhZGVEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBzdGlsbFJlY2VudChub3c6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21taXRUaW1lICsgdGhpcy5mYWRlRHVyYXRpb24gPiBub3c7XG4gICAgfVxuXG4gICAgc2V0U3RhbGUoKSB7XG4gICAgICAgIHRoaXMuc3RhbGUgPSB0cnVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoY29sbGlzaW9uVmVydGV4QXJyYXk6IENvbGxpc2lvblZlcnRleEFycmF5LCBwbGFjZWQ6IGJvb2xlYW4sIG5vdFVzZWQ6IGJvb2xlYW4sIHNoaWZ0WD86IG51bWJlciwgc2hpZnRZPzogbnVtYmVyKSB7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCwgc2hpZnRYIHx8IDAsIHNoaWZ0WSB8fCAwKTtcbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwbGFjZWQgPyAxIDogMCwgbm90VXNlZCA/IDEgOiAwLCBzaGlmdFggfHwgMCwgc2hpZnRZIHx8IDApO1xuICAgIGNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHBsYWNlZCA/IDEgOiAwLCBub3RVc2VkID8gMSA6IDAsIHNoaWZ0WCB8fCAwLCBzaGlmdFkgfHwgMCk7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCwgc2hpZnRYIHx8IDAsIHNoaWZ0WSB8fCAwKTtcbn1cblxuLy8gQWxsIGZvdXIgdmVydGljZXMgZm9yIGEgZ2x5cGggd2lsbCBoYXZlIHRoZSBzYW1lIG9wYWNpdHkgc3RhdGVcbi8vIFNvIHdlIHBhY2sgdGhlIG9wYWNpdHkgaW50byBhIHVpbnQ4LCBhbmQgdGhlbiByZXBlYXQgaXQgZm91ciB0aW1lc1xuLy8gdG8gbWFrZSBhIHNpbmdsZSB1aW50MzIgdGhhdCB3ZSBjYW4gdXBsb2FkIGZvciBlYWNoIGdseXBoIGluIHRoZVxuLy8gbGFiZWwuXG5jb25zdCBzaGlmdDI1ID0gTWF0aC5wb3coMiwgMjUpO1xuY29uc3Qgc2hpZnQyNCA9IE1hdGgucG93KDIsIDI0KTtcbmNvbnN0IHNoaWZ0MTcgPSBNYXRoLnBvdygyLCAxNyk7XG5jb25zdCBzaGlmdDE2ID0gTWF0aC5wb3coMiwgMTYpO1xuY29uc3Qgc2hpZnQ5ID0gTWF0aC5wb3coMiwgOSk7XG5jb25zdCBzaGlmdDggPSBNYXRoLnBvdygyLCA4KTtcbmNvbnN0IHNoaWZ0MSA9IE1hdGgucG93KDIsIDEpO1xuZnVuY3Rpb24gcGFja09wYWNpdHkob3BhY2l0eVN0YXRlOiBPcGFjaXR5U3RhdGUpOiBudW1iZXIge1xuICAgIGlmIChvcGFjaXR5U3RhdGUub3BhY2l0eSA9PT0gMCAmJiAhb3BhY2l0eVN0YXRlLnBsYWNlZCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKG9wYWNpdHlTdGF0ZS5vcGFjaXR5ID09PSAxICYmIG9wYWNpdHlTdGF0ZS5wbGFjZWQpIHtcbiAgICAgICAgcmV0dXJuIDQyOTQ5NjcyOTU7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldEJpdCA9IG9wYWNpdHlTdGF0ZS5wbGFjZWQgPyAxIDogMDtcbiAgICBjb25zdCBvcGFjaXR5Qml0cyA9IE1hdGguZmxvb3Iob3BhY2l0eVN0YXRlLm9wYWNpdHkgKiAxMjcpO1xuICAgIHJldHVybiBvcGFjaXR5Qml0cyAqIHNoaWZ0MjUgKyB0YXJnZXRCaXQgKiBzaGlmdDI0ICtcbiAgICAgICAgb3BhY2l0eUJpdHMgKiBzaGlmdDE3ICsgdGFyZ2V0Qml0ICogc2hpZnQxNiArXG4gICAgICAgIG9wYWNpdHlCaXRzICogc2hpZnQ5ICsgdGFyZ2V0Qml0ICogc2hpZnQ4ICtcbiAgICAgICAgb3BhY2l0eUJpdHMgKiBzaGlmdDEgKyB0YXJnZXRCaXQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuXG5pbXBvcnQgeyBQbGFjZW1lbnQgfSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuL3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUnO1xuXG5jbGFzcyBMYXllclBsYWNlbWVudCB7XG4gICAgX2N1cnJlbnRUaWxlSW5kZXg6IG51bWJlcjtcbiAgICBfdGlsZXM6IEFycmF5PFRpbGU+O1xuICAgIF9zZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH07XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRpbGVJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX3NlZW5Dcm9zc1RpbGVJRHMgPSB7fTtcbiAgICB9XG5cbiAgICBjb250aW51ZVBsYWNlbWVudCh0aWxlczogQXJyYXk8VGlsZT4sIHBsYWNlbWVudDogUGxhY2VtZW50LCBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sIHN0eWxlTGF5ZXI6IFN0eWxlTGF5ZXIsIHNob3VsZFBhdXNlUGxhY2VtZW50OiAoKSA9PiBib29sZWFuKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50VGlsZUluZGV4IDwgdGlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbdGhpcy5fY3VycmVudFRpbGVJbmRleF07XG4gICAgICAgICAgICBwbGFjZW1lbnQucGxhY2VMYXllclRpbGUoc3R5bGVMYXllciwgdGlsZSwgc2hvd0NvbGxpc2lvbkJveGVzLCB0aGlzLl9zZWVuQ3Jvc3NUaWxlSURzKTtcblxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRpbGVJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHNob3VsZFBhdXNlUGxhY2VtZW50KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgUGF1c2VhYmxlUGxhY2VtZW50IHtcbiAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudDtcbiAgICBfZG9uZTogYm9vbGVhbjtcbiAgICBfY3VycmVudFBsYWNlbWVudEluZGV4OiBudW1iZXI7XG4gICAgX2ZvcmNlRnVsbFBsYWNlbWVudDogYm9vbGVhbjtcbiAgICBfc2hvd0NvbGxpc2lvbkJveGVzOiBib29sZWFuO1xuICAgIF9pblByb2dyZXNzTGF5ZXI6ID9MYXllclBsYWNlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybTogVHJhbnNmb3JtLCBvcmRlcjogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICBmb3JjZUZ1bGxQbGFjZW1lbnQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIGZhZGVEdXJhdGlvbjogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGNyb3NzU291cmNlQ29sbGlzaW9uczogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBwcmV2UGxhY2VtZW50PzogUGxhY2VtZW50KSB7XG5cbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBuZXcgUGxhY2VtZW50KHRyYW5zZm9ybSwgZmFkZUR1cmF0aW9uLCBjcm9zc1NvdXJjZUNvbGxpc2lvbnMsIHByZXZQbGFjZW1lbnQpO1xuICAgICAgICB0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXggPSBvcmRlci5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLl9mb3JjZUZ1bGxQbGFjZW1lbnQgPSBmb3JjZUZ1bGxQbGFjZW1lbnQ7XG4gICAgICAgIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcyA9IHNob3dDb2xsaXNpb25Cb3hlcztcbiAgICAgICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlzRG9uZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvbmU7XG4gICAgfVxuXG4gICAgY29udGludWVQbGFjZW1lbnQob3JkZXI6IEFycmF5PHN0cmluZz4sIGxheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfSwgbGF5ZXJUaWxlczoge1tzdHJpbmddOiBBcnJheTxUaWxlPn0pIHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gYnJvd3Nlci5ub3coKTtcblxuICAgICAgICBjb25zdCBzaG91bGRQYXVzZVBsYWNlbWVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gYnJvd3Nlci5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JjZUZ1bGxQbGFjZW1lbnQgPyBmYWxzZSA6IGVsYXBzZWRUaW1lID4gMjtcbiAgICAgICAgfTtcblxuICAgICAgICB3aGlsZSAodGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVySWQgPSBvcmRlclt0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBsYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICBjb25zdCBwbGFjZW1lbnRab29tID0gdGhpcy5wbGFjZW1lbnQuY29sbGlzaW9uSW5kZXgudHJhbnNmb3JtLnpvb207XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ3N5bWJvbCcgJiZcbiAgICAgICAgICAgICAgICAoIWxheWVyLm1pbnpvb20gfHwgbGF5ZXIubWluem9vbSA8PSBwbGFjZW1lbnRab29tKSAmJlxuICAgICAgICAgICAgICAgICghbGF5ZXIubWF4em9vbSB8fCBsYXllci5tYXh6b29tID4gcGxhY2VtZW50Wm9vbSkpIHtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5faW5Qcm9ncmVzc0xheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luUHJvZ3Jlc3NMYXllciA9IG5ldyBMYXllclBsYWNlbWVudCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdXNlUGxhY2VtZW50ID0gdGhpcy5faW5Qcm9ncmVzc0xheWVyLmNvbnRpbnVlUGxhY2VtZW50KGxheWVyVGlsZXNbbGF5ZXIuc291cmNlXSwgdGhpcy5wbGFjZW1lbnQsIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcywgbGF5ZXIsIHNob3VsZFBhdXNlUGxhY2VtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXVzZVBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgZmluaXNoIHBsYWNpbmcgYWxsIGxheWVycyB3aXRoaW4gMm1zLFxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgY2FuIGtlZXAgcmVuZGVyaW5nIHdpdGggYSBwYXJ0aWFsIHBsYWNlbWVudFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSdsbCByZXN1bWUgaGVyZSBvbiB0aGUgbmV4dCBmcmFtZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2luUHJvZ3Jlc3NMYXllcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb21taXQobm93OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQuY29tbWl0KG5vdyk7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYWNlbWVudDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhdXNlYWJsZVBsYWNlbWVudDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuXG5pbXBvcnQgeyBTeW1ib2xJbnN0YW5jZUFycmF5IH0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgU3ltYm9sSW5zdGFuY2UgfSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUnO1xuXG4vKlxuICAgIFRoZSBDcm9zc1RpbGVTeW1ib2xJbmRleCBnZW5lcmFsbHkgd29ya3Mgb24gdGhlIGFzc3VtcHRpb24gdGhhdFxuICAgIGEgY29uY2VwdHVhbCBcInVuaXF1ZSBzeW1ib2xcIiBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGUgdGV4dCBvZlxuICAgIHRoZSBsYWJlbCBjb21iaW5lZCB3aXRoIHRoZSBhbmNob3IgcG9pbnQuIFRoZSBnb2FsIGlzIHRvIGFzc2lnblxuICAgIHRoZXNlIGNvbmNlcHR1YWwgXCJ1bmlxdWUgc3ltYm9sc1wiIGEgc2hhcmVkIGNyb3NzVGlsZUlEIHRoYXQgY2FuIGJlXG4gICAgdXNlZCBieSBQbGFjZW1lbnQgdG8ga2VlcCBmYWRpbmcgb3BhY2l0eSBzdGF0ZXMgY29uc2lzdGVudCBhbmQgdG9cbiAgICBkZWR1cGxpY2F0ZSBsYWJlbHMuXG5cbiAgICBUaGUgQ3Jvc3NUaWxlU3ltYm9sSW5kZXggaW5kZXhlcyBhbGwgdGhlIGN1cnJlbnQgc3ltYm9sIGluc3RhbmNlcyBhbmRcbiAgICB0aGVpciBjcm9zc1RpbGVJRHMuIFdoZW4gYSBzeW1ib2wgYnVja2V0IGdldHMgYWRkZWQgb3IgdXBkYXRlZCwgdGhlXG4gICAgaW5kZXggYXNzaWducyBhIGNyb3NzVGlsZUlEIHRvIGVhY2ggb2YgaXQncyBzeW1ib2wgaW5zdGFuY2VzIGJ5IGVpdGhlclxuICAgIG1hdGNoaW5nIGl0IHdpdGggYW4gZXhpc3RpbmcgaWQgb3IgYXNzaWduaW5nIGEgbmV3IG9uZS5cbiovXG5cbi8vIFJvdW5kIGFuY2hvciBwb3NpdGlvbnMgdG8gcm91Z2hseSA0IHBpeGVsIGdyaWRcbmNvbnN0IHJvdW5kaW5nRmFjdG9yID0gNTEyIC8gRVhURU5UIC8gMjtcblxuY2xhc3MgVGlsZUxheWVySW5kZXgge1xuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRDtcbiAgICBpbmRleGVkU3ltYm9sSW5zdGFuY2VzOiB7W251bWJlcl06IEFycmF5PHtcbiAgICAgICAgY3Jvc3NUaWxlSUQ6IG51bWJlcixcbiAgICAgICAgY29vcmQ6IHtcbiAgICAgICAgICAgIHg6IG51bWJlcixcbiAgICAgICAgICAgIHk6IG51bWJlclxuICAgICAgICB9XG4gICAgfT59O1xuICAgIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgc3ltYm9sSW5zdGFuY2VzOiBTeW1ib2xJbnN0YW5jZUFycmF5LCBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy50aWxlSUQgPSB0aWxlSUQ7XG4gICAgICAgIHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlcyA9IHt9O1xuICAgICAgICB0aGlzLmJ1Y2tldEluc3RhbmNlSWQgPSBidWNrZXRJbnN0YW5jZUlkO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzeW1ib2xJbnN0YW5jZS5rZXk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2tleV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgdGlsZSBtYXkgaGF2ZSBtdWx0aXBsZSBzeW1ib2wgaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUga2V5XG4gICAgICAgICAgICAvLyBTdG9yZSBlYWNoIG9uZSBhbG9uZyB3aXRoIGl0cyBjb29yZGluYXRlc1xuICAgICAgICAgICAgdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2tleV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgY3Jvc3NUaWxlSUQ6IHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlELFxuICAgICAgICAgICAgICAgIGNvb3JkOiB0aGlzLmdldFNjYWxlZENvb3JkaW5hdGVzKHN5bWJvbEluc3RhbmNlLCB0aWxlSUQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnZlcnRzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgaW5wdXQgc3ltYm9sIGluc3RhbmNlIGludG8gY29vcmRpbmF0ZXMgdGhhdCBiZSBjYW4gY29tcGFyZWRcbiAgICAvLyBhZ2FpbnN0IG90aGVyIHN5bWJvbHMgaW4gdGhpcyBpbmRleC4gQ29vcmRpbmF0ZXMgYXJlOlxuICAgIC8vICgxKSB3b3JsZC1iYXNlZCAoc28gYWZ0ZXIgY29udmVyc2lvbiB0aGUgc291cmNlIHRpbGUgaXMgaXJyZWxldmFudClcbiAgICAvLyAoMikgY29udmVydGVkIHRvIHRoZSB6LXNjYWxlIG9mIHRoaXMgVGlsZUxheWVySW5kZXhcbiAgICAvLyAoMykgZG93bi1zYW1wbGVkIGJ5IFwicm91bmRpbmdGYWN0b3JcIiBmcm9tIHRpbGUgY29vcmRpbmF0ZSBwcmVjaXNpb24gaW4gb3JkZXIgdG8gYmVcbiAgICAvLyAgICAgbW9yZSB0b2xlcmFudCBvZiBzbWFsbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRpbGVzLlxuICAgIGdldFNjYWxlZENvb3JkaW5hdGVzKHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSwgY2hpbGRUaWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgY29uc3QgekRpZmZlcmVuY2UgPSBjaGlsZFRpbGVJRC5jYW5vbmljYWwueiAtIHRoaXMudGlsZUlELmNhbm9uaWNhbC56O1xuICAgICAgICBjb25zdCBzY2FsZSA9IHJvdW5kaW5nRmFjdG9yIC8gTWF0aC5wb3coMiwgekRpZmZlcmVuY2UpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogTWF0aC5mbG9vcigoY2hpbGRUaWxlSUQuY2Fub25pY2FsLnggKiBFWFRFTlQgKyBzeW1ib2xJbnN0YW5jZS5hbmNob3JYKSAqIHNjYWxlKSxcbiAgICAgICAgICAgIHk6IE1hdGguZmxvb3IoKGNoaWxkVGlsZUlELmNhbm9uaWNhbC55ICogRVhURU5UICsgc3ltYm9sSW5zdGFuY2UuYW5jaG9yWSkgKiBzY2FsZSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmaW5kTWF0Y2hlcyhzeW1ib2xJbnN0YW5jZXM6IFN5bWJvbEluc3RhbmNlQXJyYXksIG5ld1RpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgem9vbUNyb3NzVGlsZUlEczoge1tjcm9zc1RpbGVJRDogbnVtYmVyXTogYm9vbGVhbn0pIHtcbiAgICAgICAgY29uc3QgdG9sZXJhbmNlID0gdGhpcy50aWxlSUQuY2Fub25pY2FsLnogPCBuZXdUaWxlSUQuY2Fub25pY2FsLnogPyAxIDogTWF0aC5wb3coMiwgdGhpcy50aWxlSUQuY2Fub25pY2FsLnogLSBuZXdUaWxlSUQuY2Fub25pY2FsLnopO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQpIHtcbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGhhcyBhIG1hdGNoLCBza2lwXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ZWRJbnN0YW5jZXMgPSB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNbc3ltYm9sSW5zdGFuY2Uua2V5XTtcbiAgICAgICAgICAgIGlmICghaW5kZXhlZEluc3RhbmNlcykge1xuICAgICAgICAgICAgICAgIC8vIE5vIHN5bWJvbCB3aXRoIHRoaXMga2V5IGluIHRoaXMgYnVja2V0XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZFN5bWJvbENvb3JkID0gdGhpcy5nZXRTY2FsZWRDb29yZGluYXRlcyhzeW1ib2xJbnN0YW5jZSwgbmV3VGlsZUlEKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0aGlzVGlsZVN5bWJvbCBvZiBpbmRleGVkSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFueSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBrZXlzIHdob3NlIGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gMVxuICAgICAgICAgICAgICAgIC8vIGdyaWQgdW5pdC4gKHdpdGggYSA0cHggZ3JpZCwgdGhpcyBjb3ZlcnMgYSAxMnB4IGJ5IDEycHggYXJlYSlcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpc1RpbGVTeW1ib2wuY29vcmQueCAtIHNjYWxlZFN5bWJvbENvb3JkLngpIDw9IHRvbGVyYW5jZSAmJlxuICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyh0aGlzVGlsZVN5bWJvbC5jb29yZC55IC0gc2NhbGVkU3ltYm9sQ29vcmQueSkgPD0gdG9sZXJhbmNlICYmXG4gICAgICAgICAgICAgICAgICAgICF6b29tQ3Jvc3NUaWxlSURzW3RoaXNUaWxlU3ltYm9sLmNyb3NzVGlsZUlEXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmNlIHdlJ3ZlIG1hcmtlZCBvdXJzZWx2ZXMgZHVwbGljYXRlIGFnYWluc3QgdGhpcyBwYXJlbnQgc3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBsZXQgYW55IG90aGVyIHN5bWJvbHMgYXQgdGhlIHNhbWUgem9vbSBsZXZlbCBkdXBsaWNhdGUgYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBwYXJlbnQgKHNlZSBpc3N1ZSAjNTk5MylcbiAgICAgICAgICAgICAgICAgICAgem9vbUNyb3NzVGlsZUlEc1t0aGlzVGlsZVN5bWJvbC5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCA9IHRoaXNUaWxlU3ltYm9sLmNyb3NzVGlsZUlEO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIENyb3NzVGlsZUlEcyB7XG4gICAgbWF4Q3Jvc3NUaWxlSUQ6IG51bWJlcjtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYXhDcm9zc1RpbGVJRCA9IDA7XG4gICAgfVxuICAgIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4gKyt0aGlzLm1heENyb3NzVGlsZUlEO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlU3ltYm9sTGF5ZXJJbmRleCB7XG4gICAgaW5kZXhlczoge1t6b29tOiBzdHJpbmcgfCBudW1iZXJdOiB7W3RpbGVJZDogc3RyaW5nIHwgbnVtYmVyXTogVGlsZUxheWVySW5kZXh9fTtcbiAgICB1c2VkQ3Jvc3NUaWxlSURzOiB7W3pvb206IHN0cmluZyB8IG51bWJlcl06IHtbY3Jvc3NUaWxlSUQ6IG51bWJlcl06IGJvb2xlYW59fTtcbiAgICBsbmc6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluZGV4ZXMgPSB7fTtcbiAgICAgICAgdGhpcy51c2VkQ3Jvc3NUaWxlSURzID0ge307XG4gICAgICAgIHRoaXMubG5nID0gMDtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFNvbWV0aW1lcyB3aGVuIGEgdXNlciBwYW5zIGFjcm9zcyB0aGUgYW50aW1lcmlkaWFuIHRoZSBsb25naXR1ZGUgdmFsdWUgZ2V0cyB3cmFwcGVkLlxuICAgICAqIFRvIHByZXZlbnQgbGFiZWxzIGZyb20gZmxhc2hpbmcgb3V0IGFuZCBpbiB3ZSBhZGp1c3QgdGhlIHRpbGVJRCB2YWx1ZXMgaW4gdGhlIGluZGV4ZXNcbiAgICAgKiBzbyB0aGF0IHRoZXkgbWF0Y2ggdGhlIG5ldyB3cmFwcGVkIHZlcnNpb24gb2YgdGhlIG1hcC5cbiAgICAgKi9cbiAgICBoYW5kbGVXcmFwSnVtcChsbmc6IG51bWJlcikge1xuICAgICAgICBjb25zdCB3cmFwRGVsdGEgPSBNYXRoLnJvdW5kKChsbmcgLSB0aGlzLmxuZykgLyAzNjApO1xuICAgICAgICBpZiAod3JhcERlbHRhICE9PSAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHpvb20gaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbem9vbV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Wm9vbUluZGV4ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gem9vbUluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0aWxlSUQncyB3cmFwIGFuZCBhZGQgaXQgdG8gYSBuZXcgaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB6b29tSW5kZXhlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpbmRleC50aWxlSUQgPSBpbmRleC50aWxlSUQudW53cmFwVG8oaW5kZXgudGlsZUlELndyYXAgKyB3cmFwRGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICBuZXdab29tSW5kZXhbaW5kZXgudGlsZUlELmtleV0gPSBpbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleGVzW3pvb21dID0gbmV3Wm9vbUluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG5nID0gbG5nO1xuICAgIH1cblxuICAgIGFkZEJ1Y2tldCh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIGJ1Y2tldDogU3ltYm9sQnVja2V0LCBjcm9zc1RpbGVJRHM6IENyb3NzVGlsZUlEcykge1xuICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gJiZcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdW3RpbGVJRC5rZXldKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0uYnVja2V0SW5zdGFuY2VJZCA9PT1cbiAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UncmUgcmVwbGFjaW5nIHRoaXMgYnVja2V0IHdpdGggYW4gdXBkYXRlZCB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvbGQgYnVja2V0J3MgXCJ1c2VkIGNyb3NzVGlsZUlEc1wiIG5vdyBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBidWNrZXQgY2FuIGNsYWltIHRoZW0uXG4gICAgICAgICAgICAgICAgLy8gVGhlIG9sZCBpbmRleCBlbnRyaWVzIHRoZW1zZWx2ZXMgc3RpY2sgYXJvdW5kIHVudGlsXG4gICAgICAgICAgICAgICAgLy8gJ3JlbW92ZVN0YWxlQnVja2V0cycgaXMgY2FsbGVkLlxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdGlsZUlELm92ZXJzY2FsZWRaXSkge1xuICAgICAgICAgICAgdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6b29tQ3Jvc3NUaWxlSURzID0gdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RpbGVJRC5vdmVyc2NhbGVkWl07XG5cbiAgICAgICAgZm9yIChjb25zdCB6b29tIGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbem9vbV07XG4gICAgICAgICAgICBpZiAoTnVtYmVyKHpvb20pID4gdGlsZUlELm92ZXJzY2FsZWRaKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB6b29tSW5kZXhlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEluZGV4ID0gem9vbUluZGV4ZXNbaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleC50aWxlSUQuaXNDaGlsZE9mKHRpbGVJRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXguZmluZE1hdGNoZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcywgdGlsZUlELCB6b29tQ3Jvc3NUaWxlSURzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Q29vcmQgPSB0aWxlSUQuc2NhbGVkVG8oTnVtYmVyKHpvb20pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHpvb21JbmRleGVzW3BhcmVudENvb3JkLmtleV07XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZGV4LmZpbmRNYXRjaGVzKGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMsIHRpbGVJRCwgem9vbUNyb3NzVGlsZUlEcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgaWYgKCFzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCkge1xuICAgICAgICAgICAgICAgIC8vIHN5bWJvbCBkaWQgbm90IG1hdGNoIGFueSBrbm93biBzeW1ib2wsIGFzc2lnbiBhIG5ldyBpZFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEID0gY3Jvc3NUaWxlSURzLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgem9vbUNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0gPSBuZXcgVGlsZUxheWVySW5kZXgodGlsZUlELCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLCBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHpvb206IHN0cmluZyB8IG51bWJlciwgcmVtb3ZlZEJ1Y2tldDogVGlsZUxheWVySW5kZXgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVtb3ZlZEJ1Y2tldC5pbmRleGVkU3ltYm9sSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbEluc3RhbmNlIG9mIHJlbW92ZWRCdWNrZXQuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1soa2V5OiBhbnkpXSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbem9vbV1bc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlU3RhbGVCdWNrZXRzKGN1cnJlbnRJRHM6IHsgW3N0cmluZyB8IG51bWJlcl06IGJvb2xlYW4gfSkge1xuICAgICAgICBsZXQgdGlsZXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgeiBpbiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHpvb21JbmRleGVzID0gdGhpcy5pbmRleGVzW3pdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0aWxlS2V5IGluIHpvb21JbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50SURzW3pvb21JbmRleGVzW3RpbGVLZXldLmJ1Y2tldEluc3RhbmNlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHosIHpvb21JbmRleGVzW3RpbGVLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHpvb21JbmRleGVzW3RpbGVLZXldO1xuICAgICAgICAgICAgICAgICAgICB0aWxlc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlsZXNDaGFuZ2VkO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlU3ltYm9sSW5kZXgge1xuICAgIGxheWVySW5kZXhlczoge1tsYXllcklkOiBzdHJpbmddOiBDcm9zc1RpbGVTeW1ib2xMYXllckluZGV4fTtcbiAgICBjcm9zc1RpbGVJRHM6IENyb3NzVGlsZUlEcztcbiAgICBtYXhCdWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAgYnVja2V0c0luQ3VycmVudFBsYWNlbWVudDoge1tudW1iZXJdOiBib29sZWFufTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxheWVySW5kZXhlcyA9IHt9O1xuICAgICAgICB0aGlzLmNyb3NzVGlsZUlEcyA9IG5ldyBDcm9zc1RpbGVJRHMoKTtcbiAgICAgICAgdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkID0gMDtcbiAgICAgICAgdGhpcy5idWNrZXRzSW5DdXJyZW50UGxhY2VtZW50ID0ge307XG4gICAgfVxuXG4gICAgYWRkTGF5ZXIoc3R5bGVMYXllcjogU3R5bGVMYXllciwgdGlsZXM6IEFycmF5PFRpbGU+LCBsbmc6IG51bWJlcikge1xuICAgICAgICBsZXQgbGF5ZXJJbmRleCA9IHRoaXMubGF5ZXJJbmRleGVzW3N0eWxlTGF5ZXIuaWRdO1xuICAgICAgICBpZiAobGF5ZXJJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXllckluZGV4ID0gdGhpcy5sYXllckluZGV4ZXNbc3R5bGVMYXllci5pZF0gPSBuZXcgQ3Jvc3NUaWxlU3ltYm9sTGF5ZXJJbmRleCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCdWNrZXRJRHMgPSB7fTtcblxuICAgICAgICBsYXllckluZGV4LmhhbmRsZVdyYXBKdW1wKGxuZyk7XG5cbiAgICAgICAgZm9yIChjb25zdCB0aWxlIG9mIHRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xCdWNrZXQgPSAoKHRpbGUuZ2V0QnVja2V0KHN0eWxlTGF5ZXIpOiBhbnkpOiBTeW1ib2xCdWNrZXQpO1xuICAgICAgICAgICAgaWYgKCFzeW1ib2xCdWNrZXQgfHwgc3R5bGVMYXllci5pZCAhPT0gc3ltYm9sQnVja2V0LmxheWVySWRzWzBdKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoIXN5bWJvbEJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWQgPSArK3RoaXMubWF4QnVja2V0SW5zdGFuY2VJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxheWVySW5kZXguYWRkQnVja2V0KHRpbGUudGlsZUlELCBzeW1ib2xCdWNrZXQsIHRoaXMuY3Jvc3NUaWxlSURzKSkge1xuICAgICAgICAgICAgICAgIHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRCdWNrZXRJRHNbc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXllckluZGV4LnJlbW92ZVN0YWxlQnVja2V0cyhjdXJyZW50QnVja2V0SURzKSkge1xuICAgICAgICAgICAgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN5bWJvbEJ1Y2tldHNDaGFuZ2VkO1xuICAgIH1cblxuICAgIHBydW5lVW51c2VkTGF5ZXJzKHVzZWRMYXllcnM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgdXNlZExheWVyTWFwID0ge307XG4gICAgICAgIHVzZWRMYXllcnMuZm9yRWFjaCgodXNlZExheWVyKSA9PiB7XG4gICAgICAgICAgICB1c2VkTGF5ZXJNYXBbdXNlZExheWVyXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5sYXllckluZGV4ZXMpIHtcbiAgICAgICAgICAgIGlmICghdXNlZExheWVyTWFwW2xheWVySWRdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubGF5ZXJJbmRleGVzW2xheWVySWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDcm9zc1RpbGVTeW1ib2xJbmRleDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgRXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllcic7XG5pbXBvcnQgY3JlYXRlU3R5bGVMYXllciBmcm9tICcuL2NyZWF0ZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgbG9hZFNwcml0ZSBmcm9tICcuL2xvYWRfc3ByaXRlJztcbmltcG9ydCBJbWFnZU1hbmFnZXIgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX21hbmFnZXInO1xuaW1wb3J0IEdseXBoTWFuYWdlciBmcm9tICcuLi9yZW5kZXIvZ2x5cGhfbWFuYWdlcic7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodCc7XG5pbXBvcnQgTGluZUF0bGFzIGZyb20gJy4uL3JlbmRlci9saW5lX2F0bGFzJztcbmltcG9ydCB7IHBpY2ssIGNsb25lLCBleHRlbmQsIGRlZXBFcXVhbCwgZmlsdGVyT2JqZWN0LCBtYXBPYmplY3QgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgZ2V0SlNPTiwgZ2V0UmVmZXJyZXIsIG1ha2VSZXF1ZXN0LCBSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IHsgaXNNYXBib3hVUkwgfSBmcm9tICcuLi91dGlsL21hcGJveCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB7IHZhbGlkYXRlU3R5bGUsIGVtaXRWYWxpZGF0aW9uRXJyb3JzIGFzIF9lbWl0VmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJy4vdmFsaWRhdGVfc3R5bGUnO1xuaW1wb3J0IHtcbiAgICBnZXRUeXBlIGFzIGdldFNvdXJjZVR5cGUsXG4gICAgc2V0VHlwZSBhcyBzZXRTb3VyY2VUeXBlLFxuICAgIHR5cGUgU291cmNlQ2xhc3Ncbn0gZnJvbSAnLi4vc291cmNlL3NvdXJjZSc7XG5pbXBvcnQgeyBxdWVyeVJlbmRlcmVkRmVhdHVyZXMsIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzLCBxdWVyeVNvdXJjZUZlYXR1cmVzIH0gZnJvbSAnLi4vc291cmNlL3F1ZXJ5X2ZlYXR1cmVzJztcbmltcG9ydCBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCBHZW9KU09OU291cmNlIGZyb20gJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZSc7XG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5pbXBvcnQgZ2V0V29ya2VyUG9vbCBmcm9tICcuLi91dGlsL2dsb2JhbF93b3JrZXJfcG9vbCc7XG5pbXBvcnQgZGVyZWYgZnJvbSAnLi4vc3R5bGUtc3BlYy9kZXJlZic7XG5pbXBvcnQgZGlmZlN0eWxlcywge29wZXJhdGlvbnMgYXMgZGlmZk9wZXJhdGlvbnN9IGZyb20gJy4uL3N0eWxlLXNwZWMvZGlmZic7XG5pbXBvcnQge1xuICAgIHJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5LFxuICAgIGV2ZW50ZWQgYXMgcnRsVGV4dFBsdWdpbkV2ZW50ZWRcbn0gZnJvbSAnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbic7XG5pbXBvcnQgUGF1c2VhYmxlUGxhY2VtZW50IGZyb20gJy4vcGF1c2VhYmxlX3BsYWNlbWVudCc7XG5pbXBvcnQgWm9vbUhpc3RvcnkgZnJvbSAnLi96b29tX2hpc3RvcnknO1xuaW1wb3J0IENyb3NzVGlsZVN5bWJvbEluZGV4IGZyb20gJy4uL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleCc7XG5pbXBvcnQge3ZhbGlkYXRlQ3VzdG9tU3R5bGVMYXllcn0gZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXInO1xuXG4vLyBXZSdyZSBza2lwcGluZyB2YWxpZGF0aW9uIGVycm9ycyB3aXRoIHRoZSBgc291cmNlLmNhbnZhc2AgaWRlbnRpZmllciBpbiBvcmRlclxuLy8gdG8gY29udGludWUgdG8gYWxsb3cgY2FudmFzIHNvdXJjZXMgdG8gYmUgYWRkZWQgYXQgcnVudGltZS91cGRhdGVkIGluXG4vLyBzbWFydCBzZXRTdHlsZSAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL3B1bGwvNjQyNCk6XG5jb25zdCBlbWl0VmFsaWRhdGlvbkVycm9ycyA9IChldmVudGVkOiBFdmVudGVkLCBlcnJvcnM6ID8kUmVhZE9ubHlBcnJheTx7bWVzc2FnZTogc3RyaW5nLCBpZGVudGlmaWVyPzogc3RyaW5nfT4pID0+XG4gICAgX2VtaXRWYWxpZGF0aW9uRXJyb3JzKGV2ZW50ZWQsIGVycm9ycyAmJiBlcnJvcnMuZmlsdGVyKGVycm9yID0+IGVycm9yLmlkZW50aWZpZXIgIT09ICdzb3VyY2UuY2FudmFzJykpO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuL3N0eWxlX2ltYWdlJztcbmltcG9ydCB0eXBlIHtTdHlsZUdseXBofSBmcm9tICcuL3N0eWxlX2dseXBoJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUge1BsYWNlbWVudH0gZnJvbSAnLi4vc3ltYm9sL3BsYWNlbWVudCc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdFBhcmFtZXRlcnMsIFJlc3BvbnNlQ2FsbGJhY2t9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTn0gZnJvbSAnQG1hcGJveC9nZW9qc29uLXR5cGVzJztcbmltcG9ydCB0eXBlIHtcbiAgICBMYXllclNwZWNpZmljYXRpb24sXG4gICAgRmlsdGVyU3BlY2lmaWNhdGlvbixcbiAgICBTdHlsZVNwZWNpZmljYXRpb24sXG4gICAgTGlnaHRTcGVjaWZpY2F0aW9uLFxuICAgIFNvdXJjZVNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4vc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtWYWxpZGF0b3J9IGZyb20gJy4vdmFsaWRhdGVfc3R5bGUnO1xuXG5jb25zdCBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucyA9IHBpY2soZGlmZk9wZXJhdGlvbnMsIFtcbiAgICAnYWRkTGF5ZXInLFxuICAgICdyZW1vdmVMYXllcicsXG4gICAgJ3NldFBhaW50UHJvcGVydHknLFxuICAgICdzZXRMYXlvdXRQcm9wZXJ0eScsXG4gICAgJ3NldEZpbHRlcicsXG4gICAgJ2FkZFNvdXJjZScsXG4gICAgJ3JlbW92ZVNvdXJjZScsXG4gICAgJ3NldExheWVyWm9vbVJhbmdlJyxcbiAgICAnc2V0TGlnaHQnLFxuICAgICdzZXRUcmFuc2l0aW9uJyxcbiAgICAnc2V0R2VvSlNPTlNvdXJjZURhdGEnXG4gICAgLy8gJ3NldEdseXBocycsXG4gICAgLy8gJ3NldFNwcml0ZScsXG5dKTtcblxuY29uc3QgaWdub3JlZERpZmZPcGVyYXRpb25zID0gcGljayhkaWZmT3BlcmF0aW9ucywgW1xuICAgICdzZXRDZW50ZXInLFxuICAgICdzZXRab29tJyxcbiAgICAnc2V0QmVhcmluZycsXG4gICAgJ3NldFBpdGNoJ1xuXSk7XG5cbmV4cG9ydCB0eXBlIFN0eWxlT3B0aW9ucyA9IHtcbiAgICB2YWxpZGF0ZT86IGJvb2xlYW4sXG4gICAgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5Pzogc3RyaW5nXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZVNldHRlck9wdGlvbnMgPSB7XG4gICAgdmFsaWRhdGU/OiBib29sZWFuXG59O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHlsZSBleHRlbmRzIEV2ZW50ZWQge1xuICAgIG1hcDogTWFwO1xuICAgIHN0eWxlc2hlZXQ6IFN0eWxlU3BlY2lmaWNhdGlvbjtcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIGltYWdlTWFuYWdlcjogSW1hZ2VNYW5hZ2VyO1xuICAgIGdseXBoTWFuYWdlcjogR2x5cGhNYW5hZ2VyO1xuICAgIGxpbmVBdGxhczogTGluZUF0bGFzO1xuICAgIGxpZ2h0OiBMaWdodDtcblxuICAgIF9yZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcbiAgICBfc3ByaXRlUmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgX2xheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfTtcbiAgICBfb3JkZXI6IEFycmF5PHN0cmluZz47XG4gICAgc291cmNlQ2FjaGVzOiB7W3N0cmluZ106IFNvdXJjZUNhY2hlfTtcbiAgICB6b29tSGlzdG9yeTogWm9vbUhpc3Rvcnk7XG4gICAgX2xvYWRlZDogYm9vbGVhbjtcbiAgICBfcnRsVGV4dFBsdWdpbkNhbGxiYWNrOiBGdW5jdGlvbjtcbiAgICBfY2hhbmdlZDogYm9vbGVhbjtcbiAgICBfdXBkYXRlZFNvdXJjZXM6IHtbc3RyaW5nXTogJ2NsZWFyJyB8ICdyZWxvYWQnfTtcbiAgICBfdXBkYXRlZExheWVyczoge1tzdHJpbmddOiB0cnVlfTtcbiAgICBfcmVtb3ZlZExheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfTtcbiAgICBfdXBkYXRlZFBhaW50UHJvcHM6IHtbbGF5ZXI6IHN0cmluZ106IHRydWV9O1xuICAgIF9sYXllck9yZGVyQ2hhbmdlZDogYm9vbGVhbjtcblxuICAgIGNyb3NzVGlsZVN5bWJvbEluZGV4OiBDcm9zc1RpbGVTeW1ib2xJbmRleDtcbiAgICBwYXVzZWFibGVQbGFjZW1lbnQ6IFBhdXNlYWJsZVBsYWNlbWVudDtcbiAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudDtcbiAgICB6OiBudW1iZXI7XG5cbiAgICAvLyBleHBvc2VkIHRvIGFsbG93IHN0dWJiaW5nIGJ5IHVuaXQgdGVzdHNcbiAgICBzdGF0aWMgZ2V0U291cmNlVHlwZTogdHlwZW9mIGdldFNvdXJjZVR5cGU7XG4gICAgc3RhdGljIHNldFNvdXJjZVR5cGU6IHR5cGVvZiBzZXRTb3VyY2VUeXBlO1xuICAgIHN0YXRpYyByZWdpc3RlckZvclBsdWdpbkF2YWlsYWJpbGl0eTogdHlwZW9mIHJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5O1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IFN0eWxlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKGdldFdvcmtlclBvb2woKSwgdGhpcyk7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyID0gbmV3IEltYWdlTWFuYWdlcigpO1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5zZXRFdmVudGVkUGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLmdseXBoTWFuYWdlciA9IG5ldyBHbHlwaE1hbmFnZXIobWFwLl9yZXF1ZXN0TWFuYWdlciwgb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkpO1xuICAgICAgICB0aGlzLmxpbmVBdGxhcyA9IG5ldyBMaW5lQXRsYXMoMjU2LCA1MTIpO1xuICAgICAgICB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IENyb3NzVGlsZVN5bWJvbEluZGV4KCk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX29yZGVyICA9IFtdO1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0gbmV3IFpvb21IaXN0b3J5KCk7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3Jlc2V0VXBkYXRlcygpO1xuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3NldFJlZmVycmVyJywgZ2V0UmVmZXJyZXIoKSk7XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3J0bFRleHRQbHVnaW5DYWxsYmFjayA9IFN0eWxlLnJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5KChhcmdzKSA9PiB7XG4gICAgICAgICAgICBzZWxmLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdsb2FkUlRMVGV4dFBsdWdpbicsIGFyZ3MucGx1Z2luVVJMLCBhcmdzLmNvbXBsZXRpb25DYWxsYmFjayk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNlbGYuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VDYWNoZXNbaWRdLnJlbG9hZCgpOyAvLyBTaG91bGQgYmUgYSBuby1vcCBpZiB0aGUgcGx1Z2luIGxvYWRzIGJlZm9yZSBhbnkgdGlsZXMgbG9hZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uKCdkYXRhJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YVR5cGUgIT09ICdzb3VyY2UnIHx8IGV2ZW50LnNvdXJjZURhdGFUeXBlICE9PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW2V2ZW50LnNvdXJjZUlkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS52ZWN0b3JMYXllcklkcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5zb3VyY2UgPT09IHNvdXJjZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRVUkwodXJsOiBzdHJpbmcsIG9wdGlvbnM6IHtcbiAgICAgICAgdmFsaWRhdGU/OiBib29sZWFuLFxuICAgICAgICBhY2Nlc3NUb2tlbj86IHN0cmluZ1xuICAgIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHR5cGVvZiBvcHRpb25zLnZhbGlkYXRlID09PSAnYm9vbGVhbicgP1xuICAgICAgICAgICAgb3B0aW9ucy52YWxpZGF0ZSA6ICFpc01hcGJveFVSTCh1cmwpO1xuXG4gICAgICAgIHVybCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTCh1cmwsIG9wdGlvbnMuYWNjZXNzVG9rZW4pO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuU3R5bGUpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gZ2V0SlNPTihyZXF1ZXN0LCAoZXJyb3I6ID9FcnJvciwganNvbjogP09iamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyb3IpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWQoanNvbiwgdmFsaWRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkSlNPTihqc29uOiBTdHlsZVNwZWNpZmljYXRpb24sIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuXG4gICAgICAgIHRoaXMuX3JlcXVlc3QgPSBicm93c2VyLmZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbG9hZChqc29uLCBvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9sb2FkKGpzb246IFN0eWxlU3BlY2lmaWNhdGlvbiwgdmFsaWRhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbGlkYXRlICYmIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlU3R5bGUoanNvbikpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBqc29uO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4ganNvbi5zb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFNvdXJjZShpZCwganNvbi5zb3VyY2VzW2lkXSwge3ZhbGlkYXRlOiBmYWxzZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpzb24uc3ByaXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9zcHJpdGVSZXF1ZXN0ID0gbG9hZFNwcml0ZShqc29uLnNwcml0ZSwgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCAoZXJyLCBpbWFnZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zcHJpdGVSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGltYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGltYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuYWRkSW1hZ2UoaWQsIGltYWdlc1tpZF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuc2V0TG9hZGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnNldExvYWRlZCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyLnNldFVSTChqc29uLmdseXBocyk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJzID0gZGVyZWYodGhpcy5zdHlsZXNoZWV0LmxheWVycyk7XG5cbiAgICAgICAgdGhpcy5fb3JkZXIgPSBsYXllcnMubWFwKChsYXllcikgPT4gbGF5ZXIuaWQpO1xuXG4gICAgICAgIHRoaXMuX2xheWVycyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxheWVyID0gY3JlYXRlU3R5bGVMYXllcihsYXllcik7XG4gICAgICAgICAgICBsYXllci5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtsYXllcjoge2lkOiBsYXllci5pZH19KTtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyc1tsYXllci5pZF0gPSBsYXllcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3NldExheWVycycsIHRoaXMuX3NlcmlhbGl6ZUxheWVycyh0aGlzLl9vcmRlcikpO1xuXG4gICAgICAgIHRoaXMubGlnaHQgPSBuZXcgTGlnaHQodGhpcy5zdHlsZXNoZWV0LmxpZ2h0KTtcblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdzdHlsZS5sb2FkJykpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUxheWVyKGxheWVyOiBTdHlsZUxheWVyKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXTtcbiAgICAgICAgaWYgKCFzb3VyY2VDYWNoZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBsYXllci5zb3VyY2VMYXllcjtcbiAgICAgICAgaWYgKCFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ2dlb2pzb24nIHx8IChzb3VyY2UudmVjdG9yTGF5ZXJJZHMgJiYgc291cmNlLnZlY3RvckxheWVySWRzLmluZGV4T2Yoc291cmNlTGF5ZXIpID09PSAtMSkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFNvdXJjZSBsYXllciBcIiR7c291cmNlTGF5ZXJ9XCIgYCArXG4gICAgICAgICAgICAgICAgYGRvZXMgbm90IGV4aXN0IG9uIHNvdXJjZSBcIiR7c291cmNlLmlkfVwiIGAgK1xuICAgICAgICAgICAgICAgIGBhcyBzcGVjaWZpZWQgYnkgc3R5bGUgbGF5ZXIgXCIke2xheWVyLmlkfVwiYFxuICAgICAgICAgICAgKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXBkYXRlZFNvdXJjZXMpLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnNvdXJjZUNhY2hlc1tpZF0ubG9hZGVkKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICghdGhpcy5pbWFnZU1hbmFnZXIuaXNMb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfc2VyaWFsaXplTGF5ZXJzKGlkczogQXJyYXk8c3RyaW5nPik6IEFycmF5PE9iamVjdD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkTGF5ZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLnB1c2gobGF5ZXIuc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkTGF5ZXJzO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb25zKCkge1xuICAgICAgICBpZiAodGhpcy5saWdodCAmJiB0aGlzLmxpZ2h0Lmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZXNbaWRdLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRdLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF9jaGVja0xvYWRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3R5bGUgaXMgbm90IGRvbmUgbG9hZGluZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgcXVldWVkIHN0eWxlIHVwZGF0ZXMgaW4gYSBiYXRjaCBhbmQgcmVjYWxjdWxhdGUgem9vbS1kZXBlbmRlbnQgcGFpbnQgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICB1cGRhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9jaGFuZ2VkO1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZElkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3VwZGF0ZWRMYXllcnMpO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZElkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3JlbW92ZWRMYXllcnMpO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlZElkcy5sZW5ndGggfHwgcmVtb3ZlZElkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVXb3JrZXJMYXllcnModXBkYXRlZElkcywgcmVtb3ZlZElkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3VwZGF0ZWRTb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5fdXBkYXRlZFNvdXJjZXNbaWRdO1xuICAgICAgICAgICAgICAgIGFzc2VydChhY3Rpb24gPT09ICdyZWxvYWQnIHx8IGFjdGlvbiA9PT0gJ2NsZWFyJyk7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3JlbG9hZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlKGlkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhclNvdXJjZShpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXS51cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5saWdodC51cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzKTtcblxuICAgICAgICAgICAgdGhpcy5fcmVzZXRVcGRhdGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tzb3VyY2VJZF0udXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcblxuICAgICAgICAgICAgbGF5ZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAoIWxheWVyLmlzSGlkZGVuKHBhcmFtZXRlcnMuem9vbSkgJiYgbGF5ZXIuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXS51c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlnaHQucmVjYWxjdWxhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMueiA9IHBhcmFtZXRlcnMuem9vbTtcblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgX3VwZGF0ZVdvcmtlckxheWVycyh1cGRhdGVkSWRzOiBBcnJheTxzdHJpbmc+LCByZW1vdmVkSWRzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3VwZGF0ZUxheWVycycsIHtcbiAgICAgICAgICAgIGxheWVyczogdGhpcy5fc2VyaWFsaXplTGF5ZXJzKHVwZGF0ZWRJZHMpLFxuICAgICAgICAgICAgcmVtb3ZlZElkc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcmVzZXRVcGRhdGVzKCkge1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlZExheWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9yZW1vdmVkTGF5ZXJzID0ge307XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlZFNvdXJjZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHMgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhpcyBzdHlsZSdzIHN0YXRlIHRvIG1hdGNoIHRoZSBnaXZlbiBzdHlsZSBKU09OLCBwZXJmb3JtaW5nIG9ubHlcbiAgICAgKiB0aGUgbmVjZXNzYXJ5IG11dGF0aW9ucy5cbiAgICAgKlxuICAgICAqIE1heSB0aHJvdyBhbiBFcnJvciAoJ1VuaW1wbGVtZW50ZWQ6IE1FVEhPRCcpIGlmIHRoZSBtYXBib3gtZ2wtc3R5bGUtc3BlY1xuICAgICAqIGRpZmYgYWxnb3JpdGhtIHByb2R1Y2VzIGFuIG9wZXJhdGlvbiB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhbnkgY2hhbmdlcyB3ZXJlIG1hZGU7IGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0U3RhdGUobmV4dFN0YXRlOiBTdHlsZVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAoZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgdmFsaWRhdGVTdHlsZShuZXh0U3RhdGUpKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIG5leHRTdGF0ZSA9IGNsb25lKG5leHRTdGF0ZSk7XG4gICAgICAgIG5leHRTdGF0ZS5sYXllcnMgPSBkZXJlZihuZXh0U3RhdGUubGF5ZXJzKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VzID0gZGlmZlN0eWxlcyh0aGlzLnNlcmlhbGl6ZSgpLCBuZXh0U3RhdGUpXG4gICAgICAgICAgICAuZmlsdGVyKG9wID0+ICEob3AuY29tbWFuZCBpbiBpZ25vcmVkRGlmZk9wZXJhdGlvbnMpKTtcblxuICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaW1wbGVtZW50ZWRPcHMgPSBjaGFuZ2VzLmZpbHRlcihvcCA9PiAhKG9wLmNvbW1hbmQgaW4gc3VwcG9ydGVkRGlmZk9wZXJhdGlvbnMpKTtcbiAgICAgICAgaWYgKHVuaW1wbGVtZW50ZWRPcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkOiAke3VuaW1wbGVtZW50ZWRPcHMubWFwKG9wID0+IG9wLmNvbW1hbmQpLmpvaW4oJywgJyl9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhbmdlcy5mb3JFYWNoKChvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wLmNvbW1hbmQgPT09ICdzZXRUcmFuc2l0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGB0cmFuc2l0aW9uYCBpcyBhbHdheXMgcmVhZCBkaXJlY3RseSBvZmYgb2ZcbiAgICAgICAgICAgICAgICAvLyBgdGhpcy5zdHlsZXNoZWV0YCwgd2hpY2ggd2UgdXBkYXRlIGJlbG93XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKHRoaXM6IGFueSlbb3AuY29tbWFuZF0uYXBwbHkodGhpcywgb3AuYXJncyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzaGVldCA9IG5leHRTdGF0ZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhZGRJbWFnZShpZDogc3RyaW5nLCBpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgICAgICBpZiAodGhpcy5nZXRJbWFnZShpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdBbiBpbWFnZSB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLmFkZEltYWdlKGlkLCBpbWFnZSk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG4gICAgfVxuXG4gICAgdXBkYXRlSW1hZ2UoaWQ6IHN0cmluZywgaW1hZ2U6IFN0eWxlSW1hZ2UpIHtcbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIudXBkYXRlSW1hZ2UoaWQsIGltYWdlKTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZShpZDogc3RyaW5nKTogP1N0eWxlSW1hZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZU1hbmFnZXIuZ2V0SW1hZ2UoaWQpO1xuICAgIH1cblxuICAgIHJlbW92ZUltYWdlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldEltYWdlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ05vIGltYWdlIHdpdGggdGhpcyBuYW1lIGV4aXN0cy4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnJlbW92ZUltYWdlKGlkKTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcbiAgICB9XG5cbiAgICBsaXN0SW1hZ2VzKCkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlTWFuYWdlci5saXN0SW1hZ2VzKCk7XG4gICAgfVxuXG4gICAgYWRkU291cmNlKGlkOiBzdHJpbmcsIHNvdXJjZTogU291cmNlU3BlY2lmaWNhdGlvbiwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZXNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc291cmNlLnR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHR5cGUgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkLCBidXQgdGhlIG9ubHkgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHdlcmUgZ2l2ZW46ICR7T2JqZWN0LmtleXMoc291cmNlKS5qb2luKCcsICcpfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1aWx0SW5zID0gWyd2ZWN0b3InLCAncmFzdGVyJywgJ2dlb2pzb24nLCAndmlkZW8nLCAnaW1hZ2UnXTtcbiAgICAgICAgY29uc3Qgc2hvdWxkVmFsaWRhdGUgPSBidWlsdElucy5pbmRleE9mKHNvdXJjZS50eXBlKSA+PSAwO1xuICAgICAgICBpZiAoc2hvdWxkVmFsaWRhdGUgJiYgdGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5zb3VyY2UsIGBzb3VyY2VzLiR7aWR9YCwgc291cmNlLCBudWxsLCBvcHRpb25zKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcCAmJiB0aGlzLm1hcC5fY29sbGVjdFJlc291cmNlVGltaW5nKSAoc291cmNlOiBhbnkpLmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbaWRdID0gbmV3IFNvdXJjZUNhY2hlKGlkLCBzb3VyY2UsIHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgIHNvdXJjZUNhY2hlLnN0eWxlID0gdGhpcztcbiAgICAgICAgc291cmNlQ2FjaGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCAoKSA9PiAoe1xuICAgICAgICAgICAgaXNTb3VyY2VMb2FkZWQ6IHRoaXMubG9hZGVkKCksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZUNhY2hlLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgc291cmNlSWQ6IGlkXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzb3VyY2VDYWNoZS5vbkFkZCh0aGlzLm1hcCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHNvdXJjZSBmcm9tIHRoaXMgc3R5bGVzaGVldCwgZ2l2ZW4gaXRzIGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgc291cmNlIHRvIHJlbW92ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBzb3VyY2UgaXMgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gSURcbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2UoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZUNhY2hlc1tpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCB0aGlzIElEJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tsYXllcklkXS5zb3VyY2UgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFNvdXJjZSBcIiR7aWR9XCIgY2Fubm90IGJlIHJlbW92ZWQgd2hpbGUgbGF5ZXIgXCIke2xheWVySWR9XCIgaXMgdXNpbmcgaXQuYCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fdXBkYXRlZFNvdXJjZXNbaWRdO1xuICAgICAgICBzb3VyY2VDYWNoZS5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJywgZGF0YVR5cGU6J3NvdXJjZScsIHNvdXJjZUlkOiBpZH0pKTtcbiAgICAgICAgc291cmNlQ2FjaGUuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgc291cmNlQ2FjaGUuY2xlYXJUaWxlcygpO1xuXG4gICAgICAgIGlmIChzb3VyY2VDYWNoZS5vblJlbW92ZSkgc291cmNlQ2FjaGUub25SZW1vdmUodGhpcy5tYXApO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFNldCB0aGUgZGF0YSBvZiBhIEdlb0pTT04gc291cmNlLCBnaXZlbiBpdHMgaWQuXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIHNvdXJjZVxuICAgICogQHBhcmFtIHtHZW9KU09OfHN0cmluZ30gZGF0YSBHZW9KU09OIHNvdXJjZVxuICAgICovXG4gICAgc2V0R2VvSlNPTlNvdXJjZURhdGEoaWQ6IHN0cmluZywgZGF0YTogR2VvSlNPTiB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGFzc2VydCh0aGlzLnNvdXJjZUNhY2hlc1tpZF0gIT09IHVuZGVmaW5lZCwgJ1RoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgY29uc3QgZ2VvanNvblNvdXJjZTogR2VvSlNPTlNvdXJjZSA9ICh0aGlzLnNvdXJjZUNhY2hlc1tpZF0uZ2V0U291cmNlKCk6IGFueSk7XG4gICAgICAgIGFzc2VydChnZW9qc29uU291cmNlLnR5cGUgPT09ICdnZW9qc29uJyk7XG5cbiAgICAgICAgZ2VvanNvblNvdXJjZS5zZXREYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzb3VyY2UgYnkgaWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBkZXNpcmVkIHNvdXJjZVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHNvdXJjZVxuICAgICAqL1xuICAgIGdldFNvdXJjZShpZDogc3RyaW5nKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlQ2FjaGVzW2lkXSAmJiB0aGlzLnNvdXJjZUNhY2hlc1tpZF0uZ2V0U291cmNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGF5ZXIgdG8gdGhlIG1hcCBzdHlsZS4gVGhlIGxheWVyIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBsYXllciB3aXRoXG4gICAgICogSUQgYGJlZm9yZWAsIG9yIGFwcGVuZGVkIGlmIGBiZWZvcmVgIGlzIG9taXR0ZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtiZWZvcmVdIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCBiZWZvcmVcbiAgICAgKi9cbiAgICBhZGRMYXllcihsYXllck9iamVjdDogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UsIGJlZm9yZT86IHN0cmluZywgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBpZCA9IGxheWVyT2JqZWN0LmlkO1xuXG4gICAgICAgIGlmICh0aGlzLmdldExheWVyKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgTGF5ZXIgd2l0aCBpZCBcIiR7aWR9XCIgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBtYXBgKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxheWVyO1xuICAgICAgICBpZiAobGF5ZXJPYmplY3QudHlwZSA9PT0gJ2N1c3RvbScpIHtcblxuICAgICAgICAgICAgaWYgKGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlQ3VzdG9tU3R5bGVMYXllcihsYXllck9iamVjdCkpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxheWVyID0gY3JlYXRlU3R5bGVMYXllcihsYXllck9iamVjdCk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGF5ZXJPYmplY3Quc291cmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKGlkLCBsYXllck9iamVjdC5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGxheWVyT2JqZWN0ID0gY2xvbmUobGF5ZXJPYmplY3QpO1xuICAgICAgICAgICAgICAgIGxheWVyT2JqZWN0ID0gKGV4dGVuZChsYXllck9iamVjdCwge3NvdXJjZTogaWR9KTogYW55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhpcyBsYXllciBpcyBub3QgaW4gdGhlIHN0eWxlLmxheWVycyBhcnJheSwgc28gd2UgcGFzcyBhbiBpbXBvc3NpYmxlIGFycmF5IGluZGV4XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5sYXllcixcbiAgICAgICAgICAgICAgICBgbGF5ZXJzLiR7aWR9YCwgbGF5ZXJPYmplY3QsIHthcnJheUluZGV4OiAtMX0sIG9wdGlvbnMpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxheWVyID0gY3JlYXRlU3R5bGVMYXllcihsYXllck9iamVjdCk7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUxheWVyKGxheWVyKTtcblxuICAgICAgICAgICAgbGF5ZXIuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7bGF5ZXI6IHtpZH19KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gYmVmb3JlID8gdGhpcy5fb3JkZXIuaW5kZXhPZihiZWZvcmUpIDogdGhpcy5fb3JkZXIubGVuZ3RoO1xuICAgICAgICBpZiAoYmVmb3JlICYmIGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgTGF5ZXIgd2l0aCBpZCBcIiR7YmVmb3JlfVwiIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgbWFwLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UoaW5kZXgsIDAsIGlkKTtcbiAgICAgICAgdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX2xheWVyc1tpZF0gPSBsYXllcjtcblxuICAgICAgICBpZiAodGhpcy5fcmVtb3ZlZExheWVyc1tpZF0gJiYgbGF5ZXIuc291cmNlICYmIGxheWVyLnR5cGUgIT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgICAvLyBJZiwgaW4gdGhlIGN1cnJlbnQgYmF0Y2gsIHdlIGhhdmUgYWxyZWFkeSByZW1vdmVkIHRoaXMgbGF5ZXJcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBhcmUgbm93IHJlLWFkZGluZyBpdCB3aXRoIGEgZGlmZmVyZW50IGB0eXBlYCwgdGhlbiB3ZVxuICAgICAgICAgICAgLy8gbmVlZCB0byBjbGVhciAocmF0aGVyIHRoYW4ganVzdCByZWxvYWQpIHRoZSB1bmRlcnlsaW5nIHNvdXJjZSdzXG4gICAgICAgICAgICAvLyB0aWxlcy4gIE90aGVyd2lzZSwgdGlsZXMgbWFya2VkICdyZWxvYWRpbmcnIHdpbGwgaGF2ZSBidWNrZXRzIC9cbiAgICAgICAgICAgIC8vIGJ1ZmZlcnMgdGhhdCBhcmUgc2V0IHVwIGZvciB0aGUgX3ByZXZpb3VzXyB2ZXJzaW9uIG9mIHRoaXNcbiAgICAgICAgICAgIC8vIGxheWVyLCBjYXVzaW5nLCBlLmcuOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM2MzNcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl9yZW1vdmVkTGF5ZXJzW2lkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZW1vdmVkTGF5ZXJzW2lkXTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkLnR5cGUgIT09IGxheWVyLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gJ2NsZWFyJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9ICdyZWxvYWQnO1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV0ucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG5cbiAgICAgICAgaWYgKGxheWVyLm9uQWRkKSB7XG4gICAgICAgICAgICBsYXllci5vbkFkZCh0aGlzLm1hcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIGxheWVyIHRvIGEgZGlmZmVyZW50IHotcG9zaXRpb24uIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAgSUQgb2YgdGhlIGxheWVyIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZV0gSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IGJlZm9yZVxuICAgICAqL1xuICAgIG1vdmVMYXllcihpZDogc3RyaW5nLCBiZWZvcmU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7aWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBtb3ZlZC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09PSBiZWZvcmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3JkZXIuaW5kZXhPZihpZCk7XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBiZWZvcmUgPyB0aGlzLl9vcmRlci5pbmRleE9mKGJlZm9yZSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgbmV3SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBMYXllciB3aXRoIGlkIFwiJHtiZWZvcmV9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBtYXAuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UobmV3SW5kZXgsIDAsIGlkKTtcblxuICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBsYXllciB3aXRoIHRoZSBnaXZlbiBpZCBmcm9tIHRoZSBzdHlsZS5cbiAgICAgKlxuICAgICAqIElmIG5vIHN1Y2ggbGF5ZXIgZXhpc3RzLCBhbiBgZXJyb3JgIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBsYXllciB0byByZW1vdmVcbiAgICAgKiBAZmlyZXMgZXJyb3JcbiAgICAgKi9cbiAgICByZW1vdmVMYXllcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7aWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSByZW1vdmVkLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsYXllci5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3JkZXIuaW5kZXhPZihpZCk7XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlZExheWVyc1tpZF0gPSBsYXllcjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91cGRhdGVkTGF5ZXJzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW2lkXTtcblxuICAgICAgICBpZiAobGF5ZXIub25SZW1vdmUpIHtcbiAgICAgICAgICAgIGxheWVyLm9uUmVtb3ZlKHRoaXMubWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgc3R5bGUgbGF5ZXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGBpZGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZCBvZiB0aGUgZGVzaXJlZCBsYXllclxuICAgICAqIEByZXR1cm5zIHs/T2JqZWN0fSBhIGxheWVyLCBpZiBvbmUgd2l0aCB0aGUgZ2l2ZW4gYGlkYCBleGlzdHNcbiAgICAgKi9cbiAgICBnZXRMYXllcihpZDogc3RyaW5nKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gICAgfVxuXG4gICAgc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZDogc3RyaW5nLCBtaW56b29tOiA/bnVtYmVyLCBtYXh6b29tOiA/bnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGhhdmUgem9vbSBleHRlbnQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXllci5taW56b29tID09PSBtaW56b29tICYmIGxheWVyLm1heHpvb20gPT09IG1heHpvb20pIHJldHVybjtcblxuICAgICAgICBpZiAobWluem9vbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsYXllci5taW56b29tID0gbWluem9vbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4em9vbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsYXllci5tYXh6b29tID0gbWF4em9vbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgc2V0RmlsdGVyKGxheWVySWQ6IHN0cmluZywgZmlsdGVyOiA/RmlsdGVyU3BlY2lmaWNhdGlvbiwgIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIGZpbHRlcmVkLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVlcEVxdWFsKGxheWVyLmZpbHRlciwgZmlsdGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlciA9PT0gbnVsbCB8fCBmaWx0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF5ZXIuZmlsdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUuZmlsdGVyLCBgbGF5ZXJzLiR7bGF5ZXIuaWR9LmZpbHRlcmAsIGZpbHRlciwgbnVsbCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheWVyLmZpbHRlciA9IGNsb25lKGZpbHRlcik7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsYXllcidzIGZpbHRlciBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIgdGhlIGxheWVyIHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJucyB7Kn0gdGhlIGxheWVyJ3MgZmlsdGVyLCBpZiBhbnlcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXIobGF5ZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5nZXRMYXllcihsYXllcikuZmlsdGVyKTtcbiAgICB9XG5cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZXBFcXVhbChsYXllci5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKSwgdmFsdWUpKSByZXR1cm47XG5cbiAgICAgICAgbGF5ZXIuc2V0TGF5b3V0UHJvcGVydHkobmFtZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5b3V0IHByb3BlcnR5J3MgdmFsdWUgZnJvbSBhIGdpdmVuIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgdGhlIGxheWVyIHRvIGluc3BlY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5XG4gICAgICogQHJldHVybnMgeyp9IHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllci5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKTtcbiAgICB9XG5cbiAgICBzZXRQYWludFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBzdHlsZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwRXF1YWwobGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eShuYW1lKSwgdmFsdWUpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmVxdWlyZXNSZWxheW91dCA9IGxheWVyLnNldFBhaW50UHJvcGVydHkobmFtZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAocmVxdWlyZXNSZWxheW91dCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW2xheWVySWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRQYWludFByb3BlcnR5KGxheWVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXllcihsYXllcikuZ2V0UGFpbnRQcm9wZXJ0eShuYW1lKTtcbiAgICB9XG5cbiAgICBzZXRGZWF0dXJlU3RhdGUoZmVhdHVyZTogeyBzb3VyY2U6IHN0cmluZzsgc291cmNlTGF5ZXI/OiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudW1iZXI7IH0sIHN0YXRlOiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSBmZWF0dXJlLnNvdXJjZTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBmZWF0dXJlLnNvdXJjZUxheWVyO1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW3NvdXJjZUlkXTtcbiAgICAgICAgY29uc3QgZmVhdHVyZUlkID0gcGFyc2VJbnQoZmVhdHVyZS5pZCwgMTApO1xuXG4gICAgICAgIGlmIChzb3VyY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgc291cmNlICcke3NvdXJjZUlkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnR5cGU7XG4gICAgICAgIGlmIChzb3VyY2VUeXBlID09PSAnZ2VvanNvbicgJiYgc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYEdlb0pTT04gc291cmNlcyBjYW5ub3QgaGF2ZSBhIHNvdXJjZUxheWVyIHBhcmFtZXRlci5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiAhc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2VMYXllciBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgdmVjdG9yIHNvdXJjZSB0eXBlcy5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05hTihmZWF0dXJlSWQpIHx8IGZlYXR1cmVJZCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBmZWF0dXJlIGlkIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGFuZCBub24tbmVnYXRpdmUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZUNhY2hlLnNldEZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgZmVhdHVyZUlkLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlRmVhdHVyZVN0YXRlKHRhcmdldDogeyBzb3VyY2U6IHN0cmluZzsgc291cmNlTGF5ZXI/OiBzdHJpbmc7IGlkPzogc3RyaW5nIHwgbnVtYmVyOyB9LCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0YXJnZXQuc291cmNlO1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW3NvdXJjZUlkXTtcblxuICAgICAgICBpZiAoc291cmNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZSAnJHtzb3VyY2VJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnR5cGU7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgPyB0YXJnZXQuc291cmNlTGF5ZXIgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVJZCA9IHBhcnNlSW50KHRhcmdldC5pZCwgMTApO1xuXG4gICAgICAgIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiAhc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2VMYXllciBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgdmVjdG9yIHNvdXJjZSB0eXBlcy5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldC5pZCAhPT0gdW5kZWZpbmVkICYmIGlzTmFOKGZlYXR1cmVJZCkgfHwgZmVhdHVyZUlkIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGZlYXR1cmUgaWQgcGFyYW1ldGVyIG11c3QgYmUgbm9uLW5lZ2F0aXZlLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ICYmICh0eXBlb2YgdGFyZ2V0LmlkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdGFyZ2V0LmlkICE9PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYEEgZmVhdHVyZSBpZCBpcyByZXF1cmVkIHRvIHJlbW92ZSBpdHMgc3BlY2lmaWMgc3RhdGUgcHJvcGVydHkuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZUNhY2hlLnJlbW92ZUZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgZmVhdHVyZUlkLCBrZXkpO1xuICAgIH1cblxuICAgIGdldEZlYXR1cmVTdGF0ZShmZWF0dXJlOiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bWJlcjsgfSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGZlYXR1cmUuc291cmNlO1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGZlYXR1cmUuc291cmNlTGF5ZXI7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbc291cmNlSWRdO1xuICAgICAgICBjb25zdCBmZWF0dXJlSWQgPSBwYXJzZUludChmZWF0dXJlLmlkLCAxMCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2UgJyR7c291cmNlSWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCkudHlwZTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmFOKGZlYXR1cmVJZCkgfHwgZmVhdHVyZUlkIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGZlYXR1cmUgaWQgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgYW5kIG5vbi1uZWdhdGl2ZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlLmdldEZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgZmVhdHVyZUlkKTtcbiAgICB9XG5cbiAgICBnZXRUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHsgZHVyYXRpb246IDMwMCwgZGVsYXk6IDAgfSwgdGhpcy5zdHlsZXNoZWV0ICYmIHRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9uKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJPYmplY3Qoe1xuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy5zdHlsZXNoZWV0LnZlcnNpb24sXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnN0eWxlc2hlZXQubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLnN0eWxlc2hlZXQubWV0YWRhdGEsXG4gICAgICAgICAgICBsaWdodDogdGhpcy5zdHlsZXNoZWV0LmxpZ2h0LFxuICAgICAgICAgICAgY2VudGVyOiB0aGlzLnN0eWxlc2hlZXQuY2VudGVyLFxuICAgICAgICAgICAgem9vbTogdGhpcy5zdHlsZXNoZWV0Lnpvb20sXG4gICAgICAgICAgICBiZWFyaW5nOiB0aGlzLnN0eWxlc2hlZXQuYmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoOiB0aGlzLnN0eWxlc2hlZXQucGl0Y2gsXG4gICAgICAgICAgICBzcHJpdGU6IHRoaXMuc3R5bGVzaGVldC5zcHJpdGUsXG4gICAgICAgICAgICBnbHlwaHM6IHRoaXMuc3R5bGVzaGVldC5nbHlwaHMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZXM6IG1hcE9iamVjdCh0aGlzLnNvdXJjZUNhY2hlcywgKHNvdXJjZSkgPT4gc291cmNlLnNlcmlhbGl6ZSgpKSxcbiAgICAgICAgICAgIGxheWVyczogdGhpcy5fc2VyaWFsaXplTGF5ZXJzKHRoaXMuX29yZGVyKVxuICAgICAgICB9LCAodmFsdWUpID0+IHsgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7IH0pO1xuICAgIH1cblxuICAgIF91cGRhdGVMYXllcihsYXllcjogU3R5bGVMYXllcikge1xuICAgICAgICB0aGlzLl91cGRhdGVkTGF5ZXJzW2xheWVyLmlkXSA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UgJiYgIXRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSAncmVsb2FkJztcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV0ucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfZmxhdHRlbkFuZFNvcnRSZW5kZXJlZEZlYXR1cmVzKHNvdXJjZVJlc3VsdHM6IEFycmF5PGFueT4pIHtcbiAgICAgICAgLy8gRmVhdHVyZSBvcmRlciBpcyBjb21wbGljYXRlZC5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gZmVhdHVyZXMgaW4gdHdvIDJEIGxheWVycyBpcyBhbHdheXMgZGV0ZXJtaW5lZCBieSBsYXllciBvcmRlci5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gZmVhdHVyZXMgaW4gdHdvIDNEIGxheWVycyBpcyBhbHdheXMgZGV0ZXJtaW5lZCBieSBkZXB0aC5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gYSBmZWF0dXJlIGluIGEgMkQgbGF5ZXIgYW5kIGEgM0QgbGF5ZXIgaXMgdHJpY2t5OlxuICAgICAgICAvLyAgICAgIE1vc3Qgb2Z0ZW4gbGF5ZXIgb3JkZXIgZGV0ZXJtaW5lcyB0aGUgZmVhdHVyZSBvcmRlciBpbiB0aGlzIGNhc2UuIElmXG4gICAgICAgIC8vICAgICAgYSBsaW5lIGxheWVyIGlzIGFib3ZlIGEgZXh0cnVzaW9uIGxheWVyIHRoZSBsaW5lIGZlYXR1cmUgd2lsbCBiZSByZW5kZXJlZFxuICAgICAgICAvLyAgICAgIGFib3ZlIHRoZSBleHRydXNpb24uIElmIHRoZSBsaW5lIGxheWVyIGlzIGJlbG93IHRoZSBleHRydXNpb24gbGF5ZXIsXG4gICAgICAgIC8vICAgICAgaXQgd2lsbCBiZSByZW5kZXJlZCBiZWxvdyBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBUaGVyZSBpcyBhIHdlaXJkIGNhc2UgdGhvdWdoLlxuICAgICAgICAvLyAgICAgIFlvdSBoYXZlIGxheWVycyBpbiB0aGlzIG9yZGVyOiBleHRydXNpb25fbGF5ZXJfYSwgbGluZV9sYXllciwgZXh0cnVzaW9uX2xheWVyX2JcbiAgICAgICAgLy8gICAgICBFYWNoIGxheWVyIGhhcyBhIGZlYXR1cmUgdGhhdCBvdmVybGFwcyB0aGUgb3RoZXIgZmVhdHVyZXMuXG4gICAgICAgIC8vICAgICAgVGhlIGZlYXR1cmUgaW4gZXh0cnVzaW9uX2xheWVyX2EgaXMgY2xvc2VyIHRoYW4gdGhlIGZlYXR1cmUgaW4gZXh0cnVzaW9uX2xheWVyX2Igc28gaXQgaXMgcmVuZGVyZWQgYWJvdmUuXG4gICAgICAgIC8vICAgICAgVGhlIGZlYXR1cmUgaW4gbGluZV9sYXllciBpcyByZW5kZXJlZCBhYm92ZSBleHRydXNpb25fbGF5ZXJfYS5cbiAgICAgICAgLy8gICAgICBUaGlzIG1lYW5zIHRoYXQgdGhhdCB0aGUgbGluZV9sYXllciBmZWF0dXJlIGlzIGFib3ZlIHRoZSBleHRydXNpb25fbGF5ZXJfYiBmZWF0dXJlIGRlc3BpdGVcbiAgICAgICAgLy8gICAgICBpdCBiZWluZyBpbiBhbiBlYXJsaWVyIGxheWVyLlxuXG4gICAgICAgIGNvbnN0IGlzTGF5ZXIzRCA9IGxheWVySWQgPT4gdGhpcy5fbGF5ZXJzW2xheWVySWRdLnR5cGUgPT09ICdmaWxsLWV4dHJ1c2lvbic7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJJbmRleCA9IHt9O1xuICAgICAgICBjb25zdCBmZWF0dXJlczNEID0gW107XG4gICAgICAgIGZvciAobGV0IGwgPSB0aGlzLl9vcmRlci5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHRoaXMuX29yZGVyW2xdO1xuICAgICAgICAgICAgaWYgKGlzTGF5ZXIzRChsYXllcklkKSkge1xuICAgICAgICAgICAgICAgIGxheWVySW5kZXhbbGF5ZXJJZF0gPSBsO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlUmVzdWx0IG9mIHNvdXJjZVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5ZXJGZWF0dXJlcyA9IHNvdXJjZVJlc3VsdFtsYXllcklkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxheWVyRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmVhdHVyZVdyYXBwZXIgb2YgbGF5ZXJGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzM0QucHVzaChmZWF0dXJlV3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmZWF0dXJlczNELnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBiLmludGVyc2VjdGlvblogLSBhLmludGVyc2VjdGlvblo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG4gICAgICAgIGZvciAobGV0IGwgPSB0aGlzLl9vcmRlci5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHRoaXMuX29yZGVyW2xdO1xuXG4gICAgICAgICAgICBpZiAoaXNMYXllcjNEKGxheWVySWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGFsbCAzRCBmZWF0dXJlcyB0aGF0IGFyZSBpbiBvciBhYm92ZSB0aGUgY3VycmVudCBsYXllclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBmZWF0dXJlczNELmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcG1vc3QzRCA9IGZlYXR1cmVzM0RbaV0uZmVhdHVyZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxheWVySW5kZXhbdG9wbW9zdDNELmxheWVyLmlkXSA8IGwpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKHRvcG1vc3QzRCk7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzM0QucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVJlc3VsdCBvZiBzb3VyY2VSZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyRmVhdHVyZXMgPSBzb3VyY2VSZXN1bHRbbGF5ZXJJZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmVXcmFwcGVyIG9mIGxheWVyRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKGZlYXR1cmVXcmFwcGVyLmZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhxdWVyeUdlb21ldHJ5OiBhbnksIHBhcmFtczogYW55LCB0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUuZmlsdGVyLCAncXVlcnlSZW5kZXJlZEZlYXR1cmVzLmZpbHRlcicsIHBhcmFtcy5maWx0ZXIsIG51bGwsIHBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmNsdWRlZFNvdXJjZXMgPSB7fTtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLmxheWVycykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdwYXJhbWV0ZXJzLmxheWVycyBtdXN0IGJlIGFuIEFycmF5LicpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHBhcmFtcy5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbGF5ZXIgaXMgbm90IGluIHRoZSBzdHlsZS5sYXllcnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBxdWVyaWVkIGZvciBmZWF0dXJlcy5gKSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluY2x1ZGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVycyAmJiAhaW5jbHVkZWRTb3VyY2VzW2lkXSkgY29udGludWU7XG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAgICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICAvLyBJZiBhIHBsYWNlbWVudCBoYXMgcnVuLCBxdWVyeSBhZ2FpbnN0IGl0cyBDb2xsaXNpb25JbmRleFxuICAgICAgICAgICAgLy8gZm9yIHN5bWJvbCByZXN1bHRzLCBhbmQgdHJlYXQgaXQgYXMgYW4gZXh0cmEgc291cmNlIHRvIG1lcmdlXG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAgICAgcXVlcnlSZW5kZXJlZFN5bWJvbHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXMsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQuY29sbGlzaW9uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnJldGFpbmVkUXVlcnlEYXRhKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9mbGF0dGVuQW5kU29ydFJlbmRlcmVkRmVhdHVyZXMoc291cmNlUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJRDogc3RyaW5nLCBwYXJhbXM6ID97c291cmNlTGF5ZXI6ID9zdHJpbmcsIGZpbHRlcjogP0FycmF5PGFueT4sIHZhbGlkYXRlPzogYm9vbGVhbn0pIHtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlciwgJ3F1ZXJ5U291cmNlRmVhdHVyZXMuZmlsdGVyJywgcGFyYW1zLmZpbHRlciwgbnVsbCwgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW3NvdXJjZUlEXTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlID8gcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VDYWNoZSwgcGFyYW1zKSA6IFtdO1xuICAgIH1cblxuICAgIGFkZFNvdXJjZVR5cGUobmFtZTogc3RyaW5nLCBTb3VyY2VUeXBlOiBTb3VyY2VDbGFzcywgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGlmIChTdHlsZS5nZXRTb3VyY2VUeXBlKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBBIHNvdXJjZSB0eXBlIGNhbGxlZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBTdHlsZS5zZXRTb3VyY2VUeXBlKG5hbWUsIFNvdXJjZVR5cGUpO1xuXG4gICAgICAgIGlmICghU291cmNlVHlwZS53b3JrZXJTb3VyY2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ2xvYWRXb3JrZXJTb3VyY2UnLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdXJsOiBTb3VyY2VUeXBlLndvcmtlclNvdXJjZVVSTFxuICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgfVxuXG4gICAgc2V0TGlnaHQobGlnaHRPcHRpb25zOiBMaWdodFNwZWNpZmljYXRpb24sIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGlnaHQgPSB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgICAgIGxldCBfdXBkYXRlID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxpZ2h0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwobGlnaHRPcHRpb25zW2tleV0sIGxpZ2h0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfdXBkYXRlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIG5vdzogYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGV4dGVuZCh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICBkZWxheTogMFxuICAgICAgICAgICAgfSwgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5saWdodC5zZXRMaWdodChsaWdodE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZSh2YWxpZGF0ZTogVmFsaWRhdG9yLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgcHJvcHM6IGFueSwgb3B0aW9uczogeyB2YWxpZGF0ZT86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwgZXh0ZW5kKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSwgcHJvcHMpKSk7XG4gICAgfVxuXG4gICAgX3JlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc3ByaXRlUmVxdWVzdCkge1xuICAgICAgICAgICAgdGhpcy5fc3ByaXRlUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJ0bFRleHRQbHVnaW5FdmVudGVkLm9mZigncGx1Z2luQXZhaWxhYmxlJywgdGhpcy5fcnRsVGV4dFBsdWdpbkNhbGxiYWNrKTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLmNsZWFyVGlsZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgX2NsZWFyU291cmNlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLmNsZWFyVGlsZXMoKTtcbiAgICB9XG5cbiAgICBfcmVsb2FkU291cmNlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLnJlc3VtZSgpO1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0ucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZVNvdXJjZXModHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLnVwZGF0ZSh0cmFuc2Zvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2dlbmVyYXRlQ29sbGlzaW9uQm94ZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFNvdXJjZShpZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlUGxhY2VtZW50KHRyYW5zZm9ybTogVHJhbnNmb3JtLCBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sIGZhZGVEdXJhdGlvbjogbnVtYmVyLCBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBwbGFjZW1lbnRDb21taXR0ZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBsYXllclRpbGVzID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZUxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySURdO1xuICAgICAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSAhPT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoIWxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tzdHlsZUxheWVyLnNvdXJjZV07XG4gICAgICAgICAgICAgICAgbGF5ZXJUaWxlc1tzdHlsZUxheWVyLnNvdXJjZV0gPSBzb3VyY2VDYWNoZS5nZXRSZW5kZXJhYmxlSWRzKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGlkKSA9PiBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChpZCkpXG4gICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYi50aWxlSUQub3ZlcnNjYWxlZFogLSBhLnRpbGVJRC5vdmVyc2NhbGVkWikgfHwgKGEudGlsZUlELmlzTGVzc1RoYW4oYi50aWxlSUQpID8gLTEgOiAxKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxheWVyQnVja2V0c0NoYW5nZWQgPSB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4LmFkZExheWVyKHN0eWxlTGF5ZXIsIGxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdLCB0cmFuc2Zvcm0uY2VudGVyLmxuZyk7XG4gICAgICAgICAgICBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkIHx8IGxheWVyQnVja2V0c0NoYW5nZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleC5wcnVuZVVudXNlZExheWVycyh0aGlzLl9vcmRlcik7XG5cbiAgICAgICAgLy8gQW55dGhpbmcgdGhhdCBjaGFuZ2VzIG91ciBcImluIHByb2dyZXNzXCIgbGF5ZXIgYW5kIHRpbGUgaW5kaWNlcyByZXF1aXJlcyB1c1xuICAgICAgICAvLyB0byBzdGFydCBvdmVyLiBXaGVuIHdlIHN0YXJ0IG92ZXIsIHdlIGRvIGEgZnVsbCBwbGFjZW1lbnQgaW5zdGVhZCBvZiBpbmNyZW1lbnRhbFxuICAgICAgICAvLyB0byBwcmV2ZW50IHN0YXJ2YXRpb24uXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gcmVzdGFydCBwbGFjZW1lbnQgdG8ga2VlcCBsYXllciBpbmRpY2VzIGluIHN5bmMuXG4gICAgICAgIC8vIEFsc28gZm9yY2UgZnVsbCBwbGFjZW1lbnQgd2hlbiBmYWRlRHVyYXRpb24gPT09IDAgdG8gZW5zdXJlIHRoYXQgbmV3bHkgbG9hZGVkXG4gICAgICAgIC8vIHRpbGVzIHdpbGwgZnVsbHkgZGlzcGxheSBzeW1ib2xzIGluIHRoZWlyIGZpcnN0IGZyYW1lXG4gICAgICAgIGNvbnN0IGZvcmNlRnVsbFBsYWNlbWVudCA9IHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkIHx8IGZhZGVEdXJhdGlvbiA9PT0gMDtcblxuICAgICAgICBpZiAoZm9yY2VGdWxsUGxhY2VtZW50IHx8ICF0aGlzLnBhdXNlYWJsZVBsYWNlbWVudCB8fCAodGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkgJiYgIXRoaXMucGxhY2VtZW50LnN0aWxsUmVjZW50KGJyb3dzZXIubm93KCkpKSkge1xuICAgICAgICAgICAgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQgPSBuZXcgUGF1c2VhYmxlUGxhY2VtZW50KHRyYW5zZm9ybSwgdGhpcy5fb3JkZXIsIGZvcmNlRnVsbFBsYWNlbWVudCwgc2hvd0NvbGxpc2lvbkJveGVzLCBmYWRlRHVyYXRpb24sIGNyb3NzU291cmNlQ29sbGlzaW9ucywgdGhpcy5wbGFjZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSkge1xuICAgICAgICAgICAgLy8gdGhlIGxhc3QgcGxhY2VtZW50IGZpbmlzaGVkIHJ1bm5pbmcsIGJ1dCB0aGUgbmV4dCBvbmUgaGFzbsOiwoDCmXRcbiAgICAgICAgICAgIC8vIHN0YXJ0ZWQgeWV0IGJlY2F1c2Ugb2YgdGhlIGBzdGlsbFJlY2VudGAgY2hlY2sgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIC8vIGFib3ZlLCBzbyBtYXJrIGl0IHN0YWxlIHRvIGVuc3VyZSB0aGF0IHdlIHJlcXVlc3QgYW5vdGhlclxuICAgICAgICAgICAgLy8gcmVuZGVyIGZyYW1lXG4gICAgICAgICAgICB0aGlzLnBsYWNlbWVudC5zZXRTdGFsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuY29udGludWVQbGFjZW1lbnQodGhpcy5fb3JkZXIsIHRoaXMuX2xheWVycywgbGF5ZXJUaWxlcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50ID0gdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuY29tbWl0KGJyb3dzZXIubm93KCkpO1xuICAgICAgICAgICAgICAgIHBsYWNlbWVudENvbW1pdHRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzeW1ib2xCdWNrZXRzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBwbGFjZW1lbnQgZ2V0cyBzcGxpdCBvdmVyIG11bHRpcGxlIGZyYW1lcyBpdCBpcyBwb3NzaWJsZVxuICAgICAgICAgICAgICAgIC8vIHRoZXNlIGJ1Y2tldHMgd2VyZSBwcm9jZXNzZWQgYmVmb3JlIHRoZXkgd2VyZSBjaGFuZ2VkIGFuZCBzbyB0aGVcbiAgICAgICAgICAgICAgICAvLyBwbGFjZW1lbnQgaXMgYWxyZWFkeSBzdGFsZSB3aGlsZSBpdCBpcyBpbiBwcm9ncmVzc1xuICAgICAgICAgICAgICAgIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LnBsYWNlbWVudC5zZXRTdGFsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYWNlbWVudENvbW1pdHRlZCB8fCBzeW1ib2xCdWNrZXRzQ2hhbmdlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklEIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklEXTtcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVMYXllci50eXBlICE9PSAnc3ltYm9sJykgY29udGludWU7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQudXBkYXRlTGF5ZXJPcGFjaXRpZXMoc3R5bGVMYXllciwgbGF5ZXJUaWxlc1tzdHlsZUxheWVyLnNvdXJjZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbmVlZHNSZW5kZXIgaXMgZmFsc2Ugd2hlbiB3ZSBoYXZlIGp1c3QgZmluaXNoZWQgYSBwbGFjZW1lbnQgdGhhdCBkaWRuJ3QgY2hhbmdlIHRoZSB2aXNpYmlsaXR5IG9mIGFueSBzeW1ib2xzXG4gICAgICAgIGNvbnN0IG5lZWRzUmVyZW5kZXIgPSAhdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkgfHwgdGhpcy5wbGFjZW1lbnQuaGFzVHJhbnNpdGlvbnMoYnJvd3Nlci5ub3coKSk7XG4gICAgICAgIHJldHVybiBuZWVkc1JlcmVuZGVyO1xuICAgIH1cblxuICAgIF9yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0ucmVsZWFzZVN5bWJvbEZhZGVUaWxlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbGJhY2tzIGZyb20gd2ViIHdvcmtlcnNcblxuICAgIGdldEltYWdlcyhtYXBJZDogc3RyaW5nLCBwYXJhbXM6IHtpY29uczogQXJyYXk8c3RyaW5nPn0sIGNhbGxiYWNrOiBDYWxsYmFjazx7W3N0cmluZ106IFN0eWxlSW1hZ2V9Pikge1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5nZXRJbWFnZXMocGFyYW1zLmljb25zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0R2x5cGhzKG1hcElkOiBzdHJpbmcsIHBhcmFtczoge3N0YWNrczoge1tzdHJpbmddOiBBcnJheTxudW1iZXI+fX0sIGNhbGxiYWNrOiBDYWxsYmFjazx7W3N0cmluZ106IHtbbnVtYmVyXTogP1N0eWxlR2x5cGh9fT4pIHtcbiAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXIuZ2V0R2x5cGhzKHBhcmFtcy5zdGFja3MsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBnZXRSZXNvdXJjZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgICAgIHJldHVybiBtYWtlUmVxdWVzdChwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG59XG5cblN0eWxlLmdldFNvdXJjZVR5cGUgPSBnZXRTb3VyY2VUeXBlO1xuU3R5bGUuc2V0U291cmNlVHlwZSA9IHNldFNvdXJjZVR5cGU7XG5TdHlsZS5yZWdpc3RlckZvclBsdWdpbkF2YWlsYWJpbGl0eSA9IHJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5O1xuXG5leHBvcnQgZGVmYXVsdCBTdHlsZTtcbiIsIi8vIEBmbG93XG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUxheW91dChbXG4gICAgeyBuYW1lOiAnYV9wb3MnLCB0eXBlOiAnSW50MTYnLCBjb21wb25lbnRzOiAyIH1cbl0pO1xuIiwiXG4vLyBEaXNhYmxlIEZsb3cgYW5ub3RhdGlvbnMgaGVyZSBiZWNhdXNlIEZsb3cgZG9lc24ndCBzdXBwb3J0IGltcG9ydGluZyBHTFNMIGZpbGVzXG4vKiBlc2xpbnQtZGlzYWJsZSBmbG93dHlwZS9yZXF1aXJlLXZhbGlkLWZpbGUtYW5ub3RhdGlvbiAqL1xuXG5pbXBvcnQgcHJlbHVkZUZyYWcgZnJvbSAnLi9fcHJlbHVkZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBwcmVsdWRlVmVydCBmcm9tICcuL19wcmVsdWRlLnZlcnRleC5nbHNsJztcbmltcG9ydCBiYWNrZ3JvdW5kRnJhZyBmcm9tICcuL2JhY2tncm91bmQuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYmFja2dyb3VuZFZlcnQgZnJvbSAnLi9iYWNrZ3JvdW5kLnZlcnRleC5nbHNsJztcbmltcG9ydCBiYWNrZ3JvdW5kUGF0dGVybkZyYWcgZnJvbSAnLi9iYWNrZ3JvdW5kX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYmFja2dyb3VuZFBhdHRlcm5WZXJ0IGZyb20gJy4vYmFja2dyb3VuZF9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBjaXJjbGVGcmFnIGZyb20gJy4vY2lyY2xlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGNpcmNsZVZlcnQgZnJvbSAnLi9jaXJjbGUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGNsaXBwaW5nTWFza0ZyYWcgZnJvbSAnLi9jbGlwcGluZ19tYXNrLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGNsaXBwaW5nTWFza1ZlcnQgZnJvbSAnLi9jbGlwcGluZ19tYXNrLnZlcnRleC5nbHNsJztcbmltcG9ydCBoZWF0bWFwRnJhZyBmcm9tICcuL2hlYXRtYXAuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgaGVhdG1hcFZlcnQgZnJvbSAnLi9oZWF0bWFwLnZlcnRleC5nbHNsJztcbmltcG9ydCBoZWF0bWFwVGV4dHVyZUZyYWcgZnJvbSAnLi9oZWF0bWFwX3RleHR1cmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgaGVhdG1hcFRleHR1cmVWZXJ0IGZyb20gJy4vaGVhdG1hcF90ZXh0dXJlLnZlcnRleC5nbHNsJztcbmltcG9ydCBjb2xsaXNpb25Cb3hGcmFnIGZyb20gJy4vY29sbGlzaW9uX2JveC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjb2xsaXNpb25Cb3hWZXJ0IGZyb20gJy4vY29sbGlzaW9uX2JveC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY29sbGlzaW9uQ2lyY2xlRnJhZyBmcm9tICcuL2NvbGxpc2lvbl9jaXJjbGUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgY29sbGlzaW9uQ2lyY2xlVmVydCBmcm9tICcuL2NvbGxpc2lvbl9jaXJjbGUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGRlYnVnRnJhZyBmcm9tICcuL2RlYnVnLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGRlYnVnVmVydCBmcm9tICcuL2RlYnVnLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsRnJhZyBmcm9tICcuL2ZpbGwuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbFZlcnQgZnJvbSAnLi9maWxsLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsT3V0bGluZUZyYWcgZnJvbSAnLi9maWxsX291dGxpbmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbE91dGxpbmVWZXJ0IGZyb20gJy4vZmlsbF9vdXRsaW5lLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsT3V0bGluZVBhdHRlcm5GcmFnIGZyb20gJy4vZmlsbF9vdXRsaW5lX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbE91dGxpbmVQYXR0ZXJuVmVydCBmcm9tICcuL2ZpbGxfb3V0bGluZV9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsUGF0dGVybkZyYWcgZnJvbSAnLi9maWxsX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbFBhdHRlcm5WZXJ0IGZyb20gJy4vZmlsbF9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uRnJhZyBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxFeHRydXNpb25WZXJ0IGZyb20gJy4vZmlsbF9leHRydXNpb24udmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZpbGxFeHRydXNpb25QYXR0ZXJuRnJhZyBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbEV4dHJ1c2lvblBhdHRlcm5WZXJ0IGZyb20gJy4vZmlsbF9leHRydXNpb25fcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgaGlsbHNoYWRlUHJlcGFyZUZyYWcgZnJvbSAnLi9oaWxsc2hhZGVfcHJlcGFyZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBoaWxsc2hhZGVQcmVwYXJlVmVydCBmcm9tICcuL2hpbGxzaGFkZV9wcmVwYXJlLnZlcnRleC5nbHNsJztcbmltcG9ydCBoaWxsc2hhZGVGcmFnIGZyb20gJy4vaGlsbHNoYWRlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGhpbGxzaGFkZVZlcnQgZnJvbSAnLi9oaWxsc2hhZGUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGxpbmVGcmFnIGZyb20gJy4vbGluZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBsaW5lVmVydCBmcm9tICcuL2xpbmUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGxpbmVHcmFkaWVudEZyYWcgZnJvbSAnLi9saW5lX2dyYWRpZW50LmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpbmVHcmFkaWVudFZlcnQgZnJvbSAnLi9saW5lX2dyYWRpZW50LnZlcnRleC5nbHNsJztcbmltcG9ydCBsaW5lUGF0dGVybkZyYWcgZnJvbSAnLi9saW5lX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbGluZVBhdHRlcm5WZXJ0IGZyb20gJy4vbGluZV9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBsaW5lU0RGRnJhZyBmcm9tICcuL2xpbmVfc2RmLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpbmVTREZWZXJ0IGZyb20gJy4vbGluZV9zZGYudmVydGV4Lmdsc2wnO1xuaW1wb3J0IHJhc3RlckZyYWcgZnJvbSAnLi9yYXN0ZXIuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgcmFzdGVyVmVydCBmcm9tICcuL3Jhc3Rlci52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgc3ltYm9sSWNvbkZyYWcgZnJvbSAnLi9zeW1ib2xfaWNvbi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBzeW1ib2xJY29uVmVydCBmcm9tICcuL3N5bWJvbF9pY29uLnZlcnRleC5nbHNsJztcbmltcG9ydCBzeW1ib2xTREZGcmFnIGZyb20gJy4vc3ltYm9sX3NkZi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBzeW1ib2xTREZWZXJ0IGZyb20gJy4vc3ltYm9sX3NkZi52ZXJ0ZXguZ2xzbCc7XG5cbmV4cG9ydCBjb25zdCBwcmVsdWRlID0gY29tcGlsZShwcmVsdWRlRnJhZywgcHJlbHVkZVZlcnQpO1xuZXhwb3J0IGNvbnN0IGJhY2tncm91bmQgPSBjb21waWxlKGJhY2tncm91bmRGcmFnLCBiYWNrZ3JvdW5kVmVydCk7XG5leHBvcnQgY29uc3QgYmFja2dyb3VuZFBhdHRlcm4gPSBjb21waWxlKGJhY2tncm91bmRQYXR0ZXJuRnJhZywgYmFja2dyb3VuZFBhdHRlcm5WZXJ0KTtcbmV4cG9ydCBjb25zdCBjaXJjbGUgPSBjb21waWxlKGNpcmNsZUZyYWcsIGNpcmNsZVZlcnQpO1xuZXhwb3J0IGNvbnN0IGNsaXBwaW5nTWFzayA9IGNvbXBpbGUoY2xpcHBpbmdNYXNrRnJhZywgY2xpcHBpbmdNYXNrVmVydCk7XG5leHBvcnQgY29uc3QgaGVhdG1hcCA9IGNvbXBpbGUoaGVhdG1hcEZyYWcsIGhlYXRtYXBWZXJ0KTtcbmV4cG9ydCBjb25zdCBoZWF0bWFwVGV4dHVyZSA9IGNvbXBpbGUoaGVhdG1hcFRleHR1cmVGcmFnLCBoZWF0bWFwVGV4dHVyZVZlcnQpO1xuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkJveCA9IGNvbXBpbGUoY29sbGlzaW9uQm94RnJhZywgY29sbGlzaW9uQm94VmVydCk7XG5leHBvcnQgY29uc3QgY29sbGlzaW9uQ2lyY2xlID0gY29tcGlsZShjb2xsaXNpb25DaXJjbGVGcmFnLCBjb2xsaXNpb25DaXJjbGVWZXJ0KTtcbmV4cG9ydCBjb25zdCBkZWJ1ZyA9IGNvbXBpbGUoZGVidWdGcmFnLCBkZWJ1Z1ZlcnQpO1xuZXhwb3J0IGNvbnN0IGZpbGwgPSBjb21waWxlKGZpbGxGcmFnLCBmaWxsVmVydCk7XG5leHBvcnQgY29uc3QgZmlsbE91dGxpbmUgPSBjb21waWxlKGZpbGxPdXRsaW5lRnJhZywgZmlsbE91dGxpbmVWZXJ0KTtcbmV4cG9ydCBjb25zdCBmaWxsT3V0bGluZVBhdHRlcm4gPSBjb21waWxlKGZpbGxPdXRsaW5lUGF0dGVybkZyYWcsIGZpbGxPdXRsaW5lUGF0dGVyblZlcnQpO1xuZXhwb3J0IGNvbnN0IGZpbGxQYXR0ZXJuID0gY29tcGlsZShmaWxsUGF0dGVybkZyYWcsIGZpbGxQYXR0ZXJuVmVydCk7XG5leHBvcnQgY29uc3QgZmlsbEV4dHJ1c2lvbiA9IGNvbXBpbGUoZmlsbEV4dHJ1c2lvbkZyYWcsIGZpbGxFeHRydXNpb25WZXJ0KTtcbmV4cG9ydCBjb25zdCBmaWxsRXh0cnVzaW9uUGF0dGVybiA9IGNvbXBpbGUoZmlsbEV4dHJ1c2lvblBhdHRlcm5GcmFnLCBmaWxsRXh0cnVzaW9uUGF0dGVyblZlcnQpO1xuZXhwb3J0IGNvbnN0IGhpbGxzaGFkZVByZXBhcmUgPSBjb21waWxlKGhpbGxzaGFkZVByZXBhcmVGcmFnLCBoaWxsc2hhZGVQcmVwYXJlVmVydCk7XG5leHBvcnQgY29uc3QgaGlsbHNoYWRlID0gY29tcGlsZShoaWxsc2hhZGVGcmFnLCBoaWxsc2hhZGVWZXJ0KTtcbmV4cG9ydCBjb25zdCBsaW5lID0gY29tcGlsZShsaW5lRnJhZywgbGluZVZlcnQpO1xuZXhwb3J0IGNvbnN0IGxpbmVHcmFkaWVudCA9IGNvbXBpbGUobGluZUdyYWRpZW50RnJhZywgbGluZUdyYWRpZW50VmVydCk7XG5leHBvcnQgY29uc3QgbGluZVBhdHRlcm4gPSBjb21waWxlKGxpbmVQYXR0ZXJuRnJhZywgbGluZVBhdHRlcm5WZXJ0KTtcbmV4cG9ydCBjb25zdCBsaW5lU0RGID0gY29tcGlsZShsaW5lU0RGRnJhZywgbGluZVNERlZlcnQpO1xuZXhwb3J0IGNvbnN0IHJhc3RlciA9IGNvbXBpbGUocmFzdGVyRnJhZywgcmFzdGVyVmVydCk7XG5leHBvcnQgY29uc3Qgc3ltYm9sSWNvbiA9IGNvbXBpbGUoc3ltYm9sSWNvbkZyYWcsIHN5bWJvbEljb25WZXJ0KTtcbmV4cG9ydCBjb25zdCBzeW1ib2xTREYgPSBjb21waWxlKHN5bWJvbFNERkZyYWcsIHN5bWJvbFNERlZlcnQpO1xuXG4vLyBFeHBhbmQgI3ByYWdtYXMgdG8gI2lmZGVmcy5cblxuZnVuY3Rpb24gY29tcGlsZShmcmFnbWVudFNvdXJjZSwgdmVydGV4U291cmNlKSB7XG4gICAgY29uc3QgcmUgPSAvI3ByYWdtYSBtYXBib3g6IChbXFx3XSspIChbXFx3XSspIChbXFx3XSspIChbXFx3XSspL2c7XG5cbiAgICBjb25zdCBmcmFnbWVudFByYWdtYXMgPSB7fTtcblxuICAgIGZyYWdtZW50U291cmNlID0gZnJhZ21lbnRTb3VyY2UucmVwbGFjZShyZSwgKG1hdGNoLCBvcGVyYXRpb24sIHByZWNpc2lvbiwgdHlwZSwgbmFtZSkgPT4ge1xuICAgICAgICBmcmFnbWVudFByYWdtYXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnZGVmaW5lJykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG52YXJ5aW5nICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX07XG4jZWxzZVxudW5pZm9ybSAke3ByZWNpc2lvbn0gJHt0eXBlfSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgIH0gZWxzZSAvKiBpZiAob3BlcmF0aW9uID09PSAnaW5pdGlhbGl6ZScpICovIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4jaWZkZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmVydGV4U291cmNlID0gdmVydGV4U291cmNlLnJlcGxhY2UocmUsIChtYXRjaCwgb3BlcmF0aW9uLCBwcmVjaXNpb24sIHR5cGUsIG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgYXR0clR5cGUgPSB0eXBlID09PSAnZmxvYXQnID8gJ3ZlYzInIDogJ3ZlYzQnO1xuICAgICAgICBjb25zdCB1bnBhY2tUeXBlID0gbmFtZS5tYXRjaCgvY29sb3IvKSA/ICdjb2xvcicgOiBhdHRyVHlwZTtcblxuICAgICAgICBpZiAoZnJhZ21lbnRQcmFnbWFzW25hbWVdKSB7XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnZGVmaW5lJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxudW5pZm9ybSBsb3dwIGZsb2F0IHVfJHtuYW1lfV90O1xuYXR0cmlidXRlICR7cHJlY2lzaW9ufSAke2F0dHJUeXBlfSBhXyR7bmFtZX07XG52YXJ5aW5nICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX07XG4jZWxzZVxudW5pZm9ybSAke3ByZWNpc2lvbn0gJHt0eXBlfSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICB9IGVsc2UgLyogaWYgKG9wZXJhdGlvbiA9PT0gJ2luaXRpYWxpemUnKSAqLyB7XG4gICAgICAgICAgICAgICAgaWYgKHVucGFja1R5cGUgPT09ICd2ZWM0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyB2ZWM0IGF0dHJpYnV0ZXMgYXJlIG9ubHkgdXNlZCBmb3IgY3Jvc3MtZmFkZWQgcHJvcGVydGllcywgYW5kIGFyZSBub3QgcGFja2VkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7bmFtZX0gPSBhXyR7bmFtZX07XG4jZWxzZVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG4gICAgJHtuYW1lfSA9IHVucGFja19taXhfJHt1bnBhY2tUeXBlfShhXyR7bmFtZX0sIHVfJHtuYW1lfV90KTtcbiNlbHNlXG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnZGVmaW5lJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxudW5pZm9ybSBsb3dwIGZsb2F0IHVfJHtuYW1lfV90O1xuYXR0cmlidXRlICR7cHJlY2lzaW9ufSAke2F0dHJUeXBlfSBhXyR7bmFtZX07XG4jZWxzZVxudW5pZm9ybSAke3ByZWNpc2lvbn0gJHt0eXBlfSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICB9IGVsc2UgLyogaWYgKG9wZXJhdGlvbiA9PT0gJ2luaXRpYWxpemUnKSAqLyB7XG4gICAgICAgICAgICAgICAgaWYgKHVucGFja1R5cGUgPT09ICd2ZWM0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyB2ZWM0IGF0dHJpYnV0ZXMgYXJlIG9ubHkgdXNlZCBmb3IgY3Jvc3MtZmFkZWQgcHJvcGVydGllcywgYW5kIGFyZSBub3QgcGFja2VkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSBhXyR7bmFtZX07XG4jZWxzZVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIC8qICove1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdW5wYWNrX21peF8ke3VucGFja1R5cGV9KGFfJHtuYW1lfSwgdV8ke25hbWV9X3QpO1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtmcmFnbWVudFNvdXJjZSwgdmVydGV4U291cmNlfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgUHJvZ3JhbSBmcm9tICcuL3Byb2dyYW0nO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vZ2wvaW5kZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5cbmNsYXNzIFZlcnRleEFycmF5T2JqZWN0IHtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIGJvdW5kUHJvZ3JhbTogP1Byb2dyYW08Kj47XG4gICAgYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgYm91bmRQYWludFZlcnRleEJ1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj47XG4gICAgYm91bmRJbmRleEJ1ZmZlcjogP0luZGV4QnVmZmVyO1xuICAgIGJvdW5kVmVydGV4T2Zmc2V0OiA/bnVtYmVyO1xuICAgIGJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyOiA/VmVydGV4QnVmZmVyO1xuICAgIHZhbzogYW55O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYm91bmRQcm9ncmFtID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZExheW91dFZlcnRleEJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5ib3VuZEluZGV4QnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy52YW8gPSBudWxsO1xuICAgIH1cblxuICAgIGJpbmQoY29udGV4dDogQ29udGV4dCxcbiAgICAgICAgIHByb2dyYW06IFByb2dyYW08Kj4sXG4gICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcixcbiAgICAgICAgIHBhaW50VmVydGV4QnVmZmVyczogQXJyYXk8VmVydGV4QnVmZmVyPixcbiAgICAgICAgIGluZGV4QnVmZmVyOiA/SW5kZXhCdWZmZXIsXG4gICAgICAgICB2ZXJ0ZXhPZmZzZXQ6ID9udW1iZXIsXG4gICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyLFxuICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjI6ID9WZXJ0ZXhCdWZmZXIpIHtcblxuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgICAgIGxldCBwYWludEJ1ZmZlcnNEaWZmZXIgPSB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzLmxlbmd0aCAhPT0gcGFpbnRWZXJ0ZXhCdWZmZXJzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYWludEJ1ZmZlcnNEaWZmZXIgJiYgaSA8IHBhaW50VmVydGV4QnVmZmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnNbaV0gIT09IHBhaW50VmVydGV4QnVmZmVyc1tpXSkge1xuICAgICAgICAgICAgICAgIHBhaW50QnVmZmVyc0RpZmZlciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0ZyZXNoQmluZFJlcXVpcmVkID0gKFxuICAgICAgICAgICAgIXRoaXMudmFvIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kUHJvZ3JhbSAhPT0gcHJvZ3JhbSB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZExheW91dFZlcnRleEJ1ZmZlciAhPT0gbGF5b3V0VmVydGV4QnVmZmVyIHx8XG4gICAgICAgICAgICBwYWludEJ1ZmZlcnNEaWZmZXIgfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRJbmRleEJ1ZmZlciAhPT0gaW5kZXhCdWZmZXIgfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQgIT09IHZlcnRleE9mZnNldCB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIgIT09IGR5bmFtaWNWZXJ0ZXhCdWZmZXIgfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyMiAhPT0gZHluYW1pY1ZlcnRleEJ1ZmZlcjJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QgfHwgaXNGcmVzaEJpbmRSZXF1aXJlZCkge1xuICAgICAgICAgICAgdGhpcy5mcmVzaEJpbmQocHJvZ3JhbSwgbGF5b3V0VmVydGV4QnVmZmVyLCBwYWludFZlcnRleEJ1ZmZlcnMsIGluZGV4QnVmZmVyLCB2ZXJ0ZXhPZmZzZXQsIGR5bmFtaWNWZXJ0ZXhCdWZmZXIsIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuYmluZFZlcnRleEFycmF5T0VTLnNldCh0aGlzLnZhbyk7XG5cbiAgICAgICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGJ1ZmZlciBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQuIFJlYmluZCB0byB1cGxvYWQgZGF0YS5cbiAgICAgICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGluZGV4QnVmZmVyICYmIGluZGV4QnVmZmVyLmR5bmFtaWNEcmF3KSB7XG4gICAgICAgICAgICAgICAgaW5kZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcjIpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMi5iaW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmcmVzaEJpbmQocHJvZ3JhbTogUHJvZ3JhbTwqPixcbiAgICAgICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICAgIHBhaW50VmVydGV4QnVmZmVyczogQXJyYXk8VmVydGV4QnVmZmVyPixcbiAgICAgICAgICAgICAgaW5kZXhCdWZmZXI6ID9JbmRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgdmVydGV4T2Zmc2V0OiA/bnVtYmVyLFxuICAgICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMjogP1ZlcnRleEJ1ZmZlcikge1xuICAgICAgICBsZXQgbnVtUHJldkF0dHJpYnV0ZXM7XG4gICAgICAgIGNvbnN0IG51bU5leHRBdHRyaWJ1dGVzID0gcHJvZ3JhbS5udW1BdHRyaWJ1dGVzO1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICBpZiAoY29udGV4dC5leHRWZXJ0ZXhBcnJheU9iamVjdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFvKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMudmFvID0gY29udGV4dC5leHRWZXJ0ZXhBcnJheU9iamVjdC5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpO1xuICAgICAgICAgICAgY29udGV4dC5iaW5kVmVydGV4QXJyYXlPRVMuc2V0KHRoaXMudmFvKTtcbiAgICAgICAgICAgIG51bVByZXZBdHRyaWJ1dGVzID0gMDtcblxuICAgICAgICAgICAgLy8gc3RvcmUgdGhlIGFyZ3VtZW50cyBzbyB0aGF0IHdlIGNhbiB2ZXJpZnkgdGhlbSB3aGVuIHRoZSB2YW8gaXMgYm91bmQgYWdhaW5cbiAgICAgICAgICAgIHRoaXMuYm91bmRQcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgICAgIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgPSBsYXlvdXRWZXJ0ZXhCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzID0gcGFpbnRWZXJ0ZXhCdWZmZXJzO1xuICAgICAgICAgICAgdGhpcy5ib3VuZEluZGV4QnVmZmVyID0gaW5kZXhCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmJvdW5kVmVydGV4T2Zmc2V0ID0gdmVydGV4T2Zmc2V0O1xuICAgICAgICAgICAgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIgPSBkeW5hbWljVmVydGV4QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyID0gZHluYW1pY1ZlcnRleEJ1ZmZlcjI7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG51bVByZXZBdHRyaWJ1dGVzID0gY29udGV4dC5jdXJyZW50TnVtQXR0cmlidXRlcyB8fCAwO1xuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIGFsbCBhdHRyaWJ1dGVzIGZyb20gdGhlIHByZXZpb3VzIHByb2dyYW0gdGhhdCBhcmVuJ3QgdXNlZCBpblxuICAgICAgICAgICAgLy8gdGhlIG5ldyBwcm9ncmFtLiBOb3RlOiBhdHRyaWJ1dGUgaW5kaWNlcyBhcmUgKm5vdCogcHJvZ3JhbSBzcGVjaWZpYyFcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBudW1OZXh0QXR0cmlidXRlczsgaSA8IG51bVByZXZBdHRyaWJ1dGVzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBXZWJHTCBicmVha3MgaWYgeW91IGRpc2FibGUgYXR0cmlidXRlIDAuXG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yMDMwNTIzMVxuICAgICAgICAgICAgICAgIGFzc2VydChpICE9PSAwKTtcbiAgICAgICAgICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIuZW5hYmxlQXR0cmlidXRlcyhnbCwgcHJvZ3JhbSk7XG4gICAgICAgIGZvciAoY29uc3QgdmVydGV4QnVmZmVyIG9mIHBhaW50VmVydGV4QnVmZmVycykge1xuICAgICAgICAgICAgdmVydGV4QnVmZmVyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIuZW5hYmxlQXR0cmlidXRlcyhnbCwgcHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIyKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMi5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheW91dFZlcnRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgIGxheW91dFZlcnRleEJ1ZmZlci5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgZm9yIChjb25zdCB2ZXJ0ZXhCdWZmZXIgb2YgcGFpbnRWZXJ0ZXhCdWZmZXJzKSB7XG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICAgICAgdmVydGV4QnVmZmVyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlci5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGluZGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcjIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLmJpbmQoKTtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5jdXJyZW50TnVtQXR0cmlidXRlcyA9IG51bU5leHRBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbykge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0LmRlbGV0ZVZlcnRleEFycmF5T0VTKHRoaXMudmFvKTtcbiAgICAgICAgICAgIHRoaXMudmFvID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVydGV4QXJyYXlPYmplY3Q7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3ByZWx1ZGV9IGZyb20gJy4uL3NoYWRlcnMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL3ZlcnRleF9hcnJheV9vYmplY3QnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5cbmltcG9ydCB0eXBlIFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50JztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgdHlwZSBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IHR5cGUgQ29sb3JNb2RlIGZyb20gJy4uL2dsL2NvbG9yX21vZGUnO1xuaW1wb3J0IHR5cGUgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtQmluZGluZ3MsIFVuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIHtCaW5kZXJVbmlmb3JtfSBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5cbmV4cG9ydCB0eXBlIERyYXdNb2RlID1cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTElORVMnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdUUklBTkdMRVMnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdMSU5FX1NUUklQJz47XG5cbmNsYXNzIFByb2dyYW08VXM6IFVuaWZvcm1CaW5kaW5ncz4ge1xuICAgIHByb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgICBhdHRyaWJ1dGVzOiB7W3N0cmluZ106IG51bWJlcn07XG4gICAgbnVtQXR0cmlidXRlczogbnVtYmVyO1xuICAgIGZpeGVkVW5pZm9ybXM6IFVzO1xuICAgIGJpbmRlclVuaWZvcm1zOiBBcnJheTxCaW5kZXJVbmlmb3JtPjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsXG4gICAgICAgICAgICAgICAgc291cmNlOiB7ZnJhZ21lbnRTb3VyY2U6IHN0cmluZywgdmVydGV4U291cmNlOiBzdHJpbmd9LFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IFByb2dyYW1Db25maWd1cmF0aW9uLFxuICAgICAgICAgICAgICAgIGZpeGVkVW5pZm9ybXM6IChDb250ZXh0LCBVbmlmb3JtTG9jYXRpb25zKSA9PiBVcyxcbiAgICAgICAgICAgICAgICBzaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cbiAgICAgICAgY29uc3QgZGVmaW5lcyA9IGNvbmZpZ3VyYXRpb24uZGVmaW5lcygpO1xuICAgICAgICBpZiAoc2hvd092ZXJkcmF3SW5zcGVjdG9yKSB7XG4gICAgICAgICAgICBkZWZpbmVzLnB1c2goJyNkZWZpbmUgT1ZFUkRSQVdfSU5TUEVDVE9SOycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnJhZ21lbnRTb3VyY2UgPSBkZWZpbmVzLmNvbmNhdChwcmVsdWRlLmZyYWdtZW50U291cmNlLCBzb3VyY2UuZnJhZ21lbnRTb3VyY2UpLmpvaW4oJ1xcbicpO1xuICAgICAgICBjb25zdCB2ZXJ0ZXhTb3VyY2UgPSBkZWZpbmVzLmNvbmNhdChwcmVsdWRlLnZlcnRleFNvdXJjZSwgc291cmNlLnZlcnRleFNvdXJjZSkuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgICAgIGdsLnNoYWRlclNvdXJjZShmcmFnbWVudFNoYWRlciwgZnJhZ21lbnRTb3VyY2UpO1xuICAgICAgICBnbC5jb21waWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgYXNzZXJ0KGdsLmdldFNoYWRlclBhcmFtZXRlcihmcmFnbWVudFNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpLCAoZ2wuZ2V0U2hhZGVySW5mb0xvZyhmcmFnbWVudFNoYWRlcik6IGFueSkpO1xuICAgICAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7XG5cbiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICBnbC5zaGFkZXJTb3VyY2UodmVydGV4U2hhZGVyLCB2ZXJ0ZXhTb3VyY2UpO1xuICAgICAgICBnbC5jb21waWxlU2hhZGVyKHZlcnRleFNoYWRlcik7XG4gICAgICAgIGFzc2VydChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIodmVydGV4U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyksIChnbC5nZXRTaGFkZXJJbmZvTG9nKHZlcnRleFNoYWRlcik6IGFueSkpO1xuICAgICAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpO1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGJpbmQgbGF5b3V0IGF0dHJpYnV0ZXMgaW4gdGhlIG9yZGVyIGRlZmluZWQgYnkgdGhlaXJcbiAgICAgICAgLy8gUHJvZ3JhbUludGVyZmFjZSBzbyB0aGF0IHdlIGRvbid0IGR5bmFtaWNhbGx5IGxpbmsgYW4gdW51c2VkXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBhdCBwb3NpdGlvbiAwLCB3aGljaCBjYW4gY2F1c2UgcmVuZGVyaW5nIHRvIGZhaWwgZm9yIGFuXG4gICAgICAgIC8vIGVudGlyZSBsYXllciAoc2VlICM0NjA3LCAjNDcyOClcbiAgICAgICAgY29uc3QgbGF5b3V0QXR0cmlidXRlcyA9IGNvbmZpZ3VyYXRpb24ubGF5b3V0QXR0cmlidXRlcyB8fCBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXlvdXRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBnbC5iaW5kQXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCBpLCBsYXlvdXRBdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wubGlua1Byb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgICAgICAgYXNzZXJ0KGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyksIChnbC5nZXRQcm9ncmFtSW5mb0xvZyh0aGlzLnByb2dyYW0pOiBhbnkpKTtcblxuICAgICAgICB0aGlzLm51bUF0dHJpYnV0ZXMgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMpO1xuXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICBjb25zdCB1bmlmb3JtTG9jYXRpb25zID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bUF0dHJpYnV0ZXM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZ2wuZ2V0QWN0aXZlQXR0cmliKHRoaXMucHJvZ3JhbSwgaSk7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZS5uYW1lXSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbnVtVW5pZm9ybXMgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgZ2wuQUNUSVZFX1VOSUZPUk1TKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Vbmlmb3JtczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybSh0aGlzLnByb2dyYW0sIGkpO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0pIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtTG9jYXRpb25zW3VuaWZvcm0ubmFtZV0gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCB1bmlmb3JtLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXhlZFVuaWZvcm1zID0gZml4ZWRVbmlmb3Jtcyhjb250ZXh0LCB1bmlmb3JtTG9jYXRpb25zKTtcbiAgICAgICAgdGhpcy5iaW5kZXJVbmlmb3JtcyA9IGNvbmZpZ3VyYXRpb24uZ2V0VW5pZm9ybXMoY29udGV4dCwgdW5pZm9ybUxvY2F0aW9ucyk7XG4gICAgfVxuXG4gICAgZHJhdyhjb250ZXh0OiBDb250ZXh0LFxuICAgICAgICAgZHJhd01vZGU6IERyYXdNb2RlLFxuICAgICAgICAgZGVwdGhNb2RlOiAkUmVhZE9ubHk8RGVwdGhNb2RlPixcbiAgICAgICAgIHN0ZW5jaWxNb2RlOiAkUmVhZE9ubHk8U3RlbmNpbE1vZGU+LFxuICAgICAgICAgY29sb3JNb2RlOiAkUmVhZE9ubHk8Q29sb3JNb2RlPixcbiAgICAgICAgIGN1bGxGYWNlTW9kZTogJFJlYWRPbmx5PEN1bGxGYWNlTW9kZT4sXG4gICAgICAgICB1bmlmb3JtVmFsdWVzOiBVbmlmb3JtVmFsdWVzPFVzPixcbiAgICAgICAgIGxheWVySUQ6IHN0cmluZyxcbiAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgICAgICAgaW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyLFxuICAgICAgICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3IsXG4gICAgICAgICBjdXJyZW50UHJvcGVydGllczogYW55LFxuICAgICAgICAgem9vbTogP251bWJlcixcbiAgICAgICAgIGNvbmZpZ3VyYXRpb246ID9Qcm9ncmFtQ29uZmlndXJhdGlvbixcbiAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXI6ID9WZXJ0ZXhCdWZmZXIsXG4gICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyMjogP1ZlcnRleEJ1ZmZlcikge1xuXG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICBjb250ZXh0LnByb2dyYW0uc2V0KHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKGRlcHRoTW9kZSk7XG4gICAgICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUoc3RlbmNpbE1vZGUpO1xuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShjb2xvck1vZGUpO1xuICAgICAgICBjb250ZXh0LnNldEN1bGxGYWNlKGN1bGxGYWNlTW9kZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMuZml4ZWRVbmlmb3Jtcykge1xuICAgICAgICAgICAgdGhpcy5maXhlZFVuaWZvcm1zW25hbWVdLnNldCh1bmlmb3JtVmFsdWVzW25hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFVuaWZvcm1zKGNvbnRleHQsIHRoaXMuYmluZGVyVW5pZm9ybXMsIGN1cnJlbnRQcm9wZXJ0aWVzLCB7em9vbTogKHpvb206IGFueSl9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZVNpemUgPSB7XG4gICAgICAgICAgICBbZ2wuTElORVNdOiAyLFxuICAgICAgICAgICAgW2dsLlRSSUFOR0xFU106IDMsXG4gICAgICAgICAgICBbZ2wuTElORV9TVFJJUF06IDFcbiAgICAgICAgfVtkcmF3TW9kZV07XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzLmdldCgpKSB7XG4gICAgICAgICAgICBjb25zdCB2YW9zID0gc2VnbWVudC52YW9zIHx8IChzZWdtZW50LnZhb3MgPSB7fSk7XG4gICAgICAgICAgICBjb25zdCB2YW86IFZlcnRleEFycmF5T2JqZWN0ID0gdmFvc1tsYXllcklEXSB8fCAodmFvc1tsYXllcklEXSA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpKTtcblxuICAgICAgICAgICAgdmFvLmJpbmQoXG4gICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID8gY29uZmlndXJhdGlvbi5nZXRQYWludFZlcnRleEJ1ZmZlcnMoKSA6IFtdLFxuICAgICAgICAgICAgICAgIGluZGV4QnVmZmVyLFxuICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4T2Zmc2V0LFxuICAgICAgICAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXIsXG4gICAgICAgICAgICAgICAgZHluYW1pY0xheW91dEJ1ZmZlcjJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyhcbiAgICAgICAgICAgICAgICBkcmF3TW9kZSxcbiAgICAgICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCAqIHByaW1pdGl2ZVNpemUsXG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfU0hPUlQsXG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVPZmZzZXQgKiBwcmltaXRpdmVTaXplICogMik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb2dyYW07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm00ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtDcm9zc0ZhZGVkfSBmcm9tICcuLi8uLi9zdHlsZS9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcblxudHlwZSBCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGF0dGVybl90bF9hJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fYnJfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX3RsX2InOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl9icl9iJzogVW5pZm9ybTJmLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfbWl4JzogVW5pZm9ybTFmLFxuICAgICd1X3BhdHRlcm5fc2l6ZV9hJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fc2l6ZV9iJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlX2EnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2NhbGVfYic6IFVuaWZvcm0xZixcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFVuaWZvcm0yZixcbiAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0xZlxufH07XG5cbmV4cG9ydCB0eXBlIFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXM6XG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZSc6IFVuaWZvcm00ZixcbiAgICAndV9mYWRlJzogVW5pZm9ybTFmLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmXG58fTtcblxuZnVuY3Rpb24gcGF0dGVyblVuaWZvcm1WYWx1ZXMoY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLCBwYWludGVyOiBQYWludGVyLFxuICAgICAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPFBhdHRlcm5Vbmlmb3Jtc1R5cGU+IHtcblxuICAgIGNvbnN0IHRpbGVSYXRpbyA9IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSk7XG5cbiAgICBjb25zdCBudW1UaWxlcyA9IE1hdGgucG93KDIsIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICBjb25zdCB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gPSB0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pIC8gbnVtVGlsZXM7XG5cbiAgICBjb25zdCBwaXhlbFggPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiAodGlsZS50aWxlSUQuY2Fub25pY2FsLnggKyB0aWxlLnRpbGVJRC53cmFwICogbnVtVGlsZXMpO1xuICAgIGNvbnN0IHBpeGVsWSA9IHRpbGVTaXplQXROZWFyZXN0Wm9vbSAqIHRpbGUudGlsZUlELmNhbm9uaWNhbC55O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAndV90ZXhzaXplJzogdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxuICAgICAgICAvLyB0aGlzIGFzc3VtZXMgYWxsIGltYWdlcyBpbiB0aGUgaWNvbiBhdGxhcyB0ZXh0dXJlIGhhdmUgdGhlIHNhbWUgcGl4ZWwgcmF0aW9cbiAgICAgICAgJ3Vfc2NhbGUnOiBbYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLCB0aWxlUmF0aW8sIGNyb3NzZmFkZS5mcm9tU2NhbGUsIGNyb3NzZmFkZS50b1NjYWxlXSxcbiAgICAgICAgJ3VfZmFkZSc6IGNyb3NzZmFkZS50LFxuICAgICAgICAvLyBzcGxpdCB0aGUgcGl4ZWwgY29vcmQgaW50byB0d28gcGFpcnMgb2YgMTYgYml0IG51bWJlcnMuIFRoZSBnbHNsIHNwZWMgb25seSBndWFyYW50ZWVzIDE2IGJpdHMgb2YgcHJlY2lzaW9uLlxuICAgICAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFtwaXhlbFggPj4gMTYsIHBpeGVsWSA+PiAxNl0sXG4gICAgICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogW3BpeGVsWCAmIDB4RkZGRiwgcGl4ZWxZICYgMHhGRkZGXVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGJnUGF0dGVyblVuaWZvcm1WYWx1ZXMoaW1hZ2U6IENyb3NzRmFkZWQ8c3RyaW5nPiwgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLCBwYWludGVyOiBQYWludGVyLFxuICAgICAgICB0aWxlOiB7dGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlU2l6ZTogbnVtYmVyfVxuKTogVW5pZm9ybVZhbHVlczxCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZT4ge1xuICAgIGNvbnN0IGltYWdlUG9zQSA9IHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UuZnJvbSk7XG4gICAgY29uc3QgaW1hZ2VQb3NCID0gcGFpbnRlci5pbWFnZU1hbmFnZXIuZ2V0UGF0dGVybihpbWFnZS50byk7XG4gICAgYXNzZXJ0KGltYWdlUG9zQSAmJiBpbWFnZVBvc0IpO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmdldFBpeGVsU2l6ZSgpO1xuXG4gICAgY29uc3QgbnVtVGlsZXMgPSBNYXRoLnBvdygyLCB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgY29uc3QgdGlsZVNpemVBdE5lYXJlc3Rab29tID0gdGlsZS50aWxlU2l6ZSAqIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnRpbGVab29tKSAvIG51bVRpbGVzO1xuXG4gICAgY29uc3QgcGl4ZWxYID0gdGlsZVNpemVBdE5lYXJlc3Rab29tICogKHRpbGUudGlsZUlELmNhbm9uaWNhbC54ICsgdGlsZS50aWxlSUQud3JhcCAqIG51bVRpbGVzKTtcbiAgICBjb25zdCBwaXhlbFkgPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiB0aWxlLnRpbGVJRC5jYW5vbmljYWwueTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X2ltYWdlJzogMCxcbiAgICAgICAgJ3VfcGF0dGVybl90bF9hJzogKGltYWdlUG9zQTogYW55KS50bCxcbiAgICAgICAgJ3VfcGF0dGVybl9icl9hJzogKGltYWdlUG9zQTogYW55KS5icixcbiAgICAgICAgJ3VfcGF0dGVybl90bF9iJzogKGltYWdlUG9zQjogYW55KS50bCxcbiAgICAgICAgJ3VfcGF0dGVybl9icl9iJzogKGltYWdlUG9zQjogYW55KS5icixcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IFt3aWR0aCwgaGVpZ2h0XSxcbiAgICAgICAgJ3VfbWl4JzogY3Jvc3NmYWRlLnQsXG4gICAgICAgICd1X3BhdHRlcm5fc2l6ZV9hJzogKGltYWdlUG9zQTogYW55KS5kaXNwbGF5U2l6ZSxcbiAgICAgICAgJ3VfcGF0dGVybl9zaXplX2InOiAoaW1hZ2VQb3NCOiBhbnkpLmRpc3BsYXlTaXplLFxuICAgICAgICAndV9zY2FsZV9hJzogY3Jvc3NmYWRlLmZyb21TY2FsZSxcbiAgICAgICAgJ3Vfc2NhbGVfYic6IGNyb3NzZmFkZS50b1NjYWxlLFxuICAgICAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSksXG4gICAgICAgIC8vIHNwbGl0IHRoZSBwaXhlbCBjb29yZCBpbnRvIHR3byBwYWlycyBvZiAxNiBiaXQgbnVtYmVycy4gVGhlIGdsc2wgc3BlYyBvbmx5IGd1YXJhbnRlZXMgMTYgYml0cyBvZiBwcmVjaXNpb24uXG4gICAgICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogW3BpeGVsWCA+PiAxNiwgcGl4ZWxZID4+IDE2XSxcbiAgICAgICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBbcGl4ZWxYICYgMHhGRkZGLCBwaXhlbFkgJiAweEZGRkZdXG4gICAgfTtcbn1cbmV4cG9ydCB7IGJnUGF0dGVyblVuaWZvcm1WYWx1ZXMsIHBhdHRlcm5Vbmlmb3JtVmFsdWVzIH07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBwYXR0ZXJuVW5pZm9ybVZhbHVlcyB9IGZyb20gJy4vcGF0dGVybic7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtNGYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5cbmltcG9ydCB7bWF0MywgdmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcblxuZXhwb3J0IHR5cGUgRmlsbEV4dHJ1c2lvblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xpZ2h0cG9zJzogVW5pZm9ybTNmLFxuICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X2xpZ2h0Y29sb3InOiBVbmlmb3JtM2YsXG4gICAgJ3VfdmVydGljYWxfZ3JhZGllbnQnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZlxufH07XG5cbmV4cG9ydCB0eXBlIEZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfbGlnaHRwb3MnOiBVbmlmb3JtM2YsXG4gICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfbGlnaHRjb2xvcic6IFVuaWZvcm0zZixcbiAgICAndV9oZWlnaHRfZmFjdG9yJzogVW5pZm9ybTFmLFxuICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogVW5pZm9ybTFmLFxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXM6XG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZSc6IFVuaWZvcm00ZixcbiAgICAndV9mYWRlJzogVW5pZm9ybTFmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBmaWxsRXh0cnVzaW9uVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbEV4dHJ1c2lvblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9saWdodHBvcyc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfbGlnaHRwb3MpLFxuICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodGludGVuc2l0eSksXG4gICAgJ3VfbGlnaHRjb2xvcic6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfbGlnaHRjb2xvciksXG4gICAgJ3VfdmVydGljYWxfZ3JhZGllbnQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3ZlcnRpY2FsX2dyYWRpZW50KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KVxufSk7XG5cbmNvbnN0IGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfbGlnaHRwb3MnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0cG9zKSxcbiAgICAndV9saWdodGludGVuc2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfbGlnaHRpbnRlbnNpdHkpLFxuICAgICd1X2xpZ2h0Y29sb3InOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0Y29sb3IpLFxuICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV92ZXJ0aWNhbF9ncmFkaWVudCksXG4gICAgJ3VfaGVpZ2h0X2ZhY3Rvcic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfaGVpZ2h0X2ZhY3RvciksXG4gICAgLy8gcGF0dGVybiB1bmlmb3Jtc1xuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX3VwcGVyKSxcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfbG93ZXIpLFxuICAgICd1X3NjYWxlJzogbmV3IFVuaWZvcm00Zihjb250ZXh0LCBsb2NhdGlvbnMudV9zY2FsZSksXG4gICAgJ3VfZmFkZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZSksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSlcbn0pO1xuXG5jb25zdCBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQ6IGJvb2xlYW4sXG4gICAgb3BhY2l0eTogbnVtYmVyXG4pOiBVbmlmb3JtVmFsdWVzPEZpbGxFeHRydXNpb25Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCBsaWdodCA9IHBhaW50ZXIuc3R5bGUubGlnaHQ7XG4gICAgY29uc3QgX2xwID0gbGlnaHQucHJvcGVydGllcy5nZXQoJ3Bvc2l0aW9uJyk7XG4gICAgY29uc3QgbGlnaHRQb3MgPSBbX2xwLngsIF9scC55LCBfbHAuel07XG4gICAgY29uc3QgbGlnaHRNYXQgPSBtYXQzLmNyZWF0ZSgpO1xuICAgIGlmIChsaWdodC5wcm9wZXJ0aWVzLmdldCgnYW5jaG9yJykgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgbWF0My5mcm9tUm90YXRpb24obGlnaHRNYXQsIC1wYWludGVyLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgfVxuICAgIHZlYzMudHJhbnNmb3JtTWF0MyhsaWdodFBvcywgbGlnaHRQb3MsIGxpZ2h0TWF0KTtcblxuICAgIGNvbnN0IGxpZ2h0Q29sb3IgPSBsaWdodC5wcm9wZXJ0aWVzLmdldCgnY29sb3InKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfbGlnaHRwb3MnOiBsaWdodFBvcyxcbiAgICAgICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBsaWdodC5wcm9wZXJ0aWVzLmdldCgnaW50ZW5zaXR5JyksXG4gICAgICAgICd1X2xpZ2h0Y29sb3InOiBbbGlnaHRDb2xvci5yLCBsaWdodENvbG9yLmcsIGxpZ2h0Q29sb3IuYl0sXG4gICAgICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogK3Nob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsXG4gICAgICAgICd1X29wYWNpdHknOiBvcGFjaXR5XG4gICAgfTtcbn07XG5cbmNvbnN0IGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQ6IGJvb2xlYW4sXG4gICAgb3BhY2l0eTogbnVtYmVyLFxuICAgIGNvb3JkOiBPdmVyc2NhbGVkVGlsZUlELFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycyxcbiAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPEZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgcmV0dXJuIGV4dGVuZChmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHkpLFxuICAgICAgICBwYXR0ZXJuVW5pZm9ybVZhbHVlcyhjcm9zc2ZhZGUsIHBhaW50ZXIsIHRpbGUpLFxuICAgICAgICB7XG4gICAgICAgICAgICAndV9oZWlnaHRfZmFjdG9yJzogLU1hdGgucG93KDIsIGNvb3JkLm92ZXJzY2FsZWRaKSAvIHRpbGUudGlsZVNpemUgLyA4XG4gICAgICAgIH0pO1xufTtcblxuZXhwb3J0IHtcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtcyxcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BhdHRlcm5Vbmlmb3JtVmFsdWVzfSBmcm9tICcuL3BhdHRlcm4nO1xuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtNGYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcblxuZXhwb3J0IHR5cGUgRmlsbFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuZXhwb3J0IHR5cGUgRmlsbE91dGxpbmVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV93b3JsZCc6IFVuaWZvcm0yZlxufH07XG5cbmV4cG9ydCB0eXBlIEZpbGxQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTRmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBGaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV93b3JsZCc6IFVuaWZvcm0yZixcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGUnOiBVbmlmb3JtNGYsXG4gICAgJ3VfZmFkZSc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IGZpbGxVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpXG59KTtcblxuY29uc3QgZmlsbFBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsUGF0dGVyblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV9zY2FsZSc6IG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGUpLFxuICAgICd1X2ZhZGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGUpXG5cbn0pO1xuXG5jb25zdCBmaWxsT3V0bGluZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZpbGxPdXRsaW5lVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3dvcmxkJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV93b3JsZClcbn0pO1xuXG5jb25zdCBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3Vfd29ybGQnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3dvcmxkKSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV9zY2FsZSc6IG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGUpLFxuICAgICd1X2ZhZGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGUpXG59KTtcblxuY29uc3QgZmlsbFVuaWZvcm1WYWx1ZXMgPSAobWF0cml4OiBGbG9hdDMyQXJyYXkpOiBVbmlmb3JtVmFsdWVzPEZpbGxVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4XG59KTtcblxuY29uc3QgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLFxuICAgIHRpbGU6IFRpbGVcbik6IFVuaWZvcm1WYWx1ZXM8RmlsbFBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IGV4dGVuZChcbiAgICBmaWxsVW5pZm9ybVZhbHVlcyhtYXRyaXgpLFxuICAgIHBhdHRlcm5Vbmlmb3JtVmFsdWVzKGNyb3NzZmFkZSwgcGFpbnRlciwgdGlsZSlcbik7XG5cbmNvbnN0IGZpbGxPdXRsaW5lVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBkcmF3aW5nQnVmZmVyU2l6ZTogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxGaWxsT3V0bGluZVVuaWZvcm1zVHlwZT4gPT4gKHtcbiAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgJ3Vfd29ybGQnOiBkcmF3aW5nQnVmZmVyU2l6ZVxufSk7XG5cbmNvbnN0IGZpbGxPdXRsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnMsXG4gICAgdGlsZTogVGlsZSxcbiAgICBkcmF3aW5nQnVmZmVyU2l6ZTogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxGaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IGV4dGVuZChcbiAgICBmaWxsUGF0dGVyblVuaWZvcm1WYWx1ZXMobWF0cml4LCBwYWludGVyLCBjcm9zc2ZhZGUsIHRpbGUpLFxuICAgIHtcbiAgICAgICAgJ3Vfd29ybGQnOiBkcmF3aW5nQnVmZmVyU2l6ZVxuICAgIH1cbik7XG5cbmV4cG9ydCB7XG4gICAgZmlsbFVuaWZvcm1zLFxuICAgIGZpbGxQYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbE91dGxpbmVVbmlmb3JtcyxcbiAgICBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtcyxcbiAgICBmaWxsVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbE91dGxpbmVVbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxPdXRsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcbmltcG9ydCB0eXBlIENpcmNsZVN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuXG5leHBvcnQgdHlwZSBDaXJjbGVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2NhbGVfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IFVuaWZvcm0yZixcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuY29uc3QgY2lyY2xlVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQ2lyY2xlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3Vfc2NhbGVfd2l0aF9tYXAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX3dpdGhfbWFwKSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeClcbn0pO1xuXG5jb25zdCBjaXJjbGVVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgdGlsZTogVGlsZSxcbiAgICBsYXllcjogQ2lyY2xlU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxDaXJjbGVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGxldCBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sIGV4dHJ1ZGVTY2FsZTogW251bWJlciwgbnVtYmVyXTtcbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnKSB7XG4gICAgICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0uem9vbSk7XG4gICAgICAgIHBpdGNoV2l0aE1hcCA9IHRydWU7XG4gICAgICAgIGV4dHJ1ZGVTY2FsZSA9IFtwaXhlbFJhdGlvLCBwaXhlbFJhdGlvXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwaXRjaFdpdGhNYXAgPSBmYWxzZTtcbiAgICAgICAgZXh0cnVkZVNjYWxlID0gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0cztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsXG4gICAgICAgICd1X3NjYWxlX3dpdGhfbWFwJzogKyhsYXllci5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1zY2FsZScpID09PSAnbWFwJyksXG4gICAgICAgICd1X21hdHJpeCc6IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KFxuICAgICAgICAgICAgY29vcmQucG9zTWF0cml4LFxuICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlLWFuY2hvcicpKSxcbiAgICAgICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiArKHBpdGNoV2l0aE1hcCksXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfZXh0cnVkZV9zY2FsZSc6IGV4dHJ1ZGVTY2FsZVxuICAgIH07XG59O1xuXG5leHBvcnQgeyBjaXJjbGVVbmlmb3JtcywgY2lyY2xlVW5pZm9ybVZhbHVlcyB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vLi4vc291cmNlL3RpbGUnO1xuXG5leHBvcnQgdHlwZSBDb2xsaXNpb25Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogVW5pZm9ybTFmLFxuICAgICd1X3BpeGVsc190b190aWxlX3VuaXRzJzogVW5pZm9ybTFmLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfb3ZlcnNjYWxlX2ZhY3Rvcic6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IGNvbGxpc2lvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IENvbGxpc2lvblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAndV9waXhlbHNfdG9fdGlsZV91bml0cyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxzX3RvX3RpbGVfdW5pdHMpLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICd1X292ZXJzY2FsZV9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X292ZXJzY2FsZV9mYWN0b3IpXG59KTtcblxuY29uc3QgY29sbGlzaW9uVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPENvbGxpc2lvblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0uem9vbSk7XG4gICAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB0cmFuc2Zvcm0uem9vbSAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICBjb25zdCBvdmVyc2NhbGVGYWN0b3IgPSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxcbiAgICAgICAgJ3VfcGl4ZWxzX3RvX3RpbGVfdW5pdHMnOiBwaXhlbFJhdGlvLFxuICAgICAgICAndV9leHRydWRlX3NjYWxlJzogW3RyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0gLyAocGl4ZWxSYXRpbyAqIHNjYWxlKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMV0gLyAocGl4ZWxSYXRpbyAqIHNjYWxlKV0sXG4gICAgICAgICd1X292ZXJzY2FsZV9mYWN0b3InOiBvdmVyc2NhbGVGYWN0b3JcbiAgICB9O1xufTtcblxuZXhwb3J0IHsgY29sbGlzaW9uVW5pZm9ybXMsIGNvbGxpc2lvblVuaWZvcm1WYWx1ZXMgfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5leHBvcnQgdHlwZSBEZWJ1Z1VuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfY29sb3InOiBVbmlmb3JtQ29sb3IsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuY29uc3QgZGVidWdVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBEZWJ1Z1VuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2NvbG9yJzogbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvciksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpXG59KTtcblxuY29uc3QgZGVidWdVbmlmb3JtVmFsdWVzID0gKG1hdHJpeDogRmxvYXQzMkFycmF5LCBjb2xvcjogQ29sb3IpOiBVbmlmb3JtVmFsdWVzPERlYnVnVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAndV9jb2xvcic6IGNvbG9yXG59KTtcblxuZXhwb3J0IHsgZGVidWdVbmlmb3JtcywgZGVidWdVbmlmb3JtVmFsdWVzIH07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBVbmlmb3JtTWF0cml4NGYgfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5cbmV4cG9ydCB0eXBlIENsaXBwaW5nTWFza1VuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuY29uc3QgY2xpcHBpbmdNYXNrVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQ2xpcHBpbmdNYXNrVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpXG59KTtcblxuY29uc3QgY2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlcyA9IChtYXRyaXg6IEZsb2F0MzJBcnJheSk6IFVuaWZvcm1WYWx1ZXM8Q2xpcHBpbmdNYXNrVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeFxufSk7XG5cbmV4cG9ydCB7IGNsaXBwaW5nTWFza1VuaWZvcm1zLCBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzIH07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBtYXQ0IH0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBIZWF0bWFwU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyJztcblxuZXhwb3J0IHR5cGUgSGVhdG1hcFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IFVuaWZvcm0xZixcbiAgICAndV9pbnRlbnNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuZXhwb3J0IHR5cGUgSGVhdG1hcFRleHR1cmVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV93b3JsZCc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9jb2xvcl9yYW1wJzogVW5pZm9ybTFpLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBoZWF0bWFwVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogSGVhdG1hcFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICd1X2ludGVuc2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfaW50ZW5zaXR5KSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeClcbn0pO1xuXG5jb25zdCBoZWF0bWFwVGV4dHVyZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEhlYXRtYXBUZXh0dXJlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3dvcmxkJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV93b3JsZCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV9jb2xvcl9yYW1wJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvcl9yYW1wKSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KVxufSk7XG5cbmNvbnN0IGhlYXRtYXBVbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHRpbGU6IFRpbGUsXG4gICAgem9vbTogbnVtYmVyLFxuICAgIGludGVuc2l0eTogbnVtYmVyXG4pOiBVbmlmb3JtVmFsdWVzPEhlYXRtYXBVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB6b29tKSxcbiAgICAndV9pbnRlbnNpdHknOiBpbnRlbnNpdHlcbn0pO1xuXG5jb25zdCBoZWF0bWFwVGV4dHVyZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBsYXllcjogSGVhdG1hcFN0eWxlTGF5ZXIsXG4gICAgdGV4dHVyZVVuaXQ6IG51bWJlcixcbiAgICBjb2xvclJhbXBVbml0OiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8SGVhdG1hcFRleHR1cmVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCBtYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgIG1hdDQub3J0aG8obWF0cml4LCAwLCBwYWludGVyLndpZHRoLCBwYWludGVyLmhlaWdodCwgMCwgMCwgMSk7XG5cbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3Vfd29ybGQnOiBbZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XSxcbiAgICAgICAgJ3VfaW1hZ2UnOiB0ZXh0dXJlVW5pdCxcbiAgICAgICAgJ3VfY29sb3JfcmFtcCc6IGNvbG9yUmFtcFVuaXQsXG4gICAgICAgICd1X29wYWNpdHknOiBsYXllci5wYWludC5nZXQoJ2hlYXRtYXAtb3BhY2l0eScpXG4gICAgfTtcbn07XG5cbmV4cG9ydCB7XG4gICAgaGVhdG1hcFVuaWZvcm1zLFxuICAgIGhlYXRtYXBUZXh0dXJlVW5pZm9ybXMsXG4gICAgaGVhdG1hcFVuaWZvcm1WYWx1ZXMsXG4gICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgbWF0NCB9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi8uLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uLy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgSGlsbHNoYWRlU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9oaWxsc2hhZGVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgREVNRGF0YSBmcm9tICcuLi8uLi9kYXRhL2RlbV9kYXRhJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCB0eXBlIEhpbGxzaGFkZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2xhdHJhbmdlJzogVW5pZm9ybTJmLFxuICAgICd1X2xpZ2h0JzogVW5pZm9ybTJmLFxuICAgICd1X3NoYWRvdyc6IFVuaWZvcm1Db2xvcixcbiAgICAndV9oaWdobGlnaHQnOiBVbmlmb3JtQ29sb3IsXG4gICAgJ3VfYWNjZW50JzogVW5pZm9ybUNvbG9yXG58fTtcblxuZXhwb3J0IHR5cGUgSGlsbHNoYWRlUHJlcGFyZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2RpbWVuc2lvbic6IFVuaWZvcm0yZixcbiAgICAndV96b29tJzogVW5pZm9ybTFmLFxuICAgICd1X21heHpvb20nOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBoaWxsc2hhZGVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBIaWxsc2hhZGVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV9sYXRyYW5nZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfbGF0cmFuZ2UpLFxuICAgICd1X2xpZ2h0JzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodCksXG4gICAgJ3Vfc2hhZG93JzogbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbnMudV9zaGFkb3cpLFxuICAgICd1X2hpZ2hsaWdodCc6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfaGlnaGxpZ2h0KSxcbiAgICAndV9hY2NlbnQnOiBuZXcgVW5pZm9ybUNvbG9yKGNvbnRleHQsIGxvY2F0aW9ucy51X2FjY2VudClcbn0pO1xuXG5jb25zdCBoaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogSGlsbHNoYWRlUHJlcGFyZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X2RpbWVuc2lvbic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZGltZW5zaW9uKSxcbiAgICAndV96b29tJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV96b29tKSxcbiAgICAndV9tYXh6b29tJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXh6b29tKVxufSk7XG5cbmNvbnN0IGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBIaWxsc2hhZGVTdHlsZUxheWVyXG4pOiBVbmlmb3JtVmFsdWVzPEhpbGxzaGFkZVVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHNoYWRvdyA9IGxheWVyLnBhaW50LmdldChcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIik7XG4gICAgY29uc3QgaGlnaGxpZ2h0ID0gbGF5ZXIucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiKTtcbiAgICBjb25zdCBhY2NlbnQgPSBsYXllci5wYWludC5nZXQoXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCIpO1xuXG4gICAgbGV0IGF6aW11dGhhbCA9IGxheWVyLnBhaW50LmdldCgnaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb24nKSAqIChNYXRoLlBJIC8gMTgwKTtcbiAgICAvLyBtb2RpZnkgYXppbXV0aGFsIGFuZ2xlIGJ5IG1hcCByb3RhdGlvbiBpZiBsaWdodCBpcyBhbmNob3JlZCBhdCB0aGUgdmlld3BvcnRcbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvcicpID09PSAndmlld3BvcnQnKSB7XG4gICAgICAgIGF6aW11dGhhbCAtPSBwYWludGVyLnRyYW5zZm9ybS5hbmdsZTtcbiAgICB9XG4gICAgY29uc3QgYWxpZ24gPSAhcGFpbnRlci5vcHRpb25zLm1vdmluZztcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZS50aWxlSUQudG9VbndyYXBwZWQoKSwgYWxpZ24pLFxuICAgICAgICAndV9pbWFnZSc6IDAsXG4gICAgICAgICd1X2xhdHJhbmdlJzogZ2V0VGlsZUxhdFJhbmdlKHBhaW50ZXIsIHRpbGUudGlsZUlEKSxcbiAgICAgICAgJ3VfbGlnaHQnOiBbbGF5ZXIucGFpbnQuZ2V0KCdoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uJyksIGF6aW11dGhhbF0sXG4gICAgICAgICd1X3NoYWRvdyc6IHNoYWRvdyxcbiAgICAgICAgJ3VfaGlnaGxpZ2h0JzogaGlnaGxpZ2h0LFxuICAgICAgICAndV9hY2NlbnQnOiBhY2NlbnRcbiAgICB9O1xufTtcblxuY29uc3QgaGlsbHNoYWRlVW5pZm9ybVByZXBhcmVWYWx1ZXMgPSAoXG4gICAgdGlsZToge2RlbTogP0RFTURhdGEsIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRH0sIG1heHpvb206IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgYXNzZXJ0KHRpbGUuZGVtKTtcbiAgICBjb25zdCBzdHJpZGUgPSAoKHRpbGUuZGVtOiBhbnkpOiBERU1EYXRhKS5zdHJpZGU7XG4gICAgY29uc3QgbWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAvLyBGbGlwIHJlbmRlcmluZyBhdCB5IGF4aXMuXG4gICAgbWF0NC5vcnRobyhtYXRyaXgsIDAsIEVYVEVOVCwgLUVYVEVOVCwgMCwgMCwgMSk7XG4gICAgbWF0NC50cmFuc2xhdGUobWF0cml4LCBtYXRyaXgsIFswLCAtRVhURU5ULCAwXSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2ltYWdlJzogMSxcbiAgICAgICAgJ3VfZGltZW5zaW9uJzogW3N0cmlkZSwgc3RyaWRlXSxcbiAgICAgICAgJ3Vfem9vbSc6IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaLFxuICAgICAgICAndV9tYXh6b29tJzogbWF4em9vbVxuICAgIH07XG59O1xuXG5mdW5jdGlvbiBnZXRUaWxlTGF0UmFuZ2UocGFpbnRlcjogUGFpbnRlciwgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgLy8gZm9yIHNjYWxpbmcgdGhlIG1hZ25pdHVkZSBvZiBhIHBvaW50cyBzbG9wZSBieSBpdHMgbGF0aXR1ZGVcbiAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIHRpbGVJRC5jYW5vbmljYWwueik7XG4gICAgY29uc3QgeSA9IHRpbGVJRC5jYW5vbmljYWwueTtcbiAgICByZXR1cm4gW1xuICAgICAgICBuZXcgTWVyY2F0b3JDb29yZGluYXRlKDAsIHkgLyB0aWxlc0F0Wm9vbSkudG9MbmdMYXQoKS5sYXQsXG4gICAgICAgIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoMCwgKHkgKyAxKSAvIHRpbGVzQXRab29tKS50b0xuZ0xhdCgpLmxhdF07XG59XG5cbmV4cG9ydCB7XG4gICAgaGlsbHNoYWRlVW5pZm9ybXMsXG4gICAgaGlsbHNoYWRlUHJlcGFyZVVuaWZvcm1zLFxuICAgIGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMsXG4gICAgaGlsbHNoYWRlVW5pZm9ybVByZXBhcmVWYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm00ZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uLy4uL3V0aWwvYnJvd3Nlcic7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vLi4vc291cmNlL3RpbGUnO1xuaW1wb3J0IHR5cGUge0Nyb3NzRmFkZWR9IGZyb20gJy4uLy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUgTGluZVN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5cbmV4cG9ydCB0eXBlIExpbmVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogVW5pZm9ybTJmXG58fTtcblxuZXhwb3J0IHR5cGUgTGluZUdyYWRpZW50VW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaVxufH07XG5cbmV4cG9ydCB0eXBlIExpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTRmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBMaW5lU0RGVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuc2NhbGVfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuc2NhbGVfYic6IFVuaWZvcm0yZixcbiAgICAndV9zZGZnYW1tYSc6IFVuaWZvcm0xZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV90ZXhfeV9hJzogVW5pZm9ybTFmLFxuICAgICd1X3RleF95X2InOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWl4JzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgbGluZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IExpbmVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3JhdGlvKSxcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RldmljZV9waXhlbF9yYXRpbyksXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV91bml0c190b19waXhlbHMpXG59KTtcblxuY29uc3QgbGluZUdyYWRpZW50VW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogTGluZUdyYWRpZW50VW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9yYXRpbyksXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdW5pdHNfdG9fcGl4ZWxzKSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpXG59KTtcblxuY29uc3QgbGluZVBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBMaW5lUGF0dGVyblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfcmF0aW8pLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdW5pdHNfdG9fcGl4ZWxzKSxcbiAgICAndV9zY2FsZSc6IG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGUpLFxuICAgICd1X2ZhZGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGUpXG59KTtcblxuY29uc3QgbGluZVNERlVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IExpbmVTREZVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3JhdGlvKSxcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RldmljZV9waXhlbF9yYXRpbyksXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV91bml0c190b19waXhlbHMpLFxuICAgICd1X3BhdHRlcm5zY2FsZV9hJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuc2NhbGVfYSksXG4gICAgJ3VfcGF0dGVybnNjYWxlX2InOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5zY2FsZV9iKSxcbiAgICAndV9zZGZnYW1tYSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2RmZ2FtbWEpLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfdGV4X3lfYSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4X3lfYSksXG4gICAgJ3VfdGV4X3lfYic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4X3lfYiksXG4gICAgJ3VfbWl4JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9taXgpXG59KTtcblxuY29uc3QgbGluZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBMaW5lU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxMaW5lVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBjYWxjdWxhdGVNYXRyaXgocGFpbnRlciwgdGlsZSwgbGF5ZXIpLFxuICAgICAgICAndV9yYXRpbyc6IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogW1xuICAgICAgICAgICAgMSAvIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0sXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXVxuICAgICAgICBdXG4gICAgfTtcbn07XG5cbmNvbnN0IGxpbmVHcmFkaWVudFVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBMaW5lU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxMaW5lR3JhZGllbnRVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICByZXR1cm4gZXh0ZW5kKGxpbmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyKSwge1xuICAgICAgICAndV9pbWFnZSc6IDBcbiAgICB9KTtcbn07XG5cbmNvbnN0IGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgbGF5ZXI6IExpbmVTdHlsZUxheWVyLFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVyc1xuKTogVW5pZm9ybVZhbHVlczxMaW5lUGF0dGVyblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHRpbGVab29tUmF0aW8gPSBjYWxjdWxhdGVUaWxlUmF0aW8odGlsZSwgdHJhbnNmb3JtKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBjYWxjdWxhdGVNYXRyaXgocGFpbnRlciwgdGlsZSwgbGF5ZXIpLFxuICAgICAgICAndV90ZXhzaXplJzogdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxuICAgICAgICAvLyBjYW1lcmEgem9vbSByYXRpb1xuICAgICAgICAndV9yYXRpbyc6IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAvLyB0aGlzIGFzc3VtZXMgYWxsIGltYWdlcyBpbiB0aGUgaWNvbiBhdGxhcyB0ZXh0dXJlIGhhdmUgdGhlIHNhbWUgcGl4ZWwgcmF0aW9cbiAgICAgICAgJ3Vfc2NhbGUnOiBbYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLCB0aWxlWm9vbVJhdGlvLCBjcm9zc2ZhZGUuZnJvbVNjYWxlLCBjcm9zc2ZhZGUudG9TY2FsZV0sXG4gICAgICAgICd1X2ZhZGUnOiBjcm9zc2ZhZGUudCxcbiAgICAgICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogW1xuICAgICAgICAgICAgMSAvIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0sXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXVxuICAgICAgICBdXG4gICAgfTtcbn07XG5cbmNvbnN0IGxpbmVTREZVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgdGlsZTogVGlsZSxcbiAgICBsYXllcjogTGluZVN0eWxlTGF5ZXIsXG4gICAgZGFzaGFycmF5OiBDcm9zc0ZhZGVkPEFycmF5PG51bWJlcj4+LFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVyc1xuKTogVW5pZm9ybVZhbHVlczxMaW5lU0RGVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgY29uc3QgbGluZUF0bGFzID0gcGFpbnRlci5saW5lQXRsYXM7XG4gICAgY29uc3QgdGlsZVJhdGlvID0gY2FsY3VsYXRlVGlsZVJhdGlvKHRpbGUsIHRyYW5zZm9ybSk7XG5cbiAgICBjb25zdCByb3VuZCA9IGxheWVyLmxheW91dC5nZXQoJ2xpbmUtY2FwJykgPT09ICdyb3VuZCc7XG5cbiAgICBjb25zdCBwb3NBID0gbGluZUF0bGFzLmdldERhc2goZGFzaGFycmF5LmZyb20sIHJvdW5kKTtcbiAgICBjb25zdCBwb3NCID0gbGluZUF0bGFzLmdldERhc2goZGFzaGFycmF5LnRvLCByb3VuZCk7XG5cbiAgICBjb25zdCB3aWR0aEEgPSBwb3NBLndpZHRoICogY3Jvc3NmYWRlLmZyb21TY2FsZTtcbiAgICBjb25zdCB3aWR0aEIgPSBwb3NCLndpZHRoICogY3Jvc3NmYWRlLnRvU2NhbGU7XG5cbiAgICByZXR1cm4gZXh0ZW5kKGxpbmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyKSwge1xuICAgICAgICAndV9wYXR0ZXJuc2NhbGVfYSc6IFt0aWxlUmF0aW8gLyB3aWR0aEEsIC1wb3NBLmhlaWdodCAvIDJdLFxuICAgICAgICAndV9wYXR0ZXJuc2NhbGVfYic6IFt0aWxlUmF0aW8gLyB3aWR0aEIsIC1wb3NCLmhlaWdodCAvIDJdLFxuICAgICAgICAndV9zZGZnYW1tYSc6IGxpbmVBdGxhcy53aWR0aCAvIChNYXRoLm1pbih3aWR0aEEsIHdpZHRoQikgKiAyNTYgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pIC8gMixcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAndV90ZXhfeV9hJzogcG9zQS55LFxuICAgICAgICAndV90ZXhfeV9iJzogcG9zQi55LFxuICAgICAgICAndV9taXgnOiBjcm9zc2ZhZGUudFxuICAgIH0pO1xufTtcblxuZnVuY3Rpb24gY2FsY3VsYXRlVGlsZVJhdGlvKHRpbGU6IFRpbGUsIHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0udGlsZVpvb20pO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVNYXRyaXgocGFpbnRlciwgdGlsZSwgbGF5ZXIpIHtcbiAgICByZXR1cm4gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoXG4gICAgICAgIHRpbGUudGlsZUlELnBvc01hdHJpeCxcbiAgICAgICAgdGlsZSxcbiAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZScpLFxuICAgICAgICBsYXllci5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlLWFuY2hvcicpXG4gICAgKTtcbn1cblxuZXhwb3J0IHtcbiAgICBsaW5lVW5pZm9ybXMsXG4gICAgbGluZUdyYWRpZW50VW5pZm9ybXMsXG4gICAgbGluZVBhdHRlcm5Vbmlmb3JtcyxcbiAgICBsaW5lU0RGVW5pZm9ybXMsXG4gICAgbGluZVVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZUdyYWRpZW50VW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZVNERlVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUgUmFzdGVyU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBSYXN0ZXJVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV90bF9wYXJlbnQnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGVfcGFyZW50JzogVW5pZm9ybTFmLFxuICAgICd1X2J1ZmZlcl9zY2FsZSc6IFVuaWZvcm0xZixcbiAgICAndV9mYWRlX3QnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9pbWFnZTAnOiBVbmlmb3JtMWksXG4gICAgJ3VfaW1hZ2UxJzogVW5pZm9ybTFpLFxuICAgICd1X2JyaWdodG5lc3NfbG93JzogVW5pZm9ybTFmLFxuICAgICd1X2JyaWdodG5lc3NfaGlnaCc6IFVuaWZvcm0xZixcbiAgICAndV9zYXR1cmF0aW9uX2ZhY3Rvcic6IFVuaWZvcm0xZixcbiAgICAndV9jb250cmFzdF9mYWN0b3InOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc3Bpbl93ZWlnaHRzJzogVW5pZm9ybTNmXG58fTtcblxuY29uc3QgcmFzdGVyVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogUmFzdGVyVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3RsX3BhcmVudCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGxfcGFyZW50KSxcbiAgICAndV9zY2FsZV9wYXJlbnQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX3BhcmVudCksXG4gICAgJ3VfYnVmZmVyX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9idWZmZXJfc2NhbGUpLFxuICAgICd1X2ZhZGVfdCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZV90KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV9pbWFnZTAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlMCksXG4gICAgJ3VfaW1hZ2UxJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZTEpLFxuICAgICd1X2JyaWdodG5lc3NfbG93JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9icmlnaHRuZXNzX2xvdyksXG4gICAgJ3VfYnJpZ2h0bmVzc19oaWdoJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9icmlnaHRuZXNzX2hpZ2gpLFxuICAgICd1X3NhdHVyYXRpb25fZmFjdG9yJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zYXR1cmF0aW9uX2ZhY3RvciksXG4gICAgJ3VfY29udHJhc3RfZmFjdG9yJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jb250cmFzdF9mYWN0b3IpLFxuICAgICd1X3NwaW5fd2VpZ2h0cyc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfc3Bpbl93ZWlnaHRzKVxufSk7XG5cbmNvbnN0IHJhc3RlclVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFyZW50VEw6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFyZW50U2NhbGVCeTogbnVtYmVyLFxuICAgIGZhZGU6IHttaXg6IG51bWJlciwgb3BhY2l0eTogbnVtYmVyfSxcbiAgICBsYXllcjogUmFzdGVyU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxSYXN0ZXJVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3RsX3BhcmVudCc6IHBhcmVudFRMLFxuICAgICd1X3NjYWxlX3BhcmVudCc6IHBhcmVudFNjYWxlQnksXG4gICAgJ3VfYnVmZmVyX3NjYWxlJzogMSxcbiAgICAndV9mYWRlX3QnOiBmYWRlLm1peCxcbiAgICAndV9vcGFjaXR5JzogZmFkZS5vcGFjaXR5ICogbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItb3BhY2l0eScpLFxuICAgICd1X2ltYWdlMCc6IDAsXG4gICAgJ3VfaW1hZ2UxJzogMSxcbiAgICAndV9icmlnaHRuZXNzX2xvdyc6IGxheWVyLnBhaW50LmdldCgncmFzdGVyLWJyaWdodG5lc3MtbWluJyksXG4gICAgJ3VfYnJpZ2h0bmVzc19oaWdoJzogbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItYnJpZ2h0bmVzcy1tYXgnKSxcbiAgICAndV9zYXR1cmF0aW9uX2ZhY3Rvcic6IHNhdHVyYXRpb25GYWN0b3IobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItc2F0dXJhdGlvbicpKSxcbiAgICAndV9jb250cmFzdF9mYWN0b3InOiBjb250cmFzdEZhY3RvcihsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1jb250cmFzdCcpKSxcbiAgICAndV9zcGluX3dlaWdodHMnOiBzcGluV2VpZ2h0cyhsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1odWUtcm90YXRlJykpXG59KTtcblxuZnVuY3Rpb24gc3BpbldlaWdodHMoYW5nbGUpIHtcbiAgICBhbmdsZSAqPSBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IHMgPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgY29uc3QgYyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAoMiAqIGMgKyAxKSAvIDMsXG4gICAgICAgICgtTWF0aC5zcXJ0KDMpICogcyAtIGMgKyAxKSAvIDMsXG4gICAgICAgIChNYXRoLnNxcnQoMykgKiBzIC0gYyArIDEpIC8gM1xuICAgIF07XG59XG5cbmZ1bmN0aW9uIGNvbnRyYXN0RmFjdG9yKGNvbnRyYXN0KSB7XG4gICAgcmV0dXJuIGNvbnRyYXN0ID4gMCA/XG4gICAgICAgIDEgLyAoMSAtIGNvbnRyYXN0KSA6XG4gICAgICAgIDEgKyBjb250cmFzdDtcbn1cblxuZnVuY3Rpb24gc2F0dXJhdGlvbkZhY3RvcihzYXR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHNhdHVyYXRpb24gPiAwID9cbiAgICAgICAgMSAtIDEgLyAoMS4wMDEgLSBzYXR1cmF0aW9uKSA6XG4gICAgICAgIC1zYXR1cmF0aW9uO1xufVxuXG5leHBvcnQgeyByYXN0ZXJVbmlmb3JtcywgcmFzdGVyVW5pZm9ybVZhbHVlcyB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuXG5leHBvcnQgdHlwZSBTeW1ib2xJY29uVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X3NpemVfdCc6IFVuaWZvcm0xZixcbiAgICAndV9zaXplJzogVW5pZm9ybTFmLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl0Y2gnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IFVuaWZvcm0xaSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9jb29yZF9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaXNfdGV4dCc6IFVuaWZvcm0xZixcbiAgICAndV9waXRjaF93aXRoX21hcCc6IFVuaWZvcm0xaSxcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X3RleHR1cmUnOiBVbmlmb3JtMWlcbnx9O1xuXG5leHBvcnQgdHlwZSBTeW1ib2xTREZVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6IFVuaWZvcm0xaSxcbiAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3Vfc2l6ZV90JzogVW5pZm9ybTFmLFxuICAgICd1X3NpemUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IFVuaWZvcm0xZixcbiAgICAndV9waXRjaCc6IFVuaWZvcm0xZixcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogVW5pZm9ybTFpLFxuICAgICd1X2FzcGVjdF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9mYWRlX2NoYW5nZSc6IFVuaWZvcm0xZixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2Nvb3JkX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9pc190ZXh0JzogVW5pZm9ybTFmLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogVW5pZm9ybTFpLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGV4dHVyZSc6IFVuaWZvcm0xaSxcbiAgICAndV9nYW1tYV9zY2FsZSc6IFVuaWZvcm0xZixcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfaXNfaGFsbyc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IHN5bWJvbEljb25Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBTeW1ib2xJY29uVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX3pvb21fY29uc3RhbnQpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAndV9zaXplX3QnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemVfdCksXG4gICAgJ3Vfc2l6ZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZSksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3VfcGl0Y2gnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoKSxcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9yb3RhdGVfc3ltYm9sKSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2FzcGVjdF9yYXRpbyksXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGVfY2hhbmdlKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9sYWJlbF9wbGFuZV9tYXRyaXgpLFxuICAgICd1X2Nvb3JkX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfY29vcmRfbWF0cml4KSxcbiAgICAndV9pc190ZXh0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9pc190ZXh0KSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3RleHR1cmUnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHR1cmUpXG59KTtcblxuY29uc3Qgc3ltYm9sU0RGVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogU3ltYm9sU0RGVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX3pvb21fY29uc3RhbnQpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAndV9zaXplX3QnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemVfdCksXG4gICAgJ3Vfc2l6ZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZSksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3VfcGl0Y2gnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoKSxcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9yb3RhdGVfc3ltYm9sKSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2FzcGVjdF9yYXRpbyksXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGVfY2hhbmdlKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9sYWJlbF9wbGFuZV9tYXRyaXgpLFxuICAgICd1X2Nvb3JkX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfY29vcmRfbWF0cml4KSxcbiAgICAndV9pc190ZXh0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9pc190ZXh0KSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3RleHR1cmUnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHR1cmUpLFxuICAgICd1X2dhbW1hX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9nYW1tYV9zY2FsZSksXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICd1X2lzX2hhbG8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX2hhbG8pXG59KTtcblxuY29uc3Qgc3ltYm9sSWNvblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgZnVuY3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgc2l6ZTogP3t1U2l6ZVQ6IG51bWJlciwgdVNpemU6IG51bWJlcn0sXG4gICAgcm90YXRlSW5TaGFkZXI6IGJvb2xlYW4sXG4gICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgbGFiZWxQbGFuZU1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGdsQ29vcmRNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBpc1RleHQ6IGJvb2xlYW4sXG4gICAgdGV4U2l6ZTogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxTeW1ib2xJY29uVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiArKGZ1bmN0aW9uVHlwZSA9PT0gJ2NvbnN0YW50JyB8fCBmdW5jdGlvblR5cGUgPT09ICdzb3VyY2UnKSxcbiAgICAgICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogKyhmdW5jdGlvblR5cGUgPT09ICdjb25zdGFudCcgfHwgZnVuY3Rpb25UeXBlID09PSAnY2FtZXJhJyksXG4gICAgICAgICd1X3NpemVfdCc6IHNpemUgPyBzaXplLnVTaXplVCA6IDAsXG4gICAgICAgICd1X3NpemUnOiBzaXplID8gc2l6ZS51U2l6ZSA6IDAsXG4gICAgICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxcbiAgICAgICAgJ3VfcGl0Y2gnOiB0cmFuc2Zvcm0ucGl0Y2ggLyAzNjAgKiAyICogTWF0aC5QSSxcbiAgICAgICAgJ3Vfcm90YXRlX3N5bWJvbCc6ICtyb3RhdGVJblNoYWRlcixcbiAgICAgICAgJ3VfYXNwZWN0X3JhdGlvJzogdHJhbnNmb3JtLndpZHRoIC8gdHJhbnNmb3JtLmhlaWdodCxcbiAgICAgICAgJ3VfZmFkZV9jaGFuZ2UnOiBwYWludGVyLm9wdGlvbnMuZmFkZUR1cmF0aW9uID8gcGFpbnRlci5zeW1ib2xGYWRlQ2hhbmdlIDogMSxcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBsYWJlbFBsYW5lTWF0cml4LFxuICAgICAgICAndV9jb29yZF9tYXRyaXgnOiBnbENvb3JkTWF0cml4LFxuICAgICAgICAndV9pc190ZXh0JzogK2lzVGV4dCxcbiAgICAgICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiArcGl0Y2hXaXRoTWFwLFxuICAgICAgICAndV90ZXhzaXplJzogdGV4U2l6ZSxcbiAgICAgICAgJ3VfdGV4dHVyZSc6IDBcbiAgICB9O1xufTtcblxuY29uc3Qgc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyA9IChcbiAgICBmdW5jdGlvblR5cGU6IHN0cmluZyxcbiAgICBzaXplOiA/e3VTaXplVDogbnVtYmVyLCB1U2l6ZTogbnVtYmVyfSxcbiAgICByb3RhdGVJblNoYWRlcjogYm9vbGVhbixcbiAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBsYWJlbFBsYW5lTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZ2xDb29yZE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGlzVGV4dDogYm9vbGVhbixcbiAgICB0ZXhTaXplOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGlzSGFsbzogYm9vbGVhblxuKTogVW5pZm9ybVZhbHVlczxTeW1ib2xTREZVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIHJldHVybiBleHRlbmQoc3ltYm9sSWNvblVuaWZvcm1WYWx1ZXMoZnVuY3Rpb25UeXBlLCBzaXplLFxuICAgICAgICByb3RhdGVJblNoYWRlciwgcGl0Y2hXaXRoTWFwLCBwYWludGVyLCBtYXRyaXgsIGxhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgIGdsQ29vcmRNYXRyaXgsIGlzVGV4dCwgdGV4U2l6ZSksIHtcbiAgICAgICAgJ3VfZ2FtbWFfc2NhbGUnOiAocGl0Y2hXaXRoTWFwID8gTWF0aC5jb3ModHJhbnNmb3JtLl9waXRjaCkgKiB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSA6IDEpLFxuICAgICAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICd1X2lzX2hhbG8nOiAraXNIYWxvXG4gICAgfSk7XG59O1xuXG5leHBvcnQgeyBzeW1ib2xJY29uVW5pZm9ybXMsIHN5bWJvbFNERlVuaWZvcm1zLCBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcywgc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgYmdQYXR0ZXJuVW5pZm9ybVZhbHVlcyB9IGZyb20gJy4vcGF0dGVybic7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuaW1wb3J0IHR5cGUge0Nyb3NzRmFkZWR9IGZyb20gJy4uLy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQnO1xuXG5leHBvcnQgdHlwZSBCYWNrZ3JvdW5kVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9jb2xvcic6IFVuaWZvcm1Db2xvclxufH07XG5cbmV4cG9ydCB0eXBlIEJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BhdHRlcm5fdGxfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX2JyX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl90bF9iJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fYnJfYic6IFVuaWZvcm0yZixcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X21peCc6IFVuaWZvcm0xZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZV9hJzogVW5pZm9ybTFmLFxuICAgICd1X3NjYWxlX2InOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGlsZV91bml0c190b19waXhlbHMnOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBiYWNrZ3JvdW5kVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQmFja2dyb3VuZFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV9jb2xvcic6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfY29sb3IpXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3BhdHRlcm5fdGxfYSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl90bF9hKSxcbiAgICAndV9wYXR0ZXJuX2JyX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fYnJfYSksXG4gICAgJ3VfcGF0dGVybl90bF9iJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuX3RsX2IpLFxuICAgICd1X3BhdHRlcm5fYnJfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl9icl9iKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9taXgnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X21peCksXG4gICAgJ3VfcGF0dGVybl9zaXplX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fc2l6ZV9hKSxcbiAgICAndV9wYXR0ZXJuX3NpemVfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl9zaXplX2IpLFxuICAgICd1X3NjYWxlX2EnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX2EpLFxuICAgICd1X3NjYWxlX2InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX2IpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdGlsZV91bml0c190b19waXhlbHMpXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgb3BhY2l0eTogbnVtYmVyLFxuICAgIGNvbG9yOiBDb2xvclxuKTogVW5pZm9ybVZhbHVlczxCYWNrZ3JvdW5kVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAndV9vcGFjaXR5Jzogb3BhY2l0eSxcbiAgICAndV9jb2xvcic6IGNvbG9yXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGltYWdlOiBDcm9zc0ZhZGVkPHN0cmluZz4sXG4gICAgdGlsZToge3RpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdGlsZVNpemU6IG51bWJlcn0sXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzXG4pOiBVbmlmb3JtVmFsdWVzPEJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiBleHRlbmQoXG4gICAgYmdQYXR0ZXJuVW5pZm9ybVZhbHVlcyhpbWFnZSwgY3Jvc3NmYWRlLCBwYWludGVyLCB0aWxlKSxcbiAgICB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3Vfb3BhY2l0eSc6IG9wYWNpdHlcbiAgICB9XG4pO1xuXG5leHBvcnQge1xuICAgIGJhY2tncm91bmRVbmlmb3JtcyxcbiAgICBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zLFxuICAgIGJhY2tncm91bmRVbmlmb3JtVmFsdWVzLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlc1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGZpbGxFeHRydXNpb25Vbmlmb3JtcywgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtcyB9IGZyb20gJy4vZmlsbF9leHRydXNpb25fcHJvZ3JhbSc7XG5pbXBvcnQgeyBmaWxsVW5pZm9ybXMsIGZpbGxQYXR0ZXJuVW5pZm9ybXMsIGZpbGxPdXRsaW5lVW5pZm9ybXMsIGZpbGxPdXRsaW5lUGF0dGVyblVuaWZvcm1zIH0gZnJvbSAnLi9maWxsX3Byb2dyYW0nO1xuaW1wb3J0IHsgY2lyY2xlVW5pZm9ybXMgfSBmcm9tICcuL2NpcmNsZV9wcm9ncmFtJztcbmltcG9ydCB7IGNvbGxpc2lvblVuaWZvcm1zIH0gZnJvbSAnLi9jb2xsaXNpb25fcHJvZ3JhbSc7XG5pbXBvcnQgeyBkZWJ1Z1VuaWZvcm1zIH0gZnJvbSAnLi9kZWJ1Z19wcm9ncmFtJztcbmltcG9ydCB7IGNsaXBwaW5nTWFza1VuaWZvcm1zIH0gZnJvbSAnLi9jbGlwcGluZ19tYXNrX3Byb2dyYW0nO1xuaW1wb3J0IHsgaGVhdG1hcFVuaWZvcm1zLCBoZWF0bWFwVGV4dHVyZVVuaWZvcm1zIH0gZnJvbSAnLi9oZWF0bWFwX3Byb2dyYW0nO1xuaW1wb3J0IHsgaGlsbHNoYWRlVW5pZm9ybXMsIGhpbGxzaGFkZVByZXBhcmVVbmlmb3JtcyB9IGZyb20gJy4vaGlsbHNoYWRlX3Byb2dyYW0nO1xuaW1wb3J0IHsgbGluZVVuaWZvcm1zLCBsaW5lR3JhZGllbnRVbmlmb3JtcywgbGluZVBhdHRlcm5Vbmlmb3JtcywgbGluZVNERlVuaWZvcm1zIH0gZnJvbSAnLi9saW5lX3Byb2dyYW0nO1xuaW1wb3J0IHsgcmFzdGVyVW5pZm9ybXMgfSBmcm9tICcuL3Jhc3Rlcl9wcm9ncmFtJztcbmltcG9ydCB7IHN5bWJvbEljb25Vbmlmb3Jtcywgc3ltYm9sU0RGVW5pZm9ybXMgfSBmcm9tICcuL3N5bWJvbF9wcm9ncmFtJztcbmltcG9ydCB7IGJhY2tncm91bmRVbmlmb3JtcywgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtcyB9IGZyb20gJy4vYmFja2dyb3VuZF9wcm9ncmFtJztcblxuZXhwb3J0IGNvbnN0IHByb2dyYW1Vbmlmb3JtcyA9IHtcbiAgICBmaWxsRXh0cnVzaW9uOiBmaWxsRXh0cnVzaW9uVW5pZm9ybXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm46IGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbDogZmlsbFVuaWZvcm1zLFxuICAgIGZpbGxQYXR0ZXJuOiBmaWxsUGF0dGVyblVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lOiBmaWxsT3V0bGluZVVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lUGF0dGVybjogZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgY2lyY2xlOiBjaXJjbGVVbmlmb3JtcyxcbiAgICBjb2xsaXNpb25Cb3g6IGNvbGxpc2lvblVuaWZvcm1zLFxuICAgIGNvbGxpc2lvbkNpcmNsZTogY29sbGlzaW9uVW5pZm9ybXMsXG4gICAgZGVidWc6IGRlYnVnVW5pZm9ybXMsXG4gICAgY2xpcHBpbmdNYXNrOiBjbGlwcGluZ01hc2tVbmlmb3JtcyxcbiAgICBoZWF0bWFwOiBoZWF0bWFwVW5pZm9ybXMsXG4gICAgaGVhdG1hcFRleHR1cmU6IGhlYXRtYXBUZXh0dXJlVW5pZm9ybXMsXG4gICAgaGlsbHNoYWRlOiBoaWxsc2hhZGVVbmlmb3JtcyxcbiAgICBoaWxsc2hhZGVQcmVwYXJlOiBoaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXMsXG4gICAgbGluZTogbGluZVVuaWZvcm1zLFxuICAgIGxpbmVHcmFkaWVudDogbGluZUdyYWRpZW50VW5pZm9ybXMsXG4gICAgbGluZVBhdHRlcm46IGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgbGluZVNERjogbGluZVNERlVuaWZvcm1zLFxuICAgIHJhc3RlcjogcmFzdGVyVW5pZm9ybXMsXG4gICAgc3ltYm9sSWNvbjogc3ltYm9sSWNvblVuaWZvcm1zLFxuICAgIHN5bWJvbFNERjogc3ltYm9sU0RGVW5pZm9ybXMsXG4gICAgYmFja2dyb3VuZDogYmFja2dyb3VuZFVuaWZvcm1zLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuOiBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgT3ZlcnNjYWxlZFRpbGVJRCwgQ2Fub25pY2FsVGlsZUlEIH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vLi4vc291cmNlL3RpbGUnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuZXhwb3J0IHR5cGUgTWFzayA9IHtcbiAgICBbbnVtYmVyXTogQ2Fub25pY2FsVGlsZUlEXG59O1xuXG4vLyBVcGRhdGVzIHRoZSBUaWxlTWFza3MgZm9yIGFsbCByZW5kZXJhYmxlIHRpbGVzLiBBIFRpbGVNYXNrIGRlc2NyaWJlcyBhbGwgcmVnaW9uc1xuLy8gd2l0aGluIHRoYXQgdGlsZSB0aGF0IGFyZSAqbm90KiBjb3ZlcmVkIGJ5IG90aGVyIHJlbmRlcmFibGUgdGlsZXMuXG4vLyBFeGFtcGxlOiByZW5kZXJhYmxlVGlsZXMgaW4gb3VyIGxpc3QgYXJlIDIvMS8zLCAzLzMvNiwgYW5kIDQvNS8xMy4gVGhlIHNjaGVtYXRpYyBmb3IgY3JlYXRpbmcgdGhlXG4vLyBUaWxlTWFzayBmb3IgMi8xLzMgbG9va3MgbGlrZSB0aGlzOlxuLy9cbi8vICAgIMOiwpTCjMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCrMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCrMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCkFxuLy8gICAgw6LClMKCICAgICAgICDDosKUwoIgICAgICAgIMOiwpTCgiMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwoIgNC80LzEyIMOiwpTCgiA0LzUvMTIgw6LClMKCIyMjIyMjIyMjIyMjIyMjIyPDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgw6LClMKCICAgICAgICDDosKUwoIjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKcw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAMy8yLzbDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwqQjIyMjIzMvMy82IyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKCICAgICAgICDDosKUwoIjIyMjIyMjI8OiwpTCgiMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwoIgNC80LzEzIMOiwpTCgiM0LzUvMTMjw6LClMKCIyMjIyMjIyMjIyMjIyMjIyPDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgw6LClMKCIyMjIyMjIyPDosKUwoIjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKcw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMK0w6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAMi8xLzPDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwqRcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgIDMvMi83ICAgICAgw6LClMKCICAgICAgMy8zLzcgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTClMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCtMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCmFxuLy9cbi8vIFRoZSBUaWxlTWFzayBmb3IgMi8xLzMgdGh1cyBjb25zaXN0cyBvZiB0aGUgdGlsZXMgNC80LzEyLCA0LzUvMTIsIDQvNC8xMywgMy8yLzcsIGFuZCAzLzMvNyxcbi8vIGJ1dCBpdCBkb2VzICpub3QqIGluY2x1ZGUgNC81LzEzLCBhbmQgMy8zLzYsIHNpbmNlIHRoZXNlIGFyZSBvdGhlciByZW5kZXJhYmxlVGlsZXMuXG4vLyBBIFRpbGVNYXNrIGFsd2F5cyBjb250YWlucyBUaWxlSURzICpyZWxhdGl2ZSogdG8gdGhlIHRpbGUgaXQgaXMgZ2VuZXJhdGVkIGZvciwgc28gMi8xLzMgaXNcbi8vIFwic3VidHJhY3RlZFwiIGZyb20gdGhlc2UgVGlsZUlEcy4gVGhlIGZpbmFsIFRpbGVNYXNrIGZvciAyLzEvMyB3aWxsIHRodXMgYmU6XG4vL1xuLy8gICAgw6LClMKMw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKsw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKsw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKQXG4vLyAgICDDosKUwoIgICAgICAgIMOiwpTCgiAgICAgICAgw6LClMKCIyMjIyMjIyMjIyMjIyMjIyPDosKUwoJcbi8vICAgIMOiwpTCgiAyLzAvMCAgw6LClMKCIDIvMS8wICDDosKUwoIjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKCICAgICAgICDDosKUwoIgICAgICAgIMOiwpTCgiMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwpzDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwrzDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwqQjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKCICAgICAgICDDosKUwoIjIyMjIyMjI8OiwpTCgiMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwoIgMi8wLzEgIMOiwpTCgiMjIyMjIyMjw6LClMKCIyMjIyMjIyMjIyMjIyMjIyPDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgw6LClMKCIyMjIyMjIyPDosKUwoIjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKcw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMK0w6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMK8w6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKkXG4vLyAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAxLzAvMSAgICAgIMOiwpTCgiAgICAgIDEvMS8xICAgICAgw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCXG4vLyAgICDDosKUwpTDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwrTDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwphcbi8vXG4vLyBPbmx5IG90aGVyIHJlbmRlcmFibGUgdGlsZXMgdGhhdCBhcmUgKmNoaWxkcmVuKiBvZiB0aGUgdGlsZSB3ZSBhcmUgZ2VuZXJhdGluZyB0aGUgbWFzayBmb3Igd2lsbFxuLy8gYmUgY29uc2lkZXJlZC4gRm9yIGV4YW1wbGUsIGFkZGluZyBUaWxlSUQgNC84LzEzIHRvIHJlbmRlcmFibGVUaWxlcyB3b24ndCBhZmZlY3QgdGhlIFRpbGVNYXNrIGZvclxuLy8gMi8xLzMsIHNpbmNlIGl0IGlzIG5vdCBhIGRlc2NlbmRhbnQgb2YgaXQuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJlbmRlcmFibGVUaWxlczogQXJyYXk8VGlsZT4sIGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICBjb25zdCBzb3J0ZWRSZW5kZXJhYmxlcyA9IHJlbmRlcmFibGVUaWxlcy5zb3J0KChhLCBiKSA9PiB7IHJldHVybiBhLnRpbGVJRC5pc0xlc3NUaGFuKGIudGlsZUlEKSA/IC0xIDogYi50aWxlSUQuaXNMZXNzVGhhbihhLnRpbGVJRCkgPyAxIDogMDsgfSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZFJlbmRlcmFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSB7fTtcbiAgICAgICAgY29uc3QgdGlsZSA9ICBzb3J0ZWRSZW5kZXJhYmxlc1tpXTtcbiAgICAgICAgY29uc3QgY2hpbGRBcnJheSA9IHNvcnRlZFJlbmRlcmFibGVzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgLy8gVHJ5IHRvIGFkZCBhbGwgcmVtYWluaW5nIGlkcyBhcyBjaGlsZHJlbi4gV2Ugc29ydGVkIHRoZSB0aWxlIGxpc3RcbiAgICAgICAgLy8gYnkgeiBlYXJsaWVyLCBzbyBhbGwgcHJlY2VkaW5nIGl0ZW1zIGNhbm5vdCBiZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudFxuICAgICAgICAvLyB0aWxlLiBXZSBhbHNvIGNvbXB1dGUgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBuZXh0IHdyYXAsIGJlY2F1c2UgaXRlbXMgb2YgdGhlIG5leHQgd3JhcFxuICAgICAgICAvLyBjYW4gbmV2ZXIgYmUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgd3JhcC5cblxuICAgICAgICBjb21wdXRlVGlsZU1hc2tzKHRpbGUudGlsZUlELndyYXBwZWQoKSwgdGlsZS50aWxlSUQsIGNoaWxkQXJyYXksIG5ldyBPdmVyc2NhbGVkVGlsZUlEKDAsIHRpbGUudGlsZUlELndyYXAgKyAxLCAwLCAwLCAwKSwgbWFzayk7XG4gICAgICAgIHRpbGUuc2V0TWFzayhtYXNrLCBjb250ZXh0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVUaWxlTWFza3Mocm9vdFRpbGU6IE92ZXJzY2FsZWRUaWxlSUQsIHJlZjogT3ZlcnNjYWxlZFRpbGVJRCwgY2hpbGRBcnJheTogQXJyYXk8VGlsZT4sIGxvd2VyQm91bmQ6IE92ZXJzY2FsZWRUaWxlSUQsIG1hc2s6IE1hc2spIHtcbiAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4gaXMgZm91bmQgaW4gdGhlIGxpc3QsIHdlIG5lZWQgdG8gcmVjdXJzZS5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGRUaWxlID0gY2hpbGRBcnJheVtpXTtcbiAgICAgICAgLy8gY2hpbGRUaWxlIGlzIGZyb20gYSBsYXJnZXIgd3JhcCB0aGFuIHRoZSByb290VGlsZSBzbyBpdCBjYW5ub3QgYmUgYSBjaGlsZCB0aWxlXG4gICAgICAgIGlmIChsb3dlckJvdW5kLmlzTGVzc1RoYW4oY2hpbGRUaWxlLnRpbGVJRCkpIGJyZWFrO1xuICAgICAgICAvLyBUaGUgY3VycmVudCB0aWxlIGlzIG1hc2tlZCBvdXQsIHNvIHdlIGRvbid0IG5lZWQgdG8gYWRkIHRoZW0gdG8gdGhlIG1hc2sgc2V0LlxuICAgICAgICBpZiAocmVmLmtleSA9PT0gY2hpbGRUaWxlLnRpbGVJRC5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZFRpbGUudGlsZUlELmlzQ2hpbGRPZihyZWYpKSB7XG4gICAgICAgICAgICAvLyBUaGVyZSdzIGF0IGxlYXN0IG9uZSBjaGlsZCB0aWxlIHRoYXQgaXMgbWFza2VkIG91dCwgc28gcmVjdXJzaXZlbHkgZGVzY2VuZFxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSByZWYuY2hpbGRyZW4oSW5maW5pdHkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bal07XG4gICAgICAgICAgICAgICAgY29tcHV0ZVRpbGVNYXNrcyhyb290VGlsZSwgY2hpbGQsIGNoaWxkQXJyYXkuc2xpY2UoaSksIGxvd2VyQm91bmQsIG1hc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgYSBjaGlsZCwgc28gaXQncyBkZWZpbml0ZWx5IGEgbWFza2VkIHBhcnQuXG4gICAgLy8gQ29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb290IHRpbGUgSUQgYW5kIHRoZSByZWZlcmVuY2UgdGlsZSBJRCwgc2luY2UgVGlsZU1hc2tcbiAgICAvLyBlbGVtZW50cyBhcmUgYWx3YXlzIHJlbGF0aXZlIChzZWUgYmVsb3cgZm9yIGV4cGxhbmF0aW9uKS5cbiAgICBjb25zdCBkaWZmWiA9IHJlZi5vdmVyc2NhbGVkWiAtIHJvb3RUaWxlLm92ZXJzY2FsZWRaO1xuICAgIGNvbnN0IG1hc2tUaWxlSWQgPSBuZXcgQ2Fub25pY2FsVGlsZUlEKGRpZmZaLCByZWYuY2Fub25pY2FsLnggLSAocm9vdFRpbGUuY2Fub25pY2FsLnggPDwgZGlmZlopLCByZWYuY2Fub25pY2FsLnkgLSAocm9vdFRpbGUuY2Fub25pY2FsLnkgPDwgZGlmZlopKTtcbiAgICBtYXNrW21hc2tUaWxlSWQua2V5XSA9IG1hc2tbbWFza1RpbGVJZC5rZXldIHx8IG1hc2tUaWxlSWQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHsgY29sbGlzaW9uVW5pZm9ybVZhbHVlcyB9IGZyb20gJy4vcHJvZ3JhbS9jb2xsaXNpb25fcHJvZ3JhbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdDb2xsaXNpb25EZWJ1ZztcblxuZnVuY3Rpb24gZHJhd0NvbGxpc2lvbkRlYnVnR2VvbWV0cnkocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiwgZHJhd0NpcmNsZXM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBwcm9ncmFtID0gZHJhd0NpcmNsZXMgPyBwYWludGVyLnVzZVByb2dyYW0oJ2NvbGxpc2lvbkNpcmNsZScpIDogcGFpbnRlci51c2VQcm9ncmFtKCdjb2xsaXNpb25Cb3gnKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldDogP1N5bWJvbEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGRyYXdDaXJjbGVzID8gYnVja2V0LmNvbGxpc2lvbkNpcmNsZSA6IGJ1Y2tldC5jb2xsaXNpb25Cb3g7XG4gICAgICAgIGlmICghYnVmZmVycykgY29udGludWU7XG5cbiAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGRyYXdDaXJjbGVzID8gZ2wuVFJJQU5HTEVTIDogZ2wuTElORVMsXG4gICAgICAgICAgICBEZXB0aE1vZGUuZGlzYWJsZWQsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksXG4gICAgICAgICAgICBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBjb2xsaXNpb25Vbmlmb3JtVmFsdWVzKFxuICAgICAgICAgICAgICAgIGNvb3JkLnBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICBwYWludGVyLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICB0aWxlKSxcbiAgICAgICAgICAgIGxheWVyLmlkLCBidWZmZXJzLmxheW91dFZlcnRleEJ1ZmZlciwgYnVmZmVycy5pbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIGJ1ZmZlcnMuc2VnbWVudHMsIG51bGwsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sIG51bGwsIG51bGwsXG4gICAgICAgICAgICBidWZmZXJzLmNvbGxpc2lvblZlcnRleEJ1ZmZlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3Q29sbGlzaW9uRGVidWcocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGRyYXdDb2xsaXNpb25EZWJ1Z0dlb21ldHJ5KHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBmYWxzZSk7XG4gICAgZHJhd0NvbGxpc2lvbkRlYnVnR2VvbWV0cnkocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIHRydWUpO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IGRyYXdDb2xsaXNpb25EZWJ1ZyBmcm9tICcuL2RyYXdfY29sbGlzaW9uX2RlYnVnJztcblxuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50JztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuaW1wb3J0ICogYXMgc3ltYm9sUHJvamVjdGlvbiBmcm9tICcuLi9zeW1ib2wvcHJvamVjdGlvbic7XG5pbXBvcnQgKiBhcyBzeW1ib2xTaXplIGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfc2l6ZSc7XG5pbXBvcnQgeyBtYXQ0IH0gZnJvbSAnZ2wtbWF0cml4JztcbmNvbnN0IGlkZW50aXR5TWF0NCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0MzJBcnJheSgxNikpO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQge2FkZER5bmFtaWNBdHRyaWJ1dGVzfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcblxuaW1wb3J0IHsgZ2V0QW5jaG9yQWxpZ25tZW50LCBXcml0aW5nTW9kZSB9IGZyb20gJy4uL3N5bWJvbC9zaGFwaW5nJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi4vc3ltYm9sL29uZV9lbSc7XG5pbXBvcnQgeyBldmFsdWF0ZVJhZGlhbE9mZnNldCB9IGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0JztcblxuaW1wb3J0IHtcbiAgICBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyxcbiAgICBzeW1ib2xTREZVbmlmb3JtVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9zeW1ib2xfcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0LCB7U3ltYm9sQnVmZmVyc30gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlc30gZnJvbSAnLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUge1N5bWJvbFNERlVuaWZvcm1zVHlwZX0gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0vc3ltYm9sX3Byb2dyYW0nO1xuaW1wb3J0IHR5cGUgeyBDcm9zc1RpbGVJRCwgVmFyaWFibGVPZmZzZXQgfSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd1N5bWJvbHM7XG5cbnR5cGUgU3ltYm9sVGlsZVJlbmRlclN0YXRlID0ge1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yLFxuICAgIHNvcnRLZXk6IG51bWJlcixcbiAgICBzdGF0ZToge1xuICAgICAgICBwcm9ncmFtOiBhbnksXG4gICAgICAgIGJ1ZmZlcnM6IFN5bWJvbEJ1ZmZlcnMsXG4gICAgICAgIHVuaWZvcm1WYWx1ZXM6IGFueSxcbiAgICAgICAgYXRsYXNUZXh0dXJlOiBUZXh0dXJlLFxuICAgICAgICBhdGxhc0ludGVycG9sYXRpb246IGFueSxcbiAgICAgICAgaXNTREY6IGJvb2xlYW4sXG4gICAgICAgIGhhc0hhbG86IGJvb2xlYW5cbiAgICB9XG59O1xuXG5mdW5jdGlvbiBkcmF3U3ltYm9scyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+LCB2YXJpYWJsZU9mZnNldHM6IHtbQ3Jvc3NUaWxlSURdOiBWYXJpYWJsZU9mZnNldH0pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG5cbiAgICAvLyBEaXNhYmxlIHRoZSBzdGVuY2lsIHRlc3Qgc28gdGhhdCBsYWJlbHMgYXJlbid0IGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzLlxuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdpY29uLW9wYWNpdHknKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGZhbHNlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXBpdGNoLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1rZWVwLXVwcmlnaHQnKSxcbiAgICAgICAgICAgIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHZhcmlhYmxlT2Zmc2V0c1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChsYXllci5wYWludC5nZXQoJ3RleHQtb3BhY2l0eScpLmNvbnN0YW50T3IoMSkgIT09IDApIHtcbiAgICAgICAgZHJhd0xheWVyU3ltYm9scyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgdHJ1ZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgndGV4dC10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgndGV4dC10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQta2VlcC11cHJpZ2h0JyksXG4gICAgICAgICAgICBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCB2YXJpYWJsZU9mZnNldHNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlQ2FjaGUubWFwLnNob3dDb2xsaXNpb25Cb3hlcykge1xuICAgICAgICBkcmF3Q29sbGlzaW9uRGVidWcocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlVmFyaWFibGVSZW5kZXJTaGlmdChhbmNob3IsIHdpZHRoLCBoZWlnaHQsIHJhZGlhbE9mZnNldCwgdGV4dEJveFNjYWxlLCByZW5kZXJUZXh0U2l6ZSk6IFBvaW50IHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudChhbmNob3IpO1xuICAgIGNvbnN0IHNoaWZ0WCA9IC0oaG9yaXpvbnRhbEFsaWduIC0gMC41KSAqIHdpZHRoO1xuICAgIGNvbnN0IHNoaWZ0WSA9IC0odmVydGljYWxBbGlnbiAtIDAuNSkgKiBoZWlnaHQ7XG4gICAgY29uc3Qgb2Zmc2V0ID0gZXZhbHVhdGVSYWRpYWxPZmZzZXQoYW5jaG9yLCByYWRpYWxPZmZzZXQpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIChzaGlmdFggLyB0ZXh0Qm94U2NhbGUgKyBvZmZzZXRbMF0pICogcmVuZGVyVGV4dFNpemUsXG4gICAgICAgIChzaGlmdFkgLyB0ZXh0Qm94U2NhbGUgKyBvZmZzZXRbMV0pICogcmVuZGVyVGV4dFNpemVcbiAgICApO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWYXJpYWJsZUFuY2hvcnMoYnVja2V0LCByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHZhcmlhYmxlT2Zmc2V0cywgc3ltYm9sU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sIGxhYmVsUGxhbmVNYXRyaXgsIHBvc01hdHJpeCwgdGlsZVNjYWxlLCBzaXplKSB7XG4gICAgY29uc3QgcGxhY2VkU3ltYm9scyA9IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5O1xuICAgIGNvbnN0IGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA9IGJ1Y2tldC50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHBsYWNlZFN5bWJvbHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sOiBhbnkgPSBwbGFjZWRTeW1ib2xzLmdldChzKTtcbiAgICAgICAgY29uc3Qgc2tpcE9yaWVudGF0aW9uID0gYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgIXN5bWJvbC5wbGFjZWRPcmllbnRhdGlvbjtcbiAgICAgICAgY29uc3QgdmFyaWFibGVPZmZzZXQgPSAoIXN5bWJvbC5oaWRkZW4gJiYgc3ltYm9sLmNyb3NzVGlsZUlEICYmICFza2lwT3JpZW50YXRpb24pID8gdmFyaWFibGVPZmZzZXRzW3N5bWJvbC5jcm9zc1RpbGVJRF0gOiBudWxsO1xuICAgICAgICBpZiAoIXZhcmlhYmxlT2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyBUaGVzZSBzeW1ib2xzIGFyZSBmcm9tIGEganVzdGlmaWNhdGlvbiB0aGF0IGlzIG5vdCBiZWluZyB1c2VkLCBvciBhIGxhYmVsIHRoYXQgd2Fzbid0IHBsYWNlZFxuICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgZXh0cmEgbWF0aCB0byBmaWd1cmUgb3V0IHdoYXQgaW5jcmVtZW50YWwgc2hpZnQgdG8gYXBwbHkuXG4gICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMoc3ltYm9sLm51bUdseXBocywgZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgfSBlbHNlICB7XG4gICAgICAgICAgICBjb25zdCB0aWxlQW5jaG9yID0gbmV3IFBvaW50KHN5bWJvbC5hbmNob3JYLCBzeW1ib2wuYW5jaG9yWSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRBbmNob3IgPSBzeW1ib2xQcm9qZWN0aW9uLnByb2plY3QodGlsZUFuY2hvciwgcGl0Y2hXaXRoTWFwID8gcG9zTWF0cml4IDogbGFiZWxQbGFuZU1hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCBwZXJzcGVjdGl2ZVJhdGlvID0gMC41ICsgMC41ICogKHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gcHJvamVjdGVkQW5jaG9yLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSk7XG4gICAgICAgICAgICBsZXQgcmVuZGVyVGV4dFNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUoYnVja2V0LnRleHRTaXplRGF0YSwgc2l6ZSwgc3ltYm9sKSAqIHBlcnNwZWN0aXZlUmF0aW8gLyBPTkVfRU07XG4gICAgICAgICAgICBpZiAocGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgICAgICAgICAgLy8gR28gZnJvbSBzaXplIGluIHBpeGVscyB0byBlcXVpdmFsZW50IHNpemUgaW4gdGlsZSB1bml0c1xuICAgICAgICAgICAgICAgIHJlbmRlclRleHRTaXplICo9IGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyAvIHRpbGVTY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCByYWRpYWxPZmZzZXQsIHRleHRCb3hTY2FsZSB9ID0gdmFyaWFibGVPZmZzZXQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gY2FsY3VsYXRlVmFyaWFibGVSZW5kZXJTaGlmdChcbiAgICAgICAgICAgICAgICB2YXJpYWJsZU9mZnNldC5hbmNob3IsIHdpZHRoLCBoZWlnaHQsIHJhZGlhbE9mZnNldCwgdGV4dEJveFNjYWxlLCByZW5kZXJUZXh0U2l6ZSk7XG5cbiAgICAgICAgICAgIC8vIFVzdWFsIGNhc2UgaXMgdGhhdCB3ZSB0YWtlIHRoZSBwcm9qZWN0ZWQgYW5jaG9yIGFuZCBhZGQgdGhlIHBpeGVsLWJhc2VkIHNoaWZ0XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGVkIGFib3ZlLiBJbiB0aGUgKHNvbWV3aGF0IHdlaXJkKSBjYXNlIG9mIHBpdGNoLWFsaWduZWQgdGV4dCwgd2UgYWRkIGFuIGVxdWl2YWxlbnRcbiAgICAgICAgICAgIC8vIHRpbGUtdW5pdCBiYXNlZCBzaGlmdCB0byB0aGUgYW5jaG9yIGJlZm9yZSBwcm9qZWN0aW5nIHRvIHRoZSBsYWJlbCBwbGFuZS5cbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ZWRBbmNob3IgPSBwaXRjaFdpdGhNYXAgP1xuICAgICAgICAgICAgICAgIHN5bWJvbFByb2plY3Rpb24ucHJvamVjdCh0aWxlQW5jaG9yLmFkZChzaGlmdCksIGxhYmVsUGxhbmVNYXRyaXgpLnBvaW50IDpcbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRBbmNob3IucG9pbnQuYWRkKHJvdGF0ZVdpdGhNYXAgP1xuICAgICAgICAgICAgICAgICAgICBzaGlmdC5yb3RhdGUoLXRyYW5zZm9ybS5hbmdsZSkgOlxuICAgICAgICAgICAgICAgICAgICBzaGlmdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuZ2xlID0gKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHN5bWJvbC5wbGFjZWRPcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUudmVydGljYWwpID8gTWF0aC5QSSAvIDIgOiAwO1xuICAgICAgICAgICAgZm9yIChsZXQgZyA9IDA7IGcgPCBzeW1ib2wubnVtR2x5cGhzOyBnKyspIHtcbiAgICAgICAgICAgICAgICBhZGREeW5hbWljQXR0cmlidXRlcyhkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIHNoaWZ0ZWRBbmNob3IsIGFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVydGljYWxMYWJlbHMoYnVja2V0KSB7XG4gICAgY29uc3QgcGxhY2VkU3ltYm9scyA9IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5O1xuICAgIGNvbnN0IGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA9IGJ1Y2tldC50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHBsYWNlZFN5bWJvbHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sOiBhbnkgPSBwbGFjZWRTeW1ib2xzLmdldChzKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkSGlkZSA9IHN5bWJvbC5oaWRkZW4gfHwgIXN5bWJvbC5wbGFjZWRPcmllbnRhdGlvbjtcbiAgICAgICAgaWYgKHNob3VsZEhpZGUpIHtcbiAgICAgICAgICAgIC8vIFRoZXNlIHN5bWJvbHMgYXJlIGZyb20gYW4gb3JpZW50YXRpb24gdGhhdCBpcyBub3QgYmVpbmcgdXNlZCwgb3IgYSBsYWJlbCB0aGF0IHdhc24ndCBwbGFjZWRcbiAgICAgICAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gdGhlIGV4dHJhIG1hdGggdG8gZmlndXJlIG91dCB3aGF0IGluY3JlbWVudGFsIHNoaWZ0IHRvIGFwcGx5LlxuICAgICAgICAgICAgc3ltYm9sUHJvamVjdGlvbi5oaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH0gZWxzZSAge1xuICAgICAgICAgICAgY29uc3QgdGlsZUFuY2hvciA9IG5ldyBQb2ludChzeW1ib2wuYW5jaG9yWCwgc3ltYm9sLmFuY2hvclkpO1xuICAgICAgICAgICAgY29uc3QgYW5nbGUgPSAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc3ltYm9sLnBsYWNlZE9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkgPyBNYXRoLlBJIC8gMiA6IDA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGcgPSAwOyBnIDwgc3ltYm9sLm51bUdseXBoczsgZysrKSB7XG4gICAgICAgICAgICAgICAgYWRkRHluYW1pY0F0dHJpYnV0ZXMoZHluYW1pY0xheW91dFZlcnRleEFycmF5LCB0aWxlQW5jaG9yLCBhbmdsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVja2V0LnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG59XG5cbmZ1bmN0aW9uIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGlzVGV4dCwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uQWxpZ25tZW50LCBwaXRjaEFsaWdubWVudCwga2VlcFVwcmlnaHQsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHZhcmlhYmxlT2Zmc2V0cykge1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSByb3RhdGlvbkFsaWdubWVudCA9PT0gJ21hcCc7XG4gICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gcGl0Y2hBbGlnbm1lbnQgPT09ICdtYXAnO1xuICAgIGNvbnN0IGFsb25nTGluZSA9IHJvdGF0ZVdpdGhNYXAgJiYgbGF5ZXIubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnO1xuICAgIC8vIExpbmUgbGFiZWwgcm90YXRpb24gaGFwcGVucyBpbiBgdXBkYXRlTGluZUxhYmVsc2BcbiAgICAvLyBQaXRjaGVkIHBvaW50IGxhYmVscyBhcmUgYXV0b21hdGljYWxseSByb3RhdGVkIGJ5IHRoZSBsYWJlbFBsYW5lTWF0cml4IHByb2plY3Rpb25cbiAgICAvLyBVbnBpdGNoZWQgcG9pbnQgbGFiZWxzIG5lZWQgdG8gaGF2ZSB0aGVpciByb3RhdGlvbiBhcHBsaWVkIGFmdGVyIHByb2plY3Rpb25cbiAgICBjb25zdCByb3RhdGVJblNoYWRlciA9IHJvdGF0ZVdpdGhNYXAgJiYgIXBpdGNoV2l0aE1hcCAmJiAhYWxvbmdMaW5lO1xuXG4gICAgY29uc3Qgc29ydEZlYXR1cmVzQnlLZXkgPSBsYXllci5sYXlvdXQuZ2V0KCdzeW1ib2wtc29ydC1rZXknKS5jb25zdGFudE9yKDEpICE9PSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG5cbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBsZXQgc2l6ZTtcbiAgICBjb25zdCB2YXJpYWJsZVBsYWNlbWVudCA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG5cbiAgICBjb25zdCB0aWxlUmVuZGVyU3RhdGU6IEFycmF5PFN5bWJvbFRpbGVSZW5kZXJTdGF0ZT4gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiBTeW1ib2xCdWNrZXQgPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpOiBhbnkpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBpc1RleHQgPyBidWNrZXQudGV4dCA6IGJ1Y2tldC5pY29uO1xuICAgICAgICBpZiAoIWJ1ZmZlcnMgfHwgIWJ1ZmZlcnMuc2VnbWVudHMuZ2V0KCkubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWZmZXJzLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuXG4gICAgICAgIGNvbnN0IGlzU0RGID0gaXNUZXh0IHx8IGJ1Y2tldC5zZGZJY29ucztcblxuICAgICAgICBjb25zdCBzaXplRGF0YSA9IGlzVGV4dCA/IGJ1Y2tldC50ZXh0U2l6ZURhdGEgOiBidWNrZXQuaWNvblNpemVEYXRhO1xuXG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShpc1NERiA/ICdzeW1ib2xTREYnIDogJ3N5bWJvbEljb24nLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgICAgICBzaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhLCB0ci56b29tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuXG4gICAgICAgIGxldCB0ZXhTaXplOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICBsZXQgYXRsYXNUZXh0dXJlO1xuICAgICAgICBsZXQgYXRsYXNJbnRlcnBvbGF0aW9uO1xuICAgICAgICBpZiAoaXNUZXh0KSB7XG4gICAgICAgICAgICBhdGxhc1RleHR1cmUgPSB0aWxlLmdseXBoQXRsYXNUZXh0dXJlO1xuICAgICAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uID0gZ2wuTElORUFSO1xuICAgICAgICAgICAgdGV4U2l6ZSA9IHRpbGUuZ2x5cGhBdGxhc1RleHR1cmUuc2l6ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWNvblNjYWxlZCA9IGxheWVyLmxheW91dC5nZXQoJ2ljb24tc2l6ZScpLmNvbnN0YW50T3IoMCkgIT09IDEgfHwgYnVja2V0Lmljb25zTmVlZExpbmVhcjtcbiAgICAgICAgICAgIGNvbnN0IGljb25UcmFuc2Zvcm1lZCA9IHBpdGNoV2l0aE1hcCB8fCB0ci5waXRjaCAhPT0gMDtcblxuICAgICAgICAgICAgYXRsYXNUZXh0dXJlID0gdGlsZS5pbWFnZUF0bGFzVGV4dHVyZTtcbiAgICAgICAgICAgIGF0bGFzSW50ZXJwb2xhdGlvbiA9IGlzU0RGIHx8IHBhaW50ZXIub3B0aW9ucy5yb3RhdGluZyB8fCBwYWludGVyLm9wdGlvbnMuem9vbWluZyB8fCBpY29uU2NhbGVkIHx8IGljb25UcmFuc2Zvcm1lZCA/XG4gICAgICAgICAgICAgICAgZ2wuTElORUFSIDpcbiAgICAgICAgICAgICAgICBnbC5ORUFSRVNUO1xuICAgICAgICAgICAgdGV4U2l6ZSA9IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHMgPSBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS56b29tKTtcbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZU1hdHJpeCA9IHN5bWJvbFByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeChjb29yZC5wb3NNYXRyaXgsIHBpdGNoV2l0aE1hcCwgcm90YXRlV2l0aE1hcCwgcGFpbnRlci50cmFuc2Zvcm0sIHMpO1xuICAgICAgICBjb25zdCBnbENvb3JkTWF0cml4ID0gc3ltYm9sUHJvamVjdGlvbi5nZXRHbENvb3JkTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgcGl0Y2hXaXRoTWFwLCByb3RhdGVXaXRoTWFwLCBwYWludGVyLnRyYW5zZm9ybSwgcyk7XG5cbiAgICAgICAgaWYgKGFsb25nTGluZSkge1xuICAgICAgICAgICAgc3ltYm9sUHJvamVjdGlvbi51cGRhdGVMaW5lTGFiZWxzKGJ1Y2tldCwgY29vcmQucG9zTWF0cml4LCBwYWludGVyLCBpc1RleHQsIGxhYmVsUGxhbmVNYXRyaXgsIGdsQ29vcmRNYXRyaXgsIHBpdGNoV2l0aE1hcCwga2VlcFVwcmlnaHQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzVGV4dCAmJiBzaXplICYmIHZhcmlhYmxlUGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlU2NhbGUgPSBNYXRoLnBvdygyLCB0ci56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICAgICAgdXBkYXRlVmFyaWFibGVBbmNob3JzKGJ1Y2tldCwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB2YXJpYWJsZU9mZnNldHMsIHN5bWJvbFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIsIGxhYmVsUGxhbmVNYXRyaXgsIGNvb3JkLnBvc01hdHJpeCwgdGlsZVNjYWxlLCBzaXplKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1RleHQgJiYgc2l6ZSAmJiBidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCkge1xuICAgICAgICAgICAgdXBkYXRlVmVydGljYWxMYWJlbHMoYnVja2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgdGlsZSwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IpLFxuICAgICAgICAgICAgdUxhYmVsUGxhbmVNYXRyaXggPSAoYWxvbmdMaW5lIHx8IChpc1RleHQgJiYgdmFyaWFibGVQbGFjZW1lbnQpKSA/IGlkZW50aXR5TWF0NCA6IGxhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICB1Z2xDb29yZE1hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KGdsQ29vcmRNYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yLCB0cnVlKTtcblxuICAgICAgICBjb25zdCBoYXNIYWxvID0gaXNTREYgJiYgbGF5ZXIucGFpbnQuZ2V0KGlzVGV4dCA/ICd0ZXh0LWhhbG8td2lkdGgnIDogJ2ljb24taGFsby13aWR0aCcpLmNvbnN0YW50T3IoMSkgIT09IDA7XG5cbiAgICAgICAgbGV0IHVuaWZvcm1WYWx1ZXM7XG4gICAgICAgIGlmIChpc1NERikge1xuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyA9IHN5bWJvbFNERlVuaWZvcm1WYWx1ZXMoc2l6ZURhdGEua2luZCxcbiAgICAgICAgICAgICAgICBzaXplLCByb3RhdGVJblNoYWRlciwgcGl0Y2hXaXRoTWFwLCBwYWludGVyLCBtYXRyaXgsXG4gICAgICAgICAgICAgICAgdUxhYmVsUGxhbmVNYXRyaXgsIHVnbENvb3JkTWF0cml4LCBpc1RleHQsIHRleFNpemUsIHRydWUpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzID0gc3ltYm9sSWNvblVuaWZvcm1WYWx1ZXMoc2l6ZURhdGEua2luZCxcbiAgICAgICAgICAgICAgICBzaXplLCByb3RhdGVJblNoYWRlciwgcGl0Y2hXaXRoTWFwLCBwYWludGVyLCBtYXRyaXgsXG4gICAgICAgICAgICAgICAgdUxhYmVsUGxhbmVNYXRyaXgsIHVnbENvb3JkTWF0cml4LCBpc1RleHQsIHRleFNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgICAgYnVmZmVycyxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsXG4gICAgICAgICAgICBhdGxhc1RleHR1cmUsXG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb24sXG4gICAgICAgICAgICBpc1NERixcbiAgICAgICAgICAgIGhhc0hhbG9cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoc29ydEZlYXR1cmVzQnlLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNlZ21lbnRzID0gYnVmZmVycy5zZWdtZW50cy5nZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBvbGRTZWdtZW50cykge1xuICAgICAgICAgICAgICAgIHRpbGVSZW5kZXJTdGF0ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHM6IG5ldyBTZWdtZW50VmVjdG9yKFtzZWdtZW50XSksXG4gICAgICAgICAgICAgICAgICAgIHNvcnRLZXk6ICgoc2VnbWVudC5zb3J0S2V5OiBhbnkpOiBudW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZVJlbmRlclN0YXRlLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZ21lbnRzOiBidWZmZXJzLnNlZ21lbnRzLFxuICAgICAgICAgICAgICAgIHNvcnRLZXk6IDAsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvcnRGZWF0dXJlc0J5S2V5KSB7XG4gICAgICAgIHRpbGVSZW5kZXJTdGF0ZS5zb3J0KChhLCBiKSA9PiBhLnNvcnRLZXkgLSBiLnNvcnRLZXkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VnbWVudFN0YXRlIG9mIHRpbGVSZW5kZXJTdGF0ZSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHNlZ21lbnRTdGF0ZS5zdGF0ZTtcblxuICAgICAgICBzdGF0ZS5hdGxhc1RleHR1cmUuYmluZChzdGF0ZS5hdGxhc0ludGVycG9sYXRpb24sIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5pc1NERikge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9ICgoc3RhdGUudW5pZm9ybVZhbHVlczogYW55KTogVW5pZm9ybVZhbHVlczxTeW1ib2xTREZVbmlmb3Jtc1R5cGU+KTtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXNIYWxvKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9pc19oYWxvJ10gPSAxO1xuICAgICAgICAgICAgICAgIGRyYXdTeW1ib2xFbGVtZW50cyhzdGF0ZS5idWZmZXJzLCBzZWdtZW50U3RhdGUuc2VnbWVudHMsIGxheWVyLCBwYWludGVyLCBzdGF0ZS5wcm9ncmFtLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHVuaWZvcm1WYWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9pc19oYWxvJ10gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGRyYXdTeW1ib2xFbGVtZW50cyhzdGF0ZS5idWZmZXJzLCBzZWdtZW50U3RhdGUuc2VnbWVudHMsIGxheWVyLCBwYWludGVyLCBzdGF0ZS5wcm9ncmFtLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHN0YXRlLnVuaWZvcm1WYWx1ZXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd1N5bWJvbEVsZW1lbnRzKGJ1ZmZlcnMsIHNlZ21lbnRzLCBsYXllciwgcGFpbnRlciwgcHJvZ3JhbSwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCB1bmlmb3JtVmFsdWVzKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBidWZmZXJzLmxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgYnVmZmVycy5pbmRleEJ1ZmZlciwgc2VnbWVudHMsIGxheWVyLnBhaW50LFxuICAgICAgICBwYWludGVyLnRyYW5zZm9ybS56b29tLCBidWZmZXJzLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpLFxuICAgICAgICBidWZmZXJzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1ZmZlcnMub3BhY2l0eVZlcnRleEJ1ZmZlcik7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCBQcm9ncmFtIGZyb20gJy4vcHJvZ3JhbSc7XG5pbXBvcnQgeyBjaXJjbGVVbmlmb3JtVmFsdWVzIH0gZnJvbSAnLi9wcm9ncmFtL2NpcmNsZV9wcm9ncmFtJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQgeyBPdmVyc2NhbGVkVGlsZUlEIH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIENpcmNsZVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIENpcmNsZUJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0JztcbmltcG9ydCB0eXBlIFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlc30gZnJvbSAnLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUge0NpcmNsZVVuaWZvcm1zVHlwZX0gZnJvbSAnLi9wcm9ncmFtL2NpcmNsZV9wcm9ncmFtJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0NpcmNsZXM7XG5cbnR5cGUgVGlsZVJlbmRlclN0YXRlID0ge1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uOiBQcm9ncmFtQ29uZmlndXJhdGlvbixcbiAgICBwcm9ncmFtOiBQcm9ncmFtPCo+LFxuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcixcbiAgICB1bmlmb3JtVmFsdWVzOiBVbmlmb3JtVmFsdWVzPENpcmNsZVVuaWZvcm1zVHlwZT5cbn07XG5cbnR5cGUgU2VnbWVudHNUaWxlUmVuZGVyU3RhdGUgPSB7XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3IsXG4gICAgc29ydEtleTogbnVtYmVyLFxuICAgIHN0YXRlOiBUaWxlUmVuZGVyU3RhdGVcbn07XG5cbmZ1bmN0aW9uIGRyYXdDaXJjbGVzKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IENpcmNsZVN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG5cbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtb3BhY2l0eScpO1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtc3Ryb2tlLXdpZHRoJyk7XG4gICAgY29uc3Qgc3Ryb2tlT3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXN0cm9rZS1vcGFjaXR5Jyk7XG4gICAgY29uc3Qgc29ydEZlYXR1cmVzQnlLZXkgPSBsYXllci5sYXlvdXQuZ2V0KCdjaXJjbGUtc29ydC1rZXknKS5jb25zdGFudE9yKDEpICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAob3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwICYmIChzdHJva2VXaWR0aC5jb25zdGFudE9yKDEpID09PSAwIHx8IHN0cm9rZU9wYWNpdHkuY29uc3RhbnRPcigxKSA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuICAgIC8vIFR1cm4gb2ZmIHN0ZW5jaWwgdGVzdGluZyB0byBhbGxvdyBjaXJjbGVzIHRvIGJlIGRyYXduIGFjcm9zcyBib3VuZGFyaWVzLFxuICAgIC8vIHNvIHRoYXQgbGFyZ2UgY2lyY2xlcyBhcmUgbm90IGNsaXBwZWQgdG8gdGlsZXNcbiAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgY29uc3Qgc2VnbWVudHNSZW5kZXJTdGF0ZXM6IEFycmF5PFNlZ21lbnRzVGlsZVJlbmRlclN0YXRlPiA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29vcmQgPSBjb29yZHNbaV07XG5cbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBidWNrZXQ6ID9DaXJjbGVCdWNrZXQ8Kj4gPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpOiBhbnkpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ2NpcmNsZScsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgY29uc3QgbGF5b3V0VmVydGV4QnVmZmVyID0gYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlcjtcbiAgICAgICAgY29uc3QgaW5kZXhCdWZmZXIgPSBidWNrZXQuaW5kZXhCdWZmZXI7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSBjaXJjbGVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIGNvb3JkLCB0aWxlLCBsYXllcik7XG5cbiAgICAgICAgY29uc3Qgc3RhdGU6IFRpbGVSZW5kZXJTdGF0ZSA9IHtcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uLFxuICAgICAgICAgICAgcHJvZ3JhbSxcbiAgICAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgIGluZGV4QnVmZmVyLFxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoc29ydEZlYXR1cmVzQnlLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNlZ21lbnRzID0gYnVja2V0LnNlZ21lbnRzLmdldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG9sZFNlZ21lbnRzKSB7XG4gICAgICAgICAgICAgICAgc2VnbWVudHNSZW5kZXJTdGF0ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzOiBuZXcgU2VnbWVudFZlY3Rvcihbc2VnbWVudF0pLFxuICAgICAgICAgICAgICAgICAgICBzb3J0S2V5OiAoKHNlZ21lbnQuc29ydEtleTogYW55KTogbnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlZ21lbnRzUmVuZGVyU3RhdGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZ21lbnRzOiBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgICAgICAgICAgc29ydEtleTogMCxcbiAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGlmIChzb3J0RmVhdHVyZXNCeUtleSkge1xuICAgICAgICBzZWdtZW50c1JlbmRlclN0YXRlcy5zb3J0KChhLCBiKSA9PiBhLnNvcnRLZXkgLSBiLnNvcnRLZXkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VnbWVudHNTdGF0ZSBvZiBzZWdtZW50c1JlbmRlclN0YXRlcykge1xuICAgICAgICBjb25zdCB7cHJvZ3JhbUNvbmZpZ3VyYXRpb24sIHByb2dyYW0sIGxheW91dFZlcnRleEJ1ZmZlciwgaW5kZXhCdWZmZXIsIHVuaWZvcm1WYWx1ZXN9ID0gc2VnbWVudHNTdGF0ZS5zdGF0ZTtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBzZWdtZW50c1N0YXRlLnNlZ21lbnRzO1xuXG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsXG4gICAgICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIsIGluZGV4QnVmZmVyLCBzZWdtZW50cyxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LCBwYWludGVyLnRyYW5zZm9ybS56b29tLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHtcbiAgICBoZWF0bWFwVW5pZm9ybVZhbHVlcyxcbiAgICBoZWF0bWFwVGV4dHVyZVVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2hlYXRtYXBfcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgSGVhdG1hcFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBIZWF0bWFwQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2hlYXRtYXBfYnVja2V0JztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdIZWF0bWFwO1xuXG5mdW5jdGlvbiBkcmF3SGVhdG1hcChwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBIZWF0bWFwU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2hlYXRtYXAtb3BhY2l0eScpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAnb2Zmc2NyZWVuJykge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuICAgICAgICAvLyBBbGxvdyBrZXJuZWxzIHRvIGJlIGRyYXduIGFjcm9zcyBib3VuZGFyaWVzLCBzbyB0aGF0XG4gICAgICAgIC8vIGxhcmdlIGtlcm5lbHMgYXJlIG5vdCBjbGlwcGVkIHRvIHRpbGVzXG4gICAgICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgICAgIC8vIFR1cm4gb24gYWRkaXRpdmUgYmxlbmRpbmcgZm9yIGtlcm5lbHMsIHdoaWNoIGlzIGEga2V5IGFzcGVjdCBvZiBrZXJuZWwgZGVuc2l0eSBlc3RpbWF0aW9uIGZvcm11bGFcbiAgICAgICAgY29uc3QgY29sb3JNb2RlID0gbmV3IENvbG9yTW9kZShbZ2wuT05FLCBnbC5PTkVdLCBDb2xvci50cmFuc3BhcmVudCwgW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcblxuICAgICAgICBiaW5kRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgbGF5ZXIpO1xuXG4gICAgICAgIGNvbnRleHQuY2xlYXIoeyBjb2xvcjogQ29sb3IudHJhbnNwYXJlbnQgfSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRpbGVzIHRoYXQgaGF2ZSB1bmNvdmVyZWQgcGFyZW50cyB0byBhdm9pZCBmbGlja2VyaW5nOyB3ZSBkb24ndCBuZWVkXG4gICAgICAgICAgICAvLyB0byB1c2UgY29tcGxleCB0aWxlIG1hc2tpbmcgaGVyZSBiZWNhdXNlIHRoZSBjaGFuZ2UgYmV0d2VlbiB6b29tIGxldmVscyBpcyBzdWJ0bGUsXG4gICAgICAgICAgICAvLyBzbyBpdCdzIGZpbmUgdG8gc2ltcGx5IHJlbmRlciB0aGUgcGFyZW50IHVudGlsIGFsbCBpdHMgNCBjaGlsZHJlbiBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUuaGFzUmVuZGVyYWJsZVBhcmVudChjb29yZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQ6ID9IZWF0bWFwQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdoZWF0bWFwJywgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICAgICAgY29uc3Qge3pvb219ID0gcGFpbnRlci50cmFuc2Zvcm07XG5cbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIGhlYXRtYXBVbmlmb3JtVmFsdWVzKGNvb3JkLnBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgdGlsZSwgem9vbSwgbGF5ZXIucGFpbnQuZ2V0KCdoZWF0bWFwLWludGVuc2l0eScpKSxcbiAgICAgICAgICAgICAgICBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5zZWdtZW50cywgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sXG4gICAgICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0XSk7XG5cbiAgICB9IGVsc2UgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuICAgICAgICBwYWludGVyLmNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcbiAgICAgICAgcmVuZGVyVGV4dHVyZVRvTWFwKHBhaW50ZXIsIGxheWVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRGcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCBsYXllcikge1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcblxuICAgIC8vIFVzZSBhIDR4IGRvd25zY2FsZWQgc2NyZWVuIHRleHR1cmUgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoIC8gNCwgcGFpbnRlci5oZWlnaHQgLyA0XSk7XG5cbiAgICBsZXQgZmJvID0gbGF5ZXIuaGVhdG1hcEZibztcblxuICAgIGlmICghZmJvKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcblxuICAgICAgICBmYm8gPSBsYXllci5oZWF0bWFwRmJvID0gY29udGV4dC5jcmVhdGVGcmFtZWJ1ZmZlcihwYWludGVyLndpZHRoIC8gNCwgcGFpbnRlci5oZWlnaHQgLyA0KTtcblxuICAgICAgICBiaW5kVGV4dHVyZVRvRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgdGV4dHVyZSwgZmJvKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGZiby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQoZmJvLmZyYW1lYnVmZmVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRUZXh0dXJlVG9GcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCB0ZXh0dXJlLCBmYm8pIHtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgLy8gVXNlIHRoZSBoaWdoZXIgcHJlY2lzaW9uIGhhbGYtZmxvYXQgdGV4dHVyZSB3aGVyZSBhdmFpbGFibGUgKHByb2R1Y2luZyBtdWNoIHNtb290aGVyIGxvb2tpbmcgaGVhdG1hcHMpO1xuICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgcGFpbnRlci53aWR0aCAvIDQsIHBhaW50ZXIuaGVpZ2h0IC8gNCwgMCwgZ2wuUkdCQSxcbiAgICAgICAgY29udGV4dC5leHRUZXh0dXJlSGFsZkZsb2F0ID8gY29udGV4dC5leHRUZXh0dXJlSGFsZkZsb2F0LkhBTEZfRkxPQVRfT0VTIDogZ2wuVU5TSUdORURfQllURSwgbnVsbCk7XG5cbiAgICBmYm8uY29sb3JBdHRhY2htZW50LnNldCh0ZXh0dXJlKTtcblxuICAgIC8vIElmIHVzaW5nIGhhbGYtZmxvYXQgdGV4dHVyZSBhcyBhIHJlbmRlciB0YXJnZXQgaXMgbm90IHN1cHBvcnRlZCwgZmFsbCBiYWNrIHRvIGEgbG93IHByZWNpc2lvbiB0ZXh0dXJlXG4gICAgaWYgKGNvbnRleHQuZXh0VGV4dHVyZUhhbGZGbG9hdCAmJiBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSAhPT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUpIHtcbiAgICAgICAgY29udGV4dC5leHRUZXh0dXJlSGFsZkZsb2F0ID0gbnVsbDtcbiAgICAgICAgZmJvLmNvbG9yQXR0YWNobWVudC5zZXREaXJ0eSgpO1xuICAgICAgICBiaW5kVGV4dHVyZVRvRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgdGV4dHVyZSwgZmJvKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRleHR1cmVUb01hcChwYWludGVyLCBsYXllcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgLy8gSGVyZSB3ZSBiaW5kIHR3byBkaWZmZXJlbnQgdGV4dHVyZXMgZnJvbSB3aGljaCB3ZSdsbCBzYW1wbGUgaW4gZHJhd2luZ1xuICAgIC8vIGhlYXRtYXBzOiB0aGUga2VybmVsIHRleHR1cmUsIHByZXBhcmVkIGluIHRoZSBvZmZzY3JlZW4gcGFzcywgYW5kIGFcbiAgICAvLyBjb2xvciByYW1wIHRleHR1cmUuXG4gICAgY29uc3QgZmJvID0gbGF5ZXIuaGVhdG1hcEZibztcbiAgICBpZiAoIWZibykgcmV0dXJuO1xuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGZiby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG4gICAgbGV0IGNvbG9yUmFtcFRleHR1cmUgPSBsYXllci5jb2xvclJhbXBUZXh0dXJlO1xuICAgIGlmICghY29sb3JSYW1wVGV4dHVyZSkge1xuICAgICAgICBjb2xvclJhbXBUZXh0dXJlID0gbGF5ZXIuY29sb3JSYW1wVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIGxheWVyLmNvbG9yUmFtcCwgZ2wuUkdCQSk7XG4gICAgfVxuICAgIGNvbG9yUmFtcFRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgcGFpbnRlci51c2VQcm9ncmFtKCdoZWF0bWFwVGV4dHVyZScpLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLFxuICAgICAgICBEZXB0aE1vZGUuZGlzYWJsZWQsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLCBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICBoZWF0bWFwVGV4dHVyZVVuaWZvcm1WYWx1ZXMocGFpbnRlciwgbGF5ZXIsIDAsIDEpLFxuICAgICAgICBsYXllci5pZCwgcGFpbnRlci52aWV3cG9ydEJ1ZmZlciwgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlcixcbiAgICAgICAgcGFpbnRlci52aWV3cG9ydFNlZ21lbnRzLCBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xuaW1wb3J0IHtcbiAgICBsaW5lVW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZVNERlVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZUdyYWRpZW50VW5pZm9ybVZhbHVlc1xufSBmcm9tICcuL3Byb2dyYW0vbGluZV9wcm9ncmFtJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBMaW5lU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIExpbmVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvbGluZV9idWNrZXQnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHJhd0xpbmUocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogTGluZVN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG5cbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLW9wYWNpdHknKTtcbiAgICBjb25zdCB3aWR0aCA9IGxheWVyLnBhaW50LmdldCgnbGluZS13aWR0aCcpO1xuICAgIGlmIChvcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDAgfHwgd2lkdGguY29uc3RhbnRPcigxKSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgY29uc3QgZGFzaGFycmF5ID0gbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLWRhc2hhcnJheScpO1xuICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldCgnbGluZS1wYXR0ZXJuJyk7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcigoMTogYW55KSk7XG5cbiAgICBjb25zdCBncmFkaWVudCA9IGxheWVyLnBhaW50LmdldCgnbGluZS1ncmFkaWVudCcpO1xuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcblxuICAgIGNvbnN0IHByb2dyYW1JZCA9XG4gICAgICAgIGRhc2hhcnJheSA/ICdsaW5lU0RGJyA6XG4gICAgICAgIGltYWdlID8gJ2xpbmVQYXR0ZXJuJyA6XG4gICAgICAgIGdyYWRpZW50ID8gJ2xpbmVHcmFkaWVudCcgOiAnbGluZSc7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGxldCBmaXJzdFRpbGUgPSB0cnVlO1xuXG4gICAgaWYgKGdyYWRpZW50KSB7XG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuXG4gICAgICAgIGxldCBncmFkaWVudFRleHR1cmUgPSBsYXllci5ncmFkaWVudFRleHR1cmU7XG4gICAgICAgIGlmICghbGF5ZXIuZ3JhZGllbnQpIHJldHVybjtcbiAgICAgICAgaWYgKCFncmFkaWVudFRleHR1cmUpIGdyYWRpZW50VGV4dHVyZSA9IGxheWVyLmdyYWRpZW50VGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIGxheWVyLmdyYWRpZW50LCBnbC5SR0JBKTtcbiAgICAgICAgZ3JhZGllbnRUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG5cbiAgICAgICAgaWYgKGltYWdlICYmICF0aWxlLnBhdHRlcm5zTG9hZGVkKCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGJ1Y2tldDogP0xpbmVCdWNrZXQgPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpOiBhbnkpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgICAgIGNvbnN0IHByZXZQcm9ncmFtID0gcGFpbnRlci5jb250ZXh0LnByb2dyYW0uZ2V0KCk7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0ocHJvZ3JhbUlkLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHByb2dyYW1DaGFuZ2VkID0gZmlyc3RUaWxlIHx8IHByb2dyYW0ucHJvZ3JhbSAhPT0gcHJldlByb2dyYW07XG5cbiAgICAgICAgY29uc3QgY29uc3RhbnRQYXR0ZXJuID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIGlmIChjb25zdGFudFBhdHRlcm4gJiYgdGlsZS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NUbyA9IHRpbGUuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi50b107XG4gICAgICAgICAgICBjb25zdCBwb3NGcm9tID0gdGlsZS5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnNbY29uc3RhbnRQYXR0ZXJuLmZyb21dO1xuICAgICAgICAgICAgaWYgKHBvc1RvICYmIHBvc0Zyb20pIHByb2dyYW1Db25maWd1cmF0aW9uLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gZGFzaGFycmF5ID8gbGluZVNERlVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRhc2hhcnJheSwgY3Jvc3NmYWRlKSA6XG4gICAgICAgICAgICBpbWFnZSA/IGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyhwYWludGVyLCB0aWxlLCBsYXllciwgY3Jvc3NmYWRlKSA6XG4gICAgICAgICAgICBncmFkaWVudCA/IGxpbmVHcmFkaWVudFVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIpIDpcbiAgICAgICAgICAgIGxpbmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyKTtcblxuICAgICAgICBpZiAoZGFzaGFycmF5ICYmIChwcm9ncmFtQ2hhbmdlZCB8fCBwYWludGVyLmxpbmVBdGxhcy5kaXJ0eSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgcGFpbnRlci5saW5lQXRsYXMuYmluZChjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgICAgICB0aWxlLmltYWdlQXRsYXNUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uLnVwZGF0ZVBhdHRlcm5QYWludEJ1ZmZlcnMoY3Jvc3NmYWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSxcbiAgICAgICAgICAgIHBhaW50ZXIuc3RlbmNpbE1vZGVGb3JDbGlwcGluZyhjb29yZCksIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLCB1bmlmb3JtVmFsdWVzLFxuICAgICAgICAgICAgbGF5ZXIuaWQsIGJ1Y2tldC5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1Y2tldC5pbmRleEJ1ZmZlciwgYnVja2V0LnNlZ21lbnRzLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sIHByb2dyYW1Db25maWd1cmF0aW9uKTtcblxuICAgICAgICBmaXJzdFRpbGUgPSBmYWxzZTtcbiAgICAgICAgLy8gb25jZSByZWZhY3RvcmVkIHNvIHRoYXQgYm91bmQgdGV4dHVyZSBzdGF0ZSBpcyBtYW5hZ2VkLCB3ZSdsbCBhbHNvIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgZmlyc3RUaWxlL3Byb2dyYW1DaGFuZ2VkIGxvZ2ljXG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQge1xuICAgIGZpbGxVbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxQYXR0ZXJuVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlc1xufSBmcm9tICcuL3Byb2dyYW0vZmlsbF9wcm9ncmFtJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBGaWxsU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIEZpbGxCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9idWNrZXQnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0ZpbGw7XG5cbmZ1bmN0aW9uIGRyYXdGaWxsKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEZpbGxTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtY29sb3InKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLW9wYWNpdHknKTtcblxuICAgIGlmIChvcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgY29uc3QgcGF0dGVybiA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyk7XG4gICAgY29uc3QgcGFzcyA9IHBhaW50ZXIub3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpICYmXG4gICAgICAgICghcGF0dGVybi5jb25zdGFudE9yKCgxOiBhbnkpKSAmJlxuICAgICAgICBjb2xvci5jb25zdGFudE9yKENvbG9yLnRyYW5zcGFyZW50KS5hID09PSAxICYmXG4gICAgICAgIG9wYWNpdHkuY29uc3RhbnRPcigwKSA9PT0gMSkgPyAnb3BhcXVlJyA6ICd0cmFuc2x1Y2VudCc7XG5cbiAgICAvLyBEcmF3IGZpbGxcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSBwYXNzKSB7XG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoXG4gICAgICAgICAgICAxLCBwYWludGVyLnJlbmRlclBhc3MgPT09ICdvcGFxdWUnID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgICAgIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyBzdHJva2VcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnICYmIGxheWVyLnBhaW50LmdldCgnZmlsbC1hbnRpYWxpYXMnKSkge1xuXG4gICAgICAgIC8vIElmIHdlIGRlZmluZWQgYSBkaWZmZXJlbnQgY29sb3IgZm9yIHRoZSBmaWxsIG91dGxpbmUsIHdlIGFyZVxuICAgICAgICAvLyBnb2luZyB0byBpZ25vcmUgdGhlIGJpdHMgaW4gMHgwNyBhbmQganVzdCBjYXJlIGFib3V0IHRoZSBnbG9iYWxcbiAgICAgICAgLy8gY2xpcHBpbmcgbWFzay5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBvbmx5IHdhbnQgdG8gZHJhd0ZpbGwgdGhlIGFudGlhbGlhc2VkIHBhcnRzIHRoYXQgYXJlXG4gICAgICAgIC8vICpvdXRzaWRlKiB0aGUgY3VycmVudCBzaGFwZS4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gY2FzZSB0aGUgZmlsbFxuICAgICAgICAvLyBvciBzdHJva2UgY29sb3IgaXMgdHJhbnNsdWNlbnQuIElmIHdlIHdvdWxkbid0IGNsaXAgdG8gb3V0c2lkZVxuICAgICAgICAvLyB0aGUgY3VycmVudCBzaGFwZSwgc29tZSBwaXhlbHMgZnJvbSB0aGUgb3V0bGluZSBzdHJva2Ugb3ZlcmxhcHBlZFxuICAgICAgICAvLyB0aGUgKG5vbi1hbnRpYWxpYXNlZCkgZmlsbC5cbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcihcbiAgICAgICAgICAgIGxheWVyLmdldFBhaW50UHJvcGVydHkoJ2ZpbGwtb3V0bGluZS1jb2xvcicpID8gMiA6IDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgICAgIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCB0cnVlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCBpc091dGxpbmUpIHtcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcblxuICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyk7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkgJiYgcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcbiAgICBsZXQgZHJhd01vZGUsIHByb2dyYW1OYW1lLCB1bmlmb3JtVmFsdWVzLCBpbmRleEJ1ZmZlciwgc2VnbWVudHM7XG5cbiAgICBpZiAoIWlzT3V0bGluZSkge1xuICAgICAgICBwcm9ncmFtTmFtZSA9IGltYWdlID8gJ2ZpbGxQYXR0ZXJuJyA6ICdmaWxsJztcbiAgICAgICAgZHJhd01vZGUgPSBnbC5UUklBTkdMRVM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbU5hbWUgPSBpbWFnZSAmJiAhbGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJykgPyAnZmlsbE91dGxpbmVQYXR0ZXJuJyA6ICdmaWxsT3V0bGluZSc7XG4gICAgICAgIGRyYXdNb2RlID0gZ2wuTElORVM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBpZiAoaW1hZ2UgJiYgIXRpbGUucGF0dGVybnNMb2FkZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgYnVja2V0OiA/RmlsbEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShwcm9ncmFtTmFtZSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgcGFpbnRlci5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24udXBkYXRlUGF0dGVyblBhaW50QnVmZmVycyhjcm9zc2ZhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uc3RhbnRQYXR0ZXJuID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIGlmIChjb25zdGFudFBhdHRlcm4gJiYgdGlsZS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NUbyA9IHRpbGUuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi50b107XG4gICAgICAgICAgICBjb25zdCBwb3NGcm9tID0gdGlsZS5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnNbY29uc3RhbnRQYXR0ZXJuLmZyb21dO1xuICAgICAgICAgICAgaWYgKHBvc1RvICYmIHBvc0Zyb20pIHByb2dyYW1Db25maWd1cmF0aW9uLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aWxlTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoY29vcmQucG9zTWF0cml4LCB0aWxlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZScpLCBsYXllci5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlLWFuY2hvcicpKTtcblxuICAgICAgICBpZiAoIWlzT3V0bGluZSkge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXIgPSBidWNrZXQuaW5kZXhCdWZmZXI7XG4gICAgICAgICAgICBzZWdtZW50cyA9IGJ1Y2tldC5zZWdtZW50cztcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSBpbWFnZSA/XG4gICAgICAgICAgICAgICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgsIHBhaW50ZXIsIGNyb3NzZmFkZSwgdGlsZSkgOlxuICAgICAgICAgICAgICAgIGZpbGxVbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXIgPSBidWNrZXQuaW5kZXhCdWZmZXIyO1xuICAgICAgICAgICAgc2VnbWVudHMgPSBidWNrZXQuc2VnbWVudHMyO1xuICAgICAgICAgICAgY29uc3QgZHJhd2luZ0J1ZmZlclNpemUgPSBbZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XTtcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSAocHJvZ3JhbU5hbWUgPT09ICdmaWxsT3V0bGluZVBhdHRlcm4nICYmIGltYWdlKSA/XG4gICAgICAgICAgICAgICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyh0aWxlTWF0cml4LCBwYWludGVyLCBjcm9zc2ZhZGUsIHRpbGUsIGRyYXdpbmdCdWZmZXJTaXplKSA6XG4gICAgICAgICAgICAgICAgZmlsbE91dGxpbmVVbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgsIGRyYXdpbmdCdWZmZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2dyYW0uZHJhdyhwYWludGVyLmNvbnRleHQsIGRyYXdNb2RlLCBkZXB0aE1vZGUsXG4gICAgICAgICAgICBwYWludGVyLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoY29vcmQpLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCwgdW5pZm9ybVZhbHVlcyxcbiAgICAgICAgICAgIGxheWVyLmlkLCBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyLCBpbmRleEJ1ZmZlciwgc2VnbWVudHMsXG4gICAgICAgICAgICBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7XG4gICAgZmlsbEV4dHJ1c2lvblVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtVmFsdWVzLFxufSBmcm9tICcuL3Byb2dyYW0vZmlsbF9leHRydXNpb25fcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgRmlsbEV4dHJ1c2lvbkJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXQnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhdztcblxuZnVuY3Rpb24gZHJhdyhwYWludGVyOiBQYWludGVyLCBzb3VyY2U6IFNvdXJjZUNhY2hlLCBsYXllcjogRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5Jyk7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcpIHtcbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gbmV3IERlcHRoTW9kZShwYWludGVyLmNvbnRleHQuZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZFdyaXRlLCBwYWludGVyLmRlcHRoUmFuZ2VGb3IzRCk7XG5cbiAgICAgICAgaWYgKG9wYWNpdHkgPT09IDEgJiYgIWxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tcGF0dGVybicpLmNvbnN0YW50T3IoKDE6IGFueSkpKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICAgICAgICAgIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIGNvbG9yTW9kZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERyYXcgdHJhbnNwYXJlbnQgYnVpbGRpbmdzIGluIHR3byBwYXNzZXMgc28gdGhhdCBvbmx5IHRoZSBjbG9zZXN0IHN1cmZhY2UgaXMgZHJhd24uXG4gICAgICAgICAgICAvLyBGaXJzdCBkcmF3IGFsbCB0aGUgZXh0cnVzaW9ucyBpbnRvIG9ubHkgdGhlIGRlcHRoIGJ1ZmZlci4gTm8gY29sb3JzIGFyZSBkcmF3bi5cbiAgICAgICAgICAgIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSxcbiAgICAgICAgICAgICAgICBTdGVuY2lsTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBDb2xvck1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgICAgICAvLyBUaGVuIGRyYXcgYWxsIHRoZSBleHRydXNpb25zIGEgc2Vjb25kIHR5cGUsIG9ubHkgY29sb3JpbmcgZnJhZ21lbnRzIGlmIHRoZXkgaGF2ZSB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgZGVwdGggdmFsdWUgYXMgdGhlIGNsb3Nlc3QgZnJhZ21lbnQgaW4gdGhlIHByZXZpb3VzIHBhc3MuIFVzZSB0aGUgc3RlbmNpbCBidWZmZXJcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgdGhlIHNlY29uZCBkcmF3IGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgY29pbmNpZGVudCBwb2x5Z29ucy5cbiAgICAgICAgICAgIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSxcbiAgICAgICAgICAgICAgICBwYWludGVyLnN0ZW5jaWxNb2RlRm9yM0QoKSxcbiAgICAgICAgICAgICAgICBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tcGF0dGVybicpO1xuICAgIGNvbnN0IGltYWdlID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5Jyk7XG5cbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBidWNrZXQ6ID9GaWxsRXh0cnVzaW9uQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKGltYWdlID8gJ2ZpbGxFeHRydXNpb25QYXR0ZXJuJyA6ICdmaWxsRXh0cnVzaW9uJywgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgcGFpbnRlci5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24udXBkYXRlUGF0dGVyblBhaW50QnVmZmVycyhjcm9zc2ZhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uc3RhbnRQYXR0ZXJuID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIGlmIChjb25zdGFudFBhdHRlcm4gJiYgdGlsZS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NUbyA9IHRpbGUuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi50b107XG4gICAgICAgICAgICBjb25zdCBwb3NGcm9tID0gdGlsZS5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnNbY29uc3RhbnRQYXR0ZXJuLmZyb21dO1xuICAgICAgICAgICAgaWYgKHBvc1RvICYmIHBvc0Zyb20pIHByb2dyYW1Db25maWd1cmF0aW9uLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRyaXggPSBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChcbiAgICAgICAgICAgIGNvb3JkLnBvc01hdHJpeCxcbiAgICAgICAgICAgIHRpbGUsXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yJykpO1xuXG4gICAgICAgIGNvbnN0IHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50Jyk7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSBpbWFnZSA/XG4gICAgICAgICAgICBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1WYWx1ZXMobWF0cml4LCBwYWludGVyLCBzaG91bGRVc2VWZXJ0aWNhbEdyYWRpZW50LCBvcGFjaXR5LCBjb29yZCwgY3Jvc3NmYWRlLCB0aWxlKSA6XG4gICAgICAgICAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHkpO1xuXG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBjb250ZXh0LmdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuYmFja0NDVyxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyLCBidWNrZXQuaW5kZXhCdWZmZXIsXG4gICAgICAgICAgICBidWNrZXQuc2VnbWVudHMsIGxheWVyLnBhaW50LCBwYWludGVyLnRyYW5zZm9ybS56b29tLFxuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7XG4gICAgaGlsbHNoYWRlVW5pZm9ybVZhbHVlcyxcbiAgICBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlc1xufSBmcm9tICcuL3Byb2dyYW0vaGlsbHNoYWRlX3Byb2dyYW0nO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIEhpbGxzaGFkZVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdIaWxsc2hhZGU7XG5cbmZ1bmN0aW9uIGRyYXdIaWxsc2hhZGUocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogSGlsbHNoYWRlU3R5bGVMYXllciwgdGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAnb2Zmc2NyZWVuJyAmJiBwYWludGVyLnJlbmRlclBhc3MgIT09ICd0cmFuc2x1Y2VudCcpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3Qgc291cmNlTWF4Wm9vbSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLm1heHpvb207XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcblxuICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHRpbGVJRHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUodGlsZUlEKTtcbiAgICAgICAgaWYgKHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlICYmIHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgICAgIHByZXBhcmVIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIHNvdXJjZU1heFpvb20sIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcpIHtcbiAgICAgICAgICAgIHJlbmRlckhpbGxzaGFkZShwYWludGVyLCB0aWxlLCBsYXllciwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoLCBwYWludGVyLmhlaWdodF0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IGZibyA9IHRpbGUuZmJvO1xuICAgIGlmICghZmJvKSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdoaWxsc2hhZGUnKTtcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGZiby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuXG4gICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIpO1xuXG4gICAgaWYgKHRpbGUubWFza2VkQm91bmRzQnVmZmVyICYmIHRpbGUubWFza2VkSW5kZXhCdWZmZXIgJiYgdGlsZS5zZWdtZW50cykge1xuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCB0aWxlLm1hc2tlZEJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgIHRpbGUubWFza2VkSW5kZXhCdWZmZXIsIHRpbGUuc2VnbWVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIHBhaW50ZXIucmFzdGVyQm91bmRzQnVmZmVyLFxuICAgICAgICAgICAgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgcGFpbnRlci5yYXN0ZXJCb3VuZHNTZWdtZW50cyk7XG4gICAgfVxufVxuXG4vLyBoaWxsc2hhZGUgcmVuZGVyaW5nIGlzIGRvbmUgaW4gdHdvIHN0ZXBzLiB0aGUgcHJlcGFyZSBzdGVwIGZpcnN0IGNhbGN1bGF0ZXMgdGhlIHNsb3BlIG9mIHRoZSB0ZXJyYWluIGluIHRoZSB4IGFuZCB5XG4vLyBkaXJlY3Rpb25zIGZvciBlYWNoIHBpeGVsLCBhbmQgc2F2ZXMgdGhvc2UgdmFsdWVzIHRvIGEgZnJhbWVidWZmZXIgdGV4dHVyZSBpbiB0aGUgciBhbmQgZyBjaGFubmVscy5cbmZ1bmN0aW9uIHByZXBhcmVIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIHNvdXJjZU1heFpvb20sIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIC8vIGRlY29kZSByZ2JhIGxldmVscyBieSB1c2luZyBpbnRlZ2VyIG92ZXJmbG93IHRvIGNvbnZlcnQgZWFjaCBVaW50MzJBcnJheSBlbGVtZW50IC0+IDQgVWludDhBcnJheSBlbGVtZW50cy5cbiAgICAvLyBleC5cbiAgICAvLyBVaW50MzI6XG4gICAgLy8gYmFzZSAxMCAtIDY3MzA4XG4gICAgLy8gYmFzZSAyIC0gMDAwMCAwMDAwIDAwMDAgMDAwMSAwMDAwIDAxMTAgMTExMCAxMTAwXG4gICAgLy9cbiAgICAvLyBVaW50ODpcbiAgICAvLyBiYXNlIDEwIC0gMCwgMSwgNiwgMjM2ICh0aGlzIG9yZGVyIGlzIHJldmVyc2VkIGluIHRoZSByZXN1bHRpbmcgYXJyYXkgdmlhIHRoZSBvdmVyZmxvdy5cbiAgICAvLyBmaXJzdCA4IGJpdHMgcmVwcmVzZW50IDIzNiwgc28gdGhlIHIgY29tcG9uZW50IG9mIHRoZSB0ZXh0dXJlIHBpeGVsIHdpbGwgYmUgMjM2IGV0Yy4pXG4gICAgLy8gYmFzZSAyIC0gMDAwMCAwMDAwLCAwMDAwIDAwMDEsIDAwMDAgMDExMCwgMTExMCAxMTAwXG4gICAgaWYgKHRpbGUuZGVtICYmIHRpbGUuZGVtLmRhdGEpIHtcbiAgICAgICAgY29uc3QgdGlsZVNpemUgPSB0aWxlLmRlbS5kaW07XG4gICAgICAgIGNvbnN0IHRleHR1cmVTdHJpZGUgPSB0aWxlLmRlbS5zdHJpZGU7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxEYXRhID0gdGlsZS5kZW0uZ2V0UGl4ZWxzKCk7XG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuXG4gICAgICAgIC8vIGlmIFVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCBpcyBzZXQgdG8gdHJ1ZSBwcmlvciB0byBkcmF3SGlsbHNoYWRlIGJlaW5nIGNhbGxlZFxuICAgICAgICAvLyB0aWxlcyB3aWxsIGFwcGVhciBibGFuaywgYmVjYXVzZSBhcyB5b3UgY2FuIHNlZSBhYm92ZSB0aGUgYWxwaGEgdmFsdWUgZm9yIHRoZXNlIHRleHR1cmVzXG4gICAgICAgIC8vIGlzIGFsd2F5cyAwXG4gICAgICAgIGNvbnRleHQucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0KGZhbHNlKTtcbiAgICAgICAgdGlsZS5kZW1UZXh0dXJlID0gdGlsZS5kZW1UZXh0dXJlIHx8IHBhaW50ZXIuZ2V0VGlsZVRleHR1cmUodGV4dHVyZVN0cmlkZSk7XG4gICAgICAgIGlmICh0aWxlLmRlbVRleHR1cmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbVRleHR1cmUgPSB0aWxlLmRlbVRleHR1cmU7XG4gICAgICAgICAgICBkZW1UZXh0dXJlLnVwZGF0ZShwaXhlbERhdGEsIHsgcHJlbXVsdGlwbHk6IGZhbHNlIH0pO1xuICAgICAgICAgICAgZGVtVGV4dHVyZS5iaW5kKGdsLk5FQVJFU1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5kZW1UZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgcGl4ZWxEYXRhLCBnbC5SR0JBLCB7IHByZW11bHRpcGx5OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHRpbGUuZGVtVGV4dHVyZS5iaW5kKGdsLk5FQVJFU1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG5cbiAgICAgICAgbGV0IGZibyA9IHRpbGUuZmJvO1xuXG4gICAgICAgIGlmICghZmJvKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwge3dpZHRoOiB0aWxlU2l6ZSwgaGVpZ2h0OiB0aWxlU2l6ZSwgZGF0YTogbnVsbH0sIGdsLlJHQkEpO1xuICAgICAgICAgICAgcmVuZGVyVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGZibyA9IHRpbGUuZmJvID0gY29udGV4dC5jcmVhdGVGcmFtZWJ1ZmZlcih0aWxlU2l6ZSwgdGlsZVNpemUpO1xuICAgICAgICAgICAgZmJvLmNvbG9yQXR0YWNobWVudC5zZXQocmVuZGVyVGV4dHVyZS50ZXh0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChmYm8uZnJhbWVidWZmZXIpO1xuICAgICAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGlsZVNpemUsIHRpbGVTaXplXSk7XG5cbiAgICAgICAgcGFpbnRlci51c2VQcm9ncmFtKCdoaWxsc2hhZGVQcmVwYXJlJykuZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsXG4gICAgICAgICAgICBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIGhpbGxzaGFkZVVuaWZvcm1QcmVwYXJlVmFsdWVzKHRpbGUsIHNvdXJjZU1heFpvb20pLFxuICAgICAgICAgICAgbGF5ZXIuaWQsIHBhaW50ZXIucmFzdGVyQm91bmRzQnVmZmVyLFxuICAgICAgICAgICAgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgcGFpbnRlci5yYXN0ZXJCb3VuZHNTZWdtZW50cyk7XG5cbiAgICAgICAgdGlsZS5uZWVkc0hpbGxzaGFkZVByZXBhcmUgPSBmYWxzZTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCBJbWFnZVNvdXJjZSBmcm9tICcuLi9zb3VyY2UvaW1hZ2Vfc291cmNlJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7IHJhc3RlclVuaWZvcm1WYWx1ZXMgfSBmcm9tICcuL3Byb2dyYW0vcmFzdGVyX3Byb2dyYW0nO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIFJhc3RlclN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdSYXN0ZXI7XG5cbmZ1bmN0aW9uIGRyYXdSYXN0ZXIocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogUmFzdGVyU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09ICd0cmFuc2x1Y2VudCcpIHJldHVybjtcbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItb3BhY2l0eScpID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdyYXN0ZXInKTtcblxuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgY29uc3QgbWluVGlsZVogPSBjb29yZHMubGVuZ3RoICYmIGNvb3Jkc1swXS5vdmVyc2NhbGVkWjtcbiAgICBjb25zdCBhbGlnbiA9ICFwYWludGVyLm9wdGlvbnMubW92aW5nO1xuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIC8vIFNldCB0aGUgbG93ZXIgem9vbSBsZXZlbCB0byBzdWJsYXllciAwLCBhbmQgaGlnaGVyIHpvb20gbGV2ZWxzIHRvIGhpZ2hlciBzdWJsYXllcnNcbiAgICAgICAgLy8gVXNlIGdsLkxFU1MgdG8gcHJldmVudCBkb3VibGUgZHJhd2luZyBpbiBhcmVhcyB3aGVyZSB0aWxlcyBvdmVybGFwLlxuICAgICAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKGNvb3JkLm92ZXJzY2FsZWRaIC0gbWluVGlsZVosXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1vcGFjaXR5JykgPT09IDEgPyBEZXB0aE1vZGUuUmVhZFdyaXRlIDogRGVwdGhNb2RlLlJlYWRPbmx5LCBnbC5MRVNTKTtcblxuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IHBvc01hdHJpeCA9IHBhaW50ZXIudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChjb29yZC50b1Vud3JhcHBlZCgpLCBhbGlnbik7XG5cbiAgICAgICAgdGlsZS5yZWdpc3RlckZhZGVEdXJhdGlvbihsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJykpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudFRpbGUgPSBzb3VyY2VDYWNoZS5maW5kTG9hZGVkUGFyZW50KGNvb3JkLCAwKSxcbiAgICAgICAgICAgIGZhZGUgPSBnZXRGYWRlVmFsdWVzKHRpbGUsIHBhcmVudFRpbGUsIHNvdXJjZUNhY2hlLCBsYXllciwgcGFpbnRlci50cmFuc2Zvcm0pO1xuXG4gICAgICAgIGxldCBwYXJlbnRTY2FsZUJ5LCBwYXJlbnRUTDtcblxuICAgICAgICBjb25zdCB0ZXh0dXJlRmlsdGVyID0gbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItcmVzYW1wbGluZycpID09PSAnbmVhcmVzdCcgPyAgZ2wuTkVBUkVTVCA6IGdsLkxJTkVBUjtcblxuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQodGV4dHVyZUZpbHRlciwgZ2wuQ0xBTVBfVE9fRURHRSwgZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcblxuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcblxuICAgICAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICAgICAgcGFyZW50VGlsZS50ZXh0dXJlLmJpbmQodGV4dHVyZUZpbHRlciwgZ2wuQ0xBTVBfVE9fRURHRSwgZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcbiAgICAgICAgICAgIHBhcmVudFNjYWxlQnkgPSBNYXRoLnBvdygyLCBwYXJlbnRUaWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICAgICAgICAgIHBhcmVudFRMID0gW3RpbGUudGlsZUlELmNhbm9uaWNhbC54ICogcGFyZW50U2NhbGVCeSAlIDEsIHRpbGUudGlsZUlELmNhbm9uaWNhbC55ICogcGFyZW50U2NhbGVCeSAlIDFdO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLnRleHR1cmUuYmluZCh0ZXh0dXJlRmlsdGVyLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IHJhc3RlclVuaWZvcm1WYWx1ZXMocG9zTWF0cml4LCBwYXJlbnRUTCB8fCBbMCwgMF0sIHBhcmVudFNjYWxlQnkgfHwgMSwgZmFkZSwgbGF5ZXIpO1xuXG4gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBJbWFnZVNvdXJjZSkge1xuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIHNvdXJjZS5ib3VuZHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgc291cmNlLmJvdW5kc1NlZ21lbnRzKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aWxlLm1hc2tlZEJvdW5kc0J1ZmZlciAmJiB0aWxlLm1hc2tlZEluZGV4QnVmZmVyICYmIHRpbGUuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCB0aWxlLm1hc2tlZEJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgICAgICB0aWxlLm1hc2tlZEluZGV4QnVmZmVyLCB0aWxlLnNlZ21lbnRzLCBsYXllci5wYWludCxcbiAgICAgICAgICAgICAgICBwYWludGVyLnRyYW5zZm9ybS56b29tKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBwYWludGVyLnJhc3RlckJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgICAgICBwYWludGVyLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCBwYWludGVyLnJhc3RlckJvdW5kc1NlZ21lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0RmFkZVZhbHVlcyh0aWxlLCBwYXJlbnRUaWxlLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIHRyYW5zZm9ybSkge1xuICAgIGNvbnN0IGZhZGVEdXJhdGlvbiA9IGxheWVyLnBhaW50LmdldCgncmFzdGVyLWZhZGUtZHVyYXRpb24nKTtcblxuICAgIGlmIChmYWRlRHVyYXRpb24gPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IGJyb3dzZXIubm93KCk7XG4gICAgICAgIGNvbnN0IHNpbmNlVGlsZSA9IChub3cgLSB0aWxlLnRpbWVBZGRlZCkgLyBmYWRlRHVyYXRpb247XG4gICAgICAgIGNvbnN0IHNpbmNlUGFyZW50ID0gcGFyZW50VGlsZSA/IChub3cgLSBwYXJlbnRUaWxlLnRpbWVBZGRlZCkgLyBmYWRlRHVyYXRpb24gOiAtMTtcblxuICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgY29uc3QgaWRlYWxaID0gdHJhbnNmb3JtLmNvdmVyaW5nWm9vbUxldmVsKHtcbiAgICAgICAgICAgIHRpbGVTaXplOiBzb3VyY2UudGlsZVNpemUsXG4gICAgICAgICAgICByb3VuZFpvb206IHNvdXJjZS5yb3VuZFpvb21cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgbm8gcGFyZW50IG9yIHBhcmVudCBpcyBvbGRlciwgZmFkZSBpbjsgaWYgcGFyZW50IGlzIHlvdW5nZXIsIGZhZGUgb3V0XG4gICAgICAgIGNvbnN0IGZhZGVJbiA9ICFwYXJlbnRUaWxlIHx8IE1hdGguYWJzKHBhcmVudFRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gaWRlYWxaKSA+IE1hdGguYWJzKHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gaWRlYWxaKTtcblxuICAgICAgICBjb25zdCBjaGlsZE9wYWNpdHkgPSAoZmFkZUluICYmIHRpbGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24pID8gMSA6IGNsYW1wKGZhZGVJbiA/IHNpbmNlVGlsZSA6IDEgLSBzaW5jZVBhcmVudCwgMCwgMSk7XG5cbiAgICAgICAgLy8gd2UgZG9uJ3QgY3Jvc3NmYWRlIHRpbGVzIHRoYXQgd2VyZSBqdXN0IHJlZnJlc2hlZCB1cG9uIGV4cGlyaW5nOlxuICAgICAgICAvLyBvbmNlIHRoZXkncmUgb2xkIGVub3VnaCB0byBwYXNzIHRoZSBjcm9zc2ZhZGluZyB0aHJlc2hvbGRcbiAgICAgICAgLy8gKGZhZGVEdXJhdGlvbiksIHVuc2V0IHRoZSBgcmVmcmVzaGVkVXBvbkV4cGlyYXRpb25gIGZsYWcgc28gd2UgZG9uJ3RcbiAgICAgICAgLy8gaW5jb3JyZWN0bHkgZmFpbCB0byBjcm9zc2ZhZGUgdGhlbSB3aGVuIHpvb21pbmdcbiAgICAgICAgaWYgKHRpbGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gJiYgc2luY2VUaWxlID49IDEpIHRpbGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gPSBmYWxzZTtcblxuICAgICAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgIG1peDogMSAtIGNoaWxkT3BhY2l0eVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogY2hpbGRPcGFjaXR5LFxuICAgICAgICAgICAgICAgIG1peDogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgbWl4OiAwXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQge1xuICAgIGJhY2tncm91bmRVbmlmb3JtVmFsdWVzLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlc1xufSBmcm9tICcuL3Byb2dyYW0vYmFja2dyb3VuZF9wcm9ncmFtJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBCYWNrZ3JvdW5kU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0JhY2tncm91bmQ7XG5cbmZ1bmN0aW9uIGRyYXdCYWNrZ3JvdW5kKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEJhY2tncm91bmRTdHlsZUxheWVyKSB7XG4gICAgY29uc3QgY29sb3IgPSBsYXllci5wYWludC5nZXQoJ2JhY2tncm91bmQtY29sb3InKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdiYWNrZ3JvdW5kLW9wYWNpdHknKTtcblxuICAgIGlmIChvcGFjaXR5ID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IHRyYW5zZm9ybS50aWxlU2l6ZTtcbiAgICBjb25zdCBpbWFnZSA9IGxheWVyLnBhaW50LmdldCgnYmFja2dyb3VuZC1wYXR0ZXJuJyk7XG4gICAgaWYgKHBhaW50ZXIuaXNQYXR0ZXJuTWlzc2luZyhpbWFnZSkpIHJldHVybjtcblxuICAgIGNvbnN0IHBhc3MgPSAoIWltYWdlICYmIGNvbG9yLmEgPT09IDEgJiYgb3BhY2l0eSA9PT0gMSAmJiBwYWludGVyLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSkgPyAnb3BhcXVlJyA6ICd0cmFuc2x1Y2VudCc7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gcGFzcykgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIHBhc3MgPT09ICdvcGFxdWUnID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKGltYWdlID8gJ2JhY2tncm91bmRQYXR0ZXJuJyA6ICdiYWNrZ3JvdW5kJyk7XG5cbiAgICBjb25zdCB0aWxlSURzID0gdHJhbnNmb3JtLmNvdmVyaW5nVGlsZXMoe3RpbGVTaXplfSk7XG5cbiAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgIHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmJpbmQocGFpbnRlci5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBjcm9zc2ZhZGUgPSBsYXllci5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG4gICAgZm9yIChjb25zdCB0aWxlSUQgb2YgdGlsZUlEcykge1xuICAgICAgICBjb25zdCBtYXRyaXggPSBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZUlELnRvVW53cmFwcGVkKCkpO1xuXG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSBpbWFnZSA/XG4gICAgICAgICAgICBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1WYWx1ZXMobWF0cml4LCBvcGFjaXR5LCBwYWludGVyLCBpbWFnZSwge3RpbGVJRCwgdGlsZVNpemV9LCBjcm9zc2ZhZGUpIDpcbiAgICAgICAgICAgIGJhY2tncm91bmRVbmlmb3JtVmFsdWVzKG1hdHJpeCwgb3BhY2l0eSwgY29sb3IpO1xuXG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIHBhaW50ZXIudGlsZUV4dGVudEJ1ZmZlcixcbiAgICAgICAgICAgIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHBhaW50ZXIudGlsZUV4dGVudFNlZ21lbnRzKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBtYXQ0IH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuaW1wb3J0IHsgUG9zQXJyYXkgfSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcbmltcG9ydCB7IExpbmVJbmRleEFycmF5IH0gZnJvbSAnLi4vZGF0YS9pbmRleF9hcnJheV90eXBlJztcbmltcG9ydCBwb3NBdHRyaWJ1dGVzIGZyb20gJy4uL2RhdGEvcG9zX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50JztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHsgZGVidWdVbmlmb3JtVmFsdWVzIH0gZnJvbSAnLi9wcm9ncmFtL2RlYnVnX3Byb2dyYW0nO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0RlYnVnO1xuXG5mdW5jdGlvbiBkcmF3RGVidWcocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZHJhd0RlYnVnVGlsZShwYWludGVyLCBzb3VyY2VDYWNoZSwgY29vcmRzW2ldKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdEZWJ1Z1RpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGNvb3JkKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBjb25zdCBwb3NNYXRyaXggPSBjb29yZC5wb3NNYXRyaXg7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnZGVidWcnKTtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IERlcHRoTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuICAgIGNvbnN0IGlkID0gJyRkZWJ1Zyc7XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORV9TVFJJUCwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIGRlYnVnVW5pZm9ybVZhbHVlcyhwb3NNYXRyaXgsIENvbG9yLnJlZCksIGlkLFxuICAgICAgICBwYWludGVyLmRlYnVnQnVmZmVyLCBwYWludGVyLnRpbGVCb3JkZXJJbmRleEJ1ZmZlciwgcGFpbnRlci5kZWJ1Z1NlZ21lbnRzKTtcblxuICAgIGNvbnN0IHRpbGVSYXdEYXRhID0gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoY29vcmQua2V5KS5sYXRlc3RSYXdUaWxlRGF0YTtcbiAgICBjb25zdCB0aWxlQnl0ZUxlbmd0aCA9ICh0aWxlUmF3RGF0YSAmJiB0aWxlUmF3RGF0YS5ieXRlTGVuZ3RoKSB8fCAwO1xuICAgIGNvbnN0IHRpbGVTaXplS2IgPSBNYXRoLmZsb29yKHRpbGVCeXRlTGVuZ3RoIC8gMTAyNCk7XG4gICAgY29uc3QgdGlsZVNpemUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKS50aWxlU2l6ZTtcbiAgICBjb25zdCBzY2FsZVJhdGlvID0gNTEyIC8gTWF0aC5taW4odGlsZVNpemUsIDUxMik7XG4gICAgY29uc3QgdmVydGljZXMgPSBjcmVhdGVUZXh0VmVydGljZXMoYCR7Y29vcmQudG9TdHJpbmcoKX0gJHt0aWxlU2l6ZUtifWtiYCwgNTAsIDIwMCAqIHNjYWxlUmF0aW8sIDUgKiBzY2FsZVJhdGlvKTtcbiAgICBjb25zdCBkZWJ1Z1RleHRBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgIGNvbnN0IGRlYnVnVGV4dEluZGljZXMgPSBuZXcgTGluZUluZGV4QXJyYXkoKTtcbiAgICBmb3IgKGxldCB2ID0gMDsgdiA8IHZlcnRpY2VzLmxlbmd0aDsgdiArPSAyKSB7XG4gICAgICAgIGRlYnVnVGV4dEFycmF5LmVtcGxhY2VCYWNrKHZlcnRpY2VzW3ZdLCB2ZXJ0aWNlc1t2ICsgMV0pO1xuICAgICAgICBkZWJ1Z1RleHRJbmRpY2VzLmVtcGxhY2VCYWNrKHYsIHYgKyAxKTtcbiAgICB9XG4gICAgY29uc3QgZGVidWdUZXh0QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIoZGVidWdUZXh0QXJyYXksIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgY29uc3QgZGVidWdUZXh0SW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKGRlYnVnVGV4dEluZGljZXMpO1xuICAgIGNvbnN0IGRlYnVnVGV4dFNlZ21lbnQgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgZGVidWdUZXh0QXJyYXkubGVuZ3RoIC8gMiwgZGVidWdUZXh0QXJyYXkubGVuZ3RoIC8gMik7XG5cbiAgICAvLyBEcmF3IHRoZSBoYWxvIHdpdGggbXVsdGlwbGUgMXB4IGxpbmVzIGluc3RlYWQgb2Ygb25lIHdpZGVyIGxpbmUgYmVjYXVzZVxuICAgIC8vIHRoZSBnbCBzcGVjIGRvZXNuJ3QgZ3VhcmFudGVlIHN1cHBvcnQgZm9yIGxpbmVzIHdpdGggd2lkdGggPiAxLlxuICAgIGNvbnN0IG9uZVBpeGVsID0gRVhURU5UIC8gKE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20gLSBjb29yZC5vdmVyc2NhbGVkWikgKiB0aWxlU2l6ZSAqIHNjYWxlUmF0aW8pO1xuXG4gICAgY29uc3QgaGFsb1dpZHRoID0gMTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBbXTtcbiAgICBmb3IgKGxldCB4ID0gLWhhbG9XaWR0aDsgeCA8PSBoYWxvV2lkdGg7IHgrKykge1xuICAgICAgICBmb3IgKGxldCB5ID0gLWhhbG9XaWR0aDsgeSA8PSBoYWxvV2lkdGg7IHkrKykge1xuICAgICAgICAgICAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IGRyYXcgdGhlIGhhbG8gYXQgMCwwIHNpbmNlIHRoZSB0ZXh0IGlzIGRyYXduIHRoZXJlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyYW5zbGF0aW9ucy5wdXNoKFt4LCB5XSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYW5zbGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tpXTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgZGVidWdVbmlmb3JtVmFsdWVzKFxuICAgICAgICAgICAgICAgIG1hdDQudHJhbnNsYXRlKFtdLCBwb3NNYXRyaXgsIFtcbiAgICAgICAgICAgICAgICAgICAgb25lUGl4ZWwgKiB0cmFuc2xhdGlvblswXSxcbiAgICAgICAgICAgICAgICAgICAgb25lUGl4ZWwgKiB0cmFuc2xhdGlvblsxXSwgMF0pLFxuICAgICAgICAgICAgICAgIENvbG9yLndoaXRlKSxcbiAgICAgICAgICAgIGlkLCBkZWJ1Z1RleHRCdWZmZXIsIGRlYnVnVGV4dEluZGV4QnVmZmVyLCBkZWJ1Z1RleHRTZWdtZW50KTtcbiAgICB9XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICBkZWJ1Z1VuaWZvcm1WYWx1ZXMocG9zTWF0cml4LCBDb2xvci5ibGFjayksIGlkLFxuICAgICAgICBkZWJ1Z1RleHRCdWZmZXIsIGRlYnVnVGV4dEluZGV4QnVmZmVyLCBkZWJ1Z1RleHRTZWdtZW50KTtcbn1cblxuLy8gRm9udCBkYXRhIEZyb20gSGVyc2hleSBTaW1wbGV4IEZvbnRcbi8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9kYXRhZm9ybWF0cy9oZXJzaGV5L1xuY29uc3Qgc2ltcGxleEZvbnQgPSB7XG4gICAgXCIgXCI6IFsxNiwgW11dLFxuICAgIFwiIVwiOiBbMTAsIFs1LCAyMSwgNSwgNywgLTEsIC0xLCA1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCJcXFwiXCI6IFsxNiwgWzQsIDIxLCA0LCAxNCwgLTEsIC0xLCAxMiwgMjEsIDEyLCAxNF1dLFxuICAgIFwiI1wiOiBbMjEsIFsxMSwgMjUsIDQsIC03LCAtMSwgLTEsIDE3LCAyNSwgMTAsIC03LCAtMSwgLTEsIDQsIDEyLCAxOCwgMTIsIC0xLCAtMSwgMywgNiwgMTcsIDZdXSxcbiAgICBcIiRcIjogWzIwLCBbOCwgMjUsIDgsIC00LCAtMSwgLTEsIDEyLCAyNSwgMTIsIC00LCAtMSwgLTEsIDE3LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxLCA1LCAyMCwgMywgMTgsIDMsIDE2LCA0LCAxNCwgNSwgMTMsIDcsIDEyLCAxMywgMTAsIDE1LCA5LCAxNiwgOCwgMTcsIDYsIDE3LCAzLCAxNSwgMSwgMTIsIDAsIDgsIDAsIDUsIDEsIDMsIDNdXSxcbiAgICBcIiVcIjogWzI0LCBbMjEsIDIxLCAzLCAwLCAtMSwgLTEsIDgsIDIxLCAxMCwgMTksIDEwLCAxNywgOSwgMTUsIDcsIDE0LCA1LCAxNCwgMywgMTYsIDMsIDE4LCA0LCAyMCwgNiwgMjEsIDgsIDIxLCAxMCwgMjAsIDEzLCAxOSwgMTYsIDE5LCAxOSwgMjAsIDIxLCAyMSwgLTEsIC0xLCAxNywgNywgMTUsIDYsIDE0LCA0LCAxNCwgMiwgMTYsIDAsIDE4LCAwLCAyMCwgMSwgMjEsIDMsIDIxLCA1LCAxOSwgNywgMTcsIDddXSxcbiAgICBcIiZcIjogWzI2LCBbMjMsIDEyLCAyMywgMTMsIDIyLCAxNCwgMjEsIDE0LCAyMCwgMTMsIDE5LCAxMSwgMTcsIDYsIDE1LCAzLCAxMywgMSwgMTEsIDAsIDcsIDAsIDUsIDEsIDQsIDIsIDMsIDQsIDMsIDYsIDQsIDgsIDUsIDksIDEyLCAxMywgMTMsIDE0LCAxNCwgMTYsIDE0LCAxOCwgMTMsIDIwLCAxMSwgMjEsIDksIDIwLCA4LCAxOCwgOCwgMTYsIDksIDEzLCAxMSwgMTAsIDE2LCAzLCAxOCwgMSwgMjAsIDAsIDIyLCAwLCAyMywgMSwgMjMsIDJdXSxcbiAgICBcIidcIjogWzEwLCBbNSwgMTksIDQsIDIwLCA1LCAyMSwgNiwgMjAsIDYsIDE4LCA1LCAxNiwgNCwgMTVdXSxcbiAgICBcIihcIjogWzE0LCBbMTEsIDI1LCA5LCAyMywgNywgMjAsIDUsIDE2LCA0LCAxMSwgNCwgNywgNSwgMiwgNywgLTIsIDksIC01LCAxMSwgLTddXSxcbiAgICBcIilcIjogWzE0LCBbMywgMjUsIDUsIDIzLCA3LCAyMCwgOSwgMTYsIDEwLCAxMSwgMTAsIDcsIDksIDIsIDcsIC0yLCA1LCAtNSwgMywgLTddXSxcbiAgICBcIipcIjogWzE2LCBbOCwgMjEsIDgsIDksIC0xLCAtMSwgMywgMTgsIDEzLCAxMiwgLTEsIC0xLCAxMywgMTgsIDMsIDEyXV0sXG4gICAgXCIrXCI6IFsyNiwgWzEzLCAxOCwgMTMsIDAsIC0xLCAtMSwgNCwgOSwgMjIsIDldXSxcbiAgICBcIixcIjogWzEwLCBbNiwgMSwgNSwgMCwgNCwgMSwgNSwgMiwgNiwgMSwgNiwgLTEsIDUsIC0zLCA0LCAtNF1dLFxuICAgIFwiLVwiOiBbMjYsIFs0LCA5LCAyMiwgOV1dLFxuICAgIFwiLlwiOiBbMTAsIFs1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCIvXCI6IFsyMiwgWzIwLCAyNSwgMiwgLTddXSxcbiAgICBcIjBcIjogWzIwLCBbOSwgMjEsIDYsIDIwLCA0LCAxNywgMywgMTIsIDMsIDksIDQsIDQsIDYsIDEsIDksIDAsIDExLCAwLCAxNCwgMSwgMTYsIDQsIDE3LCA5LCAxNywgMTIsIDE2LCAxNywgMTQsIDIwLCAxMSwgMjEsIDksIDIxXV0sXG4gICAgXCIxXCI6IFsyMCwgWzYsIDE3LCA4LCAxOCwgMTEsIDIxLCAxMSwgMF1dLFxuICAgIFwiMlwiOiBbMjAsIFs0LCAxNiwgNCwgMTcsIDUsIDE5LCA2LCAyMCwgOCwgMjEsIDEyLCAyMSwgMTQsIDIwLCAxNSwgMTksIDE2LCAxNywgMTYsIDE1LCAxNSwgMTMsIDEzLCAxMCwgMywgMCwgMTcsIDBdXSxcbiAgICBcIjNcIjogWzIwLCBbNSwgMjEsIDE2LCAyMSwgMTAsIDEzLCAxMywgMTMsIDE1LCAxMiwgMTYsIDExLCAxNywgOCwgMTcsIDYsIDE2LCAzLCAxNCwgMSwgMTEsIDAsIDgsIDAsIDUsIDEsIDQsIDIsIDMsIDRdXSxcbiAgICBcIjRcIjogWzIwLCBbMTMsIDIxLCAzLCA3LCAxOCwgNywgLTEsIC0xLCAxMywgMjEsIDEzLCAwXV0sXG4gICAgXCI1XCI6IFsyMCwgWzE1LCAyMSwgNSwgMjEsIDQsIDEyLCA1LCAxMywgOCwgMTQsIDExLCAxNCwgMTQsIDEzLCAxNiwgMTEsIDE3LCA4LCAxNywgNiwgMTYsIDMsIDE0LCAxLCAxMSwgMCwgOCwgMCwgNSwgMSwgNCwgMiwgMywgNF1dLFxuICAgIFwiNlwiOiBbMjAsIFsxNiwgMTgsIDE1LCAyMCwgMTIsIDIxLCAxMCwgMjEsIDcsIDIwLCA1LCAxNywgNCwgMTIsIDQsIDcsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMSwgMCwgMTQsIDEsIDE2LCAzLCAxNywgNiwgMTcsIDcsIDE2LCAxMCwgMTQsIDEyLCAxMSwgMTMsIDEwLCAxMywgNywgMTIsIDUsIDEwLCA0LCA3XV0sXG4gICAgXCI3XCI6IFsyMCwgWzE3LCAyMSwgNywgMCwgLTEsIC0xLCAzLCAyMSwgMTcsIDIxXV0sXG4gICAgXCI4XCI6IFsyMCwgWzgsIDIxLCA1LCAyMCwgNCwgMTgsIDQsIDE2LCA1LCAxNCwgNywgMTMsIDExLCAxMiwgMTQsIDExLCAxNiwgOSwgMTcsIDcsIDE3LCA0LCAxNiwgMiwgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCA0LCAyLCAzLCA0LCAzLCA3LCA0LCA5LCA2LCAxMSwgOSwgMTIsIDEzLCAxMywgMTUsIDE0LCAxNiwgMTYsIDE2LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxXV0sXG4gICAgXCI5XCI6IFsyMCwgWzE2LCAxNCwgMTUsIDExLCAxMywgOSwgMTAsIDgsIDksIDgsIDYsIDksIDQsIDExLCAzLCAxNCwgMywgMTUsIDQsIDE4LCA2LCAyMCwgOSwgMjEsIDEwLCAyMSwgMTMsIDIwLCAxNSwgMTgsIDE2LCAxNCwgMTYsIDksIDE1LCA0LCAxMywgMSwgMTAsIDAsIDgsIDAsIDUsIDEsIDQsIDNdXSxcbiAgICBcIjpcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDUsIDIsIDQsIDEsIDUsIDAsIDYsIDEsIDUsIDJdXSxcbiAgICBcIjtcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDYsIDEsIDUsIDAsIDQsIDEsIDUsIDIsIDYsIDEsIDYsIC0xLCA1LCAtMywgNCwgLTRdXSxcbiAgICBcIjxcIjogWzI0LCBbMjAsIDE4LCA0LCA5LCAyMCwgMF1dLFxuICAgIFwiPVwiOiBbMjYsIFs0LCAxMiwgMjIsIDEyLCAtMSwgLTEsIDQsIDYsIDIyLCA2XV0sXG4gICAgXCI+XCI6IFsyNCwgWzQsIDE4LCAyMCwgOSwgNCwgMF1dLFxuICAgIFwiP1wiOiBbMTgsIFszLCAxNiwgMywgMTcsIDQsIDE5LCA1LCAyMCwgNywgMjEsIDExLCAyMSwgMTMsIDIwLCAxNCwgMTksIDE1LCAxNywgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMiwgOSwgMTAsIDksIDcsIC0xLCAtMSwgOSwgMiwgOCwgMSwgOSwgMCwgMTAsIDEsIDksIDJdXSxcbiAgICBcIkBcIjogWzI3LCBbMTgsIDEzLCAxNywgMTUsIDE1LCAxNiwgMTIsIDE2LCAxMCwgMTUsIDksIDE0LCA4LCAxMSwgOCwgOCwgOSwgNiwgMTEsIDUsIDE0LCA1LCAxNiwgNiwgMTcsIDgsIC0xLCAtMSwgMTIsIDE2LCAxMCwgMTQsIDksIDExLCA5LCA4LCAxMCwgNiwgMTEsIDUsIC0xLCAtMSwgMTgsIDE2LCAxNywgOCwgMTcsIDYsIDE5LCA1LCAyMSwgNSwgMjMsIDcsIDI0LCAxMCwgMjQsIDEyLCAyMywgMTUsIDIyLCAxNywgMjAsIDE5LCAxOCwgMjAsIDE1LCAyMSwgMTIsIDIxLCA5LCAyMCwgNywgMTksIDUsIDE3LCA0LCAxNSwgMywgMTIsIDMsIDksIDQsIDYsIDUsIDQsIDcsIDIsIDksIDEsIDEyLCAwLCAxNSwgMCwgMTgsIDEsIDIwLCAyLCAyMSwgMywgLTEsIC0xLCAxOSwgMTYsIDE4LCA4LCAxOCwgNiwgMTksIDVdXSxcbiAgICBcIkFcIjogWzE4LCBbOSwgMjEsIDEsIDAsIC0xLCAtMSwgOSwgMjEsIDE3LCAwLCAtMSwgLTEsIDQsIDcsIDE0LCA3XV0sXG4gICAgXCJCXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgLTEsIC0xLCA0LCAxMSwgMTMsIDExLCAxNiwgMTAsIDE3LCA5LCAxOCwgNywgMTgsIDQsIDE3LCAyLCAxNiwgMSwgMTMsIDAsIDQsIDBdXSxcbiAgICBcIkNcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1XV0sXG4gICAgXCJEXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMSwgMjEsIDE0LCAyMCwgMTYsIDE4LCAxNywgMTYsIDE4LCAxMywgMTgsIDgsIDE3LCA1LCAxNiwgMywgMTQsIDEsIDExLCAwLCA0LCAwXV0sXG4gICAgXCJFXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxNywgMjEsIC0xLCAtMSwgNCwgMTEsIDEyLCAxMSwgLTEsIC0xLCA0LCAwLCAxNywgMF1dLFxuICAgIFwiRlwiOiBbMTgsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTcsIDIxLCAtMSwgLTEsIDQsIDExLCAxMiwgMTFdXSxcbiAgICBcIkdcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOCwgOCwgLTEsIC0xLCAxMywgOCwgMTgsIDhdXSxcbiAgICBcIkhcIjogWzIyLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMCwgLTEsIC0xLCA0LCAxMSwgMTgsIDExXV0sXG4gICAgXCJJXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIkpcIjogWzE2LCBbMTIsIDIxLCAxMiwgNSwgMTEsIDIsIDEwLCAxLCA4LCAwLCA2LCAwLCA0LCAxLCAzLCAyLCAyLCA1LCAyLCA3XV0sXG4gICAgXCJLXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDE4LCAyMSwgNCwgNywgLTEsIC0xLCA5LCAxMiwgMTgsIDBdXSxcbiAgICBcIkxcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMCwgMTYsIDBdXSxcbiAgICBcIk1cIjogWzI0LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDEyLCAwLCAtMSwgLTEsIDIwLCAyMSwgMTIsIDAsIC0xLCAtMSwgMjAsIDIxLCAyMCwgMF1dLFxuICAgIFwiTlwiOiBbMjIsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTgsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMF1dLFxuICAgIFwiT1wiOiBbMjIsIFs5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOSwgOCwgMTksIDEzLCAxOCwgMTYsIDE3LCAxOCwgMTUsIDIwLCAxMywgMjEsIDksIDIxXV0sXG4gICAgXCJQXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNCwgMTcsIDEyLCAxNiwgMTEsIDEzLCAxMCwgNCwgMTBdXSxcbiAgICBcIlFcIjogWzIyLCBbOSwgMjEsIDcsIDIwLCA1LCAxOCwgNCwgMTYsIDMsIDEzLCAzLCA4LCA0LCA1LCA1LCAzLCA3LCAxLCA5LCAwLCAxMywgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNSwgMTksIDgsIDE5LCAxMywgMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgLTEsIC0xLCAxMiwgNCwgMTgsIC0yXV0sXG4gICAgXCJSXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgNCwgMTEsIC0xLCAtMSwgMTEsIDExLCAxOCwgMF1dLFxuICAgIFwiU1wiOiBbMjAsIFsxNywgMTgsIDE1LCAyMCwgMTIsIDIxLCA4LCAyMSwgNSwgMjAsIDMsIDE4LCAzLCAxNiwgNCwgMTQsIDUsIDEzLCA3LCAxMiwgMTMsIDEwLCAxNSwgOSwgMTYsIDgsIDE3LCA2LCAxNywgMywgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCAzLCAzXV0sXG4gICAgXCJUXCI6IFsxNiwgWzgsIDIxLCA4LCAwLCAtMSwgLTEsIDEsIDIxLCAxNSwgMjFdXSxcbiAgICBcIlVcIjogWzIyLCBbNCwgMjEsIDQsIDYsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMiwgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNiwgMTgsIDIxXV0sXG4gICAgXCJWXCI6IFsxOCwgWzEsIDIxLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMF1dLFxuICAgIFwiV1wiOiBbMjQsIFsyLCAyMSwgNywgMCwgLTEsIC0xLCAxMiwgMjEsIDcsIDAsIC0xLCAtMSwgMTIsIDIxLCAxNywgMCwgLTEsIC0xLCAyMiwgMjEsIDE3LCAwXV0sXG4gICAgXCJYXCI6IFsyMCwgWzMsIDIxLCAxNywgMCwgLTEsIC0xLCAxNywgMjEsIDMsIDBdXSxcbiAgICBcIllcIjogWzE4LCBbMSwgMjEsIDksIDExLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMTFdXSxcbiAgICBcIlpcIjogWzIwLCBbMTcsIDIxLCAzLCAwLCAtMSwgLTEsIDMsIDIxLCAxNywgMjEsIC0xLCAtMSwgMywgMCwgMTcsIDBdXSxcbiAgICBcIltcIjogWzE0LCBbNCwgMjUsIDQsIC03LCAtMSwgLTEsIDUsIDI1LCA1LCAtNywgLTEsIC0xLCA0LCAyNSwgMTEsIDI1LCAtMSwgLTEsIDQsIC03LCAxMSwgLTddXSxcbiAgICBcIlxcXFxcIjogWzE0LCBbMCwgMjEsIDE0LCAtM11dLFxuICAgIFwiXVwiOiBbMTQsIFs5LCAyNSwgOSwgLTcsIC0xLCAtMSwgMTAsIDI1LCAxMCwgLTcsIC0xLCAtMSwgMywgMjUsIDEwLCAyNSwgLTEsIC0xLCAzLCAtNywgMTAsIC03XV0sXG4gICAgXCJeXCI6IFsxNiwgWzYsIDE1LCA4LCAxOCwgMTAsIDE1LCAtMSwgLTEsIDMsIDEyLCA4LCAxNywgMTMsIDEyLCAtMSwgLTEsIDgsIDE3LCA4LCAwXV0sXG4gICAgXCJfXCI6IFsxNiwgWzAsIC0yLCAxNiwgLTJdXSxcbiAgICBcImBcIjogWzEwLCBbNiwgMjEsIDUsIDIwLCA0LCAxOCwgNCwgMTYsIDUsIDE1LCA2LCAxNiwgNSwgMTddXSxcbiAgICBcImFcIjogWzE5LCBbMTUsIDE0LCAxNSwgMCwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJiXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDExLCA2LCAxMywgOCwgMTQsIDExLCAxNCwgMTMsIDEzLCAxNSwgMTEsIDE2LCA4LCAxNiwgNiwgMTUsIDMsIDEzLCAxLCAxMSwgMCwgOCwgMCwgNiwgMSwgNCwgM11dLFxuICAgIFwiY1wiOiBbMTgsIFsxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJkXCI6IFsxOSwgWzE1LCAyMSwgMTUsIDAsIC0xLCAtMSwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiZVwiOiBbMTgsIFszLCA4LCAxNSwgOCwgMTUsIDEwLCAxNCwgMTIsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJmXCI6IFsxMiwgWzEwLCAyMSwgOCwgMjEsIDYsIDIwLCA1LCAxNywgNSwgMCwgLTEsIC0xLCAyLCAxNCwgOSwgMTRdXSxcbiAgICBcImdcIjogWzE5LCBbMTUsIDE0LCAxNSwgLTIsIDE0LCAtNSwgMTMsIC02LCAxMSwgLTcsIDgsIC03LCA2LCAtNiwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJoXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDEwLCA3LCAxMywgOSwgMTQsIDEyLCAxNCwgMTQsIDEzLCAxNSwgMTAsIDE1LCAwXV0sXG4gICAgXCJpXCI6IFs4LCBbMywgMjEsIDQsIDIwLCA1LCAyMSwgNCwgMjIsIDMsIDIxLCAtMSwgLTEsIDQsIDE0LCA0LCAwXV0sXG4gICAgXCJqXCI6IFsxMCwgWzUsIDIxLCA2LCAyMCwgNywgMjEsIDYsIDIyLCA1LCAyMSwgLTEsIC0xLCA2LCAxNCwgNiwgLTMsIDUsIC02LCAzLCAtNywgMSwgLTddXSxcbiAgICBcImtcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTQsIDE0LCA0LCA0LCAtMSwgLTEsIDgsIDgsIDE1LCAwXV0sXG4gICAgXCJsXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIm1cIjogWzMwLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDAsIC0xLCAtMSwgMTUsIDEwLCAxOCwgMTMsIDIwLCAxNCwgMjMsIDE0LCAyNSwgMTMsIDI2LCAxMCwgMjYsIDBdXSxcbiAgICBcIm5cIjogWzE5LCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDBdXSxcbiAgICBcIm9cIjogWzE5LCBbOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgMywgMTYsIDYsIDE2LCA4LCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNF1dLFxuICAgIFwicFwiOiBbMTksIFs0LCAxNCwgNCwgLTcsIC0xLCAtMSwgNCwgMTEsIDYsIDEzLCA4LCAxNCwgMTEsIDE0LCAxMywgMTMsIDE1LCAxMSwgMTYsIDgsIDE2LCA2LCAxNSwgMywgMTMsIDEsIDExLCAwLCA4LCAwLCA2LCAxLCA0LCAzXV0sXG4gICAgXCJxXCI6IFsxOSwgWzE1LCAxNCwgMTUsIC03LCAtMSwgLTEsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcInJcIjogWzEzLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgOCwgNSwgMTEsIDcsIDEzLCA5LCAxNCwgMTIsIDE0XV0sXG4gICAgXCJzXCI6IFsxNywgWzE0LCAxMSwgMTMsIDEzLCAxMCwgMTQsIDcsIDE0LCA0LCAxMywgMywgMTEsIDQsIDksIDYsIDgsIDExLCA3LCAxMywgNiwgMTQsIDQsIDE0LCAzLCAxMywgMSwgMTAsIDAsIDcsIDAsIDQsIDEsIDMsIDNdXSxcbiAgICBcInRcIjogWzEyLCBbNSwgMjEsIDUsIDQsIDYsIDEsIDgsIDAsIDEwLCAwLCAtMSwgLTEsIDIsIDE0LCA5LCAxNF1dLFxuICAgIFwidVwiOiBbMTksIFs0LCAxNCwgNCwgNCwgNSwgMSwgNywgMCwgMTAsIDAsIDEyLCAxLCAxNSwgNCwgLTEsIC0xLCAxNSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ2XCI6IFsxNiwgWzIsIDE0LCA4LCAwLCAtMSwgLTEsIDE0LCAxNCwgOCwgMF1dLFxuICAgIFwid1wiOiBbMjIsIFszLCAxNCwgNywgMCwgLTEsIC0xLCAxMSwgMTQsIDcsIDAsIC0xLCAtMSwgMTEsIDE0LCAxNSwgMCwgLTEsIC0xLCAxOSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ4XCI6IFsxNywgWzMsIDE0LCAxNCwgMCwgLTEsIC0xLCAxNCwgMTQsIDMsIDBdXSxcbiAgICBcInlcIjogWzE2LCBbMiwgMTQsIDgsIDAsIC0xLCAtMSwgMTQsIDE0LCA4LCAwLCA2LCAtNCwgNCwgLTYsIDIsIC03LCAxLCAtN11dLFxuICAgIFwielwiOiBbMTcsIFsxNCwgMTQsIDMsIDAsIC0xLCAtMSwgMywgMTQsIDE0LCAxNCwgLTEsIC0xLCAzLCAwLCAxNCwgMF1dLFxuICAgIFwie1wiOiBbMTQsIFs5LCAyNSwgNywgMjQsIDYsIDIzLCA1LCAyMSwgNSwgMTksIDYsIDE3LCA3LCAxNiwgOCwgMTQsIDgsIDEyLCA2LCAxMCwgLTEsIC0xLCA3LCAyNCwgNiwgMjIsIDYsIDIwLCA3LCAxOCwgOCwgMTcsIDksIDE1LCA5LCAxMywgOCwgMTEsIDQsIDksIDgsIDcsIDksIDUsIDksIDMsIDgsIDEsIDcsIDAsIDYsIC0yLCA2LCAtNCwgNywgLTYsIC0xLCAtMSwgNiwgOCwgOCwgNiwgOCwgNCwgNywgMiwgNiwgMSwgNSwgLTEsIDUsIC0zLCA2LCAtNSwgNywgLTYsIDksIC03XV0sXG4gICAgXCJ8XCI6IFs4LCBbNCwgMjUsIDQsIC03XV0sXG4gICAgXCJ9XCI6IFsxNCwgWzUsIDI1LCA3LCAyNCwgOCwgMjMsIDksIDIxLCA5LCAxOSwgOCwgMTcsIDcsIDE2LCA2LCAxNCwgNiwgMTIsIDgsIDEwLCAtMSwgLTEsIDcsIDI0LCA4LCAyMiwgOCwgMjAsIDcsIDE4LCA2LCAxNywgNSwgMTUsIDUsIDEzLCA2LCAxMSwgMTAsIDksIDYsIDcsIDUsIDUsIDUsIDMsIDYsIDEsIDcsIDAsIDgsIC0yLCA4LCAtNCwgNywgLTYsIC0xLCAtMSwgOCwgOCwgNiwgNiwgNiwgNCwgNywgMiwgOCwgMSwgOSwgLTEsIDksIC0zLCA4LCAtNSwgNywgLTYsIDUsIC03XV0sXG4gICAgXCJ+XCI6IFsyNCwgWzMsIDYsIDMsIDgsIDQsIDExLCA2LCAxMiwgOCwgMTIsIDEwLCAxMSwgMTQsIDgsIDE2LCA3LCAxOCwgNywgMjAsIDgsIDIxLCAxMCwgLTEsIC0xLCAzLCA4LCA0LCAxMCwgNiwgMTEsIDgsIDExLCAxMCwgMTAsIDE0LCA3LCAxNiwgNiwgMTgsIDYsIDIwLCA3LCAyMSwgMTAsIDIxLCAxMl1dXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUZXh0VmVydGljZXModGV4dCwgbGVmdCwgYmFzZWxpbmUsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxO1xuXG4gICAgY29uc3Qgc3Ryb2tlcyA9IFtdO1xuICAgIGxldCBpLCBsZW4sIGosIGxlbjIsIGdseXBoLCB4LCB5LCBwcmV2O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gdGV4dC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBnbHlwaCA9IHNpbXBsZXhGb250W3RleHRbaV1dO1xuICAgICAgICBpZiAoIWdseXBoKSBjb250aW51ZTtcbiAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgZm9yIChqID0gMCwgbGVuMiA9IGdseXBoWzFdLmxlbmd0aDsgaiA8IGxlbjI7IGogKz0gMikge1xuICAgICAgICAgICAgaWYgKGdseXBoWzFdW2pdID09PSAtMSAmJiBnbHlwaFsxXVtqICsgMV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBnbHlwaFsxXVtqXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIHkgPSBiYXNlbGluZSAtIGdseXBoWzFdW2ogKyAxXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZXMucHVzaChwcmV2LngsIHByZXYueSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXYgPSB7eCwgeX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGVmdCArPSBnbHlwaFswXSAqIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJva2VzO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0N1c3RvbTtcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIEN1c3RvbVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyJztcblxuZnVuY3Rpb24gZHJhd0N1c3RvbShwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBDdXN0b21TdHlsZUxheWVyKSB7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGltcGxlbWVudGF0aW9uID0gbGF5ZXIuaW1wbGVtZW50YXRpb247XG5cbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAnb2Zmc2NyZWVuJykge1xuXG4gICAgICAgIGNvbnN0IHByZXJlbmRlciA9IGltcGxlbWVudGF0aW9uLnByZXJlbmRlcjtcbiAgICAgICAgaWYgKHByZXJlbmRlcikge1xuICAgICAgICAgICAgcGFpbnRlci5zZXRDdXN0b21MYXllckRlZmF1bHRzKCk7XG4gICAgICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG5cbiAgICAgICAgICAgIHByZXJlbmRlci5jYWxsKGltcGxlbWVudGF0aW9uLCBjb250ZXh0LmdsLCBwYWludGVyLnRyYW5zZm9ybS5jdXN0b21MYXllck1hdHJpeCgpKTtcblxuICAgICAgICAgICAgY29udGV4dC5zZXREaXJ0eSgpO1xuICAgICAgICAgICAgcGFpbnRlci5zZXRCYXNlU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcpIHtcblxuICAgICAgICBwYWludGVyLnNldEN1c3RvbUxheWVyRGVmYXVsdHMoKTtcblxuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG4gICAgICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUoU3RlbmNpbE1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IGltcGxlbWVudGF0aW9uLnJlbmRlcmluZ01vZGUgPT09ICczZCcgP1xuICAgICAgICAgICAgbmV3IERlcHRoTW9kZShwYWludGVyLmNvbnRleHQuZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZFdyaXRlLCBwYWludGVyLmRlcHRoUmFuZ2VGb3IzRCkgOlxuICAgICAgICAgICAgcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuXG4gICAgICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKGRlcHRoTW9kZSk7XG5cbiAgICAgICAgaW1wbGVtZW50YXRpb24ucmVuZGVyKGNvbnRleHQuZ2wsIHBhaW50ZXIudHJhbnNmb3JtLmN1c3RvbUxheWVyTWF0cml4KCkpO1xuXG4gICAgICAgIGNvbnRleHQuc2V0RGlydHkoKTtcbiAgICAgICAgcGFpbnRlci5zZXRCYXNlU3RhdGUoKTtcbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5cbmltcG9ydCB7IG1hdDQgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQgeyBSYXN0ZXJCb3VuZHNBcnJheSwgUG9zQXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheSB9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IHBvc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9wb3NfYXR0cmlidXRlcyc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IENyb3NzVGlsZVN5bWJvbEluZGV4IGZyb20gJy4uL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJzIGZyb20gJy4uL3NoYWRlcnMnO1xuaW1wb3J0IFByb2dyYW0gZnJvbSAnLi9wcm9ncmFtJztcbmltcG9ydCB7IHByb2dyYW1Vbmlmb3JtcyB9IGZyb20gJy4vcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zJztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlJztcbmltcG9ydCB1cGRhdGVUaWxlTWFza3MgZnJvbSAnLi90aWxlX21hc2snO1xuaW1wb3J0IHsgY2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlcyB9IGZyb20gJy4vcHJvZ3JhbS9jbGlwcGluZ19tYXNrX3Byb2dyYW0nO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQgc3ltYm9sIGZyb20gJy4vZHJhd19zeW1ib2wnO1xuaW1wb3J0IGNpcmNsZSBmcm9tICcuL2RyYXdfY2lyY2xlJztcbmltcG9ydCBoZWF0bWFwIGZyb20gJy4vZHJhd19oZWF0bWFwJztcbmltcG9ydCBsaW5lIGZyb20gJy4vZHJhd19saW5lJztcbmltcG9ydCBmaWxsIGZyb20gJy4vZHJhd19maWxsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uIGZyb20gJy4vZHJhd19maWxsX2V4dHJ1c2lvbic7XG5pbXBvcnQgaGlsbHNoYWRlIGZyb20gJy4vZHJhd19oaWxsc2hhZGUnO1xuaW1wb3J0IHJhc3RlciBmcm9tICcuL2RyYXdfcmFzdGVyJztcbmltcG9ydCBiYWNrZ3JvdW5kIGZyb20gJy4vZHJhd19iYWNrZ3JvdW5kJztcbmltcG9ydCBkZWJ1ZyBmcm9tICcuL2RyYXdfZGVidWcnO1xuaW1wb3J0IGN1c3RvbSBmcm9tICcuL2RyYXdfY3VzdG9tJztcblxuY29uc3QgZHJhdyA9IHtcbiAgICBzeW1ib2wsXG4gICAgY2lyY2xlLFxuICAgIGhlYXRtYXAsXG4gICAgbGluZSxcbiAgICBmaWxsLFxuICAgICdmaWxsLWV4dHJ1c2lvbic6IGZpbGxFeHRydXNpb24sXG4gICAgaGlsbHNoYWRlLFxuICAgIHJhc3RlcixcbiAgICBiYWNrZ3JvdW5kLFxuICAgIGRlYnVnLFxuICAgIGN1c3RvbVxufTtcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NGYWRlZH0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBMaW5lQXRsYXMgZnJvbSAnLi9saW5lX2F0bGFzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuL2ltYWdlX21hbmFnZXInO1xuaW1wb3J0IHR5cGUgR2x5cGhNYW5hZ2VyIGZyb20gJy4vZ2x5cGhfbWFuYWdlcic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUge0RlcHRoUmFuZ2VUeXBlLCBEZXB0aE1hc2tUeXBlLCBEZXB0aEZ1bmNUeXBlfSBmcm9tICcuLi9nbC90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFJlbmRlclBhc3MgPSAnb2Zmc2NyZWVuJyB8ICdvcGFxdWUnIHwgJ3RyYW5zbHVjZW50JztcblxudHlwZSBQYWludGVyT3B0aW9ucyA9IHtcbiAgICBzaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW4sXG4gICAgc2hvd1RpbGVCb3VuZGFyaWVzOiBib29sZWFuLFxuICAgIHJvdGF0aW5nOiBib29sZWFuLFxuICAgIHpvb21pbmc6IGJvb2xlYW4sXG4gICAgbW92aW5nOiBib29sZWFuLFxuICAgIGZhZGVEdXJhdGlvbjogbnVtYmVyXG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBwYWludGVyIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0NhbnZhc30gZ2wgYW4gZXhwZXJpbWVudGFsLXdlYmdsIGRyYXdpbmcgY29udGV4dFxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUGFpbnRlciB7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBfdGlsZVRleHR1cmVzOiB7IFtudW1iZXJdOiBBcnJheTxUZXh0dXJlPiB9O1xuICAgIG51bVN1YmxheWVyczogbnVtYmVyO1xuICAgIGRlcHRoRXBzaWxvbjogbnVtYmVyO1xuICAgIGVtcHR5UHJvZ3JhbUNvbmZpZ3VyYXRpb246IFByb2dyYW1Db25maWd1cmF0aW9uO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgZGVwdGhSYm86IFdlYkdMUmVuZGVyYnVmZmVyO1xuICAgIGRlcHRoUmJvTmVlZHNDbGVhcjogYm9vbGVhbjtcbiAgICB0aWxlRXh0ZW50QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgdGlsZUV4dGVudFNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIGRlYnVnQnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgZGVidWdTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICByYXN0ZXJCb3VuZHNCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICByYXN0ZXJCb3VuZHNTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICB2aWV3cG9ydEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIHZpZXdwb3J0U2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgcXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIHRpbGVCb3JkZXJJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgX3RpbGVDbGlwcGluZ01hc2tJRHM6IHsgW251bWJlcl06IG51bWJlciB9O1xuICAgIHN0ZW5jaWxDbGVhck1vZGU6IFN0ZW5jaWxNb2RlO1xuICAgIHN0eWxlOiBTdHlsZTtcbiAgICBvcHRpb25zOiBQYWludGVyT3B0aW9ucztcbiAgICBsaW5lQXRsYXM6IExpbmVBdGxhcztcbiAgICBpbWFnZU1hbmFnZXI6IEltYWdlTWFuYWdlcjtcbiAgICBnbHlwaE1hbmFnZXI6IEdseXBoTWFuYWdlcjtcbiAgICBkZXB0aFJhbmdlRm9yM0Q6IERlcHRoUmFuZ2VUeXBlO1xuICAgIG9wYXF1ZVBhc3NDdXRvZmY6IG51bWJlcjtcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzO1xuICAgIGN1cnJlbnRMYXllcjogbnVtYmVyO1xuICAgIGN1cnJlbnRTdGVuY2lsU291cmNlOiA/c3RyaW5nO1xuICAgIG5leHRTdGVuY2lsSUQ6IG51bWJlcjtcbiAgICBpZDogc3RyaW5nO1xuICAgIF9zaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW47XG4gICAgY2FjaGU6IHsgW3N0cmluZ106IFByb2dyYW08Kj4gfTtcbiAgICBjcm9zc1RpbGVTeW1ib2xJbmRleDogQ3Jvc3NUaWxlU3ltYm9sSW5kZXg7XG4gICAgc3ltYm9sRmFkZUNoYW5nZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHQoZ2wpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgdGhpcy5fdGlsZVRleHR1cmVzID0ge307XG5cbiAgICAgICAgdGhpcy5zZXR1cCgpO1xuXG4gICAgICAgIC8vIFdpdGhpbiBlYWNoIGxheWVyIHRoZXJlIGFyZSBtdWx0aXBsZSBkaXN0aW5jdCB6LXBsYW5lcyB0aGF0IGNhbiBiZSBkcmF3biB0by5cbiAgICAgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgV2ViR0wgZGVwdGggYnVmZmVyLlxuICAgICAgICB0aGlzLm51bVN1YmxheWVycyA9IFNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZyArIFNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nICsgMTtcbiAgICAgICAgdGhpcy5kZXB0aEVwc2lsb24gPSAxIC8gTWF0aC5wb3coMiwgMTYpO1xuXG4gICAgICAgIHRoaXMuZGVwdGhSYm9OZWVkc0NsZWFyID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmVtcHR5UHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24oKTtcblxuICAgICAgICB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IENyb3NzVGlsZVN5bWJvbEluZGV4KCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBVcGRhdGUgdGhlIEdMIHZpZXdwb3J0LCBwcm9qZWN0aW9uIG1hdHJpeCwgYW5kIHRyYW5zZm9ybXMgdG8gY29tcGVuc2F0ZVxuICAgICAqIGZvciBhIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlLlxuICAgICAqL1xuICAgIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcblxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB0aGlzLmNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgdGhpcy5zdHlsZS5fb3JkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZF0ucmVzaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kZXB0aFJibykge1xuICAgICAgICAgICAgZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKHRoaXMuZGVwdGhSYm8pO1xuICAgICAgICAgICAgdGhpcy5kZXB0aFJibyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXR1cCgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICBjb25zdCB0aWxlRXh0ZW50QXJyYXkgPSBuZXcgUG9zQXJyYXkoKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKDAsIEVYVEVOVCk7XG4gICAgICAgIHRpbGVFeHRlbnRBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCk7XG4gICAgICAgIHRoaXMudGlsZUV4dGVudEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRpbGVFeHRlbnRBcnJheSwgcG9zQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy50aWxlRXh0ZW50U2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG5cbiAgICAgICAgY29uc3QgZGVidWdBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5UKTtcbiAgICAgICAgZGVidWdBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCk7XG4gICAgICAgIHRoaXMuZGVidWdCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihkZWJ1Z0FycmF5LCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLmRlYnVnU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgNSk7XG5cbiAgICAgICAgY29uc3QgcmFzdGVyQm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgMCwgMCwgMCk7XG4gICAgICAgIHJhc3RlckJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCwgRVhURU5ULCAwKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5ULCAwLCBFWFRFTlQpO1xuICAgICAgICByYXN0ZXJCb3VuZHNBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCwgRVhURU5ULCBFWFRFTlQpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHJhc3RlckJvdW5kc0FycmF5LCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0QXJyYXkgPSBuZXcgUG9zQXJyYXkoKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygwLCAwKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAwKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygwLCAxKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAxKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHZpZXdwb3J0QXJyYXksIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMudmlld3BvcnRTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcblxuICAgICAgICBjb25zdCB0aWxlTGluZVN0cmlwSW5kaWNlcyA9IG5ldyBMaW5lU3RyaXBJbmRleEFycmF5KCk7XG4gICAgICAgIHRpbGVMaW5lU3RyaXBJbmRpY2VzLmVtcGxhY2VCYWNrKDApO1xuICAgICAgICB0aWxlTGluZVN0cmlwSW5kaWNlcy5lbXBsYWNlQmFjaygxKTtcbiAgICAgICAgdGlsZUxpbmVTdHJpcEluZGljZXMuZW1wbGFjZUJhY2soMyk7XG4gICAgICAgIHRpbGVMaW5lU3RyaXBJbmRpY2VzLmVtcGxhY2VCYWNrKDIpO1xuICAgICAgICB0aWxlTGluZVN0cmlwSW5kaWNlcy5lbXBsYWNlQmFjaygwKTtcbiAgICAgICAgdGhpcy50aWxlQm9yZGVySW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRpbGVMaW5lU3RyaXBJbmRpY2VzKTtcblxuICAgICAgICBjb25zdCBxdWFkVHJpYW5nbGVJbmRpY2VzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICBxdWFkVHJpYW5nbGVJbmRpY2VzLmVtcGxhY2VCYWNrKDAsIDEsIDIpO1xuICAgICAgICBxdWFkVHJpYW5nbGVJbmRpY2VzLmVtcGxhY2VCYWNrKDIsIDEsIDMpO1xuICAgICAgICB0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcihxdWFkVHJpYW5nbGVJbmRpY2VzKTtcblxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5zdGVuY2lsQ2xlYXJNb2RlID0gbmV3IFN0ZW5jaWxNb2RlKHsgZnVuYzogZ2wuQUxXQVlTLCBtYXNrOiAwIH0sIDB4MCwgMHhGRiwgZ2wuWkVSTywgZ2wuWkVSTywgZ2wuWkVSTyk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNldCB0aGUgZHJhd2luZyBjYW52YXMgYnkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyIHNvIHRoYXQgd2UgY2FuIGRyYXdcbiAgICAgKiBuZXcgdGlsZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdoaWxlIHJldGFpbmluZyBwcmV2aW91c2x5IGRyYXduIHBpeGVscy5cbiAgICAgKi9cbiAgICBjbGVhclN0ZW5jaWwoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICB0aGlzLm5leHRTdGVuY2lsSUQgPSAxO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy81NDkwLFxuICAgICAgICAvLyBwZW5kaW5nIGFuIHVwc3RyZWFtIGZpeCwgd2UgZHJhdyBhIGZ1bGxzY3JlZW4gc3RlbmNpbD0wIGNsaXBwaW5nIG1hc2sgaGVyZSxcbiAgICAgICAgLy8gZWZmZWN0aXZlbHkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyOiBvbmNlIGFuIHVwc3RyZWFtIHBhdGNoIGxhbmRzLCByZW1vdmVcbiAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBpbiBmYXZvciBvZiBjb250ZXh0LmNsZWFyKHsgc3RlbmNpbDogMHgwIH0pXG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5vcnRobyhtYXRyaXgsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCAwLCAxKTtcbiAgICAgICAgbWF0NC5zY2FsZShtYXRyaXgsIG1hdHJpeCwgW2dsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCwgMF0pO1xuXG4gICAgICAgIHRoaXMudXNlUHJvZ3JhbSgnY2xpcHBpbmdNYXNrJykuZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsXG4gICAgICAgICAgICBEZXB0aE1vZGUuZGlzYWJsZWQsIHRoaXMuc3RlbmNpbENsZWFyTW9kZSwgQ29sb3JNb2RlLmRpc2FibGVkLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzKG1hdHJpeCksXG4gICAgICAgICAgICAnJGNsaXBwaW5nJywgdGhpcy52aWV3cG9ydEJ1ZmZlcixcbiAgICAgICAgICAgIHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHRoaXMudmlld3BvcnRTZWdtZW50cyk7XG4gICAgfVxuXG4gICAgX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKGxheWVyOiBTdHlsZUxheWVyLCB0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9PT0gbGF5ZXIuc291cmNlIHx8ICFsYXllci5pc1RpbGVDbGlwcGVkKCkgfHwgIXRpbGVJRHMgfHwgIXRpbGVJRHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IGxheWVyLnNvdXJjZTtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKHRoaXMubmV4dFN0ZW5jaWxJRCArIHRpbGVJRHMubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgICAgICAvLyB3ZSdsbCBydW4gb3V0IG9mIGZyZXNoIElEcyBzbyB3ZSBuZWVkIHRvIGNsZWFyIGFuZCBzdGFydCBmcm9tIHNjcmF0Y2hcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShDb2xvck1vZGUuZGlzYWJsZWQpO1xuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShEZXB0aE1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnVzZVByb2dyYW0oJ2NsaXBwaW5nTWFzaycpO1xuXG4gICAgICAgIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbdGlsZUlELmtleV0gPSB0aGlzLm5leHRTdGVuY2lsSUQrKztcblxuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgRGVwdGhNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIC8vIFRlc3RzIHdpbGwgYWx3YXlzIHBhc3MsIGFuZCByZWYgdmFsdWUgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZW5jaWwgYnVmZmVyLlxuICAgICAgICAgICAgICAgIG5ldyBTdGVuY2lsTW9kZSh7IGZ1bmM6IGdsLkFMV0FZUywgbWFzazogMCB9LCBpZCwgMHhGRiwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuUkVQTEFDRSksXG4gICAgICAgICAgICAgICAgQ29sb3JNb2RlLmRpc2FibGVkLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsIGNsaXBwaW5nTWFza1VuaWZvcm1WYWx1ZXModGlsZUlELnBvc01hdHJpeCksXG4gICAgICAgICAgICAgICAgJyRjbGlwcGluZycsIHRoaXMudGlsZUV4dGVudEJ1ZmZlcixcbiAgICAgICAgICAgICAgICB0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCB0aGlzLnRpbGVFeHRlbnRTZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGVuY2lsTW9kZUZvcjNEKCk6IFN0ZW5jaWxNb2RlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodGhpcy5uZXh0U3RlbmNpbElEICsgMSA+IDI1Nikge1xuICAgICAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5uZXh0U3RlbmNpbElEKys7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICByZXR1cm4gbmV3IFN0ZW5jaWxNb2RlKHsgZnVuYzogZ2wuTk9URVFVQUwsIG1hc2s6IDB4RkYgfSwgaWQsIDB4RkYsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpO1xuICAgIH1cblxuICAgIHN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogU3RlbmNpbE1vZGUge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVuY2lsTW9kZSh7IGZ1bmM6IGdsLkVRVUFMLCBtYXNrOiAweEZGIH0sIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbdGlsZUlELmtleV0sIDB4MDAsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpO1xuICAgIH1cblxuICAgIGNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTogJFJlYWRPbmx5PENvbG9yTW9kZT4ge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgbnVtT3ZlcmRyYXdTdGVwcyA9IDg7XG4gICAgICAgICAgICBjb25zdCBhID0gMSAvIG51bU92ZXJkcmF3U3RlcHM7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JNb2RlKFtnbC5DT05TVEFOVF9DT0xPUiwgZ2wuT05FXSwgbmV3IENvbG9yKGEsIGEsIGEsIDApLCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVuZGVyUGFzcyA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBDb2xvck1vZGUudW5ibGVuZGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIENvbG9yTW9kZS5hbHBoYUJsZW5kZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXB0aE1vZGVGb3JTdWJsYXllcihuOiBudW1iZXIsIG1hc2s6IERlcHRoTWFza1R5cGUsIGZ1bmM6ID9EZXB0aEZ1bmNUeXBlKTogJFJlYWRPbmx5PERlcHRoTW9kZT4ge1xuICAgICAgICBpZiAoIXRoaXMub3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpKSByZXR1cm4gRGVwdGhNb2RlLmRpc2FibGVkO1xuICAgICAgICBjb25zdCBkZXB0aCA9IDEgLSAoKDEgKyB0aGlzLmN1cnJlbnRMYXllcikgKiB0aGlzLm51bVN1YmxheWVycyArIG4pICogdGhpcy5kZXB0aEVwc2lsb247XG4gICAgICAgIHJldHVybiBuZXcgRGVwdGhNb2RlKGZ1bmMgfHwgdGhpcy5jb250ZXh0LmdsLkxFUVVBTCwgbWFzaywgW2RlcHRoLCBkZXB0aF0pO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhlIG9wYXF1ZSBwYXNzIGFuZCAzRCBsYXllcnMgYm90aCB1c2UgdGhlIGRlcHRoIGJ1ZmZlci5cbiAgICAgKiBMYXllcnMgZHJhd24gYWJvdmUgM0QgbGF5ZXJzIG5lZWQgdG8gYmUgZHJhd24gdXNpbmcgdGhlXG4gICAgICogcGFpbnRlcidzIGFsZ29yaXRobSBzbyB0aGF0IHRoZXkgYXBwZWFyIGFib3ZlIDNEIGZlYXR1cmVzLlxuICAgICAqIFRoaXMgcmV0dXJucyB0cnVlIGZvciBsYXllcnMgdGhhdCBjYW4gYmUgZHJhd24gdXNpbmcgdGhlXG4gICAgICogb3BhcXVlIHBhc3MuXG4gICAgICovXG4gICAgb3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudExheWVyIDwgdGhpcy5vcGFxdWVQYXNzQ3V0b2ZmO1xuICAgIH1cblxuICAgIHJlbmRlcihzdHlsZTogU3R5bGUsIG9wdGlvbnM6IFBhaW50ZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB0aGlzLmxpbmVBdGxhcyA9IHN0eWxlLmxpbmVBdGxhcztcbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIgPSBzdHlsZS5pbWFnZU1hbmFnZXI7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyID0gc3R5bGUuZ2x5cGhNYW5hZ2VyO1xuXG4gICAgICAgIHRoaXMuc3ltYm9sRmFkZUNoYW5nZSA9IHN0eWxlLnBsYWNlbWVudC5zeW1ib2xGYWRlQ2hhbmdlKGJyb3dzZXIubm93KCkpO1xuXG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLmJlZ2luRnJhbWUoKTtcblxuICAgICAgICBjb25zdCBsYXllcklkcyA9IHRoaXMuc3R5bGUuX29yZGVyO1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlcztcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLnVzZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZS5wcmVwYXJlKHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb29yZHNBc2NlbmRpbmc6IHtbc3RyaW5nXTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD59ID0ge307XG4gICAgICAgIGNvbnN0IGNvb3Jkc0Rlc2NlbmRpbmc6IHtbc3RyaW5nXTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD59ID0ge307XG4gICAgICAgIGNvbnN0IGNvb3Jkc0Rlc2NlbmRpbmdTeW1ib2w6IHtbc3RyaW5nXTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD59ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgICAgIGNvb3Jkc0FzY2VuZGluZ1tpZF0gPSBzb3VyY2VDYWNoZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgICAgIGNvb3Jkc0Rlc2NlbmRpbmdbaWRdID0gY29vcmRzQXNjZW5kaW5nW2lkXS5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGNvb3Jkc0Rlc2NlbmRpbmdTeW1ib2xbaWRdID0gc291cmNlQ2FjaGUuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKHRydWUpLnJldmVyc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UudHlwZSAhPT0gJ3Jhc3RlcicgJiYgc291cmNlLnR5cGUgIT09ICdyYXN0ZXItZGVtJykgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlVGlsZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzQXNjZW5kaW5nW2lkXSkgdmlzaWJsZVRpbGVzLnB1c2goc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCkpO1xuICAgICAgICAgICAgdXBkYXRlVGlsZU1hc2tzKHZpc2libGVUaWxlcywgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BhcXVlUGFzc0N1dG9mZiA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVySWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gbGF5ZXJJZHNbaV07XG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZS5fbGF5ZXJzW2xheWVySWRdLmlzM0QoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BhcXVlUGFzc0N1dG9mZiA9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPZmZzY3JlZW4gcGFzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBXZSBmaXJzdCBkbyBhbGwgcmVuZGVyaW5nIHRoYXQgcmVxdWlyZXMgcmVuZGVyaW5nIHRvIGEgc2VwYXJhdGVcbiAgICAgICAgLy8gZnJhbWVidWZmZXIsIGFuZCB0aGVuIHNhdmUgdGhvc2UgZm9yIHJlbmRlcmluZyBiYWNrIHRvIHRoZSBtYXBcbiAgICAgICAgLy8gbGF0ZXI6IGluIGRvaW5nIHRoaXMgd2UgYXZvaWQgZG9pbmcgZXhwZW5zaXZlIGZyYW1lYnVmZmVyIHJlc3RvcmVzLlxuICAgICAgICB0aGlzLnJlbmRlclBhc3MgPSAnb2Zmc2NyZWVuJztcbiAgICAgICAgdGhpcy5kZXB0aFJib05lZWRzQ2xlYXIgPSB0cnVlO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBvZiBsYXllcklkcykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICBpZiAoIWxheWVyLmhhc09mZnNjcmVlblBhc3MoKSB8fCBsYXllci5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IGNvb3Jkc0Rlc2NlbmRpbmdbbGF5ZXIuc291cmNlXTtcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlICE9PSAnY3VzdG9tJyAmJiAhY29vcmRzLmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyTGF5ZXIodGhpcywgc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV0sIGxheWVyLCBjb29yZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmViaW5kIHRoZSBtYWluIGZyYW1lYnVmZmVyIG5vdyB0aGF0IGFsbCBvZmZzY3JlZW4gbGF5ZXJzIGhhdmUgYmVlbiByZW5kZXJlZDpcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYnVmZmVycyBpbiBwcmVwYXJhdGlvbiBmb3IgZHJhd2luZyB0byB0aGUgbWFpbiBmcmFtZWJ1ZmZlclxuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXIoeyBjb2xvcjogb3B0aW9ucy5zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPyBDb2xvci5ibGFjayA6IENvbG9yLnRyYW5zcGFyZW50LCBkZXB0aDogMSB9KTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwoKTtcblxuICAgICAgICB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPSBvcHRpb25zLnNob3dPdmVyZHJhd0luc3BlY3RvcjtcbiAgICAgICAgdGhpcy5kZXB0aFJhbmdlRm9yM0QgPSBbMCwgMSAtICgoc3R5bGUuX29yZGVyLmxlbmd0aCArIDIpICogdGhpcy5udW1TdWJsYXllcnMgKiB0aGlzLmRlcHRoRXBzaWxvbildO1xuXG4gICAgICAgIC8vIE9wYXF1ZSBwYXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIERyYXcgb3BhcXVlIGxheWVycyB0b3AtdG8tYm90dG9tIGZpcnN0LlxuICAgICAgICB0aGlzLnJlbmRlclBhc3MgPSAnb3BhcXVlJztcblxuICAgICAgICBmb3IgKHRoaXMuY3VycmVudExheWVyID0gbGF5ZXJJZHMubGVuZ3RoIC0gMTsgdGhpcy5jdXJyZW50TGF5ZXIgPj0gMDsgdGhpcy5jdXJyZW50TGF5ZXItLSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZHNbdGhpcy5jdXJyZW50TGF5ZXJdXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV07XG4gICAgICAgICAgICBjb25zdCBjb29yZHMgPSBjb29yZHNBc2NlbmRpbmdbbGF5ZXIuc291cmNlXTtcblxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MobGF5ZXIsIGNvb3Jkcyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYW5zbHVjZW50IHBhc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRHJhdyBhbGwgb3RoZXIgbGF5ZXJzIGJvdHRvbS10by10b3AuXG4gICAgICAgIHRoaXMucmVuZGVyUGFzcyA9ICd0cmFuc2x1Y2VudCc7XG5cbiAgICAgICAgZm9yICh0aGlzLmN1cnJlbnRMYXllciA9IDA7IHRoaXMuY3VycmVudExheWVyIDwgbGF5ZXJJZHMubGVuZ3RoOyB0aGlzLmN1cnJlbnRMYXllcisrKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkc1t0aGlzLmN1cnJlbnRMYXllcl1dO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXTtcblxuICAgICAgICAgICAgLy8gRm9yIHN5bWJvbCBsYXllcnMgaW4gdGhlIHRyYW5zbHVjZW50IHBhc3MsIHdlIGFkZCBleHRyYSB0aWxlcyB0byB0aGUgcmVuZGVyYWJsZSBzZXRcbiAgICAgICAgICAgIC8vIGZvciBjcm9zcy10aWxlIHN5bWJvbCBmYWRpbmcuIFN5bWJvbCBsYXllcnMgZG9uJ3QgdXNlIHRpbGUgY2xpcHBpbmcsIHNvIG5vIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgICAgICAvLyBzZXBhcmF0ZSBjbGlwcGluZyBtYXNrc1xuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnID8gY29vcmRzRGVzY2VuZGluZ1N5bWJvbCA6IGNvb3Jkc0Rlc2NlbmRpbmcpW2xheWVyLnNvdXJjZV07XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKGxheWVyLCBjb29yZHNBc2NlbmRpbmdbbGF5ZXIuc291cmNlXSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1RpbGVCb3VuZGFyaWVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgICAgIGRyYXcuZGVidWcodGhpcywgc291cmNlQ2FjaGVzW2lkXSwgY29vcmRzQXNjZW5kaW5nW2lkXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgZGVmYXVsdHMgZm9yIG1vc3QgR0wgdmFsdWVzIHNvIHRoYXQgYW55b25lIHVzaW5nIHRoZSBzdGF0ZSBhZnRlciB0aGUgcmVuZGVyXG4gICAgICAgIC8vIGVuY291bnRlcnMgbW9yZSBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICAgIHRoaXMuY29udGV4dC5zZXREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgc2V0dXBPZmZzY3JlZW5EZXB0aFJlbmRlcmJ1ZmZlcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgLy8gQWxsIG9mIHRoZSAzRCB0ZXh0dXJlcyB3aWxsIHVzZSB0aGUgc2FtZSBkZXB0aCByZW5kZXJidWZmZXIuXG4gICAgICAgIGlmICghdGhpcy5kZXB0aFJibykge1xuICAgICAgICAgICAgdGhpcy5kZXB0aFJibyA9IGNvbnRleHQuY3JlYXRlUmVuZGVyYnVmZmVyKGNvbnRleHQuZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckxheWVyKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICAgICAgaWYgKGxheWVyLmlzSGlkZGVuKHRoaXMudHJhbnNmb3JtLnpvb20pKSByZXR1cm47XG4gICAgICAgIGlmIChsYXllci50eXBlICE9PSAnYmFja2dyb3VuZCcgJiYgbGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScgJiYgIWNvb3Jkcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5pZCA9IGxheWVyLmlkO1xuXG4gICAgICAgIGRyYXdbbGF5ZXIudHlwZV0ocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIHRoaXMuc3R5bGUucGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGEgbWF0cml4IHRvIGluY29ycG9yYXRlIHRoZSAqLXRyYW5zbGF0ZSBhbmQgKi10cmFuc2xhdGUtYW5jaG9yIHByb3BlcnRpZXMgaW50byBpdC5cbiAgICAgKiBAcGFyYW0gaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyBUcnVlIHdoZW4gdGhlIHVuaXRzIGFjY2VwdGVkIGJ5IHRoZSBtYXRyaXggYXJlIGluIHZpZXdwb3J0IHBpeGVscyBpbnN0ZWFkIG9mIHRpbGUgdW5pdHMuXG4gICAgICogQHJldHVybnMge0Zsb2F0MzJBcnJheX0gbWF0cml4XG4gICAgICovXG4gICAgdHJhbnNsYXRlUG9zTWF0cml4KG1hdHJpeDogRmxvYXQzMkFycmF5LCB0aWxlOiBUaWxlLCB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl0sIHRyYW5zbGF0ZUFuY2hvcjogJ21hcCcgfCAndmlld3BvcnQnLCBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRyYW5zbGF0ZVswXSAmJiAhdHJhbnNsYXRlWzFdKSByZXR1cm4gbWF0cml4O1xuXG4gICAgICAgIGNvbnN0IGFuZ2xlID0gaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyA/XG4gICAgICAgICAgICAodHJhbnNsYXRlQW5jaG9yID09PSAnbWFwJyA/IHRoaXMudHJhbnNmb3JtLmFuZ2xlIDogMCkgOlxuICAgICAgICAgICAgKHRyYW5zbGF0ZUFuY2hvciA9PT0gJ3ZpZXdwb3J0JyA/IC10aGlzLnRyYW5zZm9ybS5hbmdsZSA6IDApO1xuXG4gICAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICAgICAgY29uc3Qgc2luQSA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgICAgIGNvbnN0IGNvc0EgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgICAgICB0cmFuc2xhdGUgPSBbXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogY29zQSAtIHRyYW5zbGF0ZVsxXSAqIHNpbkEsXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogc2luQSArIHRyYW5zbGF0ZVsxXSAqIGNvc0FcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IFtcbiAgICAgICAgICAgIGluVmlld3BvcnRQaXhlbFVuaXRzVW5pdHMgPyB0cmFuc2xhdGVbMF0gOiBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCB0cmFuc2xhdGVbMF0sIHRoaXMudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyA/IHRyYW5zbGF0ZVsxXSA6IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIHRyYW5zbGF0ZVsxXSwgdGhpcy50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgICAwXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZE1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0cmFuc2xhdGVkTWF0cml4LCBtYXRyaXgsIHRyYW5zbGF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRNYXRyaXg7XG4gICAgfVxuXG4gICAgc2F2ZVRpbGVUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpIHtcbiAgICAgICAgY29uc3QgdGV4dHVyZXMgPSB0aGlzLl90aWxlVGV4dHVyZXNbdGV4dHVyZS5zaXplWzBdXTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlcykge1xuICAgICAgICAgICAgdGhpcy5fdGlsZVRleHR1cmVzW3RleHR1cmUuc2l6ZVswXV0gPSBbdGV4dHVyZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKHRleHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VGlsZVRleHR1cmUoc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmVzID0gdGhpcy5fdGlsZVRleHR1cmVzW3NpemVdO1xuICAgICAgICByZXR1cm4gdGV4dHVyZXMgJiYgdGV4dHVyZXMubGVuZ3RoID4gMCA/IHRleHR1cmVzLnBvcCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciBhIHBhdHRlcm4gaW1hZ2UgaXMgbmVlZGVkLCBhbmQgaWYgaXQgaXMsIHdoZXRoZXIgaXQgaXMgbm90IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYSBuZWVkZWQgaW1hZ2UgaXMgbWlzc2luZyBhbmQgcmVuZGVyaW5nIG5lZWRzIHRvIGJlIHNraXBwZWQuXG4gICAgICovXG4gICAgaXNQYXR0ZXJuTWlzc2luZyhpbWFnZTogP0Nyb3NzRmFkZWQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWltYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGltYWdlUG9zQSA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UuZnJvbSk7XG4gICAgICAgIGNvbnN0IGltYWdlUG9zQiA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UudG8pO1xuICAgICAgICByZXR1cm4gIWltYWdlUG9zQSB8fCAhaW1hZ2VQb3NCO1xuICAgIH1cblxuICAgIHVzZVByb2dyYW0obmFtZTogc3RyaW5nLCBwcm9ncmFtQ29uZmlndXJhdGlvbjogUHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSB0aGlzLmVtcHR5UHJvZ3JhbUNvbmZpZ3VyYXRpb24pOiBQcm9ncmFtPGFueT4ge1xuICAgICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZSB8fCB7fTtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7bmFtZX0ke3Byb2dyYW1Db25maWd1cmF0aW9uLmNhY2hlS2V5IHx8ICcnfSR7dGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gJy9vdmVyZHJhdycgOiAnJ31gO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVtrZXldID0gbmV3IFByb2dyYW0odGhpcy5jb250ZXh0LCBzaGFkZXJzW25hbWVdLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgcHJvZ3JhbVVuaWZvcm1zW25hbWVdLCB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNldCBzb21lIEdMIHN0YXRlIHRvIGRlZmF1bHQgdmFsdWVzIHRvIGF2b2lkIGhhcmQtdG8tZGVidWcgYnVnc1xuICAgICAqIGluIGN1c3RvbSBsYXllcnMuXG4gICAgICovXG4gICAgc2V0Q3VzdG9tTGF5ZXJEZWZhdWx0cygpIHtcbiAgICAgICAgLy8gUHJldmVudCBjdXN0b20gbGF5ZXJzIGZyb20gdW5pbnRlbnRpb25hbGx5IG1vZGlmeSB0aGUgbGFzdCBWQU8gdXNlZC5cbiAgICAgICAgLy8gQWxsIG90aGVyIHN0YXRlIGlzIHN0YXRlIGlzIHJlc3RvcmVkIG9uIGl0J3Mgb3duLCBidXQgZm9yIFZBT3MgaXQnc1xuICAgICAgICAvLyBzaW1wbGVyIHRvIHVuYmluZCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIFZBT3MuXG4gICAgICAgIHRoaXMuY29udGV4dC51bmJpbmRWQU8oKTtcblxuICAgICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoaXMgc3RhdGUgaXMgbWVhbmluZ2Z1bCBhbmQgb2Z0ZW4gZXhwZWN0ZWQuXG4gICAgICAgIC8vIExlYXZpbmcgdGhpcyBzdGF0ZSBkaXJ0eSBjb3VsZCBjYXVzZSBhIGxvdCBvZiBjb25mdXNpb24gZm9yIHVzZXJzLlxuICAgICAgICB0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5waXhlbFN0b3JlVW5wYWNrLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBTZXQgR0wgc3RhdGUgdGhhdCBpcyBzaGFyZWQgYnkgYWxsIGxheWVycy5cbiAgICAgKi9cbiAgICBzZXRCYXNlU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJsZW5kRXF1YXRpb24uc2V0KGdsLkZVTkNfQUREKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhaW50ZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHsgT3ZlcnNjYWxlZFRpbGVJRCB9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IGRlZmF1bHQgdGlsZUNvdmVyO1xuXG5mdW5jdGlvbiB0aWxlQ292ZXIoejogbnVtYmVyLCBib3VuZHM6IFtNZXJjYXRvckNvb3JkaW5hdGUsIE1lcmNhdG9yQ29vcmRpbmF0ZSwgTWVyY2F0b3JDb29yZGluYXRlLCBNZXJjYXRvckNvb3JkaW5hdGVdLFxuICAgIGFjdHVhbFo6IG51bWJlciwgcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW4gfCB2b2lkKTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4ge1xuICAgIGlmIChyZW5kZXJXb3JsZENvcGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdGlsZXMgPSAxIDw8IHo7XG4gICAgY29uc3QgdCA9IHt9O1xuXG4gICAgZnVuY3Rpb24gc2NhbkxpbmUoeDAsIHgxLCB5KSB7XG4gICAgICAgIGxldCB4LCB3LCB3eCwgY29vcmQ7XG4gICAgICAgIGlmICh5ID49IDAgJiYgeSA8PSB0aWxlcykge1xuICAgICAgICAgICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgdyA9IE1hdGguZmxvb3IoeCAvIHRpbGVzKTtcbiAgICAgICAgICAgICAgICB3eCA9ICh4ICUgdGlsZXMgKyB0aWxlcykgJSB0aWxlcztcbiAgICAgICAgICAgICAgICBpZiAodyA9PT0gMCB8fCByZW5kZXJXb3JsZENvcGllcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb29yZCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKGFjdHVhbFosIHcsIHosIHd4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgdFtjb29yZC5rZXldID0gY29vcmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgem9vbWVkQm91bmRzID0gYm91bmRzLm1hcCgoY29vcmQpID0+IG5ldyBQb2ludChjb29yZC54LCBjb29yZC55KS5fbXVsdCh0aWxlcykpO1xuXG4gICAgLy8gRGl2aWRlIHRoZSBzY3JlZW4gdXAgaW4gdHdvIHRyaWFuZ2xlcyBhbmQgc2NhbiBlYWNoIG9mIHRoZW06XG4gICAgLy8gKy0tLS9cbiAgICAvLyB8IC8gfFxuICAgIC8vIC8tLS0rXG4gICAgc2NhblRyaWFuZ2xlKHpvb21lZEJvdW5kc1swXSwgem9vbWVkQm91bmRzWzFdLCB6b29tZWRCb3VuZHNbMl0sIDAsIHRpbGVzLCBzY2FuTGluZSk7XG4gICAgc2NhblRyaWFuZ2xlKHpvb21lZEJvdW5kc1syXSwgem9vbWVkQm91bmRzWzNdLCB6b29tZWRCb3VuZHNbMF0sIDAsIHRpbGVzLCBzY2FuTGluZSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXModCkubWFwKChpZCkgPT4ge1xuICAgICAgICByZXR1cm4gdFtpZF07XG4gICAgfSk7XG59XG5cbi8vIFRha2VuIGZyb20gcG9seW1hcHMgc3JjL0xheWVyLmpzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2ltcGxlZ2VvL3BvbHltYXBzL2Jsb2IvbWFzdGVyL3NyYy9MYXllci5qcyNMMzMzLUwzODNcblxuZnVuY3Rpb24gZWRnZShhOiBQb2ludCwgYjogUG9pbnQpIHtcbiAgICBpZiAoYS55ID4gYi55KSB7IGNvbnN0IHQgPSBhOyBhID0gYjsgYiA9IHQ7IH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4MDogYS54LFxuICAgICAgICB5MDogYS55LFxuICAgICAgICB4MTogYi54LFxuICAgICAgICB5MTogYi55LFxuICAgICAgICBkeDogYi54IC0gYS54LFxuICAgICAgICBkeTogYi55IC0gYS55XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gc2NhblNwYW5zKGUwLCBlMSwgeW1pbiwgeW1heCwgc2NhbkxpbmUpIHtcbiAgICBjb25zdCB5MCA9IE1hdGgubWF4KHltaW4sIE1hdGguZmxvb3IoZTEueTApKTtcbiAgICBjb25zdCB5MSA9IE1hdGgubWluKHltYXgsIE1hdGguY2VpbChlMS55MSkpO1xuXG4gICAgLy8gc29ydCBlZGdlcyBieSB4LWNvb3JkaW5hdGVcbiAgICBpZiAoKGUwLngwID09PSBlMS54MCAmJiBlMC55MCA9PT0gZTEueTApID9cbiAgICAgICAgKGUwLngwICsgZTEuZHkgLyBlMC5keSAqIGUwLmR4IDwgZTEueDEpIDpcbiAgICAgICAgKGUwLngxIC0gZTEuZHkgLyBlMC5keSAqIGUwLmR4IDwgZTEueDApKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlMDsgZTAgPSBlMTsgZTEgPSB0O1xuICAgIH1cblxuICAgIC8vIHNjYW4gbGluZXMhXG4gICAgY29uc3QgbTAgPSBlMC5keCAvIGUwLmR5O1xuICAgIGNvbnN0IG0xID0gZTEuZHggLyBlMS5keTtcbiAgICBjb25zdCBkMCA9IGUwLmR4ID4gMDsgLy8gdXNlIHkgKyAxIHRvIGNvbXB1dGUgeDBcbiAgICBjb25zdCBkMSA9IGUxLmR4IDwgMDsgLy8gdXNlIHkgKyAxIHRvIGNvbXB1dGUgeDFcbiAgICBmb3IgKGxldCB5ID0geTA7IHkgPCB5MTsgeSsrKSB7XG4gICAgICAgIGNvbnN0IHgwID0gbTAgKiBNYXRoLm1heCgwLCBNYXRoLm1pbihlMC5keSwgeSArIGQwIC0gZTAueTApKSArIGUwLngwO1xuICAgICAgICBjb25zdCB4MSA9IG0xICogTWF0aC5tYXgoMCwgTWF0aC5taW4oZTEuZHksIHkgKyBkMSAtIGUxLnkwKSkgKyBlMS54MDtcbiAgICAgICAgc2NhbkxpbmUoTWF0aC5mbG9vcih4MSksIE1hdGguY2VpbCh4MCksIHkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2NhblRyaWFuZ2xlKGE6IFBvaW50LCBiOiBQb2ludCwgYzogUG9pbnQsIHltaW4sIHltYXgsIHNjYW5MaW5lKSB7XG4gICAgbGV0IGFiID0gZWRnZShhLCBiKSxcbiAgICAgICAgYmMgPSBlZGdlKGIsIGMpLFxuICAgICAgICBjYSA9IGVkZ2UoYywgYSk7XG5cbiAgICBsZXQgdDtcblxuICAgIC8vIHNvcnQgZWRnZXMgYnkgeS1sZW5ndGhcbiAgICBpZiAoYWIuZHkgPiBiYy5keSkgeyB0ID0gYWI7IGFiID0gYmM7IGJjID0gdDsgfVxuICAgIGlmIChhYi5keSA+IGNhLmR5KSB7IHQgPSBhYjsgYWIgPSBjYTsgY2EgPSB0OyB9XG4gICAgaWYgKGJjLmR5ID4gY2EuZHkpIHsgdCA9IGJjOyBiYyA9IGNhOyBjYSA9IHQ7IH1cblxuICAgIC8vIHNjYW4gc3BhbiEgc2NhbiBzcGFuIVxuICAgIGlmIChhYi5keSkgc2NhblNwYW5zKGNhLCBhYiwgeW1pbiwgeW1heCwgc2NhbkxpbmUpO1xuICAgIGlmIChiYy5keSkgc2NhblNwYW5zKGNhLCBiYywgeW1pbiwgeW1heCwgc2NhbkxpbmUpO1xufVxuXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgTG5nTGF0IGZyb20gJy4vbG5nX2xhdCc7XG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4vbG5nX2xhdF9ib3VuZHMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge21lcmNhdG9yWGZyb21MbmcsIG1lcmNhdG9yWWZyb21MYXQsIG1lcmNhdG9yWmZyb21BbHRpdHVkZX0gZnJvbSAnLi9tZXJjYXRvcl9jb29yZGluYXRlJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7IHdyYXAsIGNsYW1wIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUnO1xuaW1wb3J0IHRpbGVDb3ZlciBmcm9tICcuLi91dGlsL3RpbGVfY292ZXInO1xuaW1wb3J0IHsgVW53cmFwcGVkVGlsZUlEIH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgeyB2ZWM0LCBtYXQ0LCBtYXQyIH0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IHR5cGUgeyBPdmVyc2NhbGVkVGlsZUlELCBDYW5vbmljYWxUaWxlSUQgfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbi8qKlxuICogQSBzaW5nbGUgdHJhbnNmb3JtLCBnZW5lcmFsbHkgdXNlZCBmb3IgYSBzaW5nbGUgdGlsZSB0byBiZVxuICogc2NhbGVkLCByb3RhdGVkLCBhbmQgem9vbWVkLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVHJhbnNmb3JtIHtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIHRpbGVab29tOiBudW1iZXI7XG4gICAgbG5nUmFuZ2U6ID9bbnVtYmVyLCBudW1iZXJdO1xuICAgIGxhdFJhbmdlOiA/W251bWJlciwgbnVtYmVyXTtcbiAgICBtYXhWYWxpZExhdGl0dWRlOiBudW1iZXI7XG4gICAgc2NhbGU6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIGFuZ2xlOiBudW1iZXI7XG4gICAgcm90YXRpb25NYXRyaXg6IEZsb2F0NjRBcnJheTtcbiAgICB6b29tRnJhY3Rpb246IG51bWJlcjtcbiAgICBwaXhlbHNUb0dMVW5pdHM6IFtudW1iZXIsIG51bWJlcl07XG4gICAgY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTogbnVtYmVyO1xuICAgIG1lcmNhdG9yTWF0cml4OiBBcnJheTxudW1iZXI+O1xuICAgIHByb2pNYXRyaXg6IEZsb2F0NjRBcnJheTtcbiAgICBhbGlnbmVkUHJvak1hdHJpeDogRmxvYXQ2NEFycmF5O1xuICAgIHBpeGVsTWF0cml4OiBGbG9hdDY0QXJyYXk7XG4gICAgcGl4ZWxNYXRyaXhJbnZlcnNlOiBGbG9hdDY0QXJyYXk7XG4gICAgZ2xDb29yZE1hdHJpeDogRmxvYXQzMkFycmF5O1xuICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheTtcbiAgICBfZm92OiBudW1iZXI7XG4gICAgX3BpdGNoOiBudW1iZXI7XG4gICAgX3pvb206IG51bWJlcjtcbiAgICBfdW5tb2RpZmllZDogYm9vbGVhbjtcbiAgICBfcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW47XG4gICAgX21pblpvb206IG51bWJlcjtcbiAgICBfbWF4Wm9vbTogbnVtYmVyO1xuICAgIF9jZW50ZXI6IExuZ0xhdDtcbiAgICBfY29uc3RyYWluaW5nOiBib29sZWFuO1xuICAgIF9wb3NNYXRyaXhDYWNoZToge1tudW1iZXJdOiBGbG9hdDMyQXJyYXl9O1xuICAgIF9hbGlnbmVkUG9zTWF0cml4Q2FjaGU6IHtbbnVtYmVyXTogRmxvYXQzMkFycmF5fTtcblxuICAgIGNvbnN0cnVjdG9yKG1pblpvb206ID9udW1iZXIsIG1heFpvb206ID9udW1iZXIsIHJlbmRlcldvcmxkQ29waWVzOiBib29sZWFuIHwgdm9pZCkge1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyOyAvLyBjb25zdGFudFxuICAgICAgICB0aGlzLm1heFZhbGlkTGF0aXR1ZGUgPSA4NS4wNTExMjk7IC8vIGNvbnN0YW50XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMgPSByZW5kZXJXb3JsZENvcGllcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHJlbmRlcldvcmxkQ29waWVzO1xuICAgICAgICB0aGlzLl9taW5ab29tID0gbWluWm9vbSB8fCAwO1xuICAgICAgICB0aGlzLl9tYXhab29tID0gbWF4Wm9vbSB8fCAyMjtcblxuICAgICAgICB0aGlzLnNldE1heEJvdW5kcygpO1xuXG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuX2NlbnRlciA9IG5ldyBMbmdMYXQoMCwgMCk7XG4gICAgICAgIHRoaXMuem9vbSA9IDA7XG4gICAgICAgIHRoaXMuYW5nbGUgPSAwO1xuICAgICAgICB0aGlzLl9mb3YgPSAwLjY0MzUwMTEwODc5MzI4NDQ7XG4gICAgICAgIHRoaXMuX3BpdGNoID0gMDtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3Bvc01hdHJpeENhY2hlID0ge307XG4gICAgICAgIHRoaXMuX2FsaWduZWRQb3NNYXRyaXhDYWNoZSA9IHt9O1xuICAgIH1cblxuICAgIGNsb25lKCk6IFRyYW5zZm9ybSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IFRyYW5zZm9ybSh0aGlzLl9taW5ab29tLCB0aGlzLl9tYXhab29tLCB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyk7XG4gICAgICAgIGNsb25lLnRpbGVTaXplID0gdGhpcy50aWxlU2l6ZTtcbiAgICAgICAgY2xvbmUubGF0UmFuZ2UgPSB0aGlzLmxhdFJhbmdlO1xuICAgICAgICBjbG9uZS53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIGNsb25lLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICBjbG9uZS5fY2VudGVyID0gdGhpcy5fY2VudGVyO1xuICAgICAgICBjbG9uZS56b29tID0gdGhpcy56b29tO1xuICAgICAgICBjbG9uZS5hbmdsZSA9IHRoaXMuYW5nbGU7XG4gICAgICAgIGNsb25lLl9mb3YgPSB0aGlzLl9mb3Y7XG4gICAgICAgIGNsb25lLl9waXRjaCA9IHRoaXMuX3BpdGNoO1xuICAgICAgICBjbG9uZS5fdW5tb2RpZmllZCA9IHRoaXMuX3VubW9kaWZpZWQ7XG4gICAgICAgIGNsb25lLl9jYWxjTWF0cmljZXMoKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIGdldCBtaW5ab29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9taW5ab29tOyB9XG4gICAgc2V0IG1pblpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9taW5ab29tID09PSB6b29tKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21pblpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1heCh0aGlzLnpvb20sIHpvb20pO1xuICAgIH1cblxuICAgIGdldCBtYXhab29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9tYXhab29tOyB9XG4gICAgc2V0IG1heFpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhab29tID09PSB6b29tKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21heFpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1pbih0aGlzLnpvb20sIHpvb20pO1xuICAgIH1cblxuICAgIGdldCByZW5kZXJXb3JsZENvcGllcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzOyB9XG4gICAgc2V0IHJlbmRlcldvcmxkQ29waWVzKHJlbmRlcldvcmxkQ29waWVzPzogP2Jvb2xlYW4pIHtcbiAgICAgICAgaWYgKHJlbmRlcldvcmxkQ29waWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJXb3JsZENvcGllcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVuZGVyV29ybGRDb3BpZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzID0gcmVuZGVyV29ybGRDb3BpZXM7XG4gICAgfVxuXG4gICAgZ2V0IHdvcmxkU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlU2l6ZSAqIHRoaXMuc2NhbGU7XG4gICAgfVxuXG4gICAgZ2V0IGNlbnRlclBvaW50KCk6IFBvaW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZS5fZGl2KDIpO1xuICAgIH1cblxuICAgIGdldCBzaXplKCk6IFBvaW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgZ2V0IGJlYXJpbmcoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIC10aGlzLmFuZ2xlIC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9XG4gICAgc2V0IGJlYXJpbmcoYmVhcmluZzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGIgPSAtd3JhcChiZWFyaW5nLCAtMTgwLCAxODApICogTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgaWYgKHRoaXMuYW5nbGUgPT09IGIpIHJldHVybjtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFuZ2xlID0gYjtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG5cbiAgICAgICAgLy8gMngyIG1hdHJpeCBmb3Igcm90YXRpbmcgcG9pbnRzXG4gICAgICAgIHRoaXMucm90YXRpb25NYXRyaXggPSBtYXQyLmNyZWF0ZSgpO1xuICAgICAgICBtYXQyLnJvdGF0ZSh0aGlzLnJvdGF0aW9uTWF0cml4LCB0aGlzLnJvdGF0aW9uTWF0cml4LCB0aGlzLmFuZ2xlKTtcbiAgICB9XG5cbiAgICBnZXQgcGl0Y2goKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BpdGNoIC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9XG4gICAgc2V0IHBpdGNoKHBpdGNoOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcCA9IGNsYW1wKHBpdGNoLCAwLCA2MCkgLyAxODAgKiBNYXRoLlBJO1xuICAgICAgICBpZiAodGhpcy5fcGl0Y2ggPT09IHApIHJldHVybjtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9waXRjaCA9IHA7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIGdldCBmb3YoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvdiAvIE1hdGguUEkgKiAxODA7XG4gICAgfVxuICAgIHNldCBmb3YoZm92OiBudW1iZXIpIHtcbiAgICAgICAgZm92ID0gTWF0aC5tYXgoMC4wMSwgTWF0aC5taW4oNjAsIGZvdikpO1xuICAgICAgICBpZiAodGhpcy5fZm92ID09PSBmb3YpIHJldHVybjtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9mb3YgPSBmb3YgLyAxODAgKiBNYXRoLlBJO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgem9vbSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fem9vbTsgfVxuICAgIHNldCB6b29tKHpvb206IG51bWJlcikge1xuICAgICAgICBjb25zdCB6ID0gTWF0aC5taW4oTWF0aC5tYXgoem9vbSwgdGhpcy5taW5ab29tKSwgdGhpcy5tYXhab29tKTtcbiAgICAgICAgaWYgKHRoaXMuX3pvb20gPT09IHopIHJldHVybjtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl96b29tID0gejtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHRoaXMuem9vbVNjYWxlKHopO1xuICAgICAgICB0aGlzLnRpbGVab29tID0gTWF0aC5mbG9vcih6KTtcbiAgICAgICAgdGhpcy56b29tRnJhY3Rpb24gPSB6IC0gdGhpcy50aWxlWm9vbTtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIGdldCBjZW50ZXIoKTogTG5nTGF0IHsgcmV0dXJuIHRoaXMuX2NlbnRlcjsgfVxuICAgIHNldCBjZW50ZXIoY2VudGVyOiBMbmdMYXQpIHtcbiAgICAgICAgaWYgKGNlbnRlci5sYXQgPT09IHRoaXMuX2NlbnRlci5sYXQgJiYgY2VudGVyLmxuZyA9PT0gdGhpcy5fY2VudGVyLmxuZykgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NlbnRlciA9IGNlbnRlcjtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHpvb20gbGV2ZWwgdGhhdCB3aWxsIGNvdmVyIGFsbCB0aWxlcyB0aGUgdHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aWxlU2l6ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5yb3VuZFpvb21cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSB6b29tIGxldmVsXG4gICAgICovXG4gICAgY292ZXJpbmdab29tTGV2ZWwob3B0aW9uczoge3JvdW5kWm9vbT86IGJvb2xlYW4sIHRpbGVTaXplOiBudW1iZXJ9KSB7XG4gICAgICAgIHJldHVybiAob3B0aW9ucy5yb3VuZFpvb20gPyBNYXRoLnJvdW5kIDogTWF0aC5mbG9vcikoXG4gICAgICAgICAgICB0aGlzLnpvb20gKyB0aGlzLnNjYWxlWm9vbSh0aGlzLnRpbGVTaXplIC8gb3B0aW9ucy50aWxlU2l6ZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW55IFwid3JhcHBlZFwiIGNvcGllcyBvZiBhIGdpdmVuIHRpbGUgY29vcmRpbmF0ZSB0aGF0IGFyZSB2aXNpYmxlXG4gICAgICogaW4gdGhlIGN1cnJlbnQgdmlldy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0VmlzaWJsZVVud3JhcHBlZENvb3JkaW5hdGVzKHRpbGVJRDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtuZXcgVW53cmFwcGVkVGlsZUlEKDAsIHRpbGVJRCldO1xuICAgICAgICBpZiAodGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHV0bCA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCAwKSk7XG4gICAgICAgICAgICBjb25zdCB1dHIgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodGhpcy53aWR0aCwgMCkpO1xuICAgICAgICAgICAgY29uc3QgdWJsID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KSk7XG4gICAgICAgICAgICBjb25zdCB1YnIgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwgdGhpcy5oZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHcwID0gTWF0aC5mbG9vcihNYXRoLm1pbih1dGwueCwgdXRyLngsIHVibC54LCB1YnIueCkpO1xuICAgICAgICAgICAgY29uc3QgdzEgPSBNYXRoLmZsb29yKE1hdGgubWF4KHV0bC54LCB1dHIueCwgdWJsLngsIHVici54KSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBhbiBleHRyYSBjb3B5IG9mIHRoZSB3b3JsZCBvbiBlYWNoIHNpZGUgdG8gcHJvcGVybHkgcmVuZGVyIEltYWdlU291cmNlcyBhbmQgQ2FudmFzU291cmNlcy5cbiAgICAgICAgICAgIC8vIEJvdGggc291cmNlcyBkcmF3IG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcmllcyBvZiB0aGUgdGlsZSB0aGF0IFwiY29udGFpbnMgdGhlbVwiIHNvIHdlIG5lZWRcbiAgICAgICAgICAgIC8vIHRvIGFkZCBleHRyYSBjb3BpZXMgb24gYm90aCBzaWRlcyBpbiBjYXNlIG9mZnNjcmVlbiB0aWxlcyBuZWVkIHRvIGRyYXcgaW50byBvbi1zY3JlZW4gb25lcy5cbiAgICAgICAgICAgIGNvbnN0IGV4dHJhV29ybGRDb3B5ID0gMTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdyA9IHcwIC0gZXh0cmFXb3JsZENvcHk7IHcgPD0gdzEgKyBleHRyYVdvcmxkQ29weTsgdysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHcgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBVbndyYXBwZWRUaWxlSUQodywgdGlsZUlEKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIGNvb3JkaW5hdGVzIHRoYXQgY291bGQgY292ZXIgdGhpcyB0cmFuc2Zvcm0gZm9yIGEgY292ZXJpbmdcbiAgICAgKiB6b29tIGxldmVsLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGlsZVNpemVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5taW56b29tXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMubWF4em9vbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5yb3VuZFpvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucmVwYXJzZU92ZXJzY2FsZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucmVuZGVyV29ybGRDb3BpZXNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD59IE92ZXJzY2FsZWRUaWxlSURzXG4gICAgICovXG4gICAgY292ZXJpbmdUaWxlcyhcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdGlsZVNpemU6IG51bWJlcixcbiAgICAgICAgICAgIG1pbnpvb20/OiBudW1iZXIsXG4gICAgICAgICAgICBtYXh6b29tPzogbnVtYmVyLFxuICAgICAgICAgICAgcm91bmRab29tPzogYm9vbGVhbixcbiAgICAgICAgICAgIHJlcGFyc2VPdmVyc2NhbGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzPzogYm9vbGVhblxuICAgICAgICB9XG4gICAgKTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4ge1xuICAgICAgICBsZXQgeiA9IHRoaXMuY292ZXJpbmdab29tTGV2ZWwob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbFogPSB6O1xuXG4gICAgICAgIGlmIChvcHRpb25zLm1pbnpvb20gIT09IHVuZGVmaW5lZCAmJiB6IDwgb3B0aW9ucy5taW56b29tKSByZXR1cm4gW107XG4gICAgICAgIGlmIChvcHRpb25zLm1heHpvb20gIT09IHVuZGVmaW5lZCAmJiB6ID4gb3B0aW9ucy5tYXh6b29tKSB6ID0gb3B0aW9ucy5tYXh6b29tO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlckNvb3JkID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQodGhpcy5jZW50ZXIpO1xuICAgICAgICBjb25zdCBudW1UaWxlcyA9IE1hdGgucG93KDIsIHopO1xuICAgICAgICBjb25zdCBjZW50ZXJQb2ludCA9IG5ldyBQb2ludChudW1UaWxlcyAqIGNlbnRlckNvb3JkLnggLSAwLjUsIG51bVRpbGVzICogY2VudGVyQ29vcmQueSAtIDAuNSk7XG4gICAgICAgIGNvbnN0IGNvcm5lckNvb3JkcyA9IFtcbiAgICAgICAgICAgIHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCAwKSksXG4gICAgICAgICAgICB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodGhpcy53aWR0aCwgMCkpLFxuICAgICAgICAgICAgdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KSksXG4gICAgICAgICAgICB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwgdGhpcy5oZWlnaHQpKVxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gdGlsZUNvdmVyKHosIGNvcm5lckNvb3Jkcywgb3B0aW9ucy5yZXBhcnNlT3ZlcnNjYWxlZCA/IGFjdHVhbFogOiB6LCB0aGlzLl9yZW5kZXJXb3JsZENvcGllcylcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBjZW50ZXJQb2ludC5kaXN0KGEuY2Fub25pY2FsKSAtIGNlbnRlclBvaW50LmRpc3QoYi5jYW5vbmljYWwpKTtcbiAgICB9XG5cbiAgICByZXNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICB0aGlzLnBpeGVsc1RvR0xVbml0cyA9IFsyIC8gd2lkdGgsIC0yIC8gaGVpZ2h0XTtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIGdldCB1bm1vZGlmaWVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdW5tb2RpZmllZDsgfVxuXG4gICAgem9vbVNjYWxlKHpvb206IG51bWJlcikgeyByZXR1cm4gTWF0aC5wb3coMiwgem9vbSk7IH1cbiAgICBzY2FsZVpvb20oc2NhbGU6IG51bWJlcikgeyByZXR1cm4gTWF0aC5sb2coc2NhbGUpIC8gTWF0aC5MTjI7IH1cblxuICAgIHByb2plY3QobG5nbGF0OiBMbmdMYXQpIHtcbiAgICAgICAgY29uc3QgbGF0ID0gY2xhbXAobG5nbGF0LmxhdCwgLXRoaXMubWF4VmFsaWRMYXRpdHVkZSwgdGhpcy5tYXhWYWxpZExhdGl0dWRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICBtZXJjYXRvclhmcm9tTG5nKGxuZ2xhdC5sbmcpICogdGhpcy53b3JsZFNpemUsXG4gICAgICAgICAgICAgICAgbWVyY2F0b3JZZnJvbUxhdChsYXQpICogdGhpcy53b3JsZFNpemUpO1xuICAgIH1cblxuICAgIHVucHJvamVjdChwb2ludDogUG9pbnQpOiBMbmdMYXQge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShwb2ludC54IC8gdGhpcy53b3JsZFNpemUsIHBvaW50LnkgLyB0aGlzLndvcmxkU2l6ZSkudG9MbmdMYXQoKTtcbiAgICB9XG5cbiAgICBnZXQgcG9pbnQoKTogUG9pbnQgeyByZXR1cm4gdGhpcy5wcm9qZWN0KHRoaXMuY2VudGVyKTsgfVxuXG4gICAgc2V0TG9jYXRpb25BdFBvaW50KGxuZ2xhdDogTG5nTGF0LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMucG9pbnRDb29yZGluYXRlKHBvaW50KTtcbiAgICAgICAgY29uc3QgYiA9IHRoaXMucG9pbnRDb29yZGluYXRlKHRoaXMuY2VudGVyUG9pbnQpO1xuICAgICAgICBjb25zdCBsb2MgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQpO1xuICAgICAgICBjb25zdCBuZXdDZW50ZXIgPSBuZXcgTWVyY2F0b3JDb29yZGluYXRlKFxuICAgICAgICAgICAgICAgIGxvYy54IC0gKGEueCAtIGIueCksXG4gICAgICAgICAgICAgICAgbG9jLnkgLSAoYS55IC0gYi55KSk7XG4gICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5jb29yZGluYXRlTG9jYXRpb24obmV3Q2VudGVyKTtcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY2VudGVyLndyYXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgbG9jYXRpb24sIHJldHVybiB0aGUgc2NyZWVuIHBvaW50IHRoYXQgY29ycmVzcG9uZHMgdG8gaXRcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXG4gICAgICogQHJldHVybnMge1BvaW50fSBzY3JlZW4gcG9pbnRcbiAgICAgKi9cbiAgICBsb2NhdGlvblBvaW50KGxuZ2xhdDogTG5nTGF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVQb2ludCh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJuIGl0cyBsbmdsYXRcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHNjcmVlbiBwb2ludFxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IGxuZ2xhdCBsb2NhdGlvblxuICAgICAqL1xuICAgIHBvaW50TG9jYXRpb24ocDogUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGdlb2dyYXBoaWNhbCBsbmdsYXQsIHJldHVybiBhbiB1bnJvdW5kZWRcbiAgICAgKiBjb29yZGluYXRlIHRoYXQgcmVwcmVzZW50cyBpdCBhdCB0aGlzIHRyYW5zZm9ybSdzIHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIHtMbmdMYXR9IGxuZ2xhdFxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfVxuICAgICAqL1xuICAgIGxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQ6IExuZ0xhdCkge1xuICAgICAgICByZXR1cm4gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG5nbGF0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIENvb3JkaW5hdGUsIHJldHVybiBpdHMgZ2VvZ3JhcGhpY2FsIHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBsbmdsYXRcbiAgICAgKi9cbiAgICBjb29yZGluYXRlTG9jYXRpb24oY29vcmQ6IE1lcmNhdG9yQ29vcmRpbmF0ZSkge1xuICAgICAgICByZXR1cm4gY29vcmQudG9MbmdMYXQoKTtcbiAgICB9XG5cbiAgICBwb2ludENvb3JkaW5hdGUocDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0WiA9IDA7XG4gICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3QgcHJvamVjdGVkIHogdmFsdWUgZm9yIHRoZSBwb2ludCxcbiAgICAgICAgLy8gdW5wcm9qZWN0IHR3byBwb2ludHMgdG8gZ2V0IGEgbGluZSBhbmQgdGhlbiBmaW5kIHRoZSBwb2ludCBvbiB0aGF0XG4gICAgICAgIC8vIGxpbmUgd2l0aCB6PTBcblxuICAgICAgICBjb25zdCBjb29yZDAgPSBbcC54LCBwLnksIDAsIDFdO1xuICAgICAgICBjb25zdCBjb29yZDEgPSBbcC54LCBwLnksIDEsIDFdO1xuXG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChjb29yZDAsIGNvb3JkMCwgdGhpcy5waXhlbE1hdHJpeEludmVyc2UpO1xuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQoY29vcmQxLCBjb29yZDEsIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtcblxuICAgICAgICBjb25zdCB3MCA9IGNvb3JkMFszXTtcbiAgICAgICAgY29uc3QgdzEgPSBjb29yZDFbM107XG4gICAgICAgIGNvbnN0IHgwID0gY29vcmQwWzBdIC8gdzA7XG4gICAgICAgIGNvbnN0IHgxID0gY29vcmQxWzBdIC8gdzE7XG4gICAgICAgIGNvbnN0IHkwID0gY29vcmQwWzFdIC8gdzA7XG4gICAgICAgIGNvbnN0IHkxID0gY29vcmQxWzFdIC8gdzE7XG4gICAgICAgIGNvbnN0IHowID0gY29vcmQwWzJdIC8gdzA7XG4gICAgICAgIGNvbnN0IHoxID0gY29vcmQxWzJdIC8gdzE7XG5cbiAgICAgICAgY29uc3QgdCA9IHowID09PSB6MSA/IDAgOiAodGFyZ2V0WiAtIHowKSAvICh6MSAtIHowKTtcblxuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShcbiAgICAgICAgICAgIGludGVycG9sYXRlKHgwLCB4MSwgdCkgLyB0aGlzLndvcmxkU2l6ZSxcbiAgICAgICAgICAgIGludGVycG9sYXRlKHkwLCB5MSwgdCkgLyB0aGlzLndvcmxkU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBjb29yZGluYXRlLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gc2NyZWVuIHBvaW50XG4gICAgICovXG4gICAgY29vcmRpbmF0ZVBvaW50KGNvb3JkOiBNZXJjYXRvckNvb3JkaW5hdGUpIHtcbiAgICAgICAgY29uc3QgcCA9IFtjb29yZC54ICogdGhpcy53b3JsZFNpemUsIGNvb3JkLnkgKiB0aGlzLndvcmxkU2l6ZSwgMCwgMV07XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChwLCBwLCB0aGlzLnBpeGVsTWF0cml4KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChwWzBdIC8gcFszXSwgcFsxXSAvIHBbM10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBib3VuZHMuIFdoZW4gdGhlIGJlYXJpbmcgb3IgcGl0Y2ggaXMgbm9uLXplcm8sIHRoZSB2aXNpYmxlIHJlZ2lvbiBpcyBub3RcbiAgICAgKiBhbiBheGlzLWFsaWduZWQgcmVjdGFuZ2xlLCBhbmQgdGhlIHJlc3VsdCBpcyB0aGUgc21hbGxlc3QgYm91bmRzIHRoYXQgZW5jb21wYXNzZXMgdGhlIHZpc2libGUgcmVnaW9uLlxuICAgICAqL1xuICAgIGdldEJvdW5kcygpOiBMbmdMYXRCb3VuZHMge1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcygpXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQoMCwgMCkpKVxuICAgICAgICAgICAgLmV4dGVuZCh0aGlzLnBvaW50TG9jYXRpb24obmV3IFBvaW50KHRoaXMud2lkdGgsIDApKSlcbiAgICAgICAgICAgIC5leHRlbmQodGhpcy5wb2ludExvY2F0aW9uKG5ldyBQb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCkpKVxuICAgICAgICAgICAgLmV4dGVuZCh0aGlzLnBvaW50TG9jYXRpb24obmV3IFBvaW50KDAsIHRoaXMuaGVpZ2h0KSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZ2VvZ3JhcGhpY2FsIGJvdW5kcyB0aGUgbWFwIGlzIGNvbnN0cmFpbmVkIHRvLCBvciBgbnVsbGAgaWYgbm9uZSBzZXQuXG4gICAgICovXG4gICAgZ2V0TWF4Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMubGF0UmFuZ2UgfHwgdGhpcy5sYXRSYW5nZS5sZW5ndGggIT09IDIgfHxcbiAgICAgICAgICAgICF0aGlzLmxuZ1JhbmdlIHx8IHRoaXMubG5nUmFuZ2UubGVuZ3RoICE9PSAyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyhbdGhpcy5sbmdSYW5nZVswXSwgdGhpcy5sYXRSYW5nZVswXV0sIFt0aGlzLmxuZ1JhbmdlWzFdLCB0aGlzLmxhdFJhbmdlWzFdXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBzZXRNYXhCb3VuZHMoYm91bmRzPzogTG5nTGF0Qm91bmRzKSB7XG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIHRoaXMubG5nUmFuZ2UgPSBbYm91bmRzLmdldFdlc3QoKSwgYm91bmRzLmdldEVhc3QoKV07XG4gICAgICAgICAgICB0aGlzLmxhdFJhbmdlID0gW2JvdW5kcy5nZXRTb3V0aCgpLCBib3VuZHMuZ2V0Tm9ydGgoKV07XG4gICAgICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG5nUmFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5sYXRSYW5nZSA9IFstdGhpcy5tYXhWYWxpZExhdGl0dWRlLCB0aGlzLm1heFZhbGlkTGF0aXR1ZGVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBwb3NNYXRyaXggdGhhdCwgZ2l2ZW4gYSB0aWxlIGNvb3JkaW5hdGUsIHdvdWxkIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgdGlsZSBvbiBhIG1hcC5cbiAgICAgKiBAcGFyYW0ge1Vud3JhcHBlZFRpbGVJRH0gdW53cmFwcGVkVGlsZUlEO1xuICAgICAqL1xuICAgIGNhbGN1bGF0ZVBvc01hdHJpeCh1bndyYXBwZWRUaWxlSUQ6IFVud3JhcHBlZFRpbGVJRCwgYWxpZ25lZDogYm9vbGVhbiA9IGZhbHNlKTogRmxvYXQzMkFycmF5IHtcbiAgICAgICAgY29uc3QgcG9zTWF0cml4S2V5ID0gdW53cmFwcGVkVGlsZUlELmtleTtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBhbGlnbmVkID8gdGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlIDogdGhpcy5fcG9zTWF0cml4Q2FjaGU7XG4gICAgICAgIGlmIChjYWNoZVtwb3NNYXRyaXhLZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVbcG9zTWF0cml4S2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IHVud3JhcHBlZFRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy53b3JsZFNpemUgLyB0aGlzLnpvb21TY2FsZShjYW5vbmljYWwueik7XG4gICAgICAgIGNvbnN0IHVud3JhcHBlZFggPSBjYW5vbmljYWwueCArIE1hdGgucG93KDIsIGNhbm9uaWNhbC56KSAqIHVud3JhcHBlZFRpbGVJRC53cmFwO1xuXG4gICAgICAgIGNvbnN0IHBvc01hdHJpeCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShwb3NNYXRyaXgsIHBvc01hdHJpeCwgW3Vud3JhcHBlZFggKiBzY2FsZSwgY2Fub25pY2FsLnkgKiBzY2FsZSwgMF0pO1xuICAgICAgICBtYXQ0LnNjYWxlKHBvc01hdHJpeCwgcG9zTWF0cml4LCBbc2NhbGUgLyBFWFRFTlQsIHNjYWxlIC8gRVhURU5ULCAxXSk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkocG9zTWF0cml4LCBhbGlnbmVkID8gdGhpcy5hbGlnbmVkUHJvak1hdHJpeCA6IHRoaXMucHJvak1hdHJpeCwgcG9zTWF0cml4KTtcblxuICAgICAgICBjYWNoZVtwb3NNYXRyaXhLZXldID0gbmV3IEZsb2F0MzJBcnJheShwb3NNYXRyaXgpO1xuICAgICAgICByZXR1cm4gY2FjaGVbcG9zTWF0cml4S2V5XTtcbiAgICB9XG5cbiAgICBjdXN0b21MYXllck1hdHJpeCgpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVyY2F0b3JNYXRyaXguc2xpY2UoKTtcbiAgICB9XG5cbiAgICBfY29uc3RyYWluKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2VudGVyIHx8ICF0aGlzLndpZHRoIHx8ICF0aGlzLmhlaWdodCB8fCB0aGlzLl9jb25zdHJhaW5pbmcpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9jb25zdHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgICAgIGxldCBtaW5ZID0gLTkwO1xuICAgICAgICBsZXQgbWF4WSA9IDkwO1xuICAgICAgICBsZXQgbWluWCA9IC0xODA7XG4gICAgICAgIGxldCBtYXhYID0gMTgwO1xuICAgICAgICBsZXQgc3ksIHN4LCB4MiwgeTI7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUsXG4gICAgICAgICAgICB1bm1vZGlmaWVkID0gdGhpcy5fdW5tb2RpZmllZDtcblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgbGF0UmFuZ2UgPSB0aGlzLmxhdFJhbmdlO1xuICAgICAgICAgICAgbWluWSA9IG1lcmNhdG9yWWZyb21MYXQobGF0UmFuZ2VbMV0pICogdGhpcy53b3JsZFNpemU7XG4gICAgICAgICAgICBtYXhZID0gbWVyY2F0b3JZZnJvbUxhdChsYXRSYW5nZVswXSkgKiB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgICAgIHN5ID0gbWF4WSAtIG1pblkgPCBzaXplLnkgPyBzaXplLnkgLyAobWF4WSAtIG1pblkpIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxuZ1JhbmdlKSB7XG4gICAgICAgICAgICBjb25zdCBsbmdSYW5nZSA9IHRoaXMubG5nUmFuZ2U7XG4gICAgICAgICAgICBtaW5YID0gbWVyY2F0b3JYZnJvbUxuZyhsbmdSYW5nZVswXSkgKiB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgICAgIG1heFggPSBtZXJjYXRvclhmcm9tTG5nKGxuZ1JhbmdlWzFdKSAqIHRoaXMud29ybGRTaXplO1xuICAgICAgICAgICAgc3ggPSBtYXhYIC0gbWluWCA8IHNpemUueCA/IHNpemUueCAvIChtYXhYIC0gbWluWCkgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLnBvaW50O1xuXG4gICAgICAgIC8vIGhvdyBtdWNoIHRoZSBtYXAgc2hvdWxkIHNjYWxlIHRvIGZpdCB0aGUgc2NyZWVuIGludG8gZ2l2ZW4gbGF0aXR1ZGUvbG9uZ2l0dWRlIHJhbmdlc1xuICAgICAgICBjb25zdCBzID0gTWF0aC5tYXgoc3ggfHwgMCwgc3kgfHwgMCk7XG5cbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy51bnByb2plY3QobmV3IFBvaW50KFxuICAgICAgICAgICAgICAgIHN4ID8gKG1heFggKyBtaW5YKSAvIDIgOiBwb2ludC54LFxuICAgICAgICAgICAgICAgIHN5ID8gKG1heFkgKyBtaW5ZKSAvIDIgOiBwb2ludC55KSk7XG4gICAgICAgICAgICB0aGlzLnpvb20gKz0gdGhpcy5zY2FsZVpvb20ocyk7XG4gICAgICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gdW5tb2RpZmllZDtcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGF0UmFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBwb2ludC55LFxuICAgICAgICAgICAgICAgIGgyID0gc2l6ZS55IC8gMjtcblxuICAgICAgICAgICAgaWYgKHkgLSBoMiA8IG1pblkpIHkyID0gbWluWSArIGgyO1xuICAgICAgICAgICAgaWYgKHkgKyBoMiA+IG1heFkpIHkyID0gbWF4WSAtIGgyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG5nUmFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBwb2ludC54LFxuICAgICAgICAgICAgICAgIHcyID0gc2l6ZS54IC8gMjtcblxuICAgICAgICAgICAgaWYgKHggLSB3MiA8IG1pblgpIHgyID0gbWluWCArIHcyO1xuICAgICAgICAgICAgaWYgKHggKyB3MiA+IG1heFgpIHgyID0gbWF4WCAtIHcyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFuIHRoZSBtYXAgaWYgdGhlIHNjcmVlbiBnb2VzIG9mZiB0aGUgcmFuZ2VcbiAgICAgICAgaWYgKHgyICE9PSB1bmRlZmluZWQgfHwgeTIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgeDIgIT09IHVuZGVmaW5lZCA/IHgyIDogcG9pbnQueCxcbiAgICAgICAgICAgICAgICB5MiAhPT0gdW5kZWZpbmVkID8geTIgOiBwb2ludC55KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gdW5tb2RpZmllZDtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX2NhbGNNYXRyaWNlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlaWdodCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSA9IDAuNSAvIE1hdGgudGFuKHRoaXMuX2ZvdiAvIDIpICogdGhpcy5oZWlnaHQ7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIHBvaW50IFt3aWR0aC8yLCBoZWlnaHQvMl0gdG8gdGhlXG4gICAgICAgIC8vIGNlbnRlciB0b3AgcG9pbnQgW3dpZHRoLzIsIDBdIGluIFogdW5pdHMsIHVzaW5nIHRoZSBsYXcgb2Ygc2luZXMuXG4gICAgICAgIC8vIDEgWiB1bml0IGlzIGVxdWl2YWxlbnQgdG8gMSBob3Jpem9udGFsIHB4IGF0IHRoZSBjZW50ZXIgb2YgdGhlIG1hcFxuICAgICAgICAvLyAodGhlIGRpc3RhbmNlIGJldHdlZW5bd2lkdGgvMiwgaGVpZ2h0LzJdIGFuZCBbd2lkdGgvMiArIDEsIGhlaWdodC8yXSlcbiAgICAgICAgY29uc3QgaGFsZkZvdiA9IHRoaXMuX2ZvdiAvIDI7XG4gICAgICAgIGNvbnN0IGdyb3VuZEFuZ2xlID0gTWF0aC5QSSAvIDIgKyB0aGlzLl9waXRjaDtcbiAgICAgICAgY29uc3QgdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSA9IE1hdGguc2luKGhhbGZGb3YpICogdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gTWF0aC5zaW4oTWF0aC5QSSAtIGdyb3VuZEFuZ2xlIC0gaGFsZkZvdik7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gdGhpcy5wb2ludDtcbiAgICAgICAgY29uc3QgeCA9IHBvaW50LngsIHkgPSBwb2ludC55O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB6IGRpc3RhbmNlIG9mIHRoZSBmYXJ0aGVzdCBmcmFnbWVudCB0aGF0IHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICAgICAgY29uc3QgZnVydGhlc3REaXN0YW5jZSA9IE1hdGguY29zKE1hdGguUEkgLyAyIC0gdGhpcy5fcGl0Y2gpICogdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSArIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICAgICAgLy8gQWRkIGEgYml0IGV4dHJhIHRvIGF2b2lkIHByZWNpc2lvbiBwcm9ibGVtcyB3aGVuIGEgZnJhZ21lbnQncyBkaXN0YW5jZSBpcyBleGFjdGx5IGBmdXJ0aGVzdERpc3RhbmNlYFxuICAgICAgICBjb25zdCBmYXJaID0gZnVydGhlc3REaXN0YW5jZSAqIDEuMDE7XG5cbiAgICAgICAgLy8gVGhlIGxhcmdlciB0aGUgdmFsdWUgb2YgbmVhclogaXNcbiAgICAgICAgLy8gLSB0aGUgbW9yZSBkZXB0aCBwcmVjaXNpb24gaXMgYXZhaWxhYmxlIGZvciBmZWF0dXJlcyAoZ29vZClcbiAgICAgICAgLy8gLSBjbGlwcGluZyBzdGFydHMgYXBwZWFyaW5nIHNvb25lciB3aGVuIHRoZSBjYW1lcmEgaXMgY2xvc2UgdG8gM2QgZmVhdHVyZXMgKGJhZClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gU21hbGxlciB2YWx1ZXMgd29ya2VkIHdlbGwgZm9yIG1hcGJveC1nbC1qcyBidXQgZGVja2dsIHdhcyBlbmNvdW50ZXJpbmcgcHJlY2lzaW9uIGlzc3Vlc1xuICAgICAgICAvLyB3aGVuIHJlbmRlcmluZyBpdCdzIGxheWVycyB1c2luZyBjdXN0b20gbGF5ZXJzLiBUaGlzIHZhbHVlIHdhcyBleHBlcmltZW50YWxseSBjaG9zZW4gYW5kXG4gICAgICAgIC8vIHNlZW1zIHRvIHNvbHZlIHotZmlnaHRpbmcgaXNzdWVzIGluIGRlY2tnbCB3aGlsZSBub3QgY2xpcHBpbmcgYnVpbGRpbmdzIHRvbyBjbG9zZSB0byB0aGUgY2FtZXJhLlxuICAgICAgICBjb25zdCBuZWFyWiA9IHRoaXMuaGVpZ2h0IC8gNTA7XG5cbiAgICAgICAgLy8gbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gbG9jYXRpb24gdG8gR0wgY29vcmRpbmF0ZXMgKC0xIC4uIDEpXG4gICAgICAgIGxldCBtID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUobSwgdGhpcy5fZm92LCB0aGlzLndpZHRoIC8gdGhpcy5oZWlnaHQsIG5lYXJaLCBmYXJaKTtcblxuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsxLCAtMSwgMV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbMCwgMCwgLXRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZV0pO1xuICAgICAgICBtYXQ0LnJvdGF0ZVgobSwgbSwgdGhpcy5fcGl0Y2gpO1xuICAgICAgICBtYXQ0LnJvdGF0ZVoobSwgbSwgdGhpcy5hbmdsZSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFsteCwgLXksIDBdKTtcblxuICAgICAgICAvLyBUaGUgbWVyY2F0b3JNYXRyaXggY2FuIGJlIHVzZWQgdG8gdHJhbnNmb3JtIHBvaW50cyBmcm9tIG1lcmNhdG9yIGNvb3JkaW5hdGVzXG4gICAgICAgIC8vIChbMCwgMF0gbncsIFsxLCAxXSBzZSkgdG8gR0wgY29vcmRpbmF0ZXMuXG4gICAgICAgIHRoaXMubWVyY2F0b3JNYXRyaXggPSBtYXQ0LnNjYWxlKFtdLCBtLCBbdGhpcy53b3JsZFNpemUsIHRoaXMud29ybGRTaXplLCB0aGlzLndvcmxkU2l6ZV0pO1xuXG4gICAgICAgIC8vIHNjYWxlIHZlcnRpY2FsbHkgdG8gbWV0ZXJzIHBlciBwaXhlbCAoaW52ZXJzZSBvZiBncm91bmQgcmVzb2x1dGlvbik6XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEsIDEsIG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCB0aGlzLmNlbnRlci5sYXQpICogdGhpcy53b3JsZFNpemUsIDFdKTtcblxuICAgICAgICB0aGlzLnByb2pNYXRyaXggPSBtO1xuXG4gICAgICAgIC8vIE1ha2UgYSBzZWNvbmQgcHJvamVjdGlvbiBtYXRyaXggdGhhdCBpcyBhbGlnbmVkIHRvIGEgcGl4ZWwgZ3JpZCBmb3IgcmVuZGVyaW5nIHJhc3RlciB0aWxlcy5cbiAgICAgICAgLy8gV2UncmUgcm91bmRpbmcgdGhlIChmbG9hdGluZyBwb2ludCkgeC95IHZhbHVlcyB0byBhY2hpZXZlIHRvIGF2b2lkIHJlbmRlcmluZyByYXN0ZXIgaW1hZ2VzIHRvIGZyYWN0aW9uYWxcbiAgICAgICAgLy8gY29vcmRpbmF0ZXMuIEFkZGl0aW9uYWxseSwgd2UgYWRqdXN0IGJ5IGhhbGYgYSBwaXhlbCBpbiBlaXRoZXIgZGlyZWN0aW9uIGluIGNhc2UgdGhhdCB2aWV3cG9ydCBkaW1lbnNpb25cbiAgICAgICAgLy8gaXMgYW4gb2RkIGludGVnZXIgdG8gcHJlc2VydmUgcmVuZGVyaW5nIHRvIHRoZSBwaXhlbCBncmlkLiBXZSdyZSByb3RhdGluZyB0aGlzIHNoaWZ0IGJhc2VkIG9uIHRoZSBhbmdsZVxuICAgICAgICAvLyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gc28gdGhhdCAww4LCsCwgOTDDgsKwLCAxODDDgsKwLCBhbmQgMjcww4LCsCByYXN0ZXJzIGFyZSBjcmlzcCwgYW5kIGFkanVzdCB0aGUgc2hpZnQgc28gdGhhdFxuICAgICAgICAvLyBpdCBpcyBhbHdheXMgPD0gMC41IHBpeGVscy5cbiAgICAgICAgY29uc3QgeFNoaWZ0ID0gKHRoaXMud2lkdGggJSAyKSAvIDIsIHlTaGlmdCA9ICh0aGlzLmhlaWdodCAlIDIpIC8gMixcbiAgICAgICAgICAgIGFuZ2xlQ29zID0gTWF0aC5jb3ModGhpcy5hbmdsZSksIGFuZ2xlU2luID0gTWF0aC5zaW4odGhpcy5hbmdsZSksXG4gICAgICAgICAgICBkeCA9IHggLSBNYXRoLnJvdW5kKHgpICsgYW5nbGVDb3MgKiB4U2hpZnQgKyBhbmdsZVNpbiAqIHlTaGlmdCxcbiAgICAgICAgICAgIGR5ID0geSAtIE1hdGgucm91bmQoeSkgKyBhbmdsZUNvcyAqIHlTaGlmdCArIGFuZ2xlU2luICogeFNoaWZ0O1xuICAgICAgICBjb25zdCBhbGlnbmVkTSA9IG5ldyBGbG9hdDY0QXJyYXkobSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKGFsaWduZWRNLCBhbGlnbmVkTSwgWyBkeCA+IDAuNSA/IGR4IC0gMSA6IGR4LCBkeSA+IDAuNSA/IGR5IC0gMSA6IGR5LCAwIF0pO1xuICAgICAgICB0aGlzLmFsaWduZWRQcm9qTWF0cml4ID0gYWxpZ25lZE07XG5cbiAgICAgICAgbSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3RoaXMud2lkdGggLyAyLCAtdGhpcy5oZWlnaHQgLyAyLCAxXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFsxLCAtMSwgMF0pO1xuICAgICAgICB0aGlzLmxhYmVsUGxhbmVNYXRyaXggPSBtO1xuXG4gICAgICAgIG0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsxLCAtMSwgMV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbLTEsIC0xLCAwXSk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzIgLyB0aGlzLndpZHRoLCAyIC8gdGhpcy5oZWlnaHQsIDFdKTtcbiAgICAgICAgdGhpcy5nbENvb3JkTWF0cml4ID0gbTtcblxuICAgICAgICAvLyBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBsb2NhdGlvbiB0byBzY3JlZW4gY29vcmRpbmF0ZXNcbiAgICAgICAgdGhpcy5waXhlbE1hdHJpeCA9IG1hdDQubXVsdGlwbHkobmV3IEZsb2F0NjRBcnJheSgxNiksIHRoaXMubGFiZWxQbGFuZU1hdHJpeCwgdGhpcy5wcm9qTWF0cml4KTtcblxuICAgICAgICAvLyBpbnZlcnNlIG1hdHJpeCBmb3IgY29udmVyc2lvbiBmcm9tIHNjcmVlbiBjb29yZGluYWVzIHRvIGxvY2F0aW9uXG4gICAgICAgIG0gPSBtYXQ0LmludmVydChuZXcgRmxvYXQ2NEFycmF5KDE2KSwgdGhpcy5waXhlbE1hdHJpeCk7XG4gICAgICAgIGlmICghbSkgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIGludmVydCBtYXRyaXhcIik7XG4gICAgICAgIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlID0gbTtcblxuICAgICAgICB0aGlzLl9wb3NNYXRyaXhDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLl9hbGlnbmVkUG9zTWF0cml4Q2FjaGUgPSB7fTtcbiAgICB9XG5cbiAgICBtYXhQaXRjaFNjYWxlRmFjdG9yKCkge1xuICAgICAgICAvLyBjYWxjTWF0cmljZXMgaGFzbid0IHJ1biB5ZXRcbiAgICAgICAgaWYgKCF0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSkgcmV0dXJuIDE7XG5cbiAgICAgICAgY29uc3QgY29vcmQgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwgMCkpO1xuICAgICAgICBjb25zdCBwID0gW2Nvb3JkLnggKiB0aGlzLndvcmxkU2l6ZSwgY29vcmQueSAqIHRoaXMud29ybGRTaXplLCAwLCAxXTtcbiAgICAgICAgY29uc3QgdG9wUG9pbnQgPSB2ZWM0LnRyYW5zZm9ybU1hdDQocCwgcCwgdGhpcy5waXhlbE1hdHJpeCk7XG4gICAgICAgIHJldHVybiB0b3BQb2ludFszXSAvIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRoZSBjYW1lcmEgbG9va3MgYXQgdGhlIG1hcCBmcm9tIGEgM0QgKGxuZywgbGF0LCBhbHRpdHVkZSkgbG9jYXRpb24uIExldCdzIHVzZSBgY2FtZXJhTG9jYXRpb25gXG4gICAgICogYXMgdGhlIG5hbWUgZm9yIHRoZSBsb2NhdGlvbiB1bmRlciB0aGUgY2FtZXJhIGFuZCBvbiB0aGUgc3VyZmFjZSBvZiB0aGUgZWFydGggKGxuZywgbGF0LCAwKS5cbiAgICAgKiBgY2FtZXJhUG9pbnRgIGlzIHRoZSBwcm9qZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGBjYW1lcmFMb2NhdGlvbmAuXG4gICAgICpcbiAgICAgKiBUaGlzIHBvaW50IGlzIHVzZWZ1bCB0byB1cyBiZWNhdXNlIG9ubHkgZmlsbC1leHRydXNpb25zIHRoYXQgYXJlIGJldHdlZW4gYGNhbWVyYVBvaW50YCBhbmRcbiAgICAgKiB0aGUgcXVlcnkgcG9pbnQgb24gdGhlIHN1cmZhY2Ugb2YgdGhlIGVhcnRoIGNhbiBleHRlbmQgYW5kIGludGVyc2VjdCB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBXaGVuIHRoZSBtYXAgaXMgbm90IHBpdGNoZWQgdGhlIGBjYW1lcmFQb2ludGAgaXMgZXF1aXZhbGVudCB0byB0aGUgY2VudGVyIG9mIHRoZSBtYXAgYmVjYXVzZVxuICAgICAqIHRoZSBjYW1lcmEgaXMgcmlnaHQgYWJvdmUgdGhlIGNlbnRlciBvZiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGdldENhbWVyYVBvaW50KCkge1xuICAgICAgICBjb25zdCBwaXRjaCA9IHRoaXMuX3BpdGNoO1xuICAgICAgICBjb25zdCB5T2Zmc2V0ID0gTWF0aC50YW4ocGl0Y2gpICogKHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSB8fCAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VudGVyUG9pbnQuYWRkKG5ldyBQb2ludCgwLCB5T2Zmc2V0KSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBXaGVuIHRoZSBtYXAgaXMgcGl0Y2hlZCwgc29tZSBvZiB0aGUgM0QgZmVhdHVyZXMgdGhhdCBpbnRlcnNlY3QgYSBxdWVyeSB3aWxsIG5vdCBpbnRlcnNlY3RcbiAgICAgKiB0aGUgcXVlcnkgYXQgdGhlIHN1cmZhY2Ugb2YgdGhlIGVhcnRoLiBJbnN0ZWFkIHRoZSBmZWF0dXJlIG1heSBiZSBjbG9zZXIgYW5kIG9ubHkgaW50ZXJzZWN0XG4gICAgICogdGhlIHF1ZXJ5IGJlY2F1c2UgaXQgZXh0cnVkZXMgaW50byB0aGUgYWlyLlxuICAgICAqXG4gICAgICogVGhpcyByZXR1cm5zIGEgZ2VvbWV0cnkgdGhhdCBpbmNsdWRlcyBhbGwgb2YgdGhlIG9yaWdpbmFsIHF1ZXJ5IGFzIHdlbGwgYXMgYWxsIHBvc3NpYmxlIGFyZXMgb2YgdGhlXG4gICAgICogc2NyZWVuIHdoZXJlIHRoZSAqYmFzZSogb2YgYSB2aXNpYmxlIGV4dHJ1c2lvbiBjb3VsZCBiZS5cbiAgICAgKiAgLSBGb3IgcG9pbnQgcXVlcmllcywgdGhlIGxpbmUgZnJvbSB0aGUgcXVlcnkgcG9pbnQgdG8gdGhlIFwiY2FtZXJhIHBvaW50XCJcbiAgICAgKiAgLSBGb3Igb3RoZXIgZ2VvbWV0cmllcywgdGhlIGVudmVsb3BlIG9mIHRoZSBxdWVyeSBnZW9tZXRyeSBhbmQgdGhlIFwiY2FtZXJhIHBvaW50XCJcbiAgICAgKi9cbiAgICBnZXRDYW1lcmFRdWVyeUdlb21ldHJ5KHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50Pik6IEFycmF5PFBvaW50PiB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmdldENhbWVyYVBvaW50KCk7XG5cbiAgICAgICAgaWYgKHF1ZXJ5R2VvbWV0cnkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gW3F1ZXJ5R2VvbWV0cnlbMF0sIGNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1pblggPSBjLng7XG4gICAgICAgICAgICBsZXQgbWluWSA9IGMueTtcbiAgICAgICAgICAgIGxldCBtYXhYID0gYy54O1xuICAgICAgICAgICAgbGV0IG1heFkgPSBjLnk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcXVlcnlHZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBwLngpO1xuICAgICAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwLnkpO1xuICAgICAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwLngpO1xuICAgICAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBwLnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQobWluWCwgbWluWSksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KG1heFgsIG1pblkpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChtYXhYLCBtYXhZKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQobWluWCwgbWF4WSksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KG1pblgsIG1pblkpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2Zvcm07XG4iLCIvLyBAZmxvdyBzdHJpY3RcblxuLyoqXG4gKiBUaHJvdHRsZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gcnVuIGF0IG1vc3QgZXZlcnkgYHBlcmlvZGAgbWlsbGlzZWNvbmRzLlxuIFRocm90dGxlIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBydW4gYXQgbW9zdCBldmVyeSBwZXJpb2QgbWlsbGlzZWNvbmRzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGhyb3R0bGUoZm46ICgpID0+IHZvaWQsIHRpbWU6IG51bWJlcik6ICgpID0+ID9UaW1lb3V0SUQge1xuICAgIGxldCBwZW5kaW5nID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQ6ID9UaW1lb3V0SUQgPSBudWxsO1xuXG4gICAgY29uc3QgbGF0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBwZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aW1lcklkKSB7XG4gICAgICAgICAgICBsYXRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aW1lcklkO1xuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBiaW5kQWxsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IHRocm90dGxlIGZyb20gJy4uL3V0aWwvdGhyb3R0bGUnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAnO1xuXG4vKlxuICogQWRkcyB0aGUgbWFwJ3MgcG9zaXRpb24gdG8gaXRzIHBhZ2UncyBsb2NhdGlvbiBoYXNoLlxuICogUGFzc2VkIGFzIGFuIG9wdGlvbiB0byB0aGUgbWFwIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gKi9cbmNsYXNzIEhhc2gge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfdXBkYXRlSGFzaDogKCkgPT4gP1RpbWVvdXRJRDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25IYXNoQ2hhbmdlJyxcbiAgICAgICAgICAgICdfdXBkYXRlSGFzaCdcbiAgICAgICAgXSwgdGhpcyk7XG5cbiAgICAgICAgLy8gTW9iaWxlIFNhZmFyaSBkb2Vzbid0IGFsbG93IHVwZGF0aW5nIHRoZSBoYXNoIG1vcmUgdGhhbiAxMDAgdGltZXMgcGVyIDMwIHNlY29uZHMuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUhhc2ggPSB0aHJvdHRsZSh0aGlzLl91cGRhdGVIYXNoVW50aHJvdHRsZWQuYmluZCh0aGlzKSwgMzAgKiAxMDAwIC8gMTAwKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIE1hcCBlbGVtZW50IHRvIGxpc3RlbiBmb3IgY29vcmRpbmF0ZSBjaGFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwXG4gICAgICogQHJldHVybnMge0hhc2h9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZFRvKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLl9vbkhhc2hDaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlSGFzaCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogUmVtb3ZlcyBoYXNoXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLl9vbkhhc2hDaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUhhc2gpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlSGFzaCgpKTtcblxuICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRIYXNoU3RyaW5nKG1hcEZlZWRiYWNrPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgICB6b29tID0gTWF0aC5yb3VuZCh0aGlzLl9tYXAuZ2V0Wm9vbSgpICogMTAwKSAvIDEwMCxcbiAgICAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSBlcXVhdGlvbjogNTEycHggKiAyXnogLyAzNjAgLyAxMF5kIDwgMC41cHhcbiAgICAgICAgICAgIHByZWNpc2lvbiA9IE1hdGguY2VpbCgoem9vbSAqIE1hdGguTE4yICsgTWF0aC5sb2coNTEyIC8gMzYwIC8gMC41KSkgLyBNYXRoLkxOMTApLFxuICAgICAgICAgICAgbSA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pLFxuICAgICAgICAgICAgbG5nID0gTWF0aC5yb3VuZChjZW50ZXIubG5nICogbSkgLyBtLFxuICAgICAgICAgICAgbGF0ID0gTWF0aC5yb3VuZChjZW50ZXIubGF0ICogbSkgLyBtLFxuICAgICAgICAgICAgYmVhcmluZyA9IHRoaXMuX21hcC5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBwaXRjaCA9IHRoaXMuX21hcC5nZXRQaXRjaCgpO1xuICAgICAgICBsZXQgaGFzaCA9ICcnO1xuICAgICAgICBpZiAobWFwRmVlZGJhY2spIHtcbiAgICAgICAgICAgIC8vIG5ldyBtYXAgZmVlZGJhY2sgc2l0ZSBoYXMgc29tZSBjb25zdHJhaW50cyB0aGF0IGRvbid0IGFsbG93XG4gICAgICAgICAgICAvLyB1cyB0byB1c2UgdGhlIHNhbWUgaGFzaCBmb3JtYXQgYXMgd2UgZG8gZm9yIHRoZSBNYXAgaGFzaCBvcHRpb24uXG4gICAgICAgICAgICBoYXNoICs9IGAjLyR7bG5nfS8ke2xhdH0vJHt6b29tfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYXNoICs9IGAjJHt6b29tfS8ke2xhdH0vJHtsbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZWFyaW5nIHx8IHBpdGNoKSBoYXNoICs9IChgLyR7TWF0aC5yb3VuZChiZWFyaW5nICogMTApIC8gMTB9YCk7XG4gICAgICAgIGlmIChwaXRjaCkgaGFzaCArPSAoYC8ke01hdGgucm91bmQocGl0Y2gpfWApO1xuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9XG5cbiAgICBfb25IYXNoQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBsb2MgPSB3aW5kb3cubG9jYXRpb24uaGFzaC5yZXBsYWNlKCcjJywgJycpLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChsb2MubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5qdW1wVG8oe1xuICAgICAgICAgICAgICAgIGNlbnRlcjogWytsb2NbMl0sICtsb2NbMV1dLFxuICAgICAgICAgICAgICAgIHpvb206ICtsb2NbMF0sXG4gICAgICAgICAgICAgICAgYmVhcmluZzogKyhsb2NbM10gfHwgMCksXG4gICAgICAgICAgICAgICAgcGl0Y2g6ICsobG9jWzRdIHx8IDApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBfdXBkYXRlSGFzaFVudGhyb3R0bGVkKCkge1xuICAgICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRIYXNoU3RyaW5nKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUod2luZG93Lmhpc3Rvcnkuc3RhdGUsICcnLCBoYXNoKTtcbiAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFcnJvcikge1xuICAgICAgICAgICAgLy8gSUUxMSBkb2VzIG5vdCBhbGxvdyB0aGlzIGlmIHRoZSBwYWdlIGlzIHdpdGhpbiBhbiBpZnJhbWUgY3JlYXRlZFxuICAgICAgICAgICAgLy8gd2l0aCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZSguLi4pLlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzc0MTBcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBIYXNoO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuL21hcCc7XG5pbXBvcnQgdHlwZSBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuXG4vKipcbiAqIGBNYXBNb3VzZUV2ZW50YCBpcyB0aGUgZXZlbnQgdHlwZSBmb3IgbW91c2UtcmVsYXRlZCBtYXAgZXZlbnRzLlxuICogQGV4dGVuZHMge09iamVjdH1cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcE1vdXNlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHR5cGUuXG4gICAgICovXG4gICAgdHlwZTogJ21vdXNlZG93bidcbiAgICAgICAgfCAnbW91c2V1cCdcbiAgICAgICAgfCAnY2xpY2snXG4gICAgICAgIHwgJ2RibGNsaWNrJ1xuICAgICAgICB8ICdtb3VzZW1vdmUnXG4gICAgICAgIHwgJ21vdXNlb3ZlcidcbiAgICAgICAgfCAnbW91c2VlbnRlcidcbiAgICAgICAgfCAnbW91c2VsZWF2ZSdcbiAgICAgICAgfCAnbW91c2VvdXQnXG4gICAgICAgIHwgJ2NvbnRleHRtZW51JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBgTWFwYCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgdGFyZ2V0OiBNYXA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgRE9NIGV2ZW50IHdoaWNoIGNhdXNlZCB0aGUgbWFwIGV2ZW50LlxuICAgICAqL1xuICAgIG9yaWdpbmFsRXZlbnQ6IE1vdXNlRXZlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGl4ZWwgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlIGN1cnNvciwgcmVsYXRpdmUgdG8gdGhlIG1hcCBhbmQgbWVhc3VyZWQgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyLlxuICAgICAqL1xuICAgIHBvaW50OiBQb2ludDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBnZW9ncmFwaGljIGxvY2F0aW9uIG9uIHRoZSBtYXAgb2YgdGhlIG1vdXNlIGN1cnNvci5cbiAgICAgKi9cbiAgICBsbmdMYXQ6IExuZ0xhdDtcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIHN1YnNlcXVlbnQgZGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBldmVudCBieSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHByZXZlbnQgdGhlIGZvbGxvd2luZyBkZWZhdWx0IG1hcCBiZWhhdmlvcnM6XG4gICAgICpcbiAgICAgKiAgICogT24gYG1vdXNlZG93bmAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIERyYWdQYW5IYW5kbGVyfVxuICAgICAqICAgKiBPbiBgbW91c2Vkb3duYCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9XG4gICAgICogICAqIE9uIGBtb3VzZWRvd25gIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBCb3hab29tSGFuZGxlcn1cbiAgICAgKiAgICogT24gYGRibGNsaWNrYCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgRG91YmxlQ2xpY2tab29tSGFuZGxlcn1cbiAgICAgKlxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYHByZXZlbnREZWZhdWx0YCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRQcmV2ZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cblxuICAgIF9kZWZhdWx0UHJldmVudGVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcsIG1hcDogTWFwLCBvcmlnaW5hbEV2ZW50OiBNb3VzZUV2ZW50LCBkYXRhOiBPYmplY3QgPSB7fSkge1xuICAgICAgICBjb25zdCBwb2ludCA9IERPTS5tb3VzZVBvcyhtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCksIG9yaWdpbmFsRXZlbnQpO1xuICAgICAgICBjb25zdCBsbmdMYXQgPSBtYXAudW5wcm9qZWN0KHBvaW50KTtcbiAgICAgICAgc3VwZXIodHlwZSwgZXh0ZW5kKHsgcG9pbnQsIGxuZ0xhdCwgb3JpZ2luYWxFdmVudCB9LCBkYXRhKSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBtYXA7XG4gICAgfVxufVxuXG4vKipcbiAqIGBNYXBUb3VjaEV2ZW50YCBpcyB0aGUgZXZlbnQgdHlwZSBmb3IgdG91Y2gtcmVsYXRlZCBtYXAgZXZlbnRzLlxuICogQGV4dGVuZHMge09iamVjdH1cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcFRvdWNoRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHR5cGUuXG4gICAgICovXG4gICAgdHlwZTogJ3RvdWNoc3RhcnQnXG4gICAgICAgIHwgJ3RvdWNoZW5kJ1xuICAgICAgICB8ICd0b3VjaGNhbmNlbCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYE1hcGAgb2JqZWN0IHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHRhcmdldDogTWFwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIERPTSBldmVudCB3aGljaCBjYXVzZWQgdGhlIG1hcCBldmVudC5cbiAgICAgKi9cbiAgICBvcmlnaW5hbEV2ZW50OiBUb3VjaEV2ZW50O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdlb2dyYXBoaWMgbG9jYXRpb24gb24gdGhlIG1hcCBvZiB0aGUgY2VudGVyIG9mIHRoZSB0b3VjaCBldmVudCBwb2ludHMuXG4gICAgICovXG4gICAgbG5nTGF0OiBMbmdMYXQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGl4ZWwgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGUgdG91Y2ggZXZlbnQgcG9pbnRzLCByZWxhdGl2ZSB0byB0aGUgbWFwIGFuZCBtZWFzdXJlZCBmcm9tIHRoZSB0b3AgbGVmdFxuICAgICAqIGNvcm5lci5cbiAgICAgKi9cbiAgICBwb2ludDogUG9pbnQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXJyYXkgb2YgcGl4ZWwgY29vcmRpbmF0ZXMgY29ycmVzcG9uZGluZyB0byBhXG4gICAgICogW3RvdWNoIGV2ZW50J3MgYHRvdWNoZXNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVG91Y2hFdmVudC90b3VjaGVzKSBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBwb2ludHM6IEFycmF5PFBvaW50PjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb25zIG9uIHRoZSBtYXAgY29ycmVzcG9uZGluZyB0byBhXG4gICAgICogW3RvdWNoIGV2ZW50J3MgYHRvdWNoZXNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVG91Y2hFdmVudC90b3VjaGVzKSBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBsbmdMYXRzOiBBcnJheTxMbmdMYXQ+O1xuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgc3Vic2VxdWVudCBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIGV2ZW50IGJ5IHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcHJldmVudCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgbWFwIGJlaGF2aW9yczpcbiAgICAgKlxuICAgICAqICAgKiBPbiBgdG91Y2hzdGFydGAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIERyYWdQYW5IYW5kbGVyfVxuICAgICAqICAgKiBPbiBgdG91Y2hzdGFydGAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJ9XG4gICAgICpcbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIGBwcmV2ZW50RGVmYXVsdGAgaGFzIGJlZW4gY2FsbGVkLlxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0UHJldmVudGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZDtcbiAgICB9XG5cbiAgICBfZGVmYXVsdFByZXZlbnRlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBtYXA6IE1hcCwgb3JpZ2luYWxFdmVudDogVG91Y2hFdmVudCkge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBET00udG91Y2hQb3MobWFwLmdldENhbnZhc0NvbnRhaW5lcigpLCBvcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgY29uc3QgbG5nTGF0cyA9IHBvaW50cy5tYXAoKHQpID0+IG1hcC51bnByb2plY3QodCkpO1xuICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50cy5yZWR1Y2UoKHByZXYsIGN1cnIsIGksIGFycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByZXYuYWRkKGN1cnIuZGl2KGFyci5sZW5ndGgpKTtcbiAgICAgICAgfSwgbmV3IFBvaW50KDAsIDApKTtcbiAgICAgICAgY29uc3QgbG5nTGF0ID0gbWFwLnVucHJvamVjdChwb2ludCk7XG4gICAgICAgIHN1cGVyKHR5cGUsIHsgcG9pbnRzLCBwb2ludCwgbG5nTGF0cywgbG5nTGF0LCBvcmlnaW5hbEV2ZW50IH0pO1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIGBNYXBXaGVlbEV2ZW50YCBpcyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhlIGB3aGVlbGAgbWFwIGV2ZW50LlxuICogQGV4dGVuZHMge09iamVjdH1cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcFdoZWVsRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHR5cGUuXG4gICAgICovXG4gICAgdHlwZTogJ3doZWVsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBgTWFwYCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgdGFyZ2V0OiBNYXA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgRE9NIGV2ZW50IHdoaWNoIGNhdXNlZCB0aGUgbWFwIGV2ZW50LlxuICAgICAqL1xuICAgIG9yaWdpbmFsRXZlbnQ6IFdoZWVsRXZlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyBzdWJzZXF1ZW50IGRlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgZXZlbnQgYnkgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBwcmV2ZW50IHRoZSB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIFNjcm9sbFpvb21IYW5kbGVyfS5cbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIGBwcmV2ZW50RGVmYXVsdGAgaGFzIGJlZW4gY2FsbGVkLlxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0UHJldmVudGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZDtcbiAgICB9XG5cbiAgICBfZGVmYXVsdFByZXZlbnRlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBtYXA6IE1hcCwgb3JpZ2luYWxFdmVudDogV2hlZWxFdmVudCkge1xuICAgICAgICBzdXBlcih0eXBlLCB7IG9yaWdpbmFsRXZlbnQgfSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwQm94Wm9vbUV2ZW50XG4gKiBAcHJvcGVydHkge01vdXNlRXZlbnR9IG9yaWdpbmFsRXZlbnRcbiAqL1xuZXhwb3J0IHR5cGUgTWFwQm94Wm9vbUV2ZW50ID0ge1xuICAgIHR5cGU6ICdib3h6b29tc3RhcnQnXG4gICAgICAgIHwgJ2JveHpvb21lbmQnXG4gICAgICAgIHwgJ2JveHpvb21jYW5jZWwnLFxuICAgIG1hcDogTWFwLFxuICAgIG9yaWdpbmFsRXZlbnQ6IE1vdXNlRXZlbnRcbn07XG5cbi8qKlxuICogQSBgTWFwRGF0YUV2ZW50YCBvYmplY3QgaXMgZW1pdHRlZCB3aXRoIHRoZSB7QGxpbmsgTWFwLmV2ZW50OmRhdGF9XG4gKiBhbmQge0BsaW5rIE1hcC5ldmVudDpkYXRhbG9hZGluZ30gZXZlbnRzLiBQb3NzaWJsZSB2YWx1ZXMgZm9yXG4gKiBgZGF0YVR5cGVgcyBhcmU6XG4gKlxuICogLSBgJ3NvdXJjZSdgOiBUaGUgbm9uLXRpbGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW55IHNvdXJjZVxuICogLSBgJ3N0eWxlJ2A6IFRoZSBbc3R5bGVdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKSB1c2VkIGJ5IHRoZSBtYXBcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYXBEYXRhRXZlbnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFUeXBlIFRoZSB0eXBlIG9mIGRhdGEgdGhhdCBoYXMgY2hhbmdlZC4gT25lIG9mIGAnc291cmNlJ2AsIGAnc3R5bGUnYC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lzU291cmNlTG9hZGVkXSBUcnVlIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgIGFuZCB0aGUgc291cmNlIGhhcyBubyBvdXRzdGFuZGluZyBuZXR3b3JrIHJlcXVlc3RzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFtzb3VyY2VdIFRoZSBbc3R5bGUgc3BlYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc291cmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzKSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc291cmNlRGF0YVR5cGVdIEluY2x1ZGVkIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgIGFuZCB0aGUgZXZlbnQgc2lnbmFsc1xuICogdGhhdCBpbnRlcm5hbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIG9yIGNoYW5nZWQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYG1ldGFkYXRhYCBhbmQgYGNvbnRlbnRgLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFt0aWxlXSBUaGUgdGlsZSBiZWluZyBsb2FkZWQgb3IgY2hhbmdlZCwgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kXG4gKiB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0byBsb2FkaW5nIG9mIGEgdGlsZS5cbiAqIEBwcm9wZXJ0eSB7Q29vcmRpbmF0ZX0gW2Nvb3JkXSBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgdGlsZSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmRcbiAqIHRoZSBldmVudCBpcyByZWxhdGVkIHRvIGxvYWRpbmcgb2YgYSB0aWxlLlxuICovXG5leHBvcnQgdHlwZSBNYXBEYXRhRXZlbnQgPSB7XG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGRhdGFUeXBlOiBzdHJpbmdcbn07XG5cbmV4cG9ydCB0eXBlIE1hcENvbnRleHRFdmVudCA9IHtcbiAgICB0eXBlOiAnd2ViZ2xjb250ZXh0bG9zdCcgfCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLFxuICAgIG9yaWdpbmFsRXZlbnQ6IFdlYkdMQ29udGV4dEV2ZW50XG59XG5cbmV4cG9ydCB0eXBlIE1hcEV2ZW50ID1cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIHByZXNzZWQgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2Vkb3duXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAnbW91c2Vkb3duJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyByZWxlYXNlZCB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZXVwXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAnbW91c2V1cCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgbW92ZWQgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2VvdmVyXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqIEBzZWUgW0dldCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tb3VzZS1wb3NpdGlvbi8pXG4gICAgICogQHNlZSBbSGlnaGxpZ2h0IGZlYXR1cmVzIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hvdmVyLXN0eWxlcy8pXG4gICAgICogQHNlZSBbRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAgICAgKi9cbiAgICB8ICdtb3VzZW92ZXInXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIG1vdmVkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlbW92ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKiBAc2VlIFtHZXQgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbW91c2UtcG9zaXRpb24vKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB1bmRlciB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBvdmVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAgICAgKi9cbiAgICB8ICdtb3VzZW1vdmUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkIGF0IHRoZSBzYW1lIHBvaW50IG9uIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgY2xpY2tcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICogQHNlZSBbTWVhc3VyZSBkaXN0YW5jZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbWVhc3VyZS8pXG4gICAgICogQHNlZSBbQ2VudGVyIHRoZSBtYXAgb24gYSBjbGlja2VkIHN5bWJvbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKi9cbiAgICB8ICdjbGljaydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgY2xpY2tlZCB0d2ljZSBhdCB0aGUgc2FtZSBwb2ludCBvbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IGRibGNsaWNrXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ2RibGNsaWNrJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBlbnRlcnMgYSB2aXNpYmxlIHBvcnRpb24gb2YgYSBzcGVjaWZpZWQgbGF5ZXIgZnJvbVxuICAgICAqIG91dHNpZGUgdGhhdCBsYXllciBvciBvdXRzaWRlIHRoZSBtYXAgY2FudmFzLiBUaGlzIGV2ZW50IGNhbiBvbmx5IGJlIGxpc3RlbmVkIGZvciB2aWEgdGhlIHRocmVlLWFyZ3VtZW50XG4gICAgICogdmVyc2lvbiBvZiB7QGxpbmsgTWFwI29ufSwgd2hlcmUgdGhlIHNlY29uZCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2VlbnRlclxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdtb3VzZWVudGVyJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBsZWF2ZXMgYSB2aXNpYmxlIHBvcnRpb24gb2YgYSBzcGVjaWZpZWQgbGF5ZXIsIG9yIGxlYXZlc1xuICAgICAqIHRoZSBtYXAgY2FudmFzLiBUaGlzIGV2ZW50IGNhbiBvbmx5IGJlIGxpc3RlbmVkIGZvciB2aWEgdGhlIHRocmVlLWFyZ3VtZW50IHZlcnNpb24gb2Yge0BsaW5rIE1hcCNvbn0sXG4gICAgICogd2hlcmUgdGhlIHNlY29uZCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2VsZWF2ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAgICAgKi9cbiAgICB8ICdtb3VzZWxlYXZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50IGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBsZWF2ZXMgdGhlIG1hcCdzIGNhbnZhcy5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZW91dFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdtb3VzZW91dCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHJpZ2h0IGJ1dHRvbiBvZiB0aGUgbW91c2UgaXMgY2xpY2tlZCBvciB0aGUgY29udGV4dCBtZW51IGtleSBpcyBwcmVzc2VkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IGNvbnRleHRtZW51XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ2NvbnRleHRtZW51J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFtgd2hlZWxgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvd2hlZWwpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB3aGVlbFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcFdoZWVsRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICd3aGVlbCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHRvdWNoc3RhcnRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvdG91Y2hzdGFydCkgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IHRvdWNoc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBUb3VjaEV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAndG91Y2hzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHRvdWNoZW5kYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3RvdWNoZW5kKSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgdG91Y2hlbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBUb3VjaEV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAndG91Y2hlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B0b3VjaG1vdmVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvdG91Y2htb3ZlKSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgdG91Y2htb3ZlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3RvdWNobW92ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHRvdWNoY2FuY2VsYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3RvdWNoY2FuY2VsKSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgdG91Y2hjYW5jZWxcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBUb3VjaEV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAndG91Y2hjYW5jZWwnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGJlZm9yZSB0aGUgbWFwIGJlZ2lucyBhIHRyYW5zaXRpb24gZnJvbSBvbmVcbiAgICAgKiB2aWV3IHRvIGFub3RoZXIsIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjanVtcFRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3Zlc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHt7b3JpZ2luYWxFdmVudDogRHJhZ0V2ZW50fX0gZGF0YVxuICAgICAqL1xuICAgIHwgJ21vdmVzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24gZnJvbSBvbmUgdmlldyB0b1xuICAgICAqIGFub3RoZXIsIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ21vdmUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGFmdGVyIHRoZSBtYXAgY29tcGxldGVzIGEgdHJhbnNpdGlvbiBmcm9tIG9uZVxuICAgICAqIHZpZXcgdG8gYW5vdGhlciwgYXMgdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNqdW1wVG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdmVlbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHt7b3JpZ2luYWxFdmVudDogRHJhZ0V2ZW50fX0gZGF0YVxuICAgICAqIEBzZWUgW1BsYXkgbWFwIGxvY2F0aW9ucyBhcyBhIHNsaWRlc2hvd10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wbGF5YmFjay1sb2NhdGlvbnMvKVxuICAgICAqIEBzZWUgW0ZpbHRlciBmZWF0dXJlcyB3aXRoaW4gbWFwIHZpZXddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXG4gICAgICovXG4gICAgfCAnbW92ZWVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gc3RhcnRzLiBTZWUge0BsaW5rIERyYWdQYW5IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBkcmFnc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHt7b3JpZ2luYWxFdmVudDogRHJhZ0V2ZW50fX0gZGF0YVxuICAgICAqL1xuICAgIHwgJ2RyYWdzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uLiBTZWUge0BsaW5rIERyYWdQYW5IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBkcmFnXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdkcmFnJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBlbmRzLiBTZWUge0BsaW5rIERyYWdQYW5IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBkcmFnZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7e29yaWdpbmFsRXZlbnQ6IERyYWdFdmVudH19IGRhdGFcbiAgICAgKi9cbiAgICB8ICdkcmFnZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBiZWZvcmUgdGhlIG1hcCBiZWdpbnMgYSB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCB6b29tc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3pvb21zdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24gZnJvbSBvbmUgem9vbSBsZXZlbCB0byBhbm90aGVyLFxuICAgICAqIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHpvb21cbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqIEBzZWUgW1VwZGF0ZSBhIGNob3JvcGxldGggbGF5ZXIgYnkgem9vbSBsZXZlbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91cGRhdGluZy1jaG9yb3BsZXRoLylcbiAgICAgKi9cbiAgICB8ICd6b29tJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBhZnRlciB0aGUgbWFwIGNvbXBsZXRlcyBhIHRyYW5zaXRpb24gZnJvbSBvbmUgem9vbSBsZXZlbCB0byBhbm90aGVyLFxuICAgICAqIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHpvb21lbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3pvb21lbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIHN0YXJ0cy4gU2VlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcm90YXRlc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3JvdGF0ZXN0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgcmVwZWF0ZWRseSBkdXJpbmcgYSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24uIFNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IHJvdGF0ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAncm90YXRlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBlbmRzLiBTZWUge0BsaW5rIERyYWdSb3RhdGVIYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCByb3RhdGVlbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3JvdGF0ZWVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtYXAncyBwaXRjaCAodGlsdCkgYmVnaW5zIGEgY2hhbmdlIGFzXG4gICAgICogdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30gLlxuICAgICAqXG4gICAgICogQGV2ZW50IHBpdGNoc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBFdmVudERhdGF9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdwaXRjaHN0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbmV2ZXIgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBjaGFuZ2VzIGFzLlxuICAgICAqIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHBpdGNoXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRXZlbnREYXRhfSBkYXRhXG4gICAgICovXG4gICAgfCAncGl0Y2gnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpIGZpbmlzaGVzIGNoYW5naW5nIGFzXG4gICAgICogdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcGl0Y2hlbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBFdmVudERhdGF9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdwaXRjaGVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gc3RhcnRzLiBTZWUge0BsaW5rIEJveFpvb21IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBib3h6b29tc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBCb3hab29tRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdib3h6b29tc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGVuZHMuICBTZWUge0BsaW5rIEJveFpvb21IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBib3h6b29tZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtNYXBCb3hab29tRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdib3h6b29tZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uLCBvciB3aGVuIHRoZSBib3VuZGluZyBib3ggZG9lcyBub3QgbWVldCB0aGUgbWluaW11bSBzaXplIHRocmVzaG9sZC5cbiAgICAgKiBTZWUge0BsaW5rIEJveFpvb21IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBib3h6b29tY2FuY2VsXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwQm94Wm9vbUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnYm94em9vbWNhbmNlbCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAgaGFzIGJlZW4gcmVzaXplZC5cbiAgICAgKlxuICAgICAqIEBldmVudCByZXNpemVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgfCAncmVzaXplJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgV2ViR0wgY29udGV4dCBpcyBsb3N0LlxuICAgICAqXG4gICAgICogQGV2ZW50IHdlYmdsY29udGV4dGxvc3RcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgfCAnd2ViZ2xjb250ZXh0bG9zdCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIFdlYkdMIGNvbnRleHQgaXMgcmVzdG9yZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgd2ViZ2xjb250ZXh0cmVzdG9yZWRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgfCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBpbW1lZGlhdGVseSBhZnRlciBhbGwgbmVjZXNzYXJ5IHJlc291cmNlcyBoYXZlIGJlZW4gZG93bmxvYWRlZFxuICAgICAqIGFuZCB0aGUgZmlyc3QgdmlzdWFsbHkgY29tcGxldGUgcmVuZGVyaW5nIG9mIHRoZSBtYXAgaGFzIG9jY3VycmVkLlxuICAgICAqXG4gICAgICogQGV2ZW50IGxvYWRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAc2VlIFtEcmF3IEdlb0pTT04gcG9pbnRzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dlb2pzb24tbWFya2Vycy8pXG4gICAgICogQHNlZSBbQWRkIGxpdmUgcmVhbHRpbWUgZGF0YV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9saXZlLWdlb2pzb24vKVxuICAgICAqIEBzZWUgW0FuaW1hdGUgYSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hbmltYXRlLXBvaW50LWFsb25nLWxpbmUvKVxuICAgICAqL1xuICAgIHwgJ2xvYWQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgbWFwIGlzIGRyYXduIHRvIHRoZSBzY3JlZW4sIGFzIHRoZSByZXN1bHQgb2ZcbiAgICAgKlxuICAgICAqIC0gYSBjaGFuZ2UgdG8gdGhlIG1hcCdzIHBvc2l0aW9uLCB6b29tLCBwaXRjaCwgb3IgYmVhcmluZ1xuICAgICAqIC0gYSBjaGFuZ2UgdG8gdGhlIG1hcCdzIHN0eWxlXG4gICAgICogLSBhIGNoYW5nZSB0byBhIEdlb0pTT04gc291cmNlXG4gICAgICogLSB0aGUgbG9hZGluZyBvZiBhIHZlY3RvciB0aWxlLCBHZW9KU09OIGZpbGUsIGdseXBoLCBvciBzcHJpdGVcbiAgICAgKlxuICAgICAqIEBldmVudCByZW5kZXJcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgfCAncmVuZGVyJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgcmVuZGVyZWQgYmVmb3JlIHRoZSBtYXAgZW50ZXJzIGFuXG4gICAgICogXCJpZGxlXCIgc3RhdGU6XG4gICAgICpcbiAgICAgKiAtIE5vIGNhbWVyYSB0cmFuc2l0aW9ucyBhcmUgaW4gcHJvZ3Jlc3NcbiAgICAgKiAtIEFsbCBjdXJyZW50bHkgcmVxdWVzdGVkIHRpbGVzIGhhdmUgbG9hZGVkXG4gICAgICogLSBBbGwgZmFkZS90cmFuc2l0aW9uIGFuaW1hdGlvbnMgaGF2ZSBjb21wbGV0ZWRcbiAgICAgKlxuICAgICAqIEBldmVudCBpZGxlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHwgJ2lkbGUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFwIGhhcyBiZWVuIHJlbW92ZWQgd2l0aCB7QGxpbmsgTWFwLmV2ZW50OnJlbW92ZX0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcmVtb3ZlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHwgJ3JlbW92ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBUaGlzIGlzIEdMIEpTJ3MgcHJpbWFyeSBlcnJvciByZXBvcnRpbmdcbiAgICAgKiBtZWNoYW5pc20uIFdlIHVzZSBhbiBldmVudCBpbnN0ZWFkIG9mIGB0aHJvd2AgdG8gYmV0dGVyIGFjY29tbW9kYXRlXG4gICAgICogYXN5bmNyb25vdXMgb3BlcmF0aW9ucy4gSWYgbm8gbGlzdGVuZXJzIGFyZSBib3VuZCB0byB0aGUgYGVycm9yYCBldmVudCwgdGhlXG4gICAgICogZXJyb3Igd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlLlxuICAgICAqXG4gICAgICogQGV2ZW50IGVycm9yXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7e2Vycm9yOiB7bWVzc2FnZTogc3RyaW5nfX19IGRhdGFcbiAgICAgKi9cbiAgICB8ICdlcnJvcidcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW55IG1hcCBkYXRhIGxvYWRzIG9yIGNoYW5nZXMuIFNlZSB7QGxpbmsgTWFwRGF0YUV2ZW50fVxuICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IGRhdGFcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdkYXRhJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbWFwJ3Mgc3R5bGUgbG9hZHMgb3IgY2hhbmdlcy4gU2VlXG4gICAgICoge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc3R5bGVkYXRhXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnc3R5bGVkYXRhJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBvbmUgb2YgdGhlIG1hcCdzIHNvdXJjZXMgbG9hZHMgb3IgY2hhbmdlcywgaW5jbHVkaW5nIGlmIGEgdGlsZSBiZWxvbmdpbmdcbiAgICAgKiB0byBhIHNvdXJjZSBsb2FkcyBvciBjaGFuZ2VzLiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc291cmNlZGF0YVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcERhdGFFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3NvdXJjZWRhdGEnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFueSBtYXAgZGF0YSAoc3R5bGUsIHNvdXJjZSwgdGlsZSwgZXRjKSBiZWdpbnMgbG9hZGluZyBvclxuICAgICAqIGNoYW5naW5nIGFzeW5jcm9ub3VzbHkuIEFsbCBgZGF0YWxvYWRpbmdgIGV2ZW50cyBhcmUgZm9sbG93ZWQgYnkgYSBgZGF0YWBcbiAgICAgKiBvciBgZXJyb3JgIGV2ZW50LiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZGF0YWxvYWRpbmdcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdkYXRhbG9hZGluZydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIG1hcCdzIHN0eWxlIGJlZ2lucyBsb2FkaW5nIG9yIGNoYW5naW5nIGFzeW5jcm9ub3VzbHkuXG4gICAgICogQWxsIGBzdHlsZWRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYHN0eWxlZGF0YWBcbiAgICAgKiBvciBgZXJyb3JgIGV2ZW50LiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc3R5bGVkYXRhbG9hZGluZ1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcERhdGFFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3N0eWxlZGF0YWxvYWRpbmcnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIG9uZSBvZiB0aGUgbWFwJ3Mgc291cmNlcyBiZWdpbnMgbG9hZGluZyBvciBjaGFuZ2luZyBhc3luY3Jvbm91c2x5LlxuICAgICAqIEFsbCBgc291cmNlZGF0YWxvYWRpbmdgIGV2ZW50cyBhcmUgZm9sbG93ZWQgYnkgYSBgc291cmNlZGF0YWAgb3IgYGVycm9yYCBldmVudC5cbiAgICAgKiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc291cmNlZGF0YWxvYWRpbmdcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdzb3VyY2VkYXRhbG9hZGluZydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gaWNvbiBvciBwYXR0ZXJuIG5lZWRlZCBieSB0aGUgc3R5bGUgaXMgbWlzc2luZy4gVGhlIG1pc3NpbmcgaW1hZ2UgY2FuXG4gICAgICogYmUgYWRkZWQgd2l0aCB7QGxpbmsgTWFwI2FkZEltYWdlfSB3aXRoaW4gdGhpcyBldmVudCBsaXN0ZW5lciBjYWxsYmFjayB0byBwcmV2ZW50IHRoZSBpbWFnZSBmcm9tXG4gICAgICogYmVpbmcgc2tpcHBlZC4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBkeW5hbWljYWxseSBnZW5lcmF0ZSBpY29ucyBhbmQgcGF0dGVybnMuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc3R5bGVpbWFnZW1pc3NpbmdcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgbWlzc2luZyBpbWFnZS5cbiAgICAgKlxuICAgICAqIEBzZWUgW0dlbmVyYXRlIGFuZCBhZGQgYSBtaXNzaW5nIGljb24gdG8gdGhlIG1hcF0oaHR0cHM6Ly9tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS1taXNzaW5nLWdlbmVyYXRlZC8pXG4gICAgICovXG4gICAgfCAnc3R5bGVpbWFnZW1pc3NpbmcnXG5cbiAgICAvKipcbiAgICAgKiBAZXZlbnQgc3R5bGUubG9hZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHwgJ3N0eWxlLmxvYWQnO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5cbmltcG9ydCB7IGVhc2UgYXMgX2Vhc2UsIGJpbmRBbGwsIGJlemllciB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgeyBudW1iZXIgYXMgaW50ZXJwb2xhdGUgfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi8uLi9nZW8vbG5nX2xhdCc7XG5pbXBvcnQgeyBFdmVudCB9IGZyb20gJy4uLy4uL3V0aWwvZXZlbnRlZCc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7VGFza0lEfSBmcm9tICcuLi8uLi91dGlsL3Rhc2tfcXVldWUnO1xuXG4vLyBkZWx0YVkgdmFsdWUgZm9yIG1vdXNlIHNjcm9sbCB3aGVlbCBpZGVudGlmaWNhdGlvblxuY29uc3Qgd2hlZWxab29tRGVsdGEgPSA0LjAwMDI0NDE0MDYyNTtcblxuLy8gVGhlc2UgbWFnaWMgbnVtYmVycyBjb250cm9sIHRoZSByYXRlIG9mIHpvb20uIFRyYWNrcGFkIGV2ZW50cyBmaXJlIGF0IGEgZ3JlYXRlclxuLy8gZnJlcXVlbmN5IHRoYW4gbW91c2Ugc2Nyb2xsIHdoZWVsLCBzbyByZWR1Y2UgdGhlIHpvb20gcmF0ZSBwZXIgd2hlZWwgdGlja1xuY29uc3QgZGVmYXVsdFpvb21SYXRlID0gMSAvIDEwMDtcbmNvbnN0IHdoZWVsWm9vbVJhdGUgPSAxIC8gNDUwO1xuXG4vLyB1cHBlciBib3VuZCBvbiBob3cgbXVjaCB3ZSBzY2FsZSB0aGUgbWFwIGluIGFueSBzaW5nbGUgcmVuZGVyIGZyYW1lOyB0aGlzXG4vLyBpcyB1c2VkIHRvIGxpbWl0IHpvb20gcmF0ZSBpbiB0aGUgY2FzZSBvZiB2ZXJ5IGZhc3Qgc2Nyb2xsaW5nXG5jb25zdCBtYXhTY2FsZVBlckZyYW1lID0gMjtcblxuLyoqXG4gKiBUaGUgYFNjcm9sbFpvb21IYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSB0aGUgbWFwIGJ5IHNjcm9sbGluZy5cbiAqL1xuY2xhc3MgU2Nyb2xsWm9vbUhhbmRsZXIge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfZWw6IEhUTUxFbGVtZW50O1xuICAgIF9lbmFibGVkOiBib29sZWFuO1xuICAgIF9hY3RpdmU6IGJvb2xlYW47XG4gICAgX3pvb21pbmc6IGJvb2xlYW47XG4gICAgX2Fyb3VuZENlbnRlcjogYm9vbGVhbjtcbiAgICBfYXJvdW5kOiBQb2ludDtcbiAgICBfYXJvdW5kUG9pbnQ6IFBvaW50O1xuICAgIF90eXBlOiAnd2hlZWwnIHwgJ3RyYWNrcGFkJyB8IG51bGw7XG4gICAgX2xhc3RWYWx1ZTogbnVtYmVyO1xuICAgIF90aW1lb3V0OiA/VGltZW91dElEOyAvLyB1c2VkIGZvciBkZWxheWVkLWhhbmRsaW5nIG9mIGEgc2luZ2xlIHdoZWVsIG1vdmVtZW50XG4gICAgX2ZpbmlzaFRpbWVvdXQ6ID9UaW1lb3V0SUQ7IC8vIHVzZWQgdG8gZGVsYXkgZmluYWwgJ3ttb3ZlLHpvb219ZW5kJyBldmVudHNcblxuICAgIF9sYXN0V2hlZWxFdmVudDogYW55O1xuICAgIF9sYXN0V2hlZWxFdmVudFRpbWU6IG51bWJlcjtcblxuICAgIF9zdGFydFpvb206ID9udW1iZXI7XG4gICAgX3RhcmdldFpvb206ID9udW1iZXI7XG4gICAgX2RlbHRhOiBudW1iZXI7XG4gICAgX2Vhc2luZzogPygobnVtYmVyKSA9PiBudW1iZXIpO1xuICAgIF9wcmV2RWFzZTogP3tzdGFydDogbnVtYmVyLCBkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmc6IChudW1iZXIpID0+IG51bWJlcn07XG5cbiAgICBfZnJhbWVJZDogP1Rhc2tJRDtcblxuICAgIF9kZWZhdWx0Wm9vbVJhdGU6IG51bWJlcjtcbiAgICBfd2hlZWxab29tUmF0ZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgICAgIHRoaXMuX2RlbHRhID0gMDtcblxuICAgICAgICB0aGlzLl9kZWZhdWx0Wm9vbVJhdGUgPSBkZWZhdWx0Wm9vbVJhdGU7XG4gICAgICAgIHRoaXMuX3doZWVsWm9vbVJhdGUgPSB3aGVlbFpvb21SYXRlO1xuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbldoZWVsJyxcbiAgICAgICAgICAgICdfb25UaW1lb3V0JyxcbiAgICAgICAgICAgICdfb25TY3JvbGxGcmFtZScsXG4gICAgICAgICAgICAnX29uU2Nyb2xsRmluaXNoZWQnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgem9vbSByYXRlIG9mIGEgdHJhY2twYWRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3pvb21SYXRlID0gMS8xMDBdXG4gICAgICovXG4gICAgc2V0Wm9vbVJhdGUoem9vbVJhdGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9kZWZhdWx0Wm9vbVJhdGUgPSB6b29tUmF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHpvb20gcmF0ZSBvZiBhIG1vdXNlIHdoZWVsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aGVlbFpvb21SYXRlID0gMS80NTBdXG4gICAgICovXG4gICAgc2V0V2hlZWxab29tUmF0ZSh3aGVlbFpvb21SYXRlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fd2hlZWxab29tUmF0ZSA9IHdoZWVsWm9vbVJhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKlxuICAgICogQWN0aXZlIHN0YXRlIGlzIHR1cm5lZCBvbiBhbmQgb2ZmIHdpdGggZXZlcnkgc2Nyb2xsIHdoZWVsIGV2ZW50IGFuZCBpcyBzZXQgYmFjayB0byBmYWxzZSBiZWZvcmUgdGhlIG1hcFxuICAgICogcmVuZGVyIGlzIGNhbGxlZCwgc28gX2FjdGl2ZSBpcyBub3QgYSBnb29kIGNhbmRpZGF0ZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBzY3JvbGwgem9vbSBhbmltYXRpb24gaXMgaW5cbiAgICAqIHByb2dyZXNzLlxuICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICBpc1pvb21pbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3pvb21pbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXJvdW5kXSBJZiBcImNlbnRlclwiIGlzIHBhc3NlZCwgbWFwIHdpbGwgem9vbSBhcm91bmQgY2VudGVyIG9mIG1hcFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5zY3JvbGxab29tLmVuYWJsZSgpO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogIG1hcC5zY3JvbGxab29tLmVuYWJsZSh7IGFyb3VuZDogJ2NlbnRlcicgfSlcbiAgICAgKi9cbiAgICBlbmFibGUob3B0aW9uczogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9hcm91bmRDZW50ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJvdW5kID09PSAnY2VudGVyJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5zY3JvbGxab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uV2hlZWwoZTogV2hlZWxFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcblxuICAgICAgICAvLyBSZW1vdmUgYGFueWAgY2FzdCB3aGVuIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy80ODc5IGlzIGZpeGVkLlxuICAgICAgICBsZXQgdmFsdWUgPSBlLmRlbHRhTW9kZSA9PT0gKHdpbmRvdy5XaGVlbEV2ZW50OiBhbnkpLkRPTV9ERUxUQV9MSU5FID8gZS5kZWx0YVkgKiA0MCA6IGUuZGVsdGFZO1xuICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgdGltZURlbHRhID0gbm93IC0gKHRoaXMuX2xhc3RXaGVlbEV2ZW50VGltZSB8fCAwKTtcblxuICAgICAgICB0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUgPSBub3c7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSAwICYmICh2YWx1ZSAlIHdoZWVsWm9vbURlbHRhKSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIG1vdXNlIHdoZWVsIGV2ZW50LlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9ICd3aGVlbCc7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gMCAmJiBNYXRoLmFicyh2YWx1ZSkgPCA0KSB7XG4gICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgdHJhY2twYWQgZXZlbnQgYmVjYXVzZSBpdCBpcyBzbyBzbWFsbC5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAndHJhY2twYWQnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodGltZURlbHRhID4gNDAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGxpa2VseSBhIG5ldyBzY3JvbGwgYWN0aW9uLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgLy8gU3RhcnQgYSB0aW1lb3V0IGluIGNhc2UgdGhpcyB3YXMgYSBzaW5ndWxhciBldmVudCwgYW5kIGRlbHkgaXQgYnkgdXAgdG8gNDBtcy5cbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCwgNDAsIGUpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3R5cGUpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXBlYXRpbmcgZXZlbnQsIGJ1dCB3ZSBkb24ndCBrbm93IHRoZSB0eXBlIG9mIGV2ZW50IGp1c3QgeWV0LlxuICAgICAgICAgICAgLy8gSWYgdGhlIGRlbHRhIHBlciB0aW1lIGlzIHNtYWxsLCB3ZSBhc3N1bWUgaXQncyBhIGZhc3QgdHJhY2twYWQ7IG90aGVyd2lzZSB3ZSBzd2l0Y2ggaW50byB3aGVlbCBtb2RlLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IChNYXRoLmFicyh0aW1lRGVsdGEgKiB2YWx1ZSkgPCAyMDApID8gJ3RyYWNrcGFkJyA6ICd3aGVlbCc7XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBvdXIgZGVsYXllZCBldmVudCBpc24ndCBmaXJlZCBhZ2FpbiwgYmVjYXVzZSB3ZSBhY2N1bXVsYXRlXG4gICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgZXZlbnQgKHdoaWNoIHdhcyBsZXNzIHRoYW4gNDBtcyBhZ28pIGludG8gdGhpcyBldmVudC5cbiAgICAgICAgICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNsb3cgZG93biB6b29tIGlmIHNoaWZ0IGtleSBpcyBoZWxkIGZvciBtb3JlIHByZWNpc2Ugem9vbWluZ1xuICAgICAgICBpZiAoZS5zaGlmdEtleSAmJiB2YWx1ZSkgdmFsdWUgPSB2YWx1ZSAvIDQ7XG5cbiAgICAgICAgLy8gT25seSBmaXJlIHRoZSBjYWxsYmFjayBpZiB3ZSBhY3R1YWxseSBrbm93IHdoYXQgdHlwZSBvZiBzY3JvbGxpbmcgZGV2aWNlIHRoZSB1c2VyIHVzZXMuXG4gICAgICAgIGlmICh0aGlzLl90eXBlKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0V2hlZWxFdmVudCA9IGU7XG4gICAgICAgICAgICB0aGlzLl9kZWx0YSAtPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnQoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgX29uVGltZW91dChpbml0aWFsRXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLl90eXBlID0gJ3doZWVsJztcbiAgICAgICAgdGhpcy5fZGVsdGEgLT0gdGhpcy5fbGFzdFZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnQoaW5pdGlhbEV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zdGFydChlOiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kZWx0YSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuX2NhbmNlbFJlbmRlckZyYW1lKHRoaXMuX2ZyYW1lSWQpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuaXNab29taW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IEV2ZW50KCdtb3Zlc3RhcnQnLCB7b3JpZ2luYWxFdmVudDogZX0pKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCgnem9vbXN0YXJ0Jywge29yaWdpbmFsRXZlbnQ6IGV9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZmluaXNoVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2ZpbmlzaFRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcblxuICAgICAgICB0aGlzLl9hcm91bmQgPSBMbmdMYXQuY29udmVydCh0aGlzLl9hcm91bmRDZW50ZXIgPyB0aGlzLl9tYXAuZ2V0Q2VudGVyKCkgOiB0aGlzLl9tYXAudW5wcm9qZWN0KHBvcykpO1xuICAgICAgICB0aGlzLl9hcm91bmRQb2ludCA9IHRoaXMuX21hcC50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludCh0aGlzLl9hcm91bmQpO1xuICAgICAgICBpZiAoIXRoaXMuX2ZyYW1lSWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSB0aGlzLl9tYXAuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9vblNjcm9sbEZyYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vblNjcm9sbEZyYW1lKCkge1xuICAgICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0ciA9IHRoaXMuX21hcC50cmFuc2Zvcm07XG5cbiAgICAgICAgLy8gaWYgd2UndmUgaGFkIHNjcm9sbCBldmVudHMgc2luY2UgdGhlIGxhc3QgcmVuZGVyIGZyYW1lLCBjb25zdW1lIHRoZVxuICAgICAgICAvLyBhY2N1bXVsYXRlZCBkZWx0YSwgYW5kIHVwZGF0ZSB0aGUgdGFyZ2V0IHpvb20gbGV2ZWwgYWNjb3JkaW5nbHlcbiAgICAgICAgaWYgKHRoaXMuX2RlbHRhICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBGb3IgdHJhY2twYWQgZXZlbnRzIGFuZCBzaW5nbGUgbW91c2Ugd2hlZWwgdGlja3MsIHVzZSB0aGUgZGVmYXVsdCB6b29tIHJhdGVcbiAgICAgICAgICAgIGNvbnN0IHpvb21SYXRlID0gKHRoaXMuX3R5cGUgPT09ICd3aGVlbCcgJiYgTWF0aC5hYnModGhpcy5fZGVsdGEpID4gd2hlZWxab29tRGVsdGEpID8gdGhpcy5fd2hlZWxab29tUmF0ZSA6IHRoaXMuX2RlZmF1bHRab29tUmF0ZTtcbiAgICAgICAgICAgIC8vIFNjYWxlIGJ5IHNpZ21vaWQgb2Ygc2Nyb2xsIHdoZWVsIGRlbHRhLlxuICAgICAgICAgICAgbGV0IHNjYWxlID0gbWF4U2NhbGVQZXJGcmFtZSAvICgxICsgTWF0aC5leHAoLU1hdGguYWJzKHRoaXMuX2RlbHRhICogem9vbVJhdGUpKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWx0YSA8IDAgJiYgc2NhbGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IDEgLyBzY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZnJvbVNjYWxlID0gdHlwZW9mIHRoaXMuX3RhcmdldFpvb20gPT09ICdudW1iZXInID8gdHIuem9vbVNjYWxlKHRoaXMuX3RhcmdldFpvb20pIDogdHIuc2NhbGU7XG4gICAgICAgICAgICB0aGlzLl90YXJnZXRab29tID0gTWF0aC5taW4odHIubWF4Wm9vbSwgTWF0aC5tYXgodHIubWluWm9vbSwgdHIuc2NhbGVab29tKGZyb21TY2FsZSAqIHNjYWxlKSkpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbW91c2Ugd2hlZWwsIHJlZnJlc2ggdGhlIHN0YXJ0aW5nIHpvb20gYW5kIGVhc2luZ1xuICAgICAgICAgICAgLy8gZnVuY3Rpb24gd2UncmUgdXNpbmcgdG8gc21vb3RoIG91dCB0aGUgem9vbWluZyBiZXR3ZWVuIHdoZWVsXG4gICAgICAgICAgICAvLyBldmVudHNcbiAgICAgICAgICAgIGlmICh0aGlzLl90eXBlID09PSAnd2hlZWwnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRab29tID0gdHIuem9vbTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXNpbmcgPSB0aGlzLl9zbW9vdGhPdXRFYXNpbmcoMjAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0Wm9vbSA9IHR5cGVvZiB0aGlzLl90YXJnZXRab29tID09PSAnbnVtYmVyJyA/XG4gICAgICAgICAgICB0aGlzLl90YXJnZXRab29tIDogdHIuem9vbTtcbiAgICAgICAgY29uc3Qgc3RhcnRab29tID0gdGhpcy5fc3RhcnRab29tO1xuICAgICAgICBjb25zdCBlYXNpbmcgPSB0aGlzLl9lYXNpbmc7XG5cbiAgICAgICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl90eXBlID09PSAnd2hlZWwnICYmIHN0YXJ0Wm9vbSAmJiBlYXNpbmcpIHtcbiAgICAgICAgICAgIGFzc2VydChlYXNpbmcgJiYgdHlwZW9mIHN0YXJ0Wm9vbSA9PT0gJ251bWJlcicpO1xuXG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oKGJyb3dzZXIubm93KCkgLSB0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUpIC8gMjAwLCAxKTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBlYXNpbmcodCk7XG4gICAgICAgICAgICB0ci56b29tID0gaW50ZXJwb2xhdGUoc3RhcnRab29tLCB0YXJnZXRab29tLCBrKTtcbiAgICAgICAgICAgIGlmICh0IDwgMSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdGhpcy5fbWFwLl9yZXF1ZXN0UmVuZGVyRnJhbWUodGhpcy5fb25TY3JvbGxGcmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ci56b29tID0gdGFyZ2V0Wm9vbTtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyLnNldExvY2F0aW9uQXRQb2ludCh0aGlzLl9hcm91bmQsIHRoaXMuX2Fyb3VuZFBvaW50KTtcblxuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCB7b3JpZ2luYWxFdmVudDogdGhpcy5fbGFzdFdoZWVsRXZlbnR9KSk7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCgnem9vbScsIHtvcmlnaW5hbEV2ZW50OiB0aGlzLl9sYXN0V2hlZWxFdmVudH0pKTtcblxuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ3pvb21lbmQnLCB7b3JpZ2luYWxFdmVudDogdGhpcy5fbGFzdFdoZWVsRXZlbnR9KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IEV2ZW50KCdtb3ZlZW5kJywge29yaWdpbmFsRXZlbnQ6IHRoaXMuX2xhc3RXaGVlbEV2ZW50fSkpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90YXJnZXRab29tO1xuICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zbW9vdGhPdXRFYXNpbmcoZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBsZXQgZWFzaW5nID0gX2Vhc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXZFYXNlKSB7XG4gICAgICAgICAgICBjb25zdCBlYXNlID0gdGhpcy5fcHJldkVhc2UsXG4gICAgICAgICAgICAgICAgdCA9IChicm93c2VyLm5vdygpIC0gZWFzZS5zdGFydCkgLyBlYXNlLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHNwZWVkID0gZWFzZS5lYXNpbmcodCArIDAuMDEpIC0gZWFzZS5lYXNpbmcodCksXG5cbiAgICAgICAgICAgICAgICAvLyBRdWljayBoYWNrIHRvIG1ha2UgbmV3IGJlemllciB0aGF0IGlzIGNvbnRpbnVvdXMgd2l0aCBsYXN0XG4gICAgICAgICAgICAgICAgeCA9IDAuMjcgLyBNYXRoLnNxcnQoc3BlZWQgKiBzcGVlZCArIDAuMDAwMSkgKiAwLjAxLFxuICAgICAgICAgICAgICAgIHkgPSBNYXRoLnNxcnQoMC4yNyAqIDAuMjcgLSB4ICogeCk7XG5cbiAgICAgICAgICAgIGVhc2luZyA9IGJlemllcih4LCB5LCAwLjI1LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ByZXZFYXNlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGJyb3dzZXIubm93KCksXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIGVhc2luZ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBlYXNpbmc7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxab29tSGFuZGxlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuXG5pbXBvcnQgeyBiaW5kQWxsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcblxuLyoqXG4gKiBUaGUgYEJveFpvb21IYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSB0aGUgbWFwIHRvIGZpdCB3aXRoaW4gYSBib3VuZGluZyBib3guXG4gKiBUaGUgYm91bmRpbmcgYm94IGlzIGRlZmluZWQgYnkgY2xpY2tpbmcgYW5kIGhvbGRpbmcgYHNoaWZ0YCB3aGlsZSBkcmFnZ2luZyB0aGUgY3Vyc29yLlxuICovXG5jbGFzcyBCb3hab29tSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfc3RhcnRQb3M6IFBvaW50O1xuICAgIF9sYXN0UG9zOiBQb2ludDtcbiAgICBfYm94OiBIVE1MRWxlbWVudDtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHtcbiAgICAgICAgY2xpY2tUb2xlcmFuY2U/OiBudW1iZXJcbiAgICB9KSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG1hcC5nZXRDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBvcHRpb25zLmNsaWNrVG9sZXJhbmNlIHx8IDE7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uTW91c2VNb3ZlJyxcbiAgICAgICAgICAgICdfb25Nb3VzZVVwJyxcbiAgICAgICAgICAgICdfb25LZXlEb3duJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSwgaS5lLiBjdXJyZW50bHkgYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLmJveFpvb20uZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5ib3hab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uTW91c2VEb3duKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIGlmICghKGUuc2hpZnRLZXkgJiYgZS5idXR0b24gPT09IDApKSByZXR1cm47XG5cbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgRE9NLmRpc2FibGVEcmFnKCk7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gdGhpcy5fbGFzdFBvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgX29uTW91c2VNb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcblxuICAgICAgICBpZiAodGhpcy5fbGFzdFBvcy5lcXVhbHMocG9zKSB8fCAoIXRoaXMuX2JveCAmJiBwb3MuZGlzdCh0aGlzLl9zdGFydFBvcykgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHAwID0gdGhpcy5fc3RhcnRQb3M7XG4gICAgICAgIHRoaXMuX2xhc3RQb3MgPSBwb3M7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9ib3gpIHtcbiAgICAgICAgICAgIHRoaXMuX2JveCA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1ib3h6b29tJywgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jcm9zc2hhaXInKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnYm94em9vbXN0YXJ0JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5YID0gTWF0aC5taW4ocDAueCwgcG9zLngpLFxuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KHAwLngsIHBvcy54KSxcbiAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihwMC55LCBwb3MueSksXG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgocDAueSwgcG9zLnkpO1xuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fYm94LCBgdHJhbnNsYXRlKCR7bWluWH1weCwke21pbll9cHgpYCk7XG5cbiAgICAgICAgdGhpcy5fYm94LnN0eWxlLndpZHRoID0gYCR7bWF4WCAtIG1pblh9cHhgO1xuICAgICAgICB0aGlzLl9ib3guc3R5bGUuaGVpZ2h0ID0gYCR7bWF4WSAtIG1pbll9cHhgO1xuICAgIH1cblxuICAgIF9vbk1vdXNlVXAoZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBwMCA9IHRoaXMuX3N0YXJ0UG9zLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuXG4gICAgICAgIERPTS5zdXBwcmVzc0NsaWNrKCk7XG5cbiAgICAgICAgaWYgKHAwLnggPT09IHAxLnggJiYgcDAueSA9PT0gcDEueSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tY2FuY2VsJywgZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXBcbiAgICAgICAgICAgICAgICAuZml0U2NyZWVuQ29vcmRpbmF0ZXMocDAsIHAxLCB0aGlzLl9tYXAuZ2V0QmVhcmluZygpLCB7bGluZWFyOiB0cnVlfSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ2JveHpvb21lbmQnLCB7IG9yaWdpbmFsRXZlbnQ6IGV9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tY2FuY2VsJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZmluaXNoKCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24sIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3Jvc3NoYWlyJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2JveCkge1xuICAgICAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9ib3gpO1xuICAgICAgICAgICAgdGhpcy5fYm94ID0gKG51bGw6IGFueSk7XG4gICAgICAgIH1cblxuICAgICAgICBET00uZW5hYmxlRHJhZygpO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdGFydFBvcztcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RQb3M7XG4gICAgfVxuXG4gICAgX2ZpcmVFdmVudCh0eXBlOiBzdHJpbmcsIGU6ICopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCh0eXBlLCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQm94Wm9vbUhhbmRsZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tJztcblxuaW1wb3J0IHsgYmV6aWVyLCBiaW5kQWxsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uLy4uL3V0aWwvdGFza19xdWV1ZSc7XG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjI1LFxuICAgIGluZXJ0aWFFYXNpbmcgPSBiZXppZXIoMCwgMCwgaW5lcnRpYUxpbmVhcml0eSwgMSksXG4gICAgaW5lcnRpYU1heFNwZWVkID0gMTgwLCAvLyBkZWcvc1xuICAgIGluZXJ0aWFEZWNlbGVyYXRpb24gPSA3MjA7IC8vIGRlZy9zXjJcblxuLyoqXG4gKiBUaGUgYERyYWdSb3RhdGVIYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gcm90YXRlIHRoZSBtYXAgYnkgY2xpY2tpbmcgYW5kXG4gKiBkcmFnZ2luZyB0aGUgY3Vyc29yIHdoaWxlIGhvbGRpbmcgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBvciBgY3RybGAga2V5LlxuICovXG5jbGFzcyBEcmFnUm90YXRlSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX3N0YXRlOiAnZGlzYWJsZWQnIHwgJ2VuYWJsZWQnIHwgJ3BlbmRpbmcnIHwgJ2FjdGl2ZSc7XG4gICAgX2J1dHRvbjogJ3JpZ2h0JyB8ICdsZWZ0JztcbiAgICBfZXZlbnRCdXR0b246IG51bWJlcjtcbiAgICBfYmVhcmluZ1NuYXA6IG51bWJlcjtcbiAgICBfcGl0Y2hXaXRoUm90YXRlOiBib29sZWFuO1xuXG4gICAgX3N0YXJ0UG9zOiBQb2ludDtcbiAgICBfcHJldlBvczogUG9pbnQ7XG4gICAgX2xhc3RQb3M6IFBvaW50O1xuICAgIF9zdGFydFRpbWU6IG51bWJlcjtcbiAgICBfbGFzdE1vdmVFdmVudDogTW91c2VFdmVudDtcbiAgICBfaW5lcnRpYTogQXJyYXk8W251bWJlciwgbnVtYmVyXT47XG4gICAgX2NlbnRlcjogUG9pbnQ7XG4gICAgX2ZyYW1lSWQ6ID9UYXNrSUQ7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgaGFuZGxlciB0by5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmdTbmFwXSBUaGUgdGhyZXNob2xkLCBtZWFzdXJlZCBpbiBkZWdyZWVzLCB0aGF0IGRldGVybWluZXMgd2hlbiB0aGUgbWFwJ3NcbiAgICAgKiAgIGJlYXJpbmcgd2lsbCBzbmFwIHRvIG5vcnRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbH0gW29wdGlvbnMucGl0Y2hXaXRoUm90YXRlPXRydWVdIENvbnRyb2wgdGhlIG1hcCBwaXRjaCBpbiBhZGRpdGlvbiB0byB0aGUgYmVhcmluZ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHtcbiAgICAgICAgYnV0dG9uPzogJ3JpZ2h0JyB8ICdsZWZ0JyxcbiAgICAgICAgZWxlbWVudD86IEhUTUxFbGVtZW50LFxuICAgICAgICBiZWFyaW5nU25hcD86IG51bWJlcixcbiAgICAgICAgcGl0Y2hXaXRoUm90YXRlPzogYm9vbGVhblxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG9wdGlvbnMuZWxlbWVudCB8fCBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gb3B0aW9ucy5idXR0b24gfHwgJ3JpZ2h0JztcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwIHx8IDA7XG4gICAgICAgIHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSA9IG9wdGlvbnMucGl0Y2hXaXRoUm90YXRlICE9PSBmYWxzZTtcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdvbk1vdXNlRG93bicsXG4gICAgICAgICAgICAnX29uTW91c2VNb3ZlJyxcbiAgICAgICAgICAgICdfb25Nb3VzZVVwJyxcbiAgICAgICAgICAgICdfb25CbHVyJyxcbiAgICAgICAgICAgICdfb25EcmFnRnJhbWUnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSAhPT0gJ2Rpc2FibGVkJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUsIGkuZS4gY3VycmVudGx5IGJlaW5nIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdhY3RpdmUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdSb3RhdGUuZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZHJhZ1JvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZlJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdyb3RhdGVlbmQnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9waXRjaFdpdGhSb3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3BpdGNoZW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVlbmQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdkaXNhYmxlZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTW91c2VEb3duKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnZW5hYmxlZCcpIHJldHVybjtcblxuICAgICAgICBjb25zdCB0b3VjaEV2ZW50ID0gZS50eXBlID09PSAndG91Y2hzdGFydCc7XG5cbiAgICAgICAgaWYgKHRvdWNoRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYnV0dG9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRCdXR0b24gPSBET00ubW91c2VCdXR0b24oZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2V2ZW50QnV0dG9uICE9PSAoZS5jdHJsS2V5ID8gMCA6IDIpKSByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlLmN0cmxLZXkgfHwgRE9NLm1vdXNlQnV0dG9uKGUpICE9PSAwKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRCdXR0b24gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgRE9NLmRpc2FibGVEcmFnKCk7XG5cbiAgICAgICAgLy8gQmluZCB3aW5kb3ctbGV2ZWwgZXZlbnQgbGlzdGVuZXJzIGZvciBtb3ZlIGFuZCB1cC9lbmQgZXZlbnRzLiBJbiB0aGUgYWJzZW5jZSBvZlxuICAgICAgICAvLyB0aGUgcG9pbnRlciBjYXB0dXJlIEFQSSwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgbmVjZXNzYXJ5IHBsYXRmb3JtcyxcbiAgICAgICAgLy8gd2luZG93LWxldmVsIGV2ZW50IGxpc3RlbmVycyBnaXZlIHVzIHRoZSBiZXN0IHNob3QgYXQgY2FwdHVyaW5nIGV2ZW50cyB0aGF0XG4gICAgICAgIC8vIGZhbGwgb3V0c2lkZSB0aGUgbWFwIGNhbnZhcyBlbGVtZW50LiBVc2UgYHtjYXB0dXJlOiB0cnVlfWAgZm9yIHRoZSBtb3ZlIGV2ZW50XG4gICAgICAgIC8vIHRvIHByZXZlbnQgbWFwIG1vdmUgZXZlbnRzIGZyb20gYmVpbmcgZmlyZWQgZHVyaW5nIGEgZHJhZy5cbiAgICAgICAgaWYgKHRvdWNoRXZlbnQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fb25Nb3VzZVVwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVhY3RpdmF0ZSB3aGVuIHRoZSB3aW5kb3cgbG9zZXMgZm9jdXMuIE90aGVyd2lzZSBpZiBhIG1vdXNldXAgb2NjdXJzIHdoZW4gdGhlIHdpbmRvd1xuICAgICAgICAvLyBpc24ndCBpbiBmb2N1cywgZHJhZ2dpbmcgd2lsbCBjb250aW51ZSBldmVuIHRob3VnaCB0aGUgbW91c2UgaXMgbm8gbG9uZ2VyIHByZXNzZWQuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fb25CbHVyKTtcblxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdwZW5kaW5nJztcbiAgICAgICAgdGhpcy5faW5lcnRpYSA9IFtbYnJvd3Nlci5ub3coKSwgdGhpcy5fbWFwLmdldEJlYXJpbmcoKV1dO1xuICAgICAgICB0aGlzLl9zdGFydFBvcyA9IHRoaXMuX3ByZXZQb3MgPSB0aGlzLl9sYXN0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fY2VudGVyID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5jZW50ZXJQb2ludDsgIC8vIENlbnRlciBvZiByb3RhdGlvblxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBfb25Nb3VzZU1vdmUoZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICBpZiAodGhpcy5fbGFzdFBvcy5lcXVhbHMocG9zKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFzdE1vdmVFdmVudCA9IGU7XG4gICAgICAgIHRoaXMuX2xhc3RQb3MgPSBwb3M7XG5cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2FjdGl2ZSc7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZSk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVzdGFydCcsIGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgncGl0Y2hzdGFydCcsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdGhpcy5fbWFwLl9yZXF1ZXN0UmVuZGVyRnJhbWUodGhpcy5fb25EcmFnRnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uRHJhZ0ZyYW1lKCkge1xuICAgICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcblxuICAgICAgICBjb25zdCBlID0gdGhpcy5fbGFzdE1vdmVFdmVudDtcbiAgICAgICAgaWYgKCFlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBjb25zdCBwMSA9IHRoaXMuX3ByZXZQb3MsXG4gICAgICAgICAgICBwMiA9IHRoaXMuX2xhc3RQb3MsXG4gICAgICAgICAgICBiZWFyaW5nRGlmZiA9IChwMS54IC0gcDIueCkgKiAwLjgsXG4gICAgICAgICAgICBwaXRjaERpZmYgPSAocDEueSAtIHAyLnkpICogLTAuNSxcbiAgICAgICAgICAgIGJlYXJpbmcgPSB0ci5iZWFyaW5nIC0gYmVhcmluZ0RpZmYsXG4gICAgICAgICAgICBwaXRjaCA9IHRyLnBpdGNoIC0gcGl0Y2hEaWZmLFxuICAgICAgICAgICAgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuICAgICAgICBpbmVydGlhLnB1c2goW2Jyb3dzZXIubm93KCksIHRoaXMuX21hcC5fbm9ybWFsaXplQmVhcmluZyhiZWFyaW5nLCBsYXN0WzFdKV0pO1xuXG4gICAgICAgIHRyLmJlYXJpbmcgPSBiZWFyaW5nO1xuICAgICAgICBpZiAodGhpcy5fcGl0Y2hXaXRoUm90YXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3BpdGNoJywgZSk7XG4gICAgICAgICAgICB0ci5waXRjaCA9IHBpdGNoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdyb3RhdGUnLCBlKTtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlJywgZSk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RNb3ZlRXZlbnQ7XG4gICAgICAgIHRoaXMuX3ByZXZQb3MgPSB0aGlzLl9sYXN0UG9zO1xuICAgIH1cblxuICAgIF9vbk1vdXNlVXAoZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCB0b3VjaEV2ZW50ID0gZS50eXBlID09PSAndG91Y2hlbmQnO1xuXG4gICAgICAgIGlmICh0b3VjaEV2ZW50ICYmICh0aGlzLl9zdGFydFBvcyA9PT0gdGhpcy5fbGFzdFBvcykgJiYgKERhdGUubm93KCkgLSB0aGlzLl9zdGFydFRpbWUpIDwgMzAwKSB7XG4gICAgICAgICAgICB0aGlzLl9lbC5jbGljaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERPTS5tb3VzZUJ1dHRvbihlKSAhPT0gdGhpcy5fZXZlbnRCdXR0b24pIHJldHVybjtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICBjYXNlICdhY3RpdmUnOlxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnZW5hYmxlZCc7XG4gICAgICAgICAgICBET00uc3VwcHJlc3NDbGljaygpO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICB0aGlzLl9kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICB0aGlzLl9pbmVydGlhbFJvdGF0ZShlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkJsdXIoZTogRm9jdXNFdmVudCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XG4gICAgICAgIGNhc2UgJ2FjdGl2ZSc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdyb3RhdGVlbmQnLCBlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9waXRjaFdpdGhSb3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3BpdGNoZW5kJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVlbmQnLCBlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91bmJpbmQoKSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vbk1vdXNlVXApO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX29uQmx1cik7XG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG4gICAgfVxuXG4gICAgX2RlYWN0aXZhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuX2NhbmNlbFJlbmRlckZyYW1lKHRoaXMuX2ZyYW1lSWQpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RNb3ZlRXZlbnQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdGFydFBvcztcbiAgICAgICAgZGVsZXRlIHRoaXMuX3ByZXZQb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0UG9zO1xuICAgIH1cblxuICAgIF9pbmVydGlhbFJvdGF0ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudCgncm90YXRlZW5kJywgZSk7XG4gICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuXG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgIG1hcEJlYXJpbmcgPSBtYXAuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWE7XG5cbiAgICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1hcEJlYXJpbmcpIDwgdGhpcy5fYmVhcmluZ1NuYXApIHtcbiAgICAgICAgICAgICAgICBtYXAucmVzZXROb3J0aCh7bm9Nb3ZlU3RhcnQ6IHRydWV9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZWVuZCcsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSkgdGhpcy5fZmlyZUV2ZW50KCdwaXRjaGVuZCcsIGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpbmVydGlhLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3QgPSBpbmVydGlhWzBdLFxuICAgICAgICAgICAgbGFzdCA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgIHByZXZpb3VzID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDJdO1xuICAgICAgICBsZXQgYmVhcmluZyA9IG1hcC5fbm9ybWFsaXplQmVhcmluZyhtYXBCZWFyaW5nLCBwcmV2aW91c1sxXSk7XG4gICAgICAgIGNvbnN0IGZsaW5nRGlmZiA9IGxhc3RbMV0gLSBmaXJzdFsxXSxcbiAgICAgICAgICAgIHNpZ24gPSBmbGluZ0RpZmYgPCAwID8gLTEgOiAxLFxuICAgICAgICAgICAgZmxpbmdEdXJhdGlvbiA9IChsYXN0WzBdIC0gZmlyc3RbMF0pIC8gMTAwMDtcblxuICAgICAgICBpZiAoZmxpbmdEaWZmID09PSAwIHx8IGZsaW5nRHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNwZWVkID0gTWF0aC5hYnMoZmxpbmdEaWZmICogKGluZXJ0aWFMaW5lYXJpdHkgLyBmbGluZ0R1cmF0aW9uKSk7ICAvLyBkZWcvc1xuICAgICAgICBpZiAoc3BlZWQgPiBpbmVydGlhTWF4U3BlZWQpIHtcbiAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBzcGVlZCAvIChpbmVydGlhRGVjZWxlcmF0aW9uICogaW5lcnRpYUxpbmVhcml0eSksXG4gICAgICAgICAgICBvZmZzZXQgPSBzaWduICogc3BlZWQgKiAoZHVyYXRpb24gLyAyKTtcblxuICAgICAgICBiZWFyaW5nICs9IG9mZnNldDtcblxuICAgICAgICBpZiAoTWF0aC5hYnMobWFwLl9ub3JtYWxpemVCZWFyaW5nKGJlYXJpbmcsIDApKSA8IHRoaXMuX2JlYXJpbmdTbmFwKSB7XG4gICAgICAgICAgICBiZWFyaW5nID0gbWFwLl9ub3JtYWxpemVCZWFyaW5nKDAsIGJlYXJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLnJvdGF0ZVRvKGJlYXJpbmcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDAsXG4gICAgICAgICAgICBlYXNpbmc6IGluZXJ0aWFFYXNpbmcsXG4gICAgICAgICAgICBub01vdmVTdGFydDogdHJ1ZVxuICAgICAgICB9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgfVxuXG4gICAgX2ZpcmVFdmVudCh0eXBlOiBzdHJpbmcsIGU6ICopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCh0eXBlLCBlID8geyBvcmlnaW5hbEV2ZW50OiBlIH0gOiB7fSkpO1xuICAgIH1cblxuICAgIF9kcmFpbkluZXJ0aWFCdWZmZXIoKSB7XG4gICAgICAgIGNvbnN0IGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhLFxuICAgICAgICAgICAgbm93ID0gYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIGN1dG9mZiA9IDE2MDsgICAvL21zZWNcblxuICAgICAgICB3aGlsZSAoaW5lcnRpYS5sZW5ndGggPiAwICYmIG5vdyAtIGluZXJ0aWFbMF1bMF0gPiBjdXRvZmYpXG4gICAgICAgICAgICBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEcmFnUm90YXRlSGFuZGxlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuaW1wb3J0IHsgYmV6aWVyLCBiaW5kQWxsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uLy4uL3V0aWwvdGFza19xdWV1ZSc7XG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjMsXG4gICAgaW5lcnRpYUVhc2luZyA9IGJlemllcigwLCAwLCBpbmVydGlhTGluZWFyaXR5LCAxKSxcbiAgICBpbmVydGlhTWF4U3BlZWQgPSAxNDAwLCAvLyBweC9zXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDI1MDA7IC8vIHB4L3NeMlxuXG4vKipcbiAqIFRoZSBgRHJhZ1BhbkhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byBwYW4gdGhlIG1hcCBieSBjbGlja2luZyBhbmQgZHJhZ2dpbmdcbiAqIHRoZSBjdXJzb3IuXG4gKi9cbmNsYXNzIERyYWdQYW5IYW5kbGVyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfc3RhdGU6ICdkaXNhYmxlZCcgfCAnZW5hYmxlZCcgfCAncGVuZGluZycgfCAnYWN0aXZlJztcbiAgICBfc3RhcnRQb3M6IFBvaW50O1xuICAgIF9tb3VzZURvd25Qb3M6IFBvaW50O1xuICAgIF9wcmV2UG9zOiBQb2ludDtcbiAgICBfbGFzdFBvczogUG9pbnQ7XG4gICAgX2xhc3RNb3ZlRXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgdm9pZDtcbiAgICBfaW5lcnRpYTogQXJyYXk8W251bWJlciwgUG9pbnRdPjtcbiAgICBfZnJhbWVJZDogP1Rhc2tJRDtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHtcbiAgICAgICAgY2xpY2tUb2xlcmFuY2U/OiBudW1iZXJcbiAgICB9KSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBvcHRpb25zLmNsaWNrVG9sZXJhbmNlIHx8IDE7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uTW91c2VVcCcsXG4gICAgICAgICAgICAnX29uVG91Y2hFbmQnLFxuICAgICAgICAgICAgJ19vbkJsdXInLFxuICAgICAgICAgICAgJ19vbkRyYWdGcmFtZSdcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlICE9PSAnZGlzYWJsZWQnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSwgaS5lLiBjdXJyZW50bHkgYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSA9PT0gJ2FjdGl2ZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZHJhZ1Bhbi5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXRvdWNoLWRyYWctcGFuJyk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUGFuLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtdG91Y2gtZHJhZy1wYW4nKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICBjYXNlICdhY3RpdmUnOlxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnZGlzYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICB0aGlzLl9kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RyYWdlbmQnKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZWVuZCcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BlbmRpbmcnOlxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnZGlzYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Nb3VzZURvd24oZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09ICdlbmFibGVkJykgcmV0dXJuO1xuICAgICAgICBpZiAoZS5jdHJsS2V5IHx8IERPTS5tb3VzZUJ1dHRvbihlKSAhPT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEJpbmQgd2luZG93LWxldmVsIGV2ZW50IGxpc3RlbmVycyBmb3IgbW91c2Vtb3ZlL3VwIGV2ZW50cy4gSW4gdGhlIGFic2VuY2Ugb2ZcbiAgICAgICAgLy8gdGhlIHBvaW50ZXIgY2FwdHVyZSBBUEksIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIG5lY2Vzc2FyeSBwbGF0Zm9ybXMsXG4gICAgICAgIC8vIHdpbmRvdy1sZXZlbCBldmVudCBsaXN0ZW5lcnMgZ2l2ZSB1cyB0aGUgYmVzdCBzaG90IGF0IGNhcHR1cmluZyBldmVudHMgdGhhdFxuICAgICAgICAvLyBmYWxsIG91dHNpZGUgdGhlIG1hcCBjYW52YXMgZWxlbWVudC4gVXNlIGB7Y2FwdHVyZTogdHJ1ZX1gIGZvciB0aGUgbW92ZSBldmVudFxuICAgICAgICAvLyB0byBwcmV2ZW50IG1hcCBtb3ZlIGV2ZW50cyBmcm9tIGJlaW5nIGZpcmVkIGR1cmluZyBhIGRyYWcuXG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LmRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG5cbiAgICAgICAgdGhpcy5fc3RhcnQoZSk7XG4gICAgfVxuXG4gICAgb25Ub3VjaFN0YXJ0KGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnZW5hYmxlZCcpIHJldHVybjtcbiAgICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm47XG5cbiAgICAgICAgLy8gQmluZCB3aW5kb3ctbGV2ZWwgZXZlbnQgbGlzdGVuZXJzIGZvciB0b3VjaG1vdmUvZW5kIGV2ZW50cy4gSW4gdGhlIGFic2VuY2Ugb2ZcbiAgICAgICAgLy8gdGhlIHBvaW50ZXIgY2FwdHVyZSBBUEksIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIG5lY2Vzc2FyeSBwbGF0Zm9ybXMsXG4gICAgICAgIC8vIHdpbmRvdy1sZXZlbCBldmVudCBsaXN0ZW5lcnMgZ2l2ZSB1cyB0aGUgYmVzdCBzaG90IGF0IGNhcHR1cmluZyBldmVudHMgdGhhdFxuICAgICAgICAvLyBmYWxsIG91dHNpZGUgdGhlIG1hcCBjYW52YXMgZWxlbWVudC4gVXNlIGB7Y2FwdHVyZTogdHJ1ZX1gIGZvciB0aGUgbW92ZSBldmVudFxuICAgICAgICAvLyB0byBwcmV2ZW50IG1hcCBtb3ZlIGV2ZW50cyBmcm9tIGJlaW5nIGZpcmVkIGR1cmluZyBhIGRyYWcuXG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSwge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfSk7XG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fb25Ub3VjaEVuZCk7XG5cbiAgICAgICAgdGhpcy5fc3RhcnQoZSk7XG4gICAgfVxuXG4gICAgX3N0YXJ0KGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XG4gICAgICAgIC8vIERlYWN0aXZhdGUgd2hlbiB0aGUgd2luZG93IGxvc2VzIGZvY3VzLiBPdGhlcndpc2UgaWYgYSBtb3VzZXVwIG9jY3VycyB3aGVuIHRoZSB3aW5kb3dcbiAgICAgICAgLy8gaXNuJ3QgaW4gZm9jdXMsIGRyYWdnaW5nIHdpbGwgY29udGludWUgZXZlbiB0aG91Z2ggdGhlIG1vdXNlIGlzIG5vIGxvbmdlciBwcmVzc2VkLlxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX29uQmx1cik7XG5cbiAgICAgICAgdGhpcy5fc3RhdGUgPSAncGVuZGluZyc7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gdGhpcy5fbW91c2VEb3duUG9zID0gdGhpcy5fcHJldlBvcyA9IHRoaXMuX2xhc3RQb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICB0aGlzLl9pbmVydGlhID0gW1ticm93c2VyLm5vdygpLCB0aGlzLl9zdGFydFBvc11dO1xuICAgIH1cblxuICAgIF9vbk1vdmUoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHBvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG4gICAgICAgIGlmICh0aGlzLl9sYXN0UG9zLmVxdWFscyhwb3MpIHx8ICh0aGlzLl9zdGF0ZSA9PT0gJ3BlbmRpbmcnICYmIHBvcy5kaXN0KHRoaXMuX21vdXNlRG93blBvcykgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xhc3RNb3ZlRXZlbnQgPSBlO1xuICAgICAgICB0aGlzLl9sYXN0UG9zID0gcG9zO1xuICAgICAgICB0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5faW5lcnRpYS5wdXNoKFticm93c2VyLm5vdygpLCB0aGlzLl9sYXN0UG9zXSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgIC8vIHdlIHRyZWF0IHRoZSBmaXJzdCBtb3ZlIGV2ZW50IChyYXRoZXIgdGhhbiB0aGUgbW91c2Vkb3duIGV2ZW50KVxuICAgICAgICAgICAgLy8gYXMgdGhlIHN0YXJ0IG9mIHRoZSBkcmFnXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdhY3RpdmUnO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdkcmFnc3RhcnQnLCBlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZXN0YXJ0JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2ZyYW1lSWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSB0aGlzLl9tYXAuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9vbkRyYWdGcmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgaW4gZWFjaCByZW5kZXIgZnJhbWUgd2hpbGUgZHJhZ2dpbmcgaXMgaGFwcGVuaW5nLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uRHJhZ0ZyYW1lKCkge1xuICAgICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcblxuICAgICAgICBjb25zdCBlID0gdGhpcy5fbGFzdE1vdmVFdmVudDtcbiAgICAgICAgaWYgKCFlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcbiAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnBvaW50TG9jYXRpb24odGhpcy5fcHJldlBvcyksIHRoaXMuX2xhc3RQb3MpO1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RyYWcnLCBlKTtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlJywgZSk7XG5cbiAgICAgICAgdGhpcy5fcHJldlBvcyA9IHRoaXMuX2xhc3RQb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0TW92ZUV2ZW50O1xuICAgIH1cblxuICAgIF9vbk1vdXNlVXAoZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoRE9NLm1vdXNlQnV0dG9uKGUpICE9PSAwKSByZXR1cm47XG4gICAgICAgIHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZlJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgRE9NLnN1cHByZXNzQ2xpY2soKTtcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5faW5lcnRpYWxQYW4oZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25Ub3VjaEVuZChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZlJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICB0aGlzLl9kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICB0aGlzLl9pbmVydGlhbFBhbihlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkJsdXIoZTogRm9jdXNFdmVudCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XG4gICAgICAgIGNhc2UgJ2FjdGl2ZSc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdkcmFnZW5kJywgZSk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVlbmQnLCBlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91bmJpbmQoKSB7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSwge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfSk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fb25Ub3VjaEVuZCk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LmRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdywgJ2JsdXInLCB0aGlzLl9vbkJsdXIpO1xuICAgIH1cblxuICAgIF9kZWFjdGl2YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9mcmFtZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0TW92ZUV2ZW50O1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RhcnRQb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wcmV2UG9zO1xuICAgICAgICBkZWxldGUgdGhpcy5fbW91c2VEb3duUG9zO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGFzdFBvcztcbiAgICB9XG5cbiAgICBfaW5lcnRpYWxQYW4oZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdkcmFnZW5kJywgZSk7XG5cbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIGNvbnN0IGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhO1xuICAgICAgICBpZiAoaW5lcnRpYS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVlbmQnLCBlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3QgPSBpbmVydGlhW2luZXJ0aWEubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICBmaXJzdCA9IGluZXJ0aWFbMF0sXG4gICAgICAgICAgICBmbGluZ09mZnNldCA9IGxhc3RbMV0uc3ViKGZpcnN0WzFdKSxcbiAgICAgICAgICAgIGZsaW5nRHVyYXRpb24gPSAobGFzdFswXSAtIGZpcnN0WzBdKSAvIDEwMDA7XG5cbiAgICAgICAgaWYgKGZsaW5nRHVyYXRpb24gPT09IDAgfHwgbGFzdFsxXS5lcXVhbHMoZmlyc3RbMV0pKSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVlbmQnLCBlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBweC9zIHZlbG9jaXR5ICYgYWRqdXN0IGZvciBpbmNyZWFzZWQgaW5pdGlhbCBhbmltYXRpb24gc3BlZWQgd2hlbiBlYXNpbmcgb3V0XG4gICAgICAgIGNvbnN0IHZlbG9jaXR5ID0gZmxpbmdPZmZzZXQubXVsdChpbmVydGlhTGluZWFyaXR5IC8gZmxpbmdEdXJhdGlvbik7XG4gICAgICAgIGxldCBzcGVlZCA9IHZlbG9jaXR5Lm1hZygpOyAvLyBweC9zXG5cbiAgICAgICAgaWYgKHNwZWVkID4gaW5lcnRpYU1heFNwZWVkKSB7XG4gICAgICAgICAgICBzcGVlZCA9IGluZXJ0aWFNYXhTcGVlZDtcbiAgICAgICAgICAgIHZlbG9jaXR5Ll91bml0KCkuX211bHQoc3BlZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBzcGVlZCAvIChpbmVydGlhRGVjZWxlcmF0aW9uICogaW5lcnRpYUxpbmVhcml0eSksXG4gICAgICAgICAgICBvZmZzZXQgPSB2ZWxvY2l0eS5tdWx0KC1kdXJhdGlvbiAvIDIpO1xuXG4gICAgICAgIHRoaXMuX21hcC5wYW5CeShvZmZzZXQsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDAsXG4gICAgICAgICAgICBlYXNpbmc6IGluZXJ0aWFFYXNpbmcsXG4gICAgICAgICAgICBub01vdmVTdGFydDogdHJ1ZVxuICAgICAgICB9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgfVxuXG4gICAgX2ZpcmVFdmVudCh0eXBlOiBzdHJpbmcsIGU6ICopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCh0eXBlLCBlID8geyBvcmlnaW5hbEV2ZW50OiBlIH0gOiB7fSkpO1xuICAgIH1cblxuICAgIF9kcmFpbkluZXJ0aWFCdWZmZXIoKSB7XG4gICAgICAgIGNvbnN0IGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhLFxuICAgICAgICAgICAgbm93ID0gYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIGN1dG9mZiA9IDE2MDsgICAvLyBtc2VjXG5cbiAgICAgICAgd2hpbGUgKGluZXJ0aWEubGVuZ3RoID4gMCAmJiBub3cgLSBpbmVydGlhWzBdWzBdID4gY3V0b2ZmKSBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEcmFnUGFuSGFuZGxlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGJpbmRBbGwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcblxuY29uc3QgcGFuU3RlcCA9IDEwMCxcbiAgICBiZWFyaW5nU3RlcCA9IDE1LFxuICAgIHBpdGNoU3RlcCA9IDEwO1xuXG4vKipcbiAqIFRoZSBgS2V5Ym9hcmRIYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSwgcm90YXRlLCBhbmQgcGFuIHRoZSBtYXAgdXNpbmdcbiAqIHRoZSBmb2xsb3dpbmcga2V5Ym9hcmQgc2hvcnRjdXRzOlxuICpcbiAqIC0gYD1gIC8gYCtgOiBJbmNyZWFzZSB0aGUgem9vbSBsZXZlbCBieSAxLlxuICogLSBgU2hpZnQtPWAgLyBgU2hpZnQtK2A6IEluY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDIuXG4gKiAtIGAtYDogRGVjcmVhc2UgdGhlIHpvb20gbGV2ZWwgYnkgMS5cbiAqIC0gYFNoaWZ0LS1gOiBEZWNyZWFzZSB0aGUgem9vbSBsZXZlbCBieSAyLlxuICogLSBBcnJvdyBrZXlzOiBQYW4gYnkgMTAwIHBpeGVscy5cbiAqIC0gYFNoaWZ0K8OiwofComA6IEluY3JlYXNlIHRoZSByb3RhdGlvbiBieSAxNSBkZWdyZWVzLlxuICogLSBgU2hpZnQrw6LCh8KgYDogRGVjcmVhc2UgdGhlIHJvdGF0aW9uIGJ5IDE1IGRlZ3JlZXMuXG4gKiAtIGBTaGlmdCvDosKHwqFgOiBJbmNyZWFzZSB0aGUgcGl0Y2ggYnkgMTAgZGVncmVlcy5cbiAqIC0gYFNoaWZ0K8OiwofCo2A6IERlY3JlYXNlIHRoZSBwaXRjaCBieSAxMCBkZWdyZWVzLlxuICovXG5jbGFzcyBLZXlib2FyZEhhbmRsZXIge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfZWw6IEhUTUxFbGVtZW50O1xuICAgIF9lbmFibGVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbktleURvd24nXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBrZXlib2FyZCBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBrZXlib2FyZCBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGtleWJvYXJkIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAua2V5Ym9hcmQuZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIGtleWJvYXJkIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAua2V5Ym9hcmQuZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9vbktleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgcmV0dXJuO1xuXG4gICAgICAgIGxldCB6b29tRGlyID0gMDtcbiAgICAgICAgbGV0IGJlYXJpbmdEaXIgPSAwO1xuICAgICAgICBsZXQgcGl0Y2hEaXIgPSAwO1xuICAgICAgICBsZXQgeERpciA9IDA7XG4gICAgICAgIGxldCB5RGlyID0gMDtcblxuICAgICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDYxOlxuICAgICAgICBjYXNlIDEwNzpcbiAgICAgICAgY2FzZSAxNzE6XG4gICAgICAgIGNhc2UgMTg3OlxuICAgICAgICAgICAgem9vbURpciA9IDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE4OTpcbiAgICAgICAgY2FzZSAxMDk6XG4gICAgICAgIGNhc2UgMTczOlxuICAgICAgICAgICAgem9vbURpciA9IC0xO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgYmVhcmluZ0RpciA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeERpciA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgYmVhcmluZ0RpciA9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB4RGlyID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIHBpdGNoRGlyID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHlEaXIgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIHBpdGNoRGlyID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHlEaXIgPSAxO1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGNvbnN0IHpvb20gPSBtYXAuZ2V0Wm9vbSgpO1xuXG4gICAgICAgIGNvbnN0IGVhc2VPcHRpb25zID0ge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgIGRlbGF5RW5kRXZlbnRzOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IGVhc2VPdXQsXG5cbiAgICAgICAgICAgIHpvb206IHpvb21EaXIgPyBNYXRoLnJvdW5kKHpvb20pICsgem9vbURpciAqIChlLnNoaWZ0S2V5ID8gMiA6IDEpIDogem9vbSxcbiAgICAgICAgICAgIGJlYXJpbmc6IG1hcC5nZXRCZWFyaW5nKCkgKyBiZWFyaW5nRGlyICogYmVhcmluZ1N0ZXAsXG4gICAgICAgICAgICBwaXRjaDogbWFwLmdldFBpdGNoKCkgKyBwaXRjaERpciAqIHBpdGNoU3RlcCxcbiAgICAgICAgICAgIG9mZnNldDogWy14RGlyICogcGFuU3RlcCwgLXlEaXIgKiBwYW5TdGVwXSxcbiAgICAgICAgICAgIGNlbnRlcjogbWFwLmdldENlbnRlcigpXG4gICAgICAgIH07XG5cbiAgICAgICAgbWFwLmVhc2VUbyhlYXNlT3B0aW9ucywge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVhc2VPdXQodCkge1xuICAgIHJldHVybiB0ICogKDIgLSB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgS2V5Ym9hcmRIYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgYmluZEFsbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuaW1wb3J0IHR5cGUge01hcE1vdXNlRXZlbnQsIE1hcFRvdWNoRXZlbnR9IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuLy8gbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIHR3byB0YXAgUG9pbnRzIGZvciB0aGVtIHRvIHF1YWxpZnkgYXMgYSBkb3VibGUtdGFwXG5jb25zdCBtYXhEaXN0ID0gMzA7XG5cbi8qKlxuICogVGhlIGBEb3VibGVDbGlja1pvb21IYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSB0aGUgbWFwIGF0IGEgcG9pbnQgYnlcbiAqIGRvdWJsZSBjbGlja2luZyBvciBkb3VibGUgdGFwcGluZy5cbiAqL1xuY2xhc3MgRG91YmxlQ2xpY2tab29tSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbmFibGVkOiBib29sZWFuO1xuICAgIF9hY3RpdmU6IGJvb2xlYW47XG4gICAgX3RhcHBlZDogP1RpbWVvdXRJRDtcbiAgICBfdGFwcGVkUG9pbnQ6ID9Qb2ludDtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbkRibENsaWNrJyxcbiAgICAgICAgICAgICdfb25ab29tRW5kJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSwgaS5lLiBjdXJyZW50bHkgYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kb3VibGVDbGlja1pvb20uZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZG91YmxlQ2xpY2tab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uVG91Y2hTdGFydChlOiBNYXBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoZS5wb2ludHMubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGhpcy5fdGFwcGVkKSB7XG4gICAgICAgICAgICB0aGlzLl90YXBwZWRQb2ludCA9IGUucG9pbnRzWzBdO1xuICAgICAgICAgICAgdGhpcy5fdGFwcGVkID0gc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuX3RhcHBlZCA9IG51bGw7IHRoaXMuX3RhcHBlZFBvaW50ID0gbnVsbDsgfSwgMzAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RhcCA9IGUucG9pbnRzWzBdO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RUYXAgPSB0aGlzLl90YXBwZWRQb2ludDtcblxuICAgICAgICAgICAgaWYgKGZpcnN0VGFwICYmIGZpcnN0VGFwLmRpc3QobmV3VGFwKSA8PSBtYXhEaXN0KSB7XG4gICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnQgZHVwbGljYXRlIHpvb20gb24gZGJsY2xpY2tcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9uVG91Y2hFbmQgPSAoKSA9PiB7IC8vIGlnbm9yZSB0aGUgdG91Y2hlbmQgZXZlbnQsIGFzIGl0IGhhcyBubyBwb2ludCB3ZSBjYW4gem9vbSB0b1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFwcGVkKSB7IC8vIG1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgd2l0aGluIHRoZSB0aW1lb3V0IHdpbmRvd1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fem9vbShlKTsgLy8gcGFzcyB0aGUgb3JpZ2luYWwgdG91Y2hzdGFydCBldmVudCwgd2l0aCB0aGUgdGFwcGVkIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigndG91Y2hjYW5jZWwnLCBvblRvdWNoQ2FuY2VsKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRUYXBwZWQoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb25Ub3VjaENhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigndG91Y2hlbmQnLCBvblRvdWNoRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRUYXBwZWQoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9uY2UoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9uY2UoJ3RvdWNoY2FuY2VsJywgb25Ub3VjaENhbmNlbCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRvdWNoZXMgYXJlIHRvbyBmYXIgYXBhcnQsIGRvbid0IHpvb21cbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldFRhcHBlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3Jlc2V0VGFwcGVkKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGFwcGVkKTtcbiAgICAgICAgdGhpcy5fdGFwcGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdGFwcGVkUG9pbnQgPSBudWxsO1xuICAgIH1cblxuICAgIG9uRGJsQ2xpY2soZTogTWFwTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgZS5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3pvb20oZSk7XG4gICAgfVxuXG4gICAgX3pvb20oZTogTWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCd6b29tZW5kJywgdGhpcy5fb25ab29tRW5kKTtcbiAgICAgICAgdGhpcy5fbWFwLnpvb21UbyhcbiAgICAgICAgICAgIHRoaXMuX21hcC5nZXRab29tKCkgKyAoZS5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5ID8gLTEgOiAxKSxcbiAgICAgICAgICAgIHthcm91bmQ6IGUubG5nTGF0fSxcbiAgICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfb25ab29tRW5kKCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignem9vbWVuZCcsIHRoaXMuX29uWm9vbUVuZCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEb3VibGVDbGlja1pvb21IYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5pbXBvcnQgeyBiZXppZXIsIGJpbmRBbGwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgTG5nTGF0IGZyb20gJy4uLy4uL2dlby9sbmdfbGF0JztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uLy4uL3V0aWwvdGFza19xdWV1ZSc7XG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjE1LFxuICAgIGluZXJ0aWFFYXNpbmcgPSBiZXppZXIoMCwgMCwgaW5lcnRpYUxpbmVhcml0eSwgMSksXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDEyLCAvLyBzY2FsZSAvIHNeMlxuICAgIGluZXJ0aWFNYXhTcGVlZCA9IDIuNSwgLy8gc2NhbGUgLyBzXG4gICAgc2lnbmlmaWNhbnRTY2FsZVRocmVzaG9sZCA9IDAuMTUsXG4gICAgc2lnbmlmaWNhbnRSb3RhdGVUaHJlc2hvbGQgPSAxMDtcblxuLyoqXG4gKiBUaGUgYFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIGFuZCByb3RhdGUgdGhlIG1hcCBieVxuICogcGluY2hpbmcgb24gYSB0b3VjaHNjcmVlbi5cbiAqL1xuY2xhc3MgVG91Y2hab29tUm90YXRlSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2Fyb3VuZENlbnRlcjogYm9vbGVhbjtcbiAgICBfcm90YXRpb25EaXNhYmxlZDogYm9vbGVhbjtcbiAgICBfc3RhcnRWZWM6IFBvaW50O1xuICAgIF9zdGFydEFyb3VuZDogTG5nTGF0O1xuICAgIF9zdGFydFNjYWxlOiBudW1iZXI7XG4gICAgX3N0YXJ0QmVhcmluZzogbnVtYmVyO1xuICAgIF9nZXN0dXJlSW50ZW50OiAncm90YXRlJyB8ICd6b29tJyB8IHZvaWQ7XG4gICAgX2luZXJ0aWE6IEFycmF5PFtudW1iZXIsIG51bWJlciwgUG9pbnRdPjtcbiAgICBfbGFzdFRvdWNoRXZlbnQ6IFRvdWNoRXZlbnQ7XG4gICAgX2ZyYW1lSWQ6ID9UYXNrSUQ7XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uRW5kJyxcbiAgICAgICAgICAgICdfb25Ub3VjaEZyYW1lJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXJvdW5kXSBJZiBcImNlbnRlclwiIGlzIHBhc3NlZCwgbWFwIHdpbGwgem9vbSBhcm91bmQgdGhlIGNlbnRlclxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKCk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKHsgYXJvdW5kOiAnY2VudGVyJyB9KTtcbiAgICAgKi9cbiAgICBlbmFibGUob3B0aW9uczogP3thcm91bmQ/OiAnY2VudGVyJ30pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdG91Y2gtem9vbS1yb3RhdGUnKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2Fyb3VuZENlbnRlciA9ICEhb3B0aW9ucyAmJiBvcHRpb25zLmFyb3VuZCA9PT0gJ2NlbnRlcic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXRvdWNoLXpvb20tcm90YXRlJyk7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiwgbGVhdmluZyB0aGUgXCJwaW5jaCB0byB6b29tXCJcbiAgICAgKiBpbnRlcmFjdGlvbiBlbmFibGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZGlzYWJsZVJvdGF0aW9uKCk7XG4gICAgICovXG4gICAgZGlzYWJsZVJvdGF0aW9uKCkge1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcInBpbmNoIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKCk7XG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZVJvdGF0aW9uKCk7XG4gICAgICovXG4gICAgZW5hYmxlUm90YXRpb24oKSB7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvblN0YXJ0KGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoICE9PSAyKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcDAgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUudG91Y2hlc1swXSksXG4gICAgICAgICAgICBwMSA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZS50b3VjaGVzWzFdKSxcbiAgICAgICAgICAgIGNlbnRlciA9IHAwLmFkZChwMSkuZGl2KDIpO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VmVjID0gcDAuc3ViKHAxKTtcbiAgICAgICAgdGhpcy5fc3RhcnRBcm91bmQgPSB0aGlzLl9tYXAudHJhbnNmb3JtLnBvaW50TG9jYXRpb24oY2VudGVyKTtcbiAgICAgICAgdGhpcy5fZ2VzdHVyZUludGVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5faW5lcnRpYSA9IFtdO1xuXG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSwge3Bhc3NpdmU6IGZhbHNlfSk7XG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fb25FbmQpO1xuICAgIH1cblxuICAgIF9nZXRUb3VjaEV2ZW50RGF0YShlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHAwID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMF0pLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUudG91Y2hlc1sxXSk7XG5cbiAgICAgICAgY29uc3QgdmVjID0gcDAuc3ViKHAxKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZlYyxcbiAgICAgICAgICAgIGNlbnRlcjogcDAuYWRkKHAxKS5kaXYoMiksXG4gICAgICAgICAgICBzY2FsZTogdmVjLm1hZygpIC8gdGhpcy5fc3RhcnRWZWMubWFnKCksXG4gICAgICAgICAgICBiZWFyaW5nOiB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID8gMCA6IHZlYy5hbmdsZVdpdGgodGhpcy5fc3RhcnRWZWMpICogMTgwIC8gTWF0aC5QSVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9vbk1vdmUoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHt2ZWMsIHNjYWxlLCBiZWFyaW5nfSA9IHRoaXMuX2dldFRvdWNoRXZlbnREYXRhKGUpO1xuXG4gICAgICAgIC8vIERldGVybWluZSAnaW50ZW50JyBieSB3aGljaGV2ZXIgdGhyZXNob2xkIGlzIHN1cnBhc3NlZCBmaXJzdCxcbiAgICAgICAgLy8gdGhlbiBrZWVwIHRoYXQgc3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGdlc3R1cmUuXG4gICAgICAgIGlmICghdGhpcy5fZ2VzdHVyZUludGVudCkge1xuICAgICAgICAgICAgLy8gd2hlbiByb3RhdGlvbiBpcyBkaXNhYmxlZCwgYW55IHNjYWxlIGNoYW5nZSB0cmlnZ2VycyB0aGUgem9vbSBnZXN0dXJlIHRvIHN0YXJ0XG4gICAgICAgICAgICBjb25zdCBzY2FsaW5nU2lnbmlmaWNhbnRseSA9ICh0aGlzLl9yb3RhdGlvbkRpc2FibGVkICYmIHNjYWxlICE9PSAxKSB8fCAoTWF0aC5hYnMoMSAtIHNjYWxlKSA+IHNpZ25pZmljYW50U2NhbGVUaHJlc2hvbGQpLFxuICAgICAgICAgICAgICAgIHJvdGF0aW5nU2lnbmlmaWNhbnRseSA9IChNYXRoLmFicyhiZWFyaW5nKSA+IHNpZ25pZmljYW50Um90YXRlVGhyZXNob2xkKTtcblxuICAgICAgICAgICAgaWYgKHJvdGF0aW5nU2lnbmlmaWNhbnRseSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlc3R1cmVJbnRlbnQgPSAncm90YXRlJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbGluZ1NpZ25pZmljYW50bHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXN0dXJlSW50ZW50ID0gJ3pvb20nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fZ2VzdHVyZUludGVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudChgJHt0aGlzLl9nZXN0dXJlSW50ZW50fXN0YXJ0YCwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIHsgb3JpZ2luYWxFdmVudDogZSB9KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRWZWMgPSB2ZWM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sYXN0VG91Y2hFdmVudCA9IGU7XG4gICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IHRoaXMuX21hcC5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX29uVG91Y2hGcmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgX29uVG91Y2hGcmFtZSgpIHtcbiAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG5cbiAgICAgICAgY29uc3QgZ2VzdHVyZUludGVudCA9IHRoaXMuX2dlc3R1cmVJbnRlbnQ7XG4gICAgICAgIGlmICghZ2VzdHVyZUludGVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBpZiAoIXRoaXMuX3N0YXJ0U2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2NhbGUgPSB0ci5zY2FsZTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0QmVhcmluZyA9IHRyLmJlYXJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7Y2VudGVyLCBiZWFyaW5nLCBzY2FsZX0gPSB0aGlzLl9nZXRUb3VjaEV2ZW50RGF0YSh0aGlzLl9sYXN0VG91Y2hFdmVudCk7XG4gICAgICAgIGNvbnN0IGFyb3VuZCA9IHRyLnBvaW50TG9jYXRpb24oY2VudGVyKTtcbiAgICAgICAgY29uc3QgYXJvdW5kUG9pbnQgPSB0ci5sb2NhdGlvblBvaW50KGFyb3VuZCk7XG5cbiAgICAgICAgaWYgKGdlc3R1cmVJbnRlbnQgPT09ICdyb3RhdGUnKSB7XG4gICAgICAgICAgICB0ci5iZWFyaW5nID0gdGhpcy5fc3RhcnRCZWFyaW5nICsgYmVhcmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRyLnpvb20gPSB0ci5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSAqIHNjYWxlKTtcblxuICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQodGhpcy5fc3RhcnRBcm91bmQsIGFyb3VuZFBvaW50KTtcblxuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoZ2VzdHVyZUludGVudCwge29yaWdpbmFsRXZlbnQ6IHRoaXMuX2xhc3RUb3VjaEV2ZW50fSkpO1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCB7b3JpZ2luYWxFdmVudDogdGhpcy5fbGFzdFRvdWNoRXZlbnR9KSk7XG5cbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuX2luZXJ0aWEucHVzaChbYnJvd3Nlci5ub3coKSwgc2NhbGUsIGNlbnRlcl0pO1xuICAgIH1cblxuICAgIF9vbkVuZChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSwge3Bhc3NpdmU6IGZhbHNlfSk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fb25FbmQpO1xuXG4gICAgICAgIGNvbnN0IGdlc3R1cmVJbnRlbnQgPSB0aGlzLl9nZXN0dXJlSW50ZW50O1xuICAgICAgICBjb25zdCBzdGFydFNjYWxlID0gdGhpcy5fc3RhcnRTY2FsZTtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9mcmFtZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9nZXN0dXJlSW50ZW50O1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RhcnRTY2FsZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0QmVhcmluZztcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RUb3VjaEV2ZW50O1xuXG4gICAgICAgIGlmICghZ2VzdHVyZUludGVudCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudChgJHtnZXN0dXJlSW50ZW50fWVuZGAsIHsgb3JpZ2luYWxFdmVudDogZSB9KSk7XG5cbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgaWYgKGluZXJ0aWEubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgbWFwLnNuYXBUb05vcnRoKHt9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgZmlyc3QgPSBpbmVydGlhWzBdLFxuICAgICAgICAgICAgbGFzdFNjYWxlID0gbWFwLnRyYW5zZm9ybS5zY2FsZVpvb20oc3RhcnRTY2FsZSAqIGxhc3RbMV0pLFxuICAgICAgICAgICAgZmlyc3RTY2FsZSA9IG1hcC50cmFuc2Zvcm0uc2NhbGVab29tKHN0YXJ0U2NhbGUgKiBmaXJzdFsxXSksXG4gICAgICAgICAgICBzY2FsZU9mZnNldCA9IGxhc3RTY2FsZSAtIGZpcnN0U2NhbGUsXG4gICAgICAgICAgICBzY2FsZUR1cmF0aW9uID0gKGxhc3RbMF0gLSBmaXJzdFswXSkgLyAxMDAwLFxuICAgICAgICAgICAgcCA9IGxhc3RbMl07XG5cbiAgICAgICAgaWYgKHNjYWxlRHVyYXRpb24gPT09IDAgfHwgbGFzdFNjYWxlID09PSBmaXJzdFNjYWxlKSB7XG4gICAgICAgICAgICBtYXAuc25hcFRvTm9ydGgoe30sIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBzY2FsZS9zIHNwZWVkIGFuZCBhZGp1c3QgZm9yIGluY3JlYXNlZCBpbml0aWFsIGFuaW1hdGlvbiBzcGVlZCB3aGVuIGVhc2luZ1xuICAgICAgICBsZXQgc3BlZWQgPSBzY2FsZU9mZnNldCAqIGluZXJ0aWFMaW5lYXJpdHkgLyBzY2FsZUR1cmF0aW9uOyAvLyBzY2FsZS9zXG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHNwZWVkKSA+IGluZXJ0aWFNYXhTcGVlZCkge1xuICAgICAgICAgICAgaWYgKHNwZWVkID4gMCkge1xuICAgICAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzcGVlZCA9IC1pbmVydGlhTWF4U3BlZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IE1hdGguYWJzKHNwZWVkIC8gKGluZXJ0aWFEZWNlbGVyYXRpb24gKiBpbmVydGlhTGluZWFyaXR5KSkgKiAxMDAwO1xuICAgICAgICBsZXQgdGFyZ2V0U2NhbGUgPSBsYXN0U2NhbGUgKyBzcGVlZCAqIGR1cmF0aW9uIC8gMjAwMDtcblxuICAgICAgICBpZiAodGFyZ2V0U2NhbGUgPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRTY2FsZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuZWFzZVRvKHtcbiAgICAgICAgICAgIHpvb206IHRhcmdldFNjYWxlLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBlYXNpbmc6IGluZXJ0aWFFYXNpbmcsXG4gICAgICAgICAgICBhcm91bmQ6IHRoaXMuX2Fyb3VuZENlbnRlciA/IG1hcC5nZXRDZW50ZXIoKSA6IG1hcC51bnByb2plY3QocCksXG4gICAgICAgICAgICBub01vdmVTdGFydDogdHJ1ZVxuICAgICAgICB9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgfVxuXG4gICAgX2RyYWluSW5lcnRpYUJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgY3V0b2ZmID0gMTYwOyAvLyBtc2VjXG5cbiAgICAgICAgd2hpbGUgKGluZXJ0aWEubGVuZ3RoID4gMiAmJiBub3cgLSBpbmVydGlhWzBdWzBdID4gY3V0b2ZmKSBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgTWFwTW91c2VFdmVudCwgTWFwVG91Y2hFdmVudCwgTWFwV2hlZWxFdmVudCB9IGZyb20gJy4uL3VpL2V2ZW50cyc7XG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuL21hcCc7XG5pbXBvcnQgc2Nyb2xsWm9vbSBmcm9tICcuL2hhbmRsZXIvc2Nyb2xsX3pvb20nO1xuaW1wb3J0IGJveFpvb20gZnJvbSAnLi9oYW5kbGVyL2JveF96b29tJztcbmltcG9ydCBkcmFnUm90YXRlIGZyb20gJy4vaGFuZGxlci9kcmFnX3JvdGF0ZSc7XG5pbXBvcnQgZHJhZ1BhbiBmcm9tICcuL2hhbmRsZXIvZHJhZ19wYW4nO1xuaW1wb3J0IGtleWJvYXJkIGZyb20gJy4vaGFuZGxlci9rZXlib2FyZCc7XG5pbXBvcnQgZG91YmxlQ2xpY2tab29tIGZyb20gJy4vaGFuZGxlci9kYmxjbGlja196b29tJztcbmltcG9ydCB0b3VjaFpvb21Sb3RhdGUgZnJvbSAnLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlJztcblxuY29uc3QgaGFuZGxlcnMgPSB7XG4gICAgc2Nyb2xsWm9vbSxcbiAgICBib3hab29tLFxuICAgIGRyYWdSb3RhdGUsXG4gICAgZHJhZ1BhbixcbiAgICBrZXlib2FyZCxcbiAgICBkb3VibGVDbGlja1pvb20sXG4gICAgdG91Y2hab29tUm90YXRlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kSGFuZGxlcnMobWFwOiBNYXAsIG9wdGlvbnM6IHtpbnRlcmFjdGl2ZTogYm9vbGVhbiwgY2xpY2tUb2xlcmFuY2U6IG51bWJlcn0pIHtcbiAgICBjb25zdCBlbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICBsZXQgY29udGV4dE1lbnVFdmVudCA9IG51bGw7XG4gICAgbGV0IG1vdXNlRG93biA9IGZhbHNlO1xuICAgIGxldCBzdGFydFBvcyA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgKG1hcDogYW55KVtuYW1lXSA9IG5ldyBoYW5kbGVyc1tuYW1lXShtYXAsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcmFjdGl2ZSAmJiBvcHRpb25zW25hbWVdKSB7XG4gICAgICAgICAgICAobWFwOiBhbnkpW25hbWVdLmVuYWJsZShvcHRpb25zW25hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAnbW91c2VvdXQnLCBvbk1vdXNlT3V0KTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAnbW91c2VvdmVyJywgb25Nb3VzZU92ZXIpO1xuXG4gICAgLy8gQmluZCB0b3VjaHN0YXJ0IGFuZCB0b3VjaG1vdmUgd2l0aCBwYXNzaXZlOiBmYWxzZSBiZWNhdXNlLCBldmVuIHRob3VnaFxuICAgIC8vIHRoZXkgb25seSBmaXJlIGEgbWFwIGV2ZW50cyBhbmQgdGhlcmVmb3JlIGNvdWxkIHRoZW9yZXRpY2FsbHkgYmVcbiAgICAvLyBwYXNzaXZlLCBiaW5kaW5nIHdpdGggcGFzc2l2ZTogdHJ1ZSBjYXVzZXMgaU9TIG5vdCB0byByZXNwZWN0XG4gICAgLy8gZS5wcmV2ZW50RGVmYXVsdCgpIGluIF9vdGhlcl8gaGFuZGxlcnMsIGV2ZW4gaWYgdGhleSBhcmUgbm9uLXBhc3NpdmVcbiAgICAvLyAoc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODQyNTEpXG4gICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIoZWwsICd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCB7cGFzc2l2ZTogZmFsc2V9KTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCB7cGFzc2l2ZTogZmFsc2V9KTtcblxuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAndG91Y2hlbmQnLCBvblRvdWNoRW5kKTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ3RvdWNoY2FuY2VsJywgb25Ub3VjaENhbmNlbCk7XG4gICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIoZWwsICdjbGljaycsIG9uQ2xpY2spO1xuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAnZGJsY2xpY2snLCBvbkRibENsaWNrKTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSk7XG4gICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIoZWwsICd3aGVlbCcsIG9uV2hlZWwsIHtwYXNzaXZlOiBmYWxzZX0pO1xuXG4gICAgZnVuY3Rpb24gb25Nb3VzZURvd24oZTogTW91c2VFdmVudCkge1xuICAgICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBzdGFydFBvcyA9IERPTS5tb3VzZVBvcyhlbCwgZSk7XG5cbiAgICAgICAgY29uc3QgbWFwRXZlbnQgPSBuZXcgTWFwTW91c2VFdmVudCgnbW91c2Vkb3duJywgbWFwLCBlKTtcbiAgICAgICAgbWFwLmZpcmUobWFwRXZlbnQpO1xuXG4gICAgICAgIGlmIChtYXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcmFjdGl2ZSAmJiAhbWFwLmRvdWJsZUNsaWNrWm9vbS5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICBtYXAuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLmJveFpvb20ub25Nb3VzZURvd24oZSk7XG5cbiAgICAgICAgaWYgKCFtYXAuYm94Wm9vbS5pc0FjdGl2ZSgpICYmICFtYXAuZHJhZ1Bhbi5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICBtYXAuZHJhZ1JvdGF0ZS5vbk1vdXNlRG93bihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWFwLmJveFpvb20uaXNBY3RpdmUoKSAmJiAhbWFwLmRyYWdSb3RhdGUuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgbWFwLmRyYWdQYW4ub25Nb3VzZURvd24oZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCByb3RhdGluZyA9IG1hcC5kcmFnUm90YXRlLmlzQWN0aXZlKCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHRNZW51RXZlbnQgJiYgIXJvdGF0aW5nKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGNhc2UgZm9yIE1hY1xuICAgICAgICAgICAgbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ2NvbnRleHRtZW51JywgbWFwLCBjb250ZXh0TWVudUV2ZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0TWVudUV2ZW50ID0gbnVsbDtcbiAgICAgICAgbW91c2VEb3duID0gZmFsc2U7XG5cbiAgICAgICAgbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ21vdXNldXAnLCBtYXAsIGUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChtYXAuZHJhZ1Bhbi5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgIGlmIChtYXAuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHRhcmdldDogP05vZGUgPSAoZS50YXJnZXQ6IGFueSk7XG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGVsKSByZXR1cm47XG5cbiAgICAgICAgbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ21vdXNlbW92ZScsIG1hcCwgZSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VPdmVyKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgbGV0IHRhcmdldDogP05vZGUgPSAoZS50YXJnZXQ6IGFueSk7XG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGVsKSByZXR1cm47XG5cbiAgICAgICAgbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ21vdXNlb3ZlcicsIG1hcCwgZSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VPdXQoZTogTW91c2VFdmVudCkge1xuICAgICAgICBtYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudCgnbW91c2VvdXQnLCBtYXAsIGUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBjb25zdCBtYXBFdmVudCA9IG5ldyBNYXBUb3VjaEV2ZW50KCd0b3VjaHN0YXJ0JywgbWFwLCBlKTtcbiAgICAgICAgbWFwLmZpcmUobWFwRXZlbnQpO1xuXG4gICAgICAgIGlmIChtYXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgbWFwLnN0b3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWFwLmJveFpvb20uaXNBY3RpdmUoKSAmJiAhbWFwLmRyYWdSb3RhdGUuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgbWFwLmRyYWdQYW4ub25Ub3VjaFN0YXJ0KGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5vblN0YXJ0KGUpO1xuICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLm9uVG91Y2hTdGFydChtYXBFdmVudCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaE1vdmUoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBtYXAuZmlyZShuZXcgTWFwVG91Y2hFdmVudCgndG91Y2htb3ZlJywgbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaEVuZChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIG1hcC5maXJlKG5ldyBNYXBUb3VjaEV2ZW50KCd0b3VjaGVuZCcsIG1hcCwgZSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uVG91Y2hDYW5jZWwoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBtYXAuZmlyZShuZXcgTWFwVG91Y2hFdmVudCgndG91Y2hjYW5jZWwnLCBtYXAsIGUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgcG9zID0gRE9NLm1vdXNlUG9zKGVsLCBlKTtcbiAgICAgICAgaWYgKCFzdGFydFBvcyB8fCBwb3MuZXF1YWxzKHN0YXJ0UG9zKSB8fCBwb3MuZGlzdChzdGFydFBvcykgPCBvcHRpb25zLmNsaWNrVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICBtYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudCgnY2xpY2snLCBtYXAsIGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRGJsQ2xpY2soZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCBtYXBFdmVudCA9IG5ldyBNYXBNb3VzZUV2ZW50KCdkYmxjbGljaycsIG1hcCwgZSk7XG4gICAgICAgIG1hcC5maXJlKG1hcEV2ZW50KTtcblxuICAgICAgICBpZiAobWFwRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5vbkRibENsaWNrKG1hcEV2ZW50KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNvbnRleHRNZW51KGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3Qgcm90YXRpbmcgPSBtYXAuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpO1xuICAgICAgICBpZiAoIW1vdXNlRG93biAmJiAhcm90YXRpbmcpIHtcbiAgICAgICAgICAgIC8vIFdpbmRvd3M6IGNvbnRleHRtZW51IGZpcmVkIG9uIG1vdXNldXAsIHNvIGZpcmUgZXZlbnQgbm93XG4gICAgICAgICAgICBtYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudCgnY29udGV4dG1lbnUnLCBtYXAsIGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb3VzZURvd24pIHtcbiAgICAgICAgICAgIC8vIE1hYzogY29udGV4dG1lbnUgZmlyZWQgb24gbW91c2Vkb3duOyB3ZSBzYXZlIGl0IHVudGlsIG1vdXNldXAgZm9yIGNvbnNpc3RlbmN5J3Mgc2FrZVxuICAgICAgICAgICAgY29udGV4dE1lbnVFdmVudCA9IGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcmV2ZW50IGJyb3dzZXIgY29udGV4dCBtZW51IHdoZW4gbmVjZXNzYXJ5OyB3ZSBkb24ndCBhbGxvdyBpdCB3aXRoIHJvdGF0aW9uXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgY2FuJ3QgZGlzY2VybiByb3RhdGlvbiBnZXN0dXJlIHN0YXJ0IGZyb20gY29udGV4dG1lbnUgb24gTWFjXG4gICAgICAgIGlmIChtYXAuZHJhZ1JvdGF0ZS5pc0VuYWJsZWQoKSB8fCBtYXAubGlzdGVucygnY29udGV4dG1lbnUnKSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25XaGVlbChlOiBXaGVlbEV2ZW50KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBtYXAuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWFwRXZlbnQgPSBuZXcgTWFwV2hlZWxFdmVudCgnd2hlZWwnLCBtYXAsIGUpO1xuICAgICAgICBtYXAuZmlyZShtYXBFdmVudCk7XG5cbiAgICAgICAgaWYgKG1hcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcC5zY3JvbGxab29tLm9uV2hlZWwoZSk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBiaW5kQWxsLFxuICAgIGV4dGVuZCxcbiAgICBkZWVwRXF1YWwsXG4gICAgd2Fybk9uY2UsXG4gICAgY2xhbXAsXG4gICAgd3JhcCxcbiAgICBlYXNlIGFzIGRlZmF1bHRFYXNpbmcsXG4gICAgcGlja1xufSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgbnVtYmVyIGFzIGludGVycG9sYXRlIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0JztcbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7IEV2ZW50LCBFdmVudGVkIH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0JztcbmltcG9ydCB0eXBlIHtMbmdMYXRCb3VuZHNMaWtlfSBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMnO1xuaW1wb3J0IHR5cGUge1Rhc2tJRH0gZnJvbSAnLi4vdXRpbC90YXNrX3F1ZXVlJztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG4vKipcbiAqIE9wdGlvbnMgY29tbW9uIHRvIHtAbGluayBNYXAjanVtcFRvfSwge0BsaW5rIE1hcCNlYXNlVG99LCBhbmQge0BsaW5rIE1hcCNmbHlUb30sIGNvbnRyb2xsaW5nIHRoZSBkZXNpcmVkIGxvY2F0aW9uLFxuICogem9vbSwgYmVhcmluZywgYW5kIHBpdGNoIG9mIHRoZSBjYW1lcmEuIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCwgYW5kIHdoZW4gYSBwcm9wZXJ0eSBpcyBvbWl0dGVkLCB0aGUgY3VycmVudFxuICogY2FtZXJhIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5IHdpbGwgcmVtYWluIHVuY2hhbmdlZC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW1lcmFPcHRpb25zXG4gKiBAcHJvcGVydHkge0xuZ0xhdExpa2V9IGNlbnRlciBUaGUgZGVzaXJlZCBjZW50ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gem9vbSBUaGUgZGVzaXJlZCB6b29tIGxldmVsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJlYXJpbmcgVGhlIGRlc2lyZWQgYmVhcmluZywgaW4gZGVncmVlcy4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uIHRoYXRcbiAqIGlzIFwidXBcIjsgZm9yIGV4YW1wbGUsIGEgYmVhcmluZyBvZiA5MMOCwrAgb3JpZW50cyB0aGUgbWFwIHNvIHRoYXQgZWFzdCBpcyB1cC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwaXRjaCBUaGUgZGVzaXJlZCBwaXRjaCwgaW4gZGVncmVlcy5cbiAqIEBwcm9wZXJ0eSB7TG5nTGF0TGlrZX0gYXJvdW5kIElmIGB6b29tYCBpcyBzcGVjaWZpZWQsIGBhcm91bmRgIGRldGVybWluZXMgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgem9vbSBpcyBjZW50ZXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FtZXJhT3B0aW9ucyA9IHtcbiAgICBjZW50ZXI/OiBMbmdMYXRMaWtlLFxuICAgIHpvb20/OiBudW1iZXIsXG4gICAgYmVhcmluZz86IG51bWJlcixcbiAgICBwaXRjaD86IG51bWJlcixcbiAgICBhcm91bmQ/OiBMbmdMYXRMaWtlXG59O1xuXG4vKipcbiAqIE9wdGlvbnMgY29tbW9uIHRvIG1hcCBtb3ZlbWVudCBtZXRob2RzIHRoYXQgaW52b2x2ZSBhbmltYXRpb24sIHN1Y2ggYXMge0BsaW5rIE1hcCNwYW5CeX0gYW5kXG4gKiB7QGxpbmsgTWFwI2Vhc2VUb30sIGNvbnRyb2xsaW5nIHRoZSBkdXJhdGlvbiBhbmQgZWFzaW5nIGZ1bmN0aW9uIG9mIHRoZSBhbmltYXRpb24uIEFsbCBwcm9wZXJ0aWVzXG4gKiBhcmUgb3B0aW9uYWwuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQW5pbWF0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZWFzaW5nIEEgZnVuY3Rpb24gdGFraW5nIGEgdGltZSBpbiB0aGUgcmFuZ2UgMC4uMSBhbmQgcmV0dXJuaW5nIGEgbnVtYmVyIHdoZXJlIDAgaXNcbiAqICAgdGhlIGluaXRpYWwgc3RhdGUgYW5kIDEgaXMgdGhlIGZpbmFsIHN0YXRlLlxuICogQHByb3BlcnR5IHtQb2ludExpa2V9IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGNlbnRlciByZWxhdGl2ZSB0byByZWFsIG1hcCBjb250YWluZXIgY2VudGVyIGF0IHRoZSBlbmQgb2YgYW5pbWF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBhbmltYXRlIElmIGBmYWxzZWAsIG5vIGFuaW1hdGlvbiB3aWxsIG9jY3VyLlxuICovXG5leHBvcnQgdHlwZSBBbmltYXRpb25PcHRpb25zID0ge1xuICAgIGR1cmF0aW9uPzogbnVtYmVyLFxuICAgIGVhc2luZz86IChudW1iZXIpID0+IG51bWJlcixcbiAgICBvZmZzZXQ/OiBQb2ludExpa2UsXG4gICAgYW5pbWF0ZT86IGJvb2xlYW5cbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2V0dGluZyBwYWRkaW5nIG9uIGEgY2FsbCB0byB7QGxpbmsgTWFwI2ZpdEJvdW5kc30uIEFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0IG11c3QgYmVcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWRkaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCBQYWRkaW5nIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgdGhlIG1hcCBjYW52YXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgbWFwIGNhbnZhcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgb2YgdGhlIG1hcCBjYW52YXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmlnaHQgUGFkZGluZyBpbiBwaXhlbHMgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIG1hcCBjYW52YXMuXG4gKi9cblxuY2xhc3MgQ2FtZXJhIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm07XG4gICAgX21vdmluZzogYm9vbGVhbjtcbiAgICBfem9vbWluZzogYm9vbGVhbjtcbiAgICBfcm90YXRpbmc6IGJvb2xlYW47XG4gICAgX3BpdGNoaW5nOiBib29sZWFuO1xuXG4gICAgX2JlYXJpbmdTbmFwOiBudW1iZXI7XG4gICAgX2Vhc2VFbmRUaW1lb3V0SUQ6IFRpbWVvdXRJRDtcbiAgICBfZWFzZVN0YXJ0OiBudW1iZXI7XG4gICAgX2Vhc2VPcHRpb25zOiB7ZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAobnVtYmVyKSA9PiBudW1iZXJ9O1xuXG4gICAgX29uRWFzZUZyYW1lOiAobnVtYmVyKSA9PiB2b2lkO1xuICAgIF9vbkVhc2VFbmQ6ICgpID0+IHZvaWQ7XG4gICAgX2Vhc2VGcmFtZUlkOiA/VGFza0lEO1xuXG4gICAgK19yZXF1ZXN0UmVuZGVyRnJhbWU6ICgoKSA9PiB2b2lkKSA9PiBUYXNrSUQ7XG4gICAgK19jYW5jZWxSZW5kZXJGcmFtZTogKFRhc2tJRCkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybTogVHJhbnNmb3JtLCBvcHRpb25zOiB7YmVhcmluZ1NuYXA6IG51bWJlcn0pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbW92aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIHRoaXMuX2JlYXJpbmdTbmFwID0gb3B0aW9ucy5iZWFyaW5nU25hcDtcblxuICAgICAgICBiaW5kQWxsKFsnX3JlbmRlckZyYW1lQ2FsbGJhY2snXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxuICAgICAqL1xuICAgIGdldENlbnRlcigpOiBMbmdMYXQgeyByZXR1cm4gbmV3IExuZ0xhdCh0aGlzLnRyYW5zZm9ybS5jZW50ZXIubG5nLCB0aGlzLnRyYW5zZm9ybS5jZW50ZXIubGF0KTsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe2NlbnRlcjogY2VudGVyfSlgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gY2VudGVyIFRoZSBjZW50ZXJwb2ludCB0byBzZXQuXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldENlbnRlcihbLTc0LCAzOF0pO1xuICAgICAqL1xuICAgIHNldENlbnRlcihjZW50ZXI6IExuZ0xhdExpa2UsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qdW1wVG8oe2NlbnRlcn0sIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucyB0aGUgbWFwIGJ5IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIGJ5IHdoaWNoIHRvIHBhbiB0aGUgbWFwLlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW05hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2FtZS1jb250cm9scy8pXG4gICAgICovXG4gICAgcGFuQnkob2Zmc2V0OiBQb2ludExpa2UsIG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgb2Zmc2V0ID0gUG9pbnQuY29udmVydChvZmZzZXQpLm11bHQoLTEpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYW5Ubyh0aGlzLnRyYW5zZm9ybS5jZW50ZXIsIGV4dGVuZCh7b2Zmc2V0fSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIGxuZ2xhdCBUaGUgbG9jYXRpb24gdG8gcGFuIHRoZSBtYXAgdG8uXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcGFuVG8obG5nbGF0OiBMbmdMYXRMaWtlLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyhleHRlbmQoe1xuICAgICAgICAgICAgY2VudGVyOiBsbmdsYXRcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIGdldFpvb20oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnpvb207IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCdzIHpvb20gbGV2ZWwuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7em9vbTogem9vbX0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gc2V0ICgwLTIwKS5cbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gem9vbSB0aGUgbWFwIHRvIDVcbiAgICAgKiBtYXAuc2V0Wm9vbSg1KTtcbiAgICAgKi9cbiAgICBzZXRab29tKHpvb206IG51bWJlciwgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHt6b29tfSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbXMgdGhlIG1hcCB0byB0aGUgc3BlY2lmaWVkIHpvb20gbGV2ZWwsIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gdHJhbnNpdGlvbiB0by5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgem9vbVRvKHpvb206IG51bWJlciwgb3B0aW9uczogPyBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFzZVRvKGV4dGVuZCh7XG4gICAgICAgICAgICB6b29tXG4gICAgICAgIH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY3JlYXNlcyB0aGUgbWFwJ3Mgem9vbSBsZXZlbCBieSAxLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgem9vbUluKG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy56b29tVG8odGhpcy5nZXRab29tKCkgKyAxLCBvcHRpb25zLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIG1hcCdzIHpvb20gbGV2ZWwgYnkgMS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHpvb21PdXQob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLnpvb21Ubyh0aGlzLmdldFpvb20oKSAtIDEsIG9wdGlvbnMsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGN1cnJlbnQgYmVhcmluZy4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uIHRoYXQgaXMgXFxcInVwXFxcIjsgZm9yIGV4YW1wbGUsIGEgYmVhcmluZ1xuICAgICAqIG9mIDkww4LCsCBvcmllbnRzIHRoZSBtYXAgc28gdGhhdCBlYXN0IGlzIHVwLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgY3VycmVudCBiZWFyaW5nLlxuICAgICAqIEBzZWUgW05hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2FtZS1jb250cm9scy8pXG4gICAgICovXG4gICAgZ2V0QmVhcmluZygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uYmVhcmluZzsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3MgYmVhcmluZyAocm90YXRpb24pLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gdGhhdCBpcyBcXFwidXBcXFwiOyBmb3IgZXhhbXBsZSwgYSBiZWFyaW5nXG4gICAgICogb2YgOTDDgsKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe2JlYXJpbmc6IGJlYXJpbmd9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcuXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcm90YXRlIHRoZSBtYXAgdG8gOTAgZGVncmVlc1xuICAgICAqIG1hcC5zZXRCZWFyaW5nKDkwKTtcbiAgICAgKi9cbiAgICBzZXRCZWFyaW5nKGJlYXJpbmc6IG51bWJlciwgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtiZWFyaW5nfSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgYmVhcmluZywgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb25cbiAgICAgKiB0aGF0IGlzIFxcXCJ1cFxcXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmcgb2YgOTDDgsKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcuXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcm90YXRlVG8oYmVhcmluZzogbnVtYmVyLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyhleHRlbmQoe1xuICAgICAgICAgICAgYmVhcmluZ1xuICAgICAgICB9LCBvcHRpb25zKSwgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIHRoZSBtYXAgc28gdGhhdCBub3J0aCBpcyB1cCAoMMOCwrAgYmVhcmluZyksIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVzZXROb3J0aChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMucm90YXRlVG8oMCwgZXh0ZW5kKHtkdXJhdGlvbjogMTAwMH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIGFuZCBwaXRjaGVzIHRoZSBtYXAgc28gdGhhdCBub3J0aCBpcyB1cCAoMMOCwrAgYmVhcmluZykgYW5kIHBpdGNoIGlzIDDDgsKwLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlc2V0Tm9ydGhQaXRjaChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuZWFzZVRvKGV4dGVuZCh7XG4gICAgICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICAgICAgcGl0Y2g6IDAsXG4gICAgICAgICAgICBkdXJhdGlvbjogMTAwMFxuICAgICAgICB9LCBvcHRpb25zKSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU25hcHMgdGhlIG1hcCBzbyB0aGF0IG5vcnRoIGlzIHVwICgww4LCsCBiZWFyaW5nKSwgaWYgdGhlIGN1cnJlbnQgYmVhcmluZyBpcyBjbG9zZSBlbm91Z2ggdG8gaXQgKGkuZS4gd2l0aGluIHRoZVxuICAgICAqIGBiZWFyaW5nU25hcGAgdGhyZXNob2xkKS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc25hcFRvTm9ydGgob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5nZXRCZWFyaW5nKCkpIDwgdGhpcy5fYmVhcmluZ1NuYXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2V0Tm9ydGgob3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IHBpdGNoICh0aWx0KS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHJldHVybnMgVGhlIG1hcCdzIGN1cnJlbnQgcGl0Y2gsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuLlxuICAgICAqL1xuICAgIGdldFBpdGNoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5waXRjaDsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpLiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe3BpdGNoOiBwaXRjaH0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHBpdGNoIFRoZSBwaXRjaCB0byBzZXQsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuICgwLTYwKS5cbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIHBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRQaXRjaChwaXRjaDogbnVtYmVyLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3BpdGNofSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0xhdExuZ0JvdW5kc0xpa2V9IGJvdW5kcyBDYWxjdWxhdGUgdGhlIGNlbnRlciBmb3IgdGhlc2UgYm91bmRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlXG4gICAgICogICAgICB0aGUgaGlnaGVzdCB6b29tIGxldmVsIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0c1xuICAgICAqICAgICAgaW4gdGhlIHZpZXdwb3J0LiBMYXRMbmdCb3VuZHMgcmVwcmVzZW50IGEgYm94IHRoYXQgaXMgYWx3YXlzIGF4aXMtYWxpZ25lZCB3aXRoIGJlYXJpbmcgMC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldD1bMCwgMF1dIFRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgY2VudGVyLCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb21dIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gYWxsb3cgd2hlbiB0aGUgY2FtZXJhIHdvdWxkIHRyYW5zaXRpb24gdG8gdGhlIHNwZWNpZmllZCBib3VuZHMuXG4gICAgICogQHJldHVybnMge0NhbWVyYU9wdGlvbnMgfCB2b2lkfSBJZiBtYXAgaXMgYWJsZSB0byBmaXQgdG8gcHJvdmlkZWQgYm91bmRzLCByZXR1cm5zIGBDYW1lcmFPcHRpb25zYCB3aXRoXG4gICAgICogICAgICBgY2VudGVyYCwgYHpvb21gLCBhbmQgYGJlYXJpbmdgLiBJZiBtYXAgaXMgdW5hYmxlIHRvIGZpdCwgbWV0aG9kIHdpbGwgd2FybiBhbmQgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBiYm94ID0gW1stNzksIDQzXSwgWy03MywgNDVdXTtcbiAgICAgKiB2YXIgbmV3Q2FtZXJhVHJhbnNmb3JtID0gbWFwLmNhbWVyYUZvckJvdW5kcyhiYm94LCB7XG4gICAgICogICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgY2FtZXJhRm9yQm91bmRzKGJvdW5kczogTG5nTGF0Qm91bmRzTGlrZSwgb3B0aW9ucz86IENhbWVyYU9wdGlvbnMpOiB2b2lkIHwgQ2FtZXJhT3B0aW9ucyAmIEFuaW1hdGlvbk9wdGlvbnMge1xuICAgICAgICBib3VuZHMgPSBMbmdMYXRCb3VuZHMuY29udmVydChib3VuZHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FtZXJhRm9yQm94QW5kQmVhcmluZyhib3VuZHMuZ2V0Tm9ydGhXZXN0KCksIGJvdW5kcy5nZXRTb3V0aEVhc3QoKSwgMCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBjZW50ZXIgb2YgdGhlc2UgdHdvIHBvaW50cyBpbiB0aGUgdmlld3BvcnQgYW5kIHVzZVxuICAgICAqIHRoZSBoaWdoZXN0IHpvb20gbGV2ZWwgdXAgdG8gYW5kIGluY2x1ZGluZyBgTWFwI2dldE1heFpvb20oKWAgdGhhdCBmaXRzXG4gICAgICogdGhlIHBvaW50cyBpbiB0aGUgdmlld3BvcnQgYXQgdGhlIHNwZWNpZmllZCBiZWFyaW5nLlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBwMCBGaXJzdCBwb2ludFxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gcDEgU2Vjb25kIHBvaW50XG4gICAgICogQHBhcmFtIGJlYXJpbmcgRGVzaXJlZCBtYXAgYmVhcmluZyBhdCBlbmQgb2YgYW5pbWF0aW9uLCBpbiBkZWdyZWVzXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IFBhZGRpbmdPcHRpb25zfSBbb3B0aW9ucy5wYWRkaW5nXSBUaGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzIHRvIGFkZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXQ9WzAsIDBdXSBUaGUgY2VudGVyIG9mIHRoZSBnaXZlbiBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGNlbnRlciwgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIGNhbWVyYSB3b3VsZCB0cmFuc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxuICAgICAqIEByZXR1cm5zIHtDYW1lcmFPcHRpb25zIHwgdm9pZH0gSWYgbWFwIGlzIGFibGUgdG8gZml0IHRvIHByb3ZpZGVkIGJvdW5kcywgcmV0dXJucyBgQ2FtZXJhT3B0aW9uc2Agd2l0aFxuICAgICAqICAgICAgYGNlbnRlcmAsIGB6b29tYCwgYW5kIGBiZWFyaW5nYC4gSWYgbWFwIGlzIHVuYWJsZSB0byBmaXQsIG1ldGhvZCB3aWxsIHdhcm4gYW5kIHJldHVybiB1bmRlZmluZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwMCA9IFstNzksIDQzXTtcbiAgICAgKiB2YXIgcDEgPSBbLTczLCA0NV07XG4gICAgICogdmFyIGJlYXJpbmcgPSA5MDtcbiAgICAgKiB2YXIgbmV3Q2FtZXJhVHJhbnNmb3JtID0gbWFwLl9jYW1lcmFGb3JCb3hBbmRCZWFyaW5nKHAwLCBwMSwgYmVhcmluZywge1xuICAgICAqICAgcGFkZGluZzoge3RvcDogMTAsIGJvdHRvbToyNSwgbGVmdDogMTUsIHJpZ2h0OiA1fVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIF9jYW1lcmFGb3JCb3hBbmRCZWFyaW5nKHAwOiBMbmdMYXRMaWtlLCBwMTogTG5nTGF0TGlrZSwgYmVhcmluZzogbnVtYmVyLCBvcHRpb25zPzogQ2FtZXJhT3B0aW9ucyk6IHZvaWQgfCBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucyB7XG4gICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe1xuICAgICAgICAgICAgcGFkZGluZzoge1xuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgbGVmdDogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucGFkZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBvcHRpb25zLnBhZGRpbmc7XG4gICAgICAgICAgICBvcHRpb25zLnBhZGRpbmcgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogcCxcbiAgICAgICAgICAgICAgICByaWdodDogcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVlcEVxdWFsKE9iamVjdC5rZXlzKG9wdGlvbnMucGFkZGluZykuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgaWYgKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgICAgICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pLCBbXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJ0b3BcIl0pKSB7XG4gICAgICAgICAgICB3YXJuT25jZShcbiAgICAgICAgICAgICAgICBcIm9wdGlvbnMucGFkZGluZyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBvciBhbiBPYmplY3Qgd2l0aCBrZXlzICdib3R0b20nLCAnbGVmdCcsICdyaWdodCcsICd0b3AnXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ciA9IHRoaXMudHJhbnNmb3JtO1xuXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gY2FsY3VsYXRlIHRoZSB1cHBlciByaWdodCBhbmQgbG93ZXIgbGVmdCBvZiB0aGUgYm94IGRlZmluZWQgYnkgcDAgYW5kIHAxXG4gICAgICAgIC8vIGluIGEgY29vcmRpbmF0ZSBzeXN0ZW0gcm90YXRlIHRvIG1hdGNoIHRoZSBkZXN0aW5hdGlvbiBiZWFyaW5nLlxuICAgICAgICBjb25zdCBwMHdvcmxkID0gdHIucHJvamVjdChMbmdMYXQuY29udmVydChwMCkpO1xuICAgICAgICBjb25zdCBwMXdvcmxkID0gdHIucHJvamVjdChMbmdMYXQuY29udmVydChwMSkpO1xuICAgICAgICBjb25zdCBwMHJvdGF0ZWQgPSBwMHdvcmxkLnJvdGF0ZSgtYmVhcmluZyAqIE1hdGguUEkgLyAxODApO1xuICAgICAgICBjb25zdCBwMXJvdGF0ZWQgPSBwMXdvcmxkLnJvdGF0ZSgtYmVhcmluZyAqIE1hdGguUEkgLyAxODApO1xuXG4gICAgICAgIGNvbnN0IHVwcGVyUmlnaHQgPSBuZXcgUG9pbnQoTWF0aC5tYXgocDByb3RhdGVkLngsIHAxcm90YXRlZC54KSwgTWF0aC5tYXgocDByb3RhdGVkLnksIHAxcm90YXRlZC55KSk7XG4gICAgICAgIGNvbnN0IGxvd2VyTGVmdCA9IG5ldyBQb2ludChNYXRoLm1pbihwMHJvdGF0ZWQueCwgcDFyb3RhdGVkLngpLCBNYXRoLm1pbihwMHJvdGF0ZWQueSwgcDFyb3RhdGVkLnkpKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgem9vbTogY29uc2lkZXIgdGhlIG9yaWdpbmFsIGJib3ggYW5kIHBhZGRpbmcuXG4gICAgICAgIGNvbnN0IHNpemUgPSB1cHBlclJpZ2h0LnN1Yihsb3dlckxlZnQpO1xuICAgICAgICBjb25zdCBzY2FsZVggPSAodHIud2lkdGggLSBvcHRpb25zLnBhZGRpbmcubGVmdCAtIG9wdGlvbnMucGFkZGluZy5yaWdodCkgLyBzaXplLng7XG4gICAgICAgIGNvbnN0IHNjYWxlWSA9ICh0ci5oZWlnaHQgLSBvcHRpb25zLnBhZGRpbmcudG9wIC0gb3B0aW9ucy5wYWRkaW5nLmJvdHRvbSkgLyBzaXplLnk7XG5cbiAgICAgICAgaWYgKHNjYWxlWSA8IDAgfHwgc2NhbGVYIDwgMCkge1xuICAgICAgICAgICAgd2Fybk9uY2UoXG4gICAgICAgICAgICAgICAgJ01hcCBjYW5ub3QgZml0IHdpdGhpbiBjYW52YXMgd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLCBwYWRkaW5nLCBhbmQvb3Igb2Zmc2V0LidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b29tID0gTWF0aC5taW4odHIuc2NhbGVab29tKHRyLnNjYWxlICogTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpKSwgb3B0aW9ucy5tYXhab29tKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgY2VudGVyOiBhcHBseSB0aGUgem9vbSwgdGhlIGNvbmZpZ3VyZWQgb2Zmc2V0LCBhcyB3ZWxsIGFzIG9mZnNldCB0aGF0IGV4aXN0cyBhcyBhIHJlc3VsdCBvZiBwYWRkaW5nLlxuICAgICAgICBjb25zdCBvZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KTtcbiAgICAgICAgY29uc3QgcGFkZGluZ09mZnNldFggPSAob3B0aW9ucy5wYWRkaW5nLmxlZnQgLSBvcHRpb25zLnBhZGRpbmcucmlnaHQpIC8gMjtcbiAgICAgICAgY29uc3QgcGFkZGluZ09mZnNldFkgPSAob3B0aW9ucy5wYWRkaW5nLnRvcCAtIG9wdGlvbnMucGFkZGluZy5ib3R0b20pIC8gMjtcbiAgICAgICAgY29uc3Qgb2Zmc2V0QXRJbml0aWFsWm9vbSA9IG5ldyBQb2ludChvZmZzZXQueCArIHBhZGRpbmdPZmZzZXRYLCBvZmZzZXQueSArIHBhZGRpbmdPZmZzZXRZKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0QXRGaW5hbFpvb20gPSBvZmZzZXRBdEluaXRpYWxab29tLm11bHQodHIuc2NhbGUgLyB0ci56b29tU2NhbGUoem9vbSkpO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9ICB0ci51bnByb2plY3QocDB3b3JsZC5hZGQocDF3b3JsZCkuZGl2KDIpLnN1YihvZmZzZXRBdEZpbmFsWm9vbSkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjZW50ZXIsXG4gICAgICAgICAgICB6b29tLFxuICAgICAgICAgICAgYmVhcmluZ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhbnMgYW5kIHpvb21zIHRoZSBtYXAgdG8gY29udGFpbiBpdHMgdmlzaWJsZSBhcmVhIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGdlb2dyYXBoaWNhbCBib3VuZHMuXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gcmVzZXQgdGhlIG1hcCdzIGJlYXJpbmcgdG8gMCBpZiBiZWFyaW5nIGlzIG5vbnplcm8uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBib3VuZHMgQ2VudGVyIHRoZXNlIGJvdW5kcyBpbiB0aGUgdmlld3BvcnQgYW5kIHVzZSB0aGUgaGlnaGVzdFxuICAgICAqICAgICAgem9vbSBsZXZlbCB1cCB0byBhbmQgaW5jbHVkaW5nIGBNYXAjZ2V0TWF4Wm9vbSgpYCB0aGF0IGZpdHMgdGhlbSBpbiB0aGUgdmlld3BvcnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIHN1cHBvcnRzIGFsbCBwcm9wZXJ0aWVzIGZyb20ge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9IGFuZCB7QGxpbmsgQ2FtZXJhT3B0aW9uc30gaW4gYWRkaXRpb24gdG8gdGhlIGZpZWxkcyBiZWxvdy5cbiAgICAgKiBAcGFyYW0ge251bWJlciB8IFBhZGRpbmdPcHRpb25zfSBbb3B0aW9ucy5wYWRkaW5nXSBUaGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzIHRvIGFkZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGluZWFyPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmdcbiAgICAgKiAgICAge0BsaW5rIE1hcCNlYXNlVG99LiBJZiBgZmFsc2VgLCB0aGUgbWFwIHRyYW5zaXRpb25zIHVzaW5nIHtAbGluayBNYXAjZmx5VG99LiBTZWVcbiAgICAgKiAgICAgdGhvc2UgZnVuY3Rpb25zIGFuZCB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30gZm9yIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmVhc2luZ10gQW4gZWFzaW5nIGZ1bmN0aW9uIGZvciB0aGUgYW5pbWF0ZWQgdHJhbnNpdGlvbi4gU2VlIHtAbGluayBBbmltYXRpb25PcHRpb25zfS5cbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gW29wdGlvbnMub2Zmc2V0PVswLCAwXV0gVGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gYm91bmRzIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBjZW50ZXIsIG1lYXN1cmVkIGluIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Wm9vbV0gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBhbGxvdyB3aGVuIHRoZSBtYXAgdmlldyB0cmFuc2l0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2V2ZW50RGF0YV0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2Bcblx0ICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYmJveCA9IFtbLTc5LCA0M10sIFstNzMsIDQ1XV07XG4gICAgICogbWFwLmZpdEJvdW5kcyhiYm94LCB7XG4gICAgICogICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRml0IGEgbWFwIHRvIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpdGJvdW5kcy8pXG4gICAgICovXG4gICAgZml0Qm91bmRzKGJvdW5kczogTG5nTGF0Qm91bmRzTGlrZSwgb3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMgJiBDYW1lcmFPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpdEludGVybmFsKFxuICAgICAgICAgICAgdGhpcy5jYW1lcmFGb3JCb3VuZHMoYm91bmRzLCBvcHRpb25zKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhbnMsIHJvdGF0ZXMgYW5kIHpvb21zIHRoZSBtYXAgdG8gdG8gZml0IHRoZSBib3ggbWFkZSBieSBwb2ludHMgcDAgYW5kIHAxXG4gICAgICogb25jZSB0aGUgbWFwIGlzIHJvdGF0ZWQgdG8gdGhlIHNwZWNpZmllZCBiZWFyaW5nLiBUbyB6b29tIHdpdGhvdXQgcm90YXRpbmcsXG4gICAgICogcGFzcyBpbiB0aGUgY3VycmVudCBtYXAgYmVhcmluZy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHAwIEZpcnN0IHBvaW50IG9uIHNjcmVlbiwgaW4gcGl4ZWwgY29vcmRpbmF0ZXNcbiAgICAgKiBAcGFyYW0gcDEgU2Vjb25kIHBvaW50IG9uIHNjcmVlbiwgaW4gcGl4ZWwgY29vcmRpbmF0ZXNcbiAgICAgKiBAcGFyYW0gYmVhcmluZyBEZXNpcmVkIG1hcCBiZWFyaW5nIGF0IGVuZCBvZiBhbmltYXRpb24sIGluIGRlZ3JlZXNcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5saW5lYXI9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCB0cmFuc2l0aW9ucyB1c2luZ1xuICAgICAqICAgICB7QGxpbmsgTWFwI2Vhc2VUb30uIElmIGBmYWxzZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmcge0BsaW5rIE1hcCNmbHlUb30uIFNlZVxuICAgICAqICAgICB0aG9zZSBmdW5jdGlvbnMgYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZWFzaW5nXSBBbiBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoZSBhbmltYXRlZCB0cmFuc2l0aW9uLiBTZWUge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXQ9WzAsIDBdXSBUaGUgY2VudGVyIG9mIHRoZSBnaXZlbiBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGNlbnRlciwgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIG1hcCB2aWV3IHRyYW5zaXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2Bcblx0ICogQGV4YW1wbGVcbiAgICAgKiB2YXIgcDAgPSBbMjIwLCA0MDBdO1xuICAgICAqIHZhciBwMSA9IFs1MDAsIDkwMF07XG4gICAgICogbWFwLmZpdFNjcmVlbkNvb3JkaW5hdGVzKHAwLCBwMSwgbWFwLmdldEJlYXJpbmcoKSwge1xuICAgICAqICAgcGFkZGluZzoge3RvcDogMTAsIGJvdHRvbToyNSwgbGVmdDogMTUsIHJpZ2h0OiA1fVxuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW1VzZWQgYnkgQm94Wm9vbUhhbmRsZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS8jYm94em9vbWhhbmRsZXIpXG4gICAgICovXG4gICAgZml0U2NyZWVuQ29vcmRpbmF0ZXMocDA6IFBvaW50TGlrZSwgcDE6IFBvaW50TGlrZSwgYmVhcmluZzogbnVtYmVyLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucyAmIENhbWVyYU9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZml0SW50ZXJuYWwoXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFGb3JCb3hBbmRCZWFyaW5nKFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24oUG9pbnQuY29udmVydChwMCkpLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24oUG9pbnQuY29udmVydChwMSkpLFxuICAgICAgICAgICAgICAgIGJlYXJpbmcsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyksXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICBfZml0SW50ZXJuYWwoY2FsY3VsYXRlZE9wdGlvbnM/OiBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucywgb3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMgJiBDYW1lcmFPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgLy8gY2FtZXJhRm9yQm91bmRzIHdhcm5zICsgcmV0dXJucyB1bmRlZmluZWQgaWYgdW5hYmxlIHRvIGZpdDpcbiAgICAgICAgaWYgKCFjYWxjdWxhdGVkT3B0aW9ucykgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZChjYWxjdWxhdGVkT3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubGluZWFyID9cbiAgICAgICAgICAgIHRoaXMuZWFzZVRvKG9wdGlvbnMsIGV2ZW50RGF0YSkgOlxuICAgICAgICAgICAgdGhpcy5mbHlUbyhvcHRpb25zLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCB3aXRob3V0XG4gICAgICogYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi4gVGhlIG1hcCB3aWxsIHJldGFpbiBpdHMgY3VycmVudCB2YWx1ZXMgZm9yIGFueVxuICAgICAqIGRldGFpbHMgbm90IHNwZWNpZmllZCBpbiBgb3B0aW9uc2AuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgem9vbXN0YXJ0XG4gICAgICogQGZpcmVzIHBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgcm90YXRlXG4gICAgICogQGZpcmVzIG1vdmVcbiAgICAgKiBAZmlyZXMgem9vbVxuICAgICAqIEBmaXJlcyBwaXRjaFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQGZpcmVzIHpvb21lbmRcbiAgICAgKiBAZmlyZXMgcGl0Y2hlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBqdW1wVG8ob3B0aW9uczogQ2FtZXJhT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgIGxldCB6b29tQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgICAgYmVhcmluZ0NoYW5nZWQgPSBmYWxzZSxcbiAgICAgICAgICAgIHBpdGNoQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICgnem9vbScgaW4gb3B0aW9ucyAmJiB0ci56b29tICE9PSArb3B0aW9ucy56b29tKSB7XG4gICAgICAgICAgICB6b29tQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci56b29tID0gK29wdGlvbnMuem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmNlbnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0ci5jZW50ZXIgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmNlbnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2JlYXJpbmcnIGluIG9wdGlvbnMgJiYgdHIuYmVhcmluZyAhPT0gK29wdGlvbnMuYmVhcmluZykge1xuICAgICAgICAgICAgYmVhcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHIuYmVhcmluZyA9ICtvcHRpb25zLmJlYXJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ3BpdGNoJyBpbiBvcHRpb25zICYmIHRyLnBpdGNoICE9PSArb3B0aW9ucy5waXRjaCkge1xuICAgICAgICAgICAgcGl0Y2hDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLnBpdGNoID0gK29wdGlvbnMucGl0Y2g7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3Zlc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdtb3ZlJywgZXZlbnREYXRhKSk7XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnem9vbScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmVhcmluZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdyb3RhdGVlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2gnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3ZlZW5kJywgZXZlbnREYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbnkgY29tYmluYXRpb24gb2YgY2VudGVyLCB6b29tLCBiZWFyaW5nLCBhbmQgcGl0Y2gsIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvblxuICAgICAqIGJldHdlZW4gb2xkIGFuZCBuZXcgdmFsdWVzLiBUaGUgbWFwIHdpbGwgcmV0YWluIGl0cyBjdXJyZW50IHZhbHVlcyBmb3IgYW55XG4gICAgICogZGV0YWlscyBub3Qgc3BlY2lmaWVkIGluIGBvcHRpb25zYC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoZSB0cmFuc2l0aW9uIHdpbGwgaGFwcGVuIGluc3RhbnRseSBpZiB0aGUgdXNlciBoYXMgZW5hYmxlZFxuICAgICAqIHRoZSBgcmVkdWNlZCBtb3Rpb25gIGFjY2VzaWJpbGl0eSBmZWF0dXJlIGVuYWJsZWQgaW4gdGhlaXIgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBkZXNjcmliaW5nIHRoZSBkZXN0aW5hdGlvbiBhbmQgYW5pbWF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLlxuICAgICAqICAgICAgICAgICAgQWNjZXB0cyB7QGxpbmsgQ2FtZXJhT3B0aW9uc30gYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfS5cbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgcGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyByb3RhdGVcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIHBpdGNoXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEBmaXJlcyBwaXRjaGVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW05hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2FtZS1jb250cm9scy8pXG4gICAgICovXG4gICAgZWFzZVRvKG9wdGlvbnM6IENhbWVyYU9wdGlvbnMgJiBBbmltYXRpb25PcHRpb25zICYge2RlbGF5RW5kRXZlbnRzPzogbnVtYmVyfSwgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe1xuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgICAgZWFzaW5nOiBkZWZhdWx0RWFzaW5nXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlIHx8IGJyb3dzZXIucHJlZmVyc1JlZHVjZWRNb3Rpb24pIG9wdGlvbnMuZHVyYXRpb24gPSAwO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzdGFydFpvb20gPSB0aGlzLmdldFpvb20oKSxcbiAgICAgICAgICAgIHN0YXJ0QmVhcmluZyA9IHRoaXMuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgc3RhcnRQaXRjaCA9IHRoaXMuZ2V0UGl0Y2goKSxcblxuICAgICAgICAgICAgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gK29wdGlvbnMuem9vbSA6IHN0YXJ0Wm9vbSxcbiAgICAgICAgICAgIGJlYXJpbmcgPSAnYmVhcmluZycgaW4gb3B0aW9ucyA/IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcob3B0aW9ucy5iZWFyaW5nLCBzdGFydEJlYXJpbmcpIDogc3RhcnRCZWFyaW5nLFxuICAgICAgICAgICAgcGl0Y2ggPSAncGl0Y2gnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5waXRjaCA6IHN0YXJ0UGl0Y2g7XG5cbiAgICAgICAgY29uc3QgcG9pbnRBdE9mZnNldCA9IHRyLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSk7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uQXRPZmZzZXQgPSB0ci5wb2ludExvY2F0aW9uKHBvaW50QXRPZmZzZXQpO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmNlbnRlciB8fCBsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fbm9ybWFsaXplQ2VudGVyKGNlbnRlcik7XG5cbiAgICAgICAgY29uc3QgZnJvbSA9IHRyLnByb2plY3QobG9jYXRpb25BdE9mZnNldCk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdHIucHJvamVjdChjZW50ZXIpLnN1Yihmcm9tKTtcbiAgICAgICAgY29uc3QgZmluYWxTY2FsZSA9IHRyLnpvb21TY2FsZSh6b29tIC0gc3RhcnRab29tKTtcblxuICAgICAgICBsZXQgYXJvdW5kLCBhcm91bmRQb2ludDtcblxuICAgICAgICBpZiAob3B0aW9ucy5hcm91bmQpIHtcbiAgICAgICAgICAgIGFyb3VuZCA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuYXJvdW5kKTtcbiAgICAgICAgICAgIGFyb3VuZFBvaW50ID0gdHIubG9jYXRpb25Qb2ludChhcm91bmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fem9vbWluZyA9ICh6b29tICE9PSBzdGFydFpvb20pO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XG5cbiAgICAgICAgdGhpcy5fcHJlcGFyZUVhc2UoZXZlbnREYXRhLCBvcHRpb25zLm5vTW92ZVN0YXJ0KTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZWFzZUVuZFRpbWVvdXRJRCk7XG5cbiAgICAgICAgdGhpcy5fZWFzZSgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3pvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0ci56b29tID0gaW50ZXJwb2xhdGUoc3RhcnRab29tLCB6b29tLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgdHIucGl0Y2ggPSBpbnRlcnBvbGF0ZShzdGFydFBpdGNoLCBwaXRjaCwgayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhcm91bmQpIHtcbiAgICAgICAgICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQoYXJvdW5kLCBhcm91bmRQb2ludCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdHIuem9vbVNjYWxlKHRyLnpvb20gLSBzdGFydFpvb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB6b29tID4gc3RhcnRab29tID9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oMiwgZmluYWxTY2FsZSkgOlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLjUsIGZpbmFsU2NhbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwZWVkdXAgPSBNYXRoLnBvdyhiYXNlLCAxIC0gayk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKGRlbHRhLm11bHQoayAqIHNwZWVkdXApKS5tdWx0KHNjYWxlKSk7XG4gICAgICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnJlbmRlcldvcmxkQ29waWVzID8gbmV3Q2VudGVyLndyYXAoKSA6IG5ld0NlbnRlciwgcG9pbnRBdE9mZnNldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XG5cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVsYXlFbmRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXNlRW5kVGltZW91dElEID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9hZnRlckVhc2UoZXZlbnREYXRhKSwgb3B0aW9ucy5kZWxheUVuZEV2ZW50cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyRWFzZShldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfcHJlcGFyZUVhc2UoZXZlbnREYXRhPzogT2JqZWN0LCBub01vdmVTdGFydDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9tb3ZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICghbm9Nb3ZlU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl96b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tc3RhcnQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcm90YXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdwaXRjaHN0YXJ0JywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZmlyZU1vdmVFdmVudHMoZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCBldmVudERhdGEpKTtcbiAgICAgICAgaWYgKHRoaXMuX3pvb21pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb20nLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcm90YXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZScsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9waXRjaGluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2gnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9hZnRlckVhc2UoZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IHdhc1pvb21pbmcgPSB0aGlzLl96b29taW5nO1xuICAgICAgICBjb25zdCB3YXNSb3RhdGluZyA9IHRoaXMuX3JvdGF0aW5nO1xuICAgICAgICBjb25zdCB3YXNQaXRjaGluZyA9IHRoaXMuX3BpdGNoaW5nO1xuICAgICAgICB0aGlzLl9tb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fem9vbWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh3YXNab29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdhc1JvdGF0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdyb3RhdGVlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FzUGl0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZWVuZCcsIGV2ZW50RGF0YSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCBhbmltYXRpbmcgdGhlIHRyYW5zaXRpb24gYWxvbmcgYSBjdXJ2ZSB0aGF0XG4gICAgICogZXZva2VzIGZsaWdodC4gVGhlIGFuaW1hdGlvbiBzZWFtbGVzc2x5IGluY29ycG9yYXRlcyB6b29taW5nIGFuZCBwYW5uaW5nIHRvIGhlbHBcbiAgICAgKiB0aGUgdXNlciBtYWludGFpbiBoZXIgYmVhcmluZ3MgZXZlbiBhZnRlciB0cmF2ZXJzaW5nIGEgZ3JlYXQgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGUgYW5pbWF0aW9uIHdpbGwgYmUgc2tpcHBlZCwgYW5kIHRoaXMgd2lsbCBiZWhhdmUgZXF1aXZhbGVudGx5IHRvIGBqdW1wVG9gXG4gICAgICogaWYgdGhlIHVzZXIgaGFzIHRoZSBgcmVkdWNlZCBtb3Rpb25gIGFjY2VzaWJpbGl0eSBmZWF0dXJlIGVuYWJsZWQgaW4gdGhlaXIgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBkZXNjcmliaW5nIHRoZSBkZXN0aW5hdGlvbiBhbmQgYW5pbWF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLlxuICAgICAqICAgICBBY2NlcHRzIHtAbGluayBDYW1lcmFPcHRpb25zfSwge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LFxuICAgICAqICAgICBhbmQgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmN1cnZlPTEuNDJdIFRoZSB6b29taW5nIFwiY3VydmVcIiB0aGF0IHdpbGwgb2NjdXIgYWxvbmcgdGhlXG4gICAgICogICAgIGZsaWdodCBwYXRoLiBBIGhpZ2ggdmFsdWUgbWF4aW1pemVzIHpvb21pbmcgZm9yIGFuIGV4YWdnZXJhdGVkIGFuaW1hdGlvbiwgd2hpbGUgYSBsb3dcbiAgICAgKiAgICAgdmFsdWUgbWluaW1pemVzIHpvb21pbmcgZm9yIGFuIGVmZmVjdCBjbG9zZXIgdG8ge0BsaW5rIE1hcCNlYXNlVG99LiAxLjQyIGlzIHRoZSBhdmVyYWdlXG4gICAgICogICAgIHZhbHVlIHNlbGVjdGVkIGJ5IHBhcnRpY2lwYW50cyBpbiB0aGUgdXNlciBzdHVkeSBkaXNjdXNzZWQgaW5cbiAgICAgKiAgICAgW3ZhbiBXaWprICgyMDAzKV0oaHR0cHM6Ly93d3cud2luLnR1ZS5ubC9+dmFud2lqay96b29tcGFuLnBkZikuIEEgdmFsdWUgb2ZcbiAgICAgKiAgICAgYE1hdGgucG93KDYsIDAuMjUpYCB3b3VsZCBiZSBlcXVpdmFsZW50IHRvIHRoZSByb290IG1lYW4gc3F1YXJlZCBhdmVyYWdlIHZlbG9jaXR5LiBBXG4gICAgICogICAgIHZhbHVlIG9mIDEgd291bGQgcHJvZHVjZSBhIGNpcmN1bGFyIG1vdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbV0gVGhlIHplcm8tYmFzZWQgem9vbSBsZXZlbCBhdCB0aGUgcGVhayBvZiB0aGUgZmxpZ2h0IHBhdGguIElmXG4gICAgICogICAgIGBvcHRpb25zLmN1cnZlYCBpcyBzcGVjaWZpZWQsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNwZWVkPTEuMl0gVGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGFuaW1hdGlvbiBkZWZpbmVkIGluIHJlbGF0aW9uIHRvXG4gICAgICogICAgIGBvcHRpb25zLmN1cnZlYC4gQSBzcGVlZCBvZiAxLjIgbWVhbnMgdGhhdCB0aGUgbWFwIGFwcGVhcnMgdG8gbW92ZSBhbG9uZyB0aGUgZmxpZ2h0IHBhdGhcbiAgICAgKiAgICAgYnkgMS4yIHRpbWVzIGBvcHRpb25zLmN1cnZlYCBzY3JlZW5mdWxzIGV2ZXJ5IHNlY29uZC4gQSBfc2NyZWVuZnVsXyBpcyB0aGUgbWFwJ3MgdmlzaWJsZSBzcGFuLlxuICAgICAqICAgICBJdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZml4ZWQgcGh5c2ljYWwgZGlzdGFuY2UsIGJ1dCB2YXJpZXMgYnkgem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2NyZWVuU3BlZWRdIFRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gbWVhc3VyZWQgaW4gc2NyZWVuZnVsc1xuICAgICAqICAgICBwZXIgc2Vjb25kLCBhc3N1bWluZyBhIGxpbmVhciB0aW1pbmcgY3VydmUuIElmIGBvcHRpb25zLnNwZWVkYCBpcyBzcGVjaWZpZWQsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heER1cmF0aW9uXSBUaGUgYW5pbWF0aW9uJ3MgbWF4aW11bSBkdXJhdGlvbiwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxuICAgICAqICAgICBJZiBkdXJhdGlvbiBleGNlZWRzIG1heGltdW0gZHVyYXRpb24sIGl0IHJlc2V0cyB0byAwLlxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBwaXRjaHN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVcbiAgICAgKiBAZmlyZXMgem9vbVxuICAgICAqIEBmaXJlcyByb3RhdGVcbiAgICAgKiBAZmlyZXMgcGl0Y2hcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQGZpcmVzIHBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBmbHkgd2l0aCBkZWZhdWx0IG9wdGlvbnMgdG8gbnVsbCBpc2xhbmRcbiAgICAgKiBtYXAuZmx5VG8oe2NlbnRlcjogWzAsIDBdLCB6b29tOiA5fSk7XG4gICAgICogLy8gdXNpbmcgZmx5VG8gb3B0aW9uc1xuICAgICAqIG1hcC5mbHlUbyh7XG4gICAgICogICBjZW50ZXI6IFswLCAwXSxcbiAgICAgKiAgIHpvb206IDksXG4gICAgICogICBzcGVlZDogMC4yLFxuICAgICAqICAgY3VydmU6IDEsXG4gICAgICogICBlYXNpbmcodCkge1xuICAgICAqICAgICByZXR1cm4gdDtcbiAgICAgKiAgIH1cbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtGbHkgdG8gYSBsb2NhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by8pXG4gICAgICogQHNlZSBbU2xvd2x5IGZseSB0byBhIGxvY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZseXRvLW9wdGlvbnMvKVxuICAgICAqIEBzZWUgW0ZseSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHNjcm9sbCBwb3NpdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zY3JvbGwtZmx5LXRvLylcbiAgICAgKi9cbiAgICBmbHlUbyhvcHRpb25zOiBPYmplY3QsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8ganVtcFRvIGlmIHVzZXIgaGFzIHNldCBwcmVmZXJzLXJlZHVjZWQtbW90aW9uXG4gICAgICAgIGlmIChicm93c2VyLnByZWZlcnNSZWR1Y2VkTW90aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBjb2VyY2VkT3B0aW9ucyA9IChwaWNrKG9wdGlvbnMsIFsnY2VudGVyJywgJ3pvb20nLCAnYmVhcmluZycsICdwaXRjaCcsICdhcm91bmQnXSk6IENhbWVyYU9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuanVtcFRvKGNvZXJjZWRPcHRpb25zLCBldmVudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaW1wbGVtZW50cyBhbiDDosKAwpxvcHRpbWFsIHBhdGjDosKAwp0gYW5pbWF0aW9uLCBhcyBkZXRhaWxlZCBpbjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVmFuIFdpamssIEphcmtlIEouOyBOdWlqLCBXaW0gQS4gQS4gw6LCgMKcU21vb3RoIGFuZCBlZmZpY2llbnQgem9vbWluZyBhbmQgcGFubmluZy7DosKAwp0gSU5GT1ZJU1xuICAgICAgICAvLyAgIMOiwoDCmTAzLiBwcC4gMTXDosKAwpMyMi4gPGh0dHBzOi8vd3d3Lndpbi50dWUubmwvfnZhbndpamsvem9vbXBhbi5wZGYjcGFnZT01Pi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlcmUgYXBwbGljYWJsZSwgbG9jYWwgdmFyaWFibGUgZG9jdW1lbnRhdGlvbiBiZWdpbnMgd2l0aCB0aGUgYXNzb2NpYXRlZCB2YXJpYWJsZSBvclxuICAgICAgICAvLyBmdW5jdGlvbiBpbiB2YW4gV2lqayAoMjAwMykuXG5cbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICAgIHNwZWVkOiAxLjIsXG4gICAgICAgICAgICBjdXJ2ZTogMS40MixcbiAgICAgICAgICAgIGVhc2luZzogZGVmYXVsdEVhc2luZ1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBjb25zdCB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgc3RhcnRab29tID0gdGhpcy5nZXRab29tKCksXG4gICAgICAgICAgICBzdGFydEJlYXJpbmcgPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHN0YXJ0UGl0Y2ggPSB0aGlzLmdldFBpdGNoKCk7XG5cbiAgICAgICAgY29uc3Qgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gY2xhbXAoK29wdGlvbnMuem9vbSwgdHIubWluWm9vbSwgdHIubWF4Wm9vbSkgOiBzdGFydFpvb207XG4gICAgICAgIGNvbnN0IGJlYXJpbmcgPSAnYmVhcmluZycgaW4gb3B0aW9ucyA/IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcob3B0aW9ucy5iZWFyaW5nLCBzdGFydEJlYXJpbmcpIDogc3RhcnRCZWFyaW5nO1xuICAgICAgICBjb25zdCBwaXRjaCA9ICdwaXRjaCcgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnBpdGNoIDogc3RhcnRQaXRjaDtcblxuICAgICAgICBjb25zdCBzY2FsZSA9IHRyLnpvb21TY2FsZSh6b29tIC0gc3RhcnRab29tKTtcbiAgICAgICAgY29uc3QgcG9pbnRBdE9mZnNldCA9IHRyLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSk7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uQXRPZmZzZXQgPSB0ci5wb2ludExvY2F0aW9uKHBvaW50QXRPZmZzZXQpO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmNlbnRlciB8fCBsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fbm9ybWFsaXplQ2VudGVyKGNlbnRlcik7XG5cbiAgICAgICAgY29uc3QgZnJvbSA9IHRyLnByb2plY3QobG9jYXRpb25BdE9mZnNldCk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdHIucHJvamVjdChjZW50ZXIpLnN1Yihmcm9tKTtcblxuICAgICAgICBsZXQgcmhvID0gb3B0aW9ucy5jdXJ2ZTtcblxuICAgICAgICAvLyB3w6LCgsKAOiBJbml0aWFsIHZpc2libGUgc3BhbiwgbWVhc3VyZWQgaW4gcGl4ZWxzIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICBjb25zdCB3MCA9IE1hdGgubWF4KHRyLndpZHRoLCB0ci5oZWlnaHQpLFxuICAgICAgICAgICAgLy8gd8OiwoLCgTogRmluYWwgdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICAgICAgdzEgPSB3MCAvIHNjYWxlLFxuICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCBhcyBwcm9qZWN0ZWQgb250byB0aGUgZ3JvdW5kIHBsYW5lLCBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbVxuICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGltYWdlIG9yaWdpbiBhdCB0aGUgaW5pdGlhbCBzY2FsZS5cbiAgICAgICAgICAgIHUxID0gZGVsdGEubWFnKCk7XG5cbiAgICAgICAgaWYgKCdtaW5ab29tJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5ab29tID0gY2xhbXAoTWF0aC5taW4ob3B0aW9ucy5taW5ab29tLCBzdGFydFpvb20sIHpvb20pLCB0ci5taW5ab29tLCB0ci5tYXhab29tKTtcbiAgICAgICAgICAgIC8vIHc8c3ViPm08L3N1Yj46IE1heGltdW0gdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAvLyBzY2FsZS5cbiAgICAgICAgICAgIGNvbnN0IHdNYXggPSB3MCAvIHRyLnpvb21TY2FsZShtaW5ab29tIC0gc3RhcnRab29tKTtcbiAgICAgICAgICAgIHJobyA9IE1hdGguc3FydCh3TWF4IC8gdTEgKiAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIMOPwoHDgsKyXG4gICAgICAgIGNvbnN0IHJobzIgPSByaG8gKiByaG87XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHLDocK1wqI6IFJldHVybnMgdGhlIHpvb20tb3V0IGZhY3RvciBhdCBvbmUgZW5kIG9mIHRoZSBhbmltYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBpIDAgZm9yIHRoZSBhc2NlbnQgb3IgMSBmb3IgdGhlIGRlc2NlbnQuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiByKGkpIHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodzEgKiB3MSAtIHcwICogdzAgKyAoaSA/IC0xIDogMSkgKiByaG8yICogcmhvMiAqIHUxICogdTEpIC8gKDIgKiAoaSA/IHcxIDogdzApICogcmhvMiAqIHUxKTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmxvZyhNYXRoLnNxcnQoYiAqIGIgKyAxKSAtIGIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2luaChuKSB7IHJldHVybiAoTWF0aC5leHAobikgLSBNYXRoLmV4cCgtbikpIC8gMjsgfVxuICAgICAgICBmdW5jdGlvbiBjb3NoKG4pIHsgcmV0dXJuIChNYXRoLmV4cChuKSArIE1hdGguZXhwKC1uKSkgLyAyOyB9XG4gICAgICAgIGZ1bmN0aW9uIHRhbmgobikgeyByZXR1cm4gc2luaChuKSAvIGNvc2gobik7IH1cblxuICAgICAgICAvLyByw6LCgsKAOiBab29tLW91dCBmYWN0b3IgZHVyaW5nIGFzY2VudC5cbiAgICAgICAgY29uc3QgcjAgPSByKDApO1xuXG4gICAgICAgIC8vIHcocyk6IFJldHVybnMgdGhlIHZpc2libGUgc3BhbiBvbiB0aGUgZ3JvdW5kLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZVxuICAgICAgICAvLyBpbml0aWFsIHNjYWxlLiBBc3N1bWVzIGFuIGFuZ3VsYXIgZmllbGQgb2YgdmlldyBvZiAyIGFyY3RhbiDDgsK9IMOiwonCiCA1M8OCwrAuXG4gICAgICAgIGxldCB3OiAobnVtYmVyKSA9PiBudW1iZXIgPSBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIChjb3NoKHIwKSAvIGNvc2gocjAgKyByaG8gKiBzKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gdShzKTogUmV0dXJucyB0aGUgZGlzdGFuY2UgYWxvbmcgdGhlIGZsaWdodCBwYXRoIGFzIHByb2plY3RlZCBvbnRvIHRoZSBncm91bmQgcGxhbmUsXG4gICAgICAgIC8vIG1lYXN1cmVkIGluIHBpeGVscyBmcm9tIHRoZSB3b3JsZCBpbWFnZSBvcmlnaW4gYXQgdGhlIGluaXRpYWwgc2NhbGUuXG4gICAgICAgIGxldCB1OiAobnVtYmVyKSA9PiBudW1iZXIgPSBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIHcwICogKChjb3NoKHIwKSAqIHRhbmgocjAgKyByaG8gKiBzKSAtIHNpbmgocjApKSAvIHJobzIpIC8gdTE7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUzogVG90YWwgbGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gw4/CgS1zY3JlZW5mdWxzLlxuICAgICAgICBsZXQgUyA9IChyKDEpIC0gcjApIC8gcmhvO1xuXG4gICAgICAgIC8vIFdoZW4gdcOiwoLCgCA9IHXDosKCwoEsIHRoZSBvcHRpbWFsIHBhdGggZG9lc27DosKAwpl0IHJlcXVpcmUgYm90aCBhc2NlbnQgYW5kIGRlc2NlbnQuXG4gICAgICAgIGlmIChNYXRoLmFicyh1MSkgPCAwLjAwMDAwMSB8fCAhaXNGaW5pdGUoUykpIHtcbiAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBtb3JlIG9yIGxlc3MgaW5zdGFudGFuZW91cyB0cmFuc2l0aW9uIGlmIHRoZSBwYXRoIGlzIHRvbyBzaG9ydC5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh3MCAtIHcxKSA8IDAuMDAwMDAxKSByZXR1cm4gdGhpcy5lYXNlVG8ob3B0aW9ucywgZXZlbnREYXRhKTtcblxuICAgICAgICAgICAgY29uc3QgayA9IHcxIDwgdzAgPyAtMSA6IDE7XG4gICAgICAgICAgICBTID0gTWF0aC5hYnMoTWF0aC5sb2codzEgLyB3MCkpIC8gcmhvO1xuXG4gICAgICAgICAgICB1ID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuICAgICAgICAgICAgdyA9IGZ1bmN0aW9uKHMpIHsgcmV0dXJuIE1hdGguZXhwKGsgKiByaG8gKiBzKTsgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnZHVyYXRpb24nIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSArb3B0aW9ucy5kdXJhdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IFYgPSAnc2NyZWVuU3BlZWQnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5zY3JlZW5TcGVlZCAvIHJobyA6ICtvcHRpb25zLnNwZWVkO1xuICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9IDEwMDAgKiBTIC8gVjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm1heER1cmF0aW9uICYmIG9wdGlvbnMuZHVyYXRpb24gPiBvcHRpb25zLm1heER1cmF0aW9uKSB7XG4gICAgICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XG5cbiAgICAgICAgdGhpcy5fcHJlcGFyZUVhc2UoZXZlbnREYXRhLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fZWFzZSgoaykgPT4ge1xuICAgICAgICAgICAgLy8gczogVGhlIGRpc3RhbmNlIHRyYXZlbGVkIGFsb25nIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gw4/CgS1zY3JlZW5mdWxzLlxuICAgICAgICAgICAgY29uc3QgcyA9IGsgKiBTO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gdyhzKTtcbiAgICAgICAgICAgIHRyLnpvb20gPSBrID09PSAxID8gem9vbSA6IHN0YXJ0Wm9vbSArIHRyLnNjYWxlWm9vbShzY2FsZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgdHIucGl0Y2ggPSBpbnRlcnBvbGF0ZShzdGFydFBpdGNoLCBwaXRjaCwgayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0NlbnRlciA9IGsgPT09IDEgPyBjZW50ZXIgOiB0ci51bnByb2plY3QoZnJvbS5hZGQoZGVsdGEubXVsdCh1KHMpKSkubXVsdChzY2FsZSkpO1xuICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnJlbmRlcldvcmxkQ29waWVzID8gbmV3Q2VudGVyLndyYXAoKSA6IG5ld0NlbnRlciwgcG9pbnRBdE9mZnNldCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XG5cbiAgICAgICAgfSwgKCkgPT4gdGhpcy5fYWZ0ZXJFYXNlKGV2ZW50RGF0YSksIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlzRWFzaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lYXNlRnJhbWVJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyBhbnkgYW5pbWF0ZWQgdHJhbnNpdGlvbiB1bmRlcndheS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc3RvcCgpOiB0aGlzIHtcbiAgICAgICAgaWYgKHRoaXMuX2Vhc2VGcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9lYXNlRnJhbWVJZCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fZWFzZUZyYW1lSWQ7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb25FYXNlRnJhbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fb25FYXNlRW5kKSB7XG4gICAgICAgICAgICAvLyBUaGUgX29uRWFzZUVuZCBmdW5jdGlvbiBtaWdodCBlbWl0IGV2ZW50cyB3aGljaCB0cmlnZ2VyIG5ld1xuICAgICAgICAgICAgLy8gYW5pbWF0aW9uLCB3aGljaCBzZXRzIGEgbmV3IF9vbkVhc2VFbmQuIEVuc3VyZSB3ZSBkb24ndCBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IHVuaW50ZW50aW9uYWxseS5cbiAgICAgICAgICAgIGNvbnN0IG9uRWFzZUVuZCA9IHRoaXMuX29uRWFzZUVuZDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9vbkVhc2VFbmQ7XG4gICAgICAgICAgICBvbkVhc2VFbmQuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfZWFzZShmcmFtZTogKG51bWJlcikgPT4gdm9pZCxcbiAgICAgICAgICBmaW5pc2g6ICgpID0+IHZvaWQsXG4gICAgICAgICAgb3B0aW9uczoge2FuaW1hdGU6IGJvb2xlYW4sIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZzogKG51bWJlcikgPT4gbnVtYmVyfSkge1xuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSB8fCBvcHRpb25zLmR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICBmcmFtZSgxKTtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZWFzZVN0YXJ0ID0gYnJvd3Nlci5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX29uRWFzZUZyYW1lID0gZnJhbWU7XG4gICAgICAgICAgICB0aGlzLl9vbkVhc2VFbmQgPSBmaW5pc2g7XG4gICAgICAgICAgICB0aGlzLl9lYXNlRnJhbWVJZCA9IHRoaXMuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxiYWNrIGZvciBtYXAuX3JlcXVlc3RSZW5kZXJGcmFtZVxuICAgIF9yZW5kZXJGcmFtZUNhbGxiYWNrKCkge1xuICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oKGJyb3dzZXIubm93KCkgLSB0aGlzLl9lYXNlU3RhcnQpIC8gdGhpcy5fZWFzZU9wdGlvbnMuZHVyYXRpb24sIDEpO1xuICAgICAgICB0aGlzLl9vbkVhc2VGcmFtZSh0aGlzLl9lYXNlT3B0aW9ucy5lYXNpbmcodCkpO1xuICAgICAgICBpZiAodCA8IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VGcmFtZUlkID0gdGhpcy5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX3JlbmRlckZyYW1lQ2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGJlYXJpbmcgc28gdGhhdCBpdCdzIG51bWVyaWNhbGx5IGNsb3NlIHRvIHRoZSBjdXJyZW50IG9uZSBzbyB0aGF0IGl0IGludGVycG9sYXRlcyBwcm9wZXJseVxuICAgIF9ub3JtYWxpemVCZWFyaW5nKGJlYXJpbmc6IG51bWJlciwgY3VycmVudEJlYXJpbmc6IG51bWJlcikge1xuICAgICAgICBiZWFyaW5nID0gd3JhcChiZWFyaW5nLCAtMTgwLCAxODApO1xuICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoYmVhcmluZyAtIGN1cnJlbnRCZWFyaW5nKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgLSAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nIC09IDM2MDtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgKyAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nICs9IDM2MDtcbiAgICAgICAgcmV0dXJuIGJlYXJpbmc7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBwYXRoIGNyb3NzaW5nIHRoZSBhbnRpbWVyaWRpYW4gd291bGQgYmUgc2hvcnRlciwgZXh0ZW5kIHRoZSBmaW5hbCBjb29yZGluYXRlIHNvIHRoYXRcbiAgICAvLyBpbnRlcnBvbGF0aW5nIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgd2lsbCBjcm9zcyBpdC5cbiAgICBfbm9ybWFsaXplQ2VudGVyKGNlbnRlcjogTG5nTGF0KSB7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgIGlmICghdHIucmVuZGVyV29ybGRDb3BpZXMgfHwgdHIubG5nUmFuZ2UpIHJldHVybjtcblxuICAgICAgICBjb25zdCBkZWx0YSA9IGNlbnRlci5sbmcgLSB0ci5jZW50ZXIubG5nO1xuICAgICAgICBjZW50ZXIubG5nICs9XG4gICAgICAgICAgICBkZWx0YSA+IDE4MCA/IC0zNjAgOlxuICAgICAgICAgICAgZGVsdGEgPCAtMTgwID8gMzYwIDogMDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhbWVyYTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuaW1wb3J0IHsgYmluZEFsbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4uLy4uL3V0aWwvY29uZmlnJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBjb21wYWN0PzogYm9vbGVhbixcbiAgICBjdXN0b21BdHRyaWJ1dGlvbj86IHN0cmluZyB8IEFycmF5PHN0cmluZz5cbn07XG5cbi8qKlxuICogQW4gYEF0dHJpYnV0aW9uQ29udHJvbGAgY29udHJvbCBwcmVzZW50cyB0aGUgbWFwJ3MgW2F0dHJpYnV0aW9uIGluZm9ybWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvYXR0cmlidXRpb24vKS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvbXBhY3RdIElmIGB0cnVlYCBmb3JjZSBhIGNvbXBhY3QgYXR0cmlidXRpb24gdGhhdCBzaG93cyB0aGUgZnVsbCBhdHRyaWJ1dGlvbiBvbiBtb3VzZSBob3Zlciwgb3IgaWYgYGZhbHNlYCBmb3JjZSB0aGUgZnVsbCBhdHRyaWJ1dGlvbiBjb250cm9sLiBUaGUgZGVmYXVsdCBpcyBhIHJlc3BvbnNpdmUgYXR0cmlidXRpb24gdGhhdCBjb2xsYXBzZXMgd2hlbiB0aGUgbWFwIGlzIGxlc3MgdGhhbiA2NDAgcGl4ZWxzIHdpZGUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IFtvcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uXSBTdHJpbmcgb3Igc3RyaW5ncyB0byBzaG93IGluIGFkZGl0aW9uIHRvIGFueSBvdGhlciBhdHRyaWJ1dGlvbnMuXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe2F0dHJpYnV0aW9uQ29udHJvbDogZmFsc2V9KVxuICogICAgIC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5BdHRyaWJ1dGlvbkNvbnRyb2woe1xuICogICAgICAgICBjb21wYWN0OiB0cnVlXG4gKiAgICAgfSkpO1xuICovXG5jbGFzcyBBdHRyaWJ1dGlvbkNvbnRyb2wge1xuICAgIG9wdGlvbnM6IE9wdGlvbnM7XG4gICAgX21hcDogTWFwO1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9pbm5lckNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2VkaXRMaW5rOiA/SFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgX2F0dHJpYkhUTUw6IHN0cmluZztcbiAgICBzdHlsZUlkOiBzdHJpbmc7XG4gICAgc3R5bGVPd25lcjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX3VwZGF0ZUVkaXRMaW5rJyxcbiAgICAgICAgICAgICdfdXBkYXRlRGF0YScsXG4gICAgICAgICAgICAnX3VwZGF0ZUNvbXBhY3QnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdib3R0b20tcmlnaHQnO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBhY3QgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmNvbXBhY3Q7XG5cbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWF0dHJpYicpO1xuICAgICAgICB0aGlzLl9pbm5lckNvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsLWF0dHJpYi1pbm5lcicsIHRoaXMuX2NvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKGNvbXBhY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVBdHRyaWJ1dGlvbnMoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRWRpdExpbmsoKTtcblxuICAgICAgICB0aGlzLl9tYXAub24oJ3N0eWxlZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ3NvdXJjZWRhdGEnLCB0aGlzLl91cGRhdGVEYXRhKTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlRWRpdExpbmspO1xuXG4gICAgICAgIGlmIChjb21wYWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbigncmVzaXplJywgdGhpcy5fdXBkYXRlQ29tcGFjdCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb21wYWN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRhaW5lcik7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9mZignc3R5bGVkYXRhJywgdGhpcy5fdXBkYXRlRGF0YSk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3NvdXJjZWRhdGEnLCB0aGlzLl91cGRhdGVEYXRhKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZigncmVzaXplJywgdGhpcy5fdXBkYXRlQ29tcGFjdCk7XG5cbiAgICAgICAgdGhpcy5fbWFwID0gKHVuZGVmaW5lZDogYW55KTtcbiAgICB9XG5cbiAgICBfdXBkYXRlRWRpdExpbmsoKSB7XG4gICAgICAgIGxldCBlZGl0TGluayA9IHRoaXMuX2VkaXRMaW5rO1xuICAgICAgICBpZiAoIWVkaXRMaW5rKSB7XG4gICAgICAgICAgICBlZGl0TGluayA9IHRoaXMuX2VkaXRMaW5rID0gKHRoaXMuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcubWFwYm94LWltcHJvdmUtbWFwJyk6IGFueSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBbXG4gICAgICAgICAgICB7a2V5OiBcIm93bmVyXCIsIHZhbHVlOiB0aGlzLnN0eWxlT3duZXJ9LFxuICAgICAgICAgICAge2tleTogXCJpZFwiLCB2YWx1ZTogdGhpcy5zdHlsZUlkfSxcbiAgICAgICAgICAgIHtrZXk6IFwiYWNjZXNzX3Rva2VuXCIsIHZhbHVlOiB0aGlzLl9tYXAuX3JlcXVlc3RNYW5hZ2VyLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOfVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChlZGl0TGluaykge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1TdHJpbmcgPSBwYXJhbXMucmVkdWNlKChhY2MsIG5leHQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gYCR7bmV4dC5rZXl9PSR7bmV4dC52YWx1ZX0ke2kgPCBwYXJhbXMubGVuZ3RoIC0gMSA/ICcmJyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCBgP2ApO1xuICAgICAgICAgICAgZWRpdExpbmsuaHJlZiA9IGAke2NvbmZpZy5GRUVEQkFDS19VUkx9LyR7cGFyYW1TdHJpbmd9JHt0aGlzLl9tYXAuX2hhc2ggPyB0aGlzLl9tYXAuX2hhc2guZ2V0SGFzaFN0cmluZyh0cnVlKSA6ICcnfWA7XG4gICAgICAgICAgICBlZGl0TGluay5yZWwgPSBcIm5vb3BlbmVyIG5vZm9sbG93XCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlRGF0YShlOiBhbnkpIHtcbiAgICAgICAgaWYgKGUgJiYgKGUuc291cmNlRGF0YVR5cGUgPT09ICdtZXRhZGF0YScgfHwgZS5kYXRhVHlwZSA9PT0gJ3N0eWxlJykpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlRWRpdExpbmsoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVBdHRyaWJ1dGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwLnN0eWxlKSByZXR1cm47XG4gICAgICAgIGxldCBhdHRyaWJ1dGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucyA9IGF0dHJpYnV0aW9ucy5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbi5tYXAoYXR0cmlidXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGlvbiAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucy5wdXNoKHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwLnN0eWxlLnN0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQ6IGFueSA9IHRoaXMuX21hcC5zdHlsZS5zdHlsZXNoZWV0O1xuICAgICAgICAgICAgdGhpcy5zdHlsZU93bmVyID0gc3R5bGVzaGVldC5vd25lcjtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVJZCA9IHN0eWxlc2hlZXQuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9tYXAuc3R5bGUuc291cmNlQ2FjaGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLnVzZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmF0dHJpYnV0aW9uICYmIGF0dHJpYnV0aW9ucy5pbmRleE9mKHNvdXJjZS5hdHRyaWJ1dGlvbikgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucy5wdXNoKHNvdXJjZS5hdHRyaWJ1dGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFueSBlbnRyaWVzIHRoYXQgYXJlIHN1YnN0cmluZ3Mgb2YgYW5vdGhlciBlbnRyeS5cbiAgICAgICAgLy8gZmlyc3Qgc29ydCBieSBsZW5ndGggc28gdGhhdCBzdWJzdHJpbmdzIGNvbWUgZmlyc3RcbiAgICAgICAgYXR0cmlidXRpb25zLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoIC0gYi5sZW5ndGgpO1xuICAgICAgICBhdHRyaWJ1dGlvbnMgPSBhdHRyaWJ1dGlvbnMuZmlsdGVyKChhdHRyaWIsIGkpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGF0dHJpYnV0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGlvbnNbal0uaW5kZXhPZihhdHRyaWIpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYXR0cmlidXRpb24gc3RyaW5nIGlzIGRpZmZlcmVudCB0byBtaW5pbWl6ZSBET00gY2hhbmdlc1xuICAgICAgICBjb25zdCBhdHRyaWJIVE1MID0gYXR0cmlidXRpb25zLmpvaW4oJyB8ICcpO1xuICAgICAgICBpZiAoYXR0cmliSFRNTCA9PT0gdGhpcy5fYXR0cmliSFRNTCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2F0dHJpYkhUTUwgPSBhdHRyaWJIVE1MO1xuXG4gICAgICAgIGlmIChhdHRyaWJ1dGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9pbm5lckNvbnRhaW5lci5pbm5lckhUTUwgPSBhdHRyaWJIVE1MO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWF0dHJpYi1lbXB0eScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWF0dHJpYi1lbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlbW92ZSBvbGQgRE9NIG5vZGUgZnJvbSBfZWRpdExpbmtcbiAgICAgICAgdGhpcy5fZWRpdExpbmsgPSBudWxsO1xuICAgIH1cblxuICAgIF91cGRhdGVDb21wYWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDw9IDY0MCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXR0cmlidXRpb25Db250cm9sO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5cbmltcG9ydCB7IGJpbmRBbGwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcblxuLyoqXG4gKiBBIGBMb2dvQ29udHJvbGAgaXMgYSBjb250cm9sIHRoYXQgYWRkcyB0aGUgTWFwYm94IHdhdGVybWFya1xuICogdG8gdGhlIG1hcCBhcyByZXF1aXJlZCBieSB0aGUgW3Rlcm1zIG9mIHNlcnZpY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vdG9zLykgZm9yIE1hcGJveFxuICogdmVjdG9yIHRpbGVzIGFuZCBjb3JlIHN0eWxlcy5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcHJpdmF0ZVxuKiovXG5cbmNsYXNzIExvZ29Db250cm9sIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgYmluZEFsbChbJ191cGRhdGVMb2dvJ10sIHRoaXMpO1xuICAgICAgICBiaW5kQWxsKFsnX3VwZGF0ZUNvbXBhY3QnXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCcpO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBET00uY3JlYXRlKCdhJywgJ21hcGJveGdsLWN0cmwtbG9nbycpO1xuICAgICAgICBhbmNob3IudGFyZ2V0ID0gXCJfYmxhbmtcIjtcbiAgICAgICAgYW5jaG9yLnJlbCA9IFwibm9vcGVuZXIgbm9mb2xsb3dcIjtcbiAgICAgICAgYW5jaG9yLmhyZWYgPSBcImh0dHBzOi8vd3d3Lm1hcGJveC5jb20vXCI7XG4gICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiTWFwYm94IGxvZ29cIik7XG4gICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoXCJyZWxcIiwgXCJub29wZW5lciBub2ZvbGxvd1wiKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGFuY2hvcik7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZUxvZ28pO1xuICAgICAgICB0aGlzLl91cGRhdGVMb2dvKCk7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29tcGFjdCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZUxvZ28pO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tLWxlZnQnO1xuICAgIH1cblxuICAgIF91cGRhdGVMb2dvKGU6IGFueSkge1xuICAgICAgICBpZiAoIWUgfHwgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ21ldGFkYXRhJykge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSB0aGlzLl9sb2dvUmVxdWlyZWQoKSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbG9nb1JlcXVpcmVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21hcC5zdHlsZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX21hcC5zdHlsZS5zb3VyY2VDYWNoZXM7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZXNbaWRdLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5tYXBib3hfbG9nbykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF91cGRhdGVDb21wYWN0KCkge1xuICAgICAgICBjb25zdCBjb250YWluZXJDaGlsZHJlbiA9IHRoaXMuX2NvbnRhaW5lci5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGNvbnRhaW5lckNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gY29udGFpbmVyQ2hpbGRyZW5bMF07XG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDwgMjUwKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBMb2dvQ29udHJvbDtcbiIsIi8vIEBmbG93IHN0cmljdFxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5leHBvcnQgdHlwZSBUYXNrSUQgPSBudW1iZXI7IC8vIGNhbid0IG1hcmsgb3BhcXVlIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vZmxvd3R5cGUvZmxvdy1yZW1vdmUtdHlwZXMvcHVsbC82MVxudHlwZSBUYXNrID0ge1xuICAgIGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAgIGlkOiBUYXNrSUQ7XG4gICAgY2FuY2VsbGVkOiBib29sZWFuO1xufTtcblxuY2xhc3MgVGFza1F1ZXVlIHtcbiAgICBfcXVldWU6IEFycmF5PFRhc2s+O1xuICAgIF9pZDogVGFza0lEO1xuICAgIF9jbGVhcmVkOiBib29sZWFuO1xuICAgIF9jdXJyZW50bHlSdW5uaW5nOiBBcnJheTxUYXNrPiB8IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoKSAge1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl9pZCA9IDA7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5UnVubmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZChjYWxsYmFjazogKCkgPT4gdm9pZCk6IFRhc2tJRCB7XG4gICAgICAgIGNvbnN0IGlkID0gKyt0aGlzLl9pZDtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICAgICAgcXVldWUucHVzaCh7Y2FsbGJhY2ssIGlkLCBjYW5jZWxsZWQ6IGZhbHNlfSk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICByZW1vdmUoaWQ6IFRhc2tJRCkge1xuICAgICAgICBjb25zdCBydW5uaW5nID0gdGhpcy5fY3VycmVudGx5UnVubmluZztcbiAgICAgICAgY29uc3QgcXVldWUgPSBydW5uaW5nID8gdGhpcy5fcXVldWUuY29uY2F0KHJ1bm5pbmcpIDogdGhpcy5fcXVldWU7XG4gICAgICAgIGZvciAoY29uc3QgdGFzayBvZiBxdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRhc2suaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgdGFzay5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJ1bigpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLl9jdXJyZW50bHlSdW5uaW5nKTtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLl9jdXJyZW50bHlSdW5uaW5nID0gdGhpcy5fcXVldWU7XG5cbiAgICAgICAgLy8gVGFza3MgcXVldWVkIGJ5IGNhbGxiYWNrcyBpbiB0aGUgY3VycmVudCBxdWV1ZSBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICAgICAgLy8gb24gdGhlIG5leHQgcnVuLCBub3QgdGhlIGN1cnJlbnQgcnVuLlxuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGFzayBvZiBxdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRhc2suY2FuY2VsbGVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRhc2suY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbGVhcmVkKSBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NsZWFyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5UnVubmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudGx5UnVubmluZykge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRhc2tRdWV1ZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgZXh0ZW5kLCBiaW5kQWxsLCB3YXJuT25jZSwgdW5pcXVlSWQgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cnO1xuY29uc3QgeyBIVE1MSW1hZ2VFbGVtZW50LCBIVE1MRWxlbWVudCB9ID0gd2luZG93O1xuaW1wb3J0IERPTSBmcm9tICcuLi91dGlsL2RvbSc7XG5pbXBvcnQgeyBnZXRJbWFnZSwgZ2V0SlNPTiwgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCB7IFJlcXVlc3RNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbC9tYXBib3gnO1xuaW1wb3J0IFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXInO1xuaW1wb3J0IFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCBIYXNoIGZyb20gJy4vaGFzaCc7XG5pbXBvcnQgYmluZEhhbmRsZXJzIGZyb20gJy4vYmluZF9oYW5kbGVycyc7XG5pbXBvcnQgQ2FtZXJhIGZyb20gJy4vY2FtZXJhJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IEF0dHJpYnV0aW9uQ29udHJvbCBmcm9tICcuL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbCc7XG5pbXBvcnQgTG9nb0NvbnRyb2wgZnJvbSAnLi9jb250cm9sL2xvZ29fY29udHJvbCc7XG5pbXBvcnQgaXNTdXBwb3J0ZWQgZnJvbSAnQG1hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkJztcbmltcG9ydCB7IFJHQkFJbWFnZSB9IGZyb20gJy4uL3V0aWwvaW1hZ2UnO1xuaW1wb3J0IHsgRXZlbnQsIEVycm9yRXZlbnQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHsgTWFwTW91c2VFdmVudCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCBUYXNrUXVldWUgZnJvbSAnLi4vdXRpbC90YXNrX3F1ZXVlJztcbmltcG9ydCB3ZWJwU3VwcG9ydGVkIGZyb20gJy4uL3V0aWwvd2VicF9zdXBwb3J0ZWQnO1xuaW1wb3J0IHsgc2V0Q2FjaGVMaW1pdHMgfSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZSc7XG5cbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL21hcGJveCc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdEJvdW5kc0xpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0X2JvdW5kcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVPcHRpb25zLCBTdHlsZVNldHRlck9wdGlvbnN9IGZyb20gJy4uL3N0eWxlL3N0eWxlJztcbmltcG9ydCB0eXBlIHtNYXBFdmVudCwgTWFwRGF0YUV2ZW50fSBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZUludGVyZmFjZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UnO1xuXG5pbXBvcnQgdHlwZSBTY3JvbGxab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2Nyb2xsX3pvb20nO1xuaW1wb3J0IHR5cGUgQm94Wm9vbUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL2JveF96b29tJztcbmltcG9ydCB0eXBlIERyYWdSb3RhdGVIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9kcmFnX3JvdGF0ZSc7XG5pbXBvcnQgdHlwZSBEcmFnUGFuSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvZHJhZ19wYW4nO1xuaW1wb3J0IHR5cGUgS2V5Ym9hcmRIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9rZXlib2FyZCc7XG5pbXBvcnQgdHlwZSBEb3VibGVDbGlja1pvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9kYmxjbGlja196b29tJztcbmltcG9ydCB0eXBlIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlJztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uL3V0aWwvdGFza19xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTGF5ZXJTcGVjaWZpY2F0aW9uLFxuICAgIEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgU3R5bGVTcGVjaWZpY2F0aW9uLFxuICAgIExpZ2h0U3BlY2lmaWNhdGlvbixcbiAgICBTb3VyY2VTcGVjaWZpY2F0aW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG50eXBlIENvbnRyb2xQb3NpdGlvbiA9ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tbGVmdCcgfCAnYm90dG9tLXJpZ2h0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG50eXBlIElDb250cm9sID0ge1xuICAgIG9uQWRkKG1hcDogTWFwKTogSFRNTEVsZW1lbnQ7XG4gICAgb25SZW1vdmUobWFwOiBNYXApOiB2b2lkO1xuXG4gICAgK2dldERlZmF1bHRQb3NpdGlvbj86ICgpID0+IENvbnRyb2xQb3NpdGlvbjtcbn1cbi8qIGVzbGludC1lbmFibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cblxudHlwZSBNYXBPcHRpb25zID0ge1xuICAgIGhhc2g/OiBib29sZWFuLFxuICAgIGludGVyYWN0aXZlPzogYm9vbGVhbixcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50IHwgc3RyaW5nLFxuICAgIGJlYXJpbmdTbmFwPzogbnVtYmVyLFxuICAgIGF0dHJpYnV0aW9uQ29udHJvbD86IGJvb2xlYW4sXG4gICAgY3VzdG9tQXR0cmlidXRpb24/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+LFxuICAgIGxvZ29Qb3NpdGlvbj86IENvbnRyb2xQb3NpdGlvbixcbiAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PzogYm9vbGVhbixcbiAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI/OiBib29sZWFuLFxuICAgIGFudGlhbGlhcz86IGJvb2xlYW4sXG4gICAgcmVmcmVzaEV4cGlyZWRUaWxlcz86IGJvb2xlYW4sXG4gICAgbWF4Qm91bmRzPzogTG5nTGF0Qm91bmRzTGlrZSxcbiAgICBzY3JvbGxab29tPzogYm9vbGVhbixcbiAgICBtaW5ab29tPzogP251bWJlcixcbiAgICBtYXhab29tPzogP251bWJlcixcbiAgICBib3hab29tPzogYm9vbGVhbixcbiAgICBkcmFnUm90YXRlPzogYm9vbGVhbixcbiAgICBkcmFnUGFuPzogYm9vbGVhbixcbiAgICBrZXlib2FyZD86IGJvb2xlYW4sXG4gICAgZG91YmxlQ2xpY2tab29tPzogYm9vbGVhbixcbiAgICB0b3VjaFpvb21Sb3RhdGU/OiBib29sZWFuLFxuICAgIHRyYWNrUmVzaXplPzogYm9vbGVhbixcbiAgICBjZW50ZXI/OiBMbmdMYXRMaWtlLFxuICAgIHpvb20/OiBudW1iZXIsXG4gICAgYmVhcmluZz86IG51bWJlcixcbiAgICBwaXRjaD86IG51bWJlcixcbiAgICByZW5kZXJXb3JsZENvcGllcz86IGJvb2xlYW4sXG4gICAgbWF4VGlsZUNhY2hlU2l6ZT86IG51bWJlcixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0PzogUmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uLFxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmdcbn07XG5cbmNvbnN0IGRlZmF1bHRNaW5ab29tID0gMDtcbmNvbnN0IGRlZmF1bHRNYXhab29tID0gMjI7XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBjZW50ZXI6IFswLCAwXSxcbiAgICB6b29tOiAwLFxuICAgIGJlYXJpbmc6IDAsXG4gICAgcGl0Y2g6IDAsXG5cbiAgICBtaW5ab29tOiBkZWZhdWx0TWluWm9vbSxcbiAgICBtYXhab29tOiBkZWZhdWx0TWF4Wm9vbSxcblxuICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgIHNjcm9sbFpvb206IHRydWUsXG4gICAgYm94Wm9vbTogdHJ1ZSxcbiAgICBkcmFnUm90YXRlOiB0cnVlLFxuICAgIGRyYWdQYW46IHRydWUsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgZG91YmxlQ2xpY2tab29tOiB0cnVlLFxuICAgIHRvdWNoWm9vbVJvdGF0ZTogdHJ1ZSxcblxuICAgIGJlYXJpbmdTbmFwOiA3LFxuICAgIGNsaWNrVG9sZXJhbmNlOiAzLFxuXG4gICAgaGFzaDogZmFsc2UsXG4gICAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxuXG4gICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogZmFsc2UsXG4gICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgICB0cmFja1Jlc2l6ZTogdHJ1ZSxcbiAgICByZW5kZXJXb3JsZENvcGllczogdHJ1ZSxcbiAgICByZWZyZXNoRXhwaXJlZFRpbGVzOiB0cnVlLFxuICAgIG1heFRpbGVDYWNoZVNpemU6IG51bGwsXG4gICAgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiAnc2Fucy1zZXJpZicsXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogbnVsbCxcbiAgICBhY2Nlc3NUb2tlbjogbnVsbCxcbiAgICBmYWRlRHVyYXRpb246IDMwMCxcbiAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IHRydWVcbn07XG5cbi8qKlxuICogVGhlIGBNYXBgIG9iamVjdCByZXByZXNlbnRzIHRoZSBtYXAgb24geW91ciBwYWdlLiBJdCBleHBvc2VzIG1ldGhvZHNcbiAqIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlIHlvdSB0byBwcm9ncmFtbWF0aWNhbGx5IGNoYW5nZSB0aGUgbWFwLFxuICogYW5kIGZpcmVzIGV2ZW50cyBhcyB1c2VycyBpbnRlcmFjdCB3aXRoIGl0LlxuICpcbiAqIFlvdSBjcmVhdGUgYSBgTWFwYCBieSBzcGVjaWZ5aW5nIGEgYGNvbnRhaW5lcmAgYW5kIG90aGVyIG9wdGlvbnMuXG4gKiBUaGVuIE1hcGJveCBHTCBKUyBpbml0aWFsaXplcyB0aGUgbWFwIG9uIHRoZSBwYWdlIGFuZCByZXR1cm5zIHlvdXIgYE1hcGBcbiAqIG9iamVjdC5cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudGVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IG9wdGlvbnMuY29udGFpbmVyIFRoZSBIVE1MIGVsZW1lbnQgaW4gd2hpY2ggTWFwYm94IEdMIEpTIHdpbGwgcmVuZGVyIHRoZSBtYXAsIG9yIHRoZSBlbGVtZW50J3Mgc3RyaW5nIGBpZGAuIFRoZSBzcGVjaWZpZWQgZWxlbWVudCBtdXN0IGhhdmUgbm8gY2hpbGRyZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbT0wXSBUaGUgbWluaW11bSB6b29tIGxldmVsIG9mIHRoZSBtYXAgKDAtMjQpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb209MjJdIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgb2YgdGhlIG1hcCAoMC0yNCkuXG4gKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IFtvcHRpb25zLnN0eWxlXSBUaGUgbWFwJ3MgTWFwYm94IHN0eWxlLiBUaGlzIG11c3QgYmUgYW4gYSBKU09OIG9iamVjdCBjb25mb3JtaW5nIHRvXG4gKiB0aGUgc2NoZW1hIGRlc2NyaWJlZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL21hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKSwgb3IgYSBVUkwgdG9cbiAqIHN1Y2ggSlNPTi5cbiAqXG4gKiBUbyBsb2FkIGEgc3R5bGUgZnJvbSB0aGUgTWFwYm94IEFQSSwgeW91IGNhbiB1c2UgYSBVUkwgb2YgdGhlIGZvcm0gYG1hcGJveDovL3N0eWxlcy86b3duZXIvOnN0eWxlYCxcbiAqIHdoZXJlIGA6b3duZXJgIGlzIHlvdXIgTWFwYm94IGFjY291bnQgbmFtZSBhbmQgYDpzdHlsZWAgaXMgdGhlIHN0eWxlIElELiBPciB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZ1xuICogW3RoZSBwcmVkZWZpbmVkIE1hcGJveCBzdHlsZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwcy8pOlxuICpcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3N0cmVldHMtdjEwYFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvb3V0ZG9vcnMtdjEwYFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvbGlnaHQtdjlgXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9kYXJrLXY5YFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvc2F0ZWxsaXRlLXY5YFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvc2F0ZWxsaXRlLXN0cmVldHMtdjEwYFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvbmF2aWdhdGlvbi1wcmV2aWV3LWRheS12MmBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L25hdmlnYXRpb24tcHJldmlldy1uaWdodC12MmBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L25hdmlnYXRpb24tZ3VpZGFuY2UtZGF5LXYyYFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvbmF2aWdhdGlvbi1ndWlkYW5jZS1uaWdodC12MmBcbiAqXG4gKiBUaWxlc2V0cyBob3N0ZWQgd2l0aCBNYXBib3ggY2FuIGJlIHN0eWxlLW9wdGltaXplZCBpZiB5b3UgYXBwZW5kIGA/b3B0aW1pemU9dHJ1ZWAgdG8gdGhlIGVuZCBvZiB5b3VyIHN0eWxlIFVSTCwgbGlrZSBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXY5P29wdGltaXplPXRydWVgLlxuICogTGVhcm4gbW9yZSBhYm91dCBzdHlsZS1vcHRpbWl6ZWQgdmVjdG9yIHRpbGVzIGluIG91ciBbQVBJIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vbWFwcy8jcmV0cmlldmUtdGlsZXMpLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaGFzaD1mYWxzZV0gSWYgYHRydWVgLCB0aGUgbWFwJ3MgcG9zaXRpb24gKHpvb20sIGNlbnRlciBsYXRpdHVkZSwgY2VudGVyIGxvbmdpdHVkZSwgYmVhcmluZywgYW5kIHBpdGNoKSB3aWxsIGJlIHN5bmNlZCB3aXRoIHRoZSBoYXNoIGZyYWdtZW50IG9mIHRoZSBwYWdlJ3MgVVJMLlxuICogICBGb3IgZXhhbXBsZSwgYGh0dHA6Ly9wYXRoL3RvL215L3BhZ2UuaHRtbCMyLjU5LzM5LjI2LzUzLjA3Ly0yNC4xLzYwYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW50ZXJhY3RpdmU9dHJ1ZV0gSWYgYGZhbHNlYCwgbm8gbW91c2UsIHRvdWNoLCBvciBrZXlib2FyZCBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgbWFwLCBzbyBpdCB3aWxsIG5vdCByZXNwb25kIHRvIGludGVyYWN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmdTbmFwPTddIFRoZSB0aHJlc2hvbGQsIG1lYXN1cmVkIGluIGRlZ3JlZXMsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSBtYXAnc1xuICogICBiZWFyaW5nIHdpbGwgc25hcCB0byBub3J0aC4gRm9yIGV4YW1wbGUsIHdpdGggYSBgYmVhcmluZ1NuYXBgIG9mIDcsIGlmIHRoZSB1c2VyIHJvdGF0ZXNcbiAqICAgdGhlIG1hcCB3aXRoaW4gNyBkZWdyZWVzIG9mIG5vcnRoLCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSBzbmFwIHRvIGV4YWN0IG5vcnRoLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5waXRjaFdpdGhSb3RhdGU9dHJ1ZV0gSWYgYGZhbHNlYCwgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBjb250cm9sIHdpdGggXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY2xpY2tUb2xlcmFuY2U9M10gVGhlIG1heCBudW1iZXIgb2YgcGl4ZWxzIGEgdXNlciBjYW4gc2hpZnQgdGhlIG1vdXNlIHBvaW50ZXIgZHVyaW5nIGEgY2xpY2sgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBjbGljayAoYXMgb3Bwb3NlZCB0byBhIG1vdXNlIGRyYWcpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2w9dHJ1ZV0gSWYgYHRydWVgLCBhbiB7QGxpbmsgQXR0cmlidXRpb25Db250cm9sfSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtYXAuXG4gKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IFtvcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uXSBTdHJpbmcgb3Igc3RyaW5ncyB0byBzaG93IGluIGFuIHtAbGluayBBdHRyaWJ1dGlvbkNvbnRyb2x9LiBPbmx5IGFwcGxpY2FibGUgaWYgYG9wdGlvbnMuYXR0cmlidXRpb25Db250cm9sYCBpcyBgdHJ1ZWAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9nb1Bvc2l0aW9uPSdib3R0b20tbGVmdCddIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIE1hcGJveCB3b3JkbWFyayBvbiB0aGUgbWFwLiBWYWxpZCBvcHRpb25zIGFyZSBgdG9wLWxlZnRgLGB0b3AtcmlnaHRgLCBgYm90dG9tLWxlZnRgLCBgYm90dG9tLXJpZ2h0YC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gSWYgYHRydWVgLCBtYXAgY3JlYXRpb24gd2lsbCBmYWlsIGlmIHRoZSBwZXJmb3JtYW5jZSBvZiBNYXBib3hcbiAqICAgR0wgSlMgd291bGQgYmUgZHJhbWF0aWNhbGx5IHdvcnNlIHRoYW4gZXhwZWN0ZWQgKGkuZS4gYSBzb2Z0d2FyZSByZW5kZXJlciB3b3VsZCBiZSB1c2VkKS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAncyBjYW52YXMgY2FuIGJlIGV4cG9ydGVkIHRvIGEgUE5HIHVzaW5nIGBtYXAuZ2V0Q2FudmFzKCkudG9EYXRhVVJMKClgLiBUaGlzIGlzIGBmYWxzZWAgYnkgZGVmYXVsdCBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYW50aWFsaWFzXSBJZiBgdHJ1ZWAsIHRoZSBnbCBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIE1TQUEgYW50aWFsaWFzaW5nLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciBhbnRpYWxpYXNpbmcgY3VzdG9tIGxheWVycy4gdGhpcyBpcyBgZmFsc2VgIGJ5IGRlZmF1bHQgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJlZnJlc2hFeHBpcmVkVGlsZXM9dHJ1ZV0gSWYgYGZhbHNlYCwgdGhlIG1hcCB3b24ndCBhdHRlbXB0IHRvIHJlLXJlcXVlc3QgdGlsZXMgb25jZSB0aGV5IGV4cGlyZSBwZXIgdGhlaXIgSFRUUCBgY2FjaGVDb250cm9sYC9gZXhwaXJlc2AgaGVhZGVycy5cbiAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZX0gW29wdGlvbnMubWF4Qm91bmRzXSBJZiBzZXQsIHRoZSBtYXAgd2lsbCBiZSBjb25zdHJhaW5lZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxuICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gW29wdGlvbnMuc2Nyb2xsWm9vbT10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC4gQW4gYE9iamVjdGAgdmFsdWUgaXMgcGFzc2VkIGFzIG9wdGlvbnMgdG8ge0BsaW5rIFNjcm9sbFpvb21IYW5kbGVyI2VuYWJsZX0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmJveFpvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgQm94Wm9vbUhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZHJhZ1JvdGF0ZT10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZCAoc2VlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kcmFnUGFuPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUge0BsaW5rIERyYWdQYW5IYW5kbGVyfSkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmtleWJvYXJkPXRydWVdIElmIGB0cnVlYCwga2V5Ym9hcmQgc2hvcnRjdXRzIGFyZSBlbmFibGVkIChzZWUge0BsaW5rIEtleWJvYXJkSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kb3VibGVDbGlja1pvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgRG91YmxlQ2xpY2tab29tSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gW29wdGlvbnMudG91Y2hab29tUm90YXRlPXRydWVdIElmIGB0cnVlYCwgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC4gQW4gYE9iamVjdGAgdmFsdWUgaXMgcGFzc2VkIGFzIG9wdGlvbnMgdG8ge0BsaW5rIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIjZW5hYmxlfS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhY2tSZXNpemU9dHJ1ZV0gIElmIGB0cnVlYCwgdGhlIG1hcCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzaXplIHdoZW4gdGhlIGJyb3dzZXIgd2luZG93IHJlc2l6ZXMuXG4gKiBAcGFyYW0ge0xuZ0xhdExpa2V9IFtvcHRpb25zLmNlbnRlcj1bMCwgMF1dIFRoZSBpbml0YWwgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50IG9mIHRoZSBtYXAuIElmIGBjZW50ZXJgIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgWzAsIDBdYCBOb3RlOiBNYXBib3ggR0wgdXNlcyBsb25naXR1ZGUsIGxhdGl0dWRlIGNvb3JkaW5hdGUgb3JkZXIgKGFzIG9wcG9zZWQgdG8gbGF0aXR1ZGUsIGxvbmdpdHVkZSkgdG8gbWF0Y2ggR2VvSlNPTi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy56b29tPTBdIFRoZSBpbml0aWFsIHpvb20gbGV2ZWwgb2YgdGhlIG1hcC4gSWYgYHpvb21gIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgMGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZz0wXSBUaGUgaW5pdGlhbCBiZWFyaW5nIChyb3RhdGlvbikgb2YgdGhlIG1hcCwgbWVhc3VyZWQgaW4gZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIG5vcnRoLiBJZiBgYmVhcmluZ2AgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucywgTWFwYm94IEdMIEpTIHdpbGwgbG9vayBmb3IgaXQgaW4gdGhlIG1hcCdzIHN0eWxlIG9iamVjdC4gSWYgaXQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgc3R5bGUsIGVpdGhlciwgaXQgd2lsbCBkZWZhdWx0IHRvIGAwYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5waXRjaD0wXSBUaGUgaW5pdGlhbCBwaXRjaCAodGlsdCkgb2YgdGhlIG1hcCwgbWVhc3VyZWQgaW4gZGVncmVlcyBhd2F5IGZyb20gdGhlIHBsYW5lIG9mIHRoZSBzY3JlZW4gKDAtNjApLiBJZiBgcGl0Y2hgIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgMGAuXG4gKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IFtvcHRpb25zLmJvdW5kc10gVGhlIGluaXRpYWwgYm91bmRzIG9mIHRoZSBtYXAuIElmIGBib3VuZHNgIGlzIHNwZWNpZmllZCwgaXQgb3ZlcnJpZGVzIGBjZW50ZXJgIGFuZCBgem9vbWAgY29uc3RydWN0b3Igb3B0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maXRCb3VuZHNPcHRpb25zXSBBIFtgZml0Qm91bmRzYF0oI21hcCNmaXRib3VuZHMpIG9wdGlvbnMgb2JqZWN0IHRvIHVzZSBfb25seV8gd2hlbiBmaXR0aW5nIHRoZSBpbml0aWFsIGBib3VuZHNgIHByb3ZpZGVkIGFib3ZlLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllcz10cnVlXSAgSWYgYHRydWVgLCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHdvcmxkIHdpbGwgYmUgcmVuZGVyZWQsIHdoZW4gem9vbWVkIG91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhUaWxlQ2FjaGVTaXplPW51bGxdICBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGlsZXMgc3RvcmVkIGluIHRoZSB0aWxlIGNhY2hlIGZvciBhIGdpdmVuIHNvdXJjZS4gSWYgb21pdHRlZCwgdGhlIGNhY2hlIHdpbGwgYmUgZHluYW1pY2FsbHkgc2l6ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld3BvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5PSdzYW5zLXNlcmlmJ10gRGVmaW5lcyBhIENTU1xuICogICBmb250LWZhbWlseSBmb3IgbG9jYWxseSBvdmVycmlkaW5nIGdlbmVyYXRpb24gb2YgZ2x5cGhzIGluIHRoZSAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocycsICdIaXJhZ2FuYScsICdLYXRha2FuYScgYW5kICdIYW5ndWwgU3lsbGFibGVzJyByYW5nZXMuXG4gKiAgIEluIHRoZXNlIHJhbmdlcywgZm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSB3aWxsIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgZm9udC13ZWlnaHQga2V5d29yZHMgKGxpZ2h0L3JlZ3VsYXIvbWVkaXVtL2JvbGQpLlxuICogICBTZXQgdG8gYGZhbHNlYCwgdG8gZW5hYmxlIGZvbnQgc2V0dGluZ3MgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUgZm9yIHRoZXNlIGdseXBoIHJhbmdlcy4gIE5vdGUgdGhhdCBbTWFwYm94IFN0dWRpb10oaHR0cHM6Ly9zdHVkaW8ubWFwYm94LmNvbS8pIHNldHMgdGhpcyB2YWx1ZSB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXG4gKiAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3B0aW9uIGlzIHRvIGF2b2lkIGJhbmR3aWR0aC1pbnRlbnNpdmUgZ2x5cGggc2VydmVyIHJlcXVlc3RzLiAoU2VlIFtVc2UgbG9jYWxseSBnZW5lcmF0ZWQgaWRlb2dyYXBoc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9sb2NhbC1pZGVvZ3JhcGhzKS4pXG4gKiBAcGFyYW0ge1JlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbn0gW29wdGlvbnMudHJhbnNmb3JtUmVxdWVzdD1udWxsXSBBIGNhbGxiYWNrIHJ1biBiZWZvcmUgdGhlIE1hcCBtYWtlcyBhIHJlcXVlc3QgZm9yIGFuIGV4dGVybmFsIFVSTC4gVGhlIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgdXJsLCBzZXQgaGVhZGVycywgb3Igc2V0IHRoZSBjcmVkZW50aWFscyBwcm9wZXJ0eSBmb3IgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzLlxuICogICBFeHBlY3RlZCB0byByZXR1cm4gYW4gb2JqZWN0IHdpdGggYSBgdXJsYCBwcm9wZXJ0eSBhbmQgb3B0aW9uYWxseSBgaGVhZGVyc2AgYW5kIGBjcmVkZW50aWFsc2AgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY29sbGVjdFJlc291cmNlVGltaW5nPWZhbHNlXSBJZiBgdHJ1ZWAsIFJlc291cmNlIFRpbWluZyBBUEkgaW5mb3JtYXRpb24gd2lsbCBiZSBjb2xsZWN0ZWQgZm9yIHJlcXVlc3RzIG1hZGUgYnkgR2VvSlNPTiBhbmQgVmVjdG9yIFRpbGUgd2ViIHdvcmtlcnMgKHRoaXMgaW5mb3JtYXRpb24gaXMgbm9ybWFsbHkgaW5hY2Nlc3NpYmxlIGZyb20gdGhlIG1haW4gSmF2YXNjcmlwdCB0aHJlYWQpLiBJbmZvcm1hdGlvbiB3aWxsIGJlIHJldHVybmVkIGluIGEgYHJlc291cmNlVGltaW5nYCBwcm9wZXJ0eSBvZiByZWxldmFudCBgZGF0YWAgZXZlbnRzLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmZhZGVEdXJhdGlvbj0zMDBdIENvbnRyb2xzIHRoZSBkdXJhdGlvbiBvZiB0aGUgZmFkZS1pbi9mYWRlLW91dCBhbmltYXRpb24gZm9yIGxhYmVsIGNvbGxpc2lvbnMsIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzZXR0aW5nIGFmZmVjdHMgYWxsIHN5bWJvbCBsYXllcnMuIFRoaXMgc2V0dGluZyBkb2VzIG5vdCBhZmZlY3QgdGhlIGR1cmF0aW9uIG9mIHJ1bnRpbWUgc3R5bGluZyB0cmFuc2l0aW9ucyBvciByYXN0ZXIgdGlsZSBjcm9zcy1mYWRpbmcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNyb3NzU291cmNlQ29sbGlzaW9ucz10cnVlXSBJZiBgdHJ1ZWAsIHN5bWJvbHMgZnJvbSBtdWx0aXBsZSBzb3VyY2VzIGNhbiBjb2xsaWRlIHdpdGggZWFjaCBvdGhlciBkdXJpbmcgY29sbGlzaW9uIGRldGVjdGlvbi4gSWYgYGZhbHNlYCwgY29sbGlzaW9uIGRldGVjdGlvbiBpcyBydW4gc2VwYXJhdGVseSBmb3IgdGhlIHN5bWJvbHMgaW4gZWFjaCBzb3VyY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYWNjZXNzVG9rZW49bnVsbF0gSWYgc3BlY2lmaWVkLCBtYXAgd2lsbCB1c2UgdGhpcyB0b2tlbiBpbnN0ZWFkIG9mIHRoZSBvbmUgZGVmaW5lZCBpbiBtYXBib3hnbC5hY2Nlc3NUb2tlbi5cblxuICogQGV4YW1wbGVcbiAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHtcbiAqICAgY29udGFpbmVyOiAnbWFwJyxcbiAqICAgY2VudGVyOiBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN10sXG4gKiAgIHpvb206IDEzLFxuICogICBzdHlsZTogc3R5bGVfb2JqZWN0LFxuICogICBoYXNoOiB0cnVlLFxuICogICB0cmFuc2Zvcm1SZXF1ZXN0OiAodXJsLCByZXNvdXJjZVR5cGUpPT4ge1xuICogICAgIGlmKHJlc291cmNlVHlwZSA9PT0gJ1NvdXJjZScgJiYgdXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly9teUhvc3QnKSkge1xuICogICAgICAgcmV0dXJuIHtcbiAqICAgICAgICB1cmw6IHVybC5yZXBsYWNlKCdodHRwJywgJ2h0dHBzJyksXG4gKiAgICAgICAgaGVhZGVyczogeyAnbXktY3VzdG9tLWhlYWRlcic6IHRydWV9LFxuICogICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScgIC8vIEluY2x1ZGUgY29va2llcyBmb3IgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzXG4gKiAgICAgIH1cbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogQHNlZSBbRGlzcGxheSBhIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZXMvKVxuICovXG5jbGFzcyBNYXAgZXh0ZW5kcyBDYW1lcmEge1xuICAgIHN0eWxlOiBTdHlsZTtcbiAgICBwYWludGVyOiBQYWludGVyO1xuXG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX21pc3NpbmdDU1NDYW5hcnk6IEhUTUxFbGVtZW50O1xuICAgIF9jYW52YXNDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9jb250cm9sQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfY29udHJvbFBvc2l0aW9uczoge1tzdHJpbmddOiBIVE1MRWxlbWVudH07XG4gICAgX2ludGVyYWN0aXZlOiA/Ym9vbGVhbjtcbiAgICBfc2hvd1RpbGVCb3VuZGFyaWVzOiA/Ym9vbGVhbjtcbiAgICBfc2hvd0NvbGxpc2lvbkJveGVzOiA/Ym9vbGVhbjtcbiAgICBfc2hvd092ZXJkcmF3SW5zcGVjdG9yOiBib29sZWFuO1xuICAgIF9yZXBhaW50OiA/Ym9vbGVhbjtcbiAgICBfdmVydGljZXM6ID9ib29sZWFuO1xuICAgIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIF9tYXhUaWxlQ2FjaGVTaXplOiBudW1iZXI7XG4gICAgX2ZyYW1lOiA/Q2FuY2VsYWJsZTtcbiAgICBfc3R5bGVEaXJ0eTogP2Jvb2xlYW47XG4gICAgX3NvdXJjZXNEaXJ0eTogP2Jvb2xlYW47XG4gICAgX3BsYWNlbWVudERpcnR5OiA/Ym9vbGVhbjtcbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIF90cmFja1Jlc2l6ZTogYm9vbGVhbjtcbiAgICBfcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBib29sZWFuO1xuICAgIF9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiBib29sZWFuO1xuICAgIF9hbnRpYWxpYXM6IGJvb2xlYW47XG4gICAgX3JlZnJlc2hFeHBpcmVkVGlsZXM6IGJvb2xlYW47XG4gICAgX2hhc2g6IEhhc2g7XG4gICAgX2RlbGVnYXRlZExpc3RlbmVyczogYW55O1xuICAgIF9mYWRlRHVyYXRpb246IG51bWJlcjtcbiAgICBfY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuO1xuICAgIF9jcm9zc0ZhZGluZ0ZhY3RvcjogbnVtYmVyO1xuICAgIF9jb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XG4gICAgX3JlbmRlclRhc2tRdWV1ZTogVGFza1F1ZXVlO1xuICAgIF9jb250cm9sczogQXJyYXk8SUNvbnRyb2w+O1xuICAgIF9tYXBJZDogbnVtYmVyO1xuICAgIF9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IHN0cmluZztcbiAgICBfcmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBTY3JvbGxab29tSGFuZGxlcn0sIHdoaWNoIGltcGxlbWVudHMgem9vbWluZyBpbiBhbmQgb3V0IHdpdGggYSBzY3JvbGwgd2hlZWwgb3IgdHJhY2twYWQuXG4gICAgICovXG4gICAgc2Nyb2xsWm9vbTogU2Nyb2xsWm9vbUhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIEJveFpvb21IYW5kbGVyfSwgd2hpY2ggaW1wbGVtZW50cyB6b29taW5nIHVzaW5nIGEgZHJhZyBnZXN0dXJlIHdpdGggdGhlIFNoaWZ0IGtleSBwcmVzc2VkLlxuICAgICAqL1xuICAgIGJveFpvb206IEJveFpvb21IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0sIHdoaWNoIGltcGxlbWVudHMgcm90YXRpbmcgdGhlIG1hcCB3aGlsZSBkcmFnZ2luZyB3aXRoIHRoZSByaWdodFxuICAgICAqIG1vdXNlIGJ1dHRvbiBvciB3aXRoIHRoZSBDb250cm9sIGtleSBwcmVzc2VkLlxuICAgICAqL1xuICAgIGRyYWdSb3RhdGU6IERyYWdSb3RhdGVIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBEcmFnUGFuSGFuZGxlcn0sIHdoaWNoIGltcGxlbWVudHMgZHJhZ2dpbmcgdGhlIG1hcCB3aXRoIGEgbW91c2Ugb3IgdG91Y2ggZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBkcmFnUGFuOiBEcmFnUGFuSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgS2V5Ym9hcmRIYW5kbGVyfSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20sIHJvdGF0ZSwgYW5kIHBhbiB0aGUgbWFwIHVzaW5nIGtleWJvYXJkXG4gICAgICogc2hvcnRjdXRzLlxuICAgICAqL1xuICAgIGtleWJvYXJkOiBLZXlib2FyZEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIERvdWJsZUNsaWNrWm9vbUhhbmRsZXJ9LCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSBieSBkb3VibGUgY2xpY2tpbmcuXG4gICAgICovXG4gICAgZG91YmxlQ2xpY2tab29tOiBEb3VibGVDbGlja1pvb21IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyfSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gb3Igcm90YXRlIHRoZSBtYXAgd2l0aCB0b3VjaCBnZXN0dXJlcy5cbiAgICAgKi9cbiAgICB0b3VjaFpvb21Sb3RhdGU6IFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYXBPcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5taW5ab29tICE9IG51bGwgJiYgb3B0aW9ucy5tYXhab29tICE9IG51bGwgJiYgb3B0aW9ucy5taW5ab29tID4gb3B0aW9ucy5tYXhab29tKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heFpvb20gbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluWm9vbWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShvcHRpb25zLm1pblpvb20sIG9wdGlvbnMubWF4Wm9vbSwgb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllcyk7XG4gICAgICAgIHN1cGVyKHRyYW5zZm9ybSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5faW50ZXJhY3RpdmUgPSBvcHRpb25zLmludGVyYWN0aXZlO1xuICAgICAgICB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gb3B0aW9ucy5tYXhUaWxlQ2FjaGVTaXplO1xuICAgICAgICB0aGlzLl9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O1xuICAgICAgICB0aGlzLl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBvcHRpb25zLnByZXNlcnZlRHJhd2luZ0J1ZmZlcjtcbiAgICAgICAgdGhpcy5fYW50aWFsaWFzID0gb3B0aW9ucy5hbnRpYWxpYXM7XG4gICAgICAgIHRoaXMuX3RyYWNrUmVzaXplID0gb3B0aW9ucy50cmFja1Jlc2l6ZTtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwO1xuICAgICAgICB0aGlzLl9yZWZyZXNoRXhwaXJlZFRpbGVzID0gb3B0aW9ucy5yZWZyZXNoRXhwaXJlZFRpbGVzO1xuICAgICAgICB0aGlzLl9mYWRlRHVyYXRpb24gPSBvcHRpb25zLmZhZGVEdXJhdGlvbjtcbiAgICAgICAgdGhpcy5fY3Jvc3NTb3VyY2VDb2xsaXNpb25zID0gb3B0aW9ucy5jcm9zc1NvdXJjZUNvbGxpc2lvbnM7XG4gICAgICAgIHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yID0gMTtcbiAgICAgICAgdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nID0gb3B0aW9ucy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc7XG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZSA9IG5ldyBUYXNrUXVldWUoKTtcbiAgICAgICAgdGhpcy5fY29udHJvbHMgPSBbXTtcbiAgICAgICAgdGhpcy5fbWFwSWQgPSB1bmlxdWVJZCgpO1xuXG4gICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKG9wdGlvbnMudHJhbnNmb3JtUmVxdWVzdCwgb3B0aW9ucy5hY2Nlc3NUb2tlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRhaW5lciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHRpb25zLmNvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29udGFpbmVyICcke29wdGlvbnMuY29udGFpbmVyfScgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR5cGU6ICdjb250YWluZXInIG11c3QgYmUgYSBTdHJpbmcgb3IgSFRNTEVsZW1lbnQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhCb3VuZHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWF4Qm91bmRzKG9wdGlvbnMubWF4Qm91bmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbldpbmRvd09ubGluZScsXG4gICAgICAgICAgICAnX29uV2luZG93UmVzaXplJyxcbiAgICAgICAgICAgICdfY29udGV4dExvc3QnLFxuICAgICAgICAgICAgJ19jb250ZXh0UmVzdG9yZWQnXG4gICAgICAgIF0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX3NldHVwQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX3NldHVwUGFpbnRlcigpO1xuICAgICAgICBpZiAodGhpcy5wYWludGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgV2ViR0wuYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uKCdtb3ZlJywgKCkgPT4gdGhpcy5fdXBkYXRlKGZhbHNlKSk7XG4gICAgICAgIHRoaXMub24oJ21vdmVlbmQnLCAoKSA9PiB0aGlzLl91cGRhdGUoZmFsc2UpKTtcbiAgICAgICAgdGhpcy5vbignem9vbScsICgpID0+IHRoaXMuX3VwZGF0ZSh0cnVlKSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgdGhpcy5fb25XaW5kb3dPbmxpbmUsIGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmluZEhhbmRsZXJzKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX2hhc2ggPSBvcHRpb25zLmhhc2ggJiYgKG5ldyBIYXNoKCkpLmFkZFRvKHRoaXMpO1xuICAgICAgICAvLyBkb24ndCBzZXQgcG9zaXRpb24gZnJvbSBvcHRpb25zIGlmIHNldCB0aHJvdWdoIGhhc2hcbiAgICAgICAgaWYgKCF0aGlzLl9oYXNoIHx8ICF0aGlzLl9oYXNoLl9vbkhhc2hDaGFuZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG8oe1xuICAgICAgICAgICAgICAgIGNlbnRlcjogb3B0aW9ucy5jZW50ZXIsXG4gICAgICAgICAgICAgICAgem9vbTogb3B0aW9ucy56b29tLFxuICAgICAgICAgICAgICAgIGJlYXJpbmc6IG9wdGlvbnMuYmVhcmluZyxcbiAgICAgICAgICAgICAgICBwaXRjaDogb3B0aW9ucy5waXRjaFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmJvdW5kcykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXRCb3VuZHMob3B0aW9ucy5ib3VuZHMsIGV4dGVuZCh7fSwgb3B0aW9ucy5maXRCb3VuZHNPcHRpb25zLCB7IGR1cmF0aW9uOiAwIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID0gb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7XG4gICAgICAgIGlmIChvcHRpb25zLnN0eWxlKSB0aGlzLnNldFN0eWxlKG9wdGlvbnMuc3R5bGUsIHsgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiBvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSB9KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2wpXG4gICAgICAgICAgICB0aGlzLmFkZENvbnRyb2wobmV3IEF0dHJpYnV0aW9uQ29udHJvbCh7IGN1c3RvbUF0dHJpYnV0aW9uOiBvcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uIH0pKTtcblxuICAgICAgICB0aGlzLmFkZENvbnRyb2wobmV3IExvZ29Db250cm9sKCksIG9wdGlvbnMubG9nb1Bvc2l0aW9uKTtcblxuICAgICAgICB0aGlzLm9uKCdzdHlsZS5sb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLnVubW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmp1bXBUbygodGhpcy5zdHlsZS5zdHlsZXNoZWV0OiBhbnkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub24oJ2RhdGEnLCAoZXZlbnQ6IE1hcERhdGFFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKGV2ZW50LmRhdGFUeXBlID09PSAnc3R5bGUnKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoYCR7ZXZlbnQuZGF0YVR5cGV9ZGF0YWAsIGV2ZW50KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uKCdkYXRhbG9hZGluZycsIChldmVudDogTWFwRGF0YUV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KGAke2V2ZW50LmRhdGFUeXBlfWRhdGFsb2FkaW5nYCwgZXZlbnQpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAqIFJldHVybnMgYSB1bmlxdWUgbnVtYmVyIGZvciB0aGlzIG1hcCBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIGZvciB0aGUgTWFwTG9hZEV2ZW50XG4gICAgKiB0byBtYWtlIHN1cmUgd2Ugb25seSBmaXJlIG9uZSBldmVudCBwZXIgaW5zdGFudGlhdGVkIG1hcCBvYmplY3QuXG4gICAgKiBAcHJpdmF0ZVxuICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAqL1xuICAgIF9nZXRNYXBJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcElkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB7QGxpbmsgSUNvbnRyb2x9IHRvIHRoZSBtYXAsIGNhbGxpbmcgYGNvbnRyb2wub25BZGQodGhpcylgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtJQ29udHJvbH0gY29udHJvbCBUaGUge0BsaW5rIElDb250cm9sfSB0byBhZGQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwb3NpdGlvbl0gcG9zaXRpb24gb24gdGhlIG1hcCB0byB3aGljaCB0aGUgY29udHJvbCB3aWxsIGJlIGFkZGVkLlxuICAgICAqIFZhbGlkIHZhbHVlcyBhcmUgYCd0b3AtbGVmdCdgLCBgJ3RvcC1yaWdodCdgLCBgJ2JvdHRvbS1sZWZ0J2AsIGFuZCBgJ2JvdHRvbS1yaWdodCdgLiBEZWZhdWx0cyB0byBgJ3RvcC1yaWdodCdgLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0Rpc3BsYXkgbWFwIG5hdmlnYXRpb24gY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbmF2aWdhdGlvbi8pXG4gICAgICovXG4gICAgYWRkQ29udHJvbChjb250cm9sOiBJQ29udHJvbCwgcG9zaXRpb24/OiBDb250cm9sUG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgJiYgY29udHJvbC5nZXREZWZhdWx0UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gY29udHJvbC5nZXREZWZhdWx0UG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSAndG9wLXJpZ2h0JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wub25BZGQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHRvIG1hcC5hZGRDb250cm9sKCkuIEFyZ3VtZW50IG11c3QgYmUgYSBjb250cm9sIHdpdGggb25BZGQgYW5kIG9uUmVtb3ZlIG1ldGhvZHMuJykpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250cm9sRWxlbWVudCA9IGNvbnRyb2wub25BZGQodGhpcyk7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xzLnB1c2goY29udHJvbCk7XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25Db250YWluZXIgPSB0aGlzLl9jb250cm9sUG9zaXRpb25zW3Bvc2l0aW9uXTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluZGV4T2YoJ2JvdHRvbScpICE9PSAtMSkge1xuICAgICAgICAgICAgcG9zaXRpb25Db250YWluZXIuaW5zZXJ0QmVmb3JlKGNvbnRyb2xFbGVtZW50LCBwb3NpdGlvbkNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRyb2xFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjb250cm9sIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SUNvbnRyb2x9IGNvbnRyb2wgVGhlIHtAbGluayBJQ29udHJvbH0gdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZUNvbnRyb2woY29udHJvbDogSUNvbnRyb2wpIHtcbiAgICAgICAgaWYgKCFjb250cm9sIHx8ICFjb250cm9sLm9uUmVtb3ZlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCB0byBtYXAucmVtb3ZlQ29udHJvbCgpLiBBcmd1bWVudCBtdXN0IGJlIGEgY29udHJvbCB3aXRoIG9uQWRkIGFuZCBvblJlbW92ZSBtZXRob2RzLicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2kgPSB0aGlzLl9jb250cm9scy5pbmRleE9mKGNvbnRyb2wpO1xuICAgICAgICBpZiAoY2kgPiAtMSkgdGhpcy5fY29udHJvbHMuc3BsaWNlKGNpLCAxKTtcbiAgICAgICAgY29udHJvbC5vblJlbW92ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgbWFwIGFjY29yZGluZyB0byB0aGUgZGltZW5zaW9ucyBvZiBpdHNcbiAgICAgKiBgY29udGFpbmVyYCBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG1hcCdzIGBjb250YWluZXJgIGlzIHJlc2l6ZWQgYnkgYW5vdGhlciBzY3JpcHQsXG4gICAgICogb3Igd2hlbiB0aGUgbWFwIGlzIHNob3duIGFmdGVyIGJlaW5nIGluaXRpYWxseSBoaWRkZW4gd2l0aCBDU1MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVzaXplKGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5fY29udGFpbmVyRGltZW5zaW9ucygpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGRpbWVuc2lvbnNbMF07XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGRpbWVuc2lvbnNbMV07XG5cbiAgICAgICAgdGhpcy5fcmVzaXplQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMucGFpbnRlci5yZXNpemUod2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZXN0YXJ0JywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnbW92ZScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3Jlc2l6ZScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ21vdmVlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGJvdW5kcy4gV2hlbiB0aGUgYmVhcmluZyBvciBwaXRjaCBpcyBub24temVybywgdGhlIHZpc2libGUgcmVnaW9uIGlzIG5vdFxuICAgICAqIGFuIGF4aXMtYWxpZ25lZCByZWN0YW5nbGUsIGFuZCB0aGUgcmVzdWx0IGlzIHRoZSBzbWFsbGVzdCBib3VuZHMgdGhhdCBlbmNvbXBhc3NlcyB0aGUgdmlzaWJsZSByZWdpb24uXG4gICAgICovXG4gICAgZ2V0Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5nZXRCb3VuZHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGdlb2dyYXBoaWNhbCBib3VuZHMgdGhlIG1hcCBpcyBjb25zdHJhaW5lZCB0bywgb3IgYG51bGxgIGlmIG5vbmUgc2V0LlxuICAgICAqL1xuICAgIGdldE1heEJvdW5kcygpOiBMbmdMYXRCb3VuZHMgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmdldE1heEJvdW5kcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLlxuICAgICAqXG4gICAgICogUGFuIGFuZCB6b29tIG9wZXJhdGlvbnMgYXJlIGNvbnN0cmFpbmVkIHdpdGhpbiB0aGVzZSBib3VuZHMuXG4gICAgICogSWYgYSBwYW4gb3Igem9vbSBpcyBwZXJmb3JtZWQgdGhhdCB3b3VsZFxuICAgICAqIGRpc3BsYXkgcmVnaW9ucyBvdXRzaWRlIHRoZXNlIGJvdW5kcywgdGhlIG1hcCB3aWxsXG4gICAgICogaW5zdGVhZCBkaXNwbGF5IGEgcG9zaXRpb24gYW5kIHpvb20gbGV2ZWxcbiAgICAgKiBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgb3BlcmF0aW9uJ3MgcmVxdWVzdCB3aGlsZSBzdGlsbFxuICAgICAqIHJlbWFpbmluZyB3aXRoaW4gdGhlIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IGJvdW5kcyBUaGUgbWF4aW11bSBib3VuZHMgdG8gc2V0LiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBtYXAncyBtYXhpbXVtIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRNYXhCb3VuZHMoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlKSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnNldE1heEJvdW5kcyhMbmdMYXRCb3VuZHMuY29udmVydChib3VuZHMpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBtaW5pbXVtIHpvb20gbGV2ZWwuXG4gICAgICogSWYgdGhlIG1hcCdzIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBsb3dlciB0aGFuIHRoZSBuZXcgbWluaW11bSxcbiAgICAgKiB0aGUgbWFwIHdpbGwgem9vbSB0byB0aGUgbmV3IG1pbmltdW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IG1pblpvb20gVGhlIG1pbmltdW0gem9vbSBsZXZlbCB0byBzZXQgKDAtMjQpLlxuICAgICAqICAgSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBtaW5pbXVtIHpvb20gKGkuZS4gc2V0cyBpdCB0byAwKS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRNaW5ab29tKG1pblpvb20/OiA/bnVtYmVyKSB7XG5cbiAgICAgICAgbWluWm9vbSA9IG1pblpvb20gPT09IG51bGwgfHwgbWluWm9vbSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1pblpvb20gOiBtaW5ab29tO1xuXG4gICAgICAgIGlmIChtaW5ab29tID49IGRlZmF1bHRNaW5ab29tICYmIG1pblpvb20gPD0gdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubWluWm9vbSA9IG1pblpvb207XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Wm9vbSgpIDwgbWluWm9vbSkgdGhpcy5zZXRab29tKG1pblpvb20pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBtaW5ab29tIG11c3QgYmUgYmV0d2VlbiAke2RlZmF1bHRNaW5ab29tfSBhbmQgdGhlIGN1cnJlbnQgbWF4Wm9vbSwgaW5jbHVzaXZlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgbWluaW11bSBhbGxvd2FibGUgem9vbSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IG1pblpvb21cbiAgICAgKi9cbiAgICBnZXRNaW5ab29tKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluWm9vbTsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIG1heGltdW0gem9vbSBsZXZlbC5cbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsIGlzIGhpZ2hlciB0aGFuIHRoZSBuZXcgbWF4aW11bSxcbiAgICAgKiB0aGUgbWFwIHdpbGwgem9vbSB0byB0aGUgbmV3IG1heGltdW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IG1heFpvb20gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBzZXQuXG4gICAgICogICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IG1heGltdW0gem9vbSAoc2V0cyBpdCB0byAyMikuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TWF4Wm9vbShtYXhab29tPzogP251bWJlcikge1xuXG4gICAgICAgIG1heFpvb20gPSBtYXhab29tID09PSBudWxsIHx8IG1heFpvb20gPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRNYXhab29tIDogbWF4Wm9vbTtcblxuICAgICAgICBpZiAobWF4Wm9vbSA+PSB0aGlzLnRyYW5zZm9ybS5taW5ab29tKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5tYXhab29tID0gbWF4Wm9vbTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRab29tKCkgPiBtYXhab29tKSB0aGlzLnNldFpvb20obWF4Wm9vbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYG1heFpvb20gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbWluWm9vbWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHJlbmRlcldvcmxkQ29waWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHJlbmRlcldvcmxkQ29waWVzXG4gICAgICovXG4gICAgZ2V0UmVuZGVyV29ybGRDb3BpZXMoKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllczsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgcmVuZGVyV29ybGRDb3BpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlbmRlcldvcmxkQ29waWVzIElmIGB0cnVlYCwgbXVsdGlwbGUgY29waWVzIG9mIHRoZSB3b3JsZCB3aWxsIGJlIHJlbmRlcmVkLCB3aGVuIHpvb21lZCBvdXQuIGB1bmRlZmluZWRgIGlzIHRyZWF0ZWQgYXMgYHRydWVgLCBgbnVsbGAgaXMgdHJlYXRlZCBhcyBgZmFsc2VgLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFJlbmRlcldvcmxkQ29waWVzKHJlbmRlcldvcmxkQ29waWVzPzogP2Jvb2xlYW4pIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXMgPSByZW5kZXJXb3JsZENvcGllcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1heGltdW0gYWxsb3dhYmxlIHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBtYXhab29tXG4gICAgICovXG4gICAgZ2V0TWF4Wm9vbSgpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1heFpvb207IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgUG9pbnR9IHJlcHJlc2VudGluZyBwaXhlbCBjb29yZGluYXRlcywgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGBjb250YWluZXJgLFxuICAgICAqIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc3BlY2lmaWVkIGdlb2dyYXBoaWNhbCBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nbGF0IFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gdG8gcHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IFRoZSB7QGxpbmsgUG9pbnR9IGNvcnJlc3BvbmRpbmcgdG8gYGxuZ2xhdGAsIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBgY29udGFpbmVyYC5cbiAgICAgKi9cbiAgICBwcm9qZWN0KGxuZ2xhdDogTG5nTGF0TGlrZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChMbmdMYXQuY29udmVydChsbmdsYXQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIExuZ0xhdH0gcmVwcmVzZW50aW5nIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyB0aGF0IGNvcnJlc3BvbmRcbiAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHBpeGVsIGNvb3JkaW5hdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IHBvaW50IFRoZSBwaXhlbCBjb29yZGluYXRlcyB0byB1bnByb2plY3QuXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIHtAbGluayBMbmdMYXR9IGNvcnJlc3BvbmRpbmcgdG8gYHBvaW50YC5cbiAgICAgKiBAc2VlIFtTaG93IHBvbHlnb24gaW5mb3JtYXRpb24gb24gY2xpY2tdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9seWdvbi1wb3B1cC1vbi1jbGljay8pXG4gICAgICovXG4gICAgdW5wcm9qZWN0KHBvaW50OiBQb2ludExpa2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24oUG9pbnQuY29udmVydChwb2ludCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHBhbm5pbmcsIHpvb21pbmcsIHJvdGF0aW5nLCBvciBwaXRjaGluZyBkdWUgdG8gYSBjYW1lcmEgYW5pbWF0aW9uIG9yIHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBpc01vdmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdmluZyB8fFxuICAgICAgICAgICAgdGhpcy5kcmFnUGFuLmlzQWN0aXZlKCkgfHxcbiAgICAgICAgICAgIHRoaXMuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpIHx8XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFpvb20uaXNBY3RpdmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcCBpcyB6b29taW5nIGR1ZSB0byBhIGNhbWVyYSBhbmltYXRpb24gb3IgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIGlzWm9vbWluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3pvb21pbmcgfHxcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsWm9vbS5pc1pvb21pbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcCBpcyByb3RhdGluZyBkdWUgdG8gYSBjYW1lcmEgYW5pbWF0aW9uIG9yIHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBpc1JvdGF0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpbmcgfHxcbiAgICAgICAgICAgIHRoaXMuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgZXZlbnRzIG9mIGEgc3BlY2lmaWVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG5hbWUgb25cbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gYWRkIGEgbGlzdGVuIGZvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqICAgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gYGZpcmVgLFxuICAgICAqICAgZXh0ZW5kZWQgd2l0aCBgdGFyZ2V0YCBhbmQgYHR5cGVgIHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIGV2ZW50cyBvZiBhIHNwZWNpZmllZCB0eXBlIG9jY3VycmluZyBvbiBmZWF0dXJlcyBpbiBhIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGxpc3RlbiBmb3I7IG9uZSBvZiBgJ21vdXNlZG93bidgLCBgJ21vdXNldXAnYCwgYCdjbGljaydgLCBgJ2RibGNsaWNrJ2AsXG4gICAgICogYCdtb3VzZW1vdmUnYCwgYCdtb3VzZWVudGVyJ2AsIGAnbW91c2VsZWF2ZSdgLCBgJ21vdXNlb3ZlcidgLCBgJ21vdXNlb3V0J2AsIGAnY29udGV4dG1lbnUnYCwgYCd0b3VjaHN0YXJ0J2AsXG4gICAgICogYCd0b3VjaGVuZCdgLCBvciBgJ3RvdWNoY2FuY2VsJ2AuIGBtb3VzZWVudGVyYCBhbmQgYG1vdXNlb3ZlcmAgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY3Vyc29yIGVudGVyc1xuICAgICAqIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGF5ZXIgZnJvbSBvdXRzaWRlIHRoYXQgbGF5ZXIgb3Igb3V0c2lkZSB0aGUgbWFwIGNhbnZhcy4gYG1vdXNlbGVhdmVgXG4gICAgICogYW5kIGBtb3VzZW91dGAgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY3Vyc29yIGxlYXZlcyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyLCBvciBsZWF2ZXNcbiAgICAgKiB0aGUgbWFwIGNhbnZhcy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgYSBzdHlsZSBsYXllci4gT25seSBldmVudHMgd2hvc2UgbG9jYXRpb24gaXMgd2l0aGluIGEgdmlzaWJsZVxuICAgICAqIGZlYXR1cmUgaW4gdGhpcyBsYXllciB3aWxsIHRyaWdnZXIgdGhlIGxpc3RlbmVyLiBUaGUgZXZlbnQgd2lsbCBoYXZlIGEgYGZlYXR1cmVzYCBwcm9wZXJ0eSBjb250YWluaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIG1hdGNoaW5nIGZlYXR1cmVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgb24odHlwZTogTWFwRXZlbnQsIGxheWVySWQ6IGFueSwgbGlzdGVuZXI6IGFueSkge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uKHR5cGUsIGxheWVySWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVsZWdhdGVkTGlzdGVuZXIgPSAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdtb3VzZWVudGVyJyB8fCB0eXBlID09PSAnbW91c2VvdmVyJykge1xuICAgICAgICAgICAgICAgIGxldCBtb3VzZWluID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgbW91c2Vtb3ZlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdldExheWVyKGxheWVySWQpID8gdGhpcy5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge2xheWVyczogW2xheWVySWRdfSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbW91c2Vpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIG5ldyBNYXBNb3VzZUV2ZW50KHR5cGUsIHRoaXMsIGUub3JpZ2luYWxFdmVudCwge2ZlYXR1cmVzfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb3VzZW91dCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtsYXllcjogbGF5ZXJJZCwgbGlzdGVuZXIsIGRlbGVnYXRlczoge21vdXNlbW92ZSwgbW91c2VvdXR9fTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21vdXNlbGVhdmUnIHx8IHR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlbW92ZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRMYXllcihsYXllcklkKSA/IHRoaXMucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGUucG9pbnQsIHtsYXllcnM6IFtsYXllcklkXX0pIDogW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vdXNlaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgbmV3IE1hcE1vdXNlRXZlbnQodHlwZSwgdGhpcywgZS5vcmlnaW5hbEV2ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlb3V0ID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdXNlaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgbmV3IE1hcE1vdXNlRXZlbnQodHlwZSwgdGhpcywgZS5vcmlnaW5hbEV2ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB7bGF5ZXI6IGxheWVySWQsIGxpc3RlbmVyLCBkZWxlZ2F0ZXM6IHttb3VzZW1vdmUsIG1vdXNlb3V0fX07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdldExheWVyKGxheWVySWQpID8gdGhpcy5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge2xheWVyczogW2xheWVySWRdfSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIG11dGF0ZSB0aGUgb3JpZ2luYWwgZXZlbnQsIHNvIHRoYXQgcHJldmVudERlZmF1bHQgd29ya3MgYXMgZXhwZWN0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBlLmZlYXR1cmVzID0gZmVhdHVyZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUuZmVhdHVyZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB7bGF5ZXI6IGxheWVySWQsIGxpc3RlbmVyLCBkZWxlZ2F0ZXM6IHtbdHlwZV06IGRlbGVnYXRlfX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzID0gdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0gfHwgW107XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXS5wdXNoKGRlbGVnYXRlZExpc3RlbmVyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlcykge1xuICAgICAgICAgICAgdGhpcy5vbigoZXZlbnQ6IGFueSksIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlc1tldmVudF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBwcmV2aW91c2x5IGFkZGVkIHdpdGggYE1hcCNvbmAuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG5hbWUgb2ZmXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHByZXZpb3VzbHkgdXNlZCB0byBpbnN0YWxsIHRoZSBsaXN0ZW5lci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gcHJldmlvdXNseSBpbnN0YWxsZWQgYXMgYSBsaXN0ZW5lci5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIGxheWVyLXNwZWNpZmljIGV2ZW50cyBwcmV2aW91c2x5IGFkZGVkIHdpdGggYE1hcCNvbmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSBwcmV2aW91c2x5IHVzZWQgdG8gaW5zdGFsbCB0aGUgbGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIGxheWVyIElEIHByZXZpb3VzbHkgdXNlZCB0byBpbnN0YWxsIHRoZSBsaXN0ZW5lci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gcHJldmlvdXNseSBpbnN0YWxsZWQgYXMgYSBsaXN0ZW5lci5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBvZmYodHlwZTogTWFwRXZlbnQsIGxheWVySWQ6IGFueSwgbGlzdGVuZXI6IGFueSkge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9mZih0eXBlLCBsYXllcklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnMgJiYgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW3R5cGVdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlZExpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChkZWxlZ2F0ZWRMaXN0ZW5lci5sYXllciA9PT0gbGF5ZXJJZCAmJiBkZWxlZ2F0ZWRMaXN0ZW5lci5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBpbiBkZWxlZ2F0ZWRMaXN0ZW5lci5kZWxlZ2F0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmKChldmVudDogYW55KSwgZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzW2V2ZW50XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcbiAgICAgKiBbRmVhdHVyZSBvYmplY3RzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NiNzZWN0aW9uLTMuMilcbiAgICAgKiByZXByZXNlbnRpbmcgdmlzaWJsZSBmZWF0dXJlcyB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZXxBcnJheTxQb2ludExpa2U+fSBbZ2VvbWV0cnldIC0gVGhlIGdlb21ldHJ5IG9mIHRoZSBxdWVyeSByZWdpb246XG4gICAgICogZWl0aGVyIGEgc2luZ2xlIHBvaW50IG9yIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IHBvaW50cyBkZXNjcmliaW5nIGEgYm91bmRpbmcgYm94LlxuICAgICAqIE9taXR0aW5nIHRoaXMgcGFyYW1ldGVyIChpLmUuIGNhbGxpbmcge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9IHdpdGggemVybyBhcmd1bWVudHMsXG4gICAgICogb3Igd2l0aCBvbmx5IGEgYG9wdGlvbnNgIGFyZ3VtZW50KSBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYSBib3VuZGluZyBib3ggZW5jb21wYXNzaW5nIHRoZSBlbnRpcmVcbiAgICAgKiBtYXAgdmlld3BvcnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW29wdGlvbnMubGF5ZXJzXSBBbiBhcnJheSBvZiBzdHlsZSBsYXllciBJRHMgZm9yIHRoZSBxdWVyeSB0byBpbnNwZWN0LlxuICAgICAqICAgT25seSBmZWF0dXJlcyB3aXRoaW4gdGhlc2UgbGF5ZXJzIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCwgYWxsIGxheWVycyB3aWxsIGJlIGNoZWNrZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMuZmlsdGVyXSBBIFtmaWx0ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI290aGVyLWZpbHRlcilcbiAgICAgKiAgIHRvIGxpbWl0IHF1ZXJ5IHJlc3VsdHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy52YWxpZGF0ZT10cnVlXSBXaGV0aGVyIHRvIGNoZWNrIGlmIHRoZSBbb3B0aW9ucy5maWx0ZXJdIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IEFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxuICAgICAqIFtmZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKS5cbiAgICAgKlxuICAgICAqIFRoZSBgcHJvcGVydGllc2AgdmFsdWUgb2YgZWFjaCByZXR1cm5lZCBmZWF0dXJlIG9iamVjdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiBpdHMgc291cmNlIGZlYXR1cmUuIEZvciBHZW9KU09OIHNvdXJjZXMsIG9ubHlcbiAgICAgKiBzdHJpbmcgYW5kIG51bWVyaWMgcHJvcGVydHkgdmFsdWVzIGFyZSBzdXBwb3J0ZWQgKGkuZS4gYG51bGxgLCBgQXJyYXlgLCBhbmQgYE9iamVjdGAgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkKS5cbiAgICAgKlxuICAgICAqIEVhY2ggZmVhdHVyZSBpbmNsdWRlcyB0b3AtbGV2ZWwgYGxheWVyYCwgYHNvdXJjZWAsIGFuZCBgc291cmNlTGF5ZXJgIHByb3BlcnRpZXMuIFRoZSBgbGF5ZXJgIHByb3BlcnR5IGlzIGFuIG9iamVjdFxuICAgICAqIHJlcHJlc2VudGluZyB0aGUgc3R5bGUgbGF5ZXIgdG8gIHdoaWNoIHRoZSBmZWF0dXJlIGJlbG9uZ3MuIExheW91dCBhbmQgcGFpbnQgcHJvcGVydGllcyBpbiB0aGlzIG9iamVjdCBjb250YWluIHZhbHVlc1xuICAgICAqIHdoaWNoIGFyZSBmdWxseSBldmFsdWF0ZWQgZm9yIHRoZSBnaXZlbiB6b29tIGxldmVsIGFuZCBmZWF0dXJlLlxuICAgICAqXG4gICAgICogRmVhdHVyZXMgZnJvbSBsYXllcnMgd2hvc2UgYHZpc2liaWxpdHlgIHByb3BlcnR5IGlzIGBcIm5vbmVcImAsIG9yIGZyb20gbGF5ZXJzIHdob3NlIHpvb20gcmFuZ2UgZXhjbHVkZXMgdGhlXG4gICAgICogY3VycmVudCB6b29tIGxldmVsIGFyZSBub3QgaW5jbHVkZWQuIFN5bWJvbCBmZWF0dXJlcyB0aGF0IGhhdmUgYmVlbiBoaWRkZW4gZHVlIHRvIHRleHQgb3IgaWNvbiBjb2xsaXNpb24gYXJlXG4gICAgICogbm90IGluY2x1ZGVkLiBGZWF0dXJlcyBmcm9tIGFsbCBvdGhlciBsYXllcnMgYXJlIGluY2x1ZGVkLCBpbmNsdWRpbmcgZmVhdHVyZXMgdGhhdCBtYXkgaGF2ZSBubyB2aXNpYmxlXG4gICAgICogY29udHJpYnV0aW9uIHRvIHRoZSByZW5kZXJlZCByZXN1bHQ7IGZvciBleGFtcGxlLCBiZWNhdXNlIHRoZSBsYXllcidzIG9wYWNpdHkgb3IgY29sb3IgYWxwaGEgY29tcG9uZW50IGlzIHNldCB0b1xuICAgICAqIDAuXG4gICAgICpcbiAgICAgKiBUaGUgdG9wbW9zdCByZW5kZXJlZCBmZWF0dXJlIGFwcGVhcnMgZmlyc3QgaW4gdGhlIHJldHVybmVkIGFycmF5LCBhbmQgc3Vic2VxdWVudCBmZWF0dXJlcyBhcmUgc29ydGVkIGJ5XG4gICAgICogZGVzY2VuZGluZyB6LW9yZGVyLiBGZWF0dXJlcyB0aGF0IGFyZSByZW5kZXJlZCBtdWx0aXBsZSB0aW1lcyAoZHVlIHRvIHdyYXBwaW5nIGFjcm9zcyB0aGUgYW50aW1lcmlkaWFuIGF0IGxvd1xuICAgICAqIHpvb20gbGV2ZWxzKSBhcmUgcmV0dXJuZWQgb25seSBvbmNlICh0aG91Z2ggc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNhdmVhdCkuXG4gICAgICpcbiAgICAgKiBCZWNhdXNlIGZlYXR1cmVzIGNvbWUgZnJvbSB0aWxlZCB2ZWN0b3IgZGF0YSBvciBHZW9KU09OIGRhdGEgdGhhdCBpcyBjb252ZXJ0ZWQgdG8gdGlsZXMgaW50ZXJuYWxseSwgZmVhdHVyZVxuICAgICAqIGdlb21ldHJpZXMgbWF5IGJlIHNwbGl0IG9yIGR1cGxpY2F0ZWQgYWNyb3NzIHRpbGUgYm91bmRhcmllcyBhbmQsIGFzIGEgcmVzdWx0LCBmZWF0dXJlcyBtYXkgYXBwZWFyIG11bHRpcGxlXG4gICAgICogdGltZXMgaW4gcXVlcnkgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUgaXMgYSBoaWdod2F5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIGEgcXVlcnkuXG4gICAgICogVGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IHdpbGwgYmUgdGhvc2UgcGFydHMgb2YgdGhlIGhpZ2h3YXkgdGhhdCBsaWUgd2l0aGluIHRoZSBtYXAgdGlsZXMgY292ZXJpbmcgdGhlIGJvdW5kaW5nXG4gICAgICogcmVjdGFuZ2xlLCBldmVuIGlmIHRoZSBoaWdod2F5IGV4dGVuZHMgaW50byBvdGhlciB0aWxlcywgYW5kIHRoZSBwb3J0aW9uIG9mIHRoZSBoaWdod2F5IHdpdGhpbiBlYWNoIG1hcCB0aWxlXG4gICAgICogd2lsbCBiZSByZXR1cm5lZCBhcyBhIHNlcGFyYXRlIGZlYXR1cmUuIFNpbWlsYXJseSwgYSBwb2ludCBmZWF0dXJlIG5lYXIgYSB0aWxlIGJvdW5kYXJ5IG1heSBhcHBlYXIgaW4gbXVsdGlwbGVcbiAgICAgKiB0aWxlcyBkdWUgdG8gdGlsZSBidWZmZXJpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIGF0IGEgcG9pbnRcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAqICAgWzIwLCAzNV0sXG4gICAgICogICB7IGxheWVyczogWydteS1sYXllci1uYW1lJ10gfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIHdpdGhpbiBhIHN0YXRpYyBib3VuZGluZyBib3hcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAqICAgW1sxMCwgMjBdLCBbMzAsIDUwXV0sXG4gICAgICogICB7IGxheWVyczogWydteS1sYXllci1uYW1lJ10gfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveCBhcm91bmQgYSBwb2ludFxuICAgICAqIHZhciB3aWR0aCA9IDEwO1xuICAgICAqIHZhciBoZWlnaHQgPSAyMDtcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFtcbiAgICAgKiAgIFtwb2ludC54IC0gd2lkdGggLyAyLCBwb2ludC55IC0gaGVpZ2h0IC8gMl0sXG4gICAgICogICBbcG9pbnQueCArIHdpZHRoIC8gMiwgcG9pbnQueSArIGhlaWdodCAvIDJdXG4gICAgICogXSwgeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH0pO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBRdWVyeSBhbGwgcmVuZGVyZWQgZmVhdHVyZXMgZnJvbSBhIHNpbmdsZSBsYXllclxuICAgICAqIHZhciBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH0pO1xuICAgICAqIEBzZWUgW0dldCBmZWF0dXJlcyB1bmRlciB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICogQHNlZSBbQ2VudGVyIHRoZSBtYXAgb24gYSBjbGlja2VkIHN5bWJvbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKi9cbiAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMoZ2VvbWV0cnk/OiBQb2ludExpa2UgfCBbUG9pbnRMaWtlLCBQb2ludExpa2VdLCBvcHRpb25zPzogT2JqZWN0KSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgY2FuIGJlIG9taXR0ZWQgZW50aXJlbHksIG1ha2luZyB0aGlzIGVmZmVjdGl2ZWx5IGFuIG92ZXJsb2FkZWQgbWV0aG9kXG4gICAgICAgIC8vIHdpdGggdHdvIHNpZ25hdHVyZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMoZ2VvbWV0cnk6IFBvaW50TGlrZSB8IFtQb2ludExpa2UsIFBvaW50TGlrZV0sIG9wdGlvbnM/OiBPYmplY3QpXG4gICAgICAgIC8vICAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMob3B0aW9ucz86IE9iamVjdClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlcmUgbm8gd2F5IHRvIGV4cHJlc3MgdGhhdCBpbiBhIHdheSB0aGF0J3MgY29tcGF0aWJsZSB3aXRoIGJvdGggZmxvdyBhbmQgZG9jdW1lbnRhdGlvbi5qcy5cbiAgICAgICAgLy8gUmVsYXRlZDogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE1NTZcblxuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCAmJiAhKGdlb21ldHJ5IGluc3RhbmNlb2YgUG9pbnQpICYmICFBcnJheS5pc0FycmF5KGdlb21ldHJ5KSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IChnZW9tZXRyeTogT2JqZWN0KTtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkgfHwgW1swLCAwXSwgW3RoaXMudHJhbnNmb3JtLndpZHRoLCB0aGlzLnRyYW5zZm9ybS5oZWlnaHRdXTtcblxuICAgICAgICBsZXQgcXVlcnlHZW9tZXRyeTtcbiAgICAgICAgaWYgKGdlb21ldHJ5IGluc3RhbmNlb2YgUG9pbnQgfHwgdHlwZW9mIGdlb21ldHJ5WzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcXVlcnlHZW9tZXRyeSA9IFtQb2ludC5jb252ZXJ0KGdlb21ldHJ5KV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0bCA9IFBvaW50LmNvbnZlcnQoZ2VvbWV0cnlbMF0pO1xuICAgICAgICAgICAgY29uc3QgYnIgPSBQb2ludC5jb252ZXJ0KGdlb21ldHJ5WzFdKTtcbiAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnkgPSBbdGwsIG5ldyBQb2ludChici54LCB0bC55KSwgYnIsIG5ldyBQb2ludCh0bC54LCBici55KSwgdGxdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHF1ZXJ5R2VvbWV0cnksIG9wdGlvbnMsIHRoaXMudHJhbnNmb3JtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxuICAgICAqIFtGZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKVxuICAgICAqIHJlcHJlc2VudGluZyBmZWF0dXJlcyB3aXRoaW4gdGhlIHNwZWNpZmllZCB2ZWN0b3IgdGlsZSBvciBHZW9KU09OIHNvdXJjZSB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlSWQgVGhlIElEIG9mIHRoZSB2ZWN0b3IgdGlsZSBvciBHZW9KU09OIHNvdXJjZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbWV0ZXJzLnNvdXJjZUxheWVyXSBUaGUgbmFtZSBvZiB0aGUgdmVjdG9yIHRpbGUgbGF5ZXIgdG8gcXVlcnkuICpGb3IgdmVjdG9yIHRpbGVcbiAgICAgKiAgIHNvdXJjZXMsIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLiogRm9yIEdlb0pTT04gc291cmNlcywgaXQgaXMgaWdub3JlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFyYW1ldGVycy5maWx0ZXJdIEEgW2ZpbHRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jb3RoZXItZmlsdGVyKVxuICAgICAqICAgdG8gbGltaXQgcXVlcnkgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbWV0ZXJzLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgdGhlIFtwYXJhbWV0ZXJzLmZpbHRlcl0gY29uZm9ybXMgdG8gdGhlIE1hcGJveCBHTCBTdHlsZSBTcGVjaWZpY2F0aW9uLiBEaXNhYmxpbmcgdmFsaWRhdGlvbiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGhhdmUgcHJldmlvdXNseSB2YWxpZGF0ZWQgdGhlIHZhbHVlcyB5b3Ugd2lsbCBiZSBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pXG4gICAgICogW0ZlYXR1cmUgb2JqZWN0c10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjIpLlxuICAgICAqXG4gICAgICogSW4gY29udHJhc3QgdG8ge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9LCB0aGlzIGZ1bmN0aW9uXG4gICAgICogcmV0dXJucyBhbGwgZmVhdHVyZXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsXG4gICAgICogd2hldGhlciBvciBub3QgdGhleSBhcmUgcmVuZGVyZWQgYnkgdGhlIGN1cnJlbnQgc3R5bGUgKGkuZS4gdmlzaWJsZSkuIFRoZSBkb21haW4gb2YgdGhlIHF1ZXJ5IGluY2x1ZGVzIGFsbCBjdXJyZW50bHktbG9hZGVkXG4gICAgICogdmVjdG9yIHRpbGVzIGFuZCBHZW9KU09OIHNvdXJjZSB0aWxlczogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aWxlcyBvdXRzaWRlIHRoZSBjdXJyZW50bHlcbiAgICAgKiB2aXNpYmxlIHZpZXdwb3J0LlxuICAgICAqXG4gICAgICogQmVjYXVzZSBmZWF0dXJlcyBjb21lIGZyb20gdGlsZWQgdmVjdG9yIGRhdGEgb3IgR2VvSlNPTiBkYXRhIHRoYXQgaXMgY29udmVydGVkIHRvIHRpbGVzIGludGVybmFsbHksIGZlYXR1cmVcbiAgICAgKiBnZW9tZXRyaWVzIG1heSBiZSBzcGxpdCBvciBkdXBsaWNhdGVkIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMgYW5kLCBhcyBhIHJlc3VsdCwgZmVhdHVyZXMgbWF5IGFwcGVhciBtdWx0aXBsZVxuICAgICAqIHRpbWVzIGluIHF1ZXJ5IHJlc3VsdHMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZXJlIGlzIGEgaGlnaHdheSBydW5uaW5nIHRocm91Z2ggdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiBhIHF1ZXJ5LlxuICAgICAqIFRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSB3aWxsIGJlIHRob3NlIHBhcnRzIG9mIHRoZSBoaWdod2F5IHRoYXQgbGllIHdpdGhpbiB0aGUgbWFwIHRpbGVzIGNvdmVyaW5nIHRoZSBib3VuZGluZ1xuICAgICAqIHJlY3RhbmdsZSwgZXZlbiBpZiB0aGUgaGlnaHdheSBleHRlbmRzIGludG8gb3RoZXIgdGlsZXMsIGFuZCB0aGUgcG9ydGlvbiBvZiB0aGUgaGlnaHdheSB3aXRoaW4gZWFjaCBtYXAgdGlsZVxuICAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSBmZWF0dXJlLiBTaW1pbGFybHksIGEgcG9pbnQgZmVhdHVyZSBuZWFyIGEgdGlsZSBib3VuZGFyeSBtYXkgYXBwZWFyIGluIG11bHRpcGxlXG4gICAgICogdGlsZXMgZHVlIHRvIHRpbGUgYnVmZmVyaW5nLlxuICAgICAqIEBzZWUgW0ZpbHRlciBmZWF0dXJlcyB3aXRoaW4gbWFwIHZpZXddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXG4gICAgICogQHNlZSBbSGlnaGxpZ2h0IGZlYXR1cmVzIGNvbnRhaW5pbmcgc2ltaWxhciBkYXRhXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3F1ZXJ5LXNpbWlsYXItZmVhdHVyZXMvKVxuICAgICAqL1xuICAgIHF1ZXJ5U291cmNlRmVhdHVyZXMoc291cmNlSWQ6IHN0cmluZywgcGFyYW1ldGVyczogP3tzb3VyY2VMYXllcjogP3N0cmluZywgZmlsdGVyOiA/QXJyYXk8YW55PiwgdmFsaWRhdGU/OiBib29sZWFufSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5xdWVyeVNvdXJjZUZlYXR1cmVzKHNvdXJjZUlkLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBtYXAncyBNYXBib3ggc3R5bGUgb2JqZWN0IHdpdGggYSBuZXcgdmFsdWUuIElmIGEgc3R5bGUgYWxyZWFkeSBpcyBzZXQgYW5kIG9wdGlvbnMuZGlmZiBpcyB0cnVlLFxuICAgICAqIHRoaXMgY29tcGFyZXMgdGhlIHN0eWxlIGFnYWluc3QgdGhlIG1hcCdzIGN1cnJlbnQgc3RhdGUgYW5kIHBlcmZvcm1zIG9ubHkgdGhlIGNoYW5nZXMgbmVjZXNzYXJ5IHRvIG1ha2VcbiAgICAgKiB0aGUgbWFwIHN0eWxlIG1hdGNoIHRoZSBkZXNpcmVkIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0eWxlIEEgSlNPTiBvYmplY3QgY29uZm9ybWluZyB0byB0aGUgc2NoZW1hIGRlc2NyaWJlZCBpbiB0aGVcbiAgICAgKiAgIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyksIG9yIGEgVVJMIHRvIHN1Y2ggSlNPTi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaWZmPXRydWVdIElmIGZhbHNlLCBmb3JjZSBhICdmdWxsJyB1cGRhdGUsIHJlbW92aW5nIHRoZSBjdXJyZW50IHN0eWxlXG4gICAgICogICBhbmQgYnVpbGRpbmcgdGhlIGdpdmVuIG9uZSBpbnN0ZWFkIG9mIGF0dGVtcHRpbmcgYSBkaWZmLWJhc2VkIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5PSdzYW5zLXNlcmlmJ10gRGVmaW5lcyBhIENTU1xuICAgICAqICAgZm9udC1mYW1pbHkgZm9yIGxvY2FsbHkgb3ZlcnJpZGluZyBnZW5lcmF0aW9uIG9mIGdseXBocyBpbiB0aGUgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnLCAnSGlyYWdhbmEnLCAnS2F0YWthbmEnIGFuZCAnSGFuZ3VsIFN5bGxhYmxlcycgcmFuZ2VzLlxuICAgICAqICAgSW4gdGhlc2UgcmFuZ2VzLCBmb250IHNldHRpbmdzIGZyb20gdGhlIG1hcCdzIHN0eWxlIHdpbGwgYmUgaWdub3JlZCwgZXhjZXB0IGZvciBmb250LXdlaWdodCBrZXl3b3JkcyAobGlnaHQvcmVndWxhci9tZWRpdW0vYm9sZCkuXG4gICAgICogICBTZXQgdG8gYGZhbHNlYCwgdG8gZW5hYmxlIGZvbnQgc2V0dGluZ3MgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUgZm9yIHRoZXNlIGdseXBoIHJhbmdlcy5cbiAgICAgKiAgIEZvcmNlcyBhIGZ1bGwgdXBkYXRlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0NoYW5nZSBhIG1hcCdzIHN0eWxlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldHN0eWxlLylcbiAgICAgKi9cbiAgICBzZXRTdHlsZShzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uIHwgc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IHtkaWZmPzogYm9vbGVhbn0gJiBTdHlsZU9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgeyBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseX0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICgob3B0aW9ucy5kaWZmICE9PSBmYWxzZSAmJiBvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA9PT0gdGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5KSAmJiB0aGlzLnN0eWxlICYmIHN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWZmU3R5bGUoc3R5bGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPSBvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVTdHlsZShzdHlsZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlU3R5bGUoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiB8IHN0cmluZyB8IG51bGwsICBvcHRpb25zPzoge2RpZmY/OiBib29sZWFufSAmIFN0eWxlT3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5fcmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSA9IG5ldyBTdHlsZSh0aGlzLCBvcHRpb25zIHx8IHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7c3R5bGU6IHRoaXMuc3R5bGV9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkVVJMKHN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUubG9hZEpTT04oc3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX2RpZmZTdHlsZShzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uIHwgc3RyaW5nLCAgb3B0aW9ucz86IHtkaWZmPzogYm9vbGVhbn0gJiBTdHlsZU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVN0eWxlVVJMKHN0eWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlN0eWxlKTtcbiAgICAgICAgICAgIGdldEpTT04ocmVxdWVzdCwgKGVycm9yOiA/RXJyb3IsIGpzb246ID9PYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycm9yKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURpZmYoanNvbiwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0eWxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlRGlmZihzdHlsZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlRGlmZihzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uLCAgb3B0aW9ucz86IHtkaWZmPzogYm9vbGVhbn0gJiBTdHlsZU9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0eWxlLnNldFN0YXRlKHN0eWxlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2Fybk9uY2UoXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byBwZXJmb3JtIHN0eWxlIGRpZmY6ICR7ZS5tZXNzYWdlIHx8IGUuZXJyb3IgfHwgZX0uICBSZWJ1aWxkaW5nIHRoZSBzdHlsZSBmcm9tIHNjcmF0Y2guYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0eWxlKHN0eWxlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIE1hcGJveCBzdHlsZSBvYmplY3QsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBtYXAncyBzdHlsZSBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0U3R5bGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwJ3Mgc3R5bGUgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHN0eWxlIGlzIGZ1bGx5IGxvYWRlZC5cbiAgICAgKi9cbiAgICBpc1N0eWxlTG9hZGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiB3YXJuT25jZSgnVGhlcmUgaXMgbm8gc3R5bGUgYWRkZWQgdG8gdGhlIG1hcC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUubG9hZGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNvdXJjZSB0byB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gYWRkLiBNdXN0IG5vdCBjb25mbGljdCB3aXRoIGV4aXN0aW5nIHNvdXJjZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCwgY29uZm9ybWluZyB0byB0aGVcbiAgICAgKiBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzIFtzb3VyY2UgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcykgb3JcbiAgICAgKiB7QGxpbmsgQ2FudmFzU291cmNlT3B0aW9uc30uXG4gICAgICogQGZpcmVzIHNvdXJjZS5hZGRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAc2VlIFtEcmF3IEdlb0pTT04gcG9pbnRzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dlb2pzb24tbWFya2Vycy8pXG4gICAgICogQHNlZSBbU3R5bGUgY2lyY2xlcyB1c2luZyBkYXRhLWRyaXZlbiBzdHlsaW5nXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RhdGEtZHJpdmVuLWNpcmNsZS1jb2xvcnMvKVxuICAgICAqIEBzZWUgW1NldCBhIHBvaW50IGFmdGVyIEdlb2NvZGVyIHJlc3VsdF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb2ludC1mcm9tLWdlb2NvZGVyLXJlc3VsdC8pXG4gICAgICovXG4gICAgYWRkU291cmNlKGlkOiBzdHJpbmcsIHNvdXJjZTogU291cmNlU3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnN0eWxlLmFkZFNvdXJjZShpZCwgc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNvdXJjZSBpcyBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gYmUgY2hlY2tlZC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc291cmNlIGlzIGxvYWRlZC5cbiAgICAgKi9cbiAgICBpc1NvdXJjZUxvYWRlZChpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICBpZiAoc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIElEICcke2lkfSdgKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2UubG9hZGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCB0aWxlcyBpbiB0aGUgdmlld3BvcnQgZnJvbSBhbGwgc291cmNlcyBvblxuICAgICAqIHRoZSBzdHlsZSBhcmUgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIHRpbGVzIGFyZSBsb2FkZWQuXG4gICAgICovXG5cbiAgICBhcmVUaWxlc0xvYWRlZCgpIHtcbiAgICAgICAgY29uc3Qgc291cmNlcyA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXM7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlc1tpZF07XG4gICAgICAgICAgICBjb25zdCB0aWxlcyA9IHNvdXJjZS5fdGlsZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgaW4gdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbdF07XG4gICAgICAgICAgICAgICAgaWYgKCEodGlsZS5zdGF0ZSA9PT0gJ2xvYWRlZCcgfHwgdGlsZS5zdGF0ZSA9PT0gJ2Vycm9yZWQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBbY3VzdG9tIHNvdXJjZSB0eXBlXSgjQ3VzdG9tIFNvdXJjZXMpLCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aFxuICAgICAqIHtAbGluayBNYXAjYWRkU291cmNlfS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgdHlwZTsgc291cmNlIGRlZmluaXRpb24gb2JqZWN0cyB1c2UgdGhpcyBuYW1lIGluIHRoZSBge3R5cGU6IC4uLn1gIGZpZWxkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFNvdXJjZVR5cGUgQSB7QGxpbmsgU291cmNlfSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgd2hlbiB0aGUgc291cmNlIHR5cGUgaXMgcmVhZHkgb3Igd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBhZGRTb3VyY2VUeXBlKG5hbWU6IHN0cmluZywgU291cmNlVHlwZTogYW55LCBjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuYWRkU291cmNlVHlwZShuYW1lLCBTb3VyY2VUeXBlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHNvdXJjZSBmcm9tIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIHNvdXJjZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlU291cmNlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVTb3VyY2UoaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgaW4gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7P09iamVjdH0gVGhlIHN0eWxlIHNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQsIG9yIGB1bmRlZmluZWRgXG4gICAgICogICBpZiB0aGUgSUQgY29ycmVzcG9uZHMgdG8gbm8gZXhpc3Rpbmcgc291cmNlcy5cbiAgICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKiBAc2VlIFtBbmltYXRlIGEgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYW5pbWF0ZS1wb2ludC1hbG9uZy1saW5lLylcbiAgICAgKiBAc2VlIFtBZGQgbGl2ZSByZWFsdGltZSBkYXRhXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xpdmUtZ2VvanNvbi8pXG4gICAgICovXG4gICAgZ2V0U291cmNlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYW4gaW1hZ2UgdG8gdGhlIHN0eWxlLiBUaGlzIGltYWdlIGNhbiBiZSB1c2VkIGluIGBpY29uLWltYWdlYCxcbiAgICAgKiBgYmFja2dyb3VuZC1wYXR0ZXJuYCwgYGZpbGwtcGF0dGVybmAsIGFuZCBgbGluZS1wYXR0ZXJuYC4gQW5cbiAgICAgKiB7QGxpbmsgTWFwI2Vycm9yfSBldmVudCB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlXG4gICAgICogc3ByaXRlIHRvIGFkZCB0aGlzIGltYWdlLlxuICAgICAqXG4gICAgICogQHNlZSBbQWRkIGFuIGljb24gdG8gdGhlIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UvKVxuICAgICAqIEBzZWUgW0FkZCBhIGdlbmVyYXRlZCBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLWdlbmVyYXRlZC8pXG4gICAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgaW1hZ2UuXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSBhcyBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYFxuICAgICAqIHByb3BlcnRpZXMgd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgYEltYWdlRGF0YWAuXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5waXhlbFJhdGlvIFRoZSByYXRpbyBvZiBwaXhlbHMgaW4gdGhlIGltYWdlIHRvIHBoeXNpY2FsIHBpeGVscyBvbiB0aGUgc2NyZWVuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuc2RmIFdoZXRoZXIgdGhlIGltYWdlIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhbiBTREYgaW1hZ2VcbiAgICAgKi9cbiAgICBhZGRJbWFnZShpZDogc3RyaW5nLFxuICAgICAgICAgICAgIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50IHwgSW1hZ2VEYXRhIHwge3dpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXl9IHwgU3R5bGVJbWFnZUludGVyZmFjZSxcbiAgICAgICAgICAgICB7cGl4ZWxSYXRpbyA9IDEsIHNkZiA9IGZhbHNlfToge3BpeGVsUmF0aW8/OiBudW1iZXIsIHNkZj86IGJvb2xlYW59ID0ge30pIHtcblxuICAgICAgICBjb25zdCB2ZXJzaW9uID0gMDtcblxuICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgZGF0YX0gPSBicm93c2VyLmdldEltYWdlRGF0YShpbWFnZSk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLmFkZEltYWdlKGlkLCB7IGRhdGE6IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoLCBoZWlnaHR9LCBkYXRhKSwgcGl4ZWxSYXRpbywgc2RmLCB2ZXJzaW9uIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGltYWdlLndpZHRoID09PSB1bmRlZmluZWQgfHwgaW1hZ2UuaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyB0byBtYXAuYWRkSW1hZ2UoKS4gVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGBIVE1MSW1hZ2VFbGVtZW50YCwgYEltYWdlRGF0YWAsICcgK1xuICAgICAgICAgICAgICAgICdvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgJykpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCBkYXRhfSA9IGltYWdlO1xuICAgICAgICAgICAgY29uc3QgdXNlckltYWdlID0gKChpbWFnZTogYW55KTogU3R5bGVJbWFnZUludGVyZmFjZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoaWQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBuZXcgUkdCQUltYWdlKHt3aWR0aCwgaGVpZ2h0fSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpLFxuICAgICAgICAgICAgICAgIHBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgc2RmLFxuICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgdXNlckltYWdlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHVzZXJJbWFnZS5vbkFkZCkge1xuICAgICAgICAgICAgICAgIHVzZXJJbWFnZS5vbkFkZCh0aGlzLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gZXhpc3Rpbmcgc3R5bGUgaW1hZ2UuIFRoaXMgaW1hZ2UgY2FuIGJlIHVzZWQgaW4gYGljb24taW1hZ2VgLFxuICAgICAqIGBiYWNrZ3JvdW5kLXBhdHRlcm5gLCBgZmlsbC1wYXR0ZXJuYCwgYW5kIGBsaW5lLXBhdHRlcm5gLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgaW1hZ2UuXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSBhcyBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYFxuICAgICAqIHByb3BlcnRpZXMgd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgYEltYWdlRGF0YWAuXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2UoaWQ6IHN0cmluZyxcbiAgICAgICAgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBJbWFnZURhdGEgfCB7d2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE6IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheX0gfCBTdHlsZUltYWdlSW50ZXJmYWNlKSB7XG5cbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbWFnZSA9IHRoaXMuc3R5bGUuZ2V0SW1hZ2UoaWQpO1xuICAgICAgICBpZiAoIWV4aXN0aW5nSW1hZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdUaGUgbWFwIGhhcyBubyBpbWFnZSB3aXRoIHRoYXQgaWQuIElmIHlvdSBhcmUgYWRkaW5nIGEgbmV3IGltYWdlIHVzZSBgbWFwLmFkZEltYWdlKC4uLilgIGluc3RlYWQuJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCA/IGJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGltYWdlKSA6IGltYWdlO1xuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgZGF0YX0gPSBpbWFnZURhdGE7XG5cbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyB0byBtYXAudXBkYXRlSW1hZ2UoKS4gVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGBIVE1MSW1hZ2VFbGVtZW50YCwgYEltYWdlRGF0YWAsICcgK1xuICAgICAgICAgICAgICAgICdvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aWR0aCAhPT0gZXhpc3RpbmdJbWFnZS5kYXRhLndpZHRoIHx8IGhlaWdodCAhPT0gZXhpc3RpbmdJbWFnZS5kYXRhLmhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1RoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSB1cGRhdGVkIGltYWdlIG11c3QgYmUgdGhhdCBzYW1lIGFzIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBpbWFnZScpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3B5ID0gIShpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpO1xuICAgICAgICBleGlzdGluZ0ltYWdlLmRhdGEucmVwbGFjZShkYXRhLCBjb3B5KTtcblxuICAgICAgICB0aGlzLnN0eWxlLnVwZGF0ZUltYWdlKGlkLCBleGlzdGluZ0ltYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgd2hldGhlciB0aGUgaW1hZ2UgaGFzIGJlZW4gYWRkZWQgb3Igbm90XG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICBoYXNJbWFnZShpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgaW1hZ2UgaWQnKSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdHlsZS5nZXRJbWFnZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGltYWdlIGZyb20gdGhlIHN0eWxlIChzdWNoIGFzIG9uZSB1c2VkIGJ5IGBpY29uLWltYWdlYCBvciBgYmFja2dyb3VuZC1wYXR0ZXJuYCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICByZW1vdmVJbWFnZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlSW1hZ2UoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYW4gaW1hZ2UgZnJvbSBhbiBleHRlcm5hbCBVUkwgZm9yIHVzZSB3aXRoIGBNYXAjYWRkSW1hZ2VgLiBFeHRlcm5hbFxuICAgICAqIGRvbWFpbnMgbXVzdCBzdXBwb3J0IFtDT1JTXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0FjY2Vzc19jb250cm9sX0NPUlMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBpbWFnZSBmaWxlLiBJbWFnZSBmaWxlIG11c3QgYmUgaW4gcG5nLCB3ZWJwLCBvciBqcGcgZm9ybWF0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEV4cGVjdGluZyBgY2FsbGJhY2soZXJyb3IsIGRhdGEpYC4gQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGhhcyBsb2FkZWQgb3Igd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvci5cbiAgICAgKiBAc2VlIFtBZGQgYW4gaWNvbiB0byB0aGUgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS8pXG4gICAgICovXG4gICAgbG9hZEltYWdlKHVybDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgZ2V0SW1hZ2UodGhpcy5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5JbWFnZSksIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgYW4gQXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgc3ByaXRlcy9pbWFnZXMgY3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgbWFwXG4gICAgKlxuICAgICogQHJldHVybnMge0FycmF5PHN0cmluZz59IEFuIEFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHNwcml0ZXMvaW1hZ2VzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIG1hcFxuICAgICpcbiAgICAqL1xuICAgIGxpc3RJbWFnZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmxpc3RJbWFnZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgW01hcGJveCBzdHlsZSBsYXllcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jbGF5ZXJzKVxuICAgICAqIHRvIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEEgbGF5ZXIgZGVmaW5lcyBzdHlsaW5nIGZvciBkYXRhIGZyb20gYSBzcGVjaWZpZWQgc291cmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBDdXN0b21MYXllckludGVyZmFjZX0gbGF5ZXIgVGhlIHN0eWxlIGxheWVyIHRvIGFkZCwgY29uZm9ybWluZyB0byB0aGUgTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24nc1xuICAgICAqICAgW2xheWVyIGRlZmluaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2xheWVycykuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtiZWZvcmVJZF0gVGhlIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCB0aGUgbmV3IGxheWVyIGJlZm9yZS5cbiAgICAgKiAgIElmIHRoaXMgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIGxheWVyIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGF5ZXJzIGFycmF5LlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0NyZWF0ZSBhbmQgc3R5bGUgY2x1c3RlcnNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci8pXG4gICAgICogQHNlZSBbQWRkIGEgdmVjdG9yIHRpbGUgc291cmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZlY3Rvci1zb3VyY2UvKVxuICAgICAqIEBzZWUgW0FkZCBhIFdNUyBzb3VyY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvd21zLylcbiAgICAgKi9cbiAgICBhZGRMYXllcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UsIGJlZm9yZUlkPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuYWRkTGF5ZXIobGF5ZXIsIGJlZm9yZUlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIGxheWVyIHRvIGEgZGlmZmVyZW50IHotcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBtb3ZlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlSWRdIFRoZSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgdGhlIG5ldyBsYXllciBiZWZvcmUuXG4gICAgICogICBJZiB0aGlzIGFyZ3VtZW50IGlzIG9taXR0ZWQsIHRoZSBsYXllciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxheWVycyBhcnJheS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBtb3ZlTGF5ZXIoaWQ6IHN0cmluZywgYmVmb3JlSWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5tb3ZlTGF5ZXIoaWQsIGJlZm9yZUlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBsYXllciB3aXRoIHRoZSBnaXZlbiBpZCBmcm9tIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIElmIG5vIHN1Y2ggbGF5ZXIgZXhpc3RzLCBhbiBgZXJyb3JgIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBsYXllciB0byByZW1vdmVcbiAgICAgKiBAZmlyZXMgZXJyb3JcbiAgICAgKi9cbiAgICByZW1vdmVMYXllcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlTGF5ZXIoaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxheWVyIHdpdGggdGhlIHNwZWNpZmllZCBJRCBpbiB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBnZXQuXG4gICAgICogQHJldHVybnMgez9PYmplY3R9IFRoZSBsYXllciB3aXRoIHRoZSBzcGVjaWZpZWQgSUQsIG9yIGB1bmRlZmluZWRgXG4gICAgICogICBpZiB0aGUgSUQgY29ycmVzcG9uZHMgdG8gbm8gZXhpc3RpbmcgbGF5ZXJzLlxuICAgICAqIEBzZWUgW0ZpbHRlciBzeW1ib2xzIGJ5IHRvZ2dsaW5nIGEgbGlzdF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy8pXG4gICAgICogQHNlZSBbRmlsdGVyIHN5bWJvbHMgYnkgdGV4dCBpbnB1dF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy1ieS1pbnB1dC8pXG4gICAgICovXG4gICAgZ2V0TGF5ZXIoaWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXllcihpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byB3aGljaCB0aGUgZmlsdGVyIHdpbGwgYmUgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5IHwgbnVsbCB8IHVuZGVmaW5lZH0gZmlsdGVyIFRoZSBmaWx0ZXIsIGNvbmZvcm1pbmcgdG8gdGhlIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3NcbiAgICAgKiAgIFtmaWx0ZXIgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jb3RoZXItZmlsdGVyKS4gIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgYW55IGV4aXN0aW5nIGZpbHRlciBmcm9tIHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy52YWxpZGF0ZT10cnVlXSBXaGV0aGVyIHRvIGNoZWNrIGlmIHRoZSBmaWx0ZXIgY29uZm9ybXMgdG8gdGhlIE1hcGJveCBHTCBTdHlsZSBTcGVjaWZpY2F0aW9uLiBEaXNhYmxpbmcgdmFsaWRhdGlvbiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGhhdmUgcHJldmlvdXNseSB2YWxpZGF0ZWQgdGhlIHZhbHVlcyB5b3Ugd2lsbCBiZSBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRGaWx0ZXIoJ215LWxheWVyJywgWyc9PScsICduYW1lJywgJ1VTQSddKTtcbiAgICAgKiBAc2VlIFtGaWx0ZXIgZmVhdHVyZXMgd2l0aGluIG1hcCB2aWV3XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpbHRlci1mZWF0dXJlcy13aXRoaW4tbWFwLXZpZXcvKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyBjb250YWluaW5nIHNpbWlsYXIgZGF0YV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9xdWVyeS1zaW1pbGFyLWZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtDcmVhdGUgYSB0aW1lbGluZSBhbmltYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdGltZWxpbmUtYW5pbWF0aW9uLylcbiAgICAgKi9cbiAgICBzZXRGaWx0ZXIobGF5ZXJJZDogc3RyaW5nLCBmaWx0ZXI6ID9GaWx0ZXJTcGVjaWZpY2F0aW9uLCAgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRGaWx0ZXIobGF5ZXJJZCwgZmlsdGVyLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB6b29tIGV4dGVudCBmb3IgdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gd2hpY2ggdGhlIHpvb20gZXh0ZW50IHdpbGwgYmUgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluem9vbSBUaGUgbWluaW11bSB6b29tIHRvIHNldCAoMC0yNCkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heHpvb20gVGhlIG1heGltdW0gem9vbSB0byBzZXQgKDAtMjQpLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldExheWVyWm9vbVJhbmdlKCdteS1sYXllcicsIDIsIDUpO1xuICAgICAqL1xuICAgIHNldExheWVyWm9vbVJhbmdlKGxheWVySWQ6IHN0cmluZywgbWluem9vbTogbnVtYmVyLCBtYXh6b29tOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRMYXllclpvb21SYW5nZShsYXllcklkLCBtaW56b29tLCBtYXh6b29tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHlsZSBsYXllciB3aG9zZSBmaWx0ZXIgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gVGhlIGxheWVyJ3MgZmlsdGVyLlxuICAgICAqL1xuICAgIGdldEZpbHRlcihsYXllcklkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0RmlsdGVyKGxheWVySWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgcGFpbnQgcHJvcGVydHkgaW4gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gc2V0IHRoZSBwYWludCBwcm9wZXJ0eSBpbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFpbnQgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwYWludCBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogICBNdXN0IGJlIG9mIGEgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5LCBhcyBkZWZpbmVkIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy52YWxpZGF0ZT10cnVlXSBXaGV0aGVyIHRvIGNoZWNrIGlmIGB2YWx1ZWAgY29uZm9ybXMgdG8gdGhlIE1hcGJveCBHTCBTdHlsZSBTcGVjaWZpY2F0aW9uLiBEaXNhYmxpbmcgdmFsaWRhdGlvbiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGhhdmUgcHJldmlvdXNseSB2YWxpZGF0ZWQgdGhlIHZhbHVlcyB5b3Ugd2lsbCBiZSBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0UGFpbnRQcm9wZXJ0eSgnbXktbGF5ZXInLCAnZmlsbC1jb2xvcicsICcjZmFhZmVlJyk7XG4gICAgICogQHNlZSBbQ2hhbmdlIGEgbGF5ZXIncyBjb2xvciB3aXRoIGJ1dHRvbnNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY29sb3Itc3dpdGNoZXIvKVxuICAgICAqIEBzZWUgW0FkanVzdCBhIGxheWVyJ3Mgb3BhY2l0eV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGp1c3QtbGF5ZXItb3BhY2l0eS8pXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgc2V0UGFpbnRQcm9wZXJ0eShsYXllcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQYWludFByb3BlcnR5KGxheWVySWQsIG5hbWUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHBhaW50IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIGdldCB0aGUgcGFpbnQgcHJvcGVydHkgZnJvbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiBhIHBhaW50IHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcGFpbnQgcHJvcGVydHkuXG4gICAgICovXG4gICAgZ2V0UGFpbnRQcm9wZXJ0eShsYXllcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRQYWludFByb3BlcnR5KGxheWVySWQsIG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgbGF5b3V0IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHNldCB0aGUgbGF5b3V0IHByb3BlcnR5IGluLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBsYXlvdXQgcHJvcGVydHkuIE11c3QgYmUgb2YgYSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHksIGFzIGRlZmluZWQgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgYHZhbHVlYCBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRMYXlvdXRQcm9wZXJ0eSgnbXktbGF5ZXInLCAndmlzaWJpbGl0eScsICdub25lJyk7XG4gICAgICovXG4gICAgc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZCwgbmFtZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgbGF5b3V0IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIGdldCB0aGUgbGF5b3V0IHByb3BlcnR5IGZyb20uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGxheW91dCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBnZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhbnkgY29tYmluYXRpb24gb2YgbGlnaHQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxpZ2h0IExpZ2h0IHByb3BlcnRpZXMgdG8gc2V0LiBNdXN0IGNvbmZvcm0gdG8gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jbGlnaHQpLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgdGhlIGZpbHRlciBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRMaWdodChsaWdodDogTGlnaHRTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnN0eWxlLnNldExpZ2h0KGxpZ2h0LCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGlnaHQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gbGlnaHQgTGlnaHQgcHJvcGVydGllcyBvZiB0aGUgc3R5bGUuXG4gICAgICovXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExpZ2h0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgYSBmZWF0dXJlLiBUaGUgYHN0YXRlYCBvYmplY3QgaXMgbWVyZ2VkIGluIHdpdGggdGhlIGV4aXN0aW5nIHN0YXRlIG9mIHRoZSBmZWF0dXJlLlxuICAgICAqIEZlYXR1cmVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGBpZGAgYXR0cmlidXRlLCB3aGljaCBtdXN0IGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcgdGhhdCBjYW4gYmVcbiAgICAgKiBjYXN0IHRvIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmVhdHVyZSBGZWF0dXJlIGlkZW50aWZpZXIuIEZlYXR1cmUgb2JqZWN0cyByZXR1cm5lZCBmcm9tXG4gICAgICoge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9IG9yIGV2ZW50IGhhbmRsZXJzIGNhbiBiZSB1c2VkIGFzIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGZlYXR1cmUuaWQgVW5pcXVlIGlkIG9mIHRoZSBmZWF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmZWF0dXJlLnNvdXJjZSBUaGUgSWQgb2YgdGhlIHZlY3RvciBzb3VyY2Ugb3IgR2VvSlNPTiBzb3VyY2UgZm9yIHRoZSBmZWF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZmVhdHVyZS5zb3VyY2VMYXllcl0gKG9wdGlvbmFsKSAgKkZvciB2ZWN0b3IgdGlsZSBzb3VyY2VzLCB0aGUgc291cmNlTGF5ZXIgaXNcbiAgICAgKiAgcmVxdWlyZWQuKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBBIHNldCBvZiBrZXktdmFsdWUgcGFpcnMuIFRoZSB2YWx1ZXMgc2hvdWxkIGJlIHZhbGlkIEpTT04gdHlwZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCByZXF1aXJlcyB0aGUgYGZlYXR1cmUuaWRgIGF0dHJpYnV0ZSBvbiBkYXRhIHNldHMuIEZvciBHZW9KU09OIHNvdXJjZXMgd2l0aG91dFxuICAgICAqIGZlYXR1cmUgaWRzLCBzZXQgdGhlIGBnZW5lcmF0ZUlkYCBvcHRpb24gaW4gdGhlIGBHZW9KU09OU291cmNlU3BlY2lmaWNhdGlvbmAgdG8gYXV0by1hc3NpZ24gdGhlbS4gVGhpc1xuICAgICAqIG9wdGlvbiBhc3NpZ25zIGlkcyBiYXNlZCBvbiBhIGZlYXR1cmUncyBpbmRleCBpbiB0aGUgc291cmNlIGRhdGEuIElmIHlvdSBjaGFuZ2UgZmVhdHVyZSBkYXRhIHVzaW5nXG4gICAgICogYG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKS5zZXREYXRhKC4uKWAsIHlvdSBtYXkgbmVlZCB0byByZS1hcHBseSBzdGF0ZSB0YWtpbmcgaW50byBhY2NvdW50IHVwZGF0ZWQgYGlkYCB2YWx1ZXMuXG4gICAgICovXG4gICAgc2V0RmVhdHVyZVN0YXRlKGZlYXR1cmU6IHsgc291cmNlOiBzdHJpbmc7IHNvdXJjZUxheWVyPzogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVtYmVyOyB9LCBzdGF0ZTogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RmVhdHVyZVN0YXRlKGZlYXR1cmUsIHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZmVhdHVyZSBzdGF0ZSwgc2V0dGluZyBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBJZiBvbmx5XG4gICAgICogc291cmNlIGlzIHNwZWNpZmllZCwgcmVtb3ZlcyBhbGwgc3RhdGVzIG9mIHRoYXQgc291cmNlLiBJZlxuICAgICAqIHRhcmdldC5pZCBpcyBhbHNvIHNwZWNpZmllZCwgcmVtb3ZlcyBhbGwga2V5cyBmb3IgdGhhdCBmZWF0dXJlJ3Mgc3RhdGUuXG4gICAgICogSWYga2V5IGlzIGFsc28gc3BlY2lmaWVkLCByZW1vdmVzIHRoYXQga2V5IGZyb20gdGhhdCBmZWF0dXJlJ3Mgc3RhdGUuXG4gICAgICogRmVhdHVyZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYGlkYCBhdHRyaWJ1dGUsIHdoaWNoIG11c3QgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZyB0aGF0IGNhbiBiZVxuICAgICAqIGNhc3QgdG8gYW4gaW50ZWdlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IElkZW50aWZpZXIgb2Ygd2hlcmUgdG8gc2V0IHN0YXRlOiBjYW4gYmUgYSBzb3VyY2UsIGEgZmVhdHVyZSwgb3IgYSBzcGVjaWZpYyBrZXkgb2YgZmVhdHVyZS5cbiAgICAgKiBGZWF0dXJlIG9iamVjdHMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30gb3IgZXZlbnQgaGFuZGxlcnMgY2FuIGJlIHVzZWQgYXMgZmVhdHVyZSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdGFyZ2V0LmlkIChvcHRpb25hbCkgVW5pcXVlIGlkIG9mIHRoZSBmZWF0dXJlLiBPcHRpb25hbCBpZiBrZXkgaXMgbm90IHNwZWNpZmllZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0LnNvdXJjZSBUaGUgSWQgb2YgdGhlIHZlY3RvciBzb3VyY2Ugb3IgR2VvSlNPTiBzb3VyY2UgZm9yIHRoZSBmZWF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0LnNvdXJjZUxheWVyXSAob3B0aW9uYWwpICAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIHRoZSBzb3VyY2VMYXllciBpc1xuICAgICAqICByZXF1aXJlZC4qXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAob3B0aW9uYWwpIFRoZSBrZXkgaW4gdGhlIGZlYXR1cmUgc3RhdGUgdG8gcmVzZXQuXG4gICAgKi9cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUodGFyZ2V0OiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ/OiBzdHJpbmcgfCBudW1iZXI7IH0sIGtleT86IHN0cmluZykge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZUZlYXR1cmVTdGF0ZSh0YXJnZXQsIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGF0ZSBvZiBhIGZlYXR1cmUuXG4gICAgICogRmVhdHVyZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYGlkYCBhdHRyaWJ1dGUsIHdoaWNoIG11c3QgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZyB0aGF0IGNhbiBiZVxuICAgICAqIGNhc3QgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmZWF0dXJlIEZlYXR1cmUgaWRlbnRpZmllci4gRmVhdHVyZSBvYmplY3RzIHJldHVybmVkIGZyb21cbiAgICAgKiB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30gb3IgZXZlbnQgaGFuZGxlcnMgY2FuIGJlIHVzZWQgYXMgZmVhdHVyZSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gZmVhdHVyZS5pZCBVbmlxdWUgaWQgb2YgdGhlIGZlYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUuc291cmNlIFRoZSBJZCBvZiB0aGUgdmVjdG9yIHNvdXJjZSBvciBHZW9KU09OIHNvdXJjZSBmb3IgdGhlIGZlYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtmZWF0dXJlLnNvdXJjZUxheWVyXSAob3B0aW9uYWwpICAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIHRoZSBzb3VyY2VMYXllciBpc1xuICAgICAqICByZXF1aXJlZC4qXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc3RhdGUgb2YgdGhlIGZlYXR1cmUuXG4gICAgICovXG4gICAgZ2V0RmVhdHVyZVN0YXRlKGZlYXR1cmU6IHsgc291cmNlOiBzdHJpbmc7IHNvdXJjZUxheWVyPzogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVtYmVyOyB9KTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0RmVhdHVyZVN0YXRlKGZlYXR1cmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGNvbnRhaW5pbmcgSFRNTCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgbWFwJ3MgY29udGFpbmVyLlxuICAgICAqL1xuICAgIGdldENvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGVsZW1lbnQgY29udGFpbmluZyB0aGUgbWFwJ3MgYDxjYW52YXM+YCBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gYWRkIG5vbi1HTCBvdmVybGF5cyB0byB0aGUgbWFwLCB5b3Ugc2hvdWxkIGFwcGVuZCB0aGVtIHRvIHRoaXMgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIGVsZW1lbnQgdG8gd2hpY2ggZXZlbnQgYmluZGluZ3MgZm9yIG1hcCBpbnRlcmFjdGl2aXR5IChzdWNoIGFzIHBhbm5pbmcgYW5kIHpvb21pbmcpIGFyZVxuICAgICAqIGF0dGFjaGVkLiBJdCB3aWxsIHJlY2VpdmUgYnViYmxlZCBldmVudHMgZnJvbSBjaGlsZCBlbGVtZW50cyBzdWNoIGFzIHRoZSBgPGNhbnZhcz5gLCBidXQgbm90IGZyb21cbiAgICAgKiBtYXAgY29udHJvbHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFRoZSBjb250YWluZXIgb2YgdGhlIG1hcCdzIGA8Y2FudmFzPmAuXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICogQHNlZSBbSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAgICAgKi9cbiAgICBnZXRDYW52YXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXNDb250YWluZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgYDxjYW52YXM+YCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxDYW52YXNFbGVtZW50fSBUaGUgbWFwJ3MgYDxjYW52YXM+YCBlbGVtZW50LlxuICAgICAqIEBzZWUgW01lYXN1cmUgZGlzdGFuY2VzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21lYXN1cmUvKVxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICogQHNlZSBbQ2VudGVyIHRoZSBtYXAgb24gYSBjbGlja2VkIHN5bWJvbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKi9cbiAgICBnZXRDYW52YXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXM7XG4gICAgfVxuXG4gICAgX2NvbnRhaW5lckRpbWVuc2lvbnMoKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IDA7XG4gICAgICAgIGxldCBoZWlnaHQgPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoIHx8IDQwMDtcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgMzAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbiAgICB9XG5cbiAgICBfZGV0ZWN0TWlzc2luZ0NTUygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRDb2xvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX21pc3NpbmdDU1NDYW5hcnkpLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQtY29sb3InKTtcbiAgICAgICAgaWYgKGNvbXB1dGVkQ29sb3IgIT09ICdyZ2IoMjUwLCAxMjgsIDExNCknKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnVGhpcyBwYWdlIGFwcGVhcnMgdG8gYmUgbWlzc2luZyBDU1MgZGVjbGFyYXRpb25zIGZvciAnICtcbiAgICAgICAgICAgICAgICAnTWFwYm94IEdMIEpTLCB3aGljaCBtYXkgY2F1c2UgdGhlIG1hcCB0byBkaXNwbGF5IGluY29ycmVjdGx5LiAnICtcbiAgICAgICAgICAgICAgICAnUGxlYXNlIGVuc3VyZSB5b3VyIHBhZ2UgaW5jbHVkZXMgbWFwYm94LWdsLmNzcywgYXMgZGVzY3JpYmVkICcgK1xuICAgICAgICAgICAgICAgICdpbiBodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3NldHVwQ29udGFpbmVyKCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1tYXAnKTtcblxuICAgICAgICBjb25zdCBtaXNzaW5nQ1NTQ2FuYXJ5ID0gdGhpcy5fbWlzc2luZ0NTU0NhbmFyeSA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jYW5hcnknLCBjb250YWluZXIpO1xuICAgICAgICBtaXNzaW5nQ1NTQ2FuYXJ5LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5fZGV0ZWN0TWlzc2luZ0NTUygpO1xuXG4gICAgICAgIGNvbnN0IGNhbnZhc0NvbnRhaW5lciA9IHRoaXMuX2NhbnZhc0NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jYW52YXMtY29udGFpbmVyJywgY29udGFpbmVyKTtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBjYW52YXNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtaW50ZXJhY3RpdmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhbnZhcyA9IERPTS5jcmVhdGUoJ2NhbnZhcycsICdtYXBib3hnbC1jYW52YXMnLCBjYW52YXNDb250YWluZXIpO1xuICAgICAgICB0aGlzLl9jYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0bG9zdCcsIHRoaXMuX2NvbnRleHRMb3N0LCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIHRoaXMuX2NvbnRleHRSZXN0b3JlZCwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9jYW52YXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnTWFwJyk7XG5cbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRoaXMuX2NvbnRhaW5lckRpbWVuc2lvbnMoKTtcbiAgICAgICAgdGhpcy5fcmVzaXplQ2FudmFzKGRpbWVuc2lvbnNbMF0sIGRpbWVuc2lvbnNbMV0pO1xuXG4gICAgICAgIGNvbnN0IGNvbnRyb2xDb250YWluZXIgPSB0aGlzLl9jb250cm9sQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWNvbnRyb2wtY29udGFpbmVyJywgY29udGFpbmVyKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5fY29udHJvbFBvc2l0aW9ucyA9IHt9O1xuICAgICAgICBbJ3RvcC1sZWZ0JywgJ3RvcC1yaWdodCcsICdib3R0b20tbGVmdCcsICdib3R0b20tcmlnaHQnXS5mb3JFYWNoKChwb3NpdGlvbk5hbWUpID0+IHtcbiAgICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbk5hbWVdID0gRE9NLmNyZWF0ZSgnZGl2JywgYG1hcGJveGdsLWN0cmwtJHtwb3NpdGlvbk5hbWV9YCwgY29udHJvbENvbnRhaW5lcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXNpemVDYW52YXMod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG5cbiAgICAgICAgLy8gUmVxdWVzdCB0aGUgcmVxdWlyZWQgY2FudmFzIHNpemUgdGFraW5nIHRoZSBwaXhlbHJhdGlvIGludG8gYWNjb3VudC5cbiAgICAgICAgdGhpcy5fY2FudmFzLndpZHRoID0gcGl4ZWxSYXRpbyAqIHdpZHRoO1xuICAgICAgICB0aGlzLl9jYW52YXMuaGVpZ2h0ID0gcGl4ZWxSYXRpbyAqIGhlaWdodDtcblxuICAgICAgICAvLyBNYWludGFpbiB0aGUgc2FtZSBjYW52YXMgc2l6ZSwgcG90ZW50aWFsbHkgZG93bnNjYWxpbmcgaXQgZm9yIEhpRFBJIGRpc3BsYXlzXG4gICAgICAgIHRoaXMuX2NhbnZhcy5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgdGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgfVxuXG4gICAgX3NldHVwUGFpbnRlcigpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGV4dGVuZCh7fSwgaXNTdXBwb3J0ZWQud2ViR0xDb250ZXh0QXR0cmlidXRlcywge1xuICAgICAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyLFxuICAgICAgICAgICAgYW50aWFsaWFzOiB0aGlzLl9hbnRpYWxpYXMgfHwgZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgdGhpcy5fY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpO1xuXG4gICAgICAgIGlmICghZ2wpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFpbnRlciA9IG5ldyBQYWludGVyKGdsLCB0aGlzLnRyYW5zZm9ybSk7XG5cbiAgICAgICAgd2VicFN1cHBvcnRlZC50ZXN0U3VwcG9ydChnbCk7XG4gICAgfVxuXG4gICAgX2NvbnRleHRMb3N0KGV2ZW50OiAqKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUuY2FuY2VsKCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnd2ViZ2xjb250ZXh0bG9zdCcsIHtvcmlnaW5hbEV2ZW50OiBldmVudH0pKTtcbiAgICB9XG5cbiAgICBfY29udGV4dFJlc3RvcmVkKGV2ZW50OiAqKSB7XG4gICAgICAgIHRoaXMuX3NldHVwUGFpbnRlcigpO1xuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCB7b3JpZ2luYWxFdmVudDogZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGlmIHRoZSBzdHlsZSBpcyBub3QgeWV0IGZ1bGx5IGxvYWRlZCxcbiAgICAgKiBvciBpZiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSB0byB0aGUgc291cmNlcyBvciBzdHlsZSB0aGF0XG4gICAgICogaGFzIG5vdCB5ZXQgZnVsbHkgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCBpcyBmdWxseSBsb2FkZWQuXG4gICAgICovXG4gICAgbG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3N0eWxlRGlydHkgJiYgIXRoaXMuX3NvdXJjZXNEaXJ0eSAmJiAhIXRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5sb2FkZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhpcyBtYXAncyBzdHlsZSBhbmQgc291cmNlcywgYW5kIHJlLXJlbmRlciB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSB1cGRhdGVTdHlsZSBtYXJrIHRoZSBtYXAncyBzdHlsZSBmb3IgcmVwcm9jZXNzaW5nIGFzXG4gICAgICogd2VsbCBhcyBpdHMgc291cmNlc1xuICAgICAqIEByZXR1cm5zIHtNYXB9IHRoaXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91cGRhdGUodXBkYXRlU3R5bGU/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5zdHlsZSkgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgdGhpcy5fc3R5bGVEaXJ0eSA9IHRoaXMuX3N0eWxlRGlydHkgfHwgdXBkYXRlU3R5bGU7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudHJpZ2dlclJlcGFpbnQoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGdpdmVuIGNhbGxiYWNrIGJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgbmV4dCByZW5kZXJcbiAgICAgKiBmcmFtZS4gIFNjaGVkdWxlIGEgcmVuZGVyIGZyYW1lIGlmIG9uZSBpcyBub3QgYWxyZWFkeSBzY2hlZHVsZWQuXG4gICAgICogQHJldHVybnMgQW4gaWQgdGhhdCBjYW4gYmUgdXNlZCB0byBjYW5jZWwgdGhlIGNhbGxiYWNrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVxdWVzdFJlbmRlckZyYW1lKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogVGFza0lEIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUYXNrUXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBfY2FuY2VsUmVuZGVyRnJhbWUoaWQ6IFRhc2tJRCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJUYXNrUXVldWUucmVtb3ZlKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHdoZW4gYSAocmUtKXJlbmRlciBvZiB0aGUgbWFwIGlzIHJlcXVpcmVkOlxuICAgICAqIC0gVGhlIHN0eWxlIGhhcyBjaGFuZ2VkIChgc2V0UGFpbnRQcm9wZXJ0eSgpYCwgZXRjLilcbiAgICAgKiAtIFNvdXJjZSBkYXRhIGhhcyBjaGFuZ2VkIChlLmcuIHRpbGVzIGhhdmUgZmluaXNoZWQgbG9hZGluZylcbiAgICAgKiAtIFRoZSBtYXAgaGFzIGlzIG1vdmluZyAob3IganVzdCBmaW5pc2hlZCBtb3ZpbmcpXG4gICAgICogLSBBIHRyYW5zaXRpb24gaXMgaW4gcHJvZ3Jlc3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtNYXB9IHRoaXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZW5kZXIoKSB7XG4gICAgICAgIC8vIEEgY3VzdG9tIGxheWVyIG1heSBoYXZlIHVzZWQgdGhlIGNvbnRleHQgYXN5bmNocm9ub3VzbHkuIE1hcmsgdGhlIHN0YXRlIGFzIGRpcnR5LlxuICAgICAgICB0aGlzLnBhaW50ZXIuY29udGV4dC5zZXREaXJ0eSgpO1xuICAgICAgICB0aGlzLnBhaW50ZXIuc2V0QmFzZVN0YXRlKCk7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyVGFza1F1ZXVlLnJ1bigpO1xuXG4gICAgICAgIGxldCBjcm9zc0ZhZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBoYXMgY2hhbmdlZCwgdGhlIG1hcCBpcyBiZWluZyB6b29tZWQsIG9yIGEgdHJhbnNpdGlvbiBvciBmYWRlIGlzIGluIHByb2dyZXNzOlxuICAgICAgICAvLyAgLSBBcHBseSBzdHlsZSBjaGFuZ2VzIChpbiBhIGJhdGNoKVxuICAgICAgICAvLyAgLSBSZWNhbGN1bGF0ZSBwYWludCBwcm9wZXJ0aWVzLlxuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zdHlsZURpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnRyYW5zZm9ybS56b29tO1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gYnJvd3Nlci5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuem9vbUhpc3RvcnkudXBkYXRlKHpvb20sIG5vdyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoem9vbSwge1xuICAgICAgICAgICAgICAgIG5vdyxcbiAgICAgICAgICAgICAgICBmYWRlRHVyYXRpb246IHRoaXMuX2ZhZGVEdXJhdGlvbixcbiAgICAgICAgICAgICAgICB6b29tSGlzdG9yeTogdGhpcy5zdHlsZS56b29tSGlzdG9yeSxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnN0eWxlLmdldFRyYW5zaXRpb24oKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZhY3RvciA9IHBhcmFtZXRlcnMuY3Jvc3NGYWRpbmdGYWN0b3IoKTtcbiAgICAgICAgICAgIGlmIChmYWN0b3IgIT09IDEgfHwgZmFjdG9yICE9PSB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3Rvcikge1xuICAgICAgICAgICAgICAgIGNyb3NzRmFkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciA9IGZhY3RvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdHlsZS51cGRhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gX3JlbmRlciBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGluLXByb2dyZXNzIHBhaW50XG4gICAgICAgIC8vIHRyYW5zaXRpb24sIHVwZGF0ZSBzb3VyY2UgY2FjaGVzIHRvIGNoZWNrIGZvciBhbmQgbG9hZCBhbnkgdGlsZXMgd2VcbiAgICAgICAgLy8gbmVlZCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmIHRoaXMuX3NvdXJjZXNEaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlc0RpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLl91cGRhdGVTb3VyY2VzKHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BsYWNlbWVudERpcnR5ID0gdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLl91cGRhdGVQbGFjZW1lbnQodGhpcy5wYWludGVyLnRyYW5zZm9ybSwgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMsIHRoaXMuX2ZhZGVEdXJhdGlvbiwgdGhpcy5fY3Jvc3NTb3VyY2VDb2xsaXNpb25zKTtcblxuICAgICAgICAvLyBBY3R1YWxseSBkcmF3XG4gICAgICAgIHRoaXMucGFpbnRlci5yZW5kZXIodGhpcy5zdHlsZSwge1xuICAgICAgICAgICAgc2hvd1RpbGVCb3VuZGFyaWVzOiB0aGlzLnNob3dUaWxlQm91bmRhcmllcyxcbiAgICAgICAgICAgIHNob3dPdmVyZHJhd0luc3BlY3RvcjogdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yLFxuICAgICAgICAgICAgcm90YXRpbmc6IHRoaXMuaXNSb3RhdGluZygpLFxuICAgICAgICAgICAgem9vbWluZzogdGhpcy5pc1pvb21pbmcoKSxcbiAgICAgICAgICAgIG1vdmluZzogdGhpcy5pc01vdmluZygpLFxuICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiB0aGlzLl9mYWRlRHVyYXRpb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncmVuZGVyJykpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCgpICYmICF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdsb2FkJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgKHRoaXMuc3R5bGUuaGFzVHJhbnNpdGlvbnMoKSB8fCBjcm9zc0ZhZGluZykpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgIXRoaXMuX3BsYWNlbWVudERpcnR5KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBubyBmYWRlIG9wZXJhdGlvbnMgYXJlIGluIHByb2dyZXNzLCB3ZSBjYW4gcmVsZWFzZVxuICAgICAgICAgICAgLy8gYWxsIHRpbGVzIGhlbGQgZm9yIGZhZGluZy4gSWYgd2UgZGlkbid0IGRvIHRoaXMsIHRoZSB0aWxlc1xuICAgICAgICAgICAgLy8gd291bGQganVzdCBzaXQgaW4gdGhlIFNvdXJjZUNhY2hlcyB1bnRpbCB0aGUgbmV4dCByZW5kZXJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3JlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNjaGVkdWxlIGFub3RoZXIgcmVuZGVyIGZyYW1lIGlmIGl0J3MgbmVlZGVkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBFdmVuIHRob3VnaCBgX3N0eWxlRGlydHlgIGFuZCBgX3NvdXJjZXNEaXJ0eWAgYXJlIHJlc2V0IGluIHRoaXNcbiAgICAgICAgLy8gbWV0aG9kLCBzeW5jaHJvbm91cyBldmVudHMgZmlyZWQgZHVyaW5nIFN0eWxlI3VwZGF0ZSBvclxuICAgICAgICAvLyBTdHlsZSNfdXBkYXRlU291cmNlcyBjb3VsZCBoYXZlIGNhdXNlZCB0aGVtIHRvIGJlIHNldCBhZ2Fpbi5cbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZXNEaXJ0eSB8fCB0aGlzLl9yZXBhaW50IHx8IHRoaXMuX3N0eWxlRGlydHkgfHwgdGhpcy5fcGxhY2VtZW50RGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlcGFpbnQoKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc01vdmluZygpICYmIHRoaXMubG9hZGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2lkbGUnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgYW5kIHJlbGVhc2UgYWxsIGludGVybmFsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYXAuXG4gICAgICpcbiAgICAgKiBUaGlzIGluY2x1ZGVzIERPTSBlbGVtZW50cywgZXZlbnQgYmluZGluZ3MsIHdlYiB3b3JrZXJzLCBhbmQgV2ViR0wgcmVzb3VyY2VzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IGFyZSBkb25lIHVzaW5nIHRoZSBtYXAgYW5kIHdpc2ggdG8gZW5zdXJlIHRoYXQgaXQgbm9cbiAgICAgKiBsb25nZXIgY29uc3VtZXMgYnJvd3NlciByZXNvdXJjZXMuIEFmdGVyd2FyZHMsIHlvdSBtdXN0IG5vdCBjYWxsIGFueSBvdGhlclxuICAgICAqIG1ldGhvZHMgb24gdGhlIG1hcC5cbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNoKSB0aGlzLl9oYXNoLnJlbW92ZSgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLl9jb250cm9scykgY29udHJvbC5vblJlbW92ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fY29udHJvbHMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKG51bGwpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29ubGluZScsIHRoaXMuX29uV2luZG93T25saW5lLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSB0aGlzLnBhaW50ZXIuY29udGV4dC5nbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2xvc2VfY29udGV4dCcpO1xuICAgICAgICBpZiAoZXh0ZW5zaW9uKSBleHRlbnNpb24ubG9zZUNvbnRleHQoKTtcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9jYW52YXNDb250YWluZXIpO1xuICAgICAgICByZW1vdmVOb2RlKHRoaXMuX2NvbnRyb2xDb250YWluZXIpO1xuICAgICAgICByZW1vdmVOb2RlKHRoaXMuX21pc3NpbmdDU1NDYW5hcnkpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtbWFwJyk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JlbW92ZScpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIHRoZSByZW5kZXJpbmcgb2YgYSBzaW5nbGUgZnJhbWUuIFVzZSB0aGlzIG1ldGhvZCB3aXRoIGN1c3RvbSBsYXllcnMgdG9cbiAgICAgKiByZXBhaW50IHRoZSBtYXAgd2hlbiB0aGUgbGF5ZXIgY2hhbmdlcy4gQ2FsbGluZyB0aGlzIG11bHRpcGxlIHRpbWVzIGJlZm9yZSB0aGVcbiAgICAgKiBuZXh0IGZyYW1lIGlzIHJlbmRlcmVkIHdpbGwgc3RpbGwgcmVzdWx0IGluIG9ubHkgYSBzaW5nbGUgZnJhbWUgYmVpbmcgcmVuZGVyZWQuXG4gICAgICovXG4gICAgdHJpZ2dlclJlcGFpbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICF0aGlzLl9mcmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBicm93c2VyLmZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbldpbmRvd09ubGluZSgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgX29uV2luZG93UmVzaXplKCkge1xuICAgICAgICBpZiAodGhpcy5fdHJhY2tSZXNpemUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplKCkuX3VwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbCByZW5kZXIgYW4gb3V0bGluZVxuICAgICAqIGFyb3VuZCBlYWNoIHRpbGUgYW5kIHRoZSB0aWxlIElELiBUaGVzZSB0aWxlIGJvdW5kYXJpZXMgYXJlIHVzZWZ1bCBmb3JcbiAgICAgKiBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgdW5jb21wcmVzc2VkIGZpbGUgc2l6ZSBvZiB0aGUgZmlyc3QgdmVjdG9yIHNvdXJjZSBpcyBkcmF3biBpbiB0aGUgdG9wIGxlZnRcbiAgICAgKiBjb3JuZXIgb2YgZWFjaCB0aWxlLCBuZXh0IHRvIHRoZSB0aWxlIElELlxuICAgICAqXG4gICAgICogQG5hbWUgc2hvd1RpbGVCb3VuZGFyaWVzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqL1xuICAgIGdldCBzaG93VGlsZUJvdW5kYXJpZXMoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3Nob3dUaWxlQm91bmRhcmllczsgfVxuICAgIHNldCBzaG93VGlsZUJvdW5kYXJpZXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dUaWxlQm91bmRhcmllcyA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc2hvd1RpbGVCb3VuZGFyaWVzID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHdpbGwgcmVuZGVyIGJveGVzXG4gICAgICogYXJvdW5kIGFsbCBzeW1ib2xzIGluIHRoZSBkYXRhIHNvdXJjZSwgcmV2ZWFsaW5nIHdoaWNoIHN5bWJvbHNcbiAgICAgKiB3ZXJlIHJlbmRlcmVkIG9yIHdoaWNoIHdlcmUgaGlkZGVuIGR1ZSB0byBjb2xsaXNpb25zLlxuICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93Q29sbGlzaW9uQm94ZXNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHNob3dDb2xsaXNpb25Cb3hlcygpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzOyB9XG4gICAgc2V0IHNob3dDb2xsaXNpb25Cb3hlcyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIHR1cm4gY29sbGlzaW9uIGJveGVzIG9uIHdlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlbSBmb3IgZXhpc3RpbmcgdGlsZXNcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgdHVybiB0aGVtIG9mZiwgdGhlcmUncyBubyBjb3N0IHRvIGxlYXZpbmcgZXhpc3RpbmcgYm94ZXMgaW4gcGxhY2VcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX2dlbmVyYXRlQ29sbGlzaW9uQm94ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2FsbCBhbiB1cGRhdGUgdG8gcmVtb3ZlIGNvbGxpc2lvbiBib3hlc1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHNob3VsZCBjb2xvci1jb2RlXG4gICAgICogZWFjaCBmcmFnbWVudCB0byBzaG93IGhvdyBtYW55IHRpbWVzIGl0IGhhcyBiZWVuIHNoYWRlZC5cbiAgICAgKiBXaGl0ZSBmcmFnbWVudHMgaGF2ZSBiZWVuIHNoYWRlZCA4IG9yIG1vcmUgdGltZXMuXG4gICAgICogQmxhY2sgZnJhZ21lbnRzIGhhdmUgYmVlbiBzaGFkZWQgMCB0aW1lcy5cbiAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogQG5hbWUgc2hvd092ZXJkcmF3XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqL1xuICAgIGdldCBzaG93T3ZlcmRyYXdJbnNwZWN0b3IoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcjsgfVxuICAgIHNldCBzaG93T3ZlcmRyYXdJbnNwZWN0b3IodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHdpbGxcbiAgICAgKiBjb250aW51b3VzbHkgcmVwYWludC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGFuYWx5emluZyBwZXJmb3JtYW5jZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJlcGFpbnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHJlcGFpbnQoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3JlcGFpbnQ7IH1cbiAgICBzZXQgcmVwYWludCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fcmVwYWludCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcGFpbnQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlcGFpbnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBzaG93IHZlcnRpY2VzXG4gICAgZ2V0IHZlcnRpY2VzKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLl92ZXJ0aWNlczsgfVxuICAgIHNldCB2ZXJ0aWNlcyh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLl92ZXJ0aWNlcyA9IHZhbHVlOyB0aGlzLl91cGRhdGUoKTsgfVxuXG4gICAgLy8gZm9yIGNhY2hlIGJyb3dzZXIgdGVzdHNcbiAgICBfc2V0Q2FjaGVMaW1pdHMobGltaXQ6IG51bWJlciwgY2hlY2tUaHJlc2hvbGQ6IG51bWJlcikge1xuICAgICAgICBzZXRDYWNoZUxpbWl0cyhsaW1pdCwgY2hlY2tUaHJlc2hvbGQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIE1hcGJveCBHTCBKUyBpbiB1c2UgYXMgc3BlY2lmaWVkIGluIHBhY2thZ2UuanNvbiwgQ0hBTkdFTE9HLm1kLCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxuICAgICAqXG4gICAgICogQG5hbWUgdmVyc2lvblxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAdmFyIHtzdHJpbmd9IHZlcnNpb25cbiAgICAgKi9cblxuICAgIGdldCB2ZXJzaW9uKCk6IHN0cmluZyB7IHJldHVybiB2ZXJzaW9uOyB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hcDtcblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgaW50ZXJhY3RpdmUgY29udHJvbHMgYWRkZWQgdG8gdGhlIG1hcC4gVGhpcyBpcyBhblxuICogc3BlY2lmaWNhdGlvbiBmb3IgaW1wbGVtZW50ZXJzIHRvIG1vZGVsOiBpdCBpcyBub3RcbiAqIGFuIGV4cG9ydGVkIG1ldGhvZCBvciBjbGFzcy5cbiAqXG4gKiBDb250cm9scyBtdXN0IGltcGxlbWVudCBgb25BZGRgIGFuZCBgb25SZW1vdmVgLCBhbmQgbXVzdCBvd24gYW5cbiAqIGVsZW1lbnQsIHdoaWNoIGlzIG9mdGVuIGEgYGRpdmAgZWxlbWVudC4gVG8gdXNlIE1hcGJveCBHTCBKUydzXG4gKiBkZWZhdWx0IGNvbnRyb2wgc3R5bGluZywgYWRkIHRoZSBgbWFwYm94Z2wtY3RybGAgY2xhc3MgdG8geW91ciBjb250cm9sJ3NcbiAqIG5vZGUuXG4gKlxuICogQGludGVyZmFjZSBJQ29udHJvbFxuICogQGV4YW1wbGVcbiAqIC8vIENvbnRyb2wgaW1wbGVtZW50ZWQgYXMgRVM2IGNsYXNzXG4gKiBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbCB7XG4gKiAgICAgb25BZGQobWFwKSB7XG4gKiAgICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAqICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc05hbWUgPSAnbWFwYm94Z2wtY3RybCc7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lci50ZXh0Q29udGVudCA9ICdIZWxsbywgd29ybGQnO1xuICogICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICogICAgIH1cbiAqXG4gKiAgICAgb25SZW1vdmUoKSB7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gKiAgICAgICAgIHRoaXMuX21hcCA9IHVuZGVmaW5lZDtcbiAqICAgICB9XG4gKiB9XG4gKlxuICogLy8gQ29udHJvbCBpbXBsZW1lbnRlZCBhcyBFUzUgcHJvdG90eXBpY2FsIGNsYXNzXG4gKiBmdW5jdGlvbiBIZWxsb1dvcmxkQ29udHJvbCgpIHsgfVxuICpcbiAqIEhlbGxvV29ybGRDb250cm9sLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uKG1hcCkge1xuICogICAgIHRoaXMuX21hcCA9IG1hcDtcbiAqICAgICB0aGlzLl9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAqICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuICogICAgIHRoaXMuX2NvbnRhaW5lci50ZXh0Q29udGVudCA9ICdIZWxsbywgd29ybGQnO1xuICogICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gKiB9O1xuICpcbiAqIEhlbGxvV29ybGRDb250cm9sLnByb3RvdHlwZS5vblJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAqICAgICAgdGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKTtcbiAqICAgICAgdGhpcy5fbWFwID0gdW5kZWZpbmVkO1xuICogfTtcbiAqL1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY29udHJvbCBvbiB0aGUgbWFwIGFuZCBnaXZlIGl0IGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVyc1xuICogYW5kIHJlc291cmNlcy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHtAbGluayBNYXAjYWRkQ29udHJvbH1cbiAqIGludGVybmFsbHkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgSUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25BZGRcbiAqIEBwYXJhbSB7TWFwfSBtYXAgdGhlIE1hcCB0aGlzIGNvbnRyb2wgd2lsbCBiZSBhZGRlZCB0b1xuICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgY29udHJvbCdzIGNvbnRhaW5lciBlbGVtZW50LiBUaGlzIHNob3VsZFxuICogYmUgY3JlYXRlZCBieSB0aGUgY29udHJvbCBhbmQgcmV0dXJuZWQgYnkgb25BZGQgd2l0aG91dCBiZWluZyBhdHRhY2hlZFxuICogdG8gdGhlIERPTTogdGhlIG1hcCB3aWxsIGluc2VydCB0aGUgY29udHJvbCdzIGVsZW1lbnQgaW50byB0aGUgRE9NXG4gKiBhcyBuZWNlc3NhcnkuXG4gKi9cblxuLyoqXG4gKiBVbnJlZ2lzdGVyIGEgY29udHJvbCBvbiB0aGUgbWFwIGFuZCBnaXZlIGl0IGEgY2hhbmNlIHRvIGRldGFjaCBldmVudCBsaXN0ZW5lcnNcbiAqIGFuZCByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB7QGxpbmsgTWFwI3JlbW92ZUNvbnRyb2x9XG4gKiBpbnRlcm5hbGx5LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIElDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uUmVtb3ZlXG4gKiBAcGFyYW0ge01hcH0gbWFwIHRoZSBNYXAgdGhpcyBjb250cm9sIHdpbGwgYmUgcmVtb3ZlZCBmcm9tXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfSB0aGVyZSBpcyBubyByZXF1aXJlZCByZXR1cm4gdmFsdWUgZm9yIHRoaXMgbWV0aG9kXG4gKi9cblxuLyoqXG4gKiBPcHRpb25hbGx5IHByb3ZpZGUgYSBkZWZhdWx0IHBvc2l0aW9uIGZvciB0aGlzIGNvbnRyb2wuIElmIHRoaXMgbWV0aG9kXG4gKiBpcyBpbXBsZW1lbnRlZCBhbmQge0BsaW5rIE1hcCNhZGRDb250cm9sfSBpcyBjYWxsZWQgd2l0aG91dCB0aGUgYHBvc2l0aW9uYFxuICogcGFyYW1ldGVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0RGVmYXVsdFBvc2l0aW9uIHdpbGwgYmUgdXNlZCBhcyB0aGVcbiAqIGNvbnRyb2wncyBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBJQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBnZXREZWZhdWx0UG9zaXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IGEgY29udHJvbCBwb3NpdGlvbiwgb25lIG9mIHRoZSB2YWx1ZXMgdmFsaWQgaW4gYWRkQ29udHJvbC5cbiAqL1xuXG4vKipcbiAqIEEgW2BQb2ludGAgZ2VvbWV0cnldKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcG9pbnQtZ2VvbWV0cnkpIG9iamVjdCwgd2hpY2ggaGFzXG4gKiBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIHJlcHJlc2VudGluZyBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvaW50XG4gKi9cblxuLyoqXG4gKiBBIHtAbGluayBQb2ludH0gb3IgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgcmVwcmVzZW50aW5nIGB4YCBhbmQgYHlgIHNjcmVlbiBjb29yZGluYXRlcyBpbiBwaXhlbHMuXG4gKlxuICogQHR5cGVkZWYgeyhQb2ludCB8IEFycmF5PG51bWJlcj4pfSBQb2ludExpa2VcbiAqL1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5pbXBvcnQgeyBleHRlbmQsIGJpbmRBbGwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IERyYWdSb3RhdGVIYW5kbGVyIGZyb20gJy4uL2hhbmRsZXIvZHJhZ19yb3RhdGUnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcblxudHlwZSBPcHRpb25zID0ge1xuICAgIHNob3dDb21wYXNzPzogYm9vbGVhbixcbiAgICBzaG93Wm9vbT86IGJvb2xlYW4sXG4gICAgdmlzdWFsaXplUGl0Y2g/OiBib29sZWFuXG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgICBzaG93Q29tcGFzczogdHJ1ZSxcbiAgICBzaG93Wm9vbTogdHJ1ZSxcbiAgICB2aXN1YWxpemVQaXRjaDogZmFsc2Vcbn07XG5cbi8qKlxuICogQSBgTmF2aWdhdGlvbkNvbnRyb2xgIGNvbnRyb2wgY29udGFpbnMgem9vbSBidXR0b25zIGFuZCBhIGNvbXBhc3MuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaG93Q29tcGFzcz10cnVlXSBJZiBgdHJ1ZWAgdGhlIGNvbXBhc3MgYnV0dG9uIGlzIGluY2x1ZGVkLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaG93Wm9vbT10cnVlXSBJZiBgdHJ1ZWAgdGhlIHpvb20taW4gYW5kIHpvb20tb3V0IGJ1dHRvbnMgYXJlIGluY2x1ZGVkLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aXN1YWxpemVQaXRjaD1mYWxzZV0gSWYgYHRydWVgIHRoZSBwaXRjaCBpcyB2aXN1YWxpemVkIGJ5IHJvdGF0aW5nIFgtYXhpcyBvZiBjb21wYXNzLlxuICogQGV4YW1wbGVcbiAqIHZhciBuYXYgPSBuZXcgbWFwYm94Z2wuTmF2aWdhdGlvbkNvbnRyb2woKTtcbiAqIG1hcC5hZGRDb250cm9sKG5hdiwgJ3RvcC1sZWZ0Jyk7XG4gKiBAc2VlIFtEaXNwbGF5IG1hcCBuYXZpZ2F0aW9uIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL25hdmlnYXRpb24vKVxuICogQHNlZSBbQWRkIGEgdGhpcmQgcGFydHkgdmVjdG9yIHRpbGUgc291cmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RoaXJkLXBhcnR5LylcbiAqL1xuY2xhc3MgTmF2aWdhdGlvbkNvbnRyb2wge1xuICAgIF9tYXA6IE1hcDtcbiAgICBvcHRpb25zOiBPcHRpb25zO1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF96b29tSW5CdXR0b246IEhUTUxFbGVtZW50O1xuICAgIF96b29tT3V0QnV0dG9uOiBIVE1MRWxlbWVudDtcbiAgICBfY29tcGFzczogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbXBhc3NBcnJvdzogSFRNTEVsZW1lbnQ7XG4gICAgX2hhbmRsZXI6IERyYWdSb3RhdGVIYW5kbGVyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwJyk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1pvb20pIHtcbiAgICAgICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgICAgICdfdXBkYXRlWm9vbUJ1dHRvbnMnXG4gICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3pvb21JbkJ1dHRvbiA9IHRoaXMuX2NyZWF0ZUJ1dHRvbignbWFwYm94Z2wtY3RybC1pY29uIG1hcGJveGdsLWN0cmwtem9vbS1pbicsICdab29tIGluJywgKCkgPT4gdGhpcy5fbWFwLnpvb21JbigpKTtcbiAgICAgICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oJ21hcGJveGdsLWN0cmwtaWNvbiBtYXBib3hnbC1jdHJsLXpvb20tb3V0JywgJ1pvb20gb3V0JywgKCkgPT4gdGhpcy5fbWFwLnpvb21PdXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Q29tcGFzcykge1xuICAgICAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAgICAgJ19yb3RhdGVDb21wYXNzQXJyb3cnXG4gICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBhc3MgPSB0aGlzLl9jcmVhdGVCdXR0b24oJ21hcGJveGdsLWN0cmwtaWNvbiBtYXBib3hnbC1jdHJsLWNvbXBhc3MnLCAnUmVzZXQgYmVhcmluZyB0byBub3J0aCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5yZXNldE5vcnRoUGl0Y2goKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVzZXROb3J0aCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY29tcGFzc0Fycm93ID0gRE9NLmNyZWF0ZSgnc3BhbicsICdtYXBib3hnbC1jdHJsLWNvbXBhc3MtYXJyb3cnLCB0aGlzLl9jb21wYXNzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVab29tQnV0dG9ucygpIHtcbiAgICAgICAgY29uc3Qgem9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7XG4gICAgICAgIGlmICh6b29tID09PSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpKSB7XG4gICAgICAgICAgICB0aGlzLl96b29tSW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1pY29uLWRpc2FibGVkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl96b29tSW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1pY29uLWRpc2FibGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHpvb20gPT09IHRoaXMuX21hcC5nZXRNaW5ab29tKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1pY29uLWRpc2FibGVkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl96b29tT3V0QnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtaWNvbi1kaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JvdGF0ZUNvbXBhc3NBcnJvdygpIHtcbiAgICAgICAgY29uc3Qgcm90YXRlID0gdGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoID9cbiAgICAgICAgICAgIGBzY2FsZSgkezEgLyBNYXRoLnBvdyhNYXRoLmNvcyh0aGlzLl9tYXAudHJhbnNmb3JtLnBpdGNoICogKE1hdGguUEkgLyAxODApKSwgMC41KX0pIHJvdGF0ZVgoJHt0aGlzLl9tYXAudHJhbnNmb3JtLnBpdGNofWRlZykgcm90YXRlWigke3RoaXMuX21hcC50cmFuc2Zvcm0uYW5nbGUgKiAoMTgwIC8gTWF0aC5QSSl9ZGVnKWAgOlxuICAgICAgICAgICAgYHJvdGF0ZSgke3RoaXMuX21hcC50cmFuc2Zvcm0uYW5nbGUgKiAoMTgwIC8gTWF0aC5QSSl9ZGVnKWA7XG5cbiAgICAgICAgdGhpcy5fY29tcGFzc0Fycm93LnN0eWxlLnRyYW5zZm9ybSA9IHJvdGF0ZTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1pvb20pIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignem9vbScsIHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Q29tcGFzcykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbigncGl0Y2gnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdyb3RhdGUnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICAgICAgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KCk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyID0gbmV3IERyYWdSb3RhdGVIYW5kbGVyKG1hcCwge2J1dHRvbjogJ2xlZnQnLCBlbGVtZW50OiB0aGlzLl9jb21wYXNzfSk7XG4gICAgICAgICAgICBET00uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9jb21wYXNzLCAnbW91c2Vkb3duJywgdGhpcy5faGFuZGxlci5vbk1vdXNlRG93bik7XG4gICAgICAgICAgICBET00uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9jb21wYXNzLCAndG91Y2hzdGFydCcsIHRoaXMuX2hhbmRsZXIub25Nb3VzZURvd24sIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Wm9vbSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignem9vbScsIHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dDb21wYXNzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigncGl0Y2gnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigncm90YXRlJywgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KTtcbiAgICAgICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX2NvbXBhc3MsICdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVyLm9uTW91c2VEb3duKTtcbiAgICAgICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX2NvbXBhc3MsICd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlci5vbk1vdXNlRG93biwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIuZGlzYWJsZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2hhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgIH1cblxuICAgIF9jcmVhdGVCdXR0b24oY2xhc3NOYW1lOiBzdHJpbmcsIGFyaWFMYWJlbDogc3RyaW5nLCBmbjogKCkgPT4gbWl4ZWQpIHtcbiAgICAgICAgY29uc3QgYSA9IERPTS5jcmVhdGUoJ2J1dHRvbicsIGNsYXNzTmFtZSwgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgYS50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIGEudGl0bGUgPSBhcmlhTGFiZWw7XG4gICAgICAgIGEuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgYXJpYUxhYmVsKTtcbiAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZuKTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBOYXZpZ2F0aW9uQ29udHJvbDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcblxuLyoqXG4gKiBHaXZlbiBhIExuZ0xhdCwgcHJpb3IgcHJvamVjdGVkIHBvc2l0aW9uLCBhbmQgYSB0cmFuc2Zvcm0sIHJldHVybiBhIG5ldyBMbmdMYXQgc2hpZnRlZFxuICogbiDDg8KXIDM2MMOCwrAgZWFzdCBvciB3ZXN0IGZvciBzb21lIG4gw6LCicKlIDAgc3VjaCB0aGF0OlxuICpcbiAqICogdGhlIHByb2plY3RlZCBsb2NhdGlvbiBvZiB0aGUgcmVzdWx0IGlzIG9uIHNjcmVlbiwgaWYgcG9zc2libGUsIGFuZCBzZWNvbmRhcmlseTpcbiAqICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcHJvamVjdGVkIGxvY2F0aW9uIG9mIHRoZSByZXN1bHQgYW5kIHRoZSBwcmlvciBwb3NpdGlvblxuICogICBpcyBtaW5pbWl6ZWQuXG4gKlxuICogVGhlIG9iamVjdCBpcyB0byBwcmVzZXJ2ZSBwZXJjZWl2ZWQgb2JqZWN0IGNvbnN0YW5jeSBmb3IgUG9wdXBzIGFuZCBNYXJrZXJzIGFzIG11Y2ggYXNcbiAqIHBvc3NpYmxlOyB0aGV5IHNob3VsZCBhdm9pZCBzaGlmdGluZyBsYXJnZSBkaXN0YW5jZXMgYWNyb3NzIHRoZSBzY3JlZW4sIGV2ZW4gd2hlbiB0aGVcbiAqIG1hcCBjZW50ZXIgY2hhbmdlcyBieSDDgsKxMzYww4LCsCBkdWUgdG8gYXV0b21hdGljIHdyYXBwaW5nLCBhbmQgd2hlbiBhYm91dCB0byBnbyBvZmYgc2NyZWVuLFxuICogc2hvdWxkIHdyYXAganVzdCBlbm91Z2ggdG8gYXZvaWQgZG9pbmcgc28uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG5nTGF0OiBMbmdMYXQsIHByaW9yUG9zOiA/UG9pbnQsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogTG5nTGF0IHtcbiAgICBsbmdMYXQgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcsIGxuZ0xhdC5sYXQpO1xuXG4gICAgLy8gRmlyc3QsIHRyeSBzaGlmdGluZyBvbmUgd29ybGQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYW5kIHNlZSBpZiBlaXRoZXIgaXMgY2xvc2VyIHRvIHRoZVxuICAgIC8vIHByaW9yIHBvc2l0aW9uLiBUaGlzIHByZXNlcnZlcyBvYmplY3QgY29uc3RhbmN5IHdoZW4gdGhlIG1hcCBjZW50ZXIgaXMgYXV0by13cmFwcGVkXG4gICAgLy8gZHVyaW5nIGFuaW1hdGlvbnMuXG4gICAgaWYgKHByaW9yUG9zKSB7XG4gICAgICAgIGNvbnN0IGxlZnQgID0gbmV3IExuZ0xhdChsbmdMYXQubG5nIC0gMzYwLCBsbmdMYXQubGF0KTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcgKyAzNjAsIGxuZ0xhdC5sYXQpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KGxuZ0xhdCkuZGlzdFNxcihwcmlvclBvcyk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChsZWZ0KS5kaXN0U3FyKHByaW9yUG9zKSA8IGRlbHRhKSB7XG4gICAgICAgICAgICBsbmdMYXQgPSBsZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHJpZ2h0KS5kaXN0U3FyKHByaW9yUG9zKSA8IGRlbHRhKSB7XG4gICAgICAgICAgICBsbmdMYXQgPSByaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlY29uZCwgd3JhcCB0b3dhcmQgdGhlIGNlbnRlciB1bnRpbCB0aGUgbmV3IHBvc2l0aW9uIGlzIG9uIHNjcmVlbiwgb3Igd2UgY2FuJ3QgZ2V0XG4gICAgLy8gYW55IGNsb3Nlci5cbiAgICB3aGlsZSAoTWF0aC5hYnMobG5nTGF0LmxuZyAtIHRyYW5zZm9ybS5jZW50ZXIubG5nKSA+IDE4MCkge1xuICAgICAgICBjb25zdCBwb3MgPSB0cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChsbmdMYXQpO1xuICAgICAgICBpZiAocG9zLnggPj0gMCAmJiBwb3MueSA+PSAwICYmIHBvcy54IDw9IHRyYW5zZm9ybS53aWR0aCAmJiBwb3MueSA8PSB0cmFuc2Zvcm0uaGVpZ2h0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobG5nTGF0LmxuZyA+IHRyYW5zZm9ybS5jZW50ZXIubG5nKSB7XG4gICAgICAgICAgICBsbmdMYXQubG5nIC09IDM2MDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxuZ0xhdC5sbmcgKz0gMzYwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxuZ0xhdDtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIEFuY2hvciA9XG4gICAgfCAnY2VudGVyJ1xuICAgIHwgJ3RvcCdcbiAgICB8ICdib3R0b20nXG4gICAgfCAnbGVmdCdcbiAgICB8ICdyaWdodCdcbiAgICB8ICd0b3AtbGVmdCdcbiAgICB8ICd0b3AtcmlnaHQnXG4gICAgfCAnYm90dG9tLWxlZnQnXG4gICAgfCAnYm90dG9tLXJpZ2h0JztcblxuZXhwb3J0IGNvbnN0IGFuY2hvclRyYW5zbGF0ZToge1tBbmNob3JdOiBzdHJpbmd9ID0ge1xuICAgICdjZW50ZXInOiAndHJhbnNsYXRlKC01MCUsLTUwJSknLFxuICAgICd0b3AnOiAndHJhbnNsYXRlKC01MCUsMCknLFxuICAgICd0b3AtbGVmdCc6ICd0cmFuc2xhdGUoMCwwKScsXG4gICAgJ3RvcC1yaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsMCknLFxuICAgICdib3R0b20nOiAndHJhbnNsYXRlKC01MCUsLTEwMCUpJyxcbiAgICAnYm90dG9tLWxlZnQnOiAndHJhbnNsYXRlKDAsLTEwMCUpJyxcbiAgICAnYm90dG9tLXJpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtMTAwJSknLFxuICAgICdsZWZ0JzogJ3RyYW5zbGF0ZSgwLC01MCUpJyxcbiAgICAncmlnaHQnOiAndHJhbnNsYXRlKC0xMDAlLC01MCUpJ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QW5jaG9yQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGFuY2hvcjogQW5jaG9yLCBwcmVmaXg6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGFuY2hvclRyYW5zbGF0ZSkge1xuICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKGBtYXBib3hnbC0ke3ByZWZpeH0tYW5jaG9yLSR7a2V5fWApO1xuICAgIH1cbiAgICBjbGFzc0xpc3QuYWRkKGBtYXBib3hnbC0ke3ByZWZpeH0tYW5jaG9yLSR7YW5jaG9yfWApO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi91dGlsL2RvbSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93JztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHNtYXJ0V3JhcCBmcm9tICcuLi91dGlsL3NtYXJ0X3dyYXAnO1xuaW1wb3J0IHsgYmluZEFsbCwgZXh0ZW5kIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IHR5cGUgQW5jaG9yLCBhbmNob3JUcmFuc2xhdGUsIGFwcGx5QW5jaG9yQ2xhc3MgfSBmcm9tICcuL2FuY2hvcic7XG5pbXBvcnQgeyBFdmVudCwgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHR5cGUgUG9wdXAgZnJvbSAnLi9wb3B1cCc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSBcIi4uL2dlby9sbmdfbGF0XCI7XG5pbXBvcnQgdHlwZSB7TWFwTW91c2VFdmVudCwgTWFwVG91Y2hFdmVudH0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHR5cGUge1BvaW50TGlrZX0gZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnQsXG4gICAgb2Zmc2V0PzogUG9pbnRMaWtlLFxuICAgIGFuY2hvcj86IEFuY2hvcixcbiAgICBjb2xvcj86IHN0cmluZyxcbiAgICBkcmFnZ2FibGU/OiBib29sZWFuXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXJrZXIgY29tcG9uZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbb3B0aW9ucy5lbGVtZW50XSBET00gZWxlbWVudCB0byB1c2UgYXMgYSBtYXJrZXIuIFRoZSBkZWZhdWx0IGlzIGEgbGlnaHQgYmx1ZSwgZHJvcGxldC1zaGFwZWQgU1ZHIG1hcmtlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hbmNob3I9J2NlbnRlciddIEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHBhcnQgb2YgdGhlIE1hcmtlciB0aGF0IHNob3VsZCBiZSBwb3NpdGlvbmVkIGNsb3Nlc3QgdG8gdGhlIGNvb3JkaW5hdGUgc2V0IHZpYSB7QGxpbmsgTWFya2VyI3NldExuZ0xhdH0uXG4gKiAgIE9wdGlvbnMgYXJlIGAnY2VudGVyJ2AsIGAndG9wJ2AsIGAnYm90dG9tJ2AsIGAnbGVmdCdgLCBgJ3JpZ2h0J2AsIGAndG9wLWxlZnQnYCwgYCd0b3AtcmlnaHQnYCwgYCdib3R0b20tbGVmdCdgLCBhbmQgYCdib3R0b20tcmlnaHQnYC5cbiAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXRdIFRoZSBvZmZzZXQgaW4gcGl4ZWxzIGFzIGEge0BsaW5rIFBvaW50TGlrZX0gb2JqZWN0IHRvIGFwcGx5IHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50J3MgY2VudGVyLiBOZWdhdGl2ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29sb3I9JyMzRkIxQ0UnXSBUaGUgY29sb3IgdG8gdXNlIGZvciB0aGUgZGVmYXVsdCBtYXJrZXIgaWYgb3B0aW9ucy5lbGVtZW50IGlzIG5vdCBwcm92aWRlZC4gVGhlIGRlZmF1bHQgaXMgbGlnaHQgYmx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZHJhZ2dhYmxlPWZhbHNlXSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBhIG1hcmtlciBpcyBhYmxlIHRvIGJlIGRyYWdnZWQgdG8gYSBuZXcgcG9zaXRpb24gb24gdGhlIG1hcC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgbWFya2VyID0gbmV3IG1hcGJveGdsLk1hcmtlcigpXG4gKiAgIC5zZXRMbmdMYXQoWzMwLjUsIDUwLjVdKVxuICogICAuYWRkVG8obWFwKTtcbiAqIEBzZWUgW0FkZCBjdXN0b20gaWNvbnMgd2l0aCBNYXJrZXJzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2N1c3RvbS1tYXJrZXItaWNvbnMvKVxuICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIE1hcmtlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtbWFya2VyLylcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFya2VyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX21hcDogTWFwO1xuICAgIF9hbmNob3I6IEFuY2hvcjtcbiAgICBfb2Zmc2V0OiBQb2ludDtcbiAgICBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgX3BvcHVwOiA/UG9wdXA7XG4gICAgX2xuZ0xhdDogTG5nTGF0O1xuICAgIF9wb3M6ID9Qb2ludDtcbiAgICBfY29sb3I6ID9zdHJpbmc7XG4gICAgX2RlZmF1bHRNYXJrZXI6IGJvb2xlYW47XG4gICAgX2RyYWdnYWJsZTogYm9vbGVhbjtcbiAgICBfc3RhdGU6ICdpbmFjdGl2ZScgfCAncGVuZGluZycgfCAnYWN0aXZlJzsgLy8gdXNlZCBmb3IgaGFuZGxpbmcgZHJhZyBldmVudHNcbiAgICBfcG9zaXRpb25EZWx0YTogP251bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBPcHRpb25zLCBsZWdhY3lPcHRpb25zPzogT3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAtLSB0aGUgY29uc3RydWN0b3IgdXNlZCB0byBhY2NlcHQgdGhlIGVsZW1lbnQgYXMgYVxuICAgICAgICAvLyByZXF1aXJlZCBmaXJzdCBhcmd1bWVudCwgYmVmb3JlIGl0IHdhcyBtYWRlIG9wdGlvbmFsLlxuICAgICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRWxlbWVudCB8fCBsZWdhY3lPcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gZXh0ZW5kKHtlbGVtZW50OiBvcHRpb25zfSwgbGVnYWN5T3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfdXBkYXRlJyxcbiAgICAgICAgICAgICdfb25Nb3ZlJyxcbiAgICAgICAgICAgICdfb25VcCcsXG4gICAgICAgICAgICAnX2FkZERyYWdIYW5kbGVyJyxcbiAgICAgICAgICAgICdfb25NYXBDbGljaydcbiAgICAgICAgXSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5fYW5jaG9yID0gb3B0aW9ucyAmJiBvcHRpb25zLmFuY2hvciB8fCAnY2VudGVyJztcbiAgICAgICAgdGhpcy5fY29sb3IgPSBvcHRpb25zICYmIG9wdGlvbnMuY29sb3IgfHwgJyMzRkIxQ0UnO1xuICAgICAgICB0aGlzLl9kcmFnZ2FibGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZHJhZ2dhYmxlIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdpbmFjdGl2ZSc7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRNYXJrZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudCA9IERPTS5jcmVhdGUoJ2RpdicpO1xuXG4gICAgICAgICAgICAvLyBjcmVhdGUgZGVmYXVsdCBtYXAgbWFya2VyIFNWR1xuICAgICAgICAgICAgY29uc3Qgc3ZnID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICdoZWlnaHQnLCAnNDFweCcpO1xuICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICd3aWR0aCcsICcyN3B4Jyk7XG4gICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCAnMCAwIDI3IDQxJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtlckxhcmdlID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBtYXJrZXJMYXJnZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnc3Ryb2tlJywgJ25vbmUnKTtcbiAgICAgICAgICAgIG1hcmtlckxhcmdlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdzdHJva2Utd2lkdGgnLCAnMScpO1xuICAgICAgICAgICAgbWFya2VyTGFyZ2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnbm9uZScpO1xuICAgICAgICAgICAgbWFya2VyTGFyZ2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwtcnVsZScsICdldmVub2RkJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2UxID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBwYWdlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbC1ydWxlJywgJ25vbnplcm8nKTtcblxuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzaGFkb3cuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMy4wLCAyOS4wKScpO1xuICAgICAgICAgICAgc2hhZG93LnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMwMDAwMDAnKTtcblxuICAgICAgICAgICAgY29uc3QgZWxsaXBzZXMgPSBbXG4gICAgICAgICAgICAgICAgeydyeCc6ICcxMC41JywgJ3J5JzogJzUuMjUwMDIyNzMnfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzEwLjUnLCAncnknOiAnNS4yNTAwMjI3Myd9LFxuICAgICAgICAgICAgICAgIHsncngnOiAnOS41JywgJ3J5JzogJzQuNzcyNzUwMDcnfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzguNScsICdyeSc6ICc0LjI5NTQ5OTM2J30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICc3LjUnLCAncnknOiAnMy44MTgyMjMwOCd9LFxuICAgICAgICAgICAgICAgIHsncngnOiAnNi41JywgJ3J5JzogJzMuMzQwOTQ2NzknfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzUuNScsICdyeSc6ICcyLjg2MzY3MDUxJ30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICc0LjUnLCAncnknOiAnMi4zODYzNjg2NCd9XG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2YgZWxsaXBzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGxpcHNlID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdlbGxpcHNlJyk7XG4gICAgICAgICAgICAgICAgZWxsaXBzZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnb3BhY2l0eScsICcwLjA0Jyk7XG4gICAgICAgICAgICAgICAgZWxsaXBzZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3gnLCAnMTAuNScpO1xuICAgICAgICAgICAgICAgIGVsbGlwc2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N5JywgJzUuODAwMjkwMDgnKTtcbiAgICAgICAgICAgICAgICBlbGxpcHNlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdyeCcsIGRhdGFbJ3J4J10pO1xuICAgICAgICAgICAgICAgIGVsbGlwc2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3J5JywgZGF0YVsncnknXSk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmFwcGVuZENoaWxkKGVsbGlwc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5fY29sb3IpO1xuXG4gICAgICAgICAgICBjb25zdCBiZ1BhdGggPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIGJnUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMjcsMTMuNSBDMjcsMTkuMDc0NjQ0IDIwLjI1MDAwMSwyNy4wMDAwMDIgMTQuNzUsMzQuNTAwMDAyIEMxNC4wMTY2NjUsMzUuNTAwMDA0IDEyLjk4MzMzNSwzNS41MDAwMDQgMTIuMjUsMzQuNTAwMDAyIEM2Ljc0OTk5OTMsMjcuMDAwMDAyIDAsMTkuMjIyNTYyIDAsMTMuNSBDMCw2LjA0NDE1NTkgNi4wNDQxNTU5LDAgMTMuNSwwIEMyMC45NTU4NDQsMCAyNyw2LjA0NDE1NTkgMjcsMTMuNSBaJyk7XG5cbiAgICAgICAgICAgIGJhY2tncm91bmQuYXBwZW5kQ2hpbGQoYmdQYXRoKTtcblxuICAgICAgICAgICAgY29uc3QgYm9yZGVyID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBib3JkZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ29wYWNpdHknLCAnMC4yNScpO1xuICAgICAgICAgICAgYm9yZGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMwMDAwMDAnKTtcblxuICAgICAgICAgICAgY29uc3QgYm9yZGVyUGF0aCA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgYm9yZGVyUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTMuNSwwIEM2LjA0NDE1NTksMCAwLDYuMDQ0MTU1OSAwLDEzLjUgQzAsMTkuMjIyNTYyIDYuNzQ5OTk5MywyNyAxMi4yNSwzNC41IEMxMywzNS41MjI3MjcgMTQuMDE2NjY0LDM1LjUwMDAwNCAxNC43NSwzNC41IEMyMC4yNTAwMDEsMjcgMjcsMTkuMDc0NjQ0IDI3LDEzLjUgQzI3LDYuMDQ0MTU1OSAyMC45NTU4NDQsMCAxMy41LDAgWiBNMTMuNSwxIEMyMC40MTU0MDQsMSAyNiw2LjU4NDU5NiAyNiwxMy41IEMyNiwxNS44OTg2NTcgMjQuNDk1NTg0LDE5LjE4MTQzMSAyMi4yMjA3MDMsMjIuNzM4MjgxIEMxOS45NDU4MjMsMjYuMjk1MTMyIDE2LjcwNTExOSwzMC4xNDIxNjcgMTMuOTQzMzU5LDMzLjkwODIwMyBDMTMuNzQzNDQ1LDM0LjE4MDgxNCAxMy42MTI3MTUsMzQuMzIyNzM4IDEzLjUsMzQuNDQxNDA2IEMxMy4zODcyODUsMzQuMzIyNzM4IDEzLjI1NjU1NSwzNC4xODA4MTQgMTMuMDU2NjQxLDMzLjkwODIwMyBDMTAuMjg0NDgxLDMwLjEyNzk4NSA3LjQxNDg2ODQsMjYuMzE0MTU5IDUuMDE1NjI1LDIyLjc3MzQzOCBDMi42MTYzODE2LDE5LjIzMjcxNSAxLDE1Ljk1MzUzOCAxLDEzLjUgQzEsNi41ODQ1OTYgNi41ODQ1OTYsMSAxMy41LDEgWicpO1xuXG4gICAgICAgICAgICBib3JkZXIuYXBwZW5kQ2hpbGQoYm9yZGVyUGF0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1ha2kgPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTtcbiAgICAgICAgICAgIG1ha2kuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoNi4wLCA3LjApJyk7XG4gICAgICAgICAgICBtYWtpLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyNGRkZGRkYnKTtcblxuICAgICAgICAgICAgY29uc3QgY2lyY2xlQ29udGFpbmVyID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBjaXJjbGVDb250YWluZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoOC4wLCA4LjApJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZTEgPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2NpcmNsZScpO1xuICAgICAgICAgICAgY2lyY2xlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjMDAwMDAwJyk7XG4gICAgICAgICAgICBjaXJjbGUxLnNldEF0dHJpYnV0ZU5TKG51bGwsICdvcGFjaXR5JywgJzAuMjUnKTtcbiAgICAgICAgICAgIGNpcmNsZTEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N4JywgJzUuNScpO1xuICAgICAgICAgICAgY2lyY2xlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3knLCAnNS41Jyk7XG4gICAgICAgICAgICBjaXJjbGUxLnNldEF0dHJpYnV0ZU5TKG51bGwsICdyJywgJzUuNDk5OTk2MicpO1xuXG4gICAgICAgICAgICBjb25zdCBjaXJjbGUyID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdjaXJjbGUnKTtcbiAgICAgICAgICAgIGNpcmNsZTIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnI0ZGRkZGRicpO1xuICAgICAgICAgICAgY2lyY2xlMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3gnLCAnNS41Jyk7XG4gICAgICAgICAgICBjaXJjbGUyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdjeScsICc1LjUnKTtcbiAgICAgICAgICAgIGNpcmNsZTIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3InLCAnNS40OTk5OTYyJyk7XG5cbiAgICAgICAgICAgIGNpcmNsZUNvbnRhaW5lci5hcHBlbmRDaGlsZChjaXJjbGUxKTtcbiAgICAgICAgICAgIGNpcmNsZUNvbnRhaW5lci5hcHBlbmRDaGlsZChjaXJjbGUyKTtcblxuICAgICAgICAgICAgcGFnZTEuYXBwZW5kQ2hpbGQoc2hhZG93KTtcbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKGJhY2tncm91bmQpO1xuICAgICAgICAgICAgcGFnZTEuYXBwZW5kQ2hpbGQoYm9yZGVyKTtcbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKG1ha2kpO1xuICAgICAgICAgICAgcGFnZTEuYXBwZW5kQ2hpbGQoY2lyY2xlQ29udGFpbmVyKTtcblxuICAgICAgICAgICAgc3ZnLmFwcGVuZENoaWxkKHBhZ2UxKTtcblxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChzdmcpO1xuXG4gICAgICAgICAgICAvLyBpZiBubyBlbGVtZW50IGFuZCBubyBvZmZzZXQgb3B0aW9uIGdpdmVuIGFwcGx5IGFuIG9mZnNldCBmb3IgdGhlIGRlZmF1bHQgbWFya2VyXG4gICAgICAgICAgICAvLyB0aGUgLTE0IGFzIHRoZSB5IHZhbHVlIG9mIHRoZSBkZWZhdWx0IG1hcmtlciBvZmZzZXQgd2FzIGRldGVybWluZWQgYXMgZm9sbG93c1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIHRoZSBtYXJrZXIgdGlwIGlzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHNoYWRvdyBlbGxpcHNlIGZyb20gdGhlIGRlZmF1bHQgc3ZnXG4gICAgICAgICAgICAvLyB0aGUgeSB2YWx1ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBzaGFkb3cgZWxsaXBzZSByZWxhdGl2ZSB0byB0aGUgc3ZnIHRvcCBsZWZ0IGlzIFwic2hhZG93IHRyYW5zZm9ybSB0cmFuc2xhdGUteSAoMjkuMCkgKyBlbGxpcHNlIGN5ICg1LjgwMDI5MDA4KVwiXG4gICAgICAgICAgICAvLyBvZmZzZXQgdG8gdGhlIHN2ZyBjZW50ZXIgXCJoZWlnaHQgKDQxIC8gMilcIiBnaXZlcyAoMjkuMCArIDUuODAwMjkwMDgpIC0gKDQxIC8gMikgYW5kIHJvdW5kZWQgZm9yIGFuIGludGVnZXIgcGl4ZWwgb2Zmc2V0IGdpdmVzIDE0XG4gICAgICAgICAgICAvLyBuZWdhdGl2ZSBpcyB1c2VkIHRvIG1vdmUgdGhlIG1hcmtlciB1cCBmcm9tIHRoZSBjZW50ZXIgc28gdGhlIHRpcCBpcyBhdCB0aGUgTWFya2VyIGxuZ0xhdFxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gUG9pbnQuY29udmVydChvcHRpb25zICYmIG9wdGlvbnMub2Zmc2V0IHx8IFswLCAtMTRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMgJiYgb3B0aW9ucy5vZmZzZXQgfHwgWzAsIDBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtbWFya2VyJyk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGU6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXBwbHlBbmNob3JDbGFzcyh0aGlzLl9lbGVtZW50LCB0aGlzLl9hbmNob3IsICdtYXJrZXInKTtcblxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgdGhlIG1hcmtlciB0byBhIG1hcFxuICAgICAqIEBwYXJhbSB7TWFwfSBtYXBcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICBhZGRUbyhtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIG1hcC5nZXRDYW52YXNDb250YWluZXIoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgdGhpcy5zZXREcmFnZ2FibGUodGhpcy5fZHJhZ2dhYmxlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgYXR0YWNoZWQgdGhlIGBjbGlja2AgbGlzdGVuZXIgdG8gdGhlIG1hcmtlciBlbGVtZW50LCB0aGUgcG9wdXBcbiAgICAgICAgLy8gd291bGQgY2xvc2Ugb25jZSB0aGUgZXZlbnQgcHJvcG9nYXRlZCB0byBgbWFwYCBkdWUgdG8gdGhlXG4gICAgICAgIC8vIGBQb3B1cCNfb25DbGlja0Nsb3NlYCBsaXN0ZW5lci5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIHRoaXMuX29uTWFwQ2xpY2spO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIG1hcmtlciBmcm9tIGEgbWFwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbWFya2VyID0gbmV3IG1hcGJveGdsLk1hcmtlcigpLmFkZFRvKG1hcCk7XG4gICAgICogbWFya2VyLnJlbW92ZSgpO1xuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9vbk1hcENsaWNrKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZWRvd24nLCB0aGlzLl9hZGREcmFnSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCd0b3VjaHN0YXJ0JywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2V1cCcsIHRoaXMuX29uVXApO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigndG91Y2hlbmQnLCB0aGlzLl9vblVwKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICAgICAgfVxuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHRoaXMuX3BvcHVwLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hcmtlcidzIGdlb2dyYXBoaWNhbCBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhlIHJlc3VsdCBtYXkgZGlmZmVyIGJ5IGEgbXVsdGlwbGUgb2YgMzYwIGRlZ3JlZXMgZnJvbSB0aGUgbG9uZ2l0dWRlIHByZXZpb3VzbHlcbiAgICAgKiBzZXQgYnkgYHNldExuZ0xhdGAgYmVjYXVzZSBgTWFya2VyYCB3cmFwcyB0aGUgYW5jaG9yIGxvbmdpdHVkZSBhY3Jvc3MgY29waWVzIG9mIHRoZSB3b3JsZCB0byBrZWVwXG4gICAgICogdGhlIG1hcmtlciBvbiBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fVxuICAgICAqL1xuICAgIGdldExuZ0xhdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xuZ0xhdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1hcmtlcidzIGdlb2dyYXBoaWNhbCBwb3NpdGlvbiBhbmQgbW92ZSBpdC5cbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRMbmdMYXQobG5nbGF0OiBMbmdMYXRMaWtlKSB7XG4gICAgICAgIHRoaXMuX2xuZ0xhdCA9IExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCk7XG4gICAgICAgIHRoaXMuX3BvcyA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkgdGhpcy5fcG9wdXAuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgTWFya2VyYCdzIEhUTUwgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBnZXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBhIFBvcHVwIHRvIHRoZSBNYXJrZXJcbiAgICAgKiBAcGFyYW0gcG9wdXAgYW4gaW5zdGFuY2Ugb2YgdGhlIGBQb3B1cGAgY2xhc3MuIElmIHVuZGVmaW5lZCBvciBudWxsLCBhbnkgcG9wdXBcbiAgICAgKiBzZXQgb24gdGhpcyBgTWFya2VyYCBpbnN0YW5jZSBpcyB1bnNldFxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFBvcHVwKHBvcHVwOiA/UG9wdXApIHtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3B1cCkge1xuICAgICAgICAgICAgaWYgKCEoJ29mZnNldCcgaW4gcG9wdXAub3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJIZWlnaHQgPSA0MSAtICg1LjggLyAyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJSYWRpdXMgPSAxMy41O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVhck9mZnNldCA9IE1hdGguc3FydChNYXRoLnBvdyhtYXJrZXJSYWRpdXMsIDIpIC8gMik7XG4gICAgICAgICAgICAgICAgcG9wdXAub3B0aW9ucy5vZmZzZXQgPSB0aGlzLl9kZWZhdWx0TWFya2VyID8ge1xuICAgICAgICAgICAgICAgICAgICAndG9wJzogWzAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAndG9wLWxlZnQnOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICd0b3AtcmlnaHQnOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICdib3R0b20nOiBbMCwgLW1hcmtlckhlaWdodF0sXG4gICAgICAgICAgICAgICAgICAgICdib3R0b20tbGVmdCc6IFtsaW5lYXJPZmZzZXQsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMgKyBsaW5lYXJPZmZzZXQpICogLTFdLFxuICAgICAgICAgICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogWy1saW5lYXJPZmZzZXQsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMgKyBsaW5lYXJPZmZzZXQpICogLTFdLFxuICAgICAgICAgICAgICAgICAgICAnbGVmdCc6IFttYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdLFxuICAgICAgICAgICAgICAgICAgICAncmlnaHQnOiBbLW1hcmtlclJhZGl1cywgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cykgKiAtMV1cbiAgICAgICAgICAgICAgICB9IDogdGhpcy5fb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBwb3B1cDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sbmdMYXQpIHRoaXMuX3BvcHVwLnNldExuZ0xhdCh0aGlzLl9sbmdMYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX29uTWFwQ2xpY2soZTogTWFwTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZS5vcmlnaW5hbEV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICh0YXJnZXRFbGVtZW50ID09PSBlbGVtZW50IHx8IGVsZW1lbnQuY29udGFpbnMoKHRhcmdldEVsZW1lbnQ6IGFueSkpKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUG9wdXAgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byB0aGUgTWFya2VyXG4gICAgICogQHJldHVybnMge1BvcHVwfSBwb3B1cFxuICAgICAqL1xuICAgIGdldFBvcHVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgb3IgY2xvc2VzIHRoZSBib3VuZCBwb3B1cCwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgdG9nZ2xlUG9wdXAoKSB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gdGhpcy5fcG9wdXA7XG5cbiAgICAgICAgaWYgKCFwb3B1cCkgcmV0dXJuIHRoaXM7XG4gICAgICAgIGVsc2UgaWYgKHBvcHVwLmlzT3BlbigpKSBwb3B1cC5yZW1vdmUoKTtcbiAgICAgICAgZWxzZSBwb3B1cC5hZGRUbyh0aGlzLl9tYXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfdXBkYXRlKGU/OiB7dHlwZTogJ21vdmUnIHwgJ21vdmVlbmQnfSkge1xuICAgICAgICBpZiAoIXRoaXMuX21hcCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLl9tYXAudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9sbmdMYXQgPSBzbWFydFdyYXAodGhpcy5fbG5nTGF0LCB0aGlzLl9wb3MsIHRoaXMuX21hcC50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9zID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KS5fYWRkKHRoaXMuX29mZnNldCk7XG5cbiAgICAgICAgLy8gYmVjYXVzZSByb3VuZGluZyB0aGUgY29vcmRpbmF0ZXMgYXQgZXZlcnkgYG1vdmVgIGV2ZW50IGNhdXNlcyBzdHV0dGVyZWQgem9vbWluZ1xuICAgICAgICAvLyB3ZSBvbmx5IHJvdW5kIHRoZW0gd2hlbiBfdXBkYXRlIGlzIGNhbGxlZCB3aXRoIGBtb3ZlZW5kYCBvciB3aGVuIGl0cyBjYWxsZWQgd2l0aFxuICAgICAgICAvLyBubyBhcmd1bWVudHMgKHdoZW4gdGhlIE1hcmtlciBpcyBpbml0aWFsaXplZCBvciBNYXJrZXIjc2V0TG5nTGF0IGlzIGludm9rZWQpLlxuICAgICAgICBpZiAoIWUgfHwgZS50eXBlID09PSBcIm1vdmVlbmRcIikge1xuICAgICAgICAgICAgdGhpcy5fcG9zID0gdGhpcy5fcG9zLnJvdW5kKCk7XG4gICAgICAgIH1cblxuICAgICAgICBET00uc2V0VHJhbnNmb3JtKHRoaXMuX2VsZW1lbnQsIGAke2FuY2hvclRyYW5zbGF0ZVt0aGlzLl9hbmNob3JdfSB0cmFuc2xhdGUoJHt0aGlzLl9wb3MueH1weCwgJHt0aGlzLl9wb3MueX1weClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hcmtlcidzIG9mZnNldC5cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9XG4gICAgICovXG4gICAgZ2V0T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG9mZnNldCBvZiB0aGUgbWFya2VyXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IG9mZnNldCBUaGUgb2Zmc2V0IGluIHBpeGVscyBhcyBhIHtAbGluayBQb2ludExpa2V9IG9iamVjdCB0byBhcHBseSByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCdzIGNlbnRlci4gTmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldE9mZnNldChvZmZzZXQ6IFBvaW50TGlrZSkge1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9mZnNldCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfb25Nb3ZlKGU6IE1hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3BvcyA9IGUucG9pbnQuc3ViKHRoaXMuX3Bvc2l0aW9uRGVsdGEpO1xuICAgICAgICB0aGlzLl9sbmdMYXQgPSB0aGlzLl9tYXAudW5wcm9qZWN0KHRoaXMuX3Bvcyk7XG4gICAgICAgIHRoaXMuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCk7XG4gICAgICAgIC8vIHN1cHByZXNzIGNsaWNrIGV2ZW50IHNvIHRoYXQgcG9wdXBzIGRvbid0IHRvZ2dsZSBvbiBkcmFnXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcblxuICAgICAgICAvLyBtYWtlIHN1cmUgZHJhZ3N0YXJ0IG9ubHkgZmlyZXMgb24gdGhlIGZpcnN0IG1vdmUgZXZlbnQgYWZ0ZXIgbW91c2Vkb3duLlxuICAgICAgICAvLyB0aGlzIGNhbid0IGJlIG9uIG1vdXNlZG93biBiZWNhdXNlIHRoYXQgZXZlbnQgZG9lc24ndCBuZWNlc3NhcmlseVxuICAgICAgICAvLyBpbXBseSB0aGF0IGEgZHJhZyBpcyBhYm91dCB0byBoYXBwZW4uXG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdhY3RpdmUnO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZpcmVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IGRyYWdzdGFydFxuICAgICAgICAgICAgICogQG1lbWJlcm9mIE1hcmtlclxuICAgICAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtNYXJrZXJ9IG1hcmtlciBvYmplY3QgdGhhdCBpcyBiZWluZyBkcmFnZ2VkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RyYWdzdGFydCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGlsZSBkcmFnZ2luZ1xuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgZHJhZ1xuICAgICAgICAgKiBAbWVtYmVyb2YgTWFya2VyXG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge01hcmtlcn0gbWFya2VyIG9iamVjdCB0aGF0IGlzIGJlaW5nIGRyYWdnZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RyYWcnKSk7XG4gICAgfVxuXG4gICAgX29uVXAoKSB7XG4gICAgICAgIC8vIHJldmVydCB0byBub3JtYWwgcG9pbnRlciBldmVudCBoYW5kbGluZ1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uRGVsdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuXG4gICAgICAgIC8vIG9ubHkgZmlyZSBkcmFnZW5kIGlmIGl0IHdhcyBwcmVjZWRlZCBieSBhdCBsZWFzdCBvbmUgZHJhZyBldmVudFxuICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgbWFya2VyIGlzIGZpbmlzaGVkIGJlaW5nIGRyYWdnZWRcbiAgICAgICAgICAgICpcbiAgICAgICAgICAgICogQGV2ZW50IGRyYWdlbmRcbiAgICAgICAgICAgICogQG1lbWJlcm9mIE1hcmtlclxuICAgICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICAgICogQHByb3BlcnR5IHtNYXJrZXJ9IG1hcmtlciBvYmplY3QgdGhhdCB3YXMgZHJhZ2dlZFxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RyYWdlbmQnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdpbmFjdGl2ZSc7XG4gICAgfVxuXG4gICAgX2FkZERyYWdIYW5kbGVyKGU6IE1hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50LmNvbnRhaW5zKChlLm9yaWdpbmFsRXZlbnQudGFyZ2V0OiBhbnkpKSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgcGl4ZWwgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY2xpY2sgcG9pbnRcbiAgICAgICAgICAgIC8vIGFuZCB0aGUgbWFya2VyIHBvc2l0aW9uLCB3aXRoIHRoZSBvZmZzZXQgYWNjb3VudGVkIGZvci4gVGhlbiB3ZVxuICAgICAgICAgICAgLy8gY2FuIHN1YnRyYWN0IHRoaXMgZGlzdGFuY2UgZnJvbSB0aGUgbW91c2Vtb3ZlIGV2ZW50J3MgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IG1hcmtlciBwb3NpdGlvbi5cbiAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZSBtYXJrZXIgJ2p1bXBzJyB0byB0aGUgY2xpY2sgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIGNyZWF0aW5nIGEgamFycmluZyBVWCBlZmZlY3QuXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkRlbHRhID0gZS5wb2ludC5zdWIodGhpcy5fcG9zKS5hZGQodGhpcy5fb2Zmc2V0KTtcblxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAncGVuZGluZyc7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub25jZSgnbW91c2V1cCcsIHRoaXMuX29uVXApO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uY2UoJ3RvdWNoZW5kJywgdGhpcy5fb25VcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgZHJhZ2dhYmxlYCBwcm9wZXJ0eSBhbmQgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbWFya2VyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkQmVEcmFnZ2FibGU9ZmFsc2VdIFR1cm5zIGRyYWcgZnVuY3Rpb25hbGl0eSBvbi9vZmZcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXREcmFnZ2FibGUoc2hvdWxkQmVEcmFnZ2FibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlID0gISFzaG91bGRCZURyYWdnYWJsZTsgLy8gY29udmVydCBwb3NzaWJsZSB1bmRlZmluZWQgdmFsdWUgdG8gZmFsc2VcblxuICAgICAgICAvLyBoYW5kbGUgY2FzZSB3aGVyZSBtYXAgbWF5IG5vdCBleGlzdCB5ZXRcbiAgICAgICAgLy8gZS5nLiB3aGVuIHNldERyYWdnYWJsZSBpcyBjYWxsZWQgYmVmb3JlIGFkZFRvXG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRCZURyYWdnYWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbigndG91Y2hzdGFydCcsIHRoaXMuX2FkZERyYWdIYW5kbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3RvdWNoc3RhcnQnLCB0aGlzLl9hZGREcmFnSGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcmtlciBjYW4gYmUgZHJhZ2dlZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzRHJhZ2dhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ2dhYmxlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IEV2ZW50LCBFdmVudGVkIH0gZnJvbSAnLi4vLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgeyBleHRlbmQsIGJpbmRBbGwsIHdhcm5PbmNlIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IE1hcmtlciBmcm9tICcuLi9tYXJrZXInO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcbmltcG9ydCB0eXBlIHsgQW5pbWF0aW9uT3B0aW9ucywgQ2FtZXJhT3B0aW9ucyB9IGZyb20gJy4uL2NhbWVyYSc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBwb3NpdGlvbk9wdGlvbnM/OiBQb3NpdGlvbk9wdGlvbnMsXG4gICAgZml0Qm91bmRzT3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMgJiBDYW1lcmFPcHRpb25zLFxuICAgIHRyYWNrVXNlckxvY2F0aW9uPzogYm9vbGVhbixcbiAgICBzaG93VXNlckxvY2F0aW9uPzogYm9vbGVhblxufTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgcG9zaXRpb25PcHRpb25zOiB7XG4gICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogZmFsc2UsXG4gICAgICAgIG1heGltdW1BZ2U6IDAsXG4gICAgICAgIHRpbWVvdXQ6IDYwMDAgLyogNiBzZWMgKi9cbiAgICB9LFxuICAgIGZpdEJvdW5kc09wdGlvbnM6IHtcbiAgICAgICAgbWF4Wm9vbTogMTVcbiAgICB9LFxuICAgIHRyYWNrVXNlckxvY2F0aW9uOiBmYWxzZSxcbiAgICBzaG93VXNlckxvY2F0aW9uOiB0cnVlXG59O1xuY29uc3QgY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuXG5sZXQgc3VwcG9ydHNHZW9sb2NhdGlvbjtcblxuZnVuY3Rpb24gY2hlY2tHZW9sb2NhdGlvblN1cHBvcnQoY2FsbGJhY2spIHtcbiAgICBpZiAoc3VwcG9ydHNHZW9sb2NhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhbGxiYWNrKHN1cHBvcnRzR2VvbG9jYXRpb24pO1xuXG4gICAgfSBlbHNlIGlmICh3aW5kb3cubmF2aWdhdG9yLnBlcm1pc3Npb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gbmF2aWdhdG9yLnBlcm1pc3Npb25zIGhhcyBpbmNvbXBsZXRlIGJyb3dzZXIgc3VwcG9ydFxuICAgICAgICAvLyBodHRwOi8vY2FuaXVzZS5jb20vI2ZlYXQ9cGVybWlzc2lvbnMtYXBpXG4gICAgICAgIC8vIFRlc3QgZm9yIHRoZSBjYXNlIHdoZXJlIGEgYnJvd3NlciBkaXNhYmxlcyBHZW9sb2NhdGlvbiBiZWNhdXNlIG9mIGFuXG4gICAgICAgIC8vIGluc2VjdXJlIG9yaWdpblxuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHsgbmFtZTogJ2dlb2xvY2F0aW9uJyB9KS50aGVuKChwKSA9PiB7XG4gICAgICAgICAgICBzdXBwb3J0c0dlb2xvY2F0aW9uID0gcC5zdGF0ZSAhPT0gJ2RlbmllZCc7XG4gICAgICAgICAgICBjYWxsYmFjayhzdXBwb3J0c0dlb2xvY2F0aW9uKTtcbiAgICAgICAgfSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBzdXBwb3J0c0dlb2xvY2F0aW9uID0gISF3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uO1xuICAgICAgICBjYWxsYmFjayhzdXBwb3J0c0dlb2xvY2F0aW9uKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBgR2VvbG9jYXRlQ29udHJvbGAgY29udHJvbCBwcm92aWRlcyBhIGJ1dHRvbiB0aGF0IHVzZXMgdGhlIGJyb3dzZXIncyBnZW9sb2NhdGlvblxuICogQVBJIHRvIGxvY2F0ZSB0aGUgdXNlciBvbiB0aGUgbWFwLlxuICpcbiAqIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBnZW9sb2NhdGlvbixcbiAqIGFuZCBzb21lIHVzZXJzIG1heSBkaXNhYmxlIHRoZSBmZWF0dXJlLiBHZW9sb2NhdGlvbiBzdXBwb3J0IGZvciBtb2Rlcm5cbiAqIGJyb3dzZXJzIGluY2x1ZGluZyBDaHJvbWUgcmVxdWlyZXMgc2l0ZXMgdG8gYmUgc2VydmVkIG92ZXIgSFRUUFMuIElmXG4gKiBnZW9sb2NhdGlvbiBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBHZW9sb2NhdGVDb250cm9sIHdpbGwgbm90XG4gKiBiZSB2aXNpYmxlLlxuICpcbiAqIFRoZSB6b29tIGxldmVsIGFwcGxpZWQgd2lsbCBkZXBlbmQgb24gdGhlIGFjY3VyYWN5IG9mIHRoZSBnZW9sb2NhdGlvbiBwcm92aWRlZCBieSB0aGUgZGV2aWNlLlxuICpcbiAqIFRoZSBHZW9sb2NhdGVDb250cm9sIGhhcyB0d28gbW9kZXMuIElmIGB0cmFja1VzZXJMb2NhdGlvbmAgaXMgYGZhbHNlYCAoZGVmYXVsdCkgdGhlIGNvbnRyb2wgYWN0cyBhcyBhIGJ1dHRvbiwgd2hpY2ggd2hlbiBwcmVzc2VkIHdpbGwgc2V0IHRoZSBtYXAncyBjYW1lcmEgdG8gdGFyZ2V0IHRoZSB1c2VyIGxvY2F0aW9uLiBJZiB0aGUgdXNlciBtb3ZlcywgdGhlIG1hcCB3b24ndCB1cGRhdGUuIFRoaXMgaXMgbW9zdCBzdWl0ZWQgZm9yIHRoZSBkZXNrdG9wLiBJZiBgdHJhY2tVc2VyTG9jYXRpb25gIGlzIGB0cnVlYCB0aGUgY29udHJvbCBhY3RzIGFzIGEgdG9nZ2xlIGJ1dHRvbiB0aGF0IHdoZW4gYWN0aXZlIHRoZSB1c2VyJ3MgbG9jYXRpb24gaXMgYWN0aXZlbHkgbW9uaXRvcmVkIGZvciBjaGFuZ2VzLiBJbiB0aGlzIG1vZGUgdGhlIEdlb2xvY2F0ZUNvbnRyb2wgaGFzIHRocmVlIHN0YXRlczpcbiAqICogYWN0aXZlIC0gdGhlIG1hcCdzIGNhbWVyYSBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgYXMgdGhlIHVzZXIncyBsb2NhdGlvbiBjaGFuZ2VzLCBrZWVwaW5nIHRoZSBsb2NhdGlvbiBkb3QgaW4gdGhlIGNlbnRlci5cbiAqICogcGFzc2l2ZSAtIHRoZSB1c2VyJ3MgbG9jYXRpb24gZG90IGF1dG9tYXRpY2FsbHkgdXBkYXRlcywgYnV0IHRoZSBtYXAncyBjYW1lcmEgZG9lcyBub3QuXG4gKiAqIGRpc2FibGVkXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnBvc2l0aW9uT3B0aW9ucz17ZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZSwgdGltZW91dDogNjAwMH1dIEEgR2VvbG9jYXRpb24gQVBJIFtQb3NpdGlvbk9wdGlvbnNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbk9wdGlvbnMpIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maXRCb3VuZHNPcHRpb25zPXttYXhab29tOiAxNX1dIEEgW2BmaXRCb3VuZHNgXSgjbWFwI2ZpdGJvdW5kcykgb3B0aW9ucyBvYmplY3QgdG8gdXNlIHdoZW4gdGhlIG1hcCBpcyBwYW5uZWQgYW5kIHpvb21lZCB0byB0aGUgdXNlcidzIGxvY2F0aW9uLiBUaGUgZGVmYXVsdCBpcyB0byB1c2UgYSBgbWF4Wm9vbWAgb2YgMTUgdG8gbGltaXQgaG93IGZhciB0aGUgbWFwIHdpbGwgem9vbSBpbiBmb3IgdmVyeSBhY2N1cmF0ZSBsb2NhdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMudHJhY2tVc2VyTG9jYXRpb249ZmFsc2VdIElmIGB0cnVlYCB0aGUgR2VvbG9jYXRlIENvbnRyb2wgYmVjb21lcyBhIHRvZ2dsZSBidXR0b24gYW5kIHdoZW4gYWN0aXZlIHRoZSBtYXAgd2lsbCByZWNlaXZlIHVwZGF0ZXMgdG8gdGhlIHVzZXIncyBsb2NhdGlvbiBhcyBpdCBjaGFuZ2VzLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnNob3dVc2VyTG9jYXRpb249dHJ1ZV0gQnkgZGVmYXVsdCBhIGRvdCB3aWxsIGJlIHNob3duIG9uIHRoZSBtYXAgYXQgdGhlIHVzZXIncyBsb2NhdGlvbi4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZENvbnRyb2wobmV3IG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2woe1xuICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICogICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgICB9LFxuICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gKiB9KSk7XG4gKiBAc2VlIFtMb2NhdGUgdGhlIHVzZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbG9jYXRlLXVzZXIvKVxuICovXG5jbGFzcyBHZW9sb2NhdGVDb250cm9sIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX21hcDogTWFwO1xuICAgIG9wdGlvbnM6IE9wdGlvbnM7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2RvdEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIF9nZW9sb2NhdGVCdXR0b246IEhUTUxFbGVtZW50O1xuICAgIF9nZW9sb2NhdGlvbldhdGNoSUQ6IG51bWJlcjtcbiAgICBfdGltZW91dElkOiA/VGltZW91dElEO1xuICAgIF93YXRjaFN0YXRlOiBzdHJpbmc7XG4gICAgX2xhc3RLbm93blBvc2l0aW9uOiBhbnk7XG4gICAgX3VzZXJMb2NhdGlvbkRvdE1hcmtlcjogTWFya2VyO1xuICAgIF9zZXR1cDogYm9vbGVhbjsgLy8gc2V0IHRvIHRydWUgb25jZSB0aGUgY29udHJvbCBoYXMgYmVlbiBzZXR1cFxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25TdWNjZXNzJyxcbiAgICAgICAgICAgICdfb25FcnJvcicsXG4gICAgICAgICAgICAnX2ZpbmlzaCcsXG4gICAgICAgICAgICAnX3NldHVwVUknLFxuICAgICAgICAgICAgJ191cGRhdGVDYW1lcmEnLFxuICAgICAgICAgICAgJ191cGRhdGVNYXJrZXInXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgYCR7Y2xhc3NOYW1lfSAke2NsYXNzTmFtZX0tZ3JvdXBgKTtcbiAgICAgICAgY2hlY2tHZW9sb2NhdGlvblN1cHBvcnQodGhpcy5fc2V0dXBVSSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIC8vIGNsZWFyIHRoZSBnZW9sb2NhdGlvbiB3YXRjaCBpZiBleGlzdHNcbiAgICAgICAgaWYgKHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciB0aGUgbWFya2VyIGZyb20gdGhlIG1hcFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgfVxuXG4gICAgX29uU3VjY2Vzcyhwb3NpdGlvbjogUG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgLy8ga2VlcCBhIHJlY29yZCBvZiB0aGUgcG9zaXRpb24gc28gdGhhdCBpZiB0aGUgc3RhdGUgaXMgQkFDS0dST1VORCBhbmQgdGhlIHVzZXJcbiAgICAgICAgICAgIC8vIGNsaWNrcyB0aGUgYnV0dG9uLCB3ZSBjYW4gbW92ZSB0byBBQ1RJVkVfTE9DSyBpbW1lZGlhdGVseSB3aXRob3V0IHdhaXRpbmcgZm9yXG4gICAgICAgICAgICAvLyB3YXRjaFBvc2l0aW9uIHRvIHRyaWdnZXIgX29uU3VjY2Vzc1xuICAgICAgICAgICAgdGhpcy5fbGFzdEtub3duUG9zaXRpb24gPSBwb3NpdGlvbjtcblxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdXQUlUSU5HX0FDVElWRSc6XG4gICAgICAgICAgICBjYXNlICdBQ1RJVkVfTE9DSyc6XG4gICAgICAgICAgICBjYXNlICdBQ1RJVkVfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0xPQ0snO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkQnOlxuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORF9FUlJPUic6XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdCQUNLR1JPVU5EJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBgVW5leHBlY3RlZCB3YXRjaFN0YXRlICR7dGhpcy5fd2F0Y2hTdGF0ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHNob3dVc2VyTG9jYXRpb24gYW5kIHRoZSB3YXRjaCBzdGF0ZSBpc24ndCBvZmYgdGhlbiB1cGRhdGUgdGhlIG1hcmtlciBsb2NhdGlvblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5fd2F0Y2hTdGF0ZSAhPT0gJ09GRicpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hcmtlcihwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBpbiBub3JtYWwgbW9kZSAobm90IHdhdGNoIG1vZGUpLCBvciBpZiBpbiB3YXRjaCBtb2RlIGFuZCB0aGUgc3RhdGUgaXMgYWN0aXZlIHdhdGNoXG4gICAgICAgIC8vIHRoZW4gdXBkYXRlIHRoZSBjYW1lcmFcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24gfHwgdGhpcy5fd2F0Y2hTdGF0ZSA9PT0gJ0FDVElWRV9MT0NLJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhKHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC11c2VyLWxvY2F0aW9uLWRvdC1zdGFsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZ2VvbG9jYXRlJywgcG9zaXRpb24pKTtcbiAgICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUNhbWVyYShwb3NpdGlvbjogUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gbmV3IExuZ0xhdChwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlLCBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUpO1xuICAgICAgICBjb25zdCByYWRpdXMgPSBwb3NpdGlvbi5jb29yZHMuYWNjdXJhY3k7XG4gICAgICAgIGNvbnN0IGJlYXJpbmcgPSB0aGlzLl9tYXAuZ2V0QmVhcmluZygpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZXh0ZW5kKHtiZWFyaW5nfSwgdGhpcy5vcHRpb25zLmZpdEJvdW5kc09wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX21hcC5maXRCb3VuZHMoY2VudGVyLnRvQm91bmRzKHJhZGl1cyksIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIGdlb2xvY2F0ZVNvdXJjZTogdHJ1ZSAvLyB0YWcgdGhpcyBjYW1lcmEgY2hhbmdlIHNvIGl0IHdvbid0IGNhdXNlIHRoZSBjb250cm9sIHRvIGNoYW5nZSB0byBiYWNrZ3JvdW5kIHN0YXRlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF91cGRhdGVNYXJrZXIocG9zaXRpb246ID9Qb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5zZXRMbmdMYXQoW3Bvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZV0pLmFkZFRvKHRoaXMuX21hcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25FcnJvcihlcnJvcjogUG9zaXRpb25FcnJvcikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFBFUk1JU1NJT05fREVOSUVEXG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdPRkYnO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJXYXRjaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0FDVElWRV9FUlJPUic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdBQ1RJVkVfTE9DSyc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0VSUk9SJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHR1cm4gbWFya2VyIGdyZXlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQkFDS0dST1VORF9FUlJPUic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHR1cm4gbWFya2VyIGdyZXlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0VSUk9SJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBgVW5leHBlY3RlZCB3YXRjaFN0YXRlICR7dGhpcy5fd2F0Y2hTdGF0ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fd2F0Y2hTdGF0ZSAhPT0gJ09GRicgJiYgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1kb3Qtc3RhbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgICAgICB0aGlzLl9maW5pc2goKTtcbiAgICB9XG5cbiAgICBfZmluaXNoKCkge1xuICAgICAgICBpZiAodGhpcy5fdGltZW91dElkKSB7IGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0SWQpOyB9XG4gICAgICAgIHRoaXMuX3RpbWVvdXRJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBfc2V0dXBVSShzdXBwb3J0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHN1cHBvcnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKCdHZW9sb2NhdGlvbiBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBHZW9sb2NhdGVDb250cm9sIHdpbGwgbm90IGJlIHZpc2libGUuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGU6IE1vdXNlRXZlbnQpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsXG4gICAgICAgICAgICBgJHtjbGFzc05hbWV9LWljb24gJHtjbGFzc05hbWV9LWdlb2xvY2F0ZWAsXG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0dlb2xvY2F0ZScpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdPRkYnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiBzaG93VXNlckxvY2F0aW9uIGlzIGVuYWJsZWQsIGtlZXAgdGhlIEdlb2xvY2F0ZSBidXR0b24gZGlzYWJsZWQgdW50aWwgdGhlIGRldmljZSBsb2NhdGlvbiBtYXJrZXIgaXMgc2V0dXAgb24gdGhlIG1hcFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1kb3QnKTtcblxuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyID0gbmV3IE1hcmtlcih0aGlzLl9kb3RFbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbikgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdPRkYnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlci5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLl9zZXR1cCA9IHRydWU7XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgY2FtZXJhIGlzIGNoYW5nZWQgKGFuZCBpdCdzIG5vdCBhcyBhIHJlc3VsdCBvZiB0aGUgR2VvbG9jYXRpb24gQ29udHJvbCkgY2hhbmdlXG4gICAgICAgIC8vIHRoZSB3YXRjaCBtb2RlIHRvIGJhY2tncm91bmQgd2F0Y2gsIHNvIHRoYXQgdGhlIG1hcmtlciBpcyB1cGRhdGVkIGJ1dCBub3QgdGhlIGNhbWVyYS5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3Zlc3RhcnQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50Lmdlb2xvY2F0ZVNvdXJjZSAmJiB0aGlzLl93YXRjaFN0YXRlID09PSAnQUNUSVZFX0xPQ0snKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQkFDS0dST1VORCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbmVuZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYSBnZW9sb2NhdGlvblxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYCBpZiBjYWxsZWQgYmVmb3JlIGNvbnRyb2wgd2FzIGFkZGVkIHRvIGEgbWFwLCBvdGhlcndpc2UgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICovXG4gICAgdHJpZ2dlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR1cCkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0dlb2xvY2F0ZSBjb250cm9sIHRyaWdnZXJlZCBiZWZvcmUgYWRkZWQgdG8gYSBtYXAnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgd2F0Y2hTdGF0ZSBhbmQgZG8gYW55IG91dGdvaW5nIHN0YXRlIGNsZWFudXBcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fd2F0Y2hTdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAnT0ZGJzpcbiAgICAgICAgICAgICAgICAvLyB0dXJuIG9uIHRoZSBHZW9sb2NhdGUgQ29udHJvbFxuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnV0FJVElOR19BQ1RJVkUnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgndHJhY2t1c2VybG9jYXRpb25zdGFydCcpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9FUlJPUic6XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EX0VSUk9SJzpcbiAgICAgICAgICAgICAgICAvLyB0dXJuIG9mZiB0aGUgR2VvbG9jYXRlIENvbnRyb2xcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ09GRic7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3RyYWNrdXNlcmxvY2F0aW9uZW5kJykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdBQ1RJVkVfTE9DSyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICAvLyBzZXQgY2FtZXJhIHRvIGxhc3Qga25vd24gbG9jYXRpb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGFzdEtub3duUG9zaXRpb24pIHRoaXMuX3VwZGF0ZUNhbWVyYSh0aGlzLl9sYXN0S25vd25Qb3NpdGlvbik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbnN0YXJ0JykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbmNvbWluZyBzdGF0ZSBzZXR1cFxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdXQUlUSU5HX0FDVElWRSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBQ1RJVkVfTE9DSyc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0VSUk9SJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkQnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EX0VSUk9SJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdPRkYnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBtYW5hZ2UgZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbiAvIGdlb2xvY2F0aW9uLmNsZWFyV2F0Y2hcbiAgICAgICAgICAgIGlmICh0aGlzLl93YXRjaFN0YXRlID09PSAnT0ZGJyAmJiB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGNsZWFyIHdhdGNoUG9zaXRpb24gYXMgd2UndmUgY2hhbmdlZCB0byBhbiBPRkYgc3RhdGVcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhcldhdGNoKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZW5hYmxlIHdhdGNoUG9zaXRpb24gc2luY2Ugd2F0Y2hTdGF0ZSBpcyBub3QgT0ZGIGFuZCB0aGVyZSBpcyBubyB3YXRjaFBvc2l0aW9uIGFscmVhZHkgcnVubmluZ1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID0gd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblN1Y2Nlc3MsIHRoaXMuX29uRXJyb3IsIHRoaXMub3B0aW9ucy5wb3NpdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oXG4gICAgICAgICAgICAgICAgdGhpcy5fb25TdWNjZXNzLCB0aGlzLl9vbkVycm9yLCB0aGlzLm9wdGlvbnMucG9zaXRpb25PcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gVGhpcyB0aW1lb3V0IGVuc3VyZXMgdGhhdCB3ZSBzdGlsbCBjYWxsIGZpbmlzaCgpIGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRlY2xpbmVzIHRvIHNoYXJlIHRoZWlyIGxvY2F0aW9uIGluIEZpcmVmb3hcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQodGhpcy5fZmluaXNoLCAxMDAwMCAvKiAxMHNlYyAqLyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfY2xlYXJXYXRjaCgpIHtcbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCk7XG5cbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID0gKHVuZGVmaW5lZDogYW55KTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNYXJrZXIobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2xvY2F0ZUNvbnRyb2w7XG5cbi8qIEdlb2xvY2F0ZSBDb250cm9sIFdhdGNoIFN0YXRlc1xuICogVGhpcyBpcyB0aGUgcHJpdmF0ZSBzdGF0ZSBvZiB0aGUgY29udHJvbC5cbiAqXG4gKiBPRkZcbiAqICAgIG9mZi9pbmFjdGl2ZVxuICogV0FJVElOR19BQ1RJVkVcbiAqICAgIEdlb2xvY2F0ZSBDb250cm9sIHdhcyBjbGlja2VkIGJ1dCBzdGlsbCB3YWl0aW5nIGZvciBHZW9sb2NhdGlvbiBBUEkgcmVzcG9uc2Ugd2l0aCB1c2VyIGxvY2F0aW9uXG4gKiBBQ1RJVkVfTE9DS1xuICogICAgU2hvd2luZyB0aGUgdXNlciBsb2NhdGlvbiBhcyBhIGRvdCBBTkQgdHJhY2tpbmcgdGhlIGNhbWVyYSB0byBiZSBmaXhlZCB0byB0aGVpciBsb2NhdGlvbi4gSWYgdGhlaXIgbG9jYXRpb24gY2hhbmdlcyB0aGUgbWFwIG1vdmVzIHRvIGZvbGxvdy5cbiAqIEFDVElWRV9FUlJPUlxuICogICAgVGhlcmUgd2FzIGVuIGVycm9yIGZyb20gdGhlIEdlb2xvY2F0aW9uIEFQSSB3aGlsZSB0cnlpbmcgdG8gc2hvdyBhbmQgdHJhY2sgdGhlIHVzZXIgbG9jYXRpb24uXG4gKiBCQUNLR1JPVU5EXG4gKiAgICBTaG93aW5nIHRoZSB1c2VyIGxvY2F0aW9uIGFzIGEgZG90IGJ1dCB0aGUgY2FtZXJhIGRvZXNuJ3QgZm9sbG93IHRoZWlyIGxvY2F0aW9uIGFzIGl0IGNoYW5nZXMuXG4gKiBCQUNLR1JPVU5EX0VSUk9SXG4gKiAgICBUaGVyZSB3YXMgYW4gZXJyb3IgZnJvbSB0aGUgR2VvbG9jYXRpb24gQVBJIHdoaWxlIHRyeWluZyB0byBzaG93IChidXQgbm90IHRyYWNrKSB0aGUgdXNlciBsb2NhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEZpcmVkIG9uIGVhY2ggR2VvbG9jYXRpb24gQVBJIHBvc2l0aW9uIHVwZGF0ZSB3aGljaCByZXR1cm5lZCBhcyBzdWNjZXNzLlxuICpcbiAqIEBldmVudCBnZW9sb2NhdGVcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IGRhdGEgVGhlIHJldHVybmVkIFtQb3NpdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uKSBvYmplY3QgZnJvbSB0aGUgY2FsbGJhY2sgaW4gW0dlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vZ2V0Q3VycmVudFBvc2l0aW9uKSBvciBbR2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vd2F0Y2hQb3NpdGlvbikuXG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgb24gZWFjaCBHZW9sb2NhdGlvbiBBUEkgcG9zaXRpb24gdXBkYXRlIHdoaWNoIHJldHVybmVkIGFzIGFuIGVycm9yLlxuICpcbiAqIEBldmVudCBlcnJvclxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbkVycm9yfSBkYXRhIFRoZSByZXR1cm5lZCBbUG9zaXRpb25FcnJvcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uRXJyb3IpIG9iamVjdCBmcm9tIHRoZSBjYWxsYmFjayBpbiBbR2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi9nZXRDdXJyZW50UG9zaXRpb24pIG9yIFtHZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi93YXRjaFBvc2l0aW9uKS5cbiAqXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBHZW9sb2NhdGUgQ29udHJvbCBjaGFuZ2VzIHRvIHRoZSBhY3RpdmUgbG9jayBzdGF0ZSwgd2hpY2ggaGFwcGVucyBlaXRoZXIgdXBvbiBmaXJzdCBvYnRhaW5pbmcgYSBzdWNjZXNzZnVsIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiBmb3IgdGhlIHVzZXIgKGEgZ2VvbG9jYXRlIGV2ZW50IHdpbGwgZm9sbG93KSwgb3IgdGhlIHVzZXIgY2xpY2tzIHRoZSBnZW9sb2NhdGUgYnV0dG9uIHdoZW4gaW4gdGhlIGJhY2tncm91bmQgc3RhdGUgd2hpY2ggdXNlcyB0aGUgbGFzdCBrbm93biBwb3NpdGlvbiB0byByZWNlbnRlciB0aGUgbWFwIGFuZCBlbnRlciBhY3RpdmUgbG9jayBzdGF0ZSAobm8gZ2VvbG9jYXRlIGV2ZW50IHdpbGwgZm9sbG93IHVubGVzcyB0aGUgdXNlcnMncyBsb2NhdGlvbiBjaGFuZ2VzKS5cbiAqXG4gKiBAZXZlbnQgdHJhY2t1c2VybG9jYXRpb25zdGFydFxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICpcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIEdlb2xvY2F0ZSBDb250cm9sIGNoYW5nZXMgdG8gdGhlIGJhY2tncm91bmQgc3RhdGUsIHdoaWNoIGhhcHBlbnMgd2hlbiBhIHVzZXIgY2hhbmdlcyB0aGUgY2FtZXJhIGR1cmluZyBhbiBhY3RpdmUgcG9zaXRpb24gbG9jay4gVGhpcyBvbmx5IGFwcGxpZXMgd2hlbiB0cmFja1VzZXJMb2NhdGlvbiBpcyB0cnVlLiBJbiB0aGUgYmFja2dyb3VuZCBzdGF0ZSwgdGhlIGRvdCBvbiB0aGUgbWFwIHdpbGwgdXBkYXRlIHdpdGggbG9jYXRpb24gdXBkYXRlcyBidXQgdGhlIGNhbWVyYSB3aWxsIG5vdC5cbiAqXG4gKiBAZXZlbnQgdHJhY2t1c2VybG9jYXRpb25lbmRcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqXG4gKi9cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuaW1wb3J0IHsgZXh0ZW5kLCBiaW5kQWxsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbnR5cGUgVW5pdCA9ICdpbXBlcmlhbCcgfCAnbWV0cmljJyB8ICduYXV0aWNhbCc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBtYXhXaWR0aD86IG51bWJlcixcbiAgICB1bml0PzogVW5pdDtcbn07XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICAgIG1heFdpZHRoOiAxMDAsXG4gICAgdW5pdDogJ21ldHJpYydcbn07XG5cbi8qKlxuICogQSBgU2NhbGVDb250cm9sYCBjb250cm9sIGRpc3BsYXlzIHRoZSByYXRpbyBvZiBhIGRpc3RhbmNlIG9uIHRoZSBtYXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlzdGFuY2Ugb24gdGhlIGdyb3VuZC5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2lkdGg9JzEwMCddIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2NhbGUgY29udHJvbCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudW5pdD0nbWV0cmljJ10gVW5pdCBvZiB0aGUgZGlzdGFuY2UgKGAnaW1wZXJpYWwnYCwgYCdtZXRyaWMnYCBvciBgJ25hdXRpY2FsJ2ApLlxuICogQGV4YW1wbGVcbiAqIHZhciBzY2FsZSA9IG5ldyBtYXBib3hnbC5TY2FsZUNvbnRyb2woe1xuICogICAgIG1heFdpZHRoOiA4MCxcbiAqICAgICB1bml0OiAnaW1wZXJpYWwnXG4gKiB9KTtcbiAqIG1hcC5hZGRDb250cm9sKHNjYWxlKTtcbiAqXG4gKiBzY2FsZS5zZXRVbml0KCdtZXRyaWMnKTtcbiAqL1xuY2xhc3MgU2NhbGVDb250cm9sIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgb3B0aW9uczogT3B0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnc2V0VW5pdCdcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ2JvdHRvbS1sZWZ0JztcbiAgICB9XG5cbiAgICBfb25Nb3ZlKCkge1xuICAgICAgICB1cGRhdGVTY2FsZSh0aGlzLl9tYXAsIHRoaXMuX2NvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtc2NhbGUnLCBtYXAuZ2V0Q29udGFpbmVyKCkpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHRoaXMuX29uTW92ZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzY2FsZSdzIHVuaXQgb2YgdGhlIGRpc3RhbmNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdW5pdCBVbml0IG9mIHRoZSBkaXN0YW5jZSAoYCdpbXBlcmlhbCdgLCBgJ21ldHJpYydgIG9yIGAnbmF1dGljYWwnYCkuXG4gICAgICovXG4gICAgc2V0VW5pdCh1bml0OiBVbml0KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy51bml0ID0gdW5pdDtcbiAgICAgICAgdXBkYXRlU2NhbGUodGhpcy5fbWFwLCB0aGlzLl9jb250YWluZXIsIHRoaXMub3B0aW9ucyk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY2FsZUNvbnRyb2w7XG5cbmZ1bmN0aW9uIHVwZGF0ZVNjYWxlKG1hcCwgY29udGFpbmVyLCBvcHRpb25zKSB7XG4gICAgLy8gQSBob3Jpem9udGFsIHNjYWxlIGlzIGltYWdpbmVkIHRvIGJlIHByZXNlbnQgYXQgY2VudGVyIG9mIHRoZSBtYXBcbiAgICAvLyBjb250YWluZXIgd2l0aCBtYXhpbXVtIGxlbmd0aCAoRGVmYXVsdCkgYXMgMTAwcHguXG4gICAgLy8gVXNpbmcgc3BoZXJpY2FsIGxhdyBvZiBjb3NpbmVzIGFwcHJveGltYXRpb24sIHRoZSByZWFsIGRpc3RhbmNlIGlzXG4gICAgLy8gZm91bmQgYmV0d2VlbiB0aGUgdHdvIGNvb3JkaW5hdGVzLlxuICAgIGNvbnN0IG1heFdpZHRoID0gb3B0aW9ucyAmJiBvcHRpb25zLm1heFdpZHRoIHx8IDEwMDtcblxuICAgIGNvbnN0IHkgPSBtYXAuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQgLyAyO1xuICAgIGNvbnN0IG1heE1ldGVycyA9IGdldERpc3RhbmNlKG1hcC51bnByb2plY3QoWzAsIHldKSwgbWFwLnVucHJvamVjdChbbWF4V2lkdGgsIHldKSk7XG4gICAgLy8gVGhlIHJlYWwgZGlzdGFuY2UgY29ycmVzcG9uZGluZyB0byAxMDBweCBzY2FsZSBsZW5ndGggaXMgcm91bmRlZCBvZmYgdG9cbiAgICAvLyBuZWFyIHByZXR0eSBudW1iZXIgYW5kIHRoZSBzY2FsZSBsZW5ndGggZm9yIHRoZSBzYW1lIGlzIGZvdW5kIG91dC5cbiAgICAvLyBEZWZhdWx0IHVuaXQgb2YgdGhlIHNjYWxlIGlzIGJhc2VkIG9uIFVzZXIncyBsb2NhbGUuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51bml0ID09PSAnaW1wZXJpYWwnKSB7XG4gICAgICAgIGNvbnN0IG1heEZlZXQgPSAzLjI4MDggKiBtYXhNZXRlcnM7XG4gICAgICAgIGlmIChtYXhGZWV0ID4gNTI4MCkge1xuICAgICAgICAgICAgY29uc3QgbWF4TWlsZXMgPSBtYXhGZWV0IC8gNTI4MDtcbiAgICAgICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE1pbGVzLCAnbWknKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heEZlZXQsICdmdCcpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMudW5pdCA9PT0gJ25hdXRpY2FsJykge1xuICAgICAgICBjb25zdCBtYXhOYXV0aWNhbHMgPSBtYXhNZXRlcnMgLyAxODUyO1xuICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhOYXV0aWNhbHMsICdubScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE1ldGVycywgJ20nKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heERpc3RhbmNlLCB1bml0KSB7XG4gICAgbGV0IGRpc3RhbmNlID0gZ2V0Um91bmROdW0obWF4RGlzdGFuY2UpO1xuICAgIGNvbnN0IHJhdGlvID0gZGlzdGFuY2UgLyBtYXhEaXN0YW5jZTtcblxuICAgIGlmICh1bml0ID09PSAnbScgJiYgZGlzdGFuY2UgPj0gMTAwMCkge1xuICAgICAgICBkaXN0YW5jZSA9IGRpc3RhbmNlIC8gMTAwMDtcbiAgICAgICAgdW5pdCA9ICdrbSc7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7bWF4V2lkdGggKiByYXRpb31weGA7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGRpc3RhbmNlICsgdW5pdDtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzdGFuY2UobGF0bG5nMSwgbGF0bG5nMikge1xuICAgIC8vIFVzZXMgc3BoZXJpY2FsIGxhdyBvZiBjb3NpbmVzIGFwcHJveGltYXRpb24uXG4gICAgY29uc3QgUiA9IDYzNzEwMDA7XG5cbiAgICBjb25zdCByYWQgPSBNYXRoLlBJIC8gMTgwLFxuICAgICAgICBsYXQxID0gbGF0bG5nMS5sYXQgKiByYWQsXG4gICAgICAgIGxhdDIgPSBsYXRsbmcyLmxhdCAqIHJhZCxcbiAgICAgICAgYSA9IE1hdGguc2luKGxhdDEpICogTWF0aC5zaW4obGF0MikgK1xuICAgICAgICAgIE1hdGguY29zKGxhdDEpICogTWF0aC5jb3MobGF0MikgKiBNYXRoLmNvcygobGF0bG5nMi5sbmcgLSBsYXRsbmcxLmxuZykgKiByYWQpO1xuXG4gICAgY29uc3QgbWF4TWV0ZXJzID0gUiAqIE1hdGguYWNvcyhNYXRoLm1pbihhLCAxKSk7XG4gICAgcmV0dXJuIG1heE1ldGVycztcblxufVxuXG5mdW5jdGlvbiBnZXREZWNpbWFsUm91bmROdW0oZCkge1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgTWF0aC5jZWlsKC1NYXRoLmxvZyhkKSAvIE1hdGguTE4xMCkpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtdWx0aXBsaWVyKSAvIG11bHRpcGxpZXI7XG59XG5cbmZ1bmN0aW9uIGdldFJvdW5kTnVtKG51bSkge1xuICAgIGNvbnN0IHBvdzEwID0gTWF0aC5wb3coMTAsIChgJHtNYXRoLmZsb29yKG51bSl9YCkubGVuZ3RoIC0gMSk7XG4gICAgbGV0IGQgPSBudW0gLyBwb3cxMDtcblxuICAgIGQgPSBkID49IDEwID8gMTAgOlxuICAgICAgICBkID49IDUgPyA1IDpcbiAgICAgICAgZCA+PSAzID8gMyA6XG4gICAgICAgIGQgPj0gMiA/IDIgOlxuICAgICAgICBkID49IDEgPyAxIDogZ2V0RGVjaW1hbFJvdW5kTnVtKGQpO1xuXG4gICAgcmV0dXJuIHBvdzEwICogZDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuXG5pbXBvcnQgeyBiaW5kQWxsLCB3YXJuT25jZSB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uLy4uL3V0aWwvd2luZG93JztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBjb250YWluZXI/OiBIVE1MRWxlbWVudFxufTtcblxuLyoqXG4gKiBBIGBGdWxsc2NyZWVuQ29udHJvbGAgY29udHJvbCBjb250YWlucyBhIGJ1dHRvbiBmb3IgdG9nZ2xpbmcgdGhlIG1hcCBpbiBhbmQgb3V0IG9mIGZ1bGxzY3JlZW4gbW9kZS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbb3B0aW9ucy5jb250YWluZXJdIGBjb250YWluZXJgIGlzIHRoZSBbY29tcGF0aWJsZSBET00gZWxlbWVudF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvcmVxdWVzdEZ1bGxTY3JlZW4jQ29tcGF0aWJsZV9lbGVtZW50cykgd2hpY2ggc2hvdWxkIGJlIG1hZGUgZnVsbCBzY3JlZW4uIEJ5IGRlZmF1bHQsIHRoZSBtYXAgY29udGFpbmVyIGVsZW1lbnQgd2lsbCBiZSBtYWRlIGZ1bGwgc2NyZWVuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuRnVsbHNjcmVlbkNvbnRyb2woe2NvbnRhaW5lcjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpfSkpO1xuICogQHNlZSBbVmlldyBhIGZ1bGxzY3JlZW4gbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2Z1bGxzY3JlZW4vKVxuICovXG5cbmNsYXNzIEZ1bGxzY3JlZW5Db250cm9sIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2NvbnRyb2xDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9mdWxsc2NyZWVuOiBib29sZWFuO1xuICAgIF9mdWxsc2NyZWVuY2hhbmdlOiBzdHJpbmc7XG4gICAgX2Z1bGxzY3JlZW5CdXR0b246IEhUTUxFbGVtZW50O1xuICAgIF9jbGFzc05hbWU6IHN0cmluZztcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fZnVsbHNjcmVlbiA9IGZhbHNlO1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGFpbmVyIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdGdWxsIHNjcmVlbiBjb250cm9sIFxcJ2NvbnRhaW5lclxcJyBtdXN0IGJlIGEgRE9NIGVsZW1lbnQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uQ2xpY2tGdWxsc2NyZWVuJyxcbiAgICAgICAgICAgICdfY2hhbmdlSWNvbidcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgIGlmICgnb25mdWxsc2NyZWVuY2hhbmdlJyBpbiB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UgPSAnZnVsbHNjcmVlbmNoYW5nZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoJ29ubW96ZnVsbHNjcmVlbmNoYW5nZScgaW4gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuY2hhbmdlID0gJ21vemZ1bGxzY3JlZW5jaGFuZ2UnO1xuICAgICAgICB9IGVsc2UgaWYgKCdvbndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJztcbiAgICAgICAgfSBlbHNlIGlmICgnb25tc2Z1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICdNU0Z1bGxzY3JlZW5DaGFuZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9ICdtYXBib3hnbC1jdHJsJztcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBgJHt0aGlzLl9jbGFzc05hbWV9IG1hcGJveGdsLWN0cmwtZ3JvdXBgKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrRnVsbHNjcmVlblN1cHBvcnQoKSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0dXBVSSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbENvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgd2Fybk9uY2UoJ1RoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgZnVsbHNjcmVlbiBtb2RlLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250cm9sQ29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRyb2xDb250YWluZXIpO1xuICAgICAgICB0aGlzLl9tYXAgPSAobnVsbDogYW55KTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fZnVsbHNjcmVlbmNoYW5nZSwgdGhpcy5fY2hhbmdlSWNvbik7XG4gICAgfVxuXG4gICAgX2NoZWNrRnVsbHNjcmVlblN1cHBvcnQoKSB7XG4gICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS5tb3pGdWxsU2NyZWVuRW5hYmxlZCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS5tc0Z1bGxzY3JlZW5FbmFibGVkIHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLndlYmtpdEZ1bGxzY3JlZW5FbmFibGVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX3NldHVwVUkoKSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLCAoYCR7dGhpcy5fY2xhc3NOYW1lfS1pY29uICR7dGhpcy5fY2xhc3NOYW1lfS1mdWxsc2NyZWVuYCksIHRoaXMuX2NvbnRyb2xDb250YWluZXIpO1xuICAgICAgICBidXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB0aGlzLl91cGRhdGVUaXRsZSgpO1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGlja0Z1bGxzY3JlZW4pO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9mdWxsc2NyZWVuY2hhbmdlLCB0aGlzLl9jaGFuZ2VJY29uKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlVGl0bGUoKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy5faXNGdWxsc2NyZWVuKCkgPyBcIkV4aXQgZnVsbHNjcmVlblwiIDogXCJFbnRlciBmdWxsc2NyZWVuXCI7XG4gICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24udGl0bGUgPSB0aXRsZTtcbiAgICB9XG5cbiAgICBfaXNGdWxsc2NyZWVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnVsbHNjcmVlbjtcbiAgICB9XG5cbiAgICBfY2hhbmdlSWNvbigpIHtcbiAgICAgICAgY29uc3QgZnVsbHNjcmVlbkVsZW1lbnQgPVxuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLm1zRnVsbHNjcmVlbkVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKChmdWxsc2NyZWVuRWxlbWVudCA9PT0gdGhpcy5fY29udGFpbmVyKSAhPT0gdGhpcy5fZnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbiA9ICF0aGlzLl9mdWxsc2NyZWVuO1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKGAke3RoaXMuX2NsYXNzTmFtZX0tc2hyaW5rYCk7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoYCR7dGhpcy5fY2xhc3NOYW1lfS1mdWxsc2NyZWVuYCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUaXRsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uQ2xpY2tGdWxsc2NyZWVuKCkge1xuICAgICAgICBpZiAodGhpcy5faXNGdWxsc2NyZWVuKCkpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cuZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5kb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5kb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS5tc0V4aXRGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5kb2N1bWVudC53ZWJraXRDYW5jZWxGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS53ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY29udGFpbmVyLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5fY29udGFpbmVyOiBhbnkpLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAodGhpcy5fY29udGFpbmVyOiBhbnkpLm1velJlcXVlc3RGdWxsU2NyZWVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuX2NvbnRhaW5lcjogYW55KS5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAodGhpcy5fY29udGFpbmVyOiBhbnkpLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5fY29udGFpbmVyOiBhbnkpLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAodGhpcy5fY29udGFpbmVyOiBhbnkpLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZ1bGxzY3JlZW5Db250cm9sO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgZXh0ZW5kLCBiaW5kQWxsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IEV2ZW50LCBFdmVudGVkIH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBET00gZnJvbSAnLi4vdXRpbC9kb20nO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdCc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93JztcbmltcG9ydCBzbWFydFdyYXAgZnJvbSAnLi4vdXRpbC9zbWFydF93cmFwJztcbmltcG9ydCB7IHR5cGUgQW5jaG9yLCBhbmNob3JUcmFuc2xhdGUsIGFwcGx5QW5jaG9yQ2xhc3MgfSBmcm9tICcuL2FuY2hvcic7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuL21hcCc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IHR5cGUge1BvaW50TGlrZX0gZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgIGNsb3NlT25DbGljazogdHJ1ZSxcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIG1heFdpZHRoOiBcIjI0MHB4XCJcbn07XG5cbmV4cG9ydCB0eXBlIE9mZnNldCA9IG51bWJlciB8IFBvaW50TGlrZSB8IHtbQW5jaG9yXTogUG9pbnRMaWtlfTtcblxuZXhwb3J0IHR5cGUgUG9wdXBPcHRpb25zID0ge1xuICAgIGNsb3NlQnV0dG9uPzogYm9vbGVhbixcbiAgICBjbG9zZU9uQ2xpY2s/OiBib29sZWFuLFxuICAgIGFuY2hvcj86IEFuY2hvcixcbiAgICBvZmZzZXQ/OiBPZmZzZXQsXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nLFxuICAgIG1heFdpZHRoPzogc3RyaW5nXG59O1xuXG4vKipcbiAqIEEgcG9wdXAgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2xvc2VCdXR0b249dHJ1ZV0gSWYgYHRydWVgLCBhIGNsb3NlIGJ1dHRvbiB3aWxsIGFwcGVhciBpbiB0aGVcbiAqICAgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgcG9wdXAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNsb3NlT25DbGljaz10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBwb3B1cCB3aWxsIGNsb3NlZCB3aGVuIHRoZVxuICogICBtYXAgaXMgY2xpY2tlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hbmNob3JdIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgcGFydCBvZiB0aGUgUG9wdXAgdGhhdCBzaG91bGRcbiAqICAgYmUgcG9zaXRpb25lZCBjbG9zZXN0IHRvIHRoZSBjb29yZGluYXRlIHNldCB2aWEge0BsaW5rIFBvcHVwI3NldExuZ0xhdH0uXG4gKiAgIE9wdGlvbnMgYXJlIGAnY2VudGVyJ2AsIGAndG9wJ2AsIGAnYm90dG9tJ2AsIGAnbGVmdCdgLCBgJ3JpZ2h0J2AsIGAndG9wLWxlZnQnYCxcbiAqICAgYCd0b3AtcmlnaHQnYCwgYCdib3R0b20tbGVmdCdgLCBhbmQgYCdib3R0b20tcmlnaHQnYC4gSWYgdW5zZXQgdGhlIGFuY2hvciB3aWxsIGJlXG4gKiAgIGR5bmFtaWNhbGx5IHNldCB0byBlbnN1cmUgdGhlIHBvcHVwIGZhbGxzIHdpdGhpbiB0aGUgbWFwIGNvbnRhaW5lciB3aXRoIGEgcHJlZmVyZW5jZVxuICogICBmb3IgYCdib3R0b20nYC5cbiAqIEBwYXJhbSB7bnVtYmVyfFBvaW50TGlrZXxPYmplY3R9IFtvcHRpb25zLm9mZnNldF0gLVxuICogIEEgcGl4ZWwgb2Zmc2V0IGFwcGxpZWQgdG8gdGhlIHBvcHVwJ3MgbG9jYXRpb24gc3BlY2lmaWVkIGFzOlxuICogICAtIGEgc2luZ2xlIG51bWJlciBzcGVjaWZ5aW5nIGEgZGlzdGFuY2UgZnJvbSB0aGUgcG9wdXAncyBsb2NhdGlvblxuICogICAtIGEge0BsaW5rIFBvaW50TGlrZX0gc3BlY2lmeWluZyBhIGNvbnN0YW50IG9mZnNldFxuICogICAtIGFuIG9iamVjdCBvZiB7QGxpbmsgUG9pbnR9cyBzcGVjaWZpbmcgYW4gb2Zmc2V0IGZvciBlYWNoIGFuY2hvciBwb3NpdGlvblxuICogIE5lZ2F0aXZlIG9mZnNldHMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2xhc3NOYW1lXSBTcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzIG5hbWVzIHRvIGFkZCB0byBwb3B1cCBjb250YWluZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tYXhXaWR0aD0nMjQwcHgnXSAtXG4gKiAgQSBzdHJpbmcgdGhhdCBzZXRzIHRoZSBDU1MgcHJvcGVydHkgb2YgdGhlIHBvcHVwJ3MgbWF4aW11bSB3aWR0aCwgZWcgYCczMDBweCdgLlxuICogIFRvIGVuc3VyZSB0aGUgcG9wdXAgcmVzaXplcyB0byBmaXQgaXRzIGNvbnRlbnQsIHNldCB0aGlzIHByb3BlcnR5IHRvIGAnbm9uZSdgLlxuICogIEF2YWlsYWJsZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9tYXgtd2lkdGhcbiAqIEBleGFtcGxlXG4gKiB2YXIgbWFya2VySGVpZ2h0ID0gNTAsIG1hcmtlclJhZGl1cyA9IDEwLCBsaW5lYXJPZmZzZXQgPSAyNTtcbiAqIHZhciBwb3B1cE9mZnNldHMgPSB7XG4gKiAgJ3RvcCc6IFswLCAwXSxcbiAqICAndG9wLWxlZnQnOiBbMCwwXSxcbiAqICAndG9wLXJpZ2h0JzogWzAsMF0sXG4gKiAgJ2JvdHRvbSc6IFswLCAtbWFya2VySGVpZ2h0XSxcbiAqICAnYm90dG9tLWxlZnQnOiBbbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAqICAnYm90dG9tLXJpZ2h0JzogWy1saW5lYXJPZmZzZXQsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMgKyBsaW5lYXJPZmZzZXQpICogLTFdLFxuICogICdsZWZ0JzogW21hcmtlclJhZGl1cywgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cykgKiAtMV0sXG4gKiAgJ3JpZ2h0JzogWy1tYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdXG4gKiAgfTtcbiAqIHZhciBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCh7b2Zmc2V0OiBwb3B1cE9mZnNldHMsIGNsYXNzTmFtZTogJ215LWNsYXNzJ30pXG4gKiAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gKiAgIC5zZXRIVE1MKFwiPGgxPkhlbGxvIFdvcmxkITwvaDE+XCIpXG4gKiAgIC5zZXRNYXhXaWR0aChcIjMwMHB4XCIpXG4gKiAgIC5hZGRUbyhtYXApO1xuICogQHNlZSBbRGlzcGxheSBhIHBvcHVwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLylcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24tY2xpY2svKVxuICogQHNlZSBbQXR0YWNoIGEgcG9wdXAgdG8gYSBtYXJrZXIgaW5zdGFuY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2V0LXBvcHVwLylcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wdXAgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgb3B0aW9uczogUG9wdXBPcHRpb25zO1xuICAgIF9jb250ZW50OiBIVE1MRWxlbWVudDtcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfY2xvc2VCdXR0b246IEhUTUxFbGVtZW50O1xuICAgIF90aXA6IEhUTUxFbGVtZW50O1xuICAgIF9sbmdMYXQ6IExuZ0xhdDtcbiAgICBfdHJhY2tQb2ludGVyOiBib29sZWFuO1xuICAgIF9wb3M6ID9Qb2ludDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBvcHVwT3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZShkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICBiaW5kQWxsKFsnX3VwZGF0ZScsICdfb25DbGlja0Nsb3NlJywgJ3JlbW92ZSddLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBwb3B1cCB0byBhIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcGJveCBHTCBKUyBtYXAgdG8gYWRkIHRoZSBwb3B1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZFRvKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCB0aGlzLl9vbkNsaWNrQ2xvc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdyZW1vdmUnLCB0aGlzLnJlbW92ZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLl90cmFja1BvaW50ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vtb3ZlJywgKGUpID0+IHsgdGhpcy5fdXBkYXRlKGUucG9pbnQpOyB9KTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2V1cCcsIChlKSA9PiB7IHRoaXMuX3VwZGF0ZShlLnBvaW50KTsgfSk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtcG9wdXAtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW52YXNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBwb3B1cCBpcyBvcGVuZWQgbWFudWFsbHkgb3IgcHJvZ3JhbWF0aWNhbGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgb3BlblxuICAgICAgICAgKiBAbWVtYmVyb2YgUG9wdXBcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UG9wdXB9IHBvcHVwIG9iamVjdCB0aGF0IHdhcyBvcGVuZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ29wZW4nKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcG9wdXAgaXMgb3BlbiwgYGZhbHNlYCBpZiBpdCBpcyBjbG9zZWQuXG4gICAgICovXG4gICAgaXNPcGVuKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9tYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcG9wdXAgZnJvbSB0aGUgbWFwIGl0IGhhcyBiZWVuIGFkZGVkIHRvLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKS5hZGRUbyhtYXApO1xuICAgICAqIHBvcHVwLnJlbW92ZSgpO1xuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fb25DbGlja0Nsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3JlbW92ZScsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNlbW92ZScpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBwb3B1cCBpcyBjbG9zZWQgbWFudWFsbHkgb3IgcHJvZ3JhbWF0aWNhbGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgY2xvc2VcbiAgICAgICAgICogQG1lbWJlcm9mIFBvcHVwXG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge1BvcHVwfSBwb3B1cCBvYmplY3QgdGhhdCB3YXMgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdjbG9zZScpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gb2YgdGhlIHBvcHVwJ3MgYW5jaG9yLlxuICAgICAqXG4gICAgICogVGhlIGxvbmdpdHVkZSBvZiB0aGUgcmVzdWx0IG1heSBkaWZmZXIgYnkgYSBtdWx0aXBsZSBvZiAzNjAgZGVncmVlcyBmcm9tIHRoZSBsb25naXR1ZGUgcHJldmlvdXNseVxuICAgICAqIHNldCBieSBgc2V0TG5nTGF0YCBiZWNhdXNlIGBQb3B1cGAgd3JhcHMgdGhlIGFuY2hvciBsb25naXR1ZGUgYWNyb3NzIGNvcGllcyBvZiB0aGUgd29ybGQgdG8ga2VlcFxuICAgICAqIHRoZSBwb3B1cCBvbiBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKi9cbiAgICBnZXRMbmdMYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sbmdMYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvciwgYW5kIG1vdmVzIHRoZSBwb3B1cCB0byBpdC4gUmVwbGFjZXMgdHJhY2tQb2ludGVyKCkgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG5nbGF0IFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gdG8gc2V0IGFzIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldExuZ0xhdChsbmdsYXQ6IExuZ0xhdExpa2UpIHtcbiAgICAgICAgdGhpcy5fbG5nTGF0ID0gTG5nTGF0LmNvbnZlcnQobG5nbGF0KTtcbiAgICAgICAgdGhpcy5fcG9zID0gbnVsbDtcblxuICAgICAgICB0aGlzLl90cmFja1BvaW50ZXIgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2Vtb3ZlJyk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtcG9wdXAtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW52YXNDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhY2tzIHRoZSBwb3B1cCBhbmNob3IgdG8gdGhlIGN1cnNvciBwb3NpdGlvbiwgb24gc2NyZWVucyB3aXRoIGEgcG9pbnRlciBkZXZpY2UgKHdpbGwgYmUgaGlkZGVuIG9uIHRvdWNoc2NyZWVucykuIFJlcGxhY2VzIHRoZSBzZXRMbmdMYXQgYmVoYXZpb3IuXG4gICAgICogRm9yIG1vc3QgdXNlIGNhc2VzLCBgY2xvc2VPbkNsaWNrYCBhbmQgYGNsb3NlQnV0dG9uYCBzaG91bGQgYWxzbyBiZSBzZXQgdG8gYGZhbHNlYCBoZXJlLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgdHJhY2tQb2ludGVyKCkge1xuICAgICAgICB0aGlzLl90cmFja1BvaW50ZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLl9wb3MgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3VzZW1vdmUnLCAoZSkgPT4geyB0aGlzLl91cGRhdGUoZS5wb2ludCk7IH0pO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdkcmFnJywgKGUpID0+IHsgdGhpcy5fdXBkYXRlKGUucG9pbnQpOyB9KTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1wb3B1cC10cmFjay1wb2ludGVyJyk7XG4gICAgICAgICAgICB0aGlzLl9tYXAuX2NhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC10cmFjay1wb2ludGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBQb3B1cGAncyBIVE1MIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGNvbnRlbnQgdG8gYSBzdHJpbmcgb2YgdGV4dC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIFtUZXh0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVGV4dCkgbm9kZSBpbiB0aGUgRE9NLFxuICAgICAqIHNvIGl0IGNhbm5vdCBpbnNlcnQgcmF3IEhUTUwuIFVzZSB0aGlzIG1ldGhvZCBmb3Igc2VjdXJpdHkgYWdhaW5zdCBYU1NcbiAgICAgKiBpZiB0aGUgcG9wdXAgY29udGVudCBpcyB1c2VyLXByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRleHQgVGV4dHVhbCBjb250ZW50IGZvciB0aGUgcG9wdXAuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gICAgICogICAuc2V0TG5nTGF0KGUubG5nTGF0KVxuICAgICAqICAgLnNldFRleHQoJ0hlbGxvLCB3b3JsZCEnKVxuICAgICAqICAgLmFkZFRvKG1hcCk7XG4gICAgICovXG4gICAgc2V0VGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RE9NQ29udGVudCh3aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgY29udGVudCB0byB0aGUgSFRNTCBwcm92aWRlZCBhcyBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gSFRNTCBmaWx0ZXJpbmcgb3Igc2FuaXRpemF0aW9uLCBhbmQgbXVzdCBiZVxuICAgICAqIHVzZWQgb25seSB3aXRoIHRydXN0ZWQgY29udGVudC4gQ29uc2lkZXIge0BsaW5rIFBvcHVwI3NldFRleHR9IGlmXG4gICAgICogdGhlIGNvbnRlbnQgaXMgYW4gdW50cnVzdGVkIHRleHQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGh0bWwgQSBzdHJpbmcgcmVwcmVzZW50aW5nIEhUTUwgY29udGVudCBmb3IgdGhlIHBvcHVwLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0SFRNTChodG1sOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZnJhZyA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGNvbnN0IHRlbXAgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9keScpO1xuICAgICAgICBsZXQgY2hpbGQ7XG4gICAgICAgIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNoaWxkID0gdGVtcC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKCFjaGlsZCkgYnJlYWs7XG4gICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNldERPTUNvbnRlbnQoZnJhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcG9wdXAncyBtYXhpbXVtIHdpZHRoLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIG1heGltdW0gd2lkdGggb2YgdGhlIHBvcHVwLlxuICAgICAqL1xuICAgIGdldE1heFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgbWF4aW11bSB3aWR0aC4gVGhpcyBpcyBzZXR0aW5nIHRoZSBDU1MgcHJvcGVydHkgYG1heC13aWR0aGAuXG4gICAgICogQXZhaWxhYmxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL21heC13aWR0aFxuICAgICAqXG4gICAgICogQHBhcmFtIG1heFdpZHRoIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgZm9yIHRoZSBtYXhpbXVtIHdpZHRoLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TWF4V2lkdGgobWF4V2lkdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWF4V2lkdGggPSBtYXhXaWR0aDtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgY29udGVudCB0byB0aGUgZWxlbWVudCBwcm92aWRlZCBhcyBhIERPTSBub2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGh0bWxOb2RlIEEgRE9NIG5vZGUgdG8gYmUgdXNlZCBhcyBjb250ZW50IGZvciB0aGUgcG9wdXAuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIGNyZWF0ZSBhbiBlbGVtZW50IHdpdGggdGhlIHBvcHVwIGNvbnRlbnRcbiAgICAgKiB2YXIgZGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAqIGRpdi5pbm5lckhUTUwgPSAnSGVsbG8sIHdvcmxkISc7XG4gICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gICAgICogICAuc2V0RE9NQ29udGVudChkaXYpXG4gICAgICogICAuYWRkVG8obWFwKTtcbiAgICAgKi9cbiAgICBzZXRET01Db250ZW50KGh0bWxOb2RlOiBOb2RlKSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZUNvbnRlbnQoKTtcbiAgICAgICAgdGhpcy5fY29udGVudC5hcHBlbmRDaGlsZChodG1sTm9kZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfY3JlYXRlQ29udGVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb250ZW50ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLWNvbnRlbnQnLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsICdtYXBib3hnbC1wb3B1cC1jbG9zZS1idXR0b24nLCB0aGlzLl9jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZSBwb3B1cCcpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uaW5uZXJIVE1MID0gJyYjMjE1Oyc7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2tDbG9zZSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIF91cGRhdGUoY3Vyc29yOiBQb2ludExpa2UpIHtcblxuICAgICAgICBjb25zdCBoYXNQb3NpdGlvbiA9IHRoaXMuX2xuZ0xhdCB8fCB0aGlzLl90cmFja1BvaW50ZXI7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9tYXAgfHwgIWhhc1Bvc2l0aW9uIHx8ICF0aGlzLl9jb250ZW50KSB7IHJldHVybjsgfVxuXG4gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAnLCB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkpO1xuICAgICAgICAgICAgdGhpcy5fdGlwICAgICAgID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLXRpcCcsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY29udGVudCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jbGFzc05hbWUuc3BsaXQoJyAnKS5mb3JFYWNoKG5hbWUgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQobmFtZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1heFdpZHRoICYmIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aCAhPT0gdGhpcy5vcHRpb25zLm1heFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUubWF4V2lkdGggPSB0aGlzLm9wdGlvbnMubWF4V2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcyAmJiAhdGhpcy5fdHJhY2tQb2ludGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9sbmdMYXQgPSBzbWFydFdyYXAodGhpcy5fbG5nTGF0LCB0aGlzLl9wb3MsIHRoaXMuX21hcC50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrUG9pbnRlciAmJiAhY3Vyc29yKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5fcG9zID0gdGhpcy5fdHJhY2tQb2ludGVyICYmIGN1cnNvciA/IGN1cnNvciA6IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCk7XG5cbiAgICAgICAgbGV0IGFuY2hvcjogP0FuY2hvciA9IHRoaXMub3B0aW9ucy5hbmNob3I7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldCh0aGlzLm9wdGlvbnMub2Zmc2V0KTtcblxuICAgICAgICBpZiAoIWFuY2hvcikge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgbGV0IGFuY2hvckNvbXBvbmVudHM7XG5cbiAgICAgICAgICAgIGlmIChwb3MueSArIG9mZnNldC5ib3R0b20ueSA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMgPSBbJ3RvcCddO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MueSA+IHRoaXMuX21hcC50cmFuc2Zvcm0uaGVpZ2h0IC0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yQ29tcG9uZW50cyA9IFsnYm90dG9tJ107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvcy54IDwgd2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yQ29tcG9uZW50cy5wdXNoKCdsZWZ0Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvcy54ID4gdGhpcy5fbWFwLnRyYW5zZm9ybS53aWR0aCAtIHdpZHRoIC8gMikge1xuICAgICAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMucHVzaCgncmlnaHQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFuY2hvckNvbXBvbmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gJ2JvdHRvbSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IChhbmNob3JDb21wb25lbnRzLmpvaW4oJy0nKTogYW55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9mZnNldGVkUG9zID0gcG9zLmFkZChvZmZzZXRbYW5jaG9yXSkucm91bmQoKTtcbiAgICAgICAgRE9NLnNldFRyYW5zZm9ybSh0aGlzLl9jb250YWluZXIsIGAke2FuY2hvclRyYW5zbGF0ZVthbmNob3JdfSB0cmFuc2xhdGUoJHtvZmZzZXRlZFBvcy54fXB4LCR7b2Zmc2V0ZWRQb3MueX1weClgKTtcbiAgICAgICAgYXBwbHlBbmNob3JDbGFzcyh0aGlzLl9jb250YWluZXIsIGFuY2hvciwgJ3BvcHVwJyk7XG4gICAgfVxuXG4gICAgX29uQ2xpY2tDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQ6ID9PZmZzZXQpIHtcbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplT2Zmc2V0KG5ldyBQb2ludCgwLCAwKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhIHJhZGl1cyBmcm9tIHdoaWNoIHRvIGNhbGN1bGF0ZSBvZmZzZXRzIGF0IGFsbCBwb3NpdGlvbnNcbiAgICAgICAgY29uc3QgY29ybmVyT2Zmc2V0ID0gTWF0aC5yb3VuZChNYXRoLnNxcnQoMC41ICogTWF0aC5wb3cob2Zmc2V0LCAyKSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2NlbnRlcic6IG5ldyBQb2ludCgwLCAwKSxcbiAgICAgICAgICAgICd0b3AnOiBuZXcgUG9pbnQoMCwgb2Zmc2V0KSxcbiAgICAgICAgICAgICd0b3AtbGVmdCc6IG5ldyBQb2ludChjb3JuZXJPZmZzZXQsIGNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogbmV3IFBvaW50KC1jb3JuZXJPZmZzZXQsIGNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAnYm90dG9tJzogbmV3IFBvaW50KDAsIC1vZmZzZXQpLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogbmV3IFBvaW50KGNvcm5lck9mZnNldCwgLWNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogbmV3IFBvaW50KC1jb3JuZXJPZmZzZXQsIC1jb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ2xlZnQnOiBuZXcgUG9pbnQob2Zmc2V0LCAwKSxcbiAgICAgICAgICAgICdyaWdodCc6IG5ldyBQb2ludCgtb2Zmc2V0LCAwKVxuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIGlmIChvZmZzZXQgaW5zdGFuY2VvZiBQb2ludCB8fCBBcnJheS5pc0FycmF5KG9mZnNldCkpIHtcbiAgICAgICAgLy8gaW5wdXQgc3BlY2lmaWVzIGEgc2luZ2xlIG9mZnNldCB0byBiZSBhcHBsaWVkIHRvIGFsbCBwb3NpdGlvbnNcbiAgICAgICAgY29uc3QgY29udmVydGVkT2Zmc2V0ID0gUG9pbnQuY29udmVydChvZmZzZXQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2NlbnRlcic6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICd0b3AnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAndG9wLWxlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ2JvdHRvbSc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20tbGVmdCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnbGVmdCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdyaWdodCc6IGNvbnZlcnRlZE9mZnNldFxuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW5wdXQgc3BlY2lmaWVzIGFuIG9mZnNldCBwZXIgcG9zaXRpb25cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjZW50ZXInOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnY2VudGVyJ10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICd0b3AnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsndG9wJ10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICd0b3AtbGVmdCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wyd0b3AtbGVmdCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ3RvcC1yaWdodCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAnYm90dG9tJzogUG9pbnQuY29udmVydChvZmZzZXRbJ2JvdHRvbSddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnYm90dG9tLWxlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wydib3R0b20tcmlnaHQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2xlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnbGVmdCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAncmlnaHQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsncmlnaHQnXSB8fCBbMCwgMF0pXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHN1cHBvcnRlZCBmcm9tICdAbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQnO1xuXG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCBNYXAgZnJvbSAnLi91aS9tYXAnO1xuaW1wb3J0IE5hdmlnYXRpb25Db250cm9sIGZyb20gJy4vdWkvY29udHJvbC9uYXZpZ2F0aW9uX2NvbnRyb2wnO1xuaW1wb3J0IEdlb2xvY2F0ZUNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2dlb2xvY2F0ZV9jb250cm9sJztcbmltcG9ydCBBdHRyaWJ1dGlvbkNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2wnO1xuaW1wb3J0IFNjYWxlQ29udHJvbCBmcm9tICcuL3VpL2NvbnRyb2wvc2NhbGVfY29udHJvbCc7XG5pbXBvcnQgRnVsbHNjcmVlbkNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2Z1bGxzY3JlZW5fY29udHJvbCc7XG5pbXBvcnQgUG9wdXAgZnJvbSAnLi91aS9wb3B1cCc7XG5pbXBvcnQgTWFya2VyIGZyb20gJy4vdWkvbWFya2VyJztcbmltcG9ydCBTdHlsZSBmcm9tICcuL3N0eWxlL3N0eWxlJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi9nZW8vbG5nX2xhdCc7XG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4vZ2VvL2xuZ19sYXRfYm91bmRzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZSc7XG5pbXBvcnQge0V2ZW50ZWR9IGZyb20gJy4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBjb25maWcgZnJvbSAnLi91dGlsL2NvbmZpZyc7XG5pbXBvcnQge3NldFJUTFRleHRQbHVnaW59IGZyb20gJy4vc291cmNlL3J0bF90ZXh0X3BsdWdpbic7XG5pbXBvcnQgV29ya2VyUG9vbCBmcm9tICcuL3V0aWwvd29ya2VyX3Bvb2wnO1xuaW1wb3J0IHtjbGVhclRpbGVDYWNoZX0gZnJvbSAnLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZSc7XG5cbmNvbnN0IGV4cG9ydGVkID0ge1xuICAgIHZlcnNpb24sXG4gICAgc3VwcG9ydGVkLFxuICAgIHNldFJUTFRleHRQbHVnaW4sXG4gICAgTWFwLFxuICAgIE5hdmlnYXRpb25Db250cm9sLFxuICAgIEdlb2xvY2F0ZUNvbnRyb2wsXG4gICAgQXR0cmlidXRpb25Db250cm9sLFxuICAgIFNjYWxlQ29udHJvbCxcbiAgICBGdWxsc2NyZWVuQ29udHJvbCxcbiAgICBQb3B1cCxcbiAgICBNYXJrZXIsXG4gICAgU3R5bGUsXG4gICAgTG5nTGF0LFxuICAgIExuZ0xhdEJvdW5kcyxcbiAgICBQb2ludCxcbiAgICBNZXJjYXRvckNvb3JkaW5hdGUsXG4gICAgRXZlbnRlZCxcbiAgICBjb25maWcsXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXAncyBbYWNjZXNzIHRva2VuXShodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvZGVmaW5lLWFjY2Vzcy10b2tlbi8pLlxuICAgICAqXG4gICAgICogQHZhciB7c3RyaW5nfSBhY2Nlc3NUb2tlblxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wuYWNjZXNzVG9rZW4gPSBteUFjY2Vzc1Rva2VuO1xuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGVzLylcbiAgICAgKi9cbiAgICBnZXQgYWNjZXNzVG9rZW4oKTogP3N0cmluZyB7XG4gICAgICAgIHJldHVybiBjb25maWcuQUNDRVNTX1RPS0VOO1xuICAgIH0sXG5cbiAgICBzZXQgYWNjZXNzVG9rZW4odG9rZW46IHN0cmluZykge1xuICAgICAgICBjb25maWcuQUNDRVNTX1RPS0VOID0gdG9rZW47XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgdGhlIG1hcCdzIGRlZmF1bHQgQVBJIFVSTCBmb3IgcmVxdWVzdGluZyB0aWxlcywgc3R5bGVzLCBzcHJpdGVzLCBhbmQgZ2x5cGhzXG4gICAgICpcbiAgICAgKiBAdmFyIHtzdHJpbmd9IGJhc2VBcGlVcmxcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcGJveGdsLmJhc2VBcGlVcmwgPSAnaHR0cHM6Ly9hcGkubWFwYm94LmNvbSc7XG4gICAgICovXG4gICAgZ2V0IGJhc2VBcGlVcmwoKTogP3N0cmluZyB7XG4gICAgICAgIHJldHVybiBjb25maWcuQVBJX1VSTDtcbiAgICB9LFxuXG4gICAgc2V0IGJhc2VBcGlVcmwodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgY29uZmlnLkFQSV9VUkwgPSB1cmw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgdGhlIG51bWJlciBvZiB3ZWIgd29ya2VycyBpbnN0YW50aWF0ZWQgb24gYSBwYWdlIHdpdGggR0wgSlMgbWFwcy5cbiAgICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gaGFsZiB0aGUgbnVtYmVyIG9mIENQVSBjb3JlcyAoY2FwcGVkIGF0IDYpLlxuICAgICAqIE1ha2Ugc3VyZSB0byBzZXQgdGhpcyBwcm9wZXJ0eSBiZWZvcmUgY3JlYXRpbmcgYW55IG1hcCBpbnN0YW5jZXMgZm9yIGl0IHRvIGhhdmUgZWZmZWN0LlxuICAgICAqXG4gICAgICogQHZhciB7c3RyaW5nfSB3b3JrZXJDb3VudFxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wud29ya2VyQ291bnQgPSAyO1xuICAgICAqL1xuICAgIGdldCB3b3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gV29ya2VyUG9vbC53b3JrZXJDb3VudDtcbiAgICB9LFxuXG4gICAgc2V0IHdvcmtlckNvdW50KGNvdW50OiBudW1iZXIpIHtcbiAgICAgICAgV29ya2VyUG9vbC53b3JrZXJDb3VudCA9IGNvdW50O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbWFnZXMgKHJhc3RlciB0aWxlcywgc3ByaXRlcywgaWNvbnMpIHRvIGxvYWQgaW4gcGFyYWxsZWwsXG4gICAgICogd2hpY2ggYWZmZWN0cyBwZXJmb3JtYW5jZSBpbiByYXN0ZXItaGVhdnkgbWFwcy4gMTYgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEB2YXIge3N0cmluZ30gbWF4UGFyYWxsZWxJbWFnZVJlcXVlc3RzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXBib3hnbC5tYXhQYXJhbGxlbEltYWdlUmVxdWVzdHMgPSAxMDtcbiAgICAgKi9cbiAgICBnZXQgbWF4UGFyYWxsZWxJbWFnZVJlcXVlc3RzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb25maWcuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTO1xuICAgIH0sXG5cbiAgICBzZXQgbWF4UGFyYWxsZWxJbWFnZVJlcXVlc3RzKG51bVJlcXVlc3RzOiBudW1iZXIpIHtcbiAgICAgICAgY29uZmlnLk1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUyA9IG51bVJlcXVlc3RzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYnJvd3NlciBzdG9yYWdlIHVzZWQgYnkgdGhpcyBsaWJyYXJ5LiBVc2luZyB0aGlzIG1ldGhvZCBmbHVzaGVzIHRoZSBNYXBib3ggdGlsZVxuICAgICAqIGNhY2hlIHRoYXQgaXMgbWFuYWdlZCBieSB0aGlzIGxpYnJhcnkuIFRpbGVzIG1heSBzdGlsbCBiZSBjYWNoZWQgYnkgdGhlIGJyb3dzZXJcbiAgICAgKiBpbiBzb21lIGNhc2VzLlxuICAgICAqXG4gICAgICogVGhpcyBBUEkgaXMgc3VwcG9ydGVkIG9uIGJyb3dzZXJzIHdoZXJlIHRoZSBbYENhY2hlYCBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DYWNoZSlcbiAgICAgKiBpcyBzdXBwb3J0ZWQgYW5kIGVuYWJsZWQuIFRoaXMgaW5jbHVkZXMgYWxsIG1ham9yIGJyb3dzZXJzIHdoZW4gcGFnZXMgYXJlIHNlcnZlZCBvdmVyXG4gICAgICogYGh0dHBzOi8vYCwgZXhjZXB0IEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIE1vYmlsZS5cbiAgICAgKlxuICAgICAqIFdoZW4gY2FsbGVkIGluIHVuc3VwcG9ydGVkIGJyb3dzZXJzIG9yIGVudmlyb25tZW50cyAocHJpdmF0ZSBvciBpbmNvZ25pdG8gbW9kZSksIHRoZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gZXJyb3IgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb24gY2xlYXJTdG9yYWdlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgY2xlYXJTdG9yYWdlKGNhbGxiYWNrPzogKGVycjogP0Vycm9yKSA9PiB2b2lkKSB7XG4gICAgICAgIGNsZWFyVGlsZUNhY2hlKGNhbGxiYWNrKTtcbiAgICB9LFxuXG4gICAgd29ya2VyVXJsOiAnJ1xufTtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBNYXBib3ggR0wgSlMgaW4gdXNlIGFzIHNwZWNpZmllZCBpbiBgcGFja2FnZS5qc29uYCxcbiAqIGBDSEFOR0VMT0cubWRgLCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEB2YXIge3N0cmluZ30gdmVyc2lvblxuICovXG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBicm93c2VyIFtzdXBwb3J0cyBNYXBib3ggR0wgSlNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9tYXBib3gtYnJvd3Nlci1zdXBwb3J0LyNtYXBib3gtZ2wtanMpLlxuICpcbiAqIEBmdW5jdGlvbiBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gSWYgYHRydWVgLFxuICogICB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94IEdMIEpTIHdvdWxkXG4gKiAgIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuIGV4cGVjdGVkIChlLmcuIGEgc29mdHdhcmUgV2ViR0wgcmVuZGVyZXIgd291bGQgYmUgdXNlZCkuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqIG1hcGJveGdsLnN1cHBvcnRlZCgpIC8vID0gdHJ1ZVxuICogQHNlZSBbQ2hlY2sgZm9yIGJyb3dzZXIgc3VwcG9ydF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jaGVjay1mb3Itc3VwcG9ydC8pXG4gKi9cblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAncyBbUlRMIHRleHQgcGx1Z2luXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9wbHVnaW5zLyNtYXBib3gtZ2wtcnRsLXRleHQpLlxuICogTmVjZXNzYXJ5IGZvciBzdXBwb3J0aW5nIHRoZSBBcmFiaWMgYW5kIEhlYnJldyBsYW5ndWFnZXMsIHdoaWNoIGFyZSB3cml0dGVuIHJpZ2h0LXRvLWxlZnQuIE1hcGJveCBTdHVkaW8gbG9hZHMgdGhpcyBwbHVnaW4gYnkgZGVmYXVsdC5cbiAqXG4gKiBAZnVuY3Rpb24gc2V0UlRMVGV4dFBsdWdpblxuICogQHBhcmFtIHtzdHJpbmd9IHBsdWdpblVSTCBVUkwgcG9pbnRpbmcgdG8gdGhlIE1hcGJveCBSVEwgdGV4dCBwbHVnaW4gc291cmNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gKiBAZXhhbXBsZVxuICogbWFwYm94Z2wuc2V0UlRMVGV4dFBsdWdpbignaHR0cHM6Ly9hcGkubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvcGx1Z2lucy9tYXBib3gtZ2wtcnRsLXRleHQvdjAuMi4wL21hcGJveC1nbC1ydGwtdGV4dC5qcycpO1xuICogQHNlZSBbQWRkIHN1cHBvcnQgZm9yIHJpZ2h0LXRvLWxlZnQgc2NyaXB0c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tYXBib3gtZ2wtcnRsLXRleHQvKVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVkO1xuXG4vLyBjYW5hcnkgYXNzZXJ0OiB1c2VkIHRvIGNvbmZpcm0gdGhhdCBhc3NlcnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gcHJvZHVjdGlvbiBidWlsZFxuYXNzZXJ0KHRydWUsICdjYW5hcnkgYXNzZXJ0Jyk7XG4iLCIvL1xuLy8gT3VyIGN1c3RvbSBpbnRybyBwcm92aWRlcyBhIHNwZWNpYWxpemVkIFwiZGVmaW5lKClcIiBmdW5jdGlvbiwgY2FsbGVkIGJ5IHRoZVxuLy8gQU1EIG1vZHVsZXMgYmVsb3csIHRoYXQgc2V0cyB1cCB0aGUgd29ya2VyIGJsb2IgVVJMIGFuZCB0aGVuIGV4ZWN1dGVzIHRoZVxuLy8gbWFpbiBtb2R1bGUsIHN0b3JpbmcgaXRzIGV4cG9ydGVkIHZhbHVlIGFzICdtYXBib3hnbCdcblxuLy8gVGhlIHRocmVlIFwiY2h1bmtzXCIgaW1wb3J0ZWQgaGVyZSBhcmUgcHJvZHVjZWQgYnkgYSBmaXJzdCBSb2xsdXAgcGFzcyxcbi8vIHdoaWNoIG91dHB1dHMgdGhlbSBhcyBBTUQgbW9kdWxlcy5cblxuLy8gU2hhcmVkIGRlcGVuZGVuY2llcywgaS5lLjpcbi8qXG5kZWZpbmUoWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gICAgLy8gQ29kZSBmb3IgYWxsIGNvbW1vbiBkZXBlbmRlbmNpZXNcbiAgICAvLyBFYWNoIG1vZHVsZSdzIGV4cG9ydHMgYXJlIGF0dGFjaGVkIGF0dGFjaGVkIHRvICdleHBvcnRzJyAod2l0aFxuICAgIC8vIG5hbWVzIHJld3JpdHRlbiB0byBhdm9pZCBjb2xsaXNpb25zLCBldGMuKVxufSlcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwYm94Z2wvc2hhcmVkJztcblxuLy8gV29ya2VyIGFuZCBpdHMgdW5pcXVlIGRlcGVuZGVuY2llcywgaS5lLjpcbi8qXG5kZWZpbmUoWycuL3NoYXJlZC5qcyddLCBmdW5jdGlvbiAoX19zaGFyZWRfX2pzKSB7XG4gICAgLy8gIENvZGUgZm9yIHdvcmtlciBzY3JpcHQgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzLlxuICAgIC8vICBFeHBlY3RzIHRoZSBvdXRwdXQgb2YgJ3NoYXJlZCcgbW9kdWxlIHRvIGJlIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCxcbiAgICAvLyAgc2luY2UgYWxsIHJlZmVyZW5jZXMgdG8gY29tbW9uIGRlcHMgbG9vayBsaWtlLCBlLmcuLFxuICAgIC8vICBfX3NoYXJlZF9fanMuc2hhcGVUZXh0KCkuXG59KTtcbiovXG4vLyBXaGVuIHRoaXMgd3JhcHBlciBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gb3VyIGN1c3RvbSBkZWZpbmUoKSBhYm92ZSxcbi8vIGl0IGdldHMgc3RyaW5naWZpZWQsIHRvZ2V0aGVyIHdpdGggdGhlIHNoYXJlZCB3cmFwcGVyICh1c2luZ1xuLy8gRnVuY3Rpb24udG9TdHJpbmcoKSksIGFuZCB0aGUgcmVzdWx0aW5nIHN0cmluZyBvZiBjb2RlIGlzIG1hZGUgaW50byBhXG4vLyBCbG9iIFVSTCB0aGF0IGdldHMgdXNlZCBieSB0aGUgbWFpbiBtb2R1bGUgdG8gY3JlYXRlIHRoZSB3ZWIgd29ya2Vycy5cbmltcG9ydCAnLi9idWlsZC9tYXBib3hnbC93b3JrZXInO1xuXG4vLyBNYWluIG1vZHVsZSBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXNcbi8qXG5kZWZpbmUoWycuL3NoYXJlZC5qcyddLCBmdW5jdGlvbiAoX19zaGFyZWRfX2pzKSB7XG4gICAgLy8gIENvZGUgZm9yIG1haW4gR0wgSlMgbW9kdWxlIGFuZCBpdHMgdW5pcXVlIGRlcGVuZGVuY2llcy5cbiAgICAvLyAgRXhwZWN0cyB0aGUgb3V0cHV0IG9mICdzaGFyZWQnIG1vZHVsZSB0byBiZSBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQsXG4gICAgLy8gIHNpbmNlIGFsbCByZWZlcmVuY2VzIHRvIGNvbW1vbiBkZXBzIGxvb2sgbGlrZSwgZS5nLixcbiAgICAvLyAgX19zaGFyZWRfX2pzLnNoYXBlVGV4dCgpLlxuICAgIC8vXG4gICAgLy8gIFJldHVybnMgdGhlIGFjdHVhbCBtYXBib3hnbCAoaS5lLiBzcmMvaW5kZXguanMpXG59KTtcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwYm94Z2wvaW5kZXgnO1xuXG5leHBvcnQgZGVmYXVsdCBtYXBib3hnbDtcbiJdLCJuYW1lcyI6WyJhcmd1bWVudHMiLCJyZXF1aXJlJCQwIiwicmVxdWlyZSQkMSIsImxldCIsImNvbnN0IiwiVW5pdEJlemllciIsIndpbmRvdyIsImV4cG9ydGVkIiwiYnJvd3NlciIsIndlYnBTdXBwb3J0ZWQiLCJzZGtWZXJzaW9uIiwidGhpcyIsInN1cGVyIiwiYXNzZXJ0IiwibGlzdGVuZXIiLCJwYXJzZUNTU0NvbG9yIiwidG9TdHJpbmciLCJ0eXBlIiwidHlwZXMiLCJhcmciLCJ2YWx1ZVRvU3RyaW5nIiwiaSIsImV4cGVjdGVkIiwicGFyc2VkIiwiZXJyb3IiLCJhcnJheSIsImludGVycG9sYXRlTnVtYmVyIiwib3V0cHV0SW5kZXgiLCJsdCIsInJ0IiwidHlwZVRvU3RyaW5nIiwiZXh0ZW5kIiwic3RvcCIsImludGVycG9sYXRpb25UeXBlIiwiZGVmaW5pdGlvbnMiLCJpc0NvbnN0YW50LmlzU3RhdGVDb25zdGFudCIsImlzRmVhdHVyZUNvbnN0YW50IiwiaXNDb25zdGFudC5pc0ZlYXR1cmVDb25zdGFudCIsImlzQ29uc3RhbnQuaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50IiwidmFsaWRhdGVTcGVjIiwiZWxlbWVudFNwZWNLZXkiLCJsYXRlc3RTdHlsZVNwZWMiLCJ2YWxpZGF0ZVNvdXJjZSIsInZhbGlkYXRlTGlnaHQiLCJ2YWxpZGF0ZUZpbHRlciIsInZhbGlkYXRlUGFpbnRQcm9wZXJ0eSIsInZhbGlkYXRlTGF5b3V0UHJvcGVydHkiLCJHcmlkIiwibmFtZSIsImlzQ2hhciIsInJ0bFRleHRQbHVnaW4iLCJwcm9wZXJ0eSIsInN0eWxlU3BlYyIsIlBvaW50IiwibGF5b3V0IiwiU3RydWN0QXJyYXlMYXlvdXQiLCJQYXR0ZXJuTGF5b3V0QXJyYXkiLCJDaXJjbGVMYXlvdXRBcnJheSIsIlRyaWFuZ2xlSW5kZXhBcnJheSIsImxheW91dEF0dHJpYnV0ZXMiLCJidWNrZXRGZWF0dXJlIiwiZmVhdHVyZSIsImluZGV4IiwiZ2VvbWV0cnkiLCJzb3VyY2VMYXllckluZGV4IiwicGFpbnQiLCJnbE1hdHJpeC5BUlJBWV9UWVBFIiwiY2xvbmUiLCJlcXVhbHMiLCJnbE1hdHJpeC5FUFNJTE9OIiwiY3JlYXRlIiwiY29weSIsImlkZW50aXR5IiwiZnJvbVZhbHVlcyIsInNldCIsImludmVydCIsImRldGVybWluYW50IiwibXVsdGlwbHkiLCJyb3RhdGUiLCJzY2FsZSIsInRyYW5zbGF0ZSIsImZyb21Sb3RhdGlvbiIsImZyb21TY2FsaW5nIiwic3RyIiwiZnJvYiIsImFkZCIsInN1YnRyYWN0IiwibXVsdGlwbHlTY2FsYXIiLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsImV4YWN0RXF1YWxzIiwibXVsIiwic3ViIiwidHJhbnNwb3NlIiwiYWRqb2ludCIsImZyb21UcmFuc2xhdGlvbiIsImZyb21RdWF0IiwiYmV6aWVyIiwiZ2xNYXRyaXguUkFORE9NIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwiZGl2aWRlIiwiY2VpbCIsImZsb29yIiwibWluIiwibWF4Iiwicm91bmQiLCJzY2FsZUFuZEFkZCIsImRpc3RhbmNlIiwic3F1YXJlZERpc3RhbmNlIiwibGVuZ3RoIiwic3F1YXJlZExlbmd0aCIsIm5lZ2F0ZSIsImludmVyc2UiLCJub3JtYWxpemUiLCJkb3QiLCJjcm9zcyIsImxlcnAiLCJyYW5kb20iLCJ0cmFuc2Zvcm1NYXQ0IiwidHJhbnNmb3JtUXVhdCIsInplcm8iLCJkaXYiLCJkaXN0Iiwic3FyRGlzdCIsImxlbiIsInNxckxlbiIsImZvckVhY2giLCJ2ZWM0LmNsb25lIiwidmVjNC5mcm9tVmFsdWVzIiwidmVjNC5jb3B5IiwidmVjNC5zZXQiLCJ2ZWM0LmFkZCIsInZlYzQuc2NhbGUiLCJ2ZWM0LmRvdCIsInZlYzQubGVycCIsInZlYzQubGVuZ3RoIiwidmVjNC5zcXVhcmVkTGVuZ3RoIiwidmVjNC5ub3JtYWxpemUiLCJ2ZWM0LmV4YWN0RXF1YWxzIiwidmVjNC5lcXVhbHMiLCJ2ZWMzLmNyZWF0ZSIsInZlYzMuZnJvbVZhbHVlcyIsInZlYzMuZG90IiwidmVjMy5jcm9zcyIsInZlYzMubGVuIiwidmVjMy5ub3JtYWxpemUiLCJtYXQzLmNyZWF0ZSIsImZyb21Sb3RhdGlvblRyYW5zbGF0aW9uIiwiZnJvbU1hdDQiLCJxdWF0LmNyZWF0ZSIsIm1hdDQuZ2V0Um90YXRpb24iLCJtYXQ0LmdldFRyYW5zbGF0aW9uIiwicXVhdC5jb3B5IiwiZ2V0VHJhbnNsYXRpb24iLCJxdWF0LnJvdGF0ZVgiLCJxdWF0LnJvdGF0ZVkiLCJxdWF0LnJvdGF0ZVoiLCJxdWF0LmRvdCIsImNvbmp1Z2F0ZSIsInF1YXQubGVuZ3RoIiwicXVhdC5zcXVhcmVkTGVuZ3RoIiwidHJhbnNmb3JtTWF0MyIsImFuZ2xlIiwidmVjNC50cmFuc2Zvcm1NYXQ0IiwicHJvcGVydGllcyIsInN3YXAiLCJGaWxsTGF5b3V0QXJyYXkiLCJMaW5lSW5kZXhBcnJheSIsInJpbmciLCJlYXJjdXQiLCJjbGFzc2lmeVJpbmdzIiwic2lnbmVkQXJlYSIsIlZlY3RvclRpbGVGZWF0dXJlIiwiVmVjdG9yVGlsZUxheWVyIiwicmVxdWlyZSQkMiIsIm12dCIsIkVBUkNVVF9NQVhfUklOR1MiLCJGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkiLCJwIiwicHJvamVjdFF1ZXJ5R2VvbWV0cnkiLCJ2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzIiwiTGluZUxheW91dEFycmF5Iiwib2Zmc2V0IiwibGluZSIsInRhZ2dlZExpbmUiLCJhbGlnbiIsImludGVycG9sYXRlIiwiYWRkVmVydGV4IiwiU3ltYm9sTGF5b3V0QXJyYXkiLCJTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXkiLCJTeW1ib2xPcGFjaXR5QXJyYXkiLCJ1cGxvYWQiLCJDb2xsaXNpb25WZXJ0ZXhBcnJheSIsIkNvbGxpc2lvbkJveExheW91dEFycmF5IiwiQ29sbGlzaW9uQ2lyY2xlTGF5b3V0QXJyYXkiLCJ0cmFuc2Zvcm1UZXh0Iiwic3ltYm9sIiwiaW5kZXhBcnJheSIsImsiLCJib3giLCJjaXJjbGUiLCJoZWF0bWFwIiwiaGlsbHNoYWRlIiwiZmlsbCIsImZpbGxFeHRydXNpb24iLCJiYWNrZ3JvdW5kIiwicmFzdGVyIiwiaWQiLCJzcmMiLCJiaW4iLCJ3IiwiaCIsIkltYWdlRGF0YSIsIlByb3RvYnVmIiwiY2FsbGJhY2siLCJ4IiwiZGVzZXJpYWxpemUiLCJwcm90b3R5cGVBY2Nlc3NvcnMiLCJzb3VyY2VMYXllciIsImxheWVyU3RhdGVzIiwidnQiLCJmZWF0dXJlRmlsdGVyIiwiR2VvSlNPTkZlYXR1cmUiLCJkZXNlcmlhbGl6ZUJ1Y2tldCIsImJ1Y2tldCIsIlJhc3RlckJvdW5kc0FycmF5IiwiZGVmYXVsdENvbXBhcmUiLCJRdWV1ZSIsIm11cm11cjMiLCJtdXJtdXIyIiwibWluWm9vbSIsIm1heFpvb20iLCJzaGFwaW5nIiwiYW5jaG9yIiwicmVmUHJvcGVydGllcyIsImNyZWF0ZVN0eWxlTGF5ZXIiLCJ2YWx1ZXMiLCJsYXllckNvbmZpZ3MiLCJsYXllciIsInBvdHBhY2siLCJBbHBoYUltYWdlIiwic3RhY2siLCJnbHlwaHMiLCJyZWdpc3RlciIsIk92ZXJzY2FsZWRUaWxlSUQiLCJDb2xsaXNpb25Cb3hBcnJheSIsIkRpY3Rpb25hcnlDb2RlciIsIkZlYXR1cmVJbmRleCIsIndhcm5PbmNlIiwibWFwT2JqZWN0IiwiSW1hZ2VBdGxhcyIsIlN5bWJvbEJ1Y2tldCIsInBlcmZvcm1TeW1ib2xMYXlvdXQiLCJMaW5lQnVja2V0IiwiRmlsbEJ1Y2tldCIsIkZpbGxFeHRydXNpb25CdWNrZXQiLCJFdmFsdWF0aW9uUGFyYW1ldGVycyIsImdldEFycmF5QnVmZmVyIiwicGVyZm9ybWFuY2UiLCJERU1EYXRhIiwiRVhURU5UIiwicG9pbnQiLCJHZW9KU09OV3JhcHBlciIsIkZlYXR1cmVXcmFwcGVyIiwiUGJmIiwic29ydCIsInJld2luZCIsInRyYW5zZm9ybSIsInZ0cGJmIiwiZ2V0SlNPTiIsImNyZWF0ZUV4cHJlc3Npb24iLCJBY3RvciIsImdsb2JhbFJUTFRleHRQbHVnaW4iLCJlbmZvcmNlQ2FjaGVTaXplTGltaXQiLCJzZWxmIiwib3B0aW9ucyIsIlJlc291cmNlVHlwZSIsImdldEltYWdlIiwiUkdCQUltYWdlIiwiRXZlbnQiLCJJbWFnZVBvc2l0aW9uIiwiVGV4dHVyZSIsIkV2ZW50ZWQiLCJwYXJzZUdseXBoUEJGIiwiYXN5bmNBbGwiLCJUaW55U0RGIiwic3BoZXJpY2FsVG9DYXJ0ZXNpYW4iLCJQcm9wZXJ0aWVzIiwiRGF0YUNvbnN0YW50UHJvcGVydHkiLCJUcmFuc2l0aW9uYWJsZSIsImVuZHNXaXRoIiwiZW1pdFZhbGlkYXRpb25FcnJvcnMiLCJ2YWxpZGF0ZVN0eWxlIiwidW5pcXVlSWQiLCJwaWNrIiwiTG5nTGF0Qm91bmRzIiwibWVyY2F0b3JYZnJvbUxuZyIsIm1lcmNhdG9yWWZyb21MYXQiLCJFcnJvckV2ZW50IiwicG9zdFR1cm5zdGlsZUV2ZW50IiwicG9zdE1hcExvYWRFdmVudCIsImNhY2hlRW50cnlQb3NzaWJseUFkZGVkIiwiTWVyY2F0b3JDb29yZGluYXRlIiwicmFzdGVyQm91bmRzQXR0cmlidXRlcyIsIlNlZ21lbnRWZWN0b3IiLCJDYW5vbmljYWxUaWxlSUQiLCJnZXRWaWRlbyIsIlZhbGlkYXRpb25FcnJvciIsInZlY3RvciIsInJhc3RlckRlbSIsImdlb2pzb24iLCJ2aWRlbyIsImltYWdlIiwiY2FudmFzIiwiYmluZEFsbCIsIm1hdDQuaWRlbnRpdHkiLCJtYXQ0LnRyYW5zbGF0ZSIsIm1hdDQuc2NhbGUiLCJtYXQ0Lm11bHRpcGx5IiwiQ29sb3IiLCJBTFdBWVMiLCJkZWVwRXF1YWwiLCJjcmVhdGVTb3VyY2UiLCJTb3VyY2VGZWF0dXJlU3RhdGUiLCJ0aWxlIiwia2V5c0RpZmZlcmVuY2UiLCJ0aWxlSUQiLCJUaWxlIiwibWFwYm94Z2wiLCJpc0VxdWFsIiwibWF0NC5jcmVhdGUiLCJtYXQ0LnJvdGF0ZVoiLCJtYXQ0LmNsb25lIiwic3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tIiwiV3JpdGluZ01vZGUiLCJzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUiLCJvcmllbnRhdGlvbkNoYW5nZSIsImFkZER5bmFtaWNBdHRyaWJ1dGVzIiwicHJvamVjdGlvbi5wcm9qZWN0IiwicHJvamVjdGlvbi5wbGFjZUZpcnN0QW5kTGFzdEdseXBoIiwiaW50ZXJzZWN0aW9uVGVzdHMucG9seWdvbkludGVyc2VjdHNQb2x5Z29uIiwicHJvamVjdGlvbi54eVRyYW5zZm9ybU1hdDQiLCJnZXRBbmNob3JBbGlnbm1lbnQiLCJldmFsdWF0ZVJhZGlhbE9mZnNldCIsInByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeCIsInBsYWNlSG9yaXpvbnRhbCIsInBsYWNlVmVydGljYWwiLCJnZXRBbmNob3JKdXN0aWZpY2F0aW9uIiwiY3Jvc3NUaWxlSUQiLCJwcmV2T3BhY2l0eSIsInBhY2tlZE9wYWNpdHkiLCJzeW1ib2xJbnN0YW5jZSIsIl9lbWl0VmFsaWRhdGlvbkVycm9ycyIsImRpZmZPcGVyYXRpb25zIiwiZ2V0V29ya2VyUG9vbCIsIlpvb21IaXN0b3J5IiwiZ2V0UmVmZXJyZXIiLCJpc01hcGJveFVSTCIsImRlcmVmIiwidmFsaWRhdGVDdXN0b21TdHlsZUxheWVyIiwiZmlsdGVyT2JqZWN0IiwibCIsImxheWVySWQiLCJzb3VyY2VSZXN1bHQiLCJsYXllckZlYXR1cmVzIiwiZmVhdHVyZVdyYXBwZXIiLCJydGxUZXh0UGx1Z2luRXZlbnRlZCIsImxheWVySUQiLCJzdHlsZUxheWVyIiwibWFrZVJlcXVlc3QiLCJnZXRTb3VyY2VUeXBlIiwic2V0U291cmNlVHlwZSIsInJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5IiwiY3JlYXRlTGF5b3V0IiwidmVydGV4QnVmZmVyIiwiUHJvZ3JhbSIsIlVuaWZvcm1NYXRyaXg0ZiIsIlVuaWZvcm0zZiIsIlVuaWZvcm0xZiIsIlVuaWZvcm0xaSIsIlVuaWZvcm0yZiIsIlVuaWZvcm00ZiIsIm1hdDMuZnJvbVJvdGF0aW9uIiwidmVjMy50cmFuc2Zvcm1NYXQzIiwiVW5pZm9ybUNvbG9yIiwibWF0NC5vcnRobyIsInN5bWJvbFByb2plY3Rpb24uaGlkZUdseXBocyIsInN5bWJvbFByb2plY3Rpb24ucHJvamVjdCIsIk9ORV9FTSIsInN5bWJvbFByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeCIsInN5bWJvbFByb2plY3Rpb24uZ2V0R2xDb29yZE1hdHJpeCIsInN5bWJvbFByb2plY3Rpb24udXBkYXRlTGluZUxhYmVscyIsInN5bWJvbFNpemUiLCJzdGF0ZSIsInVuaWZvcm1WYWx1ZXMiLCJwcm9ncmFtIiwibGF5b3V0VmVydGV4QnVmZmVyIiwiaW5kZXhCdWZmZXIiLCJwcm9ncmFtQ29uZmlndXJhdGlvbiIsImRlcHRoTW9kZSIsImNsYW1wIiwiUG9zQXJyYXkiLCJkcmF3IiwiZGVidWciLCJjdXN0b20iLCJQcm9ncmFtQ29uZmlndXJhdGlvbiIsIkxpbmVTdHJpcEluZGV4QXJyYXkiLCJzb3VyY2VDYWNoZSIsImNvb3JkcyIsIkxuZ0xhdCIsIndyYXAiLCJtYXQyLmNyZWF0ZSIsIm1hdDIucm90YXRlIiwiVW53cmFwcGVkVGlsZUlEIiwibWF0NC5wZXJzcGVjdGl2ZSIsIm1hdDQucm90YXRlWCIsIm1lcmNhdG9yWmZyb21BbHRpdHVkZSIsIm1hdDQuaW52ZXJ0IiwiX2Vhc2UiLCJpbmVydGlhTGluZWFyaXR5IiwiaW5lcnRpYUVhc2luZyIsImluZXJ0aWFNYXhTcGVlZCIsImluZXJ0aWFEZWNlbGVyYXRpb24iLCJzY3JvbGxab29tIiwiYm94Wm9vbSIsImRyYWdSb3RhdGUiLCJkcmFnUGFuIiwia2V5Ym9hcmQiLCJkb3VibGVDbGlja1pvb20iLCJ0b3VjaFpvb21Sb3RhdGUiLCJkZWZhdWx0RWFzaW5nIiwiY29uZmlnIiwiUmVxdWVzdE1hbmFnZXIiLCJtb3VzZWluIiwibW91c2Vtb3ZlIiwibW91c2VvdXQiLCJ3aWR0aCIsImhlaWdodCIsImRhdGEiLCJpc1N1cHBvcnRlZCIsInNldENhY2hlTGltaXRzIiwidmVyc2lvbiIsImRlZmF1bHRPcHRpb25zIiwic3VwcG9ydGVkIiwic2V0UlRMVGV4dFBsdWdpbiIsImNsZWFyVGlsZUNhY2hlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSxZQUFZLENBQUM7O0FBRWIsSUFBSSxxQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUM7QUFDekQsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7QUFDckQsSUFBSSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDOztBQUU3RCxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Q0FDdEIsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7RUFDdEMsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0VBQzdFOztDQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25COztBQUVELFNBQVMsZUFBZSxHQUFHO0NBQzFCLElBQUk7RUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtHQUNuQixPQUFPLEtBQUssQ0FBQztHQUNiOzs7OztFQUtELElBQUksS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0VBQzlCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDaEIsSUFB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RSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFOzs7Ozs7OztJQVFyRCxHQUFHLEVBQUUsV0FBVztRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkQ7Ozs7Ozs7O0lBUUQsTUFBTSxFQUFFLFNBQVMsS0FBSyxFQUFFO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztlQUNsQixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDN0I7Ozs7Ozs7SUFPRCxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JDOzs7Ozs7Ozs7SUFTRCxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDakIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0tBQzVCOzs7Ozs7O0lBT0QsS0FBSyxFQUFFLFdBQVc7UUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDckM7Ozs7Ozs7SUFPRCxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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LENBQUMsQ0FBQyxDQUFDO0VBQzVELFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNyRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDMUQsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDNUQsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BELFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUM5RCxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDN0QsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzdELFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN2RCxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDeEQsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3hELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRCxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDdEQsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNELE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUNsRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDN0MsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3RELFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN2RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDbEQsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2xELFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUM3RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDM0QsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3JFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDMUQsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQy9ELGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2xFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDcEUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ25ELFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNwRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDL0Msa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDOUQsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQy9ELGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDcEUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNyRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNoRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDMUQsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNELE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMvQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDbkQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2xELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDOUQsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQy9ELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUNwRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDaEQsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3RELGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMvQixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDaEQsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ3pELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUN2RCxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDdEQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2xELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN2RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDMUQsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3JELFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNuRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDakQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3BELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdB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LEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDdkU7OzRDQUVELDRCQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxVQUFVO1FBQ3BKQSxJQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCQSxJQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMs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LEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDaEYscUJBQUksNENBQTRCLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUU7SUFDcEYscUJBQUksMENBQTBCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDMUYscUJBQUksMENBQTBCLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUU7SUFDbkYscUJBQUksd0NBQXdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDekYscUJBQUksb0NBQW9CLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUU7SUFDN0UscUJBQUksa0NBQWtCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDbkYscUJBQUksa0NBQWtCLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUU7SUFDM0UscUJBQUksZ0NBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDakYscUJBQUks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QUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtFQUM3QyxJQUFJLEdBQUcsR0FBRyxJQUFJQSxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7QUFZTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFOzs7RUFHaEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0lBQ2IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDYixNQUFNO0lBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUNmOztFQUVELE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDN0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVkLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFNUIsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNSLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7O0VBRTlCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUU7RUFDN0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbEM7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0VBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUMxQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQy9CLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVMsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7RUFDckMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7Ozs7QUFhTSxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNyQixPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQ3ZFOzs7Ozs7OztBQVFNLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRTtFQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDM0M7Ozs7Ozs7OztBQVNELFNBQWdCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDOUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDbEI7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUN6RTs7Ozs7Ozs7O0FBU00sU0FBU0UsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDM0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcs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QUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNLLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7O0FBUU0sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRTtFQUM1QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBU0MsWUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0VBQzdDLElBQUksR0FBRyxHQUFHLElBQUlQLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7Ozs7QUFjTSxTQUFTUSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUU1QixJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ1IsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ3JDLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7O0FBUU0sU0FBU0MsYUFBVyxDQUFDLENBQUMsRUFBRTtFQUM3QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNsQzs7Ozs7Ozs7OztBQVVELFNBQWdCQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2hDLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0VBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMvQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ25DLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNoQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBU0MsY0FBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7RUFDckMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBU0MsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDdEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTQyxLQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3JCLE9BQU8sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQ3BHOzs7Ozs7OztBQVFNLFNBQVNDLE1BQUksQ0FBQyxDQUFDLEVBQUU7RUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQzFEOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQkMsc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0VBQ3JELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDM0c7Ozs7Ozs7OztBQVNNLFNBQVNyQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMzQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElB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LEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2YsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTQyxPQUFLLENBQUMsQ0FBQyxFQUFFO0VBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUlELFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0ssTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7Ozs7OztBQWdCRCxTQUFnQkUsWUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0VBQ3RFLElBQUksR0FBRyxHQUFHLElBQUlQLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkQsU0FBZ0JRLEtBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7RUFDcEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTRixVQUFRLENBQUMsR0FBRyxFQUFFO0VBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxD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O01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMvQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVNqQixhQUFXLENBQUMsQ0FBQyxFQUFFO0VBQzdCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLE9BQU8sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUN2Rzs7Ozs7Ozs7OztBQVVELFNBQWdCQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCRyxXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbkMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNqQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JGLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtFQUNsQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztNQUNqQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixPQUFPLEdBQUcsQ0FBQztDQUNaO0FBQ0QsQ0FBQzs7Ozs7Ozs7OztBQVVELFNBQWdCQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBU2UsaUJBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2Qs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QUNiLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDZixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVTSxTQUFTLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ3JDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRWhDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUVoRixJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ1IsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0VBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTQyxLQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3JCLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQzdJOzs7Ozs7OztBQVFNLFNBQVNDLE1BQUksQ0FBQyxDQUFDLEVBQUU7RUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDekU7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsZ0JBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUN4QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7OztBQVdELFNBQWdCQyxzQkFBb0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7RUFDckQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0MsYUFBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDaEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM5Sjs7Ozs7Ozs7O0FBU00sU0FBU3JCLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNsd0I7Ozs7OztBQU1NLElBQUlxQixLQUFHLEdBQUdiLFVBQVEsQ0FBQzs7Ozs7O0FBTTFCLElBQVdjLEtBQUcsR0FBR0wsVUFBUTs7Ozs7Ozs7Ozs7OztBQzl2QnpCLFNBQWdCaEIsUUFBTSxHQUFHO0VBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUlKLFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7O0VBRXRDLElBQUlBLFVBQW1CLElBQUksWUFBWSxFQUFFO0lBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNiOztFQUVELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVNDLE9BQUssQ0FBQyxDQUFDLEVBQUU7RUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSUQsVUFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN0QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0ssTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJNLFNBQVNFLFlBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7RUFDekcsSUFBSSxHQUFHLEdBQUcsSUFBSVAsVUFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN0QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JNLFNBQVNRLEtBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0VBQ3ZHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVNGLFVBQVEsQ0FBQyxHQUFHLEVBQUU7RUFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNvQixXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTs7RUFFaEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0lBQ2IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7R0FDZixNQUFNO0lBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNqQjs7RUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTakIsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDN0IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRWhGLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDUixPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDcEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDcEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNwRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTa0IsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDOUIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDdkcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDdkcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUN2RyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUN2RyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDdkcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDeEcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUN4RyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUN4RyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVNqQixhQUFXLENBQUMsQ0FBQyxFQUFFO0VBQzdCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRWhDLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUU7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2xDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O0VBRWhCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25ELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDWCxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDcEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDcEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNYLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDWCxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ1gsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ3BELE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkcsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztFQUN2QixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztFQUN2QixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzs7RUFFdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO0lBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNuRCxNQUFNO0lBQ0wsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDWixHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUMvQzs7RUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JELE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7OztBQVdELFNBQWdCRCxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0VBQ3hDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7TUFDWCxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztNQUNYLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQzlCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztFQUN2QixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztFQUN2QixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztFQUN2QixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0VBQ2xCLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7RUFDbEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzs7RUFFbEIsSUFBSSxHQUFHLEdBQUdULE9BQWdCLEVBQUU7SUFDMUIsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLENBQUMsSUFBSSxHQUFHLENBQUM7RUFDVCxDQUFDLElBQUksR0FBRyxDQUFDO0VBQ1QsQ0FBQyxJQUFJLEdBQUcsQ0FBQztFQUNULENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDWixHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztFQUVaLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNwQixHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN4QixHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN4QixHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN4QixHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFOztJQUViLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7R0FDakI7O0VBRUQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtFQUNuQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7RUFFaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFOztJQUViLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0dBQ2pCOzs7RUFHRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzVCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDNUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtFQUNuQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7RUFFaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFOztJQUViLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0dBQ2pCOzs7RUFHRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzVCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDNUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtFQUNuQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVmLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTs7SUFFYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0dBQ2pCOzs7RUFHRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFH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QUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQzlCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7O0VBRVosSUFBSSxHQUFHLEdBQUdaLE9BQWdCLEVBQUU7SUFDMUIsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLENBQUMsSUFBSSxHQUFHLENBQUM7RUFDVCxDQUFDLElBQUksR0FBRyxDQUFDO0VBQ1QsQ0FBQyxJQUFJLEdBQUcsQ0FBQztFQUNULENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVWLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxH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RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7RUFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUV0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFD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Q0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0dBQzVCLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUU7SUFDckMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0dBQzVCLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFO0lBQ3RCLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztHQUM1QixNQUFNO0lBQ0wsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0dBQ25COztFQUVELE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkQsU0FBZ0IsNEJBQTRCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFOztFQUV6RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDZixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ3hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0VBQy9CLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCTSxTQUFTLGtDQUFrQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7O0VBRWxFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDZixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDaEMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUMxQixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQzFCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDMUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztFQUNoQyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQzFCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDMUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUMxQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0VBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQzFELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxD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QUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7RUFDaEUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztFQUM1QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0VBQzVCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztFQUM3QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztFQUM1QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDYixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVB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SyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtFQUM5RCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO0VBQzVCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDNUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7RUFDOUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7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QUFHLENBQUMsQ0FBQztJQUN6QixFQUFFLElBQUksR0FBRyxDQUFDO0lBQ1YsRUFBRSxJQUFJLEdBQUcsQ0FBQztJQUNWLEVBQUUsSUFBSSxHQUFHLENBQUM7R0FDWDs7RUFFRCxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFO01BQ3hCLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFO01BQ3hCLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDN0IsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVsQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7SUFDWCxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsRUFBRSxJQUFJLEdBQUcsQ0FBQztJQUNWLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDVixFQUFFLElBQUksR0FBRyxDQUFDO0dBQ1g7O0VBRUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDYixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztFQUNmLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDZixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0VBQ2YsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLE9BQU8sR0FBRyxDQUFDO0NBQ1o7QUFDRCxDQUFDOzs7Ozs7OztBQVFNLFNBQVNXLEtBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDckIsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztDQUNyUDs7Ozs7Ozs7QUFRTSxTQUFTQyxNQUFJLENBQUMsQ0FBQyxFQUFFO0VBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ25IOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQkMsc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0VBQ3JELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDaEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ2hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUNoQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDaEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ2hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUNoQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNoQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDalM7Ozs7Ozs7OztBQVNNLFNBQVNyQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMzQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUM3MkM7Ozs7OztBQU1NLElBQUlxQixLQUFHLEdBQUdiLFVBQVEsQ0FBQzs7Ozs7O0FBTTFC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QUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCVCxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCRSxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQixXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0VBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDNUI7Ozs7Ozs7OztBQVNNLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUM5Qjs7Ozs7Ozs7QUFRTSxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUU7RUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUM5Qjs7Ozs7Ozs7O0FBU00sU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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QztFQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztFQUMzRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztFQUMzRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztFQUMzRSxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0VBQ2pDLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDO0VBQ3JCLElBQUksQ0FBQyxHQUFHQyxNQUFlLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztFQUMxQyxJQUFJLENBQUMsR0FBR0EsTUFBZSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN0QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDbkIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQixhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoRCxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDdEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUN0RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ3ZELE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN4QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3hDLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0IsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFOztFQUV2QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7RUFHYixJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO01BQ3JCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO01BQ3JCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRTFCLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUc7TUFDMUIsSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUc7TUFDMUIsSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7RUFFL0IsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNoQixHQUFHLElBQUksRUFBRSxDQUFDO0VBQ1YsR0FBRyxJQUFJLEVBQUUsQ0FBQztFQUNWLEdBQUcsSUFBSSxFQUFFLENBQUM7O0VBRVYsSUFBSSxJQUFJLENBQUMsQ0FBQztFQUNWLElBQUksSUFBSSxDQUFDLENBQUM7RUFDVixJQUFJLElBQUksQ0FBQyxDQUFDOztFQUVWLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztFQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7RUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FB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QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JULFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0J3QixRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDekIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUM1QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMxQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IzQixPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQjRCLGFBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7RUFDNUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLFVBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQy9COzs7Ozs7Ozs7QUFTTSxTQUFTQyxpQkFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDdEM7Ozs7Ozs7O0FBUU0sU0FBU0MsUUFBTSxDQUFDLENBQUMsRUFBRTtFQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDL0I7Ozs7Ozs7O0FBUU0sU0FBU0MsZUFBYSxDQUFDLENBQUMsRUFBRTtFQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDdEM7Ozs7Ozs7OztBQVNNLFNBQVNDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXhDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtJQUNYLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUMxQjs7RUFFRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNqQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxLQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUN4QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDOUQ7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0JDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xDLE9BQU8sR0FBRyxDQUFDO0NBQ1o7QUFDRCxDQUFDOzs7Ozs7Ozs7OztBQVdELFNBQWdCQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2pDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtFQUNqQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQzs7OztFQUlyQixJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNuQixJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRVgsR0FBRztJQUNELEVBQUUsR0FBR3JCLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsRUFBRSxHQUFHQSxNQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFOztFQUVsQixHQUFHO0lBQ0QsRUFBRSxHQUFHQSxNQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLEVBQUUsR0FBR0EsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3hCLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTs7RUFFbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7RUFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN4QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JzQixlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFZCxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFO0VBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVN0QyxLQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3JCLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDdkU7Ozs7Ozs7OztBQVNNLFNBQVNNLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUN6RTs7Ozs7Ozs7O0FBU00sU0FBU3JCLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDelY7Ozs7OztBQU1NLElBQUlzQixLQUFHLEdBQUdMLFVBQVEsQ0FBQzs7Ozs7O0FBTW5CLElBQUlJLEtBQUcsR0FBR2IsVUFBUSxDQUFDOzs7Ozs7QUFNbkIsSUFBSTZDLEtBQUcsR0FBR3JCLFFBQU0sQ0FBQzs7Ozs7O0FBTWpCLElBQUlzQixNQUFJLEdBQUdmLFVBQVEsQ0FBQzs7Ozs7O0FBTXBCLElBQUlnQixTQUFPLEdBQUdmLGlCQUFlLENBQUM7Ozs7OztBQU05QixJQUFJZ0IsS0FBRyxHQUFHZixRQUFNLENBQUM7Ozs7OztBQU1qQixJQUFJZ0IsUUFBTSxHQUFHZixlQUFhLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBY2xDLElBQVdnQixTQUFPLEdBQUcsWUFBWTtFQUMvQixJQUFJLEdBQUcsR0FBR3pELFFBQU0sRUFBRSxDQUFDO0VBQ25CLE9BQU8sVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRTtJQUNsRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7O0lBRVQsSUFBSSxDQUFDLE1BQU0sRUFBRTtNQUNYLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDWjs7SUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFO01BQ1gsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUNaOztJQUVELElBQUksS0FBSyxFQUFFO01BQ1QsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ2pELE1BQU07TUFDTCxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztLQUNkOztJQUVELEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUU7TUFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ2xCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO01BQ2xCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDZCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcs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RUFBRSxDQUFDLENBQUMsQ0FBQztFQUMzQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDbkQ7Ozs7Ozs7Ozs7QUFVRCxTQUFnQnRDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JxQixTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQ2xCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQ2xCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQ2xCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXTSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcs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RyxFQUFFLENBQUMsRUFBRTs7O0VBRy9CLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hDLElBQUksS0FBSyxDQUFDOztFQUVWLElBQUksTUFBTSxHQUFHLEdBQUcsRUFBRTs7SUFFaEIsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztJQUVoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNyQixLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQzs7SUFFcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7R0FDaEMsTUFBTTs7SUFFTCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsQ0FBQyxHQUFHLENBQUMsR0FBQztJQUN2QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFDO0lBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNwRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNyQixLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztHQUNoRDs7RUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7QUFZRCxTQUFnQixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3RDLElBQUksU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztFQUN0QyxDQUFDLElBQUksU0FBUyxDQUFDO0VBQ2YsQ0FBQyxJQUFJLFNBQVMsQ0FBQztFQUNmLENBQUMsSUFBSSxTQUFTLENBQUM7RUFDZixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDckMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTUSxLQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3JCLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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QUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVixPQUFPLEVBQUUsQ0FBQztDQUNYOzs7Ozs7Ozs7QUFTTSxTQUFTQyxPQUFLLENBQUMsQ0FBQyxFQUFFO0VBQ3ZCLElBQUksRUFBRSxHQUFHLElBQUlELFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixPQUFPLEVBQUUsQ0FBQztDQUNYOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JNLFNBQVNPLFlBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0VBQ3pELElBQUksRUFBRSxHQUFHLElBQUlQLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxPQUFPLEVBQUUsQ0FBQztDQUNYOzs7Ozs7Ozs7Ozs7Ozs7QUFlTSxTQUFTLDZCQUE2QixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUN4RSxJQUFJLEVBQUUsR0FBRyxJQUFJQSxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRztNQUNiLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRztNQUNiLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNwQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JDLE9BQU8sRUFBRSxDQUFDO0NBQ1g7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0JrRix5QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNqRCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztNQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztNQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztNQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDdEMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVNLFNBQVN0RCxpQkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDdEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVU0sU0FBU2IsY0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVU0sU0FBU29FLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFOztFQUUvQixJQUFJLEtBQUssR0FBR0MsUUFBVyxFQUFFLENBQUM7RUFDMUJDLFdBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQzNCLElBQUksQ0FBQyxHQUFHLElBQUlyRixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ25Dc0YsY0FBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDMUJKLHlCQUF1QixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDdkMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVNLFNBQVM3RSxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7O0FBUU0sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRTtFQUM1QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJELFNBQWdCRSxLQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7RUFDdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUs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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtNQUMzQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7TUFDM0MsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO01BQzNDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2hEeUQsU0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0VBQ25ELE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQnhELFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtFQUNuQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7TUFDM0MsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO01BQzNDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtNQUMzQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNoRHlELFNBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUNuRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0J4RCxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO01BQzNDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtNQUMzQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7TUFDM0MsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDaER5RCxTQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzVDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUM3QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7OztBQVdELFNBQWdCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTs7RUFFbEQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHeEYsT0FBZ0IsRUFBRTtJQUNwQyxPQUFPRSxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0dBQ3JCOztFQUVELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN2RCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0VBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0VBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0VBQ2xDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQmMsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQlIsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2xDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDdkcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN2RyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDdkcsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7O0FBTU0sSUFBSWEsS0FBRyxHQUFHYixVQUFRLENBQUM7Ozs7Ozs7Ozs7O0FBVzFCLFNBQWdCRSxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVNLElBQUlvQyxLQUFHLEdBQUcyQyxLQUFRLENBQUM7Ozs7Ozs7Ozs7OztBQVkxQixTQUFnQnpDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDakMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUlGLEtBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQztFQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDOUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU3hDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLElBQUksS0FBSyxHQUFHb0MsZUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ3RCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVTSxTQUFTZ0QsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNa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SSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzdJOzs7Ozs7Ozs7QUFTTSxTQUFTckIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDM0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxD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R0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCVCxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCd0IsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUM1QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMxQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IzQixPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQjRCLGFBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7RUFDNUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxVQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDekI7Ozs7Ozs7OztBQVNNLFNBQVNDLGlCQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3RCOzs7Ozs7OztBQVFNLFNBQVNDLFFBQU0sQ0FBQyxDQUFDLEVBQUU7RUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ3pCOzs7Ozs7OztBQVFNLFNBQVNDLGVBQWEsQ0FBQyxDQUFDLEVBQUU7RUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUN0Qjs7Ozs7Ozs7O0FBU00sU0FBU0MsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0MsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0MsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXhCLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTs7SUFFWCxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDMUI7O0VBRUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDcEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0MsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDeEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbEM7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0JDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0JDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDakMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQzlCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0VBQ2pDLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDO0VBQ3JCLElBQUksQ0FBQyxHQUFHckIsTUFBZSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7RUFDMUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzdCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7OztBQVdELFNBQWdCaUUsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7O0FBWUQsU0FBZ0IzQyxlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDckMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCekMsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTs7RUFFbkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2hCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDdEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDdEMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTcUYsT0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDMUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUU3QixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7O0lBRVosSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQzVCOztFQUVELElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFN0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFOztJQUVaLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM1Qjs7RUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdB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QUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSTtRQUNaLENBQUMsR0FBRyxHQUFHO1FBQ1AsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7O0lBRWpCLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFFLE9BQU8sS0FBSyxHQUFDOzs7SUFHckMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7SUFHMUUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7UUFDaEQsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7O0lBRXJELElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLO1FBQ2IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7OztJQUdsQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7UUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7WUFDaEMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztRQUMvQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7UUFFWixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFH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SUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDdkY7OztBQUdELFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ25CLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDaEU7OztBQUdELFNBQVNBLFFBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQ3BCLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztDQUN6Qzs7O0FBR0QsU0FBUyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQ2hDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFF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SUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCQSxJQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0JBLElBQU0sQ0FBQyxHQUFHLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUVwQ0EsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQkEsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQkEsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7UUFFcEJBLElBQU0sT0FBTyxHQUFHK0csS0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1Qi9HLElBQU0sT0FBTyxHQUFHK0csS0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1Qi9HLElBQU0sT0FBTyxHQUFHK0csS0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1Qi9HLElBQU0sT0FBTyxHQUFHK0csS0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1Qi9HLElBQU0sT0FBTyxHQUFHK0csS0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1Qi9HLElBQU0sS0FBSyxHQUFHLE9BQU8sR0FBRyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUNwREEsSUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDO1FBQzFEQSxJQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUM7UUFDMURBLElBQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7UUFHcEIsT0FBTyxDQUFDLENBQUMs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SUFBSSxDQUFDO0lBQzNCQSxJQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDOztJQUUzQixLQUFLLHNCQUFXLHVDQUFRLEVBQUU7UUFBckJBLElBQU07O1FBQ1BBLElBQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQkEsSUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssa0JBQVcsMEJBQUMsRUFBRTtZQUFkQSxJQUFNOztZQUNQQSxJQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2RBLElBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRWRBLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkNBLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkNBLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkNBLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1lBRXZDQSxJQUFNLEtBQUssR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO1lBQzFCQSxJQUFNLEtBQUssR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO1lBQzFCQSxJQUFNLEtBQUssR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO1lBQzFCQSxJQUFN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O0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsSUFBSSxFQUFFLEdBQUc7SUFDVCxHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztDQUNYLENBQUM7O0FBRWEsU0FBUyxzQkFBc0IsQ0FBQyxLQUFLLFVBQVU7SUFDMURELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQzs7SUFFaEIsS0FBS0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DQyxJQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFD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QUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRUcsR0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUVELEdBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztVQUM5RixTQUFTLENBQUMsSUFBSSxDQUFDRixLQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUcsRUFBRSxFQUFFLEtBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUdHLEdBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFRCxHQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7VUFDOUYsU0FBUyxDQUFDLElBQUksQ0FBQ0YsS0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUVFLEdBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRUMsR0FBQyxFQUFFLENBQUMsQ0FBQztVQUM5RixTQUFTLENBQUMsSUFBSSxDQUFDSCxLQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBR0UsR0FBQyxLQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUVDLEdBQUMsRUFBRSxDQUFDLENBQUM7T0FDakc7O01BRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7TUFDbkIsSUFBSSxDQUFDLGFBQWEs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QUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDO0VBQzdCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBQztFQUNkLEtBQUssSUFBSSxLQUFJO0VBQ2IsT0FBTyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRTs7RUFFNUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQ1gsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFLO0dBQ2QsTUFBTSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDckIsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUM7R0FDM0MsTUFBTTtJQUNMLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFDO0lBQ3pCLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBSztHQUNkO0VBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDaEQ7O0FBRUQsU0FBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7RUFDbkUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUM7RUFDWCxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUM7RUFDbEMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUM7RUFDMUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUM7RUFDckIsSUFBSSxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0VBQ2hFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsRUFBQztFQUMvQixJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBQztFQUNyQixJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQzs7RUFFM0QsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDOztFQUV2QixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQ3RDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUM7SUFDeEIsQ0FBQyxHQUFHLEtBQUk7R0FDVCxNQUFNO0lBQ0wsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFDO0lBQzFDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ3JDLENBQUMsR0FBRTtNQUNILENBQUMsSUFBSSxFQUFDO0tBQ1A7SUFDRCxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxFQUFFO01BQ2xCLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBQztLQUNoQixN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Q0FBQyxNQUFNLElBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLEdBQUMsR0FBRztJQUM3RyxrQkFBa0IsR0FBRyxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLEdBQUMsR0FBRztJQUM3RyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLEdBQUMsS0FBSztJQUM3RyxpQkFBaUIsSUFBSSxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLEdBQUMsSUFBSTtJQUM3RyxrQkFBa0IsR0FBRyxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLEdBQUMsR0FBRztJQUM3RyxtQkFBbUIsRUFBRSxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLEdBQUMsRUFBRTtJQUM3RyxrQkFBa0IsR0FBRyxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLEdBQUMsR0FBRztJQUM3RyxtQkFBbUIs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QUNsQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRztRQUNYLENBQUMsRUFBRSxDQUFDLENBQUM7O0lBRVQsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUM7SUFDN0UsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUM7SUFDN0UsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUM7SUFDN0UsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUM7SUFDN0UsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUss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R0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUM7Q0FDbkM7O0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0lBQ25DLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7O0lBRTdCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFFLFNBQU87SUFDbEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFFLFNBQU87SUFDbEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFFLFNBQU87SUFDbEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFFLFNBQU87SUFDbEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFFLFNBQU87SUFDbEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ3JDOztBQUVELFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7SUFDaEQsSUFBSSxRQUFRO1FBQ1IsR0FBRyxJQUFJLE1BQU0sR0FBRyxDQUFDO1FBQ2pCLEdBQUcsSUFBSSxRQUFRLEdBQUcsQ0FBQztRQUNuQixHQUFHLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7SUFHdEUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBQztDQUNwRjs7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUk7QUFDMUcsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxHQUFHO0FBQzFHLFNBQVMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsS0FBSztBQUMxRyxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUk7QUFDMUcsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxHQUFHO0FBQzFHLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxD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QUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRTtLQUNKOzs7OztJQUtELEtBQUtELElBQUlxTixHQUFDLEdBQUcsQ0FBQyxFQUFFQSxHQUFDLEdBQUcsR0FBRyxFQUFFQSxHQUFDLEVBQUUsRUFBRTs7UUFFMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRUEsR0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFQSxHQUFDLENBQUMsQ0FBQyxDQUFDOztRQUVoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRUEsR0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRUEsR0FBQyxDQUFDLENBQUMsQ0FBQzs7UUFFdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQ0EsR0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUNBLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUVoQyxJQUFJLENBQUMsR0FBRyxDQUFDQSxHQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUNBLEdBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMxQzs7SUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsSUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsSUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsSUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsRDs7QUFFTCxrQkFBSSxvQkFBSSxDQUFDLE1BQVUsQ0FBQyxNQUFVLEtBQUssTUFBVTtJQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUM5Qzs7QUFFTCxrQkFBSSxvQkFBSSxDQUFDLE1BQVUsQ0FBQyxNQUFVO0lBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3Qzs7QUFFTCxrQkFBSSxzQkFBSyxDQUFDLE1BQVUsQ0FBQyxNQUFVO0lBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsOENBQThDLENBQUMsR0FBQztJQUN0SSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxQzs7QUFFTCxrQkFBSSx3Q0FBYyxDQUFDLE1BQVUsQ0FBQyxNQUFVLENBQUMsTUFBVTs7O0lBRy9DLFFBQVksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFO0VBQzdEOztBQUVM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K0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFDO1NBQ3RHOzs7UUFHRCxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxTQUFTLElBQUUsV0FBUzs7O1FBR2pELENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0RSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDdEUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0RSxTQUFTLElBQUksQ0FBQyxDQUFDO0tBQ2xCOztJQUVELElBQUksS0FBSyxFQUFFO1FBQ1AsT0FBTyxDQUFDLEdBQUcsbUJBQWdCLFNBQVMsRUFB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Q0FBQyxDQUFDOztJQUV0QyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2QsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLFVBQVUsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFcEYsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7O0lBRWxGLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDUCxFQUFFLENBQUMsQ0FBQztHQUNMOztFQUVELFFBQVEsQ0FBQztFQUNULEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7RUFDbEQsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQztFQUNqRCxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztVQUNoQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJ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RUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDMUQ7O0FBRUQsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7O0lBRTlDLE9BQU8sS0FBSyxHQUFHLElBQUksRUFBRTtRQUNqQixJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ3BCQSxJQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUMzQkEsSUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDdkJBLElBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEJBLElBQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcENBLElBQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzRUEsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvREEsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNsRDs7UUFFREEsSUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDOUJELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNiQSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7O1FBRWQsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsR0FBQzs7UUFFcEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1YsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixPQUFPLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLEVBQUUsR0FBQztZQUNwQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLEVBQUUsR0FBQztTQUN2Qzs7UUFFRCxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUM7YUFDNUQ7WUFDRCxDQUFDLEVBQUUsQ0FBQztZQUNKLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMs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QUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6REEsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDOztJQUU5RCxLQUFLRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2Qzs7SUFFRHVRLE1BQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDckQ7O0FBRUwsaUJBQUksMEJBQU0sSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQzlCLE9BQVcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0VBQzlFOztBQUVMLGlCQUFJLDRCQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hCLE9BQVcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJ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SUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0QsSUFBVSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BEQSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkYsSUFBVSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUVwRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFO1FBQzFCLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNsQixNQUFVLEdBQUcsR0FBRyxDQUFDO0tBQ2hCLE1BQU0sSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFO1FBQzVCLElBQVUsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RSxJQUFVLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDeEM7O0lBRURDLElBQU0sSUFBSSxHQUFHLElBQUks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QUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDMUMsT0FBTyxFQUFFLElBQUk7UUFDYixVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDdEIsV0FBVyxFQUFFLEtBQUs7UUFDbEIsdUJBQXVCLEVBQUUsTUFBTTtLQUNsQyxDQUFDLENBQUM7Q0FDTjs7O0FBR0QsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ2YsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxQjtBQUNELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNmQSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzFDQSxJQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQzs7O0FBR0QsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ2IsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0NBQzFCO0FBQ0QsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ2JBLElBQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDM0MsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FD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QUVELFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRTs7SUFFcEUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUNyRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3JCLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQzs7SUFFZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN6QyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7UUFFbkIsSUFBSSxZQUFZLElBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUks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V0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUU7UUFDdEUsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPO0tBQ1Y7O0lBRUQsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDOztJQUVkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDckMsSUFBSSxTQUFTLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxFQUFFO1lBQzlDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0tBQ3BCOztJQUVELElBQUksU0FBUyxJQUFFdVEsUUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBQzs7SUFFckMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNyQjs7QUFFRCxTQUFTQSxRQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtJQUM3QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNwRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUks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SUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdFLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RSxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUVoQixJQUFJLElBQUksRUFBRTtZQUNOLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEUsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNmOztRQUVELElBQUksS0FBSyxFQUFFO1lBQ1AsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdB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QUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7O0lBRWxELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEUsSUFBSSxZQUFZLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7SUFFaEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1QyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN2Rjs7SUFFRCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRTFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6Rzs7SUFFRCxPQUFPLFlBQVksQ0FBQztDQUN2QixDQUFDOzs7QUFHRixTQUFTLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM5QjtRQUNELEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlCO0tBQ0o7SUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFDRCxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekM7S0FDSjtDQUNKOzs7QUFHRCxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7O0lBRVosS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNkLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsQ0FBQyxFQUFFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7S0FDbkI7O0lB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LElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7TUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztNQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO01BQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7TUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztNQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO01BQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7TUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztNQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO01BQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7TUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztNQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO01BQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7TUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztNQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO01BQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7TUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztNQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO01BQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7TUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztNQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO01BQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7TUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO01BQ25DLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxVQUFVLEVBQUUsQ0FBQztNQUNuRCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0M7O0VBRUgsa0JBQUUsZ0NBQVc7TUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7TUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7TUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7TUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7TUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7TUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7TUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7TUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7TUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztNQUNwQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtVQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztPQUN4QztNQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQ25DLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO01BQ25ELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQzNDOztFQUVILGtCQUFFLGdEQUFrQixLQUFLLDJEQUE2RCxXQUFXLFVBQVk7TUFDekcsT0FBUyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BEOztFQUVILGtCQUFFLGtEQUFtQixLQUFLLGFBQWUsVUFBVSxtQ0FBcUMsV0FBVyxVQUFZO01BQ3pHLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakU7O0VBRUgsa0JBQUUsa0RBQW1CLGFBQWEsUUFBVSxLQUFLLFFBQVUsTUFBTSxRQUFVO01BQ3JFQSxJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOztNQUVyQixJQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztNQUN0QyxJQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQy9CLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7TUFDeEUsSUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7TUFFbEMsT0FBUyxHQUFHLENBQUM7SUFDZDs7RUFFSCxrQkFBRSxnREFBa0IsS0FBSyxRQUFVLE1BQU0sUUFBVTtNQUMvQyxPQUFTLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0M7O0VBRUgsa0JBQUUsd0JBQU0sR0FBYyxXQUFhOzhCQUFuQjs7O01BQ1ZBLElBQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7TUFDbkJELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQzs7TUFFZixJQUFNLEtBQUssRUFBRTtVQUNQLElBQUksSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7VUFDOUIsSUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7VUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO09BQ2hEOztNQUVELElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFO1VBQzlCLElBQUksSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7Ozs7VUFJNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7VUFFOUIsSUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7VUFDN0IsSUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7T0FDNUI7Ozs7Ozs7OztNQVNELEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEI7O0VBRUgsa0JBQUUsb0NBQVksWUFBWSx5QkFBMkI7TUFDL0MsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtVQUNqQyxJQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztPQUM1QixNQUFNO1VBQ0wsSUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7VUFDMUIsSUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1VBQzNDLElBQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztPQUM5QztJQUNKOztFQUVILGtCQUFFLHNDQUFhLFNBQVMsc0JBQXdCO01BQzFDLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7VUFDeEQsSUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7T0FDN0IsTUFBTTtVQUNMLElBQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1VBQzNCLElBQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztVQUNyQyxJQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7VUFDckMsSUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO09BQ3hDO0lBQ0o7O0VBRUgsa0JBQUUsMENBQWUsV0FBVyx3QkFBMEI7TUFDaEQsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUU7VUFDakUsSUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7T0FDL0IsTUFBTTtVQUNMLElBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1VBQzdCLElBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztVQUN6QyxJQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztVQUNoRixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztjQUNqQixJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJO2NBQzNCLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztjQUNwQixJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJO1dBQzlCLENBQUMsQ0FBQztPQUNOO0lBQ0o7O0VBRUgsa0JBQUUsc0NBQWEsU0FBUyxzQkFBd0I7TUFDNUMsSUFBTStULHVCQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7VUFDekQsSUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7T0FDekIsTUFBTTtVQUNMLElBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1VBQ3ZCLElBQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztVQUM5QyxJQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7T0FDN0M7O01BRUgsSUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDOztFQUVILGtCQUFFLGtDQUFZOzs7TUFHUixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtVQUM3QixJQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO09BQ3JDO0dBQ0osQ0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL1BELElBQU0sV0FBVztJQTBCYixvQkFBVyxDQUFDLEVBQUUsVUFBVSxPQUFPLHVCQUF1QixVQUFVLGNBQWM7OztRQUMxRXRULFlBQUssS0FBQyxDQUFDLENBQUM7UUFDUixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDOztRQUU3QixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sWUFBRyxDQUFDLEVBQUU7Ozs7WUFJaEIsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsY0FBYyxLQUFLLFVBQVUsSUFBRUQsTUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUM7Ozs7WUFJMUYsSUFBSUEsTUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDQSxNQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO2dCQUNsR0EsTUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLElBQUlBLE1BQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2hCQSxNQUFJLENBQUMsTUFBTSxDQUFDQSxNQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQy9CO2FBQ0o7U0FDSixDQUFDLENBQUM7O1FBRUgsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLGNBQUs7WUFDaEJBLE1BQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQzlCLENBQUMsQ0FBQzs7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHd1QsTUFBWSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDOztRQUUzRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7O1FBRTlCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSUMsZ0NBQWtCLEVBQUUsQ0FBQzs7Ozs7b0RBQzFDOzswQkFFRCx3QkFBTSxHQUFHLE9BQU87UUFDWixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM1RCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0I7TUFDSjs7MEJBRUQsOEJBQVMsR0FBRyxPQUFPO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzlCO01BQ0o7Ozs7OzswQkFNRCxxQ0FBa0I7UUFDZCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRTtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUU7UUFDN0MsS0FBS2hVLElBQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDekJBLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVM7a0JBQ25ELE9BQU8sS0FBSyxHQUFDO1NBQ3BCO1FBQ0QsT0FBTyxJQUFJLENBQUM7TUFDZjs7MEJBRUQsMENBQW9CO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztNQUN2Qjs7MEJBRUQsMEJBQVE7UUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztNQUN2Qjs7MEJBRUQsNEJBQVM7UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBRSxTQUFPO1FBQzFCQSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLFlBQVksSUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFDO01BQ25EOzswQkFFRCxnQ0FBVSxJQUFJLFFBQVEsUUFBUSxrQkFBa0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7TUFDaEQ7OzBCQUVELG9DQUFZLElBQUksUUFBUTtRQUNwQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtjQUN2QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksY0FBUSxFQUFFLENBQUMsR0FBQztNQUN0RDs7MEJBRUQsa0NBQVcsSUFBSSxRQUFRO1FBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO2NBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxjQUFRLEVBQUUsQ0FBQyxHQUFDO01BQ3JEOzswQkFFRCxrQ0FBWTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztNQUNuQzs7MEJBRUQsNEJBQVEsT0FBTyxXQUFXO1FBQ3RCLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQjs7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDN0UsS0FBS0EsSUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN6QkEsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDN0M7TUFDSjs7Ozs7MEJBS0QsMkNBQXdCO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztNQUNwRTs7MEJBRUQsOENBQWlCLFdBQVcsMkJBQTJCOzs7UUFDbkRBLElBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNmLEtBQUtBLElBQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxJQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBQztTQUM3RDtRQUNELElBQUksV0FBVyxFQUFFO1lBQ2IsT0FBTyxHQUFHLENBQUMsSUFBSSxXQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQ3JCQSxJQUFNLENBQUMsR0FBR08sTUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2pDUCxJQUFNLENBQUMsR0FBR08sTUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2pDUCxJQUFNLFFBQVEsR0FBRyxDQUFDLElBQUlpRCxtQkFBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDMUMsTUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDekZQLElBQU0sUUFBUSxHQUFHLENBQUMsSUFBSWlELG1CQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMxQyxNQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6RixPQUFPLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQzlGLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO01BQ25DOzswQkFFRCxvREFBb0IsTUFBTSxvQkFBb0I7UUFDMUNQLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxVQUFVLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN0RDtRQUNELE9BQU8sS0FBSyxDQUFDO01BQ2hCOzswQkFFRCw0Q0FBZ0IsRUFBRSxVQUFVLFdBQVcsWUFBWTtRQUMvQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDL0MsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxLQUFLLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztNQUNyRjs7MEJBRUQsNEJBQVM7UUFDTCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLE9BQU87U0FDVjs7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztRQUVwQixLQUFLQSxJQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFDO1NBQzVFO01BQ0o7OzBCQUVELG9DQUFZLEVBQUUsbUJBQW1CLEtBQUssYUFBYTtRQUMvQ0EsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7UUFLN0IsSUFBSSxDQUFDLElBQUksSUFBRSxTQUFPOzs7Ozs7UUFNbEIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUN0Qjs7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO01BQ3RFOzswQkFFRCxvQ0FBWSxJQUFJLFFBQVEsRUFBRSxtQkFBbUIsYUFBYSxhQUFhLEdBQUcsVUFBVTtRQUNoRixJQUFJLEdBQUcsRUFBRTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLE9BQU8sTUFBTSxLQUFLLEdBQUcsSUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJdVMsd0JBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUM7O21CQUV6RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBQztZQUNqQyxPQUFPO1NBQ1Y7O1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBR25TLHFCQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLEdBQUM7UUFDckUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBQztRQUNoRixJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDOztRQUUxRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJZ1IsbUJBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxRQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN4Rjs7Ozs7OzBCQU1ELHNDQUFhLElBQUksUUFBUTtRQUNyQnBSLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVDLEtBQUtELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6Q0MsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDMURBLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzdCLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDaEM7U0FDSjs7UUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7WUFDbENELElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakVDLElBQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbkVBLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pEQSxJQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUN2QyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBRSxTQUFPOztZQUVqQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQixPQUFPO2FBQ1Y7WUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFOztnQkFFbEIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzFCLEVBQUUsSUFBSSxHQUFHLENBQUM7aUJBQ2IsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDakMsRUFBRSxJQUFJLEdBQUcsQ0FBQztpQkFDYjthQUNKO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFFLFNBQU87WUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztrQkFDeEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUM7U0FDekQ7TUFDSjs7OzswQkFJRCw0QkFBUSxNQUFNLDBCQUEwQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQ3ZDOzs7OzswQkFLRCxvQ0FBWSxFQUFFLHlCQUF5QjtRQUNuQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7TUFDMUI7Ozs7OzBCQUtELDRCQUFRLFNBQVMscUJBQXFCO1FBQ2xDLE9BQU8sU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztNQUMzRjs7Ozs7OzBCQU1EO1FBQ0ksVUFBVTtRQUNWLElBQUk7UUFDSixlQUFlO1FBQ2YsTUFBTTtNQUNSO1FBQ0UsS0FBS0EsSUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMxQkQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzs7O1lBRzNCLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDVixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSTtnQkFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsZUFBZTtnQkFDM0MsV0FBUzs7O1lBR1hBLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDbEMsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRTtnQkFDL0NDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDOztnQkFFbkUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztnQkFFakMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN4QixlQUFlLEdBQUcsUUFBUSxDQUFDO2lCQUM5QjthQUNKOzs7WUFHREQsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDO1lBQzdCLE9BQU8sTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUU7Z0JBQzlCLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7O2dCQUVqRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7O29CQUV4QixNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQztvQkFDOUMsTUFBTTtpQkFDVDthQUNKO1NBQ0o7TUFDSjs7Ozs7MEJBS0QsOENBQWlCLE1BQU0sb0JBQW9CLGVBQWUsaUJBQWlCO1FBQ3ZFLEtBQUtBLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNURDLElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLE1BQU0sSUFBRSxTQUFPO1lBQ3BCQSxJQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCQSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDeEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbEM7U0FDSjtNQUNKOzs7Ozs7Ozs7OzBCQVVELDRDQUFnQixTQUFTLGFBQWE7UUFDbENBLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1RUEsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlFQSxJQUFNLGlCQUFpQixHQUFHLFlBQVksR0FBRyxhQUFhLENBQUM7UUFDdkRBLElBQU0sZUFBZSxHQUFHLENBQUMsQ0FBQzs7UUFFMUJBLElBQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxlQUFlLENBQUMsQ0FBQztRQUM3RUEsSUFBTSxPQUFPLEdBQUcsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLEdBQUcsb0JBQW9CLENBQUM7O1FBRTNJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO01BQ25DOzswQkFFRCwwQ0FBZSxHQUFHLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7UUFnQnhCQSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNsRUEsSUFBTSxhQUFhLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNwQ0EsSUFBTSxlQUFlLEdBQUcsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUM1Q0EsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQzs7UUFFcEIsSUFBSSxTQUFTLEVBQUU7WUFDWEEsSUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLEtBQUtBLElBQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQzNCQSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDO2dCQUNqRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDakM7WUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzs7O1lBR3BCLEtBQUtBLElBQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQzNCLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzQjtZQUNELEtBQUtBLElBQU00TSxJQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDMUI1TSxJQUFNaVUsTUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUNySCxJQUFFLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDQSxJQUFFLEVBQUVxSCxNQUFJLENBQUMsQ0FBQzthQUN0QztTQUNKO01BQ0o7Ozs7OzswQkFNRCwwQkFBTyxTQUFTLGFBQWE7OztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFOztRQUVwRCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Ozs7UUFJL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7O1FBRXhCbFUsSUFBSSxZQUFZLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixZQUFZLEdBQUcsRUFBRSxDQUFDO1NBQ3JCLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUM1QixZQUFZLEdBQUcsU0FBUyxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2lCQUN2RSxHQUFHLFdBQUUsU0FBUyxFQUFFLFNBQUcsSUFBSWtQLDhCQUFnQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUMsQ0FBQyxDQUFDO1NBQzdKLE1BQU07WUFDSCxZQUFZLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtnQkFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztnQkFDakMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUI7YUFDcEQsQ0FBQyxDQUFDOztZQUVILElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ3RCLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxXQUFFLEtBQUssRUFBRSxTQUFHLENBQUMxTyxNQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sT0FBTyxLQUFLLElBQUMsQ0FBQyxDQUFDO2FBQ3JGO1NBQ0o7OztRQUdEUCxJQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekZBLElBQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRkEsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7OztRQUs1RkEsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQzs7UUFFN0QsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQ0EsSUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7WUFDNUJBLElBQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN2QkEsSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxLQUFLLGtCQUFZLDRCQUFHLEVBQUU7Z0JBQWpCQSxJQUFNOztnQkFDUEEsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQlMsb0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7O2dCQUUzQlQsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUlJLHFCQUFPLENBQUMsR0FBRyxFQUFFLElBQUUsV0FBUzs7O2dCQUc3RUosSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxVQUFVLEVBQUU7b0JBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztpQkFDL0Q7O2dCQUVELFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7YUFDNUI7OztZQUdELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQzs7WUFFdkUsS0FBS0EsSUFBTTRNLElBQUUsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQ0EsSUFBRSxDQUFDLEVBQUU7O29CQUViLElBQUksQ0FBQyxhQUFhLENBQUNBLElBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDOUIsTUFBTSxDQUFDQSxJQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQ0EsSUFBRSxDQUFDLENBQUM7aUJBQ3JDO2FBQ0o7U0FDSjs7UUFFRCxLQUFLNU0sSUFBTSxVQUFVLElBQUksTUFBTSxFQUFFOzs7WUFHN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMzQzs7O1FBR0RBLElBQU0sTUFBTSxHQUFHa1UsNEJBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELEtBQUssc0JBQWdCLHFDQUFNLEVBQUU7WUFBeEJsVSxJQUFNbVU7O1lBQ1BuVSxJQUFNaVUsTUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUNFLFFBQU0sQ0FBQyxDQUFDO1lBQ2pDLElBQUlGLE1BQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDQSxNQUFJLENBQUMsY0FBYyxFQUFFLEVBQUU7Z0JBQ2pEQSxNQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDaEQsTUFBTSxJQUFJLENBQUNBLE1BQUksQ0FBQyxnQkFBZ0IsSUFBSUEsTUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxXQUFXLENBQUNFLFFBQU0sQ0FBQyxDQUFDO2FBQzVCO1NBQ0o7TUFDSjs7MEJBRUQsNERBQXlCO1FBQ3JCLEtBQUtuVSxJQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzFCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN4QjtTQUNKO01BQ0o7OzBCQUVELHNEQUFxQixZQUFZLDJCQUEyQixJQUFJLHlDQUF5QztRQUNyR0EsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCQSxJQUFNLE9BQU8seUJBQXlCLEVBQUUsQ0FBQztRQUN6Q0EsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFGQSxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7O1FBRTVGQSxJQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDeEIsS0FBSyxrQkFBZ0IscUNBQVksRUFBRTtZQUE5QkEsSUFBTTs7WUFDUEEsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7O1lBR25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDOztZQUU1QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBRSxXQUFTOztZQUU3QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTs7Z0JBRTdCLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQ3JDO1NBQ0o7OztRQUdELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQzs7UUFFeEUsS0FBSyxzQkFBZ0IsMkNBQVksRUFBRTtZQUE5QkEsSUFBTW1VOztZQUNQcFUsSUFBSWtVLE1BQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDRSxRQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7O1lBRW5DLElBQUlGLE1BQUksQ0FBQyxPQUFPLEVBQUUsSUFBRSxXQUFTOzs7OztZQUs3QixJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7O2dCQUVqQ2pVLElBQU0sVUFBVSxHQUFHbVUsUUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RG5VLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3BDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO29CQUNwQyxTQUFTO2lCQUNaO2FBQ0osTUFBTTs7Z0JBRUhBLElBQU0sUUFBUSxHQUFHbVUsUUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDOztnQkFFdkQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDdkIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQ3ZCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUN2QixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFFLFdBQVM7YUFDekM7Ozs7Ozs7WUFPRHBVLElBQUksa0JBQWtCLEdBQUdrVSxNQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7O1lBRTdDLEtBQUtsVSxJQUFJLFdBQVcsR0FBR29VLFFBQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLFdBQVcsSUFBSSxlQUFlLEVBQUUsRUFBRSxXQUFXLEVBQUU7Z0JBQzFGblUsSUFBTSxRQUFRLEdBQUdtVSxRQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzs7Z0JBRzlDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBRSxRQUFNO2dCQUNqQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs7Z0JBRTdCRixNQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDQSxNQUFJLElBQUksa0JBQWtCLEVBQUU7b0JBQzdCQSxNQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDbEM7Z0JBQ0QsSUFBSUEsTUFBSSxFQUFFO29CQUNOLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDOzs7b0JBR2hDLGtCQUFrQixHQUFHQSxNQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3pDLElBQUlBLE1BQUksQ0FBQyxPQUFPLEVBQUUsSUFBRSxRQUFNO2lCQUM3QjthQUNKO1NBQ0o7O1FBRUQsT0FBTyxNQUFNLENBQUM7TUFDakI7Ozs7OzswQkFNRCw4QkFBUyxNQUFNLDBCQUEwQjtRQUNyQ2xVLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSTtjQUNKLE9BQU8sSUFBSSxHQUFDOztRQUVoQixJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQzs7WUFFM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDOUM7U0FDSjs7UUFFREMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxJQUFJLEdBQUcsSUFBSW9VLGtCQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNuRjs7O1FBR0QsSUFBSSxDQUFDLElBQUksSUFBRSxRQUFRLElBQUksU0FBTzs7UUFFOUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLElBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSWhELG1CQUFLLENBQUMsYUFBYSxFQUFFLE9BQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUM7O1FBRXpHLE9BQU8sSUFBSSxDQUFDO01BQ2Y7OzBCQUVELG9EQUFvQixFQUFFLG1CQUFtQixJQUFJLFFBQVE7OztRQUNqRCxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3BCLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzNCOztRQUVEcFIsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUMsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsYUFBSTtnQkFDN0JPLE1BQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPQSxNQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzNCLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDckI7TUFDSjs7Ozs7OzBCQU1ELG9DQUFZLEVBQUUsbUJBQW1CO1FBQzdCUCxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJO2NBQ0wsU0FBTzs7UUFFWCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2xCLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzNCOztRQUVELElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO2NBQ2IsU0FBTzs7UUFFWCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1NBQy9ELE1BQU07WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7TUFDSjs7Ozs7MEJBS0Qsb0NBQWE7UUFDVCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDOztRQUVyQixLQUFLQSxJQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTTtjQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFDOztRQUV6QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO01BQ3ZCOzs7Ozs7OzswQkFRRCw0QkFBUSxrQkFBa0IsZ0JBQWdCLG1CQUFtQixVQUFVLFVBQVUsV0FBVzs7OztRQUV4RkEsSUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDOztRQUV2QkEsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxJQUFFLE9BQU8sV0FBVyxHQUFDOztRQUVuQ0EsSUFBTSx3QkFBd0IsR0FBRyxVQUFVO1lBQ3ZDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQztZQUNwRCxrQkFBa0IsQ0FBQzs7UUFFdkJBLElBQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsV0FBRSxDQUFDLEVBQUUsU0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBQyxDQUFDLENBQUM7UUFDbEZBLElBQU0sbUJBQW1CLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxXQUFFLENBQUMsRUFBRSxTQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFDLENBQUMsQ0FBQzs7UUFFOUZBLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7UUFFMUJELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUNwQkEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCQSxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNyQkEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7O1FBRXJCLEtBQUssb0JBQVcsZ0RBQW1CLEVBQUU7WUFBaENDLElBQU07O1lBQ1AsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5Qjs7a0NBRW9DO1lBQ2pDQSxJQUFNLElBQUksR0FBR08sTUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRTs7Z0JBRXZCLE9BQVM7YUFDWjtZQUNEUCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCQSxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEVBLElBQU0sWUFBWSxHQUFHLG1CQUFtQixHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUdpUSxvQkFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDOztZQUU5RmpRLElBQU0sZUFBZSxHQUFHO2dCQUNwQixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUkyUyxnQ0FBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSUEsZ0NBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzFELENBQUM7O1lBRUYsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksR0FBRzFDLG9CQUFNLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUdBLG9CQUFNO2dCQUM1RixlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLElBQUksQ0FBQyxFQUFFOztnQkFFdEZqUSxJQUFNLHNCQUFzQixpQkFBaUIsYUFBYSxDQUFDLEdBQUcsV0FBRSxDQUFDLEVBQUUsU0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBQyxDQUFDLENBQUM7Z0JBQzlGQSxJQUFNLDRCQUE0QixHQUFHLG1CQUFtQixDQUFDLEdBQUcsV0FBRSxDQUFDLEVBQUUsU0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBQyxDQUFDLENBQUM7O2dCQUU1RixXQUFXLENBQUMsSUFBSSxDQUFDOzBCQUNiLElBQUk7NEJBQ0osTUFBTTtvQkFDTixhQUFhLEVBQUUsc0JBQXNCO29CQUNyQyxtQkFBbUIsRUFBRSw0QkFBNEI7MkJBQ2pELEtBQUs7aUJBQ1IsQ0FBQyxDQUFDO2FBQ047OztRQTVCTCxLQUFLRCxJQUFJa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsWUE2QmxDOztRQUVELE9BQU8sV0FBVyxDQUFDO01BQ3RCOzswQkFFRCx3REFBc0IsV0FBVyxxQ0FBcUM7OztRQUNsRWpCLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLFdBQUUsRUFBRSxFQUFFLFNBQUdPLE1BQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBTSxDQUFDLENBQUM7UUFDdEYsS0FBSyxrQkFBZSwrQkFBTSxFQUFFO1lBQXZCUCxJQUFNOztZQUNQLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUM1RTtRQUNELE9BQU8sTUFBTSxDQUFDO01BQ2pCOzswQkFFRCwwQ0FBZ0I7UUFDWixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUM7U0FDZjs7UUFFRCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pDLEtBQUtBLElBQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQzFCQSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUlJLHFCQUFPLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ3JFLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjs7UUFFRCxPQUFPLEtBQUssQ0FBQztNQUNoQjs7Ozs7OzBCQU1ELDRDQUFnQixXQUFXLFdBQVcsT0FBTyxVQUFVLEtBQUssVUFBVTtRQUNsRSxXQUFXLEdBQUcsV0FBVyxJQUFJLG1CQUFtQixDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7TUFDeEQ7Ozs7OzswQkFNRCxrREFBbUIsV0FBVyxXQUFXLE9BQU8sV0FBVyxHQUFHLFdBQVc7UUFDckUsV0FBVyxHQUFHLFdBQVcsSUFBSSxtQkFBbUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDN0Q7Ozs7OzswQkFNRCw0Q0FBZ0IsV0FBVyxXQUFXLE9BQU8sVUFBVTtRQUNuRCxXQUFXLEdBQUcsV0FBVyxJQUFJLG1CQUFtQixDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3JEOzs7RUE3eUJxQm1SLHdCQTh5QnpCOztBQUVELFdBQVcsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDOztBQUVoQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUMzQzs7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUU7SUFDeEIsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQztDQUNwRTs7Ozs7O0FDdjFCYyx1Q0FBNkI7SUFDeEMsUUFBUSxJQUFJclIsb0JBQU0sQ0FBQyxNQUFNLENBQUNtVSxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU87Q0FDdkQ7Ozs7Ozs7O0FDQ2MsSUFBTSxVQUFVLEdBTTNCLG1CQUFXLEdBQUc7SUFDVixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztFQUNwQjs7QUFFTCxxQkFBSSw0QkFBUSxLQUFLLDBCQUE4QjtJQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTs7O1FBR2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDdEIsT0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQ3JELElBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztTQUN0QztLQUNKOztJQUVMLElBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzFCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztFQUMvQjs7QUFFTCxxQkFBSSw0QkFBUSxLQUFLLE1BQVU7SUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMzQyxJQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sV0FBRSxDQUFDLEVBQUU7WUFDckIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztRQUNQLElBQVEsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFNLENBQUM7S0FDOUI7Q0FDSjs7QUFHTHJVLElBQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQ0kscUJBQU8sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvRSxVQUFVLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7OztBQzFDOUVMLElBQUksZ0JBQWdCLENBQUM7Ozs7Ozs7QUFPckIsU0FBd0IsbUJBQW1CLElBQUk7SUFDM0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1FBQ25CLGdCQUFnQixHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7S0FDdkM7SUFDRCxPQUFPLGdCQUFnQixDQUFDO0NBQzNCOztBQ2JELFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7SUFDMUJDLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQzs7SUFFbEIsS0FBS0EsSUFBTSxDQUFDLElBQUksS0FBSyxFQUFFO1FBQ25CLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTtZQUNiLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7S0FDSjs7SUFFRHVPLDJCQUFhLENBQUMsT0FBTyxXQUFFLENBQUMsRUFBRTtRQUN0QixJQUFJLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDYixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pCO0tBQ0osQ0FBQyxDQUFDOztJQUVILE9BQU8sTUFBTSxDQUFDO0NBQ2pCOzs7Ozs7Ozs7Ozs7Ozs7QUFpQkQsU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0lBQ3pCLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7O0lBRXhCdk8sSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxLQUFLRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDcEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakM7O0lBRUQsS0FBS0EsSUFBSWtCLEdBQUMsR0FBRyxDQUFDLEVBQUVBLEdBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFQSxHQUFDLEVBQUUsRUFBRTtRQUNwQyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUNBLEdBQUMsQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sQ0FBQ0EsR0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQ0EsR0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQ0EsR0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNwRDtLQUNKOztJQUVELE9BQU8sTUFBTSxDQUFDO0NBQ2pCOztBQ2hERGpCLElBQU0sVUFBVSxHQUFHOzs7OztJQUtmLFFBQVEsRUFBRSxVQUFVOzs7OztJQUtwQixRQUFRLEVBQUUsVUFBVTs7Ozs7SUFLcEIsV0FBVyxFQUFFLGFBQWE7Ozs7O0lBSzFCLGdCQUFnQixFQUFFLGtCQUFrQjs7Ozs7SUFLcEMsaUJBQWlCLEVBQUUsbUJBQW1COzs7OztJQUt0QyxTQUFTLEVBQUUsV0FBVzs7Ozs7SUFLdEIsU0FBUyxFQUFFLFdBQVc7Ozs7O0lBS3RCLFlBQVksRUFBRSxjQUFjOzs7OztJQUs1QixvQkFBb0IsRUFBRSxzQkFBc0I7Ozs7O0lBSzVDLGlCQUFpQixFQUFFLG1CQUFtQjs7Ozs7SUFLdEMsZ0JBQWdCLEVBQUUsa0JBQWtCOzs7OztJQUtwQyxTQUFTLEVBQUUsV0FBVzs7Ozs7SUFLdEIsT0FBTyxFQUFFLFNBQVM7Ozs7O0lBS2xCLFVBQVUsRUFBRSxZQUFZOzs7OztJQUt4QixRQUFRLEVBQUUsVUFBVTs7Ozs7SUFLcEIsU0FBUyxFQUFFLFdBQVc7Ozs7O0lBS3RCLFNBQVMsRUFBRSxXQUFXOzs7OztJQUt0QixhQUFhLEVBQUUsZUFBZTs7Ozs7SUFLOUIsUUFBUSxFQUFFLFVBQVU7O0NBRXZCLENBQUM7O0FBRUYsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7SUFDMUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDdkY7O0FBRUQsU0FBUyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7SUFDdEQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0RSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0NBQ25DOztBQUVELFNBQVMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRTtJQUM3RCxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRCxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztDQUN4Qzs7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO0lBQy9DRCxJQUFJLElBQUksQ0FBQztJQUNULEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBRSxXQUFTO1FBQ3JELElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDdVUsdUJBQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDNUUsT0FBTyxLQUFLLENBQUM7U0FDaEI7S0FDSjtJQUNELEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBRSxXQUFTO1FBQ3BELElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDQSx1QkFBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUM1RSxPQUFPLEtBQUssQ0FBQztTQUNoQjtLQUNKO0lBQ0QsT0FBTyxJQUFJLENBQUM7Q0FDZjs7QUFFRCxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7SUFDMUQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7O0lBRXBCdlUsSUFBSSxRQUFRLENBQUM7OztJQUdiLEtBQUssUUFBUSxJQUFJLE1BQU0sRUFBRTtRQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBRSxXQUFTO1FBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2pDLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQ3BEO0tBQ0o7OztJQUdELEtBQUssUUFBUSxJQUFJLEtBQUssRUFBRTtRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBRSxXQUFTO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3hDLE1BQU0sSUFBSSxDQUFDdVUsdUJBQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7WUFDcEQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUN4SCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN2RyxNQUFNOztnQkFFSCxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDM0Q7U0FDSjtLQUNKO0NBQ0o7O0FBRUQsU0FBUyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtJQUNoRixNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQzs7SUFFcEJ2VSxJQUFJLElBQUksQ0FBQzs7SUFFVCxLQUFLLElBQUksSUFBSSxNQUFNLEVBQUU7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUUsV0FBUztRQUMzQyxJQUFJLENBQUN1VSx1QkFBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6RTtLQUNKO0lBQ0QsS0FBSyxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUUsV0FBUztRQUN6RSxJQUFJLENBQUNBLHVCQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ3JDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3pFO0tBQ0o7Q0FDSjs7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7SUFDcEIsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDO0NBQ25CO0FBQ0QsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtJQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN4QixPQUFPLEtBQUssQ0FBQztDQUNoQjs7QUFFRCxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtJQUN6QyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0QixLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQzs7O0lBR3BCdFUsSUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4Q0EsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7O0lBR3RDQSxJQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqREEsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7OztJQUcvQ0EsSUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDOzs7SUFHcENBLElBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7O0lBRWxDRCxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDOzs7SUFHdEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbEQsTUFBTTs7WUFFSCxDQUFDLEVBQUUsQ0FBQztTQUNQO0tBQ0o7OztJQUdELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztRQUUzQyxPQUFPLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztRQUVoRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxPQUFPLElBQUUsV0FBUzs7UUFFMUQsSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFOztZQUVyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN2RSxNQUFNOztZQUVILENBQUMsRUFBRSxDQUFDO1NBQ1A7OztRQUdELG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN6Qjs7O0lBR0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7UUFHakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUl1VSx1QkFBTyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBRSxXQUFTOzs7O1FBSWpFLElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDQSx1QkFBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDQSx1QkFBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JLLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7OztZQUdwRSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLFNBQVM7U0FDWjs7O1FBR0Qsd0JBQXdCLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3ZILHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwSCxJQUFJLENBQUNBLHVCQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hGO1FBQ0QsSUFBSSxDQUFDQSx1QkFBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUNBLHVCQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEcsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNySDs7O1FBR0QsS0FBSyxJQUFJLElBQUksV0FBVyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFFLFdBQVM7WUFDaEQsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLFFBQVE7Z0JBQzFELElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFFLFdBQVM7WUFDOUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsd0JBQXdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDaEksTUFBTSxJQUFJLENBQUNBLHVCQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUN0RCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNwRztTQUNKO1FBQ0QsS0FBSyxJQUFJLElBQUksVUFBVSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUUsV0FBUztZQUNuRixJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssUUFBUTtnQkFDMUQsSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUUsV0FBUztZQUM5RSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM5Qix3QkFBd0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzthQUNoSSxNQUFNLElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3BHO1NBQ0o7S0FDSjtDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CRCxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0lBQy9CLElBQUksQ0FBQyxNQUFNLElBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFDOztJQUV0RXZVLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7SUFFbEIsSUFBSTs7UUFFQSxJQUFJLENBQUN1VSx1QkFBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM1RDtRQUNELElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxRTtRQUNELElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN0RTtRQUNELElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM1RTtRQUNELElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN4RTtRQUNELElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxRTtRQUNELElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxRTtRQUNELElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMvQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNsRjtRQUNELElBQUksQ0FBQ0EsdUJBQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQyxR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QyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7WUFDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUM7WUFDeEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7WUFDM0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7WUFDeEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7WUFDckMsV0FBVyxFQUFFLFNBQVMsRUFBRSxlQUFlO1NBQzFDLENBQUM7S0FDTDs7SUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDckQsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUk7WUFDdEQsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7WUFDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUM7WUFDeEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7WUFDM0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7WUFDeEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7WUFDckMsV0FBVyxFQUFFLFNBQVMsRUFBRSxlQUFlO1NBQzFDLENBQUM7S0FDTDs7SUFFRCxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUU7UUFDcEMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDM0Q7Q0FDSjs7QUFFRCxTQUFTLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxT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QUFFLEVBQUUsQ0FBQztJQUNiLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RCxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RNLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdPLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvUCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuSCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JILEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hMLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoRCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4TixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3SyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0IsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFKLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4WixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEwsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4SSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4SCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlKLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyTCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNySSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4SixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdGLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNwRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pLLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEYsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25KLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDblIsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BSLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFB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QUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3Q0EsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7O0lBRzVDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUNsQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1NBQ3JDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3pDQSxJQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNqQzs7O0lBR0RBLElBQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN6QkEsSUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3pCQSxJQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyQkEsSUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckIsS0FBS0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUJDLElBQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3JFQSxJQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNyRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzlDO0NBQ0o7O0FBRUQsU0FBUyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7SUFDdEVELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0lBRXBCQSxJQUFJLENBQUMsQ0FBQzs7O0lBR04sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRTtJQUMvQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxH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