Files
M1kep-KepPromptLang/web/dist/editor.worker.bundle.js
2023-09-12 18:28:40 -07:00

47 lines
1.8 MiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 7078:
/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => {
eval("\n// UNUSED EXPORTS: initialize\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/errors.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n// Avoid circular dependency on EventEmitter by implementing a subset of the interface.\nclass ErrorHandler {\n constructor() {\n this.listeners = [];\n this.unexpectedErrorHandler = function (e) {\n setTimeout(() => {\n if (e.stack) {\n if (ErrorNoTelemetry.isErrorNoTelemetry(e)) {\n throw new ErrorNoTelemetry(e.message + '\\n\\n' + e.stack);\n }\n throw new Error(e.message + '\\n\\n' + e.stack);\n }\n throw e;\n }, 0);\n };\n }\n emit(e) {\n this.listeners.forEach((listener) => {\n listener(e);\n });\n }\n onUnexpectedError(e) {\n this.unexpectedErrorHandler(e);\n this.emit(e);\n }\n // For external errors, we don't want the listeners to be called\n onUnexpectedExternalError(e) {\n this.unexpectedErrorHandler(e);\n }\n}\nconst errorHandler = new ErrorHandler();\nfunction onUnexpectedError(e) {\n // ignore errors from cancelled promises\n if (!isCancellationError(e)) {\n errorHandler.onUnexpectedError(e);\n }\n return undefined;\n}\nfunction onUnexpectedExternalError(e) {\n // ignore errors from cancelled promises\n if (!isCancellationError(e)) {\n errorHandler.onUnexpectedExternalError(e);\n }\n return undefined;\n}\nfunction transformErrorForSerialization(error) {\n if (error instanceof Error) {\n const { name, message } = error;\n const stack = error.stacktrace || error.stack;\n return {\n $isError: true,\n name,\n message,\n stack,\n noTelemetry: ErrorNoTelemetry.isErrorNoTelemetry(error)\n };\n }\n // return as is\n return error;\n}\nconst canceledName = 'Canceled';\n/**\n * Checks if the given error is a promise in canceled state\n */\nfunction isCancellationError(error) {\n if (error instanceof CancellationError) {\n return true;\n }\n return error instanceof Error && error.name === canceledName && error.message === canceledName;\n}\n// !!!IMPORTANT!!!\n// Do NOT change this class because it is also used as an API-type.\nclass CancellationError extends Error {\n constructor() {\n super(canceledName);\n this.name = this.message;\n }\n}\n/**\n * @deprecated use {@link CancellationError `new CancellationError()`} instead\n */\nfunction canceled() {\n const error = new Error(canceledName);\n error.name = error.message;\n return error;\n}\nfunction illegalArgument(name) {\n if (name) {\n return new Error(`Illegal argument: ${name}`);\n }\n else {\n return new Error('Illegal argument');\n }\n}\nfunction illegalState(name) {\n if (name) {\n return new Error(`Illegal state: ${name}`);\n }\n else {\n return new Error('Illegal state');\n }\n}\nclass NotSupportedError extends (/* unused pure expression or super */ null && (Error)) {\n constructor(message) {\n super('NotSupported');\n if (message) {\n this.message = message;\n }\n }\n}\n/**\n * Error that when thrown won't be logged in telemetry as an unhandled error.\n */\nclass ErrorNoTelemetry extends Error {\n constructor(msg) {\n super(msg);\n this.name = 'CodeExpectedError';\n }\n static fromError(err) {\n if (err instanceof ErrorNoTelemetry) {\n return err;\n }\n const result = new ErrorNoTelemetry();\n result.message = err.message;\n result.stack = err.stack;\n return result;\n }\n static isErrorNoTelemetry(err) {\n return err.name === 'CodeExpectedError';\n }\n}\n/**\n * This error indicates a bug.\n * Do not throw this for invalid user input.\n * Only catch this error to recover gracefully from bugs.\n */\nclass BugIndicatingError extends Error {\n constructor(message) {\n super(message || 'An unexpected bug occurred.');\n Object.setPrototypeOf(this, BugIndicatingError.prototype);\n // Because we know for sure only buggy code throws this,\n // we definitely want to break here and fix the bug.\n // eslint-disable-next-line no-debugger\n // debugger;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/functional.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nfunction once(fn) {\n const _this = this;\n let didCall = false;\n let result;\n return function () {\n if (didCall) {\n return result;\n }\n didCall = true;\n result = fn.apply(_this, arguments);\n return result;\n };\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/iterator.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar Iterable;\n(function (Iterable) {\n function is(thing) {\n return thing && typeof thing === 'object' && typeof thing[Symbol.iterator] === 'function';\n }\n Iterable.is = is;\n const _empty = Object.freeze([]);\n function empty() {\n return _empty;\n }\n Iterable.empty = empty;\n function* single(element) {\n yield element;\n }\n Iterable.single = single;\n function wrap(iterableOrElement) {\n if (is(iterableOrElement)) {\n return iterableOrElement;\n }\n else {\n return single(iterableOrElement);\n }\n }\n Iterable.wrap = wrap;\n function from(iterable) {\n return iterable || _empty;\n }\n Iterable.from = from;\n function isEmpty(iterable) {\n return !iterable || iterable[Symbol.iterator]().next().done === true;\n }\n Iterable.isEmpty = isEmpty;\n function first(iterable) {\n return iterable[Symbol.iterator]().next().value;\n }\n Iterable.first = first;\n function some(iterable, predicate) {\n for (const element of iterable) {\n if (predicate(element)) {\n return true;\n }\n }\n return false;\n }\n Iterable.some = some;\n function find(iterable, predicate) {\n for (const element of iterable) {\n if (predicate(element)) {\n return element;\n }\n }\n return undefined;\n }\n Iterable.find = find;\n function* filter(iterable, predicate) {\n for (const element of iterable) {\n if (predicate(element)) {\n yield element;\n }\n }\n }\n Iterable.filter = filter;\n function* map(iterable, fn) {\n let index = 0;\n for (const element of iterable) {\n yield fn(element, index++);\n }\n }\n Iterable.map = map;\n function* concat(...iterables) {\n for (const iterable of iterables) {\n for (const element of iterable) {\n yield element;\n }\n }\n }\n Iterable.concat = concat;\n function reduce(iterable, reducer, initialValue) {\n let value = initialValue;\n for (const element of iterable) {\n value = reducer(value, element);\n }\n return value;\n }\n Iterable.reduce = reduce;\n /**\n * Returns an iterable slice of the array, with the same semantics as `array.slice()`.\n */\n function* slice(arr, from, to = arr.length) {\n if (from < 0) {\n from += arr.length;\n }\n if (to < 0) {\n to += arr.length;\n }\n else if (to > arr.length) {\n to = arr.length;\n }\n for (; from < to; from++) {\n yield arr[from];\n }\n }\n Iterable.slice = slice;\n /**\n * Consumes `atMost` elements from iterable and returns the consumed elements,\n * and an iterable for the rest of the elements.\n */\n function consume(iterable, atMost = Number.POSITIVE_INFINITY) {\n const consumed = [];\n if (atMost === 0) {\n return [consumed, iterable];\n }\n const iterator = iterable[Symbol.iterator]();\n for (let i = 0; i < atMost; i++) {\n const next = iterator.next();\n if (next.done) {\n return [consumed, Iterable.empty()];\n }\n consumed.push(next.value);\n }\n return [consumed, { [Symbol.iterator]() { return iterator; } }];\n }\n Iterable.consume = consume;\n})(Iterable || (Iterable = {}));\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/lifecycle.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n// #region Disposable Tracking\n/**\n * Enables logging of potentially leaked disposables.\n *\n * A disposable is considered leaked if it is not disposed or not registered as the child of\n * another disposable. This tracking is very simple an only works for classes that either\n * extend Disposable or use a DisposableStore. This means there are a lot of false positives.\n */\nconst TRACK_DISPOSABLES = false;\nlet disposableTracker = null;\nfunction setDisposableTracker(tracker) {\n disposableTracker = tracker;\n}\nif (TRACK_DISPOSABLES) {\n const __is_disposable_tracked__ = '__is_disposable_tracked__';\n setDisposableTracker(new class {\n trackDisposable(x) {\n const stack = new Error('Potentially leaked disposable').stack;\n setTimeout(() => {\n if (!x[__is_disposable_tracked__]) {\n console.log(stack);\n }\n }, 3000);\n }\n setParent(child, parent) {\n if (child && child !== lifecycle_Disposable.None) {\n try {\n child[__is_disposable_tracked__] = true;\n }\n catch (_a) {\n // noop\n }\n }\n }\n markAsDisposed(disposable) {\n if (disposable && disposable !== lifecycle_Disposable.None) {\n try {\n disposable[__is_disposable_tracked__] = true;\n }\n catch (_a) {\n // noop\n }\n }\n }\n markAsSingleton(disposable) { }\n });\n}\nfunction trackDisposable(x) {\n disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.trackDisposable(x);\n return x;\n}\nfunction markAsDisposed(disposable) {\n disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.markAsDisposed(disposable);\n}\nfunction setParentOfDisposable(child, parent) {\n disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.setParent(child, parent);\n}\nfunction setParentOfDisposables(children, parent) {\n if (!disposableTracker) {\n return;\n }\n for (const child of children) {\n disposableTracker.setParent(child, parent);\n }\n}\n/**\n * Indicates that the given object is a singleton which does not need to be disposed.\n*/\nfunction markAsSingleton(singleton) {\n disposableTracker === null || disposableTracker === void 0 ? void 0 : disposableTracker.markAsSingleton(singleton);\n return singleton;\n}\n/**\n * Check if `thing` is {@link IDisposable disposable}.\n */\nfunction isDisposable(thing) {\n return typeof thing.dispose === 'function' && thing.dispose.length === 0;\n}\nfunction dispose(arg) {\n if (Iterable.is(arg)) {\n const errors = [];\n for (const d of arg) {\n if (d) {\n try {\n d.dispose();\n }\n catch (e) {\n errors.push(e);\n }\n }\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n else if (errors.length > 1) {\n throw new AggregateError(errors, 'Encountered errors while disposing of store');\n }\n return Array.isArray(arg) ? [] : arg;\n }\n else if (arg) {\n arg.dispose();\n return arg;\n }\n}\n/**\n * Combine multiple disposable values into a single {@link IDisposable}.\n */\nfunction combinedDisposable(...disposables) {\n const parent = lifecycle_toDisposable(() => dispose(disposables));\n setParentOfDisposables(disposables, parent);\n return parent;\n}\n/**\n * Turn a function that implements dispose into an {@link IDisposable}.\n *\n * @param fn Clean up function, guaranteed to be called only **once**.\n */\nfunction lifecycle_toDisposable(fn) {\n const self = trackDisposable({\n dispose: once(() => {\n markAsDisposed(self);\n fn();\n })\n });\n return self;\n}\n/**\n * Manages a collection of disposable values.\n *\n * This is the preferred way to manage multiple disposables. A `DisposableStore` is safer to work with than an\n * `IDisposable[]` as it considers edge cases, such as registering the same value multiple times or adding an item to a\n * store that has already been disposed of.\n */\nclass DisposableStore {\n constructor() {\n this._toDispose = new Set();\n this._isDisposed = false;\n trackDisposable(this);\n }\n /**\n * Dispose of all registered disposables and mark this object as disposed.\n *\n * Any future disposables added to this object will be disposed of on `add`.\n */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n markAsDisposed(this);\n this._isDisposed = true;\n this.clear();\n }\n /**\n * @return `true` if this object has been disposed of.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of all registered disposables but do not mark this object as disposed.\n */\n clear() {\n if (this._toDispose.size === 0) {\n return;\n }\n try {\n dispose(this._toDispose);\n }\n finally {\n this._toDispose.clear();\n }\n }\n /**\n * Add a new {@link IDisposable disposable} to the collection.\n */\n add(o) {\n if (!o) {\n return o;\n }\n if (o === this) {\n throw new Error('Cannot register a disposable on itself!');\n }\n setParentOfDisposable(o, this);\n if (this._isDisposed) {\n if (!DisposableStore.DISABLE_DISPOSED_WARNING) {\n console.warn(new Error('Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!').stack);\n }\n }\n else {\n this._toDispose.add(o);\n }\n return o;\n }\n}\nDisposableStore.DISABLE_DISPOSED_WARNING = false;\n/**\n * Abstract base class for a {@link IDisposable disposable} object.\n *\n * Subclasses can {@linkcode _register} disposables that will be automatically cleaned up when this object is disposed of.\n */\nclass lifecycle_Disposable {\n constructor() {\n this._store = new DisposableStore();\n trackDisposable(this);\n setParentOfDisposable(this._store, this);\n }\n dispose() {\n markAsDisposed(this);\n this._store.dispose();\n }\n /**\n * Adds `o` to the collection of disposables managed by this object.\n */\n _register(o) {\n if (o === this) {\n throw new Error('Cannot register a disposable on itself!');\n }\n return this._store.add(o);\n }\n}\n/**\n * A disposable that does nothing when it is disposed of.\n *\n * TODO: This should not be a static property.\n */\nlifecycle_Disposable.None = Object.freeze({ dispose() { } });\n/**\n * Manages the lifecycle of a disposable value that may be changed.\n *\n * This ensures that when the disposable value is changed, the previously held disposable is disposed of. You can\n * also register a `MutableDisposable` on a `Disposable` to ensure it is automatically cleaned up.\n */\nclass MutableDisposable {\n constructor() {\n this._isDisposed = false;\n trackDisposable(this);\n }\n get value() {\n return this._isDisposed ? undefined : this._value;\n }\n set value(value) {\n var _a;\n if (this._isDisposed || value === this._value) {\n return;\n }\n (_a = this._value) === null || _a === void 0 ? void 0 : _a.dispose();\n if (value) {\n setParentOfDisposable(value, this);\n }\n this._value = value;\n }\n /**\n * Resets the stored value and disposed of the previously stored value.\n */\n clear() {\n this.value = undefined;\n }\n dispose() {\n var _a;\n this._isDisposed = true;\n markAsDisposed(this);\n (_a = this._value) === null || _a === void 0 ? void 0 : _a.dispose();\n this._value = undefined;\n }\n}\nclass RefCountedDisposable {\n constructor(_disposable) {\n this._disposable = _disposable;\n this._counter = 1;\n }\n acquire() {\n this._counter++;\n return this;\n }\n release() {\n if (--this._counter === 0) {\n this._disposable.dispose();\n }\n return this;\n }\n}\nclass ImmortalReference {\n constructor(object) {\n this.object = object;\n }\n dispose() { }\n}\n/**\n * A map the manages the lifecycle of the values that it stores.\n */\nclass DisposableMap {\n constructor() {\n this._store = new Map();\n this._isDisposed = false;\n trackDisposable(this);\n }\n /**\n * Disposes of all stored values and mark this object as disposed.\n *\n * Trying to use this object after it has been disposed of is an error.\n */\n dispose() {\n markAsDisposed(this);\n this._isDisposed = true;\n this.clearAndDisposeAll();\n }\n /**\n * Disposes of all stored values and clear the map, but DO NOT mark this object as disposed.\n */\n clearAndDisposeAll() {\n if (!this._store.size) {\n return;\n }\n try {\n dispose(this._store.values());\n }\n finally {\n this._store.clear();\n }\n }\n get(key) {\n return this._store.get(key);\n }\n set(key, value, skipDisposeOnOverwrite = false) {\n var _a;\n if (this._isDisposed) {\n console.warn(new Error('Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!').stack);\n }\n if (!skipDisposeOnOverwrite) {\n (_a = this._store.get(key)) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n this._store.set(key, value);\n }\n /**\n * Delete the value stored for `key` from this map and also dispose of it.\n */\n deleteAndDispose(key) {\n var _a;\n (_a = this._store.get(key)) === null || _a === void 0 ? void 0 : _a.dispose();\n this._store.delete(key);\n }\n [Symbol.iterator]() {\n return this._store[Symbol.iterator]();\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/linkedList.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nclass Node {\n constructor(element) {\n this.element = element;\n this.next = Node.Undefined;\n this.prev = Node.Undefined;\n }\n}\nNode.Undefined = new Node(undefined);\nclass linkedList_LinkedList {\n constructor() {\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n this._size = 0;\n }\n get size() {\n return this._size;\n }\n isEmpty() {\n return this._first === Node.Undefined;\n }\n clear() {\n let node = this._first;\n while (node !== Node.Undefined) {\n const next = node.next;\n node.prev = Node.Undefined;\n node.next = Node.Undefined;\n node = next;\n }\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n this._size = 0;\n }\n unshift(element) {\n return this._insert(element, false);\n }\n push(element) {\n return this._insert(element, true);\n }\n _insert(element, atTheEnd) {\n const newNode = new Node(element);\n if (this._first === Node.Undefined) {\n this._first = newNode;\n this._last = newNode;\n }\n else if (atTheEnd) {\n // push\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n }\n else {\n // unshift\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n this._size += 1;\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n shift() {\n if (this._first === Node.Undefined) {\n return undefined;\n }\n else {\n const res = this._first.element;\n this._remove(this._first);\n return res;\n }\n }\n pop() {\n if (this._last === Node.Undefined) {\n return undefined;\n }\n else {\n const res = this._last.element;\n this._remove(this._last);\n return res;\n }\n }\n _remove(node) {\n if (node.prev !== Node.Undefined && node.next !== Node.Undefined) {\n // middle\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n }\n else if (node.prev === Node.Undefined && node.next === Node.Undefined) {\n // only node\n this._first = Node.Undefined;\n this._last = Node.Undefined;\n }\n else if (node.next === Node.Undefined) {\n // last\n this._last = this._last.prev;\n this._last.next = Node.Undefined;\n }\n else if (node.prev === Node.Undefined) {\n // first\n this._first = this._first.next;\n this._first.prev = Node.Undefined;\n }\n // done\n this._size -= 1;\n }\n *[Symbol.iterator]() {\n let node = this._first;\n while (node !== Node.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/stopwatch.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nconst hasPerformanceNow = (globalThis.performance && typeof globalThis.performance.now === 'function');\nclass StopWatch {\n static create(highResolution) {\n return new StopWatch(highResolution);\n }\n constructor(highResolution) {\n this._now = hasPerformanceNow && highResolution === false ? Date.now : globalThis.performance.now.bind(globalThis.performance);\n this._startTime = this._now();\n this._stopTime = -1;\n }\n stop() {\n this._stopTime = this._now();\n }\n elapsed() {\n if (this._stopTime !== -1) {\n return this._stopTime - this._startTime;\n }\n return this._now() - this._startTime;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/event.js\n\n\n\n\n\n// -----------------------------------------------------------------------------------------------------------------------\n// Uncomment the next line to print warnings whenever an emitter with listeners is disposed. That is a sign of code smell.\n// -----------------------------------------------------------------------------------------------------------------------\nconst _enableDisposeWithListenerWarning = false;\n// _enableDisposeWithListenerWarning = Boolean(\"TRUE\"); // causes a linter warning so that it cannot be pushed\n// -----------------------------------------------------------------------------------------------------------------------\n// Uncomment the next line to print warnings whenever a snapshotted event is used repeatedly without cleanup.\n// See https://github.com/microsoft/vscode/issues/142851\n// -----------------------------------------------------------------------------------------------------------------------\nconst _enableSnapshotPotentialLeakWarning = false;\nvar Event;\n(function (Event) {\n Event.None = () => lifecycle_Disposable.None;\n function _addLeakageTraceLogic(options) {\n if (_enableSnapshotPotentialLeakWarning) {\n const { onDidAddListener: origListenerDidAdd } = options;\n const stack = Stacktrace.create();\n let count = 0;\n options.onDidAddListener = () => {\n if (++count === 2) {\n console.warn('snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here');\n stack.print();\n }\n origListenerDidAdd === null || origListenerDidAdd === void 0 ? void 0 : origListenerDidAdd();\n };\n }\n }\n /**\n * Given an event, returns another event which debounces calls and defers the listeners to a later task via a shared\n * `setTimeout`. The event is converted into a signal (`Event<void>`) to avoid additional object creation as a\n * result of merging events and to try prevent race conditions that could arise when using related deferred and\n * non-deferred events.\n *\n * This is useful for deferring non-critical work (eg. general UI updates) to ensure it does not block critical work\n * (eg. latency of keypress to text rendered).\n *\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n *\n * @param event The event source for the new event.\n * @param disposable A disposable store to add the new EventEmitter to.\n */\n function defer(event, disposable) {\n return debounce(event, () => void 0, 0, undefined, true, undefined, disposable);\n }\n Event.defer = defer;\n /**\n * Given an event, returns another event which only fires once.\n *\n * @param event The event source for the new event.\n */\n function once(event) {\n return (listener, thisArgs = null, disposables) => {\n // we need this, in case the event fires during the listener call\n let didFire = false;\n let result = undefined;\n result = event(e => {\n if (didFire) {\n return;\n }\n else if (result) {\n result.dispose();\n }\n else {\n didFire = true;\n }\n return listener.call(thisArgs, e);\n }, null, disposables);\n if (didFire) {\n result.dispose();\n }\n return result;\n };\n }\n Event.once = once;\n /**\n * Maps an event of one type into an event of another type using a mapping function, similar to how\n * `Array.prototype.map` works.\n *\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n *\n * @param event The event source for the new event.\n * @param map The mapping function.\n * @param disposable A disposable store to add the new EventEmitter to.\n */\n function map(event, map, disposable) {\n return snapshot((listener, thisArgs = null, disposables) => event(i => listener.call(thisArgs, map(i)), null, disposables), disposable);\n }\n Event.map = map;\n /**\n * Wraps an event in another event that performs some function on the event object before firing.\n *\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n *\n * @param event The event source for the new event.\n * @param each The function to perform on the event object.\n * @param disposable A disposable store to add the new EventEmitter to.\n */\n function forEach(event, each, disposable) {\n return snapshot((listener, thisArgs = null, disposables) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables), disposable);\n }\n Event.forEach = forEach;\n function filter(event, filter, disposable) {\n return snapshot((listener, thisArgs = null, disposables) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables), disposable);\n }\n Event.filter = filter;\n /**\n * Given an event, returns the same event but typed as `Event<void>`.\n */\n function signal(event) {\n return event;\n }\n Event.signal = signal;\n function any(...events) {\n return (listener, thisArgs = null, disposables) => combinedDisposable(...events.map(event => event(e => listener.call(thisArgs, e), null, disposables)));\n }\n Event.any = any;\n /**\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n */\n function reduce(event, merge, initial, disposable) {\n let output = initial;\n return map(event, e => {\n output = merge(output, e);\n return output;\n }, disposable);\n }\n Event.reduce = reduce;\n function snapshot(event, disposable) {\n let listener;\n const options = {\n onWillAddFirstListener() {\n listener = event(emitter.fire, emitter);\n },\n onDidRemoveLastListener() {\n listener === null || listener === void 0 ? void 0 : listener.dispose();\n }\n };\n if (!disposable) {\n _addLeakageTraceLogic(options);\n }\n const emitter = new Emitter(options);\n disposable === null || disposable === void 0 ? void 0 : disposable.add(emitter);\n return emitter.event;\n }\n function debounce(event, merge, delay = 100, leading = false, flushOnListenerRemove = false, leakWarningThreshold, disposable) {\n let subscription;\n let output = undefined;\n let handle = undefined;\n let numDebouncedCalls = 0;\n let doFire;\n const options = {\n leakWarningThreshold,\n onWillAddFirstListener() {\n subscription = event(cur => {\n numDebouncedCalls++;\n output = merge(output, cur);\n if (leading && !handle) {\n emitter.fire(output);\n output = undefined;\n }\n doFire = () => {\n const _output = output;\n output = undefined;\n handle = undefined;\n if (!leading || numDebouncedCalls > 1) {\n emitter.fire(_output);\n }\n numDebouncedCalls = 0;\n };\n if (typeof delay === 'number') {\n clearTimeout(handle);\n handle = setTimeout(doFire, delay);\n }\n else {\n if (handle === undefined) {\n handle = 0;\n queueMicrotask(doFire);\n }\n }\n });\n },\n onWillRemoveListener() {\n if (flushOnListenerRemove && numDebouncedCalls > 0) {\n doFire === null || doFire === void 0 ? void 0 : doFire();\n }\n },\n onDidRemoveLastListener() {\n doFire = undefined;\n subscription.dispose();\n }\n };\n if (!disposable) {\n _addLeakageTraceLogic(options);\n }\n const emitter = new Emitter(options);\n disposable === null || disposable === void 0 ? void 0 : disposable.add(emitter);\n return emitter.event;\n }\n Event.debounce = debounce;\n /**\n * Debounces an event, firing after some delay (default=0) with an array of all event original objects.\n *\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n */\n function accumulate(event, delay = 0, disposable) {\n return Event.debounce(event, (last, e) => {\n if (!last) {\n return [e];\n }\n last.push(e);\n return last;\n }, delay, undefined, true, undefined, disposable);\n }\n Event.accumulate = accumulate;\n /**\n * Filters an event such that some condition is _not_ met more than once in a row, effectively ensuring duplicate\n * event objects from different sources do not fire the same event object.\n *\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n *\n * @param event The event source for the new event.\n * @param equals The equality condition.\n * @param disposable A disposable store to add the new EventEmitter to.\n *\n * @example\n * ```\n * // Fire only one time when a single window is opened or focused\n * Event.latch(Event.any(onDidOpenWindow, onDidFocusWindow))\n * ```\n */\n function latch(event, equals = (a, b) => a === b, disposable) {\n let firstCall = true;\n let cache;\n return filter(event, value => {\n const shouldEmit = firstCall || !equals(value, cache);\n firstCall = false;\n cache = value;\n return shouldEmit;\n }, disposable);\n }\n Event.latch = latch;\n /**\n * Splits an event whose parameter is a union type into 2 separate events for each type in the union.\n *\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n *\n * @example\n * ```\n * const event = new EventEmitter<number | undefined>().event;\n * const [numberEvent, undefinedEvent] = Event.split(event, isUndefined);\n * ```\n *\n * @param event The event source for the new event.\n * @param isT A function that determines what event is of the first type.\n * @param disposable A disposable store to add the new EventEmitter to.\n */\n function split(event, isT, disposable) {\n return [\n Event.filter(event, isT, disposable),\n Event.filter(event, e => !isT(e), disposable),\n ];\n }\n Event.split = split;\n /**\n * Buffers an event until it has a listener attached.\n *\n * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n * returned event causes this utility to leak a listener on the original event.\n *\n * @param event The event source for the new event.\n * @param flushAfterTimeout Determines whether to flush the buffer after a timeout immediately or after a\n * `setTimeout` when the first event listener is added.\n * @param _buffer Internal: A source event array used for tests.\n *\n * @example\n * ```\n * // Start accumulating events, when the first listener is attached, flush\n * // the event after a timeout such that multiple listeners attached before\n * // the timeout would receive the event\n * this.onInstallExtension = Event.buffer(service.onInstallExtension, true);\n * ```\n */\n function buffer(event, flushAfterTimeout = false, _buffer = []) {\n let buffer = _buffer.slice();\n let listener = event(e => {\n if (buffer) {\n buffer.push(e);\n }\n else {\n emitter.fire(e);\n }\n });\n const flush = () => {\n buffer === null || buffer === void 0 ? void 0 : buffer.forEach(e => emitter.fire(e));\n buffer = null;\n };\n const emitter = new Emitter({\n onWillAddFirstListener() {\n if (!listener) {\n listener = event(e => emitter.fire(e));\n }\n },\n onDidAddFirstListener() {\n if (buffer) {\n if (flushAfterTimeout) {\n setTimeout(flush);\n }\n else {\n flush();\n }\n }\n },\n onDidRemoveLastListener() {\n if (listener) {\n listener.dispose();\n }\n listener = null;\n }\n });\n return emitter.event;\n }\n Event.buffer = buffer;\n class ChainableEvent {\n constructor(event) {\n this.event = event;\n this.disposables = new DisposableStore();\n }\n /** @see {@link Event.map} */\n map(fn) {\n return new ChainableEvent(map(this.event, fn, this.disposables));\n }\n /** @see {@link Event.forEach} */\n forEach(fn) {\n return new ChainableEvent(forEach(this.event, fn, this.disposables));\n }\n filter(fn) {\n return new ChainableEvent(filter(this.event, fn, this.disposables));\n }\n /** @see {@link Event.reduce} */\n reduce(merge, initial) {\n return new ChainableEvent(reduce(this.event, merge, initial, this.disposables));\n }\n /** @see {@link Event.reduce} */\n latch() {\n return new ChainableEvent(latch(this.event, undefined, this.disposables));\n }\n debounce(merge, delay = 100, leading = false, flushOnListenerRemove = false, leakWarningThreshold) {\n return new ChainableEvent(debounce(this.event, merge, delay, leading, flushOnListenerRemove, leakWarningThreshold, this.disposables));\n }\n /**\n * Attach a listener to the event.\n */\n on(listener, thisArgs, disposables) {\n return this.event(listener, thisArgs, disposables);\n }\n /** @see {@link Event.once} */\n once(listener, thisArgs, disposables) {\n return once(this.event)(listener, thisArgs, disposables);\n }\n dispose() {\n this.disposables.dispose();\n }\n }\n /**\n * Wraps the event in an {@link IChainableEvent}, allowing a more functional programming style.\n *\n * @example\n * ```\n * // Normal\n * const onEnterPressNormal = Event.filter(\n * Event.map(onKeyPress.event, e => new StandardKeyboardEvent(e)),\n * e.keyCode === KeyCode.Enter\n * ).event;\n *\n * // Using chain\n * const onEnterPressChain = Event.chain(onKeyPress.event)\n * .map(e => new StandardKeyboardEvent(e))\n * .filter(e => e.keyCode === KeyCode.Enter)\n * .event;\n * ```\n */\n function chain(event) {\n return new ChainableEvent(event);\n }\n Event.chain = chain;\n /**\n * Creates an {@link Event} from a node event emitter.\n */\n function fromNodeEventEmitter(emitter, eventName, map = id => id) {\n const fn = (...args) => result.fire(map(...args));\n const onFirstListenerAdd = () => emitter.on(eventName, fn);\n const onLastListenerRemove = () => emitter.removeListener(eventName, fn);\n const result = new Emitter({ onWillAddFirstListener: onFirstListenerAdd, onDidRemoveLastListener: onLastListenerRemove });\n return result.event;\n }\n Event.fromNodeEventEmitter = fromNodeEventEmitter;\n /**\n * Creates an {@link Event} from a DOM event emitter.\n */\n function fromDOMEventEmitter(emitter, eventName, map = id => id) {\n const fn = (...args) => result.fire(map(...args));\n const onFirstListenerAdd = () => emitter.addEventListener(eventName, fn);\n const onLastListenerRemove = () => emitter.removeEventListener(eventName, fn);\n const result = new Emitter({ onWillAddFirstListener: onFirstListenerAdd, onDidRemoveLastListener: onLastListenerRemove });\n return result.event;\n }\n Event.fromDOMEventEmitter = fromDOMEventEmitter;\n /**\n * Creates a promise out of an event, using the {@link Event.once} helper.\n */\n function toPromise(event) {\n return new Promise(resolve => once(event)(resolve));\n }\n Event.toPromise = toPromise;\n /**\n * Adds a listener to an event and calls the listener immediately with undefined as the event object.\n *\n * @example\n * ```\n * // Initialize the UI and update it when dataChangeEvent fires\n * runAndSubscribe(dataChangeEvent, () => this._updateUI());\n * ```\n */\n function runAndSubscribe(event, handler) {\n handler(undefined);\n return event(e => handler(e));\n }\n Event.runAndSubscribe = runAndSubscribe;\n /**\n * Adds a listener to an event and calls the listener immediately with undefined as the event object. A new\n * {@link DisposableStore} is passed to the listener which is disposed when the returned disposable is disposed.\n */\n function runAndSubscribeWithStore(event, handler) {\n let store = null;\n function run(e) {\n store === null || store === void 0 ? void 0 : store.dispose();\n store = new DisposableStore();\n handler(e, store);\n }\n run(undefined);\n const disposable = event(e => run(e));\n return lifecycle_toDisposable(() => {\n disposable.dispose();\n store === null || store === void 0 ? void 0 : store.dispose();\n });\n }\n Event.runAndSubscribeWithStore = runAndSubscribeWithStore;\n class EmitterObserver {\n constructor(_observable, store) {\n this._observable = _observable;\n this._counter = 0;\n this._hasChanged = false;\n const options = {\n onWillAddFirstListener: () => {\n _observable.addObserver(this);\n },\n onDidRemoveLastListener: () => {\n _observable.removeObserver(this);\n }\n };\n if (!store) {\n _addLeakageTraceLogic(options);\n }\n this.emitter = new Emitter(options);\n if (store) {\n store.add(this.emitter);\n }\n }\n beginUpdate(_observable) {\n // assert(_observable === this.obs);\n this._counter++;\n }\n handlePossibleChange(_observable) {\n // assert(_observable === this.obs);\n }\n handleChange(_observable, _change) {\n // assert(_observable === this.obs);\n this._hasChanged = true;\n }\n endUpdate(_observable) {\n // assert(_observable === this.obs);\n this._counter--;\n if (this._counter === 0) {\n this._observable.reportChanges();\n if (this._hasChanged) {\n this._hasChanged = false;\n this.emitter.fire(this._observable.get());\n }\n }\n }\n }\n /**\n * Creates an event emitter that is fired when the observable changes.\n * Each listeners subscribes to the emitter.\n */\n function fromObservable(obs, store) {\n const observer = new EmitterObserver(obs, store);\n return observer.emitter.event;\n }\n Event.fromObservable = fromObservable;\n /**\n * Each listener is attached to the observable directly.\n */\n function fromObservableLight(observable) {\n return (listener) => {\n let count = 0;\n let didChange = false;\n const observer = {\n beginUpdate() {\n count++;\n },\n endUpdate() {\n count--;\n if (count === 0) {\n observable.reportChanges();\n if (didChange) {\n didChange = false;\n listener();\n }\n }\n },\n handlePossibleChange() {\n // noop\n },\n handleChange() {\n didChange = true;\n }\n };\n observable.addObserver(observer);\n observable.reportChanges();\n return {\n dispose() {\n observable.removeObserver(observer);\n }\n };\n };\n }\n Event.fromObservableLight = fromObservableLight;\n})(Event || (Event = {}));\nclass EventProfiling {\n constructor(name) {\n this.listenerCount = 0;\n this.invocationCount = 0;\n this.elapsedOverall = 0;\n this.durations = [];\n this.name = `${name}_${EventProfiling._idPool++}`;\n EventProfiling.all.add(this);\n }\n start(listenerCount) {\n this._stopWatch = new StopWatch();\n this.listenerCount = listenerCount;\n }\n stop() {\n if (this._stopWatch) {\n const elapsed = this._stopWatch.elapsed();\n this.durations.push(elapsed);\n this.elapsedOverall += elapsed;\n this.invocationCount += 1;\n this._stopWatch = undefined;\n }\n }\n}\nEventProfiling.all = new Set();\nEventProfiling._idPool = 0;\nlet _globalLeakWarningThreshold = -1;\nclass LeakageMonitor {\n constructor(threshold, name = Math.random().toString(18).slice(2, 5)) {\n this.threshold = threshold;\n this.name = name;\n this._warnCountdown = 0;\n }\n dispose() {\n var _a;\n (_a = this._stacks) === null || _a === void 0 ? void 0 : _a.clear();\n }\n check(stack, listenerCount) {\n const threshold = this.threshold;\n if (threshold <= 0 || listenerCount < threshold) {\n return undefined;\n }\n if (!this._stacks) {\n this._stacks = new Map();\n }\n const count = (this._stacks.get(stack.value) || 0);\n this._stacks.set(stack.value, count + 1);\n this._warnCountdown -= 1;\n if (this._warnCountdown <= 0) {\n // only warn on first exceed and then every time the limit\n // is exceeded by 50% again\n this._warnCountdown = threshold * 0.5;\n // find most frequent listener and print warning\n let topStack;\n let topCount = 0;\n for (const [stack, count] of this._stacks) {\n if (!topStack || topCount < count) {\n topStack = stack;\n topCount = count;\n }\n }\n console.warn(`[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`);\n console.warn(topStack);\n }\n return () => {\n const count = (this._stacks.get(stack.value) || 0);\n this._stacks.set(stack.value, count - 1);\n };\n }\n}\nclass Stacktrace {\n static create() {\n var _a;\n return new Stacktrace((_a = new Error().stack) !== null && _a !== void 0 ? _a : '');\n }\n constructor(value) {\n this.value = value;\n }\n print() {\n console.warn(this.value.split('\\n').slice(2).join('\\n'));\n }\n}\nclass UniqueContainer {\n constructor(value) {\n this.value = value;\n }\n}\nconst compactionThreshold = 2;\nconst forEachListener = (listeners, fn) => {\n if (listeners instanceof UniqueContainer) {\n fn(listeners);\n }\n else {\n for (let i = 0; i < listeners.length; i++) {\n const l = listeners[i];\n if (l) {\n fn(l);\n }\n }\n }\n};\n/**\n * The Emitter can be used to expose an Event to the public\n * to fire it from the insides.\n * Sample:\n class Document {\n\n private readonly _onDidChange = new Emitter<(value:string)=>any>();\n\n public onDidChange = this._onDidChange.event;\n\n // getter-style\n // get onDidChange(): Event<(value:string)=>any> {\n // \treturn this._onDidChange.event;\n // }\n\n private _doIt() {\n //...\n this._onDidChange.fire(value);\n }\n }\n */\nclass Emitter {\n constructor(options) {\n var _a, _b, _c, _d, _e;\n this._size = 0;\n this._options = options;\n this._leakageMon = _globalLeakWarningThreshold > 0 || ((_a = this._options) === null || _a === void 0 ? void 0 : _a.leakWarningThreshold) ? new LeakageMonitor((_c = (_b = this._options) === null || _b === void 0 ? void 0 : _b.leakWarningThreshold) !== null && _c !== void 0 ? _c : _globalLeakWarningThreshold) : undefined;\n this._perfMon = ((_d = this._options) === null || _d === void 0 ? void 0 : _d._profName) ? new EventProfiling(this._options._profName) : undefined;\n this._deliveryQueue = (_e = this._options) === null || _e === void 0 ? void 0 : _e.deliveryQueue;\n }\n dispose() {\n var _a, _b, _c, _d;\n if (!this._disposed) {\n this._disposed = true;\n // It is bad to have listeners at the time of disposing an emitter, it is worst to have listeners keep the emitter\n // alive via the reference that's embedded in their disposables. Therefore we loop over all remaining listeners and\n // unset their subscriptions/disposables. Looping and blaming remaining listeners is done on next tick because the\n // the following programming pattern is very popular:\n //\n // const someModel = this._disposables.add(new ModelObject()); // (1) create and register model\n // this._disposables.add(someModel.onDidChange(() => { ... }); // (2) subscribe and register model-event listener\n // ...later...\n // this._disposables.dispose(); disposes (1) then (2): don't warn after (1) but after the \"overall dispose\" is done\n if (((_a = this._deliveryQueue) === null || _a === void 0 ? void 0 : _a.current) === this) {\n this._deliveryQueue.reset();\n }\n if (this._listeners) {\n if (_enableDisposeWithListenerWarning) {\n const listeners = this._listeners;\n queueMicrotask(() => {\n forEachListener(listeners, l => { var _a; return (_a = l.stack) === null || _a === void 0 ? void 0 : _a.print(); });\n });\n }\n this._listeners = undefined;\n this._size = 0;\n }\n (_c = (_b = this._options) === null || _b === void 0 ? void 0 : _b.onDidRemoveLastListener) === null || _c === void 0 ? void 0 : _c.call(_b);\n (_d = this._leakageMon) === null || _d === void 0 ? void 0 : _d.dispose();\n }\n }\n /**\n * For the public to allow to subscribe\n * to events from this Emitter\n */\n get event() {\n var _a;\n (_a = this._event) !== null && _a !== void 0 ? _a : (this._event = (callback, thisArgs, disposables) => {\n var _a, _b, _c, _d, _e;\n if (this._leakageMon && this._size > this._leakageMon.threshold * 3) {\n console.warn(`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far`);\n return lifecycle_Disposable.None;\n }\n if (this._disposed) {\n // todo: should we warn if a listener is added to a disposed emitter? This happens often\n return lifecycle_Disposable.None;\n }\n if (thisArgs) {\n callback = callback.bind(thisArgs);\n }\n const contained = new UniqueContainer(callback);\n let removeMonitor;\n let stack;\n if (this._leakageMon && this._size >= Math.ceil(this._leakageMon.threshold * 0.2)) {\n // check and record this emitter for potential leakage\n contained.stack = Stacktrace.create();\n removeMonitor = this._leakageMon.check(contained.stack, this._size + 1);\n }\n if (_enableDisposeWithListenerWarning) {\n contained.stack = stack !== null && stack !== void 0 ? stack : Stacktrace.create();\n }\n if (!this._listeners) {\n (_b = (_a = this._options) === null || _a === void 0 ? void 0 : _a.onWillAddFirstListener) === null || _b === void 0 ? void 0 : _b.call(_a, this);\n this._listeners = contained;\n (_d = (_c = this._options) === null || _c === void 0 ? void 0 : _c.onDidAddFirstListener) === null || _d === void 0 ? void 0 : _d.call(_c, this);\n }\n else if (this._listeners instanceof UniqueContainer) {\n (_e = this._deliveryQueue) !== null && _e !== void 0 ? _e : (this._deliveryQueue = new EventDeliveryQueuePrivate());\n this._listeners = [this._listeners, contained];\n }\n else {\n this._listeners.push(contained);\n }\n this._size++;\n const result = lifecycle_toDisposable(() => { removeMonitor === null || removeMonitor === void 0 ? void 0 : removeMonitor(); this._removeListener(contained); });\n if (disposables instanceof DisposableStore) {\n disposables.add(result);\n }\n else if (Array.isArray(disposables)) {\n disposables.push(result);\n }\n return result;\n });\n return this._event;\n }\n _removeListener(listener) {\n var _a, _b, _c, _d;\n (_b = (_a = this._options) === null || _a === void 0 ? void 0 : _a.onWillRemoveListener) === null || _b === void 0 ? void 0 : _b.call(_a, this);\n if (!this._listeners) {\n return; // expected if a listener gets disposed\n }\n if (this._size === 1) {\n this._listeners = undefined;\n (_d = (_c = this._options) === null || _c === void 0 ? void 0 : _c.onDidRemoveLastListener) === null || _d === void 0 ? void 0 : _d.call(_c, this);\n this._size = 0;\n return;\n }\n // size > 1 which requires that listeners be a list:\n const listeners = this._listeners;\n const index = listeners.indexOf(listener);\n if (index === -1) {\n console.log('disposed?', this._disposed);\n console.log('size?', this._size);\n console.log('arr?', JSON.stringify(this._listeners));\n throw new Error('Attempted to dispose unknown listener');\n }\n this._size--;\n listeners[index] = undefined;\n const adjustDeliveryQueue = this._deliveryQueue.current === this;\n if (this._size * compactionThreshold <= listeners.length) {\n let n = 0;\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i]) {\n listeners[n++] = listeners[i];\n }\n else if (adjustDeliveryQueue) {\n this._deliveryQueue.end--;\n if (n < this._deliveryQueue.i) {\n this._deliveryQueue.i--;\n }\n }\n }\n listeners.length = n;\n }\n }\n _deliver(listener, value) {\n var _a;\n if (!listener) {\n return;\n }\n const errorHandler = ((_a = this._options) === null || _a === void 0 ? void 0 : _a.onListenerError) || onUnexpectedError;\n if (!errorHandler) {\n listener.value(value);\n return;\n }\n try {\n listener.value(value);\n }\n catch (e) {\n errorHandler(e);\n }\n }\n /** Delivers items in the queue. Assumes the queue is ready to go. */\n _deliverQueue(dq) {\n const listeners = dq.current._listeners;\n while (dq.i < dq.end) {\n // important: dq.i is incremented before calling deliver() because it might reenter deliverQueue()\n this._deliver(listeners[dq.i++], dq.value);\n }\n dq.reset();\n }\n /**\n * To be kept private to fire an event to\n * subscribers\n */\n fire(event) {\n var _a, _b, _c, _d;\n if ((_a = this._deliveryQueue) === null || _a === void 0 ? void 0 : _a.current) {\n this._deliverQueue(this._deliveryQueue);\n (_b = this._perfMon) === null || _b === void 0 ? void 0 : _b.stop(); // last fire() will have starting perfmon, stop it before starting the next dispatch\n }\n (_c = this._perfMon) === null || _c === void 0 ? void 0 : _c.start(this._size);\n if (!this._listeners) {\n // no-op\n }\n else if (this._listeners instanceof UniqueContainer) {\n this._deliver(this._listeners, event);\n }\n else {\n const dq = this._deliveryQueue;\n dq.enqueue(this, event, this._listeners.length);\n this._deliverQueue(dq);\n }\n (_d = this._perfMon) === null || _d === void 0 ? void 0 : _d.stop();\n }\n hasListeners() {\n return this._size > 0;\n }\n}\nconst createEventDeliveryQueue = () => new EventDeliveryQueuePrivate();\nclass EventDeliveryQueuePrivate {\n constructor() {\n /**\n * Index in current's listener list.\n */\n this.i = -1;\n /**\n * The last index in the listener's list to deliver.\n */\n this.end = 0;\n }\n enqueue(emitter, value, end) {\n this.i = 0;\n this.end = end;\n this.current = emitter;\n this.value = value;\n }\n reset() {\n this.i = this.end; // force any current emission loop to stop, mainly for during dispose\n this.current = undefined;\n this.value = undefined;\n }\n}\nclass PauseableEmitter extends (/* unused pure expression or super */ null && (Emitter)) {\n constructor(options) {\n super(options);\n this._isPaused = 0;\n this._eventQueue = new LinkedList();\n this._mergeFn = options === null || options === void 0 ? void 0 : options.merge;\n }\n pause() {\n this._isPaused++;\n }\n resume() {\n if (this._isPaused !== 0 && --this._isPaused === 0) {\n if (this._mergeFn) {\n // use the merge function to create a single composite\n // event. make a copy in case firing pauses this emitter\n if (this._eventQueue.size > 0) {\n const events = Array.from(this._eventQueue);\n this._eventQueue.clear();\n super.fire(this._mergeFn(events));\n }\n }\n else {\n // no merging, fire each event individually and test\n // that this emitter isn't paused halfway through\n while (!this._isPaused && this._eventQueue.size !== 0) {\n super.fire(this._eventQueue.shift());\n }\n }\n }\n }\n fire(event) {\n if (this._size) {\n if (this._isPaused !== 0) {\n this._eventQueue.push(event);\n }\n else {\n super.fire(event);\n }\n }\n }\n}\nclass DebounceEmitter extends (/* unused pure expression or super */ null && (PauseableEmitter)) {\n constructor(options) {\n var _a;\n super(options);\n this._delay = (_a = options.delay) !== null && _a !== void 0 ? _a : 100;\n }\n fire(event) {\n if (!this._handle) {\n this.pause();\n this._handle = setTimeout(() => {\n this._handle = undefined;\n this.resume();\n }, this._delay);\n }\n super.fire(event);\n }\n}\n/**\n * An emitter which queue all events and then process them at the\n * end of the event loop.\n */\nclass MicrotaskEmitter extends (/* unused pure expression or super */ null && (Emitter)) {\n constructor(options) {\n super(options);\n this._queuedEvents = [];\n this._mergeFn = options === null || options === void 0 ? void 0 : options.merge;\n }\n fire(event) {\n if (!this.hasListeners()) {\n return;\n }\n this._queuedEvents.push(event);\n if (this._queuedEvents.length === 1) {\n queueMicrotask(() => {\n if (this._mergeFn) {\n super.fire(this._mergeFn(this._queuedEvents));\n }\n else {\n this._queuedEvents.forEach(e => super.fire(e));\n }\n this._queuedEvents = [];\n });\n }\n }\n}\nclass EventMultiplexer {\n constructor() {\n this.hasListeners = false;\n this.events = [];\n this.emitter = new Emitter({\n onWillAddFirstListener: () => this.onFirstListenerAdd(),\n onDidRemoveLastListener: () => this.onLastListenerRemove()\n });\n }\n get event() {\n return this.emitter.event;\n }\n add(event) {\n const e = { event: event, listener: null };\n this.events.push(e);\n if (this.hasListeners) {\n this.hook(e);\n }\n const dispose = () => {\n if (this.hasListeners) {\n this.unhook(e);\n }\n const idx = this.events.indexOf(e);\n this.events.splice(idx, 1);\n };\n return toDisposable(onceFn(dispose));\n }\n onFirstListenerAdd() {\n this.hasListeners = true;\n this.events.forEach(e => this.hook(e));\n }\n onLastListenerRemove() {\n this.hasListeners = false;\n this.events.forEach(e => this.unhook(e));\n }\n hook(e) {\n e.listener = e.event(r => this.emitter.fire(r));\n }\n unhook(e) {\n if (e.listener) {\n e.listener.dispose();\n }\n e.listener = null;\n }\n dispose() {\n this.emitter.dispose();\n }\n}\n/**\n * The EventBufferer is useful in situations in which you want\n * to delay firing your events during some code.\n * You can wrap that code and be sure that the event will not\n * be fired during that wrap.\n *\n * ```\n * const emitter: Emitter;\n * const delayer = new EventDelayer();\n * const delayedEvent = delayer.wrapEvent(emitter.event);\n *\n * delayedEvent(console.log);\n *\n * delayer.bufferEvents(() => {\n * emitter.fire(); // event will not be fired yet\n * });\n *\n * // event will only be fired at this point\n * ```\n */\nclass EventBufferer {\n constructor() {\n this.buffers = [];\n }\n wrapEvent(event) {\n return (listener, thisArgs, disposables) => {\n return event(i => {\n const buffer = this.buffers[this.buffers.length - 1];\n if (buffer) {\n buffer.push(() => listener.call(thisArgs, i));\n }\n else {\n listener.call(thisArgs, i);\n }\n }, undefined, disposables);\n };\n }\n bufferEvents(fn) {\n const buffer = [];\n this.buffers.push(buffer);\n const r = fn();\n this.buffers.pop();\n buffer.forEach(flush => flush());\n return r;\n }\n}\n/**\n * A Relay is an event forwarder which functions as a replugabble event pipe.\n * Once created, you can connect an input event to it and it will simply forward\n * events from that input event through its own `event` property. The `input`\n * can be changed at any point in time.\n */\nclass Relay {\n constructor() {\n this.listening = false;\n this.inputEvent = Event.None;\n this.inputEventListener = Disposable.None;\n this.emitter = new Emitter({\n onDidAddFirstListener: () => {\n this.listening = true;\n this.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter);\n },\n onDidRemoveLastListener: () => {\n this.listening = false;\n this.inputEventListener.dispose();\n }\n });\n this.event = this.emitter.event;\n }\n set input(event) {\n this.inputEvent = event;\n if (this.listening) {\n this.inputEventListener.dispose();\n this.inputEventListener = event(this.emitter.fire, this.emitter);\n }\n }\n dispose() {\n this.inputEventListener.dispose();\n this.emitter.dispose();\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/objects.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nfunction deepClone(obj) {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n if (obj instanceof RegExp) {\n return obj;\n }\n const result = Array.isArray(obj) ? [] : {};\n Object.entries(obj).forEach(([key, value]) => {\n result[key] = value && typeof value === 'object' ? deepClone(value) : value;\n });\n return result;\n}\nfunction deepFreeze(obj) {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n const stack = [obj];\n while (stack.length > 0) {\n const obj = stack.shift();\n Object.freeze(obj);\n for (const key in obj) {\n if (_hasOwnProperty.call(obj, key)) {\n const prop = obj[key];\n if (typeof prop === 'object' && !Object.isFrozen(prop) && !isTypedArray(prop)) {\n stack.push(prop);\n }\n }\n }\n }\n return obj;\n}\nconst _hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction cloneAndChange(obj, changer) {\n return _cloneAndChange(obj, changer, new Set());\n}\nfunction _cloneAndChange(obj, changer, seen) {\n if (isUndefinedOrNull(obj)) {\n return obj;\n }\n const changed = changer(obj);\n if (typeof changed !== 'undefined') {\n return changed;\n }\n if (Array.isArray(obj)) {\n const r1 = [];\n for (const e of obj) {\n r1.push(_cloneAndChange(e, changer, seen));\n }\n return r1;\n }\n if (isObject(obj)) {\n if (seen.has(obj)) {\n throw new Error('Cannot clone recursive data-structure');\n }\n seen.add(obj);\n const r2 = {};\n for (const i2 in obj) {\n if (_hasOwnProperty.call(obj, i2)) {\n r2[i2] = _cloneAndChange(obj[i2], changer, seen);\n }\n }\n seen.delete(obj);\n return r2;\n }\n return obj;\n}\n/**\n * Copies all properties of source into destination. The optional parameter \"overwrite\" allows to control\n * if existing properties on the destination should be overwritten or not. Defaults to true (overwrite).\n */\nfunction mixin(destination, source, overwrite = true) {\n if (!isObject(destination)) {\n return source;\n }\n if (isObject(source)) {\n Object.keys(source).forEach(key => {\n if (key in destination) {\n if (overwrite) {\n if (isObject(destination[key]) && isObject(source[key])) {\n mixin(destination[key], source[key], overwrite);\n }\n else {\n destination[key] = source[key];\n }\n }\n }\n else {\n destination[key] = source[key];\n }\n });\n }\n return destination;\n}\nfunction objects_equals(one, other) {\n if (one === other) {\n return true;\n }\n if (one === null || one === undefined || other === null || other === undefined) {\n return false;\n }\n if (typeof one !== typeof other) {\n return false;\n }\n if (typeof one !== 'object') {\n return false;\n }\n if ((Array.isArray(one)) !== (Array.isArray(other))) {\n return false;\n }\n let i;\n let key;\n if (Array.isArray(one)) {\n if (one.length !== other.length) {\n return false;\n }\n for (i = 0; i < one.length; i++) {\n if (!objects_equals(one[i], other[i])) {\n return false;\n }\n }\n }\n else {\n const oneKeys = [];\n for (key in one) {\n oneKeys.push(key);\n }\n oneKeys.sort();\n const otherKeys = [];\n for (key in other) {\n otherKeys.push(key);\n }\n otherKeys.sort();\n if (!objects_equals(oneKeys, otherKeys)) {\n return false;\n }\n for (i = 0; i < oneKeys.length; i++) {\n if (!objects_equals(one[oneKeys[i]], other[oneKeys[i]])) {\n return false;\n }\n }\n }\n return true;\n}\nfunction getAllPropertyNames(obj) {\n let res = [];\n while (Object.prototype !== obj) {\n res = res.concat(Object.getOwnPropertyNames(obj));\n obj = Object.getPrototypeOf(obj);\n }\n return res;\n}\nfunction objects_getAllMethodNames(obj) {\n const methods = [];\n for (const prop of getAllPropertyNames(obj)) {\n if (typeof obj[prop] === 'function') {\n methods.push(prop);\n }\n }\n return methods;\n}\nfunction createProxyObject(methodNames, invoke) {\n const createProxyMethod = (method) => {\n return function () {\n const args = Array.prototype.slice.call(arguments, 0);\n return invoke(method, args);\n };\n };\n const result = {};\n for (const methodName of methodNames) {\n result[methodName] = createProxyMethod(methodName);\n }\n return result;\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/nls.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nlet isPseudo = (typeof document !== 'undefined' && document.location && document.location.hash.indexOf('pseudo=true') >= 0);\nconst DEFAULT_TAG = 'i-default';\nfunction _format(message, args) {\n let result;\n if (args.length === 0) {\n result = message;\n }\n else {\n result = message.replace(/\\{(\\d+)\\}/g, (match, rest) => {\n const index = rest[0];\n const arg = args[index];\n let result = match;\n if (typeof arg === 'string') {\n result = arg;\n }\n else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) {\n result = String(arg);\n }\n return result;\n });\n }\n if (isPseudo) {\n // FF3B and FF3D is the Unicode zenkaku representation for [ and ]\n result = '\\uFF3B' + result.replace(/[aouei]/g, '$&$&') + '\\uFF3D';\n }\n return result;\n}\nfunction findLanguageForModule(config, name) {\n let result = config[name];\n if (result) {\n return result;\n }\n result = config['*'];\n if (result) {\n return result;\n }\n return null;\n}\nfunction endWithSlash(path) {\n if (path.charAt(path.length - 1) === '/') {\n return path;\n }\n return path + '/';\n}\nfunction getMessagesFromTranslationsService(translationServiceUrl, language, name) {\n return __awaiter(this, void 0, void 0, function* () {\n const url = endWithSlash(translationServiceUrl) + endWithSlash(language) + 'vscode/' + endWithSlash(name);\n const res = yield fetch(url);\n if (res.ok) {\n const messages = yield res.json();\n return messages;\n }\n throw new Error(`${res.status} - ${res.statusText}`);\n });\n}\nfunction createScopedLocalize(scope) {\n return function (idx, defaultValue) {\n const restArgs = Array.prototype.slice.call(arguments, 2);\n return _format(scope[idx], restArgs);\n };\n}\n/**\n * @skipMangle\n */\nfunction nls_localize(data, message, ...args) {\n return _format(message, args);\n}\n/**\n * @skipMangle\n */\nfunction getConfiguredDefaultLocale(_) {\n // This returns undefined because this implementation isn't used and is overwritten by the loader\n // when loaded.\n return undefined;\n}\n/**\n * @skipMangle\n */\nfunction setPseudoTranslation(value) {\n isPseudo = value;\n}\n/**\n * Invoked in a built product at run-time\n * @skipMangle\n */\nfunction create(key, data) {\n var _a;\n return {\n localize: createScopedLocalize(data[key]),\n getConfiguredDefaultLocale: (_a = data.getConfiguredDefaultLocale) !== null && _a !== void 0 ? _a : ((_) => undefined)\n };\n}\n/**\n * Invoked by the loader at run-time\n * @skipMangle\n */\nfunction load(name, req, load, config) {\n var _a;\n const pluginConfig = (_a = config['vs/nls']) !== null && _a !== void 0 ? _a : {};\n if (!name || name.length === 0) {\n // TODO: We need to give back the mangled names here\n return load({\n localize: nls_localize,\n getConfiguredDefaultLocale: () => { var _a; return (_a = pluginConfig.availableLanguages) === null || _a === void 0 ? void 0 : _a['*']; }\n });\n }\n const language = pluginConfig.availableLanguages ? findLanguageForModule(pluginConfig.availableLanguages, name) : null;\n const useDefaultLanguage = language === null || language === DEFAULT_TAG;\n let suffix = '.nls';\n if (!useDefaultLanguage) {\n suffix = suffix + '.' + language;\n }\n const messagesLoaded = (messages) => {\n if (Array.isArray(messages)) {\n messages.localize = createScopedLocalize(messages);\n }\n else {\n messages.localize = createScopedLocalize(messages[name]);\n }\n messages.getConfiguredDefaultLocale = () => { var _a; return (_a = pluginConfig.availableLanguages) === null || _a === void 0 ? void 0 : _a['*']; };\n load(messages);\n };\n if (typeof pluginConfig.loadBundle === 'function') {\n pluginConfig.loadBundle(name, language, (err, messages) => {\n // We have an error. Load the English default strings to not fail\n if (err) {\n req([name + '.nls'], messagesLoaded);\n }\n else {\n messagesLoaded(messages);\n }\n });\n }\n else if (pluginConfig.translationServiceUrl && !useDefaultLanguage) {\n (() => __awaiter(this, void 0, void 0, function* () {\n var _b;\n try {\n const messages = yield getMessagesFromTranslationsService(pluginConfig.translationServiceUrl, language, name);\n return messagesLoaded(messages);\n }\n catch (err) {\n // Language is already as generic as it gets, so require default messages\n if (!language.includes('-')) {\n console.error(err);\n return req([name + '.nls'], messagesLoaded);\n }\n try {\n // Since there is a dash, the language configured is a specific sub-language of the same generic language.\n // Since we were unable to load the specific language, try to load the generic language. Ex. we failed to find a\n // Swiss German (de-CH), so try to load the generic German (de) messages instead.\n const genericLanguage = language.split('-')[0];\n const messages = yield getMessagesFromTranslationsService(pluginConfig.translationServiceUrl, genericLanguage, name);\n // We got some messages, so we configure the configuration to use the generic language for this session.\n (_b = pluginConfig.availableLanguages) !== null && _b !== void 0 ? _b : (pluginConfig.availableLanguages = {});\n pluginConfig.availableLanguages['*'] = genericLanguage;\n return messagesLoaded(messages);\n }\n catch (err) {\n console.error(err);\n return req([name + '.nls'], messagesLoaded);\n }\n }\n }))();\n }\n else {\n req([name + suffix], messagesLoaded, (err) => {\n if (suffix === '.nls') {\n console.error('Failed trying to load default language strings', err);\n return;\n }\n console.error(`Failed to load message bundle for language ${language}. Falling back to the default language:`, err);\n req([name + '.nls'], messagesLoaded);\n });\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/platform.js\nvar _a;\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nconst LANGUAGE_DEFAULT = 'en';\nlet _isWindows = false;\nlet _isMacintosh = false;\nlet _isLinux = false;\nlet _isLinuxSnap = false;\nlet _isNative = false;\nlet _isWeb = false;\nlet _isElectron = false;\nlet _isIOS = false;\nlet _isCI = false;\nlet _isMobile = false;\nlet _locale = undefined;\nlet _language = (/* unused pure expression or super */ null && (LANGUAGE_DEFAULT));\nlet _platformLocale = (/* unused pure expression or super */ null && (LANGUAGE_DEFAULT));\nlet _translationsConfigFile = (/* unused pure expression or super */ null && (undefined));\nlet _userAgent = undefined;\n/**\n * @deprecated use `globalThis` instead\n */\nconst globals = (typeof self === 'object' ? self : typeof __webpack_require__.g === 'object' ? __webpack_require__.g : {});\nlet nodeProcess = undefined;\nif (typeof globals.vscode !== 'undefined' && typeof globals.vscode.process !== 'undefined') {\n // Native environment (sandboxed)\n nodeProcess = globals.vscode.process;\n}\nelse if (typeof process !== 'undefined') {\n // Native environment (non-sandboxed)\n nodeProcess = process;\n}\nconst isElectronProcess = typeof ((_a = nodeProcess === null || nodeProcess === void 0 ? void 0 : nodeProcess.versions) === null || _a === void 0 ? void 0 : _a.electron) === 'string';\nconst isElectronRenderer = isElectronProcess && (nodeProcess === null || nodeProcess === void 0 ? void 0 : nodeProcess.type) === 'renderer';\n// Web environment\nif (typeof navigator === 'object' && !isElectronRenderer) {\n _userAgent = navigator.userAgent;\n _isWindows = _userAgent.indexOf('Windows') >= 0;\n _isMacintosh = _userAgent.indexOf('Macintosh') >= 0;\n _isIOS = (_userAgent.indexOf('Macintosh') >= 0 || _userAgent.indexOf('iPad') >= 0 || _userAgent.indexOf('iPhone') >= 0) && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0;\n _isLinux = _userAgent.indexOf('Linux') >= 0;\n _isMobile = (_userAgent === null || _userAgent === void 0 ? void 0 : _userAgent.indexOf('Mobi')) >= 0;\n _isWeb = true;\n const configuredLocale = getConfiguredDefaultLocale(\n // This call _must_ be done in the file that calls `nls.getConfiguredDefaultLocale`\n // to ensure that the NLS AMD Loader plugin has been loaded and configured.\n // This is because the loader plugin decides what the default locale is based on\n // how it's able to resolve the strings.\n nls_localize({ key: 'ensureLoaderPluginIsLoaded', comment: ['{Locked}'] }, '_'));\n _locale = configuredLocale || LANGUAGE_DEFAULT;\n _language = _locale;\n _platformLocale = navigator.language;\n}\n// Native environment\nelse if (typeof nodeProcess === 'object') {\n _isWindows = (nodeProcess.platform === 'win32');\n _isMacintosh = (nodeProcess.platform === 'darwin');\n _isLinux = (nodeProcess.platform === 'linux');\n _isLinuxSnap = _isLinux && !!nodeProcess.env['SNAP'] && !!nodeProcess.env['SNAP_REVISION'];\n _isElectron = isElectronProcess;\n _isCI = !!nodeProcess.env['CI'] || !!nodeProcess.env['BUILD_ARTIFACTSTAGINGDIRECTORY'];\n _locale = LANGUAGE_DEFAULT;\n _language = LANGUAGE_DEFAULT;\n const rawNlsConfig = nodeProcess.env['VSCODE_NLS_CONFIG'];\n if (rawNlsConfig) {\n try {\n const nlsConfig = JSON.parse(rawNlsConfig);\n const resolved = nlsConfig.availableLanguages['*'];\n _locale = nlsConfig.locale;\n _platformLocale = nlsConfig.osLocale;\n // VSCode's default language is 'en'\n _language = resolved ? resolved : LANGUAGE_DEFAULT;\n _translationsConfigFile = nlsConfig._translationsConfigFile;\n }\n catch (e) {\n }\n }\n _isNative = true;\n}\n// Unknown environment\nelse {\n console.error('Unable to resolve platform.');\n}\nlet _platform = 0 /* Platform.Web */;\nif (_isMacintosh) {\n _platform = 1 /* Platform.Mac */;\n}\nelse if (_isWindows) {\n _platform = 3 /* Platform.Windows */;\n}\nelse if (_isLinux) {\n _platform = 2 /* Platform.Linux */;\n}\nconst isWindows = _isWindows;\nconst isMacintosh = _isMacintosh;\nconst isLinux = (/* unused pure expression or super */ null && (_isLinux));\nconst isNative = (/* unused pure expression or super */ null && (_isNative));\nconst platform_isWeb = (/* unused pure expression or super */ null && (_isWeb));\nconst isWebWorker = (_isWeb && typeof globals.importScripts === 'function');\nconst isIOS = (/* unused pure expression or super */ null && (_isIOS));\nconst isMobile = (/* unused pure expression or super */ null && (_isMobile));\nconst userAgent = _userAgent;\n/**\n * The language used for the user interface. The format of\n * the string is all lower case (e.g. zh-tw for Traditional\n * Chinese)\n */\nconst language = (/* unused pure expression or super */ null && (_language));\nconst setTimeout0IsFaster = (typeof globals.postMessage === 'function' && !globals.importScripts);\n/**\n * See https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#:~:text=than%204%2C%20then-,set%20timeout%20to%204,-.\n *\n * Works similarly to `setTimeout(0)` but doesn't suffer from the 4ms artificial delay\n * that browsers set when the nesting level is > 5.\n */\nconst setTimeout0 = (() => {\n if (setTimeout0IsFaster) {\n const pending = [];\n globals.addEventListener('message', (e) => {\n if (e.data && e.data.vscodeScheduleAsyncWork) {\n for (let i = 0, len = pending.length; i < len; i++) {\n const candidate = pending[i];\n if (candidate.id === e.data.vscodeScheduleAsyncWork) {\n pending.splice(i, 1);\n candidate.callback();\n return;\n }\n }\n }\n });\n let lastId = 0;\n return (callback) => {\n const myId = ++lastId;\n pending.push({\n id: myId,\n callback: callback\n });\n globals.postMessage({ vscodeScheduleAsyncWork: myId }, '*');\n };\n }\n return (callback) => setTimeout(callback);\n})();\nconst OS = ((/* unused pure expression or super */ null && (_isMacintosh || _isIOS ? 2 /* OperatingSystem.Macintosh */ : (_isWindows ? 1 /* OperatingSystem.Windows */ : 3 /* OperatingSystem.Linux */))));\nlet _isLittleEndian = true;\nlet _isLittleEndianComputed = false;\nfunction isLittleEndian() {\n if (!_isLittleEndianComputed) {\n _isLittleEndianComputed = true;\n const test = new Uint8Array(2);\n test[0] = 1;\n test[1] = 2;\n const view = new Uint16Array(test.buffer);\n _isLittleEndian = (view[0] === (2 << 8) + 1);\n }\n return _isLittleEndian;\n}\nconst isChrome = !!(userAgent && userAgent.indexOf('Chrome') >= 0);\nconst isFirefox = !!(userAgent && userAgent.indexOf('Firefox') >= 0);\nconst isSafari = !!(!isChrome && (userAgent && userAgent.indexOf('Safari') >= 0));\nconst isEdge = !!(userAgent && userAgent.indexOf('Edg/') >= 0);\nconst isAndroid = !!(userAgent && userAgent.indexOf('Android') >= 0);\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/cache.js\n/**\n * Uses a LRU cache to make a given parametrized function cached.\n * Caches just the last value.\n * The key must be JSON serializable.\n*/\nclass LRUCachedFunction {\n constructor(fn) {\n this.fn = fn;\n this.lastCache = undefined;\n this.lastArgKey = undefined;\n }\n get(arg) {\n const key = JSON.stringify(arg);\n if (this.lastArgKey !== key) {\n this.lastArgKey = key;\n this.lastCache = this.fn(arg);\n }\n return this.lastCache;\n }\n}\n/**\n * Uses an unbounded cache (referential equality) to memoize the results of the given function.\n*/\nclass CachedFunction {\n get cachedValues() {\n return this._map;\n }\n constructor(fn) {\n this.fn = fn;\n this._map = new Map();\n }\n get(arg) {\n if (this._map.has(arg)) {\n return this._map.get(arg);\n }\n const value = this.fn(arg);\n this._map.set(arg, value);\n return value;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/lazy.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nclass Lazy {\n constructor(executor) {\n this.executor = executor;\n this._didRun = false;\n }\n /**\n * Get the wrapped value.\n *\n * This will force evaluation of the lazy value if it has not been resolved yet. Lazy values are only\n * resolved once. `getValue` will re-throw exceptions that are hit while resolving the value\n */\n get value() {\n if (!this._didRun) {\n try {\n this._value = this.executor();\n }\n catch (err) {\n this._error = err;\n }\n finally {\n this._didRun = true;\n }\n }\n if (this._error) {\n throw this._error;\n }\n return this._value;\n }\n /**\n * Get the wrapped value without forcing evaluation.\n */\n get rawValue() { return this._value; }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/strings.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar strings_a;\n\n\nfunction isFalsyOrWhitespace(str) {\n if (!str || typeof str !== 'string') {\n return true;\n }\n return str.trim().length === 0;\n}\nconst _formatRegexp = /{(\\d+)}/g;\n/**\n * Helper to produce a string with a variable number of arguments. Insert variable segments\n * into the string using the {n} notation where N is the index of the argument following the string.\n * @param value string to which formatting is applied\n * @param args replacements for {n}-entries\n */\nfunction format(value, ...args) {\n if (args.length === 0) {\n return value;\n }\n return value.replace(_formatRegexp, function (match, group) {\n const idx = parseInt(group, 10);\n return isNaN(idx) || idx < 0 || idx >= args.length ?\n match :\n args[idx];\n });\n}\n/**\n * Converts HTML characters inside the string to use entities instead. Makes the string safe from\n * being used e.g. in HTMLElement.innerHTML.\n */\nfunction strings_escape(html) {\n return html.replace(/[<>&]/g, function (match) {\n switch (match) {\n case '<': return '&lt;';\n case '>': return '&gt;';\n case '&': return '&amp;';\n default: return match;\n }\n });\n}\n/**\n * Escapes regular expression characters in a given string\n */\nfunction escapeRegExpCharacters(value) {\n return value.replace(/[\\\\\\{\\}\\*\\+\\?\\|\\^\\$\\.\\[\\]\\(\\)]/g, '\\\\$&');\n}\n/**\n * Removes all occurrences of needle from the beginning and end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim (default is a blank)\n */\nfunction trim(haystack, needle = ' ') {\n const trimmed = ltrim(haystack, needle);\n return rtrim(trimmed, needle);\n}\n/**\n * Removes all occurrences of needle from the beginning of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nfunction ltrim(haystack, needle) {\n if (!haystack || !needle) {\n return haystack;\n }\n const needleLen = needle.length;\n if (needleLen === 0 || haystack.length === 0) {\n return haystack;\n }\n let offset = 0;\n while (haystack.indexOf(needle, offset) === offset) {\n offset = offset + needleLen;\n }\n return haystack.substring(offset);\n}\n/**\n * Removes all occurrences of needle from the end of haystack.\n * @param haystack string to trim\n * @param needle the thing to trim\n */\nfunction rtrim(haystack, needle) {\n if (!haystack || !needle) {\n return haystack;\n }\n const needleLen = needle.length, haystackLen = haystack.length;\n if (needleLen === 0 || haystackLen === 0) {\n return haystack;\n }\n let offset = haystackLen, idx = -1;\n while (true) {\n idx = haystack.lastIndexOf(needle, offset - 1);\n if (idx === -1 || idx + needleLen !== offset) {\n break;\n }\n if (idx === 0) {\n return '';\n }\n offset = idx;\n }\n return haystack.substring(0, offset);\n}\nfunction convertSimple2RegExpPattern(pattern) {\n return pattern.replace(/[\\-\\\\\\{\\}\\+\\?\\|\\^\\$\\.\\,\\[\\]\\(\\)\\#\\s]/g, '\\\\$&').replace(/[\\*]/g, '.*');\n}\nfunction stripWildcards(pattern) {\n return pattern.replace(/\\*/g, '');\n}\nfunction createRegExp(searchString, isRegex, options = {}) {\n if (!searchString) {\n throw new Error('Cannot create regex from empty string');\n }\n if (!isRegex) {\n searchString = escapeRegExpCharacters(searchString);\n }\n if (options.wholeWord) {\n if (!/\\B/.test(searchString.charAt(0))) {\n searchString = '\\\\b' + searchString;\n }\n if (!/\\B/.test(searchString.charAt(searchString.length - 1))) {\n searchString = searchString + '\\\\b';\n }\n }\n let modifiers = '';\n if (options.global) {\n modifiers += 'g';\n }\n if (!options.matchCase) {\n modifiers += 'i';\n }\n if (options.multiline) {\n modifiers += 'm';\n }\n if (options.unicode) {\n modifiers += 'u';\n }\n return new RegExp(searchString, modifiers);\n}\nfunction regExpLeadsToEndlessLoop(regexp) {\n // Exit early if it's one of these special cases which are meant to match\n // against an empty string\n if (regexp.source === '^' || regexp.source === '^$' || regexp.source === '$' || regexp.source === '^\\\\s*$') {\n return false;\n }\n // We check against an empty string. If the regular expression doesn't advance\n // (e.g. ends in an endless loop) it will match an empty string.\n const match = regexp.exec('');\n return !!(match && regexp.lastIndex === 0);\n}\nfunction regExpFlags(regexp) {\n return (regexp.global ? 'g' : '')\n + (regexp.ignoreCase ? 'i' : '')\n + (regexp.multiline ? 'm' : '')\n + (regexp /* standalone editor compilation */.unicode ? 'u' : '');\n}\nfunction splitLines(str) {\n return str.split(/\\r\\n|\\r|\\n/);\n}\n/**\n * Returns first index of the string that is not whitespace.\n * If string is empty or contains only whitespaces, returns -1\n */\nfunction firstNonWhitespaceIndex(str) {\n for (let i = 0, len = str.length; i < len; i++) {\n const chCode = str.charCodeAt(i);\n if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n return i;\n }\n }\n return -1;\n}\n/**\n * Returns the leading whitespace of the string.\n * If the string contains only whitespaces, returns entire string\n */\nfunction getLeadingWhitespace(str, start = 0, end = str.length) {\n for (let i = start; i < end; i++) {\n const chCode = str.charCodeAt(i);\n if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n return str.substring(start, i);\n }\n }\n return str.substring(start, end);\n}\n/**\n * Returns last index of the string that is not whitespace.\n * If string is empty or contains only whitespaces, returns -1\n */\nfunction lastNonWhitespaceIndex(str, startIndex = str.length - 1) {\n for (let i = startIndex; i >= 0; i--) {\n const chCode = str.charCodeAt(i);\n if (chCode !== 32 /* CharCode.Space */ && chCode !== 9 /* CharCode.Tab */) {\n return i;\n }\n }\n return -1;\n}\nfunction compare(a, b) {\n if (a < b) {\n return -1;\n }\n else if (a > b) {\n return 1;\n }\n else {\n return 0;\n }\n}\nfunction compareSubstring(a, b, aStart = 0, aEnd = a.length, bStart = 0, bEnd = b.length) {\n for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) {\n const codeA = a.charCodeAt(aStart);\n const codeB = b.charCodeAt(bStart);\n if (codeA < codeB) {\n return -1;\n }\n else if (codeA > codeB) {\n return 1;\n }\n }\n const aLen = aEnd - aStart;\n const bLen = bEnd - bStart;\n if (aLen < bLen) {\n return -1;\n }\n else if (aLen > bLen) {\n return 1;\n }\n return 0;\n}\nfunction compareIgnoreCase(a, b) {\n return compareSubstringIgnoreCase(a, b, 0, a.length, 0, b.length);\n}\nfunction compareSubstringIgnoreCase(a, b, aStart = 0, aEnd = a.length, bStart = 0, bEnd = b.length) {\n for (; aStart < aEnd && bStart < bEnd; aStart++, bStart++) {\n let codeA = a.charCodeAt(aStart);\n let codeB = b.charCodeAt(bStart);\n if (codeA === codeB) {\n // equal\n continue;\n }\n if (codeA >= 128 || codeB >= 128) {\n // not ASCII letters -> fallback to lower-casing strings\n return compareSubstring(a.toLowerCase(), b.toLowerCase(), aStart, aEnd, bStart, bEnd);\n }\n // mapper lower-case ascii letter onto upper-case varinats\n // [97-122] (lower ascii) --> [65-90] (upper ascii)\n if (isLowerAsciiLetter(codeA)) {\n codeA -= 32;\n }\n if (isLowerAsciiLetter(codeB)) {\n codeB -= 32;\n }\n // compare both code points\n const diff = codeA - codeB;\n if (diff === 0) {\n continue;\n }\n return diff;\n }\n const aLen = aEnd - aStart;\n const bLen = bEnd - bStart;\n if (aLen < bLen) {\n return -1;\n }\n else if (aLen > bLen) {\n return 1;\n }\n return 0;\n}\nfunction isAsciiDigit(code) {\n return code >= 48 /* CharCode.Digit0 */ && code <= 57 /* CharCode.Digit9 */;\n}\nfunction isLowerAsciiLetter(code) {\n return code >= 97 /* CharCode.a */ && code <= 122 /* CharCode.z */;\n}\nfunction isUpperAsciiLetter(code) {\n return code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */;\n}\nfunction equalsIgnoreCase(a, b) {\n return a.length === b.length && compareSubstringIgnoreCase(a, b) === 0;\n}\nfunction startsWithIgnoreCase(str, candidate) {\n const candidateLength = candidate.length;\n if (candidate.length > str.length) {\n return false;\n }\n return compareSubstringIgnoreCase(str, candidate, 0, candidateLength) === 0;\n}\n/**\n * @returns the length of the common prefix of the two strings.\n */\nfunction commonPrefixLength(a, b) {\n const len = Math.min(a.length, b.length);\n let i;\n for (i = 0; i < len; i++) {\n if (a.charCodeAt(i) !== b.charCodeAt(i)) {\n return i;\n }\n }\n return len;\n}\n/**\n * @returns the length of the common suffix of the two strings.\n */\nfunction commonSuffixLength(a, b) {\n const len = Math.min(a.length, b.length);\n let i;\n const aLastIndex = a.length - 1;\n const bLastIndex = b.length - 1;\n for (i = 0; i < len; i++) {\n if (a.charCodeAt(aLastIndex - i) !== b.charCodeAt(bLastIndex - i)) {\n return i;\n }\n }\n return len;\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nfunction isHighSurrogate(charCode) {\n return (0xD800 <= charCode && charCode <= 0xDBFF);\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nfunction isLowSurrogate(charCode) {\n return (0xDC00 <= charCode && charCode <= 0xDFFF);\n}\n/**\n * See http://en.wikipedia.org/wiki/Surrogate_pair\n */\nfunction computeCodePoint(highSurrogate, lowSurrogate) {\n return ((highSurrogate - 0xD800) << 10) + (lowSurrogate - 0xDC00) + 0x10000;\n}\n/**\n * get the code point that begins at offset `offset`\n */\nfunction getNextCodePoint(str, len, offset) {\n const charCode = str.charCodeAt(offset);\n if (isHighSurrogate(charCode) && offset + 1 < len) {\n const nextCharCode = str.charCodeAt(offset + 1);\n if (isLowSurrogate(nextCharCode)) {\n return computeCodePoint(charCode, nextCharCode);\n }\n }\n return charCode;\n}\n/**\n * get the code point that ends right before offset `offset`\n */\nfunction getPrevCodePoint(str, offset) {\n const charCode = str.charCodeAt(offset - 1);\n if (isLowSurrogate(charCode) && offset > 1) {\n const prevCharCode = str.charCodeAt(offset - 2);\n if (isHighSurrogate(prevCharCode)) {\n return computeCodePoint(prevCharCode, charCode);\n }\n }\n return charCode;\n}\nclass CodePointIterator {\n get offset() {\n return this._offset;\n }\n constructor(str, offset = 0) {\n this._str = str;\n this._len = str.length;\n this._offset = offset;\n }\n setOffset(offset) {\n this._offset = offset;\n }\n prevCodePoint() {\n const codePoint = getPrevCodePoint(this._str, this._offset);\n this._offset -= (codePoint >= 65536 /* Constants.UNICODE_SUPPLEMENTARY_PLANE_BEGIN */ ? 2 : 1);\n return codePoint;\n }\n nextCodePoint() {\n const codePoint = getNextCodePoint(this._str, this._len, this._offset);\n this._offset += (codePoint >= 65536 /* Constants.UNICODE_SUPPLEMENTARY_PLANE_BEGIN */ ? 2 : 1);\n return codePoint;\n }\n eol() {\n return (this._offset >= this._len);\n }\n}\nclass GraphemeIterator {\n get offset() {\n return this._iterator.offset;\n }\n constructor(str, offset = 0) {\n this._iterator = new CodePointIterator(str, offset);\n }\n nextGraphemeLength() {\n const graphemeBreakTree = GraphemeBreakTree.getInstance();\n const iterator = this._iterator;\n const initialOffset = iterator.offset;\n let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint());\n while (!iterator.eol()) {\n const offset = iterator.offset;\n const nextGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.nextCodePoint());\n if (breakBetweenGraphemeBreakType(graphemeBreakType, nextGraphemeBreakType)) {\n // move iterator back\n iterator.setOffset(offset);\n break;\n }\n graphemeBreakType = nextGraphemeBreakType;\n }\n return (iterator.offset - initialOffset);\n }\n prevGraphemeLength() {\n const graphemeBreakTree = GraphemeBreakTree.getInstance();\n const iterator = this._iterator;\n const initialOffset = iterator.offset;\n let graphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint());\n while (iterator.offset > 0) {\n const offset = iterator.offset;\n const prevGraphemeBreakType = graphemeBreakTree.getGraphemeBreakType(iterator.prevCodePoint());\n if (breakBetweenGraphemeBreakType(prevGraphemeBreakType, graphemeBreakType)) {\n // move iterator back\n iterator.setOffset(offset);\n break;\n }\n graphemeBreakType = prevGraphemeBreakType;\n }\n return (initialOffset - iterator.offset);\n }\n eol() {\n return this._iterator.eol();\n }\n}\nfunction nextCharLength(str, initialOffset) {\n const iterator = new GraphemeIterator(str, initialOffset);\n return iterator.nextGraphemeLength();\n}\nfunction prevCharLength(str, initialOffset) {\n const iterator = new GraphemeIterator(str, initialOffset);\n return iterator.prevGraphemeLength();\n}\nfunction getCharContainingOffset(str, offset) {\n if (offset > 0 && isLowSurrogate(str.charCodeAt(offset))) {\n offset--;\n }\n const endOffset = offset + nextCharLength(str, offset);\n const startOffset = endOffset - prevCharLength(str, endOffset);\n return [startOffset, endOffset];\n}\nlet CONTAINS_RTL = (/* unused pure expression or super */ null && (undefined));\nfunction makeContainsRtl() {\n // Generated using https://github.com/alexdima/unicode-utils/blob/main/rtl-test.js\n return /(?:[\\u05BE\\u05C0\\u05C3\\u05C6\\u05D0-\\u05F4\\u0608\\u060B\\u060D\\u061B-\\u064A\\u066D-\\u066F\\u0671-\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1-\\u07EA\\u07F4\\u07F5\\u07FA\\u07FE-\\u0815\\u081A\\u0824\\u0828\\u0830-\\u0858\\u085E-\\u088E\\u08A0-\\u08C9\\u200F\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFD3D\\uFD50-\\uFDC7\\uFDF0-\\uFDFC\\uFE70-\\uFEFC]|\\uD802[\\uDC00-\\uDD1B\\uDD20-\\uDE00\\uDE10-\\uDE35\\uDE40-\\uDEE4\\uDEEB-\\uDF35\\uDF40-\\uDFFF]|\\uD803[\\uDC00-\\uDD23\\uDE80-\\uDEA9\\uDEAD-\\uDF45\\uDF51-\\uDF81\\uDF86-\\uDFF6]|\\uD83A[\\uDC00-\\uDCCF\\uDD00-\\uDD43\\uDD4B-\\uDFFF]|\\uD83B[\\uDC00-\\uDEBB])/;\n}\n/**\n * Returns true if `str` contains any Unicode character that is classified as \"R\" or \"AL\".\n */\nfunction containsRTL(str) {\n if (!CONTAINS_RTL) {\n CONTAINS_RTL = makeContainsRtl();\n }\n return CONTAINS_RTL.test(str);\n}\nconst IS_BASIC_ASCII = /^[\\t\\n\\r\\x20-\\x7E]*$/;\n/**\n * Returns true if `str` contains only basic ASCII characters in the range 32 - 126 (including 32 and 126) or \\n, \\r, \\t\n */\nfunction strings_isBasicASCII(str) {\n return IS_BASIC_ASCII.test(str);\n}\nconst UNUSUAL_LINE_TERMINATORS = /[\\u2028\\u2029]/; // LINE SEPARATOR (LS) or PARAGRAPH SEPARATOR (PS)\n/**\n * Returns true if `str` contains unusual line terminators, like LS or PS\n */\nfunction containsUnusualLineTerminators(str) {\n return UNUSUAL_LINE_TERMINATORS.test(str);\n}\nfunction isFullWidthCharacter(charCode) {\n // Do a cheap trick to better support wrapping of wide characters, treat them as 2 columns\n // http://jrgraphix.net/research/unicode_blocks.php\n // 2E80 - 2EFF CJK Radicals Supplement\n // 2F00 - 2FDF Kangxi Radicals\n // 2FF0 - 2FFF Ideographic Description Characters\n // 3000 - 303F CJK Symbols and Punctuation\n // 3040 - 309F Hiragana\n // 30A0 - 30FF Katakana\n // 3100 - 312F Bopomofo\n // 3130 - 318F Hangul Compatibility Jamo\n // 3190 - 319F Kanbun\n // 31A0 - 31BF Bopomofo Extended\n // 31F0 - 31FF Katakana Phonetic Extensions\n // 3200 - 32FF Enclosed CJK Letters and Months\n // 3300 - 33FF CJK Compatibility\n // 3400 - 4DBF CJK Unified Ideographs Extension A\n // 4DC0 - 4DFF Yijing Hexagram Symbols\n // 4E00 - 9FFF CJK Unified Ideographs\n // A000 - A48F Yi Syllables\n // A490 - A4CF Yi Radicals\n // AC00 - D7AF Hangul Syllables\n // [IGNORE] D800 - DB7F High Surrogates\n // [IGNORE] DB80 - DBFF High Private Use Surrogates\n // [IGNORE] DC00 - DFFF Low Surrogates\n // [IGNORE] E000 - F8FF Private Use Area\n // F900 - FAFF CJK Compatibility Ideographs\n // [IGNORE] FB00 - FB4F Alphabetic Presentation Forms\n // [IGNORE] FB50 - FDFF Arabic Presentation Forms-A\n // [IGNORE] FE00 - FE0F Variation Selectors\n // [IGNORE] FE20 - FE2F Combining Half Marks\n // [IGNORE] FE30 - FE4F CJK Compatibility Forms\n // [IGNORE] FE50 - FE6F Small Form Variants\n // [IGNORE] FE70 - FEFF Arabic Presentation Forms-B\n // FF00 - FFEF Halfwidth and Fullwidth Forms\n // [https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms]\n // of which FF01 - FF5E fullwidth ASCII of 21 to 7E\n // [IGNORE] and FF65 - FFDC halfwidth of Katakana and Hangul\n // [IGNORE] FFF0 - FFFF Specials\n return ((charCode >= 0x2E80 && charCode <= 0xD7AF)\n || (charCode >= 0xF900 && charCode <= 0xFAFF)\n || (charCode >= 0xFF01 && charCode <= 0xFF5E));\n}\n/**\n * A fast function (therefore imprecise) to check if code points are emojis.\n * Generated using https://github.com/alexdima/unicode-utils/blob/main/emoji-test.js\n */\nfunction isEmojiImprecise(x) {\n return ((x >= 0x1F1E6 && x <= 0x1F1FF) || (x === 8986) || (x === 8987) || (x === 9200)\n || (x === 9203) || (x >= 9728 && x <= 10175) || (x === 11088) || (x === 11093)\n || (x >= 127744 && x <= 128591) || (x >= 128640 && x <= 128764)\n || (x >= 128992 && x <= 129008) || (x >= 129280 && x <= 129535)\n || (x >= 129648 && x <= 129782));\n}\n// -- UTF-8 BOM\nconst UTF8_BOM_CHARACTER = String.fromCharCode(65279 /* CharCode.UTF8_BOM */);\nfunction startsWithUTF8BOM(str) {\n return !!(str && str.length > 0 && str.charCodeAt(0) === 65279 /* CharCode.UTF8_BOM */);\n}\nfunction containsUppercaseCharacter(target, ignoreEscapedChars = false) {\n if (!target) {\n return false;\n }\n if (ignoreEscapedChars) {\n target = target.replace(/\\\\./g, '');\n }\n return target.toLowerCase() !== target;\n}\n/**\n * Produces 'a'-'z', followed by 'A'-'Z'... followed by 'a'-'z', etc.\n */\nfunction singleLetterHash(n) {\n const LETTERS_CNT = (90 /* CharCode.Z */ - 65 /* CharCode.A */ + 1);\n n = n % (2 * LETTERS_CNT);\n if (n < LETTERS_CNT) {\n return String.fromCharCode(97 /* CharCode.a */ + n);\n }\n return String.fromCharCode(65 /* CharCode.A */ + n - LETTERS_CNT);\n}\nfunction breakBetweenGraphemeBreakType(breakTypeA, breakTypeB) {\n // http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules\n // !!! Let's make the common case a bit faster\n if (breakTypeA === 0 /* GraphemeBreakType.Other */) {\n // see https://www.unicode.org/Public/13.0.0/ucd/auxiliary/GraphemeBreakTest-13.0.0d10.html#table\n return (breakTypeB !== 5 /* GraphemeBreakType.Extend */ && breakTypeB !== 7 /* GraphemeBreakType.SpacingMark */);\n }\n // Do not break between a CR and LF. Otherwise, break before and after controls.\n // GB3 CR × LF\n // GB4 (Control | CR | LF) ÷\n // GB5 ÷ (Control | CR | LF)\n if (breakTypeA === 2 /* GraphemeBreakType.CR */) {\n if (breakTypeB === 3 /* GraphemeBreakType.LF */) {\n return false; // GB3\n }\n }\n if (breakTypeA === 4 /* GraphemeBreakType.Control */ || breakTypeA === 2 /* GraphemeBreakType.CR */ || breakTypeA === 3 /* GraphemeBreakType.LF */) {\n return true; // GB4\n }\n if (breakTypeB === 4 /* GraphemeBreakType.Control */ || breakTypeB === 2 /* GraphemeBreakType.CR */ || breakTypeB === 3 /* GraphemeBreakType.LF */) {\n return true; // GB5\n }\n // Do not break Hangul syllable sequences.\n // GB6 L × (L | V | LV | LVT)\n // GB7 (LV | V) × (V | T)\n // GB8 (LVT | T) × T\n if (breakTypeA === 8 /* GraphemeBreakType.L */) {\n if (breakTypeB === 8 /* GraphemeBreakType.L */ || breakTypeB === 9 /* GraphemeBreakType.V */ || breakTypeB === 11 /* GraphemeBreakType.LV */ || breakTypeB === 12 /* GraphemeBreakType.LVT */) {\n return false; // GB6\n }\n }\n if (breakTypeA === 11 /* GraphemeBreakType.LV */ || breakTypeA === 9 /* GraphemeBreakType.V */) {\n if (breakTypeB === 9 /* GraphemeBreakType.V */ || breakTypeB === 10 /* GraphemeBreakType.T */) {\n return false; // GB7\n }\n }\n if (breakTypeA === 12 /* GraphemeBreakType.LVT */ || breakTypeA === 10 /* GraphemeBreakType.T */) {\n if (breakTypeB === 10 /* GraphemeBreakType.T */) {\n return false; // GB8\n }\n }\n // Do not break before extending characters or ZWJ.\n // GB9 × (Extend | ZWJ)\n if (breakTypeB === 5 /* GraphemeBreakType.Extend */ || breakTypeB === 13 /* GraphemeBreakType.ZWJ */) {\n return false; // GB9\n }\n // The GB9a and GB9b rules only apply to extended grapheme clusters:\n // Do not break before SpacingMarks, or after Prepend characters.\n // GB9a × SpacingMark\n // GB9b Prepend ×\n if (breakTypeB === 7 /* GraphemeBreakType.SpacingMark */) {\n return false; // GB9a\n }\n if (breakTypeA === 1 /* GraphemeBreakType.Prepend */) {\n return false; // GB9b\n }\n // Do not break within emoji modifier sequences or emoji zwj sequences.\n // GB11 \\p{Extended_Pictographic} Extend* ZWJ × \\p{Extended_Pictographic}\n if (breakTypeA === 13 /* GraphemeBreakType.ZWJ */ && breakTypeB === 14 /* GraphemeBreakType.Extended_Pictographic */) {\n // Note: we are not implementing the rule entirely here to avoid introducing states\n return false; // GB11\n }\n // GB12 sot (RI RI)* RI × RI\n // GB13 [^RI] (RI RI)* RI × RI\n if (breakTypeA === 6 /* GraphemeBreakType.Regional_Indicator */ && breakTypeB === 6 /* GraphemeBreakType.Regional_Indicator */) {\n // Note: we are not implementing the rule entirely here to avoid introducing states\n return false; // GB12 & GB13\n }\n // GB999 Any ÷ Any\n return true;\n}\nclass GraphemeBreakTree {\n static getInstance() {\n if (!GraphemeBreakTree._INSTANCE) {\n GraphemeBreakTree._INSTANCE = new GraphemeBreakTree();\n }\n return GraphemeBreakTree._INSTANCE;\n }\n constructor() {\n this._data = getGraphemeBreakRawData();\n }\n getGraphemeBreakType(codePoint) {\n // !!! Let's make 7bit ASCII a bit faster: 0..31\n if (codePoint < 32) {\n if (codePoint === 10 /* CharCode.LineFeed */) {\n return 3 /* GraphemeBreakType.LF */;\n }\n if (codePoint === 13 /* CharCode.CarriageReturn */) {\n return 2 /* GraphemeBreakType.CR */;\n }\n return 4 /* GraphemeBreakType.Control */;\n }\n // !!! Let's make 7bit ASCII a bit faster: 32..126\n if (codePoint < 127) {\n return 0 /* GraphemeBreakType.Other */;\n }\n const data = this._data;\n const nodeCount = data.length / 3;\n let nodeIndex = 1;\n while (nodeIndex <= nodeCount) {\n if (codePoint < data[3 * nodeIndex]) {\n // go left\n nodeIndex = 2 * nodeIndex;\n }\n else if (codePoint > data[3 * nodeIndex + 1]) {\n // go right\n nodeIndex = 2 * nodeIndex + 1;\n }\n else {\n // hit\n return data[3 * nodeIndex + 2];\n }\n }\n return 0 /* GraphemeBreakType.Other */;\n }\n}\nGraphemeBreakTree._INSTANCE = null;\nfunction getGraphemeBreakRawData() {\n // generated using https://github.com/alexdima/unicode-utils/blob/main/grapheme-break.js\n return JSON.parse('[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]');\n}\n//#endregion\n/**\n * Computes the offset after performing a left delete on the given string,\n * while considering unicode grapheme/emoji rules.\n*/\nfunction getLeftDeleteOffset(offset, str) {\n if (offset === 0) {\n return 0;\n }\n // Try to delete emoji part.\n const emojiOffset = getOffsetBeforeLastEmojiComponent(offset, str);\n if (emojiOffset !== undefined) {\n return emojiOffset;\n }\n // Otherwise, just skip a single code point.\n const iterator = new CodePointIterator(str, offset);\n iterator.prevCodePoint();\n return iterator.offset;\n}\nfunction getOffsetBeforeLastEmojiComponent(initialOffset, str) {\n // See https://www.unicode.org/reports/tr51/tr51-14.html#EBNF_and_Regex for the\n // structure of emojis.\n const iterator = new CodePointIterator(str, initialOffset);\n let codePoint = iterator.prevCodePoint();\n // Skip modifiers\n while ((isEmojiModifier(codePoint) || codePoint === 65039 /* CodePoint.emojiVariantSelector */ || codePoint === 8419 /* CodePoint.enclosingKeyCap */)) {\n if (iterator.offset === 0) {\n // Cannot skip modifier, no preceding emoji base.\n return undefined;\n }\n codePoint = iterator.prevCodePoint();\n }\n // Expect base emoji\n if (!isEmojiImprecise(codePoint)) {\n // Unexpected code point, not a valid emoji.\n return undefined;\n }\n let resultOffset = iterator.offset;\n if (resultOffset > 0) {\n // Skip optional ZWJ code points that combine multiple emojis.\n // In theory, we should check if that ZWJ actually combines multiple emojis\n // to prevent deleting ZWJs in situations we didn't account for.\n const optionalZwjCodePoint = iterator.prevCodePoint();\n if (optionalZwjCodePoint === 8205 /* CodePoint.zwj */) {\n resultOffset = iterator.offset;\n }\n }\n return resultOffset;\n}\nfunction isEmojiModifier(codePoint) {\n return 0x1F3FB <= codePoint && codePoint <= 0x1F3FF;\n}\nconst noBreakWhitespace = '\\xa0';\nclass AmbiguousCharacters {\n static getInstance(locales) {\n return AmbiguousCharacters.cache.get(Array.from(locales));\n }\n static getLocales() {\n return AmbiguousCharacters._locales.value;\n }\n constructor(confusableDictionary) {\n this.confusableDictionary = confusableDictionary;\n }\n isAmbiguous(codePoint) {\n return this.confusableDictionary.has(codePoint);\n }\n /**\n * Returns the non basic ASCII code point that the given code point can be confused,\n * or undefined if such code point does note exist.\n */\n getPrimaryConfusable(codePoint) {\n return this.confusableDictionary.get(codePoint);\n }\n getConfusableCodePoints() {\n return new Set(this.confusableDictionary.keys());\n }\n}\nstrings_a = AmbiguousCharacters;\nAmbiguousCharacters.ambiguousCharacterData = new Lazy(() => {\n // Generated using https://github.com/hediet/vscode-unicode-data\n // Stored as key1, value1, key2, value2, ...\n return JSON.parse('{\\\"_common\\\":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],\\\"_default\\\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"cs\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"de\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"es\\\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"fr\\\":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"it\\\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"ja\\\":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],\\\"ko\\\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"pl\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"pt-BR\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"qps-ploc\\\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"ru\\\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"tr\\\":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\\\"zh-hans\\\":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],\\\"zh-hant\\\":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}');\n});\nAmbiguousCharacters.cache = new LRUCachedFunction((locales) => {\n function arrayToMap(arr) {\n const result = new Map();\n for (let i = 0; i < arr.length; i += 2) {\n result.set(arr[i], arr[i + 1]);\n }\n return result;\n }\n function mergeMaps(map1, map2) {\n const result = new Map(map1);\n for (const [key, value] of map2) {\n result.set(key, value);\n }\n return result;\n }\n function intersectMaps(map1, map2) {\n if (!map1) {\n return map2;\n }\n const result = new Map();\n for (const [key, value] of map1) {\n if (map2.has(key)) {\n result.set(key, value);\n }\n }\n return result;\n }\n const data = strings_a.ambiguousCharacterData.value;\n let filteredLocales = locales.filter((l) => !l.startsWith('_') && l in data);\n if (filteredLocales.length === 0) {\n filteredLocales = ['_default'];\n }\n let languageSpecificMap = undefined;\n for (const locale of filteredLocales) {\n const map = arrayToMap(data[locale]);\n languageSpecificMap = intersectMaps(languageSpecificMap, map);\n }\n const commonMap = arrayToMap(data['_common']);\n const map = mergeMaps(commonMap, languageSpecificMap);\n return new AmbiguousCharacters(map);\n});\nAmbiguousCharacters._locales = new Lazy(() => Object.keys(AmbiguousCharacters.ambiguousCharacterData.value).filter((k) => !k.startsWith('_')));\nclass InvisibleCharacters {\n static getRawData() {\n // Generated using https://github.com/hediet/vscode-unicode-data\n return JSON.parse('[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]');\n }\n static getData() {\n if (!this._data) {\n this._data = new Set(InvisibleCharacters.getRawData());\n }\n return this._data;\n }\n static isInvisibleCharacter(codePoint) {\n return InvisibleCharacters.getData().has(codePoint);\n }\n static get codePoints() {\n return InvisibleCharacters.getData();\n }\n}\nInvisibleCharacters._data = undefined;\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/worker/simpleWorker.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n\n\n\n\nconst INITIALIZE = '$initialize';\nlet webWorkerWarningLogged = false;\nfunction logOnceWebWorkerWarning(err) {\n if (!isWeb) {\n // running tests\n return;\n }\n if (!webWorkerWarningLogged) {\n webWorkerWarningLogged = true;\n console.warn('Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq');\n }\n console.warn(err.message);\n}\nclass RequestMessage {\n constructor(vsWorker, req, method, args) {\n this.vsWorker = vsWorker;\n this.req = req;\n this.method = method;\n this.args = args;\n this.type = 0 /* MessageType.Request */;\n }\n}\nclass ReplyMessage {\n constructor(vsWorker, seq, res, err) {\n this.vsWorker = vsWorker;\n this.seq = seq;\n this.res = res;\n this.err = err;\n this.type = 1 /* MessageType.Reply */;\n }\n}\nclass SubscribeEventMessage {\n constructor(vsWorker, req, eventName, arg) {\n this.vsWorker = vsWorker;\n this.req = req;\n this.eventName = eventName;\n this.arg = arg;\n this.type = 2 /* MessageType.SubscribeEvent */;\n }\n}\nclass EventMessage {\n constructor(vsWorker, req, event) {\n this.vsWorker = vsWorker;\n this.req = req;\n this.event = event;\n this.type = 3 /* MessageType.Event */;\n }\n}\nclass UnsubscribeEventMessage {\n constructor(vsWorker, req) {\n this.vsWorker = vsWorker;\n this.req = req;\n this.type = 4 /* MessageType.UnsubscribeEvent */;\n }\n}\nclass SimpleWorkerProtocol {\n constructor(handler) {\n this._workerId = -1;\n this._handler = handler;\n this._lastSentReq = 0;\n this._pendingReplies = Object.create(null);\n this._pendingEmitters = new Map();\n this._pendingEvents = new Map();\n }\n setWorkerId(workerId) {\n this._workerId = workerId;\n }\n sendMessage(method, args) {\n const req = String(++this._lastSentReq);\n return new Promise((resolve, reject) => {\n this._pendingReplies[req] = {\n resolve: resolve,\n reject: reject\n };\n this._send(new RequestMessage(this._workerId, req, method, args));\n });\n }\n listen(eventName, arg) {\n let req = null;\n const emitter = new Emitter({\n onWillAddFirstListener: () => {\n req = String(++this._lastSentReq);\n this._pendingEmitters.set(req, emitter);\n this._send(new SubscribeEventMessage(this._workerId, req, eventName, arg));\n },\n onDidRemoveLastListener: () => {\n this._pendingEmitters.delete(req);\n this._send(new UnsubscribeEventMessage(this._workerId, req));\n req = null;\n }\n });\n return emitter.event;\n }\n handleMessage(message) {\n if (!message || !message.vsWorker) {\n return;\n }\n if (this._workerId !== -1 && message.vsWorker !== this._workerId) {\n return;\n }\n this._handleMessage(message);\n }\n _handleMessage(msg) {\n switch (msg.type) {\n case 1 /* MessageType.Reply */:\n return this._handleReplyMessage(msg);\n case 0 /* MessageType.Request */:\n return this._handleRequestMessage(msg);\n case 2 /* MessageType.SubscribeEvent */:\n return this._handleSubscribeEventMessage(msg);\n case 3 /* MessageType.Event */:\n return this._handleEventMessage(msg);\n case 4 /* MessageType.UnsubscribeEvent */:\n return this._handleUnsubscribeEventMessage(msg);\n }\n }\n _handleReplyMessage(replyMessage) {\n if (!this._pendingReplies[replyMessage.seq]) {\n console.warn('Got reply to unknown seq');\n return;\n }\n const reply = this._pendingReplies[replyMessage.seq];\n delete this._pendingReplies[replyMessage.seq];\n if (replyMessage.err) {\n let err = replyMessage.err;\n if (replyMessage.err.$isError) {\n err = new Error();\n err.name = replyMessage.err.name;\n err.message = replyMessage.err.message;\n err.stack = replyMessage.err.stack;\n }\n reply.reject(err);\n return;\n }\n reply.resolve(replyMessage.res);\n }\n _handleRequestMessage(requestMessage) {\n const req = requestMessage.req;\n const result = this._handler.handleMessage(requestMessage.method, requestMessage.args);\n result.then((r) => {\n this._send(new ReplyMessage(this._workerId, req, r, undefined));\n }, (e) => {\n if (e.detail instanceof Error) {\n // Loading errors have a detail property that points to the actual error\n e.detail = transformErrorForSerialization(e.detail);\n }\n this._send(new ReplyMessage(this._workerId, req, undefined, transformErrorForSerialization(e)));\n });\n }\n _handleSubscribeEventMessage(msg) {\n const req = msg.req;\n const disposable = this._handler.handleEvent(msg.eventName, msg.arg)((event) => {\n this._send(new EventMessage(this._workerId, req, event));\n });\n this._pendingEvents.set(req, disposable);\n }\n _handleEventMessage(msg) {\n if (!this._pendingEmitters.has(msg.req)) {\n console.warn('Got event for unknown req');\n return;\n }\n this._pendingEmitters.get(msg.req).fire(msg.event);\n }\n _handleUnsubscribeEventMessage(msg) {\n if (!this._pendingEvents.has(msg.req)) {\n console.warn('Got unsubscribe for unknown req');\n return;\n }\n this._pendingEvents.get(msg.req).dispose();\n this._pendingEvents.delete(msg.req);\n }\n _send(msg) {\n const transfer = [];\n if (msg.type === 0 /* MessageType.Request */) {\n for (let i = 0; i < msg.args.length; i++) {\n if (msg.args[i] instanceof ArrayBuffer) {\n transfer.push(msg.args[i]);\n }\n }\n }\n else if (msg.type === 1 /* MessageType.Reply */) {\n if (msg.res instanceof ArrayBuffer) {\n transfer.push(msg.res);\n }\n }\n this._handler.sendMessage(msg, transfer);\n }\n}\n/**\n * Main thread side\n */\nclass SimpleWorkerClient extends (/* unused pure expression or super */ null && (Disposable)) {\n constructor(workerFactory, moduleId, host) {\n super();\n let lazyProxyReject = null;\n this._worker = this._register(workerFactory.create('vs/base/common/worker/simpleWorker', (msg) => {\n this._protocol.handleMessage(msg);\n }, (err) => {\n // in Firefox, web workers fail lazily :(\n // we will reject the proxy\n lazyProxyReject === null || lazyProxyReject === void 0 ? void 0 : lazyProxyReject(err);\n }));\n this._protocol = new SimpleWorkerProtocol({\n sendMessage: (msg, transfer) => {\n this._worker.postMessage(msg, transfer);\n },\n handleMessage: (method, args) => {\n if (typeof host[method] !== 'function') {\n return Promise.reject(new Error('Missing method ' + method + ' on main thread host.'));\n }\n try {\n return Promise.resolve(host[method].apply(host, args));\n }\n catch (e) {\n return Promise.reject(e);\n }\n },\n handleEvent: (eventName, arg) => {\n if (propertyIsDynamicEvent(eventName)) {\n const event = host[eventName].call(host, arg);\n if (typeof event !== 'function') {\n throw new Error(`Missing dynamic event ${eventName} on main thread host.`);\n }\n return event;\n }\n if (propertyIsEvent(eventName)) {\n const event = host[eventName];\n if (typeof event !== 'function') {\n throw new Error(`Missing event ${eventName} on main thread host.`);\n }\n return event;\n }\n throw new Error(`Malformed event name ${eventName}`);\n }\n });\n this._protocol.setWorkerId(this._worker.getId());\n // Gather loader configuration\n let loaderConfiguration = null;\n const globalRequire = globalThis.require;\n if (typeof globalRequire !== 'undefined' && typeof globalRequire.getConfig === 'function') {\n // Get the configuration from the Monaco AMD Loader\n loaderConfiguration = globalRequire.getConfig();\n }\n else if (typeof globalThis.requirejs !== 'undefined') {\n // Get the configuration from requirejs\n loaderConfiguration = globalThis.requirejs.s.contexts._.config;\n }\n const hostMethods = getAllMethodNames(host);\n // Send initialize message\n this._onModuleLoaded = this._protocol.sendMessage(INITIALIZE, [\n this._worker.getId(),\n JSON.parse(JSON.stringify(loaderConfiguration)),\n moduleId,\n hostMethods,\n ]);\n // Create proxy to loaded code\n const proxyMethodRequest = (method, args) => {\n return this._request(method, args);\n };\n const proxyListen = (eventName, arg) => {\n return this._protocol.listen(eventName, arg);\n };\n this._lazyProxy = new Promise((resolve, reject) => {\n lazyProxyReject = reject;\n this._onModuleLoaded.then((availableMethods) => {\n resolve(simpleWorker_createProxyObject(availableMethods, proxyMethodRequest, proxyListen));\n }, (e) => {\n reject(e);\n this._onError('Worker failed to load ' + moduleId, e);\n });\n });\n }\n getProxyObject() {\n return this._lazyProxy;\n }\n _request(method, args) {\n return new Promise((resolve, reject) => {\n this._onModuleLoaded.then(() => {\n this._protocol.sendMessage(method, args).then(resolve, reject);\n }, reject);\n });\n }\n _onError(message, error) {\n console.error(message);\n console.info(error);\n }\n}\nfunction propertyIsEvent(name) {\n // Assume a property is an event if it has a form of \"onSomething\"\n return name[0] === 'o' && name[1] === 'n' && isUpperAsciiLetter(name.charCodeAt(2));\n}\nfunction propertyIsDynamicEvent(name) {\n // Assume a property is a dynamic event (a method that returns an event) if it has a form of \"onDynamicSomething\"\n return /^onDynamic/.test(name) && isUpperAsciiLetter(name.charCodeAt(9));\n}\nfunction simpleWorker_createProxyObject(methodNames, invoke, proxyListen) {\n const createProxyMethod = (method) => {\n return function () {\n const args = Array.prototype.slice.call(arguments, 0);\n return invoke(method, args);\n };\n };\n const createProxyDynamicEvent = (eventName) => {\n return function (arg) {\n return proxyListen(eventName, arg);\n };\n };\n const result = {};\n for (const methodName of methodNames) {\n if (propertyIsDynamicEvent(methodName)) {\n result[methodName] = createProxyDynamicEvent(methodName);\n continue;\n }\n if (propertyIsEvent(methodName)) {\n result[methodName] = proxyListen(methodName, undefined);\n continue;\n }\n result[methodName] = createProxyMethod(methodName);\n }\n return result;\n}\n/**\n * Worker side\n */\nclass SimpleWorkerServer {\n constructor(postMessage, requestHandlerFactory) {\n this._requestHandlerFactory = requestHandlerFactory;\n this._requestHandler = null;\n this._protocol = new SimpleWorkerProtocol({\n sendMessage: (msg, transfer) => {\n postMessage(msg, transfer);\n },\n handleMessage: (method, args) => this._handleMessage(method, args),\n handleEvent: (eventName, arg) => this._handleEvent(eventName, arg)\n });\n }\n onmessage(msg) {\n this._protocol.handleMessage(msg);\n }\n _handleMessage(method, args) {\n if (method === INITIALIZE) {\n return this.initialize(args[0], args[1], args[2], args[3]);\n }\n if (!this._requestHandler || typeof this._requestHandler[method] !== 'function') {\n return Promise.reject(new Error('Missing requestHandler or method: ' + method));\n }\n try {\n return Promise.resolve(this._requestHandler[method].apply(this._requestHandler, args));\n }\n catch (e) {\n return Promise.reject(e);\n }\n }\n _handleEvent(eventName, arg) {\n if (!this._requestHandler) {\n throw new Error(`Missing requestHandler`);\n }\n if (propertyIsDynamicEvent(eventName)) {\n const event = this._requestHandler[eventName].call(this._requestHandler, arg);\n if (typeof event !== 'function') {\n throw new Error(`Missing dynamic event ${eventName} on request handler.`);\n }\n return event;\n }\n if (propertyIsEvent(eventName)) {\n const event = this._requestHandler[eventName];\n if (typeof event !== 'function') {\n throw new Error(`Missing event ${eventName} on request handler.`);\n }\n return event;\n }\n throw new Error(`Malformed event name ${eventName}`);\n }\n initialize(workerId, loaderConfig, moduleId, hostMethods) {\n this._protocol.setWorkerId(workerId);\n const proxyMethodRequest = (method, args) => {\n return this._protocol.sendMessage(method, args);\n };\n const proxyListen = (eventName, arg) => {\n return this._protocol.listen(eventName, arg);\n };\n const hostProxy = simpleWorker_createProxyObject(hostMethods, proxyMethodRequest, proxyListen);\n if (this._requestHandlerFactory) {\n // static request handler\n this._requestHandler = this._requestHandlerFactory(hostProxy);\n return Promise.resolve(objects_getAllMethodNames(this._requestHandler));\n }\n if (loaderConfig) {\n // Remove 'baseUrl', handling it is beyond scope for now\n if (typeof loaderConfig.baseUrl !== 'undefined') {\n delete loaderConfig['baseUrl'];\n }\n if (typeof loaderConfig.paths !== 'undefined') {\n if (typeof loaderConfig.paths.vs !== 'undefined') {\n delete loaderConfig.paths['vs'];\n }\n }\n if (typeof loaderConfig.trustedTypesPolicy !== undefined) {\n // don't use, it has been destroyed during serialize\n delete loaderConfig['trustedTypesPolicy'];\n }\n // Since this is in a web worker, enable catching errors\n loaderConfig.catchError = true;\n globalThis.require.config(loaderConfig);\n }\n return new Promise((resolve, reject) => {\n // Use the global require to be sure to get the global config\n // ESM-comment-begin\n // \t\t\tconst req = (globalThis.require || require);\n // ESM-comment-end\n // ESM-uncomment-begin\n const req = globalThis.require;\n // ESM-uncomment-end\n req([moduleId], (module) => {\n this._requestHandler = module.create(hostProxy);\n if (!this._requestHandler) {\n reject(new Error(`No RequestHandler!`));\n return;\n }\n resolve(objects_getAllMethodNames(this._requestHandler));\n }, reject);\n });\n }\n}\n/**\n * Called on the worker side\n * @skipMangle\n */\nfunction simpleWorker_create(postMessage) {\n return new SimpleWorkerServer(postMessage, null);\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/diff/diffChange.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n/**\n * Represents information about a specific difference between two sequences.\n */\nclass DiffChange {\n /**\n * Constructs a new DiffChange with the given sequence information\n * and content.\n */\n constructor(originalStart, originalLength, modifiedStart, modifiedLength) {\n //Debug.Assert(originalLength > 0 || modifiedLength > 0, \"originalLength and modifiedLength cannot both be <= 0\");\n this.originalStart = originalStart;\n this.originalLength = originalLength;\n this.modifiedStart = modifiedStart;\n this.modifiedLength = modifiedLength;\n }\n /**\n * The end point (exclusive) of the change in the original sequence.\n */\n getOriginalEnd() {\n return this.originalStart + this.originalLength;\n }\n /**\n * The end point (exclusive) of the change in the modified sequence.\n */\n getModifiedEnd() {\n return this.modifiedStart + this.modifiedLength;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/hash.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Return a hash value for an object.\n */\nfunction hash(obj) {\n return doHash(obj, 0);\n}\nfunction doHash(obj, hashVal) {\n switch (typeof obj) {\n case 'object':\n if (obj === null) {\n return numberHash(349, hashVal);\n }\n else if (Array.isArray(obj)) {\n return arrayHash(obj, hashVal);\n }\n return objectHash(obj, hashVal);\n case 'string':\n return stringHash(obj, hashVal);\n case 'boolean':\n return booleanHash(obj, hashVal);\n case 'number':\n return numberHash(obj, hashVal);\n case 'undefined':\n return numberHash(937, hashVal);\n default:\n return numberHash(617, hashVal);\n }\n}\nfunction numberHash(val, initialHashVal) {\n return (((initialHashVal << 5) - initialHashVal) + val) | 0; // hashVal * 31 + ch, keep as int32\n}\nfunction booleanHash(b, initialHashVal) {\n return numberHash(b ? 433 : 863, initialHashVal);\n}\nfunction stringHash(s, hashVal) {\n hashVal = numberHash(149417, hashVal);\n for (let i = 0, length = s.length; i < length; i++) {\n hashVal = numberHash(s.charCodeAt(i), hashVal);\n }\n return hashVal;\n}\nfunction arrayHash(arr, initialHashVal) {\n initialHashVal = numberHash(104579, initialHashVal);\n return arr.reduce((hashVal, item) => doHash(item, hashVal), initialHashVal);\n}\nfunction objectHash(obj, initialHashVal) {\n initialHashVal = numberHash(181387, initialHashVal);\n return Object.keys(obj).sort().reduce((hashVal, key) => {\n hashVal = stringHash(key, hashVal);\n return doHash(obj[key], hashVal);\n }, initialHashVal);\n}\nfunction leftRotate(value, bits, totalBits = 32) {\n // delta + bits = totalBits\n const delta = totalBits - bits;\n // All ones, expect `delta` zeros aligned to the right\n const mask = ~((1 << delta) - 1);\n // Join (value left-shifted `bits` bits) with (masked value right-shifted `delta` bits)\n return ((value << bits) | ((mask & value) >>> delta)) >>> 0;\n}\nfunction fill(dest, index = 0, count = dest.byteLength, value = 0) {\n for (let i = 0; i < count; i++) {\n dest[index + i] = value;\n }\n}\nfunction leftPad(value, length, char = '0') {\n while (value.length < length) {\n value = char + value;\n }\n return value;\n}\nfunction toHexString(bufferOrValue, bitsize = 32) {\n if (bufferOrValue instanceof ArrayBuffer) {\n return Array.from(new Uint8Array(bufferOrValue)).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n return leftPad((bufferOrValue >>> 0).toString(16), bitsize / 4);\n}\n/**\n * A SHA1 implementation that works with strings and does not allocate.\n */\nclass StringSHA1 {\n constructor() {\n this._h0 = 0x67452301;\n this._h1 = 0xEFCDAB89;\n this._h2 = 0x98BADCFE;\n this._h3 = 0x10325476;\n this._h4 = 0xC3D2E1F0;\n this._buff = new Uint8Array(64 /* SHA1Constant.BLOCK_SIZE */ + 3 /* to fit any utf-8 */);\n this._buffDV = new DataView(this._buff.buffer);\n this._buffLen = 0;\n this._totalLen = 0;\n this._leftoverHighSurrogate = 0;\n this._finished = false;\n }\n update(str) {\n const strLen = str.length;\n if (strLen === 0) {\n return;\n }\n const buff = this._buff;\n let buffLen = this._buffLen;\n let leftoverHighSurrogate = this._leftoverHighSurrogate;\n let charCode;\n let offset;\n if (leftoverHighSurrogate !== 0) {\n charCode = leftoverHighSurrogate;\n offset = -1;\n leftoverHighSurrogate = 0;\n }\n else {\n charCode = str.charCodeAt(0);\n offset = 0;\n }\n while (true) {\n let codePoint = charCode;\n if (isHighSurrogate(charCode)) {\n if (offset + 1 < strLen) {\n const nextCharCode = str.charCodeAt(offset + 1);\n if (isLowSurrogate(nextCharCode)) {\n offset++;\n codePoint = computeCodePoint(charCode, nextCharCode);\n }\n else {\n // illegal => unicode replacement character\n codePoint = 65533 /* SHA1Constant.UNICODE_REPLACEMENT */;\n }\n }\n else {\n // last character is a surrogate pair\n leftoverHighSurrogate = charCode;\n break;\n }\n }\n else if (isLowSurrogate(charCode)) {\n // illegal => unicode replacement character\n codePoint = 65533 /* SHA1Constant.UNICODE_REPLACEMENT */;\n }\n buffLen = this._push(buff, buffLen, codePoint);\n offset++;\n if (offset < strLen) {\n charCode = str.charCodeAt(offset);\n }\n else {\n break;\n }\n }\n this._buffLen = buffLen;\n this._leftoverHighSurrogate = leftoverHighSurrogate;\n }\n _push(buff, buffLen, codePoint) {\n if (codePoint < 0x0080) {\n buff[buffLen++] = codePoint;\n }\n else if (codePoint < 0x0800) {\n buff[buffLen++] = 0b11000000 | ((codePoint & 0b00000000000000000000011111000000) >>> 6);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n }\n else if (codePoint < 0x10000) {\n buff[buffLen++] = 0b11100000 | ((codePoint & 0b00000000000000001111000000000000) >>> 12);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n }\n else {\n buff[buffLen++] = 0b11110000 | ((codePoint & 0b00000000000111000000000000000000) >>> 18);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000111111000000000000) >>> 12);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6);\n buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);\n }\n if (buffLen >= 64 /* SHA1Constant.BLOCK_SIZE */) {\n this._step();\n buffLen -= 64 /* SHA1Constant.BLOCK_SIZE */;\n this._totalLen += 64 /* SHA1Constant.BLOCK_SIZE */;\n // take last 3 in case of UTF8 overflow\n buff[0] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 0];\n buff[1] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 1];\n buff[2] = buff[64 /* SHA1Constant.BLOCK_SIZE */ + 2];\n }\n return buffLen;\n }\n digest() {\n if (!this._finished) {\n this._finished = true;\n if (this._leftoverHighSurrogate) {\n // illegal => unicode replacement character\n this._leftoverHighSurrogate = 0;\n this._buffLen = this._push(this._buff, this._buffLen, 65533 /* SHA1Constant.UNICODE_REPLACEMENT */);\n }\n this._totalLen += this._buffLen;\n this._wrapUp();\n }\n return toHexString(this._h0) + toHexString(this._h1) + toHexString(this._h2) + toHexString(this._h3) + toHexString(this._h4);\n }\n _wrapUp() {\n this._buff[this._buffLen++] = 0x80;\n fill(this._buff, this._buffLen);\n if (this._buffLen > 56) {\n this._step();\n fill(this._buff);\n }\n // this will fit because the mantissa can cover up to 52 bits\n const ml = 8 * this._totalLen;\n this._buffDV.setUint32(56, Math.floor(ml / 4294967296), false);\n this._buffDV.setUint32(60, ml % 4294967296, false);\n this._step();\n }\n _step() {\n const bigBlock32 = StringSHA1._bigBlock32;\n const data = this._buffDV;\n for (let j = 0; j < 64 /* 16*4 */; j += 4) {\n bigBlock32.setUint32(j, data.getUint32(j, false), false);\n }\n for (let j = 64; j < 320 /* 80*4 */; j += 4) {\n bigBlock32.setUint32(j, leftRotate((bigBlock32.getUint32(j - 12, false) ^ bigBlock32.getUint32(j - 32, false) ^ bigBlock32.getUint32(j - 56, false) ^ bigBlock32.getUint32(j - 64, false)), 1), false);\n }\n let a = this._h0;\n let b = this._h1;\n let c = this._h2;\n let d = this._h3;\n let e = this._h4;\n let f, k;\n let temp;\n for (let j = 0; j < 80; j++) {\n if (j < 20) {\n f = (b & c) | ((~b) & d);\n k = 0x5A827999;\n }\n else if (j < 40) {\n f = b ^ c ^ d;\n k = 0x6ED9EBA1;\n }\n else if (j < 60) {\n f = (b & c) | (b & d) | (c & d);\n k = 0x8F1BBCDC;\n }\n else {\n f = b ^ c ^ d;\n k = 0xCA62C1D6;\n }\n temp = (leftRotate(a, 5) + f + e + k + bigBlock32.getUint32(j * 4, false)) & 0xffffffff;\n e = d;\n d = c;\n c = leftRotate(b, 30);\n b = a;\n a = temp;\n }\n this._h0 = (this._h0 + a) & 0xffffffff;\n this._h1 = (this._h1 + b) & 0xffffffff;\n this._h2 = (this._h2 + c) & 0xffffffff;\n this._h3 = (this._h3 + d) & 0xffffffff;\n this._h4 = (this._h4 + e) & 0xffffffff;\n }\n}\nStringSHA1._bigBlock32 = new DataView(new ArrayBuffer(320)); // 80 * 4 = 320\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/diff/diff.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\nclass StringDiffSequence {\n constructor(source) {\n this.source = source;\n }\n getElements() {\n const source = this.source;\n const characters = new Int32Array(source.length);\n for (let i = 0, len = source.length; i < len; i++) {\n characters[i] = source.charCodeAt(i);\n }\n return characters;\n }\n}\nfunction stringDiff(original, modified, pretty) {\n return new LcsDiff(new StringDiffSequence(original), new StringDiffSequence(modified)).ComputeDiff(pretty).changes;\n}\n//\n// The code below has been ported from a C# implementation in VS\n//\nclass Debug {\n static Assert(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n }\n}\nclass MyArray {\n /**\n * Copies a range of elements from an Array starting at the specified source index and pastes\n * them to another Array starting at the specified destination index. The length and the indexes\n * are specified as 64-bit integers.\n * sourceArray:\n *\t\tThe Array that contains the data to copy.\n * sourceIndex:\n *\t\tA 64-bit integer that represents the index in the sourceArray at which copying begins.\n * destinationArray:\n *\t\tThe Array that receives the data.\n * destinationIndex:\n *\t\tA 64-bit integer that represents the index in the destinationArray at which storing begins.\n * length:\n *\t\tA 64-bit integer that represents the number of elements to copy.\n */\n static Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length) {\n for (let i = 0; i < length; i++) {\n destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i];\n }\n }\n static Copy2(sourceArray, sourceIndex, destinationArray, destinationIndex, length) {\n for (let i = 0; i < length; i++) {\n destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i];\n }\n }\n}\n/**\n * A utility class which helps to create the set of DiffChanges from\n * a difference operation. This class accepts original DiffElements and\n * modified DiffElements that are involved in a particular change. The\n * MarkNextChange() method can be called to mark the separation between\n * distinct changes. At the end, the Changes property can be called to retrieve\n * the constructed changes.\n */\nclass DiffChangeHelper {\n /**\n * Constructs a new DiffChangeHelper for the given DiffSequences.\n */\n constructor() {\n this.m_changes = [];\n this.m_originalStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n this.m_modifiedStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n this.m_originalCount = 0;\n this.m_modifiedCount = 0;\n }\n /**\n * Marks the beginning of the next change in the set of differences.\n */\n MarkNextChange() {\n // Only add to the list if there is something to add\n if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n // Add the new change to our list\n this.m_changes.push(new DiffChange(this.m_originalStart, this.m_originalCount, this.m_modifiedStart, this.m_modifiedCount));\n }\n // Reset for the next change\n this.m_originalCount = 0;\n this.m_modifiedCount = 0;\n this.m_originalStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n this.m_modifiedStart = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n }\n /**\n * Adds the original element at the given position to the elements\n * affected by the current change. The modified index gives context\n * to the change position with respect to the original sequence.\n * @param originalIndex The index of the original element to add.\n * @param modifiedIndex The index of the modified element that provides corresponding position in the modified sequence.\n */\n AddOriginalElement(originalIndex, modifiedIndex) {\n // The 'true' start index is the smallest of the ones we've seen\n this.m_originalStart = Math.min(this.m_originalStart, originalIndex);\n this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex);\n this.m_originalCount++;\n }\n /**\n * Adds the modified element at the given position to the elements\n * affected by the current change. The original index gives context\n * to the change position with respect to the modified sequence.\n * @param originalIndex The index of the original element that provides corresponding position in the original sequence.\n * @param modifiedIndex The index of the modified element to add.\n */\n AddModifiedElement(originalIndex, modifiedIndex) {\n // The 'true' start index is the smallest of the ones we've seen\n this.m_originalStart = Math.min(this.m_originalStart, originalIndex);\n this.m_modifiedStart = Math.min(this.m_modifiedStart, modifiedIndex);\n this.m_modifiedCount++;\n }\n /**\n * Retrieves all of the changes marked by the class.\n */\n getChanges() {\n if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n // Finish up on whatever is left\n this.MarkNextChange();\n }\n return this.m_changes;\n }\n /**\n * Retrieves all of the changes marked by the class in the reverse order\n */\n getReverseChanges() {\n if (this.m_originalCount > 0 || this.m_modifiedCount > 0) {\n // Finish up on whatever is left\n this.MarkNextChange();\n }\n this.m_changes.reverse();\n return this.m_changes;\n }\n}\n/**\n * An implementation of the difference algorithm described in\n * \"An O(ND) Difference Algorithm and its variations\" by Eugene W. Myers\n */\nclass LcsDiff {\n /**\n * Constructs the DiffFinder\n */\n constructor(originalSequence, modifiedSequence, continueProcessingPredicate = null) {\n this.ContinueProcessingPredicate = continueProcessingPredicate;\n this._originalSequence = originalSequence;\n this._modifiedSequence = modifiedSequence;\n const [originalStringElements, originalElementsOrHash, originalHasStrings] = LcsDiff._getElements(originalSequence);\n const [modifiedStringElements, modifiedElementsOrHash, modifiedHasStrings] = LcsDiff._getElements(modifiedSequence);\n this._hasStrings = (originalHasStrings && modifiedHasStrings);\n this._originalStringElements = originalStringElements;\n this._originalElementsOrHash = originalElementsOrHash;\n this._modifiedStringElements = modifiedStringElements;\n this._modifiedElementsOrHash = modifiedElementsOrHash;\n this.m_forwardHistory = [];\n this.m_reverseHistory = [];\n }\n static _isStringArray(arr) {\n return (arr.length > 0 && typeof arr[0] === 'string');\n }\n static _getElements(sequence) {\n const elements = sequence.getElements();\n if (LcsDiff._isStringArray(elements)) {\n const hashes = new Int32Array(elements.length);\n for (let i = 0, len = elements.length; i < len; i++) {\n hashes[i] = stringHash(elements[i], 0);\n }\n return [elements, hashes, true];\n }\n if (elements instanceof Int32Array) {\n return [[], elements, false];\n }\n return [[], new Int32Array(elements), false];\n }\n ElementsAreEqual(originalIndex, newIndex) {\n if (this._originalElementsOrHash[originalIndex] !== this._modifiedElementsOrHash[newIndex]) {\n return false;\n }\n return (this._hasStrings ? this._originalStringElements[originalIndex] === this._modifiedStringElements[newIndex] : true);\n }\n ElementsAreStrictEqual(originalIndex, newIndex) {\n if (!this.ElementsAreEqual(originalIndex, newIndex)) {\n return false;\n }\n const originalElement = LcsDiff._getStrictElement(this._originalSequence, originalIndex);\n const modifiedElement = LcsDiff._getStrictElement(this._modifiedSequence, newIndex);\n return (originalElement === modifiedElement);\n }\n static _getStrictElement(sequence, index) {\n if (typeof sequence.getStrictElement === 'function') {\n return sequence.getStrictElement(index);\n }\n return null;\n }\n OriginalElementsAreEqual(index1, index2) {\n if (this._originalElementsOrHash[index1] !== this._originalElementsOrHash[index2]) {\n return false;\n }\n return (this._hasStrings ? this._originalStringElements[index1] === this._originalStringElements[index2] : true);\n }\n ModifiedElementsAreEqual(index1, index2) {\n if (this._modifiedElementsOrHash[index1] !== this._modifiedElementsOrHash[index2]) {\n return false;\n }\n return (this._hasStrings ? this._modifiedStringElements[index1] === this._modifiedStringElements[index2] : true);\n }\n ComputeDiff(pretty) {\n return this._ComputeDiff(0, this._originalElementsOrHash.length - 1, 0, this._modifiedElementsOrHash.length - 1, pretty);\n }\n /**\n * Computes the differences between the original and modified input\n * sequences on the bounded range.\n * @returns An array of the differences between the two input sequences.\n */\n _ComputeDiff(originalStart, originalEnd, modifiedStart, modifiedEnd, pretty) {\n const quitEarlyArr = [false];\n let changes = this.ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr);\n if (pretty) {\n // We have to clean up the computed diff to be more intuitive\n // but it turns out this cannot be done correctly until the entire set\n // of diffs have been computed\n changes = this.PrettifyChanges(changes);\n }\n return {\n quitEarly: quitEarlyArr[0],\n changes: changes\n };\n }\n /**\n * Private helper method which computes the differences on the bounded range\n * recursively.\n * @returns An array of the differences between the two input sequences.\n */\n ComputeDiffRecursive(originalStart, originalEnd, modifiedStart, modifiedEnd, quitEarlyArr) {\n quitEarlyArr[0] = false;\n // Find the start of the differences\n while (originalStart <= originalEnd && modifiedStart <= modifiedEnd && this.ElementsAreEqual(originalStart, modifiedStart)) {\n originalStart++;\n modifiedStart++;\n }\n // Find the end of the differences\n while (originalEnd >= originalStart && modifiedEnd >= modifiedStart && this.ElementsAreEqual(originalEnd, modifiedEnd)) {\n originalEnd--;\n modifiedEnd--;\n }\n // In the special case where we either have all insertions or all deletions or the sequences are identical\n if (originalStart > originalEnd || modifiedStart > modifiedEnd) {\n let changes;\n if (modifiedStart <= modifiedEnd) {\n Debug.Assert(originalStart === originalEnd + 1, 'originalStart should only be one more than originalEnd');\n // All insertions\n changes = [\n new DiffChange(originalStart, 0, modifiedStart, modifiedEnd - modifiedStart + 1)\n ];\n }\n else if (originalStart <= originalEnd) {\n Debug.Assert(modifiedStart === modifiedEnd + 1, 'modifiedStart should only be one more than modifiedEnd');\n // All deletions\n changes = [\n new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, 0)\n ];\n }\n else {\n Debug.Assert(originalStart === originalEnd + 1, 'originalStart should only be one more than originalEnd');\n Debug.Assert(modifiedStart === modifiedEnd + 1, 'modifiedStart should only be one more than modifiedEnd');\n // Identical sequences - No differences\n changes = [];\n }\n return changes;\n }\n // This problem can be solved using the Divide-And-Conquer technique.\n const midOriginalArr = [0];\n const midModifiedArr = [0];\n const result = this.ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr);\n const midOriginal = midOriginalArr[0];\n const midModified = midModifiedArr[0];\n if (result !== null) {\n // Result is not-null when there was enough memory to compute the changes while\n // searching for the recursion point\n return result;\n }\n else if (!quitEarlyArr[0]) {\n // We can break the problem down recursively by finding the changes in the\n // First Half: (originalStart, modifiedStart) to (midOriginal, midModified)\n // Second Half: (midOriginal + 1, minModified + 1) to (originalEnd, modifiedEnd)\n // NOTE: ComputeDiff() is inclusive, therefore the second range starts on the next point\n const leftChanges = this.ComputeDiffRecursive(originalStart, midOriginal, modifiedStart, midModified, quitEarlyArr);\n let rightChanges = [];\n if (!quitEarlyArr[0]) {\n rightChanges = this.ComputeDiffRecursive(midOriginal + 1, originalEnd, midModified + 1, modifiedEnd, quitEarlyArr);\n }\n else {\n // We didn't have time to finish the first half, so we don't have time to compute this half.\n // Consider the entire rest of the sequence different.\n rightChanges = [\n new DiffChange(midOriginal + 1, originalEnd - (midOriginal + 1) + 1, midModified + 1, modifiedEnd - (midModified + 1) + 1)\n ];\n }\n return this.ConcatenateChanges(leftChanges, rightChanges);\n }\n // If we hit here, we quit early, and so can't return anything meaningful\n return [\n new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1)\n ];\n }\n WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr) {\n let forwardChanges = null;\n let reverseChanges = null;\n // First, walk backward through the forward diagonals history\n let changeHelper = new DiffChangeHelper();\n let diagonalMin = diagonalForwardStart;\n let diagonalMax = diagonalForwardEnd;\n let diagonalRelative = (midOriginalArr[0] - midModifiedArr[0]) - diagonalForwardOffset;\n let lastOriginalIndex = -1073741824 /* Constants.MIN_SAFE_SMALL_INTEGER */;\n let historyIndex = this.m_forwardHistory.length - 1;\n do {\n // Get the diagonal index from the relative diagonal number\n const diagonal = diagonalRelative + diagonalForwardBase;\n // Figure out where we came from\n if (diagonal === diagonalMin || (diagonal < diagonalMax && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1])) {\n // Vertical line (the element is an insert)\n originalIndex = forwardPoints[diagonal + 1];\n modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset;\n if (originalIndex < lastOriginalIndex) {\n changeHelper.MarkNextChange();\n }\n lastOriginalIndex = originalIndex;\n changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex);\n diagonalRelative = (diagonal + 1) - diagonalForwardBase; //Setup for the next iteration\n }\n else {\n // Horizontal line (the element is a deletion)\n originalIndex = forwardPoints[diagonal - 1] + 1;\n modifiedIndex = originalIndex - diagonalRelative - diagonalForwardOffset;\n if (originalIndex < lastOriginalIndex) {\n changeHelper.MarkNextChange();\n }\n lastOriginalIndex = originalIndex - 1;\n changeHelper.AddOriginalElement(originalIndex, modifiedIndex + 1);\n diagonalRelative = (diagonal - 1) - diagonalForwardBase; //Setup for the next iteration\n }\n if (historyIndex >= 0) {\n forwardPoints = this.m_forwardHistory[historyIndex];\n diagonalForwardBase = forwardPoints[0]; //We stored this in the first spot\n diagonalMin = 1;\n diagonalMax = forwardPoints.length - 1;\n }\n } while (--historyIndex >= -1);\n // Ironically, we get the forward changes as the reverse of the\n // order we added them since we technically added them backwards\n forwardChanges = changeHelper.getReverseChanges();\n if (quitEarlyArr[0]) {\n // TODO: Calculate a partial from the reverse diagonals.\n // For now, just assume everything after the midOriginal/midModified point is a diff\n let originalStartPoint = midOriginalArr[0] + 1;\n let modifiedStartPoint = midModifiedArr[0] + 1;\n if (forwardChanges !== null && forwardChanges.length > 0) {\n const lastForwardChange = forwardChanges[forwardChanges.length - 1];\n originalStartPoint = Math.max(originalStartPoint, lastForwardChange.getOriginalEnd());\n modifiedStartPoint = Math.max(modifiedStartPoint, lastForwardChange.getModifiedEnd());\n }\n reverseChanges = [\n new DiffChange(originalStartPoint, originalEnd - originalStartPoint + 1, modifiedStartPoint, modifiedEnd - modifiedStartPoint + 1)\n ];\n }\n else {\n // Now walk backward through the reverse diagonals history\n changeHelper = new DiffChangeHelper();\n diagonalMin = diagonalReverseStart;\n diagonalMax = diagonalReverseEnd;\n diagonalRelative = (midOriginalArr[0] - midModifiedArr[0]) - diagonalReverseOffset;\n lastOriginalIndex = 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */;\n historyIndex = (deltaIsEven) ? this.m_reverseHistory.length - 1 : this.m_reverseHistory.length - 2;\n do {\n // Get the diagonal index from the relative diagonal number\n const diagonal = diagonalRelative + diagonalReverseBase;\n // Figure out where we came from\n if (diagonal === diagonalMin || (diagonal < diagonalMax && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1])) {\n // Horizontal line (the element is a deletion))\n originalIndex = reversePoints[diagonal + 1] - 1;\n modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset;\n if (originalIndex > lastOriginalIndex) {\n changeHelper.MarkNextChange();\n }\n lastOriginalIndex = originalIndex + 1;\n changeHelper.AddOriginalElement(originalIndex + 1, modifiedIndex + 1);\n diagonalRelative = (diagonal + 1) - diagonalReverseBase; //Setup for the next iteration\n }\n else {\n // Vertical line (the element is an insertion)\n originalIndex = reversePoints[diagonal - 1];\n modifiedIndex = originalIndex - diagonalRelative - diagonalReverseOffset;\n if (originalIndex > lastOriginalIndex) {\n changeHelper.MarkNextChange();\n }\n lastOriginalIndex = originalIndex;\n changeHelper.AddModifiedElement(originalIndex + 1, modifiedIndex + 1);\n diagonalRelative = (diagonal - 1) - diagonalReverseBase; //Setup for the next iteration\n }\n if (historyIndex >= 0) {\n reversePoints = this.m_reverseHistory[historyIndex];\n diagonalReverseBase = reversePoints[0]; //We stored this in the first spot\n diagonalMin = 1;\n diagonalMax = reversePoints.length - 1;\n }\n } while (--historyIndex >= -1);\n // There are cases where the reverse history will find diffs that\n // are correct, but not intuitive, so we need shift them.\n reverseChanges = changeHelper.getChanges();\n }\n return this.ConcatenateChanges(forwardChanges, reverseChanges);\n }\n /**\n * Given the range to compute the diff on, this method finds the point:\n * (midOriginal, midModified)\n * that exists in the middle of the LCS of the two sequences and\n * is the point at which the LCS problem may be broken down recursively.\n * This method will try to keep the LCS trace in memory. If the LCS recursion\n * point is calculated and the full trace is available in memory, then this method\n * will return the change list.\n * @param originalStart The start bound of the original sequence range\n * @param originalEnd The end bound of the original sequence range\n * @param modifiedStart The start bound of the modified sequence range\n * @param modifiedEnd The end bound of the modified sequence range\n * @param midOriginal The middle point of the original sequence range\n * @param midModified The middle point of the modified sequence range\n * @returns The diff changes, if available, otherwise null\n */\n ComputeRecursionPoint(originalStart, originalEnd, modifiedStart, modifiedEnd, midOriginalArr, midModifiedArr, quitEarlyArr) {\n let originalIndex = 0, modifiedIndex = 0;\n let diagonalForwardStart = 0, diagonalForwardEnd = 0;\n let diagonalReverseStart = 0, diagonalReverseEnd = 0;\n // To traverse the edit graph and produce the proper LCS, our actual\n // start position is just outside the given boundary\n originalStart--;\n modifiedStart--;\n // We set these up to make the compiler happy, but they will\n // be replaced before we return with the actual recursion point\n midOriginalArr[0] = 0;\n midModifiedArr[0] = 0;\n // Clear out the history\n this.m_forwardHistory = [];\n this.m_reverseHistory = [];\n // Each cell in the two arrays corresponds to a diagonal in the edit graph.\n // The integer value in the cell represents the originalIndex of the furthest\n // reaching point found so far that ends in that diagonal.\n // The modifiedIndex can be computed mathematically from the originalIndex and the diagonal number.\n const maxDifferences = (originalEnd - originalStart) + (modifiedEnd - modifiedStart);\n const numDiagonals = maxDifferences + 1;\n const forwardPoints = new Int32Array(numDiagonals);\n const reversePoints = new Int32Array(numDiagonals);\n // diagonalForwardBase: Index into forwardPoints of the diagonal which passes through (originalStart, modifiedStart)\n // diagonalReverseBase: Index into reversePoints of the diagonal which passes through (originalEnd, modifiedEnd)\n const diagonalForwardBase = (modifiedEnd - modifiedStart);\n const diagonalReverseBase = (originalEnd - originalStart);\n // diagonalForwardOffset: Geometric offset which allows modifiedIndex to be computed from originalIndex and the\n // diagonal number (relative to diagonalForwardBase)\n // diagonalReverseOffset: Geometric offset which allows modifiedIndex to be computed from originalIndex and the\n // diagonal number (relative to diagonalReverseBase)\n const diagonalForwardOffset = (originalStart - modifiedStart);\n const diagonalReverseOffset = (originalEnd - modifiedEnd);\n // delta: The difference between the end diagonal and the start diagonal. This is used to relate diagonal numbers\n // relative to the start diagonal with diagonal numbers relative to the end diagonal.\n // The Even/Oddn-ness of this delta is important for determining when we should check for overlap\n const delta = diagonalReverseBase - diagonalForwardBase;\n const deltaIsEven = (delta % 2 === 0);\n // Here we set up the start and end points as the furthest points found so far\n // in both the forward and reverse directions, respectively\n forwardPoints[diagonalForwardBase] = originalStart;\n reversePoints[diagonalReverseBase] = originalEnd;\n // Remember if we quit early, and thus need to do a best-effort result instead of a real result.\n quitEarlyArr[0] = false;\n // A couple of points:\n // --With this method, we iterate on the number of differences between the two sequences.\n // The more differences there actually are, the longer this will take.\n // --Also, as the number of differences increases, we have to search on diagonals further\n // away from the reference diagonal (which is diagonalForwardBase for forward, diagonalReverseBase for reverse).\n // --We extend on even diagonals (relative to the reference diagonal) only when numDifferences\n // is even and odd diagonals only when numDifferences is odd.\n for (let numDifferences = 1; numDifferences <= (maxDifferences / 2) + 1; numDifferences++) {\n let furthestOriginalIndex = 0;\n let furthestModifiedIndex = 0;\n // Run the algorithm in the forward direction\n diagonalForwardStart = this.ClipDiagonalBound(diagonalForwardBase - numDifferences, numDifferences, diagonalForwardBase, numDiagonals);\n diagonalForwardEnd = this.ClipDiagonalBound(diagonalForwardBase + numDifferences, numDifferences, diagonalForwardBase, numDiagonals);\n for (let diagonal = diagonalForwardStart; diagonal <= diagonalForwardEnd; diagonal += 2) {\n // STEP 1: We extend the furthest reaching point in the present diagonal\n // by looking at the diagonals above and below and picking the one whose point\n // is further away from the start point (originalStart, modifiedStart)\n if (diagonal === diagonalForwardStart || (diagonal < diagonalForwardEnd && forwardPoints[diagonal - 1] < forwardPoints[diagonal + 1])) {\n originalIndex = forwardPoints[diagonal + 1];\n }\n else {\n originalIndex = forwardPoints[diagonal - 1] + 1;\n }\n modifiedIndex = originalIndex - (diagonal - diagonalForwardBase) - diagonalForwardOffset;\n // Save the current originalIndex so we can test for false overlap in step 3\n const tempOriginalIndex = originalIndex;\n // STEP 2: We can continue to extend the furthest reaching point in the present diagonal\n // so long as the elements are equal.\n while (originalIndex < originalEnd && modifiedIndex < modifiedEnd && this.ElementsAreEqual(originalIndex + 1, modifiedIndex + 1)) {\n originalIndex++;\n modifiedIndex++;\n }\n forwardPoints[diagonal] = originalIndex;\n if (originalIndex + modifiedIndex > furthestOriginalIndex + furthestModifiedIndex) {\n furthestOriginalIndex = originalIndex;\n furthestModifiedIndex = modifiedIndex;\n }\n // STEP 3: If delta is odd (overlap first happens on forward when delta is odd)\n // and diagonal is in the range of reverse diagonals computed for numDifferences-1\n // (the previous iteration; we haven't computed reverse diagonals for numDifferences yet)\n // then check for overlap.\n if (!deltaIsEven && Math.abs(diagonal - diagonalReverseBase) <= (numDifferences - 1)) {\n if (originalIndex >= reversePoints[diagonal]) {\n midOriginalArr[0] = originalIndex;\n midModifiedArr[0] = modifiedIndex;\n if (tempOriginalIndex <= reversePoints[diagonal] && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n // BINGO! We overlapped, and we have the full trace in memory!\n return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n }\n else {\n // Either false overlap, or we didn't have enough memory for the full trace\n // Just return the recursion point\n return null;\n }\n }\n }\n }\n // Check to see if we should be quitting early, before moving on to the next iteration.\n const matchLengthOfLongest = ((furthestOriginalIndex - originalStart) + (furthestModifiedIndex - modifiedStart) - numDifferences) / 2;\n if (this.ContinueProcessingPredicate !== null && !this.ContinueProcessingPredicate(furthestOriginalIndex, matchLengthOfLongest)) {\n // We can't finish, so skip ahead to generating a result from what we have.\n quitEarlyArr[0] = true;\n // Use the furthest distance we got in the forward direction.\n midOriginalArr[0] = furthestOriginalIndex;\n midModifiedArr[0] = furthestModifiedIndex;\n if (matchLengthOfLongest > 0 && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n // Enough of the history is in memory to walk it backwards\n return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n }\n else {\n // We didn't actually remember enough of the history.\n //Since we are quitting the diff early, we need to shift back the originalStart and modified start\n //back into the boundary limits since we decremented their value above beyond the boundary limit.\n originalStart++;\n modifiedStart++;\n return [\n new DiffChange(originalStart, originalEnd - originalStart + 1, modifiedStart, modifiedEnd - modifiedStart + 1)\n ];\n }\n }\n // Run the algorithm in the reverse direction\n diagonalReverseStart = this.ClipDiagonalBound(diagonalReverseBase - numDifferences, numDifferences, diagonalReverseBase, numDiagonals);\n diagonalReverseEnd = this.ClipDiagonalBound(diagonalReverseBase + numDifferences, numDifferences, diagonalReverseBase, numDiagonals);\n for (let diagonal = diagonalReverseStart; diagonal <= diagonalReverseEnd; diagonal += 2) {\n // STEP 1: We extend the furthest reaching point in the present diagonal\n // by looking at the diagonals above and below and picking the one whose point\n // is further away from the start point (originalEnd, modifiedEnd)\n if (diagonal === diagonalReverseStart || (diagonal < diagonalReverseEnd && reversePoints[diagonal - 1] >= reversePoints[diagonal + 1])) {\n originalIndex = reversePoints[diagonal + 1] - 1;\n }\n else {\n originalIndex = reversePoints[diagonal - 1];\n }\n modifiedIndex = originalIndex - (diagonal - diagonalReverseBase) - diagonalReverseOffset;\n // Save the current originalIndex so we can test for false overlap\n const tempOriginalIndex = originalIndex;\n // STEP 2: We can continue to extend the furthest reaching point in the present diagonal\n // as long as the elements are equal.\n while (originalIndex > originalStart && modifiedIndex > modifiedStart && this.ElementsAreEqual(originalIndex, modifiedIndex)) {\n originalIndex--;\n modifiedIndex--;\n }\n reversePoints[diagonal] = originalIndex;\n // STEP 4: If delta is even (overlap first happens on reverse when delta is even)\n // and diagonal is in the range of forward diagonals computed for numDifferences\n // then check for overlap.\n if (deltaIsEven && Math.abs(diagonal - diagonalForwardBase) <= numDifferences) {\n if (originalIndex <= forwardPoints[diagonal]) {\n midOriginalArr[0] = originalIndex;\n midModifiedArr[0] = modifiedIndex;\n if (tempOriginalIndex >= forwardPoints[diagonal] && 1447 /* LocalConstants.MaxDifferencesHistory */ > 0 && numDifferences <= (1447 /* LocalConstants.MaxDifferencesHistory */ + 1)) {\n // BINGO! We overlapped, and we have the full trace in memory!\n return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n }\n else {\n // Either false overlap, or we didn't have enough memory for the full trace\n // Just return the recursion point\n return null;\n }\n }\n }\n }\n // Save current vectors to history before the next iteration\n if (numDifferences <= 1447 /* LocalConstants.MaxDifferencesHistory */) {\n // We are allocating space for one extra int, which we fill with\n // the index of the diagonal base index\n let temp = new Int32Array(diagonalForwardEnd - diagonalForwardStart + 2);\n temp[0] = diagonalForwardBase - diagonalForwardStart + 1;\n MyArray.Copy2(forwardPoints, diagonalForwardStart, temp, 1, diagonalForwardEnd - diagonalForwardStart + 1);\n this.m_forwardHistory.push(temp);\n temp = new Int32Array(diagonalReverseEnd - diagonalReverseStart + 2);\n temp[0] = diagonalReverseBase - diagonalReverseStart + 1;\n MyArray.Copy2(reversePoints, diagonalReverseStart, temp, 1, diagonalReverseEnd - diagonalReverseStart + 1);\n this.m_reverseHistory.push(temp);\n }\n }\n // If we got here, then we have the full trace in history. We just have to convert it to a change list\n // NOTE: This part is a bit messy\n return this.WALKTRACE(diagonalForwardBase, diagonalForwardStart, diagonalForwardEnd, diagonalForwardOffset, diagonalReverseBase, diagonalReverseStart, diagonalReverseEnd, diagonalReverseOffset, forwardPoints, reversePoints, originalIndex, originalEnd, midOriginalArr, modifiedIndex, modifiedEnd, midModifiedArr, deltaIsEven, quitEarlyArr);\n }\n /**\n * Shifts the given changes to provide a more intuitive diff.\n * While the first element in a diff matches the first element after the diff,\n * we shift the diff down.\n *\n * @param changes The list of changes to shift\n * @returns The shifted changes\n */\n PrettifyChanges(changes) {\n // Shift all the changes down first\n for (let i = 0; i < changes.length; i++) {\n const change = changes[i];\n const originalStop = (i < changes.length - 1) ? changes[i + 1].originalStart : this._originalElementsOrHash.length;\n const modifiedStop = (i < changes.length - 1) ? changes[i + 1].modifiedStart : this._modifiedElementsOrHash.length;\n const checkOriginal = change.originalLength > 0;\n const checkModified = change.modifiedLength > 0;\n while (change.originalStart + change.originalLength < originalStop\n && change.modifiedStart + change.modifiedLength < modifiedStop\n && (!checkOriginal || this.OriginalElementsAreEqual(change.originalStart, change.originalStart + change.originalLength))\n && (!checkModified || this.ModifiedElementsAreEqual(change.modifiedStart, change.modifiedStart + change.modifiedLength))) {\n const startStrictEqual = this.ElementsAreStrictEqual(change.originalStart, change.modifiedStart);\n const endStrictEqual = this.ElementsAreStrictEqual(change.originalStart + change.originalLength, change.modifiedStart + change.modifiedLength);\n if (endStrictEqual && !startStrictEqual) {\n // moving the change down would create an equal change, but the elements are not strict equal\n break;\n }\n change.originalStart++;\n change.modifiedStart++;\n }\n const mergedChangeArr = [null];\n if (i < changes.length - 1 && this.ChangesOverlap(changes[i], changes[i + 1], mergedChangeArr)) {\n changes[i] = mergedChangeArr[0];\n changes.splice(i + 1, 1);\n i--;\n continue;\n }\n }\n // Shift changes back up until we hit empty or whitespace-only lines\n for (let i = changes.length - 1; i >= 0; i--) {\n const change = changes[i];\n let originalStop = 0;\n let modifiedStop = 0;\n if (i > 0) {\n const prevChange = changes[i - 1];\n originalStop = prevChange.originalStart + prevChange.originalLength;\n modifiedStop = prevChange.modifiedStart + prevChange.modifiedLength;\n }\n const checkOriginal = change.originalLength > 0;\n const checkModified = change.modifiedLength > 0;\n let bestDelta = 0;\n let bestScore = this._boundaryScore(change.originalStart, change.originalLength, change.modifiedStart, change.modifiedLength);\n for (let delta = 1;; delta++) {\n const originalStart = change.originalStart - delta;\n const modifiedStart = change.modifiedStart - delta;\n if (originalStart < originalStop || modifiedStart < modifiedStop) {\n break;\n }\n if (checkOriginal && !this.OriginalElementsAreEqual(originalStart, originalStart + change.originalLength)) {\n break;\n }\n if (checkModified && !this.ModifiedElementsAreEqual(modifiedStart, modifiedStart + change.modifiedLength)) {\n break;\n }\n const touchingPreviousChange = (originalStart === originalStop && modifiedStart === modifiedStop);\n const score = ((touchingPreviousChange ? 5 : 0)\n + this._boundaryScore(originalStart, change.originalLength, modifiedStart, change.modifiedLength));\n if (score > bestScore) {\n bestScore = score;\n bestDelta = delta;\n }\n }\n change.originalStart -= bestDelta;\n change.modifiedStart -= bestDelta;\n const mergedChangeArr = [null];\n if (i > 0 && this.ChangesOverlap(changes[i - 1], changes[i], mergedChangeArr)) {\n changes[i - 1] = mergedChangeArr[0];\n changes.splice(i, 1);\n i++;\n continue;\n }\n }\n // There could be multiple longest common substrings.\n // Give preference to the ones containing longer lines\n if (this._hasStrings) {\n for (let i = 1, len = changes.length; i < len; i++) {\n const aChange = changes[i - 1];\n const bChange = changes[i];\n const matchedLength = bChange.originalStart - aChange.originalStart - aChange.originalLength;\n const aOriginalStart = aChange.originalStart;\n const bOriginalEnd = bChange.originalStart + bChange.originalLength;\n const abOriginalLength = bOriginalEnd - aOriginalStart;\n const aModifiedStart = aChange.modifiedStart;\n const bModifiedEnd = bChange.modifiedStart + bChange.modifiedLength;\n const abModifiedLength = bModifiedEnd - aModifiedStart;\n // Avoid wasting a lot of time with these searches\n if (matchedLength < 5 && abOriginalLength < 20 && abModifiedLength < 20) {\n const t = this._findBetterContiguousSequence(aOriginalStart, abOriginalLength, aModifiedStart, abModifiedLength, matchedLength);\n if (t) {\n const [originalMatchStart, modifiedMatchStart] = t;\n if (originalMatchStart !== aChange.originalStart + aChange.originalLength || modifiedMatchStart !== aChange.modifiedStart + aChange.modifiedLength) {\n // switch to another sequence that has a better score\n aChange.originalLength = originalMatchStart - aChange.originalStart;\n aChange.modifiedLength = modifiedMatchStart - aChange.modifiedStart;\n bChange.originalStart = originalMatchStart + matchedLength;\n bChange.modifiedStart = modifiedMatchStart + matchedLength;\n bChange.originalLength = bOriginalEnd - bChange.originalStart;\n bChange.modifiedLength = bModifiedEnd - bChange.modifiedStart;\n }\n }\n }\n }\n }\n return changes;\n }\n _findBetterContiguousSequence(originalStart, originalLength, modifiedStart, modifiedLength, desiredLength) {\n if (originalLength < desiredLength || modifiedLength < desiredLength) {\n return null;\n }\n const originalMax = originalStart + originalLength - desiredLength + 1;\n const modifiedMax = modifiedStart + modifiedLength - desiredLength + 1;\n let bestScore = 0;\n let bestOriginalStart = 0;\n let bestModifiedStart = 0;\n for (let i = originalStart; i < originalMax; i++) {\n for (let j = modifiedStart; j < modifiedMax; j++) {\n const score = this._contiguousSequenceScore(i, j, desiredLength);\n if (score > 0 && score > bestScore) {\n bestScore = score;\n bestOriginalStart = i;\n bestModifiedStart = j;\n }\n }\n }\n if (bestScore > 0) {\n return [bestOriginalStart, bestModifiedStart];\n }\n return null;\n }\n _contiguousSequenceScore(originalStart, modifiedStart, length) {\n let score = 0;\n for (let l = 0; l < length; l++) {\n if (!this.ElementsAreEqual(originalStart + l, modifiedStart + l)) {\n return 0;\n }\n score += this._originalStringElements[originalStart + l].length;\n }\n return score;\n }\n _OriginalIsBoundary(index) {\n if (index <= 0 || index >= this._originalElementsOrHash.length - 1) {\n return true;\n }\n return (this._hasStrings && /^\\s*$/.test(this._originalStringElements[index]));\n }\n _OriginalRegionIsBoundary(originalStart, originalLength) {\n if (this._OriginalIsBoundary(originalStart) || this._OriginalIsBoundary(originalStart - 1)) {\n return true;\n }\n if (originalLength > 0) {\n const originalEnd = originalStart + originalLength;\n if (this._OriginalIsBoundary(originalEnd - 1) || this._OriginalIsBoundary(originalEnd)) {\n return true;\n }\n }\n return false;\n }\n _ModifiedIsBoundary(index) {\n if (index <= 0 || index >= this._modifiedElementsOrHash.length - 1) {\n return true;\n }\n return (this._hasStrings && /^\\s*$/.test(this._modifiedStringElements[index]));\n }\n _ModifiedRegionIsBoundary(modifiedStart, modifiedLength) {\n if (this._ModifiedIsBoundary(modifiedStart) || this._ModifiedIsBoundary(modifiedStart - 1)) {\n return true;\n }\n if (modifiedLength > 0) {\n const modifiedEnd = modifiedStart + modifiedLength;\n if (this._ModifiedIsBoundary(modifiedEnd - 1) || this._ModifiedIsBoundary(modifiedEnd)) {\n return true;\n }\n }\n return false;\n }\n _boundaryScore(originalStart, originalLength, modifiedStart, modifiedLength) {\n const originalScore = (this._OriginalRegionIsBoundary(originalStart, originalLength) ? 1 : 0);\n const modifiedScore = (this._ModifiedRegionIsBoundary(modifiedStart, modifiedLength) ? 1 : 0);\n return (originalScore + modifiedScore);\n }\n /**\n * Concatenates the two input DiffChange lists and returns the resulting\n * list.\n * @param The left changes\n * @param The right changes\n * @returns The concatenated list\n */\n ConcatenateChanges(left, right) {\n const mergedChangeArr = [];\n if (left.length === 0 || right.length === 0) {\n return (right.length > 0) ? right : left;\n }\n else if (this.ChangesOverlap(left[left.length - 1], right[0], mergedChangeArr)) {\n // Since we break the problem down recursively, it is possible that we\n // might recurse in the middle of a change thereby splitting it into\n // two changes. Here in the combining stage, we detect and fuse those\n // changes back together\n const result = new Array(left.length + right.length - 1);\n MyArray.Copy(left, 0, result, 0, left.length - 1);\n result[left.length - 1] = mergedChangeArr[0];\n MyArray.Copy(right, 1, result, left.length, right.length - 1);\n return result;\n }\n else {\n const result = new Array(left.length + right.length);\n MyArray.Copy(left, 0, result, 0, left.length);\n MyArray.Copy(right, 0, result, left.length, right.length);\n return result;\n }\n }\n /**\n * Returns true if the two changes overlap and can be merged into a single\n * change\n * @param left The left change\n * @param right The right change\n * @param mergedChange The merged change if the two overlap, null otherwise\n * @returns True if the two changes overlap\n */\n ChangesOverlap(left, right, mergedChangeArr) {\n Debug.Assert(left.originalStart <= right.originalStart, 'Left change is not less than or equal to right change');\n Debug.Assert(left.modifiedStart <= right.modifiedStart, 'Left change is not less than or equal to right change');\n if (left.originalStart + left.originalLength >= right.originalStart || left.modifiedStart + left.modifiedLength >= right.modifiedStart) {\n const originalStart = left.originalStart;\n let originalLength = left.originalLength;\n const modifiedStart = left.modifiedStart;\n let modifiedLength = left.modifiedLength;\n if (left.originalStart + left.originalLength >= right.originalStart) {\n originalLength = right.originalStart + right.originalLength - left.originalStart;\n }\n if (left.modifiedStart + left.modifiedLength >= right.modifiedStart) {\n modifiedLength = right.modifiedStart + right.modifiedLength - left.modifiedStart;\n }\n mergedChangeArr[0] = new DiffChange(originalStart, originalLength, modifiedStart, modifiedLength);\n return true;\n }\n else {\n mergedChangeArr[0] = null;\n return false;\n }\n }\n /**\n * Helper method used to clip a diagonal index to the range of valid\n * diagonals. This also decides whether or not the diagonal index,\n * if it exceeds the boundary, should be clipped to the boundary or clipped\n * one inside the boundary depending on the Even/Odd status of the boundary\n * and numDifferences.\n * @param diagonal The index of the diagonal to clip.\n * @param numDifferences The current number of differences being iterated upon.\n * @param diagonalBaseIndex The base reference diagonal.\n * @param numDiagonals The total number of diagonals.\n * @returns The clipped diagonal index.\n */\n ClipDiagonalBound(diagonal, numDifferences, diagonalBaseIndex, numDiagonals) {\n if (diagonal >= 0 && diagonal < numDiagonals) {\n // Nothing to clip, its in range\n return diagonal;\n }\n // diagonalsBelow: The number of diagonals below the reference diagonal\n // diagonalsAbove: The number of diagonals above the reference diagonal\n const diagonalsBelow = diagonalBaseIndex;\n const diagonalsAbove = numDiagonals - diagonalBaseIndex - 1;\n const diffEven = (numDifferences % 2 === 0);\n if (diagonal < 0) {\n const lowerBoundEven = (diagonalsBelow % 2 === 0);\n return (diffEven === lowerBoundEven) ? 0 : 1;\n }\n else {\n const upperBoundEven = (diagonalsAbove % 2 === 0);\n return (diffEven === upperBoundEven) ? numDiagonals - 1 : numDiagonals - 2;\n }\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/process.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nlet safeProcess;\n// Native sandbox environment\nif (typeof globals.vscode !== 'undefined' && typeof globals.vscode.process !== 'undefined') {\n const sandboxProcess = globals.vscode.process;\n safeProcess = {\n get platform() { return sandboxProcess.platform; },\n get arch() { return sandboxProcess.arch; },\n get env() { return sandboxProcess.env; },\n cwd() { return sandboxProcess.cwd(); }\n };\n}\n// Native node.js environment\nelse if (typeof process !== 'undefined') {\n safeProcess = {\n get platform() { return process.platform; },\n get arch() { return process.arch; },\n get env() { return process.env; },\n cwd() { return process.env['VSCODE_CWD'] || process.cwd(); }\n };\n}\n// Web environment\nelse {\n safeProcess = {\n // Supported\n get platform() { return isWindows ? 'win32' : isMacintosh ? 'darwin' : 'linux'; },\n get arch() { return undefined; /* arch is undefined in web */ },\n // Unsupported\n get env() { return {}; },\n cwd() { return '/'; }\n };\n}\n/**\n * Provides safe access to the `cwd` property in node.js, sandboxed or web\n * environments.\n *\n * Note: in web, this property is hardcoded to be `/`.\n *\n * @skipMangle\n */\nconst process_cwd = safeProcess.cwd;\n/**\n * Provides safe access to the `env` property in node.js, sandboxed or web\n * environments.\n *\n * Note: in web, this property is hardcoded to be `{}`.\n */\nconst env = safeProcess.env;\n/**\n * Provides safe access to the `platform` property in node.js, sandboxed or web\n * environments.\n */\nconst platform = safeProcess.platform;\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/path.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n// NOTE: VSCode's copy of nodejs path library to be usable in common (non-node) namespace\n// Copied from: https://github.com/nodejs/node/blob/v16.14.2/lib/path.js\n/**\n * Copyright Joyent, Inc. and other Node contributors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to permit\n * persons to whom the Software is furnished to do so, subject to the\n * following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n * USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nconst CHAR_UPPERCASE_A = 65; /* A */\nconst CHAR_LOWERCASE_A = 97; /* a */\nconst CHAR_UPPERCASE_Z = 90; /* Z */\nconst CHAR_LOWERCASE_Z = 122; /* z */\nconst CHAR_DOT = 46; /* . */\nconst CHAR_FORWARD_SLASH = 47; /* / */\nconst CHAR_BACKWARD_SLASH = 92; /* \\ */\nconst CHAR_COLON = 58; /* : */\nconst CHAR_QUESTION_MARK = 63; /* ? */\nclass ErrorInvalidArgType extends Error {\n constructor(name, expected, actual) {\n // determiner: 'must be' or 'must not be'\n let determiner;\n if (typeof expected === 'string' && expected.indexOf('not ') === 0) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n }\n else {\n determiner = 'must be';\n }\n const type = name.indexOf('.') !== -1 ? 'property' : 'argument';\n let msg = `The \"${name}\" ${type} ${determiner} of type ${expected}`;\n msg += `. Received type ${typeof actual}`;\n super(msg);\n this.code = 'ERR_INVALID_ARG_TYPE';\n }\n}\nfunction validateObject(pathObject, name) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new ErrorInvalidArgType(name, 'Object', pathObject);\n }\n}\nfunction validateString(value, name) {\n if (typeof value !== 'string') {\n throw new ErrorInvalidArgType(name, 'string', value);\n }\n}\nconst platformIsWin32 = (platform === 'win32');\nfunction isPathSeparator(code) {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n}\nfunction isPosixPathSeparator(code) {\n return code === CHAR_FORWARD_SLASH;\n}\nfunction isWindowsDeviceRoot(code) {\n return (code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||\n (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z);\n}\n// Resolves . and .. elements in a path with directory names\nfunction normalizeString(path, allowAboveRoot, separator, isPathSeparator) {\n let res = '';\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let code = 0;\n for (let i = 0; i <= path.length; ++i) {\n if (i < path.length) {\n code = path.charCodeAt(i);\n }\n else if (isPathSeparator(code)) {\n break;\n }\n else {\n code = CHAR_FORWARD_SLASH;\n }\n if (isPathSeparator(code)) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n }\n else if (dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 ||\n res.charCodeAt(res.length - 1) !== CHAR_DOT ||\n res.charCodeAt(res.length - 2) !== CHAR_DOT) {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf(separator);\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n }\n else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n else if (res.length !== 0) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n res += res.length > 0 ? `${separator}..` : '..';\n lastSegmentLength = 2;\n }\n }\n else {\n if (res.length > 0) {\n res += `${separator}${path.slice(lastSlash + 1, i)}`;\n }\n else {\n res = path.slice(lastSlash + 1, i);\n }\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n }\n else if (code === CHAR_DOT && dots !== -1) {\n ++dots;\n }\n else {\n dots = -1;\n }\n }\n return res;\n}\nfunction path_format(sep, pathObject) {\n validateObject(pathObject, 'pathObject');\n const dir = pathObject.dir || pathObject.root;\n const base = pathObject.base ||\n `${pathObject.name || ''}${pathObject.ext || ''}`;\n if (!dir) {\n return base;\n }\n return dir === pathObject.root ? `${dir}${base}` : `${dir}${sep}${base}`;\n}\nconst win32 = {\n // path.resolve([from ...], to)\n resolve(...pathSegments) {\n let resolvedDevice = '';\n let resolvedTail = '';\n let resolvedAbsolute = false;\n for (let i = pathSegments.length - 1; i >= -1; i--) {\n let path;\n if (i >= 0) {\n path = pathSegments[i];\n validateString(path, 'path');\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n }\n else if (resolvedDevice.length === 0) {\n path = process_cwd();\n }\n else {\n // Windows has the concept of drive-specific current working\n // directories. If we've resolved a drive letter but not yet an\n // absolute path, get cwd for that drive, or the process cwd if\n // the drive cwd is not available. We're sure the device is not\n // a UNC path at this points, because UNC paths are always absolute.\n path = env[`=${resolvedDevice}`] || process_cwd();\n // Verify that a cwd was found and that it actually points\n // to our drive. If not, default to the drive's root.\n if (path === undefined ||\n (path.slice(0, 2).toLowerCase() !== resolvedDevice.toLowerCase() &&\n path.charCodeAt(2) === CHAR_BACKWARD_SLASH)) {\n path = `${resolvedDevice}\\\\`;\n }\n }\n const len = path.length;\n let rootEnd = 0;\n let device = '';\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n // Try to match a root\n if (len === 1) {\n if (isPathSeparator(code)) {\n // `path` contains just a path separator\n rootEnd = 1;\n isAbsolute = true;\n }\n }\n else if (isPathSeparator(code)) {\n // Possible UNC root\n // If we started with a separator, we know we at least have an\n // absolute path of some kind (UNC or otherwise)\n isAbsolute = true;\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n // Matched!\n last = j;\n // Match 1 or more path separators\n while (j < len && isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j === len || j !== last) {\n // We matched a UNC root\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n }\n else {\n rootEnd = 1;\n }\n }\n else if (isWindowsDeviceRoot(code) &&\n path.charCodeAt(1) === CHAR_COLON) {\n // Possible device root\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2 && isPathSeparator(path.charCodeAt(2))) {\n // Treat separator following drive name as an absolute path\n // indicator\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n if (device.length > 0) {\n if (resolvedDevice.length > 0) {\n if (device.toLowerCase() !== resolvedDevice.toLowerCase()) {\n // This path points to another device so it is not applicable\n continue;\n }\n }\n else {\n resolvedDevice = device;\n }\n }\n if (resolvedAbsolute) {\n if (resolvedDevice.length > 0) {\n break;\n }\n }\n else {\n resolvedTail = `${path.slice(rootEnd)}\\\\${resolvedTail}`;\n resolvedAbsolute = isAbsolute;\n if (isAbsolute && resolvedDevice.length > 0) {\n break;\n }\n }\n }\n // At this point the path should be resolved to a full absolute path,\n // but handle relative paths to be safe (might happen when process.cwd()\n // fails)\n // Normalize the tail path\n resolvedTail = normalizeString(resolvedTail, !resolvedAbsolute, '\\\\', isPathSeparator);\n return resolvedAbsolute ?\n `${resolvedDevice}\\\\${resolvedTail}` :\n `${resolvedDevice}${resolvedTail}` || '.';\n },\n normalize(path) {\n validateString(path, 'path');\n const len = path.length;\n if (len === 0) {\n return '.';\n }\n let rootEnd = 0;\n let device;\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n // Try to match a root\n if (len === 1) {\n // `path` contains just a single char, exit early to avoid\n // unnecessary work\n return isPosixPathSeparator(code) ? '\\\\' : path;\n }\n if (isPathSeparator(code)) {\n // Possible UNC root\n // If we started with a separator, we know we at least have an absolute\n // path of some kind (UNC or otherwise)\n isAbsolute = true;\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n // Matched!\n last = j;\n // Match 1 or more path separators\n while (j < len && isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j === len) {\n // We matched a UNC root only\n // Return the normalized version of the UNC root since there\n // is nothing left to process\n return `\\\\\\\\${firstPart}\\\\${path.slice(last)}\\\\`;\n }\n if (j !== last) {\n // We matched a UNC root with leftovers\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n }\n else {\n rootEnd = 1;\n }\n }\n else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n // Possible device root\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2 && isPathSeparator(path.charCodeAt(2))) {\n // Treat separator following drive name as an absolute path\n // indicator\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n let tail = rootEnd < len ?\n normalizeString(path.slice(rootEnd), !isAbsolute, '\\\\', isPathSeparator) :\n '';\n if (tail.length === 0 && !isAbsolute) {\n tail = '.';\n }\n if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) {\n tail += '\\\\';\n }\n if (device === undefined) {\n return isAbsolute ? `\\\\${tail}` : tail;\n }\n return isAbsolute ? `${device}\\\\${tail}` : `${device}${tail}`;\n },\n isAbsolute(path) {\n validateString(path, 'path');\n const len = path.length;\n if (len === 0) {\n return false;\n }\n const code = path.charCodeAt(0);\n return isPathSeparator(code) ||\n // Possible device root\n (len > 2 &&\n isWindowsDeviceRoot(code) &&\n path.charCodeAt(1) === CHAR_COLON &&\n isPathSeparator(path.charCodeAt(2)));\n },\n join(...paths) {\n if (paths.length === 0) {\n return '.';\n }\n let joined;\n let firstPart;\n for (let i = 0; i < paths.length; ++i) {\n const arg = paths[i];\n validateString(arg, 'path');\n if (arg.length > 0) {\n if (joined === undefined) {\n joined = firstPart = arg;\n }\n else {\n joined += `\\\\${arg}`;\n }\n }\n }\n if (joined === undefined) {\n return '.';\n }\n // Make sure that the joined path doesn't start with two slashes, because\n // normalize() will mistake it for a UNC path then.\n //\n // This step is skipped when it is very clear that the user actually\n // intended to point at a UNC path. This is assumed when the first\n // non-empty string arguments starts with exactly two slashes followed by\n // at least one more non-slash character.\n //\n // Note that for normalize() to treat a path as a UNC path it needs to\n // have at least 2 components, so we don't filter for that here.\n // This means that the user can use join to construct UNC paths from\n // a server name and a share name; for example:\n // path.join('//server', 'share') -> '\\\\\\\\server\\\\share\\\\')\n let needsReplace = true;\n let slashCount = 0;\n if (typeof firstPart === 'string' && isPathSeparator(firstPart.charCodeAt(0))) {\n ++slashCount;\n const firstLen = firstPart.length;\n if (firstLen > 1 && isPathSeparator(firstPart.charCodeAt(1))) {\n ++slashCount;\n if (firstLen > 2) {\n if (isPathSeparator(firstPart.charCodeAt(2))) {\n ++slashCount;\n }\n else {\n // We matched a UNC path in the first part\n needsReplace = false;\n }\n }\n }\n }\n if (needsReplace) {\n // Find any more consecutive slashes we need to replace\n while (slashCount < joined.length &&\n isPathSeparator(joined.charCodeAt(slashCount))) {\n slashCount++;\n }\n // Replace the slashes if needed\n if (slashCount >= 2) {\n joined = `\\\\${joined.slice(slashCount)}`;\n }\n }\n return win32.normalize(joined);\n },\n // It will solve the relative path from `from` to `to`, for instance:\n // from = 'C:\\\\orandea\\\\test\\\\aaa'\n // to = 'C:\\\\orandea\\\\impl\\\\bbb'\n // The output of the function should be: '..\\\\..\\\\impl\\\\bbb'\n relative(from, to) {\n validateString(from, 'from');\n validateString(to, 'to');\n if (from === to) {\n return '';\n }\n const fromOrig = win32.resolve(from);\n const toOrig = win32.resolve(to);\n if (fromOrig === toOrig) {\n return '';\n }\n from = fromOrig.toLowerCase();\n to = toOrig.toLowerCase();\n if (from === to) {\n return '';\n }\n // Trim any leading backslashes\n let fromStart = 0;\n while (fromStart < from.length &&\n from.charCodeAt(fromStart) === CHAR_BACKWARD_SLASH) {\n fromStart++;\n }\n // Trim trailing backslashes (applicable to UNC paths only)\n let fromEnd = from.length;\n while (fromEnd - 1 > fromStart &&\n from.charCodeAt(fromEnd - 1) === CHAR_BACKWARD_SLASH) {\n fromEnd--;\n }\n const fromLen = fromEnd - fromStart;\n // Trim any leading backslashes\n let toStart = 0;\n while (toStart < to.length &&\n to.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) {\n toStart++;\n }\n // Trim trailing backslashes (applicable to UNC paths only)\n let toEnd = to.length;\n while (toEnd - 1 > toStart &&\n to.charCodeAt(toEnd - 1) === CHAR_BACKWARD_SLASH) {\n toEnd--;\n }\n const toLen = toEnd - toStart;\n // Compare paths to find the longest common path from root\n const length = fromLen < toLen ? fromLen : toLen;\n let lastCommonSep = -1;\n let i = 0;\n for (; i < length; i++) {\n const fromCode = from.charCodeAt(fromStart + i);\n if (fromCode !== to.charCodeAt(toStart + i)) {\n break;\n }\n else if (fromCode === CHAR_BACKWARD_SLASH) {\n lastCommonSep = i;\n }\n }\n // We found a mismatch before the first common path separator was seen, so\n // return the original `to`.\n if (i !== length) {\n if (lastCommonSep === -1) {\n return toOrig;\n }\n }\n else {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === CHAR_BACKWARD_SLASH) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\foo\\\\bar\\\\baz'\n return toOrig.slice(toStart + i + 1);\n }\n if (i === 2) {\n // We get here if `from` is the device root.\n // For example: from='C:\\\\'; to='C:\\\\foo'\n return toOrig.slice(toStart + i);\n }\n }\n if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === CHAR_BACKWARD_SLASH) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\foo'\n lastCommonSep = i;\n }\n else if (i === 2) {\n // We get here if `to` is the device root.\n // For example: from='C:\\\\foo\\\\bar'; to='C:\\\\'\n lastCommonSep = 3;\n }\n }\n if (lastCommonSep === -1) {\n lastCommonSep = 0;\n }\n }\n let out = '';\n // Generate the relative path based on the path difference between `to` and\n // `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === CHAR_BACKWARD_SLASH) {\n out += out.length === 0 ? '..' : '\\\\..';\n }\n }\n toStart += lastCommonSep;\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0) {\n return `${out}${toOrig.slice(toStart, toEnd)}`;\n }\n if (toOrig.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) {\n ++toStart;\n }\n return toOrig.slice(toStart, toEnd);\n },\n toNamespacedPath(path) {\n // Note: this will *probably* throw somewhere.\n if (typeof path !== 'string' || path.length === 0) {\n return path;\n }\n const resolvedPath = win32.resolve(path);\n if (resolvedPath.length <= 2) {\n return path;\n }\n if (resolvedPath.charCodeAt(0) === CHAR_BACKWARD_SLASH) {\n // Possible UNC root\n if (resolvedPath.charCodeAt(1) === CHAR_BACKWARD_SLASH) {\n const code = resolvedPath.charCodeAt(2);\n if (code !== CHAR_QUESTION_MARK && code !== CHAR_DOT) {\n // Matched non-long UNC root, convert the path to a long UNC path\n return `\\\\\\\\?\\\\UNC\\\\${resolvedPath.slice(2)}`;\n }\n }\n }\n else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0)) &&\n resolvedPath.charCodeAt(1) === CHAR_COLON &&\n resolvedPath.charCodeAt(2) === CHAR_BACKWARD_SLASH) {\n // Matched device root, convert the path to a long UNC path\n return `\\\\\\\\?\\\\${resolvedPath}`;\n }\n return path;\n },\n dirname(path) {\n validateString(path, 'path');\n const len = path.length;\n if (len === 0) {\n return '.';\n }\n let rootEnd = -1;\n let offset = 0;\n const code = path.charCodeAt(0);\n if (len === 1) {\n // `path` contains just a path separator, exit early to avoid\n // unnecessary work or a dot.\n return isPathSeparator(code) ? path : '.';\n }\n // Try to match a root\n if (isPathSeparator(code)) {\n // Possible UNC root\n rootEnd = offset = 1;\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more path separators\n while (j < len && isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j === len) {\n // We matched a UNC root only\n return path;\n }\n if (j !== last) {\n // We matched a UNC root with leftovers\n // Offset by 1 to include the separator after the UNC root to\n // treat it as a \"normal root\" on top of a (UNC) root\n rootEnd = offset = j + 1;\n }\n }\n }\n }\n // Possible device root\n }\n else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n rootEnd = len > 2 && isPathSeparator(path.charCodeAt(2)) ? 3 : 2;\n offset = rootEnd;\n }\n let end = -1;\n let matchedSlash = true;\n for (let i = len - 1; i >= offset; --i) {\n if (isPathSeparator(path.charCodeAt(i))) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n }\n else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n if (end === -1) {\n if (rootEnd === -1) {\n return '.';\n }\n end = rootEnd;\n }\n return path.slice(0, end);\n },\n basename(path, ext) {\n if (ext !== undefined) {\n validateString(ext, 'ext');\n }\n validateString(path, 'path');\n let start = 0;\n let end = -1;\n let matchedSlash = true;\n let i;\n // Check for a drive letter prefix so as not to mistake the following\n // path separator as an extra separator at the end of the path that can be\n // disregarded\n if (path.length >= 2 &&\n isWindowsDeviceRoot(path.charCodeAt(0)) &&\n path.charCodeAt(1) === CHAR_COLON) {\n start = 2;\n }\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext === path) {\n return '';\n }\n let extIdx = ext.length - 1;\n let firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= start; --i) {\n const code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n }\n else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n }\n else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n if (start === end) {\n end = firstNonSlashEnd;\n }\n else if (end === -1) {\n end = path.length;\n }\n return path.slice(start, end);\n }\n for (i = path.length - 1; i >= start; --i) {\n if (isPathSeparator(path.charCodeAt(i))) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n }\n else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n if (end === -1) {\n return '';\n }\n return path.slice(start, end);\n },\n extname(path) {\n validateString(path, 'path');\n let start = 0;\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n // Check for a drive letter prefix so as not to mistake the following\n // path separator as an extra separator at the end of the path that can be\n // disregarded\n if (path.length >= 2 &&\n path.charCodeAt(1) === CHAR_COLON &&\n isWindowsDeviceRoot(path.charCodeAt(0))) {\n start = startPart = 2;\n }\n for (let i = path.length - 1; i >= start; --i) {\n const code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === CHAR_DOT) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) {\n startDot = i;\n }\n else if (preDotState !== 1) {\n preDotState = 1;\n }\n }\n else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n if (startDot === -1 ||\n end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n (preDotState === 1 &&\n startDot === end - 1 &&\n startDot === startPart + 1)) {\n return '';\n }\n return path.slice(startDot, end);\n },\n format: path_format.bind(null, '\\\\'),\n parse(path) {\n validateString(path, 'path');\n const ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) {\n return ret;\n }\n const len = path.length;\n let rootEnd = 0;\n let code = path.charCodeAt(0);\n if (len === 1) {\n if (isPathSeparator(code)) {\n // `path` contains just a path separator, exit early to avoid\n // unnecessary work\n ret.root = ret.dir = path;\n return ret;\n }\n ret.base = ret.name = path;\n return ret;\n }\n // Try to match a root\n if (isPathSeparator(code)) {\n // Possible UNC root\n rootEnd = 1;\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more path separators\n while (j < len && isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n while (j < len && !isPathSeparator(path.charCodeAt(j))) {\n j++;\n }\n if (j === len) {\n // We matched a UNC root only\n rootEnd = j;\n }\n else if (j !== last) {\n // We matched a UNC root with leftovers\n rootEnd = j + 1;\n }\n }\n }\n }\n }\n else if (isWindowsDeviceRoot(code) && path.charCodeAt(1) === CHAR_COLON) {\n // Possible device root\n if (len <= 2) {\n // `path` contains just a drive root, exit early to avoid\n // unnecessary work\n ret.root = ret.dir = path;\n return ret;\n }\n rootEnd = 2;\n if (isPathSeparator(path.charCodeAt(2))) {\n if (len === 3) {\n // `path` contains just a drive root, exit early to avoid\n // unnecessary work\n ret.root = ret.dir = path;\n return ret;\n }\n rootEnd = 3;\n }\n }\n if (rootEnd > 0) {\n ret.root = path.slice(0, rootEnd);\n }\n let startDot = -1;\n let startPart = rootEnd;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n // Get non-dir info\n for (; i >= rootEnd; --i) {\n code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === CHAR_DOT) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) {\n startDot = i;\n }\n else if (preDotState !== 1) {\n preDotState = 1;\n }\n }\n else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n if (end !== -1) {\n if (startDot === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n (preDotState === 1 &&\n startDot === end - 1 &&\n startDot === startPart + 1)) {\n ret.base = ret.name = path.slice(startPart, end);\n }\n else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n ret.ext = path.slice(startDot, end);\n }\n }\n // If the directory is the root, use the entire root as the `dir` including\n // the trailing slash if any (`C:\\abc` -> `C:\\`). Otherwise, strip out the\n // trailing slash (`C:\\abc\\def` -> `C:\\abc`).\n if (startPart > 0 && startPart !== rootEnd) {\n ret.dir = path.slice(0, startPart - 1);\n }\n else {\n ret.dir = ret.root;\n }\n return ret;\n },\n sep: '\\\\',\n delimiter: ';',\n win32: null,\n posix: null\n};\nconst posixCwd = (() => {\n if (platformIsWin32) {\n // Converts Windows' backslash path separators to POSIX forward slashes\n // and truncates any drive indicator\n const regexp = /\\\\/g;\n return () => {\n const cwd = process_cwd().replace(regexp, '/');\n return cwd.slice(cwd.indexOf('/'));\n };\n }\n // We're already on POSIX, no need for any transformations\n return () => process_cwd();\n})();\nconst posix = {\n // path.resolve([from ...], to)\n resolve(...pathSegments) {\n let resolvedPath = '';\n let resolvedAbsolute = false;\n for (let i = pathSegments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n const path = i >= 0 ? pathSegments[i] : posixCwd();\n validateString(path, 'path');\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n resolvedPath = `${path}/${resolvedPath}`;\n resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n }\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n // Normalize the path\n resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator);\n if (resolvedAbsolute) {\n return `/${resolvedPath}`;\n }\n return resolvedPath.length > 0 ? resolvedPath : '.';\n },\n normalize(path) {\n validateString(path, 'path');\n if (path.length === 0) {\n return '.';\n }\n const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n const trailingSeparator = path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH;\n // Normalize the path\n path = normalizeString(path, !isAbsolute, '/', isPosixPathSeparator);\n if (path.length === 0) {\n if (isAbsolute) {\n return '/';\n }\n return trailingSeparator ? './' : '.';\n }\n if (trailingSeparator) {\n path += '/';\n }\n return isAbsolute ? `/${path}` : path;\n },\n isAbsolute(path) {\n validateString(path, 'path');\n return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n },\n join(...paths) {\n if (paths.length === 0) {\n return '.';\n }\n let joined;\n for (let i = 0; i < paths.length; ++i) {\n const arg = paths[i];\n validateString(arg, 'path');\n if (arg.length > 0) {\n if (joined === undefined) {\n joined = arg;\n }\n else {\n joined += `/${arg}`;\n }\n }\n }\n if (joined === undefined) {\n return '.';\n }\n return posix.normalize(joined);\n },\n relative(from, to) {\n validateString(from, 'from');\n validateString(to, 'to');\n if (from === to) {\n return '';\n }\n // Trim leading forward slashes.\n from = posix.resolve(from);\n to = posix.resolve(to);\n if (from === to) {\n return '';\n }\n const fromStart = 1;\n const fromEnd = from.length;\n const fromLen = fromEnd - fromStart;\n const toStart = 1;\n const toLen = to.length - toStart;\n // Compare paths to find the longest common path from root\n const length = (fromLen < toLen ? fromLen : toLen);\n let lastCommonSep = -1;\n let i = 0;\n for (; i < length; i++) {\n const fromCode = from.charCodeAt(fromStart + i);\n if (fromCode !== to.charCodeAt(toStart + i)) {\n break;\n }\n else if (fromCode === CHAR_FORWARD_SLASH) {\n lastCommonSep = i;\n }\n }\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n }\n if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n }\n else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === CHAR_FORWARD_SLASH) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n }\n else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo/bar'; to='/'\n lastCommonSep = 0;\n }\n }\n }\n let out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`.\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n out += out.length === 0 ? '..' : '/..';\n }\n }\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts.\n return `${out}${to.slice(toStart + lastCommonSep)}`;\n },\n toNamespacedPath(path) {\n // Non-op on posix systems\n return path;\n },\n dirname(path) {\n validateString(path, 'path');\n if (path.length === 0) {\n return '.';\n }\n const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n let end = -1;\n let matchedSlash = true;\n for (let i = path.length - 1; i >= 1; --i) {\n if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n }\n else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n if (end === -1) {\n return hasRoot ? '/' : '.';\n }\n if (hasRoot && end === 1) {\n return '//';\n }\n return path.slice(0, end);\n },\n basename(path, ext) {\n if (ext !== undefined) {\n validateString(ext, 'ext');\n }\n validateString(path, 'path');\n let start = 0;\n let end = -1;\n let matchedSlash = true;\n let i;\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext === path) {\n return '';\n }\n let extIdx = ext.length - 1;\n let firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n const code = path.charCodeAt(i);\n if (code === CHAR_FORWARD_SLASH) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n }\n else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n }\n else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n if (start === end) {\n end = firstNonSlashEnd;\n }\n else if (end === -1) {\n end = path.length;\n }\n return path.slice(start, end);\n }\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n }\n else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n if (end === -1) {\n return '';\n }\n return path.slice(start, end);\n },\n extname(path) {\n validateString(path, 'path');\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n for (let i = path.length - 1; i >= 0; --i) {\n const code = path.charCodeAt(i);\n if (code === CHAR_FORWARD_SLASH) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === CHAR_DOT) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) {\n startDot = i;\n }\n else if (preDotState !== 1) {\n preDotState = 1;\n }\n }\n else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n if (startDot === -1 ||\n end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n (preDotState === 1 &&\n startDot === end - 1 &&\n startDot === startPart + 1)) {\n return '';\n }\n return path.slice(startDot, end);\n },\n format: path_format.bind(null, '/'),\n parse(path) {\n validateString(path, 'path');\n const ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) {\n return ret;\n }\n const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n let start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n }\n else {\n start = 0;\n }\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n // Get non-dir info\n for (; i >= start; --i) {\n const code = path.charCodeAt(i);\n if (code === CHAR_FORWARD_SLASH) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === CHAR_DOT) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) {\n startDot = i;\n }\n else if (preDotState !== 1) {\n preDotState = 1;\n }\n }\n else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n if (end !== -1) {\n const start = startPart === 0 && isAbsolute ? 1 : startPart;\n if (startDot === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n (preDotState === 1 &&\n startDot === end - 1 &&\n startDot === startPart + 1)) {\n ret.base = ret.name = path.slice(start, end);\n }\n else {\n ret.name = path.slice(start, startDot);\n ret.base = path.slice(start, end);\n ret.ext = path.slice(startDot, end);\n }\n }\n if (startPart > 0) {\n ret.dir = path.slice(0, startPart - 1);\n }\n else if (isAbsolute) {\n ret.dir = '/';\n }\n return ret;\n },\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\nposix.win32 = win32.win32 = win32;\nposix.posix = win32.posix = posix;\nconst normalize = (platformIsWin32 ? win32.normalize : posix.normalize);\nconst resolve = (platformIsWin32 ? win32.resolve : posix.resolve);\nconst relative = (platformIsWin32 ? win32.relative : posix.relative);\nconst dirname = (platformIsWin32 ? win32.dirname : posix.dirname);\nconst basename = (platformIsWin32 ? win32.basename : posix.basename);\nconst extname = (platformIsWin32 ? win32.extname : posix.extname);\nconst sep = (platformIsWin32 ? win32.sep : posix.sep);\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/uri.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\nconst _schemePattern = /^\\w[\\w\\d+.-]*$/;\nconst _singleSlashStart = /^\\//;\nconst _doubleSlashStart = /^\\/\\//;\nfunction _validateUri(ret, _strict) {\n // scheme, must be set\n if (!ret.scheme && _strict) {\n throw new Error(`[UriError]: Scheme is missing: {scheme: \"\", authority: \"${ret.authority}\", path: \"${ret.path}\", query: \"${ret.query}\", fragment: \"${ret.fragment}\"}`);\n }\n // scheme, https://tools.ietf.org/html/rfc3986#section-3.1\n // ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n if (ret.scheme && !_schemePattern.test(ret.scheme)) {\n throw new Error('[UriError]: Scheme contains illegal characters.');\n }\n // path, http://tools.ietf.org/html/rfc3986#section-3.3\n // If a URI contains an authority component, then the path component\n // must either be empty or begin with a slash (\"/\") character. If a URI\n // does not contain an authority component, then the path cannot begin\n // with two slash characters (\"//\").\n if (ret.path) {\n if (ret.authority) {\n if (!_singleSlashStart.test(ret.path)) {\n throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character');\n }\n }\n else {\n if (_doubleSlashStart.test(ret.path)) {\n throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")');\n }\n }\n }\n}\n// for a while we allowed uris *without* schemes and this is the migration\n// for them, e.g. an uri without scheme and without strict-mode warns and falls\n// back to the file-scheme. that should cause the least carnage and still be a\n// clear warning\nfunction _schemeFix(scheme, _strict) {\n if (!scheme && !_strict) {\n return 'file';\n }\n return scheme;\n}\n// implements a bit of https://tools.ietf.org/html/rfc3986#section-5\nfunction _referenceResolution(scheme, path) {\n // the slash-character is our 'default base' as we don't\n // support constructing URIs relative to other URIs. This\n // also means that we alter and potentially break paths.\n // see https://tools.ietf.org/html/rfc3986#section-5.1.4\n switch (scheme) {\n case 'https':\n case 'http':\n case 'file':\n if (!path) {\n path = _slash;\n }\n else if (path[0] !== _slash) {\n path = _slash + path;\n }\n break;\n }\n return path;\n}\nconst _empty = '';\nconst _slash = '/';\nconst _regexp = /^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n/**\n * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.\n * This class is a simple parser which creates the basic component parts\n * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation\n * and encoding.\n *\n * ```txt\n * foo://example.com:8042/over/there?name=ferret#nose\n * \\_/ \\______________/\\_________/ \\_________/ \\__/\n * | | | | |\n * scheme authority path query fragment\n * | _____________________|__\n * / \\ / \\\n * urn:example:animal:ferret:nose\n * ```\n */\nclass uri_URI {\n static isUri(thing) {\n if (thing instanceof uri_URI) {\n return true;\n }\n if (!thing) {\n return false;\n }\n return typeof thing.authority === 'string'\n && typeof thing.fragment === 'string'\n && typeof thing.path === 'string'\n && typeof thing.query === 'string'\n && typeof thing.scheme === 'string'\n && typeof thing.fsPath === 'string'\n && typeof thing.with === 'function'\n && typeof thing.toString === 'function';\n }\n /**\n * @internal\n */\n constructor(schemeOrData, authority, path, query, fragment, _strict = false) {\n if (typeof schemeOrData === 'object') {\n this.scheme = schemeOrData.scheme || _empty;\n this.authority = schemeOrData.authority || _empty;\n this.path = schemeOrData.path || _empty;\n this.query = schemeOrData.query || _empty;\n this.fragment = schemeOrData.fragment || _empty;\n // no validation because it's this URI\n // that creates uri components.\n // _validateUri(this);\n }\n else {\n this.scheme = _schemeFix(schemeOrData, _strict);\n this.authority = authority || _empty;\n this.path = _referenceResolution(this.scheme, path || _empty);\n this.query = query || _empty;\n this.fragment = fragment || _empty;\n _validateUri(this, _strict);\n }\n }\n // ---- filesystem path -----------------------\n /**\n * Returns a string representing the corresponding file system path of this URI.\n * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the\n * platform specific path separator.\n *\n * * Will *not* validate the path for invalid characters and semantics.\n * * Will *not* look at the scheme of this URI.\n * * The result shall *not* be used for display purposes but for accessing a file on disk.\n *\n *\n * The *difference* to `URI#path` is the use of the platform specific separator and the handling\n * of UNC paths. See the below sample of a file-uri with an authority (UNC path).\n *\n * ```ts\n const u = URI.parse('file://server/c$/folder/file.txt')\n u.authority === 'server'\n u.path === '/shares/c$/file.txt'\n u.fsPath === '\\\\server\\c$\\folder\\file.txt'\n ```\n *\n * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,\n * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working\n * with URIs that represent files on disk (`file` scheme).\n */\n get fsPath() {\n // if (this.scheme !== 'file') {\n // \tconsole.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);\n // }\n return uriToFsPath(this, false);\n }\n // ---- modify to new -------------------------\n with(change) {\n if (!change) {\n return this;\n }\n let { scheme, authority, path, query, fragment } = change;\n if (scheme === undefined) {\n scheme = this.scheme;\n }\n else if (scheme === null) {\n scheme = _empty;\n }\n if (authority === undefined) {\n authority = this.authority;\n }\n else if (authority === null) {\n authority = _empty;\n }\n if (path === undefined) {\n path = this.path;\n }\n else if (path === null) {\n path = _empty;\n }\n if (query === undefined) {\n query = this.query;\n }\n else if (query === null) {\n query = _empty;\n }\n if (fragment === undefined) {\n fragment = this.fragment;\n }\n else if (fragment === null) {\n fragment = _empty;\n }\n if (scheme === this.scheme\n && authority === this.authority\n && path === this.path\n && query === this.query\n && fragment === this.fragment) {\n return this;\n }\n return new Uri(scheme, authority, path, query, fragment);\n }\n // ---- parse & validate ------------------------\n /**\n * Creates a new URI from a string, e.g. `http://www.example.com/some/path`,\n * `file:///usr/home`, or `scheme:with/path`.\n *\n * @param value A string which represents an URI (see `URI#toString`).\n */\n static parse(value, _strict = false) {\n const match = _regexp.exec(value);\n if (!match) {\n return new Uri(_empty, _empty, _empty, _empty, _empty);\n }\n return new Uri(match[2] || _empty, percentDecode(match[4] || _empty), percentDecode(match[5] || _empty), percentDecode(match[7] || _empty), percentDecode(match[9] || _empty), _strict);\n }\n /**\n * Creates a new URI from a file system path, e.g. `c:\\my\\files`,\n * `/usr/home`, or `\\\\server\\share\\some\\path`.\n *\n * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument\n * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**\n * `URI.parse('file://' + path)` because the path might contain characters that are\n * interpreted (# and ?). See the following sample:\n * ```ts\n const good = URI.file('/coding/c#/project1');\n good.scheme === 'file';\n good.path === '/coding/c#/project1';\n good.fragment === '';\n const bad = URI.parse('file://' + '/coding/c#/project1');\n bad.scheme === 'file';\n bad.path === '/coding/c'; // path is now broken\n bad.fragment === '/project1';\n ```\n *\n * @param path A file system path (see `URI#fsPath`)\n */\n static file(path) {\n let authority = _empty;\n // normalize to fwd-slashes on windows,\n // on other systems bwd-slashes are valid\n // filename character, eg /f\\oo/ba\\r.txt\n if (isWindows) {\n path = path.replace(/\\\\/g, _slash);\n }\n // check for authority as used in UNC shares\n // or use the path as given\n if (path[0] === _slash && path[1] === _slash) {\n const idx = path.indexOf(_slash, 2);\n if (idx === -1) {\n authority = path.substring(2);\n path = _slash;\n }\n else {\n authority = path.substring(2, idx);\n path = path.substring(idx) || _slash;\n }\n }\n return new Uri('file', authority, path, _empty, _empty);\n }\n /**\n * Creates new URI from uri components.\n *\n * Unless `strict` is `true` the scheme is defaults to be `file`. This function performs\n * validation and should be used for untrusted uri components retrieved from storage,\n * user input, command arguments etc\n */\n static from(components, strict) {\n const result = new Uri(components.scheme, components.authority, components.path, components.query, components.fragment, strict);\n return result;\n }\n /**\n * Join a URI path with path fragments and normalizes the resulting path.\n *\n * @param uri The input URI.\n * @param pathFragment The path fragment to add to the URI path.\n * @returns The resulting URI.\n */\n static joinPath(uri, ...pathFragment) {\n if (!uri.path) {\n throw new Error(`[UriError]: cannot call joinPath on URI without path`);\n }\n let newPath;\n if (isWindows && uri.scheme === 'file') {\n newPath = uri_URI.file(win32.join(uriToFsPath(uri, true), ...pathFragment)).path;\n }\n else {\n newPath = posix.join(uri.path, ...pathFragment);\n }\n return uri.with({ path: newPath });\n }\n // ---- printing/externalize ---------------------------\n /**\n * Creates a string representation for this URI. It's guaranteed that calling\n * `URI.parse` with the result of this function creates an URI which is equal\n * to this URI.\n *\n * * The result shall *not* be used for display purposes but for externalization or transport.\n * * The result will be encoded using the percentage encoding and encoding happens mostly\n * ignore the scheme-specific encoding rules.\n *\n * @param skipEncoding Do not encode the result, default is `false`\n */\n toString(skipEncoding = false) {\n return _asFormatted(this, skipEncoding);\n }\n toJSON() {\n return this;\n }\n static revive(data) {\n var _a, _b;\n if (!data) {\n return data;\n }\n else if (data instanceof uri_URI) {\n return data;\n }\n else {\n const result = new Uri(data);\n result._formatted = (_a = data.external) !== null && _a !== void 0 ? _a : null;\n result._fsPath = data._sep === _pathSepMarker ? (_b = data.fsPath) !== null && _b !== void 0 ? _b : null : null;\n return result;\n }\n }\n}\nconst _pathSepMarker = isWindows ? 1 : undefined;\n// This class exists so that URI is compatible with vscode.Uri (API).\nclass Uri extends uri_URI {\n constructor() {\n super(...arguments);\n this._formatted = null;\n this._fsPath = null;\n }\n get fsPath() {\n if (!this._fsPath) {\n this._fsPath = uriToFsPath(this, false);\n }\n return this._fsPath;\n }\n toString(skipEncoding = false) {\n if (!skipEncoding) {\n if (!this._formatted) {\n this._formatted = _asFormatted(this, false);\n }\n return this._formatted;\n }\n else {\n // we don't cache that\n return _asFormatted(this, true);\n }\n }\n toJSON() {\n const res = {\n $mid: 1 /* MarshalledId.Uri */\n };\n // cached state\n if (this._fsPath) {\n res.fsPath = this._fsPath;\n res._sep = _pathSepMarker;\n }\n if (this._formatted) {\n res.external = this._formatted;\n }\n //--- uri components\n if (this.path) {\n res.path = this.path;\n }\n // TODO\n // this isn't correct and can violate the UriComponents contract but\n // this is part of the vscode.Uri API and we shouldn't change how that\n // works anymore\n if (this.scheme) {\n res.scheme = this.scheme;\n }\n if (this.authority) {\n res.authority = this.authority;\n }\n if (this.query) {\n res.query = this.query;\n }\n if (this.fragment) {\n res.fragment = this.fragment;\n }\n return res;\n }\n}\n// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2\nconst encodeTable = {\n [58 /* CharCode.Colon */]: '%3A',\n [47 /* CharCode.Slash */]: '%2F',\n [63 /* CharCode.QuestionMark */]: '%3F',\n [35 /* CharCode.Hash */]: '%23',\n [91 /* CharCode.OpenSquareBracket */]: '%5B',\n [93 /* CharCode.CloseSquareBracket */]: '%5D',\n [64 /* CharCode.AtSign */]: '%40',\n [33 /* CharCode.ExclamationMark */]: '%21',\n [36 /* CharCode.DollarSign */]: '%24',\n [38 /* CharCode.Ampersand */]: '%26',\n [39 /* CharCode.SingleQuote */]: '%27',\n [40 /* CharCode.OpenParen */]: '%28',\n [41 /* CharCode.CloseParen */]: '%29',\n [42 /* CharCode.Asterisk */]: '%2A',\n [43 /* CharCode.Plus */]: '%2B',\n [44 /* CharCode.Comma */]: '%2C',\n [59 /* CharCode.Semicolon */]: '%3B',\n [61 /* CharCode.Equals */]: '%3D',\n [32 /* CharCode.Space */]: '%20',\n};\nfunction encodeURIComponentFast(uriComponent, isPath, isAuthority) {\n let res = undefined;\n let nativeEncodePos = -1;\n for (let pos = 0; pos < uriComponent.length; pos++) {\n const code = uriComponent.charCodeAt(pos);\n // unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3\n if ((code >= 97 /* CharCode.a */ && code <= 122 /* CharCode.z */)\n || (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */)\n || (code >= 48 /* CharCode.Digit0 */ && code <= 57 /* CharCode.Digit9 */)\n || code === 45 /* CharCode.Dash */\n || code === 46 /* CharCode.Period */\n || code === 95 /* CharCode.Underline */\n || code === 126 /* CharCode.Tilde */\n || (isPath && code === 47 /* CharCode.Slash */)\n || (isAuthority && code === 91 /* CharCode.OpenSquareBracket */)\n || (isAuthority && code === 93 /* CharCode.CloseSquareBracket */)\n || (isAuthority && code === 58 /* CharCode.Colon */)) {\n // check if we are delaying native encode\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n nativeEncodePos = -1;\n }\n // check if we write into a new string (by default we try to return the param)\n if (res !== undefined) {\n res += uriComponent.charAt(pos);\n }\n }\n else {\n // encoding needed, we need to allocate a new string\n if (res === undefined) {\n res = uriComponent.substr(0, pos);\n }\n // check with default table first\n const escaped = encodeTable[code];\n if (escaped !== undefined) {\n // check if we are delaying native encode\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n nativeEncodePos = -1;\n }\n // append escaped variant to result\n res += escaped;\n }\n else if (nativeEncodePos === -1) {\n // use native encode only when needed\n nativeEncodePos = pos;\n }\n }\n }\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos));\n }\n return res !== undefined ? res : uriComponent;\n}\nfunction encodeURIComponentMinimal(path) {\n let res = undefined;\n for (let pos = 0; pos < path.length; pos++) {\n const code = path.charCodeAt(pos);\n if (code === 35 /* CharCode.Hash */ || code === 63 /* CharCode.QuestionMark */) {\n if (res === undefined) {\n res = path.substr(0, pos);\n }\n res += encodeTable[code];\n }\n else {\n if (res !== undefined) {\n res += path[pos];\n }\n }\n }\n return res !== undefined ? res : path;\n}\n/**\n * Compute `fsPath` for the given uri\n */\nfunction uriToFsPath(uri, keepDriveLetterCasing) {\n let value;\n if (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {\n // unc path: file://shares/c$/far/boo\n value = `//${uri.authority}${uri.path}`;\n }\n else if (uri.path.charCodeAt(0) === 47 /* CharCode.Slash */\n && (uri.path.charCodeAt(1) >= 65 /* CharCode.A */ && uri.path.charCodeAt(1) <= 90 /* CharCode.Z */ || uri.path.charCodeAt(1) >= 97 /* CharCode.a */ && uri.path.charCodeAt(1) <= 122 /* CharCode.z */)\n && uri.path.charCodeAt(2) === 58 /* CharCode.Colon */) {\n if (!keepDriveLetterCasing) {\n // windows drive letter: file:///c:/far/boo\n value = uri.path[1].toLowerCase() + uri.path.substr(2);\n }\n else {\n value = uri.path.substr(1);\n }\n }\n else {\n // other path\n value = uri.path;\n }\n if (isWindows) {\n value = value.replace(/\\//g, '\\\\');\n }\n return value;\n}\n/**\n * Create the external version of a uri\n */\nfunction _asFormatted(uri, skipEncoding) {\n const encoder = !skipEncoding\n ? encodeURIComponentFast\n : encodeURIComponentMinimal;\n let res = '';\n let { scheme, authority, path, query, fragment } = uri;\n if (scheme) {\n res += scheme;\n res += ':';\n }\n if (authority || scheme === 'file') {\n res += _slash;\n res += _slash;\n }\n if (authority) {\n let idx = authority.indexOf('@');\n if (idx !== -1) {\n // <user>@<auth>\n const userinfo = authority.substr(0, idx);\n authority = authority.substr(idx + 1);\n idx = userinfo.lastIndexOf(':');\n if (idx === -1) {\n res += encoder(userinfo, false, false);\n }\n else {\n // <user>:<pass>@<auth>\n res += encoder(userinfo.substr(0, idx), false, false);\n res += ':';\n res += encoder(userinfo.substr(idx + 1), false, true);\n }\n res += '@';\n }\n authority = authority.toLowerCase();\n idx = authority.lastIndexOf(':');\n if (idx === -1) {\n res += encoder(authority, false, true);\n }\n else {\n // <auth>:<port>\n res += encoder(authority.substr(0, idx), false, true);\n res += authority.substr(idx);\n }\n }\n if (path) {\n // lower-case windows drive letters in /C:/fff or C:/fff\n if (path.length >= 3 && path.charCodeAt(0) === 47 /* CharCode.Slash */ && path.charCodeAt(2) === 58 /* CharCode.Colon */) {\n const code = path.charCodeAt(1);\n if (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) {\n path = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // \"/c:\".length === 3\n }\n }\n else if (path.length >= 2 && path.charCodeAt(1) === 58 /* CharCode.Colon */) {\n const code = path.charCodeAt(0);\n if (code >= 65 /* CharCode.A */ && code <= 90 /* CharCode.Z */) {\n path = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // \"/c:\".length === 3\n }\n }\n // encode the rest of the path\n res += encoder(path, true, false);\n }\n if (query) {\n res += '?';\n res += encoder(query, false, false);\n }\n if (fragment) {\n res += '#';\n res += !skipEncoding ? encodeURIComponentFast(fragment, false, false) : fragment;\n }\n return res;\n}\n// --- decode\nfunction decodeURIComponentGraceful(str) {\n try {\n return decodeURIComponent(str);\n }\n catch (_a) {\n if (str.length > 3) {\n return str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));\n }\n else {\n return str;\n }\n }\n}\nconst _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;\nfunction percentDecode(str) {\n if (!str.match(_rEncodedAsHex)) {\n return str;\n }\n return str.replace(_rEncodedAsHex, (match) => decodeURIComponentGraceful(match));\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/core/position.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n/**\n * A position in the editor.\n */\nclass position_Position {\n constructor(lineNumber, column) {\n this.lineNumber = lineNumber;\n this.column = column;\n }\n /**\n * Create a new position from this position.\n *\n * @param newLineNumber new line number\n * @param newColumn new column\n */\n with(newLineNumber = this.lineNumber, newColumn = this.column) {\n if (newLineNumber === this.lineNumber && newColumn === this.column) {\n return this;\n }\n else {\n return new position_Position(newLineNumber, newColumn);\n }\n }\n /**\n * Derive a new position from this position.\n *\n * @param deltaLineNumber line number delta\n * @param deltaColumn column delta\n */\n delta(deltaLineNumber = 0, deltaColumn = 0) {\n return this.with(this.lineNumber + deltaLineNumber, this.column + deltaColumn);\n }\n /**\n * Test if this position equals other position\n */\n equals(other) {\n return position_Position.equals(this, other);\n }\n /**\n * Test if position `a` equals position `b`\n */\n static equals(a, b) {\n if (!a && !b) {\n return true;\n }\n return (!!a &&\n !!b &&\n a.lineNumber === b.lineNumber &&\n a.column === b.column);\n }\n /**\n * Test if this position is before other position.\n * If the two positions are equal, the result will be false.\n */\n isBefore(other) {\n return position_Position.isBefore(this, other);\n }\n /**\n * Test if position `a` is before position `b`.\n * If the two positions are equal, the result will be false.\n */\n static isBefore(a, b) {\n if (a.lineNumber < b.lineNumber) {\n return true;\n }\n if (b.lineNumber < a.lineNumber) {\n return false;\n }\n return a.column < b.column;\n }\n /**\n * Test if this position is before other position.\n * If the two positions are equal, the result will be true.\n */\n isBeforeOrEqual(other) {\n return position_Position.isBeforeOrEqual(this, other);\n }\n /**\n * Test if position `a` is before position `b`.\n * If the two positions are equal, the result will be true.\n */\n static isBeforeOrEqual(a, b) {\n if (a.lineNumber < b.lineNumber) {\n return true;\n }\n if (b.lineNumber < a.lineNumber) {\n return false;\n }\n return a.column <= b.column;\n }\n /**\n * A function that compares positions, useful for sorting\n */\n static compare(a, b) {\n const aLineNumber = a.lineNumber | 0;\n const bLineNumber = b.lineNumber | 0;\n if (aLineNumber === bLineNumber) {\n const aColumn = a.column | 0;\n const bColumn = b.column | 0;\n return aColumn - bColumn;\n }\n return aLineNumber - bLineNumber;\n }\n /**\n * Clone this position.\n */\n clone() {\n return new position_Position(this.lineNumber, this.column);\n }\n /**\n * Convert to a human-readable representation.\n */\n toString() {\n return '(' + this.lineNumber + ',' + this.column + ')';\n }\n // ---\n /**\n * Create a `Position` from an `IPosition`.\n */\n static lift(pos) {\n return new position_Position(pos.lineNumber, pos.column);\n }\n /**\n * Test if `obj` is an `IPosition`.\n */\n static isIPosition(obj) {\n return (obj\n && (typeof obj.lineNumber === 'number')\n && (typeof obj.column === 'number'));\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/core/range.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * A range in the editor. (startLineNumber,startColumn) is <= (endLineNumber,endColumn)\n */\nclass range_Range {\n constructor(startLineNumber, startColumn, endLineNumber, endColumn) {\n if ((startLineNumber > endLineNumber) || (startLineNumber === endLineNumber && startColumn > endColumn)) {\n this.startLineNumber = endLineNumber;\n this.startColumn = endColumn;\n this.endLineNumber = startLineNumber;\n this.endColumn = startColumn;\n }\n else {\n this.startLineNumber = startLineNumber;\n this.startColumn = startColumn;\n this.endLineNumber = endLineNumber;\n this.endColumn = endColumn;\n }\n }\n /**\n * Test if this range is empty.\n */\n isEmpty() {\n return range_Range.isEmpty(this);\n }\n /**\n * Test if `range` is empty.\n */\n static isEmpty(range) {\n return (range.startLineNumber === range.endLineNumber && range.startColumn === range.endColumn);\n }\n /**\n * Test if position is in this range. If the position is at the edges, will return true.\n */\n containsPosition(position) {\n return range_Range.containsPosition(this, position);\n }\n /**\n * Test if `position` is in `range`. If the position is at the edges, will return true.\n */\n static containsPosition(range, position) {\n if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {\n return false;\n }\n if (position.lineNumber === range.startLineNumber && position.column < range.startColumn) {\n return false;\n }\n if (position.lineNumber === range.endLineNumber && position.column > range.endColumn) {\n return false;\n }\n return true;\n }\n /**\n * Test if `position` is in `range`. If the position is at the edges, will return false.\n * @internal\n */\n static strictContainsPosition(range, position) {\n if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {\n return false;\n }\n if (position.lineNumber === range.startLineNumber && position.column <= range.startColumn) {\n return false;\n }\n if (position.lineNumber === range.endLineNumber && position.column >= range.endColumn) {\n return false;\n }\n return true;\n }\n /**\n * Test if range is in this range. If the range is equal to this range, will return true.\n */\n containsRange(range) {\n return range_Range.containsRange(this, range);\n }\n /**\n * Test if `otherRange` is in `range`. If the ranges are equal, will return true.\n */\n static containsRange(range, otherRange) {\n if (otherRange.startLineNumber < range.startLineNumber || otherRange.endLineNumber < range.startLineNumber) {\n return false;\n }\n if (otherRange.startLineNumber > range.endLineNumber || otherRange.endLineNumber > range.endLineNumber) {\n return false;\n }\n if (otherRange.startLineNumber === range.startLineNumber && otherRange.startColumn < range.startColumn) {\n return false;\n }\n if (otherRange.endLineNumber === range.endLineNumber && otherRange.endColumn > range.endColumn) {\n return false;\n }\n return true;\n }\n /**\n * Test if `range` is strictly in this range. `range` must start after and end before this range for the result to be true.\n */\n strictContainsRange(range) {\n return range_Range.strictContainsRange(this, range);\n }\n /**\n * Test if `otherRange` is strictly in `range` (must start after, and end before). If the ranges are equal, will return false.\n */\n static strictContainsRange(range, otherRange) {\n if (otherRange.startLineNumber < range.startLineNumber || otherRange.endLineNumber < range.startLineNumber) {\n return false;\n }\n if (otherRange.startLineNumber > range.endLineNumber || otherRange.endLineNumber > range.endLineNumber) {\n return false;\n }\n if (otherRange.startLineNumber === range.startLineNumber && otherRange.startColumn <= range.startColumn) {\n return false;\n }\n if (otherRange.endLineNumber === range.endLineNumber && otherRange.endColumn >= range.endColumn) {\n return false;\n }\n return true;\n }\n /**\n * A reunion of the two ranges.\n * The smallest position will be used as the start point, and the largest one as the end point.\n */\n plusRange(range) {\n return range_Range.plusRange(this, range);\n }\n /**\n * A reunion of the two ranges.\n * The smallest position will be used as the start point, and the largest one as the end point.\n */\n static plusRange(a, b) {\n let startLineNumber;\n let startColumn;\n let endLineNumber;\n let endColumn;\n if (b.startLineNumber < a.startLineNumber) {\n startLineNumber = b.startLineNumber;\n startColumn = b.startColumn;\n }\n else if (b.startLineNumber === a.startLineNumber) {\n startLineNumber = b.startLineNumber;\n startColumn = Math.min(b.startColumn, a.startColumn);\n }\n else {\n startLineNumber = a.startLineNumber;\n startColumn = a.startColumn;\n }\n if (b.endLineNumber > a.endLineNumber) {\n endLineNumber = b.endLineNumber;\n endColumn = b.endColumn;\n }\n else if (b.endLineNumber === a.endLineNumber) {\n endLineNumber = b.endLineNumber;\n endColumn = Math.max(b.endColumn, a.endColumn);\n }\n else {\n endLineNumber = a.endLineNumber;\n endColumn = a.endColumn;\n }\n return new range_Range(startLineNumber, startColumn, endLineNumber, endColumn);\n }\n /**\n * A intersection of the two ranges.\n */\n intersectRanges(range) {\n return range_Range.intersectRanges(this, range);\n }\n /**\n * A intersection of the two ranges.\n */\n static intersectRanges(a, b) {\n let resultStartLineNumber = a.startLineNumber;\n let resultStartColumn = a.startColumn;\n let resultEndLineNumber = a.endLineNumber;\n let resultEndColumn = a.endColumn;\n const otherStartLineNumber = b.startLineNumber;\n const otherStartColumn = b.startColumn;\n const otherEndLineNumber = b.endLineNumber;\n const otherEndColumn = b.endColumn;\n if (resultStartLineNumber < otherStartLineNumber) {\n resultStartLineNumber = otherStartLineNumber;\n resultStartColumn = otherStartColumn;\n }\n else if (resultStartLineNumber === otherStartLineNumber) {\n resultStartColumn = Math.max(resultStartColumn, otherStartColumn);\n }\n if (resultEndLineNumber > otherEndLineNumber) {\n resultEndLineNumber = otherEndLineNumber;\n resultEndColumn = otherEndColumn;\n }\n else if (resultEndLineNumber === otherEndLineNumber) {\n resultEndColumn = Math.min(resultEndColumn, otherEndColumn);\n }\n // Check if selection is now empty\n if (resultStartLineNumber > resultEndLineNumber) {\n return null;\n }\n if (resultStartLineNumber === resultEndLineNumber && resultStartColumn > resultEndColumn) {\n return null;\n }\n return new range_Range(resultStartLineNumber, resultStartColumn, resultEndLineNumber, resultEndColumn);\n }\n /**\n * Test if this range equals other.\n */\n equalsRange(other) {\n return range_Range.equalsRange(this, other);\n }\n /**\n * Test if range `a` equals `b`.\n */\n static equalsRange(a, b) {\n if (!a && !b) {\n return true;\n }\n return (!!a &&\n !!b &&\n a.startLineNumber === b.startLineNumber &&\n a.startColumn === b.startColumn &&\n a.endLineNumber === b.endLineNumber &&\n a.endColumn === b.endColumn);\n }\n /**\n * Return the end position (which will be after or equal to the start position)\n */\n getEndPosition() {\n return range_Range.getEndPosition(this);\n }\n /**\n * Return the end position (which will be after or equal to the start position)\n */\n static getEndPosition(range) {\n return new position_Position(range.endLineNumber, range.endColumn);\n }\n /**\n * Return the start position (which will be before or equal to the end position)\n */\n getStartPosition() {\n return range_Range.getStartPosition(this);\n }\n /**\n * Return the start position (which will be before or equal to the end position)\n */\n static getStartPosition(range) {\n return new position_Position(range.startLineNumber, range.startColumn);\n }\n /**\n * Transform to a user presentable string representation.\n */\n toString() {\n return '[' + this.startLineNumber + ',' + this.startColumn + ' -> ' + this.endLineNumber + ',' + this.endColumn + ']';\n }\n /**\n * Create a new range using this range's start position, and using endLineNumber and endColumn as the end position.\n */\n setEndPosition(endLineNumber, endColumn) {\n return new range_Range(this.startLineNumber, this.startColumn, endLineNumber, endColumn);\n }\n /**\n * Create a new range using this range's end position, and using startLineNumber and startColumn as the start position.\n */\n setStartPosition(startLineNumber, startColumn) {\n return new range_Range(startLineNumber, startColumn, this.endLineNumber, this.endColumn);\n }\n /**\n * Create a new empty range using this range's start position.\n */\n collapseToStart() {\n return range_Range.collapseToStart(this);\n }\n /**\n * Create a new empty range using this range's start position.\n */\n static collapseToStart(range) {\n return new range_Range(range.startLineNumber, range.startColumn, range.startLineNumber, range.startColumn);\n }\n /**\n * Create a new empty range using this range's end position.\n */\n collapseToEnd() {\n return range_Range.collapseToEnd(this);\n }\n /**\n * Create a new empty range using this range's end position.\n */\n static collapseToEnd(range) {\n return new range_Range(range.endLineNumber, range.endColumn, range.endLineNumber, range.endColumn);\n }\n /**\n * Moves the range by the given amount of lines.\n */\n delta(lineCount) {\n return new range_Range(this.startLineNumber + lineCount, this.startColumn, this.endLineNumber + lineCount, this.endColumn);\n }\n // ---\n static fromPositions(start, end = start) {\n return new range_Range(start.lineNumber, start.column, end.lineNumber, end.column);\n }\n static lift(range) {\n if (!range) {\n return null;\n }\n return new range_Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n }\n /**\n * Test if `obj` is an `IRange`.\n */\n static isIRange(obj) {\n return (obj\n && (typeof obj.startLineNumber === 'number')\n && (typeof obj.startColumn === 'number')\n && (typeof obj.endLineNumber === 'number')\n && (typeof obj.endColumn === 'number'));\n }\n /**\n * Test if the two ranges are touching in any way.\n */\n static areIntersectingOrTouching(a, b) {\n // Check if `a` is before `b`\n if (a.endLineNumber < b.startLineNumber || (a.endLineNumber === b.startLineNumber && a.endColumn < b.startColumn)) {\n return false;\n }\n // Check if `b` is before `a`\n if (b.endLineNumber < a.startLineNumber || (b.endLineNumber === a.startLineNumber && b.endColumn < a.startColumn)) {\n return false;\n }\n // These ranges must intersect\n return true;\n }\n /**\n * Test if the two ranges are intersecting. If the ranges are touching it returns true.\n */\n static areIntersecting(a, b) {\n // Check if `a` is before `b`\n if (a.endLineNumber < b.startLineNumber || (a.endLineNumber === b.startLineNumber && a.endColumn <= b.startColumn)) {\n return false;\n }\n // Check if `b` is before `a`\n if (b.endLineNumber < a.startLineNumber || (b.endLineNumber === a.startLineNumber && b.endColumn <= a.startColumn)) {\n return false;\n }\n // These ranges must intersect\n return true;\n }\n /**\n * A function that compares ranges, useful for sorting ranges\n * It will first compare ranges on the startPosition and then on the endPosition\n */\n static compareRangesUsingStarts(a, b) {\n if (a && b) {\n const aStartLineNumber = a.startLineNumber | 0;\n const bStartLineNumber = b.startLineNumber | 0;\n if (aStartLineNumber === bStartLineNumber) {\n const aStartColumn = a.startColumn | 0;\n const bStartColumn = b.startColumn | 0;\n if (aStartColumn === bStartColumn) {\n const aEndLineNumber = a.endLineNumber | 0;\n const bEndLineNumber = b.endLineNumber | 0;\n if (aEndLineNumber === bEndLineNumber) {\n const aEndColumn = a.endColumn | 0;\n const bEndColumn = b.endColumn | 0;\n return aEndColumn - bEndColumn;\n }\n return aEndLineNumber - bEndLineNumber;\n }\n return aStartColumn - bStartColumn;\n }\n return aStartLineNumber - bStartLineNumber;\n }\n const aExists = (a ? 1 : 0);\n const bExists = (b ? 1 : 0);\n return aExists - bExists;\n }\n /**\n * A function that compares ranges, useful for sorting ranges\n * It will first compare ranges on the endPosition and then on the startPosition\n */\n static compareRangesUsingEnds(a, b) {\n if (a.endLineNumber === b.endLineNumber) {\n if (a.endColumn === b.endColumn) {\n if (a.startLineNumber === b.startLineNumber) {\n return a.startColumn - b.startColumn;\n }\n return a.startLineNumber - b.startLineNumber;\n }\n return a.endColumn - b.endColumn;\n }\n return a.endLineNumber - b.endLineNumber;\n }\n /**\n * Test if the range spans multiple lines.\n */\n static spansMultipleLines(range) {\n return range.endLineNumber > range.startLineNumber;\n }\n toJSON() {\n return this;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/arrays.js\n/**\n * Returns the last element of an array.\n * @param array The array.\n * @param n Which element from the end (default is zero).\n */\nfunction tail(array, n = 0) {\n return array[array.length - (1 + n)];\n}\nfunction tail2(arr) {\n if (arr.length === 0) {\n throw new Error('Invalid tail call');\n }\n return [arr.slice(0, arr.length - 1), arr[arr.length - 1]];\n}\nfunction arrays_equals(one, other, itemEquals = (a, b) => a === b) {\n if (one === other) {\n return true;\n }\n if (!one || !other) {\n return false;\n }\n if (one.length !== other.length) {\n return false;\n }\n for (let i = 0, len = one.length; i < len; i++) {\n if (!itemEquals(one[i], other[i])) {\n return false;\n }\n }\n return true;\n}\n/**\n * Remove the element at `index` by replacing it with the last element. This is faster than `splice`\n * but changes the order of the array\n */\nfunction removeFastWithoutKeepingOrder(array, index) {\n const last = array.length - 1;\n if (index < last) {\n array[index] = array[last];\n }\n array.pop();\n}\n/**\n * Performs a binary search algorithm over a sorted array.\n *\n * @param array The array being searched.\n * @param key The value we search for.\n * @param comparator A function that takes two array elements and returns zero\n * if they are equal, a negative number if the first element precedes the\n * second one in the sorting order, or a positive number if the second element\n * precedes the first one.\n * @return See {@link binarySearch2}\n */\nfunction binarySearch(array, key, comparator) {\n return binarySearch2(array.length, i => comparator(array[i], key));\n}\n/**\n * Performs a binary search algorithm over a sorted collection. Useful for cases\n * when we need to perform a binary search over something that isn't actually an\n * array, and converting data to an array would defeat the use of binary search\n * in the first place.\n *\n * @param length The collection length.\n * @param compareToKey A function that takes an index of an element in the\n * collection and returns zero if the value at this index is equal to the\n * search key, a negative number if the value precedes the search key in the\n * sorting order, or a positive number if the search key precedes the value.\n * @return A non-negative index of an element, if found. If not found, the\n * result is -(n+1) (or ~n, using bitwise notation), where n is the index\n * where the key should be inserted to maintain the sorting order.\n */\nfunction binarySearch2(length, compareToKey) {\n let low = 0, high = length - 1;\n while (low <= high) {\n const mid = ((low + high) / 2) | 0;\n const comp = compareToKey(mid);\n if (comp < 0) {\n low = mid + 1;\n }\n else if (comp > 0) {\n high = mid - 1;\n }\n else {\n return mid;\n }\n }\n return -(low + 1);\n}\n/**\n * Takes a sorted array and a function p. The array is sorted in such a way that all elements where p(x) is false\n * are located before all elements where p(x) is true.\n * @returns the least x for which p(x) is true or array.length if no element fullfills the given function.\n */\nfunction findFirstInSorted(array, p) {\n let low = 0, high = array.length;\n if (high === 0) {\n return 0; // no children\n }\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (p(array[mid])) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n return low;\n}\nfunction quickSelect(nth, data, compare) {\n nth = nth | 0;\n if (nth >= data.length) {\n throw new TypeError('invalid index');\n }\n const pivotValue = data[Math.floor(data.length * Math.random())];\n const lower = [];\n const higher = [];\n const pivots = [];\n for (const value of data) {\n const val = compare(value, pivotValue);\n if (val < 0) {\n lower.push(value);\n }\n else if (val > 0) {\n higher.push(value);\n }\n else {\n pivots.push(value);\n }\n }\n if (nth < lower.length) {\n return quickSelect(nth, lower, compare);\n }\n else if (nth < lower.length + pivots.length) {\n return pivots[0];\n }\n else {\n return quickSelect(nth - (lower.length + pivots.length), higher, compare);\n }\n}\nfunction groupBy(data, compare) {\n const result = [];\n let currentGroup = undefined;\n for (const element of data.slice(0).sort(compare)) {\n if (!currentGroup || compare(currentGroup[0], element) !== 0) {\n currentGroup = [element];\n result.push(currentGroup);\n }\n else {\n currentGroup.push(element);\n }\n }\n return result;\n}\n/**\n * @returns New array with all falsy values removed. The original array IS NOT modified.\n */\nfunction coalesce(array) {\n return array.filter(e => !!e);\n}\n/**\n * Remove all falsy values from `array`. The original array IS modified.\n */\nfunction coalesceInPlace(array) {\n let to = 0;\n for (let i = 0; i < array.length; i++) {\n if (!!array[i]) {\n array[to] = array[i];\n to += 1;\n }\n }\n array.length = to;\n}\n/**\n * @returns false if the provided object is an array and not empty.\n */\nfunction isFalsyOrEmpty(obj) {\n return !Array.isArray(obj) || obj.length === 0;\n}\nfunction isNonEmptyArray(obj) {\n return Array.isArray(obj) && obj.length > 0;\n}\n/**\n * Removes duplicates from the given array. The optional keyFn allows to specify\n * how elements are checked for equality by returning an alternate value for each.\n */\nfunction distinct(array, keyFn = value => value) {\n const seen = new Set();\n return array.filter(element => {\n const key = keyFn(element);\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n}\nfunction findLast(arr, predicate) {\n const idx = lastIndex(arr, predicate);\n if (idx === -1) {\n return undefined;\n }\n return arr[idx];\n}\nfunction lastIndex(array, fn) {\n for (let i = array.length - 1; i >= 0; i--) {\n const element = array[i];\n if (fn(element)) {\n return i;\n }\n }\n return -1;\n}\nfunction firstOrDefault(array, notFoundValue) {\n return array.length > 0 ? array[0] : notFoundValue;\n}\nfunction range(arg, to) {\n let from = typeof to === 'number' ? arg : 0;\n if (typeof to === 'number') {\n from = arg;\n }\n else {\n from = 0;\n to = arg;\n }\n const result = [];\n if (from <= to) {\n for (let i = from; i < to; i++) {\n result.push(i);\n }\n }\n else {\n for (let i = from; i > to; i--) {\n result.push(i);\n }\n }\n return result;\n}\n/**\n * Insert `insertArr` inside `target` at `insertIndex`.\n * Please don't touch unless you understand https://jsperf.com/inserting-an-array-within-an-array\n */\nfunction arrays_arrayInsert(target, insertIndex, insertArr) {\n const before = target.slice(0, insertIndex);\n const after = target.slice(insertIndex);\n return before.concat(insertArr, after);\n}\n/**\n * Pushes an element to the start of the array, if found.\n */\nfunction pushToStart(arr, value) {\n const index = arr.indexOf(value);\n if (index > -1) {\n arr.splice(index, 1);\n arr.unshift(value);\n }\n}\n/**\n * Pushes an element to the end of the array, if found.\n */\nfunction pushToEnd(arr, value) {\n const index = arr.indexOf(value);\n if (index > -1) {\n arr.splice(index, 1);\n arr.push(value);\n }\n}\nfunction pushMany(arr, items) {\n for (const item of items) {\n arr.push(item);\n }\n}\nfunction asArray(x) {\n return Array.isArray(x) ? x : [x];\n}\n/**\n * Returns the first mapped value of the array which is not undefined.\n */\nfunction mapFind(array, mapFn) {\n for (const value of array) {\n const mapped = mapFn(value);\n if (mapped !== undefined) {\n return mapped;\n }\n }\n return undefined;\n}\n/**\n * Insert the new items in the array.\n * @param array The original array.\n * @param start The zero-based location in the array from which to start inserting elements.\n * @param newItems The items to be inserted\n */\nfunction insertInto(array, start, newItems) {\n const startIdx = getActualStartIndex(array, start);\n const originalLength = array.length;\n const newItemsLength = newItems.length;\n array.length = originalLength + newItemsLength;\n // Move the items after the start index, start from the end so that we don't overwrite any value.\n for (let i = originalLength - 1; i >= startIdx; i--) {\n array[i + newItemsLength] = array[i];\n }\n for (let i = 0; i < newItemsLength; i++) {\n array[i + startIdx] = newItems[i];\n }\n}\n/**\n * Removes elements from an array and inserts new elements in their place, returning the deleted elements. Alternative to the native Array.splice method, it\n * can only support limited number of items due to the maximum call stack size limit.\n * @param array The original array.\n * @param start The zero-based location in the array from which to start removing elements.\n * @param deleteCount The number of elements to remove.\n * @returns An array containing the elements that were deleted.\n */\nfunction splice(array, start, deleteCount, newItems) {\n const index = getActualStartIndex(array, start);\n const result = array.splice(index, deleteCount);\n insertInto(array, index, newItems);\n return result;\n}\n/**\n * Determine the actual start index (same logic as the native splice() or slice())\n * If greater than the length of the array, start will be set to the length of the array. In this case, no element will be deleted but the method will behave as an adding function, adding as many element as item[n*] provided.\n * If negative, it will begin that many elements from the end of the array. (In this case, the origin -1, meaning -n is the index of the nth last element, and is therefore equivalent to the index of array.length - n.) If array.length + start is less than 0, it will begin from index 0.\n * @param array The target array.\n * @param start The operation index.\n */\nfunction getActualStartIndex(array, start) {\n return start < 0 ? Math.max(start + array.length, 0) : Math.min(start, array.length);\n}\nvar CompareResult;\n(function (CompareResult) {\n function isLessThan(result) {\n return result < 0;\n }\n CompareResult.isLessThan = isLessThan;\n function isGreaterThan(result) {\n return result > 0;\n }\n CompareResult.isGreaterThan = isGreaterThan;\n function isNeitherLessOrGreaterThan(result) {\n return result === 0;\n }\n CompareResult.isNeitherLessOrGreaterThan = isNeitherLessOrGreaterThan;\n CompareResult.greaterThan = 1;\n CompareResult.lessThan = -1;\n CompareResult.neitherLessOrGreaterThan = 0;\n})(CompareResult || (CompareResult = {}));\nfunction compareBy(selector, comparator) {\n return (a, b) => comparator(selector(a), selector(b));\n}\n/**\n * The natural order on numbers.\n*/\nconst numberComparator = (a, b) => a - b;\n/**\n * Returns the first item that is equal to or greater than every other item.\n*/\nfunction findMaxBy(items, comparator) {\n if (items.length === 0) {\n return undefined;\n }\n let max = items[0];\n for (let i = 1; i < items.length; i++) {\n const item = items[i];\n if (comparator(item, max) > 0) {\n max = item;\n }\n }\n return max;\n}\n/**\n * Returns the last item that is equal to or greater than every other item.\n*/\nfunction findLastMaxBy(items, comparator) {\n if (items.length === 0) {\n return undefined;\n }\n let max = items[0];\n for (let i = 1; i < items.length; i++) {\n const item = items[i];\n if (comparator(item, max) >= 0) {\n max = item;\n }\n }\n return max;\n}\n/**\n * Returns the first item that is equal to or less than every other item.\n*/\nfunction findMinBy(items, comparator) {\n return findMaxBy(items, (a, b) => -comparator(a, b));\n}\nclass ArrayQueue {\n /**\n * Constructs a queue that is backed by the given array. Runtime is O(1).\n */\n constructor(items) {\n this.items = items;\n this.firstIdx = 0;\n this.lastIdx = this.items.length - 1;\n }\n get length() {\n return this.lastIdx - this.firstIdx + 1;\n }\n /**\n * Consumes elements from the beginning of the queue as long as the predicate returns true.\n * If no elements were consumed, `null` is returned. Has a runtime of O(result.length).\n */\n takeWhile(predicate) {\n // P(k) := k <= this.lastIdx && predicate(this.items[k])\n // Find s := min { k | k >= this.firstIdx && !P(k) } and return this.data[this.firstIdx...s)\n let startIdx = this.firstIdx;\n while (startIdx < this.items.length && predicate(this.items[startIdx])) {\n startIdx++;\n }\n const result = startIdx === this.firstIdx ? null : this.items.slice(this.firstIdx, startIdx);\n this.firstIdx = startIdx;\n return result;\n }\n /**\n * Consumes elements from the end of the queue as long as the predicate returns true.\n * If no elements were consumed, `null` is returned.\n * The result has the same order as the underlying array!\n */\n takeFromEndWhile(predicate) {\n // P(k) := this.firstIdx >= k && predicate(this.items[k])\n // Find s := max { k | k <= this.lastIdx && !P(k) } and return this.data(s...this.lastIdx]\n let endIdx = this.lastIdx;\n while (endIdx >= 0 && predicate(this.items[endIdx])) {\n endIdx--;\n }\n const result = endIdx === this.lastIdx ? null : this.items.slice(endIdx + 1, this.lastIdx + 1);\n this.lastIdx = endIdx;\n return result;\n }\n peek() {\n if (this.length === 0) {\n return undefined;\n }\n return this.items[this.firstIdx];\n }\n dequeue() {\n const result = this.items[this.firstIdx];\n this.firstIdx++;\n return result;\n }\n takeCount(count) {\n const result = this.items.slice(this.firstIdx, this.firstIdx + count);\n this.firstIdx += count;\n return result;\n }\n}\n/**\n * This class is faster than an iterator and array for lazy computed data.\n*/\nclass CallbackIterable {\n constructor(\n /**\n * Calls the callback for every item.\n * Stops when the callback returns false.\n */\n iterate) {\n this.iterate = iterate;\n }\n toArray() {\n const result = [];\n this.iterate(item => { result.push(item); return true; });\n return result;\n }\n filter(predicate) {\n return new CallbackIterable(cb => this.iterate(item => predicate(item) ? cb(item) : true));\n }\n map(mapFn) {\n return new CallbackIterable(cb => this.iterate(item => cb(mapFn(item))));\n }\n findLast(predicate) {\n let result;\n this.iterate(item => {\n if (predicate(item)) {\n result = item;\n }\n return true;\n });\n return result;\n }\n findLastMaxBy(comparator) {\n let result;\n let first = true;\n this.iterate(item => {\n if (first || CompareResult.isGreaterThan(comparator(item, result))) {\n first = false;\n result = item;\n }\n return true;\n });\n return result;\n }\n}\nCallbackIterable.empty = new CallbackIterable(_callback => { });\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/uint.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nfunction toUint8(v) {\n if (v < 0) {\n return 0;\n }\n if (v > 255 /* Constants.MAX_UINT_8 */) {\n return 255 /* Constants.MAX_UINT_8 */;\n }\n return v | 0;\n}\nfunction toUint32(v) {\n if (v < 0) {\n return 0;\n }\n if (v > 4294967295 /* Constants.MAX_UINT_32 */) {\n return 4294967295 /* Constants.MAX_UINT_32 */;\n }\n return v | 0;\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/model/prefixSumComputer.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\nclass PrefixSumComputer {\n constructor(values) {\n this.values = values;\n this.prefixSum = new Uint32Array(values.length);\n this.prefixSumValidIndex = new Int32Array(1);\n this.prefixSumValidIndex[0] = -1;\n }\n insertValues(insertIndex, insertValues) {\n insertIndex = toUint32(insertIndex);\n const oldValues = this.values;\n const oldPrefixSum = this.prefixSum;\n const insertValuesLen = insertValues.length;\n if (insertValuesLen === 0) {\n return false;\n }\n this.values = new Uint32Array(oldValues.length + insertValuesLen);\n this.values.set(oldValues.subarray(0, insertIndex), 0);\n this.values.set(oldValues.subarray(insertIndex), insertIndex + insertValuesLen);\n this.values.set(insertValues, insertIndex);\n if (insertIndex - 1 < this.prefixSumValidIndex[0]) {\n this.prefixSumValidIndex[0] = insertIndex - 1;\n }\n this.prefixSum = new Uint32Array(this.values.length);\n if (this.prefixSumValidIndex[0] >= 0) {\n this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1));\n }\n return true;\n }\n setValue(index, value) {\n index = toUint32(index);\n value = toUint32(value);\n if (this.values[index] === value) {\n return false;\n }\n this.values[index] = value;\n if (index - 1 < this.prefixSumValidIndex[0]) {\n this.prefixSumValidIndex[0] = index - 1;\n }\n return true;\n }\n removeValues(startIndex, count) {\n startIndex = toUint32(startIndex);\n count = toUint32(count);\n const oldValues = this.values;\n const oldPrefixSum = this.prefixSum;\n if (startIndex >= oldValues.length) {\n return false;\n }\n const maxCount = oldValues.length - startIndex;\n if (count >= maxCount) {\n count = maxCount;\n }\n if (count === 0) {\n return false;\n }\n this.values = new Uint32Array(oldValues.length - count);\n this.values.set(oldValues.subarray(0, startIndex), 0);\n this.values.set(oldValues.subarray(startIndex + count), startIndex);\n this.prefixSum = new Uint32Array(this.values.length);\n if (startIndex - 1 < this.prefixSumValidIndex[0]) {\n this.prefixSumValidIndex[0] = startIndex - 1;\n }\n if (this.prefixSumValidIndex[0] >= 0) {\n this.prefixSum.set(oldPrefixSum.subarray(0, this.prefixSumValidIndex[0] + 1));\n }\n return true;\n }\n getTotalSum() {\n if (this.values.length === 0) {\n return 0;\n }\n return this._getPrefixSum(this.values.length - 1);\n }\n /**\n * Returns the sum of the first `index + 1` many items.\n * @returns `SUM(0 <= j <= index, values[j])`.\n */\n getPrefixSum(index) {\n if (index < 0) {\n return 0;\n }\n index = toUint32(index);\n return this._getPrefixSum(index);\n }\n _getPrefixSum(index) {\n if (index <= this.prefixSumValidIndex[0]) {\n return this.prefixSum[index];\n }\n let startIndex = this.prefixSumValidIndex[0] + 1;\n if (startIndex === 0) {\n this.prefixSum[0] = this.values[0];\n startIndex++;\n }\n if (index >= this.values.length) {\n index = this.values.length - 1;\n }\n for (let i = startIndex; i <= index; i++) {\n this.prefixSum[i] = this.prefixSum[i - 1] + this.values[i];\n }\n this.prefixSumValidIndex[0] = Math.max(this.prefixSumValidIndex[0], index);\n return this.prefixSum[index];\n }\n getIndexOf(sum) {\n sum = Math.floor(sum);\n // Compute all sums (to get a fully valid prefixSum)\n this.getTotalSum();\n let low = 0;\n let high = this.values.length - 1;\n let mid = 0;\n let midStop = 0;\n let midStart = 0;\n while (low <= high) {\n mid = low + ((high - low) / 2) | 0;\n midStop = this.prefixSum[mid];\n midStart = midStop - this.values[mid];\n if (sum < midStart) {\n high = mid - 1;\n }\n else if (sum >= midStop) {\n low = mid + 1;\n }\n else {\n break;\n }\n }\n return new PrefixSumIndexOfResult(mid, sum - midStart);\n }\n}\n/**\n * {@link getIndexOf} has an amortized runtime complexity of O(1).\n *\n * ({@link PrefixSumComputer.getIndexOf} is just O(log n))\n*/\nclass ConstantTimePrefixSumComputer {\n constructor(values) {\n this._values = values;\n this._isValid = false;\n this._validEndIndex = -1;\n this._prefixSum = [];\n this._indexBySum = [];\n }\n /**\n * @returns SUM(0 <= j < values.length, values[j])\n */\n getTotalSum() {\n this._ensureValid();\n return this._indexBySum.length;\n }\n /**\n * Returns the sum of the first `count` many items.\n * @returns `SUM(0 <= j < count, values[j])`.\n */\n getPrefixSum(count) {\n this._ensureValid();\n if (count === 0) {\n return 0;\n }\n return this._prefixSum[count - 1];\n }\n /**\n * @returns `result`, such that `getPrefixSum(result.index) + result.remainder = sum`\n */\n getIndexOf(sum) {\n this._ensureValid();\n const idx = this._indexBySum[sum];\n const viewLinesAbove = idx > 0 ? this._prefixSum[idx - 1] : 0;\n return new PrefixSumIndexOfResult(idx, sum - viewLinesAbove);\n }\n removeValues(start, deleteCount) {\n this._values.splice(start, deleteCount);\n this._invalidate(start);\n }\n insertValues(insertIndex, insertArr) {\n this._values = arrayInsert(this._values, insertIndex, insertArr);\n this._invalidate(insertIndex);\n }\n _invalidate(index) {\n this._isValid = false;\n this._validEndIndex = Math.min(this._validEndIndex, index - 1);\n }\n _ensureValid() {\n if (this._isValid) {\n return;\n }\n for (let i = this._validEndIndex + 1, len = this._values.length; i < len; i++) {\n const value = this._values[i];\n const sumAbove = i > 0 ? this._prefixSum[i - 1] : 0;\n this._prefixSum[i] = sumAbove + value;\n for (let j = 0; j < value; j++) {\n this._indexBySum[sumAbove + j] = i;\n }\n }\n // trim things\n this._prefixSum.length = this._values.length;\n this._indexBySum.length = this._prefixSum[this._prefixSum.length - 1];\n // mark as valid\n this._isValid = true;\n this._validEndIndex = this._values.length - 1;\n }\n setValue(index, value) {\n if (this._values[index] === value) {\n // no change\n return;\n }\n this._values[index] = value;\n this._invalidate(index);\n }\n}\nclass PrefixSumIndexOfResult {\n constructor(index, remainder) {\n this.index = index;\n this.remainder = remainder;\n this._prefixSumIndexOfResultBrand = undefined;\n this.index = index;\n this.remainder = remainder;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/model/mirrorTextModel.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n\nclass MirrorTextModel {\n constructor(uri, lines, eol, versionId) {\n this._uri = uri;\n this._lines = lines;\n this._eol = eol;\n this._versionId = versionId;\n this._lineStarts = null;\n this._cachedTextValue = null;\n }\n dispose() {\n this._lines.length = 0;\n }\n get version() {\n return this._versionId;\n }\n getText() {\n if (this._cachedTextValue === null) {\n this._cachedTextValue = this._lines.join(this._eol);\n }\n return this._cachedTextValue;\n }\n onEvents(e) {\n if (e.eol && e.eol !== this._eol) {\n this._eol = e.eol;\n this._lineStarts = null;\n }\n // Update my lines\n const changes = e.changes;\n for (const change of changes) {\n this._acceptDeleteRange(change.range);\n this._acceptInsertText(new position_Position(change.range.startLineNumber, change.range.startColumn), change.text);\n }\n this._versionId = e.versionId;\n this._cachedTextValue = null;\n }\n _ensureLineStarts() {\n if (!this._lineStarts) {\n const eolLength = this._eol.length;\n const linesLength = this._lines.length;\n const lineStartValues = new Uint32Array(linesLength);\n for (let i = 0; i < linesLength; i++) {\n lineStartValues[i] = this._lines[i].length + eolLength;\n }\n this._lineStarts = new PrefixSumComputer(lineStartValues);\n }\n }\n /**\n * All changes to a line's text go through this method\n */\n _setLineText(lineIndex, newValue) {\n this._lines[lineIndex] = newValue;\n if (this._lineStarts) {\n // update prefix sum\n this._lineStarts.setValue(lineIndex, this._lines[lineIndex].length + this._eol.length);\n }\n }\n _acceptDeleteRange(range) {\n if (range.startLineNumber === range.endLineNumber) {\n if (range.startColumn === range.endColumn) {\n // Nothing to delete\n return;\n }\n // Delete text on the affected line\n this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1)\n + this._lines[range.startLineNumber - 1].substring(range.endColumn - 1));\n return;\n }\n // Take remaining text on last line and append it to remaining text on first line\n this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1)\n + this._lines[range.endLineNumber - 1].substring(range.endColumn - 1));\n // Delete middle lines\n this._lines.splice(range.startLineNumber, range.endLineNumber - range.startLineNumber);\n if (this._lineStarts) {\n // update prefix sum\n this._lineStarts.removeValues(range.startLineNumber, range.endLineNumber - range.startLineNumber);\n }\n }\n _acceptInsertText(position, insertText) {\n if (insertText.length === 0) {\n // Nothing to insert\n return;\n }\n const insertLines = splitLines(insertText);\n if (insertLines.length === 1) {\n // Inserting text on one line\n this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1)\n + insertLines[0]\n + this._lines[position.lineNumber - 1].substring(position.column - 1));\n return;\n }\n // Append overflowing text from first line to the end of text to insert\n insertLines[insertLines.length - 1] += this._lines[position.lineNumber - 1].substring(position.column - 1);\n // Delete overflowing text from first line and insert text on first line\n this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1)\n + insertLines[0]);\n // Insert new lines & store lengths\n const newLengths = new Uint32Array(insertLines.length - 1);\n for (let i = 1; i < insertLines.length; i++) {\n this._lines.splice(position.lineNumber + i - 1, 0, insertLines[i]);\n newLengths[i - 1] = insertLines[i].length + this._eol.length;\n }\n if (this._lineStarts) {\n // update prefix sum\n this._lineStarts.insertValues(position.lineNumber, newLengths);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/core/wordHelper.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\nconst USUAL_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\\\|;:\\'\",.<>/?';\n/**\n * Create a word definition regular expression based on default word separators.\n * Optionally provide allowed separators that should be included in words.\n *\n * The default would look like this:\n * /(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)/g\n */\nfunction createWordRegExp(allowInWords = '') {\n let source = '(-?\\\\d*\\\\.\\\\d\\\\w*)|([^';\n for (const sep of USUAL_WORD_SEPARATORS) {\n if (allowInWords.indexOf(sep) >= 0) {\n continue;\n }\n source += '\\\\' + sep;\n }\n source += '\\\\s]+)';\n return new RegExp(source, 'g');\n}\n// catches numbers (including floating numbers) in the first group, and alphanum in the second\nconst DEFAULT_WORD_REGEXP = createWordRegExp();\nfunction ensureValidWordDefinition(wordDefinition) {\n let result = DEFAULT_WORD_REGEXP;\n if (wordDefinition && (wordDefinition instanceof RegExp)) {\n if (!wordDefinition.global) {\n let flags = 'g';\n if (wordDefinition.ignoreCase) {\n flags += 'i';\n }\n if (wordDefinition.multiline) {\n flags += 'm';\n }\n if (wordDefinition.unicode) {\n flags += 'u';\n }\n result = new RegExp(wordDefinition.source, flags);\n }\n else {\n result = wordDefinition;\n }\n }\n result.lastIndex = 0;\n return result;\n}\nconst _defaultConfig = new linkedList_LinkedList();\n_defaultConfig.unshift({\n maxLen: 1000,\n windowSize: 15,\n timeBudget: 150\n});\nfunction getWordAtText(column, wordDefinition, text, textOffset, config) {\n if (!config) {\n config = Iterable.first(_defaultConfig);\n }\n if (text.length > config.maxLen) {\n // don't throw strings that long at the regexp\n // but use a sub-string in which a word must occur\n let start = column - config.maxLen / 2;\n if (start < 0) {\n start = 0;\n }\n else {\n textOffset += start;\n }\n text = text.substring(start, column + config.maxLen / 2);\n return getWordAtText(column, wordDefinition, text, textOffset, config);\n }\n const t1 = Date.now();\n const pos = column - 1 - textOffset;\n let prevRegexIndex = -1;\n let match = null;\n for (let i = 1;; i++) {\n // check time budget\n if (Date.now() - t1 >= config.timeBudget) {\n break;\n }\n // reset the index at which the regexp should start matching, also know where it\n // should stop so that subsequent search don't repeat previous searches\n const regexIndex = pos - config.windowSize * i;\n wordDefinition.lastIndex = Math.max(0, regexIndex);\n const thisMatch = _findRegexMatchEnclosingPosition(wordDefinition, text, pos, prevRegexIndex);\n if (!thisMatch && match) {\n // stop: we have something\n break;\n }\n match = thisMatch;\n // stop: searched at start\n if (regexIndex <= 0) {\n break;\n }\n prevRegexIndex = regexIndex;\n }\n if (match) {\n const result = {\n word: match[0],\n startColumn: textOffset + 1 + match.index,\n endColumn: textOffset + 1 + match.index + match[0].length\n };\n wordDefinition.lastIndex = 0;\n return result;\n }\n return null;\n}\nfunction _findRegexMatchEnclosingPosition(wordDefinition, text, pos, stopPos) {\n let match;\n while (match = wordDefinition.exec(text)) {\n const matchIndex = match.index || 0;\n if (matchIndex <= pos && wordDefinition.lastIndex >= pos) {\n return match;\n }\n else if (stopPos > 0 && matchIndex > stopPos) {\n return null;\n }\n }\n return null;\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/core/characterClassifier.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * A fast character classifier that uses a compact array for ASCII values.\n */\nclass CharacterClassifier {\n constructor(_defaultValue) {\n const defaultValue = toUint8(_defaultValue);\n this._defaultValue = defaultValue;\n this._asciiMap = CharacterClassifier._createAsciiMap(defaultValue);\n this._map = new Map();\n }\n static _createAsciiMap(defaultValue) {\n const asciiMap = new Uint8Array(256);\n asciiMap.fill(defaultValue);\n return asciiMap;\n }\n set(charCode, _value) {\n const value = toUint8(_value);\n if (charCode >= 0 && charCode < 256) {\n this._asciiMap[charCode] = value;\n }\n else {\n this._map.set(charCode, value);\n }\n }\n get(charCode) {\n if (charCode >= 0 && charCode < 256) {\n return this._asciiMap[charCode];\n }\n else {\n return (this._map.get(charCode) || this._defaultValue);\n }\n }\n clear() {\n this._asciiMap.fill(this._defaultValue);\n this._map.clear();\n }\n}\nclass CharacterSet {\n constructor() {\n this._actual = new CharacterClassifier(0 /* Boolean.False */);\n }\n add(charCode) {\n this._actual.set(charCode, 1 /* Boolean.True */);\n }\n has(charCode) {\n return (this._actual.get(charCode) === 1 /* Boolean.True */);\n }\n clear() {\n return this._actual.clear();\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/languages/linkComputer.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nclass Uint8Matrix {\n constructor(rows, cols, defaultValue) {\n const data = new Uint8Array(rows * cols);\n for (let i = 0, len = rows * cols; i < len; i++) {\n data[i] = defaultValue;\n }\n this._data = data;\n this.rows = rows;\n this.cols = cols;\n }\n get(row, col) {\n return this._data[row * this.cols + col];\n }\n set(row, col, value) {\n this._data[row * this.cols + col] = value;\n }\n}\nclass StateMachine {\n constructor(edges) {\n let maxCharCode = 0;\n let maxState = 0 /* State.Invalid */;\n for (let i = 0, len = edges.length; i < len; i++) {\n const [from, chCode, to] = edges[i];\n if (chCode > maxCharCode) {\n maxCharCode = chCode;\n }\n if (from > maxState) {\n maxState = from;\n }\n if (to > maxState) {\n maxState = to;\n }\n }\n maxCharCode++;\n maxState++;\n const states = new Uint8Matrix(maxState, maxCharCode, 0 /* State.Invalid */);\n for (let i = 0, len = edges.length; i < len; i++) {\n const [from, chCode, to] = edges[i];\n states.set(from, chCode, to);\n }\n this._states = states;\n this._maxCharCode = maxCharCode;\n }\n nextState(currentState, chCode) {\n if (chCode < 0 || chCode >= this._maxCharCode) {\n return 0 /* State.Invalid */;\n }\n return this._states.get(currentState, chCode);\n }\n}\n// State machine for http:// or https:// or file://\nlet _stateMachine = null;\nfunction getStateMachine() {\n if (_stateMachine === null) {\n _stateMachine = new StateMachine([\n [1 /* State.Start */, 104 /* CharCode.h */, 2 /* State.H */],\n [1 /* State.Start */, 72 /* CharCode.H */, 2 /* State.H */],\n [1 /* State.Start */, 102 /* CharCode.f */, 6 /* State.F */],\n [1 /* State.Start */, 70 /* CharCode.F */, 6 /* State.F */],\n [2 /* State.H */, 116 /* CharCode.t */, 3 /* State.HT */],\n [2 /* State.H */, 84 /* CharCode.T */, 3 /* State.HT */],\n [3 /* State.HT */, 116 /* CharCode.t */, 4 /* State.HTT */],\n [3 /* State.HT */, 84 /* CharCode.T */, 4 /* State.HTT */],\n [4 /* State.HTT */, 112 /* CharCode.p */, 5 /* State.HTTP */],\n [4 /* State.HTT */, 80 /* CharCode.P */, 5 /* State.HTTP */],\n [5 /* State.HTTP */, 115 /* CharCode.s */, 9 /* State.BeforeColon */],\n [5 /* State.HTTP */, 83 /* CharCode.S */, 9 /* State.BeforeColon */],\n [5 /* State.HTTP */, 58 /* CharCode.Colon */, 10 /* State.AfterColon */],\n [6 /* State.F */, 105 /* CharCode.i */, 7 /* State.FI */],\n [6 /* State.F */, 73 /* CharCode.I */, 7 /* State.FI */],\n [7 /* State.FI */, 108 /* CharCode.l */, 8 /* State.FIL */],\n [7 /* State.FI */, 76 /* CharCode.L */, 8 /* State.FIL */],\n [8 /* State.FIL */, 101 /* CharCode.e */, 9 /* State.BeforeColon */],\n [8 /* State.FIL */, 69 /* CharCode.E */, 9 /* State.BeforeColon */],\n [9 /* State.BeforeColon */, 58 /* CharCode.Colon */, 10 /* State.AfterColon */],\n [10 /* State.AfterColon */, 47 /* CharCode.Slash */, 11 /* State.AlmostThere */],\n [11 /* State.AlmostThere */, 47 /* CharCode.Slash */, 12 /* State.End */],\n ]);\n }\n return _stateMachine;\n}\nlet _classifier = null;\nfunction getClassifier() {\n if (_classifier === null) {\n _classifier = new CharacterClassifier(0 /* CharacterClass.None */);\n // allow-any-unicode-next-line\n const FORCE_TERMINATION_CHARACTERS = ' \\t<>\\'\\\"、。。、,.:;‘〈「『〔([{「」}])〕』」〉’`~…';\n for (let i = 0; i < FORCE_TERMINATION_CHARACTERS.length; i++) {\n _classifier.set(FORCE_TERMINATION_CHARACTERS.charCodeAt(i), 1 /* CharacterClass.ForceTermination */);\n }\n const CANNOT_END_WITH_CHARACTERS = '.,;:';\n for (let i = 0; i < CANNOT_END_WITH_CHARACTERS.length; i++) {\n _classifier.set(CANNOT_END_WITH_CHARACTERS.charCodeAt(i), 2 /* CharacterClass.CannotEndIn */);\n }\n }\n return _classifier;\n}\nclass LinkComputer {\n static _createLink(classifier, line, lineNumber, linkBeginIndex, linkEndIndex) {\n // Do not allow to end link in certain characters...\n let lastIncludedCharIndex = linkEndIndex - 1;\n do {\n const chCode = line.charCodeAt(lastIncludedCharIndex);\n const chClass = classifier.get(chCode);\n if (chClass !== 2 /* CharacterClass.CannotEndIn */) {\n break;\n }\n lastIncludedCharIndex--;\n } while (lastIncludedCharIndex > linkBeginIndex);\n // Handle links enclosed in parens, square brackets and curlys.\n if (linkBeginIndex > 0) {\n const charCodeBeforeLink = line.charCodeAt(linkBeginIndex - 1);\n const lastCharCodeInLink = line.charCodeAt(lastIncludedCharIndex);\n if ((charCodeBeforeLink === 40 /* CharCode.OpenParen */ && lastCharCodeInLink === 41 /* CharCode.CloseParen */)\n || (charCodeBeforeLink === 91 /* CharCode.OpenSquareBracket */ && lastCharCodeInLink === 93 /* CharCode.CloseSquareBracket */)\n || (charCodeBeforeLink === 123 /* CharCode.OpenCurlyBrace */ && lastCharCodeInLink === 125 /* CharCode.CloseCurlyBrace */)) {\n // Do not end in ) if ( is before the link start\n // Do not end in ] if [ is before the link start\n // Do not end in } if { is before the link start\n lastIncludedCharIndex--;\n }\n }\n return {\n range: {\n startLineNumber: lineNumber,\n startColumn: linkBeginIndex + 1,\n endLineNumber: lineNumber,\n endColumn: lastIncludedCharIndex + 2\n },\n url: line.substring(linkBeginIndex, lastIncludedCharIndex + 1)\n };\n }\n static computeLinks(model, stateMachine = getStateMachine()) {\n const classifier = getClassifier();\n const result = [];\n for (let i = 1, lineCount = model.getLineCount(); i <= lineCount; i++) {\n const line = model.getLineContent(i);\n const len = line.length;\n let j = 0;\n let linkBeginIndex = 0;\n let linkBeginChCode = 0;\n let state = 1 /* State.Start */;\n let hasOpenParens = false;\n let hasOpenSquareBracket = false;\n let inSquareBrackets = false;\n let hasOpenCurlyBracket = false;\n while (j < len) {\n let resetStateMachine = false;\n const chCode = line.charCodeAt(j);\n if (state === 13 /* State.Accept */) {\n let chClass;\n switch (chCode) {\n case 40 /* CharCode.OpenParen */:\n hasOpenParens = true;\n chClass = 0 /* CharacterClass.None */;\n break;\n case 41 /* CharCode.CloseParen */:\n chClass = (hasOpenParens ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n break;\n case 91 /* CharCode.OpenSquareBracket */:\n inSquareBrackets = true;\n hasOpenSquareBracket = true;\n chClass = 0 /* CharacterClass.None */;\n break;\n case 93 /* CharCode.CloseSquareBracket */:\n inSquareBrackets = false;\n chClass = (hasOpenSquareBracket ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n break;\n case 123 /* CharCode.OpenCurlyBrace */:\n hasOpenCurlyBracket = true;\n chClass = 0 /* CharacterClass.None */;\n break;\n case 125 /* CharCode.CloseCurlyBrace */:\n chClass = (hasOpenCurlyBracket ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n break;\n // The following three rules make it that ' or \" or ` are allowed inside links\n // only if the link is wrapped by some other quote character\n case 39 /* CharCode.SingleQuote */:\n case 34 /* CharCode.DoubleQuote */:\n case 96 /* CharCode.BackTick */:\n if (linkBeginChCode === chCode) {\n chClass = 1 /* CharacterClass.ForceTermination */;\n }\n else if (linkBeginChCode === 39 /* CharCode.SingleQuote */ || linkBeginChCode === 34 /* CharCode.DoubleQuote */ || linkBeginChCode === 96 /* CharCode.BackTick */) {\n chClass = 0 /* CharacterClass.None */;\n }\n else {\n chClass = 1 /* CharacterClass.ForceTermination */;\n }\n break;\n case 42 /* CharCode.Asterisk */:\n // `*` terminates a link if the link began with `*`\n chClass = (linkBeginChCode === 42 /* CharCode.Asterisk */) ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */;\n break;\n case 124 /* CharCode.Pipe */:\n // `|` terminates a link if the link began with `|`\n chClass = (linkBeginChCode === 124 /* CharCode.Pipe */) ? 1 /* CharacterClass.ForceTermination */ : 0 /* CharacterClass.None */;\n break;\n case 32 /* CharCode.Space */:\n // ` ` allow space in between [ and ]\n chClass = (inSquareBrackets ? 0 /* CharacterClass.None */ : 1 /* CharacterClass.ForceTermination */);\n break;\n default:\n chClass = classifier.get(chCode);\n }\n // Check if character terminates link\n if (chClass === 1 /* CharacterClass.ForceTermination */) {\n result.push(LinkComputer._createLink(classifier, line, i, linkBeginIndex, j));\n resetStateMachine = true;\n }\n }\n else if (state === 12 /* State.End */) {\n let chClass;\n if (chCode === 91 /* CharCode.OpenSquareBracket */) {\n // Allow for the authority part to contain ipv6 addresses which contain [ and ]\n hasOpenSquareBracket = true;\n chClass = 0 /* CharacterClass.None */;\n }\n else {\n chClass = classifier.get(chCode);\n }\n // Check if character terminates link\n if (chClass === 1 /* CharacterClass.ForceTermination */) {\n resetStateMachine = true;\n }\n else {\n state = 13 /* State.Accept */;\n }\n }\n else {\n state = stateMachine.nextState(state, chCode);\n if (state === 0 /* State.Invalid */) {\n resetStateMachine = true;\n }\n }\n if (resetStateMachine) {\n state = 1 /* State.Start */;\n hasOpenParens = false;\n hasOpenSquareBracket = false;\n hasOpenCurlyBracket = false;\n // Record where the link started\n linkBeginIndex = j + 1;\n linkBeginChCode = chCode;\n }\n j++;\n }\n if (state === 13 /* State.Accept */) {\n result.push(LinkComputer._createLink(classifier, line, i, linkBeginIndex, len));\n }\n }\n return result;\n }\n}\n/**\n * Returns an array of all links contains in the provided\n * document. *Note* that this operation is computational\n * expensive and should not run in the UI thread.\n */\nfunction computeLinks(model) {\n if (!model || typeof model.getLineCount !== 'function' || typeof model.getLineContent !== 'function') {\n // Unknown caller!\n return [];\n }\n return LinkComputer.computeLinks(model);\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/languages/supports/inplaceReplaceSupport.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nclass BasicInplaceReplace {\n constructor() {\n this._defaultValueSet = [\n ['true', 'false'],\n ['True', 'False'],\n ['Private', 'Public', 'Friend', 'ReadOnly', 'Partial', 'Protected', 'WriteOnly'],\n ['public', 'protected', 'private'],\n ];\n }\n navigateValueSet(range1, text1, range2, text2, up) {\n if (range1 && text1) {\n const result = this.doNavigateValueSet(text1, up);\n if (result) {\n return {\n range: range1,\n value: result\n };\n }\n }\n if (range2 && text2) {\n const result = this.doNavigateValueSet(text2, up);\n if (result) {\n return {\n range: range2,\n value: result\n };\n }\n }\n return null;\n }\n doNavigateValueSet(text, up) {\n const numberResult = this.numberReplace(text, up);\n if (numberResult !== null) {\n return numberResult;\n }\n return this.textReplace(text, up);\n }\n numberReplace(value, up) {\n const precision = Math.pow(10, value.length - (value.lastIndexOf('.') + 1));\n let n1 = Number(value);\n const n2 = parseFloat(value);\n if (!isNaN(n1) && !isNaN(n2) && n1 === n2) {\n if (n1 === 0 && !up) {\n return null; // don't do negative\n //\t\t\t} else if(n1 === 9 && up) {\n //\t\t\t\treturn null; // don't insert 10 into a number\n }\n else {\n n1 = Math.floor(n1 * precision);\n n1 += up ? precision : -precision;\n return String(n1 / precision);\n }\n }\n return null;\n }\n textReplace(value, up) {\n return this.valueSetsReplace(this._defaultValueSet, value, up);\n }\n valueSetsReplace(valueSets, value, up) {\n let result = null;\n for (let i = 0, len = valueSets.length; result === null && i < len; i++) {\n result = this.valueSetReplace(valueSets[i], value, up);\n }\n return result;\n }\n valueSetReplace(valueSet, value, up) {\n let idx = valueSet.indexOf(value);\n if (idx >= 0) {\n idx += up ? +1 : -1;\n if (idx < 0) {\n idx = valueSet.length - 1;\n }\n else {\n idx %= valueSet.length;\n }\n return valueSet[idx];\n }\n return null;\n }\n}\nBasicInplaceReplace.INSTANCE = new BasicInplaceReplace();\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/cancellation.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nconst shortcutEvent = Object.freeze(function (callback, context) {\n const handle = setTimeout(callback.bind(context), 0);\n return { dispose() { clearTimeout(handle); } };\n});\nvar CancellationToken;\n(function (CancellationToken) {\n function isCancellationToken(thing) {\n if (thing === CancellationToken.None || thing === CancellationToken.Cancelled) {\n return true;\n }\n if (thing instanceof MutableToken) {\n return true;\n }\n if (!thing || typeof thing !== 'object') {\n return false;\n }\n return typeof thing.isCancellationRequested === 'boolean'\n && typeof thing.onCancellationRequested === 'function';\n }\n CancellationToken.isCancellationToken = isCancellationToken;\n CancellationToken.None = Object.freeze({\n isCancellationRequested: false,\n onCancellationRequested: Event.None\n });\n CancellationToken.Cancelled = Object.freeze({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent\n });\n})(CancellationToken || (CancellationToken = {}));\nclass MutableToken {\n constructor() {\n this._isCancelled = false;\n this._emitter = null;\n }\n cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire(undefined);\n this.dispose();\n }\n }\n }\n get isCancellationRequested() {\n return this._isCancelled;\n }\n get onCancellationRequested() {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new Emitter();\n }\n return this._emitter.event;\n }\n dispose() {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = null;\n }\n }\n}\nclass CancellationTokenSource {\n constructor(parent) {\n this._token = undefined;\n this._parentListener = undefined;\n this._parentListener = parent && parent.onCancellationRequested(this.cancel, this);\n }\n get token() {\n if (!this._token) {\n // be lazy and create the token only when\n // actually needed\n this._token = new MutableToken();\n }\n return this._token;\n }\n cancel() {\n if (!this._token) {\n // save an object by returning the default\n // cancelled token when cancellation happens\n // before someone asks for the token\n this._token = CancellationToken.Cancelled;\n }\n else if (this._token instanceof MutableToken) {\n // actually cancel\n this._token.cancel();\n }\n }\n dispose(cancel = false) {\n var _a;\n if (cancel) {\n this.cancel();\n }\n (_a = this._parentListener) === null || _a === void 0 ? void 0 : _a.dispose();\n if (!this._token) {\n // ensure to initialize with an empty token if we had none\n this._token = CancellationToken.None;\n }\n else if (this._token instanceof MutableToken) {\n // actually dispose\n this._token.dispose();\n }\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/keyCodes.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nclass KeyCodeStrMap {\n constructor() {\n this._keyCodeToStr = [];\n this._strToKeyCode = Object.create(null);\n }\n define(keyCode, str) {\n this._keyCodeToStr[keyCode] = str;\n this._strToKeyCode[str.toLowerCase()] = keyCode;\n }\n keyCodeToStr(keyCode) {\n return this._keyCodeToStr[keyCode];\n }\n strToKeyCode(str) {\n return this._strToKeyCode[str.toLowerCase()] || 0 /* KeyCode.Unknown */;\n }\n}\nconst uiMap = new KeyCodeStrMap();\nconst userSettingsUSMap = new KeyCodeStrMap();\nconst userSettingsGeneralMap = new KeyCodeStrMap();\nconst EVENT_KEY_CODE_MAP = new Array(230);\nconst NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE = {};\nconst scanCodeIntToStr = [];\nconst scanCodeStrToInt = Object.create(null);\nconst scanCodeLowerCaseStrToInt = Object.create(null);\n/**\n * -1 if a ScanCode => KeyCode mapping depends on kb layout.\n */\nconst IMMUTABLE_CODE_TO_KEY_CODE = [];\n/**\n * -1 if a KeyCode => ScanCode mapping depends on kb layout.\n */\nconst IMMUTABLE_KEY_CODE_TO_CODE = [];\nfor (let i = 0; i <= 193 /* ScanCode.MAX_VALUE */; i++) {\n IMMUTABLE_CODE_TO_KEY_CODE[i] = -1 /* KeyCode.DependsOnKbLayout */;\n}\nfor (let i = 0; i <= 132 /* KeyCode.MAX_VALUE */; i++) {\n IMMUTABLE_KEY_CODE_TO_CODE[i] = -1 /* ScanCode.DependsOnKbLayout */;\n}\n(function () {\n // See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n // See https://github.com/microsoft/node-native-keymap/blob/88c0b0e5/deps/chromium/keyboard_codes_win.h\n const empty = '';\n const mappings = [\n // immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel\n [1, 0 /* ScanCode.None */, 'None', 0 /* KeyCode.Unknown */, 'unknown', 0, 'VK_UNKNOWN', empty, empty],\n [1, 1 /* ScanCode.Hyper */, 'Hyper', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 2 /* ScanCode.Super */, 'Super', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 3 /* ScanCode.Fn */, 'Fn', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 4 /* ScanCode.FnLock */, 'FnLock', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 5 /* ScanCode.Suspend */, 'Suspend', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 6 /* ScanCode.Resume */, 'Resume', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 7 /* ScanCode.Turbo */, 'Turbo', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 8 /* ScanCode.Sleep */, 'Sleep', 0 /* KeyCode.Unknown */, empty, 0, 'VK_SLEEP', empty, empty],\n [1, 9 /* ScanCode.WakeUp */, 'WakeUp', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 10 /* ScanCode.KeyA */, 'KeyA', 31 /* KeyCode.KeyA */, 'A', 65, 'VK_A', empty, empty],\n [0, 11 /* ScanCode.KeyB */, 'KeyB', 32 /* KeyCode.KeyB */, 'B', 66, 'VK_B', empty, empty],\n [0, 12 /* ScanCode.KeyC */, 'KeyC', 33 /* KeyCode.KeyC */, 'C', 67, 'VK_C', empty, empty],\n [0, 13 /* ScanCode.KeyD */, 'KeyD', 34 /* KeyCode.KeyD */, 'D', 68, 'VK_D', empty, empty],\n [0, 14 /* ScanCode.KeyE */, 'KeyE', 35 /* KeyCode.KeyE */, 'E', 69, 'VK_E', empty, empty],\n [0, 15 /* ScanCode.KeyF */, 'KeyF', 36 /* KeyCode.KeyF */, 'F', 70, 'VK_F', empty, empty],\n [0, 16 /* ScanCode.KeyG */, 'KeyG', 37 /* KeyCode.KeyG */, 'G', 71, 'VK_G', empty, empty],\n [0, 17 /* ScanCode.KeyH */, 'KeyH', 38 /* KeyCode.KeyH */, 'H', 72, 'VK_H', empty, empty],\n [0, 18 /* ScanCode.KeyI */, 'KeyI', 39 /* KeyCode.KeyI */, 'I', 73, 'VK_I', empty, empty],\n [0, 19 /* ScanCode.KeyJ */, 'KeyJ', 40 /* KeyCode.KeyJ */, 'J', 74, 'VK_J', empty, empty],\n [0, 20 /* ScanCode.KeyK */, 'KeyK', 41 /* KeyCode.KeyK */, 'K', 75, 'VK_K', empty, empty],\n [0, 21 /* ScanCode.KeyL */, 'KeyL', 42 /* KeyCode.KeyL */, 'L', 76, 'VK_L', empty, empty],\n [0, 22 /* ScanCode.KeyM */, 'KeyM', 43 /* KeyCode.KeyM */, 'M', 77, 'VK_M', empty, empty],\n [0, 23 /* ScanCode.KeyN */, 'KeyN', 44 /* KeyCode.KeyN */, 'N', 78, 'VK_N', empty, empty],\n [0, 24 /* ScanCode.KeyO */, 'KeyO', 45 /* KeyCode.KeyO */, 'O', 79, 'VK_O', empty, empty],\n [0, 25 /* ScanCode.KeyP */, 'KeyP', 46 /* KeyCode.KeyP */, 'P', 80, 'VK_P', empty, empty],\n [0, 26 /* ScanCode.KeyQ */, 'KeyQ', 47 /* KeyCode.KeyQ */, 'Q', 81, 'VK_Q', empty, empty],\n [0, 27 /* ScanCode.KeyR */, 'KeyR', 48 /* KeyCode.KeyR */, 'R', 82, 'VK_R', empty, empty],\n [0, 28 /* ScanCode.KeyS */, 'KeyS', 49 /* KeyCode.KeyS */, 'S', 83, 'VK_S', empty, empty],\n [0, 29 /* ScanCode.KeyT */, 'KeyT', 50 /* KeyCode.KeyT */, 'T', 84, 'VK_T', empty, empty],\n [0, 30 /* ScanCode.KeyU */, 'KeyU', 51 /* KeyCode.KeyU */, 'U', 85, 'VK_U', empty, empty],\n [0, 31 /* ScanCode.KeyV */, 'KeyV', 52 /* KeyCode.KeyV */, 'V', 86, 'VK_V', empty, empty],\n [0, 32 /* ScanCode.KeyW */, 'KeyW', 53 /* KeyCode.KeyW */, 'W', 87, 'VK_W', empty, empty],\n [0, 33 /* ScanCode.KeyX */, 'KeyX', 54 /* KeyCode.KeyX */, 'X', 88, 'VK_X', empty, empty],\n [0, 34 /* ScanCode.KeyY */, 'KeyY', 55 /* KeyCode.KeyY */, 'Y', 89, 'VK_Y', empty, empty],\n [0, 35 /* ScanCode.KeyZ */, 'KeyZ', 56 /* KeyCode.KeyZ */, 'Z', 90, 'VK_Z', empty, empty],\n [0, 36 /* ScanCode.Digit1 */, 'Digit1', 22 /* KeyCode.Digit1 */, '1', 49, 'VK_1', empty, empty],\n [0, 37 /* ScanCode.Digit2 */, 'Digit2', 23 /* KeyCode.Digit2 */, '2', 50, 'VK_2', empty, empty],\n [0, 38 /* ScanCode.Digit3 */, 'Digit3', 24 /* KeyCode.Digit3 */, '3', 51, 'VK_3', empty, empty],\n [0, 39 /* ScanCode.Digit4 */, 'Digit4', 25 /* KeyCode.Digit4 */, '4', 52, 'VK_4', empty, empty],\n [0, 40 /* ScanCode.Digit5 */, 'Digit5', 26 /* KeyCode.Digit5 */, '5', 53, 'VK_5', empty, empty],\n [0, 41 /* ScanCode.Digit6 */, 'Digit6', 27 /* KeyCode.Digit6 */, '6', 54, 'VK_6', empty, empty],\n [0, 42 /* ScanCode.Digit7 */, 'Digit7', 28 /* KeyCode.Digit7 */, '7', 55, 'VK_7', empty, empty],\n [0, 43 /* ScanCode.Digit8 */, 'Digit8', 29 /* KeyCode.Digit8 */, '8', 56, 'VK_8', empty, empty],\n [0, 44 /* ScanCode.Digit9 */, 'Digit9', 30 /* KeyCode.Digit9 */, '9', 57, 'VK_9', empty, empty],\n [0, 45 /* ScanCode.Digit0 */, 'Digit0', 21 /* KeyCode.Digit0 */, '0', 48, 'VK_0', empty, empty],\n [1, 46 /* ScanCode.Enter */, 'Enter', 3 /* KeyCode.Enter */, 'Enter', 13, 'VK_RETURN', empty, empty],\n [1, 47 /* ScanCode.Escape */, 'Escape', 9 /* KeyCode.Escape */, 'Escape', 27, 'VK_ESCAPE', empty, empty],\n [1, 48 /* ScanCode.Backspace */, 'Backspace', 1 /* KeyCode.Backspace */, 'Backspace', 8, 'VK_BACK', empty, empty],\n [1, 49 /* ScanCode.Tab */, 'Tab', 2 /* KeyCode.Tab */, 'Tab', 9, 'VK_TAB', empty, empty],\n [1, 50 /* ScanCode.Space */, 'Space', 10 /* KeyCode.Space */, 'Space', 32, 'VK_SPACE', empty, empty],\n [0, 51 /* ScanCode.Minus */, 'Minus', 88 /* KeyCode.Minus */, '-', 189, 'VK_OEM_MINUS', '-', 'OEM_MINUS'],\n [0, 52 /* ScanCode.Equal */, 'Equal', 86 /* KeyCode.Equal */, '=', 187, 'VK_OEM_PLUS', '=', 'OEM_PLUS'],\n [0, 53 /* ScanCode.BracketLeft */, 'BracketLeft', 92 /* KeyCode.BracketLeft */, '[', 219, 'VK_OEM_4', '[', 'OEM_4'],\n [0, 54 /* ScanCode.BracketRight */, 'BracketRight', 94 /* KeyCode.BracketRight */, ']', 221, 'VK_OEM_6', ']', 'OEM_6'],\n [0, 55 /* ScanCode.Backslash */, 'Backslash', 93 /* KeyCode.Backslash */, '\\\\', 220, 'VK_OEM_5', '\\\\', 'OEM_5'],\n [0, 56 /* ScanCode.IntlHash */, 'IntlHash', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 57 /* ScanCode.Semicolon */, 'Semicolon', 85 /* KeyCode.Semicolon */, ';', 186, 'VK_OEM_1', ';', 'OEM_1'],\n [0, 58 /* ScanCode.Quote */, 'Quote', 95 /* KeyCode.Quote */, '\\'', 222, 'VK_OEM_7', '\\'', 'OEM_7'],\n [0, 59 /* ScanCode.Backquote */, 'Backquote', 91 /* KeyCode.Backquote */, '`', 192, 'VK_OEM_3', '`', 'OEM_3'],\n [0, 60 /* ScanCode.Comma */, 'Comma', 87 /* KeyCode.Comma */, ',', 188, 'VK_OEM_COMMA', ',', 'OEM_COMMA'],\n [0, 61 /* ScanCode.Period */, 'Period', 89 /* KeyCode.Period */, '.', 190, 'VK_OEM_PERIOD', '.', 'OEM_PERIOD'],\n [0, 62 /* ScanCode.Slash */, 'Slash', 90 /* KeyCode.Slash */, '/', 191, 'VK_OEM_2', '/', 'OEM_2'],\n [1, 63 /* ScanCode.CapsLock */, 'CapsLock', 8 /* KeyCode.CapsLock */, 'CapsLock', 20, 'VK_CAPITAL', empty, empty],\n [1, 64 /* ScanCode.F1 */, 'F1', 59 /* KeyCode.F1 */, 'F1', 112, 'VK_F1', empty, empty],\n [1, 65 /* ScanCode.F2 */, 'F2', 60 /* KeyCode.F2 */, 'F2', 113, 'VK_F2', empty, empty],\n [1, 66 /* ScanCode.F3 */, 'F3', 61 /* KeyCode.F3 */, 'F3', 114, 'VK_F3', empty, empty],\n [1, 67 /* ScanCode.F4 */, 'F4', 62 /* KeyCode.F4 */, 'F4', 115, 'VK_F4', empty, empty],\n [1, 68 /* ScanCode.F5 */, 'F5', 63 /* KeyCode.F5 */, 'F5', 116, 'VK_F5', empty, empty],\n [1, 69 /* ScanCode.F6 */, 'F6', 64 /* KeyCode.F6 */, 'F6', 117, 'VK_F6', empty, empty],\n [1, 70 /* ScanCode.F7 */, 'F7', 65 /* KeyCode.F7 */, 'F7', 118, 'VK_F7', empty, empty],\n [1, 71 /* ScanCode.F8 */, 'F8', 66 /* KeyCode.F8 */, 'F8', 119, 'VK_F8', empty, empty],\n [1, 72 /* ScanCode.F9 */, 'F9', 67 /* KeyCode.F9 */, 'F9', 120, 'VK_F9', empty, empty],\n [1, 73 /* ScanCode.F10 */, 'F10', 68 /* KeyCode.F10 */, 'F10', 121, 'VK_F10', empty, empty],\n [1, 74 /* ScanCode.F11 */, 'F11', 69 /* KeyCode.F11 */, 'F11', 122, 'VK_F11', empty, empty],\n [1, 75 /* ScanCode.F12 */, 'F12', 70 /* KeyCode.F12 */, 'F12', 123, 'VK_F12', empty, empty],\n [1, 76 /* ScanCode.PrintScreen */, 'PrintScreen', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 77 /* ScanCode.ScrollLock */, 'ScrollLock', 84 /* KeyCode.ScrollLock */, 'ScrollLock', 145, 'VK_SCROLL', empty, empty],\n [1, 78 /* ScanCode.Pause */, 'Pause', 7 /* KeyCode.PauseBreak */, 'PauseBreak', 19, 'VK_PAUSE', empty, empty],\n [1, 79 /* ScanCode.Insert */, 'Insert', 19 /* KeyCode.Insert */, 'Insert', 45, 'VK_INSERT', empty, empty],\n [1, 80 /* ScanCode.Home */, 'Home', 14 /* KeyCode.Home */, 'Home', 36, 'VK_HOME', empty, empty],\n [1, 81 /* ScanCode.PageUp */, 'PageUp', 11 /* KeyCode.PageUp */, 'PageUp', 33, 'VK_PRIOR', empty, empty],\n [1, 82 /* ScanCode.Delete */, 'Delete', 20 /* KeyCode.Delete */, 'Delete', 46, 'VK_DELETE', empty, empty],\n [1, 83 /* ScanCode.End */, 'End', 13 /* KeyCode.End */, 'End', 35, 'VK_END', empty, empty],\n [1, 84 /* ScanCode.PageDown */, 'PageDown', 12 /* KeyCode.PageDown */, 'PageDown', 34, 'VK_NEXT', empty, empty],\n [1, 85 /* ScanCode.ArrowRight */, 'ArrowRight', 17 /* KeyCode.RightArrow */, 'RightArrow', 39, 'VK_RIGHT', 'Right', empty],\n [1, 86 /* ScanCode.ArrowLeft */, 'ArrowLeft', 15 /* KeyCode.LeftArrow */, 'LeftArrow', 37, 'VK_LEFT', 'Left', empty],\n [1, 87 /* ScanCode.ArrowDown */, 'ArrowDown', 18 /* KeyCode.DownArrow */, 'DownArrow', 40, 'VK_DOWN', 'Down', empty],\n [1, 88 /* ScanCode.ArrowUp */, 'ArrowUp', 16 /* KeyCode.UpArrow */, 'UpArrow', 38, 'VK_UP', 'Up', empty],\n [1, 89 /* ScanCode.NumLock */, 'NumLock', 83 /* KeyCode.NumLock */, 'NumLock', 144, 'VK_NUMLOCK', empty, empty],\n [1, 90 /* ScanCode.NumpadDivide */, 'NumpadDivide', 113 /* KeyCode.NumpadDivide */, 'NumPad_Divide', 111, 'VK_DIVIDE', empty, empty],\n [1, 91 /* ScanCode.NumpadMultiply */, 'NumpadMultiply', 108 /* KeyCode.NumpadMultiply */, 'NumPad_Multiply', 106, 'VK_MULTIPLY', empty, empty],\n [1, 92 /* ScanCode.NumpadSubtract */, 'NumpadSubtract', 111 /* KeyCode.NumpadSubtract */, 'NumPad_Subtract', 109, 'VK_SUBTRACT', empty, empty],\n [1, 93 /* ScanCode.NumpadAdd */, 'NumpadAdd', 109 /* KeyCode.NumpadAdd */, 'NumPad_Add', 107, 'VK_ADD', empty, empty],\n [1, 94 /* ScanCode.NumpadEnter */, 'NumpadEnter', 3 /* KeyCode.Enter */, empty, 0, empty, empty, empty],\n [1, 95 /* ScanCode.Numpad1 */, 'Numpad1', 99 /* KeyCode.Numpad1 */, 'NumPad1', 97, 'VK_NUMPAD1', empty, empty],\n [1, 96 /* ScanCode.Numpad2 */, 'Numpad2', 100 /* KeyCode.Numpad2 */, 'NumPad2', 98, 'VK_NUMPAD2', empty, empty],\n [1, 97 /* ScanCode.Numpad3 */, 'Numpad3', 101 /* KeyCode.Numpad3 */, 'NumPad3', 99, 'VK_NUMPAD3', empty, empty],\n [1, 98 /* ScanCode.Numpad4 */, 'Numpad4', 102 /* KeyCode.Numpad4 */, 'NumPad4', 100, 'VK_NUMPAD4', empty, empty],\n [1, 99 /* ScanCode.Numpad5 */, 'Numpad5', 103 /* KeyCode.Numpad5 */, 'NumPad5', 101, 'VK_NUMPAD5', empty, empty],\n [1, 100 /* ScanCode.Numpad6 */, 'Numpad6', 104 /* KeyCode.Numpad6 */, 'NumPad6', 102, 'VK_NUMPAD6', empty, empty],\n [1, 101 /* ScanCode.Numpad7 */, 'Numpad7', 105 /* KeyCode.Numpad7 */, 'NumPad7', 103, 'VK_NUMPAD7', empty, empty],\n [1, 102 /* ScanCode.Numpad8 */, 'Numpad8', 106 /* KeyCode.Numpad8 */, 'NumPad8', 104, 'VK_NUMPAD8', empty, empty],\n [1, 103 /* ScanCode.Numpad9 */, 'Numpad9', 107 /* KeyCode.Numpad9 */, 'NumPad9', 105, 'VK_NUMPAD9', empty, empty],\n [1, 104 /* ScanCode.Numpad0 */, 'Numpad0', 98 /* KeyCode.Numpad0 */, 'NumPad0', 96, 'VK_NUMPAD0', empty, empty],\n [1, 105 /* ScanCode.NumpadDecimal */, 'NumpadDecimal', 112 /* KeyCode.NumpadDecimal */, 'NumPad_Decimal', 110, 'VK_DECIMAL', empty, empty],\n [0, 106 /* ScanCode.IntlBackslash */, 'IntlBackslash', 97 /* KeyCode.IntlBackslash */, 'OEM_102', 226, 'VK_OEM_102', empty, empty],\n [1, 107 /* ScanCode.ContextMenu */, 'ContextMenu', 58 /* KeyCode.ContextMenu */, 'ContextMenu', 93, empty, empty, empty],\n [1, 108 /* ScanCode.Power */, 'Power', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 109 /* ScanCode.NumpadEqual */, 'NumpadEqual', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 110 /* ScanCode.F13 */, 'F13', 71 /* KeyCode.F13 */, 'F13', 124, 'VK_F13', empty, empty],\n [1, 111 /* ScanCode.F14 */, 'F14', 72 /* KeyCode.F14 */, 'F14', 125, 'VK_F14', empty, empty],\n [1, 112 /* ScanCode.F15 */, 'F15', 73 /* KeyCode.F15 */, 'F15', 126, 'VK_F15', empty, empty],\n [1, 113 /* ScanCode.F16 */, 'F16', 74 /* KeyCode.F16 */, 'F16', 127, 'VK_F16', empty, empty],\n [1, 114 /* ScanCode.F17 */, 'F17', 75 /* KeyCode.F17 */, 'F17', 128, 'VK_F17', empty, empty],\n [1, 115 /* ScanCode.F18 */, 'F18', 76 /* KeyCode.F18 */, 'F18', 129, 'VK_F18', empty, empty],\n [1, 116 /* ScanCode.F19 */, 'F19', 77 /* KeyCode.F19 */, 'F19', 130, 'VK_F19', empty, empty],\n [1, 117 /* ScanCode.F20 */, 'F20', 78 /* KeyCode.F20 */, 'F20', 131, 'VK_F20', empty, empty],\n [1, 118 /* ScanCode.F21 */, 'F21', 79 /* KeyCode.F21 */, 'F21', 132, 'VK_F21', empty, empty],\n [1, 119 /* ScanCode.F22 */, 'F22', 80 /* KeyCode.F22 */, 'F22', 133, 'VK_F22', empty, empty],\n [1, 120 /* ScanCode.F23 */, 'F23', 81 /* KeyCode.F23 */, 'F23', 134, 'VK_F23', empty, empty],\n [1, 121 /* ScanCode.F24 */, 'F24', 82 /* KeyCode.F24 */, 'F24', 135, 'VK_F24', empty, empty],\n [1, 122 /* ScanCode.Open */, 'Open', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 123 /* ScanCode.Help */, 'Help', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 124 /* ScanCode.Select */, 'Select', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 125 /* ScanCode.Again */, 'Again', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 126 /* ScanCode.Undo */, 'Undo', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 127 /* ScanCode.Cut */, 'Cut', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 128 /* ScanCode.Copy */, 'Copy', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 129 /* ScanCode.Paste */, 'Paste', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 130 /* ScanCode.Find */, 'Find', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 131 /* ScanCode.AudioVolumeMute */, 'AudioVolumeMute', 117 /* KeyCode.AudioVolumeMute */, 'AudioVolumeMute', 173, 'VK_VOLUME_MUTE', empty, empty],\n [1, 132 /* ScanCode.AudioVolumeUp */, 'AudioVolumeUp', 118 /* KeyCode.AudioVolumeUp */, 'AudioVolumeUp', 175, 'VK_VOLUME_UP', empty, empty],\n [1, 133 /* ScanCode.AudioVolumeDown */, 'AudioVolumeDown', 119 /* KeyCode.AudioVolumeDown */, 'AudioVolumeDown', 174, 'VK_VOLUME_DOWN', empty, empty],\n [1, 134 /* ScanCode.NumpadComma */, 'NumpadComma', 110 /* KeyCode.NUMPAD_SEPARATOR */, 'NumPad_Separator', 108, 'VK_SEPARATOR', empty, empty],\n [0, 135 /* ScanCode.IntlRo */, 'IntlRo', 115 /* KeyCode.ABNT_C1 */, 'ABNT_C1', 193, 'VK_ABNT_C1', empty, empty],\n [1, 136 /* ScanCode.KanaMode */, 'KanaMode', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [0, 137 /* ScanCode.IntlYen */, 'IntlYen', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 138 /* ScanCode.Convert */, 'Convert', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 139 /* ScanCode.NonConvert */, 'NonConvert', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 140 /* ScanCode.Lang1 */, 'Lang1', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 141 /* ScanCode.Lang2 */, 'Lang2', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 142 /* ScanCode.Lang3 */, 'Lang3', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 143 /* ScanCode.Lang4 */, 'Lang4', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 144 /* ScanCode.Lang5 */, 'Lang5', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 145 /* ScanCode.Abort */, 'Abort', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 146 /* ScanCode.Props */, 'Props', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 147 /* ScanCode.NumpadParenLeft */, 'NumpadParenLeft', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 148 /* ScanCode.NumpadParenRight */, 'NumpadParenRight', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 149 /* ScanCode.NumpadBackspace */, 'NumpadBackspace', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 150 /* ScanCode.NumpadMemoryStore */, 'NumpadMemoryStore', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 151 /* ScanCode.NumpadMemoryRecall */, 'NumpadMemoryRecall', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 152 /* ScanCode.NumpadMemoryClear */, 'NumpadMemoryClear', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 153 /* ScanCode.NumpadMemoryAdd */, 'NumpadMemoryAdd', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 154 /* ScanCode.NumpadMemorySubtract */, 'NumpadMemorySubtract', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 155 /* ScanCode.NumpadClear */, 'NumpadClear', 131 /* KeyCode.Clear */, 'Clear', 12, 'VK_CLEAR', empty, empty],\n [1, 156 /* ScanCode.NumpadClearEntry */, 'NumpadClearEntry', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 0 /* ScanCode.None */, empty, 5 /* KeyCode.Ctrl */, 'Ctrl', 17, 'VK_CONTROL', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 4 /* KeyCode.Shift */, 'Shift', 16, 'VK_SHIFT', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 6 /* KeyCode.Alt */, 'Alt', 18, 'VK_MENU', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 57 /* KeyCode.Meta */, 'Meta', 91, 'VK_COMMAND', empty, empty],\n [1, 157 /* ScanCode.ControlLeft */, 'ControlLeft', 5 /* KeyCode.Ctrl */, empty, 0, 'VK_LCONTROL', empty, empty],\n [1, 158 /* ScanCode.ShiftLeft */, 'ShiftLeft', 4 /* KeyCode.Shift */, empty, 0, 'VK_LSHIFT', empty, empty],\n [1, 159 /* ScanCode.AltLeft */, 'AltLeft', 6 /* KeyCode.Alt */, empty, 0, 'VK_LMENU', empty, empty],\n [1, 160 /* ScanCode.MetaLeft */, 'MetaLeft', 57 /* KeyCode.Meta */, empty, 0, 'VK_LWIN', empty, empty],\n [1, 161 /* ScanCode.ControlRight */, 'ControlRight', 5 /* KeyCode.Ctrl */, empty, 0, 'VK_RCONTROL', empty, empty],\n [1, 162 /* ScanCode.ShiftRight */, 'ShiftRight', 4 /* KeyCode.Shift */, empty, 0, 'VK_RSHIFT', empty, empty],\n [1, 163 /* ScanCode.AltRight */, 'AltRight', 6 /* KeyCode.Alt */, empty, 0, 'VK_RMENU', empty, empty],\n [1, 164 /* ScanCode.MetaRight */, 'MetaRight', 57 /* KeyCode.Meta */, empty, 0, 'VK_RWIN', empty, empty],\n [1, 165 /* ScanCode.BrightnessUp */, 'BrightnessUp', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 166 /* ScanCode.BrightnessDown */, 'BrightnessDown', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 167 /* ScanCode.MediaPlay */, 'MediaPlay', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 168 /* ScanCode.MediaRecord */, 'MediaRecord', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 169 /* ScanCode.MediaFastForward */, 'MediaFastForward', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 170 /* ScanCode.MediaRewind */, 'MediaRewind', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 171 /* ScanCode.MediaTrackNext */, 'MediaTrackNext', 124 /* KeyCode.MediaTrackNext */, 'MediaTrackNext', 176, 'VK_MEDIA_NEXT_TRACK', empty, empty],\n [1, 172 /* ScanCode.MediaTrackPrevious */, 'MediaTrackPrevious', 125 /* KeyCode.MediaTrackPrevious */, 'MediaTrackPrevious', 177, 'VK_MEDIA_PREV_TRACK', empty, empty],\n [1, 173 /* ScanCode.MediaStop */, 'MediaStop', 126 /* KeyCode.MediaStop */, 'MediaStop', 178, 'VK_MEDIA_STOP', empty, empty],\n [1, 174 /* ScanCode.Eject */, 'Eject', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 175 /* ScanCode.MediaPlayPause */, 'MediaPlayPause', 127 /* KeyCode.MediaPlayPause */, 'MediaPlayPause', 179, 'VK_MEDIA_PLAY_PAUSE', empty, empty],\n [1, 176 /* ScanCode.MediaSelect */, 'MediaSelect', 128 /* KeyCode.LaunchMediaPlayer */, 'LaunchMediaPlayer', 181, 'VK_MEDIA_LAUNCH_MEDIA_SELECT', empty, empty],\n [1, 177 /* ScanCode.LaunchMail */, 'LaunchMail', 129 /* KeyCode.LaunchMail */, 'LaunchMail', 180, 'VK_MEDIA_LAUNCH_MAIL', empty, empty],\n [1, 178 /* ScanCode.LaunchApp2 */, 'LaunchApp2', 130 /* KeyCode.LaunchApp2 */, 'LaunchApp2', 183, 'VK_MEDIA_LAUNCH_APP2', empty, empty],\n [1, 179 /* ScanCode.LaunchApp1 */, 'LaunchApp1', 0 /* KeyCode.Unknown */, empty, 0, 'VK_MEDIA_LAUNCH_APP1', empty, empty],\n [1, 180 /* ScanCode.SelectTask */, 'SelectTask', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 181 /* ScanCode.LaunchScreenSaver */, 'LaunchScreenSaver', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 182 /* ScanCode.BrowserSearch */, 'BrowserSearch', 120 /* KeyCode.BrowserSearch */, 'BrowserSearch', 170, 'VK_BROWSER_SEARCH', empty, empty],\n [1, 183 /* ScanCode.BrowserHome */, 'BrowserHome', 121 /* KeyCode.BrowserHome */, 'BrowserHome', 172, 'VK_BROWSER_HOME', empty, empty],\n [1, 184 /* ScanCode.BrowserBack */, 'BrowserBack', 122 /* KeyCode.BrowserBack */, 'BrowserBack', 166, 'VK_BROWSER_BACK', empty, empty],\n [1, 185 /* ScanCode.BrowserForward */, 'BrowserForward', 123 /* KeyCode.BrowserForward */, 'BrowserForward', 167, 'VK_BROWSER_FORWARD', empty, empty],\n [1, 186 /* ScanCode.BrowserStop */, 'BrowserStop', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_STOP', empty, empty],\n [1, 187 /* ScanCode.BrowserRefresh */, 'BrowserRefresh', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_REFRESH', empty, empty],\n [1, 188 /* ScanCode.BrowserFavorites */, 'BrowserFavorites', 0 /* KeyCode.Unknown */, empty, 0, 'VK_BROWSER_FAVORITES', empty, empty],\n [1, 189 /* ScanCode.ZoomToggle */, 'ZoomToggle', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 190 /* ScanCode.MailReply */, 'MailReply', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 191 /* ScanCode.MailForward */, 'MailForward', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n [1, 192 /* ScanCode.MailSend */, 'MailSend', 0 /* KeyCode.Unknown */, empty, 0, empty, empty, empty],\n // See https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n // If an Input Method Editor is processing key input and the event is keydown, return 229.\n [1, 0 /* ScanCode.None */, empty, 114 /* KeyCode.KEY_IN_COMPOSITION */, 'KeyInComposition', 229, empty, empty, empty],\n [1, 0 /* ScanCode.None */, empty, 116 /* KeyCode.ABNT_C2 */, 'ABNT_C2', 194, 'VK_ABNT_C2', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 96 /* KeyCode.OEM_8 */, 'OEM_8', 223, 'VK_OEM_8', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_KANA', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HANGUL', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_JUNJA', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_FINAL', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HANJA', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_KANJI', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_CONVERT', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_NONCONVERT', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ACCEPT', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_MODECHANGE', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_SELECT', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PRINT', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EXECUTE', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_SNAPSHOT', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_HELP', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_APPS', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PROCESSKEY', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PACKET', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_DBE_SBCSCHAR', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_DBE_DBCSCHAR', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ATTN', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_CRSEL', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EXSEL', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_EREOF', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PLAY', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_ZOOM', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_NONAME', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_PA1', empty, empty],\n [1, 0 /* ScanCode.None */, empty, 0 /* KeyCode.Unknown */, empty, 0, 'VK_OEM_CLEAR', empty, empty],\n ];\n const seenKeyCode = [];\n const seenScanCode = [];\n for (const mapping of mappings) {\n const [immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel] = mapping;\n if (!seenScanCode[scanCode]) {\n seenScanCode[scanCode] = true;\n scanCodeIntToStr[scanCode] = scanCodeStr;\n scanCodeStrToInt[scanCodeStr] = scanCode;\n scanCodeLowerCaseStrToInt[scanCodeStr.toLowerCase()] = scanCode;\n if (immutable) {\n IMMUTABLE_CODE_TO_KEY_CODE[scanCode] = keyCode;\n if ((keyCode !== 0 /* KeyCode.Unknown */)\n && (keyCode !== 3 /* KeyCode.Enter */)\n && (keyCode !== 5 /* KeyCode.Ctrl */)\n && (keyCode !== 4 /* KeyCode.Shift */)\n && (keyCode !== 6 /* KeyCode.Alt */)\n && (keyCode !== 57 /* KeyCode.Meta */)) {\n IMMUTABLE_KEY_CODE_TO_CODE[keyCode] = scanCode;\n }\n }\n }\n if (!seenKeyCode[keyCode]) {\n seenKeyCode[keyCode] = true;\n if (!keyCodeStr) {\n throw new Error(`String representation missing for key code ${keyCode} around scan code ${scanCodeStr}`);\n }\n uiMap.define(keyCode, keyCodeStr);\n userSettingsUSMap.define(keyCode, usUserSettingsLabel || keyCodeStr);\n userSettingsGeneralMap.define(keyCode, generalUserSettingsLabel || usUserSettingsLabel || keyCodeStr);\n }\n if (eventKeyCode) {\n EVENT_KEY_CODE_MAP[eventKeyCode] = keyCode;\n }\n if (vkey) {\n NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE[vkey] = keyCode;\n }\n }\n // Manually added due to the exclusion above (due to duplication with NumpadEnter)\n IMMUTABLE_KEY_CODE_TO_CODE[3 /* KeyCode.Enter */] = 46 /* ScanCode.Enter */;\n})();\nvar KeyCodeUtils;\n(function (KeyCodeUtils) {\n function toString(keyCode) {\n return uiMap.keyCodeToStr(keyCode);\n }\n KeyCodeUtils.toString = toString;\n function fromString(key) {\n return uiMap.strToKeyCode(key);\n }\n KeyCodeUtils.fromString = fromString;\n function toUserSettingsUS(keyCode) {\n return userSettingsUSMap.keyCodeToStr(keyCode);\n }\n KeyCodeUtils.toUserSettingsUS = toUserSettingsUS;\n function toUserSettingsGeneral(keyCode) {\n return userSettingsGeneralMap.keyCodeToStr(keyCode);\n }\n KeyCodeUtils.toUserSettingsGeneral = toUserSettingsGeneral;\n function fromUserSettings(key) {\n return userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key);\n }\n KeyCodeUtils.fromUserSettings = fromUserSettings;\n function toElectronAccelerator(keyCode) {\n if (keyCode >= 98 /* KeyCode.Numpad0 */ && keyCode <= 113 /* KeyCode.NumpadDivide */) {\n // [Electron Accelerators] Electron is able to parse numpad keys, but unfortunately it\n // renders them just as regular keys in menus. For example, num0 is rendered as \"0\",\n // numdiv is rendered as \"/\", numsub is rendered as \"-\".\n //\n // This can lead to incredible confusion, as it makes numpad based keybindings indistinguishable\n // from keybindings based on regular keys.\n //\n // We therefore need to fall back to custom rendering for numpad keys.\n return null;\n }\n switch (keyCode) {\n case 16 /* KeyCode.UpArrow */:\n return 'Up';\n case 18 /* KeyCode.DownArrow */:\n return 'Down';\n case 15 /* KeyCode.LeftArrow */:\n return 'Left';\n case 17 /* KeyCode.RightArrow */:\n return 'Right';\n }\n return uiMap.keyCodeToStr(keyCode);\n }\n KeyCodeUtils.toElectronAccelerator = toElectronAccelerator;\n})(KeyCodeUtils || (KeyCodeUtils = {}));\nfunction KeyChord(firstPart, secondPart) {\n const chordPart = ((secondPart & 0x0000FFFF) << 16) >>> 0;\n return (firstPart | chordPart) >>> 0;\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/core/selection.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n/**\n * A selection in the editor.\n * The selection is a range that has an orientation.\n */\nclass Selection extends range_Range {\n constructor(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn) {\n super(selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn);\n this.selectionStartLineNumber = selectionStartLineNumber;\n this.selectionStartColumn = selectionStartColumn;\n this.positionLineNumber = positionLineNumber;\n this.positionColumn = positionColumn;\n }\n /**\n * Transform to a human-readable representation.\n */\n toString() {\n return '[' + this.selectionStartLineNumber + ',' + this.selectionStartColumn + ' -> ' + this.positionLineNumber + ',' + this.positionColumn + ']';\n }\n /**\n * Test if equals other selection.\n */\n equalsSelection(other) {\n return (Selection.selectionsEqual(this, other));\n }\n /**\n * Test if the two selections are equal.\n */\n static selectionsEqual(a, b) {\n return (a.selectionStartLineNumber === b.selectionStartLineNumber &&\n a.selectionStartColumn === b.selectionStartColumn &&\n a.positionLineNumber === b.positionLineNumber &&\n a.positionColumn === b.positionColumn);\n }\n /**\n * Get directions (LTR or RTL).\n */\n getDirection() {\n if (this.selectionStartLineNumber === this.startLineNumber && this.selectionStartColumn === this.startColumn) {\n return 0 /* SelectionDirection.LTR */;\n }\n return 1 /* SelectionDirection.RTL */;\n }\n /**\n * Create a new selection with a different `positionLineNumber` and `positionColumn`.\n */\n setEndPosition(endLineNumber, endColumn) {\n if (this.getDirection() === 0 /* SelectionDirection.LTR */) {\n return new Selection(this.startLineNumber, this.startColumn, endLineNumber, endColumn);\n }\n return new Selection(endLineNumber, endColumn, this.startLineNumber, this.startColumn);\n }\n /**\n * Get the position at `positionLineNumber` and `positionColumn`.\n */\n getPosition() {\n return new position_Position(this.positionLineNumber, this.positionColumn);\n }\n /**\n * Get the position at the start of the selection.\n */\n getSelectionStart() {\n return new position_Position(this.selectionStartLineNumber, this.selectionStartColumn);\n }\n /**\n * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`.\n */\n setStartPosition(startLineNumber, startColumn) {\n if (this.getDirection() === 0 /* SelectionDirection.LTR */) {\n return new Selection(startLineNumber, startColumn, this.endLineNumber, this.endColumn);\n }\n return new Selection(this.endLineNumber, this.endColumn, startLineNumber, startColumn);\n }\n // ----\n /**\n * Create a `Selection` from one or two positions\n */\n static fromPositions(start, end = start) {\n return new Selection(start.lineNumber, start.column, end.lineNumber, end.column);\n }\n /**\n * Creates a `Selection` from a range, given a direction.\n */\n static fromRange(range, direction) {\n if (direction === 0 /* SelectionDirection.LTR */) {\n return new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);\n }\n else {\n return new Selection(range.endLineNumber, range.endColumn, range.startLineNumber, range.startColumn);\n }\n }\n /**\n * Create a `Selection` from an `ISelection`.\n */\n static liftSelection(sel) {\n return new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn);\n }\n /**\n * `a` equals `b`.\n */\n static selectionsArrEqual(a, b) {\n if (a && !b || !a && b) {\n return false;\n }\n if (!a && !b) {\n return true;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0, len = a.length; i < len; i++) {\n if (!this.selectionsEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n /**\n * Test if `obj` is an `ISelection`.\n */\n static isISelection(obj) {\n return (obj\n && (typeof obj.selectionStartLineNumber === 'number')\n && (typeof obj.selectionStartColumn === 'number')\n && (typeof obj.positionLineNumber === 'number')\n && (typeof obj.positionColumn === 'number'));\n }\n /**\n * Create with a direction.\n */\n static createWithDirection(startLineNumber, startColumn, endLineNumber, endColumn, direction) {\n if (direction === 0 /* SelectionDirection.LTR */) {\n return new Selection(startLineNumber, startColumn, endLineNumber, endColumn);\n }\n return new Selection(endLineNumber, endColumn, startLineNumber, startColumn);\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/types.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n/**\n * @returns whether the provided parameter is a JavaScript String or not.\n */\nfunction isString(str) {\n return (typeof str === 'string');\n}\n/**\n * @returns whether the provided parameter is of type `object` but **not**\n *\t`null`, an `array`, a `regexp`, nor a `date`.\n */\nfunction types_isObject(obj) {\n // The method can't do a type cast since there are type (like strings) which\n // are subclasses of any put not positvely matched by the function. Hence type\n // narrowing results in wrong results.\n return typeof obj === 'object'\n && obj !== null\n && !Array.isArray(obj)\n && !(obj instanceof RegExp)\n && !(obj instanceof Date);\n}\n/**\n * @returns whether the provided parameter is of type `Buffer` or Uint8Array dervived type\n */\nfunction types_isTypedArray(obj) {\n const TypedArray = Object.getPrototypeOf(Uint8Array);\n return typeof obj === 'object'\n && obj instanceof TypedArray;\n}\n/**\n * In **contrast** to just checking `typeof` this will return `false` for `NaN`.\n * @returns whether the provided parameter is a JavaScript Number or not.\n */\nfunction isNumber(obj) {\n return (typeof obj === 'number' && !isNaN(obj));\n}\n/**\n * @returns whether the provided parameter is an Iterable, casting to the given generic\n */\nfunction isIterable(obj) {\n return !!obj && typeof obj[Symbol.iterator] === 'function';\n}\n/**\n * @returns whether the provided parameter is a JavaScript Boolean or not.\n */\nfunction isBoolean(obj) {\n return (obj === true || obj === false);\n}\n/**\n * @returns whether the provided parameter is undefined.\n */\nfunction isUndefined(obj) {\n return (typeof obj === 'undefined');\n}\n/**\n * @returns whether the provided parameter is defined.\n */\nfunction isDefined(arg) {\n return !types_isUndefinedOrNull(arg);\n}\n/**\n * @returns whether the provided parameter is undefined or null.\n */\nfunction types_isUndefinedOrNull(obj) {\n return (isUndefined(obj) || obj === null);\n}\nfunction assertType(condition, type) {\n if (!condition) {\n throw new Error(type ? `Unexpected type, expected '${type}'` : 'Unexpected type');\n }\n}\n/**\n * Asserts that the argument passed in is neither undefined nor null.\n */\nfunction assertIsDefined(arg) {\n if (types_isUndefinedOrNull(arg)) {\n throw new Error('Assertion Failed: argument is undefined or null');\n }\n return arg;\n}\n/**\n * @returns whether the provided parameter is a JavaScript Function or not.\n */\nfunction isFunction(obj) {\n return (typeof obj === 'function');\n}\nfunction validateConstraints(args, constraints) {\n const len = Math.min(args.length, constraints.length);\n for (let i = 0; i < len; i++) {\n validateConstraint(args[i], constraints[i]);\n }\n}\nfunction validateConstraint(arg, constraint) {\n if (isString(constraint)) {\n if (typeof arg !== constraint) {\n throw new Error(`argument does not match constraint: typeof ${constraint}`);\n }\n }\n else if (isFunction(constraint)) {\n try {\n if (arg instanceof constraint) {\n return;\n }\n }\n catch (_a) {\n // ignore\n }\n if (!types_isUndefinedOrNull(arg) && arg.constructor === constraint) {\n return;\n }\n if (constraint.length === 1 && constraint.call(undefined, arg) === true) {\n return;\n }\n throw new Error(`argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true`);\n }\n}\n/**\n * Converts null to undefined, passes all other values through.\n */\nfunction withNullAsUndefined(x) {\n return x === null ? undefined : x;\n}\n/**\n * Converts undefined to null, passes all other values through.\n */\nfunction withUndefinedAsNull(x) {\n return typeof x === 'undefined' ? null : x;\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/codicons.js\n\nconst _codiconFontCharacters = Object.create(null);\nfunction register(id, fontCharacter) {\n if (isString(fontCharacter)) {\n const val = _codiconFontCharacters[fontCharacter];\n if (val === undefined) {\n throw new Error(`${id} references an unknown codicon: ${fontCharacter}`);\n }\n fontCharacter = val;\n }\n _codiconFontCharacters[id] = fontCharacter;\n return { id };\n}\n/**\n * Only to be used by the iconRegistry.\n */\nfunction getCodiconFontCharacters() {\n return _codiconFontCharacters;\n}\n/**\n * The Codicon library is a set of default icons that are built-in in VS Code.\n *\n * In the product (outside of base) Codicons should only be used as defaults. In order to have all icons in VS Code\n * themeable, component should define new, UI component specific icons using `iconRegistry.registerIcon`.\n * In that call a Codicon can be named as default.\n */\nconst Codicon = {\n // built-in icons, with image name\n add: register('add', 0xea60),\n plus: register('plus', 0xea60),\n gistNew: register('gist-new', 0xea60),\n repoCreate: register('repo-create', 0xea60),\n lightbulb: register('lightbulb', 0xea61),\n lightBulb: register('light-bulb', 0xea61),\n repo: register('repo', 0xea62),\n repoDelete: register('repo-delete', 0xea62),\n gistFork: register('gist-fork', 0xea63),\n repoForked: register('repo-forked', 0xea63),\n gitPullRequest: register('git-pull-request', 0xea64),\n gitPullRequestAbandoned: register('git-pull-request-abandoned', 0xea64),\n recordKeys: register('record-keys', 0xea65),\n keyboard: register('keyboard', 0xea65),\n tag: register('tag', 0xea66),\n tagAdd: register('tag-add', 0xea66),\n tagRemove: register('tag-remove', 0xea66),\n person: register('person', 0xea67),\n personFollow: register('person-follow', 0xea67),\n personOutline: register('person-outline', 0xea67),\n personFilled: register('person-filled', 0xea67),\n gitBranch: register('git-branch', 0xea68),\n gitBranchCreate: register('git-branch-create', 0xea68),\n gitBranchDelete: register('git-branch-delete', 0xea68),\n sourceControl: register('source-control', 0xea68),\n mirror: register('mirror', 0xea69),\n mirrorPublic: register('mirror-public', 0xea69),\n star: register('star', 0xea6a),\n starAdd: register('star-add', 0xea6a),\n starDelete: register('star-delete', 0xea6a),\n starEmpty: register('star-empty', 0xea6a),\n comment: register('comment', 0xea6b),\n commentAdd: register('comment-add', 0xea6b),\n alert: register('alert', 0xea6c),\n warning: register('warning', 0xea6c),\n search: register('search', 0xea6d),\n searchSave: register('search-save', 0xea6d),\n logOut: register('log-out', 0xea6e),\n signOut: register('sign-out', 0xea6e),\n logIn: register('log-in', 0xea6f),\n signIn: register('sign-in', 0xea6f),\n eye: register('eye', 0xea70),\n eyeUnwatch: register('eye-unwatch', 0xea70),\n eyeWatch: register('eye-watch', 0xea70),\n circleFilled: register('circle-filled', 0xea71),\n primitiveDot: register('primitive-dot', 0xea71),\n closeDirty: register('close-dirty', 0xea71),\n debugBreakpoint: register('debug-breakpoint', 0xea71),\n debugBreakpointDisabled: register('debug-breakpoint-disabled', 0xea71),\n debugHint: register('debug-hint', 0xea71),\n primitiveSquare: register('primitive-square', 0xea72),\n edit: register('edit', 0xea73),\n pencil: register('pencil', 0xea73),\n info: register('info', 0xea74),\n issueOpened: register('issue-opened', 0xea74),\n gistPrivate: register('gist-private', 0xea75),\n gitForkPrivate: register('git-fork-private', 0xea75),\n lock: register('lock', 0xea75),\n mirrorPrivate: register('mirror-private', 0xea75),\n close: register('close', 0xea76),\n removeClose: register('remove-close', 0xea76),\n x: register('x', 0xea76),\n repoSync: register('repo-sync', 0xea77),\n sync: register('sync', 0xea77),\n clone: register('clone', 0xea78),\n desktopDownload: register('desktop-download', 0xea78),\n beaker: register('beaker', 0xea79),\n microscope: register('microscope', 0xea79),\n vm: register('vm', 0xea7a),\n deviceDesktop: register('device-desktop', 0xea7a),\n file: register('file', 0xea7b),\n fileText: register('file-text', 0xea7b),\n more: register('more', 0xea7c),\n ellipsis: register('ellipsis', 0xea7c),\n kebabHorizontal: register('kebab-horizontal', 0xea7c),\n mailReply: register('mail-reply', 0xea7d),\n reply: register('reply', 0xea7d),\n organization: register('organization', 0xea7e),\n organizationFilled: register('organization-filled', 0xea7e),\n organizationOutline: register('organization-outline', 0xea7e),\n newFile: register('new-file', 0xea7f),\n fileAdd: register('file-add', 0xea7f),\n newFolder: register('new-folder', 0xea80),\n fileDirectoryCreate: register('file-directory-create', 0xea80),\n trash: register('trash', 0xea81),\n trashcan: register('trashcan', 0xea81),\n history: register('history', 0xea82),\n clock: register('clock', 0xea82),\n folder: register('folder', 0xea83),\n fileDirectory: register('file-directory', 0xea83),\n symbolFolder: register('symbol-folder', 0xea83),\n logoGithub: register('logo-github', 0xea84),\n markGithub: register('mark-github', 0xea84),\n github: register('github', 0xea84),\n terminal: register('terminal', 0xea85),\n console: register('console', 0xea85),\n repl: register('repl', 0xea85),\n zap: register('zap', 0xea86),\n symbolEvent: register('symbol-event', 0xea86),\n error: register('error', 0xea87),\n stop: register('stop', 0xea87),\n variable: register('variable', 0xea88),\n symbolVariable: register('symbol-variable', 0xea88),\n array: register('array', 0xea8a),\n symbolArray: register('symbol-array', 0xea8a),\n symbolModule: register('symbol-module', 0xea8b),\n symbolPackage: register('symbol-package', 0xea8b),\n symbolNamespace: register('symbol-namespace', 0xea8b),\n symbolObject: register('symbol-object', 0xea8b),\n symbolMethod: register('symbol-method', 0xea8c),\n symbolFunction: register('symbol-function', 0xea8c),\n symbolConstructor: register('symbol-constructor', 0xea8c),\n symbolBoolean: register('symbol-boolean', 0xea8f),\n symbolNull: register('symbol-null', 0xea8f),\n symbolNumeric: register('symbol-numeric', 0xea90),\n symbolNumber: register('symbol-number', 0xea90),\n symbolStructure: register('symbol-structure', 0xea91),\n symbolStruct: register('symbol-struct', 0xea91),\n symbolParameter: register('symbol-parameter', 0xea92),\n symbolTypeParameter: register('symbol-type-parameter', 0xea92),\n symbolKey: register('symbol-key', 0xea93),\n symbolText: register('symbol-text', 0xea93),\n symbolReference: register('symbol-reference', 0xea94),\n goToFile: register('go-to-file', 0xea94),\n symbolEnum: register('symbol-enum', 0xea95),\n symbolValue: register('symbol-value', 0xea95),\n symbolRuler: register('symbol-ruler', 0xea96),\n symbolUnit: register('symbol-unit', 0xea96),\n activateBreakpoints: register('activate-breakpoints', 0xea97),\n archive: register('archive', 0xea98),\n arrowBoth: register('arrow-both', 0xea99),\n arrowDown: register('arrow-down', 0xea9a),\n arrowLeft: register('arrow-left', 0xea9b),\n arrowRight: register('arrow-right', 0xea9c),\n arrowSmallDown: register('arrow-small-down', 0xea9d),\n arrowSmallLeft: register('arrow-small-left', 0xea9e),\n arrowSmallRight: register('arrow-small-right', 0xea9f),\n arrowSmallUp: register('arrow-small-up', 0xeaa0),\n arrowUp: register('arrow-up', 0xeaa1),\n bell: register('bell', 0xeaa2),\n bold: register('bold', 0xeaa3),\n book: register('book', 0xeaa4),\n bookmark: register('bookmark', 0xeaa5),\n debugBreakpointConditionalUnverified: register('debug-breakpoint-conditional-unverified', 0xeaa6),\n debugBreakpointConditional: register('debug-breakpoint-conditional', 0xeaa7),\n debugBreakpointConditionalDisabled: register('debug-breakpoint-conditional-disabled', 0xeaa7),\n debugBreakpointDataUnverified: register('debug-breakpoint-data-unverified', 0xeaa8),\n debugBreakpointData: register('debug-breakpoint-data', 0xeaa9),\n debugBreakpointDataDisabled: register('debug-breakpoint-data-disabled', 0xeaa9),\n debugBreakpointLogUnverified: register('debug-breakpoint-log-unverified', 0xeaaa),\n debugBreakpointLog: register('debug-breakpoint-log', 0xeaab),\n debugBreakpointLogDisabled: register('debug-breakpoint-log-disabled', 0xeaab),\n briefcase: register('briefcase', 0xeaac),\n broadcast: register('broadcast', 0xeaad),\n browser: register('browser', 0xeaae),\n bug: register('bug', 0xeaaf),\n calendar: register('calendar', 0xeab0),\n caseSensitive: register('case-sensitive', 0xeab1),\n check: register('check', 0xeab2),\n checklist: register('checklist', 0xeab3),\n chevronDown: register('chevron-down', 0xeab4),\n dropDownButton: register('drop-down-button', 0xeab4),\n chevronLeft: register('chevron-left', 0xeab5),\n chevronRight: register('chevron-right', 0xeab6),\n chevronUp: register('chevron-up', 0xeab7),\n chromeClose: register('chrome-close', 0xeab8),\n chromeMaximize: register('chrome-maximize', 0xeab9),\n chromeMinimize: register('chrome-minimize', 0xeaba),\n chromeRestore: register('chrome-restore', 0xeabb),\n circle: register('circle', 0xeabc),\n circleOutline: register('circle-outline', 0xeabc),\n debugBreakpointUnverified: register('debug-breakpoint-unverified', 0xeabc),\n circleSlash: register('circle-slash', 0xeabd),\n circuitBoard: register('circuit-board', 0xeabe),\n clearAll: register('clear-all', 0xeabf),\n clippy: register('clippy', 0xeac0),\n closeAll: register('close-all', 0xeac1),\n cloudDownload: register('cloud-download', 0xeac2),\n cloudUpload: register('cloud-upload', 0xeac3),\n code: register('code', 0xeac4),\n collapseAll: register('collapse-all', 0xeac5),\n colorMode: register('color-mode', 0xeac6),\n commentDiscussion: register('comment-discussion', 0xeac7),\n compareChanges: register('compare-changes', 0xeafd),\n creditCard: register('credit-card', 0xeac9),\n dash: register('dash', 0xeacc),\n dashboard: register('dashboard', 0xeacd),\n database: register('database', 0xeace),\n debugContinue: register('debug-continue', 0xeacf),\n debugDisconnect: register('debug-disconnect', 0xead0),\n debugPause: register('debug-pause', 0xead1),\n debugRestart: register('debug-restart', 0xead2),\n debugStart: register('debug-start', 0xead3),\n debugStepInto: register('debug-step-into', 0xead4),\n debugStepOut: register('debug-step-out', 0xead5),\n debugStepOver: register('debug-step-over', 0xead6),\n debugStop: register('debug-stop', 0xead7),\n debug: register('debug', 0xead8),\n deviceCameraVideo: register('device-camera-video', 0xead9),\n deviceCamera: register('device-camera', 0xeada),\n deviceMobile: register('device-mobile', 0xeadb),\n diffAdded: register('diff-added', 0xeadc),\n diffIgnored: register('diff-ignored', 0xeadd),\n diffModified: register('diff-modified', 0xeade),\n diffRemoved: register('diff-removed', 0xeadf),\n diffRenamed: register('diff-renamed', 0xeae0),\n diff: register('diff', 0xeae1),\n discard: register('discard', 0xeae2),\n editorLayout: register('editor-layout', 0xeae3),\n emptyWindow: register('empty-window', 0xeae4),\n exclude: register('exclude', 0xeae5),\n extensions: register('extensions', 0xeae6),\n eyeClosed: register('eye-closed', 0xeae7),\n fileBinary: register('file-binary', 0xeae8),\n fileCode: register('file-code', 0xeae9),\n fileMedia: register('file-media', 0xeaea),\n filePdf: register('file-pdf', 0xeaeb),\n fileSubmodule: register('file-submodule', 0xeaec),\n fileSymlinkDirectory: register('file-symlink-directory', 0xeaed),\n fileSymlinkFile: register('file-symlink-file', 0xeaee),\n fileZip: register('file-zip', 0xeaef),\n files: register('files', 0xeaf0),\n filter: register('filter', 0xeaf1),\n flame: register('flame', 0xeaf2),\n foldDown: register('fold-down', 0xeaf3),\n foldUp: register('fold-up', 0xeaf4),\n fold: register('fold', 0xeaf5),\n folderActive: register('folder-active', 0xeaf6),\n folderOpened: register('folder-opened', 0xeaf7),\n gear: register('gear', 0xeaf8),\n gift: register('gift', 0xeaf9),\n gistSecret: register('gist-secret', 0xeafa),\n gist: register('gist', 0xeafb),\n gitCommit: register('git-commit', 0xeafc),\n gitCompare: register('git-compare', 0xeafd),\n gitMerge: register('git-merge', 0xeafe),\n githubAction: register('github-action', 0xeaff),\n githubAlt: register('github-alt', 0xeb00),\n globe: register('globe', 0xeb01),\n grabber: register('grabber', 0xeb02),\n graph: register('graph', 0xeb03),\n gripper: register('gripper', 0xeb04),\n heart: register('heart', 0xeb05),\n home: register('home', 0xeb06),\n horizontalRule: register('horizontal-rule', 0xeb07),\n hubot: register('hubot', 0xeb08),\n inbox: register('inbox', 0xeb09),\n issueClosed: register('issue-closed', 0xeba4),\n issueReopened: register('issue-reopened', 0xeb0b),\n issues: register('issues', 0xeb0c),\n italic: register('italic', 0xeb0d),\n jersey: register('jersey', 0xeb0e),\n json: register('json', 0xeb0f),\n bracket: register('bracket', 0xeb0f),\n kebabVertical: register('kebab-vertical', 0xeb10),\n key: register('key', 0xeb11),\n law: register('law', 0xeb12),\n lightbulbAutofix: register('lightbulb-autofix', 0xeb13),\n linkExternal: register('link-external', 0xeb14),\n link: register('link', 0xeb15),\n listOrdered: register('list-ordered', 0xeb16),\n listUnordered: register('list-unordered', 0xeb17),\n liveShare: register('live-share', 0xeb18),\n loading: register('loading', 0xeb19),\n location: register('location', 0xeb1a),\n mailRead: register('mail-read', 0xeb1b),\n mail: register('mail', 0xeb1c),\n markdown: register('markdown', 0xeb1d),\n megaphone: register('megaphone', 0xeb1e),\n mention: register('mention', 0xeb1f),\n milestone: register('milestone', 0xeb20),\n mortarBoard: register('mortar-board', 0xeb21),\n move: register('move', 0xeb22),\n multipleWindows: register('multiple-windows', 0xeb23),\n mute: register('mute', 0xeb24),\n noNewline: register('no-newline', 0xeb25),\n note: register('note', 0xeb26),\n octoface: register('octoface', 0xeb27),\n openPreview: register('open-preview', 0xeb28),\n package_: register('package', 0xeb29),\n paintcan: register('paintcan', 0xeb2a),\n pin: register('pin', 0xeb2b),\n play: register('play', 0xeb2c),\n run: register('run', 0xeb2c),\n plug: register('plug', 0xeb2d),\n preserveCase: register('preserve-case', 0xeb2e),\n preview: register('preview', 0xeb2f),\n project: register('project', 0xeb30),\n pulse: register('pulse', 0xeb31),\n question: register('question', 0xeb32),\n quote: register('quote', 0xeb33),\n radioTower: register('radio-tower', 0xeb34),\n reactions: register('reactions', 0xeb35),\n references: register('references', 0xeb36),\n refresh: register('refresh', 0xeb37),\n regex: register('regex', 0xeb38),\n remoteExplorer: register('remote-explorer', 0xeb39),\n remote: register('remote', 0xeb3a),\n remove: register('remove', 0xeb3b),\n replaceAll: register('replace-all', 0xeb3c),\n replace: register('replace', 0xeb3d),\n repoClone: register('repo-clone', 0xeb3e),\n repoForcePush: register('repo-force-push', 0xeb3f),\n repoPull: register('repo-pull', 0xeb40),\n repoPush: register('repo-push', 0xeb41),\n report: register('report', 0xeb42),\n requestChanges: register('request-changes', 0xeb43),\n rocket: register('rocket', 0xeb44),\n rootFolderOpened: register('root-folder-opened', 0xeb45),\n rootFolder: register('root-folder', 0xeb46),\n rss: register('rss', 0xeb47),\n ruby: register('ruby', 0xeb48),\n saveAll: register('save-all', 0xeb49),\n saveAs: register('save-as', 0xeb4a),\n save: register('save', 0xeb4b),\n screenFull: register('screen-full', 0xeb4c),\n screenNormal: register('screen-normal', 0xeb4d),\n searchStop: register('search-stop', 0xeb4e),\n server: register('server', 0xeb50),\n settingsGear: register('settings-gear', 0xeb51),\n settings: register('settings', 0xeb52),\n shield: register('shield', 0xeb53),\n smiley: register('smiley', 0xeb54),\n sortPrecedence: register('sort-precedence', 0xeb55),\n splitHorizontal: register('split-horizontal', 0xeb56),\n splitVertical: register('split-vertical', 0xeb57),\n squirrel: register('squirrel', 0xeb58),\n starFull: register('star-full', 0xeb59),\n starHalf: register('star-half', 0xeb5a),\n symbolClass: register('symbol-class', 0xeb5b),\n symbolColor: register('symbol-color', 0xeb5c),\n symbolCustomColor: register('symbol-customcolor', 0xeb5c),\n symbolConstant: register('symbol-constant', 0xeb5d),\n symbolEnumMember: register('symbol-enum-member', 0xeb5e),\n symbolField: register('symbol-field', 0xeb5f),\n symbolFile: register('symbol-file', 0xeb60),\n symbolInterface: register('symbol-interface', 0xeb61),\n symbolKeyword: register('symbol-keyword', 0xeb62),\n symbolMisc: register('symbol-misc', 0xeb63),\n symbolOperator: register('symbol-operator', 0xeb64),\n symbolProperty: register('symbol-property', 0xeb65),\n wrench: register('wrench', 0xeb65),\n wrenchSubaction: register('wrench-subaction', 0xeb65),\n symbolSnippet: register('symbol-snippet', 0xeb66),\n tasklist: register('tasklist', 0xeb67),\n telescope: register('telescope', 0xeb68),\n textSize: register('text-size', 0xeb69),\n threeBars: register('three-bars', 0xeb6a),\n thumbsdown: register('thumbsdown', 0xeb6b),\n thumbsup: register('thumbsup', 0xeb6c),\n tools: register('tools', 0xeb6d),\n triangleDown: register('triangle-down', 0xeb6e),\n triangleLeft: register('triangle-left', 0xeb6f),\n triangleRight: register('triangle-right', 0xeb70),\n triangleUp: register('triangle-up', 0xeb71),\n twitter: register('twitter', 0xeb72),\n unfold: register('unfold', 0xeb73),\n unlock: register('unlock', 0xeb74),\n unmute: register('unmute', 0xeb75),\n unverified: register('unverified', 0xeb76),\n verified: register('verified', 0xeb77),\n versions: register('versions', 0xeb78),\n vmActive: register('vm-active', 0xeb79),\n vmOutline: register('vm-outline', 0xeb7a),\n vmRunning: register('vm-running', 0xeb7b),\n watch: register('watch', 0xeb7c),\n whitespace: register('whitespace', 0xeb7d),\n wholeWord: register('whole-word', 0xeb7e),\n window: register('window', 0xeb7f),\n wordWrap: register('word-wrap', 0xeb80),\n zoomIn: register('zoom-in', 0xeb81),\n zoomOut: register('zoom-out', 0xeb82),\n listFilter: register('list-filter', 0xeb83),\n listFlat: register('list-flat', 0xeb84),\n listSelection: register('list-selection', 0xeb85),\n selection: register('selection', 0xeb85),\n listTree: register('list-tree', 0xeb86),\n debugBreakpointFunctionUnverified: register('debug-breakpoint-function-unverified', 0xeb87),\n debugBreakpointFunction: register('debug-breakpoint-function', 0xeb88),\n debugBreakpointFunctionDisabled: register('debug-breakpoint-function-disabled', 0xeb88),\n debugStackframeActive: register('debug-stackframe-active', 0xeb89),\n circleSmallFilled: register('circle-small-filled', 0xeb8a),\n debugStackframeDot: register('debug-stackframe-dot', 0xeb8a),\n debugStackframe: register('debug-stackframe', 0xeb8b),\n debugStackframeFocused: register('debug-stackframe-focused', 0xeb8b),\n debugBreakpointUnsupported: register('debug-breakpoint-unsupported', 0xeb8c),\n symbolString: register('symbol-string', 0xeb8d),\n debugReverseContinue: register('debug-reverse-continue', 0xeb8e),\n debugStepBack: register('debug-step-back', 0xeb8f),\n debugRestartFrame: register('debug-restart-frame', 0xeb90),\n callIncoming: register('call-incoming', 0xeb92),\n callOutgoing: register('call-outgoing', 0xeb93),\n menu: register('menu', 0xeb94),\n expandAll: register('expand-all', 0xeb95),\n feedback: register('feedback', 0xeb96),\n groupByRefType: register('group-by-ref-type', 0xeb97),\n ungroupByRefType: register('ungroup-by-ref-type', 0xeb98),\n account: register('account', 0xeb99),\n bellDot: register('bell-dot', 0xeb9a),\n debugConsole: register('debug-console', 0xeb9b),\n library: register('library', 0xeb9c),\n output: register('output', 0xeb9d),\n runAll: register('run-all', 0xeb9e),\n syncIgnored: register('sync-ignored', 0xeb9f),\n pinned: register('pinned', 0xeba0),\n githubInverted: register('github-inverted', 0xeba1),\n debugAlt: register('debug-alt', 0xeb91),\n serverProcess: register('server-process', 0xeba2),\n serverEnvironment: register('server-environment', 0xeba3),\n pass: register('pass', 0xeba4),\n stopCircle: register('stop-circle', 0xeba5),\n playCircle: register('play-circle', 0xeba6),\n record: register('record', 0xeba7),\n debugAltSmall: register('debug-alt-small', 0xeba8),\n vmConnect: register('vm-connect', 0xeba9),\n cloud: register('cloud', 0xebaa),\n merge: register('merge', 0xebab),\n exportIcon: register('export', 0xebac),\n graphLeft: register('graph-left', 0xebad),\n magnet: register('magnet', 0xebae),\n notebook: register('notebook', 0xebaf),\n redo: register('redo', 0xebb0),\n checkAll: register('check-all', 0xebb1),\n pinnedDirty: register('pinned-dirty', 0xebb2),\n passFilled: register('pass-filled', 0xebb3),\n circleLargeFilled: register('circle-large-filled', 0xebb4),\n circleLarge: register('circle-large', 0xebb5),\n circleLargeOutline: register('circle-large-outline', 0xebb5),\n combine: register('combine', 0xebb6),\n gather: register('gather', 0xebb6),\n table: register('table', 0xebb7),\n variableGroup: register('variable-group', 0xebb8),\n typeHierarchy: register('type-hierarchy', 0xebb9),\n typeHierarchySub: register('type-hierarchy-sub', 0xebba),\n typeHierarchySuper: register('type-hierarchy-super', 0xebbb),\n gitPullRequestCreate: register('git-pull-request-create', 0xebbc),\n runAbove: register('run-above', 0xebbd),\n runBelow: register('run-below', 0xebbe),\n notebookTemplate: register('notebook-template', 0xebbf),\n debugRerun: register('debug-rerun', 0xebc0),\n workspaceTrusted: register('workspace-trusted', 0xebc1),\n workspaceUntrusted: register('workspace-untrusted', 0xebc2),\n workspaceUnspecified: register('workspace-unspecified', 0xebc3),\n terminalCmd: register('terminal-cmd', 0xebc4),\n terminalDebian: register('terminal-debian', 0xebc5),\n terminalLinux: register('terminal-linux', 0xebc6),\n terminalPowershell: register('terminal-powershell', 0xebc7),\n terminalTmux: register('terminal-tmux', 0xebc8),\n terminalUbuntu: register('terminal-ubuntu', 0xebc9),\n terminalBash: register('terminal-bash', 0xebca),\n arrowSwap: register('arrow-swap', 0xebcb),\n copy: register('copy', 0xebcc),\n personAdd: register('person-add', 0xebcd),\n filterFilled: register('filter-filled', 0xebce),\n wand: register('wand', 0xebcf),\n debugLineByLine: register('debug-line-by-line', 0xebd0),\n inspect: register('inspect', 0xebd1),\n layers: register('layers', 0xebd2),\n layersDot: register('layers-dot', 0xebd3),\n layersActive: register('layers-active', 0xebd4),\n compass: register('compass', 0xebd5),\n compassDot: register('compass-dot', 0xebd6),\n compassActive: register('compass-active', 0xebd7),\n azure: register('azure', 0xebd8),\n issueDraft: register('issue-draft', 0xebd9),\n gitPullRequestClosed: register('git-pull-request-closed', 0xebda),\n gitPullRequestDraft: register('git-pull-request-draft', 0xebdb),\n debugAll: register('debug-all', 0xebdc),\n debugCoverage: register('debug-coverage', 0xebdd),\n runErrors: register('run-errors', 0xebde),\n folderLibrary: register('folder-library', 0xebdf),\n debugContinueSmall: register('debug-continue-small', 0xebe0),\n beakerStop: register('beaker-stop', 0xebe1),\n graphLine: register('graph-line', 0xebe2),\n graphScatter: register('graph-scatter', 0xebe3),\n pieChart: register('pie-chart', 0xebe4),\n bracketDot: register('bracket-dot', 0xebe5),\n bracketError: register('bracket-error', 0xebe6),\n lockSmall: register('lock-small', 0xebe7),\n azureDevops: register('azure-devops', 0xebe8),\n verifiedFilled: register('verified-filled', 0xebe9),\n newLine: register('newline', 0xebea),\n layout: register('layout', 0xebeb),\n layoutActivitybarLeft: register('layout-activitybar-left', 0xebec),\n layoutActivitybarRight: register('layout-activitybar-right', 0xebed),\n layoutPanelLeft: register('layout-panel-left', 0xebee),\n layoutPanelCenter: register('layout-panel-center', 0xebef),\n layoutPanelJustify: register('layout-panel-justify', 0xebf0),\n layoutPanelRight: register('layout-panel-right', 0xebf1),\n layoutPanel: register('layout-panel', 0xebf2),\n layoutSidebarLeft: register('layout-sidebar-left', 0xebf3),\n layoutSidebarRight: register('layout-sidebar-right', 0xebf4),\n layoutStatusbar: register('layout-statusbar', 0xebf5),\n layoutMenubar: register('layout-menubar', 0xebf6),\n layoutCentered: register('layout-centered', 0xebf7),\n layoutSidebarRightOff: register('layout-sidebar-right-off', 0xec00),\n layoutPanelOff: register('layout-panel-off', 0xec01),\n layoutSidebarLeftOff: register('layout-sidebar-left-off', 0xec02),\n target: register('target', 0xebf8),\n indent: register('indent', 0xebf9),\n recordSmall: register('record-small', 0xebfa),\n errorSmall: register('error-small', 0xebfb),\n arrowCircleDown: register('arrow-circle-down', 0xebfc),\n arrowCircleLeft: register('arrow-circle-left', 0xebfd),\n arrowCircleRight: register('arrow-circle-right', 0xebfe),\n arrowCircleUp: register('arrow-circle-up', 0xebff),\n heartFilled: register('heart-filled', 0xec04),\n map: register('map', 0xec05),\n mapFilled: register('map-filled', 0xec06),\n circleSmall: register('circle-small', 0xec07),\n bellSlash: register('bell-slash', 0xec08),\n bellSlashDot: register('bell-slash-dot', 0xec09),\n commentUnresolved: register('comment-unresolved', 0xec0a),\n gitPullRequestGoToChanges: register('git-pull-request-go-to-changes', 0xec0b),\n gitPullRequestNewChanges: register('git-pull-request-new-changes', 0xec0c),\n searchFuzzy: register('search-fuzzy', 0xec0d),\n commentDraft: register('comment-draft', 0xec0e),\n send: register('send', 0xec0f),\n sparkle: register('sparkle', 0xec10),\n insert: register('insert', 0xec11),\n // derived icons, that could become separate icons\n dialogError: register('dialog-error', 'error'),\n dialogWarning: register('dialog-warning', 'warning'),\n dialogInfo: register('dialog-info', 'info'),\n dialogClose: register('dialog-close', 'close'),\n treeItemExpanded: register('tree-item-expanded', 'chevron-down'),\n treeFilterOnTypeOn: register('tree-filter-on-type-on', 'list-filter'),\n treeFilterOnTypeOff: register('tree-filter-on-type-off', 'list-selection'),\n treeFilterClear: register('tree-filter-clear', 'close'),\n treeItemLoading: register('tree-item-loading', 'loading'),\n menuSelection: register('menu-selection', 'check'),\n menuSubmenu: register('menu-submenu', 'chevron-right'),\n menuBarMore: register('menubar-more', 'more'),\n scrollbarButtonLeft: register('scrollbar-button-left', 'triangle-left'),\n scrollbarButtonRight: register('scrollbar-button-right', 'triangle-right'),\n scrollbarButtonUp: register('scrollbar-button-up', 'triangle-up'),\n scrollbarButtonDown: register('scrollbar-button-down', 'triangle-down'),\n toolBarMore: register('toolbar-more', 'more'),\n quickInputBack: register('quick-input-back', 'arrow-left')\n};\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/tokenizationRegistry.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar tokenizationRegistry_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\nclass TokenizationRegistry {\n constructor() {\n this._tokenizationSupports = new Map();\n this._factories = new Map();\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._colorMap = null;\n }\n handleChange(languageIds) {\n this._onDidChange.fire({\n changedLanguages: languageIds,\n changedColorMap: false\n });\n }\n register(languageId, support) {\n this._tokenizationSupports.set(languageId, support);\n this.handleChange([languageId]);\n return lifecycle_toDisposable(() => {\n if (this._tokenizationSupports.get(languageId) !== support) {\n return;\n }\n this._tokenizationSupports.delete(languageId);\n this.handleChange([languageId]);\n });\n }\n get(languageId) {\n return this._tokenizationSupports.get(languageId) || null;\n }\n registerFactory(languageId, factory) {\n var _a;\n (_a = this._factories.get(languageId)) === null || _a === void 0 ? void 0 : _a.dispose();\n const myData = new TokenizationSupportFactoryData(this, languageId, factory);\n this._factories.set(languageId, myData);\n return lifecycle_toDisposable(() => {\n const v = this._factories.get(languageId);\n if (!v || v !== myData) {\n return;\n }\n this._factories.delete(languageId);\n v.dispose();\n });\n }\n getOrCreate(languageId) {\n return tokenizationRegistry_awaiter(this, void 0, void 0, function* () {\n // check first if the support is already set\n const tokenizationSupport = this.get(languageId);\n if (tokenizationSupport) {\n return tokenizationSupport;\n }\n const factory = this._factories.get(languageId);\n if (!factory || factory.isResolved) {\n // no factory or factory.resolve already finished\n return null;\n }\n yield factory.resolve();\n return this.get(languageId);\n });\n }\n isResolved(languageId) {\n const tokenizationSupport = this.get(languageId);\n if (tokenizationSupport) {\n return true;\n }\n const factory = this._factories.get(languageId);\n if (!factory || factory.isResolved) {\n return true;\n }\n return false;\n }\n setColorMap(colorMap) {\n this._colorMap = colorMap;\n this._onDidChange.fire({\n changedLanguages: Array.from(this._tokenizationSupports.keys()),\n changedColorMap: true\n });\n }\n getColorMap() {\n return this._colorMap;\n }\n getDefaultBackground() {\n if (this._colorMap && this._colorMap.length > 2 /* ColorId.DefaultBackground */) {\n return this._colorMap[2 /* ColorId.DefaultBackground */];\n }\n return null;\n }\n}\nclass TokenizationSupportFactoryData extends lifecycle_Disposable {\n get isResolved() {\n return this._isResolved;\n }\n constructor(_registry, _languageId, _factory) {\n super();\n this._registry = _registry;\n this._languageId = _languageId;\n this._factory = _factory;\n this._isDisposed = false;\n this._resolvePromise = null;\n this._isResolved = false;\n }\n dispose() {\n this._isDisposed = true;\n super.dispose();\n }\n resolve() {\n return tokenizationRegistry_awaiter(this, void 0, void 0, function* () {\n if (!this._resolvePromise) {\n this._resolvePromise = this._create();\n }\n return this._resolvePromise;\n });\n }\n _create() {\n return tokenizationRegistry_awaiter(this, void 0, void 0, function* () {\n const value = yield this._factory.tokenizationSupport;\n this._isResolved = true;\n if (value && !this._isDisposed) {\n this._register(this._registry.register(this._languageId, value));\n }\n });\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/languages.js\n\n\n\n\n\nclass Token {\n constructor(offset, type, language) {\n this.offset = offset;\n this.type = type;\n this.language = language;\n this._tokenBrand = undefined;\n }\n toString() {\n return '(' + this.offset + ', ' + this.type + ')';\n }\n}\n/**\n * @internal\n */\nclass TokenizationResult {\n constructor(tokens, endState) {\n this.tokens = tokens;\n this.endState = endState;\n this._tokenizationResultBrand = undefined;\n }\n}\n/**\n * @internal\n */\nclass EncodedTokenizationResult {\n constructor(\n /**\n * The tokens in binary format. Each token occupies two array indices. For token i:\n * - at offset 2*i => startIndex\n * - at offset 2*i + 1 => metadata\n *\n */\n tokens, endState) {\n this.tokens = tokens;\n this.endState = endState;\n this._encodedTokenizationResultBrand = undefined;\n }\n}\n/**\n * @internal\n */\nvar CompletionItemKinds;\n(function (CompletionItemKinds) {\n const byKind = new Map();\n byKind.set(0 /* CompletionItemKind.Method */, Codicon.symbolMethod);\n byKind.set(1 /* CompletionItemKind.Function */, Codicon.symbolFunction);\n byKind.set(2 /* CompletionItemKind.Constructor */, Codicon.symbolConstructor);\n byKind.set(3 /* CompletionItemKind.Field */, Codicon.symbolField);\n byKind.set(4 /* CompletionItemKind.Variable */, Codicon.symbolVariable);\n byKind.set(5 /* CompletionItemKind.Class */, Codicon.symbolClass);\n byKind.set(6 /* CompletionItemKind.Struct */, Codicon.symbolStruct);\n byKind.set(7 /* CompletionItemKind.Interface */, Codicon.symbolInterface);\n byKind.set(8 /* CompletionItemKind.Module */, Codicon.symbolModule);\n byKind.set(9 /* CompletionItemKind.Property */, Codicon.symbolProperty);\n byKind.set(10 /* CompletionItemKind.Event */, Codicon.symbolEvent);\n byKind.set(11 /* CompletionItemKind.Operator */, Codicon.symbolOperator);\n byKind.set(12 /* CompletionItemKind.Unit */, Codicon.symbolUnit);\n byKind.set(13 /* CompletionItemKind.Value */, Codicon.symbolValue);\n byKind.set(15 /* CompletionItemKind.Enum */, Codicon.symbolEnum);\n byKind.set(14 /* CompletionItemKind.Constant */, Codicon.symbolConstant);\n byKind.set(15 /* CompletionItemKind.Enum */, Codicon.symbolEnum);\n byKind.set(16 /* CompletionItemKind.EnumMember */, Codicon.symbolEnumMember);\n byKind.set(17 /* CompletionItemKind.Keyword */, Codicon.symbolKeyword);\n byKind.set(27 /* CompletionItemKind.Snippet */, Codicon.symbolSnippet);\n byKind.set(18 /* CompletionItemKind.Text */, Codicon.symbolText);\n byKind.set(19 /* CompletionItemKind.Color */, Codicon.symbolColor);\n byKind.set(20 /* CompletionItemKind.File */, Codicon.symbolFile);\n byKind.set(21 /* CompletionItemKind.Reference */, Codicon.symbolReference);\n byKind.set(22 /* CompletionItemKind.Customcolor */, Codicon.symbolCustomColor);\n byKind.set(23 /* CompletionItemKind.Folder */, Codicon.symbolFolder);\n byKind.set(24 /* CompletionItemKind.TypeParameter */, Codicon.symbolTypeParameter);\n byKind.set(25 /* CompletionItemKind.User */, Codicon.account);\n byKind.set(26 /* CompletionItemKind.Issue */, Codicon.issues);\n /**\n * @internal\n */\n function toIcon(kind) {\n let codicon = byKind.get(kind);\n if (!codicon) {\n console.info('No codicon found for CompletionItemKind ' + kind);\n codicon = Codicon.symbolProperty;\n }\n return codicon;\n }\n CompletionItemKinds.toIcon = toIcon;\n const data = new Map();\n data.set('method', 0 /* CompletionItemKind.Method */);\n data.set('function', 1 /* CompletionItemKind.Function */);\n data.set('constructor', 2 /* CompletionItemKind.Constructor */);\n data.set('field', 3 /* CompletionItemKind.Field */);\n data.set('variable', 4 /* CompletionItemKind.Variable */);\n data.set('class', 5 /* CompletionItemKind.Class */);\n data.set('struct', 6 /* CompletionItemKind.Struct */);\n data.set('interface', 7 /* CompletionItemKind.Interface */);\n data.set('module', 8 /* CompletionItemKind.Module */);\n data.set('property', 9 /* CompletionItemKind.Property */);\n data.set('event', 10 /* CompletionItemKind.Event */);\n data.set('operator', 11 /* CompletionItemKind.Operator */);\n data.set('unit', 12 /* CompletionItemKind.Unit */);\n data.set('value', 13 /* CompletionItemKind.Value */);\n data.set('constant', 14 /* CompletionItemKind.Constant */);\n data.set('enum', 15 /* CompletionItemKind.Enum */);\n data.set('enum-member', 16 /* CompletionItemKind.EnumMember */);\n data.set('enumMember', 16 /* CompletionItemKind.EnumMember */);\n data.set('keyword', 17 /* CompletionItemKind.Keyword */);\n data.set('snippet', 27 /* CompletionItemKind.Snippet */);\n data.set('text', 18 /* CompletionItemKind.Text */);\n data.set('color', 19 /* CompletionItemKind.Color */);\n data.set('file', 20 /* CompletionItemKind.File */);\n data.set('reference', 21 /* CompletionItemKind.Reference */);\n data.set('customcolor', 22 /* CompletionItemKind.Customcolor */);\n data.set('folder', 23 /* CompletionItemKind.Folder */);\n data.set('type-parameter', 24 /* CompletionItemKind.TypeParameter */);\n data.set('typeParameter', 24 /* CompletionItemKind.TypeParameter */);\n data.set('account', 25 /* CompletionItemKind.User */);\n data.set('issue', 26 /* CompletionItemKind.Issue */);\n /**\n * @internal\n */\n function fromString(value, strict) {\n let res = data.get(value);\n if (typeof res === 'undefined' && !strict) {\n res = 9 /* CompletionItemKind.Property */;\n }\n return res;\n }\n CompletionItemKinds.fromString = fromString;\n})(CompletionItemKinds || (CompletionItemKinds = {}));\n/**\n * How an {@link InlineCompletionsProvider inline completion provider} was triggered.\n */\nvar InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n /**\n * Completion was triggered automatically while editing.\n * It is sufficient to return a single completion item in this case.\n */\n InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Automatic\"] = 0] = \"Automatic\";\n /**\n * Completion was triggered explicitly by a user gesture.\n * Return multiple completion items to enable cycling through them.\n */\n InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Explicit\"] = 1] = \"Explicit\";\n})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));\nclass SelectedSuggestionInfo {\n constructor(range, text, completionKind, isSnippetText) {\n this.range = range;\n this.text = text;\n this.completionKind = completionKind;\n this.isSnippetText = isSnippetText;\n }\n equals(other) {\n return Range.lift(this.range).equalsRange(other.range)\n && this.text === other.text\n && this.completionKind === other.completionKind\n && this.isSnippetText === other.isSnippetText;\n }\n}\nvar SignatureHelpTriggerKind;\n(function (SignatureHelpTriggerKind) {\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"Invoke\"] = 1] = \"Invoke\";\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"TriggerCharacter\"] = 2] = \"TriggerCharacter\";\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"ContentChange\"] = 3] = \"ContentChange\";\n})(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {}));\n/**\n * A document highlight kind.\n */\nvar DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Text\"] = 0] = \"Text\";\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Read\"] = 1] = \"Read\";\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Write\"] = 2] = \"Write\";\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * @internal\n */\nfunction isLocationLink(thing) {\n return thing\n && URI.isUri(thing.uri)\n && Range.isIRange(thing.range)\n && (Range.isIRange(thing.originSelectionRange) || Range.isIRange(thing.targetSelectionRange));\n}\n/**\n * @internal\n */\nconst symbolKindNames = {\n [17 /* SymbolKind.Array */]: nls_localize('Array', \"array\"),\n [16 /* SymbolKind.Boolean */]: nls_localize('Boolean', \"boolean\"),\n [4 /* SymbolKind.Class */]: nls_localize('Class', \"class\"),\n [13 /* SymbolKind.Constant */]: nls_localize('Constant', \"constant\"),\n [8 /* SymbolKind.Constructor */]: nls_localize('Constructor', \"constructor\"),\n [9 /* SymbolKind.Enum */]: nls_localize('Enum', \"enumeration\"),\n [21 /* SymbolKind.EnumMember */]: nls_localize('EnumMember', \"enumeration member\"),\n [23 /* SymbolKind.Event */]: nls_localize('Event', \"event\"),\n [7 /* SymbolKind.Field */]: nls_localize('Field', \"field\"),\n [0 /* SymbolKind.File */]: nls_localize('File', \"file\"),\n [11 /* SymbolKind.Function */]: nls_localize('Function', \"function\"),\n [10 /* SymbolKind.Interface */]: nls_localize('Interface', \"interface\"),\n [19 /* SymbolKind.Key */]: nls_localize('Key', \"key\"),\n [5 /* SymbolKind.Method */]: nls_localize('Method', \"method\"),\n [1 /* SymbolKind.Module */]: nls_localize('Module', \"module\"),\n [2 /* SymbolKind.Namespace */]: nls_localize('Namespace', \"namespace\"),\n [20 /* SymbolKind.Null */]: nls_localize('Null', \"null\"),\n [15 /* SymbolKind.Number */]: nls_localize('Number', \"number\"),\n [18 /* SymbolKind.Object */]: nls_localize('Object', \"object\"),\n [24 /* SymbolKind.Operator */]: nls_localize('Operator', \"operator\"),\n [3 /* SymbolKind.Package */]: nls_localize('Package', \"package\"),\n [6 /* SymbolKind.Property */]: nls_localize('Property', \"property\"),\n [14 /* SymbolKind.String */]: nls_localize('String', \"string\"),\n [22 /* SymbolKind.Struct */]: nls_localize('Struct', \"struct\"),\n [25 /* SymbolKind.TypeParameter */]: nls_localize('TypeParameter', \"type parameter\"),\n [12 /* SymbolKind.Variable */]: nls_localize('Variable', \"variable\"),\n};\n/**\n * @internal\n */\nfunction getAriaLabelForSymbol(symbolName, kind) {\n return localize('symbolAriaLabel', '{0} ({1})', symbolName, symbolKindNames[kind]);\n}\n/**\n * @internal\n */\nvar SymbolKinds;\n(function (SymbolKinds) {\n const byKind = new Map();\n byKind.set(0 /* SymbolKind.File */, Codicon.symbolFile);\n byKind.set(1 /* SymbolKind.Module */, Codicon.symbolModule);\n byKind.set(2 /* SymbolKind.Namespace */, Codicon.symbolNamespace);\n byKind.set(3 /* SymbolKind.Package */, Codicon.symbolPackage);\n byKind.set(4 /* SymbolKind.Class */, Codicon.symbolClass);\n byKind.set(5 /* SymbolKind.Method */, Codicon.symbolMethod);\n byKind.set(6 /* SymbolKind.Property */, Codicon.symbolProperty);\n byKind.set(7 /* SymbolKind.Field */, Codicon.symbolField);\n byKind.set(8 /* SymbolKind.Constructor */, Codicon.symbolConstructor);\n byKind.set(9 /* SymbolKind.Enum */, Codicon.symbolEnum);\n byKind.set(10 /* SymbolKind.Interface */, Codicon.symbolInterface);\n byKind.set(11 /* SymbolKind.Function */, Codicon.symbolFunction);\n byKind.set(12 /* SymbolKind.Variable */, Codicon.symbolVariable);\n byKind.set(13 /* SymbolKind.Constant */, Codicon.symbolConstant);\n byKind.set(14 /* SymbolKind.String */, Codicon.symbolString);\n byKind.set(15 /* SymbolKind.Number */, Codicon.symbolNumber);\n byKind.set(16 /* SymbolKind.Boolean */, Codicon.symbolBoolean);\n byKind.set(17 /* SymbolKind.Array */, Codicon.symbolArray);\n byKind.set(18 /* SymbolKind.Object */, Codicon.symbolObject);\n byKind.set(19 /* SymbolKind.Key */, Codicon.symbolKey);\n byKind.set(20 /* SymbolKind.Null */, Codicon.symbolNull);\n byKind.set(21 /* SymbolKind.EnumMember */, Codicon.symbolEnumMember);\n byKind.set(22 /* SymbolKind.Struct */, Codicon.symbolStruct);\n byKind.set(23 /* SymbolKind.Event */, Codicon.symbolEvent);\n byKind.set(24 /* SymbolKind.Operator */, Codicon.symbolOperator);\n byKind.set(25 /* SymbolKind.TypeParameter */, Codicon.symbolTypeParameter);\n /**\n * @internal\n */\n function toIcon(kind) {\n let icon = byKind.get(kind);\n if (!icon) {\n console.info('No codicon found for SymbolKind ' + kind);\n icon = Codicon.symbolProperty;\n }\n return icon;\n }\n SymbolKinds.toIcon = toIcon;\n})(SymbolKinds || (SymbolKinds = {}));\n/** @internal */\nclass TextEdit {\n}\nclass FoldingRangeKind {\n /**\n * Returns a {@link FoldingRangeKind} for the given value.\n *\n * @param value of the kind.\n */\n static fromValue(value) {\n switch (value) {\n case 'comment': return FoldingRangeKind.Comment;\n case 'imports': return FoldingRangeKind.Imports;\n case 'region': return FoldingRangeKind.Region;\n }\n return new FoldingRangeKind(value);\n }\n /**\n * Creates a new {@link FoldingRangeKind}.\n *\n * @param value of the kind.\n */\n constructor(value) {\n this.value = value;\n }\n}\n/**\n * Kind for folding range representing a comment. The value of the kind is 'comment'.\n */\nFoldingRangeKind.Comment = new FoldingRangeKind('comment');\n/**\n * Kind for folding range representing a import. The value of the kind is 'imports'.\n */\nFoldingRangeKind.Imports = new FoldingRangeKind('imports');\n/**\n * Kind for folding range representing regions (for example marked by `#region`, `#endregion`).\n * The value of the kind is 'region'.\n */\nFoldingRangeKind.Region = new FoldingRangeKind('region');\n/**\n * @internal\n */\nvar Command;\n(function (Command) {\n /**\n * @internal\n */\n function is(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n return typeof obj.id === 'string' &&\n typeof obj.title === 'string';\n }\n Command.is = is;\n})(Command || (Command = {}));\nvar InlayHintKind;\n(function (InlayHintKind) {\n InlayHintKind[InlayHintKind[\"Type\"] = 1] = \"Type\";\n InlayHintKind[InlayHintKind[\"Parameter\"] = 2] = \"Parameter\";\n})(InlayHintKind || (InlayHintKind = {}));\n/**\n * @internal\n */\nclass LazyTokenizationSupport {\n constructor(createSupport) {\n this.createSupport = createSupport;\n this._tokenizationSupport = null;\n }\n dispose() {\n if (this._tokenizationSupport) {\n this._tokenizationSupport.then((support) => {\n if (support) {\n support.dispose();\n }\n });\n }\n }\n get tokenizationSupport() {\n if (!this._tokenizationSupport) {\n this._tokenizationSupport = this.createSupport();\n }\n return this._tokenizationSupport;\n }\n}\n/**\n * @internal\n */\nconst languages_TokenizationRegistry = new TokenizationRegistry();\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.\nvar AccessibilitySupport;\n(function (AccessibilitySupport) {\n /**\n * This should be the browser case where it is not known if a screen reader is attached or no.\n */\n AccessibilitySupport[AccessibilitySupport[\"Unknown\"] = 0] = \"Unknown\";\n AccessibilitySupport[AccessibilitySupport[\"Disabled\"] = 1] = \"Disabled\";\n AccessibilitySupport[AccessibilitySupport[\"Enabled\"] = 2] = \"Enabled\";\n})(AccessibilitySupport || (AccessibilitySupport = {}));\nvar CodeActionTriggerType;\n(function (CodeActionTriggerType) {\n CodeActionTriggerType[CodeActionTriggerType[\"Invoke\"] = 1] = \"Invoke\";\n CodeActionTriggerType[CodeActionTriggerType[\"Auto\"] = 2] = \"Auto\";\n})(CodeActionTriggerType || (CodeActionTriggerType = {}));\nvar CompletionItemInsertTextRule;\n(function (CompletionItemInsertTextRule) {\n CompletionItemInsertTextRule[CompletionItemInsertTextRule[\"None\"] = 0] = \"None\";\n /**\n * Adjust whitespace/indentation of multiline insert texts to\n * match the current line indentation.\n */\n CompletionItemInsertTextRule[CompletionItemInsertTextRule[\"KeepWhitespace\"] = 1] = \"KeepWhitespace\";\n /**\n * `insertText` is a snippet.\n */\n CompletionItemInsertTextRule[CompletionItemInsertTextRule[\"InsertAsSnippet\"] = 4] = \"InsertAsSnippet\";\n})(CompletionItemInsertTextRule || (CompletionItemInsertTextRule = {}));\nvar CompletionItemKind;\n(function (CompletionItemKind) {\n CompletionItemKind[CompletionItemKind[\"Method\"] = 0] = \"Method\";\n CompletionItemKind[CompletionItemKind[\"Function\"] = 1] = \"Function\";\n CompletionItemKind[CompletionItemKind[\"Constructor\"] = 2] = \"Constructor\";\n CompletionItemKind[CompletionItemKind[\"Field\"] = 3] = \"Field\";\n CompletionItemKind[CompletionItemKind[\"Variable\"] = 4] = \"Variable\";\n CompletionItemKind[CompletionItemKind[\"Class\"] = 5] = \"Class\";\n CompletionItemKind[CompletionItemKind[\"Struct\"] = 6] = \"Struct\";\n CompletionItemKind[CompletionItemKind[\"Interface\"] = 7] = \"Interface\";\n CompletionItemKind[CompletionItemKind[\"Module\"] = 8] = \"Module\";\n CompletionItemKind[CompletionItemKind[\"Property\"] = 9] = \"Property\";\n CompletionItemKind[CompletionItemKind[\"Event\"] = 10] = \"Event\";\n CompletionItemKind[CompletionItemKind[\"Operator\"] = 11] = \"Operator\";\n CompletionItemKind[CompletionItemKind[\"Unit\"] = 12] = \"Unit\";\n CompletionItemKind[CompletionItemKind[\"Value\"] = 13] = \"Value\";\n CompletionItemKind[CompletionItemKind[\"Constant\"] = 14] = \"Constant\";\n CompletionItemKind[CompletionItemKind[\"Enum\"] = 15] = \"Enum\";\n CompletionItemKind[CompletionItemKind[\"EnumMember\"] = 16] = \"EnumMember\";\n CompletionItemKind[CompletionItemKind[\"Keyword\"] = 17] = \"Keyword\";\n CompletionItemKind[CompletionItemKind[\"Text\"] = 18] = \"Text\";\n CompletionItemKind[CompletionItemKind[\"Color\"] = 19] = \"Color\";\n CompletionItemKind[CompletionItemKind[\"File\"] = 20] = \"File\";\n CompletionItemKind[CompletionItemKind[\"Reference\"] = 21] = \"Reference\";\n CompletionItemKind[CompletionItemKind[\"Customcolor\"] = 22] = \"Customcolor\";\n CompletionItemKind[CompletionItemKind[\"Folder\"] = 23] = \"Folder\";\n CompletionItemKind[CompletionItemKind[\"TypeParameter\"] = 24] = \"TypeParameter\";\n CompletionItemKind[CompletionItemKind[\"User\"] = 25] = \"User\";\n CompletionItemKind[CompletionItemKind[\"Issue\"] = 26] = \"Issue\";\n CompletionItemKind[CompletionItemKind[\"Snippet\"] = 27] = \"Snippet\";\n})(CompletionItemKind || (CompletionItemKind = {}));\nvar CompletionItemTag;\n(function (CompletionItemTag) {\n CompletionItemTag[CompletionItemTag[\"Deprecated\"] = 1] = \"Deprecated\";\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * How a suggest provider was triggered.\n */\nvar CompletionTriggerKind;\n(function (CompletionTriggerKind) {\n CompletionTriggerKind[CompletionTriggerKind[\"Invoke\"] = 0] = \"Invoke\";\n CompletionTriggerKind[CompletionTriggerKind[\"TriggerCharacter\"] = 1] = \"TriggerCharacter\";\n CompletionTriggerKind[CompletionTriggerKind[\"TriggerForIncompleteCompletions\"] = 2] = \"TriggerForIncompleteCompletions\";\n})(CompletionTriggerKind || (CompletionTriggerKind = {}));\n/**\n * A positioning preference for rendering content widgets.\n */\nvar ContentWidgetPositionPreference;\n(function (ContentWidgetPositionPreference) {\n /**\n * Place the content widget exactly at a position\n */\n ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"EXACT\"] = 0] = \"EXACT\";\n /**\n * Place the content widget above a position\n */\n ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"ABOVE\"] = 1] = \"ABOVE\";\n /**\n * Place the content widget below a position\n */\n ContentWidgetPositionPreference[ContentWidgetPositionPreference[\"BELOW\"] = 2] = \"BELOW\";\n})(ContentWidgetPositionPreference || (ContentWidgetPositionPreference = {}));\n/**\n * Describes the reason the cursor has changed its position.\n */\nvar CursorChangeReason;\n(function (CursorChangeReason) {\n /**\n * Unknown or not set.\n */\n CursorChangeReason[CursorChangeReason[\"NotSet\"] = 0] = \"NotSet\";\n /**\n * A `model.setValue()` was called.\n */\n CursorChangeReason[CursorChangeReason[\"ContentFlush\"] = 1] = \"ContentFlush\";\n /**\n * The `model` has been changed outside of this cursor and the cursor recovers its position from associated markers.\n */\n CursorChangeReason[CursorChangeReason[\"RecoverFromMarkers\"] = 2] = \"RecoverFromMarkers\";\n /**\n * There was an explicit user gesture.\n */\n CursorChangeReason[CursorChangeReason[\"Explicit\"] = 3] = \"Explicit\";\n /**\n * There was a Paste.\n */\n CursorChangeReason[CursorChangeReason[\"Paste\"] = 4] = \"Paste\";\n /**\n * There was an Undo.\n */\n CursorChangeReason[CursorChangeReason[\"Undo\"] = 5] = \"Undo\";\n /**\n * There was a Redo.\n */\n CursorChangeReason[CursorChangeReason[\"Redo\"] = 6] = \"Redo\";\n})(CursorChangeReason || (CursorChangeReason = {}));\n/**\n * The default end of line to use when instantiating models.\n */\nvar DefaultEndOfLine;\n(function (DefaultEndOfLine) {\n /**\n * Use line feed (\\n) as the end of line character.\n */\n DefaultEndOfLine[DefaultEndOfLine[\"LF\"] = 1] = \"LF\";\n /**\n * Use carriage return and line feed (\\r\\n) as the end of line character.\n */\n DefaultEndOfLine[DefaultEndOfLine[\"CRLF\"] = 2] = \"CRLF\";\n})(DefaultEndOfLine || (DefaultEndOfLine = {}));\n/**\n * A document highlight kind.\n */\nvar standaloneEnums_DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Text\"] = 0] = \"Text\";\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Read\"] = 1] = \"Read\";\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind[DocumentHighlightKind[\"Write\"] = 2] = \"Write\";\n})(standaloneEnums_DocumentHighlightKind || (standaloneEnums_DocumentHighlightKind = {}));\n/**\n * Configuration options for auto indentation in the editor\n */\nvar EditorAutoIndentStrategy;\n(function (EditorAutoIndentStrategy) {\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"None\"] = 0] = \"None\";\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Keep\"] = 1] = \"Keep\";\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Brackets\"] = 2] = \"Brackets\";\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Advanced\"] = 3] = \"Advanced\";\n EditorAutoIndentStrategy[EditorAutoIndentStrategy[\"Full\"] = 4] = \"Full\";\n})(EditorAutoIndentStrategy || (EditorAutoIndentStrategy = {}));\nvar EditorOption;\n(function (EditorOption) {\n EditorOption[EditorOption[\"acceptSuggestionOnCommitCharacter\"] = 0] = \"acceptSuggestionOnCommitCharacter\";\n EditorOption[EditorOption[\"acceptSuggestionOnEnter\"] = 1] = \"acceptSuggestionOnEnter\";\n EditorOption[EditorOption[\"accessibilitySupport\"] = 2] = \"accessibilitySupport\";\n EditorOption[EditorOption[\"accessibilityPageSize\"] = 3] = \"accessibilityPageSize\";\n EditorOption[EditorOption[\"ariaLabel\"] = 4] = \"ariaLabel\";\n EditorOption[EditorOption[\"ariaRequired\"] = 5] = \"ariaRequired\";\n EditorOption[EditorOption[\"autoClosingBrackets\"] = 6] = \"autoClosingBrackets\";\n EditorOption[EditorOption[\"screenReaderAnnounceInlineSuggestion\"] = 7] = \"screenReaderAnnounceInlineSuggestion\";\n EditorOption[EditorOption[\"autoClosingDelete\"] = 8] = \"autoClosingDelete\";\n EditorOption[EditorOption[\"autoClosingOvertype\"] = 9] = \"autoClosingOvertype\";\n EditorOption[EditorOption[\"autoClosingQuotes\"] = 10] = \"autoClosingQuotes\";\n EditorOption[EditorOption[\"autoIndent\"] = 11] = \"autoIndent\";\n EditorOption[EditorOption[\"automaticLayout\"] = 12] = \"automaticLayout\";\n EditorOption[EditorOption[\"autoSurround\"] = 13] = \"autoSurround\";\n EditorOption[EditorOption[\"bracketPairColorization\"] = 14] = \"bracketPairColorization\";\n EditorOption[EditorOption[\"guides\"] = 15] = \"guides\";\n EditorOption[EditorOption[\"codeLens\"] = 16] = \"codeLens\";\n EditorOption[EditorOption[\"codeLensFontFamily\"] = 17] = \"codeLensFontFamily\";\n EditorOption[EditorOption[\"codeLensFontSize\"] = 18] = \"codeLensFontSize\";\n EditorOption[EditorOption[\"colorDecorators\"] = 19] = \"colorDecorators\";\n EditorOption[EditorOption[\"colorDecoratorsLimit\"] = 20] = \"colorDecoratorsLimit\";\n EditorOption[EditorOption[\"columnSelection\"] = 21] = \"columnSelection\";\n EditorOption[EditorOption[\"comments\"] = 22] = \"comments\";\n EditorOption[EditorOption[\"contextmenu\"] = 23] = \"contextmenu\";\n EditorOption[EditorOption[\"copyWithSyntaxHighlighting\"] = 24] = \"copyWithSyntaxHighlighting\";\n EditorOption[EditorOption[\"cursorBlinking\"] = 25] = \"cursorBlinking\";\n EditorOption[EditorOption[\"cursorSmoothCaretAnimation\"] = 26] = \"cursorSmoothCaretAnimation\";\n EditorOption[EditorOption[\"cursorStyle\"] = 27] = \"cursorStyle\";\n EditorOption[EditorOption[\"cursorSurroundingLines\"] = 28] = \"cursorSurroundingLines\";\n EditorOption[EditorOption[\"cursorSurroundingLinesStyle\"] = 29] = \"cursorSurroundingLinesStyle\";\n EditorOption[EditorOption[\"cursorWidth\"] = 30] = \"cursorWidth\";\n EditorOption[EditorOption[\"disableLayerHinting\"] = 31] = \"disableLayerHinting\";\n EditorOption[EditorOption[\"disableMonospaceOptimizations\"] = 32] = \"disableMonospaceOptimizations\";\n EditorOption[EditorOption[\"domReadOnly\"] = 33] = \"domReadOnly\";\n EditorOption[EditorOption[\"dragAndDrop\"] = 34] = \"dragAndDrop\";\n EditorOption[EditorOption[\"dropIntoEditor\"] = 35] = \"dropIntoEditor\";\n EditorOption[EditorOption[\"emptySelectionClipboard\"] = 36] = \"emptySelectionClipboard\";\n EditorOption[EditorOption[\"experimentalWhitespaceRendering\"] = 37] = \"experimentalWhitespaceRendering\";\n EditorOption[EditorOption[\"extraEditorClassName\"] = 38] = \"extraEditorClassName\";\n EditorOption[EditorOption[\"fastScrollSensitivity\"] = 39] = \"fastScrollSensitivity\";\n EditorOption[EditorOption[\"find\"] = 40] = \"find\";\n EditorOption[EditorOption[\"fixedOverflowWidgets\"] = 41] = \"fixedOverflowWidgets\";\n EditorOption[EditorOption[\"folding\"] = 42] = \"folding\";\n EditorOption[EditorOption[\"foldingStrategy\"] = 43] = \"foldingStrategy\";\n EditorOption[EditorOption[\"foldingHighlight\"] = 44] = \"foldingHighlight\";\n EditorOption[EditorOption[\"foldingImportsByDefault\"] = 45] = \"foldingImportsByDefault\";\n EditorOption[EditorOption[\"foldingMaximumRegions\"] = 46] = \"foldingMaximumRegions\";\n EditorOption[EditorOption[\"unfoldOnClickAfterEndOfLine\"] = 47] = \"unfoldOnClickAfterEndOfLine\";\n EditorOption[EditorOption[\"fontFamily\"] = 48] = \"fontFamily\";\n EditorOption[EditorOption[\"fontInfo\"] = 49] = \"fontInfo\";\n EditorOption[EditorOption[\"fontLigatures\"] = 50] = \"fontLigatures\";\n EditorOption[EditorOption[\"fontSize\"] = 51] = \"fontSize\";\n EditorOption[EditorOption[\"fontWeight\"] = 52] = \"fontWeight\";\n EditorOption[EditorOption[\"fontVariations\"] = 53] = \"fontVariations\";\n EditorOption[EditorOption[\"formatOnPaste\"] = 54] = \"formatOnPaste\";\n EditorOption[EditorOption[\"formatOnType\"] = 55] = \"formatOnType\";\n EditorOption[EditorOption[\"glyphMargin\"] = 56] = \"glyphMargin\";\n EditorOption[EditorOption[\"gotoLocation\"] = 57] = \"gotoLocation\";\n EditorOption[EditorOption[\"hideCursorInOverviewRuler\"] = 58] = \"hideCursorInOverviewRuler\";\n EditorOption[EditorOption[\"hover\"] = 59] = \"hover\";\n EditorOption[EditorOption[\"inDiffEditor\"] = 60] = \"inDiffEditor\";\n EditorOption[EditorOption[\"inlineSuggest\"] = 61] = \"inlineSuggest\";\n EditorOption[EditorOption[\"letterSpacing\"] = 62] = \"letterSpacing\";\n EditorOption[EditorOption[\"lightbulb\"] = 63] = \"lightbulb\";\n EditorOption[EditorOption[\"lineDecorationsWidth\"] = 64] = \"lineDecorationsWidth\";\n EditorOption[EditorOption[\"lineHeight\"] = 65] = \"lineHeight\";\n EditorOption[EditorOption[\"lineNumbers\"] = 66] = \"lineNumbers\";\n EditorOption[EditorOption[\"lineNumbersMinChars\"] = 67] = \"lineNumbersMinChars\";\n EditorOption[EditorOption[\"linkedEditing\"] = 68] = \"linkedEditing\";\n EditorOption[EditorOption[\"links\"] = 69] = \"links\";\n EditorOption[EditorOption[\"matchBrackets\"] = 70] = \"matchBrackets\";\n EditorOption[EditorOption[\"minimap\"] = 71] = \"minimap\";\n EditorOption[EditorOption[\"mouseStyle\"] = 72] = \"mouseStyle\";\n EditorOption[EditorOption[\"mouseWheelScrollSensitivity\"] = 73] = \"mouseWheelScrollSensitivity\";\n EditorOption[EditorOption[\"mouseWheelZoom\"] = 74] = \"mouseWheelZoom\";\n EditorOption[EditorOption[\"multiCursorMergeOverlapping\"] = 75] = \"multiCursorMergeOverlapping\";\n EditorOption[EditorOption[\"multiCursorModifier\"] = 76] = \"multiCursorModifier\";\n EditorOption[EditorOption[\"multiCursorPaste\"] = 77] = \"multiCursorPaste\";\n EditorOption[EditorOption[\"multiCursorLimit\"] = 78] = \"multiCursorLimit\";\n EditorOption[EditorOption[\"occurrencesHighlight\"] = 79] = \"occurrencesHighlight\";\n EditorOption[EditorOption[\"overviewRulerBorder\"] = 80] = \"overviewRulerBorder\";\n EditorOption[EditorOption[\"overviewRulerLanes\"] = 81] = \"overviewRulerLanes\";\n EditorOption[EditorOption[\"padding\"] = 82] = \"padding\";\n EditorOption[EditorOption[\"pasteAs\"] = 83] = \"pasteAs\";\n EditorOption[EditorOption[\"parameterHints\"] = 84] = \"parameterHints\";\n EditorOption[EditorOption[\"peekWidgetDefaultFocus\"] = 85] = \"peekWidgetDefaultFocus\";\n EditorOption[EditorOption[\"definitionLinkOpensInPeek\"] = 86] = \"definitionLinkOpensInPeek\";\n EditorOption[EditorOption[\"quickSuggestions\"] = 87] = \"quickSuggestions\";\n EditorOption[EditorOption[\"quickSuggestionsDelay\"] = 88] = \"quickSuggestionsDelay\";\n EditorOption[EditorOption[\"readOnly\"] = 89] = \"readOnly\";\n EditorOption[EditorOption[\"readOnlyMessage\"] = 90] = \"readOnlyMessage\";\n EditorOption[EditorOption[\"renameOnType\"] = 91] = \"renameOnType\";\n EditorOption[EditorOption[\"renderControlCharacters\"] = 92] = \"renderControlCharacters\";\n EditorOption[EditorOption[\"renderFinalNewline\"] = 93] = \"renderFinalNewline\";\n EditorOption[EditorOption[\"renderLineHighlight\"] = 94] = \"renderLineHighlight\";\n EditorOption[EditorOption[\"renderLineHighlightOnlyWhenFocus\"] = 95] = \"renderLineHighlightOnlyWhenFocus\";\n EditorOption[EditorOption[\"renderValidationDecorations\"] = 96] = \"renderValidationDecorations\";\n EditorOption[EditorOption[\"renderWhitespace\"] = 97] = \"renderWhitespace\";\n EditorOption[EditorOption[\"revealHorizontalRightPadding\"] = 98] = \"revealHorizontalRightPadding\";\n EditorOption[EditorOption[\"roundedSelection\"] = 99] = \"roundedSelection\";\n EditorOption[EditorOption[\"rulers\"] = 100] = \"rulers\";\n EditorOption[EditorOption[\"scrollbar\"] = 101] = \"scrollbar\";\n EditorOption[EditorOption[\"scrollBeyondLastColumn\"] = 102] = \"scrollBeyondLastColumn\";\n EditorOption[EditorOption[\"scrollBeyondLastLine\"] = 103] = \"scrollBeyondLastLine\";\n EditorOption[EditorOption[\"scrollPredominantAxis\"] = 104] = \"scrollPredominantAxis\";\n EditorOption[EditorOption[\"selectionClipboard\"] = 105] = \"selectionClipboard\";\n EditorOption[EditorOption[\"selectionHighlight\"] = 106] = \"selectionHighlight\";\n EditorOption[EditorOption[\"selectOnLineNumbers\"] = 107] = \"selectOnLineNumbers\";\n EditorOption[EditorOption[\"showFoldingControls\"] = 108] = \"showFoldingControls\";\n EditorOption[EditorOption[\"showUnused\"] = 109] = \"showUnused\";\n EditorOption[EditorOption[\"snippetSuggestions\"] = 110] = \"snippetSuggestions\";\n EditorOption[EditorOption[\"smartSelect\"] = 111] = \"smartSelect\";\n EditorOption[EditorOption[\"smoothScrolling\"] = 112] = \"smoothScrolling\";\n EditorOption[EditorOption[\"stickyScroll\"] = 113] = \"stickyScroll\";\n EditorOption[EditorOption[\"stickyTabStops\"] = 114] = \"stickyTabStops\";\n EditorOption[EditorOption[\"stopRenderingLineAfter\"] = 115] = \"stopRenderingLineAfter\";\n EditorOption[EditorOption[\"suggest\"] = 116] = \"suggest\";\n EditorOption[EditorOption[\"suggestFontSize\"] = 117] = \"suggestFontSize\";\n EditorOption[EditorOption[\"suggestLineHeight\"] = 118] = \"suggestLineHeight\";\n EditorOption[EditorOption[\"suggestOnTriggerCharacters\"] = 119] = \"suggestOnTriggerCharacters\";\n EditorOption[EditorOption[\"suggestSelection\"] = 120] = \"suggestSelection\";\n EditorOption[EditorOption[\"tabCompletion\"] = 121] = \"tabCompletion\";\n EditorOption[EditorOption[\"tabIndex\"] = 122] = \"tabIndex\";\n EditorOption[EditorOption[\"unicodeHighlighting\"] = 123] = \"unicodeHighlighting\";\n EditorOption[EditorOption[\"unusualLineTerminators\"] = 124] = \"unusualLineTerminators\";\n EditorOption[EditorOption[\"useShadowDOM\"] = 125] = \"useShadowDOM\";\n EditorOption[EditorOption[\"useTabStops\"] = 126] = \"useTabStops\";\n EditorOption[EditorOption[\"wordBreak\"] = 127] = \"wordBreak\";\n EditorOption[EditorOption[\"wordSeparators\"] = 128] = \"wordSeparators\";\n EditorOption[EditorOption[\"wordWrap\"] = 129] = \"wordWrap\";\n EditorOption[EditorOption[\"wordWrapBreakAfterCharacters\"] = 130] = \"wordWrapBreakAfterCharacters\";\n EditorOption[EditorOption[\"wordWrapBreakBeforeCharacters\"] = 131] = \"wordWrapBreakBeforeCharacters\";\n EditorOption[EditorOption[\"wordWrapColumn\"] = 132] = \"wordWrapColumn\";\n EditorOption[EditorOption[\"wordWrapOverride1\"] = 133] = \"wordWrapOverride1\";\n EditorOption[EditorOption[\"wordWrapOverride2\"] = 134] = \"wordWrapOverride2\";\n EditorOption[EditorOption[\"wrappingIndent\"] = 135] = \"wrappingIndent\";\n EditorOption[EditorOption[\"wrappingStrategy\"] = 136] = \"wrappingStrategy\";\n EditorOption[EditorOption[\"showDeprecated\"] = 137] = \"showDeprecated\";\n EditorOption[EditorOption[\"inlayHints\"] = 138] = \"inlayHints\";\n EditorOption[EditorOption[\"editorClassName\"] = 139] = \"editorClassName\";\n EditorOption[EditorOption[\"pixelRatio\"] = 140] = \"pixelRatio\";\n EditorOption[EditorOption[\"tabFocusMode\"] = 141] = \"tabFocusMode\";\n EditorOption[EditorOption[\"layoutInfo\"] = 142] = \"layoutInfo\";\n EditorOption[EditorOption[\"wrappingInfo\"] = 143] = \"wrappingInfo\";\n EditorOption[EditorOption[\"defaultColorDecorators\"] = 144] = \"defaultColorDecorators\";\n EditorOption[EditorOption[\"colorDecoratorsActivatedOn\"] = 145] = \"colorDecoratorsActivatedOn\";\n})(EditorOption || (EditorOption = {}));\n/**\n * End of line character preference.\n */\nvar EndOfLinePreference;\n(function (EndOfLinePreference) {\n /**\n * Use the end of line character identified in the text buffer.\n */\n EndOfLinePreference[EndOfLinePreference[\"TextDefined\"] = 0] = \"TextDefined\";\n /**\n * Use line feed (\\n) as the end of line character.\n */\n EndOfLinePreference[EndOfLinePreference[\"LF\"] = 1] = \"LF\";\n /**\n * Use carriage return and line feed (\\r\\n) as the end of line character.\n */\n EndOfLinePreference[EndOfLinePreference[\"CRLF\"] = 2] = \"CRLF\";\n})(EndOfLinePreference || (EndOfLinePreference = {}));\n/**\n * End of line character preference.\n */\nvar EndOfLineSequence;\n(function (EndOfLineSequence) {\n /**\n * Use line feed (\\n) as the end of line character.\n */\n EndOfLineSequence[EndOfLineSequence[\"LF\"] = 0] = \"LF\";\n /**\n * Use carriage return and line feed (\\r\\n) as the end of line character.\n */\n EndOfLineSequence[EndOfLineSequence[\"CRLF\"] = 1] = \"CRLF\";\n})(EndOfLineSequence || (EndOfLineSequence = {}));\n/**\n * Vertical Lane in the glyph margin of the editor.\n */\nvar GlyphMarginLane;\n(function (GlyphMarginLane) {\n GlyphMarginLane[GlyphMarginLane[\"Left\"] = 1] = \"Left\";\n GlyphMarginLane[GlyphMarginLane[\"Right\"] = 2] = \"Right\";\n})(GlyphMarginLane || (GlyphMarginLane = {}));\n/**\n * Describes what to do with the indentation when pressing Enter.\n */\nvar IndentAction;\n(function (IndentAction) {\n /**\n * Insert new line and copy the previous line's indentation.\n */\n IndentAction[IndentAction[\"None\"] = 0] = \"None\";\n /**\n * Insert new line and indent once (relative to the previous line's indentation).\n */\n IndentAction[IndentAction[\"Indent\"] = 1] = \"Indent\";\n /**\n * Insert two new lines:\n * - the first one indented which will hold the cursor\n * - the second one at the same indentation level\n */\n IndentAction[IndentAction[\"IndentOutdent\"] = 2] = \"IndentOutdent\";\n /**\n * Insert new line and outdent once (relative to the previous line's indentation).\n */\n IndentAction[IndentAction[\"Outdent\"] = 3] = \"Outdent\";\n})(IndentAction || (IndentAction = {}));\nvar InjectedTextCursorStops;\n(function (InjectedTextCursorStops) {\n InjectedTextCursorStops[InjectedTextCursorStops[\"Both\"] = 0] = \"Both\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"Right\"] = 1] = \"Right\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"Left\"] = 2] = \"Left\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"None\"] = 3] = \"None\";\n})(InjectedTextCursorStops || (InjectedTextCursorStops = {}));\nvar standaloneEnums_InlayHintKind;\n(function (InlayHintKind) {\n InlayHintKind[InlayHintKind[\"Type\"] = 1] = \"Type\";\n InlayHintKind[InlayHintKind[\"Parameter\"] = 2] = \"Parameter\";\n})(standaloneEnums_InlayHintKind || (standaloneEnums_InlayHintKind = {}));\n/**\n * How an {@link InlineCompletionsProvider inline completion provider} was triggered.\n */\nvar standaloneEnums_InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n /**\n * Completion was triggered automatically while editing.\n * It is sufficient to return a single completion item in this case.\n */\n InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Automatic\"] = 0] = \"Automatic\";\n /**\n * Completion was triggered explicitly by a user gesture.\n * Return multiple completion items to enable cycling through them.\n */\n InlineCompletionTriggerKind[InlineCompletionTriggerKind[\"Explicit\"] = 1] = \"Explicit\";\n})(standaloneEnums_InlineCompletionTriggerKind || (standaloneEnums_InlineCompletionTriggerKind = {}));\n/**\n * Virtual Key Codes, the value does not hold any inherent meaning.\n * Inspired somewhat from https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n * But these are \"more general\", as they should work across browsers & OS`s.\n */\nvar KeyCode;\n(function (KeyCode) {\n KeyCode[KeyCode[\"DependsOnKbLayout\"] = -1] = \"DependsOnKbLayout\";\n /**\n * Placed first to cover the 0 value of the enum.\n */\n KeyCode[KeyCode[\"Unknown\"] = 0] = \"Unknown\";\n KeyCode[KeyCode[\"Backspace\"] = 1] = \"Backspace\";\n KeyCode[KeyCode[\"Tab\"] = 2] = \"Tab\";\n KeyCode[KeyCode[\"Enter\"] = 3] = \"Enter\";\n KeyCode[KeyCode[\"Shift\"] = 4] = \"Shift\";\n KeyCode[KeyCode[\"Ctrl\"] = 5] = \"Ctrl\";\n KeyCode[KeyCode[\"Alt\"] = 6] = \"Alt\";\n KeyCode[KeyCode[\"PauseBreak\"] = 7] = \"PauseBreak\";\n KeyCode[KeyCode[\"CapsLock\"] = 8] = \"CapsLock\";\n KeyCode[KeyCode[\"Escape\"] = 9] = \"Escape\";\n KeyCode[KeyCode[\"Space\"] = 10] = \"Space\";\n KeyCode[KeyCode[\"PageUp\"] = 11] = \"PageUp\";\n KeyCode[KeyCode[\"PageDown\"] = 12] = \"PageDown\";\n KeyCode[KeyCode[\"End\"] = 13] = \"End\";\n KeyCode[KeyCode[\"Home\"] = 14] = \"Home\";\n KeyCode[KeyCode[\"LeftArrow\"] = 15] = \"LeftArrow\";\n KeyCode[KeyCode[\"UpArrow\"] = 16] = \"UpArrow\";\n KeyCode[KeyCode[\"RightArrow\"] = 17] = \"RightArrow\";\n KeyCode[KeyCode[\"DownArrow\"] = 18] = \"DownArrow\";\n KeyCode[KeyCode[\"Insert\"] = 19] = \"Insert\";\n KeyCode[KeyCode[\"Delete\"] = 20] = \"Delete\";\n KeyCode[KeyCode[\"Digit0\"] = 21] = \"Digit0\";\n KeyCode[KeyCode[\"Digit1\"] = 22] = \"Digit1\";\n KeyCode[KeyCode[\"Digit2\"] = 23] = \"Digit2\";\n KeyCode[KeyCode[\"Digit3\"] = 24] = \"Digit3\";\n KeyCode[KeyCode[\"Digit4\"] = 25] = \"Digit4\";\n KeyCode[KeyCode[\"Digit5\"] = 26] = \"Digit5\";\n KeyCode[KeyCode[\"Digit6\"] = 27] = \"Digit6\";\n KeyCode[KeyCode[\"Digit7\"] = 28] = \"Digit7\";\n KeyCode[KeyCode[\"Digit8\"] = 29] = \"Digit8\";\n KeyCode[KeyCode[\"Digit9\"] = 30] = \"Digit9\";\n KeyCode[KeyCode[\"KeyA\"] = 31] = \"KeyA\";\n KeyCode[KeyCode[\"KeyB\"] = 32] = \"KeyB\";\n KeyCode[KeyCode[\"KeyC\"] = 33] = \"KeyC\";\n KeyCode[KeyCode[\"KeyD\"] = 34] = \"KeyD\";\n KeyCode[KeyCode[\"KeyE\"] = 35] = \"KeyE\";\n KeyCode[KeyCode[\"KeyF\"] = 36] = \"KeyF\";\n KeyCode[KeyCode[\"KeyG\"] = 37] = \"KeyG\";\n KeyCode[KeyCode[\"KeyH\"] = 38] = \"KeyH\";\n KeyCode[KeyCode[\"KeyI\"] = 39] = \"KeyI\";\n KeyCode[KeyCode[\"KeyJ\"] = 40] = \"KeyJ\";\n KeyCode[KeyCode[\"KeyK\"] = 41] = \"KeyK\";\n KeyCode[KeyCode[\"KeyL\"] = 42] = \"KeyL\";\n KeyCode[KeyCode[\"KeyM\"] = 43] = \"KeyM\";\n KeyCode[KeyCode[\"KeyN\"] = 44] = \"KeyN\";\n KeyCode[KeyCode[\"KeyO\"] = 45] = \"KeyO\";\n KeyCode[KeyCode[\"KeyP\"] = 46] = \"KeyP\";\n KeyCode[KeyCode[\"KeyQ\"] = 47] = \"KeyQ\";\n KeyCode[KeyCode[\"KeyR\"] = 48] = \"KeyR\";\n KeyCode[KeyCode[\"KeyS\"] = 49] = \"KeyS\";\n KeyCode[KeyCode[\"KeyT\"] = 50] = \"KeyT\";\n KeyCode[KeyCode[\"KeyU\"] = 51] = \"KeyU\";\n KeyCode[KeyCode[\"KeyV\"] = 52] = \"KeyV\";\n KeyCode[KeyCode[\"KeyW\"] = 53] = \"KeyW\";\n KeyCode[KeyCode[\"KeyX\"] = 54] = \"KeyX\";\n KeyCode[KeyCode[\"KeyY\"] = 55] = \"KeyY\";\n KeyCode[KeyCode[\"KeyZ\"] = 56] = \"KeyZ\";\n KeyCode[KeyCode[\"Meta\"] = 57] = \"Meta\";\n KeyCode[KeyCode[\"ContextMenu\"] = 58] = \"ContextMenu\";\n KeyCode[KeyCode[\"F1\"] = 59] = \"F1\";\n KeyCode[KeyCode[\"F2\"] = 60] = \"F2\";\n KeyCode[KeyCode[\"F3\"] = 61] = \"F3\";\n KeyCode[KeyCode[\"F4\"] = 62] = \"F4\";\n KeyCode[KeyCode[\"F5\"] = 63] = \"F5\";\n KeyCode[KeyCode[\"F6\"] = 64] = \"F6\";\n KeyCode[KeyCode[\"F7\"] = 65] = \"F7\";\n KeyCode[KeyCode[\"F8\"] = 66] = \"F8\";\n KeyCode[KeyCode[\"F9\"] = 67] = \"F9\";\n KeyCode[KeyCode[\"F10\"] = 68] = \"F10\";\n KeyCode[KeyCode[\"F11\"] = 69] = \"F11\";\n KeyCode[KeyCode[\"F12\"] = 70] = \"F12\";\n KeyCode[KeyCode[\"F13\"] = 71] = \"F13\";\n KeyCode[KeyCode[\"F14\"] = 72] = \"F14\";\n KeyCode[KeyCode[\"F15\"] = 73] = \"F15\";\n KeyCode[KeyCode[\"F16\"] = 74] = \"F16\";\n KeyCode[KeyCode[\"F17\"] = 75] = \"F17\";\n KeyCode[KeyCode[\"F18\"] = 76] = \"F18\";\n KeyCode[KeyCode[\"F19\"] = 77] = \"F19\";\n KeyCode[KeyCode[\"F20\"] = 78] = \"F20\";\n KeyCode[KeyCode[\"F21\"] = 79] = \"F21\";\n KeyCode[KeyCode[\"F22\"] = 80] = \"F22\";\n KeyCode[KeyCode[\"F23\"] = 81] = \"F23\";\n KeyCode[KeyCode[\"F24\"] = 82] = \"F24\";\n KeyCode[KeyCode[\"NumLock\"] = 83] = \"NumLock\";\n KeyCode[KeyCode[\"ScrollLock\"] = 84] = \"ScrollLock\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the ';:' key\n */\n KeyCode[KeyCode[\"Semicolon\"] = 85] = \"Semicolon\";\n /**\n * For any country/region, the '+' key\n * For the US standard keyboard, the '=+' key\n */\n KeyCode[KeyCode[\"Equal\"] = 86] = \"Equal\";\n /**\n * For any country/region, the ',' key\n * For the US standard keyboard, the ',<' key\n */\n KeyCode[KeyCode[\"Comma\"] = 87] = \"Comma\";\n /**\n * For any country/region, the '-' key\n * For the US standard keyboard, the '-_' key\n */\n KeyCode[KeyCode[\"Minus\"] = 88] = \"Minus\";\n /**\n * For any country/region, the '.' key\n * For the US standard keyboard, the '.>' key\n */\n KeyCode[KeyCode[\"Period\"] = 89] = \"Period\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the '/?' key\n */\n KeyCode[KeyCode[\"Slash\"] = 90] = \"Slash\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the '`~' key\n */\n KeyCode[KeyCode[\"Backquote\"] = 91] = \"Backquote\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the '[{' key\n */\n KeyCode[KeyCode[\"BracketLeft\"] = 92] = \"BracketLeft\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the '\\|' key\n */\n KeyCode[KeyCode[\"Backslash\"] = 93] = \"Backslash\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the ']}' key\n */\n KeyCode[KeyCode[\"BracketRight\"] = 94] = \"BracketRight\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n * For the US standard keyboard, the ''\"' key\n */\n KeyCode[KeyCode[\"Quote\"] = 95] = \"Quote\";\n /**\n * Used for miscellaneous characters; it can vary by keyboard.\n */\n KeyCode[KeyCode[\"OEM_8\"] = 96] = \"OEM_8\";\n /**\n * Either the angle bracket key or the backslash key on the RT 102-key keyboard.\n */\n KeyCode[KeyCode[\"IntlBackslash\"] = 97] = \"IntlBackslash\";\n KeyCode[KeyCode[\"Numpad0\"] = 98] = \"Numpad0\";\n KeyCode[KeyCode[\"Numpad1\"] = 99] = \"Numpad1\";\n KeyCode[KeyCode[\"Numpad2\"] = 100] = \"Numpad2\";\n KeyCode[KeyCode[\"Numpad3\"] = 101] = \"Numpad3\";\n KeyCode[KeyCode[\"Numpad4\"] = 102] = \"Numpad4\";\n KeyCode[KeyCode[\"Numpad5\"] = 103] = \"Numpad5\";\n KeyCode[KeyCode[\"Numpad6\"] = 104] = \"Numpad6\";\n KeyCode[KeyCode[\"Numpad7\"] = 105] = \"Numpad7\";\n KeyCode[KeyCode[\"Numpad8\"] = 106] = \"Numpad8\";\n KeyCode[KeyCode[\"Numpad9\"] = 107] = \"Numpad9\";\n KeyCode[KeyCode[\"NumpadMultiply\"] = 108] = \"NumpadMultiply\";\n KeyCode[KeyCode[\"NumpadAdd\"] = 109] = \"NumpadAdd\";\n KeyCode[KeyCode[\"NUMPAD_SEPARATOR\"] = 110] = \"NUMPAD_SEPARATOR\";\n KeyCode[KeyCode[\"NumpadSubtract\"] = 111] = \"NumpadSubtract\";\n KeyCode[KeyCode[\"NumpadDecimal\"] = 112] = \"NumpadDecimal\";\n KeyCode[KeyCode[\"NumpadDivide\"] = 113] = \"NumpadDivide\";\n /**\n * Cover all key codes when IME is processing input.\n */\n KeyCode[KeyCode[\"KEY_IN_COMPOSITION\"] = 114] = \"KEY_IN_COMPOSITION\";\n KeyCode[KeyCode[\"ABNT_C1\"] = 115] = \"ABNT_C1\";\n KeyCode[KeyCode[\"ABNT_C2\"] = 116] = \"ABNT_C2\";\n KeyCode[KeyCode[\"AudioVolumeMute\"] = 117] = \"AudioVolumeMute\";\n KeyCode[KeyCode[\"AudioVolumeUp\"] = 118] = \"AudioVolumeUp\";\n KeyCode[KeyCode[\"AudioVolumeDown\"] = 119] = \"AudioVolumeDown\";\n KeyCode[KeyCode[\"BrowserSearch\"] = 120] = \"BrowserSearch\";\n KeyCode[KeyCode[\"BrowserHome\"] = 121] = \"BrowserHome\";\n KeyCode[KeyCode[\"BrowserBack\"] = 122] = \"BrowserBack\";\n KeyCode[KeyCode[\"BrowserForward\"] = 123] = \"BrowserForward\";\n KeyCode[KeyCode[\"MediaTrackNext\"] = 124] = \"MediaTrackNext\";\n KeyCode[KeyCode[\"MediaTrackPrevious\"] = 125] = \"MediaTrackPrevious\";\n KeyCode[KeyCode[\"MediaStop\"] = 126] = \"MediaStop\";\n KeyCode[KeyCode[\"MediaPlayPause\"] = 127] = \"MediaPlayPause\";\n KeyCode[KeyCode[\"LaunchMediaPlayer\"] = 128] = \"LaunchMediaPlayer\";\n KeyCode[KeyCode[\"LaunchMail\"] = 129] = \"LaunchMail\";\n KeyCode[KeyCode[\"LaunchApp2\"] = 130] = \"LaunchApp2\";\n /**\n * VK_CLEAR, 0x0C, CLEAR key\n */\n KeyCode[KeyCode[\"Clear\"] = 131] = \"Clear\";\n /**\n * Placed last to cover the length of the enum.\n * Please do not depend on this value!\n */\n KeyCode[KeyCode[\"MAX_VALUE\"] = 132] = \"MAX_VALUE\";\n})(KeyCode || (KeyCode = {}));\nvar MarkerSeverity;\n(function (MarkerSeverity) {\n MarkerSeverity[MarkerSeverity[\"Hint\"] = 1] = \"Hint\";\n MarkerSeverity[MarkerSeverity[\"Info\"] = 2] = \"Info\";\n MarkerSeverity[MarkerSeverity[\"Warning\"] = 4] = \"Warning\";\n MarkerSeverity[MarkerSeverity[\"Error\"] = 8] = \"Error\";\n})(MarkerSeverity || (MarkerSeverity = {}));\nvar MarkerTag;\n(function (MarkerTag) {\n MarkerTag[MarkerTag[\"Unnecessary\"] = 1] = \"Unnecessary\";\n MarkerTag[MarkerTag[\"Deprecated\"] = 2] = \"Deprecated\";\n})(MarkerTag || (MarkerTag = {}));\n/**\n * Position in the minimap to render the decoration.\n */\nvar MinimapPosition;\n(function (MinimapPosition) {\n MinimapPosition[MinimapPosition[\"Inline\"] = 1] = \"Inline\";\n MinimapPosition[MinimapPosition[\"Gutter\"] = 2] = \"Gutter\";\n})(MinimapPosition || (MinimapPosition = {}));\n/**\n * Type of hit element with the mouse in the editor.\n */\nvar MouseTargetType;\n(function (MouseTargetType) {\n /**\n * Mouse is on top of an unknown element.\n */\n MouseTargetType[MouseTargetType[\"UNKNOWN\"] = 0] = \"UNKNOWN\";\n /**\n * Mouse is on top of the textarea used for input.\n */\n MouseTargetType[MouseTargetType[\"TEXTAREA\"] = 1] = \"TEXTAREA\";\n /**\n * Mouse is on top of the glyph margin\n */\n MouseTargetType[MouseTargetType[\"GUTTER_GLYPH_MARGIN\"] = 2] = \"GUTTER_GLYPH_MARGIN\";\n /**\n * Mouse is on top of the line numbers\n */\n MouseTargetType[MouseTargetType[\"GUTTER_LINE_NUMBERS\"] = 3] = \"GUTTER_LINE_NUMBERS\";\n /**\n * Mouse is on top of the line decorations\n */\n MouseTargetType[MouseTargetType[\"GUTTER_LINE_DECORATIONS\"] = 4] = \"GUTTER_LINE_DECORATIONS\";\n /**\n * Mouse is on top of the whitespace left in the gutter by a view zone.\n */\n MouseTargetType[MouseTargetType[\"GUTTER_VIEW_ZONE\"] = 5] = \"GUTTER_VIEW_ZONE\";\n /**\n * Mouse is on top of text in the content.\n */\n MouseTargetType[MouseTargetType[\"CONTENT_TEXT\"] = 6] = \"CONTENT_TEXT\";\n /**\n * Mouse is on top of empty space in the content (e.g. after line text or below last line)\n */\n MouseTargetType[MouseTargetType[\"CONTENT_EMPTY\"] = 7] = \"CONTENT_EMPTY\";\n /**\n * Mouse is on top of a view zone in the content.\n */\n MouseTargetType[MouseTargetType[\"CONTENT_VIEW_ZONE\"] = 8] = \"CONTENT_VIEW_ZONE\";\n /**\n * Mouse is on top of a content widget.\n */\n MouseTargetType[MouseTargetType[\"CONTENT_WIDGET\"] = 9] = \"CONTENT_WIDGET\";\n /**\n * Mouse is on top of the decorations overview ruler.\n */\n MouseTargetType[MouseTargetType[\"OVERVIEW_RULER\"] = 10] = \"OVERVIEW_RULER\";\n /**\n * Mouse is on top of a scrollbar.\n */\n MouseTargetType[MouseTargetType[\"SCROLLBAR\"] = 11] = \"SCROLLBAR\";\n /**\n * Mouse is on top of an overlay widget.\n */\n MouseTargetType[MouseTargetType[\"OVERLAY_WIDGET\"] = 12] = \"OVERLAY_WIDGET\";\n /**\n * Mouse is outside of the editor.\n */\n MouseTargetType[MouseTargetType[\"OUTSIDE_EDITOR\"] = 13] = \"OUTSIDE_EDITOR\";\n})(MouseTargetType || (MouseTargetType = {}));\n/**\n * A positioning preference for rendering overlay widgets.\n */\nvar OverlayWidgetPositionPreference;\n(function (OverlayWidgetPositionPreference) {\n /**\n * Position the overlay widget in the top right corner\n */\n OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"TOP_RIGHT_CORNER\"] = 0] = \"TOP_RIGHT_CORNER\";\n /**\n * Position the overlay widget in the bottom right corner\n */\n OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"BOTTOM_RIGHT_CORNER\"] = 1] = \"BOTTOM_RIGHT_CORNER\";\n /**\n * Position the overlay widget in the top center\n */\n OverlayWidgetPositionPreference[OverlayWidgetPositionPreference[\"TOP_CENTER\"] = 2] = \"TOP_CENTER\";\n})(OverlayWidgetPositionPreference || (OverlayWidgetPositionPreference = {}));\n/**\n * Vertical Lane in the overview ruler of the editor.\n */\nvar OverviewRulerLane;\n(function (OverviewRulerLane) {\n OverviewRulerLane[OverviewRulerLane[\"Left\"] = 1] = \"Left\";\n OverviewRulerLane[OverviewRulerLane[\"Center\"] = 2] = \"Center\";\n OverviewRulerLane[OverviewRulerLane[\"Right\"] = 4] = \"Right\";\n OverviewRulerLane[OverviewRulerLane[\"Full\"] = 7] = \"Full\";\n})(OverviewRulerLane || (OverviewRulerLane = {}));\nvar PositionAffinity;\n(function (PositionAffinity) {\n /**\n * Prefers the left most position.\n */\n PositionAffinity[PositionAffinity[\"Left\"] = 0] = \"Left\";\n /**\n * Prefers the right most position.\n */\n PositionAffinity[PositionAffinity[\"Right\"] = 1] = \"Right\";\n /**\n * No preference.\n */\n PositionAffinity[PositionAffinity[\"None\"] = 2] = \"None\";\n /**\n * If the given position is on injected text, prefers the position left of it.\n */\n PositionAffinity[PositionAffinity[\"LeftOfInjectedText\"] = 3] = \"LeftOfInjectedText\";\n /**\n * If the given position is on injected text, prefers the position right of it.\n */\n PositionAffinity[PositionAffinity[\"RightOfInjectedText\"] = 4] = \"RightOfInjectedText\";\n})(PositionAffinity || (PositionAffinity = {}));\nvar RenderLineNumbersType;\n(function (RenderLineNumbersType) {\n RenderLineNumbersType[RenderLineNumbersType[\"Off\"] = 0] = \"Off\";\n RenderLineNumbersType[RenderLineNumbersType[\"On\"] = 1] = \"On\";\n RenderLineNumbersType[RenderLineNumbersType[\"Relative\"] = 2] = \"Relative\";\n RenderLineNumbersType[RenderLineNumbersType[\"Interval\"] = 3] = \"Interval\";\n RenderLineNumbersType[RenderLineNumbersType[\"Custom\"] = 4] = \"Custom\";\n})(RenderLineNumbersType || (RenderLineNumbersType = {}));\nvar RenderMinimap;\n(function (RenderMinimap) {\n RenderMinimap[RenderMinimap[\"None\"] = 0] = \"None\";\n RenderMinimap[RenderMinimap[\"Text\"] = 1] = \"Text\";\n RenderMinimap[RenderMinimap[\"Blocks\"] = 2] = \"Blocks\";\n})(RenderMinimap || (RenderMinimap = {}));\nvar ScrollType;\n(function (ScrollType) {\n ScrollType[ScrollType[\"Smooth\"] = 0] = \"Smooth\";\n ScrollType[ScrollType[\"Immediate\"] = 1] = \"Immediate\";\n})(ScrollType || (ScrollType = {}));\nvar ScrollbarVisibility;\n(function (ScrollbarVisibility) {\n ScrollbarVisibility[ScrollbarVisibility[\"Auto\"] = 1] = \"Auto\";\n ScrollbarVisibility[ScrollbarVisibility[\"Hidden\"] = 2] = \"Hidden\";\n ScrollbarVisibility[ScrollbarVisibility[\"Visible\"] = 3] = \"Visible\";\n})(ScrollbarVisibility || (ScrollbarVisibility = {}));\n/**\n * The direction of a selection.\n */\nvar SelectionDirection;\n(function (SelectionDirection) {\n /**\n * The selection starts above where it ends.\n */\n SelectionDirection[SelectionDirection[\"LTR\"] = 0] = \"LTR\";\n /**\n * The selection starts below where it ends.\n */\n SelectionDirection[SelectionDirection[\"RTL\"] = 1] = \"RTL\";\n})(SelectionDirection || (SelectionDirection = {}));\nvar standaloneEnums_SignatureHelpTriggerKind;\n(function (SignatureHelpTriggerKind) {\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"Invoke\"] = 1] = \"Invoke\";\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"TriggerCharacter\"] = 2] = \"TriggerCharacter\";\n SignatureHelpTriggerKind[SignatureHelpTriggerKind[\"ContentChange\"] = 3] = \"ContentChange\";\n})(standaloneEnums_SignatureHelpTriggerKind || (standaloneEnums_SignatureHelpTriggerKind = {}));\n/**\n * A symbol kind.\n */\nvar SymbolKind;\n(function (SymbolKind) {\n SymbolKind[SymbolKind[\"File\"] = 0] = \"File\";\n SymbolKind[SymbolKind[\"Module\"] = 1] = \"Module\";\n SymbolKind[SymbolKind[\"Namespace\"] = 2] = \"Namespace\";\n SymbolKind[SymbolKind[\"Package\"] = 3] = \"Package\";\n SymbolKind[SymbolKind[\"Class\"] = 4] = \"Class\";\n SymbolKind[SymbolKind[\"Method\"] = 5] = \"Method\";\n SymbolKind[SymbolKind[\"Property\"] = 6] = \"Property\";\n SymbolKind[SymbolKind[\"Field\"] = 7] = \"Field\";\n SymbolKind[SymbolKind[\"Constructor\"] = 8] = \"Constructor\";\n SymbolKind[SymbolKind[\"Enum\"] = 9] = \"Enum\";\n SymbolKind[SymbolKind[\"Interface\"] = 10] = \"Interface\";\n SymbolKind[SymbolKind[\"Function\"] = 11] = \"Function\";\n SymbolKind[SymbolKind[\"Variable\"] = 12] = \"Variable\";\n SymbolKind[SymbolKind[\"Constant\"] = 13] = \"Constant\";\n SymbolKind[SymbolKind[\"String\"] = 14] = \"String\";\n SymbolKind[SymbolKind[\"Number\"] = 15] = \"Number\";\n SymbolKind[SymbolKind[\"Boolean\"] = 16] = \"Boolean\";\n SymbolKind[SymbolKind[\"Array\"] = 17] = \"Array\";\n SymbolKind[SymbolKind[\"Object\"] = 18] = \"Object\";\n SymbolKind[SymbolKind[\"Key\"] = 19] = \"Key\";\n SymbolKind[SymbolKind[\"Null\"] = 20] = \"Null\";\n SymbolKind[SymbolKind[\"EnumMember\"] = 21] = \"EnumMember\";\n SymbolKind[SymbolKind[\"Struct\"] = 22] = \"Struct\";\n SymbolKind[SymbolKind[\"Event\"] = 23] = \"Event\";\n SymbolKind[SymbolKind[\"Operator\"] = 24] = \"Operator\";\n SymbolKind[SymbolKind[\"TypeParameter\"] = 25] = \"TypeParameter\";\n})(SymbolKind || (SymbolKind = {}));\nvar SymbolTag;\n(function (SymbolTag) {\n SymbolTag[SymbolTag[\"Deprecated\"] = 1] = \"Deprecated\";\n})(SymbolTag || (SymbolTag = {}));\n/**\n * The kind of animation in which the editor's cursor should be rendered.\n */\nvar TextEditorCursorBlinkingStyle;\n(function (TextEditorCursorBlinkingStyle) {\n /**\n * Hidden\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Hidden\"] = 0] = \"Hidden\";\n /**\n * Blinking\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Blink\"] = 1] = \"Blink\";\n /**\n * Blinking with smooth fading\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Smooth\"] = 2] = \"Smooth\";\n /**\n * Blinking with prolonged filled state and smooth fading\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Phase\"] = 3] = \"Phase\";\n /**\n * Expand collapse animation on the y axis\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Expand\"] = 4] = \"Expand\";\n /**\n * No-Blinking\n */\n TextEditorCursorBlinkingStyle[TextEditorCursorBlinkingStyle[\"Solid\"] = 5] = \"Solid\";\n})(TextEditorCursorBlinkingStyle || (TextEditorCursorBlinkingStyle = {}));\n/**\n * The style in which the editor's cursor should be rendered.\n */\nvar TextEditorCursorStyle;\n(function (TextEditorCursorStyle) {\n /**\n * As a vertical line (sitting between two characters).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"Line\"] = 1] = \"Line\";\n /**\n * As a block (sitting on top of a character).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"Block\"] = 2] = \"Block\";\n /**\n * As a horizontal line (sitting under a character).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"Underline\"] = 3] = \"Underline\";\n /**\n * As a thin vertical line (sitting between two characters).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"LineThin\"] = 4] = \"LineThin\";\n /**\n * As an outlined block (sitting on top of a character).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"BlockOutline\"] = 5] = \"BlockOutline\";\n /**\n * As a thin horizontal line (sitting under a character).\n */\n TextEditorCursorStyle[TextEditorCursorStyle[\"UnderlineThin\"] = 6] = \"UnderlineThin\";\n})(TextEditorCursorStyle || (TextEditorCursorStyle = {}));\n/**\n * Describes the behavior of decorations when typing/editing near their edges.\n * Note: Please do not edit the values, as they very carefully match `DecorationRangeBehavior`\n */\nvar TrackedRangeStickiness;\n(function (TrackedRangeStickiness) {\n TrackedRangeStickiness[TrackedRangeStickiness[\"AlwaysGrowsWhenTypingAtEdges\"] = 0] = \"AlwaysGrowsWhenTypingAtEdges\";\n TrackedRangeStickiness[TrackedRangeStickiness[\"NeverGrowsWhenTypingAtEdges\"] = 1] = \"NeverGrowsWhenTypingAtEdges\";\n TrackedRangeStickiness[TrackedRangeStickiness[\"GrowsOnlyWhenTypingBefore\"] = 2] = \"GrowsOnlyWhenTypingBefore\";\n TrackedRangeStickiness[TrackedRangeStickiness[\"GrowsOnlyWhenTypingAfter\"] = 3] = \"GrowsOnlyWhenTypingAfter\";\n})(TrackedRangeStickiness || (TrackedRangeStickiness = {}));\n/**\n * Describes how to indent wrapped lines.\n */\nvar WrappingIndent;\n(function (WrappingIndent) {\n /**\n * No indentation => wrapped lines begin at column 1.\n */\n WrappingIndent[WrappingIndent[\"None\"] = 0] = \"None\";\n /**\n * Same => wrapped lines get the same indentation as the parent.\n */\n WrappingIndent[WrappingIndent[\"Same\"] = 1] = \"Same\";\n /**\n * Indent => wrapped lines get +1 indentation toward the parent.\n */\n WrappingIndent[WrappingIndent[\"Indent\"] = 2] = \"Indent\";\n /**\n * DeepIndent => wrapped lines get +2 indentation toward the parent.\n */\n WrappingIndent[WrappingIndent[\"DeepIndent\"] = 3] = \"DeepIndent\";\n})(WrappingIndent || (WrappingIndent = {}));\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/services/editorBaseApi.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n\n\n\n\n\n\n\nclass KeyMod {\n static chord(firstPart, secondPart) {\n return KeyChord(firstPart, secondPart);\n }\n}\nKeyMod.CtrlCmd = 2048 /* ConstKeyMod.CtrlCmd */;\nKeyMod.Shift = 1024 /* ConstKeyMod.Shift */;\nKeyMod.Alt = 512 /* ConstKeyMod.Alt */;\nKeyMod.WinCtrl = 256 /* ConstKeyMod.WinCtrl */;\nfunction createMonacoBaseAPI() {\n return {\n editor: undefined,\n languages: undefined,\n CancellationTokenSource: CancellationTokenSource,\n Emitter: Emitter,\n KeyCode: KeyCode,\n KeyMod: KeyMod,\n Position: position_Position,\n Range: range_Range,\n Selection: Selection,\n SelectionDirection: SelectionDirection,\n MarkerSeverity: MarkerSeverity,\n MarkerTag: MarkerTag,\n Uri: uri_URI,\n Token: Token\n };\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/core/wordCharacterClassifier.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nclass WordCharacterClassifier extends CharacterClassifier {\n constructor(wordSeparators) {\n super(0 /* WordCharacterClass.Regular */);\n for (let i = 0, len = wordSeparators.length; i < len; i++) {\n this.set(wordSeparators.charCodeAt(i), 2 /* WordCharacterClass.WordSeparator */);\n }\n this.set(32 /* CharCode.Space */, 1 /* WordCharacterClass.Whitespace */);\n this.set(9 /* CharCode.Tab */, 1 /* WordCharacterClass.Whitespace */);\n }\n}\nfunction wordCharacterClassifier_once(computeFn) {\n const cache = {}; // TODO@Alex unbounded cache\n return (input) => {\n if (!cache.hasOwnProperty(input)) {\n cache[input] = computeFn(input);\n }\n return cache[input];\n };\n}\nconst wordCharacterClassifier_getMapForWordSeparators = wordCharacterClassifier_once((input) => new WordCharacterClassifier(input));\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/model.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Vertical Lane in the overview ruler of the editor.\n */\nvar model_OverviewRulerLane;\n(function (OverviewRulerLane) {\n OverviewRulerLane[OverviewRulerLane[\"Left\"] = 1] = \"Left\";\n OverviewRulerLane[OverviewRulerLane[\"Center\"] = 2] = \"Center\";\n OverviewRulerLane[OverviewRulerLane[\"Right\"] = 4] = \"Right\";\n OverviewRulerLane[OverviewRulerLane[\"Full\"] = 7] = \"Full\";\n})(model_OverviewRulerLane || (model_OverviewRulerLane = {}));\n/**\n * Vertical Lane in the glyph margin of the editor.\n */\nvar model_GlyphMarginLane;\n(function (GlyphMarginLane) {\n GlyphMarginLane[GlyphMarginLane[\"Left\"] = 1] = \"Left\";\n GlyphMarginLane[GlyphMarginLane[\"Right\"] = 2] = \"Right\";\n})(model_GlyphMarginLane || (model_GlyphMarginLane = {}));\n/**\n * Position in the minimap to render the decoration.\n */\nvar model_MinimapPosition;\n(function (MinimapPosition) {\n MinimapPosition[MinimapPosition[\"Inline\"] = 1] = \"Inline\";\n MinimapPosition[MinimapPosition[\"Gutter\"] = 2] = \"Gutter\";\n})(model_MinimapPosition || (model_MinimapPosition = {}));\nvar model_InjectedTextCursorStops;\n(function (InjectedTextCursorStops) {\n InjectedTextCursorStops[InjectedTextCursorStops[\"Both\"] = 0] = \"Both\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"Right\"] = 1] = \"Right\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"Left\"] = 2] = \"Left\";\n InjectedTextCursorStops[InjectedTextCursorStops[\"None\"] = 3] = \"None\";\n})(model_InjectedTextCursorStops || (model_InjectedTextCursorStops = {}));\nclass TextModelResolvedOptions {\n get originalIndentSize() {\n return this._indentSizeIsTabSize ? 'tabSize' : this.indentSize;\n }\n /**\n * @internal\n */\n constructor(src) {\n this._textModelResolvedOptionsBrand = undefined;\n this.tabSize = Math.max(1, src.tabSize | 0);\n if (src.indentSize === 'tabSize') {\n this.indentSize = this.tabSize;\n this._indentSizeIsTabSize = true;\n }\n else {\n this.indentSize = Math.max(1, src.indentSize | 0);\n this._indentSizeIsTabSize = false;\n }\n this.insertSpaces = Boolean(src.insertSpaces);\n this.defaultEOL = src.defaultEOL | 0;\n this.trimAutoWhitespace = Boolean(src.trimAutoWhitespace);\n this.bracketPairColorizationOptions = src.bracketPairColorizationOptions;\n }\n /**\n * @internal\n */\n equals(other) {\n return (this.tabSize === other.tabSize\n && this._indentSizeIsTabSize === other._indentSizeIsTabSize\n && this.indentSize === other.indentSize\n && this.insertSpaces === other.insertSpaces\n && this.defaultEOL === other.defaultEOL\n && this.trimAutoWhitespace === other.trimAutoWhitespace\n && equals(this.bracketPairColorizationOptions, other.bracketPairColorizationOptions));\n }\n /**\n * @internal\n */\n createChangeEvent(newOpts) {\n return {\n tabSize: this.tabSize !== newOpts.tabSize,\n indentSize: this.indentSize !== newOpts.indentSize,\n insertSpaces: this.insertSpaces !== newOpts.insertSpaces,\n trimAutoWhitespace: this.trimAutoWhitespace !== newOpts.trimAutoWhitespace,\n };\n }\n}\nclass model_FindMatch {\n /**\n * @internal\n */\n constructor(range, matches) {\n this._findMatchBrand = undefined;\n this.range = range;\n this.matches = matches;\n }\n}\n/**\n * @internal\n */\nfunction isITextSnapshot(obj) {\n return (obj && typeof obj.read === 'function');\n}\n/**\n * @internal\n */\nclass ValidAnnotatedEditOperation {\n constructor(identifier, range, text, forceMoveMarkers, isAutoWhitespaceEdit, _isTracked) {\n this.identifier = identifier;\n this.range = range;\n this.text = text;\n this.forceMoveMarkers = forceMoveMarkers;\n this.isAutoWhitespaceEdit = isAutoWhitespaceEdit;\n this._isTracked = _isTracked;\n }\n}\n/**\n * @internal\n */\nclass model_SearchData {\n constructor(regex, wordSeparators, simpleSearch) {\n this.regex = regex;\n this.wordSeparators = wordSeparators;\n this.simpleSearch = simpleSearch;\n }\n}\n/**\n * @internal\n */\nclass ApplyEditsResult {\n constructor(reverseEdits, changes, trimAutoWhitespaceLineNumbers) {\n this.reverseEdits = reverseEdits;\n this.changes = changes;\n this.trimAutoWhitespaceLineNumbers = trimAutoWhitespaceLineNumbers;\n }\n}\n/**\n * @internal\n */\nfunction shouldSynchronizeModel(model) {\n return (!model.isTooLargeForSyncing() && !model.isForSimpleWidget);\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/model/textModelSearch.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n\n\n\nconst LIMIT_FIND_COUNT = 999;\nclass SearchParams {\n constructor(searchString, isRegex, matchCase, wordSeparators) {\n this.searchString = searchString;\n this.isRegex = isRegex;\n this.matchCase = matchCase;\n this.wordSeparators = wordSeparators;\n }\n parseSearchRequest() {\n if (this.searchString === '') {\n return null;\n }\n // Try to create a RegExp out of the params\n let multiline;\n if (this.isRegex) {\n multiline = isMultilineRegexSource(this.searchString);\n }\n else {\n multiline = (this.searchString.indexOf('\\n') >= 0);\n }\n let regex = null;\n try {\n regex = strings.createRegExp(this.searchString, this.isRegex, {\n matchCase: this.matchCase,\n wholeWord: false,\n multiline: multiline,\n global: true,\n unicode: true\n });\n }\n catch (err) {\n return null;\n }\n if (!regex) {\n return null;\n }\n let canUseSimpleSearch = (!this.isRegex && !multiline);\n if (canUseSimpleSearch && this.searchString.toLowerCase() !== this.searchString.toUpperCase()) {\n // casing might make a difference\n canUseSimpleSearch = this.matchCase;\n }\n return new SearchData(regex, this.wordSeparators ? getMapForWordSeparators(this.wordSeparators) : null, canUseSimpleSearch ? this.searchString : null);\n }\n}\nfunction isMultilineRegexSource(searchString) {\n if (!searchString || searchString.length === 0) {\n return false;\n }\n for (let i = 0, len = searchString.length; i < len; i++) {\n const chCode = searchString.charCodeAt(i);\n if (chCode === 10 /* CharCode.LineFeed */) {\n return true;\n }\n if (chCode === 92 /* CharCode.Backslash */) {\n // move to next char\n i++;\n if (i >= len) {\n // string ends with a \\\n break;\n }\n const nextChCode = searchString.charCodeAt(i);\n if (nextChCode === 110 /* CharCode.n */ || nextChCode === 114 /* CharCode.r */ || nextChCode === 87 /* CharCode.W */) {\n return true;\n }\n }\n }\n return false;\n}\nfunction createFindMatch(range, rawMatches, captureMatches) {\n if (!captureMatches) {\n return new FindMatch(range, null);\n }\n const matches = [];\n for (let i = 0, len = rawMatches.length; i < len; i++) {\n matches[i] = rawMatches[i];\n }\n return new FindMatch(range, matches);\n}\nclass LineFeedCounter {\n constructor(text) {\n const lineFeedsOffsets = [];\n let lineFeedsOffsetsLen = 0;\n for (let i = 0, textLen = text.length; i < textLen; i++) {\n if (text.charCodeAt(i) === 10 /* CharCode.LineFeed */) {\n lineFeedsOffsets[lineFeedsOffsetsLen++] = i;\n }\n }\n this._lineFeedsOffsets = lineFeedsOffsets;\n }\n findLineFeedCountBeforeOffset(offset) {\n const lineFeedsOffsets = this._lineFeedsOffsets;\n let min = 0;\n let max = lineFeedsOffsets.length - 1;\n if (max === -1) {\n // no line feeds\n return 0;\n }\n if (offset <= lineFeedsOffsets[0]) {\n // before first line feed\n return 0;\n }\n while (min < max) {\n const mid = min + ((max - min) / 2 >> 0);\n if (lineFeedsOffsets[mid] >= offset) {\n max = mid - 1;\n }\n else {\n if (lineFeedsOffsets[mid + 1] >= offset) {\n // bingo!\n min = mid;\n max = mid;\n }\n else {\n min = mid + 1;\n }\n }\n }\n return min + 1;\n }\n}\nclass TextModelSearch {\n static findMatches(model, searchParams, searchRange, captureMatches, limitResultCount) {\n const searchData = searchParams.parseSearchRequest();\n if (!searchData) {\n return [];\n }\n if (searchData.regex.multiline) {\n return this._doFindMatchesMultiline(model, searchRange, new Searcher(searchData.wordSeparators, searchData.regex), captureMatches, limitResultCount);\n }\n return this._doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount);\n }\n /**\n * Multiline search always executes on the lines concatenated with \\n.\n * We must therefore compensate for the count of \\n in case the model is CRLF\n */\n static _getMultilineMatchRange(model, deltaOffset, text, lfCounter, matchIndex, match0) {\n let startOffset;\n let lineFeedCountBeforeMatch = 0;\n if (lfCounter) {\n lineFeedCountBeforeMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex);\n startOffset = deltaOffset + matchIndex + lineFeedCountBeforeMatch /* add as many \\r as there were \\n */;\n }\n else {\n startOffset = deltaOffset + matchIndex;\n }\n let endOffset;\n if (lfCounter) {\n const lineFeedCountBeforeEndOfMatch = lfCounter.findLineFeedCountBeforeOffset(matchIndex + match0.length);\n const lineFeedCountInMatch = lineFeedCountBeforeEndOfMatch - lineFeedCountBeforeMatch;\n endOffset = startOffset + match0.length + lineFeedCountInMatch /* add as many \\r as there were \\n */;\n }\n else {\n endOffset = startOffset + match0.length;\n }\n const startPosition = model.getPositionAt(startOffset);\n const endPosition = model.getPositionAt(endOffset);\n return new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column);\n }\n static _doFindMatchesMultiline(model, searchRange, searcher, captureMatches, limitResultCount) {\n const deltaOffset = model.getOffsetAt(searchRange.getStartPosition());\n // We always execute multiline search over the lines joined with \\n\n // This makes it that \\n will match the EOL for both CRLF and LF models\n // We compensate for offset errors in `_getMultilineMatchRange`\n const text = model.getValueInRange(searchRange, 1 /* EndOfLinePreference.LF */);\n const lfCounter = (model.getEOL() === '\\r\\n' ? new LineFeedCounter(text) : null);\n const result = [];\n let counter = 0;\n let m;\n searcher.reset(0);\n while ((m = searcher.next(text))) {\n result[counter++] = createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, lfCounter, m.index, m[0]), m, captureMatches);\n if (counter >= limitResultCount) {\n return result;\n }\n }\n return result;\n }\n static _doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount) {\n const result = [];\n let resultLen = 0;\n // Early case for a search range that starts & stops on the same line number\n if (searchRange.startLineNumber === searchRange.endLineNumber) {\n const text = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1, searchRange.endColumn - 1);\n resultLen = this._findMatchesInLine(searchData, text, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount);\n return result;\n }\n // Collect results from first line\n const text = model.getLineContent(searchRange.startLineNumber).substring(searchRange.startColumn - 1);\n resultLen = this._findMatchesInLine(searchData, text, searchRange.startLineNumber, searchRange.startColumn - 1, resultLen, result, captureMatches, limitResultCount);\n // Collect results from middle lines\n for (let lineNumber = searchRange.startLineNumber + 1; lineNumber < searchRange.endLineNumber && resultLen < limitResultCount; lineNumber++) {\n resultLen = this._findMatchesInLine(searchData, model.getLineContent(lineNumber), lineNumber, 0, resultLen, result, captureMatches, limitResultCount);\n }\n // Collect results from last line\n if (resultLen < limitResultCount) {\n const text = model.getLineContent(searchRange.endLineNumber).substring(0, searchRange.endColumn - 1);\n resultLen = this._findMatchesInLine(searchData, text, searchRange.endLineNumber, 0, resultLen, result, captureMatches, limitResultCount);\n }\n return result;\n }\n static _findMatchesInLine(searchData, text, lineNumber, deltaOffset, resultLen, result, captureMatches, limitResultCount) {\n const wordSeparators = searchData.wordSeparators;\n if (!captureMatches && searchData.simpleSearch) {\n const searchString = searchData.simpleSearch;\n const searchStringLen = searchString.length;\n const textLength = text.length;\n let lastMatchIndex = -searchStringLen;\n while ((lastMatchIndex = text.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) {\n if (!wordSeparators || isValidMatch(wordSeparators, text, textLength, lastMatchIndex, searchStringLen)) {\n result[resultLen++] = new FindMatch(new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset), null);\n if (resultLen >= limitResultCount) {\n return resultLen;\n }\n }\n }\n return resultLen;\n }\n const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n let m;\n // Reset regex to search from the beginning\n searcher.reset(0);\n do {\n m = searcher.next(text);\n if (m) {\n result[resultLen++] = createFindMatch(new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset), m, captureMatches);\n if (resultLen >= limitResultCount) {\n return resultLen;\n }\n }\n } while (m);\n return resultLen;\n }\n static findNextMatch(model, searchParams, searchStart, captureMatches) {\n const searchData = searchParams.parseSearchRequest();\n if (!searchData) {\n return null;\n }\n const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n if (searchData.regex.multiline) {\n return this._doFindNextMatchMultiline(model, searchStart, searcher, captureMatches);\n }\n return this._doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches);\n }\n static _doFindNextMatchMultiline(model, searchStart, searcher, captureMatches) {\n const searchTextStart = new Position(searchStart.lineNumber, 1);\n const deltaOffset = model.getOffsetAt(searchTextStart);\n const lineCount = model.getLineCount();\n // We always execute multiline search over the lines joined with \\n\n // This makes it that \\n will match the EOL for both CRLF and LF models\n // We compensate for offset errors in `_getMultilineMatchRange`\n const text = model.getValueInRange(new Range(searchTextStart.lineNumber, searchTextStart.column, lineCount, model.getLineMaxColumn(lineCount)), 1 /* EndOfLinePreference.LF */);\n const lfCounter = (model.getEOL() === '\\r\\n' ? new LineFeedCounter(text) : null);\n searcher.reset(searchStart.column - 1);\n const m = searcher.next(text);\n if (m) {\n return createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, lfCounter, m.index, m[0]), m, captureMatches);\n }\n if (searchStart.lineNumber !== 1 || searchStart.column !== 1) {\n // Try again from the top\n return this._doFindNextMatchMultiline(model, new Position(1, 1), searcher, captureMatches);\n }\n return null;\n }\n static _doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches) {\n const lineCount = model.getLineCount();\n const startLineNumber = searchStart.lineNumber;\n // Look in first line\n const text = model.getLineContent(startLineNumber);\n const r = this._findFirstMatchInLine(searcher, text, startLineNumber, searchStart.column, captureMatches);\n if (r) {\n return r;\n }\n for (let i = 1; i <= lineCount; i++) {\n const lineIndex = (startLineNumber + i - 1) % lineCount;\n const text = model.getLineContent(lineIndex + 1);\n const r = this._findFirstMatchInLine(searcher, text, lineIndex + 1, 1, captureMatches);\n if (r) {\n return r;\n }\n }\n return null;\n }\n static _findFirstMatchInLine(searcher, text, lineNumber, fromColumn, captureMatches) {\n // Set regex to search from column\n searcher.reset(fromColumn - 1);\n const m = searcher.next(text);\n if (m) {\n return createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches);\n }\n return null;\n }\n static findPreviousMatch(model, searchParams, searchStart, captureMatches) {\n const searchData = searchParams.parseSearchRequest();\n if (!searchData) {\n return null;\n }\n const searcher = new Searcher(searchData.wordSeparators, searchData.regex);\n if (searchData.regex.multiline) {\n return this._doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches);\n }\n return this._doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches);\n }\n static _doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches) {\n const matches = this._doFindMatchesMultiline(model, new Range(1, 1, searchStart.lineNumber, searchStart.column), searcher, captureMatches, 10 * LIMIT_FIND_COUNT);\n if (matches.length > 0) {\n return matches[matches.length - 1];\n }\n const lineCount = model.getLineCount();\n if (searchStart.lineNumber !== lineCount || searchStart.column !== model.getLineMaxColumn(lineCount)) {\n // Try again with all content\n return this._doFindPreviousMatchMultiline(model, new Position(lineCount, model.getLineMaxColumn(lineCount)), searcher, captureMatches);\n }\n return null;\n }\n static _doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches) {\n const lineCount = model.getLineCount();\n const startLineNumber = searchStart.lineNumber;\n // Look in first line\n const text = model.getLineContent(startLineNumber).substring(0, searchStart.column - 1);\n const r = this._findLastMatchInLine(searcher, text, startLineNumber, captureMatches);\n if (r) {\n return r;\n }\n for (let i = 1; i <= lineCount; i++) {\n const lineIndex = (lineCount + startLineNumber - i - 1) % lineCount;\n const text = model.getLineContent(lineIndex + 1);\n const r = this._findLastMatchInLine(searcher, text, lineIndex + 1, captureMatches);\n if (r) {\n return r;\n }\n }\n return null;\n }\n static _findLastMatchInLine(searcher, text, lineNumber, captureMatches) {\n let bestResult = null;\n let m;\n searcher.reset(0);\n while ((m = searcher.next(text))) {\n bestResult = createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches);\n }\n return bestResult;\n }\n}\nfunction leftIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n if (matchStartIndex === 0) {\n // Match starts at start of string\n return true;\n }\n const charBefore = text.charCodeAt(matchStartIndex - 1);\n if (wordSeparators.get(charBefore) !== 0 /* WordCharacterClass.Regular */) {\n // The character before the match is a word separator\n return true;\n }\n if (charBefore === 13 /* CharCode.CarriageReturn */ || charBefore === 10 /* CharCode.LineFeed */) {\n // The character before the match is line break or carriage return.\n return true;\n }\n if (matchLength > 0) {\n const firstCharInMatch = text.charCodeAt(matchStartIndex);\n if (wordSeparators.get(firstCharInMatch) !== 0 /* WordCharacterClass.Regular */) {\n // The first character inside the match is a word separator\n return true;\n }\n }\n return false;\n}\nfunction rightIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n if (matchStartIndex + matchLength === textLength) {\n // Match ends at end of string\n return true;\n }\n const charAfter = text.charCodeAt(matchStartIndex + matchLength);\n if (wordSeparators.get(charAfter) !== 0 /* WordCharacterClass.Regular */) {\n // The character after the match is a word separator\n return true;\n }\n if (charAfter === 13 /* CharCode.CarriageReturn */ || charAfter === 10 /* CharCode.LineFeed */) {\n // The character after the match is line break or carriage return.\n return true;\n }\n if (matchLength > 0) {\n const lastCharInMatch = text.charCodeAt(matchStartIndex + matchLength - 1);\n if (wordSeparators.get(lastCharInMatch) !== 0 /* WordCharacterClass.Regular */) {\n // The last character in the match is a word separator\n return true;\n }\n }\n return false;\n}\nfunction isValidMatch(wordSeparators, text, textLength, matchStartIndex, matchLength) {\n return (leftIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength)\n && rightIsWordBounday(wordSeparators, text, textLength, matchStartIndex, matchLength));\n}\nclass Searcher {\n constructor(wordSeparators, searchRegex) {\n this._wordSeparators = wordSeparators;\n this._searchRegex = searchRegex;\n this._prevMatchStartIndex = -1;\n this._prevMatchLength = 0;\n }\n reset(lastIndex) {\n this._searchRegex.lastIndex = lastIndex;\n this._prevMatchStartIndex = -1;\n this._prevMatchLength = 0;\n }\n next(text) {\n const textLength = text.length;\n let m;\n do {\n if (this._prevMatchStartIndex + this._prevMatchLength === textLength) {\n // Reached the end of the line\n return null;\n }\n m = this._searchRegex.exec(text);\n if (!m) {\n return null;\n }\n const matchStartIndex = m.index;\n const matchLength = m[0].length;\n if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) {\n if (matchLength === 0) {\n // the search result is an empty string and won't advance `regex.lastIndex`, so `regex.exec` will stuck here\n // we attempt to recover from that by advancing by two if surrogate pair found and by one otherwise\n if (getNextCodePoint(text, textLength, this._searchRegex.lastIndex) > 0xFFFF) {\n this._searchRegex.lastIndex += 2;\n }\n else {\n this._searchRegex.lastIndex += 1;\n }\n continue;\n }\n // Exit early if the regex matches the same range twice\n return null;\n }\n this._prevMatchStartIndex = matchStartIndex;\n this._prevMatchLength = matchLength;\n if (!this._wordSeparators || isValidMatch(this._wordSeparators, text, textLength, matchStartIndex, matchLength)) {\n return m;\n }\n } while (m);\n return null;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/assert.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Throws an error with the provided message if the provided value does not evaluate to a true Javascript value.\n *\n * @deprecated Use `assert(...)` instead.\n * This method is usually used like this:\n * ```ts\n * import * as assert from 'vs/base/common/assert';\n * assert.ok(...);\n * ```\n *\n * However, `assert` in that example is a user chosen name.\n * There is no tooling for generating such an import statement.\n * Thus, the `assert(...)` function should be used instead.\n */\nfunction ok(value, message) {\n if (!value) {\n throw new Error(message ? `Assertion failed (${message})` : 'Assertion Failed');\n }\n}\nfunction assertNever(value, message = 'Unreachable') {\n throw new Error(message);\n}\n/**\n * condition must be side-effect free!\n */\nfunction assertFn(condition) {\n if (!condition()) {\n // eslint-disable-next-line no-debugger\n debugger;\n // Reevaluate `condition` again to make debugging easier\n condition();\n onUnexpectedError(new BugIndicatingError('Assertion Failed'));\n }\n}\nfunction checkAdjacentItems(items, predicate) {\n let i = 0;\n while (i < items.length - 1) {\n const a = items[i];\n const b = items[i + 1];\n if (!predicate(a, b)) {\n return false;\n }\n i++;\n }\n return true;\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/services/unicodeTextModelHighlighter.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n\n\n\nclass UnicodeTextModelHighlighter {\n static computeUnicodeHighlights(model, options, range) {\n const startLine = range ? range.startLineNumber : 1;\n const endLine = range ? range.endLineNumber : model.getLineCount();\n const codePointHighlighter = new CodePointHighlighter(options);\n const candidates = codePointHighlighter.getCandidateCodePoints();\n let regex;\n if (candidates === 'allNonBasicAscii') {\n regex = new RegExp('[^\\\\t\\\\n\\\\r\\\\x20-\\\\x7E]', 'g');\n }\n else {\n regex = new RegExp(`${buildRegExpCharClassExpr(Array.from(candidates))}`, 'g');\n }\n const searcher = new Searcher(null, regex);\n const ranges = [];\n let hasMore = false;\n let m;\n let ambiguousCharacterCount = 0;\n let invisibleCharacterCount = 0;\n let nonBasicAsciiCharacterCount = 0;\n forLoop: for (let lineNumber = startLine, lineCount = endLine; lineNumber <= lineCount; lineNumber++) {\n const lineContent = model.getLineContent(lineNumber);\n const lineLength = lineContent.length;\n // Reset regex to search from the beginning\n searcher.reset(0);\n do {\n m = searcher.next(lineContent);\n if (m) {\n let startIndex = m.index;\n let endIndex = m.index + m[0].length;\n // Extend range to entire code point\n if (startIndex > 0) {\n const charCodeBefore = lineContent.charCodeAt(startIndex - 1);\n if (isHighSurrogate(charCodeBefore)) {\n startIndex--;\n }\n }\n if (endIndex + 1 < lineLength) {\n const charCodeBefore = lineContent.charCodeAt(endIndex - 1);\n if (isHighSurrogate(charCodeBefore)) {\n endIndex++;\n }\n }\n const str = lineContent.substring(startIndex, endIndex);\n let word = getWordAtText(startIndex + 1, DEFAULT_WORD_REGEXP, lineContent, 0);\n if (word && word.endColumn <= startIndex + 1) {\n // The word does not include the problematic character, ignore the word\n word = null;\n }\n const highlightReason = codePointHighlighter.shouldHighlightNonBasicASCII(str, word ? word.word : null);\n if (highlightReason !== 0 /* SimpleHighlightReason.None */) {\n if (highlightReason === 3 /* SimpleHighlightReason.Ambiguous */) {\n ambiguousCharacterCount++;\n }\n else if (highlightReason === 2 /* SimpleHighlightReason.Invisible */) {\n invisibleCharacterCount++;\n }\n else if (highlightReason === 1 /* SimpleHighlightReason.NonBasicASCII */) {\n nonBasicAsciiCharacterCount++;\n }\n else {\n assertNever(highlightReason);\n }\n const MAX_RESULT_LENGTH = 1000;\n if (ranges.length >= MAX_RESULT_LENGTH) {\n hasMore = true;\n break forLoop;\n }\n ranges.push(new range_Range(lineNumber, startIndex + 1, lineNumber, endIndex + 1));\n }\n }\n } while (m);\n }\n return {\n ranges,\n hasMore,\n ambiguousCharacterCount,\n invisibleCharacterCount,\n nonBasicAsciiCharacterCount\n };\n }\n static computeUnicodeHighlightReason(char, options) {\n const codePointHighlighter = new CodePointHighlighter(options);\n const reason = codePointHighlighter.shouldHighlightNonBasicASCII(char, null);\n switch (reason) {\n case 0 /* SimpleHighlightReason.None */:\n return null;\n case 2 /* SimpleHighlightReason.Invisible */:\n return { kind: 1 /* UnicodeHighlighterReasonKind.Invisible */ };\n case 3 /* SimpleHighlightReason.Ambiguous */: {\n const codePoint = char.codePointAt(0);\n const primaryConfusable = codePointHighlighter.ambiguousCharacters.getPrimaryConfusable(codePoint);\n const notAmbiguousInLocales = AmbiguousCharacters.getLocales().filter((l) => !AmbiguousCharacters.getInstance(new Set([...options.allowedLocales, l])).isAmbiguous(codePoint));\n return { kind: 0 /* UnicodeHighlighterReasonKind.Ambiguous */, confusableWith: String.fromCodePoint(primaryConfusable), notAmbiguousInLocales };\n }\n case 1 /* SimpleHighlightReason.NonBasicASCII */:\n return { kind: 2 /* UnicodeHighlighterReasonKind.NonBasicAscii */ };\n }\n }\n}\nfunction buildRegExpCharClassExpr(codePoints, flags) {\n const src = `[${escapeRegExpCharacters(codePoints.map((i) => String.fromCodePoint(i)).join(''))}]`;\n return src;\n}\nclass CodePointHighlighter {\n constructor(options) {\n this.options = options;\n this.allowedCodePoints = new Set(options.allowedCodePoints);\n this.ambiguousCharacters = AmbiguousCharacters.getInstance(new Set(options.allowedLocales));\n }\n getCandidateCodePoints() {\n if (this.options.nonBasicASCII) {\n return 'allNonBasicAscii';\n }\n const set = new Set();\n if (this.options.invisibleCharacters) {\n for (const cp of InvisibleCharacters.codePoints) {\n if (!isAllowedInvisibleCharacter(String.fromCodePoint(cp))) {\n set.add(cp);\n }\n }\n }\n if (this.options.ambiguousCharacters) {\n for (const cp of this.ambiguousCharacters.getConfusableCodePoints()) {\n set.add(cp);\n }\n }\n for (const cp of this.allowedCodePoints) {\n set.delete(cp);\n }\n return set;\n }\n shouldHighlightNonBasicASCII(character, wordContext) {\n const codePoint = character.codePointAt(0);\n if (this.allowedCodePoints.has(codePoint)) {\n return 0 /* SimpleHighlightReason.None */;\n }\n if (this.options.nonBasicASCII) {\n return 1 /* SimpleHighlightReason.NonBasicASCII */;\n }\n let hasBasicASCIICharacters = false;\n let hasNonConfusableNonBasicAsciiCharacter = false;\n if (wordContext) {\n for (const char of wordContext) {\n const codePoint = char.codePointAt(0);\n const isBasicASCII = strings_isBasicASCII(char);\n hasBasicASCIICharacters = hasBasicASCIICharacters || isBasicASCII;\n if (!isBasicASCII &&\n !this.ambiguousCharacters.isAmbiguous(codePoint) &&\n !InvisibleCharacters.isInvisibleCharacter(codePoint)) {\n hasNonConfusableNonBasicAsciiCharacter = true;\n }\n }\n }\n if (\n /* Don't allow mixing weird looking characters with ASCII */ !hasBasicASCIICharacters &&\n /* Is there an obviously weird looking character? */ hasNonConfusableNonBasicAsciiCharacter) {\n return 0 /* SimpleHighlightReason.None */;\n }\n if (this.options.invisibleCharacters) {\n // TODO check for emojis\n if (!isAllowedInvisibleCharacter(character) && InvisibleCharacters.isInvisibleCharacter(codePoint)) {\n return 2 /* SimpleHighlightReason.Invisible */;\n }\n }\n if (this.options.ambiguousCharacters) {\n if (this.ambiguousCharacters.isAmbiguous(codePoint)) {\n return 3 /* SimpleHighlightReason.Ambiguous */;\n }\n }\n return 0 /* SimpleHighlightReason.None */;\n }\n}\nfunction isAllowedInvisibleCharacter(character) {\n return character === ' ' || character === '\\n' || character === '\\t';\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/core/lineRange.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n/**\n * A range of lines (1-based).\n */\nclass LineRange {\n static fromRange(range) {\n return new LineRange(range.startLineNumber, range.endLineNumber);\n }\n static subtract(a, b) {\n if (!b) {\n return [a];\n }\n if (a.startLineNumber < b.startLineNumber && b.endLineNumberExclusive < a.endLineNumberExclusive) {\n return [\n new LineRange(a.startLineNumber, b.startLineNumber),\n new LineRange(b.endLineNumberExclusive, a.endLineNumberExclusive)\n ];\n }\n else if (b.startLineNumber <= a.startLineNumber && a.endLineNumberExclusive <= b.endLineNumberExclusive) {\n return [];\n }\n else if (b.endLineNumberExclusive < a.endLineNumberExclusive) {\n return [new LineRange(Math.max(b.endLineNumberExclusive, a.startLineNumber), a.endLineNumberExclusive)];\n }\n else {\n return [new LineRange(a.startLineNumber, Math.min(b.startLineNumber, a.endLineNumberExclusive))];\n }\n }\n /**\n * @param lineRanges An array of sorted line ranges.\n */\n static joinMany(lineRanges) {\n if (lineRanges.length === 0) {\n return [];\n }\n let result = lineRanges[0];\n for (let i = 1; i < lineRanges.length; i++) {\n result = this.join(result, lineRanges[i]);\n }\n return result;\n }\n /**\n * @param lineRanges1 Must be sorted.\n * @param lineRanges2 Must be sorted.\n */\n static join(lineRanges1, lineRanges2) {\n if (lineRanges1.length === 0) {\n return lineRanges2;\n }\n if (lineRanges2.length === 0) {\n return lineRanges1;\n }\n const result = [];\n let i1 = 0;\n let i2 = 0;\n let current = null;\n while (i1 < lineRanges1.length || i2 < lineRanges2.length) {\n let next = null;\n if (i1 < lineRanges1.length && i2 < lineRanges2.length) {\n const lineRange1 = lineRanges1[i1];\n const lineRange2 = lineRanges2[i2];\n if (lineRange1.startLineNumber < lineRange2.startLineNumber) {\n next = lineRange1;\n i1++;\n }\n else {\n next = lineRange2;\n i2++;\n }\n }\n else if (i1 < lineRanges1.length) {\n next = lineRanges1[i1];\n i1++;\n }\n else {\n next = lineRanges2[i2];\n i2++;\n }\n if (current === null) {\n current = next;\n }\n else {\n if (current.endLineNumberExclusive >= next.startLineNumber) {\n // merge\n current = new LineRange(current.startLineNumber, Math.max(current.endLineNumberExclusive, next.endLineNumberExclusive));\n }\n else {\n // push\n result.push(current);\n current = next;\n }\n }\n }\n if (current !== null) {\n result.push(current);\n }\n return result;\n }\n static ofLength(startLineNumber, length) {\n return new LineRange(startLineNumber, startLineNumber + length);\n }\n /**\n * @internal\n */\n static deserialize(lineRange) {\n return new LineRange(lineRange[0], lineRange[1]);\n }\n constructor(startLineNumber, endLineNumberExclusive) {\n if (startLineNumber > endLineNumberExclusive) {\n throw new BugIndicatingError(`startLineNumber ${startLineNumber} cannot be after endLineNumberExclusive ${endLineNumberExclusive}`);\n }\n this.startLineNumber = startLineNumber;\n this.endLineNumberExclusive = endLineNumberExclusive;\n }\n /**\n * Indicates if this line range contains the given line number.\n */\n contains(lineNumber) {\n return this.startLineNumber <= lineNumber && lineNumber < this.endLineNumberExclusive;\n }\n /**\n * Indicates if this line range is empty.\n */\n get isEmpty() {\n return this.startLineNumber === this.endLineNumberExclusive;\n }\n /**\n * Moves this line range by the given offset of line numbers.\n */\n delta(offset) {\n return new LineRange(this.startLineNumber + offset, this.endLineNumberExclusive + offset);\n }\n /**\n * The number of lines this line range spans.\n */\n get length() {\n return this.endLineNumberExclusive - this.startLineNumber;\n }\n /**\n * Creates a line range that combines this and the given line range.\n */\n join(other) {\n return new LineRange(Math.min(this.startLineNumber, other.startLineNumber), Math.max(this.endLineNumberExclusive, other.endLineNumberExclusive));\n }\n toString() {\n return `[${this.startLineNumber},${this.endLineNumberExclusive})`;\n }\n /**\n * The resulting range is empty if the ranges do not intersect, but touch.\n * If the ranges don't even touch, the result is undefined.\n */\n intersect(other) {\n const startLineNumber = Math.max(this.startLineNumber, other.startLineNumber);\n const endLineNumberExclusive = Math.min(this.endLineNumberExclusive, other.endLineNumberExclusive);\n if (startLineNumber <= endLineNumberExclusive) {\n return new LineRange(startLineNumber, endLineNumberExclusive);\n }\n return undefined;\n }\n intersectsStrict(other) {\n return this.startLineNumber < other.endLineNumberExclusive && other.startLineNumber < this.endLineNumberExclusive;\n }\n overlapOrTouch(other) {\n return this.startLineNumber <= other.endLineNumberExclusive && other.startLineNumber <= this.endLineNumberExclusive;\n }\n equals(b) {\n return this.startLineNumber === b.startLineNumber && this.endLineNumberExclusive === b.endLineNumberExclusive;\n }\n toInclusiveRange() {\n if (this.isEmpty) {\n return null;\n }\n return new range_Range(this.startLineNumber, 1, this.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER);\n }\n toExclusiveRange() {\n return new range_Range(this.startLineNumber, 1, this.endLineNumberExclusive, 1);\n }\n mapToLineArray(f) {\n const result = [];\n for (let lineNumber = this.startLineNumber; lineNumber < this.endLineNumberExclusive; lineNumber++) {\n result.push(f(lineNumber));\n }\n return result;\n }\n forEach(f) {\n for (let lineNumber = this.startLineNumber; lineNumber < this.endLineNumberExclusive; lineNumber++) {\n f(lineNumber);\n }\n }\n /**\n * @internal\n */\n serialize() {\n return [this.startLineNumber, this.endLineNumberExclusive];\n }\n includes(lineNumber) {\n return this.startLineNumber <= lineNumber && lineNumber < this.endLineNumberExclusive;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/linesDiffComputer.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nclass LinesDiff {\n constructor(changes, \n /**\n * Sorted by original line ranges.\n * The original line ranges and the modified line ranges must be disjoint (but can be touching).\n */\n moves, \n /**\n * Indicates if the time out was reached.\n * In that case, the diffs might be an approximation and the user should be asked to rerun the diff with more time.\n */\n hitTimeout) {\n this.changes = changes;\n this.moves = moves;\n this.hitTimeout = hitTimeout;\n }\n}\n/**\n * Maps a line range in the original text model to a line range in the modified text model.\n */\nclass LineRangeMapping {\n static inverse(mapping, originalLineCount, modifiedLineCount) {\n const result = [];\n let lastOriginalEndLineNumber = 1;\n let lastModifiedEndLineNumber = 1;\n for (const m of mapping) {\n const r = new LineRangeMapping(new LineRange(lastOriginalEndLineNumber, m.originalRange.startLineNumber), new LineRange(lastModifiedEndLineNumber, m.modifiedRange.startLineNumber), undefined);\n if (!r.modifiedRange.isEmpty) {\n result.push(r);\n }\n lastOriginalEndLineNumber = m.originalRange.endLineNumberExclusive;\n lastModifiedEndLineNumber = m.modifiedRange.endLineNumberExclusive;\n }\n const r = new LineRangeMapping(new LineRange(lastOriginalEndLineNumber, originalLineCount + 1), new LineRange(lastModifiedEndLineNumber, modifiedLineCount + 1), undefined);\n if (!r.modifiedRange.isEmpty) {\n result.push(r);\n }\n return result;\n }\n constructor(originalRange, modifiedRange, innerChanges) {\n this.originalRange = originalRange;\n this.modifiedRange = modifiedRange;\n this.innerChanges = innerChanges;\n }\n toString() {\n return `{${this.originalRange.toString()}->${this.modifiedRange.toString()}}`;\n }\n get changedLineCount() {\n return Math.max(this.originalRange.length, this.modifiedRange.length);\n }\n flip() {\n var _a;\n return new LineRangeMapping(this.modifiedRange, this.originalRange, (_a = this.innerChanges) === null || _a === void 0 ? void 0 : _a.map(c => c.flip()));\n }\n}\n/**\n * Maps a range in the original text model to a range in the modified text model.\n */\nclass RangeMapping {\n constructor(originalRange, modifiedRange) {\n this.originalRange = originalRange;\n this.modifiedRange = modifiedRange;\n }\n toString() {\n return `{${this.originalRange.toString()}->${this.modifiedRange.toString()}}`;\n }\n flip() {\n return new RangeMapping(this.modifiedRange, this.originalRange);\n }\n}\n// TODO@hediet: Make LineRangeMapping extend from this!\nclass SimpleLineRangeMapping {\n constructor(original, modified) {\n this.original = original;\n this.modified = modified;\n }\n toString() {\n return `{${this.original.toString()}->${this.modified.toString()}}`;\n }\n flip() {\n return new SimpleLineRangeMapping(this.modified, this.original);\n }\n}\nclass MovedText {\n constructor(lineRangeMapping, changes) {\n this.lineRangeMapping = lineRangeMapping;\n this.changes = changes;\n }\n flip() {\n return new MovedText(this.lineRangeMapping.flip(), this.changes.map(c => c.flip()));\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/smartLinesDiffComputer.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n\n\n\n\nconst MINIMUM_MATCHING_CHARACTER_LENGTH = 3;\nclass SmartLinesDiffComputer {\n computeDiff(originalLines, modifiedLines, options) {\n var _a;\n const diffComputer = new DiffComputer(originalLines, modifiedLines, {\n maxComputationTime: options.maxComputationTimeMs,\n shouldIgnoreTrimWhitespace: options.ignoreTrimWhitespace,\n shouldComputeCharChanges: true,\n shouldMakePrettyDiff: true,\n shouldPostProcessCharChanges: true,\n });\n const result = diffComputer.computeDiff();\n const changes = [];\n let lastChange = null;\n for (const c of result.changes) {\n let originalRange;\n if (c.originalEndLineNumber === 0) {\n // Insertion\n originalRange = new LineRange(c.originalStartLineNumber + 1, c.originalStartLineNumber + 1);\n }\n else {\n originalRange = new LineRange(c.originalStartLineNumber, c.originalEndLineNumber + 1);\n }\n let modifiedRange;\n if (c.modifiedEndLineNumber === 0) {\n // Deletion\n modifiedRange = new LineRange(c.modifiedStartLineNumber + 1, c.modifiedStartLineNumber + 1);\n }\n else {\n modifiedRange = new LineRange(c.modifiedStartLineNumber, c.modifiedEndLineNumber + 1);\n }\n let change = new LineRangeMapping(originalRange, modifiedRange, (_a = c.charChanges) === null || _a === void 0 ? void 0 : _a.map(c => new RangeMapping(new range_Range(c.originalStartLineNumber, c.originalStartColumn, c.originalEndLineNumber, c.originalEndColumn), new range_Range(c.modifiedStartLineNumber, c.modifiedStartColumn, c.modifiedEndLineNumber, c.modifiedEndColumn))));\n if (lastChange) {\n if (lastChange.modifiedRange.endLineNumberExclusive === change.modifiedRange.startLineNumber\n || lastChange.originalRange.endLineNumberExclusive === change.originalRange.startLineNumber) {\n // join touching diffs. Probably moving diffs up/down in the algorithm causes touching diffs.\n change = new LineRangeMapping(lastChange.originalRange.join(change.originalRange), lastChange.modifiedRange.join(change.modifiedRange), lastChange.innerChanges && change.innerChanges ?\n lastChange.innerChanges.concat(change.innerChanges) : undefined);\n changes.pop();\n }\n }\n changes.push(change);\n lastChange = change;\n }\n assertFn(() => {\n return checkAdjacentItems(changes, (m1, m2) => m2.originalRange.startLineNumber - m1.originalRange.endLineNumberExclusive === m2.modifiedRange.startLineNumber - m1.modifiedRange.endLineNumberExclusive &&\n // There has to be an unchanged line in between (otherwise both diffs should have been joined)\n m1.originalRange.endLineNumberExclusive < m2.originalRange.startLineNumber &&\n m1.modifiedRange.endLineNumberExclusive < m2.modifiedRange.startLineNumber);\n });\n return new LinesDiff(changes, [], result.quitEarly);\n }\n}\nfunction computeDiff(originalSequence, modifiedSequence, continueProcessingPredicate, pretty) {\n const diffAlgo = new LcsDiff(originalSequence, modifiedSequence, continueProcessingPredicate);\n return diffAlgo.ComputeDiff(pretty);\n}\nclass LineSequence {\n constructor(lines) {\n const startColumns = [];\n const endColumns = [];\n for (let i = 0, length = lines.length; i < length; i++) {\n startColumns[i] = getFirstNonBlankColumn(lines[i], 1);\n endColumns[i] = getLastNonBlankColumn(lines[i], 1);\n }\n this.lines = lines;\n this._startColumns = startColumns;\n this._endColumns = endColumns;\n }\n getElements() {\n const elements = [];\n for (let i = 0, len = this.lines.length; i < len; i++) {\n elements[i] = this.lines[i].substring(this._startColumns[i] - 1, this._endColumns[i] - 1);\n }\n return elements;\n }\n getStrictElement(index) {\n return this.lines[index];\n }\n getStartLineNumber(i) {\n return i + 1;\n }\n getEndLineNumber(i) {\n return i + 1;\n }\n createCharSequence(shouldIgnoreTrimWhitespace, startIndex, endIndex) {\n const charCodes = [];\n const lineNumbers = [];\n const columns = [];\n let len = 0;\n for (let index = startIndex; index <= endIndex; index++) {\n const lineContent = this.lines[index];\n const startColumn = (shouldIgnoreTrimWhitespace ? this._startColumns[index] : 1);\n const endColumn = (shouldIgnoreTrimWhitespace ? this._endColumns[index] : lineContent.length + 1);\n for (let col = startColumn; col < endColumn; col++) {\n charCodes[len] = lineContent.charCodeAt(col - 1);\n lineNumbers[len] = index + 1;\n columns[len] = col;\n len++;\n }\n if (!shouldIgnoreTrimWhitespace && index < endIndex) {\n // Add \\n if trim whitespace is not ignored\n charCodes[len] = 10 /* CharCode.LineFeed */;\n lineNumbers[len] = index + 1;\n columns[len] = lineContent.length + 1;\n len++;\n }\n }\n return new CharSequence(charCodes, lineNumbers, columns);\n }\n}\nclass CharSequence {\n constructor(charCodes, lineNumbers, columns) {\n this._charCodes = charCodes;\n this._lineNumbers = lineNumbers;\n this._columns = columns;\n }\n toString() {\n return ('[' + this._charCodes.map((s, idx) => (s === 10 /* CharCode.LineFeed */ ? '\\\\n' : String.fromCharCode(s)) + `-(${this._lineNumbers[idx]},${this._columns[idx]})`).join(', ') + ']');\n }\n _assertIndex(index, arr) {\n if (index < 0 || index >= arr.length) {\n throw new Error(`Illegal index`);\n }\n }\n getElements() {\n return this._charCodes;\n }\n getStartLineNumber(i) {\n if (i > 0 && i === this._lineNumbers.length) {\n // the start line number of the element after the last element\n // is the end line number of the last element\n return this.getEndLineNumber(i - 1);\n }\n this._assertIndex(i, this._lineNumbers);\n return this._lineNumbers[i];\n }\n getEndLineNumber(i) {\n if (i === -1) {\n // the end line number of the element before the first element\n // is the start line number of the first element\n return this.getStartLineNumber(i + 1);\n }\n this._assertIndex(i, this._lineNumbers);\n if (this._charCodes[i] === 10 /* CharCode.LineFeed */) {\n return this._lineNumbers[i] + 1;\n }\n return this._lineNumbers[i];\n }\n getStartColumn(i) {\n if (i > 0 && i === this._columns.length) {\n // the start column of the element after the last element\n // is the end column of the last element\n return this.getEndColumn(i - 1);\n }\n this._assertIndex(i, this._columns);\n return this._columns[i];\n }\n getEndColumn(i) {\n if (i === -1) {\n // the end column of the element before the first element\n // is the start column of the first element\n return this.getStartColumn(i + 1);\n }\n this._assertIndex(i, this._columns);\n if (this._charCodes[i] === 10 /* CharCode.LineFeed */) {\n return 1;\n }\n return this._columns[i] + 1;\n }\n}\nclass CharChange {\n constructor(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn) {\n this.originalStartLineNumber = originalStartLineNumber;\n this.originalStartColumn = originalStartColumn;\n this.originalEndLineNumber = originalEndLineNumber;\n this.originalEndColumn = originalEndColumn;\n this.modifiedStartLineNumber = modifiedStartLineNumber;\n this.modifiedStartColumn = modifiedStartColumn;\n this.modifiedEndLineNumber = modifiedEndLineNumber;\n this.modifiedEndColumn = modifiedEndColumn;\n }\n static createFromDiffChange(diffChange, originalCharSequence, modifiedCharSequence) {\n const originalStartLineNumber = originalCharSequence.getStartLineNumber(diffChange.originalStart);\n const originalStartColumn = originalCharSequence.getStartColumn(diffChange.originalStart);\n const originalEndLineNumber = originalCharSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1);\n const originalEndColumn = originalCharSequence.getEndColumn(diffChange.originalStart + diffChange.originalLength - 1);\n const modifiedStartLineNumber = modifiedCharSequence.getStartLineNumber(diffChange.modifiedStart);\n const modifiedStartColumn = modifiedCharSequence.getStartColumn(diffChange.modifiedStart);\n const modifiedEndLineNumber = modifiedCharSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n const modifiedEndColumn = modifiedCharSequence.getEndColumn(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n return new CharChange(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn);\n }\n}\nfunction postProcessCharChanges(rawChanges) {\n if (rawChanges.length <= 1) {\n return rawChanges;\n }\n const result = [rawChanges[0]];\n let prevChange = result[0];\n for (let i = 1, len = rawChanges.length; i < len; i++) {\n const currChange = rawChanges[i];\n const originalMatchingLength = currChange.originalStart - (prevChange.originalStart + prevChange.originalLength);\n const modifiedMatchingLength = currChange.modifiedStart - (prevChange.modifiedStart + prevChange.modifiedLength);\n // Both of the above should be equal, but the continueProcessingPredicate may prevent this from being true\n const matchingLength = Math.min(originalMatchingLength, modifiedMatchingLength);\n if (matchingLength < MINIMUM_MATCHING_CHARACTER_LENGTH) {\n // Merge the current change into the previous one\n prevChange.originalLength = (currChange.originalStart + currChange.originalLength) - prevChange.originalStart;\n prevChange.modifiedLength = (currChange.modifiedStart + currChange.modifiedLength) - prevChange.modifiedStart;\n }\n else {\n // Add the current change\n result.push(currChange);\n prevChange = currChange;\n }\n }\n return result;\n}\nclass LineChange {\n constructor(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges) {\n this.originalStartLineNumber = originalStartLineNumber;\n this.originalEndLineNumber = originalEndLineNumber;\n this.modifiedStartLineNumber = modifiedStartLineNumber;\n this.modifiedEndLineNumber = modifiedEndLineNumber;\n this.charChanges = charChanges;\n }\n static createFromDiffResult(shouldIgnoreTrimWhitespace, diffChange, originalLineSequence, modifiedLineSequence, continueCharDiff, shouldComputeCharChanges, shouldPostProcessCharChanges) {\n let originalStartLineNumber;\n let originalEndLineNumber;\n let modifiedStartLineNumber;\n let modifiedEndLineNumber;\n let charChanges = undefined;\n if (diffChange.originalLength === 0) {\n originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart) - 1;\n originalEndLineNumber = 0;\n }\n else {\n originalStartLineNumber = originalLineSequence.getStartLineNumber(diffChange.originalStart);\n originalEndLineNumber = originalLineSequence.getEndLineNumber(diffChange.originalStart + diffChange.originalLength - 1);\n }\n if (diffChange.modifiedLength === 0) {\n modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart) - 1;\n modifiedEndLineNumber = 0;\n }\n else {\n modifiedStartLineNumber = modifiedLineSequence.getStartLineNumber(diffChange.modifiedStart);\n modifiedEndLineNumber = modifiedLineSequence.getEndLineNumber(diffChange.modifiedStart + diffChange.modifiedLength - 1);\n }\n if (shouldComputeCharChanges && diffChange.originalLength > 0 && diffChange.originalLength < 20 && diffChange.modifiedLength > 0 && diffChange.modifiedLength < 20 && continueCharDiff()) {\n // Compute character changes for diff chunks of at most 20 lines...\n const originalCharSequence = originalLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.originalStart, diffChange.originalStart + diffChange.originalLength - 1);\n const modifiedCharSequence = modifiedLineSequence.createCharSequence(shouldIgnoreTrimWhitespace, diffChange.modifiedStart, diffChange.modifiedStart + diffChange.modifiedLength - 1);\n if (originalCharSequence.getElements().length > 0 && modifiedCharSequence.getElements().length > 0) {\n let rawChanges = computeDiff(originalCharSequence, modifiedCharSequence, continueCharDiff, true).changes;\n if (shouldPostProcessCharChanges) {\n rawChanges = postProcessCharChanges(rawChanges);\n }\n charChanges = [];\n for (let i = 0, length = rawChanges.length; i < length; i++) {\n charChanges.push(CharChange.createFromDiffChange(rawChanges[i], originalCharSequence, modifiedCharSequence));\n }\n }\n }\n return new LineChange(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges);\n }\n}\nclass DiffComputer {\n constructor(originalLines, modifiedLines, opts) {\n this.shouldComputeCharChanges = opts.shouldComputeCharChanges;\n this.shouldPostProcessCharChanges = opts.shouldPostProcessCharChanges;\n this.shouldIgnoreTrimWhitespace = opts.shouldIgnoreTrimWhitespace;\n this.shouldMakePrettyDiff = opts.shouldMakePrettyDiff;\n this.originalLines = originalLines;\n this.modifiedLines = modifiedLines;\n this.original = new LineSequence(originalLines);\n this.modified = new LineSequence(modifiedLines);\n this.continueLineDiff = createContinueProcessingPredicate(opts.maxComputationTime);\n this.continueCharDiff = createContinueProcessingPredicate(opts.maxComputationTime === 0 ? 0 : Math.min(opts.maxComputationTime, 5000)); // never run after 5s for character changes...\n }\n computeDiff() {\n if (this.original.lines.length === 1 && this.original.lines[0].length === 0) {\n // empty original => fast path\n if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) {\n return {\n quitEarly: false,\n changes: []\n };\n }\n return {\n quitEarly: false,\n changes: [{\n originalStartLineNumber: 1,\n originalEndLineNumber: 1,\n modifiedStartLineNumber: 1,\n modifiedEndLineNumber: this.modified.lines.length,\n charChanges: undefined\n }]\n };\n }\n if (this.modified.lines.length === 1 && this.modified.lines[0].length === 0) {\n // empty modified => fast path\n return {\n quitEarly: false,\n changes: [{\n originalStartLineNumber: 1,\n originalEndLineNumber: this.original.lines.length,\n modifiedStartLineNumber: 1,\n modifiedEndLineNumber: 1,\n charChanges: undefined\n }]\n };\n }\n const diffResult = computeDiff(this.original, this.modified, this.continueLineDiff, this.shouldMakePrettyDiff);\n const rawChanges = diffResult.changes;\n const quitEarly = diffResult.quitEarly;\n // The diff is always computed with ignoring trim whitespace\n // This ensures we get the prettiest diff\n if (this.shouldIgnoreTrimWhitespace) {\n const lineChanges = [];\n for (let i = 0, length = rawChanges.length; i < length; i++) {\n lineChanges.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, rawChanges[i], this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges));\n }\n return {\n quitEarly: quitEarly,\n changes: lineChanges\n };\n }\n // Need to post-process and introduce changes where the trim whitespace is different\n // Note that we are looping starting at -1 to also cover the lines before the first change\n const result = [];\n let originalLineIndex = 0;\n let modifiedLineIndex = 0;\n for (let i = -1 /* !!!! */, len = rawChanges.length; i < len; i++) {\n const nextChange = (i + 1 < len ? rawChanges[i + 1] : null);\n const originalStop = (nextChange ? nextChange.originalStart : this.originalLines.length);\n const modifiedStop = (nextChange ? nextChange.modifiedStart : this.modifiedLines.length);\n while (originalLineIndex < originalStop && modifiedLineIndex < modifiedStop) {\n const originalLine = this.originalLines[originalLineIndex];\n const modifiedLine = this.modifiedLines[modifiedLineIndex];\n if (originalLine !== modifiedLine) {\n // These lines differ only in trim whitespace\n // Check the leading whitespace\n {\n let originalStartColumn = getFirstNonBlankColumn(originalLine, 1);\n let modifiedStartColumn = getFirstNonBlankColumn(modifiedLine, 1);\n while (originalStartColumn > 1 && modifiedStartColumn > 1) {\n const originalChar = originalLine.charCodeAt(originalStartColumn - 2);\n const modifiedChar = modifiedLine.charCodeAt(modifiedStartColumn - 2);\n if (originalChar !== modifiedChar) {\n break;\n }\n originalStartColumn--;\n modifiedStartColumn--;\n }\n if (originalStartColumn > 1 || modifiedStartColumn > 1) {\n this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, 1, originalStartColumn, modifiedLineIndex + 1, 1, modifiedStartColumn);\n }\n }\n // Check the trailing whitespace\n {\n let originalEndColumn = getLastNonBlankColumn(originalLine, 1);\n let modifiedEndColumn = getLastNonBlankColumn(modifiedLine, 1);\n const originalMaxColumn = originalLine.length + 1;\n const modifiedMaxColumn = modifiedLine.length + 1;\n while (originalEndColumn < originalMaxColumn && modifiedEndColumn < modifiedMaxColumn) {\n const originalChar = originalLine.charCodeAt(originalEndColumn - 1);\n const modifiedChar = originalLine.charCodeAt(modifiedEndColumn - 1);\n if (originalChar !== modifiedChar) {\n break;\n }\n originalEndColumn++;\n modifiedEndColumn++;\n }\n if (originalEndColumn < originalMaxColumn || modifiedEndColumn < modifiedMaxColumn) {\n this._pushTrimWhitespaceCharChange(result, originalLineIndex + 1, originalEndColumn, originalMaxColumn, modifiedLineIndex + 1, modifiedEndColumn, modifiedMaxColumn);\n }\n }\n }\n originalLineIndex++;\n modifiedLineIndex++;\n }\n if (nextChange) {\n // Emit the actual change\n result.push(LineChange.createFromDiffResult(this.shouldIgnoreTrimWhitespace, nextChange, this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges));\n originalLineIndex += nextChange.originalLength;\n modifiedLineIndex += nextChange.modifiedLength;\n }\n }\n return {\n quitEarly: quitEarly,\n changes: result\n };\n }\n _pushTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) {\n if (this._mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn)) {\n // Merged into previous\n return;\n }\n let charChanges = undefined;\n if (this.shouldComputeCharChanges) {\n charChanges = [new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn)];\n }\n result.push(new LineChange(originalLineNumber, originalLineNumber, modifiedLineNumber, modifiedLineNumber, charChanges));\n }\n _mergeTrimWhitespaceCharChange(result, originalLineNumber, originalStartColumn, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedEndColumn) {\n const len = result.length;\n if (len === 0) {\n return false;\n }\n const prevChange = result[len - 1];\n if (prevChange.originalEndLineNumber === 0 || prevChange.modifiedEndLineNumber === 0) {\n // Don't merge with inserts/deletes\n return false;\n }\n if (prevChange.originalEndLineNumber === originalLineNumber && prevChange.modifiedEndLineNumber === modifiedLineNumber) {\n if (this.shouldComputeCharChanges && prevChange.charChanges) {\n prevChange.charChanges.push(new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn));\n }\n return true;\n }\n if (prevChange.originalEndLineNumber + 1 === originalLineNumber && prevChange.modifiedEndLineNumber + 1 === modifiedLineNumber) {\n prevChange.originalEndLineNumber = originalLineNumber;\n prevChange.modifiedEndLineNumber = modifiedLineNumber;\n if (this.shouldComputeCharChanges && prevChange.charChanges) {\n prevChange.charChanges.push(new CharChange(originalLineNumber, originalStartColumn, originalLineNumber, originalEndColumn, modifiedLineNumber, modifiedStartColumn, modifiedLineNumber, modifiedEndColumn));\n }\n return true;\n }\n return false;\n }\n}\nfunction getFirstNonBlankColumn(txt, defaultValue) {\n const r = firstNonWhitespaceIndex(txt);\n if (r === -1) {\n return defaultValue;\n }\n return r + 1;\n}\nfunction getLastNonBlankColumn(txt, defaultValue) {\n const r = lastNonWhitespaceIndex(txt);\n if (r === -1) {\n return defaultValue;\n }\n return r + 2;\n}\nfunction createContinueProcessingPredicate(maximumRuntime) {\n if (maximumRuntime === 0) {\n return () => true;\n }\n const startTime = Date.now();\n return () => {\n return Date.now() - startTime < maximumRuntime;\n };\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/core/offsetRange.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * A range of offsets (0-based).\n*/\nclass OffsetRange {\n static addRange(range, sortedRanges) {\n let i = 0;\n while (i < sortedRanges.length && sortedRanges[i].endExclusive < range.start) {\n i++;\n }\n let j = i;\n while (j < sortedRanges.length && sortedRanges[j].start <= range.endExclusive) {\n j++;\n }\n if (i === j) {\n sortedRanges.splice(i, 0, range);\n }\n else {\n const start = Math.min(range.start, sortedRanges[i].start);\n const end = Math.max(range.endExclusive, sortedRanges[j - 1].endExclusive);\n sortedRanges.splice(i, j - i, new OffsetRange(start, end));\n }\n }\n static tryCreate(start, endExclusive) {\n if (start > endExclusive) {\n return undefined;\n }\n return new OffsetRange(start, endExclusive);\n }\n constructor(start, endExclusive) {\n this.start = start;\n this.endExclusive = endExclusive;\n if (start > endExclusive) {\n throw new BugIndicatingError(`Invalid range: ${this.toString()}`);\n }\n }\n get isEmpty() {\n return this.start === this.endExclusive;\n }\n delta(offset) {\n return new OffsetRange(this.start + offset, this.endExclusive + offset);\n }\n get length() {\n return this.endExclusive - this.start;\n }\n toString() {\n return `[${this.start}, ${this.endExclusive})`;\n }\n equals(other) {\n return this.start === other.start && this.endExclusive === other.endExclusive;\n }\n containsRange(other) {\n return this.start <= other.start && other.endExclusive <= this.endExclusive;\n }\n contains(offset) {\n return this.start <= offset && offset < this.endExclusive;\n }\n /**\n * for all numbers n: range1.contains(n) or range2.contains(n) => range1.join(range2).contains(n)\n * The joined range is the smallest range that contains both ranges.\n */\n join(other) {\n return new OffsetRange(Math.min(this.start, other.start), Math.max(this.endExclusive, other.endExclusive));\n }\n /**\n * for all numbers n: range1.contains(n) and range2.contains(n) <=> range1.intersect(range2).contains(n)\n *\n * The resulting range is empty if the ranges do not intersect, but touch.\n * If the ranges don't even touch, the result is undefined.\n */\n intersect(other) {\n const start = Math.max(this.start, other.start);\n const end = Math.min(this.endExclusive, other.endExclusive);\n if (start <= end) {\n return new OffsetRange(start, end);\n }\n return undefined;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/algorithms/diffAlgorithm.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\nclass DiffAlgorithmResult {\n static trivial(seq1, seq2) {\n return new DiffAlgorithmResult([new SequenceDiff(new OffsetRange(0, seq1.length), new OffsetRange(0, seq2.length))], false);\n }\n static trivialTimedOut(seq1, seq2) {\n return new DiffAlgorithmResult([new SequenceDiff(new OffsetRange(0, seq1.length), new OffsetRange(0, seq2.length))], true);\n }\n constructor(diffs, \n /**\n * Indicates if the time out was reached.\n * In that case, the diffs might be an approximation and the user should be asked to rerun the diff with more time.\n */\n hitTimeout) {\n this.diffs = diffs;\n this.hitTimeout = hitTimeout;\n }\n}\nclass SequenceDiff {\n constructor(seq1Range, seq2Range) {\n this.seq1Range = seq1Range;\n this.seq2Range = seq2Range;\n }\n reverse() {\n return new SequenceDiff(this.seq2Range, this.seq1Range);\n }\n toString() {\n return `${this.seq1Range} <-> ${this.seq2Range}`;\n }\n join(other) {\n return new SequenceDiff(this.seq1Range.join(other.seq1Range), this.seq2Range.join(other.seq2Range));\n }\n delta(offset) {\n if (offset === 0) {\n return this;\n }\n return new SequenceDiff(this.seq1Range.delta(offset), this.seq2Range.delta(offset));\n }\n}\nclass InfiniteTimeout {\n isValid() {\n return true;\n }\n}\nInfiniteTimeout.instance = new InfiniteTimeout();\nclass DateTimeout {\n constructor(timeout) {\n this.timeout = timeout;\n this.startTime = Date.now();\n this.valid = true;\n if (timeout <= 0) {\n throw new BugIndicatingError('timeout must be positive');\n }\n }\n // Recommendation: Set a log-point `{this.disable()}` in the body\n isValid() {\n const valid = Date.now() - this.startTime < this.timeout;\n if (!valid && this.valid) {\n this.valid = false; // timeout reached\n // eslint-disable-next-line no-debugger\n debugger; // WARNING: Most likely debugging caused the timeout. Call `this.disable()` to continue without timing out.\n }\n return this.valid;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/algorithms/utils.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nclass Array2D {\n constructor(width, height) {\n this.width = width;\n this.height = height;\n this.array = [];\n this.array = new Array(width * height);\n }\n get(x, y) {\n return this.array[x + y * this.width];\n }\n set(x, y, value) {\n this.array[x + y * this.width] = value;\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/algorithms/dynamicProgrammingDiffing.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n\n/**\n * A O(MN) diffing algorithm that supports a score function.\n * The algorithm can be improved by processing the 2d array diagonally.\n*/\nclass DynamicProgrammingDiffing {\n compute(sequence1, sequence2, timeout = InfiniteTimeout.instance, equalityScore) {\n if (sequence1.length === 0 || sequence2.length === 0) {\n return DiffAlgorithmResult.trivial(sequence1, sequence2);\n }\n /**\n * lcsLengths.get(i, j): Length of the longest common subsequence of sequence1.substring(0, i + 1) and sequence2.substring(0, j + 1).\n */\n const lcsLengths = new Array2D(sequence1.length, sequence2.length);\n const directions = new Array2D(sequence1.length, sequence2.length);\n const lengths = new Array2D(sequence1.length, sequence2.length);\n // ==== Initializing lcsLengths ====\n for (let s1 = 0; s1 < sequence1.length; s1++) {\n for (let s2 = 0; s2 < sequence2.length; s2++) {\n if (!timeout.isValid()) {\n return DiffAlgorithmResult.trivialTimedOut(sequence1, sequence2);\n }\n const horizontalLen = s1 === 0 ? 0 : lcsLengths.get(s1 - 1, s2);\n const verticalLen = s2 === 0 ? 0 : lcsLengths.get(s1, s2 - 1);\n let extendedSeqScore;\n if (sequence1.getElement(s1) === sequence2.getElement(s2)) {\n if (s1 === 0 || s2 === 0) {\n extendedSeqScore = 0;\n }\n else {\n extendedSeqScore = lcsLengths.get(s1 - 1, s2 - 1);\n }\n if (s1 > 0 && s2 > 0 && directions.get(s1 - 1, s2 - 1) === 3) {\n // Prefer consecutive diagonals\n extendedSeqScore += lengths.get(s1 - 1, s2 - 1);\n }\n extendedSeqScore += (equalityScore ? equalityScore(s1, s2) : 1);\n }\n else {\n extendedSeqScore = -1;\n }\n const newValue = Math.max(horizontalLen, verticalLen, extendedSeqScore);\n if (newValue === extendedSeqScore) {\n // Prefer diagonals\n const prevLen = s1 > 0 && s2 > 0 ? lengths.get(s1 - 1, s2 - 1) : 0;\n lengths.set(s1, s2, prevLen + 1);\n directions.set(s1, s2, 3);\n }\n else if (newValue === horizontalLen) {\n lengths.set(s1, s2, 0);\n directions.set(s1, s2, 1);\n }\n else if (newValue === verticalLen) {\n lengths.set(s1, s2, 0);\n directions.set(s1, s2, 2);\n }\n lcsLengths.set(s1, s2, newValue);\n }\n }\n // ==== Backtracking ====\n const result = [];\n let lastAligningPosS1 = sequence1.length;\n let lastAligningPosS2 = sequence2.length;\n function reportDecreasingAligningPositions(s1, s2) {\n if (s1 + 1 !== lastAligningPosS1 || s2 + 1 !== lastAligningPosS2) {\n result.push(new SequenceDiff(new OffsetRange(s1 + 1, lastAligningPosS1), new OffsetRange(s2 + 1, lastAligningPosS2)));\n }\n lastAligningPosS1 = s1;\n lastAligningPosS2 = s2;\n }\n let s1 = sequence1.length - 1;\n let s2 = sequence2.length - 1;\n while (s1 >= 0 && s2 >= 0) {\n if (directions.get(s1, s2) === 3) {\n reportDecreasingAligningPositions(s1, s2);\n s1--;\n s2--;\n }\n else {\n if (directions.get(s1, s2) === 1) {\n s1--;\n }\n else {\n s2--;\n }\n }\n }\n reportDecreasingAligningPositions(-1, -1);\n result.reverse();\n return new DiffAlgorithmResult(result, false);\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/algorithms/joinSequenceDiffs.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\nfunction optimizeSequenceDiffs(sequence1, sequence2, sequenceDiffs) {\n let result = sequenceDiffs;\n result = joinSequenceDiffs(sequence1, sequence2, result);\n result = shiftSequenceDiffs(sequence1, sequence2, result);\n return result;\n}\nfunction smoothenSequenceDiffs(sequence1, sequence2, sequenceDiffs) {\n const result = [];\n for (const s of sequenceDiffs) {\n const last = result[result.length - 1];\n if (!last) {\n result.push(s);\n continue;\n }\n if (s.seq1Range.start - last.seq1Range.endExclusive <= 2 || s.seq2Range.start - last.seq2Range.endExclusive <= 2) {\n result[result.length - 1] = new SequenceDiff(last.seq1Range.join(s.seq1Range), last.seq2Range.join(s.seq2Range));\n }\n else {\n result.push(s);\n }\n }\n return result;\n}\nfunction removeRandomMatches(sequence1, sequence2, sequenceDiffs) {\n let diffs = sequenceDiffs;\n if (diffs.length === 0) {\n return diffs;\n }\n let counter = 0;\n let shouldRepeat;\n do {\n shouldRepeat = false;\n const result = [\n diffs[0]\n ];\n for (let i = 1; i < diffs.length; i++) {\n const cur = diffs[i];\n const lastResult = result[result.length - 1];\n function shouldJoinDiffs(before, after) {\n const unchangedRange = new OffsetRange(lastResult.seq1Range.endExclusive, cur.seq1Range.start);\n const unchangedLineCount = sequence1.countLinesIn(unchangedRange);\n if (unchangedLineCount > 5 || unchangedRange.length > 500) {\n return false;\n }\n const unchangedText = sequence1.getText(unchangedRange).trim();\n if (unchangedText.length > 20 || unchangedText.split(/\\r\\n|\\r|\\n/).length > 1) {\n return false;\n }\n const beforeLineCount1 = sequence1.countLinesIn(before.seq1Range);\n const beforeSeq1Length = before.seq1Range.length;\n const beforeLineCount2 = sequence2.countLinesIn(before.seq2Range);\n const beforeSeq2Length = before.seq2Range.length;\n const afterLineCount1 = sequence1.countLinesIn(after.seq1Range);\n const afterSeq1Length = after.seq1Range.length;\n const afterLineCount2 = sequence2.countLinesIn(after.seq2Range);\n const afterSeq2Length = after.seq2Range.length;\n // TODO: Maybe a neural net can be used to derive the result from these numbers\n const max = 2 * 40 + 50;\n function cap(v) {\n return Math.min(v, max);\n }\n if (Math.pow(Math.pow(cap(beforeLineCount1 * 40 + beforeSeq1Length), 1.5) + Math.pow(cap(beforeLineCount2 * 40 + beforeSeq2Length), 1.5), 1.5)\n + Math.pow(Math.pow(cap(afterLineCount1 * 40 + afterSeq1Length), 1.5) + Math.pow(cap(afterLineCount2 * 40 + afterSeq2Length), 1.5), 1.5) > (Math.pow((Math.pow(max, 1.5)), 1.5)) * 1.3) {\n return true;\n }\n return false;\n }\n const shouldJoin = shouldJoinDiffs(lastResult, cur);\n if (shouldJoin) {\n shouldRepeat = true;\n result[result.length - 1] = result[result.length - 1].join(cur);\n }\n else {\n result.push(cur);\n }\n }\n diffs = result;\n } while (counter++ < 10 && shouldRepeat);\n return diffs;\n}\n/**\n * This function fixes issues like this:\n * ```\n * import { Baz, Bar } from \"foo\";\n * ```\n * <->\n * ```\n * import { Baz, Bar, Foo } from \"foo\";\n * ```\n * Computed diff: [ {Add \",\" after Bar}, {Add \"Foo \" after space} }\n * Improved diff: [{Add \", Foo\" after Bar}]\n */\nfunction joinSequenceDiffs(sequence1, sequence2, sequenceDiffs) {\n if (sequenceDiffs.length === 0) {\n return sequenceDiffs;\n }\n const result = [];\n result.push(sequenceDiffs[0]);\n // First move them all to the left as much as possible and join them if possible\n for (let i = 1; i < sequenceDiffs.length; i++) {\n const prevResult = result[result.length - 1];\n let cur = sequenceDiffs[i];\n if (cur.seq1Range.isEmpty || cur.seq2Range.isEmpty) {\n const length = cur.seq1Range.start - prevResult.seq1Range.endExclusive;\n let d;\n for (d = 1; d <= length; d++) {\n if (sequence1.getElement(cur.seq1Range.start - d) !== sequence1.getElement(cur.seq1Range.endExclusive - d) ||\n sequence2.getElement(cur.seq2Range.start - d) !== sequence2.getElement(cur.seq2Range.endExclusive - d)) {\n break;\n }\n }\n d--;\n if (d === length) {\n // Merge previous and current diff\n result[result.length - 1] = new SequenceDiff(new OffsetRange(prevResult.seq1Range.start, cur.seq1Range.endExclusive - length), new OffsetRange(prevResult.seq2Range.start, cur.seq2Range.endExclusive - length));\n continue;\n }\n cur = cur.delta(-d);\n }\n result.push(cur);\n }\n const result2 = [];\n // Then move them all to the right and join them again if possible\n for (let i = 0; i < result.length - 1; i++) {\n const nextResult = result[i + 1];\n let cur = result[i];\n if (cur.seq1Range.isEmpty || cur.seq2Range.isEmpty) {\n const length = nextResult.seq1Range.start - cur.seq1Range.endExclusive;\n let d;\n for (d = 0; d < length; d++) {\n if (sequence1.getElement(cur.seq1Range.start + d) !== sequence1.getElement(cur.seq1Range.endExclusive + d) ||\n sequence2.getElement(cur.seq2Range.start + d) !== sequence2.getElement(cur.seq2Range.endExclusive + d)) {\n break;\n }\n }\n if (d === length) {\n // Merge previous and current diff, write to result!\n result[i + 1] = new SequenceDiff(new OffsetRange(cur.seq1Range.start + length, nextResult.seq1Range.endExclusive), new OffsetRange(cur.seq2Range.start + length, nextResult.seq2Range.endExclusive));\n continue;\n }\n if (d > 0) {\n cur = cur.delta(d);\n }\n }\n result2.push(cur);\n }\n if (result.length > 0) {\n result2.push(result[result.length - 1]);\n }\n return result2;\n}\n// align character level diffs at whitespace characters\n// import { IBar } from \"foo\";\n// import { I[Arr, I]Bar } from \"foo\";\n// ->\n// import { [IArr, ]IBar } from \"foo\";\n// import { ITransaction, observableValue, transaction } from 'vs/base/common/observable';\n// import { ITransaction, observable[FromEvent, observable]Value, transaction } from 'vs/base/common/observable';\n// ->\n// import { ITransaction, [observableFromEvent, ]observableValue, transaction } from 'vs/base/common/observable';\n// collectBrackets(level + 1, levelPerBracketType);\n// collectBrackets(level + 1, levelPerBracket[ + 1, levelPerBracket]Type);\n// ->\n// collectBrackets(level + 1, [levelPerBracket + 1, ]levelPerBracketType);\nfunction shiftSequenceDiffs(sequence1, sequence2, sequenceDiffs) {\n if (!sequence1.getBoundaryScore || !sequence2.getBoundaryScore) {\n return sequenceDiffs;\n }\n for (let i = 0; i < sequenceDiffs.length; i++) {\n const prevDiff = (i > 0 ? sequenceDiffs[i - 1] : undefined);\n const diff = sequenceDiffs[i];\n const nextDiff = (i + 1 < sequenceDiffs.length ? sequenceDiffs[i + 1] : undefined);\n const seq1ValidRange = new OffsetRange(prevDiff ? prevDiff.seq1Range.start + 1 : 0, nextDiff ? nextDiff.seq1Range.endExclusive - 1 : sequence1.length);\n const seq2ValidRange = new OffsetRange(prevDiff ? prevDiff.seq2Range.start + 1 : 0, nextDiff ? nextDiff.seq2Range.endExclusive - 1 : sequence2.length);\n if (diff.seq1Range.isEmpty) {\n sequenceDiffs[i] = shiftDiffToBetterPosition(diff, sequence1, sequence2, seq1ValidRange, seq2ValidRange);\n }\n else if (diff.seq2Range.isEmpty) {\n sequenceDiffs[i] = shiftDiffToBetterPosition(diff.reverse(), sequence2, sequence1, seq2ValidRange, seq1ValidRange).reverse();\n }\n }\n return sequenceDiffs;\n}\nfunction shiftDiffToBetterPosition(diff, sequence1, sequence2, seq1ValidRange, seq2ValidRange) {\n const maxShiftLimit = 100; // To prevent performance issues\n // don't touch previous or next!\n let deltaBefore = 1;\n while (diff.seq1Range.start - deltaBefore >= seq1ValidRange.start &&\n diff.seq2Range.start - deltaBefore >= seq2ValidRange.start &&\n sequence2.getElement(diff.seq2Range.start - deltaBefore) ===\n sequence2.getElement(diff.seq2Range.endExclusive - deltaBefore) && deltaBefore < maxShiftLimit) {\n deltaBefore++;\n }\n deltaBefore--;\n let deltaAfter = 0;\n while (diff.seq1Range.start + deltaAfter < seq1ValidRange.endExclusive &&\n diff.seq2Range.endExclusive + deltaAfter < seq2ValidRange.endExclusive &&\n sequence2.getElement(diff.seq2Range.start + deltaAfter) ===\n sequence2.getElement(diff.seq2Range.endExclusive + deltaAfter) && deltaAfter < maxShiftLimit) {\n deltaAfter++;\n }\n if (deltaBefore === 0 && deltaAfter === 0) {\n return diff;\n }\n // Visualize `[sequence1.text, diff.seq1Range.start + deltaAfter]`\n // and `[sequence2.text, diff.seq2Range.start + deltaAfter, diff.seq2Range.endExclusive + deltaAfter]`\n let bestDelta = 0;\n let bestScore = -1;\n // find best scored delta\n for (let delta = -deltaBefore; delta <= deltaAfter; delta++) {\n const seq2OffsetStart = diff.seq2Range.start + delta;\n const seq2OffsetEndExclusive = diff.seq2Range.endExclusive + delta;\n const seq1Offset = diff.seq1Range.start + delta;\n const score = sequence1.getBoundaryScore(seq1Offset) + sequence2.getBoundaryScore(seq2OffsetStart) + sequence2.getBoundaryScore(seq2OffsetEndExclusive);\n if (score > bestScore) {\n bestScore = score;\n bestDelta = delta;\n }\n }\n return diff.delta(bestDelta);\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/algorithms/myersDiffAlgorithm.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n/**\n * An O(ND) diff algorithm that has a quadratic space worst-case complexity.\n*/\nclass MyersDiffAlgorithm {\n compute(seq1, seq2, timeout = InfiniteTimeout.instance) {\n // These are common special cases.\n // The early return improves performance dramatically.\n if (seq1.length === 0 || seq2.length === 0) {\n return DiffAlgorithmResult.trivial(seq1, seq2);\n }\n function getXAfterSnake(x, y) {\n while (x < seq1.length && y < seq2.length && seq1.getElement(x) === seq2.getElement(y)) {\n x++;\n y++;\n }\n return x;\n }\n let d = 0;\n // V[k]: X value of longest d-line that ends in diagonal k.\n // d-line: path from (0,0) to (x,y) that uses exactly d non-diagonals.\n // diagonal k: Set of points (x,y) with x-y = k.\n const V = new FastInt32Array();\n V.set(0, getXAfterSnake(0, 0));\n const paths = new FastArrayNegativeIndices();\n paths.set(0, V.get(0) === 0 ? null : new SnakePath(null, 0, 0, V.get(0)));\n let k = 0;\n loop: while (true) {\n d++;\n if (!timeout.isValid()) {\n return DiffAlgorithmResult.trivialTimedOut(seq1, seq2);\n }\n // The paper has `for (k = -d; k <= d; k += 2)`, but we can ignore diagonals that cannot influence the result.\n const lowerBound = -Math.min(d, seq2.length + (d % 2));\n const upperBound = Math.min(d, seq1.length + (d % 2));\n for (k = lowerBound; k <= upperBound; k += 2) {\n // We can use the X values of (d-1)-lines to compute X value of the longest d-lines.\n const maxXofDLineTop = k === upperBound ? -1 : V.get(k + 1); // We take a vertical non-diagonal (add a symbol in seq1)\n const maxXofDLineLeft = k === lowerBound ? -1 : V.get(k - 1) + 1; // We take a horizontal non-diagonal (+1 x) (delete a symbol in seq1)\n const x = Math.min(Math.max(maxXofDLineTop, maxXofDLineLeft), seq1.length);\n const y = x - k;\n if (x > seq1.length || y > seq2.length) {\n // This diagonal is irrelevant for the result.\n // TODO: Don't pay the cost for this in the next iteration.\n continue;\n }\n const newMaxX = getXAfterSnake(x, y);\n V.set(k, newMaxX);\n const lastPath = x === maxXofDLineTop ? paths.get(k + 1) : paths.get(k - 1);\n paths.set(k, newMaxX !== x ? new SnakePath(lastPath, x, y, newMaxX - x) : lastPath);\n if (V.get(k) === seq1.length && V.get(k) - k === seq2.length) {\n break loop;\n }\n }\n }\n let path = paths.get(k);\n const result = [];\n let lastAligningPosS1 = seq1.length;\n let lastAligningPosS2 = seq2.length;\n while (true) {\n const endX = path ? path.x + path.length : 0;\n const endY = path ? path.y + path.length : 0;\n if (endX !== lastAligningPosS1 || endY !== lastAligningPosS2) {\n result.push(new SequenceDiff(new OffsetRange(endX, lastAligningPosS1), new OffsetRange(endY, lastAligningPosS2)));\n }\n if (!path) {\n break;\n }\n lastAligningPosS1 = path.x;\n lastAligningPosS2 = path.y;\n path = path.prev;\n }\n result.reverse();\n return new DiffAlgorithmResult(result, false);\n }\n}\nclass SnakePath {\n constructor(prev, x, y, length) {\n this.prev = prev;\n this.x = x;\n this.y = y;\n this.length = length;\n }\n}\n/**\n * An array that supports fast negative indices.\n*/\nclass FastInt32Array {\n constructor() {\n this.positiveArr = new Int32Array(10);\n this.negativeArr = new Int32Array(10);\n }\n get(idx) {\n if (idx < 0) {\n idx = -idx - 1;\n return this.negativeArr[idx];\n }\n else {\n return this.positiveArr[idx];\n }\n }\n set(idx, value) {\n if (idx < 0) {\n idx = -idx - 1;\n if (idx >= this.negativeArr.length) {\n const arr = this.negativeArr;\n this.negativeArr = new Int32Array(arr.length * 2);\n this.negativeArr.set(arr);\n }\n this.negativeArr[idx] = value;\n }\n else {\n if (idx >= this.positiveArr.length) {\n const arr = this.positiveArr;\n this.positiveArr = new Int32Array(arr.length * 2);\n this.positiveArr.set(arr);\n }\n this.positiveArr[idx] = value;\n }\n }\n}\n/**\n * An array that supports fast negative indices.\n*/\nclass FastArrayNegativeIndices {\n constructor() {\n this.positiveArr = [];\n this.negativeArr = [];\n }\n get(idx) {\n if (idx < 0) {\n idx = -idx - 1;\n return this.negativeArr[idx];\n }\n else {\n return this.positiveArr[idx];\n }\n }\n set(idx, value) {\n if (idx < 0) {\n idx = -idx - 1;\n this.negativeArr[idx] = value;\n }\n else {\n this.positiveArr[idx] = value;\n }\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/standardLinesDiffComputer.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\n\n\n\n\n\n\n\n\nclass StandardLinesDiffComputer {\n constructor() {\n this.dynamicProgrammingDiffing = new DynamicProgrammingDiffing();\n this.myersDiffingAlgorithm = new MyersDiffAlgorithm();\n }\n computeDiff(originalLines, modifiedLines, options) {\n if (originalLines.length === 1 && originalLines[0].length === 0 || modifiedLines.length === 1 && modifiedLines[0].length === 0) {\n return {\n changes: [\n new LineRangeMapping(new LineRange(1, originalLines.length + 1), new LineRange(1, modifiedLines.length + 1), [\n new RangeMapping(new range_Range(1, 1, originalLines.length, originalLines[0].length + 1), new range_Range(1, 1, modifiedLines.length, modifiedLines[0].length + 1))\n ])\n ],\n hitTimeout: false,\n moves: [],\n };\n }\n const timeout = options.maxComputationTimeMs === 0 ? InfiniteTimeout.instance : new DateTimeout(options.maxComputationTimeMs);\n const considerWhitespaceChanges = !options.ignoreTrimWhitespace;\n const perfectHashes = new Map();\n function getOrCreateHash(text) {\n let hash = perfectHashes.get(text);\n if (hash === undefined) {\n hash = perfectHashes.size;\n perfectHashes.set(text, hash);\n }\n return hash;\n }\n const srcDocLines = originalLines.map((l) => getOrCreateHash(l.trim()));\n const tgtDocLines = modifiedLines.map((l) => getOrCreateHash(l.trim()));\n const sequence1 = new standardLinesDiffComputer_LineSequence(srcDocLines, originalLines);\n const sequence2 = new standardLinesDiffComputer_LineSequence(tgtDocLines, modifiedLines);\n const lineAlignmentResult = (() => {\n if (sequence1.length + sequence2.length < 1500) {\n // Use the improved algorithm for small files\n return this.dynamicProgrammingDiffing.compute(sequence1, sequence2, timeout, (offset1, offset2) => originalLines[offset1] === modifiedLines[offset2]\n ? modifiedLines[offset2].length === 0\n ? 0.1\n : 1 + Math.log(1 + modifiedLines[offset2].length)\n : 0.99);\n }\n return this.myersDiffingAlgorithm.compute(sequence1, sequence2);\n })();\n let lineAlignments = lineAlignmentResult.diffs;\n let hitTimeout = lineAlignmentResult.hitTimeout;\n lineAlignments = optimizeSequenceDiffs(sequence1, sequence2, lineAlignments);\n const alignments = [];\n const scanForWhitespaceChanges = (equalLinesCount) => {\n if (!considerWhitespaceChanges) {\n return;\n }\n for (let i = 0; i < equalLinesCount; i++) {\n const seq1Offset = seq1LastStart + i;\n const seq2Offset = seq2LastStart + i;\n if (originalLines[seq1Offset] !== modifiedLines[seq2Offset]) {\n // This is because of whitespace changes, diff these lines\n const characterDiffs = this.refineDiff(originalLines, modifiedLines, new SequenceDiff(new OffsetRange(seq1Offset, seq1Offset + 1), new OffsetRange(seq2Offset, seq2Offset + 1)), timeout, considerWhitespaceChanges);\n for (const a of characterDiffs.mappings) {\n alignments.push(a);\n }\n if (characterDiffs.hitTimeout) {\n hitTimeout = true;\n }\n }\n }\n };\n let seq1LastStart = 0;\n let seq2LastStart = 0;\n for (const diff of lineAlignments) {\n assertFn(() => diff.seq1Range.start - seq1LastStart === diff.seq2Range.start - seq2LastStart);\n const equalLinesCount = diff.seq1Range.start - seq1LastStart;\n scanForWhitespaceChanges(equalLinesCount);\n seq1LastStart = diff.seq1Range.endExclusive;\n seq2LastStart = diff.seq2Range.endExclusive;\n const characterDiffs = this.refineDiff(originalLines, modifiedLines, diff, timeout, considerWhitespaceChanges);\n if (characterDiffs.hitTimeout) {\n hitTimeout = true;\n }\n for (const a of characterDiffs.mappings) {\n alignments.push(a);\n }\n }\n scanForWhitespaceChanges(originalLines.length - seq1LastStart);\n const changes = lineRangeMappingFromRangeMappings(alignments, originalLines, modifiedLines);\n const moves = [];\n if (options.computeMoves) {\n const deletions = changes\n .filter(c => c.modifiedRange.isEmpty && c.originalRange.length >= 3)\n .map(d => new LineRangeFragment(d.originalRange, originalLines));\n const insertions = new Set(changes\n .filter(c => c.originalRange.isEmpty && c.modifiedRange.length >= 3)\n .map(d => new LineRangeFragment(d.modifiedRange, modifiedLines)));\n for (const deletion of deletions) {\n let highestSimilarity = -1;\n let best;\n for (const insertion of insertions) {\n const similarity = deletion.computeSimilarity(insertion);\n if (similarity > highestSimilarity) {\n highestSimilarity = similarity;\n best = insertion;\n }\n }\n if (highestSimilarity > 0.90 && best) {\n const moveChanges = this.refineDiff(originalLines, modifiedLines, new SequenceDiff(new OffsetRange(deletion.range.startLineNumber - 1, deletion.range.endLineNumberExclusive - 1), new OffsetRange(best.range.startLineNumber - 1, best.range.endLineNumberExclusive - 1)), timeout, considerWhitespaceChanges);\n const mappings = lineRangeMappingFromRangeMappings(moveChanges.mappings, originalLines, modifiedLines, true);\n insertions.delete(best);\n moves.push(new MovedText(new SimpleLineRangeMapping(deletion.range, best.range), mappings));\n }\n }\n }\n // Make sure all ranges are valid\n assertFn(() => {\n function validatePosition(pos, lines) {\n if (pos.lineNumber < 1 || pos.lineNumber > lines.length) {\n return false;\n }\n const line = lines[pos.lineNumber - 1];\n if (pos.column < 1 || pos.column > line.length + 1) {\n return false;\n }\n return true;\n }\n function validateRange(range, lines) {\n if (range.startLineNumber < 1 || range.startLineNumber > lines.length + 1) {\n return false;\n }\n if (range.endLineNumberExclusive < 1 || range.endLineNumberExclusive > lines.length + 1) {\n return false;\n }\n return true;\n }\n for (const c of changes) {\n if (!c.innerChanges) {\n return false;\n }\n for (const ic of c.innerChanges) {\n const valid = validatePosition(ic.modifiedRange.getStartPosition(), modifiedLines) && validatePosition(ic.modifiedRange.getEndPosition(), modifiedLines) &&\n validatePosition(ic.originalRange.getStartPosition(), originalLines) && validatePosition(ic.originalRange.getEndPosition(), originalLines);\n if (!valid) {\n return false;\n }\n }\n if (!validateRange(c.modifiedRange, modifiedLines) || !validateRange(c.originalRange, originalLines)) {\n return false;\n }\n }\n return true;\n });\n return new LinesDiff(changes, moves, hitTimeout);\n }\n refineDiff(originalLines, modifiedLines, diff, timeout, considerWhitespaceChanges) {\n const slice1 = new LinesSliceCharSequence(originalLines, diff.seq1Range, considerWhitespaceChanges);\n const slice2 = new LinesSliceCharSequence(modifiedLines, diff.seq2Range, considerWhitespaceChanges);\n const diffResult = slice1.length + slice2.length < 500\n ? this.dynamicProgrammingDiffing.compute(slice1, slice2, timeout)\n : this.myersDiffingAlgorithm.compute(slice1, slice2, timeout);\n let diffs = diffResult.diffs;\n diffs = optimizeSequenceDiffs(slice1, slice2, diffs);\n diffs = coverFullWords(slice1, slice2, diffs);\n diffs = smoothenSequenceDiffs(slice1, slice2, diffs);\n diffs = removeRandomMatches(slice1, slice2, diffs);\n const result = diffs.map((d) => new RangeMapping(slice1.translateRange(d.seq1Range), slice2.translateRange(d.seq2Range)));\n // Assert: result applied on original should be the same as diff applied to original\n return {\n mappings: result,\n hitTimeout: diffResult.hitTimeout,\n };\n }\n}\nfunction coverFullWords(sequence1, sequence2, sequenceDiffs) {\n const additional = [];\n let lastModifiedWord = undefined;\n function maybePushWordToAdditional() {\n if (!lastModifiedWord) {\n return;\n }\n const originalLength1 = lastModifiedWord.s1Range.length - lastModifiedWord.deleted;\n const originalLength2 = lastModifiedWord.s2Range.length - lastModifiedWord.added;\n if (originalLength1 !== originalLength2) {\n // TODO figure out why this happens\n }\n if (Math.max(lastModifiedWord.deleted, lastModifiedWord.added) + (lastModifiedWord.count - 1) > originalLength1) {\n additional.push(new SequenceDiff(lastModifiedWord.s1Range, lastModifiedWord.s2Range));\n }\n lastModifiedWord = undefined;\n }\n for (const s of sequenceDiffs) {\n function processWord(s1Range, s2Range) {\n var _a, _b, _c, _d;\n if (!lastModifiedWord || !lastModifiedWord.s1Range.containsRange(s1Range) || !lastModifiedWord.s2Range.containsRange(s2Range)) {\n if (lastModifiedWord && !(lastModifiedWord.s1Range.endExclusive < s1Range.start && lastModifiedWord.s2Range.endExclusive < s2Range.start)) {\n const s1Added = OffsetRange.tryCreate(lastModifiedWord.s1Range.endExclusive, s1Range.start);\n const s2Added = OffsetRange.tryCreate(lastModifiedWord.s2Range.endExclusive, s2Range.start);\n lastModifiedWord.deleted += (_a = s1Added === null || s1Added === void 0 ? void 0 : s1Added.length) !== null && _a !== void 0 ? _a : 0;\n lastModifiedWord.added += (_b = s2Added === null || s2Added === void 0 ? void 0 : s2Added.length) !== null && _b !== void 0 ? _b : 0;\n lastModifiedWord.s1Range = lastModifiedWord.s1Range.join(s1Range);\n lastModifiedWord.s2Range = lastModifiedWord.s2Range.join(s2Range);\n }\n else {\n maybePushWordToAdditional();\n lastModifiedWord = { added: 0, deleted: 0, count: 0, s1Range: s1Range, s2Range: s2Range };\n }\n }\n const changedS1 = s1Range.intersect(s.seq1Range);\n const changedS2 = s2Range.intersect(s.seq2Range);\n lastModifiedWord.count++;\n lastModifiedWord.deleted += (_c = changedS1 === null || changedS1 === void 0 ? void 0 : changedS1.length) !== null && _c !== void 0 ? _c : 0;\n lastModifiedWord.added += (_d = changedS2 === null || changedS2 === void 0 ? void 0 : changedS2.length) !== null && _d !== void 0 ? _d : 0;\n }\n const w1Before = sequence1.findWordContaining(s.seq1Range.start - 1);\n const w2Before = sequence2.findWordContaining(s.seq2Range.start - 1);\n const w1After = sequence1.findWordContaining(s.seq1Range.endExclusive);\n const w2After = sequence2.findWordContaining(s.seq2Range.endExclusive);\n if (w1Before && w1After && w2Before && w2After && w1Before.equals(w1After) && w2Before.equals(w2After)) {\n processWord(w1Before, w2Before);\n }\n else {\n if (w1Before && w2Before) {\n processWord(w1Before, w2Before);\n }\n if (w1After && w2After) {\n processWord(w1After, w2After);\n }\n }\n }\n maybePushWordToAdditional();\n const merged = mergeSequenceDiffs(sequenceDiffs, additional);\n return merged;\n}\nfunction mergeSequenceDiffs(sequenceDiffs1, sequenceDiffs2) {\n const result = [];\n while (sequenceDiffs1.length > 0 || sequenceDiffs2.length > 0) {\n const sd1 = sequenceDiffs1[0];\n const sd2 = sequenceDiffs2[0];\n let next;\n if (sd1 && (!sd2 || sd1.seq1Range.start < sd2.seq1Range.start)) {\n next = sequenceDiffs1.shift();\n }\n else {\n next = sequenceDiffs2.shift();\n }\n if (result.length > 0 && result[result.length - 1].seq1Range.endExclusive >= next.seq1Range.start) {\n result[result.length - 1] = result[result.length - 1].join(next);\n }\n else {\n result.push(next);\n }\n }\n return result;\n}\nfunction lineRangeMappingFromRangeMappings(alignments, originalLines, modifiedLines, dontAssertStartLine = false) {\n const changes = [];\n for (const g of group(alignments.map(a => getLineRangeMapping(a, originalLines, modifiedLines)), (a1, a2) => a1.originalRange.overlapOrTouch(a2.originalRange)\n || a1.modifiedRange.overlapOrTouch(a2.modifiedRange))) {\n const first = g[0];\n const last = g[g.length - 1];\n changes.push(new LineRangeMapping(first.originalRange.join(last.originalRange), first.modifiedRange.join(last.modifiedRange), g.map(a => a.innerChanges[0])));\n }\n assertFn(() => {\n if (!dontAssertStartLine) {\n if (changes.length > 0 && changes[0].originalRange.startLineNumber !== changes[0].modifiedRange.startLineNumber) {\n return false;\n }\n }\n return checkAdjacentItems(changes, (m1, m2) => m2.originalRange.startLineNumber - m1.originalRange.endLineNumberExclusive === m2.modifiedRange.startLineNumber - m1.modifiedRange.endLineNumberExclusive &&\n // There has to be an unchanged line in between (otherwise both diffs should have been joined)\n m1.originalRange.endLineNumberExclusive < m2.originalRange.startLineNumber &&\n m1.modifiedRange.endLineNumberExclusive < m2.modifiedRange.startLineNumber);\n });\n return changes;\n}\nfunction getLineRangeMapping(rangeMapping, originalLines, modifiedLines) {\n let lineStartDelta = 0;\n let lineEndDelta = 0;\n // rangeMapping describes the edit that replaces `rangeMapping.originalRange` with `newText := getText(modifiedLines, rangeMapping.modifiedRange)`.\n // original: ]xxx \\n <- this line is not modified\n // modified: ]xx \\n\n if (rangeMapping.modifiedRange.endColumn === 1 && rangeMapping.originalRange.endColumn === 1\n && rangeMapping.originalRange.startLineNumber + lineStartDelta <= rangeMapping.originalRange.endLineNumber\n && rangeMapping.modifiedRange.startLineNumber + lineStartDelta <= rangeMapping.modifiedRange.endLineNumber) {\n // We can only do this if the range is not empty yet\n lineEndDelta = -1;\n }\n // original: xxx[ \\n <- this line is not modified\n // modified: xxx[ \\n\n if (rangeMapping.modifiedRange.startColumn - 1 >= modifiedLines[rangeMapping.modifiedRange.startLineNumber - 1].length\n && rangeMapping.originalRange.startColumn - 1 >= originalLines[rangeMapping.originalRange.startLineNumber - 1].length\n && rangeMapping.originalRange.startLineNumber <= rangeMapping.originalRange.endLineNumber + lineEndDelta\n && rangeMapping.modifiedRange.startLineNumber <= rangeMapping.modifiedRange.endLineNumber + lineEndDelta) {\n // We can only do this if the range is not empty yet\n lineStartDelta = 1;\n }\n const originalLineRange = new LineRange(rangeMapping.originalRange.startLineNumber + lineStartDelta, rangeMapping.originalRange.endLineNumber + 1 + lineEndDelta);\n const modifiedLineRange = new LineRange(rangeMapping.modifiedRange.startLineNumber + lineStartDelta, rangeMapping.modifiedRange.endLineNumber + 1 + lineEndDelta);\n return new LineRangeMapping(originalLineRange, modifiedLineRange, [rangeMapping]);\n}\nfunction* group(items, shouldBeGrouped) {\n let currentGroup;\n let last;\n for (const item of items) {\n if (last !== undefined && shouldBeGrouped(last, item)) {\n currentGroup.push(item);\n }\n else {\n if (currentGroup) {\n yield currentGroup;\n }\n currentGroup = [item];\n }\n last = item;\n }\n if (currentGroup) {\n yield currentGroup;\n }\n}\nclass standardLinesDiffComputer_LineSequence {\n constructor(trimmedHash, lines) {\n this.trimmedHash = trimmedHash;\n this.lines = lines;\n }\n getElement(offset) {\n return this.trimmedHash[offset];\n }\n get length() {\n return this.trimmedHash.length;\n }\n getBoundaryScore(length) {\n const indentationBefore = length === 0 ? 0 : getIndentation(this.lines[length - 1]);\n const indentationAfter = length === this.lines.length ? 0 : getIndentation(this.lines[length]);\n return 1000 - (indentationBefore + indentationAfter);\n }\n}\nfunction getIndentation(str) {\n let i = 0;\n while (i < str.length && (str.charCodeAt(i) === 32 /* CharCode.Space */ || str.charCodeAt(i) === 9 /* CharCode.Tab */)) {\n i++;\n }\n return i;\n}\nclass LinesSliceCharSequence {\n constructor(lines, lineRange, considerWhitespaceChanges) {\n // This slice has to have lineRange.length many \\n! (otherwise diffing against an empty slice will be problematic)\n // (Unless it covers the entire document, in that case the other slice also has to cover the entire document ands it's okay)\n this.lines = lines;\n this.considerWhitespaceChanges = considerWhitespaceChanges;\n this.elements = [];\n this.firstCharOffsetByLineMinusOne = [];\n // To account for trimming\n this.offsetByLine = [];\n // If the slice covers the end, but does not start at the beginning, we include just the \\n of the previous line.\n let trimFirstLineFully = false;\n if (lineRange.start > 0 && lineRange.endExclusive >= lines.length) {\n lineRange = new OffsetRange(lineRange.start - 1, lineRange.endExclusive);\n trimFirstLineFully = true;\n }\n this.lineRange = lineRange;\n for (let i = this.lineRange.start; i < this.lineRange.endExclusive; i++) {\n let line = lines[i];\n let offset = 0;\n if (trimFirstLineFully) {\n offset = line.length;\n line = '';\n trimFirstLineFully = false;\n }\n else if (!considerWhitespaceChanges) {\n const trimmedStartLine = line.trimStart();\n offset = line.length - trimmedStartLine.length;\n line = trimmedStartLine.trimEnd();\n }\n this.offsetByLine.push(offset);\n for (let i = 0; i < line.length; i++) {\n this.elements.push(line.charCodeAt(i));\n }\n // Don't add an \\n that does not exist in the document.\n if (i < lines.length - 1) {\n this.elements.push('\\n'.charCodeAt(0));\n this.firstCharOffsetByLineMinusOne[i - this.lineRange.start] = this.elements.length;\n }\n }\n // To account for the last line\n this.offsetByLine.push(0);\n }\n toString() {\n return `Slice: \"${this.text}\"`;\n }\n get text() {\n return this.getText(new OffsetRange(0, this.length));\n }\n getText(range) {\n return this.elements.slice(range.start, range.endExclusive).map(e => String.fromCharCode(e)).join('');\n }\n getElement(offset) {\n return this.elements[offset];\n }\n get length() {\n return this.elements.length;\n }\n getBoundaryScore(length) {\n // a b c , d e f\n // 11 0 0 12 15 6 13 0 0 11\n const prevCategory = getCategory(length > 0 ? this.elements[length - 1] : -1);\n const nextCategory = getCategory(length < this.elements.length ? this.elements[length] : -1);\n if (prevCategory === 6 /* CharBoundaryCategory.LineBreakCR */ && nextCategory === 7 /* CharBoundaryCategory.LineBreakLF */) {\n // don't break between \\r and \\n\n return 0;\n }\n let score = 0;\n if (prevCategory !== nextCategory) {\n score += 10;\n if (nextCategory === 1 /* CharBoundaryCategory.WordUpper */) {\n score += 1;\n }\n }\n score += getCategoryBoundaryScore(prevCategory);\n score += getCategoryBoundaryScore(nextCategory);\n return score;\n }\n translateOffset(offset) {\n // find smallest i, so that lineBreakOffsets[i] <= offset using binary search\n if (this.lineRange.isEmpty) {\n return new position_Position(this.lineRange.start + 1, 1);\n }\n let i = 0;\n let j = this.firstCharOffsetByLineMinusOne.length;\n while (i < j) {\n const k = Math.floor((i + j) / 2);\n if (this.firstCharOffsetByLineMinusOne[k] > offset) {\n j = k;\n }\n else {\n i = k + 1;\n }\n }\n const offsetOfFirstCharInLine = i === 0 ? 0 : this.firstCharOffsetByLineMinusOne[i - 1];\n return new position_Position(this.lineRange.start + i + 1, offset - offsetOfFirstCharInLine + 1 + this.offsetByLine[i]);\n }\n translateRange(range) {\n return range_Range.fromPositions(this.translateOffset(range.start), this.translateOffset(range.endExclusive));\n }\n /**\n * Finds the word that contains the character at the given offset\n */\n findWordContaining(offset) {\n if (offset < 0 || offset >= this.elements.length) {\n return undefined;\n }\n if (!isWordChar(this.elements[offset])) {\n return undefined;\n }\n // find start\n let start = offset;\n while (start > 0 && isWordChar(this.elements[start - 1])) {\n start--;\n }\n // find end\n let end = offset;\n while (end < this.elements.length && isWordChar(this.elements[end])) {\n end++;\n }\n return new OffsetRange(start, end);\n }\n countLinesIn(range) {\n return this.translateOffset(range.endExclusive).lineNumber - this.translateOffset(range.start).lineNumber;\n }\n}\nfunction isWordChar(charCode) {\n return charCode >= 97 /* CharCode.a */ && charCode <= 122 /* CharCode.z */\n || charCode >= 65 /* CharCode.A */ && charCode <= 90 /* CharCode.Z */\n || charCode >= 48 /* CharCode.Digit0 */ && charCode <= 57 /* CharCode.Digit9 */;\n}\nconst score = {\n [0 /* CharBoundaryCategory.WordLower */]: 0,\n [1 /* CharBoundaryCategory.WordUpper */]: 0,\n [2 /* CharBoundaryCategory.WordNumber */]: 0,\n [3 /* CharBoundaryCategory.End */]: 10,\n [4 /* CharBoundaryCategory.Other */]: 2,\n [5 /* CharBoundaryCategory.Space */]: 3,\n [6 /* CharBoundaryCategory.LineBreakCR */]: 10,\n [7 /* CharBoundaryCategory.LineBreakLF */]: 10,\n};\nfunction getCategoryBoundaryScore(category) {\n return score[category];\n}\nfunction getCategory(charCode) {\n if (charCode === 10 /* CharCode.LineFeed */) {\n return 7 /* CharBoundaryCategory.LineBreakLF */;\n }\n else if (charCode === 13 /* CharCode.CarriageReturn */) {\n return 6 /* CharBoundaryCategory.LineBreakCR */;\n }\n else if (isSpace(charCode)) {\n return 5 /* CharBoundaryCategory.Space */;\n }\n else if (charCode >= 97 /* CharCode.a */ && charCode <= 122 /* CharCode.z */) {\n return 0 /* CharBoundaryCategory.WordLower */;\n }\n else if (charCode >= 65 /* CharCode.A */ && charCode <= 90 /* CharCode.Z */) {\n return 1 /* CharBoundaryCategory.WordUpper */;\n }\n else if (charCode >= 48 /* CharCode.Digit0 */ && charCode <= 57 /* CharCode.Digit9 */) {\n return 2 /* CharBoundaryCategory.WordNumber */;\n }\n else if (charCode === -1) {\n return 3 /* CharBoundaryCategory.End */;\n }\n else {\n return 4 /* CharBoundaryCategory.Other */;\n }\n}\nfunction isSpace(charCode) {\n return charCode === 32 /* CharCode.Space */ || charCode === 9 /* CharCode.Tab */;\n}\nconst chrKeys = new Map();\nfunction getKey(chr) {\n let key = chrKeys.get(chr);\n if (key === undefined) {\n key = chrKeys.size;\n chrKeys.set(chr, key);\n }\n return key;\n}\nclass LineRangeFragment {\n constructor(range, lines) {\n this.range = range;\n this.lines = lines;\n this.histogram = [];\n let counter = 0;\n for (let i = range.startLineNumber - 1; i < range.endLineNumberExclusive - 1; i++) {\n const line = lines[i];\n for (let j = 0; j < line.length; j++) {\n counter++;\n const chr = line[j];\n const key = getKey(chr);\n this.histogram[key] = (this.histogram[key] || 0) + 1;\n }\n counter++;\n const key = getKey('\\n');\n this.histogram[key] = (this.histogram[key] || 0) + 1;\n }\n this.totalCount = counter;\n }\n computeSimilarity(other) {\n var _a, _b;\n let sumDifferences = 0;\n const maxLength = Math.max(this.histogram.length, other.histogram.length);\n for (let i = 0; i < maxLength; i++) {\n sumDifferences += Math.abs(((_a = this.histogram[i]) !== null && _a !== void 0 ? _a : 0) - ((_b = other.histogram[i]) !== null && _b !== void 0 ? _b : 0));\n }\n return 1 - (sumDifferences / (this.totalCount + other.totalCount));\n }\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/diff/linesDiffComputers.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\nconst linesDiffComputers = {\n getLegacy: () => new SmartLinesDiffComputer(),\n getAdvanced: () => new StandardLinesDiffComputer(),\n};\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/base/common/color.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nfunction roundFloat(number, decimalPoints) {\n const decimal = Math.pow(10, decimalPoints);\n return Math.round(number * decimal) / decimal;\n}\nclass RGBA {\n constructor(r, g, b, a = 1) {\n this._rgbaBrand = undefined;\n this.r = Math.min(255, Math.max(0, r)) | 0;\n this.g = Math.min(255, Math.max(0, g)) | 0;\n this.b = Math.min(255, Math.max(0, b)) | 0;\n this.a = roundFloat(Math.max(Math.min(1, a), 0), 3);\n }\n static equals(a, b) {\n return a.r === b.r && a.g === b.g && a.b === b.b && a.a === b.a;\n }\n}\nclass HSLA {\n constructor(h, s, l, a) {\n this._hslaBrand = undefined;\n this.h = Math.max(Math.min(360, h), 0) | 0;\n this.s = roundFloat(Math.max(Math.min(1, s), 0), 3);\n this.l = roundFloat(Math.max(Math.min(1, l), 0), 3);\n this.a = roundFloat(Math.max(Math.min(1, a), 0), 3);\n }\n static equals(a, b) {\n return a.h === b.h && a.s === b.s && a.l === b.l && a.a === b.a;\n }\n /**\n * Converts an RGB color value to HSL. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h in the set [0, 360], s, and l in the set [0, 1].\n */\n static fromRGBA(rgba) {\n const r = rgba.r / 255;\n const g = rgba.g / 255;\n const b = rgba.b / 255;\n const a = rgba.a;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (min + max) / 2;\n const chroma = max - min;\n if (chroma > 0) {\n s = Math.min((l <= 0.5 ? chroma / (2 * l) : chroma / (2 - (2 * l))), 1);\n switch (max) {\n case r:\n h = (g - b) / chroma + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / chroma + 2;\n break;\n case b:\n h = (r - g) / chroma + 4;\n break;\n }\n h *= 60;\n h = Math.round(h);\n }\n return new HSLA(h, s, l, a);\n }\n static _hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n /**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h in the set [0, 360] s, and l are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n */\n static toRGBA(hsla) {\n const h = hsla.h / 360;\n const { s, l, a } = hsla;\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n }\n else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = HSLA._hue2rgb(p, q, h + 1 / 3);\n g = HSLA._hue2rgb(p, q, h);\n b = HSLA._hue2rgb(p, q, h - 1 / 3);\n }\n return new RGBA(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), a);\n }\n}\nclass HSVA {\n constructor(h, s, v, a) {\n this._hsvaBrand = undefined;\n this.h = Math.max(Math.min(360, h), 0) | 0;\n this.s = roundFloat(Math.max(Math.min(1, s), 0), 3);\n this.v = roundFloat(Math.max(Math.min(1, v), 0), 3);\n this.a = roundFloat(Math.max(Math.min(1, a), 0), 3);\n }\n static equals(a, b) {\n return a.h === b.h && a.s === b.s && a.v === b.v && a.a === b.a;\n }\n // from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm\n static fromRGBA(rgba) {\n const r = rgba.r / 255;\n const g = rgba.g / 255;\n const b = rgba.b / 255;\n const cmax = Math.max(r, g, b);\n const cmin = Math.min(r, g, b);\n const delta = cmax - cmin;\n const s = cmax === 0 ? 0 : (delta / cmax);\n let m;\n if (delta === 0) {\n m = 0;\n }\n else if (cmax === r) {\n m = ((((g - b) / delta) % 6) + 6) % 6;\n }\n else if (cmax === g) {\n m = ((b - r) / delta) + 2;\n }\n else {\n m = ((r - g) / delta) + 4;\n }\n return new HSVA(Math.round(m * 60), s, cmax, rgba.a);\n }\n // from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm\n static toRGBA(hsva) {\n const { h, s, v, a } = hsva;\n const c = v * s;\n const x = c * (1 - Math.abs((h / 60) % 2 - 1));\n const m = v - c;\n let [r, g, b] = [0, 0, 0];\n if (h < 60) {\n r = c;\n g = x;\n }\n else if (h < 120) {\n r = x;\n g = c;\n }\n else if (h < 180) {\n g = c;\n b = x;\n }\n else if (h < 240) {\n g = x;\n b = c;\n }\n else if (h < 300) {\n r = x;\n b = c;\n }\n else if (h <= 360) {\n r = c;\n b = x;\n }\n r = Math.round((r + m) * 255);\n g = Math.round((g + m) * 255);\n b = Math.round((b + m) * 255);\n return new RGBA(r, g, b, a);\n }\n}\nclass Color {\n static fromHex(hex) {\n return Color.Format.CSS.parseHex(hex) || Color.red;\n }\n static equals(a, b) {\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n return a.equals(b);\n }\n get hsla() {\n if (this._hsla) {\n return this._hsla;\n }\n else {\n return HSLA.fromRGBA(this.rgba);\n }\n }\n get hsva() {\n if (this._hsva) {\n return this._hsva;\n }\n return HSVA.fromRGBA(this.rgba);\n }\n constructor(arg) {\n if (!arg) {\n throw new Error('Color needs a value');\n }\n else if (arg instanceof RGBA) {\n this.rgba = arg;\n }\n else if (arg instanceof HSLA) {\n this._hsla = arg;\n this.rgba = HSLA.toRGBA(arg);\n }\n else if (arg instanceof HSVA) {\n this._hsva = arg;\n this.rgba = HSVA.toRGBA(arg);\n }\n else {\n throw new Error('Invalid color ctor argument');\n }\n }\n equals(other) {\n return !!other && RGBA.equals(this.rgba, other.rgba) && HSLA.equals(this.hsla, other.hsla) && HSVA.equals(this.hsva, other.hsva);\n }\n /**\n * http://www.w3.org/TR/WCAG20/#relativeluminancedef\n * Returns the number in the set [0, 1]. O => Darkest Black. 1 => Lightest white.\n */\n getRelativeLuminance() {\n const R = Color._relativeLuminanceForComponent(this.rgba.r);\n const G = Color._relativeLuminanceForComponent(this.rgba.g);\n const B = Color._relativeLuminanceForComponent(this.rgba.b);\n const luminance = 0.2126 * R + 0.7152 * G + 0.0722 * B;\n return roundFloat(luminance, 4);\n }\n static _relativeLuminanceForComponent(color) {\n const c = color / 255;\n return (c <= 0.03928) ? c / 12.92 : Math.pow(((c + 0.055) / 1.055), 2.4);\n }\n /**\n *\thttp://24ways.org/2010/calculating-color-contrast\n * Return 'true' if lighter color otherwise 'false'\n */\n isLighter() {\n const yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1000;\n return yiq >= 128;\n }\n isLighterThan(another) {\n const lum1 = this.getRelativeLuminance();\n const lum2 = another.getRelativeLuminance();\n return lum1 > lum2;\n }\n isDarkerThan(another) {\n const lum1 = this.getRelativeLuminance();\n const lum2 = another.getRelativeLuminance();\n return lum1 < lum2;\n }\n lighten(factor) {\n return new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l + this.hsla.l * factor, this.hsla.a));\n }\n darken(factor) {\n return new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l - this.hsla.l * factor, this.hsla.a));\n }\n transparent(factor) {\n const { r, g, b, a } = this.rgba;\n return new Color(new RGBA(r, g, b, a * factor));\n }\n isTransparent() {\n return this.rgba.a === 0;\n }\n isOpaque() {\n return this.rgba.a === 1;\n }\n opposite() {\n return new Color(new RGBA(255 - this.rgba.r, 255 - this.rgba.g, 255 - this.rgba.b, this.rgba.a));\n }\n makeOpaque(opaqueBackground) {\n if (this.isOpaque() || opaqueBackground.rgba.a !== 1) {\n // only allow to blend onto a non-opaque color onto a opaque color\n return this;\n }\n const { r, g, b, a } = this.rgba;\n // https://stackoverflow.com/questions/12228548/finding-equivalent-color-with-opacity\n return new Color(new RGBA(opaqueBackground.rgba.r - a * (opaqueBackground.rgba.r - r), opaqueBackground.rgba.g - a * (opaqueBackground.rgba.g - g), opaqueBackground.rgba.b - a * (opaqueBackground.rgba.b - b), 1));\n }\n toString() {\n if (!this._toString) {\n this._toString = Color.Format.CSS.format(this);\n }\n return this._toString;\n }\n static getLighterColor(of, relative, factor) {\n if (of.isLighterThan(relative)) {\n return of;\n }\n factor = factor ? factor : 0.5;\n const lum1 = of.getRelativeLuminance();\n const lum2 = relative.getRelativeLuminance();\n factor = factor * (lum2 - lum1) / lum2;\n return of.lighten(factor);\n }\n static getDarkerColor(of, relative, factor) {\n if (of.isDarkerThan(relative)) {\n return of;\n }\n factor = factor ? factor : 0.5;\n const lum1 = of.getRelativeLuminance();\n const lum2 = relative.getRelativeLuminance();\n factor = factor * (lum1 - lum2) / lum1;\n return of.darken(factor);\n }\n}\nColor.white = new Color(new RGBA(255, 255, 255, 1));\nColor.black = new Color(new RGBA(0, 0, 0, 1));\nColor.red = new Color(new RGBA(255, 0, 0, 1));\nColor.blue = new Color(new RGBA(0, 0, 255, 1));\nColor.green = new Color(new RGBA(0, 255, 0, 1));\nColor.cyan = new Color(new RGBA(0, 255, 255, 1));\nColor.lightgrey = new Color(new RGBA(211, 211, 211, 1));\nColor.transparent = new Color(new RGBA(0, 0, 0, 0));\n(function (Color) {\n let Format;\n (function (Format) {\n let CSS;\n (function (CSS) {\n function formatRGB(color) {\n if (color.rgba.a === 1) {\n return `rgb(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b})`;\n }\n return Color.Format.CSS.formatRGBA(color);\n }\n CSS.formatRGB = formatRGB;\n function formatRGBA(color) {\n return `rgba(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b}, ${+(color.rgba.a).toFixed(2)})`;\n }\n CSS.formatRGBA = formatRGBA;\n function formatHSL(color) {\n if (color.hsla.a === 1) {\n return `hsl(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%)`;\n }\n return Color.Format.CSS.formatHSLA(color);\n }\n CSS.formatHSL = formatHSL;\n function formatHSLA(color) {\n return `hsla(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%, ${color.hsla.a.toFixed(2)})`;\n }\n CSS.formatHSLA = formatHSLA;\n function _toTwoDigitHex(n) {\n const r = n.toString(16);\n return r.length !== 2 ? '0' + r : r;\n }\n /**\n * Formats the color as #RRGGBB\n */\n function formatHex(color) {\n return `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}`;\n }\n CSS.formatHex = formatHex;\n /**\n * Formats the color as #RRGGBBAA\n * If 'compact' is set, colors without transparancy will be printed as #RRGGBB\n */\n function formatHexA(color, compact = false) {\n if (compact && color.rgba.a === 1) {\n return Color.Format.CSS.formatHex(color);\n }\n return `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}${_toTwoDigitHex(Math.round(color.rgba.a * 255))}`;\n }\n CSS.formatHexA = formatHexA;\n /**\n * The default format will use HEX if opaque and RGBA otherwise.\n */\n function format(color) {\n if (color.isOpaque()) {\n return Color.Format.CSS.formatHex(color);\n }\n return Color.Format.CSS.formatRGBA(color);\n }\n CSS.format = format;\n /**\n * Converts an Hex color value to a Color.\n * returns r, g, and b are contained in the set [0, 255]\n * @param hex string (#RGB, #RGBA, #RRGGBB or #RRGGBBAA).\n */\n function parseHex(hex) {\n const length = hex.length;\n if (length === 0) {\n // Invalid color\n return null;\n }\n if (hex.charCodeAt(0) !== 35 /* CharCode.Hash */) {\n // Does not begin with a #\n return null;\n }\n if (length === 7) {\n // #RRGGBB format\n const r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2));\n const g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4));\n const b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6));\n return new Color(new RGBA(r, g, b, 1));\n }\n if (length === 9) {\n // #RRGGBBAA format\n const r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2));\n const g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4));\n const b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6));\n const a = 16 * _parseHexDigit(hex.charCodeAt(7)) + _parseHexDigit(hex.charCodeAt(8));\n return new Color(new RGBA(r, g, b, a / 255));\n }\n if (length === 4) {\n // #RGB format\n const r = _parseHexDigit(hex.charCodeAt(1));\n const g = _parseHexDigit(hex.charCodeAt(2));\n const b = _parseHexDigit(hex.charCodeAt(3));\n return new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b));\n }\n if (length === 5) {\n // #RGBA format\n const r = _parseHexDigit(hex.charCodeAt(1));\n const g = _parseHexDigit(hex.charCodeAt(2));\n const b = _parseHexDigit(hex.charCodeAt(3));\n const a = _parseHexDigit(hex.charCodeAt(4));\n return new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b, (16 * a + a) / 255));\n }\n // Invalid color\n return null;\n }\n CSS.parseHex = parseHex;\n function _parseHexDigit(charCode) {\n switch (charCode) {\n case 48 /* CharCode.Digit0 */: return 0;\n case 49 /* CharCode.Digit1 */: return 1;\n case 50 /* CharCode.Digit2 */: return 2;\n case 51 /* CharCode.Digit3 */: return 3;\n case 52 /* CharCode.Digit4 */: return 4;\n case 53 /* CharCode.Digit5 */: return 5;\n case 54 /* CharCode.Digit6 */: return 6;\n case 55 /* CharCode.Digit7 */: return 7;\n case 56 /* CharCode.Digit8 */: return 8;\n case 57 /* CharCode.Digit9 */: return 9;\n case 97 /* CharCode.a */: return 10;\n case 65 /* CharCode.A */: return 10;\n case 98 /* CharCode.b */: return 11;\n case 66 /* CharCode.B */: return 11;\n case 99 /* CharCode.c */: return 12;\n case 67 /* CharCode.C */: return 12;\n case 100 /* CharCode.d */: return 13;\n case 68 /* CharCode.D */: return 13;\n case 101 /* CharCode.e */: return 14;\n case 69 /* CharCode.E */: return 14;\n case 102 /* CharCode.f */: return 15;\n case 70 /* CharCode.F */: return 15;\n }\n return 0;\n }\n })(CSS = Format.CSS || (Format.CSS = {}));\n })(Format = Color.Format || (Color.Format = {}));\n})(Color || (Color = {}));\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nfunction _parseCaptureGroups(captureGroups) {\n const values = [];\n for (const captureGroup of captureGroups) {\n const parsedNumber = Number(captureGroup);\n if (parsedNumber || parsedNumber === 0 && captureGroup.replace(/\\s/g, '') !== '') {\n values.push(parsedNumber);\n }\n }\n return values;\n}\nfunction _toIColor(r, g, b, a) {\n return {\n red: r / 255,\n blue: b / 255,\n green: g / 255,\n alpha: a\n };\n}\nfunction _findRange(model, match) {\n const index = match.index;\n const length = match[0].length;\n if (!index) {\n return;\n }\n const startPosition = model.positionAt(index);\n const range = {\n startLineNumber: startPosition.lineNumber,\n startColumn: startPosition.column,\n endLineNumber: startPosition.lineNumber,\n endColumn: startPosition.column + length\n };\n return range;\n}\nfunction _findHexColorInformation(range, hexValue) {\n if (!range) {\n return;\n }\n const parsedHexColor = Color.Format.CSS.parseHex(hexValue);\n if (!parsedHexColor) {\n return;\n }\n return {\n range: range,\n color: _toIColor(parsedHexColor.rgba.r, parsedHexColor.rgba.g, parsedHexColor.rgba.b, parsedHexColor.rgba.a)\n };\n}\nfunction _findRGBColorInformation(range, matches, isAlpha) {\n if (!range || matches.length !== 1) {\n return;\n }\n const match = matches[0];\n const captureGroups = match.values();\n const parsedRegex = _parseCaptureGroups(captureGroups);\n return {\n range: range,\n color: _toIColor(parsedRegex[0], parsedRegex[1], parsedRegex[2], isAlpha ? parsedRegex[3] : 1)\n };\n}\nfunction _findHSLColorInformation(range, matches, isAlpha) {\n if (!range || matches.length !== 1) {\n return;\n }\n const match = matches[0];\n const captureGroups = match.values();\n const parsedRegex = _parseCaptureGroups(captureGroups);\n const colorEquivalent = new Color(new HSLA(parsedRegex[0], parsedRegex[1] / 100, parsedRegex[2] / 100, isAlpha ? parsedRegex[3] : 1));\n return {\n range: range,\n color: _toIColor(colorEquivalent.rgba.r, colorEquivalent.rgba.g, colorEquivalent.rgba.b, colorEquivalent.rgba.a)\n };\n}\nfunction _findMatches(model, regex) {\n if (typeof model === 'string') {\n return [...model.matchAll(regex)];\n }\n else {\n return model.findMatches(regex);\n }\n}\nfunction computeColors(model) {\n const result = [];\n // Early validation for RGB and HSL\n const initialValidationRegex = /\\b(rgb|rgba|hsl|hsla)(\\([0-9\\s,.\\%]*\\))|(#)([A-Fa-f0-9]{3})\\b|(#)([A-Fa-f0-9]{4})\\b|(#)([A-Fa-f0-9]{6})\\b|(#)([A-Fa-f0-9]{8})\\b/gm;\n const initialValidationMatches = _findMatches(model, initialValidationRegex);\n // Potential colors have been found, validate the parameters\n if (initialValidationMatches.length > 0) {\n for (const initialMatch of initialValidationMatches) {\n const initialCaptureGroups = initialMatch.filter(captureGroup => captureGroup !== undefined);\n const colorScheme = initialCaptureGroups[1];\n const colorParameters = initialCaptureGroups[2];\n if (!colorParameters) {\n continue;\n }\n let colorInformation;\n if (colorScheme === 'rgb') {\n const regexParameters = /^\\(\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*\\)$/gm;\n colorInformation = _findRGBColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), false);\n }\n else if (colorScheme === 'rgba') {\n const regexParameters = /^\\(\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\s*,\\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\\s*\\)$/gm;\n colorInformation = _findRGBColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), true);\n }\n else if (colorScheme === 'hsl') {\n const regexParameters = /^\\(\\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\\s*,\\s*(100|\\d{1,2}[.]\\d*|\\d{1,2})%\\s*,\\s*(100|\\d{1,2}[.]\\d*|\\d{1,2})%\\s*\\)$/gm;\n colorInformation = _findHSLColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), false);\n }\n else if (colorScheme === 'hsla') {\n const regexParameters = /^\\(\\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\\s*,\\s*(100|\\d{1,2}[.]\\d*|\\d{1,2})%\\s*,\\s*(100|\\d{1,2}[.]\\d*|\\d{1,2})%\\s*,\\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\\s*\\)$/gm;\n colorInformation = _findHSLColorInformation(_findRange(model, initialMatch), _findMatches(colorParameters, regexParameters), true);\n }\n else if (colorScheme === '#') {\n colorInformation = _findHexColorInformation(_findRange(model, initialMatch), colorScheme + colorParameters);\n }\n if (colorInformation) {\n result.push(colorInformation);\n }\n }\n }\n return result;\n}\n/**\n * Returns an array of all default document colors in the provided document\n */\nfunction computeDefaultDocumentColors(model) {\n if (!model || typeof model.getValue !== 'function' || typeof model.positionAt !== 'function') {\n // Unknown caller!\n return [];\n }\n return computeColors(model);\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar editorSimpleWorker_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * @internal\n */\nclass MirrorModel extends MirrorTextModel {\n get uri() {\n return this._uri;\n }\n get eol() {\n return this._eol;\n }\n getValue() {\n return this.getText();\n }\n findMatches(regex) {\n const matches = [];\n for (let i = 0; i < this._lines.length; i++) {\n const line = this._lines[i];\n const offsetToAdd = this.offsetAt(new position_Position(i + 1, 1));\n const iteratorOverMatches = line.matchAll(regex);\n for (const match of iteratorOverMatches) {\n if (match.index || match.index === 0) {\n match.index = match.index + offsetToAdd;\n }\n matches.push(match);\n }\n }\n return matches;\n }\n getLinesContent() {\n return this._lines.slice(0);\n }\n getLineCount() {\n return this._lines.length;\n }\n getLineContent(lineNumber) {\n return this._lines[lineNumber - 1];\n }\n getWordAtPosition(position, wordDefinition) {\n const wordAtText = getWordAtText(position.column, ensureValidWordDefinition(wordDefinition), this._lines[position.lineNumber - 1], 0);\n if (wordAtText) {\n return new range_Range(position.lineNumber, wordAtText.startColumn, position.lineNumber, wordAtText.endColumn);\n }\n return null;\n }\n words(wordDefinition) {\n const lines = this._lines;\n const wordenize = this._wordenize.bind(this);\n let lineNumber = 0;\n let lineText = '';\n let wordRangesIdx = 0;\n let wordRanges = [];\n return {\n *[Symbol.iterator]() {\n while (true) {\n if (wordRangesIdx < wordRanges.length) {\n const value = lineText.substring(wordRanges[wordRangesIdx].start, wordRanges[wordRangesIdx].end);\n wordRangesIdx += 1;\n yield value;\n }\n else {\n if (lineNumber < lines.length) {\n lineText = lines[lineNumber];\n wordRanges = wordenize(lineText, wordDefinition);\n wordRangesIdx = 0;\n lineNumber += 1;\n }\n else {\n break;\n }\n }\n }\n }\n };\n }\n getLineWords(lineNumber, wordDefinition) {\n const content = this._lines[lineNumber - 1];\n const ranges = this._wordenize(content, wordDefinition);\n const words = [];\n for (const range of ranges) {\n words.push({\n word: content.substring(range.start, range.end),\n startColumn: range.start + 1,\n endColumn: range.end + 1\n });\n }\n return words;\n }\n _wordenize(content, wordDefinition) {\n const result = [];\n let match;\n wordDefinition.lastIndex = 0; // reset lastIndex just to be sure\n while (match = wordDefinition.exec(content)) {\n if (match[0].length === 0) {\n // it did match the empty string\n break;\n }\n result.push({ start: match.index, end: match.index + match[0].length });\n }\n return result;\n }\n getValueInRange(range) {\n range = this._validateRange(range);\n if (range.startLineNumber === range.endLineNumber) {\n return this._lines[range.startLineNumber - 1].substring(range.startColumn - 1, range.endColumn - 1);\n }\n const lineEnding = this._eol;\n const startLineIndex = range.startLineNumber - 1;\n const endLineIndex = range.endLineNumber - 1;\n const resultLines = [];\n resultLines.push(this._lines[startLineIndex].substring(range.startColumn - 1));\n for (let i = startLineIndex + 1; i < endLineIndex; i++) {\n resultLines.push(this._lines[i]);\n }\n resultLines.push(this._lines[endLineIndex].substring(0, range.endColumn - 1));\n return resultLines.join(lineEnding);\n }\n offsetAt(position) {\n position = this._validatePosition(position);\n this._ensureLineStarts();\n return this._lineStarts.getPrefixSum(position.lineNumber - 2) + (position.column - 1);\n }\n positionAt(offset) {\n offset = Math.floor(offset);\n offset = Math.max(0, offset);\n this._ensureLineStarts();\n const out = this._lineStarts.getIndexOf(offset);\n const lineLength = this._lines[out.index].length;\n // Ensure we return a valid position\n return {\n lineNumber: 1 + out.index,\n column: 1 + Math.min(out.remainder, lineLength)\n };\n }\n _validateRange(range) {\n const start = this._validatePosition({ lineNumber: range.startLineNumber, column: range.startColumn });\n const end = this._validatePosition({ lineNumber: range.endLineNumber, column: range.endColumn });\n if (start.lineNumber !== range.startLineNumber\n || start.column !== range.startColumn\n || end.lineNumber !== range.endLineNumber\n || end.column !== range.endColumn) {\n return {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column\n };\n }\n return range;\n }\n _validatePosition(position) {\n if (!position_Position.isIPosition(position)) {\n throw new Error('bad position');\n }\n let { lineNumber, column } = position;\n let hasChanged = false;\n if (lineNumber < 1) {\n lineNumber = 1;\n column = 1;\n hasChanged = true;\n }\n else if (lineNumber > this._lines.length) {\n lineNumber = this._lines.length;\n column = this._lines[lineNumber - 1].length + 1;\n hasChanged = true;\n }\n else {\n const maxCharacter = this._lines[lineNumber - 1].length + 1;\n if (column < 1) {\n column = 1;\n hasChanged = true;\n }\n else if (column > maxCharacter) {\n column = maxCharacter;\n hasChanged = true;\n }\n }\n if (!hasChanged) {\n return position;\n }\n else {\n return { lineNumber, column };\n }\n }\n}\n/**\n * @internal\n */\nclass EditorSimpleWorker {\n constructor(host, foreignModuleFactory) {\n this._host = host;\n this._models = Object.create(null);\n this._foreignModuleFactory = foreignModuleFactory;\n this._foreignModule = null;\n }\n dispose() {\n this._models = Object.create(null);\n }\n _getModel(uri) {\n return this._models[uri];\n }\n _getModels() {\n const all = [];\n Object.keys(this._models).forEach((key) => all.push(this._models[key]));\n return all;\n }\n acceptNewModel(data) {\n this._models[data.url] = new MirrorModel(uri_URI.parse(data.url), data.lines, data.EOL, data.versionId);\n }\n acceptModelChanged(strURL, e) {\n if (!this._models[strURL]) {\n return;\n }\n const model = this._models[strURL];\n model.onEvents(e);\n }\n acceptRemovedModel(strURL) {\n if (!this._models[strURL]) {\n return;\n }\n delete this._models[strURL];\n }\n computeUnicodeHighlights(url, options, range) {\n return editorSimpleWorker_awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(url);\n if (!model) {\n return { ranges: [], hasMore: false, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 };\n }\n return UnicodeTextModelHighlighter.computeUnicodeHighlights(model, options, range);\n });\n }\n // ---- BEGIN diff --------------------------------------------------------------------------\n computeDiff(originalUrl, modifiedUrl, options, algorithm) {\n return editorSimpleWorker_awaiter(this, void 0, void 0, function* () {\n const original = this._getModel(originalUrl);\n const modified = this._getModel(modifiedUrl);\n if (!original || !modified) {\n return null;\n }\n return EditorSimpleWorker.computeDiff(original, modified, options, algorithm);\n });\n }\n static computeDiff(originalTextModel, modifiedTextModel, options, algorithm) {\n const diffAlgorithm = algorithm === 'advanced' ? linesDiffComputers.getAdvanced() : linesDiffComputers.getLegacy();\n const originalLines = originalTextModel.getLinesContent();\n const modifiedLines = modifiedTextModel.getLinesContent();\n const result = diffAlgorithm.computeDiff(originalLines, modifiedLines, options);\n const identical = (result.changes.length > 0 ? false : this._modelsAreIdentical(originalTextModel, modifiedTextModel));\n function getLineChanges(changes) {\n return changes.map(m => {\n var _a;\n return ([m.originalRange.startLineNumber, m.originalRange.endLineNumberExclusive, m.modifiedRange.startLineNumber, m.modifiedRange.endLineNumberExclusive, (_a = m.innerChanges) === null || _a === void 0 ? void 0 : _a.map(m => [\n m.originalRange.startLineNumber,\n m.originalRange.startColumn,\n m.originalRange.endLineNumber,\n m.originalRange.endColumn,\n m.modifiedRange.startLineNumber,\n m.modifiedRange.startColumn,\n m.modifiedRange.endLineNumber,\n m.modifiedRange.endColumn,\n ])]);\n });\n }\n return {\n identical,\n quitEarly: result.hitTimeout,\n changes: getLineChanges(result.changes),\n moves: result.moves.map(m => ([\n m.lineRangeMapping.original.startLineNumber,\n m.lineRangeMapping.original.endLineNumberExclusive,\n m.lineRangeMapping.modified.startLineNumber,\n m.lineRangeMapping.modified.endLineNumberExclusive,\n getLineChanges(m.changes)\n ])),\n };\n }\n static _modelsAreIdentical(original, modified) {\n const originalLineCount = original.getLineCount();\n const modifiedLineCount = modified.getLineCount();\n if (originalLineCount !== modifiedLineCount) {\n return false;\n }\n for (let line = 1; line <= originalLineCount; line++) {\n const originalLine = original.getLineContent(line);\n const modifiedLine = modified.getLineContent(line);\n if (originalLine !== modifiedLine) {\n return false;\n }\n }\n return true;\n }\n computeMoreMinimalEdits(modelUrl, edits, pretty) {\n return editorSimpleWorker_awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return edits;\n }\n const result = [];\n let lastEol = undefined;\n edits = edits.slice(0).sort((a, b) => {\n if (a.range && b.range) {\n return range_Range.compareRangesUsingStarts(a.range, b.range);\n }\n // eol only changes should go to the end\n const aRng = a.range ? 0 : 1;\n const bRng = b.range ? 0 : 1;\n return aRng - bRng;\n });\n for (let { range, text, eol } of edits) {\n if (typeof eol === 'number') {\n lastEol = eol;\n }\n if (range_Range.isEmpty(range) && !text) {\n // empty change\n continue;\n }\n const original = model.getValueInRange(range);\n text = text.replace(/\\r\\n|\\n|\\r/g, model.eol);\n if (original === text) {\n // noop\n continue;\n }\n // make sure diff won't take too long\n if (Math.max(text.length, original.length) > EditorSimpleWorker._diffLimit) {\n result.push({ range, text });\n continue;\n }\n // compute diff between original and edit.text\n const changes = stringDiff(original, text, pretty);\n const editOffset = model.offsetAt(range_Range.lift(range).getStartPosition());\n for (const change of changes) {\n const start = model.positionAt(editOffset + change.originalStart);\n const end = model.positionAt(editOffset + change.originalStart + change.originalLength);\n const newEdit = {\n text: text.substr(change.modifiedStart, change.modifiedLength),\n range: { startLineNumber: start.lineNumber, startColumn: start.column, endLineNumber: end.lineNumber, endColumn: end.column }\n };\n if (model.getValueInRange(newEdit.range) !== newEdit.text) {\n result.push(newEdit);\n }\n }\n }\n if (typeof lastEol === 'number') {\n result.push({ eol: lastEol, text: '', range: { startLineNumber: 0, startColumn: 0, endLineNumber: 0, endColumn: 0 } });\n }\n return result;\n });\n }\n // ---- END minimal edits ---------------------------------------------------------------\n computeLinks(modelUrl) {\n return editorSimpleWorker_awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return null;\n }\n return computeLinks(model);\n });\n }\n // --- BEGIN default document colors -----------------------------------------------------------\n computeDefaultDocumentColors(modelUrl) {\n return editorSimpleWorker_awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return null;\n }\n return computeDefaultDocumentColors(model);\n });\n }\n textualSuggest(modelUrls, leadingWord, wordDef, wordDefFlags) {\n return editorSimpleWorker_awaiter(this, void 0, void 0, function* () {\n const sw = new StopWatch();\n const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n const seen = new Set();\n outer: for (const url of modelUrls) {\n const model = this._getModel(url);\n if (!model) {\n continue;\n }\n for (const word of model.words(wordDefRegExp)) {\n if (word === leadingWord || !isNaN(Number(word))) {\n continue;\n }\n seen.add(word);\n if (seen.size > EditorSimpleWorker._suggestionsLimit) {\n break outer;\n }\n }\n }\n return { words: Array.from(seen), duration: sw.elapsed() };\n });\n }\n // ---- END suggest --------------------------------------------------------------------------\n //#region -- word ranges --\n computeWordRanges(modelUrl, range, wordDef, wordDefFlags) {\n return editorSimpleWorker_awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return Object.create(null);\n }\n const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n const result = Object.create(null);\n for (let line = range.startLineNumber; line < range.endLineNumber; line++) {\n const words = model.getLineWords(line, wordDefRegExp);\n for (const word of words) {\n if (!isNaN(Number(word.word))) {\n continue;\n }\n let array = result[word.word];\n if (!array) {\n array = [];\n result[word.word] = array;\n }\n array.push({\n startLineNumber: line,\n startColumn: word.startColumn,\n endLineNumber: line,\n endColumn: word.endColumn\n });\n }\n }\n return result;\n });\n }\n //#endregion\n navigateValueSet(modelUrl, range, up, wordDef, wordDefFlags) {\n return editorSimpleWorker_awaiter(this, void 0, void 0, function* () {\n const model = this._getModel(modelUrl);\n if (!model) {\n return null;\n }\n const wordDefRegExp = new RegExp(wordDef, wordDefFlags);\n if (range.startColumn === range.endColumn) {\n range = {\n startLineNumber: range.startLineNumber,\n startColumn: range.startColumn,\n endLineNumber: range.endLineNumber,\n endColumn: range.endColumn + 1\n };\n }\n const selectionText = model.getValueInRange(range);\n const wordRange = model.getWordAtPosition({ lineNumber: range.startLineNumber, column: range.startColumn }, wordDefRegExp);\n if (!wordRange) {\n return null;\n }\n const word = model.getValueInRange(wordRange);\n const result = BasicInplaceReplace.INSTANCE.navigateValueSet(range, selectionText, wordRange, word, up);\n return result;\n });\n }\n // ---- BEGIN foreign module support --------------------------------------------------------------------------\n loadForeignModule(moduleId, createData, foreignHostMethods) {\n const proxyMethodRequest = (method, args) => {\n return this._host.fhr(method, args);\n };\n const foreignHost = createProxyObject(foreignHostMethods, proxyMethodRequest);\n const ctx = {\n host: foreignHost,\n getMirrorModels: () => {\n return this._getModels();\n }\n };\n if (this._foreignModuleFactory) {\n this._foreignModule = this._foreignModuleFactory(ctx, createData);\n // static foreing module\n return Promise.resolve(objects_getAllMethodNames(this._foreignModule));\n }\n // ESM-comment-begin\n // \t\treturn new Promise<any>((resolve, reject) => {\n // \t\t\trequire([moduleId], (foreignModule: { create: IForeignModuleFactory }) => {\n // \t\t\t\tthis._foreignModule = foreignModule.create(ctx, createData);\n // \n // \t\t\t\tresolve(getAllMethodNames(this._foreignModule));\n // \n // \t\t\t}, reject);\n // \t\t});\n // ESM-comment-end\n // ESM-uncomment-begin\n return Promise.reject(new Error(`Unexpected usage`));\n // ESM-uncomment-end\n }\n // foreign method request\n fmr(method, args) {\n if (!this._foreignModule || typeof this._foreignModule[method] !== 'function') {\n return Promise.reject(new Error('Missing requestHandler or method: ' + method));\n }\n try {\n return Promise.resolve(this._foreignModule[method].apply(this._foreignModule, args));\n }\n catch (e) {\n return Promise.reject(e);\n }\n }\n}\n// ---- END diff --------------------------------------------------------------------------\n// ---- BEGIN minimal edits ---------------------------------------------------------------\nEditorSimpleWorker._diffLimit = 100000;\n// ---- BEGIN suggest --------------------------------------------------------------------------\nEditorSimpleWorker._suggestionsLimit = 10000;\n/**\n * Called on the worker side\n * @internal\n */\nfunction editorSimpleWorker_create(host) {\n return new EditorSimpleWorker(host, null);\n}\nif (typeof importScripts === 'function') {\n // Running in a web worker\n globalThis.monaco = createMonacoBaseAPI();\n}\n\n;// CONCATENATED MODULE: ./.yarn/cache/monaco-editor-npm-0.41.0-4f71416c64-873a8b4eb9.zip/node_modules/monaco-editor/esm/vs/editor/editor.worker.js\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n\nlet initialized = false;\nfunction initialize(foreignModule) {\n if (initialized) {\n return;\n }\n initialized = true;\n const simpleWorker = new SimpleWorkerServer((msg) => {\n globalThis.postMessage(msg);\n }, (host) => new EditorSimpleWorker(host, foreignModule));\n globalThis.onmessage = (e) => {\n simpleWorker.onmessage(e.data);\n };\n}\nglobalThis.onmessage = (e) => {\n // Ignore first message in this case and initialize if not yet initialized\n if (!initialized) {\n initialize(null);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNLHFCQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdkJnRDtBQUNDO0FBQzhDO0FBQ2xEO0FBQ0Y7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx1QkFBdUIsb0JBQVU7QUFDakM7QUFDQTtBQUNBLG9CQUFvQix1Q0FBdUM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRixTQUFTLDZCQUE2QjtBQUN2SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELGtCQUFrQjtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZUFBZTtBQUNsRDtBQUNBLGtC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Qix1REFBTztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDamxDQTtBQUNBO0FBQ0E7QUFDQTtBQUN1RTtBQUNoRTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDTyxTQUFTLGNBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQyxpQkFBaUIsY0FBTTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQU07QUFDbkI7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEMsaUJBQWlCLGNBQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMseUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxPQUFPO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsWUFBWSxJQUFJLGVBQWU7QUFDMUQsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxZQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFlBQVE7QUFDOUIsZ0RBQWdELFFBQVE7QUFDeEQsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsUUFBUTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlJQUFpSTtBQUNqSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLFNBQVM7QUFDakY7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7O0FDM0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDb0M7QUFDN0I7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdFQUFnQjtBQUNoQyxzQkFBc0IsZ0VBQWdCO0FBQ3RDLDhCQUE4Qix5REFBUztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNPLDBEQUEwRCxxQkFBTSxnQkFBZ0IscUJBQU0sS0FBSztBQUNsRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDBCQUE4QjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxHQUFHLCtDQUErQyxPQUFPLElBQUk7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7QUFDQSxnQkFBZ0Isd0RBQVE7QUFDeEIsaUJBQWlCLHlEQUFTO0FBQzFCLE1BQU0sY0FBSyxHQUFHLHNEQUFNO0FBQ3BCO0FBQ0EsY0FBYyxzREFBTTtBQUNwQixpQkFBaUIseURBQVM7QUFDMUI7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08saUJBQWlCLHlEQUFTO0FBQzFCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxTQUFTO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGtDQUFrQywrQkFBK0I7QUFDakU7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNNLFlBQVksMkxBQTJJO0FBQzlKO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbktQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFFO0FBQ3lDO0FBQ2Q7QUFDMUI7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE1BQU07QUFDOUI7QUFDQTtBQUNBLDhCQUE4QixHQUFHO0FBQ2pDO0FBQ0EsaUNBQWlDLEVBQUU7QUFDbkM7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsY0FBTTtBQUN0QjtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDLGtDQUFrQztBQUNsQyxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsK0JBQStCLEVBQUU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG1DQUFtQyxFQUFFO0FBQ3JDO0FBQ087QUFDUDtBQUNBO0FBQ08seURBQXlEO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLHNDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLDZCQUE2QixRQUFRO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsV0FBVyxnQ0FBZ0M7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQLFdBQVcsZ0NBQWdDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHlEQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLG9CQUFZO0FBQzVCO0FBQ0E7QUFDTyxtREFBbUQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNyekJBO0FBQ0E7QUFDQTtBQUNBO0FBQzhEO0FBQ3hCO0FBQ087QUFDSztBQUNYO0FBQ0U7QUFDekM7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixPQUFPO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsMkJB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixZQUFZO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxTQUFTO0FBQzVELDRCQUE0QixVQUFVO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsVUFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsVUFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFVBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFVBQVU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDRDQUE0QztBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELGdDQUFnQztBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsZ0NBQWdDO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsU0FBUztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLGlCQUFpQjtBQUNyRCx3Q0FBd0MsaUJBQWlCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixZQUFZO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFVBQVU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixhQUFhO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFlBQVk7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFlBQVk7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFlBQVk7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLFlBQVksV0FBTztBQUNuQjtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixXQUFXO0FBQzVCLENBQUM7QUFDTTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLDhCQUE4QjtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsS0FBSyxHQUFHLGFBQWE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsYUFBYTtBQUNwQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxLQUFLO0FBQ3JDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsSUFBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxjQUFjO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixJQUFJLEVBQUUsa0NBQWtDO0FBQzFELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxRQUFRO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsUUFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsUUFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsWUFBWSxXQUFPO0FBQ25CO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2gzQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDbUM7QUFDTztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsMEJBQTBCLGNBQWMsWUFBWSxTQUFTLGFBQWEsVUFBVSxnQkFBZ0IsYUFBYSxFQUFFO0FBQzVLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTSxPQUFHO0FBQ2hCO0FBQ0EsNkJBQTZCLE9BQUc7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsWUFBWTtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYywyQ0FBMkM7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQixzQkFBc0IsT0FBRyxNQUFNLEtBQVc7QUFDMUM7QUFDQTtBQUNBLHNCQUFzQixLQUFXO0FBQ2pDO0FBQ0EsMEJBQTBCLGVBQWU7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLE9BQUc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBLGtCQUFrQixPQUFHO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMkJBQTJCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG1CQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixjQUFjLEVBQUUsU0FBUztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixXQUFLO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFdBQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsV0FBSztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlCQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsV0FBSztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQUs7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQUs7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQUs7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixXQUFLO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixXQUFLO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsV0FBSztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9ZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FB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d0JBQXdCLHVDQUF1QztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsS0FBSztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELGdCQUFnQjtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdRQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHVCQUF1QjtBQUN2QixtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCw0QkFBNEI7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQzRDO0FBQzVDO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsQ0FBQztBQUNNO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxLQUFLO0FBQ3RDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQyw4Q0FBOEM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQLGdCQUFnQixtQ0FBbUM7QUFDbkQ7QUFDQTtBQUNBLGdCQUFnQixrQ0FBa0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRixzQkFBc0I7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFLFNBQVMsbUJBQW1CLFlBQVk7QUFDdEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDTTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvQ0FBb0M7QUFDOUI7QUFDUDtBQUNBO0FBQ0E7OztBQ25YQTtBQUNBO0FBQ0E7QUFDQTtBQUN5QztBQUNOO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ08sd0JBQXdCLFdBQUs7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpQkFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlCQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsY0FBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGtCQUFZO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFlBQVksdUJBQWlCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyx1QkFBaUI7QUFDakM7QUFDQTtBQUNPO0FBQ1A7QUFDQSw2REFBNkQsS0FBSztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxRQUFRLHVCQUFpQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSwwRUFBMEUsV0FBVztBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1QkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7O0FDbElzQztBQUN0QztBQUNBO0FBQ0EsUUFBUSxRQUFRO0FBQ2hCO0FBQ0E7QUFDQSwrQkFBK0IsSUFBSSxpQ0FBaUMsY0FBYztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdmpCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksNEJBQVMsSUFBSSxTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNxRDtBQUNxQjtBQUNuRTtBQUNQO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxPQUFPO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQkFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsc0JBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxlQUFlLDRCQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsb0JBQVU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNEJBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGVBQWUsNEJBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOzs7QUN2SXdEO0FBQ1Q7QUFDUDtBQUNxRDtBQUNyRDtBQUNqQztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0Esa0RBQWtELE9BQU87QUFDekQsb0RBQW9ELE9BQU87QUFDM0QsdURBQXVELE9BQU87QUFDOUQsaURBQWlELE9BQU87QUFDeEQsb0RBQW9ELE9BQU87QUFDM0QsaURBQWlELE9BQU87QUFDeEQsa0RBQWtELE9BQU87QUFDekQscURBQXFELE9BQU87QUFDNUQsa0RBQWtELE9BQU87QUFDekQsb0RBQW9ELE9BQU87QUFDM0Qsa0RBQWtELE9BQU87QUFDekQscURBQXFELE9BQU87QUFDNUQsaURBQWlELE9BQU87QUFDeEQsa0RBQWtELE9BQU87QUFDekQsaURBQWlELE9BQU87QUFDeEQscURBQXFELE9BQU87QUFDNUQsaURBQWlELE9BQU87QUFDeEQsdURBQXVELE9BQU87QUFDOUQsb0RBQW9ELE9BQU87QUFDM0Qsb0RBQW9ELE9BQU87QUFDM0QsaURBQWlELE9BQU87QUFDeEQsa0RBQWtELE9BQU87QUFDekQsaURBQWlELE9BQU87QUFDeEQsc0RBQXNELE9BQU87QUFDN0Qsd0RBQXdELE9BQU87QUFDL0QsbURBQW1ELE9BQU87QUFDMUQsMERBQTBELE9BQU87QUFDakUsaURBQWlELE9BQU87QUFDeEQsa0RBQWtELE9BQU87QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0RBQWtEO0FBQ25EO0FBQ0EsV0FBVyw0REFBNEQ7QUFDdkU7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtFQUFrRTtBQUM1RDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNERBQTREO0FBQzdEO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHNEQUFzRDtBQUN2RDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGlDQUFpQyxZQUFRO0FBQ3pDLG1DQUFtQyxZQUFRO0FBQzNDLGdDQUFnQyxZQUFRO0FBQ3hDLG9DQUFvQyxZQUFRO0FBQzVDLHNDQUFzQyxZQUFRO0FBQzlDLCtCQUErQixZQUFRO0FBQ3ZDLHNDQUFzQyxZQUFRO0FBQzlDLGlDQUFpQyxZQUFRO0FBQ3pDLGdDQUFnQyxZQUFRO0FBQ3hDLCtCQUErQixZQUFRO0FBQ3ZDLG9DQUFvQyxZQUFRO0FBQzVDLHFDQUFxQyxZQUFRO0FBQzdDLCtCQUErQixZQUFRO0FBQ3ZDLGlDQUFpQyxZQUFRO0FBQ3pDLGlDQUFpQyxZQUFRO0FBQ3pDLG9DQUFvQyxZQUFRO0FBQzVDLGdDQUFnQyxZQUFRO0FBQ3hDLGtDQUFrQyxZQUFRO0FBQzFDLGtDQUFrQyxZQUFRO0FBQzFDLG9DQUFvQyxZQUFRO0FBQzVDLGtDQUFrQyxZQUFRO0FBQzFDLG1DQUFtQyxZQUFRO0FBQzNDLGtDQUFrQyxZQUFRO0FBQzFDLGtDQUFrQyxZQUFRO0FBQzFDLHlDQUF5QyxZQUFRO0FBQ2pELG9DQUFvQyxZQUFRO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx5Q0FBeUMsR0FBRyxFQUFFLEVBQUU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSx3Q0FBd0MsT0FBTztBQUMvQywwQ0FBMEMsT0FBTztBQUNqRCw2Q0FBNkMsT0FBTztBQUNwRCwyQ0FBMkMsT0FBTztBQUNsRCx5Q0FBeUMsT0FBTztBQUNoRCwwQ0FBMEMsT0FBTztBQUNqRCw0Q0FBNEMsT0FBTztBQUNuRCx5Q0FBeUMsT0FBTztBQUNoRCwrQ0FBK0MsT0FBTztBQUN0RCx3Q0FBd0MsT0FBTztBQUMvQyw4Q0FBOEMsT0FBTztBQUNyRCw2Q0FBNkMsT0FBTztBQUNwRCw2Q0FBNkMsT0FBTztBQUNwRCw2Q0FBNkMsT0FBTztBQUNwRCwyQ0FBMkMsT0FBTztBQUNsRCwyQ0FBMkMsT0FBTztBQUNsRCw0Q0FBNEMsT0FBTztBQUNuRCwwQ0FBMEMsT0FBTztBQUNqRCwyQ0FBMkMsT0FBTztBQUNsRCx3Q0FBd0MsT0FBTztBQUMvQyx5Q0FBeUMsT0FBTztBQUNoRCwrQ0FBK0MsT0FBTztBQUN0RCwyQ0FBMkMsT0FBTztBQUNsRCwwQ0FBMEMsT0FBTztBQUNqRCw2Q0FBNkMsT0FBTztBQUNwRCxrREFBa0QsT0FBTztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxrQ0FBa0M7QUFDbkM7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBLGtCQUFrQix3QkFBd0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHVCQUF1QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDBCQUEwQjtBQUNwQjtBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUMsc0NBQXNDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTSw4QkFBb0IsT0FBTyxvQkFBd0I7OztBQzlXaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLG9EQUFvRDtBQUM5QztBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUMsc0RBQXNEO0FBQ2hEO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsb0VBQW9FO0FBQzlEO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsZ0RBQWdEO0FBQzFDO0FBQ1A7QUFDQTtBQUNBLENBQUMsOENBQThDO0FBQy9DO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHNEQUFzRDtBQUN2RDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwRUFBMEU7QUFDM0U7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxnREFBZ0Q7QUFDakQ7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRDQUE0QztBQUM3QztBQUNBO0FBQ0E7QUFDTyxJQUFJLHFDQUFxQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRSxxQ0FBcUIsS0FBSyxxQ0FBcUIsS0FBSztBQUN2RDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNERBQTREO0FBQ3REO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvQ0FBb0M7QUFDckM7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0RBQWtEO0FBQ25EO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4Q0FBOEM7QUFDL0M7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxDQUFDLDBDQUEwQztBQUMzQztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvQ0FBb0M7QUFDOUI7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwREFBMEQ7QUFDcEQsSUFBSSw2QkFBYTtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUUsNkJBQWEsS0FBSyw2QkFBYSxLQUFLO0FBQ3ZDO0FBQ0EsV0FBVyw0REFBNEQ7QUFDdkU7QUFDTyxJQUFJLDJDQUEyQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFLDJDQUEyQixLQUFLLDJDQUEyQixLQUFLO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDBCQUEwQjtBQUNwQjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHdDQUF3QztBQUNsQztBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUMsOEJBQThCO0FBQy9CO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwQ0FBMEM7QUFDM0M7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStELHdFQUF3RTtBQUN2STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUF3QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsU0FBUztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxZQUFZO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdKQUFnSjtBQUNoSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxZQUFZO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxTQUFTO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsdUJBQStCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsc0JBQThCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hkQTtBQUNBO0FBQ0E7QUFDQTtBQUNvRTtBQUNwRTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQixtQkFBbUIsZ0JBQWdCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsaUJBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixVQUFVO0FBQ3BDO0FBQ0E7QUFDQSxnQ0FBZ0MsV0FBVztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsaUJBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQVE7QUFDM0I7QUFDQTtBQUNBLGVBQWUsV0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsV0FBVztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxzQ0FBc0M7QUFDdEY7QUFDQSw0QkFBNEIsaUJBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3BqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDcUU7QUFDTTtBQUNwRTtBQUNQLHlCQUF5QixzQkFBc0I7QUFDL0MsMkJBQTJCLHlCQUF5QjtBQUNwRDs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixVQUFVO0FBQzFCO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGFBQWE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGFBQWE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsYUFBYSxJQUFJLGFBQWEsSUFBSSxhQUFhO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsYUFBYSxJQUFJLGFBQWEsSUFBSSxhQUFhLElBQUksMkJBQTJCO0FBQzdHO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGFBQWEsSUFBSSxnQ0FBZ0MsS0FBSyxnQ0FBZ0M7QUFDeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixhQUFhLElBQUksZ0NBQWdDLEtBQUssZ0NBQWdDLEtBQUssd0JBQXdCO0FBQ2xKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDZCQUE2QixFQUFFLDZCQUE2QixFQUFFLDZCQUE2QjtBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw2QkFBNkIsRUFBRSw2QkFBNkIsRUFBRSw2QkFBNkIsRUFBRSwrQ0FBK0M7QUFDdks7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHNDQUFzQztBQUMvQyxLQUFLLDZDQUE2QztBQUNsRCxDQUFDLHNCQUFzQjs7O0FDN2N2QjtBQUNBO0FBQ0E7QUFDQTtBQUM0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixLQUFLO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxLQUFLLEtBQUssSUFBSTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFO0FBQ2hLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxFQUFFLHFEQUFxRCxFQUFFLHFEQUFxRCxFQUFFO0FBQzNMO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxFQUFF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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyx5QkFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtQkFBbUI7QUFDM0M7OztBQ3RoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDMkU7QUFDRTtBQUM3RTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsa0JBQWtCO0FBQy9DO0FBQ0EsS0FBSyxnQkFBZ0Isa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL2Vycm9ycy5qcz84OTMxIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9mdW5jdGlvbmFsLmpzPzI2YzYiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL2l0ZXJhdG9yLmpzPzgxNmMiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL2xpZmVjeWNsZS5qcz80YjkyIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9saW5rZWRMaXN0LmpzPzU4MGYiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL3N0b3B3YXRjaC5qcz8xMTAxIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9ldmVudC5qcz8wNTMyIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9vYmplY3RzLmpzPzM3ODkiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL25scy5qcz9jODUxIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9wbGF0Zm9ybS5qcz8xYzUwIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9jYWNoZS5qcz8zMmRhIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9sYXp5LmpzP2QzMjgiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL3N0cmluZ3MuanM/NjY1MiIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvYmFzZS9jb21tb24vd29ya2VyL3NpbXBsZVdvcmtlci5qcz8xYzMxIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9kaWZmL2RpZmZDaGFuZ2UuanM/ZDA5NSIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvYmFzZS9jb21tb24vaGFzaC5qcz9hOGZmIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9kaWZmL2RpZmYuanM/NDQ0NSIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvYmFzZS9jb21tb24vcHJvY2Vzcy5qcz9kYzg0Iiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9wYXRoLmpzP2Q5YTAiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL3VyaS5qcz9lOTNlIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL2NvcmUvcG9zaXRpb24uanM/OGJkOSIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2NvbW1vbi9jb3JlL3JhbmdlLmpzPzU2ZWIiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL2FycmF5cy5qcz82ODNmIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi91aW50LmpzP2VhNDEiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vbW9kZWwvcHJlZml4U3VtQ29tcHV0ZXIuanM/Y2I5MSIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2NvbW1vbi9tb2RlbC9taXJyb3JUZXh0TW9kZWwuanM/NWU0OCIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2NvbW1vbi9jb3JlL3dvcmRIZWxwZXIuanM/NmIyOCIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2NvbW1vbi9jb3JlL2NoYXJhY3RlckNsYXNzaWZpZXIuanM/OGU3MCIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2NvbW1vbi9sYW5ndWFnZXMvbGlua0NvbXB1dGVyLmpzP2E5ZmQiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vbGFuZ3VhZ2VzL3N1cHBvcnRzL2lucGxhY2VSZXBsYWNlU3VwcG9ydC5qcz9mY2UwIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9jYW5jZWxsYXRpb24uanM/NGM2OSIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvYmFzZS9jb21tb24va2V5Q29kZXMuanM/YzBmMiIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2NvbW1vbi9jb3JlL3NlbGVjdGlvbi5qcz9iMTFiIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi90eXBlcy5qcz83YTBiIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9iYXNlL2NvbW1vbi9jb2RpY29ucy5qcz83YmU0Iiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL3Rva2VuaXphdGlvblJlZ2lzdHJ5LmpzPzgwNDIiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vbGFuZ3VhZ2VzLmpzPzc4MjUiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vc3RhbmRhbG9uZS9zdGFuZGFsb25lRW51bXMuanM/OTdlMiIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2NvbW1vbi9zZXJ2aWNlcy9lZGl0b3JCYXNlQXBpLmpzP2IyNmQiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vY29yZS93b3JkQ2hhcmFjdGVyQ2xhc3NpZmllci5qcz9kMmU2Iiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL21vZGVsLmpzP2MwMGUiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vbW9kZWwvdGV4dE1vZGVsU2VhcmNoLmpzPzljNDMiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL2Fzc2VydC5qcz8zNzI0Iiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL3NlcnZpY2VzL3VuaWNvZGVUZXh0TW9kZWxIaWdobGlnaHRlci5qcz82MzUxIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL2NvcmUvbGluZVJhbmdlLmpzPzU0NjMiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vZGlmZi9saW5lc0RpZmZDb21wdXRlci5qcz80MDU0Iiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL2RpZmYvc21hcnRMaW5lc0RpZmZDb21wdXRlci5qcz81NjM4Iiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL2NvcmUvb2Zmc2V0UmFuZ2UuanM/YjQxZiIsIndlYnBhY2s6Ly8vLi8ueWFybi9jYWNoZS9tb25hY28tZWRpdG9yLW5wbS0wLjQxLjAtNGY3MTQxNmM2NC04NzNhOGI0ZWI5LnppcC9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2NvbW1vbi9kaWZmL2FsZ29yaXRobXMvZGlmZkFsZ29yaXRobS5qcz9jODYwIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL2RpZmYvYWxnb3JpdGhtcy91dGlscy5qcz9lZjBiIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL2RpZmYvYWxnb3JpdGhtcy9keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nLmpzPzczMWUiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vZGlmZi9hbGdvcml0aG1zL2pvaW5TZXF1ZW5jZURpZmZzLmpzPzMzMDAiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vZGlmZi9hbGdvcml0aG1zL215ZXJzRGlmZkFsZ29yaXRobS5qcz9hMmQ5Iiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL2RpZmYvc3RhbmRhcmRMaW5lc0RpZmZDb21wdXRlci5qcz8wMzNjIiwid2VicGFjazovLy8uLy55YXJuL2NhY2hlL21vbmFjby1lZGl0b3ItbnBtLTAuNDEuMC00ZjcxNDE2YzY0LTg3M2E4YjRlYjkuemlwL25vZGVfbW9kdWxlcy9tb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvY29tbW9uL2RpZmYvbGluZXNEaWZmQ29tcHV0ZXJzLmpzPzg1MWQiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2Jhc2UvY29tbW9uL2NvbG9yLmpzP2U2OTEiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vbGFuZ3VhZ2VzL2RlZmF1bHREb2N1bWVudENvbG9yc0NvbXB1dGVyLmpzP2JkMzIiLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9jb21tb24vc2VydmljZXMvZWRpdG9yU2ltcGxlV29ya2VyLmpzPzc0ZTciLCJ3ZWJwYWNrOi8vLy4vLnlhcm4vY2FjaGUvbW9uYWNvLWVkaXRvci1ucG0tMC40MS4wLTRmNzE0MTZjNjQtODczYThiNGViOS56aXAvbm9kZV9tb2R1bGVzL21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9lZGl0b3Iud29ya2VyLmpzP2U3NjUiXSwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBBdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IG9uIEV2ZW50RW1pdHRlciBieSBpbXBsZW1lbnRpbmcgYSBzdWJzZXQgb2YgdGhlIGludGVyZmFjZS5cbmV4cG9ydCBjbGFzcyBFcnJvckhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUuc3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVycm9yTm9UZWxlbWV0cnkuaXNFcnJvck5vVGVsZW1ldHJ5KGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3JOb1RlbGVtZXRyeShlLm1lc3NhZ2UgKyAnXFxuXFxuJyArIGUuc3RhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLm1lc3NhZ2UgKyAnXFxuXFxuJyArIGUuc3RhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVtaXQoZSkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvblVuZXhwZWN0ZWRFcnJvcihlKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcihlKTtcbiAgICAgICAgdGhpcy5lbWl0KGUpO1xuICAgIH1cbiAgICAvLyBGb3IgZXh0ZXJuYWwgZXJyb3JzLCB3ZSBkb24ndCB3YW50IHRoZSBsaXN0ZW5lcnMgdG8gYmUgY2FsbGVkXG4gICAgb25VbmV4cGVjdGVkRXh0ZXJuYWxFcnJvcihlKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcihlKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuZXhwb3J0IGZ1bmN0aW9uIG9uVW5leHBlY3RlZEVycm9yKGUpIHtcbiAgICAvLyBpZ25vcmUgZXJyb3JzIGZyb20gY2FuY2VsbGVkIHByb21pc2VzXG4gICAgaWYgKCFpc0NhbmNlbGxhdGlvbkVycm9yKGUpKSB7XG4gICAgICAgIGVycm9ySGFuZGxlci5vblVuZXhwZWN0ZWRFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvblVuZXhwZWN0ZWRFeHRlcm5hbEVycm9yKGUpIHtcbiAgICAvLyBpZ25vcmUgZXJyb3JzIGZyb20gY2FuY2VsbGVkIHByb21pc2VzXG4gICAgaWYgKCFpc0NhbmNlbGxhdGlvbkVycm9yKGUpKSB7XG4gICAgICAgIGVycm9ySGFuZGxlci5vblVuZXhwZWN0ZWRFeHRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybUVycm9yRm9yU2VyaWFsaXphdGlvbihlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyb3I7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gZXJyb3Iuc3RhY2t0cmFjZSB8fCBlcnJvci5zdGFjaztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpc0Vycm9yOiB0cnVlLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIG5vVGVsZW1ldHJ5OiBFcnJvck5vVGVsZW1ldHJ5LmlzRXJyb3JOb1RlbGVtZXRyeShlcnJvcilcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gcmV0dXJuIGFzIGlzXG4gICAgcmV0dXJuIGVycm9yO1xufVxuY29uc3QgY2FuY2VsZWROYW1lID0gJ0NhbmNlbGVkJztcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlcnJvciBpcyBhIHByb21pc2UgaW4gY2FuY2VsZWQgc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsbGF0aW9uRXJyb3IoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FcnJvcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gY2FuY2VsZWROYW1lICYmIGVycm9yLm1lc3NhZ2UgPT09IGNhbmNlbGVkTmFtZTtcbn1cbi8vICEhIUlNUE9SVEFOVCEhIVxuLy8gRG8gTk9UIGNoYW5nZSB0aGlzIGNsYXNzIGJlY2F1c2UgaXQgaXMgYWxzbyB1c2VkIGFzIGFuIEFQSS10eXBlLlxuZXhwb3J0IGNsYXNzIENhbmNlbGxhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihjYW5jZWxlZE5hbWUpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIENhbmNlbGxhdGlvbkVycm9yIGBuZXcgQ2FuY2VsbGF0aW9uRXJyb3IoKWB9IGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbmNlbGVkKCkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGNhbmNlbGVkTmFtZSk7XG4gICAgZXJyb3IubmFtZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlsbGVnYWxBcmd1bWVudChuYW1lKSB7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihgSWxsZWdhbCBhcmd1bWVudDogJHtuYW1lfWApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignSWxsZWdhbCBhcmd1bWVudCcpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpbGxlZ2FsU3RhdGUobmFtZSkge1xuICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoYElsbGVnYWwgc3RhdGU6ICR7bmFtZX1gKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0lsbGVnYWwgc3RhdGUnKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTm90U3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcignTm90U3VwcG9ydGVkJyk7XG4gICAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aGF0IHdoZW4gdGhyb3duIHdvbid0IGJlIGxvZ2dlZCBpbiB0ZWxlbWV0cnkgYXMgYW4gdW5oYW5kbGVkIGVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JOb1RlbGVtZXRyeSBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICAgICAgc3VwZXIobXNnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0NvZGVFeHBlY3RlZEVycm9yJztcbiAgICB9XG4gICAgc3RhdGljIGZyb21FcnJvcihlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yTm9UZWxlbWV0cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEVycm9yTm9UZWxlbWV0cnkoKTtcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgcmVzdWx0LnN0YWNrID0gZXJyLnN0YWNrO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgaXNFcnJvck5vVGVsZW1ldHJ5KGVycikge1xuICAgICAgICByZXR1cm4gZXJyLm5hbWUgPT09ICdDb2RlRXhwZWN0ZWRFcnJvcic7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGVycm9yIGluZGljYXRlcyBhIGJ1Zy5cbiAqIERvIG5vdCB0aHJvdyB0aGlzIGZvciBpbnZhbGlkIHVzZXIgaW5wdXQuXG4gKiBPbmx5IGNhdGNoIHRoaXMgZXJyb3IgdG8gcmVjb3ZlciBncmFjZWZ1bGx5IGZyb20gYnVncy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1Z0luZGljYXRpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ0FuIHVuZXhwZWN0ZWQgYnVnIG9jY3VycmVkLicpO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQnVnSW5kaWNhdGluZ0Vycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIC8vIEJlY2F1c2Ugd2Uga25vdyBmb3Igc3VyZSBvbmx5IGJ1Z2d5IGNvZGUgdGhyb3dzIHRoaXMsXG4gICAgICAgIC8vIHdlIGRlZmluaXRlbHkgd2FudCB0byBicmVhayBoZXJlIGFuZCBmaXggdGhlIGJ1Zy5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXG4gICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgIH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGRpZENhbGwgPSBmYWxzZTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChkaWRDYWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGRpZENhbGwgPSB0cnVlO1xuICAgICAgICByZXN1bHQgPSBmbi5hcHBseShfdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgdmFyIEl0ZXJhYmxlO1xuKGZ1bmN0aW9uIChJdGVyYWJsZSkge1xuICAgIGZ1bmN0aW9uIGlzKHRoaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGluZyAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0aGluZ1tTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xuICAgIH1cbiAgICBJdGVyYWJsZS5pcyA9IGlzO1xuICAgIGNvbnN0IF9lbXB0eSA9IE9iamVjdC5mcmVlemUoW10pO1xuICAgIGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgICAgICByZXR1cm4gX2VtcHR5O1xuICAgIH1cbiAgICBJdGVyYWJsZS5lbXB0eSA9IGVtcHR5O1xuICAgIGZ1bmN0aW9uKiBzaW5nbGUoZWxlbWVudCkge1xuICAgICAgICB5aWVsZCBlbGVtZW50O1xuICAgIH1cbiAgICBJdGVyYWJsZS5zaW5nbGUgPSBzaW5nbGU7XG4gICAgZnVuY3Rpb24gd3JhcChpdGVyYWJsZU9yRWxlbWVudCkge1xuICAgICAgICBpZiAoaXMoaXRlcmFibGVPckVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlcmFibGVPckVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc2luZ2xlKGl0ZXJhYmxlT3JFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBJdGVyYWJsZS53cmFwID0gd3JhcDtcbiAgICBmdW5jdGlvbiBmcm9tKGl0ZXJhYmxlKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZSB8fCBfZW1wdHk7XG4gICAgfVxuICAgIEl0ZXJhYmxlLmZyb20gPSBmcm9tO1xuICAgIGZ1bmN0aW9uIGlzRW1wdHkoaXRlcmFibGUpIHtcbiAgICAgICAgcmV0dXJuICFpdGVyYWJsZSB8fCBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLmRvbmUgPT09IHRydWU7XG4gICAgfVxuICAgIEl0ZXJhYmxlLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGZ1bmN0aW9uIGZpcnN0KGl0ZXJhYmxlKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLnZhbHVlO1xuICAgIH1cbiAgICBJdGVyYWJsZS5maXJzdCA9IGZpcnN0O1xuICAgIGZ1bmN0aW9uIHNvbWUoaXRlcmFibGUsIHByZWRpY2F0ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIEl0ZXJhYmxlLnNvbWUgPSBzb21lO1xuICAgIGZ1bmN0aW9uIGZpbmQoaXRlcmFibGUsIHByZWRpY2F0ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBJdGVyYWJsZS5maW5kID0gZmluZDtcbiAgICBmdW5jdGlvbiogZmlsdGVyKGl0ZXJhYmxlLCBwcmVkaWNhdGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBJdGVyYWJsZS5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgZnVuY3Rpb24qIG1hcChpdGVyYWJsZSwgZm4pIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICB5aWVsZCBmbihlbGVtZW50LCBpbmRleCsrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBJdGVyYWJsZS5tYXAgPSBtYXA7XG4gICAgZnVuY3Rpb24qIGNvbmNhdCguLi5pdGVyYWJsZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVyYWJsZSBvZiBpdGVyYWJsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgSXRlcmFibGUuY29uY2F0ID0gY29uY2F0O1xuICAgIGZ1bmN0aW9uIHJlZHVjZShpdGVyYWJsZSwgcmVkdWNlciwgaW5pdGlhbFZhbHVlKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHJlZHVjZXIodmFsdWUsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgSXRlcmFibGUucmVkdWNlID0gcmVkdWNlO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gaXRlcmFibGUgc2xpY2Ugb2YgdGhlIGFycmF5LCB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyBgYXJyYXkuc2xpY2UoKWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24qIHNsaWNlKGFyciwgZnJvbSwgdG8gPSBhcnIubGVuZ3RoKSB7XG4gICAgICAgIGlmIChmcm9tIDwgMCkge1xuICAgICAgICAgICAgZnJvbSArPSBhcnIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0byA8IDApIHtcbiAgICAgICAgICAgIHRvICs9IGFyci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodG8gPiBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0byA9IGFyci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGZyb20gPCB0bzsgZnJvbSsrKSB7XG4gICAgICAgICAgICB5aWVsZCBhcnJbZnJvbV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgSXRlcmFibGUuc2xpY2UgPSBzbGljZTtcbiAgICAvKipcbiAgICAgKiBDb25zdW1lcyBgYXRNb3N0YCBlbGVtZW50cyBmcm9tIGl0ZXJhYmxlIGFuZCByZXR1cm5zIHRoZSBjb25zdW1lZCBlbGVtZW50cyxcbiAgICAgKiBhbmQgYW4gaXRlcmFibGUgZm9yIHRoZSByZXN0IG9mIHRoZSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25zdW1lKGl0ZXJhYmxlLCBhdE1vc3QgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgY29uc3QgY29uc3VtZWQgPSBbXTtcbiAgICAgICAgaWYgKGF0TW9zdCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtjb25zdW1lZCwgaXRlcmFibGVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0TW9zdDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbY29uc3VtZWQsIEl0ZXJhYmxlLmVtcHR5KCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3VtZWQucHVzaChuZXh0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbnN1bWVkLCB7IFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gaXRlcmF0b3I7IH0gfV07XG4gICAgfVxuICAgIEl0ZXJhYmxlLmNvbnN1bWUgPSBjb25zdW1lO1xufSkoSXRlcmFibGUgfHwgKEl0ZXJhYmxlID0ge30pKTtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgb25jZSB9IGZyb20gJy4vZnVuY3Rpb25hbC5qcyc7XG5pbXBvcnQgeyBJdGVyYWJsZSB9IGZyb20gJy4vaXRlcmF0b3IuanMnO1xuLy8gI3JlZ2lvbiBEaXNwb3NhYmxlIFRyYWNraW5nXG4vKipcbiAqIEVuYWJsZXMgbG9nZ2luZyBvZiBwb3RlbnRpYWxseSBsZWFrZWQgZGlzcG9zYWJsZXMuXG4gKlxuICogQSBkaXNwb3NhYmxlIGlzIGNvbnNpZGVyZWQgbGVha2VkIGlmIGl0IGlzIG5vdCBkaXNwb3NlZCBvciBub3QgcmVnaXN0ZXJlZCBhcyB0aGUgY2hpbGQgb2ZcbiAqIGFub3RoZXIgZGlzcG9zYWJsZS4gVGhpcyB0cmFja2luZyBpcyB2ZXJ5IHNpbXBsZSBhbiBvbmx5IHdvcmtzIGZvciBjbGFzc2VzIHRoYXQgZWl0aGVyXG4gKiBleHRlbmQgRGlzcG9zYWJsZSBvciB1c2UgYSBEaXNwb3NhYmxlU3RvcmUuIFRoaXMgbWVhbnMgdGhlcmUgYXJlIGEgbG90IG9mIGZhbHNlIHBvc2l0aXZlcy5cbiAqL1xuY29uc3QgVFJBQ0tfRElTUE9TQUJMRVMgPSBmYWxzZTtcbmxldCBkaXNwb3NhYmxlVHJhY2tlciA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gc2V0RGlzcG9zYWJsZVRyYWNrZXIodHJhY2tlcikge1xuICAgIGRpc3Bvc2FibGVUcmFja2VyID0gdHJhY2tlcjtcbn1cbmlmIChUUkFDS19ESVNQT1NBQkxFUykge1xuICAgIGNvbnN0IF9faXNfZGlzcG9zYWJsZV90cmFja2VkX18gPSAnX19pc19kaXNwb3NhYmxlX3RyYWNrZWRfXyc7XG4gICAgc2V0RGlzcG9zYWJsZVRyYWNrZXIobmV3IGNsYXNzIHtcbiAgICAgICAgdHJhY2tEaXNwb3NhYmxlKHgpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gbmV3IEVycm9yKCdQb3RlbnRpYWxseSBsZWFrZWQgZGlzcG9zYWJsZScpLnN0YWNrO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF4W19faXNfZGlzcG9zYWJsZV90cmFja2VkX19dKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0YWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAzMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRQYXJlbnQoY2hpbGQsIHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkICE9PSBEaXNwb3NhYmxlLk5vbmUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFtfX2lzX2Rpc3Bvc2FibGVfdHJhY2tlZF9fXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub29wXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcmtBc0Rpc3Bvc2VkKGRpc3Bvc2FibGUpIHtcbiAgICAgICAgICAgIGlmIChkaXNwb3NhYmxlICYmIGRpc3Bvc2FibGUgIT09IERpc3Bvc2FibGUuTm9uZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVbX19pc19kaXNwb3NhYmxlX3RyYWNrZWRfX10gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9vcFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXJrQXNTaW5nbGV0b24oZGlzcG9zYWJsZSkgeyB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiB0cmFja0Rpc3Bvc2FibGUoeCkge1xuICAgIGRpc3Bvc2FibGVUcmFja2VyID09PSBudWxsIHx8IGRpc3Bvc2FibGVUcmFja2VyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaXNwb3NhYmxlVHJhY2tlci50cmFja0Rpc3Bvc2FibGUoeCk7XG4gICAgcmV0dXJuIHg7XG59XG5mdW5jdGlvbiBtYXJrQXNEaXNwb3NlZChkaXNwb3NhYmxlKSB7XG4gICAgZGlzcG9zYWJsZVRyYWNrZXIgPT09IG51bGwgfHwgZGlzcG9zYWJsZVRyYWNrZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpc3Bvc2FibGVUcmFja2VyLm1hcmtBc0Rpc3Bvc2VkKGRpc3Bvc2FibGUpO1xufVxuZnVuY3Rpb24gc2V0UGFyZW50T2ZEaXNwb3NhYmxlKGNoaWxkLCBwYXJlbnQpIHtcbiAgICBkaXNwb3NhYmxlVHJhY2tlciA9PT0gbnVsbCB8fCBkaXNwb3NhYmxlVHJhY2tlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlzcG9zYWJsZVRyYWNrZXIuc2V0UGFyZW50KGNoaWxkLCBwYXJlbnQpO1xufVxuZnVuY3Rpb24gc2V0UGFyZW50T2ZEaXNwb3NhYmxlcyhjaGlsZHJlbiwgcGFyZW50KSB7XG4gICAgaWYgKCFkaXNwb3NhYmxlVHJhY2tlcikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgZGlzcG9zYWJsZVRyYWNrZXIuc2V0UGFyZW50KGNoaWxkLCBwYXJlbnQpO1xuICAgIH1cbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHNpbmdsZXRvbiB3aGljaCBkb2VzIG5vdCBuZWVkIHRvIGJlIGRpc3Bvc2VkLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrQXNTaW5nbGV0b24oc2luZ2xldG9uKSB7XG4gICAgZGlzcG9zYWJsZVRyYWNrZXIgPT09IG51bGwgfHwgZGlzcG9zYWJsZVRyYWNrZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpc3Bvc2FibGVUcmFja2VyLm1hcmtBc1NpbmdsZXRvbihzaW5nbGV0b24pO1xuICAgIHJldHVybiBzaW5nbGV0b247XG59XG4vKipcbiAqIENoZWNrIGlmIGB0aGluZ2AgaXMge0BsaW5rIElEaXNwb3NhYmxlIGRpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNwb3NhYmxlKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZy5kaXNwb3NlID09PSAnZnVuY3Rpb24nICYmIHRoaW5nLmRpc3Bvc2UubGVuZ3RoID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoYXJnKSB7XG4gICAgaWYgKEl0ZXJhYmxlLmlzKGFyZykpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZCBvZiBhcmcpIHtcbiAgICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCAnRW5jb3VudGVyZWQgZXJyb3JzIHdoaWxlIGRpc3Bvc2luZyBvZiBzdG9yZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZykgPyBbXSA6IGFyZztcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJnKSB7XG4gICAgICAgIGFyZy5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBhcmc7XG4gICAgfVxufVxuLyoqXG4gKiBDb21iaW5lIG11bHRpcGxlIGRpc3Bvc2FibGUgdmFsdWVzIGludG8gYSBzaW5nbGUge0BsaW5rIElEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVkRGlzcG9zYWJsZSguLi5kaXNwb3NhYmxlcykge1xuICAgIGNvbnN0IHBhcmVudCA9IHRvRGlzcG9zYWJsZSgoKSA9PiBkaXNwb3NlKGRpc3Bvc2FibGVzKSk7XG4gICAgc2V0UGFyZW50T2ZEaXNwb3NhYmxlcyhkaXNwb3NhYmxlcywgcGFyZW50KTtcbiAgICByZXR1cm4gcGFyZW50O1xufVxuLyoqXG4gKiBUdXJuIGEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIGRpc3Bvc2UgaW50byBhbiB7QGxpbmsgSURpc3Bvc2FibGV9LlxuICpcbiAqIEBwYXJhbSBmbiBDbGVhbiB1cCBmdW5jdGlvbiwgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgb25seSAqKm9uY2UqKi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRGlzcG9zYWJsZShmbikge1xuICAgIGNvbnN0IHNlbGYgPSB0cmFja0Rpc3Bvc2FibGUoe1xuICAgICAgICBkaXNwb3NlOiBvbmNlKCgpID0+IHtcbiAgICAgICAgICAgIG1hcmtBc0Rpc3Bvc2VkKHNlbGYpO1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbn1cbi8qKlxuICogTWFuYWdlcyBhIGNvbGxlY3Rpb24gb2YgZGlzcG9zYWJsZSB2YWx1ZXMuXG4gKlxuICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBtYW5hZ2UgbXVsdGlwbGUgZGlzcG9zYWJsZXMuIEEgYERpc3Bvc2FibGVTdG9yZWAgaXMgc2FmZXIgdG8gd29yayB3aXRoIHRoYW4gYW5cbiAqIGBJRGlzcG9zYWJsZVtdYCBhcyBpdCBjb25zaWRlcnMgZWRnZSBjYXNlcywgc3VjaCBhcyByZWdpc3RlcmluZyB0aGUgc2FtZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyBvciBhZGRpbmcgYW4gaXRlbSB0byBhXG4gKiBzdG9yZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl90b0Rpc3Bvc2UgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdHJhY2tEaXNwb3NhYmxlKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIG9mIGFsbCByZWdpc3RlcmVkIGRpc3Bvc2FibGVzIGFuZCBtYXJrIHRoaXMgb2JqZWN0IGFzIGRpc3Bvc2VkLlxuICAgICAqXG4gICAgICogQW55IGZ1dHVyZSBkaXNwb3NhYmxlcyBhZGRlZCB0byB0aGlzIG9iamVjdCB3aWxsIGJlIGRpc3Bvc2VkIG9mIG9uIGBhZGRgLlxuICAgICAqL1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbWFya0FzRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gYHRydWVgIGlmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGRpc3Bvc2VkIG9mLlxuICAgICAqL1xuICAgIGdldCBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNEaXNwb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBvZiBhbGwgcmVnaXN0ZXJlZCBkaXNwb3NhYmxlcyBidXQgZG8gbm90IG1hcmsgdGhpcyBvYmplY3QgYXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl90b0Rpc3Bvc2Uuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuX3RvRGlzcG9zZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl90b0Rpc3Bvc2UuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcge0BsaW5rIElEaXNwb3NhYmxlIGRpc3Bvc2FibGV9IHRvIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIGFkZChvKSB7XG4gICAgICAgIGlmICghbykge1xuICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG8gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhJyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UGFyZW50T2ZEaXNwb3NhYmxlKG8sIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5faXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgaWYgKCFEaXNwb3NhYmxlU3RvcmUuRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG5ldyBFcnJvcignVHJ5aW5nIHRvIGFkZCBhIGRpc3Bvc2FibGUgdG8gYSBEaXNwb3NhYmxlU3RvcmUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9mLiBUaGUgYWRkZWQgb2JqZWN0IHdpbGwgYmUgbGVha2VkIScpLnN0YWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RvRGlzcG9zZS5hZGQobyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG87XG4gICAgfVxufVxuRGlzcG9zYWJsZVN0b3JlLkRJU0FCTEVfRElTUE9TRURfV0FSTklORyA9IGZhbHNlO1xuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIHtAbGluayBJRGlzcG9zYWJsZSBkaXNwb3NhYmxlfSBvYmplY3QuXG4gKlxuICogU3ViY2xhc3NlcyBjYW4ge0BsaW5rY29kZSBfcmVnaXN0ZXJ9IGRpc3Bvc2FibGVzIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAgd2hlbiB0aGlzIG9iamVjdCBpcyBkaXNwb3NlZCBvZi5cbiAqL1xuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9zdG9yZSA9IG5ldyBEaXNwb3NhYmxlU3RvcmUoKTtcbiAgICAgICAgdHJhY2tEaXNwb3NhYmxlKHRoaXMpO1xuICAgICAgICBzZXRQYXJlbnRPZkRpc3Bvc2FibGUodGhpcy5fc3RvcmUsIHRoaXMpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBtYXJrQXNEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBvYCB0byB0aGUgY29sbGVjdGlvbiBvZiBkaXNwb3NhYmxlcyBtYW5hZ2VkIGJ5IHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIF9yZWdpc3RlcihvKSB7XG4gICAgICAgIGlmIChvID09PSB0aGlzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIGRpc3Bvc2FibGUgb24gaXRzZWxmIScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5hZGQobyk7XG4gICAgfVxufVxuLyoqXG4gKiBBIGRpc3Bvc2FibGUgdGhhdCBkb2VzIG5vdGhpbmcgd2hlbiBpdCBpcyBkaXNwb3NlZCBvZi5cbiAqXG4gKiBUT0RPOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgcHJvcGVydHkuXG4gKi9cbkRpc3Bvc2FibGUuTm9uZSA9IE9iamVjdC5mcmVlemUoeyBkaXNwb3NlKCkgeyB9IH0pO1xuLyoqXG4gKiBNYW5hZ2VzIHRoZSBsaWZlY3ljbGUgb2YgYSBkaXNwb3NhYmxlIHZhbHVlIHRoYXQgbWF5IGJlIGNoYW5nZWQuXG4gKlxuICogVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgZGlzcG9zYWJsZSB2YWx1ZSBpcyBjaGFuZ2VkLCB0aGUgcHJldmlvdXNseSBoZWxkIGRpc3Bvc2FibGUgaXMgZGlzcG9zZWQgb2YuIFlvdSBjYW5cbiAqIGFsc28gcmVnaXN0ZXIgYSBgTXV0YWJsZURpc3Bvc2FibGVgIG9uIGEgYERpc3Bvc2FibGVgIHRvIGVuc3VyZSBpdCBpcyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdXRhYmxlRGlzcG9zYWJsZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdHJhY2tEaXNwb3NhYmxlKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Rpc3Bvc2VkID8gdW5kZWZpbmVkIDogdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuX3ZhbHVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGlzcG9zZSgpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHNldFBhcmVudE9mRGlzcG9zYWJsZSh2YWx1ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VkIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgbWFya0FzRGlzcG9zZWQodGhpcyk7XG4gICAgICAgIChfYSA9IHRoaXMuX3ZhbHVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgUmVmQ291bnRlZERpc3Bvc2FibGUge1xuICAgIGNvbnN0cnVjdG9yKF9kaXNwb3NhYmxlKSB7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2FibGUgPSBfZGlzcG9zYWJsZTtcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDE7XG4gICAgfVxuICAgIGFjcXVpcmUoKSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlbGVhc2UoKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2NvdW50ZXIgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2FibGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBJbW1vcnRhbFJlZmVyZW5jZSB7XG4gICAgY29uc3RydWN0b3Iob2JqZWN0KSB7XG4gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuICAgIH1cbiAgICBkaXNwb3NlKCkgeyB9XG59XG4vKipcbiAqIEEgbWFwIHRoZSBtYW5hZ2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZhbHVlcyB0aGF0IGl0IHN0b3Jlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVNYXAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9zdG9yZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgICAgICB0cmFja0Rpc3Bvc2FibGUodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc3Bvc2VzIG9mIGFsbCBzdG9yZWQgdmFsdWVzIGFuZCBtYXJrIHRoaXMgb2JqZWN0IGFzIGRpc3Bvc2VkLlxuICAgICAqXG4gICAgICogVHJ5aW5nIHRvIHVzZSB0aGlzIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBkaXNwb3NlZCBvZiBpcyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBtYXJrQXNEaXNwb3NlZCh0aGlzKTtcbiAgICAgICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xlYXJBbmREaXNwb3NlQWxsKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc3Bvc2VzIG9mIGFsbCBzdG9yZWQgdmFsdWVzIGFuZCBjbGVhciB0aGUgbWFwLCBidXQgRE8gTk9UIG1hcmsgdGhpcyBvYmplY3QgYXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgY2xlYXJBbmREaXNwb3NlQWxsKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3N0b3JlLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLl9zdG9yZS52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdG9yZS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldChrZXkpO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSwgc2tpcERpc3Bvc2VPbk92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihuZXcgRXJyb3IoJ1RyeWluZyB0byBhZGQgYSBkaXNwb3NhYmxlIHRvIGEgRGlzcG9zYWJsZU1hcCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuIFRoZSBhZGRlZCBvYmplY3Qgd2lsbCBiZSBsZWFrZWQhJykuc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2tpcERpc3Bvc2VPbk92ZXJ3cml0ZSkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5fc3RvcmUuZ2V0KGtleSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RvcmUuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhlIHZhbHVlIHN0b3JlZCBmb3IgYGtleWAgZnJvbSB0aGlzIG1hcCBhbmQgYWxzbyBkaXNwb3NlIG9mIGl0LlxuICAgICAqL1xuICAgIGRlbGV0ZUFuZERpc3Bvc2Uoa2V5KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5fc3RvcmUuZ2V0KGtleSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuX3N0b3JlLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmNsYXNzIE5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5uZXh0ID0gTm9kZS5VbmRlZmluZWQ7XG4gICAgICAgIHRoaXMucHJldiA9IE5vZGUuVW5kZWZpbmVkO1xuICAgIH1cbn1cbk5vZGUuVW5kZWZpbmVkID0gbmV3IE5vZGUodW5kZWZpbmVkKTtcbmV4cG9ydCBjbGFzcyBMaW5rZWRMaXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fZmlyc3QgPSBOb2RlLlVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbGFzdCA9IE5vZGUuVW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlyc3QgPT09IE5vZGUuVW5kZWZpbmVkO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLl9maXJzdDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT09IE5vZGUuVW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgbm9kZS5wcmV2ID0gTm9kZS5VbmRlZmluZWQ7XG4gICAgICAgICAgICBub2RlLm5leHQgPSBOb2RlLlVuZGVmaW5lZDtcbiAgICAgICAgICAgIG5vZGUgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZpcnN0ID0gTm9kZS5VbmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2xhc3QgPSBOb2RlLlVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgfVxuICAgIHVuc2hpZnQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0KGVsZW1lbnQsIGZhbHNlKTtcbiAgICB9XG4gICAgcHVzaChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnQoZWxlbWVudCwgdHJ1ZSk7XG4gICAgfVxuICAgIF9pbnNlcnQoZWxlbWVudCwgYXRUaGVFbmQpIHtcbiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IG5ldyBOb2RlKGVsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5fZmlyc3QgPT09IE5vZGUuVW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maXJzdCA9IG5ld05vZGU7XG4gICAgICAgICAgICB0aGlzLl9sYXN0ID0gbmV3Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhdFRoZUVuZCkge1xuICAgICAgICAgICAgLy8gcHVzaFxuICAgICAgICAgICAgY29uc3Qgb2xkTGFzdCA9IHRoaXMuX2xhc3Q7XG4gICAgICAgICAgICB0aGlzLl9sYXN0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIG5ld05vZGUucHJldiA9IG9sZExhc3Q7XG4gICAgICAgICAgICBvbGRMYXN0Lm5leHQgPSBuZXdOb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gdW5zaGlmdFxuICAgICAgICAgICAgY29uc3Qgb2xkRmlyc3QgPSB0aGlzLl9maXJzdDtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIG5ld05vZGUubmV4dCA9IG9sZEZpcnN0O1xuICAgICAgICAgICAgb2xkRmlyc3QucHJldiA9IG5ld05vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2l6ZSArPSAxO1xuICAgICAgICBsZXQgZGlkUmVtb3ZlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRpZFJlbW92ZSkge1xuICAgICAgICAgICAgICAgIGRpZFJlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlKG5ld05vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBzaGlmdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0ID09PSBOb2RlLlVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX2ZpcnN0LmVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmUodGhpcy5fZmlyc3QpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBwb3AoKSB7XG4gICAgICAgIGlmICh0aGlzLl9sYXN0ID09PSBOb2RlLlVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX2xhc3QuZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZSh0aGlzLl9sYXN0KTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3JlbW92ZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnByZXYgIT09IE5vZGUuVW5kZWZpbmVkICYmIG5vZGUubmV4dCAhPT0gTm9kZS5VbmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIG1pZGRsZVxuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gbm9kZS5wcmV2O1xuICAgICAgICAgICAgYW5jaG9yLm5leHQgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICBub2RlLm5leHQucHJldiA9IGFuY2hvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnByZXYgPT09IE5vZGUuVW5kZWZpbmVkICYmIG5vZGUubmV4dCA9PT0gTm9kZS5VbmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgbm9kZVxuICAgICAgICAgICAgdGhpcy5fZmlyc3QgPSBOb2RlLlVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3QgPSBOb2RlLlVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5leHQgPT09IE5vZGUuVW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBsYXN0XG4gICAgICAgICAgICB0aGlzLl9sYXN0ID0gdGhpcy5fbGFzdC5wcmV2O1xuICAgICAgICAgICAgdGhpcy5fbGFzdC5uZXh0ID0gTm9kZS5VbmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5wcmV2ID09PSBOb2RlLlVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gZmlyc3RcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0ID0gdGhpcy5fZmlyc3QubmV4dDtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0LnByZXYgPSBOb2RlLlVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBkb25lXG4gICAgICAgIHRoaXMuX3NpemUgLT0gMTtcbiAgICB9XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuX2ZpcnN0O1xuICAgICAgICB3aGlsZSAobm9kZSAhPT0gTm9kZS5VbmRlZmluZWQpIHtcbiAgICAgICAgICAgIHlpZWxkIG5vZGUuZWxlbWVudDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmNvbnN0IGhhc1BlcmZvcm1hbmNlTm93ID0gKGdsb2JhbFRoaXMucGVyZm9ybWFuY2UgJiYgdHlwZW9mIGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nKTtcbmV4cG9ydCBjbGFzcyBTdG9wV2F0Y2gge1xuICAgIHN0YXRpYyBjcmVhdGUoaGlnaFJlc29sdXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdG9wV2F0Y2goaGlnaFJlc29sdXRpb24pO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihoaWdoUmVzb2x1dGlvbikge1xuICAgICAgICB0aGlzLl9ub3cgPSBoYXNQZXJmb3JtYW5jZU5vdyAmJiBoaWdoUmVzb2x1dGlvbiA9PT0gZmFsc2UgPyBEYXRlLm5vdyA6IGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93LmJpbmQoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSk7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRoaXMuX25vdygpO1xuICAgICAgICB0aGlzLl9zdG9wVGltZSA9IC0xO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLl9zdG9wVGltZSA9IHRoaXMuX25vdygpO1xuICAgIH1cbiAgICBlbGFwc2VkKCkge1xuICAgICAgICBpZiAodGhpcy5fc3RvcFRpbWUgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RvcFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX25vdygpIC0gdGhpcy5fc3RhcnRUaW1lO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IG9uVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgb25jZSBhcyBvbmNlRm4gfSBmcm9tICcuL2Z1bmN0aW9uYWwuanMnO1xuaW1wb3J0IHsgY29tYmluZWREaXNwb3NhYmxlLCBEaXNwb3NhYmxlLCBEaXNwb3NhYmxlU3RvcmUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJy4vbGlmZWN5Y2xlLmpzJztcbmltcG9ydCB7IExpbmtlZExpc3QgfSBmcm9tICcuL2xpbmtlZExpc3QuanMnO1xuaW1wb3J0IHsgU3RvcFdhdGNoIH0gZnJvbSAnLi9zdG9wd2F0Y2guanMnO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIHByaW50IHdhcm5pbmdzIHdoZW5ldmVyIGFuIGVtaXR0ZXIgd2l0aCBsaXN0ZW5lcnMgaXMgZGlzcG9zZWQuIFRoYXQgaXMgYSBzaWduIG9mIGNvZGUgc21lbGwuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgX2VuYWJsZURpc3Bvc2VXaXRoTGlzdGVuZXJXYXJuaW5nID0gZmFsc2U7XG4vLyBfZW5hYmxlRGlzcG9zZVdpdGhMaXN0ZW5lcldhcm5pbmcgPSBCb29sZWFuKFwiVFJVRVwiKTsgLy8gY2F1c2VzIGEgbGludGVyIHdhcm5pbmcgc28gdGhhdCBpdCBjYW5ub3QgYmUgcHVzaGVkXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gcHJpbnQgd2FybmluZ3Mgd2hlbmV2ZXIgYSBzbmFwc2hvdHRlZCBldmVudCBpcyB1c2VkIHJlcGVhdGVkbHkgd2l0aG91dCBjbGVhbnVwLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvdnNjb2RlL2lzc3Vlcy8xNDI4NTFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBfZW5hYmxlU25hcHNob3RQb3RlbnRpYWxMZWFrV2FybmluZyA9IGZhbHNlO1xuZXhwb3J0IHZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBFdmVudC5Ob25lID0gKCkgPT4gRGlzcG9zYWJsZS5Ob25lO1xuICAgIGZ1bmN0aW9uIF9hZGRMZWFrYWdlVHJhY2VMb2dpYyhvcHRpb25zKSB7XG4gICAgICAgIGlmIChfZW5hYmxlU25hcHNob3RQb3RlbnRpYWxMZWFrV2FybmluZykge1xuICAgICAgICAgICAgY29uc3QgeyBvbkRpZEFkZExpc3RlbmVyOiBvcmlnTGlzdGVuZXJEaWRBZGQgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IFN0YWNrdHJhY2UuY3JlYXRlKCk7XG4gICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgb3B0aW9ucy5vbkRpZEFkZExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybignc25hcHNob3R0ZWQgZW1pdHRlciBMSUtFTFkgdXNlZCBwdWJsaWMgYW5kIFNIT1VMRCBIQVZFIEJFRU4gY3JlYXRlZCB3aXRoIERpc3Bvc2FibGVTdG9yZS4gc25hcHNob3R0ZWQgaGVyZScpO1xuICAgICAgICAgICAgICAgICAgICBzdGFjay5wcmludCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcmlnTGlzdGVuZXJEaWRBZGQgPT09IG51bGwgfHwgb3JpZ0xpc3RlbmVyRGlkQWRkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnTGlzdGVuZXJEaWRBZGQoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYW4gZXZlbnQsIHJldHVybnMgYW5vdGhlciBldmVudCB3aGljaCBkZWJvdW5jZXMgY2FsbHMgYW5kIGRlZmVycyB0aGUgbGlzdGVuZXJzIHRvIGEgbGF0ZXIgdGFzayB2aWEgYSBzaGFyZWRcbiAgICAgKiBgc2V0VGltZW91dGAuIFRoZSBldmVudCBpcyBjb252ZXJ0ZWQgaW50byBhIHNpZ25hbCAoYEV2ZW50PHZvaWQ+YCkgdG8gYXZvaWQgYWRkaXRpb25hbCBvYmplY3QgY3JlYXRpb24gYXMgYVxuICAgICAqIHJlc3VsdCBvZiBtZXJnaW5nIGV2ZW50cyBhbmQgdG8gdHJ5IHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHRoYXQgY291bGQgYXJpc2Ugd2hlbiB1c2luZyByZWxhdGVkIGRlZmVycmVkIGFuZFxuICAgICAqIG5vbi1kZWZlcnJlZCBldmVudHMuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIChlZy4gZ2VuZXJhbCBVSSB1cGRhdGVzKSB0byBlbnN1cmUgaXQgZG9lcyBub3QgYmxvY2sgY3JpdGljYWwgd29ya1xuICAgICAqIChlZy4gbGF0ZW5jeSBvZiBrZXlwcmVzcyB0byB0ZXh0IHJlbmRlcmVkKS5cbiAgICAgKlxuICAgICAqICpOT1RFKiB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBgRXZlbnRgIGFuZCBpdCBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgYERpc3Bvc2FibGVTdG9yZWAgd2hlbmV2ZXIgdGhlIHJldHVybmVkXG4gICAgICogZXZlbnQgaXMgYWNjZXNzaWJsZSB0byBcInRoaXJkIHBhcnRpZXNcIiwgZS5nIHRoZSBldmVudCBpcyBhIHB1YmxpYyBwcm9wZXJ0eS4gT3RoZXJ3aXNlIGEgbGVha2VkIGxpc3RlbmVyIG9uIHRoZVxuICAgICAqIHJldHVybmVkIGV2ZW50IGNhdXNlcyB0aGlzIHV0aWxpdHkgdG8gbGVhayBhIGxpc3RlbmVyIG9uIHRoZSBvcmlnaW5hbCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc291cmNlIGZvciB0aGUgbmV3IGV2ZW50LlxuICAgICAqIEBwYXJhbSBkaXNwb3NhYmxlIEEgZGlzcG9zYWJsZSBzdG9yZSB0byBhZGQgdGhlIG5ldyBFdmVudEVtaXR0ZXIgdG8uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmZXIoZXZlbnQsIGRpc3Bvc2FibGUpIHtcbiAgICAgICAgcmV0dXJuIGRlYm91bmNlKGV2ZW50LCAoKSA9PiB2b2lkIDAsIDAsIHVuZGVmaW5lZCwgdHJ1ZSwgdW5kZWZpbmVkLCBkaXNwb3NhYmxlKTtcbiAgICB9XG4gICAgRXZlbnQuZGVmZXIgPSBkZWZlcjtcbiAgICAvKipcbiAgICAgKiBHaXZlbiBhbiBldmVudCwgcmV0dXJucyBhbm90aGVyIGV2ZW50IHdoaWNoIG9ubHkgZmlyZXMgb25jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc291cmNlIGZvciB0aGUgbmV3IGV2ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIChsaXN0ZW5lciwgdGhpc0FyZ3MgPSBudWxsLCBkaXNwb3NhYmxlcykgPT4ge1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzLCBpbiBjYXNlIHRoZSBldmVudCBmaXJlcyBkdXJpbmcgdGhlIGxpc3RlbmVyIGNhbGxcbiAgICAgICAgICAgIGxldCBkaWRGaXJlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmVzdWx0ID0gZXZlbnQoZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpZEZpcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRpZEZpcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXIuY2FsbCh0aGlzQXJncywgZSk7XG4gICAgICAgICAgICB9LCBudWxsLCBkaXNwb3NhYmxlcyk7XG4gICAgICAgICAgICBpZiAoZGlkRmlyZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cbiAgICBFdmVudC5vbmNlID0gb25jZTtcbiAgICAvKipcbiAgICAgKiBNYXBzIGFuIGV2ZW50IG9mIG9uZSB0eXBlIGludG8gYW4gZXZlbnQgb2YgYW5vdGhlciB0eXBlIHVzaW5nIGEgbWFwcGluZyBmdW5jdGlvbiwgc2ltaWxhciB0byBob3dcbiAgICAgKiBgQXJyYXkucHJvdG90eXBlLm1hcGAgd29ya3MuXG4gICAgICpcbiAgICAgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuICAgICAqIGV2ZW50IGlzIGFjY2Vzc2libGUgdG8gXCJ0aGlyZCBwYXJ0aWVzXCIsIGUuZyB0aGUgZXZlbnQgaXMgYSBwdWJsaWMgcHJvcGVydHkuIE90aGVyd2lzZSBhIGxlYWtlZCBsaXN0ZW5lciBvbiB0aGVcbiAgICAgKiByZXR1cm5lZCBldmVudCBjYXVzZXMgdGhpcyB1dGlsaXR5IHRvIGxlYWsgYSBsaXN0ZW5lciBvbiB0aGUgb3JpZ2luYWwgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNvdXJjZSBmb3IgdGhlIG5ldyBldmVudC5cbiAgICAgKiBAcGFyYW0gbWFwIFRoZSBtYXBwaW5nIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSBkaXNwb3NhYmxlIEEgZGlzcG9zYWJsZSBzdG9yZSB0byBhZGQgdGhlIG5ldyBFdmVudEVtaXR0ZXIgdG8uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwKGV2ZW50LCBtYXAsIGRpc3Bvc2FibGUpIHtcbiAgICAgICAgcmV0dXJuIHNuYXBzaG90KChsaXN0ZW5lciwgdGhpc0FyZ3MgPSBudWxsLCBkaXNwb3NhYmxlcykgPT4gZXZlbnQoaSA9PiBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBtYXAoaSkpLCBudWxsLCBkaXNwb3NhYmxlcyksIGRpc3Bvc2FibGUpO1xuICAgIH1cbiAgICBFdmVudC5tYXAgPSBtYXA7XG4gICAgLyoqXG4gICAgICogV3JhcHMgYW4gZXZlbnQgaW4gYW5vdGhlciBldmVudCB0aGF0IHBlcmZvcm1zIHNvbWUgZnVuY3Rpb24gb24gdGhlIGV2ZW50IG9iamVjdCBiZWZvcmUgZmlyaW5nLlxuICAgICAqXG4gICAgICogKk5PVEUqIHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGBFdmVudGAgYW5kIGl0IE1VU1QgYmUgY2FsbGVkIHdpdGggYSBgRGlzcG9zYWJsZVN0b3JlYCB3aGVuZXZlciB0aGUgcmV0dXJuZWRcbiAgICAgKiBldmVudCBpcyBhY2Nlc3NpYmxlIHRvIFwidGhpcmQgcGFydGllc1wiLCBlLmcgdGhlIGV2ZW50IGlzIGEgcHVibGljIHByb3BlcnR5LiBPdGhlcndpc2UgYSBsZWFrZWQgbGlzdGVuZXIgb24gdGhlXG4gICAgICogcmV0dXJuZWQgZXZlbnQgY2F1c2VzIHRoaXMgdXRpbGl0eSB0byBsZWFrIGEgbGlzdGVuZXIgb24gdGhlIG9yaWdpbmFsIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzb3VyY2UgZm9yIHRoZSBuZXcgZXZlbnQuXG4gICAgICogQHBhcmFtIGVhY2ggVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIGV2ZW50IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gZGlzcG9zYWJsZSBBIGRpc3Bvc2FibGUgc3RvcmUgdG8gYWRkIHRoZSBuZXcgRXZlbnRFbWl0dGVyIHRvLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2goZXZlbnQsIGVhY2gsIGRpc3Bvc2FibGUpIHtcbiAgICAgICAgcmV0dXJuIHNuYXBzaG90KChsaXN0ZW5lciwgdGhpc0FyZ3MgPSBudWxsLCBkaXNwb3NhYmxlcykgPT4gZXZlbnQoaSA9PiB7IGVhY2goaSk7IGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MsIGkpOyB9LCBudWxsLCBkaXNwb3NhYmxlcyksIGRpc3Bvc2FibGUpO1xuICAgIH1cbiAgICBFdmVudC5mb3JFYWNoID0gZm9yRWFjaDtcbiAgICBmdW5jdGlvbiBmaWx0ZXIoZXZlbnQsIGZpbHRlciwgZGlzcG9zYWJsZSkge1xuICAgICAgICByZXR1cm4gc25hcHNob3QoKGxpc3RlbmVyLCB0aGlzQXJncyA9IG51bGwsIGRpc3Bvc2FibGVzKSA9PiBldmVudChlID0+IGZpbHRlcihlKSAmJiBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBlKSwgbnVsbCwgZGlzcG9zYWJsZXMpLCBkaXNwb3NhYmxlKTtcbiAgICB9XG4gICAgRXZlbnQuZmlsdGVyID0gZmlsdGVyO1xuICAgIC8qKlxuICAgICAqIEdpdmVuIGFuIGV2ZW50LCByZXR1cm5zIHRoZSBzYW1lIGV2ZW50IGJ1dCB0eXBlZCBhcyBgRXZlbnQ8dm9pZD5gLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNpZ25hbChldmVudCkge1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICAgIEV2ZW50LnNpZ25hbCA9IHNpZ25hbDtcbiAgICBmdW5jdGlvbiBhbnkoLi4uZXZlbnRzKSB7XG4gICAgICAgIHJldHVybiAobGlzdGVuZXIsIHRoaXNBcmdzID0gbnVsbCwgZGlzcG9zYWJsZXMpID0+IGNvbWJpbmVkRGlzcG9zYWJsZSguLi5ldmVudHMubWFwKGV2ZW50ID0+IGV2ZW50KGUgPT4gbGlzdGVuZXIuY2FsbCh0aGlzQXJncywgZSksIG51bGwsIGRpc3Bvc2FibGVzKSkpO1xuICAgIH1cbiAgICBFdmVudC5hbnkgPSBhbnk7XG4gICAgLyoqXG4gICAgICogKk5PVEUqIHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGBFdmVudGAgYW5kIGl0IE1VU1QgYmUgY2FsbGVkIHdpdGggYSBgRGlzcG9zYWJsZVN0b3JlYCB3aGVuZXZlciB0aGUgcmV0dXJuZWRcbiAgICAgKiBldmVudCBpcyBhY2Nlc3NpYmxlIHRvIFwidGhpcmQgcGFydGllc1wiLCBlLmcgdGhlIGV2ZW50IGlzIGEgcHVibGljIHByb3BlcnR5LiBPdGhlcndpc2UgYSBsZWFrZWQgbGlzdGVuZXIgb24gdGhlXG4gICAgICogcmV0dXJuZWQgZXZlbnQgY2F1c2VzIHRoaXMgdXRpbGl0eSB0byBsZWFrIGEgbGlzdGVuZXIgb24gdGhlIG9yaWdpbmFsIGV2ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZShldmVudCwgbWVyZ2UsIGluaXRpYWwsIGRpc3Bvc2FibGUpIHtcbiAgICAgICAgbGV0IG91dHB1dCA9IGluaXRpYWw7XG4gICAgICAgIHJldHVybiBtYXAoZXZlbnQsIGUgPT4ge1xuICAgICAgICAgICAgb3V0cHV0ID0gbWVyZ2Uob3V0cHV0LCBlKTtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH0sIGRpc3Bvc2FibGUpO1xuICAgIH1cbiAgICBFdmVudC5yZWR1Y2UgPSByZWR1Y2U7XG4gICAgZnVuY3Rpb24gc25hcHNob3QoZXZlbnQsIGRpc3Bvc2FibGUpIHtcbiAgICAgICAgbGV0IGxpc3RlbmVyO1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgb25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IGV2ZW50KGVtaXR0ZXIuZmlyZSwgZW1pdHRlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25EaWRSZW1vdmVMYXN0TGlzdGVuZXIoKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIgPT09IG51bGwgfHwgbGlzdGVuZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxpc3RlbmVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFkaXNwb3NhYmxlKSB7XG4gICAgICAgICAgICBfYWRkTGVha2FnZVRyYWNlTG9naWMob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW1pdHRlciA9IG5ldyBFbWl0dGVyKG9wdGlvbnMpO1xuICAgICAgICBkaXNwb3NhYmxlID09PSBudWxsIHx8IGRpc3Bvc2FibGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpc3Bvc2FibGUuYWRkKGVtaXR0ZXIpO1xuICAgICAgICByZXR1cm4gZW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVib3VuY2UoZXZlbnQsIG1lcmdlLCBkZWxheSA9IDEwMCwgbGVhZGluZyA9IGZhbHNlLCBmbHVzaE9uTGlzdGVuZXJSZW1vdmUgPSBmYWxzZSwgbGVha1dhcm5pbmdUaHJlc2hvbGQsIGRpc3Bvc2FibGUpIHtcbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgbGV0IG91dHB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IG51bURlYm91bmNlZENhbGxzID0gMDtcbiAgICAgICAgbGV0IGRvRmlyZTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGxlYWtXYXJuaW5nVGhyZXNob2xkLFxuICAgICAgICAgICAgb25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBldmVudChjdXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBudW1EZWJvdW5jZWRDYWxscysrO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBtZXJnZShvdXRwdXQsIGN1cik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nICYmICFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZmlyZShvdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRvRmlyZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9vdXRwdXQgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxlYWRpbmcgfHwgbnVtRGVib3VuY2VkQ2FsbHMgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5maXJlKF9vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtRGVib3VuY2VkQ2FsbHMgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBzZXRUaW1lb3V0KGRvRmlyZSwgZGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzayhkb0ZpcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25XaWxsUmVtb3ZlTGlzdGVuZXIoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsdXNoT25MaXN0ZW5lclJlbW92ZSAmJiBudW1EZWJvdW5jZWRDYWxscyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZG9GaXJlID09PSBudWxsIHx8IGRvRmlyZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9GaXJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCkge1xuICAgICAgICAgICAgICAgIGRvRmlyZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIWRpc3Bvc2FibGUpIHtcbiAgICAgICAgICAgIF9hZGRMZWFrYWdlVHJhY2VMb2dpYyhvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbWl0dGVyID0gbmV3IEVtaXR0ZXIob3B0aW9ucyk7XG4gICAgICAgIGRpc3Bvc2FibGUgPT09IG51bGwgfHwgZGlzcG9zYWJsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlzcG9zYWJsZS5hZGQoZW1pdHRlcik7XG4gICAgICAgIHJldHVybiBlbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBFdmVudC5kZWJvdW5jZSA9IGRlYm91bmNlO1xuICAgIC8qKlxuICAgICAqIERlYm91bmNlcyBhbiBldmVudCwgZmlyaW5nIGFmdGVyIHNvbWUgZGVsYXkgKGRlZmF1bHQ9MCkgd2l0aCBhbiBhcnJheSBvZiBhbGwgZXZlbnQgb3JpZ2luYWwgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqICpOT1RFKiB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBgRXZlbnRgIGFuZCBpdCBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgYERpc3Bvc2FibGVTdG9yZWAgd2hlbmV2ZXIgdGhlIHJldHVybmVkXG4gICAgICogZXZlbnQgaXMgYWNjZXNzaWJsZSB0byBcInRoaXJkIHBhcnRpZXNcIiwgZS5nIHRoZSBldmVudCBpcyBhIHB1YmxpYyBwcm9wZXJ0eS4gT3RoZXJ3aXNlIGEgbGVha2VkIGxpc3RlbmVyIG9uIHRoZVxuICAgICAqIHJldHVybmVkIGV2ZW50IGNhdXNlcyB0aGlzIHV0aWxpdHkgdG8gbGVhayBhIGxpc3RlbmVyIG9uIHRoZSBvcmlnaW5hbCBldmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhY2N1bXVsYXRlKGV2ZW50LCBkZWxheSA9IDAsIGRpc3Bvc2FibGUpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50LmRlYm91bmNlKGV2ZW50LCAobGFzdCwgZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFsYXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3QucHVzaChlKTtcbiAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICB9LCBkZWxheSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIGRpc3Bvc2FibGUpO1xuICAgIH1cbiAgICBFdmVudC5hY2N1bXVsYXRlID0gYWNjdW11bGF0ZTtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGFuIGV2ZW50IHN1Y2ggdGhhdCBzb21lIGNvbmRpdGlvbiBpcyBfbm90XyBtZXQgbW9yZSB0aGFuIG9uY2UgaW4gYSByb3csIGVmZmVjdGl2ZWx5IGVuc3VyaW5nIGR1cGxpY2F0ZVxuICAgICAqIGV2ZW50IG9iamVjdHMgZnJvbSBkaWZmZXJlbnQgc291cmNlcyBkbyBub3QgZmlyZSB0aGUgc2FtZSBldmVudCBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuICAgICAqIGV2ZW50IGlzIGFjY2Vzc2libGUgdG8gXCJ0aGlyZCBwYXJ0aWVzXCIsIGUuZyB0aGUgZXZlbnQgaXMgYSBwdWJsaWMgcHJvcGVydHkuIE90aGVyd2lzZSBhIGxlYWtlZCBsaXN0ZW5lciBvbiB0aGVcbiAgICAgKiByZXR1cm5lZCBldmVudCBjYXVzZXMgdGhpcyB1dGlsaXR5IHRvIGxlYWsgYSBsaXN0ZW5lciBvbiB0aGUgb3JpZ2luYWwgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNvdXJjZSBmb3IgdGhlIG5ldyBldmVudC5cbiAgICAgKiBAcGFyYW0gZXF1YWxzIFRoZSBlcXVhbGl0eSBjb25kaXRpb24uXG4gICAgICogQHBhcmFtIGRpc3Bvc2FibGUgQSBkaXNwb3NhYmxlIHN0b3JlIHRvIGFkZCB0aGUgbmV3IEV2ZW50RW1pdHRlciB0by5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogLy8gRmlyZSBvbmx5IG9uZSB0aW1lIHdoZW4gYSBzaW5nbGUgd2luZG93IGlzIG9wZW5lZCBvciBmb2N1c2VkXG4gICAgICogRXZlbnQubGF0Y2goRXZlbnQuYW55KG9uRGlkT3BlbldpbmRvdywgb25EaWRGb2N1c1dpbmRvdykpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF0Y2goZXZlbnQsIGVxdWFscyA9IChhLCBiKSA9PiBhID09PSBiLCBkaXNwb3NhYmxlKSB7XG4gICAgICAgIGxldCBmaXJzdENhbGwgPSB0cnVlO1xuICAgICAgICBsZXQgY2FjaGU7XG4gICAgICAgIHJldHVybiBmaWx0ZXIoZXZlbnQsIHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSBmaXJzdENhbGwgfHwgIWVxdWFscyh2YWx1ZSwgY2FjaGUpO1xuICAgICAgICAgICAgZmlyc3RDYWxsID0gZmFsc2U7XG4gICAgICAgICAgICBjYWNoZSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHNob3VsZEVtaXQ7XG4gICAgICAgIH0sIGRpc3Bvc2FibGUpO1xuICAgIH1cbiAgICBFdmVudC5sYXRjaCA9IGxhdGNoO1xuICAgIC8qKlxuICAgICAqIFNwbGl0cyBhbiBldmVudCB3aG9zZSBwYXJhbWV0ZXIgaXMgYSB1bmlvbiB0eXBlIGludG8gMiBzZXBhcmF0ZSBldmVudHMgZm9yIGVhY2ggdHlwZSBpbiB0aGUgdW5pb24uXG4gICAgICpcbiAgICAgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuICAgICAqIGV2ZW50IGlzIGFjY2Vzc2libGUgdG8gXCJ0aGlyZCBwYXJ0aWVzXCIsIGUuZyB0aGUgZXZlbnQgaXMgYSBwdWJsaWMgcHJvcGVydHkuIE90aGVyd2lzZSBhIGxlYWtlZCBsaXN0ZW5lciBvbiB0aGVcbiAgICAgKiByZXR1cm5lZCBldmVudCBjYXVzZXMgdGhpcyB1dGlsaXR5IHRvIGxlYWsgYSBsaXN0ZW5lciBvbiB0aGUgb3JpZ2luYWwgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCB1bmRlZmluZWQ+KCkuZXZlbnQ7XG4gICAgICogY29uc3QgW251bWJlckV2ZW50LCB1bmRlZmluZWRFdmVudF0gPSBFdmVudC5zcGxpdChldmVudCwgaXNVbmRlZmluZWQpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzb3VyY2UgZm9yIHRoZSBuZXcgZXZlbnQuXG4gICAgICogQHBhcmFtIGlzVCBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGF0IGV2ZW50IGlzIG9mIHRoZSBmaXJzdCB0eXBlLlxuICAgICAqIEBwYXJhbSBkaXNwb3NhYmxlIEEgZGlzcG9zYWJsZSBzdG9yZSB0byBhZGQgdGhlIG5ldyBFdmVudEVtaXR0ZXIgdG8uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3BsaXQoZXZlbnQsIGlzVCwgZGlzcG9zYWJsZSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgRXZlbnQuZmlsdGVyKGV2ZW50LCBpc1QsIGRpc3Bvc2FibGUpLFxuICAgICAgICAgICAgRXZlbnQuZmlsdGVyKGV2ZW50LCBlID0+ICFpc1QoZSksIGRpc3Bvc2FibGUpLFxuICAgICAgICBdO1xuICAgIH1cbiAgICBFdmVudC5zcGxpdCA9IHNwbGl0O1xuICAgIC8qKlxuICAgICAqIEJ1ZmZlcnMgYW4gZXZlbnQgdW50aWwgaXQgaGFzIGEgbGlzdGVuZXIgYXR0YWNoZWQuXG4gICAgICpcbiAgICAgKiAqTk9URSogdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYEV2ZW50YCBhbmQgaXQgTVVTVCBiZSBjYWxsZWQgd2l0aCBhIGBEaXNwb3NhYmxlU3RvcmVgIHdoZW5ldmVyIHRoZSByZXR1cm5lZFxuICAgICAqIGV2ZW50IGlzIGFjY2Vzc2libGUgdG8gXCJ0aGlyZCBwYXJ0aWVzXCIsIGUuZyB0aGUgZXZlbnQgaXMgYSBwdWJsaWMgcHJvcGVydHkuIE90aGVyd2lzZSBhIGxlYWtlZCBsaXN0ZW5lciBvbiB0aGVcbiAgICAgKiByZXR1cm5lZCBldmVudCBjYXVzZXMgdGhpcyB1dGlsaXR5IHRvIGxlYWsgYSBsaXN0ZW5lciBvbiB0aGUgb3JpZ2luYWwgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNvdXJjZSBmb3IgdGhlIG5ldyBldmVudC5cbiAgICAgKiBAcGFyYW0gZmx1c2hBZnRlclRpbWVvdXQgRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGZsdXNoIHRoZSBidWZmZXIgYWZ0ZXIgYSB0aW1lb3V0IGltbWVkaWF0ZWx5IG9yIGFmdGVyIGFcbiAgICAgKiBgc2V0VGltZW91dGAgd2hlbiB0aGUgZmlyc3QgZXZlbnQgbGlzdGVuZXIgaXMgYWRkZWQuXG4gICAgICogQHBhcmFtIF9idWZmZXIgSW50ZXJuYWw6IEEgc291cmNlIGV2ZW50IGFycmF5IHVzZWQgZm9yIHRlc3RzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiAvLyBTdGFydCBhY2N1bXVsYXRpbmcgZXZlbnRzLCB3aGVuIHRoZSBmaXJzdCBsaXN0ZW5lciBpcyBhdHRhY2hlZCwgZmx1c2hcbiAgICAgKiAvLyB0aGUgZXZlbnQgYWZ0ZXIgYSB0aW1lb3V0IHN1Y2ggdGhhdCBtdWx0aXBsZSBsaXN0ZW5lcnMgYXR0YWNoZWQgYmVmb3JlXG4gICAgICogLy8gdGhlIHRpbWVvdXQgd291bGQgcmVjZWl2ZSB0aGUgZXZlbnRcbiAgICAgKiB0aGlzLm9uSW5zdGFsbEV4dGVuc2lvbiA9IEV2ZW50LmJ1ZmZlcihzZXJ2aWNlLm9uSW5zdGFsbEV4dGVuc2lvbiwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZnVuY3Rpb24gYnVmZmVyKGV2ZW50LCBmbHVzaEFmdGVyVGltZW91dCA9IGZhbHNlLCBfYnVmZmVyID0gW10pIHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IF9idWZmZXIuc2xpY2UoKTtcbiAgICAgICAgbGV0IGxpc3RlbmVyID0gZXZlbnQoZSA9PiB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmZpcmUoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIGJ1ZmZlciA9PT0gbnVsbCB8fCBidWZmZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1ZmZlci5mb3JFYWNoKGUgPT4gZW1pdHRlci5maXJlKGUpKTtcbiAgICAgICAgICAgIGJ1ZmZlciA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRW1pdHRlcih7XG4gICAgICAgICAgICBvbldpbGxBZGRGaXJzdExpc3RlbmVyKCkge1xuICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBldmVudChlID0+IGVtaXR0ZXIuZmlyZShlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRGlkQWRkRmlyc3RMaXN0ZW5lcigpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmbHVzaEFmdGVyVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmbHVzaCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCkge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBFdmVudC5idWZmZXIgPSBidWZmZXI7XG4gICAgY2xhc3MgQ2hhaW5hYmxlRXZlbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcihldmVudCkge1xuICAgICAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcyA9IG5ldyBEaXNwb3NhYmxlU3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQHNlZSB7QGxpbmsgRXZlbnQubWFwfSAqL1xuICAgICAgICBtYXAoZm4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5hYmxlRXZlbnQobWFwKHRoaXMuZXZlbnQsIGZuLCB0aGlzLmRpc3Bvc2FibGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBzZWUge0BsaW5rIEV2ZW50LmZvckVhY2h9ICovXG4gICAgICAgIGZvckVhY2goZm4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5hYmxlRXZlbnQoZm9yRWFjaCh0aGlzLmV2ZW50LCBmbiwgdGhpcy5kaXNwb3NhYmxlcykpO1xuICAgICAgICB9XG4gICAgICAgIGZpbHRlcihmbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmFibGVFdmVudChmaWx0ZXIodGhpcy5ldmVudCwgZm4sIHRoaXMuZGlzcG9zYWJsZXMpKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQHNlZSB7QGxpbmsgRXZlbnQucmVkdWNlfSAqL1xuICAgICAgICByZWR1Y2UobWVyZ2UsIGluaXRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5hYmxlRXZlbnQocmVkdWNlKHRoaXMuZXZlbnQsIG1lcmdlLCBpbml0aWFsLCB0aGlzLmRpc3Bvc2FibGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBzZWUge0BsaW5rIEV2ZW50LnJlZHVjZX0gKi9cbiAgICAgICAgbGF0Y2goKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENoYWluYWJsZUV2ZW50KGxhdGNoKHRoaXMuZXZlbnQsIHVuZGVmaW5lZCwgdGhpcy5kaXNwb3NhYmxlcykpO1xuICAgICAgICB9XG4gICAgICAgIGRlYm91bmNlKG1lcmdlLCBkZWxheSA9IDEwMCwgbGVhZGluZyA9IGZhbHNlLCBmbHVzaE9uTGlzdGVuZXJSZW1vdmUgPSBmYWxzZSwgbGVha1dhcm5pbmdUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5hYmxlRXZlbnQoZGVib3VuY2UodGhpcy5ldmVudCwgbWVyZ2UsIGRlbGF5LCBsZWFkaW5nLCBmbHVzaE9uTGlzdGVuZXJSZW1vdmUsIGxlYWtXYXJuaW5nVGhyZXNob2xkLCB0aGlzLmRpc3Bvc2FibGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF0dGFjaCBhIGxpc3RlbmVyIHRvIHRoZSBldmVudC5cbiAgICAgICAgICovXG4gICAgICAgIG9uKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV2ZW50KGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAc2VlIHtAbGluayBFdmVudC5vbmNlfSAqL1xuICAgICAgICBvbmNlKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNlKHRoaXMuZXZlbnQpKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpO1xuICAgICAgICB9XG4gICAgICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcmFwcyB0aGUgZXZlbnQgaW4gYW4ge0BsaW5rIElDaGFpbmFibGVFdmVudH0sIGFsbG93aW5nIGEgbW9yZSBmdW5jdGlvbmFsIHByb2dyYW1taW5nIHN0eWxlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiAvLyBOb3JtYWxcbiAgICAgKiBjb25zdCBvbkVudGVyUHJlc3NOb3JtYWwgPSBFdmVudC5maWx0ZXIoXG4gICAgICogICBFdmVudC5tYXAob25LZXlQcmVzcy5ldmVudCwgZSA9PiBuZXcgU3RhbmRhcmRLZXlib2FyZEV2ZW50KGUpKSxcbiAgICAgKiAgIGUua2V5Q29kZSA9PT0gS2V5Q29kZS5FbnRlclxuICAgICAqICkuZXZlbnQ7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBjaGFpblxuICAgICAqIGNvbnN0IG9uRW50ZXJQcmVzc0NoYWluID0gRXZlbnQuY2hhaW4ob25LZXlQcmVzcy5ldmVudClcbiAgICAgKiAgIC5tYXAoZSA9PiBuZXcgU3RhbmRhcmRLZXlib2FyZEV2ZW50KGUpKVxuICAgICAqICAgLmZpbHRlcihlID0+IGUua2V5Q29kZSA9PT0gS2V5Q29kZS5FbnRlcilcbiAgICAgKiAgIC5ldmVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbihldmVudCkge1xuICAgICAgICByZXR1cm4gbmV3IENoYWluYWJsZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgRXZlbnQuY2hhaW4gPSBjaGFpbjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBFdmVudH0gZnJvbSBhIG5vZGUgZXZlbnQgZW1pdHRlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tTm9kZUV2ZW50RW1pdHRlcihlbWl0dGVyLCBldmVudE5hbWUsIG1hcCA9IGlkID0+IGlkKSB7XG4gICAgICAgIGNvbnN0IGZuID0gKC4uLmFyZ3MpID0+IHJlc3VsdC5maXJlKG1hcCguLi5hcmdzKSk7XG4gICAgICAgIGNvbnN0IG9uRmlyc3RMaXN0ZW5lckFkZCA9ICgpID0+IGVtaXR0ZXIub24oZXZlbnROYW1lLCBmbik7XG4gICAgICAgIGNvbnN0IG9uTGFzdExpc3RlbmVyUmVtb3ZlID0gKCkgPT4gZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIGZuKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEVtaXR0ZXIoeyBvbldpbGxBZGRGaXJzdExpc3RlbmVyOiBvbkZpcnN0TGlzdGVuZXJBZGQsIG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOiBvbkxhc3RMaXN0ZW5lclJlbW92ZSB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5ldmVudDtcbiAgICB9XG4gICAgRXZlbnQuZnJvbU5vZGVFdmVudEVtaXR0ZXIgPSBmcm9tTm9kZUV2ZW50RW1pdHRlcjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBFdmVudH0gZnJvbSBhIERPTSBldmVudCBlbWl0dGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21ET01FdmVudEVtaXR0ZXIoZW1pdHRlciwgZXZlbnROYW1lLCBtYXAgPSBpZCA9PiBpZCkge1xuICAgICAgICBjb25zdCBmbiA9ICguLi5hcmdzKSA9PiByZXN1bHQuZmlyZShtYXAoLi4uYXJncykpO1xuICAgICAgICBjb25zdCBvbkZpcnN0TGlzdGVuZXJBZGQgPSAoKSA9PiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbik7XG4gICAgICAgIGNvbnN0IG9uTGFzdExpc3RlbmVyUmVtb3ZlID0gKCkgPT4gZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZm4pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgRW1pdHRlcih7IG9uV2lsbEFkZEZpcnN0TGlzdGVuZXI6IG9uRmlyc3RMaXN0ZW5lckFkZCwgb25EaWRSZW1vdmVMYXN0TGlzdGVuZXI6IG9uTGFzdExpc3RlbmVyUmVtb3ZlIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0LmV2ZW50O1xuICAgIH1cbiAgICBFdmVudC5mcm9tRE9NRXZlbnRFbWl0dGVyID0gZnJvbURPTUV2ZW50RW1pdHRlcjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcHJvbWlzZSBvdXQgb2YgYW4gZXZlbnQsIHVzaW5nIHRoZSB7QGxpbmsgRXZlbnQub25jZX0gaGVscGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUHJvbWlzZShldmVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBvbmNlKGV2ZW50KShyZXNvbHZlKSk7XG4gICAgfVxuICAgIEV2ZW50LnRvUHJvbWlzZSA9IHRvUHJvbWlzZTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYW4gZXZlbnQgYW5kIGNhbGxzIHRoZSBsaXN0ZW5lciBpbW1lZGlhdGVseSB3aXRoIHVuZGVmaW5lZCBhcyB0aGUgZXZlbnQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBVSSBhbmQgdXBkYXRlIGl0IHdoZW4gZGF0YUNoYW5nZUV2ZW50IGZpcmVzXG4gICAgICogcnVuQW5kU3Vic2NyaWJlKGRhdGFDaGFuZ2VFdmVudCwgKCkgPT4gdGhpcy5fdXBkYXRlVUkoKSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZnVuY3Rpb24gcnVuQW5kU3Vic2NyaWJlKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgIGhhbmRsZXIodW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIGV2ZW50KGUgPT4gaGFuZGxlcihlKSk7XG4gICAgfVxuICAgIEV2ZW50LnJ1bkFuZFN1YnNjcmliZSA9IHJ1bkFuZFN1YnNjcmliZTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYW4gZXZlbnQgYW5kIGNhbGxzIHRoZSBsaXN0ZW5lciBpbW1lZGlhdGVseSB3aXRoIHVuZGVmaW5lZCBhcyB0aGUgZXZlbnQgb2JqZWN0LiBBIG5ld1xuICAgICAqIHtAbGluayBEaXNwb3NhYmxlU3RvcmV9IGlzIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgd2hpY2ggaXMgZGlzcG9zZWQgd2hlbiB0aGUgcmV0dXJuZWQgZGlzcG9zYWJsZSBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBydW5BbmRTdWJzY3JpYmVXaXRoU3RvcmUoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgbGV0IHN0b3JlID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb24gcnVuKGUpIHtcbiAgICAgICAgICAgIHN0b3JlID09PSBudWxsIHx8IHN0b3JlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdG9yZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICBzdG9yZSA9IG5ldyBEaXNwb3NhYmxlU3RvcmUoKTtcbiAgICAgICAgICAgIGhhbmRsZXIoZSwgc3RvcmUpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bih1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlID0gZXZlbnQoZSA9PiBydW4oZSkpO1xuICAgICAgICByZXR1cm4gdG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgICAgICAgIGRpc3Bvc2FibGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgc3RvcmUgPT09IG51bGwgfHwgc3RvcmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0b3JlLmRpc3Bvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIEV2ZW50LnJ1bkFuZFN1YnNjcmliZVdpdGhTdG9yZSA9IHJ1bkFuZFN1YnNjcmliZVdpdGhTdG9yZTtcbiAgICBjbGFzcyBFbWl0dGVyT2JzZXJ2ZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcihfb2JzZXJ2YWJsZSwgc3RvcmUpIHtcbiAgICAgICAgICAgIHRoaXMuX29ic2VydmFibGUgPSBfb2JzZXJ2YWJsZTtcbiAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgICAgICAgICAgdGhpcy5faGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBvbldpbGxBZGRGaXJzdExpc3RlbmVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIF9vYnNlcnZhYmxlLmFkZE9ic2VydmVyKHRoaXMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25EaWRSZW1vdmVMYXN0TGlzdGVuZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgX29ic2VydmFibGUucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICAgICAgICBfYWRkTGVha2FnZVRyYWNlTG9naWMob3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcihvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChzdG9yZSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLmFkZCh0aGlzLmVtaXR0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJlZ2luVXBkYXRlKF9vYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAvLyBhc3NlcnQoX29ic2VydmFibGUgPT09IHRoaXMub2JzKTtcbiAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVQb3NzaWJsZUNoYW5nZShfb2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgLy8gYXNzZXJ0KF9vYnNlcnZhYmxlID09PSB0aGlzLm9icyk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlQ2hhbmdlKF9vYnNlcnZhYmxlLCBfY2hhbmdlKSB7XG4gICAgICAgICAgICAvLyBhc3NlcnQoX29ic2VydmFibGUgPT09IHRoaXMub2JzKTtcbiAgICAgICAgICAgIHRoaXMuX2hhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVuZFVwZGF0ZShfb2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgLy8gYXNzZXJ0KF9vYnNlcnZhYmxlID09PSB0aGlzLm9icyk7XG4gICAgICAgICAgICB0aGlzLl9jb3VudGVyLS07XG4gICAgICAgICAgICBpZiAodGhpcy5fY291bnRlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29ic2VydmFibGUucmVwb3J0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmZpcmUodGhpcy5fb2JzZXJ2YWJsZS5nZXQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZXZlbnQgZW1pdHRlciB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIG9ic2VydmFibGUgY2hhbmdlcy5cbiAgICAgKiBFYWNoIGxpc3RlbmVycyBzdWJzY3JpYmVzIHRvIHRoZSBlbWl0dGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21PYnNlcnZhYmxlKG9icywgc3RvcmUpIHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgRW1pdHRlck9ic2VydmVyKG9icywgc3RvcmUpO1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgRXZlbnQuZnJvbU9ic2VydmFibGUgPSBmcm9tT2JzZXJ2YWJsZTtcbiAgICAvKipcbiAgICAgKiBFYWNoIGxpc3RlbmVyIGlzIGF0dGFjaGVkIHRvIHRoZSBvYnNlcnZhYmxlIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21PYnNlcnZhYmxlTGlnaHQob2JzZXJ2YWJsZSkge1xuICAgICAgICByZXR1cm4gKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgICAgICAgICAgICAgYmVnaW5VcGRhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbmRVcGRhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5yZXBvcnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlkQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlUG9zc2libGVDaGFuZ2UoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgb2JzZXJ2YWJsZS5hZGRPYnNlcnZlcihvYnNlcnZlcik7XG4gICAgICAgICAgICBvYnNlcnZhYmxlLnJlcG9ydENoYW5nZXMoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5yZW1vdmVPYnNlcnZlcihvYnNlcnZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRXZlbnQuZnJvbU9ic2VydmFibGVMaWdodCA9IGZyb21PYnNlcnZhYmxlTGlnaHQ7XG59KShFdmVudCB8fCAoRXZlbnQgPSB7fSkpO1xuZXhwb3J0IGNsYXNzIEV2ZW50UHJvZmlsaW5nIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuaW52b2NhdGlvbkNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5lbGFwc2VkT3ZlcmFsbCA9IDA7XG4gICAgICAgIHRoaXMuZHVyYXRpb25zID0gW107XG4gICAgICAgIHRoaXMubmFtZSA9IGAke25hbWV9XyR7RXZlbnRQcm9maWxpbmcuX2lkUG9vbCsrfWA7XG4gICAgICAgIEV2ZW50UHJvZmlsaW5nLmFsbC5hZGQodGhpcyk7XG4gICAgfVxuICAgIHN0YXJ0KGxpc3RlbmVyQ291bnQpIHtcbiAgICAgICAgdGhpcy5fc3RvcFdhdGNoID0gbmV3IFN0b3BXYXRjaCgpO1xuICAgICAgICB0aGlzLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5fc3RvcFdhdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gdGhpcy5fc3RvcFdhdGNoLmVsYXBzZWQoKTtcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb25zLnB1c2goZWxhcHNlZCk7XG4gICAgICAgICAgICB0aGlzLmVsYXBzZWRPdmVyYWxsICs9IGVsYXBzZWQ7XG4gICAgICAgICAgICB0aGlzLmludm9jYXRpb25Db3VudCArPSAxO1xuICAgICAgICAgICAgdGhpcy5fc3RvcFdhdGNoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuRXZlbnRQcm9maWxpbmcuYWxsID0gbmV3IFNldCgpO1xuRXZlbnRQcm9maWxpbmcuX2lkUG9vbCA9IDA7XG5sZXQgX2dsb2JhbExlYWtXYXJuaW5nVGhyZXNob2xkID0gLTE7XG5jbGFzcyBMZWFrYWdlTW9uaXRvciB7XG4gICAgY29uc3RydWN0b3IodGhyZXNob2xkLCBuYW1lID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygxOCkuc2xpY2UoMiwgNSkpIHtcbiAgICAgICAgdGhpcy50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuX3dhcm5Db3VudGRvd24gPSAwO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuX3N0YWNrcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsZWFyKCk7XG4gICAgfVxuICAgIGNoZWNrKHN0YWNrLCBsaXN0ZW5lckNvdW50KSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMudGhyZXNob2xkO1xuICAgICAgICBpZiAodGhyZXNob2xkIDw9IDAgfHwgbGlzdGVuZXJDb3VudCA8IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3N0YWNrcykge1xuICAgICAgICAgICAgdGhpcy5fc3RhY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdW50ID0gKHRoaXMuX3N0YWNrcy5nZXQoc3RhY2sudmFsdWUpIHx8IDApO1xuICAgICAgICB0aGlzLl9zdGFja3Muc2V0KHN0YWNrLnZhbHVlLCBjb3VudCArIDEpO1xuICAgICAgICB0aGlzLl93YXJuQ291bnRkb3duIC09IDE7XG4gICAgICAgIGlmICh0aGlzLl93YXJuQ291bnRkb3duIDw9IDApIHtcbiAgICAgICAgICAgIC8vIG9ubHkgd2FybiBvbiBmaXJzdCBleGNlZWQgYW5kIHRoZW4gZXZlcnkgdGltZSB0aGUgbGltaXRcbiAgICAgICAgICAgIC8vIGlzIGV4Y2VlZGVkIGJ5IDUwJSBhZ2FpblxuICAgICAgICAgICAgdGhpcy5fd2FybkNvdW50ZG93biA9IHRocmVzaG9sZCAqIDAuNTtcbiAgICAgICAgICAgIC8vIGZpbmQgbW9zdCBmcmVxdWVudCBsaXN0ZW5lciBhbmQgcHJpbnQgd2FybmluZ1xuICAgICAgICAgICAgbGV0IHRvcFN0YWNrO1xuICAgICAgICAgICAgbGV0IHRvcENvdW50ID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3N0YWNrLCBjb3VudF0gb2YgdGhpcy5fc3RhY2tzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0b3BTdGFjayB8fCB0b3BDb3VudCA8IGNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcFN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIHRvcENvdW50ID0gY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLm5hbWV9XSBwb3RlbnRpYWwgbGlzdGVuZXIgTEVBSyBkZXRlY3RlZCwgaGF2aW5nICR7bGlzdGVuZXJDb3VudH0gbGlzdGVuZXJzIGFscmVhZHkuIE1PU1QgZnJlcXVlbnQgbGlzdGVuZXIgKCR7dG9wQ291bnR9KTpgKTtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih0b3BTdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gKHRoaXMuX3N0YWNrcy5nZXQoc3RhY2sudmFsdWUpIHx8IDApO1xuICAgICAgICAgICAgdGhpcy5fc3RhY2tzLnNldChzdGFjay52YWx1ZSwgY291bnQgLSAxKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5jbGFzcyBTdGFja3RyYWNlIHtcbiAgICBzdGF0aWMgY3JlYXRlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiBuZXcgU3RhY2t0cmFjZSgoX2EgPSBuZXcgRXJyb3IoKS5zdGFjaykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJycpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHByaW50KCkge1xuICAgICAgICBjb25zb2xlLndhcm4odGhpcy52YWx1ZS5zcGxpdCgnXFxuJykuc2xpY2UoMikuam9pbignXFxuJykpO1xuICAgIH1cbn1cbmNsYXNzIFVuaXF1ZUNvbnRhaW5lciB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbn1cbmNvbnN0IGNvbXBhY3Rpb25UaHJlc2hvbGQgPSAyO1xuY29uc3QgZm9yRWFjaExpc3RlbmVyID0gKGxpc3RlbmVycywgZm4pID0+IHtcbiAgICBpZiAobGlzdGVuZXJzIGluc3RhbmNlb2YgVW5pcXVlQ29udGFpbmVyKSB7XG4gICAgICAgIGZuKGxpc3RlbmVycyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbCA9IGxpc3RlbmVyc1tpXTtcbiAgICAgICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgICAgICAgZm4obCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuLyoqXG4gKiBUaGUgRW1pdHRlciBjYW4gYmUgdXNlZCB0byBleHBvc2UgYW4gRXZlbnQgdG8gdGhlIHB1YmxpY1xuICogdG8gZmlyZSBpdCBmcm9tIHRoZSBpbnNpZGVzLlxuICogU2FtcGxlOlxuICAgIGNsYXNzIERvY3VtZW50IHtcblxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRpZENoYW5nZSA9IG5ldyBFbWl0dGVyPCh2YWx1ZTpzdHJpbmcpPT5hbnk+KCk7XG5cbiAgICAgICAgcHVibGljIG9uRGlkQ2hhbmdlID0gdGhpcy5fb25EaWRDaGFuZ2UuZXZlbnQ7XG5cbiAgICAgICAgLy8gZ2V0dGVyLXN0eWxlXG4gICAgICAgIC8vIGdldCBvbkRpZENoYW5nZSgpOiBFdmVudDwodmFsdWU6c3RyaW5nKT0+YW55PiB7XG4gICAgICAgIC8vIFx0cmV0dXJuIHRoaXMuX29uRGlkQ2hhbmdlLmV2ZW50O1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgcHJpdmF0ZSBfZG9JdCgpIHtcbiAgICAgICAgICAgIC8vLi4uXG4gICAgICAgICAgICB0aGlzLl9vbkRpZENoYW5nZS5maXJlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAqL1xuZXhwb3J0IGNsYXNzIEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLl9sZWFrYWdlTW9uID0gX2dsb2JhbExlYWtXYXJuaW5nVGhyZXNob2xkID4gMCB8fCAoKF9hID0gdGhpcy5fb3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlYWtXYXJuaW5nVGhyZXNob2xkKSA/IG5ldyBMZWFrYWdlTW9uaXRvcigoX2MgPSAoX2IgPSB0aGlzLl9vcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVha1dhcm5pbmdUaHJlc2hvbGQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IF9nbG9iYWxMZWFrV2FybmluZ1RocmVzaG9sZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3BlcmZNb24gPSAoKF9kID0gdGhpcy5fb3B0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLl9wcm9mTmFtZSkgPyBuZXcgRXZlbnRQcm9maWxpbmcodGhpcy5fb3B0aW9ucy5fcHJvZk5hbWUpIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9kZWxpdmVyeVF1ZXVlID0gKF9lID0gdGhpcy5fb3B0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLmRlbGl2ZXJ5UXVldWU7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gSXQgaXMgYmFkIHRvIGhhdmUgbGlzdGVuZXJzIGF0IHRoZSB0aW1lIG9mIGRpc3Bvc2luZyBhbiBlbWl0dGVyLCBpdCBpcyB3b3JzdCB0byBoYXZlIGxpc3RlbmVycyBrZWVwIHRoZSBlbWl0dGVyXG4gICAgICAgICAgICAvLyBhbGl2ZSB2aWEgdGhlIHJlZmVyZW5jZSB0aGF0J3MgZW1iZWRkZWQgaW4gdGhlaXIgZGlzcG9zYWJsZXMuIFRoZXJlZm9yZSB3ZSBsb29wIG92ZXIgYWxsIHJlbWFpbmluZyBsaXN0ZW5lcnMgYW5kXG4gICAgICAgICAgICAvLyB1bnNldCB0aGVpciBzdWJzY3JpcHRpb25zL2Rpc3Bvc2FibGVzLiBMb29waW5nIGFuZCBibGFtaW5nIHJlbWFpbmluZyBsaXN0ZW5lcnMgaXMgZG9uZSBvbiBuZXh0IHRpY2sgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbW1pbmcgcGF0dGVybiBpcyB2ZXJ5IHBvcHVsYXI6XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gY29uc3Qgc29tZU1vZGVsID0gdGhpcy5fZGlzcG9zYWJsZXMuYWRkKG5ldyBNb2RlbE9iamVjdCgpKTsgLy8gKDEpIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgbW9kZWxcbiAgICAgICAgICAgIC8vIHRoaXMuX2Rpc3Bvc2FibGVzLmFkZChzb21lTW9kZWwub25EaWRDaGFuZ2UoKCkgPT4geyAuLi4gfSk7IC8vICgyKSBzdWJzY3JpYmUgYW5kIHJlZ2lzdGVyIG1vZGVsLWV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAvLyAuLi5sYXRlci4uLlxuICAgICAgICAgICAgLy8gdGhpcy5fZGlzcG9zYWJsZXMuZGlzcG9zZSgpOyBkaXNwb3NlcyAoMSkgdGhlbiAoMik6IGRvbid0IHdhcm4gYWZ0ZXIgKDEpIGJ1dCBhZnRlciB0aGUgXCJvdmVyYWxsIGRpc3Bvc2VcIiBpcyBkb25lXG4gICAgICAgICAgICBpZiAoKChfYSA9IHRoaXMuX2RlbGl2ZXJ5UXVldWUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jdXJyZW50KSA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5UXVldWUucmVzZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoX2VuYWJsZURpc3Bvc2VXaXRoTGlzdGVuZXJXYXJuaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcbiAgICAgICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yRWFjaExpc3RlbmVyKGxpc3RlbmVycywgbCA9PiB7IHZhciBfYTsgcmV0dXJuIChfYSA9IGwuc3RhY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wcmludCgpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChfYyA9IChfYiA9IHRoaXMuX29wdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5vbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhbGwoX2IpO1xuICAgICAgICAgICAgKF9kID0gdGhpcy5fbGVha2FnZU1vbikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5fZXZlbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICh0aGlzLl9ldmVudCA9IChjYWxsYmFjaywgdGhpc0FyZ3MsIGRpc3Bvc2FibGVzKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xlYWthZ2VNb24gJiYgdGhpcy5fc2l6ZSA+IHRoaXMuX2xlYWthZ2VNb24udGhyZXNob2xkICogMykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgWyR7dGhpcy5fbGVha2FnZU1vbi5uYW1lfV0gUkVGVVNFUyB0byBhY2NlcHQgbmV3IGxpc3RlbmVycyBiZWNhdXNlIGl0IGV4Y2VlZGVkIGl0cyB0aHJlc2hvbGQgYnkgZmFyYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERpc3Bvc2FibGUuTm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIHRvZG86IHNob3VsZCB3ZSB3YXJuIGlmIGEgbGlzdGVuZXIgaXMgYWRkZWQgdG8gYSBkaXNwb3NlZCBlbWl0dGVyPyBUaGlzIGhhcHBlbnMgb2Z0ZW5cbiAgICAgICAgICAgICAgICByZXR1cm4gRGlzcG9zYWJsZS5Ob25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXNBcmdzKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjay5iaW5kKHRoaXNBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lZCA9IG5ldyBVbmlxdWVDb250YWluZXIoY2FsbGJhY2spO1xuICAgICAgICAgICAgbGV0IHJlbW92ZU1vbml0b3I7XG4gICAgICAgICAgICBsZXQgc3RhY2s7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGVha2FnZU1vbiAmJiB0aGlzLl9zaXplID49IE1hdGguY2VpbCh0aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZCAqIDAuMikpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBhbmQgcmVjb3JkIHRoaXMgZW1pdHRlciBmb3IgcG90ZW50aWFsIGxlYWthZ2VcbiAgICAgICAgICAgICAgICBjb250YWluZWQuc3RhY2sgPSBTdGFja3RyYWNlLmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHJlbW92ZU1vbml0b3IgPSB0aGlzLl9sZWFrYWdlTW9uLmNoZWNrKGNvbnRhaW5lZC5zdGFjaywgdGhpcy5fc2l6ZSArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9lbmFibGVEaXNwb3NlV2l0aExpc3RlbmVyV2FybmluZykge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lZC5zdGFjayA9IHN0YWNrICE9PSBudWxsICYmIHN0YWNrICE9PSB2b2lkIDAgPyBzdGFjayA6IFN0YWNrdHJhY2UuY3JlYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIChfYiA9IChfYSA9IHRoaXMuX29wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbldpbGxBZGRGaXJzdExpc3RlbmVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gY29udGFpbmVkO1xuICAgICAgICAgICAgICAgIChfZCA9IChfYyA9IHRoaXMuX29wdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5vbkRpZEFkZEZpcnN0TGlzdGVuZXIpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5jYWxsKF9jLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2xpc3RlbmVycyBpbnN0YW5jZW9mIFVuaXF1ZUNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIChfZSA9IHRoaXMuX2RlbGl2ZXJ5UXVldWUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6ICh0aGlzLl9kZWxpdmVyeVF1ZXVlID0gbmV3IEV2ZW50RGVsaXZlcnlRdWV1ZVByaXZhdGUoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW3RoaXMuX2xpc3RlbmVycywgY29udGFpbmVkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGNvbnRhaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0b0Rpc3Bvc2FibGUoKCkgPT4geyByZW1vdmVNb25pdG9yID09PSBudWxsIHx8IHJlbW92ZU1vbml0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlbW92ZU1vbml0b3IoKTsgdGhpcy5fcmVtb3ZlTGlzdGVuZXIoY29udGFpbmVkKTsgfSk7XG4gICAgICAgICAgICBpZiAoZGlzcG9zYWJsZXMgaW5zdGFuY2VvZiBEaXNwb3NhYmxlU3RvcmUpIHtcbiAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5hZGQocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGlzcG9zYWJsZXMpKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgX3JlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgKF9iID0gKF9hID0gdGhpcy5fb3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uV2lsbFJlbW92ZUxpc3RlbmVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgdGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGV4cGVjdGVkIGlmIGEgbGlzdGVuZXIgZ2V0cyBkaXNwb3NlZFxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zaXplID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAoX2QgPSAoX2MgPSB0aGlzLl9vcHRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Mub25EaWRSZW1vdmVMYXN0TGlzdGVuZXIpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5jYWxsKF9jLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNpemUgPiAxIHdoaWNoIHJlcXVpcmVzIHRoYXQgbGlzdGVuZXJzIGJlIGEgbGlzdDpcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Rpc3Bvc2VkPycsIHRoaXMuX2Rpc3Bvc2VkKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzaXplPycsIHRoaXMuX3NpemUpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Fycj8nLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9saXN0ZW5lcnMpKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGRpc3Bvc2UgdW5rbm93biBsaXN0ZW5lcicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgbGlzdGVuZXJzW2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYWRqdXN0RGVsaXZlcnlRdWV1ZSA9IHRoaXMuX2RlbGl2ZXJ5UXVldWUuY3VycmVudCA9PT0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX3NpemUgKiBjb21wYWN0aW9uVGhyZXNob2xkIDw9IGxpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbbisrXSA9IGxpc3RlbmVyc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWRqdXN0RGVsaXZlcnlRdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVF1ZXVlLmVuZC0tO1xuICAgICAgICAgICAgICAgICAgICBpZiAobiA8IHRoaXMuX2RlbGl2ZXJ5UXVldWUuaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlRdWV1ZS5pLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0ZW5lcnMubGVuZ3RoID0gbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZGVsaXZlcihsaXN0ZW5lciwgdmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3JIYW5kbGVyID0gKChfYSA9IHRoaXMuX29wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkxpc3RlbmVyRXJyb3IpIHx8IG9uVW5leHBlY3RlZEVycm9yO1xuICAgICAgICBpZiAoIWVycm9ySGFuZGxlcikge1xuICAgICAgICAgICAgbGlzdGVuZXIudmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsaXN0ZW5lci52YWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGVycm9ySGFuZGxlcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogRGVsaXZlcnMgaXRlbXMgaW4gdGhlIHF1ZXVlLiBBc3N1bWVzIHRoZSBxdWV1ZSBpcyByZWFkeSB0byBnby4gKi9cbiAgICBfZGVsaXZlclF1ZXVlKGRxKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGRxLmN1cnJlbnQuX2xpc3RlbmVycztcbiAgICAgICAgd2hpbGUgKGRxLmkgPCBkcS5lbmQpIHtcbiAgICAgICAgICAgIC8vIGltcG9ydGFudDogZHEuaSBpcyBpbmNyZW1lbnRlZCBiZWZvcmUgY2FsbGluZyBkZWxpdmVyKCkgYmVjYXVzZSBpdCBtaWdodCByZWVudGVyIGRlbGl2ZXJRdWV1ZSgpXG4gICAgICAgICAgICB0aGlzLl9kZWxpdmVyKGxpc3RlbmVyc1tkcS5pKytdLCBkcS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZHEucmVzZXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBpZiAoKF9hID0gdGhpcy5fZGVsaXZlcnlRdWV1ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJRdWV1ZSh0aGlzLl9kZWxpdmVyeVF1ZXVlKTtcbiAgICAgICAgICAgIChfYiA9IHRoaXMuX3BlcmZNb24pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zdG9wKCk7IC8vIGxhc3QgZmlyZSgpIHdpbGwgaGF2ZSBzdGFydGluZyBwZXJmbW9uLCBzdG9wIGl0IGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCBkaXNwYXRjaFxuICAgICAgICB9XG4gICAgICAgIChfYyA9IHRoaXMuX3BlcmZNb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGFydCh0aGlzLl9zaXplKTtcbiAgICAgICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIC8vIG5vLW9wXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fbGlzdGVuZXJzIGluc3RhbmNlb2YgVW5pcXVlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWxpdmVyKHRoaXMuX2xpc3RlbmVycywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZHEgPSB0aGlzLl9kZWxpdmVyeVF1ZXVlO1xuICAgICAgICAgICAgZHEuZW5xdWV1ZSh0aGlzLCBldmVudCwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLl9kZWxpdmVyUXVldWUoZHEpO1xuICAgICAgICB9XG4gICAgICAgIChfZCA9IHRoaXMuX3BlcmZNb24pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5zdG9wKCk7XG4gICAgfVxuICAgIGhhc0xpc3RlbmVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemUgPiAwO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBjcmVhdGVFdmVudERlbGl2ZXJ5UXVldWUgPSAoKSA9PiBuZXcgRXZlbnREZWxpdmVyeVF1ZXVlUHJpdmF0ZSgpO1xuY2xhc3MgRXZlbnREZWxpdmVyeVF1ZXVlUHJpdmF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRleCBpbiBjdXJyZW50J3MgbGlzdGVuZXIgbGlzdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaSA9IC0xO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGxhc3QgaW5kZXggaW4gdGhlIGxpc3RlbmVyJ3MgbGlzdCB0byBkZWxpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbmQgPSAwO1xuICAgIH1cbiAgICBlbnF1ZXVlKGVtaXR0ZXIsIHZhbHVlLCBlbmQpIHtcbiAgICAgICAgdGhpcy5pID0gMDtcbiAgICAgICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGVtaXR0ZXI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuaSA9IHRoaXMuZW5kOyAvLyBmb3JjZSBhbnkgY3VycmVudCBlbWlzc2lvbiBsb29wIHRvIHN0b3AsIG1haW5seSBmb3IgZHVyaW5nIGRpc3Bvc2VcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBQYXVzZWFibGVFbWl0dGVyIGV4dGVuZHMgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSAwO1xuICAgICAgICB0aGlzLl9ldmVudFF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgdGhpcy5fbWVyZ2VGbiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXJnZTtcbiAgICB9XG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkKys7XG4gICAgfVxuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzUGF1c2VkICE9PSAwICYmIC0tdGhpcy5faXNQYXVzZWQgPT09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXJnZUZuKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBtZXJnZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBzaW5nbGUgY29tcG9zaXRlXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuIG1ha2UgYSBjb3B5IGluIGNhc2UgZmlyaW5nIHBhdXNlcyB0aGlzIGVtaXR0ZXJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRRdWV1ZS5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudHMgPSBBcnJheS5mcm9tKHRoaXMuX2V2ZW50UXVldWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudFF1ZXVlLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyLmZpcmUodGhpcy5fbWVyZ2VGbihldmVudHMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBubyBtZXJnaW5nLCBmaXJlIGVhY2ggZXZlbnQgaW5kaXZpZHVhbGx5IGFuZCB0ZXN0XG4gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGVtaXR0ZXIgaXNuJ3QgcGF1c2VkIGhhbGZ3YXkgdGhyb3VnaFxuICAgICAgICAgICAgICAgIHdoaWxlICghdGhpcy5faXNQYXVzZWQgJiYgdGhpcy5fZXZlbnRRdWV1ZS5zaXplICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyLmZpcmUodGhpcy5fZXZlbnRRdWV1ZS5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmlyZShldmVudCkge1xuICAgICAgICBpZiAodGhpcy5fc2l6ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzUGF1c2VkICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRRdWV1ZS5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1cGVyLmZpcmUoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIERlYm91bmNlRW1pdHRlciBleHRlbmRzIFBhdXNlYWJsZUVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fZGVsYXkgPSAoX2EgPSBvcHRpb25zLmRlbGF5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAxMDA7XG4gICAgfVxuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9oYW5kbGUpIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VtZSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5fZGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmZpcmUoZXZlbnQpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZW1pdHRlciB3aGljaCBxdWV1ZSBhbGwgZXZlbnRzIGFuZCB0aGVuIHByb2Nlc3MgdGhlbSBhdCB0aGVcbiAqIGVuZCBvZiB0aGUgZXZlbnQgbG9vcC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1pY3JvdGFza0VtaXR0ZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9xdWV1ZWRFdmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5fbWVyZ2VGbiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXJnZTtcbiAgICB9XG4gICAgZmlyZShldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJzKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9xdWV1ZWRFdmVudHMucHVzaChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLl9xdWV1ZWRFdmVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21lcmdlRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZmlyZSh0aGlzLl9tZXJnZUZuKHRoaXMuX3F1ZXVlZEV2ZW50cykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcXVldWVkRXZlbnRzLmZvckVhY2goZSA9PiBzdXBlci5maXJlKGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVldWVkRXZlbnRzID0gW107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBFdmVudE11bHRpcGxleGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oYXNMaXN0ZW5lcnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoe1xuICAgICAgICAgICAgb25XaWxsQWRkRmlyc3RMaXN0ZW5lcjogKCkgPT4gdGhpcy5vbkZpcnN0TGlzdGVuZXJBZGQoKSxcbiAgICAgICAgICAgIG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOiAoKSA9PiB0aGlzLm9uTGFzdExpc3RlbmVyUmVtb3ZlKClcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBldmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgYWRkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGUgPSB7IGV2ZW50OiBldmVudCwgbGlzdGVuZXI6IG51bGwgfTtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaChlKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmhvb2soZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0xpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIHRoaXMudW5ob29rKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5ldmVudHMuaW5kZXhPZihlKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdG9EaXNwb3NhYmxlKG9uY2VGbihkaXNwb3NlKSk7XG4gICAgfVxuICAgIG9uRmlyc3RMaXN0ZW5lckFkZCgpIHtcbiAgICAgICAgdGhpcy5oYXNMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGUgPT4gdGhpcy5ob29rKGUpKTtcbiAgICB9XG4gICAgb25MYXN0TGlzdGVuZXJSZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuaGFzTGlzdGVuZXJzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZSA9PiB0aGlzLnVuaG9vayhlKSk7XG4gICAgfVxuICAgIGhvb2soZSkge1xuICAgICAgICBlLmxpc3RlbmVyID0gZS5ldmVudChyID0+IHRoaXMuZW1pdHRlci5maXJlKHIpKTtcbiAgICB9XG4gICAgdW5ob29rKGUpIHtcbiAgICAgICAgaWYgKGUubGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGUubGlzdGVuZXIuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGUubGlzdGVuZXIgPSBudWxsO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIEV2ZW50QnVmZmVyZXIgaXMgdXNlZnVsIGluIHNpdHVhdGlvbnMgaW4gd2hpY2ggeW91IHdhbnRcbiAqIHRvIGRlbGF5IGZpcmluZyB5b3VyIGV2ZW50cyBkdXJpbmcgc29tZSBjb2RlLlxuICogWW91IGNhbiB3cmFwIHRoYXQgY29kZSBhbmQgYmUgc3VyZSB0aGF0IHRoZSBldmVudCB3aWxsIG5vdFxuICogYmUgZmlyZWQgZHVyaW5nIHRoYXQgd3JhcC5cbiAqXG4gKiBgYGBcbiAqIGNvbnN0IGVtaXR0ZXI6IEVtaXR0ZXI7XG4gKiBjb25zdCBkZWxheWVyID0gbmV3IEV2ZW50RGVsYXllcigpO1xuICogY29uc3QgZGVsYXllZEV2ZW50ID0gZGVsYXllci53cmFwRXZlbnQoZW1pdHRlci5ldmVudCk7XG4gKlxuICogZGVsYXllZEV2ZW50KGNvbnNvbGUubG9nKTtcbiAqXG4gKiBkZWxheWVyLmJ1ZmZlckV2ZW50cygoKSA9PiB7XG4gKiAgIGVtaXR0ZXIuZmlyZSgpOyAvLyBldmVudCB3aWxsIG5vdCBiZSBmaXJlZCB5ZXRcbiAqIH0pO1xuICpcbiAqIC8vIGV2ZW50IHdpbGwgb25seSBiZSBmaXJlZCBhdCB0aGlzIHBvaW50XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50QnVmZmVyZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbiAgICB9XG4gICAgd3JhcEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHJldHVybiAobGlzdGVuZXIsIHRoaXNBcmdzLCBkaXNwb3NhYmxlcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50KGkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyc1t0aGlzLmJ1ZmZlcnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIucHVzaCgoKSA9PiBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB1bmRlZmluZWQsIGRpc3Bvc2FibGVzKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYnVmZmVyRXZlbnRzKGZuKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgICBjb25zdCByID0gZm4oKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnBvcCgpO1xuICAgICAgICBidWZmZXIuZm9yRWFjaChmbHVzaCA9PiBmbHVzaCgpKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfVxufVxuLyoqXG4gKiBBIFJlbGF5IGlzIGFuIGV2ZW50IGZvcndhcmRlciB3aGljaCBmdW5jdGlvbnMgYXMgYSByZXBsdWdhYmJsZSBldmVudCBwaXBlLlxuICogT25jZSBjcmVhdGVkLCB5b3UgY2FuIGNvbm5lY3QgYW4gaW5wdXQgZXZlbnQgdG8gaXQgYW5kIGl0IHdpbGwgc2ltcGx5IGZvcndhcmRcbiAqIGV2ZW50cyBmcm9tIHRoYXQgaW5wdXQgZXZlbnQgdGhyb3VnaCBpdHMgb3duIGBldmVudGAgcHJvcGVydHkuIFRoZSBgaW5wdXRgXG4gKiBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgcG9pbnQgaW4gdGltZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbGF5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnB1dEV2ZW50ID0gRXZlbnQuTm9uZTtcbiAgICAgICAgdGhpcy5pbnB1dEV2ZW50TGlzdGVuZXIgPSBEaXNwb3NhYmxlLk5vbmU7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFbWl0dGVyKHtcbiAgICAgICAgICAgIG9uRGlkQWRkRmlyc3RMaXN0ZW5lcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RXZlbnRMaXN0ZW5lciA9IHRoaXMuaW5wdXRFdmVudCh0aGlzLmVtaXR0ZXIuZmlyZSwgdGhpcy5lbWl0dGVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEV2ZW50TGlzdGVuZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudCA9IHRoaXMuZW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgc2V0IGlucHV0KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaW5wdXRFdmVudCA9IGV2ZW50O1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRFdmVudExpc3RlbmVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRFdmVudExpc3RlbmVyID0gZXZlbnQodGhpcy5lbWl0dGVyLmZpcmUsIHRoaXMuZW1pdHRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5pbnB1dEV2ZW50TGlzdGVuZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgaXNUeXBlZEFycmF5LCBpc09iamVjdCwgaXNVbmRlZmluZWRPck51bGwgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBBcnJheS5pc0FycmF5KG9iaikgPyBbXSA6IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IGRlZXBDbG9uZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBGcmVlemUob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgY29uc3Qgc3RhY2sgPSBbb2JqXTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvYmogPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICBPYmplY3QuZnJlZXplKG9iaik7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdvYmplY3QnICYmICFPYmplY3QuaXNGcm96ZW4ocHJvcCkgJiYgIWlzVHlwZWRBcnJheShwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuY29uc3QgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUFuZENoYW5nZShvYmosIGNoYW5nZXIpIHtcbiAgICByZXR1cm4gX2Nsb25lQW5kQ2hhbmdlKG9iaiwgY2hhbmdlciwgbmV3IFNldCgpKTtcbn1cbmZ1bmN0aW9uIF9jbG9uZUFuZENoYW5nZShvYmosIGNoYW5nZXIsIHNlZW4pIHtcbiAgICBpZiAoaXNVbmRlZmluZWRPck51bGwob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBjb25zdCBjaGFuZ2VkID0gY2hhbmdlcihvYmopO1xuICAgIGlmICh0eXBlb2YgY2hhbmdlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgY29uc3QgcjEgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIG9iaikge1xuICAgICAgICAgICAgcjEucHVzaChfY2xvbmVBbmRDaGFuZ2UoZSwgY2hhbmdlciwgc2VlbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByMTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNsb25lIHJlY3Vyc2l2ZSBkYXRhLXN0cnVjdHVyZScpO1xuICAgICAgICB9XG4gICAgICAgIHNlZW4uYWRkKG9iaik7XG4gICAgICAgIGNvbnN0IHIyID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaTIgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwob2JqLCBpMikpIHtcbiAgICAgICAgICAgICAgICByMltpMl0gPSBfY2xvbmVBbmRDaGFuZ2Uob2JqW2kyXSwgY2hhbmdlciwgc2Vlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5kZWxldGUob2JqKTtcbiAgICAgICAgcmV0dXJuIHIyO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuLyoqXG4gKiBDb3BpZXMgYWxsIHByb3BlcnRpZXMgb2Ygc291cmNlIGludG8gZGVzdGluYXRpb24uIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgXCJvdmVyd3JpdGVcIiBhbGxvd3MgdG8gY29udHJvbFxuICogaWYgZXhpc3RpbmcgcHJvcGVydGllcyBvbiB0aGUgZGVzdGluYXRpb24gc2hvdWxkIGJlIG92ZXJ3cml0dGVuIG9yIG5vdC4gRGVmYXVsdHMgdG8gdHJ1ZSAob3ZlcndyaXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluKGRlc3RpbmF0aW9uLCBzb3VyY2UsIG92ZXJ3cml0ZSA9IHRydWUpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRlc3RpbmF0aW9uKSkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgaW4gZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChkZXN0aW5hdGlvbltrZXldKSAmJiBpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKGRlc3RpbmF0aW9uW2tleV0sIHNvdXJjZVtrZXldLCBvdmVyd3JpdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhvbmUsIG90aGVyKSB7XG4gICAgaWYgKG9uZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvbmUgPT09IG51bGwgfHwgb25lID09PSB1bmRlZmluZWQgfHwgb3RoZXIgPT09IG51bGwgfHwgb3RoZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb25lICE9PSB0eXBlb2Ygb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9uZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKEFycmF5LmlzQXJyYXkob25lKSkgIT09IChBcnJheS5pc0FycmF5KG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgaTtcbiAgICBsZXQga2V5O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9uZSkpIHtcbiAgICAgICAgaWYgKG9uZS5sZW5ndGggIT09IG90aGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghZXF1YWxzKG9uZVtpXSwgb3RoZXJbaV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBvbmVLZXlzID0gW107XG4gICAgICAgIGZvciAoa2V5IGluIG9uZSkge1xuICAgICAgICAgICAgb25lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgb25lS2V5cy5zb3J0KCk7XG4gICAgICAgIGNvbnN0IG90aGVyS2V5cyA9IFtdO1xuICAgICAgICBmb3IgKGtleSBpbiBvdGhlcikge1xuICAgICAgICAgICAgb3RoZXJLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlcktleXMuc29ydCgpO1xuICAgICAgICBpZiAoIWVxdWFscyhvbmVLZXlzLCBvdGhlcktleXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG9uZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghZXF1YWxzKG9uZVtvbmVLZXlzW2ldXSwgb3RoZXJbb25lS2V5c1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFByb3BlcnR5TmFtZXMob2JqKSB7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIHdoaWxlIChPYmplY3QucHJvdG90eXBlICE9PSBvYmopIHtcbiAgICAgICAgcmVzID0gcmVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopKTtcbiAgICAgICAgb2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsTWV0aG9kTmFtZXMob2JqKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBnZXRBbGxQcm9wZXJ0eU5hbWVzKG9iaikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG1ldGhvZHMucHVzaChwcm9wKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWV0aG9kcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm94eU9iamVjdChtZXRob2ROYW1lcywgaW52b2tlKSB7XG4gICAgY29uc3QgY3JlYXRlUHJveHlNZXRob2QgPSAobWV0aG9kKSA9PiB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICAgICAgICAgIHJldHVybiBpbnZva2UobWV0aG9kLCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBtZXRob2ROYW1lcykge1xuICAgICAgICByZXN1bHRbbWV0aG9kTmFtZV0gPSBjcmVhdGVQcm94eU1ldGhvZChtZXRob2ROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5sZXQgaXNQc2V1ZG8gPSAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5sb2NhdGlvbiAmJiBkb2N1bWVudC5sb2NhdGlvbi5oYXNoLmluZGV4T2YoJ3BzZXVkbz10cnVlJykgPj0gMCk7XG5jb25zdCBERUZBVUxUX1RBRyA9ICdpLWRlZmF1bHQnO1xuZnVuY3Rpb24gX2Zvcm1hdChtZXNzYWdlLCBhcmdzKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVzdWx0ID0gbWVzc2FnZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgvXFx7KFxcZCspXFx9L2csIChtYXRjaCwgcmVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSByZXN0WzBdO1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpbmRleF07XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbWF0Y2g7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHwgYXJnID09PSB2b2lkIDAgfHwgYXJnID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nKGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzUHNldWRvKSB7XG4gICAgICAgIC8vIEZGM0IgYW5kIEZGM0QgaXMgdGhlIFVuaWNvZGUgemVua2FrdSByZXByZXNlbnRhdGlvbiBmb3IgWyBhbmQgXVxuICAgICAgICByZXN1bHQgPSAnXFx1RkYzQicgKyByZXN1bHQucmVwbGFjZSgvW2FvdWVpXS9nLCAnJCYkJicpICsgJ1xcdUZGM0QnO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZmluZExhbmd1YWdlRm9yTW9kdWxlKGNvbmZpZywgbmFtZSkge1xuICAgIGxldCByZXN1bHQgPSBjb25maWdbbmFtZV07XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXN1bHQgPSBjb25maWdbJyonXTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZW5kV2l0aFNsYXNoKHBhdGgpIHtcbiAgICBpZiAocGF0aC5jaGFyQXQocGF0aC5sZW5ndGggLSAxKSA9PT0gJy8nKSB7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aCArICcvJztcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2VzRnJvbVRyYW5zbGF0aW9uc1NlcnZpY2UodHJhbnNsYXRpb25TZXJ2aWNlVXJsLCBsYW5ndWFnZSwgbmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGVuZFdpdGhTbGFzaCh0cmFuc2xhdGlvblNlcnZpY2VVcmwpICsgZW5kV2l0aFNsYXNoKGxhbmd1YWdlKSArICd2c2NvZGUvJyArIGVuZFdpdGhTbGFzaChuYW1lKTtcbiAgICAgICAgY29uc3QgcmVzID0geWllbGQgZmV0Y2godXJsKTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSB5aWVsZCByZXMuanNvbigpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXMuc3RhdHVzfSAtICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTY29wZWRMb2NhbGl6ZShzY29wZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoaWR4LCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmVzdEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgICAgICByZXR1cm4gX2Zvcm1hdChzY29wZVtpZHhdLCByZXN0QXJncyk7XG4gICAgfTtcbn1cbi8qKlxuICogQHNraXBNYW5nbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplKGRhdGEsIG1lc3NhZ2UsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gX2Zvcm1hdChtZXNzYWdlLCBhcmdzKTtcbn1cbi8qKlxuICogQHNraXBNYW5nbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ3VyZWREZWZhdWx0TG9jYWxlKF8pIHtcbiAgICAvLyBUaGlzIHJldHVybnMgdW5kZWZpbmVkIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBpc24ndCB1c2VkIGFuZCBpcyBvdmVyd3JpdHRlbiBieSB0aGUgbG9hZGVyXG4gICAgLy8gd2hlbiBsb2FkZWQuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQHNraXBNYW5nbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBzZXVkb1RyYW5zbGF0aW9uKHZhbHVlKSB7XG4gICAgaXNQc2V1ZG8gPSB2YWx1ZTtcbn1cbi8qKlxuICogSW52b2tlZCBpbiBhIGJ1aWx0IHByb2R1Y3QgYXQgcnVuLXRpbWVcbiAqIEBza2lwTWFuZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoa2V5LCBkYXRhKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsaXplOiBjcmVhdGVTY29wZWRMb2NhbGl6ZShkYXRhW2tleV0pLFxuICAgICAgICBnZXRDb25maWd1cmVkRGVmYXVsdExvY2FsZTogKF9hID0gZGF0YS5nZXRDb25maWd1cmVkRGVmYXVsdExvY2FsZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKChfKSA9PiB1bmRlZmluZWQpXG4gICAgfTtcbn1cbi8qKlxuICogSW52b2tlZCBieSB0aGUgbG9hZGVyIGF0IHJ1bi10aW1lXG4gKiBAc2tpcE1hbmdsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZChuYW1lLCByZXEsIGxvYWQsIGNvbmZpZykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBwbHVnaW5Db25maWcgPSAoX2EgPSBjb25maWdbJ3ZzL25scyddKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fTtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gVE9ETzogV2UgbmVlZCB0byBnaXZlIGJhY2sgdGhlIG1hbmdsZWQgbmFtZXMgaGVyZVxuICAgICAgICByZXR1cm4gbG9hZCh7XG4gICAgICAgICAgICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gICAgICAgICAgICBnZXRDb25maWd1cmVkRGVmYXVsdExvY2FsZTogKCkgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSBwbHVnaW5Db25maWcuYXZhaWxhYmxlTGFuZ3VhZ2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbJyonXTsgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBwbHVnaW5Db25maWcuYXZhaWxhYmxlTGFuZ3VhZ2VzID8gZmluZExhbmd1YWdlRm9yTW9kdWxlKHBsdWdpbkNvbmZpZy5hdmFpbGFibGVMYW5ndWFnZXMsIG5hbWUpIDogbnVsbDtcbiAgICBjb25zdCB1c2VEZWZhdWx0TGFuZ3VhZ2UgPSBsYW5ndWFnZSA9PT0gbnVsbCB8fCBsYW5ndWFnZSA9PT0gREVGQVVMVF9UQUc7XG4gICAgbGV0IHN1ZmZpeCA9ICcubmxzJztcbiAgICBpZiAoIXVzZURlZmF1bHRMYW5ndWFnZSkge1xuICAgICAgICBzdWZmaXggPSBzdWZmaXggKyAnLicgKyBsYW5ndWFnZTtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZXNMb2FkZWQgPSAobWVzc2FnZXMpID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZXMpKSB7XG4gICAgICAgICAgICBtZXNzYWdlcy5sb2NhbGl6ZSA9IGNyZWF0ZVNjb3BlZExvY2FsaXplKG1lc3NhZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzLmxvY2FsaXplID0gY3JlYXRlU2NvcGVkTG9jYWxpemUobWVzc2FnZXNbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2VzLmdldENvbmZpZ3VyZWREZWZhdWx0TG9jYWxlID0gKCkgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSBwbHVnaW5Db25maWcuYXZhaWxhYmxlTGFuZ3VhZ2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbJyonXTsgfTtcbiAgICAgICAgbG9hZChtZXNzYWdlcyk7XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHBsdWdpbkNvbmZpZy5sb2FkQnVuZGxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBsdWdpbkNvbmZpZy5sb2FkQnVuZGxlKG5hbWUsIGxhbmd1YWdlLCAoZXJyLCBtZXNzYWdlcykgPT4ge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbiBlcnJvci4gTG9hZCB0aGUgRW5nbGlzaCBkZWZhdWx0IHN0cmluZ3MgdG8gbm90IGZhaWxcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXEoW25hbWUgKyAnLm5scyddLCBtZXNzYWdlc0xvYWRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlc0xvYWRlZChtZXNzYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChwbHVnaW5Db25maWcudHJhbnNsYXRpb25TZXJ2aWNlVXJsICYmICF1c2VEZWZhdWx0TGFuZ3VhZ2UpIHtcbiAgICAgICAgKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBfYjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSB5aWVsZCBnZXRNZXNzYWdlc0Zyb21UcmFuc2xhdGlvbnNTZXJ2aWNlKHBsdWdpbkNvbmZpZy50cmFuc2xhdGlvblNlcnZpY2VVcmwsIGxhbmd1YWdlLCBuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZXNMb2FkZWQobWVzc2FnZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIExhbmd1YWdlIGlzIGFscmVhZHkgYXMgZ2VuZXJpYyBhcyBpdCBnZXRzLCBzbyByZXF1aXJlIGRlZmF1bHQgbWVzc2FnZXNcbiAgICAgICAgICAgICAgICBpZiAoIWxhbmd1YWdlLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxKFtuYW1lICsgJy5ubHMnXSwgbWVzc2FnZXNMb2FkZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSBpcyBhIGRhc2gsIHRoZSBsYW5ndWFnZSBjb25maWd1cmVkIGlzIGEgc3BlY2lmaWMgc3ViLWxhbmd1YWdlIG9mIHRoZSBzYW1lIGdlbmVyaWMgbGFuZ3VhZ2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIHdlcmUgdW5hYmxlIHRvIGxvYWQgdGhlIHNwZWNpZmljIGxhbmd1YWdlLCB0cnkgdG8gbG9hZCB0aGUgZ2VuZXJpYyBsYW5ndWFnZS4gRXguIHdlIGZhaWxlZCB0byBmaW5kIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gU3dpc3MgR2VybWFuIChkZS1DSCksIHNvIHRyeSB0byBsb2FkIHRoZSBnZW5lcmljIEdlcm1hbiAoZGUpIG1lc3NhZ2VzIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdlbmVyaWNMYW5ndWFnZSA9IGxhbmd1YWdlLnNwbGl0KCctJylbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0geWllbGQgZ2V0TWVzc2FnZXNGcm9tVHJhbnNsYXRpb25zU2VydmljZShwbHVnaW5Db25maWcudHJhbnNsYXRpb25TZXJ2aWNlVXJsLCBnZW5lcmljTGFuZ3VhZ2UsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBnb3Qgc29tZSBtZXNzYWdlcywgc28gd2UgY29uZmlndXJlIHRoZSBjb25maWd1cmF0aW9uIHRvIHVzZSB0aGUgZ2VuZXJpYyBsYW5ndWFnZSBmb3IgdGhpcyBzZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICAoX2IgPSBwbHVnaW5Db25maWcuYXZhaWxhYmxlTGFuZ3VhZ2VzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAocGx1Z2luQ29uZmlnLmF2YWlsYWJsZUxhbmd1YWdlcyA9IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luQ29uZmlnLmF2YWlsYWJsZUxhbmd1YWdlc1snKiddID0gZ2VuZXJpY0xhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZXNMb2FkZWQobWVzc2FnZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcShbbmFtZSArICcubmxzJ10sIG1lc3NhZ2VzTG9hZGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVxKFtuYW1lICsgc3VmZml4XSwgbWVzc2FnZXNMb2FkZWQsIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChzdWZmaXggPT09ICcubmxzJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0cnlpbmcgdG8gbG9hZCBkZWZhdWx0IGxhbmd1YWdlIHN0cmluZ3MnLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIG1lc3NhZ2UgYnVuZGxlIGZvciBsYW5ndWFnZSAke2xhbmd1YWdlfS4gRmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0IGxhbmd1YWdlOmAsIGVycik7XG4gICAgICAgICAgICByZXEoW25hbWUgKyAnLm5scyddLCBtZXNzYWdlc0xvYWRlZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsInZhciBfYTtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0ICogYXMgbmxzIGZyb20gJy4uLy4uL25scy5qcyc7XG5leHBvcnQgY29uc3QgTEFOR1VBR0VfREVGQVVMVCA9ICdlbic7XG5sZXQgX2lzV2luZG93cyA9IGZhbHNlO1xubGV0IF9pc01hY2ludG9zaCA9IGZhbHNlO1xubGV0IF9pc0xpbnV4ID0gZmFsc2U7XG5sZXQgX2lzTGludXhTbmFwID0gZmFsc2U7XG5sZXQgX2lzTmF0aXZlID0gZmFsc2U7XG5sZXQgX2lzV2ViID0gZmFsc2U7XG5sZXQgX2lzRWxlY3Ryb24gPSBmYWxzZTtcbmxldCBfaXNJT1MgPSBmYWxzZTtcbmxldCBfaXNDSSA9IGZhbHNlO1xubGV0IF9pc01vYmlsZSA9IGZhbHNlO1xubGV0IF9sb2NhbGUgPSB1bmRlZmluZWQ7XG5sZXQgX2xhbmd1YWdlID0gTEFOR1VBR0VfREVGQVVMVDtcbmxldCBfcGxhdGZvcm1Mb2NhbGUgPSBMQU5HVUFHRV9ERUZBVUxUO1xubGV0IF90cmFuc2xhdGlvbnNDb25maWdGaWxlID0gdW5kZWZpbmVkO1xubGV0IF91c2VyQWdlbnQgPSB1bmRlZmluZWQ7XG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgZ2xvYmFsVGhpc2AgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgZ2xvYmFscyA9ICh0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCA9PT0gJ29iamVjdCcgPyBnbG9iYWwgOiB7fSk7XG5sZXQgbm9kZVByb2Nlc3MgPSB1bmRlZmluZWQ7XG5pZiAodHlwZW9mIGdsb2JhbHMudnNjb2RlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ2xvYmFscy52c2NvZGUucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBOYXRpdmUgZW52aXJvbm1lbnQgKHNhbmRib3hlZClcbiAgICBub2RlUHJvY2VzcyA9IGdsb2JhbHMudnNjb2RlLnByb2Nlc3M7XG59XG5lbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBOYXRpdmUgZW52aXJvbm1lbnQgKG5vbi1zYW5kYm94ZWQpXG4gICAgbm9kZVByb2Nlc3MgPSBwcm9jZXNzO1xufVxuY29uc3QgaXNFbGVjdHJvblByb2Nlc3MgPSB0eXBlb2YgKChfYSA9IG5vZGVQcm9jZXNzID09PSBudWxsIHx8IG5vZGVQcm9jZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlUHJvY2Vzcy52ZXJzaW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVsZWN0cm9uKSA9PT0gJ3N0cmluZyc7XG5jb25zdCBpc0VsZWN0cm9uUmVuZGVyZXIgPSBpc0VsZWN0cm9uUHJvY2VzcyAmJiAobm9kZVByb2Nlc3MgPT09IG51bGwgfHwgbm9kZVByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGVQcm9jZXNzLnR5cGUpID09PSAncmVuZGVyZXInO1xuLy8gV2ViIGVudmlyb25tZW50XG5pZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgIWlzRWxlY3Ryb25SZW5kZXJlcikge1xuICAgIF91c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIF9pc1dpbmRvd3MgPSBfdXNlckFnZW50LmluZGV4T2YoJ1dpbmRvd3MnKSA+PSAwO1xuICAgIF9pc01hY2ludG9zaCA9IF91c2VyQWdlbnQuaW5kZXhPZignTWFjaW50b3NoJykgPj0gMDtcbiAgICBfaXNJT1MgPSAoX3VzZXJBZ2VudC5pbmRleE9mKCdNYWNpbnRvc2gnKSA+PSAwIHx8IF91c2VyQWdlbnQuaW5kZXhPZignaVBhZCcpID49IDAgfHwgX3VzZXJBZ2VudC5pbmRleE9mKCdpUGhvbmUnKSA+PSAwKSAmJiAhIW5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwO1xuICAgIF9pc0xpbnV4ID0gX3VzZXJBZ2VudC5pbmRleE9mKCdMaW51eCcpID49IDA7XG4gICAgX2lzTW9iaWxlID0gKF91c2VyQWdlbnQgPT09IG51bGwgfHwgX3VzZXJBZ2VudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3VzZXJBZ2VudC5pbmRleE9mKCdNb2JpJykpID49IDA7XG4gICAgX2lzV2ViID0gdHJ1ZTtcbiAgICBjb25zdCBjb25maWd1cmVkTG9jYWxlID0gbmxzLmdldENvbmZpZ3VyZWREZWZhdWx0TG9jYWxlKFxuICAgIC8vIFRoaXMgY2FsbCBfbXVzdF8gYmUgZG9uZSBpbiB0aGUgZmlsZSB0aGF0IGNhbGxzIGBubHMuZ2V0Q29uZmlndXJlZERlZmF1bHRMb2NhbGVgXG4gICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIE5MUyBBTUQgTG9hZGVyIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgYW5kIGNvbmZpZ3VyZWQuXG4gICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBsb2FkZXIgcGx1Z2luIGRlY2lkZXMgd2hhdCB0aGUgZGVmYXVsdCBsb2NhbGUgaXMgYmFzZWQgb25cbiAgICAvLyBob3cgaXQncyBhYmxlIHRvIHJlc29sdmUgdGhlIHN0cmluZ3MuXG4gICAgbmxzLmxvY2FsaXplKHsga2V5OiAnZW5zdXJlTG9hZGVyUGx1Z2luSXNMb2FkZWQnLCBjb21tZW50OiBbJ3tMb2NrZWR9J10gfSwgJ18nKSk7XG4gICAgX2xvY2FsZSA9IGNvbmZpZ3VyZWRMb2NhbGUgfHwgTEFOR1VBR0VfREVGQVVMVDtcbiAgICBfbGFuZ3VhZ2UgPSBfbG9jYWxlO1xuICAgIF9wbGF0Zm9ybUxvY2FsZSA9IG5hdmlnYXRvci5sYW5ndWFnZTtcbn1cbi8vIE5hdGl2ZSBlbnZpcm9ubWVudFxuZWxzZSBpZiAodHlwZW9mIG5vZGVQcm9jZXNzID09PSAnb2JqZWN0Jykge1xuICAgIF9pc1dpbmRvd3MgPSAobm9kZVByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpO1xuICAgIF9pc01hY2ludG9zaCA9IChub2RlUHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpO1xuICAgIF9pc0xpbnV4ID0gKG5vZGVQcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKTtcbiAgICBfaXNMaW51eFNuYXAgPSBfaXNMaW51eCAmJiAhIW5vZGVQcm9jZXNzLmVudlsnU05BUCddICYmICEhbm9kZVByb2Nlc3MuZW52WydTTkFQX1JFVklTSU9OJ107XG4gICAgX2lzRWxlY3Ryb24gPSBpc0VsZWN0cm9uUHJvY2VzcztcbiAgICBfaXNDSSA9ICEhbm9kZVByb2Nlc3MuZW52WydDSSddIHx8ICEhbm9kZVByb2Nlc3MuZW52WydCVUlMRF9BUlRJRkFDVFNUQUdJTkdESVJFQ1RPUlknXTtcbiAgICBfbG9jYWxlID0gTEFOR1VBR0VfREVGQVVMVDtcbiAgICBfbGFuZ3VhZ2UgPSBMQU5HVUFHRV9ERUZBVUxUO1xuICAgIGNvbnN0IHJhd05sc0NvbmZpZyA9IG5vZGVQcm9jZXNzLmVudlsnVlNDT0RFX05MU19DT05GSUcnXTtcbiAgICBpZiAocmF3TmxzQ29uZmlnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBubHNDb25maWcgPSBKU09OLnBhcnNlKHJhd05sc0NvbmZpZyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IG5sc0NvbmZpZy5hdmFpbGFibGVMYW5ndWFnZXNbJyonXTtcbiAgICAgICAgICAgIF9sb2NhbGUgPSBubHNDb25maWcubG9jYWxlO1xuICAgICAgICAgICAgX3BsYXRmb3JtTG9jYWxlID0gbmxzQ29uZmlnLm9zTG9jYWxlO1xuICAgICAgICAgICAgLy8gVlNDb2RlJ3MgZGVmYXVsdCBsYW5ndWFnZSBpcyAnZW4nXG4gICAgICAgICAgICBfbGFuZ3VhZ2UgPSByZXNvbHZlZCA/IHJlc29sdmVkIDogTEFOR1VBR0VfREVGQVVMVDtcbiAgICAgICAgICAgIF90cmFuc2xhdGlvbnNDb25maWdGaWxlID0gbmxzQ29uZmlnLl90cmFuc2xhdGlvbnNDb25maWdGaWxlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2lzTmF0aXZlID0gdHJ1ZTtcbn1cbi8vIFVua25vd24gZW52aXJvbm1lbnRcbmVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIHBsYXRmb3JtLicpO1xufVxubGV0IF9wbGF0Zm9ybSA9IDAgLyogUGxhdGZvcm0uV2ViICovO1xuaWYgKF9pc01hY2ludG9zaCkge1xuICAgIF9wbGF0Zm9ybSA9IDEgLyogUGxhdGZvcm0uTWFjICovO1xufVxuZWxzZSBpZiAoX2lzV2luZG93cykge1xuICAgIF9wbGF0Zm9ybSA9IDMgLyogUGxhdGZvcm0uV2luZG93cyAqLztcbn1cbmVsc2UgaWYgKF9pc0xpbnV4KSB7XG4gICAgX3BsYXRmb3JtID0gMiAvKiBQbGF0Zm9ybS5MaW51eCAqLztcbn1cbmV4cG9ydCBjb25zdCBpc1dpbmRvd3MgPSBfaXNXaW5kb3dzO1xuZXhwb3J0IGNvbnN0IGlzTWFjaW50b3NoID0gX2lzTWFjaW50b3NoO1xuZXhwb3J0IGNvbnN0IGlzTGludXggPSBfaXNMaW51eDtcbmV4cG9ydCBjb25zdCBpc05hdGl2ZSA9IF9pc05hdGl2ZTtcbmV4cG9ydCBjb25zdCBpc1dlYiA9IF9pc1dlYjtcbmV4cG9ydCBjb25zdCBpc1dlYldvcmtlciA9IChfaXNXZWIgJiYgdHlwZW9mIGdsb2JhbHMuaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJyk7XG5leHBvcnQgY29uc3QgaXNJT1MgPSBfaXNJT1M7XG5leHBvcnQgY29uc3QgaXNNb2JpbGUgPSBfaXNNb2JpbGU7XG5leHBvcnQgY29uc3QgdXNlckFnZW50ID0gX3VzZXJBZ2VudDtcbi8qKlxuICogVGhlIGxhbmd1YWdlIHVzZWQgZm9yIHRoZSB1c2VyIGludGVyZmFjZS4gVGhlIGZvcm1hdCBvZlxuICogdGhlIHN0cmluZyBpcyBhbGwgbG93ZXIgY2FzZSAoZS5nLiB6aC10dyBmb3IgVHJhZGl0aW9uYWxcbiAqIENoaW5lc2UpXG4gKi9cbmV4cG9ydCBjb25zdCBsYW5ndWFnZSA9IF9sYW5ndWFnZTtcbmV4cG9ydCBjb25zdCBzZXRUaW1lb3V0MElzRmFzdGVyID0gKHR5cGVvZiBnbG9iYWxzLnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nICYmICFnbG9iYWxzLmltcG9ydFNjcmlwdHMpO1xuLyoqXG4gKiBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCM6fjp0ZXh0PXRoYW4lMjA0JTJDJTIwdGhlbi0sc2V0JTIwdGltZW91dCUyMHRvJTIwNCwtLlxuICpcbiAqIFdvcmtzIHNpbWlsYXJseSB0byBgc2V0VGltZW91dCgwKWAgYnV0IGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhlIDRtcyBhcnRpZmljaWFsIGRlbGF5XG4gKiB0aGF0IGJyb3dzZXJzIHNldCB3aGVuIHRoZSBuZXN0aW5nIGxldmVsIGlzID4gNS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWVvdXQwID0gKCgpID0+IHtcbiAgICBpZiAoc2V0VGltZW91dDBJc0Zhc3Rlcikge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gW107XG4gICAgICAgIGdsb2JhbHMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5kYXRhICYmIGUuZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwZW5kaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBlbmRpbmdbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuaWQgPT09IGUuZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUuY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsYXN0SWQgPSAwO1xuICAgICAgICByZXR1cm4gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBteUlkID0gKytsYXN0SWQ7XG4gICAgICAgICAgICBwZW5kaW5nLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBteUlkLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBnbG9iYWxzLnBvc3RNZXNzYWdlKHsgdnNjb2RlU2NoZWR1bGVBc3luY1dvcms6IG15SWQgfSwgJyonKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIChjYWxsYmFjaykgPT4gc2V0VGltZW91dChjYWxsYmFjayk7XG59KSgpO1xuZXhwb3J0IGNvbnN0IE9TID0gKF9pc01hY2ludG9zaCB8fCBfaXNJT1MgPyAyIC8qIE9wZXJhdGluZ1N5c3RlbS5NYWNpbnRvc2ggKi8gOiAoX2lzV2luZG93cyA/IDEgLyogT3BlcmF0aW5nU3lzdGVtLldpbmRvd3MgKi8gOiAzIC8qIE9wZXJhdGluZ1N5c3RlbS5MaW51eCAqLykpO1xubGV0IF9pc0xpdHRsZUVuZGlhbiA9IHRydWU7XG5sZXQgX2lzTGl0dGxlRW5kaWFuQ29tcHV0ZWQgPSBmYWxzZTtcbmV4cG9ydCBmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHtcbiAgICBpZiAoIV9pc0xpdHRsZUVuZGlhbkNvbXB1dGVkKSB7XG4gICAgICAgIF9pc0xpdHRsZUVuZGlhbkNvbXB1dGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdGVzdCA9IG5ldyBVaW50OEFycmF5KDIpO1xuICAgICAgICB0ZXN0WzBdID0gMTtcbiAgICAgICAgdGVzdFsxXSA9IDI7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDE2QXJyYXkodGVzdC5idWZmZXIpO1xuICAgICAgICBfaXNMaXR0bGVFbmRpYW4gPSAodmlld1swXSA9PT0gKDIgPDwgOCkgKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIF9pc0xpdHRsZUVuZGlhbjtcbn1cbmV4cG9ydCBjb25zdCBpc0Nocm9tZSA9ICEhKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPj0gMCk7XG5leHBvcnQgY29uc3QgaXNGaXJlZm94ID0gISEodXNlckFnZW50ICYmIHVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPj0gMCk7XG5leHBvcnQgY29uc3QgaXNTYWZhcmkgPSAhISghaXNDaHJvbWUgJiYgKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZignU2FmYXJpJykgPj0gMCkpO1xuZXhwb3J0IGNvbnN0IGlzRWRnZSA9ICEhKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZignRWRnLycpID49IDApO1xuZXhwb3J0IGNvbnN0IGlzQW5kcm9pZCA9ICEhKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZignQW5kcm9pZCcpID49IDApO1xuIiwiLyoqXG4gKiBVc2VzIGEgTFJVIGNhY2hlIHRvIG1ha2UgYSBnaXZlbiBwYXJhbWV0cml6ZWQgZnVuY3Rpb24gY2FjaGVkLlxuICogQ2FjaGVzIGp1c3QgdGhlIGxhc3QgdmFsdWUuXG4gKiBUaGUga2V5IG11c3QgYmUgSlNPTiBzZXJpYWxpemFibGUuXG4qL1xuZXhwb3J0IGNsYXNzIExSVUNhY2hlZEZ1bmN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcihmbikge1xuICAgICAgICB0aGlzLmZuID0gZm47XG4gICAgICAgIHRoaXMubGFzdENhY2hlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxhc3RBcmdLZXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldChhcmcpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgICAgICAgaWYgKHRoaXMubGFzdEFyZ0tleSAhPT0ga2V5KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RBcmdLZXkgPSBrZXk7XG4gICAgICAgICAgICB0aGlzLmxhc3RDYWNoZSA9IHRoaXMuZm4oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0Q2FjaGU7XG4gICAgfVxufVxuLyoqXG4gKiBVc2VzIGFuIHVuYm91bmRlZCBjYWNoZSAocmVmZXJlbnRpYWwgZXF1YWxpdHkpIHRvIG1lbW9pemUgdGhlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuKi9cbmV4cG9ydCBjbGFzcyBDYWNoZWRGdW5jdGlvbiB7XG4gICAgZ2V0IGNhY2hlZFZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoZm4pIHtcbiAgICAgICAgdGhpcy5mbiA9IGZuO1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGdldChhcmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcC5oYXMoYXJnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5nZXQoYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm4oYXJnKTtcbiAgICAgICAgdGhpcy5fbWFwLnNldChhcmcsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGNsYXNzIExhenkge1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICAgICAgdGhpcy5fZGlkUnVuID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBmb3JjZSBldmFsdWF0aW9uIG9mIHRoZSBsYXp5IHZhbHVlIGlmIGl0IGhhcyBub3QgYmVlbiByZXNvbHZlZCB5ZXQuIExhenkgdmFsdWVzIGFyZSBvbmx5XG4gICAgICogcmVzb2x2ZWQgb25jZS4gYGdldFZhbHVlYCB3aWxsIHJlLXRocm93IGV4Y2VwdGlvbnMgdGhhdCBhcmUgaGl0IHdoaWxlIHJlc29sdmluZyB0aGUgdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGlkUnVuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5leGVjdXRvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlkUnVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IHRoaXMuX2Vycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB3cmFwcGVkIHZhbHVlIHdpdGhvdXQgZm9yY2luZyBldmFsdWF0aW9uLlxuICAgICAqL1xuICAgIGdldCByYXdWYWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbnZhciBfYTtcbmltcG9ydCB7IExSVUNhY2hlZEZ1bmN0aW9uIH0gZnJvbSAnLi9jYWNoZS5qcyc7XG5pbXBvcnQgeyBMYXp5IH0gZnJvbSAnLi9sYXp5LmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc0ZhbHN5T3JXaGl0ZXNwYWNlKHN0cikge1xuICAgIGlmICghc3RyIHx8IHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc3RyLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG5jb25zdCBfZm9ybWF0UmVnZXhwID0gL3soXFxkKyl9L2c7XG4vKipcbiAqIEhlbHBlciB0byBwcm9kdWNlIGEgc3RyaW5nIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiBJbnNlcnQgdmFyaWFibGUgc2VnbWVudHNcbiAqIGludG8gdGhlIHN0cmluZyB1c2luZyB0aGUge259IG5vdGF0aW9uIHdoZXJlIE4gaXMgdGhlIGluZGV4IG9mIHRoZSBhcmd1bWVudCBmb2xsb3dpbmcgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSB2YWx1ZSBzdHJpbmcgdG8gd2hpY2ggZm9ybWF0dGluZyBpcyBhcHBsaWVkXG4gKiBAcGFyYW0gYXJncyByZXBsYWNlbWVudHMgZm9yIHtufS1lbnRyaWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXQodmFsdWUsIC4uLmFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZShfZm9ybWF0UmVnZXhwLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGdyb3VwLCAxMCk7XG4gICAgICAgIHJldHVybiBpc05hTihpZHgpIHx8IGlkeCA8IDAgfHwgaWR4ID49IGFyZ3MubGVuZ3RoID9cbiAgICAgICAgICAgIG1hdGNoIDpcbiAgICAgICAgICAgIGFyZ3NbaWR4XTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydHMgSFRNTCBjaGFyYWN0ZXJzIGluc2lkZSB0aGUgc3RyaW5nIHRvIHVzZSBlbnRpdGllcyBpbnN0ZWFkLiBNYWtlcyB0aGUgc3RyaW5nIHNhZmUgZnJvbVxuICogYmVpbmcgdXNlZCBlLmcuIGluIEhUTUxFbGVtZW50LmlubmVySFRNTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZShodG1sKSB7XG4gICAgcmV0dXJuIGh0bWwucmVwbGFjZSgvWzw+Jl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgICAgICAgIGNhc2UgJzwnOiByZXR1cm4gJyZsdDsnO1xuICAgICAgICAgICAgY2FzZSAnPic6IHJldHVybiAnJmd0Oyc7XG4gICAgICAgICAgICBjYXNlICcmJzogcmV0dXJuICcmYW1wOyc7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gbWF0Y2g7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogRXNjYXBlcyByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVycyBpbiBhIGdpdmVuIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwQ2hhcmFjdGVycyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bXFxcXFxce1xcfVxcKlxcK1xcP1xcfFxcXlxcJFxcLlxcW1xcXVxcKFxcKV0vZywgJ1xcXFwkJicpO1xufVxuLyoqXG4gKiBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBvZiBuZWVkbGUgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaGF5c3RhY2suXG4gKiBAcGFyYW0gaGF5c3RhY2sgc3RyaW5nIHRvIHRyaW1cbiAqIEBwYXJhbSBuZWVkbGUgdGhlIHRoaW5nIHRvIHRyaW0gKGRlZmF1bHQgaXMgYSBibGFuaylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW0oaGF5c3RhY2ssIG5lZWRsZSA9ICcgJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsdHJpbShoYXlzdGFjaywgbmVlZGxlKTtcbiAgICByZXR1cm4gcnRyaW0odHJpbW1lZCwgbmVlZGxlKTtcbn1cbi8qKlxuICogUmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgb2YgbmVlZGxlIGZyb20gdGhlIGJlZ2lubmluZyBvZiBoYXlzdGFjay5cbiAqIEBwYXJhbSBoYXlzdGFjayBzdHJpbmcgdG8gdHJpbVxuICogQHBhcmFtIG5lZWRsZSB0aGUgdGhpbmcgdG8gdHJpbVxuICovXG5leHBvcnQgZnVuY3Rpb24gbHRyaW0oaGF5c3RhY2ssIG5lZWRsZSkge1xuICAgIGlmICghaGF5c3RhY2sgfHwgIW5lZWRsZSkge1xuICAgICAgICByZXR1cm4gaGF5c3RhY2s7XG4gICAgfVxuICAgIGNvbnN0IG5lZWRsZUxlbiA9IG5lZWRsZS5sZW5ndGg7XG4gICAgaWYgKG5lZWRsZUxlbiA9PT0gMCB8fCBoYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGhheXN0YWNrO1xuICAgIH1cbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAoaGF5c3RhY2suaW5kZXhPZihuZWVkbGUsIG9mZnNldCkgPT09IG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyBuZWVkbGVMZW47XG4gICAgfVxuICAgIHJldHVybiBoYXlzdGFjay5zdWJzdHJpbmcob2Zmc2V0KTtcbn1cbi8qKlxuICogUmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgb2YgbmVlZGxlIGZyb20gdGhlIGVuZCBvZiBoYXlzdGFjay5cbiAqIEBwYXJhbSBoYXlzdGFjayBzdHJpbmcgdG8gdHJpbVxuICogQHBhcmFtIG5lZWRsZSB0aGUgdGhpbmcgdG8gdHJpbVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnRyaW0oaGF5c3RhY2ssIG5lZWRsZSkge1xuICAgIGlmICghaGF5c3RhY2sgfHwgIW5lZWRsZSkge1xuICAgICAgICByZXR1cm4gaGF5c3RhY2s7XG4gICAgfVxuICAgIGNvbnN0IG5lZWRsZUxlbiA9IG5lZWRsZS5sZW5ndGgsIGhheXN0YWNrTGVuID0gaGF5c3RhY2subGVuZ3RoO1xuICAgIGlmIChuZWVkbGVMZW4gPT09IDAgfHwgaGF5c3RhY2tMZW4gPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGhheXN0YWNrO1xuICAgIH1cbiAgICBsZXQgb2Zmc2V0ID0gaGF5c3RhY2tMZW4sIGlkeCA9IC0xO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlkeCA9IGhheXN0YWNrLmxhc3RJbmRleE9mKG5lZWRsZSwgb2Zmc2V0IC0gMSk7XG4gICAgICAgIGlmIChpZHggPT09IC0xIHx8IGlkeCArIG5lZWRsZUxlbiAhPT0gb2Zmc2V0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWR4ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ID0gaWR4O1xuICAgIH1cbiAgICByZXR1cm4gaGF5c3RhY2suc3Vic3RyaW5nKDAsIG9mZnNldCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udmVydFNpbXBsZTJSZWdFeHBQYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKC9bXFwtXFxcXFxce1xcfVxcK1xcP1xcfFxcXlxcJFxcLlxcLFxcW1xcXVxcKFxcKVxcI1xcc10vZywgJ1xcXFwkJicpLnJlcGxhY2UoL1tcXCpdL2csICcuKicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwV2lsZGNhcmRzKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKC9cXCovZywgJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZ0V4cChzZWFyY2hTdHJpbmcsIGlzUmVnZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSByZWdleCBmcm9tIGVtcHR5IHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoIWlzUmVnZXgpIHtcbiAgICAgICAgc2VhcmNoU3RyaW5nID0gZXNjYXBlUmVnRXhwQ2hhcmFjdGVycyhzZWFyY2hTdHJpbmcpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy53aG9sZVdvcmQpIHtcbiAgICAgICAgaWYgKCEvXFxCLy50ZXN0KHNlYXJjaFN0cmluZy5jaGFyQXQoMCkpKSB7XG4gICAgICAgICAgICBzZWFyY2hTdHJpbmcgPSAnXFxcXGInICsgc2VhcmNoU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghL1xcQi8udGVzdChzZWFyY2hTdHJpbmcuY2hhckF0KHNlYXJjaFN0cmluZy5sZW5ndGggLSAxKSkpIHtcbiAgICAgICAgICAgIHNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZyArICdcXFxcYic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG1vZGlmaWVycyA9ICcnO1xuICAgIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgICAgICBtb2RpZmllcnMgKz0gJ2cnO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMubWF0Y2hDYXNlKSB7XG4gICAgICAgIG1vZGlmaWVycyArPSAnaSc7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm11bHRpbGluZSkge1xuICAgICAgICBtb2RpZmllcnMgKz0gJ20nO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51bmljb2RlKSB7XG4gICAgICAgIG1vZGlmaWVycyArPSAndSc7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVnRXhwKHNlYXJjaFN0cmluZywgbW9kaWZpZXJzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWdFeHBMZWFkc1RvRW5kbGVzc0xvb3AocmVnZXhwKSB7XG4gICAgLy8gRXhpdCBlYXJseSBpZiBpdCdzIG9uZSBvZiB0aGVzZSBzcGVjaWFsIGNhc2VzIHdoaWNoIGFyZSBtZWFudCB0byBtYXRjaFxuICAgIC8vIGFnYWluc3QgYW4gZW1wdHkgc3RyaW5nXG4gICAgaWYgKHJlZ2V4cC5zb3VyY2UgPT09ICdeJyB8fCByZWdleHAuc291cmNlID09PSAnXiQnIHx8IHJlZ2V4cC5zb3VyY2UgPT09ICckJyB8fCByZWdleHAuc291cmNlID09PSAnXlxcXFxzKiQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gV2UgY2hlY2sgYWdhaW5zdCBhbiBlbXB0eSBzdHJpbmcuIElmIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZG9lc24ndCBhZHZhbmNlXG4gICAgLy8gKGUuZy4gZW5kcyBpbiBhbiBlbmRsZXNzIGxvb3ApIGl0IHdpbGwgbWF0Y2ggYW4gZW1wdHkgc3RyaW5nLlxuICAgIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWMoJycpO1xuICAgIHJldHVybiAhIShtYXRjaCAmJiByZWdleHAubGFzdEluZGV4ID09PSAwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWdFeHBGbGFncyhyZWdleHApIHtcbiAgICByZXR1cm4gKHJlZ2V4cC5nbG9iYWwgPyAnZycgOiAnJylcbiAgICAgICAgKyAocmVnZXhwLmlnbm9yZUNhc2UgPyAnaScgOiAnJylcbiAgICAgICAgKyAocmVnZXhwLm11bHRpbGluZSA/ICdtJyA6ICcnKVxuICAgICAgICArIChyZWdleHAgLyogc3RhbmRhbG9uZSBlZGl0b3IgY29tcGlsYXRpb24gKi8udW5pY29kZSA/ICd1JyA6ICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdExpbmVzKHN0cikge1xuICAgIHJldHVybiBzdHIuc3BsaXQoL1xcclxcbnxcXHJ8XFxuLyk7XG59XG4vKipcbiAqIFJldHVybnMgZmlyc3QgaW5kZXggb2YgdGhlIHN0cmluZyB0aGF0IGlzIG5vdCB3aGl0ZXNwYWNlLlxuICogSWYgc3RyaW5nIGlzIGVtcHR5IG9yIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMsIHJldHVybnMgLTFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0Tm9uV2hpdGVzcGFjZUluZGV4KHN0cikge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjaENvZGUgIT09IDMyIC8qIENoYXJDb2RlLlNwYWNlICovICYmIGNoQ29kZSAhPT0gOSAvKiBDaGFyQ29kZS5UYWIgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIG9mIHRoZSBzdHJpbmcuXG4gKiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMsIHJldHVybnMgZW50aXJlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGVhZGluZ1doaXRlc3BhY2Uoc3RyLCBzdGFydCA9IDAsIGVuZCA9IHN0ci5sZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICBjb25zdCBjaENvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGNoQ29kZSAhPT0gMzIgLyogQ2hhckNvZGUuU3BhY2UgKi8gJiYgY2hDb2RlICE9PSA5IC8qIENoYXJDb2RlLlRhYiAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGxhc3QgaW5kZXggb2YgdGhlIHN0cmluZyB0aGF0IGlzIG5vdCB3aGl0ZXNwYWNlLlxuICogSWYgc3RyaW5nIGlzIGVtcHR5IG9yIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMsIHJldHVybnMgLTFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhc3ROb25XaGl0ZXNwYWNlSW5kZXgoc3RyLCBzdGFydEluZGV4ID0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgY2hDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjaENvZGUgIT09IDMyIC8qIENoYXJDb2RlLlNwYWNlICovICYmIGNoQ29kZSAhPT0gOSAvKiBDaGFyQ29kZS5UYWIgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBlbHNlIGlmIChhID4gYikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlU3Vic3RyaW5nKGEsIGIsIGFTdGFydCA9IDAsIGFFbmQgPSBhLmxlbmd0aCwgYlN0YXJ0ID0gMCwgYkVuZCA9IGIubGVuZ3RoKSB7XG4gICAgZm9yICg7IGFTdGFydCA8IGFFbmQgJiYgYlN0YXJ0IDwgYkVuZDsgYVN0YXJ0KyssIGJTdGFydCsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGVBID0gYS5jaGFyQ29kZUF0KGFTdGFydCk7XG4gICAgICAgIGNvbnN0IGNvZGVCID0gYi5jaGFyQ29kZUF0KGJTdGFydCk7XG4gICAgICAgIGlmIChjb2RlQSA8IGNvZGVCKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZUEgPiBjb2RlQikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYUxlbiA9IGFFbmQgLSBhU3RhcnQ7XG4gICAgY29uc3QgYkxlbiA9IGJFbmQgLSBiU3RhcnQ7XG4gICAgaWYgKGFMZW4gPCBiTGVuKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUxlbiA+IGJMZW4pIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVJZ25vcmVDYXNlKGEsIGIpIHtcbiAgICByZXR1cm4gY29tcGFyZVN1YnN0cmluZ0lnbm9yZUNhc2UoYSwgYiwgMCwgYS5sZW5ndGgsIDAsIGIubGVuZ3RoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlU3Vic3RyaW5nSWdub3JlQ2FzZShhLCBiLCBhU3RhcnQgPSAwLCBhRW5kID0gYS5sZW5ndGgsIGJTdGFydCA9IDAsIGJFbmQgPSBiLmxlbmd0aCkge1xuICAgIGZvciAoOyBhU3RhcnQgPCBhRW5kICYmIGJTdGFydCA8IGJFbmQ7IGFTdGFydCsrLCBiU3RhcnQrKykge1xuICAgICAgICBsZXQgY29kZUEgPSBhLmNoYXJDb2RlQXQoYVN0YXJ0KTtcbiAgICAgICAgbGV0IGNvZGVCID0gYi5jaGFyQ29kZUF0KGJTdGFydCk7XG4gICAgICAgIGlmIChjb2RlQSA9PT0gY29kZUIpIHtcbiAgICAgICAgICAgIC8vIGVxdWFsXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZUEgPj0gMTI4IHx8IGNvZGVCID49IDEyOCkge1xuICAgICAgICAgICAgLy8gbm90IEFTQ0lJIGxldHRlcnMgLT4gZmFsbGJhY2sgdG8gbG93ZXItY2FzaW5nIHN0cmluZ3NcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlU3Vic3RyaW5nKGEudG9Mb3dlckNhc2UoKSwgYi50b0xvd2VyQ2FzZSgpLCBhU3RhcnQsIGFFbmQsIGJTdGFydCwgYkVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFwcGVyIGxvd2VyLWNhc2UgYXNjaWkgbGV0dGVyIG9udG8gdXBwZXItY2FzZSB2YXJpbmF0c1xuICAgICAgICAvLyBbOTctMTIyXSAobG93ZXIgYXNjaWkpIC0tPiBbNjUtOTBdICh1cHBlciBhc2NpaSlcbiAgICAgICAgaWYgKGlzTG93ZXJBc2NpaUxldHRlcihjb2RlQSkpIHtcbiAgICAgICAgICAgIGNvZGVBIC09IDMyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xvd2VyQXNjaWlMZXR0ZXIoY29kZUIpKSB7XG4gICAgICAgICAgICBjb2RlQiAtPSAzMjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21wYXJlIGJvdGggY29kZSBwb2ludHNcbiAgICAgICAgY29uc3QgZGlmZiA9IGNvZGVBIC0gY29kZUI7XG4gICAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZjtcbiAgICB9XG4gICAgY29uc3QgYUxlbiA9IGFFbmQgLSBhU3RhcnQ7XG4gICAgY29uc3QgYkxlbiA9IGJFbmQgLSBiU3RhcnQ7XG4gICAgaWYgKGFMZW4gPCBiTGVuKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUxlbiA+IGJMZW4pIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXNjaWlEaWdpdChjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gNDggLyogQ2hhckNvZGUuRGlnaXQwICovICYmIGNvZGUgPD0gNTcgLyogQ2hhckNvZGUuRGlnaXQ5ICovO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTG93ZXJBc2NpaUxldHRlcihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gOTcgLyogQ2hhckNvZGUuYSAqLyAmJiBjb2RlIDw9IDEyMiAvKiBDaGFyQ29kZS56ICovO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVXBwZXJBc2NpaUxldHRlcihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gNjUgLyogQ2hhckNvZGUuQSAqLyAmJiBjb2RlIDw9IDkwIC8qIENoYXJDb2RlLlogKi87XG59XG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzSWdub3JlQ2FzZShhLCBiKSB7XG4gICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBjb21wYXJlU3Vic3RyaW5nSWdub3JlQ2FzZShhLCBiKSA9PT0gMDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdGFydHNXaXRoSWdub3JlQ2FzZShzdHIsIGNhbmRpZGF0ZSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUxlbmd0aCA9IGNhbmRpZGF0ZS5sZW5ndGg7XG4gICAgaWYgKGNhbmRpZGF0ZS5sZW5ndGggPiBzdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBhcmVTdWJzdHJpbmdJZ25vcmVDYXNlKHN0ciwgY2FuZGlkYXRlLCAwLCBjYW5kaWRhdGVMZW5ndGgpID09PSAwO1xufVxuLyoqXG4gKiBAcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IG9mIHRoZSB0d28gc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1vblByZWZpeExlbmd0aChhLCBiKSB7XG4gICAgY29uc3QgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGEuY2hhckNvZGVBdChpKSAhPT0gYi5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVuO1xufVxuLyoqXG4gKiBAcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gc3VmZml4IG9mIHRoZSB0d28gc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1vblN1ZmZpeExlbmd0aChhLCBiKSB7XG4gICAgY29uc3QgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgICBsZXQgaTtcbiAgICBjb25zdCBhTGFzdEluZGV4ID0gYS5sZW5ndGggLSAxO1xuICAgIGNvbnN0IGJMYXN0SW5kZXggPSBiLmxlbmd0aCAtIDE7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChhLmNoYXJDb2RlQXQoYUxhc3RJbmRleCAtIGkpICE9PSBiLmNoYXJDb2RlQXQoYkxhc3RJbmRleCAtIGkpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVuO1xufVxuLyoqXG4gKiBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdXJyb2dhdGVfcGFpclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNIaWdoU3Vycm9nYXRlKGNoYXJDb2RlKSB7XG4gICAgcmV0dXJuICgweEQ4MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhEQkZGKTtcbn1cbi8qKlxuICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3Vycm9nYXRlX3BhaXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTG93U3Vycm9nYXRlKGNoYXJDb2RlKSB7XG4gICAgcmV0dXJuICgweERDMDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhERkZGKTtcbn1cbi8qKlxuICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3Vycm9nYXRlX3BhaXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDb2RlUG9pbnQoaGlnaFN1cnJvZ2F0ZSwgbG93U3Vycm9nYXRlKSB7XG4gICAgcmV0dXJuICgoaGlnaFN1cnJvZ2F0ZSAtIDB4RDgwMCkgPDwgMTApICsgKGxvd1N1cnJvZ2F0ZSAtIDB4REMwMCkgKyAweDEwMDAwO1xufVxuLyoqXG4gKiBnZXQgdGhlIGNvZGUgcG9pbnQgdGhhdCBiZWdpbnMgYXQgb2Zmc2V0IGBvZmZzZXRgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0Q29kZVBvaW50KHN0ciwgbGVuLCBvZmZzZXQpIHtcbiAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KG9mZnNldCk7XG4gICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShjaGFyQ29kZSkgJiYgb2Zmc2V0ICsgMSA8IGxlbikge1xuICAgICAgICBjb25zdCBuZXh0Q2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyAxKTtcbiAgICAgICAgaWYgKGlzTG93U3Vycm9nYXRlKG5leHRDaGFyQ29kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wdXRlQ29kZVBvaW50KGNoYXJDb2RlLCBuZXh0Q2hhckNvZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGFyQ29kZTtcbn1cbi8qKlxuICogZ2V0IHRoZSBjb2RlIHBvaW50IHRoYXQgZW5kcyByaWdodCBiZWZvcmUgb2Zmc2V0IGBvZmZzZXRgXG4gKi9cbmZ1bmN0aW9uIGdldFByZXZDb2RlUG9pbnQoc3RyLCBvZmZzZXQpIHtcbiAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KG9mZnNldCAtIDEpO1xuICAgIGlmIChpc0xvd1N1cnJvZ2F0ZShjaGFyQ29kZSkgJiYgb2Zmc2V0ID4gMSkge1xuICAgICAgICBjb25zdCBwcmV2Q2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQgLSAyKTtcbiAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShwcmV2Q2hhckNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZUNvZGVQb2ludChwcmV2Q2hhckNvZGUsIGNoYXJDb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hhckNvZGU7XG59XG5leHBvcnQgY2xhc3MgQ29kZVBvaW50SXRlcmF0b3Ige1xuICAgIGdldCBvZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHN0ciwgb2Zmc2V0ID0gMCkge1xuICAgICAgICB0aGlzLl9zdHIgPSBzdHI7XG4gICAgICAgIHRoaXMuX2xlbiA9IHN0ci5sZW5ndGg7XG4gICAgICAgIHRoaXMuX29mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gICAgc2V0T2Zmc2V0KG9mZnNldCkge1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICAgIHByZXZDb2RlUG9pbnQoKSB7XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGdldFByZXZDb2RlUG9pbnQodGhpcy5fc3RyLCB0aGlzLl9vZmZzZXQpO1xuICAgICAgICB0aGlzLl9vZmZzZXQgLT0gKGNvZGVQb2ludCA+PSA2NTUzNiAvKiBDb25zdGFudHMuVU5JQ09ERV9TVVBQTEVNRU5UQVJZX1BMQU5FX0JFR0lOICovID8gMiA6IDEpO1xuICAgICAgICByZXR1cm4gY29kZVBvaW50O1xuICAgIH1cbiAgICBuZXh0Q29kZVBvaW50KCkge1xuICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBnZXROZXh0Q29kZVBvaW50KHRoaXMuX3N0ciwgdGhpcy5fbGVuLCB0aGlzLl9vZmZzZXQpO1xuICAgICAgICB0aGlzLl9vZmZzZXQgKz0gKGNvZGVQb2ludCA+PSA2NTUzNiAvKiBDb25zdGFudHMuVU5JQ09ERV9TVVBQTEVNRU5UQVJZX1BMQU5FX0JFR0lOICovID8gMiA6IDEpO1xuICAgICAgICByZXR1cm4gY29kZVBvaW50O1xuICAgIH1cbiAgICBlb2woKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5fb2Zmc2V0ID49IHRoaXMuX2xlbik7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEdyYXBoZW1lSXRlcmF0b3Ige1xuICAgIGdldCBvZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVyYXRvci5vZmZzZXQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHN0ciwgb2Zmc2V0ID0gMCkge1xuICAgICAgICB0aGlzLl9pdGVyYXRvciA9IG5ldyBDb2RlUG9pbnRJdGVyYXRvcihzdHIsIG9mZnNldCk7XG4gICAgfVxuICAgIG5leHRHcmFwaGVtZUxlbmd0aCgpIHtcbiAgICAgICAgY29uc3QgZ3JhcGhlbWVCcmVha1RyZWUgPSBHcmFwaGVtZUJyZWFrVHJlZS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX2l0ZXJhdG9yO1xuICAgICAgICBjb25zdCBpbml0aWFsT2Zmc2V0ID0gaXRlcmF0b3Iub2Zmc2V0O1xuICAgICAgICBsZXQgZ3JhcGhlbWVCcmVha1R5cGUgPSBncmFwaGVtZUJyZWFrVHJlZS5nZXRHcmFwaGVtZUJyZWFrVHlwZShpdGVyYXRvci5uZXh0Q29kZVBvaW50KCkpO1xuICAgICAgICB3aGlsZSAoIWl0ZXJhdG9yLmVvbCgpKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpdGVyYXRvci5vZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCBuZXh0R3JhcGhlbWVCcmVha1R5cGUgPSBncmFwaGVtZUJyZWFrVHJlZS5nZXRHcmFwaGVtZUJyZWFrVHlwZShpdGVyYXRvci5uZXh0Q29kZVBvaW50KCkpO1xuICAgICAgICAgICAgaWYgKGJyZWFrQmV0d2VlbkdyYXBoZW1lQnJlYWtUeXBlKGdyYXBoZW1lQnJlYWtUeXBlLCBuZXh0R3JhcGhlbWVCcmVha1R5cGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gbW92ZSBpdGVyYXRvciBiYWNrXG4gICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2V0T2Zmc2V0KG9mZnNldCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncmFwaGVtZUJyZWFrVHlwZSA9IG5leHRHcmFwaGVtZUJyZWFrVHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGl0ZXJhdG9yLm9mZnNldCAtIGluaXRpYWxPZmZzZXQpO1xuICAgIH1cbiAgICBwcmV2R3JhcGhlbWVMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IGdyYXBoZW1lQnJlYWtUcmVlID0gR3JhcGhlbWVCcmVha1RyZWUuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLl9pdGVyYXRvcjtcbiAgICAgICAgY29uc3QgaW5pdGlhbE9mZnNldCA9IGl0ZXJhdG9yLm9mZnNldDtcbiAgICAgICAgbGV0IGdyYXBoZW1lQnJlYWtUeXBlID0gZ3JhcGhlbWVCcmVha1RyZWUuZ2V0R3JhcGhlbWVCcmVha1R5cGUoaXRlcmF0b3IucHJldkNvZGVQb2ludCgpKTtcbiAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLm9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGl0ZXJhdG9yLm9mZnNldDtcbiAgICAgICAgICAgIGNvbnN0IHByZXZHcmFwaGVtZUJyZWFrVHlwZSA9IGdyYXBoZW1lQnJlYWtUcmVlLmdldEdyYXBoZW1lQnJlYWtUeXBlKGl0ZXJhdG9yLnByZXZDb2RlUG9pbnQoKSk7XG4gICAgICAgICAgICBpZiAoYnJlYWtCZXR3ZWVuR3JhcGhlbWVCcmVha1R5cGUocHJldkdyYXBoZW1lQnJlYWtUeXBlLCBncmFwaGVtZUJyZWFrVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBtb3ZlIGl0ZXJhdG9yIGJhY2tcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5zZXRPZmZzZXQob2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYXBoZW1lQnJlYWtUeXBlID0gcHJldkdyYXBoZW1lQnJlYWtUeXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoaW5pdGlhbE9mZnNldCAtIGl0ZXJhdG9yLm9mZnNldCk7XG4gICAgfVxuICAgIGVvbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZXJhdG9yLmVvbCgpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBuZXh0Q2hhckxlbmd0aChzdHIsIGluaXRpYWxPZmZzZXQpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IG5ldyBHcmFwaGVtZUl0ZXJhdG9yKHN0ciwgaW5pdGlhbE9mZnNldCk7XG4gICAgcmV0dXJuIGl0ZXJhdG9yLm5leHRHcmFwaGVtZUxlbmd0aCgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByZXZDaGFyTGVuZ3RoKHN0ciwgaW5pdGlhbE9mZnNldCkge1xuICAgIGNvbnN0IGl0ZXJhdG9yID0gbmV3IEdyYXBoZW1lSXRlcmF0b3Ioc3RyLCBpbml0aWFsT2Zmc2V0KTtcbiAgICByZXR1cm4gaXRlcmF0b3IucHJldkdyYXBoZW1lTGVuZ3RoKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hhckNvbnRhaW5pbmdPZmZzZXQoc3RyLCBvZmZzZXQpIHtcbiAgICBpZiAob2Zmc2V0ID4gMCAmJiBpc0xvd1N1cnJvZ2F0ZShzdHIuY2hhckNvZGVBdChvZmZzZXQpKSkge1xuICAgICAgICBvZmZzZXQtLTtcbiAgICB9XG4gICAgY29uc3QgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbmV4dENoYXJMZW5ndGgoc3RyLCBvZmZzZXQpO1xuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0IC0gcHJldkNoYXJMZW5ndGgoc3RyLCBlbmRPZmZzZXQpO1xuICAgIHJldHVybiBbc3RhcnRPZmZzZXQsIGVuZE9mZnNldF07XG59XG5sZXQgQ09OVEFJTlNfUlRMID0gdW5kZWZpbmVkO1xuZnVuY3Rpb24gbWFrZUNvbnRhaW5zUnRsKCkge1xuICAgIC8vIEdlbmVyYXRlZCB1c2luZyBodHRwczovL2dpdGh1Yi5jb20vYWxleGRpbWEvdW5pY29kZS11dGlscy9ibG9iL21haW4vcnRsLXRlc3QuanNcbiAgICByZXR1cm4gLyg/OltcXHUwNUJFXFx1MDVDMFxcdTA1QzNcXHUwNUM2XFx1MDVEMC1cXHUwNUY0XFx1MDYwOFxcdTA2MEJcXHUwNjBEXFx1MDYxQi1cXHUwNjRBXFx1MDY2RC1cXHUwNjZGXFx1MDY3MS1cXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjEtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA3RkUtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4MzAtXFx1MDg1OFxcdTA4NUUtXFx1MDg4RVxcdTA4QTAtXFx1MDhDOVxcdTIwMEZcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGRDNEXFx1RkQ1MC1cXHVGREM3XFx1RkRGMC1cXHVGREZDXFx1RkU3MC1cXHVGRUZDXXxcXHVEODAyW1xcdURDMDAtXFx1REQxQlxcdUREMjAtXFx1REUwMFxcdURFMTAtXFx1REUzNVxcdURFNDAtXFx1REVFNFxcdURFRUItXFx1REYzNVxcdURGNDAtXFx1REZGRl18XFx1RDgwM1tcXHVEQzAwLVxcdUREMjNcXHVERTgwLVxcdURFQTlcXHVERUFELVxcdURGNDVcXHVERjUxLVxcdURGODFcXHVERjg2LVxcdURGRjZdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0NGXFx1REQwMC1cXHVERDQzXFx1REQ0Qi1cXHVERkZGXXxcXHVEODNCW1xcdURDMDAtXFx1REVCQl0pLztcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGBzdHJgIGNvbnRhaW5zIGFueSBVbmljb2RlIGNoYXJhY3RlciB0aGF0IGlzIGNsYXNzaWZpZWQgYXMgXCJSXCIgb3IgXCJBTFwiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNSVEwoc3RyKSB7XG4gICAgaWYgKCFDT05UQUlOU19SVEwpIHtcbiAgICAgICAgQ09OVEFJTlNfUlRMID0gbWFrZUNvbnRhaW5zUnRsKCk7XG4gICAgfVxuICAgIHJldHVybiBDT05UQUlOU19SVEwudGVzdChzdHIpO1xufVxuY29uc3QgSVNfQkFTSUNfQVNDSUkgPSAvXltcXHRcXG5cXHJcXHgyMC1cXHg3RV0qJC87XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgc3RyYCBjb250YWlucyBvbmx5IGJhc2ljIEFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDMyIC0gMTI2IChpbmNsdWRpbmcgMzIgYW5kIDEyNikgb3IgXFxuLCBcXHIsIFxcdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCYXNpY0FTQ0lJKHN0cikge1xuICAgIHJldHVybiBJU19CQVNJQ19BU0NJSS50ZXN0KHN0cik7XG59XG5leHBvcnQgY29uc3QgVU5VU1VBTF9MSU5FX1RFUk1JTkFUT1JTID0gL1tcXHUyMDI4XFx1MjAyOV0vOyAvLyBMSU5FIFNFUEFSQVRPUiAoTFMpIG9yIFBBUkFHUkFQSCBTRVBBUkFUT1IgKFBTKVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHN0cmAgY29udGFpbnMgdW51c3VhbCBsaW5lIHRlcm1pbmF0b3JzLCBsaWtlIExTIG9yIFBTXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc1VudXN1YWxMaW5lVGVybWluYXRvcnMoc3RyKSB7XG4gICAgcmV0dXJuIFVOVVNVQUxfTElORV9URVJNSU5BVE9SUy50ZXN0KHN0cik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdWxsV2lkdGhDaGFyYWN0ZXIoY2hhckNvZGUpIHtcbiAgICAvLyBEbyBhIGNoZWFwIHRyaWNrIHRvIGJldHRlciBzdXBwb3J0IHdyYXBwaW5nIG9mIHdpZGUgY2hhcmFjdGVycywgdHJlYXQgdGhlbSBhcyAyIGNvbHVtbnNcbiAgICAvLyBodHRwOi8vanJncmFwaGl4Lm5ldC9yZXNlYXJjaC91bmljb2RlX2Jsb2Nrcy5waHBcbiAgICAvLyAgICAgICAgICAyRTgwIC0gMkVGRiAgIENKSyBSYWRpY2FscyBTdXBwbGVtZW50XG4gICAgLy8gICAgICAgICAgMkYwMCAtIDJGREYgICBLYW5neGkgUmFkaWNhbHNcbiAgICAvLyAgICAgICAgICAyRkYwIC0gMkZGRiAgIElkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnNcbiAgICAvLyAgICAgICAgICAzMDAwIC0gMzAzRiAgIENKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvblxuICAgIC8vICAgICAgICAgIDMwNDAgLSAzMDlGICAgSGlyYWdhbmFcbiAgICAvLyAgICAgICAgICAzMEEwIC0gMzBGRiAgIEthdGFrYW5hXG4gICAgLy8gICAgICAgICAgMzEwMCAtIDMxMkYgICBCb3BvbW9mb1xuICAgIC8vICAgICAgICAgIDMxMzAgLSAzMThGICAgSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtb1xuICAgIC8vICAgICAgICAgIDMxOTAgLSAzMTlGICAgS2FuYnVuXG4gICAgLy8gICAgICAgICAgMzFBMCAtIDMxQkYgICBCb3BvbW9mbyBFeHRlbmRlZFxuICAgIC8vICAgICAgICAgIDMxRjAgLSAzMUZGICAgS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9uc1xuICAgIC8vICAgICAgICAgIDMyMDAgLSAzMkZGICAgRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRoc1xuICAgIC8vICAgICAgICAgIDMzMDAgLSAzM0ZGICAgQ0pLIENvbXBhdGliaWxpdHlcbiAgICAvLyAgICAgICAgICAzNDAwIC0gNERCRiAgIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEFcbiAgICAvLyAgICAgICAgICA0REMwIC0gNERGRiAgIFlpamluZyBIZXhhZ3JhbSBTeW1ib2xzXG4gICAgLy8gICAgICAgICAgNEUwMCAtIDlGRkYgICBDSksgVW5pZmllZCBJZGVvZ3JhcGhzXG4gICAgLy8gICAgICAgICAgQTAwMCAtIEE0OEYgICBZaSBTeWxsYWJsZXNcbiAgICAvLyAgICAgICAgICBBNDkwIC0gQTRDRiAgIFlpIFJhZGljYWxzXG4gICAgLy8gICAgICAgICAgQUMwMCAtIEQ3QUYgICBIYW5ndWwgU3lsbGFibGVzXG4gICAgLy8gW0lHTk9SRV0gRDgwMCAtIERCN0YgICBIaWdoIFN1cnJvZ2F0ZXNcbiAgICAvLyBbSUdOT1JFXSBEQjgwIC0gREJGRiAgIEhpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlc1xuICAgIC8vIFtJR05PUkVdIERDMDAgLSBERkZGICAgTG93IFN1cnJvZ2F0ZXNcbiAgICAvLyBbSUdOT1JFXSBFMDAwIC0gRjhGRiAgIFByaXZhdGUgVXNlIEFyZWFcbiAgICAvLyAgICAgICAgICBGOTAwIC0gRkFGRiAgIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHNcbiAgICAvLyBbSUdOT1JFXSBGQjAwIC0gRkI0RiAgIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zXG4gICAgLy8gW0lHTk9SRV0gRkI1MCAtIEZERkYgICBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUFcbiAgICAvLyBbSUdOT1JFXSBGRTAwIC0gRkUwRiAgIFZhcmlhdGlvbiBTZWxlY3RvcnNcbiAgICAvLyBbSUdOT1JFXSBGRTIwIC0gRkUyRiAgIENvbWJpbmluZyBIYWxmIE1hcmtzXG4gICAgLy8gW0lHTk9SRV0gRkUzMCAtIEZFNEYgICBDSksgQ29tcGF0aWJpbGl0eSBGb3Jtc1xuICAgIC8vIFtJR05PUkVdIEZFNTAgLSBGRTZGICAgU21hbGwgRm9ybSBWYXJpYW50c1xuICAgIC8vIFtJR05PUkVdIEZFNzAgLSBGRUZGICAgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CXG4gICAgLy8gICAgICAgICAgRkYwMCAtIEZGRUYgICBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1xuICAgIC8vICAgICAgICAgICAgICAgW2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhbGZ3aWR0aF9hbmRfZnVsbHdpZHRoX2Zvcm1zXVxuICAgIC8vICAgICAgICAgICAgICAgb2Ygd2hpY2ggRkYwMSAtIEZGNUUgZnVsbHdpZHRoIEFTQ0lJIG9mIDIxIHRvIDdFXG4gICAgLy8gW0lHTk9SRV0gICAgYW5kIEZGNjUgLSBGRkRDIGhhbGZ3aWR0aCBvZiBLYXRha2FuYSBhbmQgSGFuZ3VsXG4gICAgLy8gW0lHTk9SRV0gRkZGMCAtIEZGRkYgICBTcGVjaWFsc1xuICAgIHJldHVybiAoKGNoYXJDb2RlID49IDB4MkU4MCAmJiBjaGFyQ29kZSA8PSAweEQ3QUYpXG4gICAgICAgIHx8IChjaGFyQ29kZSA+PSAweEY5MDAgJiYgY2hhckNvZGUgPD0gMHhGQUZGKVxuICAgICAgICB8fCAoY2hhckNvZGUgPj0gMHhGRjAxICYmIGNoYXJDb2RlIDw9IDB4RkY1RSkpO1xufVxuLyoqXG4gKiBBIGZhc3QgZnVuY3Rpb24gKHRoZXJlZm9yZSBpbXByZWNpc2UpIHRvIGNoZWNrIGlmIGNvZGUgcG9pbnRzIGFyZSBlbW9qaXMuXG4gKiBHZW5lcmF0ZWQgdXNpbmcgaHR0cHM6Ly9naXRodWIuY29tL2FsZXhkaW1hL3VuaWNvZGUtdXRpbHMvYmxvYi9tYWluL2Vtb2ppLXRlc3QuanNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1vamlJbXByZWNpc2UoeCkge1xuICAgIHJldHVybiAoKHggPj0gMHgxRjFFNiAmJiB4IDw9IDB4MUYxRkYpIHx8ICh4ID09PSA4OTg2KSB8fCAoeCA9PT0gODk4NykgfHwgKHggPT09IDkyMDApXG4gICAgICAgIHx8ICh4ID09PSA5MjAzKSB8fCAoeCA+PSA5NzI4ICYmIHggPD0gMTAxNzUpIHx8ICh4ID09PSAxMTA4OCkgfHwgKHggPT09IDExMDkzKVxuICAgICAgICB8fCAoeCA+PSAxMjc3NDQgJiYgeCA8PSAxMjg1OTEpIHx8ICh4ID49IDEyODY0MCAmJiB4IDw9IDEyODc2NClcbiAgICAgICAgfHwgKHggPj0gMTI4OTkyICYmIHggPD0gMTI5MDA4KSB8fCAoeCA+PSAxMjkyODAgJiYgeCA8PSAxMjk1MzUpXG4gICAgICAgIHx8ICh4ID49IDEyOTY0OCAmJiB4IDw9IDEyOTc4MikpO1xufVxuLy8gLS0gVVRGLTggQk9NXG5leHBvcnQgY29uc3QgVVRGOF9CT01fQ0hBUkFDVEVSID0gU3RyaW5nLmZyb21DaGFyQ29kZSg2NTI3OSAvKiBDaGFyQ29kZS5VVEY4X0JPTSAqLyk7XG5leHBvcnQgZnVuY3Rpb24gc3RhcnRzV2l0aFVURjhCT00oc3RyKSB7XG4gICAgcmV0dXJuICEhKHN0ciAmJiBzdHIubGVuZ3RoID4gMCAmJiBzdHIuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkgLyogQ2hhckNvZGUuVVRGOF9CT00gKi8pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zVXBwZXJjYXNlQ2hhcmFjdGVyKHRhcmdldCwgaWdub3JlRXNjYXBlZENoYXJzID0gZmFsc2UpIHtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpZ25vcmVFc2NhcGVkQ2hhcnMpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnJlcGxhY2UoL1xcXFwuL2csICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldC50b0xvd2VyQ2FzZSgpICE9PSB0YXJnZXQ7XG59XG4vKipcbiAqIFByb2R1Y2VzICdhJy0neicsIGZvbGxvd2VkIGJ5ICdBJy0nWicuLi4gZm9sbG93ZWQgYnkgJ2EnLSd6JywgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2luZ2xlTGV0dGVySGFzaChuKSB7XG4gICAgY29uc3QgTEVUVEVSU19DTlQgPSAoOTAgLyogQ2hhckNvZGUuWiAqLyAtIDY1IC8qIENoYXJDb2RlLkEgKi8gKyAxKTtcbiAgICBuID0gbiAlICgyICogTEVUVEVSU19DTlQpO1xuICAgIGlmIChuIDwgTEVUVEVSU19DTlQpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoOTcgLyogQ2hhckNvZGUuYSAqLyArIG4pO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg2NSAvKiBDaGFyQ29kZS5BICovICsgbiAtIExFVFRFUlNfQ05UKTtcbn1cbmZ1bmN0aW9uIGJyZWFrQmV0d2VlbkdyYXBoZW1lQnJlYWtUeXBlKGJyZWFrVHlwZUEsIGJyZWFrVHlwZUIpIHtcbiAgICAvLyBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIyOS8jR3JhcGhlbWVfQ2x1c3Rlcl9Cb3VuZGFyeV9SdWxlc1xuICAgIC8vICEhISBMZXQncyBtYWtlIHRoZSBjb21tb24gY2FzZSBhIGJpdCBmYXN0ZXJcbiAgICBpZiAoYnJlYWtUeXBlQSA9PT0gMCAvKiBHcmFwaGVtZUJyZWFrVHlwZS5PdGhlciAqLykge1xuICAgICAgICAvLyBzZWUgaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzEzLjAuMC91Y2QvYXV4aWxpYXJ5L0dyYXBoZW1lQnJlYWtUZXN0LTEzLjAuMGQxMC5odG1sI3RhYmxlXG4gICAgICAgIHJldHVybiAoYnJlYWtUeXBlQiAhPT0gNSAvKiBHcmFwaGVtZUJyZWFrVHlwZS5FeHRlbmQgKi8gJiYgYnJlYWtUeXBlQiAhPT0gNyAvKiBHcmFwaGVtZUJyZWFrVHlwZS5TcGFjaW5nTWFyayAqLyk7XG4gICAgfVxuICAgIC8vIERvIG5vdCBicmVhayBiZXR3ZWVuIGEgQ1IgYW5kIExGLiBPdGhlcndpc2UsIGJyZWFrIGJlZm9yZSBhbmQgYWZ0ZXIgY29udHJvbHMuXG4gICAgLy8gR0IzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSIMOXIExGXG4gICAgLy8gR0I0ICAgICAgICAgICAgICAgICAgICAgICAoQ29udHJvbCB8IENSIHwgTEYpIMO3XG4gICAgLy8gR0I1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMO3IChDb250cm9sIHwgQ1IgfCBMRilcbiAgICBpZiAoYnJlYWtUeXBlQSA9PT0gMiAvKiBHcmFwaGVtZUJyZWFrVHlwZS5DUiAqLykge1xuICAgICAgICBpZiAoYnJlYWtUeXBlQiA9PT0gMyAvKiBHcmFwaGVtZUJyZWFrVHlwZS5MRiAqLykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBHQjNcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYnJlYWtUeXBlQSA9PT0gNCAvKiBHcmFwaGVtZUJyZWFrVHlwZS5Db250cm9sICovIHx8IGJyZWFrVHlwZUEgPT09IDIgLyogR3JhcGhlbWVCcmVha1R5cGUuQ1IgKi8gfHwgYnJlYWtUeXBlQSA9PT0gMyAvKiBHcmFwaGVtZUJyZWFrVHlwZS5MRiAqLykge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gR0I0XG4gICAgfVxuICAgIGlmIChicmVha1R5cGVCID09PSA0IC8qIEdyYXBoZW1lQnJlYWtUeXBlLkNvbnRyb2wgKi8gfHwgYnJlYWtUeXBlQiA9PT0gMiAvKiBHcmFwaGVtZUJyZWFrVHlwZS5DUiAqLyB8fCBicmVha1R5cGVCID09PSAzIC8qIEdyYXBoZW1lQnJlYWtUeXBlLkxGICovKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBHQjVcbiAgICB9XG4gICAgLy8gRG8gbm90IGJyZWFrIEhhbmd1bCBzeWxsYWJsZSBzZXF1ZW5jZXMuXG4gICAgLy8gR0I2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIMOXIChMIHwgViB8IExWIHwgTFZUKVxuICAgIC8vIEdCNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFYgfCBWKSDDlyAoViB8IFQpXG4gICAgLy8gR0I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWVCB8IFQpIMOXIFRcbiAgICBpZiAoYnJlYWtUeXBlQSA9PT0gOCAvKiBHcmFwaGVtZUJyZWFrVHlwZS5MICovKSB7XG4gICAgICAgIGlmIChicmVha1R5cGVCID09PSA4IC8qIEdyYXBoZW1lQnJlYWtUeXBlLkwgKi8gfHwgYnJlYWtUeXBlQiA9PT0gOSAvKiBHcmFwaGVtZUJyZWFrVHlwZS5WICovIHx8IGJyZWFrVHlwZUIgPT09IDExIC8qIEdyYXBoZW1lQnJlYWtUeXBlLkxWICovIHx8IGJyZWFrVHlwZUIgPT09IDEyIC8qIEdyYXBoZW1lQnJlYWtUeXBlLkxWVCAqLykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBHQjZcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYnJlYWtUeXBlQSA9PT0gMTEgLyogR3JhcGhlbWVCcmVha1R5cGUuTFYgKi8gfHwgYnJlYWtUeXBlQSA9PT0gOSAvKiBHcmFwaGVtZUJyZWFrVHlwZS5WICovKSB7XG4gICAgICAgIGlmIChicmVha1R5cGVCID09PSA5IC8qIEdyYXBoZW1lQnJlYWtUeXBlLlYgKi8gfHwgYnJlYWtUeXBlQiA9PT0gMTAgLyogR3JhcGhlbWVCcmVha1R5cGUuVCAqLykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBHQjdcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYnJlYWtUeXBlQSA9PT0gMTIgLyogR3JhcGhlbWVCcmVha1R5cGUuTFZUICovIHx8IGJyZWFrVHlwZUEgPT09IDEwIC8qIEdyYXBoZW1lQnJlYWtUeXBlLlQgKi8pIHtcbiAgICAgICAgaWYgKGJyZWFrVHlwZUIgPT09IDEwIC8qIEdyYXBoZW1lQnJlYWtUeXBlLlQgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gR0I4XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRG8gbm90IGJyZWFrIGJlZm9yZSBleHRlbmRpbmcgY2hhcmFjdGVycyBvciBaV0ouXG4gICAgLy8gR0I5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMOXIChFeHRlbmQgfCBaV0opXG4gICAgaWYgKGJyZWFrVHlwZUIgPT09IDUgLyogR3JhcGhlbWVCcmVha1R5cGUuRXh0ZW5kICovIHx8IGJyZWFrVHlwZUIgPT09IDEzIC8qIEdyYXBoZW1lQnJlYWtUeXBlLlpXSiAqLykge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEdCOVxuICAgIH1cbiAgICAvLyBUaGUgR0I5YSBhbmQgR0I5YiBydWxlcyBvbmx5IGFwcGx5IHRvIGV4dGVuZGVkIGdyYXBoZW1lIGNsdXN0ZXJzOlxuICAgIC8vIERvIG5vdCBicmVhayBiZWZvcmUgU3BhY2luZ01hcmtzLCBvciBhZnRlciBQcmVwZW5kIGNoYXJhY3RlcnMuXG4gICAgLy8gR0I5YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMOXIFNwYWNpbmdNYXJrXG4gICAgLy8gR0I5YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwZW5kIMOXXG4gICAgaWYgKGJyZWFrVHlwZUIgPT09IDcgLyogR3JhcGhlbWVCcmVha1R5cGUuU3BhY2luZ01hcmsgKi8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBHQjlhXG4gICAgfVxuICAgIGlmIChicmVha1R5cGVBID09PSAxIC8qIEdyYXBoZW1lQnJlYWtUeXBlLlByZXBlbmQgKi8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBHQjliXG4gICAgfVxuICAgIC8vIERvIG5vdCBicmVhayB3aXRoaW4gZW1vamkgbW9kaWZpZXIgc2VxdWVuY2VzIG9yIGVtb2ppIHp3aiBzZXF1ZW5jZXMuXG4gICAgLy8gR0IxMSAgICBcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfSBFeHRlbmQqIFpXSiDDlyBcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfVxuICAgIGlmIChicmVha1R5cGVBID09PSAxMyAvKiBHcmFwaGVtZUJyZWFrVHlwZS5aV0ogKi8gJiYgYnJlYWtUeXBlQiA9PT0gMTQgLyogR3JhcGhlbWVCcmVha1R5cGUuRXh0ZW5kZWRfUGljdG9ncmFwaGljICovKSB7XG4gICAgICAgIC8vIE5vdGU6IHdlIGFyZSBub3QgaW1wbGVtZW50aW5nIHRoZSBydWxlIGVudGlyZWx5IGhlcmUgdG8gYXZvaWQgaW50cm9kdWNpbmcgc3RhdGVzXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gR0IxMVxuICAgIH1cbiAgICAvLyBHQjEyICAgICAgICAgICAgICAgICAgICAgICAgICBzb3QgKFJJIFJJKSogUkkgw5cgUklcbiAgICAvLyBHQjEzICAgICAgICAgICAgICAgICAgICAgICAgW15SSV0gKFJJIFJJKSogUkkgw5cgUklcbiAgICBpZiAoYnJlYWtUeXBlQSA9PT0gNiAvKiBHcmFwaGVtZUJyZWFrVHlwZS5SZWdpb25hbF9JbmRpY2F0b3IgKi8gJiYgYnJlYWtUeXBlQiA9PT0gNiAvKiBHcmFwaGVtZUJyZWFrVHlwZS5SZWdpb25hbF9JbmRpY2F0b3IgKi8pIHtcbiAgICAgICAgLy8gTm90ZTogd2UgYXJlIG5vdCBpbXBsZW1lbnRpbmcgdGhlIHJ1bGUgZW50aXJlbHkgaGVyZSB0byBhdm9pZCBpbnRyb2R1Y2luZyBzdGF0ZXNcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBHQjEyICYgR0IxM1xuICAgIH1cbiAgICAvLyBHQjk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnkgw7cgQW55XG4gICAgcmV0dXJuIHRydWU7XG59XG5jbGFzcyBHcmFwaGVtZUJyZWFrVHJlZSB7XG4gICAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUdyYXBoZW1lQnJlYWtUcmVlLl9JTlNUQU5DRSkge1xuICAgICAgICAgICAgR3JhcGhlbWVCcmVha1RyZWUuX0lOU1RBTkNFID0gbmV3IEdyYXBoZW1lQnJlYWtUcmVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEdyYXBoZW1lQnJlYWtUcmVlLl9JTlNUQU5DRTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBnZXRHcmFwaGVtZUJyZWFrUmF3RGF0YSgpO1xuICAgIH1cbiAgICBnZXRHcmFwaGVtZUJyZWFrVHlwZShjb2RlUG9pbnQpIHtcbiAgICAgICAgLy8gISEhIExldCdzIG1ha2UgN2JpdCBBU0NJSSBhIGJpdCBmYXN0ZXI6IDAuLjMxXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPCAzMikge1xuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PT0gMTAgLyogQ2hhckNvZGUuTGluZUZlZWQgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMyAvKiBHcmFwaGVtZUJyZWFrVHlwZS5MRiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPT09IDEzIC8qIENoYXJDb2RlLkNhcnJpYWdlUmV0dXJuICovKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDIgLyogR3JhcGhlbWVCcmVha1R5cGUuQ1IgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gNCAvKiBHcmFwaGVtZUJyZWFrVHlwZS5Db250cm9sICovO1xuICAgICAgICB9XG4gICAgICAgIC8vICEhISBMZXQncyBtYWtlIDdiaXQgQVNDSUkgYSBiaXQgZmFzdGVyOiAzMi4uMTI2XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPCAxMjcpIHtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIEdyYXBoZW1lQnJlYWtUeXBlLk90aGVyICovO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kYXRhO1xuICAgICAgICBjb25zdCBub2RlQ291bnQgPSBkYXRhLmxlbmd0aCAvIDM7XG4gICAgICAgIGxldCBub2RlSW5kZXggPSAxO1xuICAgICAgICB3aGlsZSAobm9kZUluZGV4IDw9IG5vZGVDb3VudCkge1xuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IGRhdGFbMyAqIG5vZGVJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAvLyBnbyBsZWZ0XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4ID0gMiAqIG5vZGVJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA+IGRhdGFbMyAqIG5vZGVJbmRleCArIDFdKSB7XG4gICAgICAgICAgICAgICAgLy8gZ28gcmlnaHRcbiAgICAgICAgICAgICAgICBub2RlSW5kZXggPSAyICogbm9kZUluZGV4ICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGhpdFxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzMgKiBub2RlSW5kZXggKyAyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMCAvKiBHcmFwaGVtZUJyZWFrVHlwZS5PdGhlciAqLztcbiAgICB9XG59XG5HcmFwaGVtZUJyZWFrVHJlZS5fSU5TVEFOQ0UgPSBudWxsO1xuZnVuY3Rpb24gZ2V0R3JhcGhlbWVCcmVha1Jhd0RhdGEoKSB7XG4gICAgLy8gZ2VuZXJhdGVkIHVzaW5nIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGV4ZGltYS91bmljb2RlLXV0aWxzL2Jsb2IvbWFpbi9ncmFwaGVtZS1icmVhay5qc1xuICAgIHJldHVybiBKU09OLnBhcnNlKCdbMCwwLDAsNTEyMjksNTEyNTUsMTIsNDQwNjEsNDQwODcsMTIsMTI3NDYyLDEyNzQ4Nyw2LDcwODMsNzA4NSw1LDQ3NjQ1LDQ3NjcxLDEyLDU0ODEzLDU0ODM5LDEyLDEyODY3OCwxMjg2NzgsMTQsMzI3MCwzMjcwLDUsOTkxOSw5OTIzLDE0LDQ1ODUzLDQ1ODc5LDEyLDQ5NDM3LDQ5NDYzLDEyLDUzMDIxLDUzMDQ3LDEyLDcxMjE2LDcxMjE4LDcsMTI4Mzk4LDEyODM5OSwxNCwxMjkzNjAsMTI5Mzc0LDE0LDI1MTksMjUxOSw1LDQ0NDgsNDUxOSw5LDk3NDIsOTc0MiwxNCwxMjMzNiwxMjMzNiwxNCw0NDk1Nyw0NDk4MywxMiw0Njc0OSw0Njc3NSwxMiw0ODU0MSw0ODU2NywxMiw1MDMzMyw1MDM1OSwxMiw1MjEyNSw1MjE1MSwxMiw1MzkxNyw1Mzk0MywxMiw2OTg4OCw2OTg5MCw1LDczMDE4LDczMDE4LDUsMTI3OTkwLDEyNzk5MCwxNCwxMjg1NTgsMTI4NTU5LDE0LDEyODc1OSwxMjg3NjAsMTQsMTI5NjUzLDEyOTY1NSwxNCwyMDI3LDIwMzUsNSwyODkxLDI4OTIsNywzNzYxLDM3NjEsNSw2NjgzLDY2ODMsNSw4MjkzLDgyOTMsNCw5ODI1LDk4MjYsMTQsOTk5OSw5OTk5LDE0LDQzNDUyLDQzNDUzLDUsNDQ1MDksNDQ1MzUsMTIsNDU0MDUsNDU0MzEsMTIsNDYzMDEsNDYzMjcsMTIsNDcxOTcsNDcyMjMsMTIsNDgwOTMsNDgxMTksMTIsNDg5ODksNDkwMTUsMTIsNDk4ODUsNDk5MTEsMTIsNTA3ODEsNTA4MDcsMTIsNTE2NzcsNTE3MDMsMTIsNTI1NzMsNTI1OTksMTIsNTM0NjksNTM0OTUsMTIsNTQzNjUsNTQzOTEsMTIsNjUyNzksNjUyNzksNCw3MDQ3MSw3MDQ3Miw3LDcyMTQ1LDcyMTQ3LDcsMTE5MTczLDExOTE3OSw1LDEyNzc5OSwxMjc4MTgsMTQsMTI4MjQwLDEyODI0NCwxNCwxMjg1MTIsMTI4NTEyLDE0LDEyODY1MiwxMjg2NTIsMTQsMTI4NzIxLDEyODcyMiwxNCwxMjkyOTIsMTI5MjkyLDE0LDEyOTQ0NSwxMjk0NTAsMTQsMTI5NzM0LDEyOTc0MywxNCwxNDc2LDE0NzcsNSwyMzY2LDIzNjgsNywyNzUwLDI3NTIsNywzMDc2LDMwNzYsNSwzNDE1LDM0MTUsNSw0MTQxLDQxNDQsNSw2MTA5LDYxMDksNSw2OTY0LDY5NjQsNSw3Mzk0LDc0MDAsNSw5MTk3LDkxOTgsMTQsOTc3MCw5NzcwLDE0LDk4NzcsOTg3NywxNCw5OTY4LDk5NjksMTQsMTAwODQsMTAwODQsMTQsNDMwNTIsNDMwNTIsNSw0MzcxMyw0MzcxMyw1LDQ0Mjg1LDQ0MzExLDEyLDQ0NzMzLDQ0NzU5LDEyLDQ1MTgxLDQ1MjA3LDEyLDQ1NjI5LDQ1NjU1LDEyLDQ2MDc3LDQ2MTAzLDEyLDQ2NTI1LDQ2NTUxLDEyLDQ2OTczLDQ2OTk5LDEyLDQ3NDIxLDQ3NDQ3LDEyLDQ3ODY5LDQ3ODk1LDEyLDQ4MzE3LDQ4MzQzLDEyLDQ4NzY1LDQ4NzkxLDEyLDQ5MjEzLDQ5MjM5LDEyLDQ5NjYxLDQ5Njg3LDEyLDUwMTA5LDUwMTM1LDEyLDUwNTU3LDUwNTgzLDEyLDUxMDA1LDUxMDMxLDEyLDUxNDUzLDUxNDc5LDEyLDUxOTAxLDUxOTI3LDEyLDUyMzQ5LDUyMzc1LDEyLDUyNzk3LDUyODIzLDEyLDUzMjQ1LDUzMjcxLDEyLDUzNjkzLDUzNzE5LDEyLDU0MTQxLDU0MTY3LDEyLDU0NTg5LDU0NjE1LDEyLDU1MDM3LDU1MDYzLDEyLDY5NTA2LDY5NTA5LDUsNzAxOTEsNzAxOTMsNSw3MDg0MSw3MDg0MSw3LDcxNDYzLDcxNDY3LDUsNzIzMzAsNzIzNDIsNSw5NDAzMSw5NDAzMSw1LDEyMzYyOCwxMjM2MzEsNSwxMjc3NjMsMTI3NzY1LDE0LDEyNzk0MSwxMjc5NDEsMTQsMTI4MDQzLDEyODA2MiwxNCwxMjgzMDIsMTI4MzE3LDE0LDEyODQ2NSwxMjg0NjcsMTQsMTI4NTM5LDEyODUzOSwxNCwxMjg2NDAsMTI4NjQwLDE0LDEyODY2MiwxMjg2NjIsMTQsMTI4NzAzLDEyODcwMywxNCwxMjg3NDUsMTI4NzQ1LDE0LDEyOTAwNCwxMjkwMDcsMTQsMTI5MzI5LDEyOTMzMCwxNCwxMjk0MDIsMTI5NDAyLDE0LDEyOTQ4MywxMjk0ODMsMTQsMTI5Njg2LDEyOTcwNCwxNCwxMzAwNDgsMTMxMDY5LDE0LDE3MywxNzMsNCwxNzU3LDE3NTcsMSwyMjAwLDIyMDcsNSwyNDM0LDI0MzUsNywyNjMxLDI2MzIsNSwyODE3LDI4MTcsNSwzMDA4LDMwMDgsNSwzMjAxLDMyMDEsNSwzMzg3LDMzODgsNSwzNTQyLDM1NDIsNSwzOTAyLDM5MDMsNyw0MTkwLDQxOTIsNSw2MDAyLDYwMDMsNSw2NDM5LDY0NDAsNSw2NzY1LDY3NzAsNyw3MDE5LDcwMjcsNSw3MTU0LDcxNTUsNyw4MjA1LDgyMDUsMTMsODUwNSw4NTA1LDE0LDk2NTQsOTY1NCwxNCw5NzU3LDk3NTcsMTQsOTc5Miw5NzkyLDE0LDk4NTIsOTg1MywxNCw5ODkwLDk4OTQsMTQsOTkzNyw5OTM3LDE0LDk5ODEsOTk4MSwxNCwxMDAzNSwxMDAzNiwxNCwxMTAzNSwxMTAzNiwxNCw0MjY1NCw0MjY1NSw1LDQzMzQ2LDQzMzQ3LDcsNDM1ODcsNDM1ODcsNSw0NDAwNiw0NDAwNyw3LDQ0MTczLDQ0MTk5LDEyLDQ0Mzk3LDQ0NDIzLDEyLDQ0NjIxLDQ0NjQ3LDEyLDQ0ODQ1LDQ0ODcxLDEyLDQ1MDY5LDQ1MDk1LDEyLDQ1MjkzLDQ1MzE5LDEyLDQ1NTE3LDQ1NTQzLDEyLDQ1NzQxLDQ1NzY3LDEyLDQ1OTY1LDQ1OTkxLDEyLDQ2MTg5LDQ2MjE1LDEyLDQ2NDEzLDQ2NDM5LDEyLDQ2NjM3LDQ2NjYzLDEyLDQ2ODYxLDQ2ODg3LDEyLDQ3MDg1LDQ3MTExLDEyLDQ3MzA5LDQ3MzM1LDEyLDQ3NTMzLDQ3NTU5LDEyLDQ3NzU3LDQ3NzgzLDEyLDQ3OTgxLDQ4MDA3LDEyLDQ4MjA1LDQ4MjMxLDEyLDQ4NDI5LDQ4NDU1LDEyLDQ4NjUzLDQ4Njc5LDEyLDQ4ODc3LDQ4OTAzLDEyLDQ5MTAxLDQ5MTI3LDEyLDQ5MzI1LDQ5MzUxLDEyLDQ5NTQ5LDQ5NTc1LDEyLDQ5NzczLDQ5Nzk5LDEyLDQ5OTk3LDUwMDIzLDEyLDUwMjIxLDUwMjQ3LDEyLDUwNDQ1LDUwNDcxLDEyLDUwNjY5LDUwNjk1LDEyLDUwODkzLDUwOTE5LDEyLDUxMTE3LDUxMTQzLDEyLDUxMzQxLDUxMzY3LDEyLDUxNTY1LDUxNTkxLDEyLDUxNzg5LDUxODE1LDEyLDUyMDEzLDUyMDM5LDEyLDUyMjM3LDUyMjYzLDEyLDUyNDYxLDUyNDg3LDEyLDUyNjg1LDUyNzExLDEyLDUyOTA5LDUyOTM1LDEyLDUzMTMzLDUzMTU5LDEyLDUzMzU3LDUzMzgzLDEyLDUzNTgxLDUzNjA3LDEyLDUzODA1LDUzODMxLDEyLDU0MDI5LDU0MDU1LDEyLDU0MjUzLDU0Mjc5LDEyLDU0NDc3LDU0NTAzLDEyLDU0NzAxLDU0NzI3LDEyLDU0OTI1LDU0OTUxLDEyLDU1MTQ5LDU1MTc1LDEyLDY4MTAxLDY4MTAyLDUsNjk3NjIsNjk3NjIsNyw3MDA2Nyw3MDA2OSw3LDcwMzcxLDcwMzc4LDUsNzA3MjAsNzA3MjEsNyw3MTA4Nyw3MTA4Nyw1LDcxMzQxLDcxMzQxLDUsNzE5OTUsNzE5OTYsNSw3MjI0OSw3MjI0OSw3LDcyODUwLDcyODcxLDUsNzMxMDksNzMxMDksNSwxMTg1NzYsMTE4NTk4LDUsMTIxNTA1LDEyMTUxOSw1LDEyNzI0NSwxMjcyNDcsMTQsMTI3NTY4LDEyNzU2OSwxNCwxMjc3NzcsMTI3Nzc3LDE0LDEyNzg3MiwxMjc4OTEsMTQsMTI3OTU2LDEyNzk2NywxNCwxMjgwMTUsMTI4MDE2LDE0LDEyODExMCwxMjgxNzIsMTQsMTI4MjU5LDEyODI1OSwxNCwxMjgzNjcsMTI4MzY4LDE0LDEyODQyNCwxMjg0MjQsMTQsMTI4NDg4LDEyODQ4OCwxNCwxMjg1MzAsMTI4NTMyLDE0LDEyODU1MCwxMjg1NTEsMTQsMTI4NTY2LDEyODU2NiwxNCwxMjg2NDcsMTI4NjQ3LDE0LDEyODY1NiwxMjg2NTYsMTQsMTI4NjY3LDEyODY3MywxNCwxMjg2OTEsMTI4NjkzLDE0LDEyODcxNSwxMjg3MTUsMTQsMTI4NzI4LDEyODczMiwxNCwxMjg3NTIsMTI4NzUyLDE0LDEyODc2NSwxMjg3NjcsMTQsMTI5MDk2LDEyOTEwMywxNCwxMjkzMTEsMTI5MzExLDE0LDEyOTM0NCwxMjkzNDksMTQsMTI5Mzk0LDEyOTM5NCwxNCwxMjk0MTMsMTI5NDI1LDE0LDEyOTQ2NiwxMjk0NzEsMTQsMTI5NTExLDEyOTUzNSwxNCwxMjk2NjQsMTI5NjY2LDE0LDEyOTcxOSwxMjk3MjIsMTQsMTI5NzYwLDEyOTc2NywxNCw5MTc1MzYsOTE3NjMxLDUsMTMsMTMsMiwxMTYwLDExNjEsNSwxNTY0LDE1NjQsNCwxODA3LDE4MDcsMSwyMDg1LDIwODcsNSwyMzA3LDIzMDcsNywyMzgyLDIzODMsNywyNDk3LDI1MDAsNSwyNTYzLDI1NjMsNywyNjc3LDI2NzcsNSwyNzYzLDI3NjQsNywyODc5LDI4NzksNSwyOTE0LDI5MTUsNSwzMDIxLDMwMjEsNSwzMTQyLDMxNDQsNSwzMjYzLDMyNjMsNSwzMjg1LDMyODYsNSwzMzk4LDM0MDAsNywzNTMwLDM1MzAsNSwzNjMzLDM2MzMsNSwzODY0LDM4NjUsNSwzOTc0LDM5NzUsNSw0MTU1LDQxNTYsNyw0MjI5LDQyMzAsNSw1OTA5LDU5MDksNyw2MDc4LDYwODUsNyw2Mjc3LDYyNzgsNSw2NDUxLDY0NTYsNyw2NzQ0LDY3NTAsNSw2ODQ2LDY4NDYsNSw2OTcyLDY5NzIsNSw3MDc0LDcwNzcsNSw3MTQ2LDcxNDgsNyw3MjIyLDcyMjMsNSw3NDE2LDc0MTcsNSw4MjM0LDgyMzgsNCw4NDE3LDg0MTcsNSw5MDAwLDkwMDAsMTQsOTIwMyw5MjAzLDE0LDk3MzAsOTczMSwxNCw5NzQ4LDk3NDksMTQsOTc2Miw5NzYzLDE0LDk3NzYsOTc4MywxNCw5ODAwLDk4MTEsMTQsOTgzMSw5ODMxLDE0LDk4NzIsOTg3MywxNCw5ODgyLDk4ODIsMTQsOTkwMCw5OTAzLDE0LDk5MjksOTkzMywxNCw5OTQxLDk5NjAsMTQsOTk3NCw5OTc0LDE0LDk5ODksOTk4OSwxNCwxMDAwNiwxMDAwNiwxNCwxMDA2MiwxMDA2MiwxNCwxMDE2MCwxMDE2MCwxNCwxMTY0NywxMTY0Nyw1LDEyOTUzLDEyOTUzLDE0LDQzMDE5LDQzMDE5LDUsNDMyMzIsNDMyNDksNSw0MzQ0Myw0MzQ0Myw1LDQzNTY3LDQzNTY4LDcsNDM2OTYsNDM2OTYsNSw0Mzc2NSw0Mzc2NSw3LDQ0MDEzLDQ0MDEzLDUsNDQxMTcsNDQxNDMsMTIsNDQyMjksNDQyNTUsMTIsNDQzNDEsNDQzNjcsMTIsNDQ0NTMsNDQ0NzksMTIsNDQ1NjUsNDQ1OTEsMTIsNDQ2NzcsNDQ3MDMsMTIsNDQ3ODksNDQ4MTUsMTIsNDQ5MDEsNDQ5MjcsMTIsNDUwMTMsNDUwMzksMTIsNDUxMjUsNDUxNTEsMTIsNDUyMzcsNDUyNjMsMTIsNDUzNDksNDUzNzUsMTIsNDU0NjEsNDU0ODcsMTIsNDU1NzMsNDU1OTksMTIsNDU2ODUsNDU3MTEsMTIsNDU3OTcsNDU4MjMsMTIsNDU5MDksNDU5MzUsMTIsNDYwMjEsNDYwNDcsMTIsNDYxMzMsNDYxNTksMTIsNDYyNDUsNDYyNzEsMTIsNDYzNTcsNDYzODMsMTIsNDY0NjksNDY0OTUsMTIsNDY1ODEsNDY2MDcsMTIsNDY2OTMsNDY3MTksMTIsNDY4MDUsNDY4MzEsMTIsNDY5MTcsNDY5NDMsMTIsNDcwMjksNDcwNTUsMTIsNDcxNDEsNDcxNjcsMTIsNDcyNTMsNDcyNzksMTIsNDczNjUsNDczOTEsMTIsNDc0NzcsNDc1MDMsMTIsNDc1ODksNDc2MTUsMTIsNDc3MDEsNDc3MjcsMTIsNDc4MTMsNDc4MzksMTIsNDc5MjUsNDc5NTEsMTIsNDgwMzcsNDgwNjMsMTIsNDgxNDksNDgxNzUsMTIsNDgyNjEsNDgyODcsMTIsNDgzNzMsNDgzOTksMTIsNDg0ODUsNDg1MTEsMTIsNDg1OTcsNDg2MjMsMTIsNDg3MDksNDg3MzUsMTIsNDg4MjEsNDg4NDcsMTIsNDg5MzMsNDg5NTksMTIsNDkwNDUsNDkwNzEsMTIsNDkxNTcsNDkxODMsMTIsNDkyNjksNDkyOTUsMTIsNDkzODEsNDk0MDcsMTIsNDk0OTMsNDk1MTksMTIsNDk2MDUsNDk2MzEsMTIsNDk3MTcsNDk3NDMsMTIsNDk4MjksNDk4NTUsMTIsNDk5NDEsNDk5NjcsMTIsNTAwNTMsNTAwNzksMTIsNTAxNjUsNTAxOTEsMTIsNTAyNzcsNTAzMDMsMTIsNTAzODksNTA0MTUsMTIsNTA1MDEsNTA1MjcsMTIsNTA2MTMsNTA2MzksMTIsNTA3MjUsNTA3NTEsMTIsNTA4MzcsNTA4NjMsMTIsNTA5NDksNTA5NzUsMTIsNTEwNjEsNTEwODcsMTIsNTExNzMsNTExOTksMTIsNTEyODUsNTEzMTEsMTIsNTEzOTcsNTE0MjMsMTIsNTE1MDksNTE1MzUsMTIsNTE2MjEsNTE2NDcsMTIsNTE3MzMsNTE3NTksMTIsNTE4NDUsNTE4NzEsMTIsNTE5NTcsNTE5ODMsMTIsNTIwNjksNTIwOTUsMTIsNTIxODEsNTIyMDcsMTIsNTIyOTMsNTIzMTksMTIsNTI0MDUsNTI0MzEsMTIsNTI1MTcsNTI1NDMsMTIsNTI2MjksNTI2NTUsMTIsNTI3NDEsNTI3NjcsMTIsNTI4NTMsNTI4NzksMTIsNTI5NjUsNTI5OTEsMTIsNTMwNzcsNTMxMDMsMTIsNTMxODksNTMyMTUsMTIsNTMzMDEsNTMzMjcsMTIsNTM0MTMsNTM0MzksMTIsNTM1MjUsNTM1NTEsMTIsNTM2MzcsNTM2NjMsMTIsNTM3NDksNTM3NzUsMTIsNTM4NjEsNTM4ODcsMTIsNTM5NzMsNTM5OTksMTIsNTQwODUsNTQxMTEsMTIsNTQxOTcsNTQyMjMsMTIsNTQzMDksNTQzMzUsMTIsNTQ0MjEsNTQ0NDcsMTIsNTQ1MzMsNTQ1NTksMTIsNTQ2NDUsNTQ2NzEsMTIsNTQ3NTcsNTQ3ODMsMTIsNTQ4NjksNTQ4OTUsMTIsNTQ5ODEsNTUwMDcsMTIsNTUwOTMsNTUxMTksMTIsNTUyNDMsNTUyOTEsMTAsNjYwNDUsNjYwNDUsNSw2ODMyNSw2ODMyNiw1LDY5Njg4LDY5NzAyLDUsNjk4MTcsNjk4MTgsNSw2OTk1Nyw2OTk1OCw3LDcwMDg5LDcwMDkyLDUsNzAxOTgsNzAxOTksNSw3MDQ2Miw3MDQ2Miw1LDcwNTAyLDcwNTA4LDUsNzA3NTAsNzA3NTAsNSw3MDg0Niw3MDg0Niw3LDcxMTAwLDcxMTAxLDUsNzEyMzAsNzEyMzAsNyw3MTM1MSw3MTM1MSw1LDcxNzM3LDcxNzM4LDUsNzIwMDAsNzIwMDAsNyw3MjE2MCw3MjE2MCw1LDcyMjczLDcyMjc4LDUsNzI3NTIsNzI3NTgsNSw3Mjg4Miw3Mjg4Myw1LDczMDMxLDczMDMxLDUsNzM0NjEsNzM0NjIsNyw5NDE5Miw5NDE5Myw3LDExOTE0OSwxMTkxNDksNywxMjE0MDMsMTIxNDUyLDUsMTIyOTE1LDEyMjkxNiw1LDEyNjk4MCwxMjY5ODAsMTQsMTI3MzU4LDEyNzM1OSwxNCwxMjc1MzUsMTI3NTM1LDE0LDEyNzc1OSwxMjc3NTksMTQsMTI3NzcxLDEyNzc3MSwxNCwxMjc3OTIsMTI3NzkzLDE0LDEyNzgyNSwxMjc4NjcsMTQsMTI3ODk3LDEyNzg5OSwxNCwxMjc5NDUsMTI3OTQ1LDE0LDEyNzk4NSwxMjc5ODYsMTQsMTI4MDAwLDEyODAwNywxNCwxMjgwMjEsMTI4MDIxLDE0LDEyODA2NiwxMjgxMDAsMTQsMTI4MTg0LDEyODIzNSwxNCwxMjgyNDksMTI4MjUyLDE0LDEyODI2NiwxMjgyNzYsMTQsMTI4MzM1LDEyODMzNSwxNCwxMjgzNzksMTI4MzkwLDE0LDEyODQwNywxMjg0MTksMTQsMTI4NDQ0LDEyODQ0NCwxNCwxMjg0ODEsMTI4NDgxLDE0LDEyODQ5OSwxMjg0OTksMTQsMTI4NTI2LDEyODUyNiwxNCwxMjg1MzYsMTI4NTM2LDE0LDEyODU0MywxMjg1NDMsMTQsMTI4NTU2LDEyODU1NiwxNCwxMjg1NjQsMTI4NTY0LDE0LDEyODU3NywxMjg1ODAsMTQsMTI4NjQzLDEyODY0NSwxNCwxMjg2NDksMTI4NjQ5LDE0LDEyODY1NCwxMjg2NTQsMTQsMTI4NjYwLDEyODY2MCwxNCwxMjg2NjQsMTI4NjY0LDE0LDEyODY3NSwxMjg2NzUsMTQsMTI4Njg2LDEyODY4OSwxNCwxMjg2OTUsMTI4Njk2LDE0LDEyODcwNSwxMjg3MDksMTQsMTI4NzE3LDEyODcxOSwxNCwxMjg3MjUsMTI4NzI1LDE0LDEyODczNiwxMjg3NDEsMTQsMTI4NzQ3LDEyODc0OCwxNCwxMjg3NTUsMTI4NzU1LDE0LDEyODc2MiwxMjg3NjIsMTQsMTI4OTgxLDEyODk5MSwxNCwxMjkwMDksMTI5MDIzLDE0LDEyOTE2MCwxMjkxNjcsMTQsMTI5Mjk2LDEyOTMwNCwxNCwxMjkzMjAsMTI5MzI3LDE0LDEyOTM0MCwxMjkzNDIsMTQsMTI5MzU2LDEyOTM1NiwxNCwxMjkzODgsMTI5MzkyLDE0LDEyOTM5OSwxMjk0MDAsMTQsMTI5NDA0LDEyOTQwNywxNCwxMjk0MzIsMTI5NDQyLDE0LDEyOTQ1NCwxMjk0NTUsMTQsMTI5NDczLDEyOTQ3NCwxNCwxMjk0ODUsMTI5NDg3LDE0LDEyOTY0OCwxMjk2NTEsMTQsMTI5NjU5LDEyOTY2MCwxNCwxMjk2NzEsMTI5Njc5LDE0LDEyOTcwOSwxMjk3MTEsMTQsMTI5NzI4LDEyOTczMCwxNCwxMjk3NTEsMTI5NzUzLDE0LDEyOTc3NiwxMjk3ODIsMTQsOTE3NTA1LDkxNzUwNSw0LDkxNzc2MCw5MTc5OTksNSwxMCwxMCwzLDEyNywxNTksNCw3NjgsODc5LDUsMTQ3MSwxNDcxLDUsMTUzNiwxNTQxLDEsMTY0OCwxNjQ4LDUsMTc2NywxNzY4LDUsMTg0MCwxODY2LDUsMjA3MCwyMDczLDUsMjEzNywyMTM5LDUsMjI3NCwyMjc0LDEsMjM2MywyMzYzLDcsMjM3NywyMzgwLDcsMjQwMiwyNDAzLDUsMjQ5NCwyNDk0LDUsMjUwNywyNTA4LDcsMjU1OCwyNTU4LDUsMjYyMiwyNjI0LDcsMjY0MSwyNjQxLDUsMjY5MSwyNjkxLDcsMjc1OSwyNzYwLDUsMjc4NiwyNzg3LDUsMjg3NiwyODc2LDUsMjg4MSwyODg0LDUsMjkwMSwyOTAyLDUsMzAwNiwzMDA2LDUsMzAxNCwzMDE2LDcsMzA3MiwzMDcyLDUsMzEzNCwzMTM2LDUsMzE1NywzMTU4LDUsMzI2MCwzMjYwLDUsMzI2NiwzMjY2LDUsMzI3NCwzMjc1LDcsMzMyOCwzMzI5LDUsMzM5MSwzMzkyLDcsMzQwNSwzNDA1LDUsMzQ1NywzNDU3LDUsMzUzNiwzNTM3LDcsMzU1MSwzNTUxLDUsMzYzNiwzNjQyLDUsMzc2NCwzNzcyLDUsMzg5NSwzODk1LDUsMzk2NywzOTY3LDcsMzk5Myw0MDI4LDUsNDE0Niw0MTUxLDUsNDE4Miw0MTgzLDcsNDIyNiw0MjI2LDUsNDI1Myw0MjUzLDUsNDk1Nyw0OTU5LDUsNTk0MCw1OTQwLDcsNjA3MCw2MDcwLDcsNjA4Nyw2MDg4LDcsNjE1OCw2MTU4LDQsNjQzMiw2NDM0LDUsNjQ0OCw2NDQ5LDcsNjY3OSw2NjgwLDUsNjc0Miw2NzQyLDUsNjc1NCw2NzU0LDUsNjc4Myw2NzgzLDUsNjkxMiw2OTE1LDUsNjk2Niw2OTcwLDUsNjk3OCw2OTc4LDUsNzA0Miw3MDQyLDcsNzA4MCw3MDgxLDUsNzE0Myw3MTQzLDcsNzE1MCw3MTUwLDcsNzIxMiw3MjE5LDUsNzM4MCw3MzkyLDUsNzQxMiw3NDEyLDUsODIwMyw4MjAzLDQsODIzMiw4MjMyLDQsODI2NSw4MjY1LDE0LDg0MDAsODQxMiw1LDg0MjEsODQzMiw1LDg2MTcsODYxOCwxNCw5MTY3LDkxNjcsMTQsOTIwMCw5MjAwLDE0LDk0MTAsOTQxMCwxNCw5NzIzLDk3MjYsMTQsOTczMyw5NzMzLDE0LDk3NDUsOTc0NSwxNCw5NzUyLDk3NTIsMTQsOTc2MCw5NzYwLDE0LDk3NjYsOTc2NiwxNCw5Nzc0LDk3NzQsMTQsOTc4Niw5Nzg2LDE0LDk3OTQsOTc5NCwxNCw5ODIzLDk4MjMsMTQsOTgyOCw5ODI4LDE0LDk4MzMsOTg1MCwxNCw5ODU1LDk4NTUsMTQsOTg3NSw5ODc1LDE0LDk4ODAsOTg4MCwxNCw5ODg1LDk4ODcsMTQsOTg5Niw5ODk3LDE0LDk5MDYsOTkxNiwxNCw5OTI2LDk5MjcsMTQsOTkzNSw5OTM1LDE0LDk5MzksOTkzOSwxNCw5OTYyLDk5NjIsMTQsOTk3Miw5OTcyLDE0LDk5NzgsOTk3OCwxNCw5OTg2LDk5ODYsMTQsOTk5Nyw5OTk3LDE0LDEwMDAyLDEwMDAyLDE0LDEwMDE3LDEwMDE3LDE0LDEwMDU1LDEwMDU1LDE0LDEwMDcxLDEwMDcxLDE0LDEwMTMzLDEwMTM1LDE0LDEwNTQ4LDEwNTQ5LDE0LDExMDkzLDExMDkzLDE0LDEyMzMwLDEyMzMzLDUsMTI0NDEsMTI0NDIsNSw0MjYwOCw0MjYxMCw1LDQzMDEwLDQzMDEwLDUsNDMwNDUsNDMwNDYsNSw0MzE4OCw0MzIwMyw3LDQzMzAyLDQzMzA5LDUsNDMzOTIsNDMzOTQsNSw0MzQ0Niw0MzQ0OSw1LDQzNDkzLDQzNDkzLDUsNDM1NzEsNDM1NzIsNyw0MzU5Nyw0MzU5Nyw3LDQzNzAzLDQzNzA0LDUsNDM3NTYsNDM3NTcsNSw0NDAwMyw0NDAwNCw3LDQ0MDA5LDQ0MDEwLDcsNDQwMzMsNDQwNTksMTIsNDQwODksNDQxMTUsMTIsNDQxNDUsNDQxNzEsMTIsNDQyMDEsNDQyMjcsMTIsNDQyNTcsNDQyODMsMTIsNDQzMTMsNDQzMzksMTIsNDQzNjksNDQzOTUsMTIsNDQ0MjUsNDQ0NTEsMTIsNDQ0ODEsNDQ1MDcsMTIsNDQ1MzcsNDQ1NjMsMTIsNDQ1OTMsNDQ2MTksMTIsNDQ2NDksNDQ2NzUsMTIsNDQ3MDUsNDQ3MzEsMTIsNDQ3NjEsNDQ3ODcsMTIsNDQ4MTcsNDQ4NDMsMTIsNDQ4NzMsNDQ4OTksMTIsNDQ5MjksNDQ5NTUsMTIsNDQ5ODUsNDUwMTEsMTIsNDUwNDEsNDUwNjcsMTIsNDUwOTcsNDUxMjMsMTIsNDUxNTMsNDUxNzksMTIsNDUyMDksNDUyMzUsMTIsNDUyNjUsNDUyOTEsMTIsNDUzMjEsNDUzNDcsMTIsNDUzNzcsNDU0MDMsMTIsNDU0MzMsNDU0NTksMTIsNDU0ODksNDU1MTUsMTIsNDU1NDUsNDU1NzEsMTIsNDU2MDEsNDU2MjcsMTIsNDU2NTcsNDU2ODMsMTIsNDU3MTMsNDU3MzksMTIsNDU3NjksNDU3OTUsMTIsNDU4MjUsNDU4NTEsMTIsNDU4ODEsNDU5MDcsMTIsNDU5MzcsNDU5NjMsMTIsNDU5OTMsNDYwMTksMTIsNDYwNDksNDYwNzUsMTIsNDYxMDUsNDYxMzEsMTIsNDYxNjEsNDYxODcsMTIsNDYyMTcsNDYyNDMsMTIsNDYyNzMsNDYyOTksMTIsNDYzMjksNDYzNTUsMTIsNDYzODUsNDY0MTEsMTIsNDY0NDEsNDY0NjcsMTIsNDY0OTcsNDY1MjMsMTIsNDY1NTMsNDY1NzksMTIsNDY2MDksNDY2MzUsMTIsNDY2NjUsNDY2OTEsMTIsNDY3MjEsNDY3NDcsMTIsNDY3NzcsNDY4MDMsMTIsNDY4MzMsNDY4NTksMTIsNDY4ODksNDY5MTUsMTIsNDY5NDUsNDY5NzEsMTIsNDcwMDEsNDcwMjcsMTIsNDcwNTcsNDcwODMsMTIsNDcxMTMsNDcxMzksMTIsNDcxNjksNDcxOTUsMTIsNDcyMjUsNDcyNTEsMTIsNDcyODEsNDczMDcsMTIsNDczMzcsNDczNjMsMTIsNDczOTMsNDc0MTksMTIsNDc0NDksNDc0NzUsMTIsNDc1MDUsNDc1MzEsMTIsNDc1NjEsNDc1ODcsMTIsNDc2MTcsNDc2NDMsMTIsNDc2NzMsNDc2OTksMTIsNDc3MjksNDc3NTUsMTIsNDc3ODUsNDc4MTEsMTIsNDc4NDEsNDc4NjcsMTIsNDc4OTcsNDc5MjMsMTIsNDc5NTMsNDc5NzksMTIsNDgwMDksNDgwMzUsMTIsNDgwNjUsNDgwOTEsMTIsNDgxMjEsNDgxNDcsMTIsNDgxNzcsNDgyMDMsMTIsNDgyMzMsNDgyNTksMTIsNDgyODksNDgzMTUsMTIsNDgzNDUsNDgzNzEsMTIsNDg0MDEsNDg0MjcsMTIsNDg0NTcsNDg0ODMsMTIsNDg1MTMsNDg1MzksMTIsNDg1NjksNDg1OTUsMTIsNDg2MjUsNDg2NTEsMTIsNDg2ODEsNDg3MDcsMTIsNDg3MzcsNDg3NjMsMTIsNDg3OTMsNDg4MTksMTIsNDg4NDksNDg4NzUsMTIsNDg5MDUsNDg5MzEsMTIsNDg5NjEsNDg5ODcsMTIsNDkwMTcsNDkwNDMsMTIsNDkwNzMsNDkwOTksMTIsNDkxMjksNDkxNTUsMTIsNDkxODUsNDkyMTEsMTIsNDkyNDEsNDkyNjcsMTIsNDkyOTcsNDkzMjMsMTIsNDkzNTMsNDkzNzksMTIsNDk0MDksNDk0MzUsMTIsNDk0NjUsNDk0OTEsMTIsNDk1MjEsNDk1NDcsMTIsNDk1NzcsNDk2MDMsMTIsNDk2MzMsNDk2NTksMTIsNDk2ODksNDk3MTUsMTIsNDk3NDUsNDk3NzEsMTIsNDk4MDEsNDk4MjcsMTIsNDk4NTcsNDk4ODMsMTIsNDk5MTMsNDk5MzksMTIsNDk5NjksNDk5OTUsMTIsNTAwMjUsNTAwNTEsMTIsNTAwODEsNTAxMDcsMTIsNTAxMzcsNTAxNjMsMTIsNTAxOTMsNTAyMTksMTIsNTAyNDksNTAyNzUsMTIsNTAzMDUsNTAzMzEsMTIsNTAzNjEsNTAzODcsMTIsNTA0MTcsNTA0NDMsMTIsNTA0NzMsNTA0OTksMTIsNTA1MjksNTA1NTUsMTIsNTA1ODUsNTA2MTEsMTIsNTA2NDEsNTA2NjcsMTIsNTA2OTcsNTA3MjMsMTIsNTA3NTMsNTA3NzksMTIsNTA4MDksNTA4MzUsMTIsNTA4NjUsNTA4OTEsMTIsNTA5MjEsNTA5NDcsMTIsNTA5NzcsNTEwMDMsMTIsNTEwMzMsNTEwNTksMTIsNTEwODksNTExMTUsMTIsNTExNDUsNTExNzEsMTIsNTEyMDEsNTEyMjcsMTIsNTEyNTcsNTEyODMsMTIsNTEzMTMsNTEzMzksMTIsNTEzNjksNTEzOTUsMTIsNTE0MjUsNTE0NTEsMTIsNTE0ODEsNTE1MDcsMTIsNTE1MzcsNTE1NjMsMTIsNTE1OTMsNTE2MTksMTIsNTE2NDksNTE2NzUsMTIsNTE3MDUsNTE3MzEsMTIsNTE3NjEsNTE3ODcsMTIsNTE4MTcsNTE4NDMsMTIsNTE4NzMsNTE4OTksMTIsNTE5MjksNTE5NTUsMTIsNTE5ODUsNTIwMTEsMTIsNTIwNDEsNTIwNjcsMTIsNTIwOTcsNTIxMjMsMTIsNTIxNTMsNTIxNzksMTIsNTIyMDksNTIyMzUsMTIsNTIyNjUsNTIyOTEsMTIsNTIzMjEsNTIzNDcsMTIsNTIzNzcsNTI0MDMsMTIsNTI0MzMsNTI0NTksMTIsNTI0ODksNTI1MTUsMTIsNTI1NDUsNTI1NzEsMTIsNTI2MDEsNTI2MjcsMTIsNTI2NTcsNTI2ODMsMTIsNTI3MTMsNTI3MzksMTIsNTI3NjksNTI3OTUsMTIsNTI4MjUsNTI4NTEsMTIsNTI4ODEsNTI5MDcsMTIsNTI5MzcsNTI5NjMsMTIsNTI5OTMsNTMwMTksMTIsNTMwNDksNTMwNzUsMTIsNTMxMDUsNTMxMzEsMTIsNTMxNjEsNTMxODcsMTIsNTMyMTcsNTMyNDMsMTIsNTMyNzMsNTMyOTksMTIsNTMzMjksNTMzNTUsMTIsNTMzODUsNTM0MTEsMTIsNTM0NDEsNTM0NjcsMTIsNTM0OTcsNTM1MjMsMTIsNTM1NTMsNTM1NzksMTIsNTM2MDksNTM2MzUsMTIsNTM2NjUsNTM2OTEsMTIsNTM3MjEsNTM3NDcsMTIsNTM3NzcsNTM4MDMsMTIsNTM4MzMsNTM4NTksMTIsNTM4ODksNTM5MTUsMTIsNTM5NDUsNTM5NzEsMTIsNTQwMDEsNTQwMjcsMTIsNTQwNTcsNTQwODMsMTIsNTQxMTMsNTQxMzksMTIsNTQxNjksNTQxOTUsMTIsNTQyMjUsNTQyNTEsMTIsNTQyODEsNTQzMDcsMTIsNTQzMzcsNTQzNjMsMTIsNTQzOTMsNTQ0MTksMTIsNTQ0NDksNTQ0NzUsMTIsNTQ1MDUsNTQ1MzEsMTIsNTQ1NjEsNTQ1ODcsMTIsNTQ2MTcsNTQ2NDMsMTIsNTQ2NzMsNTQ2OTksMTIsNTQ3MjksNTQ3NTUsMTIsNTQ3ODUsNTQ4MTEsMTIsNTQ4NDEsNTQ4NjcsMTIsNTQ4OTcsNTQ5MjMsMTIsNTQ5NTMsNTQ5NzksMTIsNTUwMDksNTUwMzUsMTIsNTUwNjUsNTUwOTEsMTIsNTUxMjEsNTUxNDcsMTIsNTUxNzcsNTUyMDMsMTIsNjUwMjQsNjUwMzksNSw2NTUyMCw2NTUyOCw0LDY2NDIyLDY2NDI2LDUsNjgxNTIsNjgxNTQsNSw2OTI5MSw2OTI5Miw1LDY5NjMzLDY5NjMzLDUsNjk3NDcsNjk3NDgsNSw2OTgxMSw2OTgxNCw1LDY5ODI2LDY5ODI2LDUsNjk5MzIsNjk5MzIsNyw3MDAxNiw3MDAxNyw1LDcwMDc5LDcwMDgwLDcsNzAwOTUsNzAwOTUsNSw3MDE5Niw3MDE5Niw1LDcwMzY3LDcwMzY3LDUsNzA0MDIsNzA0MDMsNyw3MDQ2NCw3MDQ2NCw1LDcwNDg3LDcwNDg3LDUsNzA3MDksNzA3MTEsNyw3MDcyNSw3MDcyNSw3LDcwODMzLDcwODM0LDcsNzA4NDMsNzA4NDQsNyw3MDg0OSw3MDg0OSw3LDcxMDkwLDcxMDkzLDUsNzExMDMsNzExMDQsNSw3MTIyNyw3MTIyOCw3LDcxMzM5LDcxMzM5LDUsNzEzNDQsNzEzNDksNSw3MTQ1OCw3MTQ2MSw1LDcxNzI3LDcxNzM1LDUsNzE5ODUsNzE5ODksNyw3MTk5OCw3MTk5OCw1LDcyMDAyLDcyMDAyLDcsNzIxNTQsNzIxNTUsNSw3MjE5Myw3MjIwMiw1LDcyMjUxLDcyMjU0LDUsNzIyODEsNzIyODMsNSw3MjM0NCw3MjM0NSw1LDcyNzY2LDcyNzY2LDcsNzI4NzQsNzI4ODAsNSw3Mjg4NSw3Mjg4Niw1LDczMDIzLDczMDI5LDUsNzMxMDQsNzMxMDUsNSw3MzExMSw3MzExMSw1LDkyOTEyLDkyOTE2LDUsOTQwOTUsOTQwOTgsNSwxMTM4MjQsMTEzODI3LDQsMTE5MTQyLDExOTE0Miw3LDExOTE1NSwxMTkxNjIsNCwxMTkzNjIsMTE5MzY0LDUsMTIxNDc2LDEyMTQ3Niw1LDEyMjg4OCwxMjI5MDQsNSwxMjMxODQsMTIzMTkwLDUsMTI1MjUyLDEyNTI1OCw1LDEyNzE4MywxMjcxODMsMTQsMTI3MzQwLDEyNzM0MywxNCwxMjczNzcsMTI3Mzg2LDE0LDEyNzQ5MSwxMjc1MDMsMTQsMTI3NTQ4LDEyNzU1MSwxNCwxMjc3NDQsMTI3NzU2LDE0LDEyNzc2MSwxMjc3NjEsMTQsMTI3NzY5LDEyNzc2OSwxNCwxMjc3NzMsMTI3Nzc0LDE0LDEyNzc4MCwxMjc3ODgsMTQsMTI3Nzk2LDEyNzc5NywxNCwxMjc4MjAsMTI3ODIzLDE0LDEyNzg2OSwxMjc4NjksMTQsMTI3ODk0LDEyNzg5NSwxNCwxMjc5MDIsMTI3OTAzLDE0LDEyNzk0MywxMjc5NDMsMTQsMTI3OTQ3LDEyNzk1MCwxNCwxMjc5NzIsMTI3OTcyLDE0LDEyNzk4OCwxMjc5ODgsMTQsMTI3OTkyLDEyNzk5NCwxNCwxMjgwMDksMTI4MDExLDE0LDEyODAxOSwxMjgwMTksMTQsMTI4MDIzLDEyODA0MSwxNCwxMjgwNjQsMTI4MDY0LDE0LDEyODEwMiwxMjgxMDcsMTQsMTI4MTc0LDEyODE4MSwxNCwxMjgyMzgsMTI4MjM4LDE0LDEyODI0NiwxMjgyNDcsMTQsMTI4MjU0LDEyODI1NCwxNCwxMjgyNjQsMTI4MjY0LDE0LDEyODI3OCwxMjgyOTksMTQsMTI4MzI5LDEyODMzMCwxNCwxMjgzNDgsMTI4MzU5LDE0LDEyODM3MSwxMjgzNzcsMTQsMTI4MzkyLDEyODM5MywxNCwxMjg0MDEsMTI4NDA0LDE0LDEyODQyMSwxMjg0MjEsMTQsMTI4NDMzLDEyODQzNCwxNCwxMjg0NTAsMTI4NDUyLDE0LDEyODQ3NiwxMjg0NzgsMTQsMTI4NDgzLDEyODQ4MywxNCwxMjg0OTUsMTI4NDk1LDE0LDEyODUwNiwxMjg1MDYsMTQsMTI4NTE5LDEyODUyMCwxNCwxMjg1MjgsMTI4NTI4LDE0LDEyODUzNCwxMjg1MzQsMTQsMTI4NTM4LDEyODUzOCwxNCwxMjg1NDAsMTI4NTQyLDE0LDEyODU0NCwxMjg1NDksMTQsMTI4NTUyLDEyODU1NSwxNCwxMjg1NTcsMTI4NTU3LDE0LDEyODU2MCwxMjg1NjMsMTQsMTI4NTY1LDEyODU2NSwxNCwxMjg1NjcsMTI4NTc2LDE0LDEyODU4MSwxMjg1OTEsMTQsMTI4NjQxLDEyODY0MiwxNCwxMjg2NDYsMTI4NjQ2LDE0LDEyODY0OCwxMjg2NDgsMTQsMTI4NjUwLDEyODY1MSwxNCwxMjg2NTMsMTI4NjUzLDE0LDEyODY1NSwxMjg2NTUsMTQsMTI4NjU3LDEyODY1OSwxNCwxMjg2NjEsMTI4NjYxLDE0LDEyODY2MywxMjg2NjMsMTQsMTI4NjY1LDEyODY2NiwxNCwxMjg2NzQsMTI4Njc0LDE0LDEyODY3NiwxMjg2NzcsMTQsMTI4Njc5LDEyODY4NSwxNCwxMjg2OTAsMTI4NjkwLDE0LDEyODY5NCwxMjg2OTQsMTQsMTI4Njk3LDEyODcwMiwxNCwxMjg3MDQsMTI4NzA0LDE0LDEyODcxMCwxMjg3MTQsMTQsMTI4NzE2LDEyODcxNiwxNCwxMjg3MjAsMTI4NzIwLDE0LDEyODcyMywxMjg3MjQsMTQsMTI4NzI2LDEyODcyNywxNCwxMjg3MzMsMTI4NzM1LDE0LDEyODc0MiwxMjg3NDQsMTQsMTI4NzQ2LDEyODc0NiwxNCwxMjg3NDksMTI4NzUxLDE0LDEyODc1MywxMjg3NTQsMTQsMTI4NzU2LDEyODc1OCwxNCwxMjg3NjEsMTI4NzYxLDE0LDEyODc2MywxMjg3NjQsMTQsMTI4ODg0LDEyODg5NSwxNCwxMjg5OTIsMTI5MDAzLDE0LDEyOTAwOCwxMjkwMDgsMTQsMTI5MDM2LDEyOTAzOSwxNCwxMjkxMTQsMTI5MTE5LDE0LDEyOTE5OCwxMjkyNzksMTQsMTI5MjkzLDEyOTI5NSwxNCwxMjkzMDUsMTI5MzEwLDE0LDEyOTMxMiwxMjkzMTksMTQsMTI5MzI4LDEyOTMyOCwxNCwxMjkzMzEsMTI5MzM4LDE0LDEyOTM0MywxMjkzNDMsMTQsMTI5MzUxLDEyOTM1NSwxNCwxMjkzNTcsMTI5MzU5LDE0LDEyOTM3NSwxMjkzODcsMTQsMTI5MzkzLDEyOTM5MywxNCwxMjkzOTUsMTI5Mzk4LDE0LDEyOTQwMSwxMjk0MDEsMTQsMTI5NDAzLDEyOTQwMywxNCwxMjk0MDgsMTI5NDEyLDE0LDEyOTQyNiwxMjk0MzEsMTQsMTI5NDQzLDEyOTQ0NCwxNCwxMjk0NTEsMTI5NDUzLDE0LDEyOTQ1NiwxMjk0NjUsMTQsMTI5NDcyLDEyOTQ3MiwxNCwxMjk0NzUsMTI5NDgyLDE0LDEyOTQ4NCwxMjk0ODQsMTQsMTI5NDg4LDEyOTUxMCwxNCwxMjk1MzYsMTI5NjQ3LDE0LDEyOTY1MiwxMjk2NTIsMTQsMTI5NjU2LDEyOTY1OCwxNCwxMjk2NjEsMTI5NjYzLDE0LDEyOTY2NywxMjk2NzAsMTQsMTI5NjgwLDEyOTY4NSwxNCwxMjk3MDUsMTI5NzA4LDE0LDEyOTcxMiwxMjk3MTgsMTQsMTI5NzIzLDEyOTcyNywxNCwxMjk3MzEsMTI5NzMzLDE0LDEyOTc0NCwxMjk3NTAsMTQsMTI5NzU0LDEyOTc1OSwxNCwxMjk3NjgsMTI5Nzc1LDE0LDEyOTc4MywxMjk3OTEsMTQsOTE3NTA0LDkxNzUwNCw0LDkxNzUwNiw5MTc1MzUsNCw5MTc2MzIsOTE3NzU5LDQsOTE4MDAwLDkyMTU5OSw0LDAsOSw0LDExLDEyLDQsMTQsMzEsNCwxNjksMTY5LDE0LDE3NCwxNzQsMTQsMTE1NSwxMTU5LDUsMTQyNSwxNDY5LDUsMTQ3MywxNDc0LDUsMTQ3OSwxNDc5LDUsMTU1MiwxNTYyLDUsMTYxMSwxNjMxLDUsMTc1MCwxNzU2LDUsMTc1OSwxNzY0LDUsMTc3MCwxNzczLDUsMTgwOSwxODA5LDUsMTk1OCwxOTY4LDUsMjA0NSwyMDQ1LDUsMjA3NSwyMDgzLDUsMjA4OSwyMDkzLDUsMjE5MiwyMTkzLDEsMjI1MCwyMjczLDUsMjI3NSwyMzA2LDUsMjM2MiwyMzYyLDUsMjM2NCwyMzY0LDUsMjM2OSwyMzc2LDUsMjM4MSwyMzgxLDUsMjM4NSwyMzkxLDUsMjQzMywyNDMzLDUsMjQ5MiwyNDkyLDUsMjQ5NSwyNDk2LDcsMjUwMywyNTA0LDcsMjUwOSwyNTA5LDUsMjUzMCwyNTMxLDUsMjU2MSwyNTYyLDUsMjYyMCwyNjIwLDUsMjYyNSwyNjI2LDUsMjYzNSwyNjM3LDUsMjY3MiwyNjczLDUsMjY4OSwyNjkwLDUsMjc0OCwyNzQ4LDUsMjc1MywyNzU3LDUsMjc2MSwyNzYxLDcsMjc2NSwyNzY1LDUsMjgxMCwyODE1LDUsMjgxOCwyODE5LDcsMjg3OCwyODc4LDUsMjg4MCwyODgwLDcsMjg4NywyODg4LDcsMjg5MywyODkzLDUsMjkwMywyOTAzLDUsMjk0NiwyOTQ2LDUsMzAwNywzMDA3LDcsMzAwOSwzMDEwLDcsMzAxOCwzMDIwLDcsMzAzMSwzMDMxLDUsMzA3MywzMDc1LDcsMzEzMiwzMTMyLDUsMzEzNywzMTQwLDcsMzE0NiwzMTQ5LDUsMzE3MCwzMTcxLDUsMzIwMiwzMjAzLDcsMzI2MiwzMjYyLDcsMzI2NCwzMjY1LDcsMzI2NywzMjY4LDcsMzI3MSwzMjcyLDcsMzI3NiwzMjc3LDUsMzI5OCwzMjk5LDUsMzMzMCwzMzMxLDcsMzM5MCwzMzkwLDUsMzM5MywzMzk2LDUsMzQwMiwzNDA0LDcsMzQwNiwzNDA2LDEsMzQyNiwzNDI3LDUsMzQ1OCwzNDU5LDcsMzUzNSwzNTM1LDUsMzUzOCwzNTQwLDUsMzU0NCwzNTUwLDcsMzU3MCwzNTcxLDcsMzYzNSwzNjM1LDcsMzY1NSwzNjYyLDUsMzc2MywzNzYzLDcsMzc4NCwzNzg5LDUsMzg5MywzODkzLDUsMzg5NywzODk3LDUsMzk1MywzOTY2LDUsMzk2OCwzOTcyLDUsMzk4MSwzOTkxLDUsNDAzOCw0MDM4LDUsNDE0NSw0MTQ1LDcsNDE1Myw0MTU0LDUsNDE1Nyw0MTU4LDUsNDE4NCw0MTg1LDUsNDIwOSw0MjEyLDUsNDIyOCw0MjI4LDcsNDIzNyw0MjM3LDUsNDM1Miw0NDQ3LDgsNDUyMCw0NjA3LDEwLDU5MDYsNTkwOCw1LDU5MzgsNTkzOSw1LDU5NzAsNTk3MSw1LDYwNjgsNjA2OSw1LDYwNzEsNjA3Nyw1LDYwODYsNjA4Niw1LDYwODksNjA5OSw1LDYxNTUsNjE1Nyw1LDYxNTksNjE1OSw1LDYzMTMsNjMxMyw1LDY0MzUsNjQzOCw3LDY0NDEsNjQ0Myw3LDY0NTAsNjQ1MCw1LDY0NTcsNjQ1OSw1LDY2ODEsNjY4Miw3LDY3NDEsNjc0MSw3LDY3NDMsNjc0Myw3LDY3NTIsNjc1Miw1LDY3NTcsNjc2NCw1LDY3NzEsNjc4MCw1LDY4MzIsNjg0NSw1LDY4NDcsNjg2Miw1LDY5MTYsNjkxNiw3LDY5NjUsNjk2NSw1LDY5NzEsNjk3MSw3LDY5NzMsNjk3Nyw3LDY5NzksNjk4MCw3LDcwNDAsNzA0MSw1LDcwNzMsNzA3Myw3LDcwNzgsNzA3OSw3LDcwODIsNzA4Miw3LDcxNDIsNzE0Miw1LDcxNDQsNzE0NSw1LDcxNDksNzE0OSw1LDcxNTEsNzE1Myw1LDcyMDQsNzIxMSw3LDcyMjAsNzIyMSw3LDczNzYsNzM3OCw1LDczOTMsNzM5Myw3LDc0MDUsNzQwNSw1LDc0MTUsNzQxNSw3LDc2MTYsNzY3OSw1LDgyMDQsODIwNCw1LDgyMDYsODIwNyw0LDgyMzMsODIzMyw0LDgyNTIsODI1MiwxNCw4Mjg4LDgyOTIsNCw4Mjk0LDgzMDMsNCw4NDEzLDg0MTYsNSw4NDE4LDg0MjAsNSw4NDgyLDg0ODIsMTQsODU5Niw4NjAxLDE0LDg5ODYsODk4NywxNCw5MDk2LDkwOTYsMTQsOTE5Myw5MTk2LDE0LDkxOTksOTE5OSwxNCw5MjAxLDkyMDIsMTQsOTIwOCw5MjEwLDE0LDk2NDIsOTY0MywxNCw5NjY0LDk2NjQsMTQsOTcyOCw5NzI5LDE0LDk3MzIsOTczMiwxNCw5NzM1LDk3NDEsMTQsOTc0Myw5NzQ0LDE0LDk3NDYsOTc0NiwxNCw5NzUwLDk3NTEsMTQsOTc1Myw5NzU2LDE0LDk3NTgsOTc1OSwxNCw5NzYxLDk3NjEsMTQsOTc2NCw5NzY1LDE0LDk3NjcsOTc2OSwxNCw5NzcxLDk3NzMsMTQsOTc3NSw5Nzc1LDE0LDk3ODQsOTc4NSwxNCw5Nzg3LDk3OTEsMTQsOTc5Myw5NzkzLDE0LDk3OTUsOTc5OSwxNCw5ODEyLDk4MjIsMTQsOTgyNCw5ODI0LDE0LDk4MjcsOTgyNywxNCw5ODI5LDk4MzAsMTQsOTgzMiw5ODMyLDE0LDk4NTEsOTg1MSwxNCw5ODU0LDk4NTQsMTQsOTg1Niw5ODYxLDE0LDk4NzQsOTg3NCwxNCw5ODc2LDk4NzYsMTQsOTg3OCw5ODc5LDE0LDk4ODEsOTg4MSwxNCw5ODgzLDk4ODQsMTQsOTg4OCw5ODg5LDE0LDk4OTUsOTg5NSwxNCw5ODk4LDk4OTksMTQsOTkwNCw5OTA1LDE0LDk5MTcsOTkxOCwxNCw5OTI0LDk5MjUsMTQsOTkyOCw5OTI4LDE0LDk5MzQsOTkzNCwxNCw5OTM2LDk5MzYsMTQsOTkzOCw5OTM4LDE0LDk5NDAsOTk0MCwxNCw5OTYxLDk5NjEsMTQsOTk2Myw5OTY3LDE0LDk5NzAsOTk3MSwxNCw5OTczLDk5NzMsMTQsOTk3NSw5OTc3LDE0LDk5NzksOTk4MCwxNCw5OTgyLDk5ODUsMTQsOTk4Nyw5OTg4LDE0LDk5OTIsOTk5NiwxNCw5OTk4LDk5OTgsMTQsMTAwMDAsMTAwMDEsMTQsMTAwMDQsMTAwMDQsMTQsMTAwMTMsMTAwMTMsMTQsMTAwMjQsMTAwMjQsMTQsMTAwNTIsMTAwNTIsMTQsMTAwNjAsMTAwNjAsMTQsMTAwNjcsMTAwNjksMTQsMTAwODMsMTAwODMsMTQsMTAwODUsMTAwODcsMTQsMTAxNDUsMTAxNDUsMTQsMTAxNzUsMTAxNzUsMTQsMTEwMTMsMTEwMTUsMTQsMTEwODgsMTEwODgsMTQsMTE1MDMsMTE1MDUsNSwxMTc0NCwxMTc3NSw1LDEyMzM0LDEyMzM1LDUsMTIzNDksMTIzNDksMTQsMTI5NTEsMTI5NTEsMTQsNDI2MDcsNDI2MDcsNSw0MjYxMiw0MjYyMSw1LDQyNzM2LDQyNzM3LDUsNDMwMTQsNDMwMTQsNSw0MzA0Myw0MzA0NCw3LDQzMDQ3LDQzMDQ3LDcsNDMxMzYsNDMxMzcsNyw0MzIwNCw0MzIwNSw1LDQzMjYzLDQzMjYzLDUsNDMzMzUsNDMzNDUsNSw0MzM2MCw0MzM4OCw4LDQzMzk1LDQzMzk1LDcsNDM0NDQsNDM0NDUsNyw0MzQ1MCw0MzQ1MSw3LDQzNDU0LDQzNDU2LDcsNDM1NjEsNDM1NjYsNSw0MzU2OSw0MzU3MCw1LDQzNTczLDQzNTc0LDUsNDM1OTYsNDM1OTYsNSw0MzY0NCw0MzY0NCw1LDQzNjk4LDQzNzAwLDUsNDM3MTAsNDM3MTEsNSw0Mzc1NSw0Mzc1NSw3LDQzNzU4LDQzNzU5LDcsNDM3NjYsNDM3NjYsNSw0NDAwNSw0NDAwNSw1LDQ0MDA4LDQ0MDA4LDUsNDQwMTIsNDQwMTIsNyw0NDAzMiw0NDAzMiwxMSw0NDA2MCw0NDA2MCwxMSw0NDA4OCw0NDA4OCwxMSw0NDExNiw0NDExNiwxMSw0NDE0NCw0NDE0NCwxMSw0NDE3Miw0NDE3MiwxMSw0NDIwMCw0NDIwMCwxMSw0NDIyOCw0NDIyOCwxMSw0NDI1Niw0NDI1NiwxMSw0NDI4NCw0NDI4NCwxMSw0NDMxMiw0NDMxMiwxMSw0NDM0MCw0NDM0MCwxMSw0NDM2OCw0NDM2OCwxMSw0NDM5Niw0NDM5NiwxMSw0NDQyNCw0NDQyNCwxMSw0NDQ1Miw0NDQ1MiwxMSw0NDQ4MCw0NDQ4MCwxMSw0NDUwOCw0NDUwOCwxMSw0NDUzNiw0NDUzNiwxMSw0NDU2NCw0NDU2NCwxMSw0NDU5Miw0NDU5MiwxMSw0NDYyMCw0NDYyMCwxMSw0NDY0OCw0NDY0OCwxMSw0NDY3Niw0NDY3NiwxMSw0NDcwNCw0NDcwNCwxMSw0NDczMiw0NDczMiwxMSw0NDc2MCw0NDc2MCwxMSw0NDc4OCw0NDc4OCwxMSw0NDgxNiw0NDgxNiwxMSw0NDg0NCw0NDg0NCwxMSw0NDg3Miw0NDg3MiwxMSw0NDkwMCw0NDkwMCwxMSw0NDkyOCw0NDkyOCwxMSw0NDk1Niw0NDk1NiwxMSw0NDk4NCw0NDk4NCwxMSw0NTAxMiw0NTAxMiwxMSw0NTA0MCw0NTA0MCwxMSw0NTA2OCw0NTA2OCwxMSw0NTA5Niw0NTA5NiwxMSw0NTEyNCw0NTEyNCwxMSw0NTE1Miw0NTE1MiwxMSw0NTE4MCw0NTE4MCwxMSw0NTIwOCw0NTIwOCwxMSw0NTIzNiw0NTIzNiwxMSw0NTI2NCw0NTI2NCwxMSw0NTI5Miw0NTI5MiwxMSw0NTMyMCw0NTMyMCwxMSw0NTM0OCw0NTM0OCwxMSw0NTM3Niw0NTM3NiwxMSw0NTQwNCw0NTQwNCwxMSw0NTQzMiw0NTQzMiwxMSw0NTQ2MCw0NTQ2MCwxMSw0NTQ4OCw0NTQ4OCwxMSw0NTUxNiw0NTUxNiwxMSw0NTU0NCw0NTU0NCwxMSw0NTU3Miw0NTU3MiwxMSw0NTYwMCw0NTYwMCwxMSw0NTYyOCw0NTYyOCwxMSw0NTY1Niw0NTY1NiwxMSw0NTY4NCw0NTY4NCwxMSw0NTcxMiw0NTcxMiwxMSw0NTc0MCw0NTc0MCwxMSw0NTc2OCw0NTc2OCwxMSw0NTc5Niw0NTc5NiwxMSw0NTgyNCw0NTgyNCwxMSw0NTg1Miw0NTg1MiwxMSw0NTg4MCw0NTg4MCwxMSw0NTkwOCw0NTkwOCwxMSw0NTkzNiw0NTkzNiwxMSw0NTk2NCw0NTk2NCwxMSw0NTk5Miw0NTk5MiwxMSw0NjAyMCw0NjAyMCwxMSw0NjA0OCw0NjA0OCwxMSw0NjA3Niw0NjA3NiwxMSw0NjEwNCw0NjEwNCwxMSw0NjEzMiw0NjEzMiwxMSw0NjE2MCw0NjE2MCwxMSw0NjE4OCw0NjE4OCwxMSw0NjIxNiw0NjIxNiwxMSw0NjI0NCw0NjI0NCwxMSw0NjI3Miw0NjI3MiwxMSw0NjMwMCw0NjMwMCwxMSw0NjMyOCw0NjMyOCwxMSw0NjM1Niw0NjM1NiwxMSw0NjM4NCw0NjM4NCwxMSw0NjQxMiw0NjQxMiwxMSw0NjQ0MCw0NjQ0MCwxMSw0NjQ2OCw0NjQ2OCwxMSw0NjQ5Niw0NjQ5NiwxMSw0NjUyNCw0NjUyNCwxMSw0NjU1Miw0NjU1MiwxMSw0NjU4MCw0NjU4MCwxMSw0NjYwOCw0NjYwOCwxMSw0NjYzNiw0NjYzNiwxMSw0NjY2NCw0NjY2NCwxMSw0NjY5Miw0NjY5MiwxMSw0NjcyMCw0NjcyMCwxMSw0Njc0OCw0Njc0OCwxMSw0Njc3Niw0Njc3NiwxMSw0NjgwNCw0NjgwNCwxMSw0NjgzMiw0NjgzMiwxMSw0Njg2MCw0Njg2MCwxMSw0Njg4OCw0Njg4OCwxMSw0NjkxNiw0NjkxNiwxMSw0Njk0NCw0Njk0NCwxMSw0Njk3Miw0Njk3MiwxMSw0NzAwMCw0NzAwMCwxMSw0NzAyOCw0NzAyOCwxMSw0NzA1Niw0NzA1NiwxMSw0NzA4NCw0NzA4NCwxMSw0NzExMiw0NzExMiwxMSw0NzE0MCw0NzE0MCwxMSw0NzE2OCw0NzE2OCwxMSw0NzE5Niw0NzE5NiwxMSw0NzIyNCw0NzIyNCwxMSw0NzI1Miw0NzI1MiwxMSw0NzI4MCw0NzI4MCwxMSw0NzMwOCw0NzMwOCwxMSw0NzMzNiw0NzMzNiwxMSw0NzM2NCw0NzM2NCwxMSw0NzM5Miw0NzM5MiwxMSw0NzQyMCw0NzQyMCwxMSw0NzQ0OCw0NzQ0OCwxMSw0NzQ3Niw0NzQ3NiwxMSw0NzUwNCw0NzUwNCwxMSw0NzUzMiw0NzUzMiwxMSw0NzU2MCw0NzU2MCwxMSw0NzU4OCw0NzU4OCwxMSw0NzYxNiw0NzYxNiwxMSw0NzY0NCw0NzY0NCwxMSw0NzY3Miw0NzY3MiwxMSw0NzcwMCw0NzcwMCwxMSw0NzcyOCw0NzcyOCwxMSw0Nzc1Niw0Nzc1NiwxMSw0Nzc4NCw0Nzc4NCwxMSw0NzgxMiw0NzgxMiwxMSw0Nzg0MCw0Nzg0MCwxMSw0Nzg2OCw0Nzg2OCwxMSw0Nzg5Niw0Nzg5NiwxMSw0NzkyNCw0NzkyNCwxMSw0Nzk1Miw0Nzk1MiwxMSw0Nzk4MCw0Nzk4MCwxMSw0ODAwOCw0ODAwOCwxMSw0ODAzNiw0ODAzNiwxMSw0ODA2NCw0ODA2NCwxMSw0ODA5Miw0ODA5MiwxMSw0ODEyMCw0ODEyMCwxMSw0ODE0OCw0ODE0OCwxMSw0ODE3Niw0ODE3NiwxMSw0ODIwNCw0ODIwNCwxMSw0ODIzMiw0ODIzMiwxMSw0ODI2MCw0ODI2MCwxMSw0ODI4OCw0ODI4OCwxMSw0ODMxNiw0ODMxNiwxMSw0ODM0NCw0ODM0NCwxMSw0ODM3Miw0ODM3MiwxMSw0ODQwMCw0ODQwMCwxMSw0ODQyOCw0ODQyOCwxMSw0ODQ1Niw0ODQ1NiwxMSw0ODQ4NCw0ODQ4NCwxMSw0ODUxMiw0ODUxMiwxMSw0ODU0MCw0ODU0MCwxMSw0ODU2OCw0ODU2OCwxMSw0ODU5Niw0ODU5NiwxMSw0ODYyNCw0ODYyNCwxMSw0ODY1Miw0ODY1MiwxMSw0ODY4MCw0ODY4MCwxMSw0ODcwOCw0ODcwOCwxMSw0ODczNiw0ODczNiwxMSw0ODc2NCw0ODc2NCwxMSw0ODc5Miw0ODc5MiwxMSw0ODgyMCw0ODgyMCwxMSw0ODg0OCw0ODg0OCwxMSw0ODg3Niw0ODg3NiwxMSw0ODkwNCw0ODkwNCwxMSw0ODkzMiw0ODkzMiwxMSw0ODk2MCw0ODk2MCwxMSw0ODk4OCw0ODk4OCwxMSw0OTAxNiw0OTAxNiwxMSw0OTA0NCw0OTA0NCwxMSw0OTA3Miw0OTA3MiwxMSw0OTEwMCw0OTEwMCwxMSw0OTEyOCw0OTEyOCwxMSw0OTE1Niw0OTE1NiwxMSw0OTE4NCw0OTE4NCwxMSw0OTIxMiw0OTIxMiwxMSw0OTI0MCw0OTI0MCwxMSw0OTI2OCw0OTI2OCwxMSw0OTI5Niw0OTI5NiwxMSw0OTMyNCw0OTMyNCwxMSw0OTM1Miw0OTM1MiwxMSw0OTM4MCw0OTM4MCwxMSw0OTQwOCw0OTQwOCwxMSw0OTQzNiw0OTQzNiwxMSw0OTQ2NCw0OTQ2NCwxMSw0OTQ5Miw0OTQ5MiwxMSw0OTUyMCw0OTUyMCwxMSw0OTU0OCw0OTU0OCwxMSw0OTU3Niw0OTU3NiwxMSw0OTYwNCw0OTYwNCwxMSw0OTYzMiw0OTYzMiwxMSw0OTY2MCw0OTY2MCwxMSw0OTY4OCw0OTY4OCwxMSw0OTcxNiw0OTcxNiwxMSw0OTc0NCw0OTc0NCwxMSw0OTc3Miw0OTc3MiwxMSw0OTgwMCw0OTgwMCwxMSw0OTgyOCw0OTgyOCwxMSw0OTg1Niw0OTg1NiwxMSw0OTg4NCw0OTg4NCwxMSw0OTkxMiw0OTkxMiwxMSw0OTk0MCw0OTk0MCwxMSw0OTk2OCw0OTk2OCwxMSw0OTk5Niw0OTk5NiwxMSw1MDAyNCw1MDAyNCwxMSw1MDA1Miw1MDA1MiwxMSw1MDA4MCw1MDA4MCwxMSw1MDEwOCw1MDEwOCwxMSw1MDEzNiw1MDEzNiwxMSw1MDE2NCw1MDE2NCwxMSw1MDE5Miw1MDE5MiwxMSw1MDIyMCw1MDIyMCwxMSw1MDI0OCw1MDI0OCwxMSw1MDI3Niw1MDI3NiwxMSw1MDMwNCw1MDMwNCwxMSw1MDMzMiw1MDMzMiwxMSw1MDM2MCw1MDM2MCwxMSw1MDM4OCw1MDM4OCwxMSw1MDQxNiw1MDQxNiwxMSw1MDQ0NCw1MDQ0NCwxMSw1MDQ3Miw1MDQ3MiwxMSw1MDUwMCw1MDUwMCwxMSw1MDUyOCw1MDUyOCwxMSw1MDU1Niw1MDU1NiwxMSw1MDU4NCw1MDU4NCwxMSw1MDYxMiw1MDYxMiwxMSw1MDY0MCw1MDY0MCwxMSw1MDY2OCw1MDY2OCwxMSw1MDY5Niw1MDY5NiwxMSw1MDcyNCw1MDcyNCwxMSw1MDc1Miw1MDc1MiwxMSw1MDc4MCw1MDc4MCwxMSw1MDgwOCw1MDgwOCwxMSw1MDgzNiw1MDgzNiwxMSw1MDg2NCw1MDg2NCwxMSw1MDg5Miw1MDg5MiwxMSw1MDkyMCw1MDkyMCwxMSw1MDk0OCw1MDk0OCwxMSw1MDk3Niw1MDk3NiwxMSw1MTAwNCw1MTAwNCwxMSw1MTAzMiw1MTAzMiwxMSw1MTA2MCw1MTA2MCwxMSw1MTA4OCw1MTA4OCwxMSw1MTExNiw1MTExNiwxMSw1MTE0NCw1MTE0NCwxMSw1MTE3Miw1MTE3MiwxMSw1MTIwMCw1MTIwMCwxMSw1MTIyOCw1MTIyOCwxMSw1MTI1Niw1MTI1NiwxMSw1MTI4NCw1MTI4NCwxMSw1MTMxMiw1MTMxMiwxMSw1MTM0MCw1MTM0MCwxMSw1MTM2OCw1MTM2OCwxMSw1MTM5Niw1MTM5NiwxMSw1MTQyNCw1MTQyNCwxMSw1MTQ1Miw1MTQ1MiwxMSw1MTQ4MCw1MTQ4MCwxMSw1MTUwOCw1MTUwOCwxMSw1MTUzNiw1MTUzNiwxMSw1MTU2NCw1MTU2NCwxMSw1MTU5Miw1MTU5MiwxMSw1MTYyMCw1MTYyMCwxMSw1MTY0OCw1MTY0OCwxMSw1MTY3Niw1MTY3NiwxMSw1MTcwNCw1MTcwNCwxMSw1MTczMiw1MTczMiwxMSw1MTc2MCw1MTc2MCwxMSw1MTc4OCw1MTc4OCwxMSw1MTgxNiw1MTgxNiwxMSw1MTg0NCw1MTg0NCwxMSw1MTg3Miw1MTg3MiwxMSw1MTkwMCw1MTkwMCwxMSw1MTkyOCw1MTkyOCwxMSw1MTk1Niw1MTk1NiwxMSw1MTk4NCw1MTk4NCwxMSw1MjAxMiw1MjAxMiwxMSw1MjA0MCw1MjA0MCwxMSw1MjA2OCw1MjA2OCwxMSw1MjA5Niw1MjA5NiwxMSw1MjEyNCw1MjEyNCwxMSw1MjE1Miw1MjE1MiwxMSw1MjE4MCw1MjE4MCwxMSw1MjIwOCw1MjIwOCwxMSw1MjIzNiw1MjIzNiwxMSw1MjI2NCw1MjI2NCwxMSw1MjI5Miw1MjI5MiwxMSw1MjMyMCw1MjMyMCwxMSw1MjM0OCw1MjM0OCwxMSw1MjM3Niw1MjM3NiwxMSw1MjQwNCw1MjQwNCwxMSw1MjQzMiw1MjQzMiwxMSw1MjQ2MCw1MjQ2MCwxMSw1MjQ4OCw1MjQ4OCwxMSw1MjUxNiw1MjUxNiwxMSw1MjU0NCw1MjU0NCwxMSw1MjU3Miw1MjU3MiwxMSw1MjYwMCw1MjYwMCwxMSw1MjYyOCw1MjYyOCwxMSw1MjY1Niw1MjY1NiwxMSw1MjY4NCw1MjY4NCwxMSw1MjcxMiw1MjcxMiwxMSw1Mjc0MCw1Mjc0MCwxMSw1Mjc2OCw1Mjc2OCwxMSw1Mjc5Niw1Mjc5NiwxMSw1MjgyNCw1MjgyNCwxMSw1Mjg1Miw1Mjg1MiwxMSw1Mjg4MCw1Mjg4MCwxMSw1MjkwOCw1MjkwOCwxMSw1MjkzNiw1MjkzNiwxMSw1Mjk2NCw1Mjk2NCwxMSw1Mjk5Miw1Mjk5MiwxMSw1MzAyMCw1MzAyMCwxMSw1MzA0OCw1MzA0OCwxMSw1MzA3Niw1MzA3NiwxMSw1MzEwNCw1MzEwNCwxMSw1MzEzMiw1MzEzMiwxMSw1MzE2MCw1MzE2MCwxMSw1MzE4OCw1MzE4OCwxMSw1MzIxNiw1MzIxNiwxMSw1MzI0NCw1MzI0NCwxMSw1MzI3Miw1MzI3MiwxMSw1MzMwMCw1MzMwMCwxMSw1MzMyOCw1MzMyOCwxMSw1MzM1Niw1MzM1NiwxMSw1MzM4NCw1MzM4NCwxMSw1MzQxMiw1MzQxMiwxMSw1MzQ0MCw1MzQ0MCwxMSw1MzQ2OCw1MzQ2OCwxMSw1MzQ5Niw1MzQ5NiwxMSw1MzUyNCw1MzUyNCwxMSw1MzU1Miw1MzU1MiwxMSw1MzU4MCw1MzU4MCwxMSw1MzYwOCw1MzYwOCwxMSw1MzYzNiw1MzYzNiwxMSw1MzY2NCw1MzY2NCwxMSw1MzY5Miw1MzY5MiwxMSw1MzcyMCw1MzcyMCwxMSw1Mzc0OCw1Mzc0OCwxMSw1Mzc3Niw1Mzc3NiwxMSw1MzgwNCw1MzgwNCwxMSw1MzgzMiw1MzgzMiwxMSw1Mzg2MCw1Mzg2MCwxMSw1Mzg4OCw1Mzg4OCwxMSw1MzkxNiw1MzkxNiwxMSw1Mzk0NCw1Mzk0NCwxMSw1Mzk3Miw1Mzk3MiwxMSw1NDAwMCw1NDAwMCwxMSw1NDAyOCw1NDAyOCwxMSw1NDA1Niw1NDA1NiwxMSw1NDA4NCw1NDA4NCwxMSw1NDExMiw1NDExMiwxMSw1NDE0MCw1NDE0MCwxMSw1NDE2OCw1NDE2OCwxMSw1NDE5Niw1NDE5NiwxMSw1NDIyNCw1NDIyNCwxMSw1NDI1Miw1NDI1MiwxMSw1NDI4MCw1NDI4MCwxMSw1NDMwOCw1NDMwOCwxMSw1NDMzNiw1NDMzNiwxMSw1NDM2NCw1NDM2NCwxMSw1NDM5Miw1NDM5MiwxMSw1NDQyMCw1NDQyMCwxMSw1NDQ0OCw1NDQ0OCwxMSw1NDQ3Niw1NDQ3NiwxMSw1NDUwNCw1NDUwNCwxMSw1NDUzMiw1NDUzMiwxMSw1NDU2MCw1NDU2MCwxMSw1NDU4OCw1NDU4OCwxMSw1NDYxNiw1NDYxNiwxMSw1NDY0NCw1NDY0NCwxMSw1NDY3Miw1NDY3MiwxMSw1NDcwMCw1NDcwMCwxMSw1NDcyOCw1NDcyOCwxMSw1NDc1Niw1NDc1NiwxMSw1NDc4NCw1NDc4NCwxMSw1NDgxMiw1NDgxMiwxMSw1NDg0MCw1NDg0MCwxMSw1NDg2OCw1NDg2OCwxMSw1NDg5Niw1NDg5NiwxMSw1NDkyNCw1NDkyNCwxMSw1NDk1Miw1NDk1MiwxMSw1NDk4MCw1NDk4MCwxMSw1NTAwOCw1NTAwOCwxMSw1NTAzNiw1NTAzNiwxMSw1NTA2NCw1NTA2NCwxMSw1NTA5Miw1NTA5MiwxMSw1NTEyMCw1NTEyMCwxMSw1NTE0OCw1NTE0OCwxMSw1NTE3Niw1NTE3NiwxMSw1NTIxNiw1NTIzOCw5LDY0Mjg2LDY0Mjg2LDUsNjUwNTYsNjUwNzEsNSw2NTQzOCw2NTQzOSw1LDY1NTI5LDY1NTMxLDQsNjYyNzIsNjYyNzIsNSw2ODA5Nyw2ODA5OSw1LDY4MTA4LDY4MTExLDUsNjgxNTksNjgxNTksNSw2ODkwMCw2ODkwMyw1LDY5NDQ2LDY5NDU2LDUsNjk2MzIsNjk2MzIsNyw2OTYzNCw2OTYzNCw3LDY5NzQ0LDY5NzQ0LDUsNjk3NTksNjk3NjEsNSw2OTgwOCw2OTgxMCw3LDY5ODE1LDY5ODE2LDcsNjk4MjEsNjk4MjEsMSw2OTgzNyw2OTgzNywxLDY5OTI3LDY5OTMxLDUsNjk5MzMsNjk5NDAsNSw3MDAwMyw3MDAwMyw1LDcwMDE4LDcwMDE4LDcsNzAwNzAsNzAwNzgsNSw3MDA4Miw3MDA4MywxLDcwMDk0LDcwMDk0LDcsNzAxODgsNzAxOTAsNyw3MDE5NCw3MDE5NSw3LDcwMTk3LDcwMTk3LDcsNzAyMDYsNzAyMDYsNSw3MDM2OCw3MDM3MCw3LDcwNDAwLDcwNDAxLDUsNzA0NTksNzA0NjAsNSw3MDQ2Myw3MDQ2Myw3LDcwNDY1LDcwNDY4LDcsNzA0NzUsNzA0NzcsNyw3MDQ5OCw3MDQ5OSw3LDcwNTEyLDcwNTE2LDUsNzA3MTIsNzA3MTksNSw3MDcyMiw3MDcyNCw1LDcwNzI2LDcwNzI2LDUsNzA4MzIsNzA4MzIsNSw3MDgzNSw3MDg0MCw1LDcwODQyLDcwODQyLDUsNzA4NDUsNzA4NDUsNSw3MDg0Nyw3MDg0OCw1LDcwODUwLDcwODUxLDUsNzEwODgsNzEwODksNyw3MTA5Niw3MTA5OSw3LDcxMTAyLDcxMTAyLDcsNzExMzIsNzExMzMsNSw3MTIxOSw3MTIyNiw1LDcxMjI5LDcxMjI5LDUsNzEyMzEsNzEyMzIsNSw3MTM0MCw3MTM0MCw3LDcxMzQyLDcxMzQzLDcsNzEzNTAsNzEzNTAsNyw3MTQ1Myw3MTQ1NSw1LDcxNDYyLDcxNDYyLDcsNzE3MjQsNzE3MjYsNyw3MTczNiw3MTczNiw3LDcxOTg0LDcxOTg0LDUsNzE5OTEsNzE5OTIsNyw3MTk5Nyw3MTk5Nyw3LDcxOTk5LDcxOTk5LDEsNzIwMDEsNzIwMDEsMSw3MjAwMyw3MjAwMyw1LDcyMTQ4LDcyMTUxLDUsNzIxNTYsNzIxNTksNyw3MjE2NCw3MjE2NCw3LDcyMjQzLDcyMjQ4LDUsNzIyNTAsNzIyNTAsMSw3MjI2Myw3MjI2Myw1LDcyMjc5LDcyMjgwLDcsNzIzMjQsNzIzMjksMSw3MjM0Myw3MjM0Myw3LDcyNzUxLDcyNzUxLDcsNzI3NjAsNzI3NjUsNSw3Mjc2Nyw3Mjc2Nyw1LDcyODczLDcyODczLDcsNzI4ODEsNzI4ODEsNyw3Mjg4NCw3Mjg4NCw3LDczMDA5LDczMDE0LDUsNzMwMjAsNzMwMjEsNSw3MzAzMCw3MzAzMCwxLDczMDk4LDczMTAyLDcsNzMxMDcsNzMxMDgsNyw3MzExMCw3MzExMCw3LDczNDU5LDczNDYwLDUsNzg4OTYsNzg5MDQsNCw5Mjk3Niw5Mjk4Miw1LDk0MDMzLDk0MDg3LDcsOTQxODAsOTQxODAsNSwxMTM4MjEsMTEzODIyLDUsMTE4NTI4LDExODU3Myw1LDExOTE0MSwxMTkxNDEsNSwxMTkxNDMsMTE5MTQ1LDUsMTE5MTUwLDExOTE1NCw1LDExOTE2MywxMTkxNzAsNSwxMTkyMTAsMTE5MjEzLDUsMTIxMzQ0LDEyMTM5OCw1LDEyMTQ2MSwxMjE0NjEsNSwxMjE0OTksMTIxNTAzLDUsMTIyODgwLDEyMjg4Niw1LDEyMjkwNywxMjI5MTMsNSwxMjI5MTgsMTIyOTIyLDUsMTIzNTY2LDEyMzU2Niw1LDEyNTEzNiwxMjUxNDIsNSwxMjY5NzYsMTI2OTc5LDE0LDEyNjk4MSwxMjcxODIsMTQsMTI3MTg0LDEyNzIzMSwxNCwxMjcyNzksMTI3Mjc5LDE0LDEyNzM0NCwxMjczNDUsMTQsMTI3Mzc0LDEyNzM3NCwxNCwxMjc0MDUsMTI3NDYxLDE0LDEyNzQ4OSwxMjc0OTAsMTQsMTI3NTE0LDEyNzUxNCwxNCwxMjc1MzgsMTI3NTQ2LDE0LDEyNzU2MSwxMjc1NjcsMTQsMTI3NTcwLDEyNzc0MywxNCwxMjc3NTcsMTI3NzU4LDE0LDEyNzc2MCwxMjc3NjAsMTQsMTI3NzYyLDEyNzc2MiwxNCwxMjc3NjYsMTI3NzY4LDE0LDEyNzc3MCwxMjc3NzAsMTQsMTI3NzcyLDEyNzc3MiwxNCwxMjc3NzUsMTI3Nzc2LDE0LDEyNzc3OCwxMjc3NzksMTQsMTI3Nzg5LDEyNzc5MSwxNCwxMjc3OTQsMTI3Nzk1LDE0LDEyNzc5OCwxMjc3OTgsMTQsMTI3ODE5LDEyNzgxOSwxNCwxMjc4MjQsMTI3ODI0LDE0LDEyNzg2OCwxMjc4NjgsMTQsMTI3ODcwLDEyNzg3MSwxNCwxMjc4OTIsMTI3ODkzLDE0LDEyNzg5NiwxMjc4OTYsMTQsMTI3OTAwLDEyNzkwMSwxNCwxMjc5MDQsMTI3OTQwLDE0LDEyNzk0MiwxMjc5NDIsMTQsMTI3OTQ0LDEyNzk0NCwxNCwxMjc5NDYsMTI3OTQ2LDE0LDEyNzk1MSwxMjc5NTUsMTQsMTI3OTY4LDEyNzk3MSwxNCwxMjc5NzMsMTI3OTg0LDE0LDEyNzk4NywxMjc5ODcsMTQsMTI3OTg5LDEyNzk4OSwxNCwxMjc5OTEsMTI3OTkxLDE0LDEyNzk5NSwxMjc5OTksNSwxMjgwMDgsMTI4MDA4LDE0LDEyODAxMiwxMjgwMTQsMTQsMTI4MDE3LDEyODAxOCwxNCwxMjgwMjAsMTI4MDIwLDE0LDEyODAyMiwxMjgwMjIsMTQsMTI4MDQyLDEyODA0MiwxNCwxMjgwNjMsMTI4MDYzLDE0LDEyODA2NSwxMjgwNjUsMTQsMTI4MTAxLDEyODEwMSwxNCwxMjgxMDgsMTI4MTA5LDE0LDEyODE3MywxMjgxNzMsMTQsMTI4MTgyLDEyODE4MywxNCwxMjgyMzYsMTI4MjM3LDE0LDEyODIzOSwxMjgyMzksMTQsMTI4MjQ1LDEyODI0NSwxNCwxMjgyNDgsMTI4MjQ4LDE0LDEyODI1MywxMjgyNTMsMTQsMTI4MjU1LDEyODI1OCwxNCwxMjgyNjAsMTI4MjYzLDE0LDEyODI2NSwxMjgyNjUsMTQsMTI4Mjc3LDEyODI3NywxNCwxMjgzMDAsMTI4MzAxLDE0LDEyODMyNiwxMjgzMjgsMTQsMTI4MzMxLDEyODMzNCwxNCwxMjgzMzYsMTI4MzQ3LDE0LDEyODM2MCwxMjgzNjYsMTQsMTI4MzY5LDEyODM3MCwxNCwxMjgzNzgsMTI4Mzc4LDE0LDEyODM5MSwxMjgzOTEsMTQsMTI4Mzk0LDEyODM5NywxNCwxMjg0MDAsMTI4NDAwLDE0LDEyODQwNSwxMjg0MDYsMTQsMTI4NDIwLDEyODQyMCwxNCwxMjg0MjIsMTI4NDIzLDE0LDEyODQyNSwxMjg0MzIsMTQsMTI4NDM1LDEyODQ0MywxNCwxMjg0NDUsMTI4NDQ5LDE0LDEyODQ1MywxMjg0NjQsMTQsMTI4NDY4LDEyODQ3NSwxNCwxMjg0NzksMTI4NDgwLDE0LDEyODQ4MiwxMjg0ODIsMTQsMTI4NDg0LDEyODQ4NywxNCwxMjg0ODksMTI4NDk0LDE0LDEyODQ5NiwxMjg0OTgsMTQsMTI4NTAwLDEyODUwNSwxNCwxMjg1MDcsMTI4NTExLDE0LDEyODUxMywxMjg1MTgsMTQsMTI4NTIxLDEyODUyNSwxNCwxMjg1MjcsMTI4NTI3LDE0LDEyODUyOSwxMjg1MjksMTQsMTI4NTMzLDEyODUzMywxNCwxMjg1MzUsMTI4NTM1LDE0LDEyODUzNywxMjg1MzcsMTRdJyk7XG59XG4vLyNlbmRyZWdpb25cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG9mZnNldCBhZnRlciBwZXJmb3JtaW5nIGEgbGVmdCBkZWxldGUgb24gdGhlIGdpdmVuIHN0cmluZyxcbiAqIHdoaWxlIGNvbnNpZGVyaW5nIHVuaWNvZGUgZ3JhcGhlbWUvZW1vamkgcnVsZXMuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExlZnREZWxldGVPZmZzZXQob2Zmc2V0LCBzdHIpIHtcbiAgICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gZGVsZXRlIGVtb2ppIHBhcnQuXG4gICAgY29uc3QgZW1vamlPZmZzZXQgPSBnZXRPZmZzZXRCZWZvcmVMYXN0RW1vamlDb21wb25lbnQob2Zmc2V0LCBzdHIpO1xuICAgIGlmIChlbW9qaU9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBlbW9qaU9mZnNldDtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCBqdXN0IHNraXAgYSBzaW5nbGUgY29kZSBwb2ludC5cbiAgICBjb25zdCBpdGVyYXRvciA9IG5ldyBDb2RlUG9pbnRJdGVyYXRvcihzdHIsIG9mZnNldCk7XG4gICAgaXRlcmF0b3IucHJldkNvZGVQb2ludCgpO1xuICAgIHJldHVybiBpdGVyYXRvci5vZmZzZXQ7XG59XG5mdW5jdGlvbiBnZXRPZmZzZXRCZWZvcmVMYXN0RW1vamlDb21wb25lbnQoaW5pdGlhbE9mZnNldCwgc3RyKSB7XG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHI1MS90cjUxLTE0Lmh0bWwjRUJORl9hbmRfUmVnZXggZm9yIHRoZVxuICAgIC8vIHN0cnVjdHVyZSBvZiBlbW9qaXMuXG4gICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgQ29kZVBvaW50SXRlcmF0b3Ioc3RyLCBpbml0aWFsT2Zmc2V0KTtcbiAgICBsZXQgY29kZVBvaW50ID0gaXRlcmF0b3IucHJldkNvZGVQb2ludCgpO1xuICAgIC8vIFNraXAgbW9kaWZpZXJzXG4gICAgd2hpbGUgKChpc0Vtb2ppTW9kaWZpZXIoY29kZVBvaW50KSB8fCBjb2RlUG9pbnQgPT09IDY1MDM5IC8qIENvZGVQb2ludC5lbW9qaVZhcmlhbnRTZWxlY3RvciAqLyB8fCBjb2RlUG9pbnQgPT09IDg0MTkgLyogQ29kZVBvaW50LmVuY2xvc2luZ0tleUNhcCAqLykpIHtcbiAgICAgICAgaWYgKGl0ZXJhdG9yLm9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gQ2Fubm90IHNraXAgbW9kaWZpZXIsIG5vIHByZWNlZGluZyBlbW9qaSBiYXNlLlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb2RlUG9pbnQgPSBpdGVyYXRvci5wcmV2Q29kZVBvaW50KCk7XG4gICAgfVxuICAgIC8vIEV4cGVjdCBiYXNlIGVtb2ppXG4gICAgaWYgKCFpc0Vtb2ppSW1wcmVjaXNlKGNvZGVQb2ludCkpIHtcbiAgICAgICAgLy8gVW5leHBlY3RlZCBjb2RlIHBvaW50LCBub3QgYSB2YWxpZCBlbW9qaS5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IHJlc3VsdE9mZnNldCA9IGl0ZXJhdG9yLm9mZnNldDtcbiAgICBpZiAocmVzdWx0T2Zmc2V0ID4gMCkge1xuICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIFpXSiBjb2RlIHBvaW50cyB0aGF0IGNvbWJpbmUgbXVsdGlwbGUgZW1vamlzLlxuICAgICAgICAvLyBJbiB0aGVvcnksIHdlIHNob3VsZCBjaGVjayBpZiB0aGF0IFpXSiBhY3R1YWxseSBjb21iaW5lcyBtdWx0aXBsZSBlbW9qaXNcbiAgICAgICAgLy8gdG8gcHJldmVudCBkZWxldGluZyBaV0pzIGluIHNpdHVhdGlvbnMgd2UgZGlkbid0IGFjY291bnQgZm9yLlxuICAgICAgICBjb25zdCBvcHRpb25hbFp3akNvZGVQb2ludCA9IGl0ZXJhdG9yLnByZXZDb2RlUG9pbnQoKTtcbiAgICAgICAgaWYgKG9wdGlvbmFsWndqQ29kZVBvaW50ID09PSA4MjA1IC8qIENvZGVQb2ludC56d2ogKi8pIHtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCA9IGl0ZXJhdG9yLm9mZnNldDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xufVxuZnVuY3Rpb24gaXNFbW9qaU1vZGlmaWVyKGNvZGVQb2ludCkge1xuICAgIHJldHVybiAweDFGM0ZCIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRjNGRjtcbn1cbmV4cG9ydCBjb25zdCBub0JyZWFrV2hpdGVzcGFjZSA9ICdcXHhhMCc7XG5leHBvcnQgY2xhc3MgQW1iaWd1b3VzQ2hhcmFjdGVycyB7XG4gICAgc3RhdGljIGdldEluc3RhbmNlKGxvY2FsZXMpIHtcbiAgICAgICAgcmV0dXJuIEFtYmlndW91c0NoYXJhY3RlcnMuY2FjaGUuZ2V0KEFycmF5LmZyb20obG9jYWxlcykpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0TG9jYWxlcygpIHtcbiAgICAgICAgcmV0dXJuIEFtYmlndW91c0NoYXJhY3RlcnMuX2xvY2FsZXMudmFsdWU7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGNvbmZ1c2FibGVEaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMuY29uZnVzYWJsZURpY3Rpb25hcnkgPSBjb25mdXNhYmxlRGljdGlvbmFyeTtcbiAgICB9XG4gICAgaXNBbWJpZ3VvdXMoY29kZVBvaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5Lmhhcyhjb2RlUG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBub24gYmFzaWMgQVNDSUkgY29kZSBwb2ludCB0aGF0IHRoZSBnaXZlbiBjb2RlIHBvaW50IGNhbiBiZSBjb25mdXNlZCxcbiAgICAgKiBvciB1bmRlZmluZWQgaWYgc3VjaCBjb2RlIHBvaW50IGRvZXMgbm90ZSBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRQcmltYXJ5Q29uZnVzYWJsZShjb2RlUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZnVzYWJsZURpY3Rpb25hcnkuZ2V0KGNvZGVQb2ludCk7XG4gICAgfVxuICAgIGdldENvbmZ1c2FibGVDb2RlUG9pbnRzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNldCh0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5LmtleXMoKSk7XG4gICAgfVxufVxuX2EgPSBBbWJpZ3VvdXNDaGFyYWN0ZXJzO1xuQW1iaWd1b3VzQ2hhcmFjdGVycy5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhID0gbmV3IExhenkoKCkgPT4ge1xuICAgIC8vIEdlbmVyYXRlZCB1c2luZyBodHRwczovL2dpdGh1Yi5jb20vaGVkaWV0L3ZzY29kZS11bmljb2RlLWRhdGFcbiAgICAvLyBTdG9yZWQgYXMga2V5MSwgdmFsdWUxLCBrZXkyLCB2YWx1ZTIsIC4uLlxuICAgIHJldHVybiBKU09OLnBhcnNlKCd7XFxcIl9jb21tb25cXFwiOls4MjMyLDMyLDgyMzMsMzIsNTc2MCwzMiw4MTkyLDMyLDgxOTMsMzIsODE5NCwzMiw4MTk1LDMyLDgxOTYsMzIsODE5NywzMiw4MTk4LDMyLDgyMDAsMzIsODIwMSwzMiw4MjAyLDMyLDgyODcsMzIsODE5OSwzMiw4MjM5LDMyLDIwNDIsOTUsNjUxMDEsOTUsNjUxMDIsOTUsNjUxMDMsOTUsODIwOCw0NSw4MjA5LDQ1LDgyMTAsNDUsNjUxMTIsNDUsMTc0OCw0NSw4MjU5LDQ1LDcyNyw0NSw4NzIyLDQ1LDEwMTM0LDQ1LDExNDUwLDQ1LDE1NDksNDQsMTY0Myw0NCw4MjE4LDQ0LDE4NCw0NCw0MjIzMyw0NCw4OTQsNTksMjMwNyw1OCwyNjkxLDU4LDE0MTcsNTgsMTc5NSw1OCwxNzk2LDU4LDU4NjgsNTgsNjUwNzIsNTgsNjE0Nyw1OCw2MTUzLDU4LDgyODIsNTgsMTQ3NSw1OCw3NjAsNTgsNDI4ODksNTgsODc1OCw1OCw3MjAsNTgsNDIyMzcsNTgsNDUxLDMzLDExNjAxLDMzLDY2MCw2Myw1NzcsNjMsMjQyOSw2Myw1MDM4LDYzLDQyNzMxLDYzLDExOTE0OSw0Niw4MjI4LDQ2LDE3OTMsNDYsMTc5NCw0Niw0MjUxMCw0Niw2ODE3Niw0NiwxNjMyLDQ2LDE3NzYsNDYsNDIyMzIsNDYsMTM3Myw5Niw2NTI4Nyw5Niw4MjE5LDk2LDgyNDIsOTYsMTM3MCw5NiwxNTIzLDk2LDgxNzUsOTYsNjUzNDQsOTYsOTAwLDk2LDgxODksOTYsODEyNSw5Niw4MTI3LDk2LDgxOTAsOTYsNjk3LDk2LDg4NCw5Niw3MTIsOTYsNzE0LDk2LDcxNSw5Niw3NTYsOTYsNjk5LDk2LDcwMSw5Niw3MDAsOTYsNzAyLDk2LDQyODkyLDk2LDE0OTcsOTYsMjAzNiw5NiwyMDM3LDk2LDUxOTQsOTYsNTgzNiw5Niw5NDAzMyw5Niw5NDAzNCw5Niw2NTMzOSw5MSwxMDA4OCw0MCwxMDA5OCw0MCwxMjMwOCw0MCw2NDgzMCw0MCw2NTM0MSw5MywxMDA4OSw0MSwxMDA5OSw0MSwxMjMwOSw0MSw2NDgzMSw0MSwxMDEwMCwxMjMsMTE5MDYwLDEyMywxMDEwMSwxMjUsNjUzNDIsOTQsODI3MCw0MiwxNjQ1LDQyLDg3MjcsNDIsNjYzMzUsNDIsNTk0MSw0Nyw4MjU3LDQ3LDg3MjUsNDcsODI2MCw0Nyw5NTg1LDQ3LDEwMTg3LDQ3LDEwNzQ0LDQ3LDExOTM1NCw0NywxMjc1NSw0NywxMjMzOSw0NywxMTQ2Miw0NywyMDAzMSw0NywxMjAzNSw0Nyw2NTM0MCw5Miw2NTEyOCw5Miw4NzI2LDkyLDEwMTg5LDkyLDEwNzQxLDkyLDEwNzQ1LDkyLDExOTMxMSw5MiwxMTkzNTUsOTIsMTI3NTYsOTIsMjAwMjIsOTIsMTIwMzQsOTIsNDI4NzIsMzgsNzA4LDk0LDcxMCw5NCw1ODY5LDQzLDEwMTMzLDQzLDY2MjAzLDQzLDgyNDksNjAsMTAwOTQsNjAsNzA2LDYwLDExOTM1MCw2MCw1MTc2LDYwLDU4MTAsNjAsNTEyMCw2MSwxMTg0MCw2MSwxMjQ0OCw2MSw0MjIzOSw2MSw4MjUwLDYyLDEwMDk1LDYyLDcwNyw2MiwxMTkzNTEsNjIsNTE3MSw2Miw5NDAxNSw2Miw4Mjc1LDEyNiw3MzIsMTI2LDgxMjgsMTI2LDg3NjQsMTI2LDY1MzcyLDEyNCw2NTI5Myw0NSwxMjA3ODQsNTAsMTIwNzk0LDUwLDEyMDgwNCw1MCwxMjA4MTQsNTAsMTIwODI0LDUwLDEzMDAzNCw1MCw0Mjg0Miw1MCw0MjMsNTAsMTAwMCw1MCw0MjU2NCw1MCw1MzExLDUwLDQyNzM1LDUwLDExOTMwMiw1MSwxMjA3ODUsNTEsMTIwNzk1LDUxLDEyMDgwNSw1MSwxMjA4MTUsNTEsMTIwODI1LDUxLDEzMDAzNSw1MSw0MjkyMyw1MSw1NDAsNTEsNDM5LDUxLDQyODU4LDUxLDExNDY4LDUxLDEyNDgsNTEsOTQwMTEsNTEsNzE4ODIsNTEsMTIwNzg2LDUyLDEyMDc5Niw1MiwxMjA4MDYsNTIsMTIwODE2LDUyLDEyMDgyNiw1MiwxMzAwMzYsNTIsNTA3MCw1Miw3MTg1NSw1MiwxMjA3ODcsNTMsMTIwNzk3LDUzLDEyMDgwNyw1MywxMjA4MTcsNTMsMTIwODI3LDUzLDEzMDAzNyw1Myw0NDQsNTMsNzE4NjcsNTMsMTIwNzg4LDU0LDEyMDc5OCw1NCwxMjA4MDgsNTQsMTIwODE4LDU0LDEyMDgyOCw1NCwxMzAwMzgsNTQsMTE0NzQsNTQsNTEwMiw1NCw3MTg5Myw1NCwxMTkzMTQsNTUsMTIwNzg5LDU1LDEyMDc5OSw1NSwxMjA4MDksNTUsMTIwODE5LDU1LDEyMDgyOSw1NSwxMzAwMzksNTUsNjY3NzAsNTUsNzE4NzgsNTUsMjgxOSw1NiwyNTM4LDU2LDI2NjYsNTYsMTI1MTMxLDU2LDEyMDc5MCw1NiwxMjA4MDAsNTYsMTIwODEwLDU2LDEyMDgyMCw1NiwxMjA4MzAsNTYsMTMwMDQwLDU2LDU0Nyw1Niw1NDYsNTYsNjYzMzAsNTYsMjY2Myw1NywyOTIwLDU3LDI1NDEsNTcsMzQzNyw1NywxMjA3OTEsNTcsMTIwODAxLDU3LDEyMDgxMSw1NywxMjA4MjEsNTcsMTIwODMxLDU3LDEzMDA0MSw1Nyw0Mjg2Miw1NywxMTQ2Niw1Nyw3MTg4NCw1Nyw3MTg1Miw1Nyw3MTg5NCw1Nyw5MDgyLDk3LDY1MzQ1LDk3LDExOTgzNCw5NywxMTk4ODYsOTcsMTE5OTM4LDk3LDExOTk5MCw5NywxMjAwNDIsOTcsMTIwMDk0LDk3LDEyMDE0Niw5NywxMjAxOTgsOTcsMTIwMjUwLDk3LDEyMDMwMiw5NywxMjAzNTQsOTcsMTIwNDA2LDk3LDEyMDQ1OCw5Nyw1OTMsOTcsOTQ1LDk3LDEyMDUxNCw5NywxMjA1NzIsOTcsMTIwNjMwLDk3LDEyMDY4OCw5NywxMjA3NDYsOTcsNjUzMTMsNjUsMTE5ODA4LDY1LDExOTg2MCw2NSwxMTk5MTIsNjUsMTE5OTY0LDY1LDEyMDAxNiw2NSwxMjAwNjgsNjUsMTIwMTIwLDY1LDEyMDE3Miw2NSwxMjAyMjQsNjUsMTIwMjc2LDY1LDEyMDMyOCw2NSwxMjAzODAsNjUsMTIwNDMyLDY1LDkxMyw2NSwxMjA0ODgsNjUsMTIwNTQ2LDY1LDEyMDYwNCw2NSwxMjA2NjIsNjUsMTIwNzIwLDY1LDUwMzQsNjUsNTU3Myw2NSw0MjIyMiw2NSw5NDAxNiw2NSw2NjIwOCw2NSwxMTk4MzUsOTgsMTE5ODg3LDk4LDExOTkzOSw5OCwxMTk5OTEsOTgsMTIwMDQzLDk4LDEyMDA5NSw5OCwxMjAxNDcsOTgsMTIwMTk5LDk4LDEyMDI1MSw5OCwxMjAzMDMsOTgsMTIwMzU1LDk4LDEyMDQwNyw5OCwxMjA0NTksOTgsMzg4LDk4LDUwNzEsOTgsNTIzNCw5OCw1NTUxLDk4LDY1MzE0LDY2LDg0OTIsNjYsMTE5ODA5LDY2LDExOTg2MSw2NiwxMTk5MTMsNjYsMTIwMDE3LDY2LDEyMDA2OSw2NiwxMjAxMjEsNjYsMTIwMTczLDY2LDEyMDIyNSw2NiwxMjAyNzcsNjYsMTIwMzI5LDY2LDEyMDM4MSw2NiwxMjA0MzMsNjYsNDI5MzIsNjYsOTE0LDY2LDEyMDQ4OSw2NiwxMjA1NDcsNjYsMTIwNjA1LDY2LDEyMDY2Myw2NiwxMjA3MjEsNjYsNTEwOCw2Niw1NjIzLDY2LDQyMTkyLDY2LDY2MTc4LDY2LDY2MjA5LDY2LDY2MzA1LDY2LDY1MzQ3LDk5LDg1NzMsOTksMTE5ODM2LDk5LDExOTg4OCw5OSwxMTk5NDAsOTksMTE5OTkyLDk5LDEyMDA0NCw5OSwxMjAwOTYsOTksMTIwMTQ4LDk5LDEyMDIwMCw5OSwxMjAyNTIsOTksMTIwMzA0LDk5LDEyMDM1Niw5OSwxMjA0MDgsOTksMTIwNDYwLDk5LDc0MjgsOTksMTAxMCw5OSwxMTQyOSw5OSw0Mzk1MSw5OSw2NjYyMSw5OSwxMjg4NDQsNjcsNzE5MjIsNjcsNzE5MTMsNjcsNjUzMTUsNjcsODU1Nyw2Nyw4NDUwLDY3LDg0OTMsNjcsMTE5ODEwLDY3LDExOTg2Miw2NywxMTk5MTQsNjcsMTE5OTY2LDY3LDEyMDAxOCw2NywxMjAxNzQsNjcsMTIwMjI2LDY3LDEyMDI3OCw2NywxMjAzMzAsNjcsMTIwMzgyLDY3LDEyMDQzNCw2NywxMDE3LDY3LDExNDI4LDY3LDUwODcsNjcsNDIyMDIsNjcsNjYyMTAsNjcsNjYzMDYsNjcsNjY1ODEsNjcsNjY4NDQsNjcsODU3NCwxMDAsODUxOCwxMDAsMTE5ODM3LDEwMCwxMTk4ODksMTAwLDExOTk0MSwxMDAsMTE5OTkzLDEwMCwxMjAwNDUsMTAwLDEyMDA5NywxMDAsMTIwMTQ5LDEwMCwxMjAyMDEsMTAwLDEyMDI1MywxMDAsMTIwMzA1LDEwMCwxMjAzNTcsMTAwLDEyMDQwOSwxMDAsMTIwNDYxLDEwMCwxMjgxLDEwMCw1MDk1LDEwMCw1MjMxLDEwMCw0MjE5NCwxMDAsODU1OCw2OCw4NTE3LDY4LDExOTgxMSw2OCwxMTk4NjMsNjgsMTE5OTE1LDY4LDExOTk2Nyw2OCwxMjAwMTksNjgsMTIwMDcxLDY4LDEyMDEyMyw2OCwxMjAxNzUsNjgsMTIwMjI3LDY4LDEyMDI3OSw2OCwxMjAzMzEsNjgsMTIwMzgzLDY4LDEyMDQzNSw2OCw1MDI0LDY4LDU1OTgsNjgsNTYxMCw2OCw0MjE5NSw2OCw4NDk0LDEwMSw2NTM0OSwxMDEsODQ5NSwxMDEsODUxOSwxMDEsMTE5ODM4LDEwMSwxMTk4OTAsMTAxLDExOTk0MiwxMDEsMTIwMDQ2LDEwMSwxMjAwOTgsMTAxLDEyMDE1MCwxMDEsMTIwMjAyLDEwMSwxMjAyNTQsMTAxLDEyMDMwNiwxMDEsMTIwMzU4LDEwMSwxMjA0MTAsMTAxLDEyMDQ2MiwxMDEsNDM4MjYsMTAxLDEyMTMsMTAxLDg5NTksNjksNjUzMTcsNjksODQ5Niw2OSwxMTk4MTIsNjksMTE5ODY0LDY5LDExOTkxNiw2OSwxMjAwMjAsNjksMTIwMDcyLDY5LDEyMDEyNCw2OSwxMjAxNzYsNjksMTIwMjI4LDY5LDEyMDI4MCw2OSwxMjAzMzIsNjksMTIwMzg0LDY5LDEyMDQzNiw2OSw5MTcsNjksMTIwNDkyLDY5LDEyMDU1MCw2OSwxMjA2MDgsNjksMTIwNjY2LDY5LDEyMDcyNCw2OSwxMTU3Nyw2OSw1MDM2LDY5LDQyMjI0LDY5LDcxODQ2LDY5LDcxODU0LDY5LDY2MTgyLDY5LDExOTgzOSwxMDIsMTE5ODkxLDEwMiwxMTk5NDMsMTAyLDExOTk5NSwxMDIsMTIwMDQ3LDEwMiwxMjAwOTksMTAyLDEyMDE1MSwxMDIsMTIwMjAzLDEwMiwxMjAyNTUsMTAyLDEyMDMwNywxMDIsMTIwMzU5LDEwMiwxMjA0MTEsMTAyLDEyMDQ2MywxMDIsNDM4MjksMTAyLDQyOTA1LDEwMiwzODMsMTAyLDc4MzcsMTAyLDE0MTIsMTAyLDExOTMxNSw3MCw4NDk3LDcwLDExOTgxMyw3MCwxMTk4NjUsNzAsMTE5OTE3LDcwLDEyMDAyMSw3MCwxMjAwNzMsNzAsMTIwMTI1LDcwLDEyMDE3Nyw3MCwxMjAyMjksNzAsMTIwMjgxLDcwLDEyMDMzMyw3MCwxMjAzODUsNzAsMTIwNDM3LDcwLDQyOTA0LDcwLDk4OCw3MCwxMjA3NzgsNzAsNTU1Niw3MCw0MjIwNSw3MCw3MTg3NCw3MCw3MTg0Miw3MCw2NjE4Myw3MCw2NjIxMyw3MCw2Njg1Myw3MCw2NTM1MSwxMDMsODQ1OCwxMDMsMTE5ODQwLDEwMywxMTk4OTIsMTAzLDExOTk0NCwxMDMsMTIwMDQ4LDEwMywxMjAxMDAsMTAzLDEyMDE1MiwxMDMsMTIwMjA0LDEwMywxMjAyNTYsMTAzLDEyMDMwOCwxMDMsMTIwMzYwLDEwMywxMjA0MTIsMTAzLDEyMDQ2NCwxMDMsNjA5LDEwMyw3NTU1LDEwMywzOTcsMTAzLDE0MDksMTAzLDExOTgxNCw3MSwxMTk4NjYsNzEsMTE5OTE4LDcxLDExOTk3MCw3MSwxMjAwMjIsNzEsMTIwMDc0LDcxLDEyMDEyNiw3MSwxMjAxNzgsNzEsMTIwMjMwLDcxLDEyMDI4Miw3MSwxMjAzMzQsNzEsMTIwMzg2LDcxLDEyMDQzOCw3MSwxMjkyLDcxLDUwNTYsNzEsNTEwNyw3MSw0MjE5OCw3MSw2NTM1MiwxMDQsODQ2MiwxMDQsMTE5ODQxLDEwNCwxMTk5NDUsMTA0LDExOTk5NywxMDQsMTIwMDQ5LDEwNCwxMjAxMDEsMTA0LDEyMDE1MywxMDQsMTIwMjA1LDEwNCwxMjAyNTcsMTA0LDEyMDMwOSwxMDQsMTIwMzYxLDEwNCwxMjA0MTMsMTA0LDEyMDQ2NSwxMDQsMTIxMSwxMDQsMTM5MiwxMDQsNTA1OCwxMDQsNjUzMjAsNzIsODQ1OSw3Miw4NDYwLDcyLDg0NjEsNzIsMTE5ODE1LDcyLDExOTg2Nyw3MiwxMTk5MTksNzIsMTIwMDIzLDcyLDEyMDE3OSw3MiwxMjAyMzEsNzIsMTIwMjgzLDcyLDEyMDMzNSw3MiwxMjAzODcsNzIsMTIwNDM5LDcyLDkxOSw3MiwxMjA0OTQsNzIsMTIwNTUyLDcyLDEyMDYxMCw3MiwxMjA2NjgsNzIsMTIwNzI2LDcyLDExNDA2LDcyLDUwNTEsNzIsNTUwMCw3Miw0MjIxNSw3Miw2NjI1NSw3Miw3MzEsMTA1LDkwNzUsMTA1LDY1MzUzLDEwNSw4NTYwLDEwNSw4NTA1LDEwNSw4NTIwLDEwNSwxMTk4NDIsMTA1LDExOTg5NCwxMDUsMTE5OTQ2LDEwNSwxMTk5OTgsMTA1LDEyMDA1MCwxMDUsMTIwMTAyLDEwNSwxMjAxNTQsMTA1LDEyMDIwNiwxMDUsMTIwMjU4LDEwNSwxMjAzMTAsMTA1LDEyMDM2MiwxMDUsMTIwNDE0LDEwNSwxMjA0NjYsMTA1LDEyMDQ4NCwxMDUsNjE4LDEwNSw2MTcsMTA1LDk1MywxMDUsODEyNiwxMDUsODkwLDEwNSwxMjA1MjIsMTA1LDEyMDU4MCwxMDUsMTIwNjM4LDEwNSwxMjA2OTYsMTA1LDEyMDc1NCwxMDUsMTExMCwxMDUsNDI1NjcsMTA1LDEyMzEsMTA1LDQzODkzLDEwNSw1MDI5LDEwNSw3MTg3NSwxMDUsNjUzNTQsMTA2LDg1MjEsMTA2LDExOTg0MywxMDYsMTE5ODk1LDEwNiwxMTk5NDcsMTA2LDExOTk5OSwxMDYsMTIwMDUxLDEwNiwxMjAxMDMsMTA2LDEyMDE1NSwxMDYsMTIwMjA3LDEwNiwxMjAyNTksMTA2LDEyMDMxMSwxMDYsMTIwMzYzLDEwNiwxMjA0MTUsMTA2LDEyMDQ2NywxMDYsMTAxMSwxMDYsMTExMiwxMDYsNjUzMjIsNzQsMTE5ODE3LDc0LDExOTg2OSw3NCwxMTk5MjEsNzQsMTE5OTczLDc0LDEyMDAyNSw3NCwxMjAwNzcsNzQsMTIwMTI5LDc0LDEyMDE4MSw3NCwxMjAyMzMsNzQsMTIwMjg1LDc0LDEyMDMzNyw3NCwxMjAzODksNzQsMTIwNDQxLDc0LDQyOTMwLDc0LDg5NSw3NCwxMDMyLDc0LDUwMzUsNzQsNTI2MSw3NCw0MjIwMSw3NCwxMTk4NDQsMTA3LDExOTg5NiwxMDcsMTE5OTQ4LDEwNywxMjAwMDAsMTA3LDEyMDA1MiwxMDcsMTIwMTA0LDEwNywxMjAxNTYsMTA3LDEyMDIwOCwxMDcsMTIwMjYwLDEwNywxMjAzMTIsMTA3LDEyMDM2NCwxMDcsMTIwNDE2LDEwNywxMjA0NjgsMTA3LDg0OTAsNzUsNjUzMjMsNzUsMTE5ODE4LDc1LDExOTg3MCw3NSwxMTk5MjIsNzUsMTE5OTc0LDc1LDEyMDAyNiw3NSwxMjAwNzgsNzUsMTIwMTMwLDc1LDEyMDE4Miw3NSwxMjAyMzQsNzUsMTIwMjg2LDc1LDEyMDMzOCw3NSwxMjAzOTAsNzUsMTIwNDQyLDc1LDkyMiw3NSwxMjA0OTcsNzUsMTIwNTU1LDc1LDEyMDYxMyw3NSwxMjA2NzEsNzUsMTIwNzI5LDc1LDExNDEyLDc1LDUwOTQsNzUsNTg0NSw3NSw0MjE5OSw3NSw2Njg0MCw3NSwxNDcyLDEwOCw4NzM5LDczLDkyMTMsNzMsNjU1MTIsNzMsMTYzMywxMDgsMTc3Nyw3Myw2NjMzNiwxMDgsMTI1MTI3LDEwOCwxMjA3ODMsNzMsMTIwNzkzLDczLDEyMDgwMyw3MywxMjA4MTMsNzMsMTIwODIzLDczLDEzMDAzMyw3Myw2NTMyMSw3Myw4NTQ0LDczLDg0NjQsNzMsODQ2NSw3MywxMTk4MTYsNzMsMTE5ODY4LDczLDExOTkyMCw3MywxMjAwMjQsNzMsMTIwMTI4LDczLDEyMDE4MCw3MywxMjAyMzIsNzMsMTIwMjg0LDczLDEyMDMzNiw3MywxMjAzODgsNzMsMTIwNDQwLDczLDY1MzU2LDEwOCw4NTcyLDczLDg0NjcsMTA4LDExOTg0NSwxMDgsMTE5ODk3LDEwOCwxMTk5NDksMTA4LDEyMDAwMSwxMDgsMTIwMDUzLDEwOCwxMjAxMDUsNzMsMTIwMTU3LDczLDEyMDIwOSw3MywxMjAyNjEsNzMsMTIwMzEzLDczLDEyMDM2NSw3MywxMjA0MTcsNzMsMTIwNDY5LDczLDQ0OCw3MywxMjA0OTYsNzMsMTIwNTU0LDczLDEyMDYxMiw3MywxMjA2NzAsNzMsMTIwNzI4LDczLDExNDEwLDczLDEwMzAsNzMsMTIxNiw3MywxNDkzLDEwOCwxNTAzLDEwOCwxNTc1LDEwOCwxMjY0NjQsMTA4LDEyNjU5MiwxMDgsNjUxNjYsMTA4LDY1MTY1LDEwOCwxOTk0LDEwOCwxMTU5OSw3Myw1ODI1LDczLDQyMjI2LDczLDkzOTkyLDczLDY2MTg2LDEyNCw2NjMxMywxMjQsMTE5MzM4LDc2LDg1NTYsNzYsODQ2Niw3NiwxMTk4MTksNzYsMTE5ODcxLDc2LDExOTkyMyw3NiwxMjAwMjcsNzYsMTIwMDc5LDc2LDEyMDEzMSw3NiwxMjAxODMsNzYsMTIwMjM1LDc2LDEyMDI4Nyw3NiwxMjAzMzksNzYsMTIwMzkxLDc2LDEyMDQ0Myw3NiwxMTQ3Miw3Niw1MDg2LDc2LDUyOTAsNzYsNDIyMDksNzYsOTM5NzQsNzYsNzE4NDMsNzYsNzE4NTgsNzYsNjY1ODcsNzYsNjY4NTQsNzYsNjUzMjUsNzcsODU1OSw3Nyw4NDk5LDc3LDExOTgyMCw3NywxMTk4NzIsNzcsMTE5OTI0LDc3LDEyMDAyOCw3NywxMjAwODAsNzcsMTIwMTMyLDc3LDEyMDE4NCw3NywxMjAyMzYsNzcsMTIwMjg4LDc3LDEyMDM0MCw3NywxMjAzOTIsNzcsMTIwNDQ0LDc3LDkyNCw3NywxMjA0OTksNzcsMTIwNTU3LDc3LDEyMDYxNSw3NywxMjA2NzMsNzcsMTIwNzMxLDc3LDEwMTgsNzcsMTE0MTYsNzcsNTA0Nyw3Nyw1NjE2LDc3LDU4NDYsNzcsNDIyMDcsNzcsNjYyMjQsNzcsNjYzMjEsNzcsMTE5ODQ3LDExMCwxMTk4OTksMTEwLDExOTk1MSwxMTAsMTIwMDAzLDExMCwxMjAwNTUsMTEwLDEyMDEwNywxMTAsMTIwMTU5LDExMCwxMjAyMTEsMTEwLDEyMDI2MywxMTAsMTIwMzE1LDExMCwxMjAzNjcsMTEwLDEyMDQxOSwxMTAsMTIwNDcxLDExMCwxNDAwLDExMCwxNDA0LDExMCw2NTMyNiw3OCw4NDY5LDc4LDExOTgyMSw3OCwxMTk4NzMsNzgsMTE5OTI1LDc4LDExOTk3Nyw3OCwxMjAwMjksNzgsMTIwMDgxLDc4LDEyMDE4NSw3OCwxMjAyMzcsNzgsMTIwMjg5LDc4LDEyMDM0MSw3OCwxMjAzOTMsNzgsMTIwNDQ1LDc4LDkyNSw3OCwxMjA1MDAsNzgsMTIwNTU4LDc4LDEyMDYxNiw3OCwxMjA2NzQsNzgsMTIwNzMyLDc4LDExNDE4LDc4LDQyMjA4LDc4LDY2ODM1LDc4LDMwNzQsMTExLDMyMDIsMTExLDMzMzAsMTExLDM0NTgsMTExLDI0MDYsMTExLDI2NjIsMTExLDI3OTAsMTExLDMwNDYsMTExLDMxNzQsMTExLDMzMDIsMTExLDM0MzAsMTExLDM2NjQsMTExLDM3OTIsMTExLDQxNjAsMTExLDE2MzcsMTExLDE3ODEsMTExLDY1MzU5LDExMSw4NTAwLDExMSwxMTk4NDgsMTExLDExOTkwMCwxMTEsMTE5OTUyLDExMSwxMjAwNTYsMTExLDEyMDEwOCwxMTEsMTIwMTYwLDExMSwxMjAyMTIsMTExLDEyMDI2NCwxMTEsMTIwMzE2LDExMSwxMjAzNjgsMTExLDEyMDQyMCwxMTEsMTIwNDcyLDExMSw3NDM5LDExMSw3NDQxLDExMSw0MzgzNywxMTEsOTU5LDExMSwxMjA1MjgsMTExLDEyMDU4NiwxMTEsMTIwNjQ0LDExMSwxMjA3MDIsMTExLDEyMDc2MCwxMTEsOTYzLDExMSwxMjA1MzIsMTExLDEyMDU5MCwxMTEsMTIwNjQ4LDExMSwxMjA3MDYsMTExLDEyMDc2NCwxMTEsMTE0MjMsMTExLDQzNTEsMTExLDE0MTMsMTExLDE1MDUsMTExLDE2MDcsMTExLDEyNjUwMCwxMTEsMTI2NTY0LDExMSwxMjY1OTYsMTExLDY1MjU5LDExMSw2NTI2MCwxMTEsNjUyNTgsMTExLDY1MjU3LDExMSwxNzI2LDExMSw2NDQyOCwxMTEsNjQ0MjksMTExLDY0NDI3LDExMSw2NDQyNiwxMTEsMTcyOSwxMTEsNjQ0MjQsMTExLDY0NDI1LDExMSw2NDQyMywxMTEsNjQ0MjIsMTExLDE3NDksMTExLDMzNjAsMTExLDQxMjUsMTExLDY2Nzk0LDExMSw3MTg4MCwxMTEsNzE4OTUsMTExLDY2NjA0LDExMSwxOTg0LDc5LDI1MzQsNzksMjkxOCw3OSwxMjI5NSw3OSw3MDg2NCw3OSw3MTkwNCw3OSwxMjA3ODIsNzksMTIwNzkyLDc5LDEyMDgwMiw3OSwxMjA4MTIsNzksMTIwODIyLDc5LDEzMDAzMiw3OSw2NTMyNyw3OSwxMTk4MjIsNzksMTE5ODc0LDc5LDExOTkyNiw3OSwxMTk5NzgsNzksMTIwMDMwLDc5LDEyMDA4Miw3OSwxMjAxMzQsNzksMTIwMTg2LDc5LDEyMDIzOCw3OSwxMjAyOTAsNzksMTIwMzQyLDc5LDEyMDM5NCw3OSwxMjA0NDYsNzksOTI3LDc5LDEyMDUwMiw3OSwxMjA1NjAsNzksMTIwNjE4LDc5LDEyMDY3Niw3OSwxMjA3MzQsNzksMTE0MjIsNzksMTM2NSw3OSwxMTYwNCw3OSw0ODE2LDc5LDI4NDgsNzksNjY3NTQsNzksNDIyMjcsNzksNzE4NjEsNzksNjYxOTQsNzksNjYyMTksNzksNjY1NjQsNzksNjY4MzgsNzksOTA3NiwxMTIsNjUzNjAsMTEyLDExOTg0OSwxMTIsMTE5OTAxLDExMiwxMTk5NTMsMTEyLDEyMDAwNSwxMTIsMTIwMDU3LDExMiwxMjAxMDksMTEyLDEyMDE2MSwxMTIsMTIwMjEzLDExMiwxMjAyNjUsMTEyLDEyMDMxNywxMTIsMTIwMzY5LDExMiwxMjA0MjEsMTEyLDEyMDQ3MywxMTIsOTYxLDExMiwxMjA1MzAsMTEyLDEyMDU0NCwxMTIsMTIwNTg4LDExMiwxMjA2MDIsMTEyLDEyMDY0NiwxMTIsMTIwNjYwLDExMiwxMjA3MDQsMTEyLDEyMDcxOCwxMTIsMTIwNzYyLDExMiwxMjA3NzYsMTEyLDExNDI3LDExMiw2NTMyOCw4MCw4NDczLDgwLDExOTgyMyw4MCwxMTk4NzUsODAsMTE5OTI3LDgwLDExOTk3OSw4MCwxMjAwMzEsODAsMTIwMDgzLDgwLDEyMDE4Nyw4MCwxMjAyMzksODAsMTIwMjkxLDgwLDEyMDM0Myw4MCwxMjAzOTUsODAsMTIwNDQ3LDgwLDkyOSw4MCwxMjA1MDQsODAsMTIwNTYyLDgwLDEyMDYyMCw4MCwxMjA2NzgsODAsMTIwNzM2LDgwLDExNDI2LDgwLDUwOTAsODAsNTIyOSw4MCw0MjE5Myw4MCw2NjE5Nyw4MCwxMTk4NTAsMTEzLDExOTkwMiwxMTMsMTE5OTU0LDExMywxMjAwMDYsMTEzLDEyMDA1OCwxMTMsMTIwMTEwLDExMywxMjAxNjIsMTEzLDEyMDIxNCwxMTMsMTIwMjY2LDExMywxMjAzMTgsMTEzLDEyMDM3MCwxMTMsMTIwNDIyLDExMywxMjA0NzQsMTEzLDEzMDcsMTEzLDEzNzksMTEzLDEzODIsMTEzLDg0NzQsODEsMTE5ODI0LDgxLDExOTg3Niw4MSwxMTk5MjgsODEsMTE5OTgwLDgxLDEyMDAzMiw4MSwxMjAwODQsODEsMTIwMTg4LDgxLDEyMDI0MCw4MSwxMjAyOTIsODEsMTIwMzQ0LDgxLDEyMDM5Niw4MSwxMjA0NDgsODEsMTE2MDUsODEsMTE5ODUxLDExNCwxMTk5MDMsMTE0LDExOTk1NSwxMTQsMTIwMDA3LDExNCwxMjAwNTksMTE0LDEyMDExMSwxMTQsMTIwMTYzLDExNCwxMjAyMTUsMTE0LDEyMDI2NywxMTQsMTIwMzE5LDExNCwxMjAzNzEsMTE0LDEyMDQyMywxMTQsMTIwNDc1LDExNCw0Mzg0NywxMTQsNDM4NDgsMTE0LDc0NjIsMTE0LDExMzk3LDExNCw0MzkwNSwxMTQsMTE5MzE4LDgyLDg0NzUsODIsODQ3Niw4Miw4NDc3LDgyLDExOTgyNSw4MiwxMTk4NzcsODIsMTE5OTI5LDgyLDEyMDAzMyw4MiwxMjAxODksODIsMTIwMjQxLDgyLDEyMDI5Myw4MiwxMjAzNDUsODIsMTIwMzk3LDgyLDEyMDQ0OSw4Miw0MjIsODIsNTAyNSw4Miw1MDc0LDgyLDY2NzQwLDgyLDU1MTEsODIsNDIyMTEsODIsOTQwMDUsODIsNjUzNjMsMTE1LDExOTg1MiwxMTUsMTE5OTA0LDExNSwxMTk5NTYsMTE1LDEyMDAwOCwxMTUsMTIwMDYwLDExNSwxMjAxMTIsMTE1LDEyMDE2NCwxMTUsMTIwMjE2LDExNSwxMjAyNjgsMTE1LDEyMDMyMCwxMTUsMTIwMzcyLDExNSwxMjA0MjQsMTE1LDEyMDQ3NiwxMTUsNDI4MDEsMTE1LDQ0NSwxMTUsMTEwOSwxMTUsNDM5NDYsMTE1LDcxODczLDExNSw2NjYzMiwxMTUsNjUzMzEsODMsMTE5ODI2LDgzLDExOTg3OCw4MywxMTk5MzAsODMsMTE5OTgyLDgzLDEyMDAzNCw4MywxMjAwODYsODMsMTIwMTM4LDgzLDEyMDE5MCw4MywxMjAyNDIsODMsMTIwMjk0LDgzLDEyMDM0Niw4MywxMjAzOTgsODMsMTIwNDUwLDgzLDEwMjksODMsMTM1OSw4Myw1MDc3LDgzLDUwODIsODMsNDIyMTAsODMsOTQwMTAsODMsNjYxOTgsODMsNjY1OTIsODMsMTE5ODUzLDExNiwxMTk5MDUsMTE2LDExOTk1NywxMTYsMTIwMDA5LDExNiwxMjAwNjEsMTE2LDEyMDExMywxMTYsMTIwMTY1LDExNiwxMjAyMTcsMTE2LDEyMDI2OSwxMTYsMTIwMzIxLDExNiwxMjAzNzMsMTE2LDEyMDQyNSwxMTYsMTIwNDc3LDExNiw4ODY4LDg0LDEwMjAxLDg0LDEyODg3Miw4NCw2NTMzMiw4NCwxMTk4MjcsODQsMTE5ODc5LDg0LDExOTkzMSw4NCwxMTk5ODMsODQsMTIwMDM1LDg0LDEyMDA4Nyw4NCwxMjAxMzksODQsMTIwMTkxLDg0LDEyMDI0Myw4NCwxMjAyOTUsODQsMTIwMzQ3LDg0LDEyMDM5OSw4NCwxMjA0NTEsODQsOTMyLDg0LDEyMDUwNyw4NCwxMjA1NjUsODQsMTIwNjIzLDg0LDEyMDY4MSw4NCwxMjA3MzksODQsMTE0MzAsODQsNTAyNiw4NCw0MjE5Niw4NCw5Mzk2Miw4NCw3MTg2OCw4NCw2NjE5OSw4NCw2NjIyNSw4NCw2NjMyNSw4NCwxMTk4NTQsMTE3LDExOTkwNiwxMTcsMTE5OTU4LDExNywxMjAwMTAsMTE3LDEyMDA2MiwxMTcsMTIwMTE0LDExNywxMjAxNjYsMTE3LDEyMDIxOCwxMTcsMTIwMjcwLDExNywxMjAzMjIsMTE3LDEyMDM3NCwxMTcsMTIwNDI2LDExNywxMjA0NzgsMTE3LDQyOTExLDExNyw3NDUyLDExNyw0Mzg1NCwxMTcsNDM4NTgsMTE3LDY1MSwxMTcsOTY1LDExNywxMjA1MzQsMTE3LDEyMDU5MiwxMTcsMTIwNjUwLDExNywxMjA3MDgsMTE3LDEyMDc2NiwxMTcsMTQwNSwxMTcsNjY4MDYsMTE3LDcxODk2LDExNyw4NzQ2LDg1LDg4OTksODUsMTE5ODI4LDg1LDExOTg4MCw4NSwxMTk5MzIsODUsMTE5OTg0LDg1LDEyMDAzNiw4NSwxMjAwODgsODUsMTIwMTQwLDg1LDEyMDE5Miw4NSwxMjAyNDQsODUsMTIwMjk2LDg1LDEyMDM0OCw4NSwxMjA0MDAsODUsMTIwNDUyLDg1LDEzNTcsODUsNDYwOCw4NSw2Njc2Niw4NSw1MTk2LDg1LDQyMjI4LDg1LDk0MDE4LDg1LDcxODY0LDg1LDg3NDQsMTE4LDg4OTcsMTE4LDY1MzY2LDExOCw4NTY0LDExOCwxMTk4NTUsMTE4LDExOTkwNywxMTgsMTE5OTU5LDExOCwxMjAwMTEsMTE4LDEyMDA2MywxMTgsMTIwMTE1LDExOCwxMjAxNjcsMTE4LDEyMDIxOSwxMTgsMTIwMjcxLDExOCwxMjAzMjMsMTE4LDEyMDM3NSwxMTgsMTIwNDI3LDExOCwxMjA0NzksMTE4LDc0NTYsMTE4LDk1NywxMTgsMTIwNTI2LDExOCwxMjA1ODQsMTE4LDEyMDY0MiwxMTgsMTIwNzAwLDExOCwxMjA3NTgsMTE4LDExNDEsMTE4LDE0OTYsMTE4LDcxNDMwLDExOCw0Mzk0NSwxMTgsNzE4NzIsMTE4LDExOTMwOSw4NiwxNjM5LDg2LDE3ODMsODYsODU0OCw4NiwxMTk4MjksODYsMTE5ODgxLDg2LDExOTkzMyw4NiwxMTk5ODUsODYsMTIwMDM3LDg2LDEyMDA4OSw4NiwxMjAxNDEsODYsMTIwMTkzLDg2LDEyMDI0NSw4NiwxMjAyOTcsODYsMTIwMzQ5LDg2LDEyMDQwMSw4NiwxMjA0NTMsODYsMTE0MCw4NiwxMTU3Niw4Niw1MDgxLDg2LDUxNjcsODYsNDI3MTksODYsNDIyMTQsODYsOTM5NjAsODYsNzE4NDAsODYsNjY4NDUsODYsNjIzLDExOSwxMTk4NTYsMTE5LDExOTkwOCwxMTksMTE5OTYwLDExOSwxMjAwMTIsMTE5LDEyMDA2NCwxMTksMTIwMTE2LDExOSwxMjAxNjgsMTE5LDEyMDIyMCwxMTksMTIwMjcyLDExOSwxMjAzMjQsMTE5LDEyMDM3NiwxMTksMTIwNDI4LDExOSwxMjA0ODAsMTE5LDc0NTcsMTE5LDExMjEsMTE5LDEzMDksMTE5LDEzNzcsMTE5LDcxNDM0LDExOSw3MTQzOCwxMTksNzE0MzksMTE5LDQzOTA3LDExOSw3MTkxOSw4Nyw3MTkxMCw4NywxMTk4MzAsODcsMTE5ODgyLDg3LDExOTkzNCw4NywxMTk5ODYsODcsMTIwMDM4LDg3LDEyMDA5MCw4NywxMjAxNDIsODcsMTIwMTk0LDg3LDEyMDI0Niw4NywxMjAyOTgsODcsMTIwMzUwLDg3LDEyMDQwMiw4NywxMjA0NTQsODcsMTMwOCw4Nyw1MDQzLDg3LDUwNzYsODcsNDIyMTgsODcsNTc0MiwxMjAsMTA1MzksMTIwLDEwNTQwLDEyMCwxMDc5OSwxMjAsNjUzNjgsMTIwLDg1NjksMTIwLDExOTg1NywxMjAsMTE5OTA5LDEyMCwxMTk5NjEsMTIwLDEyMDAxMywxMjAsMTIwMDY1LDEyMCwxMjAxMTcsMTIwLDEyMDE2OSwxMjAsMTIwMjIxLDEyMCwxMjAyNzMsMTIwLDEyMDMyNSwxMjAsMTIwMzc3LDEyMCwxMjA0MjksMTIwLDEyMDQ4MSwxMjAsNTQ0MSwxMjAsNTUwMSwxMjAsNTc0MSw4OCw5NTg3LDg4LDY2MzM4LDg4LDcxOTE2LDg4LDY1MzM2LDg4LDg1NTMsODgsMTE5ODMxLDg4LDExOTg4Myw4OCwxMTk5MzUsODgsMTE5OTg3LDg4LDEyMDAzOSw4OCwxMjAwOTEsODgsMTIwMTQzLDg4LDEyMDE5NSw4OCwxMjAyNDcsODgsMTIwMjk5LDg4LDEyMDM1MSw4OCwxMjA0MDMsODgsMTIwNDU1LDg4LDQyOTMxLDg4LDkzNSw4OCwxMjA1MTAsODgsMTIwNTY4LDg4LDEyMDYyNiw4OCwxMjA2ODQsODgsMTIwNzQyLDg4LDExNDM2LDg4LDExNjEzLDg4LDU4MTUsODgsNDIyMTksODgsNjYxOTIsODgsNjYyMjgsODgsNjYzMjcsODgsNjY4NTUsODgsNjExLDEyMSw3NTY0LDEyMSw2NTM2OSwxMjEsMTE5ODU4LDEyMSwxMTk5MTAsMTIxLDExOTk2MiwxMjEsMTIwMDE0LDEyMSwxMjAwNjYsMTIxLDEyMDExOCwxMjEsMTIwMTcwLDEyMSwxMjAyMjIsMTIxLDEyMDI3NCwxMjEsMTIwMzI2LDEyMSwxMjAzNzgsMTIxLDEyMDQzMCwxMjEsMTIwNDgyLDEyMSw2NTUsMTIxLDc5MzUsMTIxLDQzODY2LDEyMSw5NDcsMTIxLDg1MDksMTIxLDEyMDUxNiwxMjEsMTIwNTc0LDEyMSwxMjA2MzIsMTIxLDEyMDY5MCwxMjEsMTIwNzQ4LDEyMSwxMTk5LDEyMSw0MzI3LDEyMSw3MTkwMCwxMjEsNjUzMzcsODksMTE5ODMyLDg5LDExOTg4NCw4OSwxMTk5MzYsODksMTE5OTg4LDg5LDEyMDA0MCw4OSwxMjAwOTIsODksMTIwMTQ0LDg5LDEyMDE5Niw4OSwxMjAyNDgsODksMTIwMzAwLDg5LDEyMDM1Miw4OSwxMjA0MDQsODksMTIwNDU2LDg5LDkzMyw4OSw5NzgsODksMTIwNTA4LDg5LDEyMDU2Niw4OSwxMjA2MjQsODksMTIwNjgyLDg5LDEyMDc0MCw4OSwxMTQzMiw4OSwxMTk4LDg5LDUwMzMsODksNTA1Myw4OSw0MjIyMCw4OSw5NDAxOSw4OSw3MTg0NCw4OSw2NjIyNiw4OSwxMTk4NTksMTIyLDExOTkxMSwxMjIsMTE5OTYzLDEyMiwxMjAwMTUsMTIyLDEyMDA2NywxMjIsMTIwMTE5LDEyMiwxMjAxNzEsMTIyLDEyMDIyMywxMjIsMTIwMjc1LDEyMiwxMjAzMjcsMTIyLDEyMDM3OSwxMjIsMTIwNDMxLDEyMiwxMjA0ODMsMTIyLDc0NTgsMTIyLDQzOTIzLDEyMiw3MTg3NiwxMjIsNjYyOTMsOTAsNzE5MDksOTAsNjUzMzgsOTAsODQ4NCw5MCw4NDg4LDkwLDExOTgzMyw5MCwxMTk4ODUsOTAsMTE5OTM3LDkwLDExOTk4OSw5MCwxMjAwNDEsOTAsMTIwMTk3LDkwLDEyMDI0OSw5MCwxMjAzMDEsOTAsMTIwMzUzLDkwLDEyMDQwNSw5MCwxMjA0NTcsOTAsOTE4LDkwLDEyMDQ5Myw5MCwxMjA1NTEsOTAsMTIwNjA5LDkwLDEyMDY2Nyw5MCwxMjA3MjUsOTAsNTA1OSw5MCw0MjIwNCw5MCw3MTg0OSw5MCw2NTI4MiwzNCw2NTI4NCwzNiw2NTI4NSwzNyw2NTI4NiwzOCw2NTI5MCw0Miw2NTI5MSw0Myw2NTI5NCw0Niw2NTI5NSw0Nyw2NTI5Niw0OCw2NTI5Nyw0OSw2NTI5OCw1MCw2NTI5OSw1MSw2NTMwMCw1Miw2NTMwMSw1Myw2NTMwMiw1NCw2NTMwMyw1NSw2NTMwNCw1Niw2NTMwNSw1Nyw2NTMwOCw2MCw2NTMwOSw2MSw2NTMxMCw2Miw2NTMxMiw2NCw2NTMxNiw2OCw2NTMxOCw3MCw2NTMxOSw3MSw2NTMyNCw3Niw2NTMyOSw4MSw2NTMzMCw4Miw2NTMzMyw4NSw2NTMzNCw4Niw2NTMzNSw4Nyw2NTM0Myw5NSw2NTM0Niw5OCw2NTM0OCwxMDAsNjUzNTAsMTAyLDY1MzU1LDEwNyw2NTM1NywxMDksNjUzNTgsMTEwLDY1MzYxLDExMyw2NTM2MiwxMTQsNjUzNjQsMTE2LDY1MzY1LDExNyw2NTM2NywxMTksNjUzNzAsMTIyLDY1MzcxLDEyMyw2NTM3MywxMjUsMTE5ODQ2LDEwOV0sXFxcIl9kZWZhdWx0XFxcIjpbMTYwLDMyLDgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sXFxcImNzXFxcIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLFxcXCJkZVxcXCI6WzY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSxcXFwiZXNcXFwiOls4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSxcXFwiZnJcXFwiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSxcXFwiaXRcXFwiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sXFxcImphXFxcIjpbODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyOTIsNDQsNjUzMDcsNTldLFxcXCJrb1xcXCI6WzgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSxcXFwicGxcXFwiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSxcXFwicHQtQlJcXFwiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSxcXFwicXBzLXBsb2NcXFwiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSxcXFwicnVcXFwiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDMwNSwxMDUsOTIxLDczLDEwMDksMTEyLDIxNSwxMjAsNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLFxcXCJ0clxcXCI6WzE2MCwzMiw4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLFxcXCJ6aC1oYW5zXFxcIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1Mjg4LDQwLDY1Mjg5LDQxXSxcXFwiemgtaGFudFxcXCI6WzgyMTEsNDUsNjUzNzQsMTI2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTMwNyw1OV19Jyk7XG59KTtcbkFtYmlndW91c0NoYXJhY3RlcnMuY2FjaGUgPSBuZXcgTFJVQ2FjaGVkRnVuY3Rpb24oKGxvY2FsZXMpID0+IHtcbiAgICBmdW5jdGlvbiBhcnJheVRvTWFwKGFycikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KGFycltpXSwgYXJyW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWVyZ2VNYXBzKG1hcDEsIG1hcDIpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcChtYXAxKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbWFwMikge1xuICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnRlcnNlY3RNYXBzKG1hcDEsIG1hcDIpIHtcbiAgICAgICAgaWYgKCFtYXAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwMjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG1hcDEpIHtcbiAgICAgICAgICAgIGlmIChtYXAyLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gX2EuYW1iaWd1b3VzQ2hhcmFjdGVyRGF0YS52YWx1ZTtcbiAgICBsZXQgZmlsdGVyZWRMb2NhbGVzID0gbG9jYWxlcy5maWx0ZXIoKGwpID0+ICFsLnN0YXJ0c1dpdGgoJ18nKSAmJiBsIGluIGRhdGEpO1xuICAgIGlmIChmaWx0ZXJlZExvY2FsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZpbHRlcmVkTG9jYWxlcyA9IFsnX2RlZmF1bHQnXTtcbiAgICB9XG4gICAgbGV0IGxhbmd1YWdlU3BlY2lmaWNNYXAgPSB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgZmlsdGVyZWRMb2NhbGVzKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IGFycmF5VG9NYXAoZGF0YVtsb2NhbGVdKTtcbiAgICAgICAgbGFuZ3VhZ2VTcGVjaWZpY01hcCA9IGludGVyc2VjdE1hcHMobGFuZ3VhZ2VTcGVjaWZpY01hcCwgbWFwKTtcbiAgICB9XG4gICAgY29uc3QgY29tbW9uTWFwID0gYXJyYXlUb01hcChkYXRhWydfY29tbW9uJ10pO1xuICAgIGNvbnN0IG1hcCA9IG1lcmdlTWFwcyhjb21tb25NYXAsIGxhbmd1YWdlU3BlY2lmaWNNYXApO1xuICAgIHJldHVybiBuZXcgQW1iaWd1b3VzQ2hhcmFjdGVycyhtYXApO1xufSk7XG5BbWJpZ3VvdXNDaGFyYWN0ZXJzLl9sb2NhbGVzID0gbmV3IExhenkoKCkgPT4gT2JqZWN0LmtleXMoQW1iaWd1b3VzQ2hhcmFjdGVycy5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhLnZhbHVlKS5maWx0ZXIoKGspID0+ICFrLnN0YXJ0c1dpdGgoJ18nKSkpO1xuZXhwb3J0IGNsYXNzIEludmlzaWJsZUNoYXJhY3RlcnMge1xuICAgIHN0YXRpYyBnZXRSYXdEYXRhKCkge1xuICAgICAgICAvLyBHZW5lcmF0ZWQgdXNpbmcgaHR0cHM6Ly9naXRodWIuY29tL2hlZGlldC92c2NvZGUtdW5pY29kZS1kYXRhXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKCdbOSwxMCwxMSwxMiwxMywzMiwxMjcsMTYwLDE3Myw4NDcsMTU2NCw0NDQ3LDQ0NDgsNjA2OCw2MDY5LDYxNTUsNjE1Niw2MTU3LDYxNTgsNzM1NSw3MzU2LDgxOTIsODE5Myw4MTk0LDgxOTUsODE5Niw4MTk3LDgxOTgsODE5OSw4MjAwLDgyMDEsODIwMiw4MjAzLDgyMDQsODIwNSw4MjA2LDgyMDcsODIzNCw4MjM1LDgyMzYsODIzNyw4MjM4LDgyMzksODI4Nyw4Mjg4LDgyODksODI5MCw4MjkxLDgyOTIsODI5Myw4Mjk0LDgyOTUsODI5Niw4Mjk3LDgyOTgsODI5OSw4MzAwLDgzMDEsODMwMiw4MzAzLDEwMjQwLDEyMjg4LDEyNjQ0LDY1MDI0LDY1MDI1LDY1MDI2LDY1MDI3LDY1MDI4LDY1MDI5LDY1MDMwLDY1MDMxLDY1MDMyLDY1MDMzLDY1MDM0LDY1MDM1LDY1MDM2LDY1MDM3LDY1MDM4LDY1MDM5LDY1Mjc5LDY1NDQwLDY1NTIwLDY1NTIxLDY1NTIyLDY1NTIzLDY1NTI0LDY1NTI1LDY1NTI2LDY1NTI3LDY1NTI4LDY1NTMyLDc4ODQ0LDExOTE1NSwxMTkxNTYsMTE5MTU3LDExOTE1OCwxMTkxNTksMTE5MTYwLDExOTE2MSwxMTkxNjIsOTE3NTA0LDkxNzUwNSw5MTc1MDYsOTE3NTA3LDkxNzUwOCw5MTc1MDksOTE3NTEwLDkxNzUxMSw5MTc1MTIsOTE3NTEzLDkxNzUxNCw5MTc1MTUsOTE3NTE2LDkxNzUxNyw5MTc1MTgsOTE3NTE5LDkxNzUyMCw5MTc1MjEsOTE3NTIyLDkxNzUyMyw5MTc1MjQsOTE3NTI1LDkxNzUyNiw5MTc1MjcsOTE3NTI4LDkxNzUyOSw5MTc1MzAsOTE3NTMxLDkxNzUzMiw5MTc1MzMsOTE3NTM0LDkxNzUzNSw5MTc1MzYsOTE3NTM3LDkxNzUzOCw5MTc1MzksOTE3NTQwLDkxNzU0MSw5MTc1NDIsOTE3NTQzLDkxNzU0NCw5MTc1NDUsOTE3NTQ2LDkxNzU0Nyw5MTc1NDgsOTE3NTQ5LDkxNzU1MCw5MTc1NTEsOTE3NTUyLDkxNzU1Myw5MTc1NTQsOTE3NTU1LDkxNzU1Niw5MTc1NTcsOTE3NTU4LDkxNzU1OSw5MTc1NjAsOTE3NTYxLDkxNzU2Miw5MTc1NjMsOTE3NTY0LDkxNzU2NSw5MTc1NjYsOTE3NTY3LDkxNzU2OCw5MTc1NjksOTE3NTcwLDkxNzU3MSw5MTc1NzIsOTE3NTczLDkxNzU3NCw5MTc1NzUsOTE3NTc2LDkxNzU3Nyw5MTc1NzgsOTE3NTc5LDkxNzU4MCw5MTc1ODEsOTE3NTgyLDkxNzU4Myw5MTc1ODQsOTE3NTg1LDkxNzU4Niw5MTc1ODcsOTE3NTg4LDkxNzU4OSw5MTc1OTAsOTE3NTkxLDkxNzU5Miw5MTc1OTMsOTE3NTk0LDkxNzU5NSw5MTc1OTYsOTE3NTk3LDkxNzU5OCw5MTc1OTksOTE3NjAwLDkxNzYwMSw5MTc2MDIsOTE3NjAzLDkxNzYwNCw5MTc2MDUsOTE3NjA2LDkxNzYwNyw5MTc2MDgsOTE3NjA5LDkxNzYxMCw5MTc2MTEsOTE3NjEyLDkxNzYxMyw5MTc2MTQsOTE3NjE1LDkxNzYxNiw5MTc2MTcsOTE3NjE4LDkxNzYxOSw5MTc2MjAsOTE3NjIxLDkxNzYyMiw5MTc2MjMsOTE3NjI0LDkxNzYyNSw5MTc2MjYsOTE3NjI3LDkxNzYyOCw5MTc2MjksOTE3NjMwLDkxNzYzMSw5MTc3NjAsOTE3NzYxLDkxNzc2Miw5MTc3NjMsOTE3NzY0LDkxNzc2NSw5MTc3NjYsOTE3NzY3LDkxNzc2OCw5MTc3NjksOTE3NzcwLDkxNzc3MSw5MTc3NzIsOTE3NzczLDkxNzc3NCw5MTc3NzUsOTE3Nzc2LDkxNzc3Nyw5MTc3NzgsOTE3Nzc5LDkxNzc4MCw5MTc3ODEsOTE3NzgyLDkxNzc4Myw5MTc3ODQsOTE3Nzg1LDkxNzc4Niw5MTc3ODcsOTE3Nzg4LDkxNzc4OSw5MTc3OTAsOTE3NzkxLDkxNzc5Miw5MTc3OTMsOTE3Nzk0LDkxNzc5NSw5MTc3OTYsOTE3Nzk3LDkxNzc5OCw5MTc3OTksOTE3ODAwLDkxNzgwMSw5MTc4MDIsOTE3ODAzLDkxNzgwNCw5MTc4MDUsOTE3ODA2LDkxNzgwNyw5MTc4MDgsOTE3ODA5LDkxNzgxMCw5MTc4MTEsOTE3ODEyLDkxNzgxMyw5MTc4MTQsOTE3ODE1LDkxNzgxNiw5MTc4MTcsOTE3ODE4LDkxNzgxOSw5MTc4MjAsOTE3ODIxLDkxNzgyMiw5MTc4MjMsOTE3ODI0LDkxNzgyNSw5MTc4MjYsOTE3ODI3LDkxNzgyOCw5MTc4MjksOTE3ODMwLDkxNzgzMSw5MTc4MzIsOTE3ODMzLDkxNzgzNCw5MTc4MzUsOTE3ODM2LDkxNzgzNyw5MTc4MzgsOTE3ODM5LDkxNzg0MCw5MTc4NDEsOTE3ODQyLDkxNzg0Myw5MTc4NDQsOTE3ODQ1LDkxNzg0Niw5MTc4NDcsOTE3ODQ4LDkxNzg0OSw5MTc4NTAsOTE3ODUxLDkxNzg1Miw5MTc4NTMsOTE3ODU0LDkxNzg1NSw5MTc4NTYsOTE3ODU3LDkxNzg1OCw5MTc4NTksOTE3ODYwLDkxNzg2MSw5MTc4NjIsOTE3ODYzLDkxNzg2NCw5MTc4NjUsOTE3ODY2LDkxNzg2Nyw5MTc4NjgsOTE3ODY5LDkxNzg3MCw5MTc4NzEsOTE3ODcyLDkxNzg3Myw5MTc4NzQsOTE3ODc1LDkxNzg3Niw5MTc4NzcsOTE3ODc4LDkxNzg3OSw5MTc4ODAsOTE3ODgxLDkxNzg4Miw5MTc4ODMsOTE3ODg0LDkxNzg4NSw5MTc4ODYsOTE3ODg3LDkxNzg4OCw5MTc4ODksOTE3ODkwLDkxNzg5MSw5MTc4OTIsOTE3ODkzLDkxNzg5NCw5MTc4OTUsOTE3ODk2LDkxNzg5Nyw5MTc4OTgsOTE3ODk5LDkxNzkwMCw5MTc5MDEsOTE3OTAyLDkxNzkwMyw5MTc5MDQsOTE3OTA1LDkxNzkwNiw5MTc5MDcsOTE3OTA4LDkxNzkwOSw5MTc5MTAsOTE3OTExLDkxNzkxMiw5MTc5MTMsOTE3OTE0LDkxNzkxNSw5MTc5MTYsOTE3OTE3LDkxNzkxOCw5MTc5MTksOTE3OTIwLDkxNzkyMSw5MTc5MjIsOTE3OTIzLDkxNzkyNCw5MTc5MjUsOTE3OTI2LDkxNzkyNyw5MTc5MjgsOTE3OTI5LDkxNzkzMCw5MTc5MzEsOTE3OTMyLDkxNzkzMyw5MTc5MzQsOTE3OTM1LDkxNzkzNiw5MTc5MzcsOTE3OTM4LDkxNzkzOSw5MTc5NDAsOTE3OTQxLDkxNzk0Miw5MTc5NDMsOTE3OTQ0LDkxNzk0NSw5MTc5NDYsOTE3OTQ3LDkxNzk0OCw5MTc5NDksOTE3OTUwLDkxNzk1MSw5MTc5NTIsOTE3OTUzLDkxNzk1NCw5MTc5NTUsOTE3OTU2LDkxNzk1Nyw5MTc5NTgsOTE3OTU5LDkxNzk2MCw5MTc5NjEsOTE3OTYyLDkxNzk2Myw5MTc5NjQsOTE3OTY1LDkxNzk2Niw5MTc5NjcsOTE3OTY4LDkxNzk2OSw5MTc5NzAsOTE3OTcxLDkxNzk3Miw5MTc5NzMsOTE3OTc0LDkxNzk3NSw5MTc5NzYsOTE3OTc3LDkxNzk3OCw5MTc5NzksOTE3OTgwLDkxNzk4MSw5MTc5ODIsOTE3OTgzLDkxNzk4NCw5MTc5ODUsOTE3OTg2LDkxNzk4Nyw5MTc5ODgsOTE3OTg5LDkxNzk5MCw5MTc5OTEsOTE3OTkyLDkxNzk5Myw5MTc5OTQsOTE3OTk1LDkxNzk5Niw5MTc5OTcsOTE3OTk4LDkxNzk5OV0nKTtcbiAgICB9XG4gICAgc3RhdGljIGdldERhdGEoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IG5ldyBTZXQoSW52aXNpYmxlQ2hhcmFjdGVycy5nZXRSYXdEYXRhKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICBzdGF0aWMgaXNJbnZpc2libGVDaGFyYWN0ZXIoY29kZVBvaW50KSB7XG4gICAgICAgIHJldHVybiBJbnZpc2libGVDaGFyYWN0ZXJzLmdldERhdGEoKS5oYXMoY29kZVBvaW50KTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBjb2RlUG9pbnRzKCkge1xuICAgICAgICByZXR1cm4gSW52aXNpYmxlQ2hhcmFjdGVycy5nZXREYXRhKCk7XG4gICAgfVxufVxuSW52aXNpYmxlQ2hhcmFjdGVycy5fZGF0YSA9IHVuZGVmaW5lZDtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgdHJhbnNmb3JtRXJyb3JGb3JTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi4vZXJyb3JzLmpzJztcbmltcG9ydCB7IEVtaXR0ZXIgfSBmcm9tICcuLi9ldmVudC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnLi4vbGlmZWN5Y2xlLmpzJztcbmltcG9ydCB7IGdldEFsbE1ldGhvZE5hbWVzIH0gZnJvbSAnLi4vb2JqZWN0cy5qcyc7XG5pbXBvcnQgeyBpc1dlYiB9IGZyb20gJy4uL3BsYXRmb3JtLmpzJztcbmltcG9ydCAqIGFzIHN0cmluZ3MgZnJvbSAnLi4vc3RyaW5ncy5qcyc7XG5jb25zdCBJTklUSUFMSVpFID0gJyRpbml0aWFsaXplJztcbmxldCB3ZWJXb3JrZXJXYXJuaW5nTG9nZ2VkID0gZmFsc2U7XG5leHBvcnQgZnVuY3Rpb24gbG9nT25jZVdlYldvcmtlcldhcm5pbmcoZXJyKSB7XG4gICAgaWYgKCFpc1dlYikge1xuICAgICAgICAvLyBydW5uaW5nIHRlc3RzXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF3ZWJXb3JrZXJXYXJuaW5nTG9nZ2VkKSB7XG4gICAgICAgIHdlYldvcmtlcldhcm5pbmdMb2dnZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBjcmVhdGUgd2ViIHdvcmtlcihzKS4gRmFsbGluZyBiYWNrIHRvIGxvYWRpbmcgd2ViIHdvcmtlciBjb2RlIGluIG1haW4gdGhyZWFkLCB3aGljaCBtaWdodCBjYXVzZSBVSSBmcmVlemVzLiBQbGVhc2Ugc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvbW9uYWNvLWVkaXRvciNmYXEnKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGVyci5tZXNzYWdlKTtcbn1cbmNsYXNzIFJlcXVlc3RNZXNzYWdlIHtcbiAgICBjb25zdHJ1Y3Rvcih2c1dvcmtlciwgcmVxLCBtZXRob2QsIGFyZ3MpIHtcbiAgICAgICAgdGhpcy52c1dvcmtlciA9IHZzV29ya2VyO1xuICAgICAgICB0aGlzLnJlcSA9IHJlcTtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgICAgIHRoaXMudHlwZSA9IDAgLyogTWVzc2FnZVR5cGUuUmVxdWVzdCAqLztcbiAgICB9XG59XG5jbGFzcyBSZXBseU1lc3NhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHZzV29ya2VyLCBzZXEsIHJlcywgZXJyKSB7XG4gICAgICAgIHRoaXMudnNXb3JrZXIgPSB2c1dvcmtlcjtcbiAgICAgICAgdGhpcy5zZXEgPSBzZXE7XG4gICAgICAgIHRoaXMucmVzID0gcmVzO1xuICAgICAgICB0aGlzLmVyciA9IGVycjtcbiAgICAgICAgdGhpcy50eXBlID0gMSAvKiBNZXNzYWdlVHlwZS5SZXBseSAqLztcbiAgICB9XG59XG5jbGFzcyBTdWJzY3JpYmVFdmVudE1lc3NhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHZzV29ya2VyLCByZXEsIGV2ZW50TmFtZSwgYXJnKSB7XG4gICAgICAgIHRoaXMudnNXb3JrZXIgPSB2c1dvcmtlcjtcbiAgICAgICAgdGhpcy5yZXEgPSByZXE7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICB0aGlzLmFyZyA9IGFyZztcbiAgICAgICAgdGhpcy50eXBlID0gMiAvKiBNZXNzYWdlVHlwZS5TdWJzY3JpYmVFdmVudCAqLztcbiAgICB9XG59XG5jbGFzcyBFdmVudE1lc3NhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHZzV29ya2VyLCByZXEsIGV2ZW50KSB7XG4gICAgICAgIHRoaXMudnNXb3JrZXIgPSB2c1dvcmtlcjtcbiAgICAgICAgdGhpcy5yZXEgPSByZXE7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy50eXBlID0gMyAvKiBNZXNzYWdlVHlwZS5FdmVudCAqLztcbiAgICB9XG59XG5jbGFzcyBVbnN1YnNjcmliZUV2ZW50TWVzc2FnZSB7XG4gICAgY29uc3RydWN0b3IodnNXb3JrZXIsIHJlcSkge1xuICAgICAgICB0aGlzLnZzV29ya2VyID0gdnNXb3JrZXI7XG4gICAgICAgIHRoaXMucmVxID0gcmVxO1xuICAgICAgICB0aGlzLnR5cGUgPSA0IC8qIE1lc3NhZ2VUeXBlLlVuc3Vic2NyaWJlRXZlbnQgKi87XG4gICAgfVxufVxuY2xhc3MgU2ltcGxlV29ya2VyUHJvdG9jb2wge1xuICAgIGNvbnN0cnVjdG9yKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fd29ya2VySWQgPSAtMTtcbiAgICAgICAgdGhpcy5faGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgIHRoaXMuX2xhc3RTZW50UmVxID0gMDtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlcGxpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9wZW5kaW5nRW1pdHRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudHMgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIHNldFdvcmtlcklkKHdvcmtlcklkKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlcklkID0gd29ya2VySWQ7XG4gICAgfVxuICAgIHNlbmRNZXNzYWdlKG1ldGhvZCwgYXJncykge1xuICAgICAgICBjb25zdCByZXEgPSBTdHJpbmcoKyt0aGlzLl9sYXN0U2VudFJlcSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVwbGllc1tyZXFdID0ge1xuICAgICAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgcmVqZWN0OiByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9zZW5kKG5ldyBSZXF1ZXN0TWVzc2FnZSh0aGlzLl93b3JrZXJJZCwgcmVxLCBtZXRob2QsIGFyZ3MpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxpc3RlbihldmVudE5hbWUsIGFyZykge1xuICAgICAgICBsZXQgcmVxID0gbnVsbDtcbiAgICAgICAgY29uc3QgZW1pdHRlciA9IG5ldyBFbWl0dGVyKHtcbiAgICAgICAgICAgIG9uV2lsbEFkZEZpcnN0TGlzdGVuZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXEgPSBTdHJpbmcoKyt0aGlzLl9sYXN0U2VudFJlcSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLnNldChyZXEsIGVtaXR0ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbmQobmV3IFN1YnNjcmliZUV2ZW50TWVzc2FnZSh0aGlzLl93b3JrZXJJZCwgcmVxLCBldmVudE5hbWUsIGFyZykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmRlbGV0ZShyZXEpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbmQobmV3IFVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKHRoaXMuX3dvcmtlcklkLCByZXEpKTtcbiAgICAgICAgICAgICAgICByZXEgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UgfHwgIW1lc3NhZ2UudnNXb3JrZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fd29ya2VySWQgIT09IC0xICYmIG1lc3NhZ2UudnNXb3JrZXIgIT09IHRoaXMuX3dvcmtlcklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFuZGxlTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gICAgX2hhbmRsZU1lc3NhZ2UobXNnKSB7XG4gICAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBNZXNzYWdlVHlwZS5SZXBseSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlUmVwbHlNZXNzYWdlKG1zZyk7XG4gICAgICAgICAgICBjYXNlIDAgLyogTWVzc2FnZVR5cGUuUmVxdWVzdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlUmVxdWVzdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNZXNzYWdlVHlwZS5TdWJzY3JpYmVFdmVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlU3Vic2NyaWJlRXZlbnRNZXNzYWdlKG1zZyk7XG4gICAgICAgICAgICBjYXNlIDMgLyogTWVzc2FnZVR5cGUuRXZlbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUV2ZW50TWVzc2FnZShtc2cpO1xuICAgICAgICAgICAgY2FzZSA0IC8qIE1lc3NhZ2VUeXBlLlVuc3Vic2NyaWJlRXZlbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZVJlcGx5TWVzc2FnZShyZXBseU1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9wZW5kaW5nUmVwbGllc1tyZXBseU1lc3NhZ2Uuc2VxXSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdHb3QgcmVwbHkgdG8gdW5rbm93biBzZXEnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXBseSA9IHRoaXMuX3BlbmRpbmdSZXBsaWVzW3JlcGx5TWVzc2FnZS5zZXFdO1xuICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ1JlcGxpZXNbcmVwbHlNZXNzYWdlLnNlcV07XG4gICAgICAgIGlmIChyZXBseU1lc3NhZ2UuZXJyKSB7XG4gICAgICAgICAgICBsZXQgZXJyID0gcmVwbHlNZXNzYWdlLmVycjtcbiAgICAgICAgICAgIGlmIChyZXBseU1lc3NhZ2UuZXJyLiRpc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgZXJyLm5hbWUgPSByZXBseU1lc3NhZ2UuZXJyLm5hbWU7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSByZXBseU1lc3NhZ2UuZXJyLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgZXJyLnN0YWNrID0gcmVwbHlNZXNzYWdlLmVyci5zdGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcGx5LnJlamVjdChlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcGx5LnJlc29sdmUocmVwbHlNZXNzYWdlLnJlcyk7XG4gICAgfVxuICAgIF9oYW5kbGVSZXF1ZXN0TWVzc2FnZShyZXF1ZXN0TWVzc2FnZSkge1xuICAgICAgICBjb25zdCByZXEgPSByZXF1ZXN0TWVzc2FnZS5yZXE7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2hhbmRsZXIuaGFuZGxlTWVzc2FnZShyZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHJlcXVlc3RNZXNzYWdlLmFyZ3MpO1xuICAgICAgICByZXN1bHQudGhlbigocikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2VuZChuZXcgUmVwbHlNZXNzYWdlKHRoaXMuX3dvcmtlcklkLCByZXEsIHIsIHVuZGVmaW5lZCkpO1xuICAgICAgICB9LCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuZGV0YWlsIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBMb2FkaW5nIGVycm9ycyBoYXZlIGEgZGV0YWlsIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIHRoZSBhY3R1YWwgZXJyb3JcbiAgICAgICAgICAgICAgICBlLmRldGFpbCA9IHRyYW5zZm9ybUVycm9yRm9yU2VyaWFsaXphdGlvbihlLmRldGFpbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zZW5kKG5ldyBSZXBseU1lc3NhZ2UodGhpcy5fd29ya2VySWQsIHJlcSwgdW5kZWZpbmVkLCB0cmFuc2Zvcm1FcnJvckZvclNlcmlhbGl6YXRpb24oZSkpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9oYW5kbGVTdWJzY3JpYmVFdmVudE1lc3NhZ2UobXNnKSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IG1zZy5yZXE7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB0aGlzLl9oYW5kbGVyLmhhbmRsZUV2ZW50KG1zZy5ldmVudE5hbWUsIG1zZy5hcmcpKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2VuZChuZXcgRXZlbnRNZXNzYWdlKHRoaXMuX3dvcmtlcklkLCByZXEsIGV2ZW50KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRzLnNldChyZXEsIGRpc3Bvc2FibGUpO1xuICAgIH1cbiAgICBfaGFuZGxlRXZlbnRNZXNzYWdlKG1zZykge1xuICAgICAgICBpZiAoIXRoaXMuX3BlbmRpbmdFbWl0dGVycy5oYXMobXNnLnJlcSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignR290IGV2ZW50IGZvciB1bmtub3duIHJlcScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdFbWl0dGVycy5nZXQobXNnLnJlcSkuZmlyZShtc2cuZXZlbnQpO1xuICAgIH1cbiAgICBfaGFuZGxlVW5zdWJzY3JpYmVFdmVudE1lc3NhZ2UobXNnKSB7XG4gICAgICAgIGlmICghdGhpcy5fcGVuZGluZ0V2ZW50cy5oYXMobXNnLnJlcSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignR290IHVuc3Vic2NyaWJlIGZvciB1bmtub3duIHJlcScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudHMuZ2V0KG1zZy5yZXEpLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50cy5kZWxldGUobXNnLnJlcSk7XG4gICAgfVxuICAgIF9zZW5kKG1zZykge1xuICAgICAgICBjb25zdCB0cmFuc2ZlciA9IFtdO1xuICAgICAgICBpZiAobXNnLnR5cGUgPT09IDAgLyogTWVzc2FnZVR5cGUuUmVxdWVzdCAqLykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtc2cuYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnc1tpXSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyLnB1c2gobXNnLmFyZ3NbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtc2cudHlwZSA9PT0gMSAvKiBNZXNzYWdlVHlwZS5SZXBseSAqLykge1xuICAgICAgICAgICAgaWYgKG1zZy5yZXMgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRyYW5zZmVyLnB1c2gobXNnLnJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFuZGxlci5zZW5kTWVzc2FnZShtc2csIHRyYW5zZmVyKTtcbiAgICB9XG59XG4vKipcbiAqIE1haW4gdGhyZWFkIHNpZGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbXBsZVdvcmtlckNsaWVudCBleHRlbmRzIERpc3Bvc2FibGUge1xuICAgIGNvbnN0cnVjdG9yKHdvcmtlckZhY3RvcnksIG1vZHVsZUlkLCBob3N0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGxldCBsYXp5UHJveHlSZWplY3QgPSBudWxsO1xuICAgICAgICB0aGlzLl93b3JrZXIgPSB0aGlzLl9yZWdpc3Rlcih3b3JrZXJGYWN0b3J5LmNyZWF0ZSgndnMvYmFzZS9jb21tb24vd29ya2VyL3NpbXBsZVdvcmtlcicsIChtc2cpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sLmhhbmRsZU1lc3NhZ2UobXNnKTtcbiAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgLy8gaW4gRmlyZWZveCwgd2ViIHdvcmtlcnMgZmFpbCBsYXppbHkgOihcbiAgICAgICAgICAgIC8vIHdlIHdpbGwgcmVqZWN0IHRoZSBwcm94eVxuICAgICAgICAgICAgbGF6eVByb3h5UmVqZWN0ID09PSBudWxsIHx8IGxhenlQcm94eVJlamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF6eVByb3h5UmVqZWN0KGVycik7XG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5fcHJvdG9jb2wgPSBuZXcgU2ltcGxlV29ya2VyUHJvdG9jb2woe1xuICAgICAgICAgICAgc2VuZE1lc3NhZ2U6IChtc2csIHRyYW5zZmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKG1zZywgdHJhbnNmZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2U6IChtZXRob2QsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhvc3RbbWV0aG9kXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdNaXNzaW5nIG1ldGhvZCAnICsgbWV0aG9kICsgJyBvbiBtYWluIHRocmVhZCBob3N0LicpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShob3N0W21ldGhvZF0uYXBwbHkoaG9zdCwgYXJncykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZUV2ZW50OiAoZXZlbnROYW1lLCBhcmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJc0R5bmFtaWNFdmVudChldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gaG9zdFtldmVudE5hbWVdLmNhbGwoaG9zdCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGR5bmFtaWMgZXZlbnQgJHtldmVudE5hbWV9IG9uIG1haW4gdGhyZWFkIGhvc3QuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJc0V2ZW50KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBob3N0W2V2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBldmVudCAke2V2ZW50TmFtZX0gb24gbWFpbiB0aHJlYWQgaG9zdC5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWFsZm9ybWVkIGV2ZW50IG5hbWUgJHtldmVudE5hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9wcm90b2NvbC5zZXRXb3JrZXJJZCh0aGlzLl93b3JrZXIuZ2V0SWQoKSk7XG4gICAgICAgIC8vIEdhdGhlciBsb2FkZXIgY29uZmlndXJhdGlvblxuICAgICAgICBsZXQgbG9hZGVyQ29uZmlndXJhdGlvbiA9IG51bGw7XG4gICAgICAgIGNvbnN0IGdsb2JhbFJlcXVpcmUgPSBnbG9iYWxUaGlzLnJlcXVpcmU7XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsUmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdsb2JhbFJlcXVpcmUuZ2V0Q29uZmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgTW9uYWNvIEFNRCBMb2FkZXJcbiAgICAgICAgICAgIGxvYWRlckNvbmZpZ3VyYXRpb24gPSBnbG9iYWxSZXF1aXJlLmdldENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLnJlcXVpcmVqcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHJlcXVpcmVqc1xuICAgICAgICAgICAgbG9hZGVyQ29uZmlndXJhdGlvbiA9IGdsb2JhbFRoaXMucmVxdWlyZWpzLnMuY29udGV4dHMuXy5jb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG9zdE1ldGhvZHMgPSBnZXRBbGxNZXRob2ROYW1lcyhob3N0KTtcbiAgICAgICAgLy8gU2VuZCBpbml0aWFsaXplIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5fb25Nb2R1bGVMb2FkZWQgPSB0aGlzLl9wcm90b2NvbC5zZW5kTWVzc2FnZShJTklUSUFMSVpFLCBbXG4gICAgICAgICAgICB0aGlzLl93b3JrZXIuZ2V0SWQoKSxcbiAgICAgICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobG9hZGVyQ29uZmlndXJhdGlvbikpLFxuICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICBob3N0TWV0aG9kcyxcbiAgICAgICAgXSk7XG4gICAgICAgIC8vIENyZWF0ZSBwcm94eSB0byBsb2FkZWQgY29kZVxuICAgICAgICBjb25zdCBwcm94eU1ldGhvZFJlcXVlc3QgPSAobWV0aG9kLCBhcmdzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChtZXRob2QsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwcm94eUxpc3RlbiA9IChldmVudE5hbWUsIGFyZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sLmxpc3RlbihldmVudE5hbWUsIGFyZyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2xhenlQcm94eSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxhenlQcm94eVJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgIHRoaXMuX29uTW9kdWxlTG9hZGVkLnRoZW4oKGF2YWlsYWJsZU1ldGhvZHMpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNyZWF0ZVByb3h5T2JqZWN0KGF2YWlsYWJsZU1ldGhvZHMsIHByb3h5TWV0aG9kUmVxdWVzdCwgcHJveHlMaXN0ZW4pKTtcbiAgICAgICAgICAgIH0sIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoJ1dvcmtlciBmYWlsZWQgdG8gbG9hZCAnICsgbW9kdWxlSWQsIGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRQcm94eU9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhenlQcm94eTtcbiAgICB9XG4gICAgX3JlcXVlc3QobWV0aG9kLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vbk1vZHVsZUxvYWRlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm90b2NvbC5zZW5kTWVzc2FnZShtZXRob2QsIGFyZ3MpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfb25FcnJvcihtZXNzYWdlLCBlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBjb25zb2xlLmluZm8oZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHByb3BlcnR5SXNFdmVudChuYW1lKSB7XG4gICAgLy8gQXNzdW1lIGEgcHJvcGVydHkgaXMgYW4gZXZlbnQgaWYgaXQgaGFzIGEgZm9ybSBvZiBcIm9uU29tZXRoaW5nXCJcbiAgICByZXR1cm4gbmFtZVswXSA9PT0gJ28nICYmIG5hbWVbMV0gPT09ICduJyAmJiBzdHJpbmdzLmlzVXBwZXJBc2NpaUxldHRlcihuYW1lLmNoYXJDb2RlQXQoMikpO1xufVxuZnVuY3Rpb24gcHJvcGVydHlJc0R5bmFtaWNFdmVudChuYW1lKSB7XG4gICAgLy8gQXNzdW1lIGEgcHJvcGVydHkgaXMgYSBkeW5hbWljIGV2ZW50IChhIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gZXZlbnQpIGlmIGl0IGhhcyBhIGZvcm0gb2YgXCJvbkR5bmFtaWNTb21ldGhpbmdcIlxuICAgIHJldHVybiAvXm9uRHluYW1pYy8udGVzdChuYW1lKSAmJiBzdHJpbmdzLmlzVXBwZXJBc2NpaUxldHRlcihuYW1lLmNoYXJDb2RlQXQoOSkpO1xufVxuZnVuY3Rpb24gY3JlYXRlUHJveHlPYmplY3QobWV0aG9kTmFtZXMsIGludm9rZSwgcHJveHlMaXN0ZW4pIHtcbiAgICBjb25zdCBjcmVhdGVQcm94eU1ldGhvZCA9IChtZXRob2QpID0+IHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZShtZXRob2QsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgY3JlYXRlUHJveHlEeW5hbWljRXZlbnQgPSAoZXZlbnROYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJveHlMaXN0ZW4oZXZlbnROYW1lLCBhcmcpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBtZXRob2ROYW1lIG9mIG1ldGhvZE5hbWVzKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eUlzRHluYW1pY0V2ZW50KG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgICByZXN1bHRbbWV0aG9kTmFtZV0gPSBjcmVhdGVQcm94eUR5bmFtaWNFdmVudChtZXRob2ROYW1lKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUlzRXZlbnQobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFttZXRob2ROYW1lXSA9IHByb3h5TGlzdGVuKG1ldGhvZE5hbWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbbWV0aG9kTmFtZV0gPSBjcmVhdGVQcm94eU1ldGhvZChtZXRob2ROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogV29ya2VyIHNpZGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbXBsZVdvcmtlclNlcnZlciB7XG4gICAgY29uc3RydWN0b3IocG9zdE1lc3NhZ2UsIHJlcXVlc3RIYW5kbGVyRmFjdG9yeSkge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3RvcnkgPSByZXF1ZXN0SGFuZGxlckZhY3Rvcnk7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcHJvdG9jb2wgPSBuZXcgU2ltcGxlV29ya2VyUHJvdG9jb2woe1xuICAgICAgICAgICAgc2VuZE1lc3NhZ2U6IChtc2csIHRyYW5zZmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UobXNnLCB0cmFuc2Zlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFuZGxlTWVzc2FnZTogKG1ldGhvZCwgYXJncykgPT4gdGhpcy5faGFuZGxlTWVzc2FnZShtZXRob2QsIGFyZ3MpLFxuICAgICAgICAgICAgaGFuZGxlRXZlbnQ6IChldmVudE5hbWUsIGFyZykgPT4gdGhpcy5faGFuZGxlRXZlbnQoZXZlbnROYW1lLCBhcmcpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvbm1lc3NhZ2UobXNnKSB7XG4gICAgICAgIHRoaXMuX3Byb3RvY29sLmhhbmRsZU1lc3NhZ2UobXNnKTtcbiAgICB9XG4gICAgX2hhbmRsZU1lc3NhZ2UobWV0aG9kLCBhcmdzKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IElOSVRJQUxJWkUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9yZXF1ZXN0SGFuZGxlciB8fCB0eXBlb2YgdGhpcy5fcmVxdWVzdEhhbmRsZXJbbWV0aG9kXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTWlzc2luZyByZXF1ZXN0SGFuZGxlciBvciBtZXRob2Q6ICcgKyBtZXRob2QpKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9yZXF1ZXN0SGFuZGxlclttZXRob2RdLmFwcGx5KHRoaXMuX3JlcXVlc3RIYW5kbGVyLCBhcmdzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlRXZlbnQoZXZlbnROYW1lLCBhcmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHJlcXVlc3RIYW5kbGVyYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5SXNEeW5hbWljRXZlbnQoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLl9yZXF1ZXN0SGFuZGxlcltldmVudE5hbWVdLmNhbGwodGhpcy5fcmVxdWVzdEhhbmRsZXIsIGFyZyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGR5bmFtaWMgZXZlbnQgJHtldmVudE5hbWV9IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlJc0V2ZW50KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5fcmVxdWVzdEhhbmRsZXJbZXZlbnROYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZXZlbnQgJHtldmVudE5hbWV9IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hbGZvcm1lZCBldmVudCBuYW1lICR7ZXZlbnROYW1lfWApO1xuICAgIH1cbiAgICBpbml0aWFsaXplKHdvcmtlcklkLCBsb2FkZXJDb25maWcsIG1vZHVsZUlkLCBob3N0TWV0aG9kcykge1xuICAgICAgICB0aGlzLl9wcm90b2NvbC5zZXRXb3JrZXJJZCh3b3JrZXJJZCk7XG4gICAgICAgIGNvbnN0IHByb3h5TWV0aG9kUmVxdWVzdCA9IChtZXRob2QsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm90b2NvbC5zZW5kTWVzc2FnZShtZXRob2QsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwcm94eUxpc3RlbiA9IChldmVudE5hbWUsIGFyZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sLmxpc3RlbihldmVudE5hbWUsIGFyZyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhvc3RQcm94eSA9IGNyZWF0ZVByb3h5T2JqZWN0KGhvc3RNZXRob2RzLCBwcm94eU1ldGhvZFJlcXVlc3QsIHByb3h5TGlzdGVuKTtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeSkge1xuICAgICAgICAgICAgLy8gc3RhdGljIHJlcXVlc3QgaGFuZGxlclxuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdEhhbmRsZXIgPSB0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3RvcnkoaG9zdFByb3h5KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZ2V0QWxsTWV0aG9kTmFtZXModGhpcy5fcmVxdWVzdEhhbmRsZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgJ2Jhc2VVcmwnLCBoYW5kbGluZyBpdCBpcyBiZXlvbmQgc2NvcGUgZm9yIG5vd1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsb2FkZXJDb25maWcuYmFzZVVybCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbG9hZGVyQ29uZmlnWydiYXNlVXJsJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlckNvbmZpZy5wYXRocyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlckNvbmZpZy5wYXRocy52cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvYWRlckNvbmZpZy5wYXRoc1sndnMnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlckNvbmZpZy50cnVzdGVkVHlwZXNQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSwgaXQgaGFzIGJlZW4gZGVzdHJveWVkIGR1cmluZyBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICBkZWxldGUgbG9hZGVyQ29uZmlnWyd0cnVzdGVkVHlwZXNQb2xpY3knXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgaW4gYSB3ZWIgd29ya2VyLCBlbmFibGUgY2F0Y2hpbmcgZXJyb3JzXG4gICAgICAgICAgICBsb2FkZXJDb25maWcuY2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlcXVpcmUuY29uZmlnKGxvYWRlckNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgZ2xvYmFsIHJlcXVpcmUgdG8gYmUgc3VyZSB0byBnZXQgdGhlIGdsb2JhbCBjb25maWdcbiAgICAgICAgICAgIC8vIEVTTS1jb21tZW50LWJlZ2luXG4gICAgICAgICAgICAvLyBcdFx0XHRjb25zdCByZXEgPSAoZ2xvYmFsVGhpcy5yZXF1aXJlIHx8IHJlcXVpcmUpO1xuICAgICAgICAgICAgLy8gRVNNLWNvbW1lbnQtZW5kXG4gICAgICAgICAgICAvLyBFU00tdW5jb21tZW50LWJlZ2luXG4gICAgICAgICAgICBjb25zdCByZXEgPSBnbG9iYWxUaGlzLnJlcXVpcmU7XG4gICAgICAgICAgICAvLyBFU00tdW5jb21tZW50LWVuZFxuICAgICAgICAgICAgcmVxKFttb2R1bGVJZF0sIChtb2R1bGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0SGFuZGxlciA9IG1vZHVsZS5jcmVhdGUoaG9zdFByb3h5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3JlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYE5vIFJlcXVlc3RIYW5kbGVyIWApKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGdldEFsbE1ldGhvZE5hbWVzKHRoaXMuX3JlcXVlc3RIYW5kbGVyKSk7XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKipcbiAqIENhbGxlZCBvbiB0aGUgd29ya2VyIHNpZGVcbiAqIEBza2lwTWFuZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUocG9zdE1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbmV3IFNpbXBsZVdvcmtlclNlcnZlcihwb3N0TWVzc2FnZSwgbnVsbCk7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8qKlxuICogUmVwcmVzZW50cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc2VxdWVuY2VzLlxuICovXG5leHBvcnQgY2xhc3MgRGlmZkNoYW5nZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBEaWZmQ2hhbmdlIHdpdGggdGhlIGdpdmVuIHNlcXVlbmNlIGluZm9ybWF0aW9uXG4gICAgICogYW5kIGNvbnRlbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxMZW5ndGgsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkTGVuZ3RoKSB7XG4gICAgICAgIC8vRGVidWcuQXNzZXJ0KG9yaWdpbmFsTGVuZ3RoID4gMCB8fCBtb2RpZmllZExlbmd0aCA+IDAsIFwib3JpZ2luYWxMZW5ndGggYW5kIG1vZGlmaWVkTGVuZ3RoIGNhbm5vdCBib3RoIGJlIDw9IDBcIik7XG4gICAgICAgIHRoaXMub3JpZ2luYWxTdGFydCA9IG9yaWdpbmFsU3RhcnQ7XG4gICAgICAgIHRoaXMub3JpZ2luYWxMZW5ndGggPSBvcmlnaW5hbExlbmd0aDtcbiAgICAgICAgdGhpcy5tb2RpZmllZFN0YXJ0ID0gbW9kaWZpZWRTdGFydDtcbiAgICAgICAgdGhpcy5tb2RpZmllZExlbmd0aCA9IG1vZGlmaWVkTGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIHBvaW50IChleGNsdXNpdmUpIG9mIHRoZSBjaGFuZ2UgaW4gdGhlIG9yaWdpbmFsIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIGdldE9yaWdpbmFsRW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFN0YXJ0ICsgdGhpcy5vcmlnaW5hbExlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBwb2ludCAoZXhjbHVzaXZlKSBvZiB0aGUgY2hhbmdlIGluIHRoZSBtb2RpZmllZCBzZXF1ZW5jZS5cbiAgICAgKi9cbiAgICBnZXRNb2RpZmllZEVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kaWZpZWRTdGFydCArIHRoaXMubW9kaWZpZWRMZW5ndGg7XG4gICAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgKiBhcyBzdHJpbmdzIGZyb20gJy4vc3RyaW5ncy5qcyc7XG4vKipcbiAqIFJldHVybiBhIGhhc2ggdmFsdWUgZm9yIGFuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2gob2JqKSB7XG4gICAgcmV0dXJuIGRvSGFzaChvYmosIDApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRvSGFzaChvYmosIGhhc2hWYWwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBvYmopIHtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVySGFzaCgzNDksIGhhc2hWYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5SGFzaChvYmosIGhhc2hWYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdEhhc2gob2JqLCBoYXNoVmFsKTtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdIYXNoKG9iaiwgaGFzaFZhbCk7XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgcmV0dXJuIGJvb2xlYW5IYXNoKG9iaiwgaGFzaFZhbCk7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVySGFzaChvYmosIGhhc2hWYWwpO1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgcmV0dXJuIG51bWJlckhhc2goOTM3LCBoYXNoVmFsKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudW1iZXJIYXNoKDYxNywgaGFzaFZhbCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckhhc2godmFsLCBpbml0aWFsSGFzaFZhbCkge1xuICAgIHJldHVybiAoKChpbml0aWFsSGFzaFZhbCA8PCA1KSAtIGluaXRpYWxIYXNoVmFsKSArIHZhbCkgfCAwOyAvLyBoYXNoVmFsICogMzEgKyBjaCwga2VlcCBhcyBpbnQzMlxufVxuZnVuY3Rpb24gYm9vbGVhbkhhc2goYiwgaW5pdGlhbEhhc2hWYWwpIHtcbiAgICByZXR1cm4gbnVtYmVySGFzaChiID8gNDMzIDogODYzLCBpbml0aWFsSGFzaFZhbCk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nSGFzaChzLCBoYXNoVmFsKSB7XG4gICAgaGFzaFZhbCA9IG51bWJlckhhc2goMTQ5NDE3LCBoYXNoVmFsKTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBoYXNoVmFsID0gbnVtYmVySGFzaChzLmNoYXJDb2RlQXQoaSksIGhhc2hWYWwpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzaFZhbDtcbn1cbmZ1bmN0aW9uIGFycmF5SGFzaChhcnIsIGluaXRpYWxIYXNoVmFsKSB7XG4gICAgaW5pdGlhbEhhc2hWYWwgPSBudW1iZXJIYXNoKDEwNDU3OSwgaW5pdGlhbEhhc2hWYWwpO1xuICAgIHJldHVybiBhcnIucmVkdWNlKChoYXNoVmFsLCBpdGVtKSA9PiBkb0hhc2goaXRlbSwgaGFzaFZhbCksIGluaXRpYWxIYXNoVmFsKTtcbn1cbmZ1bmN0aW9uIG9iamVjdEhhc2gob2JqLCBpbml0aWFsSGFzaFZhbCkge1xuICAgIGluaXRpYWxIYXNoVmFsID0gbnVtYmVySGFzaCgxODEzODcsIGluaXRpYWxIYXNoVmFsKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkucmVkdWNlKChoYXNoVmFsLCBrZXkpID0+IHtcbiAgICAgICAgaGFzaFZhbCA9IHN0cmluZ0hhc2goa2V5LCBoYXNoVmFsKTtcbiAgICAgICAgcmV0dXJuIGRvSGFzaChvYmpba2V5XSwgaGFzaFZhbCk7XG4gICAgfSwgaW5pdGlhbEhhc2hWYWwpO1xufVxuZnVuY3Rpb24gbGVmdFJvdGF0ZSh2YWx1ZSwgYml0cywgdG90YWxCaXRzID0gMzIpIHtcbiAgICAvLyBkZWx0YSArIGJpdHMgPSB0b3RhbEJpdHNcbiAgICBjb25zdCBkZWx0YSA9IHRvdGFsQml0cyAtIGJpdHM7XG4gICAgLy8gQWxsIG9uZXMsIGV4cGVjdCBgZGVsdGFgIHplcm9zIGFsaWduZWQgdG8gdGhlIHJpZ2h0XG4gICAgY29uc3QgbWFzayA9IH4oKDEgPDwgZGVsdGEpIC0gMSk7XG4gICAgLy8gSm9pbiAodmFsdWUgbGVmdC1zaGlmdGVkIGBiaXRzYCBiaXRzKSB3aXRoIChtYXNrZWQgdmFsdWUgcmlnaHQtc2hpZnRlZCBgZGVsdGFgIGJpdHMpXG4gICAgcmV0dXJuICgodmFsdWUgPDwgYml0cykgfCAoKG1hc2sgJiB2YWx1ZSkgPj4+IGRlbHRhKSkgPj4+IDA7XG59XG5mdW5jdGlvbiBmaWxsKGRlc3QsIGluZGV4ID0gMCwgY291bnQgPSBkZXN0LmJ5dGVMZW5ndGgsIHZhbHVlID0gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICBkZXN0W2luZGV4ICsgaV0gPSB2YWx1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBsZWZ0UGFkKHZhbHVlLCBsZW5ndGgsIGNoYXIgPSAnMCcpIHtcbiAgICB3aGlsZSAodmFsdWUubGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gY2hhciArIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9IZXhTdHJpbmcoYnVmZmVyT3JWYWx1ZSwgYml0c2l6ZSA9IDMyKSB7XG4gICAgaWYgKGJ1ZmZlck9yVmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShidWZmZXJPclZhbHVlKSkubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiBsZWZ0UGFkKChidWZmZXJPclZhbHVlID4+PiAwKS50b1N0cmluZygxNiksIGJpdHNpemUgLyA0KTtcbn1cbi8qKlxuICogQSBTSEExIGltcGxlbWVudGF0aW9uIHRoYXQgd29ya3Mgd2l0aCBzdHJpbmdzIGFuZCBkb2VzIG5vdCBhbGxvY2F0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1NIQTEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9oMCA9IDB4Njc0NTIzMDE7XG4gICAgICAgIHRoaXMuX2gxID0gMHhFRkNEQUI4OTtcbiAgICAgICAgdGhpcy5faDIgPSAweDk4QkFEQ0ZFO1xuICAgICAgICB0aGlzLl9oMyA9IDB4MTAzMjU0NzY7XG4gICAgICAgIHRoaXMuX2g0ID0gMHhDM0QyRTFGMDtcbiAgICAgICAgdGhpcy5fYnVmZiA9IG5ldyBVaW50OEFycmF5KDY0IC8qIFNIQTFDb25zdGFudC5CTE9DS19TSVpFICovICsgMyAvKiB0byBmaXQgYW55IHV0Zi04ICovKTtcbiAgICAgICAgdGhpcy5fYnVmZkRWID0gbmV3IERhdGFWaWV3KHRoaXMuX2J1ZmYuYnVmZmVyKTtcbiAgICAgICAgdGhpcy5fYnVmZkxlbiA9IDA7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuID0gMDtcbiAgICAgICAgdGhpcy5fbGVmdG92ZXJIaWdoU3Vycm9nYXRlID0gMDtcbiAgICAgICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdXBkYXRlKHN0cikge1xuICAgICAgICBjb25zdCBzdHJMZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICBpZiAoc3RyTGVuID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZiA9IHRoaXMuX2J1ZmY7XG4gICAgICAgIGxldCBidWZmTGVuID0gdGhpcy5fYnVmZkxlbjtcbiAgICAgICAgbGV0IGxlZnRvdmVySGlnaFN1cnJvZ2F0ZSA9IHRoaXMuX2xlZnRvdmVySGlnaFN1cnJvZ2F0ZTtcbiAgICAgICAgbGV0IGNoYXJDb2RlO1xuICAgICAgICBsZXQgb2Zmc2V0O1xuICAgICAgICBpZiAobGVmdG92ZXJIaWdoU3Vycm9nYXRlICE9PSAwKSB7XG4gICAgICAgICAgICBjaGFyQ29kZSA9IGxlZnRvdmVySGlnaFN1cnJvZ2F0ZTtcbiAgICAgICAgICAgIG9mZnNldCA9IC0xO1xuICAgICAgICAgICAgbGVmdG92ZXJIaWdoU3Vycm9nYXRlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgY29kZVBvaW50ID0gY2hhckNvZGU7XG4gICAgICAgICAgICBpZiAoc3RyaW5ncy5pc0hpZ2hTdXJyb2dhdGUoY2hhckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDEgPCBzdHJMZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dENoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmdzLmlzTG93U3Vycm9nYXRlKG5leHRDaGFyQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID0gc3RyaW5ncy5jb21wdXRlQ29kZVBvaW50KGNoYXJDb2RlLCBuZXh0Q2hhckNvZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWxsZWdhbCA9PiB1bmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID0gNjU1MzMgLyogU0hBMUNvbnN0YW50LlVOSUNPREVfUkVQTEFDRU1FTlQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIGlzIGEgc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgICAgICAgICAgICAgbGVmdG92ZXJIaWdoU3Vycm9nYXRlID0gY2hhckNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmluZ3MuaXNMb3dTdXJyb2dhdGUoY2hhckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWxsZWdhbCA9PiB1bmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IDY1NTMzIC8qIFNIQTFDb25zdGFudC5VTklDT0RFX1JFUExBQ0VNRU5UICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZkxlbiA9IHRoaXMuX3B1c2goYnVmZiwgYnVmZkxlbiwgY29kZVBvaW50KTtcbiAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IHN0ckxlbikge1xuICAgICAgICAgICAgICAgIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQob2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2J1ZmZMZW4gPSBidWZmTGVuO1xuICAgICAgICB0aGlzLl9sZWZ0b3ZlckhpZ2hTdXJyb2dhdGUgPSBsZWZ0b3ZlckhpZ2hTdXJyb2dhdGU7XG4gICAgfVxuICAgIF9wdXNoKGJ1ZmYsIGJ1ZmZMZW4sIGNvZGVQb2ludCkge1xuICAgICAgICBpZiAoY29kZVBvaW50IDwgMHgwMDgwKSB7XG4gICAgICAgICAgICBidWZmW2J1ZmZMZW4rK10gPSBjb2RlUG9pbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgwODAwKSB7XG4gICAgICAgICAgICBidWZmW2J1ZmZMZW4rK10gPSAwYjExMDAwMDAwIHwgKChjb2RlUG9pbnQgJiAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMDAwMDAwKSA+Pj4gNik7XG4gICAgICAgICAgICBidWZmW2J1ZmZMZW4rK10gPSAwYjEwMDAwMDAwIHwgKChjb2RlUG9pbnQgJiAwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExKSA+Pj4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgYnVmZltidWZmTGVuKytdID0gMGIxMTEwMDAwMCB8ICgoY29kZVBvaW50ICYgMGIwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMCkgPj4+IDEyKTtcbiAgICAgICAgICAgIGJ1ZmZbYnVmZkxlbisrXSA9IDBiMTAwMDAwMDAgfCAoKGNvZGVQb2ludCAmIDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEwMDAwMDApID4+PiA2KTtcbiAgICAgICAgICAgIGJ1ZmZbYnVmZkxlbisrXSA9IDBiMTAwMDAwMDAgfCAoKGNvZGVQb2ludCAmIDBiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEpID4+PiAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZbYnVmZkxlbisrXSA9IDBiMTExMTAwMDAgfCAoKGNvZGVQb2ludCAmIDBiMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDApID4+PiAxOCk7XG4gICAgICAgICAgICBidWZmW2J1ZmZMZW4rK10gPSAwYjEwMDAwMDAwIHwgKChjb2RlUG9pbnQgJiAwYjAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwMDAwMDAwKSA+Pj4gMTIpO1xuICAgICAgICAgICAgYnVmZltidWZmTGVuKytdID0gMGIxMDAwMDAwMCB8ICgoY29kZVBvaW50ICYgMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMCkgPj4+IDYpO1xuICAgICAgICAgICAgYnVmZltidWZmTGVuKytdID0gMGIxMDAwMDAwMCB8ICgoY29kZVBvaW50ICYgMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMSkgPj4+IDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmTGVuID49IDY0IC8qIFNIQTFDb25zdGFudC5CTE9DS19TSVpFICovKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGVwKCk7XG4gICAgICAgICAgICBidWZmTGVuIC09IDY0IC8qIFNIQTFDb25zdGFudC5CTE9DS19TSVpFICovO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW4gKz0gNjQgLyogU0hBMUNvbnN0YW50LkJMT0NLX1NJWkUgKi87XG4gICAgICAgICAgICAvLyB0YWtlIGxhc3QgMyBpbiBjYXNlIG9mIFVURjggb3ZlcmZsb3dcbiAgICAgICAgICAgIGJ1ZmZbMF0gPSBidWZmWzY0IC8qIFNIQTFDb25zdGFudC5CTE9DS19TSVpFICovICsgMF07XG4gICAgICAgICAgICBidWZmWzFdID0gYnVmZls2NCAvKiBTSEExQ29uc3RhbnQuQkxPQ0tfU0laRSAqLyArIDFdO1xuICAgICAgICAgICAgYnVmZlsyXSA9IGJ1ZmZbNjQgLyogU0hBMUNvbnN0YW50LkJMT0NLX1NJWkUgKi8gKyAyXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZkxlbjtcbiAgICB9XG4gICAgZGlnZXN0KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGVmdG92ZXJIaWdoU3Vycm9nYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gaWxsZWdhbCA9PiB1bmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRvdmVySGlnaFN1cnJvZ2F0ZSA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5fYnVmZkxlbiA9IHRoaXMuX3B1c2godGhpcy5fYnVmZiwgdGhpcy5fYnVmZkxlbiwgNjU1MzMgLyogU0hBMUNvbnN0YW50LlVOSUNPREVfUkVQTEFDRU1FTlQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW4gKz0gdGhpcy5fYnVmZkxlbjtcbiAgICAgICAgICAgIHRoaXMuX3dyYXBVcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0hleFN0cmluZyh0aGlzLl9oMCkgKyB0b0hleFN0cmluZyh0aGlzLl9oMSkgKyB0b0hleFN0cmluZyh0aGlzLl9oMikgKyB0b0hleFN0cmluZyh0aGlzLl9oMykgKyB0b0hleFN0cmluZyh0aGlzLl9oNCk7XG4gICAgfVxuICAgIF93cmFwVXAoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZbdGhpcy5fYnVmZkxlbisrXSA9IDB4ODA7XG4gICAgICAgIGZpbGwodGhpcy5fYnVmZiwgdGhpcy5fYnVmZkxlbik7XG4gICAgICAgIGlmICh0aGlzLl9idWZmTGVuID4gNTYpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0ZXAoKTtcbiAgICAgICAgICAgIGZpbGwodGhpcy5fYnVmZik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcyB3aWxsIGZpdCBiZWNhdXNlIHRoZSBtYW50aXNzYSBjYW4gY292ZXIgdXAgdG8gNTIgYml0c1xuICAgICAgICBjb25zdCBtbCA9IDggKiB0aGlzLl90b3RhbExlbjtcbiAgICAgICAgdGhpcy5fYnVmZkRWLnNldFVpbnQzMig1NiwgTWF0aC5mbG9vcihtbCAvIDQyOTQ5NjcyOTYpLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2J1ZmZEVi5zZXRVaW50MzIoNjAsIG1sICUgNDI5NDk2NzI5NiwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9zdGVwKCk7XG4gICAgfVxuICAgIF9zdGVwKCkge1xuICAgICAgICBjb25zdCBiaWdCbG9jazMyID0gU3RyaW5nU0hBMS5fYmlnQmxvY2szMjtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2J1ZmZEVjtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA2NCAvKiAxNio0ICovOyBqICs9IDQpIHtcbiAgICAgICAgICAgIGJpZ0Jsb2NrMzIuc2V0VWludDMyKGosIGRhdGEuZ2V0VWludDMyKGosIGZhbHNlKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSA2NDsgaiA8IDMyMCAvKiA4MCo0ICovOyBqICs9IDQpIHtcbiAgICAgICAgICAgIGJpZ0Jsb2NrMzIuc2V0VWludDMyKGosIGxlZnRSb3RhdGUoKGJpZ0Jsb2NrMzIuZ2V0VWludDMyKGogLSAxMiwgZmFsc2UpIF4gYmlnQmxvY2szMi5nZXRVaW50MzIoaiAtIDMyLCBmYWxzZSkgXiBiaWdCbG9jazMyLmdldFVpbnQzMihqIC0gNTYsIGZhbHNlKSBeIGJpZ0Jsb2NrMzIuZ2V0VWludDMyKGogLSA2NCwgZmFsc2UpKSwgMSksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYSA9IHRoaXMuX2gwO1xuICAgICAgICBsZXQgYiA9IHRoaXMuX2gxO1xuICAgICAgICBsZXQgYyA9IHRoaXMuX2gyO1xuICAgICAgICBsZXQgZCA9IHRoaXMuX2gzO1xuICAgICAgICBsZXQgZSA9IHRoaXMuX2g0O1xuICAgICAgICBsZXQgZiwgaztcbiAgICAgICAgbGV0IHRlbXA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODA7IGorKykge1xuICAgICAgICAgICAgaWYgKGogPCAyMCkge1xuICAgICAgICAgICAgICAgIGYgPSAoYiAmIGMpIHwgKCh+YikgJiBkKTtcbiAgICAgICAgICAgICAgICBrID0gMHg1QTgyNzk5OTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGogPCA0MCkge1xuICAgICAgICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICAgICAgICAgICAgayA9IDB4NkVEOUVCQTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChqIDwgNjApIHtcbiAgICAgICAgICAgICAgICBmID0gKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpO1xuICAgICAgICAgICAgICAgIGsgPSAweDhGMUJCQ0RDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgICAgICAgICAgICBrID0gMHhDQTYyQzFENjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlbXAgPSAobGVmdFJvdGF0ZShhLCA1KSArIGYgKyBlICsgayArIGJpZ0Jsb2NrMzIuZ2V0VWludDMyKGogKiA0LCBmYWxzZSkpICYgMHhmZmZmZmZmZjtcbiAgICAgICAgICAgIGUgPSBkO1xuICAgICAgICAgICAgZCA9IGM7XG4gICAgICAgICAgICBjID0gbGVmdFJvdGF0ZShiLCAzMCk7XG4gICAgICAgICAgICBiID0gYTtcbiAgICAgICAgICAgIGEgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2gwID0gKHRoaXMuX2gwICsgYSkgJiAweGZmZmZmZmZmO1xuICAgICAgICB0aGlzLl9oMSA9ICh0aGlzLl9oMSArIGIpICYgMHhmZmZmZmZmZjtcbiAgICAgICAgdGhpcy5faDIgPSAodGhpcy5faDIgKyBjKSAmIDB4ZmZmZmZmZmY7XG4gICAgICAgIHRoaXMuX2gzID0gKHRoaXMuX2gzICsgZCkgJiAweGZmZmZmZmZmO1xuICAgICAgICB0aGlzLl9oNCA9ICh0aGlzLl9oNCArIGUpICYgMHhmZmZmZmZmZjtcbiAgICB9XG59XG5TdHJpbmdTSEExLl9iaWdCbG9jazMyID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigzMjApKTsgLy8gODAgKiA0ID0gMzIwXG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IERpZmZDaGFuZ2UgfSBmcm9tICcuL2RpZmZDaGFuZ2UuanMnO1xuaW1wb3J0IHsgc3RyaW5nSGFzaCB9IGZyb20gJy4uL2hhc2guanMnO1xuZXhwb3J0IGNsYXNzIFN0cmluZ0RpZmZTZXF1ZW5jZSB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBnZXRFbGVtZW50cygpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgICAgIGNvbnN0IGNoYXJhY3RlcnMgPSBuZXcgSW50MzJBcnJheShzb3VyY2UubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNvdXJjZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY2hhcmFjdGVyc1tpXSA9IHNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFyYWN0ZXJzO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdEaWZmKG9yaWdpbmFsLCBtb2RpZmllZCwgcHJldHR5KSB7XG4gICAgcmV0dXJuIG5ldyBMY3NEaWZmKG5ldyBTdHJpbmdEaWZmU2VxdWVuY2Uob3JpZ2luYWwpLCBuZXcgU3RyaW5nRGlmZlNlcXVlbmNlKG1vZGlmaWVkKSkuQ29tcHV0ZURpZmYocHJldHR5KS5jaGFuZ2VzO1xufVxuLy9cbi8vIFRoZSBjb2RlIGJlbG93IGhhcyBiZWVuIHBvcnRlZCBmcm9tIGEgQyMgaW1wbGVtZW50YXRpb24gaW4gVlNcbi8vXG5jbGFzcyBEZWJ1ZyB7XG4gICAgc3RhdGljIEFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIE15QXJyYXkge1xuICAgIC8qKlxuICAgICAqIENvcGllcyBhIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYW4gQXJyYXkgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggYW5kIHBhc3Rlc1xuICAgICAqIHRoZW0gdG8gYW5vdGhlciBBcnJheSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGluZGV4LiBUaGUgbGVuZ3RoIGFuZCB0aGUgaW5kZXhlc1xuICAgICAqIGFyZSBzcGVjaWZpZWQgYXMgNjQtYml0IGludGVnZXJzLlxuICAgICAqIHNvdXJjZUFycmF5OlxuICAgICAqXHRcdFRoZSBBcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIGNvcHkuXG4gICAgICogc291cmNlSW5kZXg6XG4gICAgICpcdFx0QSA2NC1iaXQgaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIGluZGV4IGluIHRoZSBzb3VyY2VBcnJheSBhdCB3aGljaCBjb3B5aW5nIGJlZ2lucy5cbiAgICAgKiBkZXN0aW5hdGlvbkFycmF5OlxuICAgICAqXHRcdFRoZSBBcnJheSB0aGF0IHJlY2VpdmVzIHRoZSBkYXRhLlxuICAgICAqIGRlc3RpbmF0aW9uSW5kZXg6XG4gICAgICpcdFx0QSA2NC1iaXQgaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIGluZGV4IGluIHRoZSBkZXN0aW5hdGlvbkFycmF5IGF0IHdoaWNoIHN0b3JpbmcgYmVnaW5zLlxuICAgICAqIGxlbmd0aDpcbiAgICAgKlx0XHRBIDY0LWJpdCBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuXG4gICAgICovXG4gICAgc3RhdGljIENvcHkoc291cmNlQXJyYXksIHNvdXJjZUluZGV4LCBkZXN0aW5hdGlvbkFycmF5LCBkZXN0aW5hdGlvbkluZGV4LCBsZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZGVzdGluYXRpb25BcnJheVtkZXN0aW5hdGlvbkluZGV4ICsgaV0gPSBzb3VyY2VBcnJheVtzb3VyY2VJbmRleCArIGldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBDb3B5Mihzb3VyY2VBcnJheSwgc291cmNlSW5kZXgsIGRlc3RpbmF0aW9uQXJyYXksIGRlc3RpbmF0aW9uSW5kZXgsIGxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFycmF5W2Rlc3RpbmF0aW9uSW5kZXggKyBpXSA9IHNvdXJjZUFycmF5W3NvdXJjZUluZGV4ICsgaV07XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgdXRpbGl0eSBjbGFzcyB3aGljaCBoZWxwcyB0byBjcmVhdGUgdGhlIHNldCBvZiBEaWZmQ2hhbmdlcyBmcm9tXG4gKiBhIGRpZmZlcmVuY2Ugb3BlcmF0aW9uLiBUaGlzIGNsYXNzIGFjY2VwdHMgb3JpZ2luYWwgRGlmZkVsZW1lbnRzIGFuZFxuICogbW9kaWZpZWQgRGlmZkVsZW1lbnRzIHRoYXQgYXJlIGludm9sdmVkIGluIGEgcGFydGljdWxhciBjaGFuZ2UuIFRoZVxuICogTWFya05leHRDaGFuZ2UoKSBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBtYXJrIHRoZSBzZXBhcmF0aW9uIGJldHdlZW5cbiAqIGRpc3RpbmN0IGNoYW5nZXMuIEF0IHRoZSBlbmQsIHRoZSBDaGFuZ2VzIHByb3BlcnR5IGNhbiBiZSBjYWxsZWQgdG8gcmV0cmlldmVcbiAqIHRoZSBjb25zdHJ1Y3RlZCBjaGFuZ2VzLlxuICovXG5jbGFzcyBEaWZmQ2hhbmdlSGVscGVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERpZmZDaGFuZ2VIZWxwZXIgZm9yIHRoZSBnaXZlbiBEaWZmU2VxdWVuY2VzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1fY2hhbmdlcyA9IFtdO1xuICAgICAgICB0aGlzLm1fb3JpZ2luYWxTdGFydCA9IDEwNzM3NDE4MjQgLyogQ29uc3RhbnRzLk1BWF9TQUZFX1NNQUxMX0lOVEVHRVIgKi87XG4gICAgICAgIHRoaXMubV9tb2RpZmllZFN0YXJ0ID0gMTA3Mzc0MTgyNCAvKiBDb25zdGFudHMuTUFYX1NBRkVfU01BTExfSU5URUdFUiAqLztcbiAgICAgICAgdGhpcy5tX29yaWdpbmFsQ291bnQgPSAwO1xuICAgICAgICB0aGlzLm1fbW9kaWZpZWRDb3VudCA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgY2hhbmdlIGluIHRoZSBzZXQgb2YgZGlmZmVyZW5jZXMuXG4gICAgICovXG4gICAgTWFya05leHRDaGFuZ2UoKSB7XG4gICAgICAgIC8vIE9ubHkgYWRkIHRvIHRoZSBsaXN0IGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0byBhZGRcbiAgICAgICAgaWYgKHRoaXMubV9vcmlnaW5hbENvdW50ID4gMCB8fCB0aGlzLm1fbW9kaWZpZWRDb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IGNoYW5nZSB0byBvdXIgbGlzdFxuICAgICAgICAgICAgdGhpcy5tX2NoYW5nZXMucHVzaChuZXcgRGlmZkNoYW5nZSh0aGlzLm1fb3JpZ2luYWxTdGFydCwgdGhpcy5tX29yaWdpbmFsQ291bnQsIHRoaXMubV9tb2RpZmllZFN0YXJ0LCB0aGlzLm1fbW9kaWZpZWRDb3VudCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IGZvciB0aGUgbmV4dCBjaGFuZ2VcbiAgICAgICAgdGhpcy5tX29yaWdpbmFsQ291bnQgPSAwO1xuICAgICAgICB0aGlzLm1fbW9kaWZpZWRDb3VudCA9IDA7XG4gICAgICAgIHRoaXMubV9vcmlnaW5hbFN0YXJ0ID0gMTA3Mzc0MTgyNCAvKiBDb25zdGFudHMuTUFYX1NBRkVfU01BTExfSU5URUdFUiAqLztcbiAgICAgICAgdGhpcy5tX21vZGlmaWVkU3RhcnQgPSAxMDczNzQxODI0IC8qIENvbnN0YW50cy5NQVhfU0FGRV9TTUFMTF9JTlRFR0VSICovO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBvcmlnaW5hbCBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiB0byB0aGUgZWxlbWVudHNcbiAgICAgKiBhZmZlY3RlZCBieSB0aGUgY3VycmVudCBjaGFuZ2UuIFRoZSBtb2RpZmllZCBpbmRleCBnaXZlcyBjb250ZXh0XG4gICAgICogdG8gdGhlIGNoYW5nZSBwb3NpdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIG9yaWdpbmFsIHNlcXVlbmNlLlxuICAgICAqIEBwYXJhbSBvcmlnaW5hbEluZGV4IFRoZSBpbmRleCBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudCB0byBhZGQuXG4gICAgICogQHBhcmFtIG1vZGlmaWVkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBtb2RpZmllZCBlbGVtZW50IHRoYXQgcHJvdmlkZXMgY29ycmVzcG9uZGluZyBwb3NpdGlvbiBpbiB0aGUgbW9kaWZpZWQgc2VxdWVuY2UuXG4gICAgICovXG4gICAgQWRkT3JpZ2luYWxFbGVtZW50KG9yaWdpbmFsSW5kZXgsIG1vZGlmaWVkSW5kZXgpIHtcbiAgICAgICAgLy8gVGhlICd0cnVlJyBzdGFydCBpbmRleCBpcyB0aGUgc21hbGxlc3Qgb2YgdGhlIG9uZXMgd2UndmUgc2VlblxuICAgICAgICB0aGlzLm1fb3JpZ2luYWxTdGFydCA9IE1hdGgubWluKHRoaXMubV9vcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEluZGV4KTtcbiAgICAgICAgdGhpcy5tX21vZGlmaWVkU3RhcnQgPSBNYXRoLm1pbih0aGlzLm1fbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRJbmRleCk7XG4gICAgICAgIHRoaXMubV9vcmlnaW5hbENvdW50Kys7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIG1vZGlmaWVkIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIHRvIHRoZSBlbGVtZW50c1xuICAgICAqIGFmZmVjdGVkIGJ5IHRoZSBjdXJyZW50IGNoYW5nZS4gVGhlIG9yaWdpbmFsIGluZGV4IGdpdmVzIGNvbnRleHRcbiAgICAgKiB0byB0aGUgY2hhbmdlIHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbW9kaWZpZWQgc2VxdWVuY2UuXG4gICAgICogQHBhcmFtIG9yaWdpbmFsSW5kZXggVGhlIGluZGV4IG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50IHRoYXQgcHJvdmlkZXMgY29ycmVzcG9uZGluZyBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UuXG4gICAgICogQHBhcmFtIG1vZGlmaWVkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBtb2RpZmllZCBlbGVtZW50IHRvIGFkZC5cbiAgICAgKi9cbiAgICBBZGRNb2RpZmllZEVsZW1lbnQob3JpZ2luYWxJbmRleCwgbW9kaWZpZWRJbmRleCkge1xuICAgICAgICAvLyBUaGUgJ3RydWUnIHN0YXJ0IGluZGV4IGlzIHRoZSBzbWFsbGVzdCBvZiB0aGUgb25lcyB3ZSd2ZSBzZWVuXG4gICAgICAgIHRoaXMubV9vcmlnaW5hbFN0YXJ0ID0gTWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsIG9yaWdpbmFsSW5kZXgpO1xuICAgICAgICB0aGlzLm1fbW9kaWZpZWRTdGFydCA9IE1hdGgubWluKHRoaXMubV9tb2RpZmllZFN0YXJ0LCBtb2RpZmllZEluZGV4KTtcbiAgICAgICAgdGhpcy5tX21vZGlmaWVkQ291bnQrKztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgY2hhbmdlcyBtYXJrZWQgYnkgdGhlIGNsYXNzLlxuICAgICAqL1xuICAgIGdldENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLm1fb3JpZ2luYWxDb3VudCA+IDAgfHwgdGhpcy5tX21vZGlmaWVkQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBGaW5pc2ggdXAgb24gd2hhdGV2ZXIgaXMgbGVmdFxuICAgICAgICAgICAgdGhpcy5NYXJrTmV4dENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm1fY2hhbmdlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgY2hhbmdlcyBtYXJrZWQgYnkgdGhlIGNsYXNzIGluIHRoZSByZXZlcnNlIG9yZGVyXG4gICAgICovXG4gICAgZ2V0UmV2ZXJzZUNoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLm1fb3JpZ2luYWxDb3VudCA+IDAgfHwgdGhpcy5tX21vZGlmaWVkQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBGaW5pc2ggdXAgb24gd2hhdGV2ZXIgaXMgbGVmdFxuICAgICAgICAgICAgdGhpcy5NYXJrTmV4dENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubV9jaGFuZ2VzLnJldmVyc2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9jaGFuZ2VzO1xuICAgIH1cbn1cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGRpZmZlcmVuY2UgYWxnb3JpdGhtIGRlc2NyaWJlZCBpblxuICogXCJBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgaXRzIHZhcmlhdGlvbnNcIiBieSBFdWdlbmUgVy4gTXllcnNcbiAqL1xuZXhwb3J0IGNsYXNzIExjc0RpZmYge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhlIERpZmZGaW5kZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcmlnaW5hbFNlcXVlbmNlLCBtb2RpZmllZFNlcXVlbmNlLCBjb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlID0gY29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlO1xuICAgICAgICB0aGlzLl9vcmlnaW5hbFNlcXVlbmNlID0gb3JpZ2luYWxTZXF1ZW5jZTtcbiAgICAgICAgdGhpcy5fbW9kaWZpZWRTZXF1ZW5jZSA9IG1vZGlmaWVkU2VxdWVuY2U7XG4gICAgICAgIGNvbnN0IFtvcmlnaW5hbFN0cmluZ0VsZW1lbnRzLCBvcmlnaW5hbEVsZW1lbnRzT3JIYXNoLCBvcmlnaW5hbEhhc1N0cmluZ3NdID0gTGNzRGlmZi5fZ2V0RWxlbWVudHMob3JpZ2luYWxTZXF1ZW5jZSk7XG4gICAgICAgIGNvbnN0IFttb2RpZmllZFN0cmluZ0VsZW1lbnRzLCBtb2RpZmllZEVsZW1lbnRzT3JIYXNoLCBtb2RpZmllZEhhc1N0cmluZ3NdID0gTGNzRGlmZi5fZ2V0RWxlbWVudHMobW9kaWZpZWRTZXF1ZW5jZSk7XG4gICAgICAgIHRoaXMuX2hhc1N0cmluZ3MgPSAob3JpZ2luYWxIYXNTdHJpbmdzICYmIG1vZGlmaWVkSGFzU3RyaW5ncyk7XG4gICAgICAgIHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHMgPSBvcmlnaW5hbFN0cmluZ0VsZW1lbnRzO1xuICAgICAgICB0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoID0gb3JpZ2luYWxFbGVtZW50c09ySGFzaDtcbiAgICAgICAgdGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50cyA9IG1vZGlmaWVkU3RyaW5nRWxlbWVudHM7XG4gICAgICAgIHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2ggPSBtb2RpZmllZEVsZW1lbnRzT3JIYXNoO1xuICAgICAgICB0aGlzLm1fZm9yd2FyZEhpc3RvcnkgPSBbXTtcbiAgICAgICAgdGhpcy5tX3JldmVyc2VIaXN0b3J5ID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBfaXNTdHJpbmdBcnJheShhcnIpIHtcbiAgICAgICAgcmV0dXJuIChhcnIubGVuZ3RoID4gMCAmJiB0eXBlb2YgYXJyWzBdID09PSAnc3RyaW5nJyk7XG4gICAgfVxuICAgIHN0YXRpYyBfZ2V0RWxlbWVudHMoc2VxdWVuY2UpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBzZXF1ZW5jZS5nZXRFbGVtZW50cygpO1xuICAgICAgICBpZiAoTGNzRGlmZi5faXNTdHJpbmdBcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc2hlcyA9IG5ldyBJbnQzMkFycmF5KGVsZW1lbnRzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBoYXNoZXNbaV0gPSBzdHJpbmdIYXNoKGVsZW1lbnRzW2ldLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbZWxlbWVudHMsIGhhc2hlcywgdHJ1ZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnRzIGluc3RhbmNlb2YgSW50MzJBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIFtbXSwgZWxlbWVudHMsIGZhbHNlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1tdLCBuZXcgSW50MzJBcnJheShlbGVtZW50cyksIGZhbHNlXTtcbiAgICB9XG4gICAgRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbEluZGV4LCBuZXdJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFtvcmlnaW5hbEluZGV4XSAhPT0gdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFtuZXdJbmRleF0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuX2hhc1N0cmluZ3MgPyB0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW29yaWdpbmFsSW5kZXhdID09PSB0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW25ld0luZGV4XSA6IHRydWUpO1xuICAgIH1cbiAgICBFbGVtZW50c0FyZVN0cmljdEVxdWFsKG9yaWdpbmFsSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgICAgIGlmICghdGhpcy5FbGVtZW50c0FyZUVxdWFsKG9yaWdpbmFsSW5kZXgsIG5ld0luZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRWxlbWVudCA9IExjc0RpZmYuX2dldFN0cmljdEVsZW1lbnQodGhpcy5fb3JpZ2luYWxTZXF1ZW5jZSwgb3JpZ2luYWxJbmRleCk7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkRWxlbWVudCA9IExjc0RpZmYuX2dldFN0cmljdEVsZW1lbnQodGhpcy5fbW9kaWZpZWRTZXF1ZW5jZSwgbmV3SW5kZXgpO1xuICAgICAgICByZXR1cm4gKG9yaWdpbmFsRWxlbWVudCA9PT0gbW9kaWZpZWRFbGVtZW50KTtcbiAgICB9XG4gICAgc3RhdGljIF9nZXRTdHJpY3RFbGVtZW50KHNlcXVlbmNlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIHNlcXVlbmNlLmdldFN0cmljdEVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZS5nZXRTdHJpY3RFbGVtZW50KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgT3JpZ2luYWxFbGVtZW50c0FyZUVxdWFsKGluZGV4MSwgaW5kZXgyKSB7XG4gICAgICAgIGlmICh0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoW2luZGV4MV0gIT09IHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbaW5kZXgyXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5faGFzU3RyaW5ncyA/IHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbaW5kZXgxXSA9PT0gdGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tpbmRleDJdIDogdHJ1ZSk7XG4gICAgfVxuICAgIE1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChpbmRleDEsIGluZGV4Mikge1xuICAgICAgICBpZiAodGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFtpbmRleDFdICE9PSB0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW2luZGV4Ml0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuX2hhc1N0cmluZ3MgPyB0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW2luZGV4MV0gPT09IHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbaW5kZXgyXSA6IHRydWUpO1xuICAgIH1cbiAgICBDb21wdXRlRGlmZihwcmV0dHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX0NvbXB1dGVEaWZmKDAsIHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoIC0gMSwgMCwgdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGggLSAxLCBwcmV0dHkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb3JpZ2luYWwgYW5kIG1vZGlmaWVkIGlucHV0XG4gICAgICogc2VxdWVuY2VzIG9uIHRoZSBib3VuZGVkIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gaW5wdXQgc2VxdWVuY2VzLlxuICAgICAqL1xuICAgIF9Db21wdXRlRGlmZihvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIHByZXR0eSkge1xuICAgICAgICBjb25zdCBxdWl0RWFybHlBcnIgPSBbZmFsc2VdO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IHRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxFbmQsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkRW5kLCBxdWl0RWFybHlBcnIpO1xuICAgICAgICBpZiAocHJldHR5KSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGNsZWFuIHVwIHRoZSBjb21wdXRlZCBkaWZmIHRvIGJlIG1vcmUgaW50dWl0aXZlXG4gICAgICAgICAgICAvLyBidXQgaXQgdHVybnMgb3V0IHRoaXMgY2Fubm90IGJlIGRvbmUgY29ycmVjdGx5IHVudGlsIHRoZSBlbnRpcmUgc2V0XG4gICAgICAgICAgICAvLyBvZiBkaWZmcyBoYXZlIGJlZW4gY29tcHV0ZWRcbiAgICAgICAgICAgIGNoYW5nZXMgPSB0aGlzLlByZXR0aWZ5Q2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVpdEVhcmx5OiBxdWl0RWFybHlBcnJbMF0sXG4gICAgICAgICAgICBjaGFuZ2VzOiBjaGFuZ2VzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaXZhdGUgaGVscGVyIG1ldGhvZCB3aGljaCBjb21wdXRlcyB0aGUgZGlmZmVyZW5jZXMgb24gdGhlIGJvdW5kZWQgcmFuZ2VcbiAgICAgKiByZWN1cnNpdmVseS5cbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGlucHV0IHNlcXVlbmNlcy5cbiAgICAgKi9cbiAgICBDb21wdXRlRGlmZlJlY3Vyc2l2ZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIHF1aXRFYXJseUFycikge1xuICAgICAgICBxdWl0RWFybHlBcnJbMF0gPSBmYWxzZTtcbiAgICAgICAgLy8gRmluZCB0aGUgc3RhcnQgb2YgdGhlIGRpZmZlcmVuY2VzXG4gICAgICAgIHdoaWxlIChvcmlnaW5hbFN0YXJ0IDw9IG9yaWdpbmFsRW5kICYmIG1vZGlmaWVkU3RhcnQgPD0gbW9kaWZpZWRFbmQgJiYgdGhpcy5FbGVtZW50c0FyZUVxdWFsKG9yaWdpbmFsU3RhcnQsIG1vZGlmaWVkU3RhcnQpKSB7XG4gICAgICAgICAgICBvcmlnaW5hbFN0YXJ0Kys7XG4gICAgICAgICAgICBtb2RpZmllZFN0YXJ0Kys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSBkaWZmZXJlbmNlc1xuICAgICAgICB3aGlsZSAob3JpZ2luYWxFbmQgPj0gb3JpZ2luYWxTdGFydCAmJiBtb2RpZmllZEVuZCA+PSBtb2RpZmllZFN0YXJ0ICYmIHRoaXMuRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbEVuZCwgbW9kaWZpZWRFbmQpKSB7XG4gICAgICAgICAgICBvcmlnaW5hbEVuZC0tO1xuICAgICAgICAgICAgbW9kaWZpZWRFbmQtLTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbiB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIGVpdGhlciBoYXZlIGFsbCBpbnNlcnRpb25zIG9yIGFsbCBkZWxldGlvbnMgb3IgdGhlIHNlcXVlbmNlcyBhcmUgaWRlbnRpY2FsXG4gICAgICAgIGlmIChvcmlnaW5hbFN0YXJ0ID4gb3JpZ2luYWxFbmQgfHwgbW9kaWZpZWRTdGFydCA+IG1vZGlmaWVkRW5kKSB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlcztcbiAgICAgICAgICAgIGlmIChtb2RpZmllZFN0YXJ0IDw9IG1vZGlmaWVkRW5kKSB7XG4gICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG9yaWdpbmFsU3RhcnQgPT09IG9yaWdpbmFsRW5kICsgMSwgJ29yaWdpbmFsU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBvcmlnaW5hbEVuZCcpO1xuICAgICAgICAgICAgICAgIC8vIEFsbCBpbnNlcnRpb25zXG4gICAgICAgICAgICAgICAgY2hhbmdlcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2Uob3JpZ2luYWxTdGFydCwgMCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQgLSBtb2RpZmllZFN0YXJ0ICsgMSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxTdGFydCA8PSBvcmlnaW5hbEVuZCkge1xuICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChtb2RpZmllZFN0YXJ0ID09PSBtb2RpZmllZEVuZCArIDEsICdtb2RpZmllZFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gbW9kaWZpZWRFbmQnKTtcbiAgICAgICAgICAgICAgICAvLyBBbGwgZGVsZXRpb25zXG4gICAgICAgICAgICAgICAgY2hhbmdlcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2Uob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxFbmQgLSBvcmlnaW5hbFN0YXJ0ICsgMSwgbW9kaWZpZWRTdGFydCwgMClcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG9yaWdpbmFsU3RhcnQgPT09IG9yaWdpbmFsRW5kICsgMSwgJ29yaWdpbmFsU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBvcmlnaW5hbEVuZCcpO1xuICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChtb2RpZmllZFN0YXJ0ID09PSBtb2RpZmllZEVuZCArIDEsICdtb2RpZmllZFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gbW9kaWZpZWRFbmQnKTtcbiAgICAgICAgICAgICAgICAvLyBJZGVudGljYWwgc2VxdWVuY2VzIC0gTm8gZGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICBjaGFuZ2VzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlcztcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIHByb2JsZW0gY2FuIGJlIHNvbHZlZCB1c2luZyB0aGUgRGl2aWRlLUFuZC1Db25xdWVyIHRlY2huaXF1ZS5cbiAgICAgICAgY29uc3QgbWlkT3JpZ2luYWxBcnIgPSBbMF07XG4gICAgICAgIGNvbnN0IG1pZE1vZGlmaWVkQXJyID0gWzBdO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLkNvbXB1dGVSZWN1cnNpb25Qb2ludChvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIG1pZE9yaWdpbmFsQXJyLCBtaWRNb2RpZmllZEFyciwgcXVpdEVhcmx5QXJyKTtcbiAgICAgICAgY29uc3QgbWlkT3JpZ2luYWwgPSBtaWRPcmlnaW5hbEFyclswXTtcbiAgICAgICAgY29uc3QgbWlkTW9kaWZpZWQgPSBtaWRNb2RpZmllZEFyclswXTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmVzdWx0IGlzIG5vdC1udWxsIHdoZW4gdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gY29tcHV0ZSB0aGUgY2hhbmdlcyB3aGlsZVxuICAgICAgICAgICAgLy8gc2VhcmNoaW5nIGZvciB0aGUgcmVjdXJzaW9uIHBvaW50XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFxdWl0RWFybHlBcnJbMF0pIHtcbiAgICAgICAgICAgIC8vIFdlIGNhbiBicmVhayB0aGUgcHJvYmxlbSBkb3duIHJlY3Vyc2l2ZWx5IGJ5IGZpbmRpbmcgdGhlIGNoYW5nZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyBGaXJzdCBIYWxmOiAgIChvcmlnaW5hbFN0YXJ0LCBtb2RpZmllZFN0YXJ0KSB0byAobWlkT3JpZ2luYWwsIG1pZE1vZGlmaWVkKVxuICAgICAgICAgICAgLy8gU2Vjb25kIEhhbGY6ICAobWlkT3JpZ2luYWwgKyAxLCBtaW5Nb2RpZmllZCArIDEpIHRvIChvcmlnaW5hbEVuZCwgbW9kaWZpZWRFbmQpXG4gICAgICAgICAgICAvLyBOT1RFOiBDb21wdXRlRGlmZigpIGlzIGluY2x1c2l2ZSwgdGhlcmVmb3JlIHRoZSBzZWNvbmQgcmFuZ2Ugc3RhcnRzIG9uIHRoZSBuZXh0IHBvaW50XG4gICAgICAgICAgICBjb25zdCBsZWZ0Q2hhbmdlcyA9IHRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUob3JpZ2luYWxTdGFydCwgbWlkT3JpZ2luYWwsIG1vZGlmaWVkU3RhcnQsIG1pZE1vZGlmaWVkLCBxdWl0RWFybHlBcnIpO1xuICAgICAgICAgICAgbGV0IHJpZ2h0Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgaWYgKCFxdWl0RWFybHlBcnJbMF0pIHtcbiAgICAgICAgICAgICAgICByaWdodENoYW5nZXMgPSB0aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKG1pZE9yaWdpbmFsICsgMSwgb3JpZ2luYWxFbmQsIG1pZE1vZGlmaWVkICsgMSwgbW9kaWZpZWRFbmQsIHF1aXRFYXJseUFycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgaGF2ZSB0aW1lIHRvIGZpbmlzaCB0aGUgZmlyc3QgaGFsZiwgc28gd2UgZG9uJ3QgaGF2ZSB0aW1lIHRvIGNvbXB1dGUgdGhpcyBoYWxmLlxuICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIHRoZSBlbnRpcmUgcmVzdCBvZiB0aGUgc2VxdWVuY2UgZGlmZmVyZW50LlxuICAgICAgICAgICAgICAgIHJpZ2h0Q2hhbmdlcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2UobWlkT3JpZ2luYWwgKyAxLCBvcmlnaW5hbEVuZCAtIChtaWRPcmlnaW5hbCArIDEpICsgMSwgbWlkTW9kaWZpZWQgKyAxLCBtb2RpZmllZEVuZCAtIChtaWRNb2RpZmllZCArIDEpICsgMSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKGxlZnRDaGFuZ2VzLCByaWdodENoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGhpdCBoZXJlLCB3ZSBxdWl0IGVhcmx5LCBhbmQgc28gY2FuJ3QgcmV0dXJuIGFueXRoaW5nIG1lYW5pbmdmdWxcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBEaWZmQ2hhbmdlKG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsRW5kIC0gb3JpZ2luYWxTdGFydCArIDEsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkRW5kIC0gbW9kaWZpZWRTdGFydCArIDEpXG4gICAgICAgIF07XG4gICAgfVxuICAgIFdBTEtUUkFDRShkaWFnb25hbEZvcndhcmRCYXNlLCBkaWFnb25hbEZvcndhcmRTdGFydCwgZGlhZ29uYWxGb3J3YXJkRW5kLCBkaWFnb25hbEZvcndhcmRPZmZzZXQsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0LCBkaWFnb25hbFJldmVyc2VFbmQsIGRpYWdvbmFsUmV2ZXJzZU9mZnNldCwgZm9yd2FyZFBvaW50cywgcmV2ZXJzZVBvaW50cywgb3JpZ2luYWxJbmRleCwgb3JpZ2luYWxFbmQsIG1pZE9yaWdpbmFsQXJyLCBtb2RpZmllZEluZGV4LCBtb2RpZmllZEVuZCwgbWlkTW9kaWZpZWRBcnIsIGRlbHRhSXNFdmVuLCBxdWl0RWFybHlBcnIpIHtcbiAgICAgICAgbGV0IGZvcndhcmRDaGFuZ2VzID0gbnVsbDtcbiAgICAgICAgbGV0IHJldmVyc2VDaGFuZ2VzID0gbnVsbDtcbiAgICAgICAgLy8gRmlyc3QsIHdhbGsgYmFja3dhcmQgdGhyb3VnaCB0aGUgZm9yd2FyZCBkaWFnb25hbHMgaGlzdG9yeVxuICAgICAgICBsZXQgY2hhbmdlSGVscGVyID0gbmV3IERpZmZDaGFuZ2VIZWxwZXIoKTtcbiAgICAgICAgbGV0IGRpYWdvbmFsTWluID0gZGlhZ29uYWxGb3J3YXJkU3RhcnQ7XG4gICAgICAgIGxldCBkaWFnb25hbE1heCA9IGRpYWdvbmFsRm9yd2FyZEVuZDtcbiAgICAgICAgbGV0IGRpYWdvbmFsUmVsYXRpdmUgPSAobWlkT3JpZ2luYWxBcnJbMF0gLSBtaWRNb2RpZmllZEFyclswXSkgLSBkaWFnb25hbEZvcndhcmRPZmZzZXQ7XG4gICAgICAgIGxldCBsYXN0T3JpZ2luYWxJbmRleCA9IC0xMDczNzQxODI0IC8qIENvbnN0YW50cy5NSU5fU0FGRV9TTUFMTF9JTlRFR0VSICovO1xuICAgICAgICBsZXQgaGlzdG9yeUluZGV4ID0gdGhpcy5tX2ZvcndhcmRIaXN0b3J5Lmxlbmd0aCAtIDE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgZGlhZ29uYWwgaW5kZXggZnJvbSB0aGUgcmVsYXRpdmUgZGlhZ29uYWwgbnVtYmVyXG4gICAgICAgICAgICBjb25zdCBkaWFnb25hbCA9IGRpYWdvbmFsUmVsYXRpdmUgKyBkaWFnb25hbEZvcndhcmRCYXNlO1xuICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGVyZSB3ZSBjYW1lIGZyb21cbiAgICAgICAgICAgIGlmIChkaWFnb25hbCA9PT0gZGlhZ29uYWxNaW4gfHwgKGRpYWdvbmFsIDwgZGlhZ29uYWxNYXggJiYgZm9yd2FyZFBvaW50c1tkaWFnb25hbCAtIDFdIDwgZm9yd2FyZFBvaW50c1tkaWFnb25hbCArIDFdKSkge1xuICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIGxpbmUgKHRoZSBlbGVtZW50IGlzIGFuIGluc2VydClcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gZm9yd2FyZFBvaW50c1tkaWFnb25hbCArIDFdO1xuICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXggPSBvcmlnaW5hbEluZGV4IC0gZGlhZ29uYWxSZWxhdGl2ZSAtIGRpYWdvbmFsRm9yd2FyZE9mZnNldDtcbiAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA8IGxhc3RPcmlnaW5hbEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUhlbHBlci5NYXJrTmV4dENoYW5nZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0T3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsSW5kZXg7XG4gICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyLkFkZE1vZGlmaWVkRWxlbWVudChvcmlnaW5hbEluZGV4ICsgMSwgbW9kaWZpZWRJbmRleCk7XG4gICAgICAgICAgICAgICAgZGlhZ29uYWxSZWxhdGl2ZSA9IChkaWFnb25hbCArIDEpIC0gZGlhZ29uYWxGb3J3YXJkQmFzZTsgLy9TZXR1cCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBIb3Jpem9udGFsIGxpbmUgKHRoZSBlbGVtZW50IGlzIGEgZGVsZXRpb24pXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IGZvcndhcmRQb2ludHNbZGlhZ29uYWwgLSAxXSArIDE7XG4gICAgICAgICAgICAgICAgbW9kaWZpZWRJbmRleCA9IG9yaWdpbmFsSW5kZXggLSBkaWFnb25hbFJlbGF0aXZlIC0gZGlhZ29uYWxGb3J3YXJkT2Zmc2V0O1xuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEluZGV4IDwgbGFzdE9yaWdpbmFsSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyLk1hcmtOZXh0Q2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhc3RPcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyLkFkZE9yaWdpbmFsRWxlbWVudChvcmlnaW5hbEluZGV4LCBtb2RpZmllZEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgZGlhZ29uYWxSZWxhdGl2ZSA9IChkaWFnb25hbCAtIDEpIC0gZGlhZ29uYWxGb3J3YXJkQmFzZTsgLy9TZXR1cCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGlzdG9yeUluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICBmb3J3YXJkUG9pbnRzID0gdGhpcy5tX2ZvcndhcmRIaXN0b3J5W2hpc3RvcnlJbmRleF07XG4gICAgICAgICAgICAgICAgZGlhZ29uYWxGb3J3YXJkQmFzZSA9IGZvcndhcmRQb2ludHNbMF07IC8vV2Ugc3RvcmVkIHRoaXMgaW4gdGhlIGZpcnN0IHNwb3RcbiAgICAgICAgICAgICAgICBkaWFnb25hbE1pbiA9IDE7XG4gICAgICAgICAgICAgICAgZGlhZ29uYWxNYXggPSBmb3J3YXJkUG9pbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKC0taGlzdG9yeUluZGV4ID49IC0xKTtcbiAgICAgICAgLy8gSXJvbmljYWxseSwgd2UgZ2V0IHRoZSBmb3J3YXJkIGNoYW5nZXMgYXMgdGhlIHJldmVyc2Ugb2YgdGhlXG4gICAgICAgIC8vIG9yZGVyIHdlIGFkZGVkIHRoZW0gc2luY2Ugd2UgdGVjaG5pY2FsbHkgYWRkZWQgdGhlbSBiYWNrd2FyZHNcbiAgICAgICAgZm9yd2FyZENoYW5nZXMgPSBjaGFuZ2VIZWxwZXIuZ2V0UmV2ZXJzZUNoYW5nZXMoKTtcbiAgICAgICAgaWYgKHF1aXRFYXJseUFyclswXSkge1xuICAgICAgICAgICAgLy8gVE9ETzogQ2FsY3VsYXRlIGEgcGFydGlhbCBmcm9tIHRoZSByZXZlcnNlIGRpYWdvbmFscy5cbiAgICAgICAgICAgIC8vICAgICAgIEZvciBub3csIGp1c3QgYXNzdW1lIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIG1pZE9yaWdpbmFsL21pZE1vZGlmaWVkIHBvaW50IGlzIGEgZGlmZlxuICAgICAgICAgICAgbGV0IG9yaWdpbmFsU3RhcnRQb2ludCA9IG1pZE9yaWdpbmFsQXJyWzBdICsgMTtcbiAgICAgICAgICAgIGxldCBtb2RpZmllZFN0YXJ0UG9pbnQgPSBtaWRNb2RpZmllZEFyclswXSArIDE7XG4gICAgICAgICAgICBpZiAoZm9yd2FyZENoYW5nZXMgIT09IG51bGwgJiYgZm9yd2FyZENoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RGb3J3YXJkQ2hhbmdlID0gZm9yd2FyZENoYW5nZXNbZm9yd2FyZENoYW5nZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydFBvaW50ID0gTWF0aC5tYXgob3JpZ2luYWxTdGFydFBvaW50LCBsYXN0Rm9yd2FyZENoYW5nZS5nZXRPcmlnaW5hbEVuZCgpKTtcbiAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0UG9pbnQgPSBNYXRoLm1heChtb2RpZmllZFN0YXJ0UG9pbnQsIGxhc3RGb3J3YXJkQ2hhbmdlLmdldE1vZGlmaWVkRW5kKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV2ZXJzZUNoYW5nZXMgPSBbXG4gICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2Uob3JpZ2luYWxTdGFydFBvaW50LCBvcmlnaW5hbEVuZCAtIG9yaWdpbmFsU3RhcnRQb2ludCArIDEsIG1vZGlmaWVkU3RhcnRQb2ludCwgbW9kaWZpZWRFbmQgLSBtb2RpZmllZFN0YXJ0UG9pbnQgKyAxKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdyB3YWxrIGJhY2t3YXJkIHRocm91Z2ggdGhlIHJldmVyc2UgZGlhZ29uYWxzIGhpc3RvcnlcbiAgICAgICAgICAgIGNoYW5nZUhlbHBlciA9IG5ldyBEaWZmQ2hhbmdlSGVscGVyKCk7XG4gICAgICAgICAgICBkaWFnb25hbE1pbiA9IGRpYWdvbmFsUmV2ZXJzZVN0YXJ0O1xuICAgICAgICAgICAgZGlhZ29uYWxNYXggPSBkaWFnb25hbFJldmVyc2VFbmQ7XG4gICAgICAgICAgICBkaWFnb25hbFJlbGF0aXZlID0gKG1pZE9yaWdpbmFsQXJyWzBdIC0gbWlkTW9kaWZpZWRBcnJbMF0pIC0gZGlhZ29uYWxSZXZlcnNlT2Zmc2V0O1xuICAgICAgICAgICAgbGFzdE9yaWdpbmFsSW5kZXggPSAxMDczNzQxODI0IC8qIENvbnN0YW50cy5NQVhfU0FGRV9TTUFMTF9JTlRFR0VSICovO1xuICAgICAgICAgICAgaGlzdG9yeUluZGV4ID0gKGRlbHRhSXNFdmVuKSA/IHRoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGggLSAxIDogdGhpcy5tX3JldmVyc2VIaXN0b3J5Lmxlbmd0aCAtIDI7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBkaWFnb25hbCBpbmRleCBmcm9tIHRoZSByZWxhdGl2ZSBkaWFnb25hbCBudW1iZXJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWFnb25hbCA9IGRpYWdvbmFsUmVsYXRpdmUgKyBkaWFnb25hbFJldmVyc2VCYXNlO1xuICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hlcmUgd2UgY2FtZSBmcm9tXG4gICAgICAgICAgICAgICAgaWYgKGRpYWdvbmFsID09PSBkaWFnb25hbE1pbiB8fCAoZGlhZ29uYWwgPCBkaWFnb25hbE1heCAmJiByZXZlcnNlUG9pbnRzW2RpYWdvbmFsIC0gMV0gPj0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCArIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBIb3Jpem9udGFsIGxpbmUgKHRoZSBlbGVtZW50IGlzIGEgZGVsZXRpb24pKVxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCArIDFdIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRJbmRleCA9IG9yaWdpbmFsSW5kZXggLSBkaWFnb25hbFJlbGF0aXZlIC0gZGlhZ29uYWxSZXZlcnNlT2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA+IGxhc3RPcmlnaW5hbEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuTWFya05leHRDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0T3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuQWRkT3JpZ2luYWxFbGVtZW50KG9yaWdpbmFsSW5kZXggKyAxLCBtb2RpZmllZEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsUmVsYXRpdmUgPSAoZGlhZ29uYWwgKyAxKSAtIGRpYWdvbmFsUmV2ZXJzZUJhc2U7IC8vU2V0dXAgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVmVydGljYWwgbGluZSAodGhlIGVsZW1lbnQgaXMgYW4gaW5zZXJ0aW9uKVxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEluZGV4ID0gb3JpZ2luYWxJbmRleCAtIGRpYWdvbmFsUmVsYXRpdmUgLSBkaWFnb25hbFJldmVyc2VPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEluZGV4ID4gbGFzdE9yaWdpbmFsSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUhlbHBlci5NYXJrTmV4dENoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RPcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyLkFkZE1vZGlmaWVkRWxlbWVudChvcmlnaW5hbEluZGV4ICsgMSwgbW9kaWZpZWRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgICAgICBkaWFnb25hbFJlbGF0aXZlID0gKGRpYWdvbmFsIC0gMSkgLSBkaWFnb25hbFJldmVyc2VCYXNlOyAvL1NldHVwIGZvciB0aGUgbmV4dCBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldmVyc2VQb2ludHMgPSB0aGlzLm1fcmV2ZXJzZUhpc3RvcnlbaGlzdG9yeUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxSZXZlcnNlQmFzZSA9IHJldmVyc2VQb2ludHNbMF07IC8vV2Ugc3RvcmVkIHRoaXMgaW4gdGhlIGZpcnN0IHNwb3RcbiAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxNaW4gPSAxO1xuICAgICAgICAgICAgICAgICAgICBkaWFnb25hbE1heCA9IHJldmVyc2VQb2ludHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICgtLWhpc3RvcnlJbmRleCA+PSAtMSk7XG4gICAgICAgICAgICAvLyBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHJldmVyc2UgaGlzdG9yeSB3aWxsIGZpbmQgZGlmZnMgdGhhdFxuICAgICAgICAgICAgLy8gYXJlIGNvcnJlY3QsIGJ1dCBub3QgaW50dWl0aXZlLCBzbyB3ZSBuZWVkIHNoaWZ0IHRoZW0uXG4gICAgICAgICAgICByZXZlcnNlQ2hhbmdlcyA9IGNoYW5nZUhlbHBlci5nZXRDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKGZvcndhcmRDaGFuZ2VzLCByZXZlcnNlQ2hhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdpdmVuIHRoZSByYW5nZSB0byBjb21wdXRlIHRoZSBkaWZmIG9uLCB0aGlzIG1ldGhvZCBmaW5kcyB0aGUgcG9pbnQ6XG4gICAgICogKG1pZE9yaWdpbmFsLCBtaWRNb2RpZmllZClcbiAgICAgKiB0aGF0IGV4aXN0cyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBMQ1Mgb2YgdGhlIHR3byBzZXF1ZW5jZXMgYW5kXG4gICAgICogaXMgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBMQ1MgcHJvYmxlbSBtYXkgYmUgYnJva2VuIGRvd24gcmVjdXJzaXZlbHkuXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCB0cnkgdG8ga2VlcCB0aGUgTENTIHRyYWNlIGluIG1lbW9yeS4gSWYgdGhlIExDUyByZWN1cnNpb25cbiAgICAgKiBwb2ludCBpcyBjYWxjdWxhdGVkIGFuZCB0aGUgZnVsbCB0cmFjZSBpcyBhdmFpbGFibGUgaW4gbWVtb3J5LCB0aGVuIHRoaXMgbWV0aG9kXG4gICAgICogd2lsbCByZXR1cm4gdGhlIGNoYW5nZSBsaXN0LlxuICAgICAqIEBwYXJhbSBvcmlnaW5hbFN0YXJ0IFRoZSBzdGFydCBib3VuZCBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgcmFuZ2VcbiAgICAgKiBAcGFyYW0gb3JpZ2luYWxFbmQgVGhlIGVuZCBib3VuZCBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgcmFuZ2VcbiAgICAgKiBAcGFyYW0gbW9kaWZpZWRTdGFydCBUaGUgc3RhcnQgYm91bmQgb2YgdGhlIG1vZGlmaWVkIHNlcXVlbmNlIHJhbmdlXG4gICAgICogQHBhcmFtIG1vZGlmaWVkRW5kIFRoZSBlbmQgYm91bmQgb2YgdGhlIG1vZGlmaWVkIHNlcXVlbmNlIHJhbmdlXG4gICAgICogQHBhcmFtIG1pZE9yaWdpbmFsIFRoZSBtaWRkbGUgcG9pbnQgb2YgdGhlIG9yaWdpbmFsIHNlcXVlbmNlIHJhbmdlXG4gICAgICogQHBhcmFtIG1pZE1vZGlmaWVkIFRoZSBtaWRkbGUgcG9pbnQgb2YgdGhlIG1vZGlmaWVkIHNlcXVlbmNlIHJhbmdlXG4gICAgICogQHJldHVybnMgVGhlIGRpZmYgY2hhbmdlcywgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgbnVsbFxuICAgICAqL1xuICAgIENvbXB1dGVSZWN1cnNpb25Qb2ludChvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIG1pZE9yaWdpbmFsQXJyLCBtaWRNb2RpZmllZEFyciwgcXVpdEVhcmx5QXJyKSB7XG4gICAgICAgIGxldCBvcmlnaW5hbEluZGV4ID0gMCwgbW9kaWZpZWRJbmRleCA9IDA7XG4gICAgICAgIGxldCBkaWFnb25hbEZvcndhcmRTdGFydCA9IDAsIGRpYWdvbmFsRm9yd2FyZEVuZCA9IDA7XG4gICAgICAgIGxldCBkaWFnb25hbFJldmVyc2VTdGFydCA9IDAsIGRpYWdvbmFsUmV2ZXJzZUVuZCA9IDA7XG4gICAgICAgIC8vIFRvIHRyYXZlcnNlIHRoZSBlZGl0IGdyYXBoIGFuZCBwcm9kdWNlIHRoZSBwcm9wZXIgTENTLCBvdXIgYWN0dWFsXG4gICAgICAgIC8vIHN0YXJ0IHBvc2l0aW9uIGlzIGp1c3Qgb3V0c2lkZSB0aGUgZ2l2ZW4gYm91bmRhcnlcbiAgICAgICAgb3JpZ2luYWxTdGFydC0tO1xuICAgICAgICBtb2RpZmllZFN0YXJ0LS07XG4gICAgICAgIC8vIFdlIHNldCB0aGVzZSB1cCB0byBtYWtlIHRoZSBjb21waWxlciBoYXBweSwgYnV0IHRoZXkgd2lsbFxuICAgICAgICAvLyBiZSByZXBsYWNlZCBiZWZvcmUgd2UgcmV0dXJuIHdpdGggdGhlIGFjdHVhbCByZWN1cnNpb24gcG9pbnRcbiAgICAgICAgbWlkT3JpZ2luYWxBcnJbMF0gPSAwO1xuICAgICAgICBtaWRNb2RpZmllZEFyclswXSA9IDA7XG4gICAgICAgIC8vIENsZWFyIG91dCB0aGUgaGlzdG9yeVxuICAgICAgICB0aGlzLm1fZm9yd2FyZEhpc3RvcnkgPSBbXTtcbiAgICAgICAgdGhpcy5tX3JldmVyc2VIaXN0b3J5ID0gW107XG4gICAgICAgIC8vIEVhY2ggY2VsbCBpbiB0aGUgdHdvIGFycmF5cyBjb3JyZXNwb25kcyB0byBhIGRpYWdvbmFsIGluIHRoZSBlZGl0IGdyYXBoLlxuICAgICAgICAvLyBUaGUgaW50ZWdlciB2YWx1ZSBpbiB0aGUgY2VsbCByZXByZXNlbnRzIHRoZSBvcmlnaW5hbEluZGV4IG9mIHRoZSBmdXJ0aGVzdFxuICAgICAgICAvLyByZWFjaGluZyBwb2ludCBmb3VuZCBzbyBmYXIgdGhhdCBlbmRzIGluIHRoYXQgZGlhZ29uYWwuXG4gICAgICAgIC8vIFRoZSBtb2RpZmllZEluZGV4IGNhbiBiZSBjb21wdXRlZCBtYXRoZW1hdGljYWxseSBmcm9tIHRoZSBvcmlnaW5hbEluZGV4IGFuZCB0aGUgZGlhZ29uYWwgbnVtYmVyLlxuICAgICAgICBjb25zdCBtYXhEaWZmZXJlbmNlcyA9IChvcmlnaW5hbEVuZCAtIG9yaWdpbmFsU3RhcnQpICsgKG1vZGlmaWVkRW5kIC0gbW9kaWZpZWRTdGFydCk7XG4gICAgICAgIGNvbnN0IG51bURpYWdvbmFscyA9IG1heERpZmZlcmVuY2VzICsgMTtcbiAgICAgICAgY29uc3QgZm9yd2FyZFBvaW50cyA9IG5ldyBJbnQzMkFycmF5KG51bURpYWdvbmFscyk7XG4gICAgICAgIGNvbnN0IHJldmVyc2VQb2ludHMgPSBuZXcgSW50MzJBcnJheShudW1EaWFnb25hbHMpO1xuICAgICAgICAvLyBkaWFnb25hbEZvcndhcmRCYXNlOiBJbmRleCBpbnRvIGZvcndhcmRQb2ludHMgb2YgdGhlIGRpYWdvbmFsIHdoaWNoIHBhc3NlcyB0aHJvdWdoIChvcmlnaW5hbFN0YXJ0LCBtb2RpZmllZFN0YXJ0KVxuICAgICAgICAvLyBkaWFnb25hbFJldmVyc2VCYXNlOiBJbmRleCBpbnRvIHJldmVyc2VQb2ludHMgb2YgdGhlIGRpYWdvbmFsIHdoaWNoIHBhc3NlcyB0aHJvdWdoIChvcmlnaW5hbEVuZCwgbW9kaWZpZWRFbmQpXG4gICAgICAgIGNvbnN0IGRpYWdvbmFsRm9yd2FyZEJhc2UgPSAobW9kaWZpZWRFbmQgLSBtb2RpZmllZFN0YXJ0KTtcbiAgICAgICAgY29uc3QgZGlhZ29uYWxSZXZlcnNlQmFzZSA9IChvcmlnaW5hbEVuZCAtIG9yaWdpbmFsU3RhcnQpO1xuICAgICAgICAvLyBkaWFnb25hbEZvcndhcmRPZmZzZXQ6IEdlb21ldHJpYyBvZmZzZXQgd2hpY2ggYWxsb3dzIG1vZGlmaWVkSW5kZXggdG8gYmUgY29tcHV0ZWQgZnJvbSBvcmlnaW5hbEluZGV4IGFuZCB0aGVcbiAgICAgICAgLy8gICAgZGlhZ29uYWwgbnVtYmVyIChyZWxhdGl2ZSB0byBkaWFnb25hbEZvcndhcmRCYXNlKVxuICAgICAgICAvLyBkaWFnb25hbFJldmVyc2VPZmZzZXQ6IEdlb21ldHJpYyBvZmZzZXQgd2hpY2ggYWxsb3dzIG1vZGlmaWVkSW5kZXggdG8gYmUgY29tcHV0ZWQgZnJvbSBvcmlnaW5hbEluZGV4IGFuZCB0aGVcbiAgICAgICAgLy8gICAgZGlhZ29uYWwgbnVtYmVyIChyZWxhdGl2ZSB0byBkaWFnb25hbFJldmVyc2VCYXNlKVxuICAgICAgICBjb25zdCBkaWFnb25hbEZvcndhcmRPZmZzZXQgPSAob3JpZ2luYWxTdGFydCAtIG1vZGlmaWVkU3RhcnQpO1xuICAgICAgICBjb25zdCBkaWFnb25hbFJldmVyc2VPZmZzZXQgPSAob3JpZ2luYWxFbmQgLSBtb2RpZmllZEVuZCk7XG4gICAgICAgIC8vIGRlbHRhOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBlbmQgZGlhZ29uYWwgYW5kIHRoZSBzdGFydCBkaWFnb25hbC4gVGhpcyBpcyB1c2VkIHRvIHJlbGF0ZSBkaWFnb25hbCBudW1iZXJzXG4gICAgICAgIC8vICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGRpYWdvbmFsIHdpdGggZGlhZ29uYWwgbnVtYmVycyByZWxhdGl2ZSB0byB0aGUgZW5kIGRpYWdvbmFsLlxuICAgICAgICAvLyBUaGUgRXZlbi9PZGRuLW5lc3Mgb2YgdGhpcyBkZWx0YSBpcyBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIHdoZW4gd2Ugc2hvdWxkIGNoZWNrIGZvciBvdmVybGFwXG4gICAgICAgIGNvbnN0IGRlbHRhID0gZGlhZ29uYWxSZXZlcnNlQmFzZSAtIGRpYWdvbmFsRm9yd2FyZEJhc2U7XG4gICAgICAgIGNvbnN0IGRlbHRhSXNFdmVuID0gKGRlbHRhICUgMiA9PT0gMCk7XG4gICAgICAgIC8vIEhlcmUgd2Ugc2V0IHVwIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50cyBhcyB0aGUgZnVydGhlc3QgcG9pbnRzIGZvdW5kIHNvIGZhclxuICAgICAgICAvLyBpbiBib3RoIHRoZSBmb3J3YXJkIGFuZCByZXZlcnNlIGRpcmVjdGlvbnMsIHJlc3BlY3RpdmVseVxuICAgICAgICBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsRm9yd2FyZEJhc2VdID0gb3JpZ2luYWxTdGFydDtcbiAgICAgICAgcmV2ZXJzZVBvaW50c1tkaWFnb25hbFJldmVyc2VCYXNlXSA9IG9yaWdpbmFsRW5kO1xuICAgICAgICAvLyBSZW1lbWJlciBpZiB3ZSBxdWl0IGVhcmx5LCBhbmQgdGh1cyBuZWVkIHRvIGRvIGEgYmVzdC1lZmZvcnQgcmVzdWx0IGluc3RlYWQgb2YgYSByZWFsIHJlc3VsdC5cbiAgICAgICAgcXVpdEVhcmx5QXJyWzBdID0gZmFsc2U7XG4gICAgICAgIC8vIEEgY291cGxlIG9mIHBvaW50czpcbiAgICAgICAgLy8gLS1XaXRoIHRoaXMgbWV0aG9kLCB3ZSBpdGVyYXRlIG9uIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHNlcXVlbmNlcy5cbiAgICAgICAgLy8gICBUaGUgbW9yZSBkaWZmZXJlbmNlcyB0aGVyZSBhY3R1YWxseSBhcmUsIHRoZSBsb25nZXIgdGhpcyB3aWxsIHRha2UuXG4gICAgICAgIC8vIC0tQWxzbywgYXMgdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlcyBpbmNyZWFzZXMsIHdlIGhhdmUgdG8gc2VhcmNoIG9uIGRpYWdvbmFscyBmdXJ0aGVyXG4gICAgICAgIC8vICAgYXdheSBmcm9tIHRoZSByZWZlcmVuY2UgZGlhZ29uYWwgKHdoaWNoIGlzIGRpYWdvbmFsRm9yd2FyZEJhc2UgZm9yIGZvcndhcmQsIGRpYWdvbmFsUmV2ZXJzZUJhc2UgZm9yIHJldmVyc2UpLlxuICAgICAgICAvLyAtLVdlIGV4dGVuZCBvbiBldmVuIGRpYWdvbmFscyAocmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZSBkaWFnb25hbCkgb25seSB3aGVuIG51bURpZmZlcmVuY2VzXG4gICAgICAgIC8vICAgaXMgZXZlbiBhbmQgb2RkIGRpYWdvbmFscyBvbmx5IHdoZW4gbnVtRGlmZmVyZW5jZXMgaXMgb2RkLlxuICAgICAgICBmb3IgKGxldCBudW1EaWZmZXJlbmNlcyA9IDE7IG51bURpZmZlcmVuY2VzIDw9IChtYXhEaWZmZXJlbmNlcyAvIDIpICsgMTsgbnVtRGlmZmVyZW5jZXMrKykge1xuICAgICAgICAgICAgbGV0IGZ1cnRoZXN0T3JpZ2luYWxJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgZnVydGhlc3RNb2RpZmllZEluZGV4ID0gMDtcbiAgICAgICAgICAgIC8vIFJ1biB0aGUgYWxnb3JpdGhtIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvblxuICAgICAgICAgICAgZGlhZ29uYWxGb3J3YXJkU3RhcnQgPSB0aGlzLkNsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsRm9yd2FyZEJhc2UgLSBudW1EaWZmZXJlbmNlcywgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsRm9yd2FyZEJhc2UsIG51bURpYWdvbmFscyk7XG4gICAgICAgICAgICBkaWFnb25hbEZvcndhcmRFbmQgPSB0aGlzLkNsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsRm9yd2FyZEJhc2UgKyBudW1EaWZmZXJlbmNlcywgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsRm9yd2FyZEJhc2UsIG51bURpYWdvbmFscyk7XG4gICAgICAgICAgICBmb3IgKGxldCBkaWFnb25hbCA9IGRpYWdvbmFsRm9yd2FyZFN0YXJ0OyBkaWFnb25hbCA8PSBkaWFnb25hbEZvcndhcmRFbmQ7IGRpYWdvbmFsICs9IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBTVEVQIDE6IFdlIGV4dGVuZCB0aGUgZnVydGhlc3QgcmVhY2hpbmcgcG9pbnQgaW4gdGhlIHByZXNlbnQgZGlhZ29uYWxcbiAgICAgICAgICAgICAgICAvLyBieSBsb29raW5nIGF0IHRoZSBkaWFnb25hbHMgYWJvdmUgYW5kIGJlbG93IGFuZCBwaWNraW5nIHRoZSBvbmUgd2hvc2UgcG9pbnRcbiAgICAgICAgICAgICAgICAvLyBpcyBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgc3RhcnQgcG9pbnQgKG9yaWdpbmFsU3RhcnQsIG1vZGlmaWVkU3RhcnQpXG4gICAgICAgICAgICAgICAgaWYgKGRpYWdvbmFsID09PSBkaWFnb25hbEZvcndhcmRTdGFydCB8fCAoZGlhZ29uYWwgPCBkaWFnb25hbEZvcndhcmRFbmQgJiYgZm9yd2FyZFBvaW50c1tkaWFnb25hbCAtIDFdIDwgZm9yd2FyZFBvaW50c1tkaWFnb25hbCArIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gZm9yd2FyZFBvaW50c1tkaWFnb25hbCArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IGZvcndhcmRQb2ludHNbZGlhZ29uYWwgLSAxXSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXggPSBvcmlnaW5hbEluZGV4IC0gKGRpYWdvbmFsIC0gZGlhZ29uYWxGb3J3YXJkQmFzZSkgLSBkaWFnb25hbEZvcndhcmRPZmZzZXQ7XG4gICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBvcmlnaW5hbEluZGV4IHNvIHdlIGNhbiB0ZXN0IGZvciBmYWxzZSBvdmVybGFwIGluIHN0ZXAgM1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBPcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxJbmRleDtcbiAgICAgICAgICAgICAgICAvLyBTVEVQIDI6IFdlIGNhbiBjb250aW51ZSB0byBleHRlbmQgdGhlIGZ1cnRoZXN0IHJlYWNoaW5nIHBvaW50IGluIHRoZSBwcmVzZW50IGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgLy8gc28gbG9uZyBhcyB0aGUgZWxlbWVudHMgYXJlIGVxdWFsLlxuICAgICAgICAgICAgICAgIHdoaWxlIChvcmlnaW5hbEluZGV4IDwgb3JpZ2luYWxFbmQgJiYgbW9kaWZpZWRJbmRleCA8IG1vZGlmaWVkRW5kICYmIHRoaXMuRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbEluZGV4ICsgMSwgbW9kaWZpZWRJbmRleCArIDEpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsXSA9IG9yaWdpbmFsSW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSW5kZXggKyBtb2RpZmllZEluZGV4ID4gZnVydGhlc3RPcmlnaW5hbEluZGV4ICsgZnVydGhlc3RNb2RpZmllZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1cnRoZXN0T3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGZ1cnRoZXN0TW9kaWZpZWRJbmRleCA9IG1vZGlmaWVkSW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNURVAgMzogSWYgZGVsdGEgaXMgb2RkIChvdmVybGFwIGZpcnN0IGhhcHBlbnMgb24gZm9yd2FyZCB3aGVuIGRlbHRhIGlzIG9kZClcbiAgICAgICAgICAgICAgICAvLyBhbmQgZGlhZ29uYWwgaXMgaW4gdGhlIHJhbmdlIG9mIHJldmVyc2UgZGlhZ29uYWxzIGNvbXB1dGVkIGZvciBudW1EaWZmZXJlbmNlcy0xXG4gICAgICAgICAgICAgICAgLy8gKHRoZSBwcmV2aW91cyBpdGVyYXRpb247IHdlIGhhdmVuJ3QgY29tcHV0ZWQgcmV2ZXJzZSBkaWFnb25hbHMgZm9yIG51bURpZmZlcmVuY2VzIHlldClcbiAgICAgICAgICAgICAgICAvLyB0aGVuIGNoZWNrIGZvciBvdmVybGFwLlxuICAgICAgICAgICAgICAgIGlmICghZGVsdGFJc0V2ZW4gJiYgTWF0aC5hYnMoZGlhZ29uYWwgLSBkaWFnb25hbFJldmVyc2VCYXNlKSA8PSAobnVtRGlmZmVyZW5jZXMgLSAxKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA+PSByZXZlcnNlUG9pbnRzW2RpYWdvbmFsXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlkT3JpZ2luYWxBcnJbMF0gPSBvcmlnaW5hbEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlkTW9kaWZpZWRBcnJbMF0gPSBtb2RpZmllZEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBPcmlnaW5hbEluZGV4IDw9IHJldmVyc2VQb2ludHNbZGlhZ29uYWxdICYmIDE0NDcgLyogTG9jYWxDb25zdGFudHMuTWF4RGlmZmVyZW5jZXNIaXN0b3J5ICovID4gMCAmJiBudW1EaWZmZXJlbmNlcyA8PSAoMTQ0NyAvKiBMb2NhbENvbnN0YW50cy5NYXhEaWZmZXJlbmNlc0hpc3RvcnkgKi8gKyAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJJTkdPISBXZSBvdmVybGFwcGVkLCBhbmQgd2UgaGF2ZSB0aGUgZnVsbCB0cmFjZSBpbiBtZW1vcnkhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV0FMS1RSQUNFKGRpYWdvbmFsRm9yd2FyZEJhc2UsIGRpYWdvbmFsRm9yd2FyZFN0YXJ0LCBkaWFnb25hbEZvcndhcmRFbmQsIGRpYWdvbmFsRm9yd2FyZE9mZnNldCwgZGlhZ29uYWxSZXZlcnNlQmFzZSwgZGlhZ29uYWxSZXZlcnNlU3RhcnQsIGRpYWdvbmFsUmV2ZXJzZUVuZCwgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0LCBmb3J3YXJkUG9pbnRzLCByZXZlcnNlUG9pbnRzLCBvcmlnaW5hbEluZGV4LCBvcmlnaW5hbEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1vZGlmaWVkSW5kZXgsIG1vZGlmaWVkRW5kLCBtaWRNb2RpZmllZEFyciwgZGVsdGFJc0V2ZW4sIHF1aXRFYXJseUFycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFaXRoZXIgZmFsc2Ugb3ZlcmxhcCwgb3Igd2UgZGlkbid0IGhhdmUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGZ1bGwgdHJhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgcmVjdXJzaW9uIHBvaW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGJlIHF1aXR0aW5nIGVhcmx5LCBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoTGVuZ3RoT2ZMb25nZXN0ID0gKChmdXJ0aGVzdE9yaWdpbmFsSW5kZXggLSBvcmlnaW5hbFN0YXJ0KSArIChmdXJ0aGVzdE1vZGlmaWVkSW5kZXggLSBtb2RpZmllZFN0YXJ0KSAtIG51bURpZmZlcmVuY2VzKSAvIDI7XG4gICAgICAgICAgICBpZiAodGhpcy5Db250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUgIT09IG51bGwgJiYgIXRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlKGZ1cnRoZXN0T3JpZ2luYWxJbmRleCwgbWF0Y2hMZW5ndGhPZkxvbmdlc3QpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZmluaXNoLCBzbyBza2lwIGFoZWFkIHRvIGdlbmVyYXRpbmcgYSByZXN1bHQgZnJvbSB3aGF0IHdlIGhhdmUuXG4gICAgICAgICAgICAgICAgcXVpdEVhcmx5QXJyWzBdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGZ1cnRoZXN0IGRpc3RhbmNlIHdlIGdvdCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uXG4gICAgICAgICAgICAgICAgbWlkT3JpZ2luYWxBcnJbMF0gPSBmdXJ0aGVzdE9yaWdpbmFsSW5kZXg7XG4gICAgICAgICAgICAgICAgbWlkTW9kaWZpZWRBcnJbMF0gPSBmdXJ0aGVzdE1vZGlmaWVkSW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoTGVuZ3RoT2ZMb25nZXN0ID4gMCAmJiAxNDQ3IC8qIExvY2FsQ29uc3RhbnRzLk1heERpZmZlcmVuY2VzSGlzdG9yeSAqLyA+IDAgJiYgbnVtRGlmZmVyZW5jZXMgPD0gKDE0NDcgLyogTG9jYWxDb25zdGFudHMuTWF4RGlmZmVyZW5jZXNIaXN0b3J5ICovICsgMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5vdWdoIG9mIHRoZSBoaXN0b3J5IGlzIGluIG1lbW9yeSB0byB3YWxrIGl0IGJhY2t3YXJkc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5XQUxLVFJBQ0UoZGlhZ29uYWxGb3J3YXJkQmFzZSwgZGlhZ29uYWxGb3J3YXJkU3RhcnQsIGRpYWdvbmFsRm9yd2FyZEVuZCwgZGlhZ29uYWxGb3J3YXJkT2Zmc2V0LCBkaWFnb25hbFJldmVyc2VCYXNlLCBkaWFnb25hbFJldmVyc2VTdGFydCwgZGlhZ29uYWxSZXZlcnNlRW5kLCBkaWFnb25hbFJldmVyc2VPZmZzZXQsIGZvcndhcmRQb2ludHMsIHJldmVyc2VQb2ludHMsIG9yaWdpbmFsSW5kZXgsIG9yaWdpbmFsRW5kLCBtaWRPcmlnaW5hbEFyciwgbW9kaWZpZWRJbmRleCwgbW9kaWZpZWRFbmQsIG1pZE1vZGlmaWVkQXJyLCBkZWx0YUlzRXZlbiwgcXVpdEVhcmx5QXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBhY3R1YWxseSByZW1lbWJlciBlbm91Z2ggb2YgdGhlIGhpc3RvcnkuXG4gICAgICAgICAgICAgICAgICAgIC8vU2luY2Ugd2UgYXJlIHF1aXR0aW5nIHRoZSBkaWZmIGVhcmx5LCB3ZSBuZWVkIHRvIHNoaWZ0IGJhY2sgdGhlIG9yaWdpbmFsU3RhcnQgYW5kIG1vZGlmaWVkIHN0YXJ0XG4gICAgICAgICAgICAgICAgICAgIC8vYmFjayBpbnRvIHRoZSBib3VuZGFyeSBsaW1pdHMgc2luY2Ugd2UgZGVjcmVtZW50ZWQgdGhlaXIgdmFsdWUgYWJvdmUgYmV5b25kIHRoZSBib3VuZGFyeSBsaW1pdC5cbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydCsrO1xuICAgICAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0Kys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlmZkNoYW5nZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCAtIG9yaWdpbmFsU3RhcnQgKyAxLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZEVuZCAtIG1vZGlmaWVkU3RhcnQgKyAxKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJ1biB0aGUgYWxnb3JpdGhtIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvblxuICAgICAgICAgICAgZGlhZ29uYWxSZXZlcnNlU3RhcnQgPSB0aGlzLkNsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsUmV2ZXJzZUJhc2UgLSBudW1EaWZmZXJlbmNlcywgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIG51bURpYWdvbmFscyk7XG4gICAgICAgICAgICBkaWFnb25hbFJldmVyc2VFbmQgPSB0aGlzLkNsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsUmV2ZXJzZUJhc2UgKyBudW1EaWZmZXJlbmNlcywgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIG51bURpYWdvbmFscyk7XG4gICAgICAgICAgICBmb3IgKGxldCBkaWFnb25hbCA9IGRpYWdvbmFsUmV2ZXJzZVN0YXJ0OyBkaWFnb25hbCA8PSBkaWFnb25hbFJldmVyc2VFbmQ7IGRpYWdvbmFsICs9IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBTVEVQIDE6IFdlIGV4dGVuZCB0aGUgZnVydGhlc3QgcmVhY2hpbmcgcG9pbnQgaW4gdGhlIHByZXNlbnQgZGlhZ29uYWxcbiAgICAgICAgICAgICAgICAvLyBieSBsb29raW5nIGF0IHRoZSBkaWFnb25hbHMgYWJvdmUgYW5kIGJlbG93IGFuZCBwaWNraW5nIHRoZSBvbmUgd2hvc2UgcG9pbnRcbiAgICAgICAgICAgICAgICAvLyBpcyBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgc3RhcnQgcG9pbnQgKG9yaWdpbmFsRW5kLCBtb2RpZmllZEVuZClcbiAgICAgICAgICAgICAgICBpZiAoZGlhZ29uYWwgPT09IGRpYWdvbmFsUmV2ZXJzZVN0YXJ0IHx8IChkaWFnb25hbCA8IGRpYWdvbmFsUmV2ZXJzZUVuZCAmJiByZXZlcnNlUG9pbnRzW2RpYWdvbmFsIC0gMV0gPj0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCArIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCArIDFdIC0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXggPSByZXZlcnNlUG9pbnRzW2RpYWdvbmFsIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXggPSBvcmlnaW5hbEluZGV4IC0gKGRpYWdvbmFsIC0gZGlhZ29uYWxSZXZlcnNlQmFzZSkgLSBkaWFnb25hbFJldmVyc2VPZmZzZXQ7XG4gICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBvcmlnaW5hbEluZGV4IHNvIHdlIGNhbiB0ZXN0IGZvciBmYWxzZSBvdmVybGFwXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcE9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEluZGV4O1xuICAgICAgICAgICAgICAgIC8vIFNURVAgMjogV2UgY2FuIGNvbnRpbnVlIHRvIGV4dGVuZCB0aGUgZnVydGhlc3QgcmVhY2hpbmcgcG9pbnQgaW4gdGhlIHByZXNlbnQgZGlhZ29uYWxcbiAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHRoZSBlbGVtZW50cyBhcmUgZXF1YWwuXG4gICAgICAgICAgICAgICAgd2hpbGUgKG9yaWdpbmFsSW5kZXggPiBvcmlnaW5hbFN0YXJ0ICYmIG1vZGlmaWVkSW5kZXggPiBtb2RpZmllZFN0YXJ0ICYmIHRoaXMuRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbEluZGV4LCBtb2RpZmllZEluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4LS07XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV2ZXJzZVBvaW50c1tkaWFnb25hbF0gPSBvcmlnaW5hbEluZGV4O1xuICAgICAgICAgICAgICAgIC8vIFNURVAgNDogSWYgZGVsdGEgaXMgZXZlbiAob3ZlcmxhcCBmaXJzdCBoYXBwZW5zIG9uIHJldmVyc2Ugd2hlbiBkZWx0YSBpcyBldmVuKVxuICAgICAgICAgICAgICAgIC8vIGFuZCBkaWFnb25hbCBpcyBpbiB0aGUgcmFuZ2Ugb2YgZm9yd2FyZCBkaWFnb25hbHMgY29tcHV0ZWQgZm9yIG51bURpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgLy8gdGhlbiBjaGVjayBmb3Igb3ZlcmxhcC5cbiAgICAgICAgICAgICAgICBpZiAoZGVsdGFJc0V2ZW4gJiYgTWF0aC5hYnMoZGlhZ29uYWwgLSBkaWFnb25hbEZvcndhcmRCYXNlKSA8PSBudW1EaWZmZXJlbmNlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA8PSBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlkT3JpZ2luYWxBcnJbMF0gPSBvcmlnaW5hbEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlkTW9kaWZpZWRBcnJbMF0gPSBtb2RpZmllZEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBPcmlnaW5hbEluZGV4ID49IGZvcndhcmRQb2ludHNbZGlhZ29uYWxdICYmIDE0NDcgLyogTG9jYWxDb25zdGFudHMuTWF4RGlmZmVyZW5jZXNIaXN0b3J5ICovID4gMCAmJiBudW1EaWZmZXJlbmNlcyA8PSAoMTQ0NyAvKiBMb2NhbENvbnN0YW50cy5NYXhEaWZmZXJlbmNlc0hpc3RvcnkgKi8gKyAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJJTkdPISBXZSBvdmVybGFwcGVkLCBhbmQgd2UgaGF2ZSB0aGUgZnVsbCB0cmFjZSBpbiBtZW1vcnkhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV0FMS1RSQUNFKGRpYWdvbmFsRm9yd2FyZEJhc2UsIGRpYWdvbmFsRm9yd2FyZFN0YXJ0LCBkaWFnb25hbEZvcndhcmRFbmQsIGRpYWdvbmFsRm9yd2FyZE9mZnNldCwgZGlhZ29uYWxSZXZlcnNlQmFzZSwgZGlhZ29uYWxSZXZlcnNlU3RhcnQsIGRpYWdvbmFsUmV2ZXJzZUVuZCwgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0LCBmb3J3YXJkUG9pbnRzLCByZXZlcnNlUG9pbnRzLCBvcmlnaW5hbEluZGV4LCBvcmlnaW5hbEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1vZGlmaWVkSW5kZXgsIG1vZGlmaWVkRW5kLCBtaWRNb2RpZmllZEFyciwgZGVsdGFJc0V2ZW4sIHF1aXRFYXJseUFycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFaXRoZXIgZmFsc2Ugb3ZlcmxhcCwgb3Igd2UgZGlkbid0IGhhdmUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGZ1bGwgdHJhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgcmVjdXJzaW9uIHBvaW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTYXZlIGN1cnJlbnQgdmVjdG9ycyB0byBoaXN0b3J5IGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb25cbiAgICAgICAgICAgIGlmIChudW1EaWZmZXJlbmNlcyA8PSAxNDQ3IC8qIExvY2FsQ29uc3RhbnRzLk1heERpZmZlcmVuY2VzSGlzdG9yeSAqLykge1xuICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhbGxvY2F0aW5nIHNwYWNlIGZvciBvbmUgZXh0cmEgaW50LCB3aGljaCB3ZSBmaWxsIHdpdGhcbiAgICAgICAgICAgICAgICAvLyB0aGUgaW5kZXggb2YgdGhlIGRpYWdvbmFsIGJhc2UgaW5kZXhcbiAgICAgICAgICAgICAgICBsZXQgdGVtcCA9IG5ldyBJbnQzMkFycmF5KGRpYWdvbmFsRm9yd2FyZEVuZCAtIGRpYWdvbmFsRm9yd2FyZFN0YXJ0ICsgMik7XG4gICAgICAgICAgICAgICAgdGVtcFswXSA9IGRpYWdvbmFsRm9yd2FyZEJhc2UgLSBkaWFnb25hbEZvcndhcmRTdGFydCArIDE7XG4gICAgICAgICAgICAgICAgTXlBcnJheS5Db3B5Mihmb3J3YXJkUG9pbnRzLCBkaWFnb25hbEZvcndhcmRTdGFydCwgdGVtcCwgMSwgZGlhZ29uYWxGb3J3YXJkRW5kIC0gZGlhZ29uYWxGb3J3YXJkU3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1fZm9yd2FyZEhpc3RvcnkucHVzaCh0ZW1wKTtcbiAgICAgICAgICAgICAgICB0ZW1wID0gbmV3IEludDMyQXJyYXkoZGlhZ29uYWxSZXZlcnNlRW5kIC0gZGlhZ29uYWxSZXZlcnNlU3RhcnQgKyAyKTtcbiAgICAgICAgICAgICAgICB0ZW1wWzBdID0gZGlhZ29uYWxSZXZlcnNlQmFzZSAtIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0ICsgMTtcbiAgICAgICAgICAgICAgICBNeUFycmF5LkNvcHkyKHJldmVyc2VQb2ludHMsIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0LCB0ZW1wLCAxLCBkaWFnb25hbFJldmVyc2VFbmQgLSBkaWFnb25hbFJldmVyc2VTdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubV9yZXZlcnNlSGlzdG9yeS5wdXNoKHRlbXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIHdlIGhhdmUgdGhlIGZ1bGwgdHJhY2UgaW4gaGlzdG9yeS4gV2UganVzdCBoYXZlIHRvIGNvbnZlcnQgaXQgdG8gYSBjaGFuZ2UgbGlzdFxuICAgICAgICAvLyBOT1RFOiBUaGlzIHBhcnQgaXMgYSBiaXQgbWVzc3lcbiAgICAgICAgcmV0dXJuIHRoaXMuV0FMS1RSQUNFKGRpYWdvbmFsRm9yd2FyZEJhc2UsIGRpYWdvbmFsRm9yd2FyZFN0YXJ0LCBkaWFnb25hbEZvcndhcmRFbmQsIGRpYWdvbmFsRm9yd2FyZE9mZnNldCwgZGlhZ29uYWxSZXZlcnNlQmFzZSwgZGlhZ29uYWxSZXZlcnNlU3RhcnQsIGRpYWdvbmFsUmV2ZXJzZUVuZCwgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0LCBmb3J3YXJkUG9pbnRzLCByZXZlcnNlUG9pbnRzLCBvcmlnaW5hbEluZGV4LCBvcmlnaW5hbEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1vZGlmaWVkSW5kZXgsIG1vZGlmaWVkRW5kLCBtaWRNb2RpZmllZEFyciwgZGVsdGFJc0V2ZW4sIHF1aXRFYXJseUFycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNoaWZ0cyB0aGUgZ2l2ZW4gY2hhbmdlcyB0byBwcm92aWRlIGEgbW9yZSBpbnR1aXRpdmUgZGlmZi5cbiAgICAgKiBXaGlsZSB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIGRpZmYgbWF0Y2hlcyB0aGUgZmlyc3QgZWxlbWVudCBhZnRlciB0aGUgZGlmZixcbiAgICAgKiB3ZSBzaGlmdCB0aGUgZGlmZiBkb3duLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIGxpc3Qgb2YgY2hhbmdlcyB0byBzaGlmdFxuICAgICAqIEByZXR1cm5zIFRoZSBzaGlmdGVkIGNoYW5nZXNcbiAgICAgKi9cbiAgICBQcmV0dGlmeUNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICAvLyBTaGlmdCBhbGwgdGhlIGNoYW5nZXMgZG93biBmaXJzdFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFN0b3AgPSAoaSA8IGNoYW5nZXMubGVuZ3RoIC0gMSkgPyBjaGFuZ2VzW2kgKyAxXS5vcmlnaW5hbFN0YXJ0IDogdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZFN0b3AgPSAoaSA8IGNoYW5nZXMubGVuZ3RoIC0gMSkgPyBjaGFuZ2VzW2kgKyAxXS5tb2RpZmllZFN0YXJ0IDogdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBjaGVja09yaWdpbmFsID0gY2hhbmdlLm9yaWdpbmFsTGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrTW9kaWZpZWQgPSBjaGFuZ2UubW9kaWZpZWRMZW5ndGggPiAwO1xuICAgICAgICAgICAgd2hpbGUgKGNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoIDwgb3JpZ2luYWxTdG9wXG4gICAgICAgICAgICAgICAgJiYgY2hhbmdlLm1vZGlmaWVkU3RhcnQgKyBjaGFuZ2UubW9kaWZpZWRMZW5ndGggPCBtb2RpZmllZFN0b3BcbiAgICAgICAgICAgICAgICAmJiAoIWNoZWNrT3JpZ2luYWwgfHwgdGhpcy5PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwoY2hhbmdlLm9yaWdpbmFsU3RhcnQsIGNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAmJiAoIWNoZWNrTW9kaWZpZWQgfHwgdGhpcy5Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwoY2hhbmdlLm1vZGlmaWVkU3RhcnQsIGNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFN0cmljdEVxdWFsID0gdGhpcy5FbGVtZW50c0FyZVN0cmljdEVxdWFsKGNoYW5nZS5vcmlnaW5hbFN0YXJ0LCBjaGFuZ2UubW9kaWZpZWRTdGFydCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kU3RyaWN0RXF1YWwgPSB0aGlzLkVsZW1lbnRzQXJlU3RyaWN0RXF1YWwoY2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBjaGFuZ2Uub3JpZ2luYWxMZW5ndGgsIGNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kU3RyaWN0RXF1YWwgJiYgIXN0YXJ0U3RyaWN0RXF1YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbW92aW5nIHRoZSBjaGFuZ2UgZG93biB3b3VsZCBjcmVhdGUgYW4gZXF1YWwgY2hhbmdlLCBidXQgdGhlIGVsZW1lbnRzIGFyZSBub3Qgc3RyaWN0IGVxdWFsXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGFuZ2Uub3JpZ2luYWxTdGFydCsrO1xuICAgICAgICAgICAgICAgIGNoYW5nZS5tb2RpZmllZFN0YXJ0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXJnZWRDaGFuZ2VBcnIgPSBbbnVsbF07XG4gICAgICAgICAgICBpZiAoaSA8IGNoYW5nZXMubGVuZ3RoIC0gMSAmJiB0aGlzLkNoYW5nZXNPdmVybGFwKGNoYW5nZXNbaV0sIGNoYW5nZXNbaSArIDFdLCBtZXJnZWRDaGFuZ2VBcnIpKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlc1tpXSA9IG1lcmdlZENoYW5nZUFyclswXTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnNwbGljZShpICsgMSwgMSk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNoaWZ0IGNoYW5nZXMgYmFjayB1cCB1bnRpbCB3ZSBoaXQgZW1wdHkgb3Igd2hpdGVzcGFjZS1vbmx5IGxpbmVzXG4gICAgICAgIGZvciAobGV0IGkgPSBjaGFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsU3RvcCA9IDA7XG4gICAgICAgICAgICBsZXQgbW9kaWZpZWRTdG9wID0gMDtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZDaGFuZ2UgPSBjaGFuZ2VzW2kgLSAxXTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFN0b3AgPSBwcmV2Q2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBwcmV2Q2hhbmdlLm9yaWdpbmFsTGVuZ3RoO1xuICAgICAgICAgICAgICAgIG1vZGlmaWVkU3RvcCA9IHByZXZDaGFuZ2UubW9kaWZpZWRTdGFydCArIHByZXZDaGFuZ2UubW9kaWZpZWRMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjaGVja09yaWdpbmFsID0gY2hhbmdlLm9yaWdpbmFsTGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrTW9kaWZpZWQgPSBjaGFuZ2UubW9kaWZpZWRMZW5ndGggPiAwO1xuICAgICAgICAgICAgbGV0IGJlc3REZWx0YSA9IDA7XG4gICAgICAgICAgICBsZXQgYmVzdFNjb3JlID0gdGhpcy5fYm91bmRhcnlTY29yZShjaGFuZ2Uub3JpZ2luYWxTdGFydCwgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoLCBjaGFuZ2UubW9kaWZpZWRTdGFydCwgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGRlbHRhID0gMTs7IGRlbHRhKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFN0YXJ0ID0gY2hhbmdlLm9yaWdpbmFsU3RhcnQgLSBkZWx0YTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZFN0YXJ0ID0gY2hhbmdlLm1vZGlmaWVkU3RhcnQgLSBkZWx0YTtcbiAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxTdGFydCA8IG9yaWdpbmFsU3RvcCB8fCBtb2RpZmllZFN0YXJ0IDwgbW9kaWZpZWRTdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tPcmlnaW5hbCAmJiAhdGhpcy5PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxTdGFydCArIGNoYW5nZS5vcmlnaW5hbExlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaGVja01vZGlmaWVkICYmICF0aGlzLk1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChtb2RpZmllZFN0YXJ0LCBtb2RpZmllZFN0YXJ0ICsgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdG91Y2hpbmdQcmV2aW91c0NoYW5nZSA9IChvcmlnaW5hbFN0YXJ0ID09PSBvcmlnaW5hbFN0b3AgJiYgbW9kaWZpZWRTdGFydCA9PT0gbW9kaWZpZWRTdG9wKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY29yZSA9ICgodG91Y2hpbmdQcmV2aW91c0NoYW5nZSA/IDUgOiAwKVxuICAgICAgICAgICAgICAgICAgICArIHRoaXMuX2JvdW5kYXJ5U2NvcmUob3JpZ2luYWxTdGFydCwgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoLCBtb2RpZmllZFN0YXJ0LCBjaGFuZ2UubW9kaWZpZWRMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIGJlc3REZWx0YSA9IGRlbHRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoYW5nZS5vcmlnaW5hbFN0YXJ0IC09IGJlc3REZWx0YTtcbiAgICAgICAgICAgIGNoYW5nZS5tb2RpZmllZFN0YXJ0IC09IGJlc3REZWx0YTtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZENoYW5nZUFyciA9IFtudWxsXTtcbiAgICAgICAgICAgIGlmIChpID4gMCAmJiB0aGlzLkNoYW5nZXNPdmVybGFwKGNoYW5nZXNbaSAtIDFdLCBjaGFuZ2VzW2ldLCBtZXJnZWRDaGFuZ2VBcnIpKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlc1tpIC0gMV0gPSBtZXJnZWRDaGFuZ2VBcnJbMF07XG4gICAgICAgICAgICAgICAgY2hhbmdlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGxvbmdlc3QgY29tbW9uIHN1YnN0cmluZ3MuXG4gICAgICAgIC8vIEdpdmUgcHJlZmVyZW5jZSB0byB0aGUgb25lcyBjb250YWluaW5nIGxvbmdlciBsaW5lc1xuICAgICAgICBpZiAodGhpcy5faGFzU3RyaW5ncykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDEsIGxlbiA9IGNoYW5nZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhQ2hhbmdlID0gY2hhbmdlc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgY29uc3QgYkNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZExlbmd0aCA9IGJDaGFuZ2Uub3JpZ2luYWxTdGFydCAtIGFDaGFuZ2Uub3JpZ2luYWxTdGFydCAtIGFDaGFuZ2Uub3JpZ2luYWxMZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYU9yaWdpbmFsU3RhcnQgPSBhQ2hhbmdlLm9yaWdpbmFsU3RhcnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYk9yaWdpbmFsRW5kID0gYkNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgYkNoYW5nZS5vcmlnaW5hbExlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBhYk9yaWdpbmFsTGVuZ3RoID0gYk9yaWdpbmFsRW5kIC0gYU9yaWdpbmFsU3RhcnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYU1vZGlmaWVkU3RhcnQgPSBhQ2hhbmdlLm1vZGlmaWVkU3RhcnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYk1vZGlmaWVkRW5kID0gYkNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgYkNoYW5nZS5tb2RpZmllZExlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBhYk1vZGlmaWVkTGVuZ3RoID0gYk1vZGlmaWVkRW5kIC0gYU1vZGlmaWVkU3RhcnQ7XG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgd2FzdGluZyBhIGxvdCBvZiB0aW1lIHdpdGggdGhlc2Ugc2VhcmNoZXNcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZExlbmd0aCA8IDUgJiYgYWJPcmlnaW5hbExlbmd0aCA8IDIwICYmIGFiTW9kaWZpZWRMZW5ndGggPCAyMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fZmluZEJldHRlckNvbnRpZ3VvdXNTZXF1ZW5jZShhT3JpZ2luYWxTdGFydCwgYWJPcmlnaW5hbExlbmd0aCwgYU1vZGlmaWVkU3RhcnQsIGFiTW9kaWZpZWRMZW5ndGgsIG1hdGNoZWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbmFsTWF0Y2hTdGFydCwgbW9kaWZpZWRNYXRjaFN0YXJ0XSA9IHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxNYXRjaFN0YXJ0ICE9PSBhQ2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBhQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoIHx8IG1vZGlmaWVkTWF0Y2hTdGFydCAhPT0gYUNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgYUNoYW5nZS5tb2RpZmllZExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBhbm90aGVyIHNlcXVlbmNlIHRoYXQgaGFzIGEgYmV0dGVyIHNjb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNoYW5nZS5vcmlnaW5hbExlbmd0aCA9IG9yaWdpbmFsTWF0Y2hTdGFydCAtIGFDaGFuZ2Uub3JpZ2luYWxTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoID0gbW9kaWZpZWRNYXRjaFN0YXJ0IC0gYUNoYW5nZS5tb2RpZmllZFN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGFuZ2Uub3JpZ2luYWxTdGFydCA9IG9yaWdpbmFsTWF0Y2hTdGFydCArIG1hdGNoZWRMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoYW5nZS5tb2RpZmllZFN0YXJ0ID0gbW9kaWZpZWRNYXRjaFN0YXJ0ICsgbWF0Y2hlZExlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoID0gYk9yaWdpbmFsRW5kIC0gYkNoYW5nZS5vcmlnaW5hbFN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGFuZ2UubW9kaWZpZWRMZW5ndGggPSBiTW9kaWZpZWRFbmQgLSBiQ2hhbmdlLm1vZGlmaWVkU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfVxuICAgIF9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsTGVuZ3RoLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZExlbmd0aCwgZGVzaXJlZExlbmd0aCkge1xuICAgICAgICBpZiAob3JpZ2luYWxMZW5ndGggPCBkZXNpcmVkTGVuZ3RoIHx8IG1vZGlmaWVkTGVuZ3RoIDwgZGVzaXJlZExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNYXggPSBvcmlnaW5hbFN0YXJ0ICsgb3JpZ2luYWxMZW5ndGggLSBkZXNpcmVkTGVuZ3RoICsgMTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWRNYXggPSBtb2RpZmllZFN0YXJ0ICsgbW9kaWZpZWRMZW5ndGggLSBkZXNpcmVkTGVuZ3RoICsgMTtcbiAgICAgICAgbGV0IGJlc3RTY29yZSA9IDA7XG4gICAgICAgIGxldCBiZXN0T3JpZ2luYWxTdGFydCA9IDA7XG4gICAgICAgIGxldCBiZXN0TW9kaWZpZWRTdGFydCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBvcmlnaW5hbFN0YXJ0OyBpIDwgb3JpZ2luYWxNYXg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IG1vZGlmaWVkU3RhcnQ7IGogPCBtb2RpZmllZE1heDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSB0aGlzLl9jb250aWd1b3VzU2VxdWVuY2VTY29yZShpLCBqLCBkZXNpcmVkTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiAwICYmIHNjb3JlID4gYmVzdFNjb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBiZXN0T3JpZ2luYWxTdGFydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb2RpZmllZFN0YXJ0ID0gajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlc3RTY29yZSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbYmVzdE9yaWdpbmFsU3RhcnQsIGJlc3RNb2RpZmllZFN0YXJ0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgX2NvbnRpZ3VvdXNTZXF1ZW5jZVNjb3JlKG9yaWdpbmFsU3RhcnQsIG1vZGlmaWVkU3RhcnQsIGxlbmd0aCkge1xuICAgICAgICBsZXQgc2NvcmUgPSAwO1xuICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IGxlbmd0aDsgbCsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbFN0YXJ0ICsgbCwgbW9kaWZpZWRTdGFydCArIGwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29yZSArPSB0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW29yaWdpbmFsU3RhcnQgKyBsXS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3JlO1xuICAgIH1cbiAgICBfT3JpZ2luYWxJc0JvdW5kYXJ5KGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA8PSAwIHx8IGluZGV4ID49IHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLl9oYXNTdHJpbmdzICYmIC9eXFxzKiQvLnRlc3QodGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tpbmRleF0pKTtcbiAgICB9XG4gICAgX09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KG9yaWdpbmFsU3RhcnQpIHx8IHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShvcmlnaW5hbFN0YXJ0IC0gMSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcmlnaW5hbExlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gb3JpZ2luYWxTdGFydCArIG9yaWdpbmFsTGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShvcmlnaW5hbEVuZCAtIDEpIHx8IHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShvcmlnaW5hbEVuZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIF9Nb2RpZmllZElzQm91bmRhcnkoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4IDw9IDAgfHwgaW5kZXggPj0gdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuX2hhc1N0cmluZ3MgJiYgL15cXHMqJC8udGVzdCh0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW2luZGV4XSkpO1xuICAgIH1cbiAgICBfTW9kaWZpZWRSZWdpb25Jc0JvdW5kYXJ5KG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkTGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkobW9kaWZpZWRTdGFydCkgfHwgdGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KG1vZGlmaWVkU3RhcnQgLSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGlmaWVkTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRFbmQgPSBtb2RpZmllZFN0YXJ0ICsgbW9kaWZpZWRMZW5ndGg7XG4gICAgICAgICAgICBpZiAodGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KG1vZGlmaWVkRW5kIC0gMSkgfHwgdGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KG1vZGlmaWVkRW5kKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgX2JvdW5kYXJ5U2NvcmUob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxMZW5ndGgsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkTGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU2NvcmUgPSAodGhpcy5fT3JpZ2luYWxSZWdpb25Jc0JvdW5kYXJ5KG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsTGVuZ3RoKSA/IDEgOiAwKTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWRTY29yZSA9ICh0aGlzLl9Nb2RpZmllZFJlZ2lvbklzQm91bmRhcnkobW9kaWZpZWRTdGFydCwgbW9kaWZpZWRMZW5ndGgpID8gMSA6IDApO1xuICAgICAgICByZXR1cm4gKG9yaWdpbmFsU2NvcmUgKyBtb2RpZmllZFNjb3JlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gaW5wdXQgRGlmZkNoYW5nZSBsaXN0cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nXG4gICAgICogbGlzdC5cbiAgICAgKiBAcGFyYW0gVGhlIGxlZnQgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBUaGUgcmlnaHQgY2hhbmdlc1xuICAgICAqIEByZXR1cm5zIFRoZSBjb25jYXRlbmF0ZWQgbGlzdFxuICAgICAqL1xuICAgIENvbmNhdGVuYXRlQ2hhbmdlcyhsZWZ0LCByaWdodCkge1xuICAgICAgICBjb25zdCBtZXJnZWRDaGFuZ2VBcnIgPSBbXTtcbiAgICAgICAgaWYgKGxlZnQubGVuZ3RoID09PSAwIHx8IHJpZ2h0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIChyaWdodC5sZW5ndGggPiAwKSA/IHJpZ2h0IDogbGVmdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLkNoYW5nZXNPdmVybGFwKGxlZnRbbGVmdC5sZW5ndGggLSAxXSwgcmlnaHRbMF0sIG1lcmdlZENoYW5nZUFycikpIHtcbiAgICAgICAgICAgIC8vIFNpbmNlIHdlIGJyZWFrIHRoZSBwcm9ibGVtIGRvd24gcmVjdXJzaXZlbHksIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2VcbiAgICAgICAgICAgIC8vIG1pZ2h0IHJlY3Vyc2UgaW4gdGhlIG1pZGRsZSBvZiBhIGNoYW5nZSB0aGVyZWJ5IHNwbGl0dGluZyBpdCBpbnRvXG4gICAgICAgICAgICAvLyB0d28gY2hhbmdlcy4gSGVyZSBpbiB0aGUgY29tYmluaW5nIHN0YWdlLCB3ZSBkZXRlY3QgYW5kIGZ1c2UgdGhvc2VcbiAgICAgICAgICAgIC8vIGNoYW5nZXMgYmFjayB0b2dldGhlclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlZnQubGVuZ3RoICsgcmlnaHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBNeUFycmF5LkNvcHkobGVmdCwgMCwgcmVzdWx0LCAwLCBsZWZ0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmVzdWx0W2xlZnQubGVuZ3RoIC0gMV0gPSBtZXJnZWRDaGFuZ2VBcnJbMF07XG4gICAgICAgICAgICBNeUFycmF5LkNvcHkocmlnaHQsIDEsIHJlc3VsdCwgbGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShsZWZ0Lmxlbmd0aCArIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICAgICAgICBNeUFycmF5LkNvcHkobGVmdCwgMCwgcmVzdWx0LCAwLCBsZWZ0Lmxlbmd0aCk7XG4gICAgICAgICAgICBNeUFycmF5LkNvcHkocmlnaHQsIDAsIHJlc3VsdCwgbGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGNoYW5nZXMgb3ZlcmxhcCBhbmQgY2FuIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlXG4gICAgICogY2hhbmdlXG4gICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY2hhbmdlXG4gICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjaGFuZ2VcbiAgICAgKiBAcGFyYW0gbWVyZ2VkQ2hhbmdlIFRoZSBtZXJnZWQgY2hhbmdlIGlmIHRoZSB0d28gb3ZlcmxhcCwgbnVsbCBvdGhlcndpc2VcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0d28gY2hhbmdlcyBvdmVybGFwXG4gICAgICovXG4gICAgQ2hhbmdlc092ZXJsYXAobGVmdCwgcmlnaHQsIG1lcmdlZENoYW5nZUFycikge1xuICAgICAgICBEZWJ1Zy5Bc3NlcnQobGVmdC5vcmlnaW5hbFN0YXJ0IDw9IHJpZ2h0Lm9yaWdpbmFsU3RhcnQsICdMZWZ0IGNoYW5nZSBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0IGNoYW5nZScpO1xuICAgICAgICBEZWJ1Zy5Bc3NlcnQobGVmdC5tb2RpZmllZFN0YXJ0IDw9IHJpZ2h0Lm1vZGlmaWVkU3RhcnQsICdMZWZ0IGNoYW5nZSBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0IGNoYW5nZScpO1xuICAgICAgICBpZiAobGVmdC5vcmlnaW5hbFN0YXJ0ICsgbGVmdC5vcmlnaW5hbExlbmd0aCA+PSByaWdodC5vcmlnaW5hbFN0YXJ0IHx8IGxlZnQubW9kaWZpZWRTdGFydCArIGxlZnQubW9kaWZpZWRMZW5ndGggPj0gcmlnaHQubW9kaWZpZWRTdGFydCkge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydCA9IGxlZnQub3JpZ2luYWxTdGFydDtcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbExlbmd0aCA9IGxlZnQub3JpZ2luYWxMZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZFN0YXJ0ID0gbGVmdC5tb2RpZmllZFN0YXJ0O1xuICAgICAgICAgICAgbGV0IG1vZGlmaWVkTGVuZ3RoID0gbGVmdC5tb2RpZmllZExlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZWZ0Lm9yaWdpbmFsU3RhcnQgKyBsZWZ0Lm9yaWdpbmFsTGVuZ3RoID49IHJpZ2h0Lm9yaWdpbmFsU3RhcnQpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbExlbmd0aCA9IHJpZ2h0Lm9yaWdpbmFsU3RhcnQgKyByaWdodC5vcmlnaW5hbExlbmd0aCAtIGxlZnQub3JpZ2luYWxTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWZ0Lm1vZGlmaWVkU3RhcnQgKyBsZWZ0Lm1vZGlmaWVkTGVuZ3RoID49IHJpZ2h0Lm1vZGlmaWVkU3RhcnQpIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllZExlbmd0aCA9IHJpZ2h0Lm1vZGlmaWVkU3RhcnQgKyByaWdodC5tb2RpZmllZExlbmd0aCAtIGxlZnQubW9kaWZpZWRTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lcmdlZENoYW5nZUFyclswXSA9IG5ldyBEaWZmQ2hhbmdlKG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsTGVuZ3RoLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZExlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1lcmdlZENoYW5nZUFyclswXSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB1c2VkIHRvIGNsaXAgYSBkaWFnb25hbCBpbmRleCB0byB0aGUgcmFuZ2Ugb2YgdmFsaWRcbiAgICAgKiBkaWFnb25hbHMuIFRoaXMgYWxzbyBkZWNpZGVzIHdoZXRoZXIgb3Igbm90IHRoZSBkaWFnb25hbCBpbmRleCxcbiAgICAgKiBpZiBpdCBleGNlZWRzIHRoZSBib3VuZGFyeSwgc2hvdWxkIGJlIGNsaXBwZWQgdG8gdGhlIGJvdW5kYXJ5IG9yIGNsaXBwZWRcbiAgICAgKiBvbmUgaW5zaWRlIHRoZSBib3VuZGFyeSBkZXBlbmRpbmcgb24gdGhlIEV2ZW4vT2RkIHN0YXR1cyBvZiB0aGUgYm91bmRhcnlcbiAgICAgKiBhbmQgbnVtRGlmZmVyZW5jZXMuXG4gICAgICogQHBhcmFtIGRpYWdvbmFsIFRoZSBpbmRleCBvZiB0aGUgZGlhZ29uYWwgdG8gY2xpcC5cbiAgICAgKiBAcGFyYW0gbnVtRGlmZmVyZW5jZXMgVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGRpZmZlcmVuY2VzIGJlaW5nIGl0ZXJhdGVkIHVwb24uXG4gICAgICogQHBhcmFtIGRpYWdvbmFsQmFzZUluZGV4IFRoZSBiYXNlIHJlZmVyZW5jZSBkaWFnb25hbC5cbiAgICAgKiBAcGFyYW0gbnVtRGlhZ29uYWxzIFRoZSB0b3RhbCBudW1iZXIgb2YgZGlhZ29uYWxzLlxuICAgICAqIEByZXR1cm5zIFRoZSBjbGlwcGVkIGRpYWdvbmFsIGluZGV4LlxuICAgICAqL1xuICAgIENsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsLCBudW1EaWZmZXJlbmNlcywgZGlhZ29uYWxCYXNlSW5kZXgsIG51bURpYWdvbmFscykge1xuICAgICAgICBpZiAoZGlhZ29uYWwgPj0gMCAmJiBkaWFnb25hbCA8IG51bURpYWdvbmFscykge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBjbGlwLCBpdHMgaW4gcmFuZ2VcbiAgICAgICAgICAgIHJldHVybiBkaWFnb25hbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBkaWFnb25hbHNCZWxvdzogVGhlIG51bWJlciBvZiBkaWFnb25hbHMgYmVsb3cgdGhlIHJlZmVyZW5jZSBkaWFnb25hbFxuICAgICAgICAvLyBkaWFnb25hbHNBYm92ZTogVGhlIG51bWJlciBvZiBkaWFnb25hbHMgYWJvdmUgdGhlIHJlZmVyZW5jZSBkaWFnb25hbFxuICAgICAgICBjb25zdCBkaWFnb25hbHNCZWxvdyA9IGRpYWdvbmFsQmFzZUluZGV4O1xuICAgICAgICBjb25zdCBkaWFnb25hbHNBYm92ZSA9IG51bURpYWdvbmFscyAtIGRpYWdvbmFsQmFzZUluZGV4IC0gMTtcbiAgICAgICAgY29uc3QgZGlmZkV2ZW4gPSAobnVtRGlmZmVyZW5jZXMgJSAyID09PSAwKTtcbiAgICAgICAgaWYgKGRpYWdvbmFsIDwgMCkge1xuICAgICAgICAgICAgY29uc3QgbG93ZXJCb3VuZEV2ZW4gPSAoZGlhZ29uYWxzQmVsb3cgJSAyID09PSAwKTtcbiAgICAgICAgICAgIHJldHVybiAoZGlmZkV2ZW4gPT09IGxvd2VyQm91bmRFdmVuKSA/IDAgOiAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdXBwZXJCb3VuZEV2ZW4gPSAoZGlhZ29uYWxzQWJvdmUgJSAyID09PSAwKTtcbiAgICAgICAgICAgIHJldHVybiAoZGlmZkV2ZW4gPT09IHVwcGVyQm91bmRFdmVuKSA/IG51bURpYWdvbmFscyAtIDEgOiBudW1EaWFnb25hbHMgLSAyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBnbG9iYWxzLCBpc01hY2ludG9zaCwgaXNXaW5kb3dzIH0gZnJvbSAnLi9wbGF0Zm9ybS5qcyc7XG5sZXQgc2FmZVByb2Nlc3M7XG4vLyBOYXRpdmUgc2FuZGJveCBlbnZpcm9ubWVudFxuaWYgKHR5cGVvZiBnbG9iYWxzLnZzY29kZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdsb2JhbHMudnNjb2RlLnByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3Qgc2FuZGJveFByb2Nlc3MgPSBnbG9iYWxzLnZzY29kZS5wcm9jZXNzO1xuICAgIHNhZmVQcm9jZXNzID0ge1xuICAgICAgICBnZXQgcGxhdGZvcm0oKSB7IHJldHVybiBzYW5kYm94UHJvY2Vzcy5wbGF0Zm9ybTsgfSxcbiAgICAgICAgZ2V0IGFyY2goKSB7IHJldHVybiBzYW5kYm94UHJvY2Vzcy5hcmNoOyB9LFxuICAgICAgICBnZXQgZW52KCkgeyByZXR1cm4gc2FuZGJveFByb2Nlc3MuZW52OyB9LFxuICAgICAgICBjd2QoKSB7IHJldHVybiBzYW5kYm94UHJvY2Vzcy5jd2QoKTsgfVxuICAgIH07XG59XG4vLyBOYXRpdmUgbm9kZS5qcyBlbnZpcm9ubWVudFxuZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgc2FmZVByb2Nlc3MgPSB7XG4gICAgICAgIGdldCBwbGF0Zm9ybSgpIHsgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm07IH0sXG4gICAgICAgIGdldCBhcmNoKCkgeyByZXR1cm4gcHJvY2Vzcy5hcmNoOyB9LFxuICAgICAgICBnZXQgZW52KCkgeyByZXR1cm4gcHJvY2Vzcy5lbnY7IH0sXG4gICAgICAgIGN3ZCgpIHsgcmV0dXJuIHByb2Nlc3MuZW52WydWU0NPREVfQ1dEJ10gfHwgcHJvY2Vzcy5jd2QoKTsgfVxuICAgIH07XG59XG4vLyBXZWIgZW52aXJvbm1lbnRcbmVsc2Uge1xuICAgIHNhZmVQcm9jZXNzID0ge1xuICAgICAgICAvLyBTdXBwb3J0ZWRcbiAgICAgICAgZ2V0IHBsYXRmb3JtKCkgeyByZXR1cm4gaXNXaW5kb3dzID8gJ3dpbjMyJyA6IGlzTWFjaW50b3NoID8gJ2RhcndpbicgOiAnbGludXgnOyB9LFxuICAgICAgICBnZXQgYXJjaCgpIHsgcmV0dXJuIHVuZGVmaW5lZDsgLyogYXJjaCBpcyB1bmRlZmluZWQgaW4gd2ViICovIH0sXG4gICAgICAgIC8vIFVuc3VwcG9ydGVkXG4gICAgICAgIGdldCBlbnYoKSB7IHJldHVybiB7fTsgfSxcbiAgICAgICAgY3dkKCkgeyByZXR1cm4gJy8nOyB9XG4gICAgfTtcbn1cbi8qKlxuICogUHJvdmlkZXMgc2FmZSBhY2Nlc3MgdG8gdGhlIGBjd2RgIHByb3BlcnR5IGluIG5vZGUuanMsIHNhbmRib3hlZCBvciB3ZWJcbiAqIGVudmlyb25tZW50cy5cbiAqXG4gKiBOb3RlOiBpbiB3ZWIsIHRoaXMgcHJvcGVydHkgaXMgaGFyZGNvZGVkIHRvIGJlIGAvYC5cbiAqXG4gKiBAc2tpcE1hbmdsZVxuICovXG5leHBvcnQgY29uc3QgY3dkID0gc2FmZVByb2Nlc3MuY3dkO1xuLyoqXG4gKiBQcm92aWRlcyBzYWZlIGFjY2VzcyB0byB0aGUgYGVudmAgcHJvcGVydHkgaW4gbm9kZS5qcywgc2FuZGJveGVkIG9yIHdlYlxuICogZW52aXJvbm1lbnRzLlxuICpcbiAqIE5vdGU6IGluIHdlYiwgdGhpcyBwcm9wZXJ0eSBpcyBoYXJkY29kZWQgdG8gYmUgYHt9YC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudiA9IHNhZmVQcm9jZXNzLmVudjtcbi8qKlxuICogUHJvdmlkZXMgc2FmZSBhY2Nlc3MgdG8gdGhlIGBwbGF0Zm9ybWAgcHJvcGVydHkgaW4gbm9kZS5qcywgc2FuZGJveGVkIG9yIHdlYlxuICogZW52aXJvbm1lbnRzLlxuICovXG5leHBvcnQgY29uc3QgcGxhdGZvcm0gPSBzYWZlUHJvY2Vzcy5wbGF0Zm9ybTtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLy8gTk9URTogVlNDb2RlJ3MgY29weSBvZiBub2RlanMgcGF0aCBsaWJyYXJ5IHRvIGJlIHVzYWJsZSBpbiBjb21tb24gKG5vbi1ub2RlKSBuYW1lc3BhY2Vcbi8vIENvcGllZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi92MTYuMTQuMi9saWIvcGF0aC5qc1xuLyoqXG4gKiBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuICogXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4gKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbiAqIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4gKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbiAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqL1xuaW1wb3J0ICogYXMgcHJvY2VzcyBmcm9tICcuL3Byb2Nlc3MuanMnO1xuY29uc3QgQ0hBUl9VUFBFUkNBU0VfQSA9IDY1OyAvKiBBICovXG5jb25zdCBDSEFSX0xPV0VSQ0FTRV9BID0gOTc7IC8qIGEgKi9cbmNvbnN0IENIQVJfVVBQRVJDQVNFX1ogPSA5MDsgLyogWiAqL1xuY29uc3QgQ0hBUl9MT1dFUkNBU0VfWiA9IDEyMjsgLyogeiAqL1xuY29uc3QgQ0hBUl9ET1QgPSA0NjsgLyogLiAqL1xuY29uc3QgQ0hBUl9GT1JXQVJEX1NMQVNIID0gNDc7IC8qIC8gKi9cbmNvbnN0IENIQVJfQkFDS1dBUkRfU0xBU0ggPSA5MjsgLyogXFwgKi9cbmNvbnN0IENIQVJfQ09MT04gPSA1ODsgLyogOiAqL1xuY29uc3QgQ0hBUl9RVUVTVElPTl9NQVJLID0gNjM7IC8qID8gKi9cbmNsYXNzIEVycm9ySW52YWxpZEFyZ1R5cGUgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgZXhwZWN0ZWQsIGFjdHVhbCkge1xuICAgICAgICAvLyBkZXRlcm1pbmVyOiAnbXVzdCBiZScgb3IgJ211c3Qgbm90IGJlJ1xuICAgICAgICBsZXQgZGV0ZXJtaW5lcjtcbiAgICAgICAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycgJiYgZXhwZWN0ZWQuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgICAgICBkZXRlcm1pbmVyID0gJ211c3Qgbm90IGJlJztcbiAgICAgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQucmVwbGFjZSgvXm5vdCAvLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZXRlcm1pbmVyID0gJ211c3QgYmUnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHR5cGUgPSBuYW1lLmluZGV4T2YoJy4nKSAhPT0gLTEgPyAncHJvcGVydHknIDogJ2FyZ3VtZW50JztcbiAgICAgICAgbGV0IG1zZyA9IGBUaGUgXCIke25hbWV9XCIgJHt0eXBlfSAke2RldGVybWluZXJ9IG9mIHR5cGUgJHtleHBlY3RlZH1gO1xuICAgICAgICBtc2cgKz0gYC4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBhY3R1YWx9YDtcbiAgICAgICAgc3VwZXIobXNnKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9JTlZBTElEX0FSR19UWVBFJztcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChwYXRoT2JqZWN0LCBuYW1lKSB7XG4gICAgaWYgKHBhdGhPYmplY3QgPT09IG51bGwgfHwgdHlwZW9mIHBhdGhPYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvckludmFsaWRBcmdUeXBlKG5hbWUsICdPYmplY3QnLCBwYXRoT2JqZWN0KTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyh2YWx1ZSwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvckludmFsaWRBcmdUeXBlKG5hbWUsICdzdHJpbmcnLCB2YWx1ZSk7XG4gICAgfVxufVxuY29uc3QgcGxhdGZvcm1Jc1dpbjMyID0gKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpO1xuZnVuY3Rpb24gaXNQYXRoU2VwYXJhdG9yKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIIHx8IGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0g7XG59XG5mdW5jdGlvbiBpc1Bvc2l4UGF0aFNlcGFyYXRvcihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSDtcbn1cbmZ1bmN0aW9uIGlzV2luZG93c0RldmljZVJvb3QoY29kZSkge1xuICAgIHJldHVybiAoY29kZSA+PSBDSEFSX1VQUEVSQ0FTRV9BICYmIGNvZGUgPD0gQ0hBUl9VUFBFUkNBU0VfWikgfHxcbiAgICAgICAgKGNvZGUgPj0gQ0hBUl9MT1dFUkNBU0VfQSAmJiBjb2RlIDw9IENIQVJfTE9XRVJDQVNFX1opO1xufVxuLy8gUmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIHdpdGggZGlyZWN0b3J5IG5hbWVzXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmcocGF0aCwgYWxsb3dBYm92ZVJvb3QsIHNlcGFyYXRvciwgaXNQYXRoU2VwYXJhdG9yKSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGxldCBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gICAgbGV0IGxhc3RTbGFzaCA9IC0xO1xuICAgIGxldCBkb3RzID0gMDtcbiAgICBsZXQgY29kZSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gcGF0aC5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA8IHBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb2RlID0gQ0hBUl9GT1JXQVJEX1NMQVNIO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHtcbiAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPT09IGkgLSAxIHx8IGRvdHMgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBOT09QXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb3RzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPCAyIHx8IGxhc3RTZWdtZW50TGVuZ3RoICE9PSAyIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlcy5jaGFyQ29kZUF0KHJlcy5sZW5ndGggLSAxKSAhPT0gQ0hBUl9ET1QgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aCAtIDIpICE9PSBDSEFSX0RPVCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2xhc2ggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG90cyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgICAgICAgICAgICAgICAgICByZXMgKz0gcmVzLmxlbmd0aCA+IDAgPyBgJHtzZXBhcmF0b3J9Li5gIDogJy4uJztcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXMgKz0gYCR7c2VwYXJhdG9yfSR7cGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSBpIC0gbGFzdFNsYXNoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2RlID09PSBDSEFSX0RPVCAmJiBkb3RzICE9PSAtMSkge1xuICAgICAgICAgICAgKytkb3RzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG90cyA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBfZm9ybWF0KHNlcCwgcGF0aE9iamVjdCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KHBhdGhPYmplY3QsICdwYXRoT2JqZWN0Jyk7XG4gICAgY29uc3QgZGlyID0gcGF0aE9iamVjdC5kaXIgfHwgcGF0aE9iamVjdC5yb290O1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoT2JqZWN0LmJhc2UgfHxcbiAgICAgICAgYCR7cGF0aE9iamVjdC5uYW1lIHx8ICcnfSR7cGF0aE9iamVjdC5leHQgfHwgJyd9YDtcbiAgICBpZiAoIWRpcikge1xuICAgICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG4gICAgcmV0dXJuIGRpciA9PT0gcGF0aE9iamVjdC5yb290ID8gYCR7ZGlyfSR7YmFzZX1gIDogYCR7ZGlyfSR7c2VwfSR7YmFzZX1gO1xufVxuZXhwb3J0IGNvbnN0IHdpbjMyID0ge1xuICAgIC8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbiAgICByZXNvbHZlKC4uLnBhdGhTZWdtZW50cykge1xuICAgICAgICBsZXQgcmVzb2x2ZWREZXZpY2UgPSAnJztcbiAgICAgICAgbGV0IHJlc29sdmVkVGFpbCA9ICcnO1xuICAgICAgICBsZXQgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gcGF0aFNlZ21lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTE7IGktLSkge1xuICAgICAgICAgICAgbGV0IHBhdGg7XG4gICAgICAgICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhTZWdtZW50c1tpXTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpO1xuICAgICAgICAgICAgICAgIC8vIFNraXAgZW1wdHkgZW50cmllc1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXNvbHZlZERldmljZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgaGFzIHRoZSBjb25jZXB0IG9mIGRyaXZlLXNwZWNpZmljIGN1cnJlbnQgd29ya2luZ1xuICAgICAgICAgICAgICAgIC8vIGRpcmVjdG9yaWVzLiBJZiB3ZSd2ZSByZXNvbHZlZCBhIGRyaXZlIGxldHRlciBidXQgbm90IHlldCBhblxuICAgICAgICAgICAgICAgIC8vIGFic29sdXRlIHBhdGgsIGdldCBjd2QgZm9yIHRoYXQgZHJpdmUsIG9yIHRoZSBwcm9jZXNzIGN3ZCBpZlxuICAgICAgICAgICAgICAgIC8vIHRoZSBkcml2ZSBjd2QgaXMgbm90IGF2YWlsYWJsZS4gV2UncmUgc3VyZSB0aGUgZGV2aWNlIGlzIG5vdFxuICAgICAgICAgICAgICAgIC8vIGEgVU5DIHBhdGggYXQgdGhpcyBwb2ludHMsIGJlY2F1c2UgVU5DIHBhdGhzIGFyZSBhbHdheXMgYWJzb2x1dGUuXG4gICAgICAgICAgICAgICAgcGF0aCA9IHByb2Nlc3MuZW52W2A9JHtyZXNvbHZlZERldmljZX1gXSB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGEgY3dkIHdhcyBmb3VuZCBhbmQgdGhhdCBpdCBhY3R1YWxseSBwb2ludHNcbiAgICAgICAgICAgICAgICAvLyB0byBvdXIgZHJpdmUuIElmIG5vdCwgZGVmYXVsdCB0byB0aGUgZHJpdmUncyByb290LlxuICAgICAgICAgICAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgKHBhdGguc2xpY2UoMCwgMikudG9Mb3dlckNhc2UoKSAhPT0gcmVzb2x2ZWREZXZpY2UudG9Mb3dlckNhc2UoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5jaGFyQ29kZUF0KDIpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gYCR7cmVzb2x2ZWREZXZpY2V9XFxcXGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGVuID0gcGF0aC5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgcm9vdEVuZCA9IDA7XG4gICAgICAgICAgICBsZXQgZGV2aWNlID0gJyc7XG4gICAgICAgICAgICBsZXQgaXNBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHJvb3RcbiAgICAgICAgICAgIGlmIChsZW4gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBwYXRoYCBjb250YWlucyBqdXN0IGEgcGF0aCBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkge1xuICAgICAgICAgICAgICAgIC8vIFBvc3NpYmxlIFVOQyByb290XG4gICAgICAgICAgICAgICAgLy8gSWYgd2Ugc3RhcnRlZCB3aXRoIGEgc2VwYXJhdG9yLCB3ZSBrbm93IHdlIGF0IGxlYXN0IGhhdmUgYW5cbiAgICAgICAgICAgICAgICAvLyBhYnNvbHV0ZSBwYXRoIG9mIHNvbWUga2luZCAoVU5DIG9yIG90aGVyd2lzZSlcbiAgICAgICAgICAgICAgICBpc0Fic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCBkb3VibGUgcGF0aCBzZXBhcmF0b3IgYXQgYmVnaW5uaW5nXG4gICAgICAgICAgICAgICAgICAgIGxldCBqID0gMjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBqO1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9yc1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiAhaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFBhcnQgPSBwYXRoLnNsaWNlKGxhc3QsIGopO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCFcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBqO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggMSBvciBtb3JlIHBhdGggc2VwYXJhdG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmICFpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBsZW4gfHwgaiAhPT0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIGEgVU5DIHJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gYFxcXFxcXFxcJHtmaXJzdFBhcnR9XFxcXCR7cGF0aC5zbGljZShsYXN0LCBqKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290RW5kID0gajtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzV2luZG93c0RldmljZVJvb3QoY29kZSkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04pIHtcbiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBkZXZpY2Ugcm9vdFxuICAgICAgICAgICAgICAgIGRldmljZSA9IHBhdGguc2xpY2UoMCwgMik7XG4gICAgICAgICAgICAgICAgcm9vdEVuZCA9IDI7XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDIgJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgyKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJlYXQgc2VwYXJhdG9yIGZvbGxvd2luZyBkcml2ZSBuYW1lIGFzIGFuIGFic29sdXRlIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByb290RW5kID0gMztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGV2aWNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWREZXZpY2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLnRvTG93ZXJDYXNlKCkgIT09IHJlc29sdmVkRGV2aWNlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcGF0aCBwb2ludHMgdG8gYW5vdGhlciBkZXZpY2Ugc28gaXQgaXMgbm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZERldmljZSA9IGRldmljZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZERldmljZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVGFpbCA9IGAke3BhdGguc2xpY2Uocm9vdEVuZCl9XFxcXCR7cmVzb2x2ZWRUYWlsfWA7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaWYgKGlzQWJzb2x1dGUgJiYgcmVzb2x2ZWREZXZpY2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsXG4gICAgICAgIC8vIGJ1dCBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKVxuICAgICAgICAvLyBmYWlscylcbiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSB0YWlsIHBhdGhcbiAgICAgICAgcmVzb2x2ZWRUYWlsID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkVGFpbCwgIXJlc29sdmVkQWJzb2x1dGUsICdcXFxcJywgaXNQYXRoU2VwYXJhdG9yKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkQWJzb2x1dGUgP1xuICAgICAgICAgICAgYCR7cmVzb2x2ZWREZXZpY2V9XFxcXCR7cmVzb2x2ZWRUYWlsfWAgOlxuICAgICAgICAgICAgYCR7cmVzb2x2ZWREZXZpY2V9JHtyZXNvbHZlZFRhaWx9YCB8fCAnLic7XG4gICAgfSxcbiAgICBub3JtYWxpemUocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpO1xuICAgICAgICBjb25zdCBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcuJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm9vdEVuZCA9IDA7XG4gICAgICAgIGxldCBkZXZpY2U7XG4gICAgICAgIGxldCBpc0Fic29sdXRlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHJvb3RcbiAgICAgICAgaWYgKGxlbiA9PT0gMSkge1xuICAgICAgICAgICAgLy8gYHBhdGhgIGNvbnRhaW5zIGp1c3QgYSBzaW5nbGUgY2hhciwgZXhpdCBlYXJseSB0byBhdm9pZFxuICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgICAgICAgcmV0dXJuIGlzUG9zaXhQYXRoU2VwYXJhdG9yKGNvZGUpID8gJ1xcXFwnIDogcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICAgICAgICAvLyBQb3NzaWJsZSBVTkMgcm9vdFxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RhcnRlZCB3aXRoIGEgc2VwYXJhdG9yLCB3ZSBrbm93IHdlIGF0IGxlYXN0IGhhdmUgYW4gYWJzb2x1dGVcbiAgICAgICAgICAgIC8vIHBhdGggb2Ygc29tZSBraW5kIChVTkMgb3Igb3RoZXJ3aXNlKVxuICAgICAgICAgICAgaXNBYnNvbHV0ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgxKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIGRvdWJsZSBwYXRoIHNlcGFyYXRvciBhdCBiZWdpbm5pbmdcbiAgICAgICAgICAgICAgICBsZXQgaiA9IDI7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBqO1xuICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzXG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7XG4gICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGogPCBsZW4gJiYgaiAhPT0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFBhcnQgPSBwYXRoLnNsaWNlKGxhc3QsIGopO1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIVxuICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggMSBvciBtb3JlIHBhdGggc2VwYXJhdG9yc1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiBpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoZWQhXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiAhaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCBhIFVOQyByb290IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgVU5DIHJvb3Qgc2luY2UgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RoaW5nIGxlZnQgdG8gcHJvY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxcXFxcXFwke2ZpcnN0UGFydH1cXFxcJHtwYXRoLnNsaWNlKGxhc3QpfVxcXFxgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogIT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIGEgVU5DIHJvb3Qgd2l0aCBsZWZ0b3ZlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgPSBgXFxcXFxcXFwke2ZpcnN0UGFydH1cXFxcJHtwYXRoLnNsaWNlKGxhc3QsIGopfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IGo7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByb290RW5kID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1dpbmRvd3NEZXZpY2VSb290KGNvZGUpICYmIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTikge1xuICAgICAgICAgICAgLy8gUG9zc2libGUgZGV2aWNlIHJvb3RcbiAgICAgICAgICAgIGRldmljZSA9IHBhdGguc2xpY2UoMCwgMik7XG4gICAgICAgICAgICByb290RW5kID0gMjtcbiAgICAgICAgICAgIGlmIChsZW4gPiAyICYmIGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMikpKSB7XG4gICAgICAgICAgICAgICAgLy8gVHJlYXQgc2VwYXJhdG9yIGZvbGxvd2luZyBkcml2ZSBuYW1lIGFzIGFuIGFic29sdXRlIHBhdGhcbiAgICAgICAgICAgICAgICAvLyBpbmRpY2F0b3JcbiAgICAgICAgICAgICAgICBpc0Fic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByb290RW5kID0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGFpbCA9IHJvb3RFbmQgPCBsZW4gP1xuICAgICAgICAgICAgbm9ybWFsaXplU3RyaW5nKHBhdGguc2xpY2Uocm9vdEVuZCksICFpc0Fic29sdXRlLCAnXFxcXCcsIGlzUGF0aFNlcGFyYXRvcikgOlxuICAgICAgICAgICAgJyc7XG4gICAgICAgIGlmICh0YWlsLmxlbmd0aCA9PT0gMCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgICAgICAgICAgdGFpbCA9ICcuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFpbC5sZW5ndGggPiAwICYmIGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQobGVuIC0gMSkpKSB7XG4gICAgICAgICAgICB0YWlsICs9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGV2aWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0Fic29sdXRlID8gYFxcXFwke3RhaWx9YCA6IHRhaWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQWJzb2x1dGUgPyBgJHtkZXZpY2V9XFxcXCR7dGFpbH1gIDogYCR7ZGV2aWNlfSR7dGFpbH1gO1xuICAgIH0sXG4gICAgaXNBYnNvbHV0ZShwYXRoKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7XG4gICAgICAgIGNvbnN0IGxlbiA9IHBhdGgubGVuZ3RoO1xuICAgICAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTtcbiAgICAgICAgcmV0dXJuIGlzUGF0aFNlcGFyYXRvcihjb2RlKSB8fFxuICAgICAgICAgICAgLy8gUG9zc2libGUgZGV2aWNlIHJvb3RcbiAgICAgICAgICAgIChsZW4gPiAyICYmXG4gICAgICAgICAgICAgICAgaXNXaW5kb3dzRGV2aWNlUm9vdChjb2RlKSAmJlxuICAgICAgICAgICAgICAgIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTiAmJlxuICAgICAgICAgICAgICAgIGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMikpKTtcbiAgICB9LFxuICAgIGpvaW4oLi4ucGF0aHMpIHtcbiAgICAgICAgaWYgKHBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcuJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgam9pbmVkO1xuICAgICAgICBsZXQgZmlyc3RQYXJ0O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBwYXRoc1tpXTtcbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKGFyZywgJ3BhdGgnKTtcbiAgICAgICAgICAgIGlmIChhcmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChqb2luZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBqb2luZWQgPSBmaXJzdFBhcnQgPSBhcmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBqb2luZWQgKz0gYFxcXFwke2FyZ31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoam9pbmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAnLic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGpvaW5lZCBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0d28gc2xhc2hlcywgYmVjYXVzZVxuICAgICAgICAvLyBub3JtYWxpemUoKSB3aWxsIG1pc3Rha2UgaXQgZm9yIGEgVU5DIHBhdGggdGhlbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBzdGVwIGlzIHNraXBwZWQgd2hlbiBpdCBpcyB2ZXJ5IGNsZWFyIHRoYXQgdGhlIHVzZXIgYWN0dWFsbHlcbiAgICAgICAgLy8gaW50ZW5kZWQgdG8gcG9pbnQgYXQgYSBVTkMgcGF0aC4gVGhpcyBpcyBhc3N1bWVkIHdoZW4gdGhlIGZpcnN0XG4gICAgICAgIC8vIG5vbi1lbXB0eSBzdHJpbmcgYXJndW1lbnRzIHN0YXJ0cyB3aXRoIGV4YWN0bHkgdHdvIHNsYXNoZXMgZm9sbG93ZWQgYnlcbiAgICAgICAgLy8gYXQgbGVhc3Qgb25lIG1vcmUgbm9uLXNsYXNoIGNoYXJhY3Rlci5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZSB0aGF0IGZvciBub3JtYWxpemUoKSB0byB0cmVhdCBhIHBhdGggYXMgYSBVTkMgcGF0aCBpdCBuZWVkcyB0b1xuICAgICAgICAvLyBoYXZlIGF0IGxlYXN0IDIgY29tcG9uZW50cywgc28gd2UgZG9uJ3QgZmlsdGVyIGZvciB0aGF0IGhlcmUuXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBjYW4gdXNlIGpvaW4gdG8gY29uc3RydWN0IFVOQyBwYXRocyBmcm9tXG4gICAgICAgIC8vIGEgc2VydmVyIG5hbWUgYW5kIGEgc2hhcmUgbmFtZTsgZm9yIGV4YW1wbGU6XG4gICAgICAgIC8vICAgcGF0aC5qb2luKCcvL3NlcnZlcicsICdzaGFyZScpIC0+ICdcXFxcXFxcXHNlcnZlclxcXFxzaGFyZVxcXFwnKVxuICAgICAgICBsZXQgbmVlZHNSZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgbGV0IHNsYXNoQ291bnQgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGZpcnN0UGFydCA9PT0gJ3N0cmluZycgJiYgaXNQYXRoU2VwYXJhdG9yKGZpcnN0UGFydC5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICAgICAgKytzbGFzaENvdW50O1xuICAgICAgICAgICAgY29uc3QgZmlyc3RMZW4gPSBmaXJzdFBhcnQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGZpcnN0TGVuID4gMSAmJiBpc1BhdGhTZXBhcmF0b3IoZmlyc3RQYXJ0LmNoYXJDb2RlQXQoMSkpKSB7XG4gICAgICAgICAgICAgICAgKytzbGFzaENvdW50O1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdExlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihmaXJzdFBhcnQuY2hhckNvZGVBdCgyKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrc2xhc2hDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcGF0aCBpbiB0aGUgZmlyc3QgcGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNSZXBsYWNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWRzUmVwbGFjZSkge1xuICAgICAgICAgICAgLy8gRmluZCBhbnkgbW9yZSBjb25zZWN1dGl2ZSBzbGFzaGVzIHdlIG5lZWQgdG8gcmVwbGFjZVxuICAgICAgICAgICAgd2hpbGUgKHNsYXNoQ291bnQgPCBqb2luZWQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgaXNQYXRoU2VwYXJhdG9yKGpvaW5lZC5jaGFyQ29kZUF0KHNsYXNoQ291bnQpKSkge1xuICAgICAgICAgICAgICAgIHNsYXNoQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIHNsYXNoZXMgaWYgbmVlZGVkXG4gICAgICAgICAgICBpZiAoc2xhc2hDb3VudCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgam9pbmVkID0gYFxcXFwke2pvaW5lZC5zbGljZShzbGFzaENvdW50KX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aW4zMi5ub3JtYWxpemUoam9pbmVkKTtcbiAgICB9LFxuICAgIC8vIEl0IHdpbGwgc29sdmUgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSBgZnJvbWAgdG8gYHRvYCwgZm9yIGluc3RhbmNlOlxuICAgIC8vICBmcm9tID0gJ0M6XFxcXG9yYW5kZWFcXFxcdGVzdFxcXFxhYWEnXG4gICAgLy8gIHRvID0gJ0M6XFxcXG9yYW5kZWFcXFxcaW1wbFxcXFxiYmInXG4gICAgLy8gVGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlOiAnLi5cXFxcLi5cXFxcaW1wbFxcXFxiYmInXG4gICAgcmVsYXRpdmUoZnJvbSwgdG8pIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcoZnJvbSwgJ2Zyb20nKTtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcodG8sICd0bycpO1xuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9tT3JpZyA9IHdpbjMyLnJlc29sdmUoZnJvbSk7XG4gICAgICAgIGNvbnN0IHRvT3JpZyA9IHdpbjMyLnJlc29sdmUodG8pO1xuICAgICAgICBpZiAoZnJvbU9yaWcgPT09IHRvT3JpZykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGZyb20gPSBmcm9tT3JpZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0byA9IHRvT3JpZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmltIGFueSBsZWFkaW5nIGJhY2tzbGFzaGVzXG4gICAgICAgIGxldCBmcm9tU3RhcnQgPSAwO1xuICAgICAgICB3aGlsZSAoZnJvbVN0YXJ0IDwgZnJvbS5sZW5ndGggJiZcbiAgICAgICAgICAgIGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICBmcm9tU3RhcnQrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmltIHRyYWlsaW5nIGJhY2tzbGFzaGVzIChhcHBsaWNhYmxlIHRvIFVOQyBwYXRocyBvbmx5KVxuICAgICAgICBsZXQgZnJvbUVuZCA9IGZyb20ubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoZnJvbUVuZCAtIDEgPiBmcm9tU3RhcnQgJiZcbiAgICAgICAgICAgIGZyb20uY2hhckNvZGVBdChmcm9tRW5kIC0gMSkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICAgIGZyb21FbmQtLTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9tTGVuID0gZnJvbUVuZCAtIGZyb21TdGFydDtcbiAgICAgICAgLy8gVHJpbSBhbnkgbGVhZGluZyBiYWNrc2xhc2hlc1xuICAgICAgICBsZXQgdG9TdGFydCA9IDA7XG4gICAgICAgIHdoaWxlICh0b1N0YXJ0IDwgdG8ubGVuZ3RoICYmXG4gICAgICAgICAgICB0by5jaGFyQ29kZUF0KHRvU3RhcnQpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICB0b1N0YXJ0Kys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpbSB0cmFpbGluZyBiYWNrc2xhc2hlcyAoYXBwbGljYWJsZSB0byBVTkMgcGF0aHMgb25seSlcbiAgICAgICAgbGV0IHRvRW5kID0gdG8ubGVuZ3RoO1xuICAgICAgICB3aGlsZSAodG9FbmQgLSAxID4gdG9TdGFydCAmJlxuICAgICAgICAgICAgdG8uY2hhckNvZGVBdCh0b0VuZCAtIDEpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICB0b0VuZC0tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvTGVuID0gdG9FbmQgLSB0b1N0YXJ0O1xuICAgICAgICAvLyBDb21wYXJlIHBhdGhzIHRvIGZpbmQgdGhlIGxvbmdlc3QgY29tbW9uIHBhdGggZnJvbSByb290XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZyb21MZW4gPCB0b0xlbiA/IGZyb21MZW4gOiB0b0xlbjtcbiAgICAgICAgbGV0IGxhc3RDb21tb25TZXAgPSAtMTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tQ29kZSA9IGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQgKyBpKTtcbiAgICAgICAgICAgIGlmIChmcm9tQ29kZSAhPT0gdG8uY2hhckNvZGVBdCh0b1N0YXJ0ICsgaSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyb21Db2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgZm91bmQgYSBtaXNtYXRjaCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1vbiBwYXRoIHNlcGFyYXRvciB3YXMgc2Vlbiwgc29cbiAgICAgICAgLy8gcmV0dXJuIHRoZSBvcmlnaW5hbCBgdG9gLlxuICAgICAgICBpZiAoaSAhPT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobGFzdENvbW1vblNlcCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9PcmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvTGVuID4gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvLmNoYXJDb2RlQXQodG9TdGFydCArIGkpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGBmcm9tYCBpcyB0aGUgZXhhY3QgYmFzZSBwYXRoIGZvciBgdG9gLlxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nQzpcXFxcZm9vXFxcXGJhcic7IHRvPSdDOlxcXFxmb29cXFxcYmFyXFxcXGJheidcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvT3JpZy5zbGljZSh0b1N0YXJ0ICsgaSArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgZnJvbWAgaXMgdGhlIGRldmljZSByb290LlxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nQzpcXFxcJzsgdG89J0M6XFxcXGZvbydcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvT3JpZy5zbGljZSh0b1N0YXJ0ICsgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZyb21MZW4gPiBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCArIGkpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGB0b2AgaXMgdGhlIGV4YWN0IGJhc2UgcGF0aCBmb3IgYGZyb21gLlxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nQzpcXFxcZm9vXFxcXGJhcic7IHRvPSdDOlxcXFxmb28nXG4gICAgICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGB0b2AgaXMgdGhlIGRldmljZSByb290LlxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nQzpcXFxcZm9vXFxcXGJhcic7IHRvPSdDOlxcXFwnXG4gICAgICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSAzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYXN0Q29tbW9uU2VwID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBvdXQgPSAnJztcbiAgICAgICAgLy8gR2VuZXJhdGUgdGhlIHJlbGF0aXZlIHBhdGggYmFzZWQgb24gdGhlIHBhdGggZGlmZmVyZW5jZSBiZXR3ZWVuIGB0b2AgYW5kXG4gICAgICAgIC8vIGBmcm9tYFxuICAgICAgICBmb3IgKGkgPSBmcm9tU3RhcnQgKyBsYXN0Q29tbW9uU2VwICsgMTsgaSA8PSBmcm9tRW5kOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChpID09PSBmcm9tRW5kIHx8IGZyb20uY2hhckNvZGVBdChpKSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICAgIG91dCArPSBvdXQubGVuZ3RoID09PSAwID8gJy4uJyA6ICdcXFxcLi4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvU3RhcnQgKz0gbGFzdENvbW1vblNlcDtcbiAgICAgICAgLy8gTGFzdGx5LCBhcHBlbmQgdGhlIHJlc3Qgb2YgdGhlIGRlc3RpbmF0aW9uIChgdG9gKSBwYXRoIHRoYXQgY29tZXMgYWZ0ZXJcbiAgICAgICAgLy8gdGhlIGNvbW1vbiBwYXRoIHBhcnRzXG4gICAgICAgIGlmIChvdXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke291dH0ke3RvT3JpZy5zbGljZSh0b1N0YXJ0LCB0b0VuZCl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9PcmlnLmNoYXJDb2RlQXQodG9TdGFydCkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICAgICsrdG9TdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9PcmlnLnNsaWNlKHRvU3RhcnQsIHRvRW5kKTtcbiAgICB9LFxuICAgIHRvTmFtZXNwYWNlZFBhdGgocGF0aCkge1xuICAgICAgICAvLyBOb3RlOiB0aGlzIHdpbGwgKnByb2JhYmx5KiB0aHJvdyBzb21ld2hlcmUuXG4gICAgICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycgfHwgcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHdpbjMyLnJlc29sdmUocGF0aCk7XG4gICAgICAgIGlmIChyZXNvbHZlZFBhdGgubGVuZ3RoIDw9IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZFBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgLy8gUG9zc2libGUgVU5DIHJvb3RcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZFBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSByZXNvbHZlZFBhdGguY2hhckNvZGVBdCgyKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gQ0hBUl9RVUVTVElPTl9NQVJLICYmIGNvZGUgIT09IENIQVJfRE9UKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoZWQgbm9uLWxvbmcgVU5DIHJvb3QsIGNvbnZlcnQgdGhlIHBhdGggdG8gYSBsb25nIFVOQyBwYXRoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxcXFxcXFw/XFxcXFVOQ1xcXFwke3Jlc29sdmVkUGF0aC5zbGljZSgyKX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1dpbmRvd3NEZXZpY2VSb290KHJlc29sdmVkUGF0aC5jaGFyQ29kZUF0KDApKSAmJlxuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04gJiZcbiAgICAgICAgICAgIHJlc29sdmVkUGF0aC5jaGFyQ29kZUF0KDIpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAvLyBNYXRjaGVkIGRldmljZSByb290LCBjb252ZXJ0IHRoZSBwYXRoIHRvIGEgbG9uZyBVTkMgcGF0aFxuICAgICAgICAgICAgcmV0dXJuIGBcXFxcXFxcXD9cXFxcJHtyZXNvbHZlZFBhdGh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9LFxuICAgIGRpcm5hbWUocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpO1xuICAgICAgICBjb25zdCBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcuJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm9vdEVuZCA9IC0xO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTtcbiAgICAgICAgaWYgKGxlbiA9PT0gMSkge1xuICAgICAgICAgICAgLy8gYHBhdGhgIGNvbnRhaW5zIGp1c3QgYSBwYXRoIHNlcGFyYXRvciwgZXhpdCBlYXJseSB0byBhdm9pZFxuICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgd29yayBvciBhIGRvdC5cbiAgICAgICAgICAgIHJldHVybiBpc1BhdGhTZXBhcmF0b3IoY29kZSkgPyBwYXRoIDogJy4nO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHJvb3RcbiAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkge1xuICAgICAgICAgICAgLy8gUG9zc2libGUgVU5DIHJvb3RcbiAgICAgICAgICAgIHJvb3RFbmQgPSBvZmZzZXQgPSAxO1xuICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCBkb3VibGUgcGF0aCBzZXBhcmF0b3IgYXQgYmVnaW5uaW5nXG4gICAgICAgICAgICAgICAgbGV0IGogPSAyO1xuICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gajtcbiAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9yc1xuICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmICFpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkge1xuICAgICAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCFcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBwYXRoIHNlcGFyYXRvcnNcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIVxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGxlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdCBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPT0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdCB3aXRoIGxlZnRvdmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBieSAxIHRvIGluY2x1ZGUgdGhlIHNlcGFyYXRvciBhZnRlciB0aGUgVU5DIHJvb3QgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmVhdCBpdCBhcyBhIFwibm9ybWFsIHJvb3RcIiBvbiB0b3Agb2YgYSAoVU5DKSByb290XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IG9mZnNldCA9IGogKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9zc2libGUgZGV2aWNlIHJvb3RcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1dpbmRvd3NEZXZpY2VSb290KGNvZGUpICYmIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTikge1xuICAgICAgICAgICAgcm9vdEVuZCA9IGxlbiA+IDIgJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgyKSkgPyAzIDogMjtcbiAgICAgICAgICAgIG9mZnNldCA9IHJvb3RFbmQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVuZCA9IC0xO1xuICAgICAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlbiAtIDE7IGkgPj0gb2Zmc2V0OyAtLWkpIHtcbiAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChyb290RW5kID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbmQgPSByb290RW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGVuZCk7XG4gICAgfSxcbiAgICBiYXNlbmFtZShwYXRoLCBleHQpIHtcbiAgICAgICAgaWYgKGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhleHQsICdleHQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpO1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gLTE7XG4gICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZHJpdmUgbGV0dGVyIHByZWZpeCBzbyBhcyBub3QgdG8gbWlzdGFrZSB0aGUgZm9sbG93aW5nXG4gICAgICAgIC8vIHBhdGggc2VwYXJhdG9yIGFzIGFuIGV4dHJhIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGRpc3JlZ2FyZGVkXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA+PSAyICYmXG4gICAgICAgICAgICBpc1dpbmRvd3NEZXZpY2VSb290KHBhdGguY2hhckNvZGVBdCgwKSkgJiZcbiAgICAgICAgICAgIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTikge1xuICAgICAgICAgICAgc3RhcnQgPSAyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCAmJiBleHQubGVuZ3RoID4gMCAmJiBleHQubGVuZ3RoIDw9IHBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZXh0ID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGV4dElkeCA9IGV4dC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGV0IGZpcnN0Tm9uU2xhc2hFbmQgPSAtMTtcbiAgICAgICAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSBzdGFydDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3ROb25TbGFzaEVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCByZW1lbWJlciB0aGlzIGluZGV4IGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgaWYgdGhlIGV4dGVuc2lvbiBlbmRzIHVwIG5vdCBtYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dElkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggdGhlIGV4cGxpY2l0IGV4dGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IGV4dC5jaGFyQ29kZUF0KGV4dElkeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1leHRJZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIGV4dGVuc2lvbiwgc28gbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5zaW9uIGRvZXMgbm90IG1hdGNoLCBzbyBvdXIgcmVzdWx0IGlzIHRoZSBlbnRpcmUgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dElkeCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gcGF0aC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IC0taSkge1xuICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3dcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAgICAgICAgIC8vIHBhdGggY29tcG9uZW50XG4gICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZW5kID0gaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9LFxuICAgIGV4dG5hbWUocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpO1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgc3RhcnREb3QgPSAtMTtcbiAgICAgICAgbGV0IHN0YXJ0UGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSAtMTtcbiAgICAgICAgbGV0IG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgICAgIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmRcbiAgICAgICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmRcbiAgICAgICAgbGV0IHByZURvdFN0YXRlID0gMDtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZHJpdmUgbGV0dGVyIHByZWZpeCBzbyBhcyBub3QgdG8gbWlzdGFrZSB0aGUgZm9sbG93aW5nXG4gICAgICAgIC8vIHBhdGggc2VwYXJhdG9yIGFzIGFuIGV4dHJhIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGRpc3JlZ2FyZGVkXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA+PSAyICYmXG4gICAgICAgICAgICBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04gJiZcbiAgICAgICAgICAgIGlzV2luZG93c0RldmljZVJvb3QocGF0aC5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICAgICAgc3RhcnQgPSBzdGFydFBhcnQgPSAyO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IC0taSkge1xuICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0UGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgICAgICAgICAgICAvLyBleHRlbnNpb25cbiAgICAgICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0RPVCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IGRvdCwgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2Ygb3VyIGV4dGVuc2lvblxuICAgICAgICAgICAgICAgIGlmIChzdGFydERvdCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBhbmQgbm9uLXBhdGggc2VwYXJhdG9yIGJlZm9yZSBvdXIgZG90LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgZ29vZCBjaGFuY2UgYXQgaGF2aW5nIGEgbm9uLWVtcHR5IGV4dGVuc2lvblxuICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fFxuICAgICAgICAgICAgZW5kID09PSAtMSB8fFxuICAgICAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3RcbiAgICAgICAgICAgIHByZURvdFN0YXRlID09PSAwIHx8XG4gICAgICAgICAgICAvLyBUaGUgKHJpZ2h0LW1vc3QpIHRyaW1tZWQgcGF0aCBjb21wb25lbnQgaXMgZXhhY3RseSAnLi4nXG4gICAgICAgICAgICAocHJlRG90U3RhdGUgPT09IDEgJiZcbiAgICAgICAgICAgICAgICBzdGFydERvdCA9PT0gZW5kIC0gMSAmJlxuICAgICAgICAgICAgICAgIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0RG90LCBlbmQpO1xuICAgIH0sXG4gICAgZm9ybWF0OiBfZm9ybWF0LmJpbmQobnVsbCwgJ1xcXFwnKSxcbiAgICBwYXJzZShwYXRoKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7XG4gICAgICAgIGNvbnN0IHJldCA9IHsgcm9vdDogJycsIGRpcjogJycsIGJhc2U6ICcnLCBleHQ6ICcnLCBuYW1lOiAnJyB9O1xuICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuID0gcGF0aC5sZW5ndGg7XG4gICAgICAgIGxldCByb290RW5kID0gMDtcbiAgICAgICAgbGV0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmIChsZW4gPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBgcGF0aGAgY29udGFpbnMganVzdCBhIHBhdGggc2VwYXJhdG9yLCBleGl0IGVhcmx5IHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgICAgICAgICAgIHJldC5yb290ID0gcmV0LmRpciA9IHBhdGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldC5iYXNlID0gcmV0Lm5hbWUgPSBwYXRoO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYSByb290XG4gICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHtcbiAgICAgICAgICAgIC8vIFBvc3NpYmxlIFVOQyByb290XG4gICAgICAgICAgICByb290RW5kID0gMTtcbiAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KDEpKSkge1xuICAgICAgICAgICAgICAgIC8vIE1hdGNoZWQgZG91YmxlIHBhdGggc2VwYXJhdG9yIGF0IGJlZ2lubmluZ1xuICAgICAgICAgICAgICAgIGxldCBqID0gMjtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGo7XG4gICAgICAgICAgICAgICAgLy8gTWF0Y2ggMSBvciBtb3JlIG5vbi1wYXRoIHNlcGFyYXRvcnNcbiAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiAhaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoZWQhXG4gICAgICAgICAgICAgICAgICAgIGxhc3QgPSBqO1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgcGF0aCBzZXBhcmF0b3JzXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmIGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPCBsZW4gJiYgaiAhPT0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCFcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBqO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggMSBvciBtb3JlIG5vbi1wYXRoIHNlcGFyYXRvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmICFpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIGEgVU5DIHJvb3Qgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSBqO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaiAhPT0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdCB3aXRoIGxlZnRvdmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSBqICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1dpbmRvd3NEZXZpY2VSb290KGNvZGUpICYmIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTikge1xuICAgICAgICAgICAgLy8gUG9zc2libGUgZGV2aWNlIHJvb3RcbiAgICAgICAgICAgIGlmIChsZW4gPD0gMikge1xuICAgICAgICAgICAgICAgIC8vIGBwYXRoYCBjb250YWlucyBqdXN0IGEgZHJpdmUgcm9vdCwgZXhpdCBlYXJseSB0byBhdm9pZFxuICAgICAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgICAgICAgICByZXQucm9vdCA9IHJldC5kaXIgPSBwYXRoO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb290RW5kID0gMjtcbiAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KDIpKSkge1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYHBhdGhgIGNvbnRhaW5zIGp1c3QgYSBkcml2ZSByb290LCBleGl0IGVhcmx5IHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgICAgICAgICAgICAgcmV0LnJvb3QgPSByZXQuZGlyID0gcGF0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcm9vdEVuZCA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvb3RFbmQgPiAwKSB7XG4gICAgICAgICAgICByZXQucm9vdCA9IHBhdGguc2xpY2UoMCwgcm9vdEVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0RG90ID0gLTE7XG4gICAgICAgIGxldCBzdGFydFBhcnQgPSByb290RW5kO1xuICAgICAgICBsZXQgZW5kID0gLTE7XG4gICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICAgICAgICBsZXQgaSA9IHBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgLy8gVHJhY2sgdGhlIHN0YXRlIG9mIGNoYXJhY3RlcnMgKGlmIGFueSkgd2Ugc2VlIGJlZm9yZSBvdXIgZmlyc3QgZG90IGFuZFxuICAgICAgICAvLyBhZnRlciBhbnkgcGF0aCBzZXBhcmF0b3Igd2UgZmluZFxuICAgICAgICBsZXQgcHJlRG90U3RhdGUgPSAwO1xuICAgICAgICAvLyBHZXQgbm9uLWRpciBpbmZvXG4gICAgICAgIGZvciAoOyBpID49IHJvb3RFbmQ7IC0taSkge1xuICAgICAgICAgICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0UGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgICAgICAgICAgICAvLyBleHRlbnNpb25cbiAgICAgICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0RPVCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IGRvdCwgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2Ygb3VyIGV4dGVuc2lvblxuICAgICAgICAgICAgICAgIGlmIChzdGFydERvdCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBhbmQgbm9uLXBhdGggc2VwYXJhdG9yIGJlZm9yZSBvdXIgZG90LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgZ29vZCBjaGFuY2UgYXQgaGF2aW5nIGEgbm9uLWVtcHR5IGV4dGVuc2lvblxuICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChzdGFydERvdCA9PT0gLTEgfHxcbiAgICAgICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdFxuICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID09PSAwIHx8XG4gICAgICAgICAgICAgICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgJy4uJ1xuICAgICAgICAgICAgICAgIChwcmVEb3RTdGF0ZSA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9PT0gZW5kIC0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkpIHtcbiAgICAgICAgICAgICAgICByZXQuYmFzZSA9IHJldC5uYW1lID0gcGF0aC5zbGljZShzdGFydFBhcnQsIGVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnRQYXJ0LCBzdGFydERvdCk7XG4gICAgICAgICAgICAgICAgcmV0LmJhc2UgPSBwYXRoLnNsaWNlKHN0YXJ0UGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICByZXQuZXh0ID0gcGF0aC5zbGljZShzdGFydERvdCwgZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgZGlyZWN0b3J5IGlzIHRoZSByb290LCB1c2UgdGhlIGVudGlyZSByb290IGFzIHRoZSBgZGlyYCBpbmNsdWRpbmdcbiAgICAgICAgLy8gdGhlIHRyYWlsaW5nIHNsYXNoIGlmIGFueSAoYEM6XFxhYmNgIC0+IGBDOlxcYCkuIE90aGVyd2lzZSwgc3RyaXAgb3V0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBzbGFzaCAoYEM6XFxhYmNcXGRlZmAgLT4gYEM6XFxhYmNgKS5cbiAgICAgICAgaWYgKHN0YXJ0UGFydCA+IDAgJiYgc3RhcnRQYXJ0ICE9PSByb290RW5kKSB7XG4gICAgICAgICAgICByZXQuZGlyID0gcGF0aC5zbGljZSgwLCBzdGFydFBhcnQgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldC5kaXIgPSByZXQucm9vdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG4gICAgc2VwOiAnXFxcXCcsXG4gICAgZGVsaW1pdGVyOiAnOycsXG4gICAgd2luMzI6IG51bGwsXG4gICAgcG9zaXg6IG51bGxcbn07XG5jb25zdCBwb3NpeEN3ZCA9ICgoKSA9PiB7XG4gICAgaWYgKHBsYXRmb3JtSXNXaW4zMikge1xuICAgICAgICAvLyBDb252ZXJ0cyBXaW5kb3dzJyBiYWNrc2xhc2ggcGF0aCBzZXBhcmF0b3JzIHRvIFBPU0lYIGZvcndhcmQgc2xhc2hlc1xuICAgICAgICAvLyBhbmQgdHJ1bmNhdGVzIGFueSBkcml2ZSBpbmRpY2F0b3JcbiAgICAgICAgY29uc3QgcmVnZXhwID0gL1xcXFwvZztcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCkucmVwbGFjZShyZWdleHAsICcvJyk7XG4gICAgICAgICAgICByZXR1cm4gY3dkLnNsaWNlKGN3ZC5pbmRleE9mKCcvJykpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBXZSdyZSBhbHJlYWR5IG9uIFBPU0lYLCBubyBuZWVkIGZvciBhbnkgdHJhbnNmb3JtYXRpb25zXG4gICAgcmV0dXJuICgpID0+IHByb2Nlc3MuY3dkKCk7XG59KSgpO1xuZXhwb3J0IGNvbnN0IHBvc2l4ID0ge1xuICAgIC8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbiAgICByZXNvbHZlKC4uLnBhdGhTZWdtZW50cykge1xuICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoID0gJyc7XG4gICAgICAgIGxldCByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSBwYXRoU2VnbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gaSA+PSAwID8gcGF0aFNlZ21lbnRzW2ldIDogcG9zaXhDd2QoKTtcbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7XG4gICAgICAgICAgICAvLyBTa2lwIGVtcHR5IGVudHJpZXNcbiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YDtcbiAgICAgICAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IENIQVJfRk9SV0FSRF9TTEFTSDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gICAgICAgIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuICAgICAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgICAgICAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkUGF0aCwgIXJlc29sdmVkQWJzb2x1dGUsICcvJywgaXNQb3NpeFBhdGhTZXBhcmF0b3IpO1xuICAgICAgICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGAvJHtyZXNvbHZlZFBhdGh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDAgPyByZXNvbHZlZFBhdGggOiAnLic7XG4gICAgfSxcbiAgICBub3JtYWxpemUocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpO1xuICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnLic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIO1xuICAgICAgICBjb25zdCB0cmFpbGluZ1NlcGFyYXRvciA9IHBhdGguY2hhckNvZGVBdChwYXRoLmxlbmd0aCAtIDEpID09PSBDSEFSX0ZPUldBUkRfU0xBU0g7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICAgICAgICBwYXRoID0gbm9ybWFsaXplU3RyaW5nKHBhdGgsICFpc0Fic29sdXRlLCAnLycsIGlzUG9zaXhQYXRoU2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJhaWxpbmdTZXBhcmF0b3IgPyAnLi8nIDogJy4nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFpbGluZ1NlcGFyYXRvcikge1xuICAgICAgICAgICAgcGF0aCArPSAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQWJzb2x1dGUgPyBgLyR7cGF0aH1gIDogcGF0aDtcbiAgICB9LFxuICAgIGlzQWJzb2x1dGUocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpO1xuICAgICAgICByZXR1cm4gcGF0aC5sZW5ndGggPiAwICYmIHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIO1xuICAgIH0sXG4gICAgam9pbiguLi5wYXRocykge1xuICAgICAgICBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJy4nO1xuICAgICAgICB9XG4gICAgICAgIGxldCBqb2luZWQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IHBhdGhzW2ldO1xuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoYXJnLCAncGF0aCcpO1xuICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpvaW5lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5lZCA9IGFyZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5lZCArPSBgLyR7YXJnfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChqb2luZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuICcuJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zaXgubm9ybWFsaXplKGpvaW5lZCk7XG4gICAgfSxcbiAgICByZWxhdGl2ZShmcm9tLCB0bykge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhmcm9tLCAnZnJvbScpO1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0bywgJ3RvJyk7XG4gICAgICAgIGlmIChmcm9tID09PSB0bykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyaW0gbGVhZGluZyBmb3J3YXJkIHNsYXNoZXMuXG4gICAgICAgIGZyb20gPSBwb3NpeC5yZXNvbHZlKGZyb20pO1xuICAgICAgICB0byA9IHBvc2l4LnJlc29sdmUodG8pO1xuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9tU3RhcnQgPSAxO1xuICAgICAgICBjb25zdCBmcm9tRW5kID0gZnJvbS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZyb21MZW4gPSBmcm9tRW5kIC0gZnJvbVN0YXJ0O1xuICAgICAgICBjb25zdCB0b1N0YXJ0ID0gMTtcbiAgICAgICAgY29uc3QgdG9MZW4gPSB0by5sZW5ndGggLSB0b1N0YXJ0O1xuICAgICAgICAvLyBDb21wYXJlIHBhdGhzIHRvIGZpbmQgdGhlIGxvbmdlc3QgY29tbW9uIHBhdGggZnJvbSByb290XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IChmcm9tTGVuIDwgdG9MZW4gPyBmcm9tTGVuIDogdG9MZW4pO1xuICAgICAgICBsZXQgbGFzdENvbW1vblNlcCA9IC0xO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Db2RlID0gZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCArIGkpO1xuICAgICAgICAgICAgaWYgKGZyb21Db2RlICE9PSB0by5jaGFyQ29kZUF0KHRvU3RhcnQgKyBpKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0b0xlbiA+IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmICh0by5jaGFyQ29kZUF0KHRvU3RhcnQgKyBpKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGBmcm9tYCBpcyB0aGUgZXhhY3QgYmFzZSBwYXRoIGZvciBgdG9gLlxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nL2Zvby9iYXInOyB0bz0nL2Zvby9iYXIvYmF6J1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG8uc2xpY2UodG9TdGFydCArIGkgKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYGZyb21gIGlzIHRoZSByb290XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPScvJzsgdG89Jy9mb28nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0by5zbGljZSh0b1N0YXJ0ICsgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUxlbiA+IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0ICsgaSkgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgdG9gIGlzIHRoZSBleGFjdCBiYXNlIHBhdGggZm9yIGBmcm9tYC5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209Jy9mb28vYmFyL2Jheic7IHRvPScvZm9vL2JhcidcbiAgICAgICAgICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYHRvYCBpcyB0aGUgcm9vdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209Jy9mb28vYmFyJzsgdG89Jy8nXG4gICAgICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0ID0gJyc7XG4gICAgICAgIC8vIEdlbmVyYXRlIHRoZSByZWxhdGl2ZSBwYXRoIGJhc2VkIG9uIHRoZSBwYXRoIGRpZmZlcmVuY2UgYmV0d2VlbiBgdG9gXG4gICAgICAgIC8vIGFuZCBgZnJvbWAuXG4gICAgICAgIGZvciAoaSA9IGZyb21TdGFydCArIGxhc3RDb21tb25TZXAgKyAxOyBpIDw9IGZyb21FbmQ7ICsraSkge1xuICAgICAgICAgICAgaWYgKGkgPT09IGZyb21FbmQgfHwgZnJvbS5jaGFyQ29kZUF0KGkpID09PSBDSEFSX0ZPUldBUkRfU0xBU0gpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gb3V0Lmxlbmd0aCA9PT0gMCA/ICcuLicgOiAnLy4uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMYXN0bHksIGFwcGVuZCB0aGUgcmVzdCBvZiB0aGUgZGVzdGluYXRpb24gKGB0b2ApIHBhdGggdGhhdCBjb21lcyBhZnRlclxuICAgICAgICAvLyB0aGUgY29tbW9uIHBhdGggcGFydHMuXG4gICAgICAgIHJldHVybiBgJHtvdXR9JHt0by5zbGljZSh0b1N0YXJ0ICsgbGFzdENvbW1vblNlcCl9YDtcbiAgICB9LFxuICAgIHRvTmFtZXNwYWNlZFBhdGgocGF0aCkge1xuICAgICAgICAvLyBOb24tb3Agb24gcG9zaXggc3lzdGVtc1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9LFxuICAgIGRpcm5hbWUocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpO1xuICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnLic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzUm9vdCA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIO1xuICAgICAgICBsZXQgZW5kID0gLTE7XG4gICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDE7IC0taSkge1xuICAgICAgICAgICAgaWYgKHBhdGguY2hhckNvZGVBdChpKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhc1Jvb3QgPyAnLycgOiAnLic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Jvb3QgJiYgZW5kID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gJy8vJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBlbmQpO1xuICAgIH0sXG4gICAgYmFzZW5hbWUocGF0aCwgZXh0KSB7XG4gICAgICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoZXh0LCAnZXh0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgbGV0IGVuZCA9IC0xO1xuICAgICAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCAmJiBleHQubGVuZ3RoID4gMCAmJiBleHQubGVuZ3RoIDw9IHBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZXh0ID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGV4dElkeCA9IGV4dC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGV0IGZpcnN0Tm9uU2xhc2hFbmQgPSAtMTtcbiAgICAgICAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0ZPUldBUkRfU0xBU0gpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE5vblNsYXNoRW5kID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIHJlbWVtYmVyIHRoaXMgaW5kZXggaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCBpZiB0aGUgZXh0ZW5zaW9uIGVuZHMgdXAgbm90IG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Tm9uU2xhc2hFbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXh0SWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCB0aGUgZXhwbGljaXQgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gZXh0LmNoYXJDb2RlQXQoZXh0SWR4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLWV4dElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgZXh0ZW5zaW9uLCBzbyBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXIgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbnNpb24gZG9lcyBub3QgbWF0Y2gsIHNvIG91ciByZXN1bHQgaXMgdGhlIGVudGlyZSBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0SWR4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBwYXRoLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaSkgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgICAgICAgICAgICAvLyBwYXRoIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfSxcbiAgICBleHRuYW1lKHBhdGgpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTtcbiAgICAgICAgbGV0IHN0YXJ0RG90ID0gLTE7XG4gICAgICAgIGxldCBzdGFydFBhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gLTE7XG4gICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICAgICAgICAvLyBUcmFjayB0aGUgc3RhdGUgb2YgY2hhcmFjdGVycyAoaWYgYW55KSB3ZSBzZWUgYmVmb3JlIG91ciBmaXJzdCBkb3QgYW5kXG4gICAgICAgIC8vIGFmdGVyIGFueSBwYXRoIHNlcGFyYXRvciB3ZSBmaW5kXG4gICAgICAgIGxldCBwcmVEb3RTdGF0ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvblxuICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRE9UKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGFuZCBub24tcGF0aCBzZXBhcmF0b3IgYmVmb3JlIG91ciBkb3QsIHNvIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xIHx8XG4gICAgICAgICAgICBlbmQgPT09IC0xIHx8XG4gICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdFxuICAgICAgICAgICAgcHJlRG90U3RhdGUgPT09IDAgfHxcbiAgICAgICAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICAgICAgICAgIChwcmVEb3RTdGF0ZSA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmXG4gICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZCk7XG4gICAgfSxcbiAgICBmb3JtYXQ6IF9mb3JtYXQuYmluZChudWxsLCAnLycpLFxuICAgIHBhcnNlKHBhdGgpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTtcbiAgICAgICAgY29uc3QgcmV0ID0geyByb290OiAnJywgZGlyOiAnJywgYmFzZTogJycsIGV4dDogJycsIG5hbWU6ICcnIH07XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0Fic29sdXRlID0gcGF0aC5jaGFyQ29kZUF0KDApID09PSBDSEFSX0ZPUldBUkRfU0xBU0g7XG4gICAgICAgIGxldCBzdGFydDtcbiAgICAgICAgaWYgKGlzQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHJldC5yb290ID0gJy8nO1xuICAgICAgICAgICAgc3RhcnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydERvdCA9IC0xO1xuICAgICAgICBsZXQgc3RhcnRQYXJ0ID0gMDtcbiAgICAgICAgbGV0IGVuZCA9IC0xO1xuICAgICAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgICAgICAgbGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmRcbiAgICAgICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmRcbiAgICAgICAgbGV0IHByZURvdFN0YXRlID0gMDtcbiAgICAgICAgLy8gR2V0IG5vbi1kaXIgaW5mb1xuICAgICAgICBmb3IgKDsgaSA+PSBzdGFydDsgLS1pKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvblxuICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRE9UKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGFuZCBub24tcGF0aCBzZXBhcmF0b3IgYmVmb3JlIG91ciBkb3QsIHNvIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydFBhcnQgPT09IDAgJiYgaXNBYnNvbHV0ZSA/IDEgOiBzdGFydFBhcnQ7XG4gICAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xIHx8XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3RcbiAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICAgICAgICAgICAgICAocHJlRG90U3RhdGUgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IGVuZCAtIDEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpKSB7XG4gICAgICAgICAgICAgICAgcmV0LmJhc2UgPSByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnQsIHN0YXJ0RG90KTtcbiAgICAgICAgICAgICAgICByZXQuYmFzZSA9IHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICAgICAgcmV0LmV4dCA9IHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0UGFydCA+IDApIHtcbiAgICAgICAgICAgIHJldC5kaXIgPSBwYXRoLnNsaWNlKDAsIHN0YXJ0UGFydCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHJldC5kaXIgPSAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9LFxuICAgIHNlcDogJy8nLFxuICAgIGRlbGltaXRlcjogJzonLFxuICAgIHdpbjMyOiBudWxsLFxuICAgIHBvc2l4OiBudWxsXG59O1xucG9zaXgud2luMzIgPSB3aW4zMi53aW4zMiA9IHdpbjMyO1xucG9zaXgucG9zaXggPSB3aW4zMi5wb3NpeCA9IHBvc2l4O1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZSA9IChwbGF0Zm9ybUlzV2luMzIgPyB3aW4zMi5ub3JtYWxpemUgOiBwb3NpeC5ub3JtYWxpemUpO1xuZXhwb3J0IGNvbnN0IHJlc29sdmUgPSAocGxhdGZvcm1Jc1dpbjMyID8gd2luMzIucmVzb2x2ZSA6IHBvc2l4LnJlc29sdmUpO1xuZXhwb3J0IGNvbnN0IHJlbGF0aXZlID0gKHBsYXRmb3JtSXNXaW4zMiA/IHdpbjMyLnJlbGF0aXZlIDogcG9zaXgucmVsYXRpdmUpO1xuZXhwb3J0IGNvbnN0IGRpcm5hbWUgPSAocGxhdGZvcm1Jc1dpbjMyID8gd2luMzIuZGlybmFtZSA6IHBvc2l4LmRpcm5hbWUpO1xuZXhwb3J0IGNvbnN0IGJhc2VuYW1lID0gKHBsYXRmb3JtSXNXaW4zMiA/IHdpbjMyLmJhc2VuYW1lIDogcG9zaXguYmFzZW5hbWUpO1xuZXhwb3J0IGNvbnN0IGV4dG5hbWUgPSAocGxhdGZvcm1Jc1dpbjMyID8gd2luMzIuZXh0bmFtZSA6IHBvc2l4LmV4dG5hbWUpO1xuZXhwb3J0IGNvbnN0IHNlcCA9IChwbGF0Zm9ybUlzV2luMzIgPyB3aW4zMi5zZXAgOiBwb3NpeC5zZXApO1xuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tICcuL3BhdGguanMnO1xuaW1wb3J0IHsgaXNXaW5kb3dzIH0gZnJvbSAnLi9wbGF0Zm9ybS5qcyc7XG5jb25zdCBfc2NoZW1lUGF0dGVybiA9IC9eXFx3W1xcd1xcZCsuLV0qJC87XG5jb25zdCBfc2luZ2xlU2xhc2hTdGFydCA9IC9eXFwvLztcbmNvbnN0IF9kb3VibGVTbGFzaFN0YXJ0ID0gL15cXC9cXC8vO1xuZnVuY3Rpb24gX3ZhbGlkYXRlVXJpKHJldCwgX3N0cmljdCkge1xuICAgIC8vIHNjaGVtZSwgbXVzdCBiZSBzZXRcbiAgICBpZiAoIXJldC5zY2hlbWUgJiYgX3N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtVcmlFcnJvcl06IFNjaGVtZSBpcyBtaXNzaW5nOiB7c2NoZW1lOiBcIlwiLCBhdXRob3JpdHk6IFwiJHtyZXQuYXV0aG9yaXR5fVwiLCBwYXRoOiBcIiR7cmV0LnBhdGh9XCIsIHF1ZXJ5OiBcIiR7cmV0LnF1ZXJ5fVwiLCBmcmFnbWVudDogXCIke3JldC5mcmFnbWVudH1cIn1gKTtcbiAgICB9XG4gICAgLy8gc2NoZW1lLCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMVxuICAgIC8vIEFMUEhBICooIEFMUEhBIC8gRElHSVQgLyBcIitcIiAvIFwiLVwiIC8gXCIuXCIgKVxuICAgIGlmIChyZXQuc2NoZW1lICYmICFfc2NoZW1lUGF0dGVybi50ZXN0KHJldC5zY2hlbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW1VyaUVycm9yXTogU2NoZW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycy4nKTtcbiAgICB9XG4gICAgLy8gcGF0aCwgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuM1xuICAgIC8vIElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50XG4gICAgLy8gbXVzdCBlaXRoZXIgYmUgZW1wdHkgb3IgYmVnaW4gd2l0aCBhIHNsYXNoIChcIi9cIikgY2hhcmFjdGVyLiAgSWYgYSBVUklcbiAgICAvLyBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luXG4gICAgLy8gd2l0aCB0d28gc2xhc2ggY2hhcmFjdGVycyAoXCIvL1wiKS5cbiAgICBpZiAocmV0LnBhdGgpIHtcbiAgICAgICAgaWYgKHJldC5hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIGlmICghX3NpbmdsZVNsYXNoU3RhcnQudGVzdChyZXQucGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50IG11c3QgZWl0aGVyIGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSBzbGFzaCAoXCIvXCIpIGNoYXJhY3RlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKF9kb3VibGVTbGFzaFN0YXJ0LnRlc3QocmV0LnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKFwiLy9cIiknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIGZvciBhIHdoaWxlIHdlIGFsbG93ZWQgdXJpcyAqd2l0aG91dCogc2NoZW1lcyBhbmQgdGhpcyBpcyB0aGUgbWlncmF0aW9uXG4vLyBmb3IgdGhlbSwgZS5nLiBhbiB1cmkgd2l0aG91dCBzY2hlbWUgYW5kIHdpdGhvdXQgc3RyaWN0LW1vZGUgd2FybnMgYW5kIGZhbGxzXG4vLyBiYWNrIHRvIHRoZSBmaWxlLXNjaGVtZS4gdGhhdCBzaG91bGQgY2F1c2UgdGhlIGxlYXN0IGNhcm5hZ2UgYW5kIHN0aWxsIGJlIGFcbi8vIGNsZWFyIHdhcm5pbmdcbmZ1bmN0aW9uIF9zY2hlbWVGaXgoc2NoZW1lLCBfc3RyaWN0KSB7XG4gICAgaWYgKCFzY2hlbWUgJiYgIV9zdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuICdmaWxlJztcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtZTtcbn1cbi8vIGltcGxlbWVudHMgYSBiaXQgb2YgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi01XG5mdW5jdGlvbiBfcmVmZXJlbmNlUmVzb2x1dGlvbihzY2hlbWUsIHBhdGgpIHtcbiAgICAvLyB0aGUgc2xhc2gtY2hhcmFjdGVyIGlzIG91ciAnZGVmYXVsdCBiYXNlJyBhcyB3ZSBkb24ndFxuICAgIC8vIHN1cHBvcnQgY29uc3RydWN0aW5nIFVSSXMgcmVsYXRpdmUgdG8gb3RoZXIgVVJJcy4gVGhpc1xuICAgIC8vIGFsc28gbWVhbnMgdGhhdCB3ZSBhbHRlciBhbmQgcG90ZW50aWFsbHkgYnJlYWsgcGF0aHMuXG4gICAgLy8gc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNS4xLjRcbiAgICBzd2l0Y2ggKHNjaGVtZSkge1xuICAgICAgICBjYXNlICdodHRwcyc6XG4gICAgICAgIGNhc2UgJ2h0dHAnOlxuICAgICAgICBjYXNlICdmaWxlJzpcbiAgICAgICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBfc2xhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXRoWzBdICE9PSBfc2xhc2gpIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gX3NsYXNoICsgcGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aDtcbn1cbmNvbnN0IF9lbXB0eSA9ICcnO1xuY29uc3QgX3NsYXNoID0gJy8nO1xuY29uc3QgX3JlZ2V4cCA9IC9eKChbXjovPyNdKz8pOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8vO1xuLyoqXG4gKiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4Ni5cbiAqIFRoaXMgY2xhc3MgaXMgYSBzaW1wbGUgcGFyc2VyIHdoaWNoIGNyZWF0ZXMgdGhlIGJhc2ljIGNvbXBvbmVudCBwYXJ0c1xuICogKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zKSB3aXRoIG1pbmltYWwgdmFsaWRhdGlvblxuICogYW5kIGVuY29kaW5nLlxuICpcbiAqIGBgYHR4dFxuICogICAgICAgZm9vOi8vZXhhbXBsZS5jb206ODA0Mi9vdmVyL3RoZXJlP25hbWU9ZmVycmV0I25vc2VcbiAqICAgICAgIFxcXy8gICBcXF9fX19fX19fX19fX19fL1xcX19fX19fX19fLyBcXF9fX19fX19fXy8gXFxfXy9cbiAqICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgIHxcbiAqICAgICBzY2hlbWUgICAgIGF1dGhvcml0eSAgICAgICBwYXRoICAgICAgICBxdWVyeSAgIGZyYWdtZW50XG4gKiAgICAgICAgfCAgIF9fX19fX19fX19fX19fX19fX19fX3xfX1xuICogICAgICAgLyBcXCAvICAgICAgICAgICAgICAgICAgICAgICAgXFxcbiAqICAgICAgIHVybjpleGFtcGxlOmFuaW1hbDpmZXJyZXQ6bm9zZVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBVUkkge1xuICAgIHN0YXRpYyBpc1VyaSh0aGluZykge1xuICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBVUkkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaW5nLmF1dGhvcml0eSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5mcmFnbWVudCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5wYXRoID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnF1ZXJ5ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnNjaGVtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5mc1BhdGggPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpbmcud2l0aCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzY2hlbWVPckRhdGEsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50LCBfc3RyaWN0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWVPckRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVtZSA9IHNjaGVtZU9yRGF0YS5zY2hlbWUgfHwgX2VtcHR5O1xuICAgICAgICAgICAgdGhpcy5hdXRob3JpdHkgPSBzY2hlbWVPckRhdGEuYXV0aG9yaXR5IHx8IF9lbXB0eTtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IHNjaGVtZU9yRGF0YS5wYXRoIHx8IF9lbXB0eTtcbiAgICAgICAgICAgIHRoaXMucXVlcnkgPSBzY2hlbWVPckRhdGEucXVlcnkgfHwgX2VtcHR5O1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudCA9IHNjaGVtZU9yRGF0YS5mcmFnbWVudCB8fCBfZW1wdHk7XG4gICAgICAgICAgICAvLyBubyB2YWxpZGF0aW9uIGJlY2F1c2UgaXQncyB0aGlzIFVSSVxuICAgICAgICAgICAgLy8gdGhhdCBjcmVhdGVzIHVyaSBjb21wb25lbnRzLlxuICAgICAgICAgICAgLy8gX3ZhbGlkYXRlVXJpKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY2hlbWUgPSBfc2NoZW1lRml4KHNjaGVtZU9yRGF0YSwgX3N0cmljdCk7XG4gICAgICAgICAgICB0aGlzLmF1dGhvcml0eSA9IGF1dGhvcml0eSB8fCBfZW1wdHk7XG4gICAgICAgICAgICB0aGlzLnBhdGggPSBfcmVmZXJlbmNlUmVzb2x1dGlvbih0aGlzLnNjaGVtZSwgcGF0aCB8fCBfZW1wdHkpO1xuICAgICAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5IHx8IF9lbXB0eTtcbiAgICAgICAgICAgIHRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudCB8fCBfZW1wdHk7XG4gICAgICAgICAgICBfdmFsaWRhdGVVcmkodGhpcywgX3N0cmljdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gLS0tLSBmaWxlc3lzdGVtIHBhdGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29ycmVzcG9uZGluZyBmaWxlIHN5c3RlbSBwYXRoIG9mIHRoaXMgVVJJLlxuICAgICAqIFdpbGwgaGFuZGxlIFVOQyBwYXRocywgbm9ybWFsaXplcyB3aW5kb3dzIGRyaXZlIGxldHRlcnMgdG8gbG93ZXItY2FzZSwgYW5kIHVzZXMgdGhlXG4gICAgICogcGxhdGZvcm0gc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IuXG4gICAgICpcbiAgICAgKiAqIFdpbGwgKm5vdCogdmFsaWRhdGUgdGhlIHBhdGggZm9yIGludmFsaWQgY2hhcmFjdGVycyBhbmQgc2VtYW50aWNzLlxuICAgICAqICogV2lsbCAqbm90KiBsb29rIGF0IHRoZSBzY2hlbWUgb2YgdGhpcyBVUkkuXG4gICAgICogKiBUaGUgcmVzdWx0IHNoYWxsICpub3QqIGJlIHVzZWQgZm9yIGRpc3BsYXkgcHVycG9zZXMgYnV0IGZvciBhY2Nlc3NpbmcgYSBmaWxlIG9uIGRpc2suXG4gICAgICpcbiAgICAgKlxuICAgICAqIFRoZSAqZGlmZmVyZW5jZSogdG8gYFVSSSNwYXRoYCBpcyB0aGUgdXNlIG9mIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBzZXBhcmF0b3IgYW5kIHRoZSBoYW5kbGluZ1xuICAgICAqIG9mIFVOQyBwYXRocy4gU2VlIHRoZSBiZWxvdyBzYW1wbGUgb2YgYSBmaWxlLXVyaSB3aXRoIGFuIGF1dGhvcml0eSAoVU5DIHBhdGgpLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgICAgY29uc3QgdSA9IFVSSS5wYXJzZSgnZmlsZTovL3NlcnZlci9jJC9mb2xkZXIvZmlsZS50eHQnKVxuICAgICAgICB1LmF1dGhvcml0eSA9PT0gJ3NlcnZlcidcbiAgICAgICAgdS5wYXRoID09PSAnL3NoYXJlcy9jJC9maWxlLnR4dCdcbiAgICAgICAgdS5mc1BhdGggPT09ICdcXFxcc2VydmVyXFxjJFxcZm9sZGVyXFxmaWxlLnR4dCdcbiAgICBgYGBcbiAgICAgKlxuICAgICAqIFVzaW5nIGBVUkkjcGF0aGAgdG8gcmVhZCBhIGZpbGUgKHVzaW5nIGZzLWFwaXMpIHdvdWxkIG5vdCBiZSBlbm91Z2ggYmVjYXVzZSBwYXJ0cyBvZiB0aGUgcGF0aCxcbiAgICAgKiBuYW1lbHkgdGhlIHNlcnZlciBuYW1lLCB3b3VsZCBiZSBtaXNzaW5nLiBUaGVyZWZvcmUgYFVSSSNmc1BhdGhgIGV4aXN0cyAtIGl0J3Mgc3VnYXIgdG8gZWFzZSB3b3JraW5nXG4gICAgICogd2l0aCBVUklzIHRoYXQgcmVwcmVzZW50IGZpbGVzIG9uIGRpc2sgKGBmaWxlYCBzY2hlbWUpLlxuICAgICAqL1xuICAgIGdldCBmc1BhdGgoKSB7XG4gICAgICAgIC8vIGlmICh0aGlzLnNjaGVtZSAhPT0gJ2ZpbGUnKSB7XG4gICAgICAgIC8vIFx0Y29uc29sZS53YXJuKGBbVXJpRXJyb3JdIGNhbGxpbmcgZnNQYXRoIHdpdGggc2NoZW1lICR7dGhpcy5zY2hlbWV9YCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHVyaVRvRnNQYXRoKHRoaXMsIGZhbHNlKTtcbiAgICB9XG4gICAgLy8gLS0tLSBtb2RpZnkgdG8gbmV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB3aXRoKGNoYW5nZSkge1xuICAgICAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgc2NoZW1lLCBhdXRob3JpdHksIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCB9ID0gY2hhbmdlO1xuICAgICAgICBpZiAoc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjaGVtZSA9IHRoaXMuc2NoZW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2NoZW1lID0gX2VtcHR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXV0aG9yaXR5ID0gdGhpcy5hdXRob3JpdHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXV0aG9yaXR5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBhdXRob3JpdHkgPSBfZW1wdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGF0aCA9IHRoaXMucGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXRoID09PSBudWxsKSB7XG4gICAgICAgICAgICBwYXRoID0gX2VtcHR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChxdWVyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBxdWVyeSA9IHRoaXMucXVlcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocXVlcnkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gX2VtcHR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcmFnbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZnJhZ21lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZnJhZ21lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gX2VtcHR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWUgPT09IHRoaXMuc2NoZW1lXG4gICAgICAgICAgICAmJiBhdXRob3JpdHkgPT09IHRoaXMuYXV0aG9yaXR5XG4gICAgICAgICAgICAmJiBwYXRoID09PSB0aGlzLnBhdGhcbiAgICAgICAgICAgICYmIHF1ZXJ5ID09PSB0aGlzLnF1ZXJ5XG4gICAgICAgICAgICAmJiBmcmFnbWVudCA9PT0gdGhpcy5mcmFnbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVcmkoc2NoZW1lLCBhdXRob3JpdHksIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCk7XG4gICAgfVxuICAgIC8vIC0tLS0gcGFyc2UgJiB2YWxpZGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFVSSSBmcm9tIGEgc3RyaW5nLCBlLmcuIGBodHRwOi8vd3d3LmV4YW1wbGUuY29tL3NvbWUvcGF0aGAsXG4gICAgICogYGZpbGU6Ly8vdXNyL2hvbWVgLCBvciBgc2NoZW1lOndpdGgvcGF0aGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgQSBzdHJpbmcgd2hpY2ggcmVwcmVzZW50cyBhbiBVUkkgKHNlZSBgVVJJI3RvU3RyaW5nYCkuXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKHZhbHVlLCBfc3RyaWN0ID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBfcmVnZXhwLmV4ZWModmFsdWUpO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVyaShfZW1wdHksIF9lbXB0eSwgX2VtcHR5LCBfZW1wdHksIF9lbXB0eSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVcmkobWF0Y2hbMl0gfHwgX2VtcHR5LCBwZXJjZW50RGVjb2RlKG1hdGNoWzRdIHx8IF9lbXB0eSksIHBlcmNlbnREZWNvZGUobWF0Y2hbNV0gfHwgX2VtcHR5KSwgcGVyY2VudERlY29kZShtYXRjaFs3XSB8fCBfZW1wdHkpLCBwZXJjZW50RGVjb2RlKG1hdGNoWzldIHx8IF9lbXB0eSksIF9zdHJpY3QpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFVSSSBmcm9tIGEgZmlsZSBzeXN0ZW0gcGF0aCwgZS5nLiBgYzpcXG15XFxmaWxlc2AsXG4gICAgICogYC91c3IvaG9tZWAsIG9yIGBcXFxcc2VydmVyXFxzaGFyZVxcc29tZVxccGF0aGAuXG4gICAgICpcbiAgICAgKiBUaGUgKmRpZmZlcmVuY2UqIGJldHdlZW4gYFVSSSNwYXJzZWAgYW5kIGBVUkkjZmlsZWAgaXMgdGhhdCB0aGUgbGF0dGVyIHRyZWF0cyB0aGUgYXJndW1lbnRcbiAgICAgKiBhcyBwYXRoLCBub3QgYXMgc3RyaW5naWZpZWQtdXJpLiBFLmcuIGBVUkkuZmlsZShwYXRoKWAgaXMgKipub3QgdGhlIHNhbWUgYXMqKlxuICAgICAqIGBVUkkucGFyc2UoJ2ZpbGU6Ly8nICsgcGF0aClgIGJlY2F1c2UgdGhlIHBhdGggbWlnaHQgY29udGFpbiBjaGFyYWN0ZXJzIHRoYXQgYXJlXG4gICAgICogaW50ZXJwcmV0ZWQgKCMgYW5kID8pLiBTZWUgdGhlIGZvbGxvd2luZyBzYW1wbGU6XG4gICAgICogYGBgdHNcbiAgICBjb25zdCBnb29kID0gVVJJLmZpbGUoJy9jb2RpbmcvYyMvcHJvamVjdDEnKTtcbiAgICBnb29kLnNjaGVtZSA9PT0gJ2ZpbGUnO1xuICAgIGdvb2QucGF0aCA9PT0gJy9jb2RpbmcvYyMvcHJvamVjdDEnO1xuICAgIGdvb2QuZnJhZ21lbnQgPT09ICcnO1xuICAgIGNvbnN0IGJhZCA9IFVSSS5wYXJzZSgnZmlsZTovLycgKyAnL2NvZGluZy9jIy9wcm9qZWN0MScpO1xuICAgIGJhZC5zY2hlbWUgPT09ICdmaWxlJztcbiAgICBiYWQucGF0aCA9PT0gJy9jb2RpbmcvYyc7IC8vIHBhdGggaXMgbm93IGJyb2tlblxuICAgIGJhZC5mcmFnbWVudCA9PT0gJy9wcm9qZWN0MSc7XG4gICAgYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCBBIGZpbGUgc3lzdGVtIHBhdGggKHNlZSBgVVJJI2ZzUGF0aGApXG4gICAgICovXG4gICAgc3RhdGljIGZpbGUocGF0aCkge1xuICAgICAgICBsZXQgYXV0aG9yaXR5ID0gX2VtcHR5O1xuICAgICAgICAvLyBub3JtYWxpemUgdG8gZndkLXNsYXNoZXMgb24gd2luZG93cyxcbiAgICAgICAgLy8gb24gb3RoZXIgc3lzdGVtcyBid2Qtc2xhc2hlcyBhcmUgdmFsaWRcbiAgICAgICAgLy8gZmlsZW5hbWUgY2hhcmFjdGVyLCBlZyAvZlxcb28vYmFcXHIudHh0XG4gICAgICAgIGlmIChpc1dpbmRvd3MpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcXFwvZywgX3NsYXNoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBmb3IgYXV0aG9yaXR5IGFzIHVzZWQgaW4gVU5DIHNoYXJlc1xuICAgICAgICAvLyBvciB1c2UgdGhlIHBhdGggYXMgZ2l2ZW5cbiAgICAgICAgaWYgKHBhdGhbMF0gPT09IF9zbGFzaCAmJiBwYXRoWzFdID09PSBfc2xhc2gpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhdGguaW5kZXhPZihfc2xhc2gsIDIpO1xuICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSBwYXRoLnN1YnN0cmluZygyKTtcbiAgICAgICAgICAgICAgICBwYXRoID0gX3NsYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gcGF0aC5zdWJzdHJpbmcoMiwgaWR4KTtcbiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoaWR4KSB8fCBfc2xhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVcmkoJ2ZpbGUnLCBhdXRob3JpdHksIHBhdGgsIF9lbXB0eSwgX2VtcHR5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgVVJJIGZyb20gdXJpIGNvbXBvbmVudHMuXG4gICAgICpcbiAgICAgKiBVbmxlc3MgYHN0cmljdGAgaXMgYHRydWVgIHRoZSBzY2hlbWUgaXMgZGVmYXVsdHMgdG8gYmUgYGZpbGVgLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zXG4gICAgICogdmFsaWRhdGlvbiBhbmQgc2hvdWxkIGJlIHVzZWQgZm9yIHVudHJ1c3RlZCB1cmkgY29tcG9uZW50cyByZXRyaWV2ZWQgZnJvbSBzdG9yYWdlLFxuICAgICAqIHVzZXIgaW5wdXQsIGNvbW1hbmQgYXJndW1lbnRzIGV0Y1xuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKGNvbXBvbmVudHMsIHN0cmljdCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVXJpKGNvbXBvbmVudHMuc2NoZW1lLCBjb21wb25lbnRzLmF1dGhvcml0eSwgY29tcG9uZW50cy5wYXRoLCBjb21wb25lbnRzLnF1ZXJ5LCBjb21wb25lbnRzLmZyYWdtZW50LCBzdHJpY3QpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBKb2luIGEgVVJJIHBhdGggd2l0aCBwYXRoIGZyYWdtZW50cyBhbmQgbm9ybWFsaXplcyB0aGUgcmVzdWx0aW5nIHBhdGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBpbnB1dCBVUkkuXG4gICAgICogQHBhcmFtIHBhdGhGcmFnbWVudCBUaGUgcGF0aCBmcmFnbWVudCB0byBhZGQgdG8gdGhlIFVSSSBwYXRoLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHRpbmcgVVJJLlxuICAgICAqL1xuICAgIHN0YXRpYyBqb2luUGF0aCh1cmksIC4uLnBhdGhGcmFnbWVudCkge1xuICAgICAgICBpZiAoIXVyaS5wYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtVcmlFcnJvcl06IGNhbm5vdCBjYWxsIGpvaW5QYXRoIG9uIFVSSSB3aXRob3V0IHBhdGhgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3UGF0aDtcbiAgICAgICAgaWYgKGlzV2luZG93cyAmJiB1cmkuc2NoZW1lID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgIG5ld1BhdGggPSBVUkkuZmlsZShwYXRocy53aW4zMi5qb2luKHVyaVRvRnNQYXRoKHVyaSwgdHJ1ZSksIC4uLnBhdGhGcmFnbWVudCkpLnBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdQYXRoID0gcGF0aHMucG9zaXguam9pbih1cmkucGF0aCwgLi4ucGF0aEZyYWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJpLndpdGgoeyBwYXRoOiBuZXdQYXRoIH0pO1xuICAgIH1cbiAgICAvLyAtLS0tIHByaW50aW5nL2V4dGVybmFsaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMgVVJJLiBJdCdzIGd1YXJhbnRlZWQgdGhhdCBjYWxsaW5nXG4gICAgICogYFVSSS5wYXJzZWAgd2l0aCB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbiBVUkkgd2hpY2ggaXMgZXF1YWxcbiAgICAgKiB0byB0aGlzIFVSSS5cbiAgICAgKlxuICAgICAqICogVGhlIHJlc3VsdCBzaGFsbCAqbm90KiBiZSB1c2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzIGJ1dCBmb3IgZXh0ZXJuYWxpemF0aW9uIG9yIHRyYW5zcG9ydC5cbiAgICAgKiAqIFRoZSByZXN1bHQgd2lsbCBiZSBlbmNvZGVkIHVzaW5nIHRoZSBwZXJjZW50YWdlIGVuY29kaW5nIGFuZCBlbmNvZGluZyBoYXBwZW5zIG1vc3RseVxuICAgICAqIGlnbm9yZSB0aGUgc2NoZW1lLXNwZWNpZmljIGVuY29kaW5nIHJ1bGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNraXBFbmNvZGluZyBEbyBub3QgZW5jb2RlIHRoZSByZXN1bHQsIGRlZmF1bHQgaXMgYGZhbHNlYFxuICAgICAqL1xuICAgIHRvU3RyaW5nKHNraXBFbmNvZGluZyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBfYXNGb3JtYXR0ZWQodGhpcywgc2tpcEVuY29kaW5nKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIHJldml2ZShkYXRhKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVSSSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVXJpKGRhdGEpO1xuICAgICAgICAgICAgcmVzdWx0Ll9mb3JtYXR0ZWQgPSAoX2EgPSBkYXRhLmV4dGVybmFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBudWxsO1xuICAgICAgICAgICAgcmVzdWx0Ll9mc1BhdGggPSBkYXRhLl9zZXAgPT09IF9wYXRoU2VwTWFya2VyID8gKF9iID0gZGF0YS5mc1BhdGgpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGwgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IF9wYXRoU2VwTWFya2VyID0gaXNXaW5kb3dzID8gMSA6IHVuZGVmaW5lZDtcbi8vIFRoaXMgY2xhc3MgZXhpc3RzIHNvIHRoYXQgVVJJIGlzIGNvbXBhdGlibGUgd2l0aCB2c2NvZGUuVXJpIChBUEkpLlxuY2xhc3MgVXJpIGV4dGVuZHMgVVJJIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fZm9ybWF0dGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZnNQYXRoID0gbnVsbDtcbiAgICB9XG4gICAgZ2V0IGZzUGF0aCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mc1BhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZzUGF0aCA9IHVyaVRvRnNQYXRoKHRoaXMsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZnNQYXRoO1xuICAgIH1cbiAgICB0b1N0cmluZyhza2lwRW5jb2RpbmcgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIXNraXBFbmNvZGluZykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXR0ZWQgPSBfYXNGb3JtYXR0ZWQodGhpcywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdlIGRvbid0IGNhY2hlIHRoYXRcbiAgICAgICAgICAgIHJldHVybiBfYXNGb3JtYXR0ZWQodGhpcywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICAkbWlkOiAxIC8qIE1hcnNoYWxsZWRJZC5VcmkgKi9cbiAgICAgICAgfTtcbiAgICAgICAgLy8gY2FjaGVkIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLl9mc1BhdGgpIHtcbiAgICAgICAgICAgIHJlcy5mc1BhdGggPSB0aGlzLl9mc1BhdGg7XG4gICAgICAgICAgICByZXMuX3NlcCA9IF9wYXRoU2VwTWFya2VyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9mb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgIHJlcy5leHRlcm5hbCA9IHRoaXMuX2Zvcm1hdHRlZDtcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSB1cmkgY29tcG9uZW50c1xuICAgICAgICBpZiAodGhpcy5wYXRoKSB7XG4gICAgICAgICAgICByZXMucGF0aCA9IHRoaXMucGF0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPXG4gICAgICAgIC8vIHRoaXMgaXNuJ3QgY29ycmVjdCBhbmQgY2FuIHZpb2xhdGUgdGhlIFVyaUNvbXBvbmVudHMgY29udHJhY3QgYnV0XG4gICAgICAgIC8vIHRoaXMgaXMgcGFydCBvZiB0aGUgdnNjb2RlLlVyaSBBUEkgYW5kIHdlIHNob3VsZG4ndCBjaGFuZ2UgaG93IHRoYXRcbiAgICAgICAgLy8gd29ya3MgYW55bW9yZVxuICAgICAgICBpZiAodGhpcy5zY2hlbWUpIHtcbiAgICAgICAgICAgIHJlcy5zY2hlbWUgPSB0aGlzLnNjaGVtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIHJlcy5hdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICAgICAgcmVzLnF1ZXJ5ID0gdGhpcy5xdWVyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mcmFnbWVudCkge1xuICAgICAgICAgICAgcmVzLmZyYWdtZW50ID0gdGhpcy5mcmFnbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cbi8vIHJlc2VydmVkIGNoYXJhY3RlcnM6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMi4yXG5jb25zdCBlbmNvZGVUYWJsZSA9IHtcbiAgICBbNTggLyogQ2hhckNvZGUuQ29sb24gKi9dOiAnJTNBJyxcbiAgICBbNDcgLyogQ2hhckNvZGUuU2xhc2ggKi9dOiAnJTJGJyxcbiAgICBbNjMgLyogQ2hhckNvZGUuUXVlc3Rpb25NYXJrICovXTogJyUzRicsXG4gICAgWzM1IC8qIENoYXJDb2RlLkhhc2ggKi9dOiAnJTIzJyxcbiAgICBbOTEgLyogQ2hhckNvZGUuT3BlblNxdWFyZUJyYWNrZXQgKi9dOiAnJTVCJyxcbiAgICBbOTMgLyogQ2hhckNvZGUuQ2xvc2VTcXVhcmVCcmFja2V0ICovXTogJyU1RCcsXG4gICAgWzY0IC8qIENoYXJDb2RlLkF0U2lnbiAqL106ICclNDAnLFxuICAgIFszMyAvKiBDaGFyQ29kZS5FeGNsYW1hdGlvbk1hcmsgKi9dOiAnJTIxJyxcbiAgICBbMzYgLyogQ2hhckNvZGUuRG9sbGFyU2lnbiAqL106ICclMjQnLFxuICAgIFszOCAvKiBDaGFyQ29kZS5BbXBlcnNhbmQgKi9dOiAnJTI2JyxcbiAgICBbMzkgLyogQ2hhckNvZGUuU2luZ2xlUXVvdGUgKi9dOiAnJTI3JyxcbiAgICBbNDAgLyogQ2hhckNvZGUuT3BlblBhcmVuICovXTogJyUyOCcsXG4gICAgWzQxIC8qIENoYXJDb2RlLkNsb3NlUGFyZW4gKi9dOiAnJTI5JyxcbiAgICBbNDIgLyogQ2hhckNvZGUuQXN0ZXJpc2sgKi9dOiAnJTJBJyxcbiAgICBbNDMgLyogQ2hhckNvZGUuUGx1cyAqL106ICclMkInLFxuICAgIFs0NCAvKiBDaGFyQ29kZS5Db21tYSAqL106ICclMkMnLFxuICAgIFs1OSAvKiBDaGFyQ29kZS5TZW1pY29sb24gKi9dOiAnJTNCJyxcbiAgICBbNjEgLyogQ2hhckNvZGUuRXF1YWxzICovXTogJyUzRCcsXG4gICAgWzMyIC8qIENoYXJDb2RlLlNwYWNlICovXTogJyUyMCcsXG59O1xuZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50RmFzdCh1cmlDb21wb25lbnQsIGlzUGF0aCwgaXNBdXRob3JpdHkpIHtcbiAgICBsZXQgcmVzID0gdW5kZWZpbmVkO1xuICAgIGxldCBuYXRpdmVFbmNvZGVQb3MgPSAtMTtcbiAgICBmb3IgKGxldCBwb3MgPSAwOyBwb3MgPCB1cmlDb21wb25lbnQubGVuZ3RoOyBwb3MrKykge1xuICAgICAgICBjb25zdCBjb2RlID0gdXJpQ29tcG9uZW50LmNoYXJDb2RlQXQocG9zKTtcbiAgICAgICAgLy8gdW5yZXNlcnZlZCBjaGFyYWN0ZXJzOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuM1xuICAgICAgICBpZiAoKGNvZGUgPj0gOTcgLyogQ2hhckNvZGUuYSAqLyAmJiBjb2RlIDw9IDEyMiAvKiBDaGFyQ29kZS56ICovKVxuICAgICAgICAgICAgfHwgKGNvZGUgPj0gNjUgLyogQ2hhckNvZGUuQSAqLyAmJiBjb2RlIDw9IDkwIC8qIENoYXJDb2RlLlogKi8pXG4gICAgICAgICAgICB8fCAoY29kZSA+PSA0OCAvKiBDaGFyQ29kZS5EaWdpdDAgKi8gJiYgY29kZSA8PSA1NyAvKiBDaGFyQ29kZS5EaWdpdDkgKi8pXG4gICAgICAgICAgICB8fCBjb2RlID09PSA0NSAvKiBDaGFyQ29kZS5EYXNoICovXG4gICAgICAgICAgICB8fCBjb2RlID09PSA0NiAvKiBDaGFyQ29kZS5QZXJpb2QgKi9cbiAgICAgICAgICAgIHx8IGNvZGUgPT09IDk1IC8qIENoYXJDb2RlLlVuZGVybGluZSAqL1xuICAgICAgICAgICAgfHwgY29kZSA9PT0gMTI2IC8qIENoYXJDb2RlLlRpbGRlICovXG4gICAgICAgICAgICB8fCAoaXNQYXRoICYmIGNvZGUgPT09IDQ3IC8qIENoYXJDb2RlLlNsYXNoICovKVxuICAgICAgICAgICAgfHwgKGlzQXV0aG9yaXR5ICYmIGNvZGUgPT09IDkxIC8qIENoYXJDb2RlLk9wZW5TcXVhcmVCcmFja2V0ICovKVxuICAgICAgICAgICAgfHwgKGlzQXV0aG9yaXR5ICYmIGNvZGUgPT09IDkzIC8qIENoYXJDb2RlLkNsb3NlU3F1YXJlQnJhY2tldCAqLylcbiAgICAgICAgICAgIHx8IChpc0F1dGhvcml0eSAmJiBjb2RlID09PSA1OCAvKiBDaGFyQ29kZS5Db2xvbiAqLykpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGFyZSBkZWxheWluZyBuYXRpdmUgZW5jb2RlXG4gICAgICAgICAgICBpZiAobmF0aXZlRW5jb2RlUG9zICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVVUklDb21wb25lbnQodXJpQ29tcG9uZW50LnN1YnN0cmluZyhuYXRpdmVFbmNvZGVQb3MsIHBvcykpO1xuICAgICAgICAgICAgICAgIG5hdGl2ZUVuY29kZVBvcyA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2Ugd3JpdGUgaW50byBhIG5ldyBzdHJpbmcgKGJ5IGRlZmF1bHQgd2UgdHJ5IHRvIHJldHVybiB0aGUgcGFyYW0pXG4gICAgICAgICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXMgKz0gdXJpQ29tcG9uZW50LmNoYXJBdChwb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZW5jb2RpbmcgbmVlZGVkLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHN0cmluZ1xuICAgICAgICAgICAgaWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gdXJpQ29tcG9uZW50LnN1YnN0cigwLCBwb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2hlY2sgd2l0aCBkZWZhdWx0IHRhYmxlIGZpcnN0XG4gICAgICAgICAgICBjb25zdCBlc2NhcGVkID0gZW5jb2RlVGFibGVbY29kZV07XG4gICAgICAgICAgICBpZiAoZXNjYXBlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIGRlbGF5aW5nIG5hdGl2ZSBlbmNvZGVcbiAgICAgICAgICAgICAgICBpZiAobmF0aXZlRW5jb2RlUG9zICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXMgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHVyaUNvbXBvbmVudC5zdWJzdHJpbmcobmF0aXZlRW5jb2RlUG9zLCBwb3MpKTtcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRW5jb2RlUG9zID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBlc2NhcGVkIHZhcmlhbnQgdG8gcmVzdWx0XG4gICAgICAgICAgICAgICAgcmVzICs9IGVzY2FwZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChuYXRpdmVFbmNvZGVQb3MgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlIG5hdGl2ZSBlbmNvZGUgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgICAgIG5hdGl2ZUVuY29kZVBvcyA9IHBvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobmF0aXZlRW5jb2RlUG9zICE9PSAtMSkge1xuICAgICAgICByZXMgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHVyaUNvbXBvbmVudC5zdWJzdHJpbmcobmF0aXZlRW5jb2RlUG9zKSk7XG4gICAgfVxuICAgIHJldHVybiByZXMgIT09IHVuZGVmaW5lZCA/IHJlcyA6IHVyaUNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudE1pbmltYWwocGF0aCkge1xuICAgIGxldCByZXMgPSB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgcGF0aC5sZW5ndGg7IHBvcysrKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQocG9zKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDM1IC8qIENoYXJDb2RlLkhhc2ggKi8gfHwgY29kZSA9PT0gNjMgLyogQ2hhckNvZGUuUXVlc3Rpb25NYXJrICovKSB7XG4gICAgICAgICAgICBpZiAocmVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBwYXRoLnN1YnN0cigwLCBwb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzICs9IGVuY29kZVRhYmxlW2NvZGVdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzICs9IHBhdGhbcG9zXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiBwYXRoO1xufVxuLyoqXG4gKiBDb21wdXRlIGBmc1BhdGhgIGZvciB0aGUgZ2l2ZW4gdXJpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmlUb0ZzUGF0aCh1cmksIGtlZXBEcml2ZUxldHRlckNhc2luZykge1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAodXJpLmF1dGhvcml0eSAmJiB1cmkucGF0aC5sZW5ndGggPiAxICYmIHVyaS5zY2hlbWUgPT09ICdmaWxlJykge1xuICAgICAgICAvLyB1bmMgcGF0aDogZmlsZTovL3NoYXJlcy9jJC9mYXIvYm9vXG4gICAgICAgIHZhbHVlID0gYC8vJHt1cmkuYXV0aG9yaXR5fSR7dXJpLnBhdGh9YDtcbiAgICB9XG4gICAgZWxzZSBpZiAodXJpLnBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogQ2hhckNvZGUuU2xhc2ggKi9cbiAgICAgICAgJiYgKHVyaS5wYXRoLmNoYXJDb2RlQXQoMSkgPj0gNjUgLyogQ2hhckNvZGUuQSAqLyAmJiB1cmkucGF0aC5jaGFyQ29kZUF0KDEpIDw9IDkwIC8qIENoYXJDb2RlLlogKi8gfHwgdXJpLnBhdGguY2hhckNvZGVBdCgxKSA+PSA5NyAvKiBDaGFyQ29kZS5hICovICYmIHVyaS5wYXRoLmNoYXJDb2RlQXQoMSkgPD0gMTIyIC8qIENoYXJDb2RlLnogKi8pXG4gICAgICAgICYmIHVyaS5wYXRoLmNoYXJDb2RlQXQoMikgPT09IDU4IC8qIENoYXJDb2RlLkNvbG9uICovKSB7XG4gICAgICAgIGlmICgha2VlcERyaXZlTGV0dGVyQ2FzaW5nKSB7XG4gICAgICAgICAgICAvLyB3aW5kb3dzIGRyaXZlIGxldHRlcjogZmlsZTovLy9jOi9mYXIvYm9vXG4gICAgICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkgKyB1cmkucGF0aC5zdWJzdHIoMik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoLnN1YnN0cigxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXIgcGF0aFxuICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoO1xuICAgIH1cbiAgICBpZiAoaXNXaW5kb3dzKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFwvL2csICdcXFxcJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbi8qKlxuICogQ3JlYXRlIHRoZSBleHRlcm5hbCB2ZXJzaW9uIG9mIGEgdXJpXG4gKi9cbmZ1bmN0aW9uIF9hc0Zvcm1hdHRlZCh1cmksIHNraXBFbmNvZGluZykge1xuICAgIGNvbnN0IGVuY29kZXIgPSAhc2tpcEVuY29kaW5nXG4gICAgICAgID8gZW5jb2RlVVJJQ29tcG9uZW50RmFzdFxuICAgICAgICA6IGVuY29kZVVSSUNvbXBvbmVudE1pbmltYWw7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGxldCB7IHNjaGVtZSwgYXV0aG9yaXR5LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgfSA9IHVyaTtcbiAgICBpZiAoc2NoZW1lKSB7XG4gICAgICAgIHJlcyArPSBzY2hlbWU7XG4gICAgICAgIHJlcyArPSAnOic7XG4gICAgfVxuICAgIGlmIChhdXRob3JpdHkgfHwgc2NoZW1lID09PSAnZmlsZScpIHtcbiAgICAgICAgcmVzICs9IF9zbGFzaDtcbiAgICAgICAgcmVzICs9IF9zbGFzaDtcbiAgICB9XG4gICAgaWYgKGF1dGhvcml0eSkge1xuICAgICAgICBsZXQgaWR4ID0gYXV0aG9yaXR5LmluZGV4T2YoJ0AnKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIDx1c2VyPkA8YXV0aD5cbiAgICAgICAgICAgIGNvbnN0IHVzZXJpbmZvID0gYXV0aG9yaXR5LnN1YnN0cigwLCBpZHgpO1xuICAgICAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5LnN1YnN0cihpZHggKyAxKTtcbiAgICAgICAgICAgIGlkeCA9IHVzZXJpbmZvLmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKHVzZXJpbmZvLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gPHVzZXI+OjxwYXNzPkA8YXV0aD5cbiAgICAgICAgICAgICAgICByZXMgKz0gZW5jb2Rlcih1c2VyaW5mby5zdWJzdHIoMCwgaWR4KSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXMgKz0gJzonO1xuICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKHVzZXJpbmZvLnN1YnN0cihpZHggKyAxKSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzICs9ICdAJztcbiAgICAgICAgfVxuICAgICAgICBhdXRob3JpdHkgPSBhdXRob3JpdHkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWR4ID0gYXV0aG9yaXR5Lmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICByZXMgKz0gZW5jb2RlcihhdXRob3JpdHksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIDxhdXRoPjo8cG9ydD5cbiAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKGF1dGhvcml0eS5zdWJzdHIoMCwgaWR4KSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgcmVzICs9IGF1dGhvcml0eS5zdWJzdHIoaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0aCkge1xuICAgICAgICAvLyBsb3dlci1jYXNlIHdpbmRvd3MgZHJpdmUgbGV0dGVycyBpbiAvQzovZmZmIG9yIEM6L2ZmZlxuICAgICAgICBpZiAocGF0aC5sZW5ndGggPj0gMyAmJiBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IDQ3IC8qIENoYXJDb2RlLlNsYXNoICovICYmIHBhdGguY2hhckNvZGVBdCgyKSA9PT0gNTggLyogQ2hhckNvZGUuQ29sb24gKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMSk7XG4gICAgICAgICAgICBpZiAoY29kZSA+PSA2NSAvKiBDaGFyQ29kZS5BICovICYmIGNvZGUgPD0gOTAgLyogQ2hhckNvZGUuWiAqLykge1xuICAgICAgICAgICAgICAgIHBhdGggPSBgLyR7U3RyaW5nLmZyb21DaGFyQ29kZShjb2RlICsgMzIpfToke3BhdGguc3Vic3RyKDMpfWA7IC8vIFwiL2M6XCIubGVuZ3RoID09PSAzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5sZW5ndGggPj0gMiAmJiBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IDU4IC8qIENoYXJDb2RlLkNvbG9uICovKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgaWYgKGNvZGUgPj0gNjUgLyogQ2hhckNvZGUuQSAqLyAmJiBjb2RlIDw9IDkwIC8qIENoYXJDb2RlLlogKi8pIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZShjb2RlICsgMzIpfToke3BhdGguc3Vic3RyKDIpfWA7IC8vIFwiL2M6XCIubGVuZ3RoID09PSAzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZW5jb2RlIHRoZSByZXN0IG9mIHRoZSBwYXRoXG4gICAgICAgIHJlcyArPSBlbmNvZGVyKHBhdGgsIHRydWUsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgIHJlcyArPSAnPyc7XG4gICAgICAgIHJlcyArPSBlbmNvZGVyKHF1ZXJ5LCBmYWxzZSwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgcmVzICs9ICcjJztcbiAgICAgICAgcmVzICs9ICFza2lwRW5jb2RpbmcgPyBlbmNvZGVVUklDb21wb25lbnRGYXN0KGZyYWdtZW50LCBmYWxzZSwgZmFsc2UpIDogZnJhZ21lbnQ7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vLyAtLS0gZGVjb2RlXG5mdW5jdGlvbiBkZWNvZGVVUklDb21wb25lbnRHcmFjZWZ1bChzdHIpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICBpZiAoc3RyLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIDMpICsgZGVjb2RlVVJJQ29tcG9uZW50R3JhY2VmdWwoc3RyLnN1YnN0cigzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG4gICAgfVxufVxuY29uc3QgX3JFbmNvZGVkQXNIZXggPSAvKCVbMC05QS1aYS16XVswLTlBLVphLXpdKSsvZztcbmZ1bmN0aW9uIHBlcmNlbnREZWNvZGUoc3RyKSB7XG4gICAgaWYgKCFzdHIubWF0Y2goX3JFbmNvZGVkQXNIZXgpKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHIucmVwbGFjZShfckVuY29kZWRBc0hleCwgKG1hdGNoKSA9PiBkZWNvZGVVUklDb21wb25lbnRHcmFjZWZ1bChtYXRjaCkpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKipcbiAqIEEgcG9zaXRpb24gaW4gdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvc2l0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihsaW5lTnVtYmVyLCBjb2x1bW4pIHtcbiAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjtcbiAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBwb3NpdGlvbiBmcm9tIHRoaXMgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV3TGluZU51bWJlciBuZXcgbGluZSBudW1iZXJcbiAgICAgKiBAcGFyYW0gbmV3Q29sdW1uIG5ldyBjb2x1bW5cbiAgICAgKi9cbiAgICB3aXRoKG5ld0xpbmVOdW1iZXIgPSB0aGlzLmxpbmVOdW1iZXIsIG5ld0NvbHVtbiA9IHRoaXMuY29sdW1uKSB7XG4gICAgICAgIGlmIChuZXdMaW5lTnVtYmVyID09PSB0aGlzLmxpbmVOdW1iZXIgJiYgbmV3Q29sdW1uID09PSB0aGlzLmNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKG5ld0xpbmVOdW1iZXIsIG5ld0NvbHVtbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVyaXZlIGEgbmV3IHBvc2l0aW9uIGZyb20gdGhpcyBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWx0YUxpbmVOdW1iZXIgbGluZSBudW1iZXIgZGVsdGFcbiAgICAgKiBAcGFyYW0gZGVsdGFDb2x1bW4gY29sdW1uIGRlbHRhXG4gICAgICovXG4gICAgZGVsdGEoZGVsdGFMaW5lTnVtYmVyID0gMCwgZGVsdGFDb2x1bW4gPSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGgodGhpcy5saW5lTnVtYmVyICsgZGVsdGFMaW5lTnVtYmVyLCB0aGlzLmNvbHVtbiArIGRlbHRhQ29sdW1uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiB0aGlzIHBvc2l0aW9uIGVxdWFscyBvdGhlciBwb3NpdGlvblxuICAgICAqL1xuICAgIGVxdWFscyhvdGhlcikge1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uZXF1YWxzKHRoaXMsIG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBwb3NpdGlvbiBgYWAgZXF1YWxzIHBvc2l0aW9uIGBiYFxuICAgICAqL1xuICAgIHN0YXRpYyBlcXVhbHMoYSwgYikge1xuICAgICAgICBpZiAoIWEgJiYgIWIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoISFhICYmXG4gICAgICAgICAgICAhIWIgJiZcbiAgICAgICAgICAgIGEubGluZU51bWJlciA9PT0gYi5saW5lTnVtYmVyICYmXG4gICAgICAgICAgICBhLmNvbHVtbiA9PT0gYi5jb2x1bW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoaXMgcG9zaXRpb24gaXMgYmVmb3JlIG90aGVyIHBvc2l0aW9uLlxuICAgICAqIElmIHRoZSB0d28gcG9zaXRpb25zIGFyZSBlcXVhbCwgdGhlIHJlc3VsdCB3aWxsIGJlIGZhbHNlLlxuICAgICAqL1xuICAgIGlzQmVmb3JlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbi5pc0JlZm9yZSh0aGlzLCBvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgcG9zaXRpb24gYGFgIGlzIGJlZm9yZSBwb3NpdGlvbiBgYmAuXG4gICAgICogSWYgdGhlIHR3byBwb3NpdGlvbnMgYXJlIGVxdWFsLCB0aGUgcmVzdWx0IHdpbGwgYmUgZmFsc2UuXG4gICAgICovXG4gICAgc3RhdGljIGlzQmVmb3JlKGEsIGIpIHtcbiAgICAgICAgaWYgKGEubGluZU51bWJlciA8IGIubGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIubGluZU51bWJlciA8IGEubGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhLmNvbHVtbiA8IGIuY29sdW1uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoaXMgcG9zaXRpb24gaXMgYmVmb3JlIG90aGVyIHBvc2l0aW9uLlxuICAgICAqIElmIHRoZSB0d28gcG9zaXRpb25zIGFyZSBlcXVhbCwgdGhlIHJlc3VsdCB3aWxsIGJlIHRydWUuXG4gICAgICovXG4gICAgaXNCZWZvcmVPckVxdWFsKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbi5pc0JlZm9yZU9yRXF1YWwodGhpcywgb3RoZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHBvc2l0aW9uIGBhYCBpcyBiZWZvcmUgcG9zaXRpb24gYGJgLlxuICAgICAqIElmIHRoZSB0d28gcG9zaXRpb25zIGFyZSBlcXVhbCwgdGhlIHJlc3VsdCB3aWxsIGJlIHRydWUuXG4gICAgICovXG4gICAgc3RhdGljIGlzQmVmb3JlT3JFcXVhbChhLCBiKSB7XG4gICAgICAgIGlmIChhLmxpbmVOdW1iZXIgPCBiLmxpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmxpbmVOdW1iZXIgPCBhLmxpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYS5jb2x1bW4gPD0gYi5jb2x1bW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyBwb3NpdGlvbnMsIHVzZWZ1bCBmb3Igc29ydGluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBjb21wYXJlKGEsIGIpIHtcbiAgICAgICAgY29uc3QgYUxpbmVOdW1iZXIgPSBhLmxpbmVOdW1iZXIgfCAwO1xuICAgICAgICBjb25zdCBiTGluZU51bWJlciA9IGIubGluZU51bWJlciB8IDA7XG4gICAgICAgIGlmIChhTGluZU51bWJlciA9PT0gYkxpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFDb2x1bW4gPSBhLmNvbHVtbiB8IDA7XG4gICAgICAgICAgICBjb25zdCBiQ29sdW1uID0gYi5jb2x1bW4gfCAwO1xuICAgICAgICAgICAgcmV0dXJuIGFDb2x1bW4gLSBiQ29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhTGluZU51bWJlciAtIGJMaW5lTnVtYmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9uZSB0aGlzIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMubGluZU51bWJlciwgdGhpcy5jb2x1bW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIGEgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAnKCcgKyB0aGlzLmxpbmVOdW1iZXIgKyAnLCcgKyB0aGlzLmNvbHVtbiArICcpJztcbiAgICB9XG4gICAgLy8gLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgYFBvc2l0aW9uYCBmcm9tIGFuIGBJUG9zaXRpb25gLlxuICAgICAqL1xuICAgIHN0YXRpYyBsaWZ0KHBvcykge1xuICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHBvcy5saW5lTnVtYmVyLCBwb3MuY29sdW1uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBgb2JqYCBpcyBhbiBgSVBvc2l0aW9uYC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNJUG9zaXRpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqXG4gICAgICAgICAgICAmJiAodHlwZW9mIG9iai5saW5lTnVtYmVyID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICYmICh0eXBlb2Ygb2JqLmNvbHVtbiA9PT0gJ251bWJlcicpKTtcbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi9wb3NpdGlvbi5qcyc7XG4vKipcbiAqIEEgcmFuZ2UgaW4gdGhlIGVkaXRvci4gKHN0YXJ0TGluZU51bWJlcixzdGFydENvbHVtbikgaXMgPD0gKGVuZExpbmVOdW1iZXIsZW5kQ29sdW1uKVxuICovXG5leHBvcnQgY2xhc3MgUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHN0YXJ0TGluZU51bWJlciwgc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbikge1xuICAgICAgICBpZiAoKHN0YXJ0TGluZU51bWJlciA+IGVuZExpbmVOdW1iZXIpIHx8IChzdGFydExpbmVOdW1iZXIgPT09IGVuZExpbmVOdW1iZXIgJiYgc3RhcnRDb2x1bW4gPiBlbmRDb2x1bW4pKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0TGluZU51bWJlciA9IGVuZExpbmVOdW1iZXI7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0Q29sdW1uID0gZW5kQ29sdW1uO1xuICAgICAgICAgICAgdGhpcy5lbmRMaW5lTnVtYmVyID0gc3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5lbmRDb2x1bW4gPSBzdGFydENvbHVtbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRMaW5lTnVtYmVyID0gc3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uO1xuICAgICAgICAgICAgdGhpcy5lbmRMaW5lTnVtYmVyID0gZW5kTGluZU51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuZW5kQ29sdW1uID0gZW5kQ29sdW1uO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgdGhpcyByYW5nZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gUmFuZ2UuaXNFbXB0eSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBgcmFuZ2VgIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0VtcHR5KHJhbmdlKSB7XG4gICAgICAgIHJldHVybiAocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyID09PSByYW5nZS5lbmRMaW5lTnVtYmVyICYmIHJhbmdlLnN0YXJ0Q29sdW1uID09PSByYW5nZS5lbmRDb2x1bW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHBvc2l0aW9uIGlzIGluIHRoaXMgcmFuZ2UuIElmIHRoZSBwb3NpdGlvbiBpcyBhdCB0aGUgZWRnZXMsIHdpbGwgcmV0dXJuIHRydWUuXG4gICAgICovXG4gICAgY29udGFpbnNQb3NpdGlvbihwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gUmFuZ2UuY29udGFpbnNQb3NpdGlvbih0aGlzLCBwb3NpdGlvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgYHBvc2l0aW9uYCBpcyBpbiBgcmFuZ2VgLiBJZiB0aGUgcG9zaXRpb24gaXMgYXQgdGhlIGVkZ2VzLCB3aWxsIHJldHVybiB0cnVlLlxuICAgICAqL1xuICAgIHN0YXRpYyBjb250YWluc1Bvc2l0aW9uKHJhbmdlLCBwb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlciB8fCBwb3NpdGlvbi5saW5lTnVtYmVyID4gcmFuZ2UuZW5kTGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbi5saW5lTnVtYmVyID09PSByYW5nZS5zdGFydExpbmVOdW1iZXIgJiYgcG9zaXRpb24uY29sdW1uIDwgcmFuZ2Uuc3RhcnRDb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24ubGluZU51bWJlciA9PT0gcmFuZ2UuZW5kTGluZU51bWJlciAmJiBwb3NpdGlvbi5jb2x1bW4gPiByYW5nZS5lbmRDb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBgcG9zaXRpb25gIGlzIGluIGByYW5nZWAuIElmIHRoZSBwb3NpdGlvbiBpcyBhdCB0aGUgZWRnZXMsIHdpbGwgcmV0dXJuIGZhbHNlLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBzdHJpY3RDb250YWluc1Bvc2l0aW9uKHJhbmdlLCBwb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlciB8fCBwb3NpdGlvbi5saW5lTnVtYmVyID4gcmFuZ2UuZW5kTGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbi5saW5lTnVtYmVyID09PSByYW5nZS5zdGFydExpbmVOdW1iZXIgJiYgcG9zaXRpb24uY29sdW1uIDw9IHJhbmdlLnN0YXJ0Q29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmVOdW1iZXIgPT09IHJhbmdlLmVuZExpbmVOdW1iZXIgJiYgcG9zaXRpb24uY29sdW1uID49IHJhbmdlLmVuZENvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHJhbmdlIGlzIGluIHRoaXMgcmFuZ2UuIElmIHRoZSByYW5nZSBpcyBlcXVhbCB0byB0aGlzIHJhbmdlLCB3aWxsIHJldHVybiB0cnVlLlxuICAgICAqL1xuICAgIGNvbnRhaW5zUmFuZ2UocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlLmNvbnRhaW5zUmFuZ2UodGhpcywgcmFuZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIGBvdGhlclJhbmdlYCBpcyBpbiBgcmFuZ2VgLiBJZiB0aGUgcmFuZ2VzIGFyZSBlcXVhbCwgd2lsbCByZXR1cm4gdHJ1ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY29udGFpbnNSYW5nZShyYW5nZSwgb3RoZXJSYW5nZSkge1xuICAgICAgICBpZiAob3RoZXJSYW5nZS5zdGFydExpbmVOdW1iZXIgPCByYW5nZS5zdGFydExpbmVOdW1iZXIgfHwgb3RoZXJSYW5nZS5lbmRMaW5lTnVtYmVyIDwgcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyID4gcmFuZ2UuZW5kTGluZU51bWJlciB8fCBvdGhlclJhbmdlLmVuZExpbmVOdW1iZXIgPiByYW5nZS5lbmRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyID09PSByYW5nZS5zdGFydExpbmVOdW1iZXIgJiYgb3RoZXJSYW5nZS5zdGFydENvbHVtbiA8IHJhbmdlLnN0YXJ0Q29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyUmFuZ2UuZW5kTGluZU51bWJlciA9PT0gcmFuZ2UuZW5kTGluZU51bWJlciAmJiBvdGhlclJhbmdlLmVuZENvbHVtbiA+IHJhbmdlLmVuZENvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIGByYW5nZWAgaXMgc3RyaWN0bHkgaW4gdGhpcyByYW5nZS4gYHJhbmdlYCBtdXN0IHN0YXJ0IGFmdGVyIGFuZCBlbmQgYmVmb3JlIHRoaXMgcmFuZ2UgZm9yIHRoZSByZXN1bHQgdG8gYmUgdHJ1ZS5cbiAgICAgKi9cbiAgICBzdHJpY3RDb250YWluc1JhbmdlKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiBSYW5nZS5zdHJpY3RDb250YWluc1JhbmdlKHRoaXMsIHJhbmdlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBgb3RoZXJSYW5nZWAgaXMgc3RyaWN0bHkgaW4gYHJhbmdlYCAobXVzdCBzdGFydCBhZnRlciwgYW5kIGVuZCBiZWZvcmUpLiBJZiB0aGUgcmFuZ2VzIGFyZSBlcXVhbCwgd2lsbCByZXR1cm4gZmFsc2UuXG4gICAgICovXG4gICAgc3RhdGljIHN0cmljdENvbnRhaW5zUmFuZ2UocmFuZ2UsIG90aGVyUmFuZ2UpIHtcbiAgICAgICAgaWYgKG90aGVyUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIDwgcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIHx8IG90aGVyUmFuZ2UuZW5kTGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdGhlclJhbmdlLnN0YXJ0TGluZU51bWJlciA+IHJhbmdlLmVuZExpbmVOdW1iZXIgfHwgb3RoZXJSYW5nZS5lbmRMaW5lTnVtYmVyID4gcmFuZ2UuZW5kTGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdGhlclJhbmdlLnN0YXJ0TGluZU51bWJlciA9PT0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyICYmIG90aGVyUmFuZ2Uuc3RhcnRDb2x1bW4gPD0gcmFuZ2Uuc3RhcnRDb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXJSYW5nZS5lbmRMaW5lTnVtYmVyID09PSByYW5nZS5lbmRMaW5lTnVtYmVyICYmIG90aGVyUmFuZ2UuZW5kQ29sdW1uID49IHJhbmdlLmVuZENvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHJldW5pb24gb2YgdGhlIHR3byByYW5nZXMuXG4gICAgICogVGhlIHNtYWxsZXN0IHBvc2l0aW9uIHdpbGwgYmUgdXNlZCBhcyB0aGUgc3RhcnQgcG9pbnQsIGFuZCB0aGUgbGFyZ2VzdCBvbmUgYXMgdGhlIGVuZCBwb2ludC5cbiAgICAgKi9cbiAgICBwbHVzUmFuZ2UocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlLnBsdXNSYW5nZSh0aGlzLCByYW5nZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcmV1bmlvbiBvZiB0aGUgdHdvIHJhbmdlcy5cbiAgICAgKiBUaGUgc21hbGxlc3QgcG9zaXRpb24gd2lsbCBiZSB1c2VkIGFzIHRoZSBzdGFydCBwb2ludCwgYW5kIHRoZSBsYXJnZXN0IG9uZSBhcyB0aGUgZW5kIHBvaW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBwbHVzUmFuZ2UoYSwgYikge1xuICAgICAgICBsZXQgc3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICBsZXQgc3RhcnRDb2x1bW47XG4gICAgICAgIGxldCBlbmRMaW5lTnVtYmVyO1xuICAgICAgICBsZXQgZW5kQ29sdW1uO1xuICAgICAgICBpZiAoYi5zdGFydExpbmVOdW1iZXIgPCBhLnN0YXJ0TGluZU51bWJlcikge1xuICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyID0gYi5zdGFydExpbmVOdW1iZXI7XG4gICAgICAgICAgICBzdGFydENvbHVtbiA9IGIuc3RhcnRDb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYi5zdGFydExpbmVOdW1iZXIgPT09IGEuc3RhcnRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXIgPSBiLnN0YXJ0TGluZU51bWJlcjtcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uID0gTWF0aC5taW4oYi5zdGFydENvbHVtbiwgYS5zdGFydENvbHVtbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXIgPSBhLnN0YXJ0TGluZU51bWJlcjtcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uID0gYS5zdGFydENvbHVtbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYi5lbmRMaW5lTnVtYmVyID4gYS5lbmRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyID0gYi5lbmRMaW5lTnVtYmVyO1xuICAgICAgICAgICAgZW5kQ29sdW1uID0gYi5lbmRDb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYi5lbmRMaW5lTnVtYmVyID09PSBhLmVuZExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXIgPSBiLmVuZExpbmVOdW1iZXI7XG4gICAgICAgICAgICBlbmRDb2x1bW4gPSBNYXRoLm1heChiLmVuZENvbHVtbiwgYS5lbmRDb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kTGluZU51bWJlciA9IGEuZW5kTGluZU51bWJlcjtcbiAgICAgICAgICAgIGVuZENvbHVtbiA9IGEuZW5kQ29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbiwgZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byByYW5nZXMuXG4gICAgICovXG4gICAgaW50ZXJzZWN0UmFuZ2VzKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiBSYW5nZS5pbnRlcnNlY3RSYW5nZXModGhpcywgcmFuZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHJhbmdlcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50ZXJzZWN0UmFuZ2VzKGEsIGIpIHtcbiAgICAgICAgbGV0IHJlc3VsdFN0YXJ0TGluZU51bWJlciA9IGEuc3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICBsZXQgcmVzdWx0U3RhcnRDb2x1bW4gPSBhLnN0YXJ0Q29sdW1uO1xuICAgICAgICBsZXQgcmVzdWx0RW5kTGluZU51bWJlciA9IGEuZW5kTGluZU51bWJlcjtcbiAgICAgICAgbGV0IHJlc3VsdEVuZENvbHVtbiA9IGEuZW5kQ29sdW1uO1xuICAgICAgICBjb25zdCBvdGhlclN0YXJ0TGluZU51bWJlciA9IGIuc3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICBjb25zdCBvdGhlclN0YXJ0Q29sdW1uID0gYi5zdGFydENvbHVtbjtcbiAgICAgICAgY29uc3Qgb3RoZXJFbmRMaW5lTnVtYmVyID0gYi5lbmRMaW5lTnVtYmVyO1xuICAgICAgICBjb25zdCBvdGhlckVuZENvbHVtbiA9IGIuZW5kQ29sdW1uO1xuICAgICAgICBpZiAocmVzdWx0U3RhcnRMaW5lTnVtYmVyIDwgb3RoZXJTdGFydExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdFN0YXJ0TGluZU51bWJlciA9IG90aGVyU3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICAgICAgcmVzdWx0U3RhcnRDb2x1bW4gPSBvdGhlclN0YXJ0Q29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdFN0YXJ0TGluZU51bWJlciA9PT0gb3RoZXJTdGFydExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdFN0YXJ0Q29sdW1uID0gTWF0aC5tYXgocmVzdWx0U3RhcnRDb2x1bW4sIG90aGVyU3RhcnRDb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHRFbmRMaW5lTnVtYmVyID4gb3RoZXJFbmRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICByZXN1bHRFbmRMaW5lTnVtYmVyID0gb3RoZXJFbmRMaW5lTnVtYmVyO1xuICAgICAgICAgICAgcmVzdWx0RW5kQ29sdW1uID0gb3RoZXJFbmRDb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVzdWx0RW5kTGluZU51bWJlciA9PT0gb3RoZXJFbmRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICByZXN1bHRFbmRDb2x1bW4gPSBNYXRoLm1pbihyZXN1bHRFbmRDb2x1bW4sIG90aGVyRW5kQ29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiBzZWxlY3Rpb24gaXMgbm93IGVtcHR5XG4gICAgICAgIGlmIChyZXN1bHRTdGFydExpbmVOdW1iZXIgPiByZXN1bHRFbmRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0U3RhcnRMaW5lTnVtYmVyID09PSByZXN1bHRFbmRMaW5lTnVtYmVyICYmIHJlc3VsdFN0YXJ0Q29sdW1uID4gcmVzdWx0RW5kQ29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJlc3VsdFN0YXJ0TGluZU51bWJlciwgcmVzdWx0U3RhcnRDb2x1bW4sIHJlc3VsdEVuZExpbmVOdW1iZXIsIHJlc3VsdEVuZENvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgdGhpcyByYW5nZSBlcXVhbHMgb3RoZXIuXG4gICAgICovXG4gICAgZXF1YWxzUmFuZ2Uob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlLmVxdWFsc1JhbmdlKHRoaXMsIG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiByYW5nZSBgYWAgZXF1YWxzIGBiYC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZXF1YWxzUmFuZ2UoYSwgYikge1xuICAgICAgICBpZiAoIWEgJiYgIWIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoISFhICYmXG4gICAgICAgICAgICAhIWIgJiZcbiAgICAgICAgICAgIGEuc3RhcnRMaW5lTnVtYmVyID09PSBiLnN0YXJ0TGluZU51bWJlciAmJlxuICAgICAgICAgICAgYS5zdGFydENvbHVtbiA9PT0gYi5zdGFydENvbHVtbiAmJlxuICAgICAgICAgICAgYS5lbmRMaW5lTnVtYmVyID09PSBiLmVuZExpbmVOdW1iZXIgJiZcbiAgICAgICAgICAgIGEuZW5kQ29sdW1uID09PSBiLmVuZENvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgZW5kIHBvc2l0aW9uICh3aGljaCB3aWxsIGJlIGFmdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydCBwb3NpdGlvbilcbiAgICAgKi9cbiAgICBnZXRFbmRQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlLmdldEVuZFBvc2l0aW9uKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiAod2hpY2ggd2lsbCBiZSBhZnRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQgcG9zaXRpb24pXG4gICAgICovXG4gICAgc3RhdGljIGdldEVuZFBvc2l0aW9uKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24ocmFuZ2UuZW5kTGluZU51bWJlciwgcmFuZ2UuZW5kQ29sdW1uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiAod2hpY2ggd2lsbCBiZSBiZWZvcmUgb3IgZXF1YWwgdG8gdGhlIGVuZCBwb3NpdGlvbilcbiAgICAgKi9cbiAgICBnZXRTdGFydFBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbih0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiAod2hpY2ggd2lsbCBiZSBiZWZvcmUgb3IgZXF1YWwgdG8gdGhlIGVuZCBwb3NpdGlvbilcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0U3RhcnRQb3NpdGlvbihyYW5nZSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gdG8gYSB1c2VyIHByZXNlbnRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuICdbJyArIHRoaXMuc3RhcnRMaW5lTnVtYmVyICsgJywnICsgdGhpcy5zdGFydENvbHVtbiArICcgLT4gJyArIHRoaXMuZW5kTGluZU51bWJlciArICcsJyArIHRoaXMuZW5kQ29sdW1uICsgJ10nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgcmFuZ2UgdXNpbmcgdGhpcyByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLCBhbmQgdXNpbmcgZW5kTGluZU51bWJlciBhbmQgZW5kQ29sdW1uIGFzIHRoZSBlbmQgcG9zaXRpb24uXG4gICAgICovXG4gICAgc2V0RW5kUG9zaXRpb24oZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydExpbmVOdW1iZXIsIHRoaXMuc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyByYW5nZSB1c2luZyB0aGlzIHJhbmdlJ3MgZW5kIHBvc2l0aW9uLCBhbmQgdXNpbmcgc3RhcnRMaW5lTnVtYmVyIGFuZCBzdGFydENvbHVtbiBhcyB0aGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICovXG4gICAgc2V0U3RhcnRQb3NpdGlvbihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbiwgdGhpcy5lbmRMaW5lTnVtYmVyLCB0aGlzLmVuZENvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBlbXB0eSByYW5nZSB1c2luZyB0aGlzIHJhbmdlJ3Mgc3RhcnQgcG9zaXRpb24uXG4gICAgICovXG4gICAgY29sbGFwc2VUb1N0YXJ0KCkge1xuICAgICAgICByZXR1cm4gUmFuZ2UuY29sbGFwc2VUb1N0YXJ0KHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgZW1wdHkgcmFuZ2UgdXNpbmcgdGhpcyByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjb2xsYXBzZVRvU3RhcnQocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5zdGFydExpbmVOdW1iZXIsIHJhbmdlLnN0YXJ0Q29sdW1uLCByYW5nZS5zdGFydExpbmVOdW1iZXIsIHJhbmdlLnN0YXJ0Q29sdW1uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGVtcHR5IHJhbmdlIHVzaW5nIHRoaXMgcmFuZ2UncyBlbmQgcG9zaXRpb24uXG4gICAgICovXG4gICAgY29sbGFwc2VUb0VuZCgpIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlLmNvbGxhcHNlVG9FbmQodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBlbXB0eSByYW5nZSB1c2luZyB0aGlzIHJhbmdlJ3MgZW5kIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjb2xsYXBzZVRvRW5kKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UuZW5kTGluZU51bWJlciwgcmFuZ2UuZW5kQ29sdW1uLCByYW5nZS5lbmRMaW5lTnVtYmVyLCByYW5nZS5lbmRDb2x1bW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgcmFuZ2UgYnkgdGhlIGdpdmVuIGFtb3VudCBvZiBsaW5lcy5cbiAgICAgKi9cbiAgICBkZWx0YShsaW5lQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0TGluZU51bWJlciArIGxpbmVDb3VudCwgdGhpcy5zdGFydENvbHVtbiwgdGhpcy5lbmRMaW5lTnVtYmVyICsgbGluZUNvdW50LCB0aGlzLmVuZENvbHVtbik7XG4gICAgfVxuICAgIC8vIC0tLVxuICAgIHN0YXRpYyBmcm9tUG9zaXRpb25zKHN0YXJ0LCBlbmQgPSBzdGFydCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LmxpbmVOdW1iZXIsIHN0YXJ0LmNvbHVtbiwgZW5kLmxpbmVOdW1iZXIsIGVuZC5jb2x1bW4pO1xuICAgIH1cbiAgICBzdGF0aWMgbGlmdChyYW5nZSkge1xuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4sIHJhbmdlLmVuZExpbmVOdW1iZXIsIHJhbmdlLmVuZENvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgYG9iamAgaXMgYW4gYElSYW5nZWAuXG4gICAgICovXG4gICAgc3RhdGljIGlzSVJhbmdlKG9iaikge1xuICAgICAgICByZXR1cm4gKG9ialxuICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouc3RhcnRMaW5lTnVtYmVyID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICYmICh0eXBlb2Ygb2JqLnN0YXJ0Q29sdW1uID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICYmICh0eXBlb2Ygb2JqLmVuZExpbmVOdW1iZXIgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouZW5kQ29sdW1uID09PSAnbnVtYmVyJykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSB0d28gcmFuZ2VzIGFyZSB0b3VjaGluZyBpbiBhbnkgd2F5LlxuICAgICAqL1xuICAgIHN0YXRpYyBhcmVJbnRlcnNlY3RpbmdPclRvdWNoaW5nKGEsIGIpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYGFgIGlzIGJlZm9yZSBgYmBcbiAgICAgICAgaWYgKGEuZW5kTGluZU51bWJlciA8IGIuc3RhcnRMaW5lTnVtYmVyIHx8IChhLmVuZExpbmVOdW1iZXIgPT09IGIuc3RhcnRMaW5lTnVtYmVyICYmIGEuZW5kQ29sdW1uIDwgYi5zdGFydENvbHVtbikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiBgYmAgaXMgYmVmb3JlIGBhYFxuICAgICAgICBpZiAoYi5lbmRMaW5lTnVtYmVyIDwgYS5zdGFydExpbmVOdW1iZXIgfHwgKGIuZW5kTGluZU51bWJlciA9PT0gYS5zdGFydExpbmVOdW1iZXIgJiYgYi5lbmRDb2x1bW4gPCBhLnN0YXJ0Q29sdW1uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZXNlIHJhbmdlcyBtdXN0IGludGVyc2VjdFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiB0aGUgdHdvIHJhbmdlcyBhcmUgaW50ZXJzZWN0aW5nLiBJZiB0aGUgcmFuZ2VzIGFyZSB0b3VjaGluZyBpdCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgc3RhdGljIGFyZUludGVyc2VjdGluZyhhLCBiKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGBhYCBpcyBiZWZvcmUgYGJgXG4gICAgICAgIGlmIChhLmVuZExpbmVOdW1iZXIgPCBiLnN0YXJ0TGluZU51bWJlciB8fCAoYS5lbmRMaW5lTnVtYmVyID09PSBiLnN0YXJ0TGluZU51bWJlciAmJiBhLmVuZENvbHVtbiA8PSBiLnN0YXJ0Q29sdW1uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIGBiYCBpcyBiZWZvcmUgYGFgXG4gICAgICAgIGlmIChiLmVuZExpbmVOdW1iZXIgPCBhLnN0YXJ0TGluZU51bWJlciB8fCAoYi5lbmRMaW5lTnVtYmVyID09PSBhLnN0YXJ0TGluZU51bWJlciAmJiBiLmVuZENvbHVtbiA8PSBhLnN0YXJ0Q29sdW1uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZXNlIHJhbmdlcyBtdXN0IGludGVyc2VjdFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHJhbmdlcywgdXNlZnVsIGZvciBzb3J0aW5nIHJhbmdlc1xuICAgICAqIEl0IHdpbGwgZmlyc3QgY29tcGFyZSByYW5nZXMgb24gdGhlIHN0YXJ0UG9zaXRpb24gYW5kIHRoZW4gb24gdGhlIGVuZFBvc2l0aW9uXG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmVSYW5nZXNVc2luZ1N0YXJ0cyhhLCBiKSB7XG4gICAgICAgIGlmIChhICYmIGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFTdGFydExpbmVOdW1iZXIgPSBhLnN0YXJ0TGluZU51bWJlciB8IDA7XG4gICAgICAgICAgICBjb25zdCBiU3RhcnRMaW5lTnVtYmVyID0gYi5zdGFydExpbmVOdW1iZXIgfCAwO1xuICAgICAgICAgICAgaWYgKGFTdGFydExpbmVOdW1iZXIgPT09IGJTdGFydExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhU3RhcnRDb2x1bW4gPSBhLnN0YXJ0Q29sdW1uIHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBiU3RhcnRDb2x1bW4gPSBiLnN0YXJ0Q29sdW1uIHwgMDtcbiAgICAgICAgICAgICAgICBpZiAoYVN0YXJ0Q29sdW1uID09PSBiU3RhcnRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYUVuZExpbmVOdW1iZXIgPSBhLmVuZExpbmVOdW1iZXIgfCAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiRW5kTGluZU51bWJlciA9IGIuZW5kTGluZU51bWJlciB8IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhRW5kTGluZU51bWJlciA9PT0gYkVuZExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFFbmRDb2x1bW4gPSBhLmVuZENvbHVtbiB8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiRW5kQ29sdW1uID0gYi5lbmRDb2x1bW4gfCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFFbmRDb2x1bW4gLSBiRW5kQ29sdW1uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhRW5kTGluZU51bWJlciAtIGJFbmRMaW5lTnVtYmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYVN0YXJ0Q29sdW1uIC0gYlN0YXJ0Q29sdW1uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFTdGFydExpbmVOdW1iZXIgLSBiU3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFFeGlzdHMgPSAoYSA/IDEgOiAwKTtcbiAgICAgICAgY29uc3QgYkV4aXN0cyA9IChiID8gMSA6IDApO1xuICAgICAgICByZXR1cm4gYUV4aXN0cyAtIGJFeGlzdHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyByYW5nZXMsIHVzZWZ1bCBmb3Igc29ydGluZyByYW5nZXNcbiAgICAgKiBJdCB3aWxsIGZpcnN0IGNvbXBhcmUgcmFuZ2VzIG9uIHRoZSBlbmRQb3NpdGlvbiBhbmQgdGhlbiBvbiB0aGUgc3RhcnRQb3NpdGlvblxuICAgICAqL1xuICAgIHN0YXRpYyBjb21wYXJlUmFuZ2VzVXNpbmdFbmRzKGEsIGIpIHtcbiAgICAgICAgaWYgKGEuZW5kTGluZU51bWJlciA9PT0gYi5lbmRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAoYS5lbmRDb2x1bW4gPT09IGIuZW5kQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGEuc3RhcnRMaW5lTnVtYmVyID09PSBiLnN0YXJ0TGluZU51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5zdGFydENvbHVtbiAtIGIuc3RhcnRDb2x1bW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhLnN0YXJ0TGluZU51bWJlciAtIGIuc3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGEuZW5kQ29sdW1uIC0gYi5lbmRDb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGEuZW5kTGluZU51bWJlciAtIGIuZW5kTGluZU51bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiB0aGUgcmFuZ2Ugc3BhbnMgbXVsdGlwbGUgbGluZXMuXG4gICAgICovXG4gICAgc3RhdGljIHNwYW5zTXVsdGlwbGVMaW5lcyhyYW5nZSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UuZW5kTGluZU51bWJlciA+IHJhbmdlLnN0YXJ0TGluZU51bWJlcjtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBhbiBhcnJheS5cbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkuXG4gKiBAcGFyYW0gbiBXaGljaCBlbGVtZW50IGZyb20gdGhlIGVuZCAoZGVmYXVsdCBpcyB6ZXJvKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhaWwoYXJyYXksIG4gPSAwKSB7XG4gICAgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtICgxICsgbildO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRhaWwyKGFycikge1xuICAgIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YWlsIGNhbGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIFthcnIuc2xpY2UoMCwgYXJyLmxlbmd0aCAtIDEpLCBhcnJbYXJyLmxlbmd0aCAtIDFdXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMob25lLCBvdGhlciwgaXRlbUVxdWFscyA9IChhLCBiKSA9PiBhID09PSBiKSB7XG4gICAgaWYgKG9uZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghb25lIHx8ICFvdGhlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvbmUubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gb25lLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmICghaXRlbUVxdWFscyhvbmVbaV0sIG90aGVyW2ldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGVsZW1lbnQgYXQgYGluZGV4YCBieSByZXBsYWNpbmcgaXQgd2l0aCB0aGUgbGFzdCBlbGVtZW50LiBUaGlzIGlzIGZhc3RlciB0aGFuIGBzcGxpY2VgXG4gKiBidXQgY2hhbmdlcyB0aGUgb3JkZXIgb2YgdGhlIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGYXN0V2l0aG91dEtlZXBpbmdPcmRlcihhcnJheSwgaW5kZXgpIHtcbiAgICBjb25zdCBsYXN0ID0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICBpZiAoaW5kZXggPCBsYXN0KSB7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IGFycmF5W2xhc3RdO1xuICAgIH1cbiAgICBhcnJheS5wb3AoKTtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIGFsZ29yaXRobSBvdmVyIGEgc29ydGVkIGFycmF5LlxuICpcbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0ga2V5IFRoZSB2YWx1ZSB3ZSBzZWFyY2ggZm9yLlxuICogQHBhcmFtIGNvbXBhcmF0b3IgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHR3byBhcnJheSBlbGVtZW50cyBhbmQgcmV0dXJucyB6ZXJvXG4gKiAgIGlmIHRoZXkgYXJlIGVxdWFsLCBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVjZWRlcyB0aGVcbiAqICAgc2Vjb25kIG9uZSBpbiB0aGUgc29ydGluZyBvcmRlciwgb3IgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIHNlY29uZCBlbGVtZW50XG4gKiAgIHByZWNlZGVzIHRoZSBmaXJzdCBvbmUuXG4gKiBAcmV0dXJuIFNlZSB7QGxpbmsgYmluYXJ5U2VhcmNoMn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVNlYXJjaChhcnJheSwga2V5LCBjb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIGJpbmFyeVNlYXJjaDIoYXJyYXkubGVuZ3RoLCBpID0+IGNvbXBhcmF0b3IoYXJyYXlbaV0sIGtleSkpO1xufVxuLyoqXG4gKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYWxnb3JpdGhtIG92ZXIgYSBzb3J0ZWQgY29sbGVjdGlvbi4gVXNlZnVsIGZvciBjYXNlc1xuICogd2hlbiB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIG92ZXIgc29tZXRoaW5nIHRoYXQgaXNuJ3QgYWN0dWFsbHkgYW5cbiAqIGFycmF5LCBhbmQgY29udmVydGluZyBkYXRhIHRvIGFuIGFycmF5IHdvdWxkIGRlZmVhdCB0aGUgdXNlIG9mIGJpbmFyeSBzZWFyY2hcbiAqIGluIHRoZSBmaXJzdCBwbGFjZS5cbiAqXG4gKiBAcGFyYW0gbGVuZ3RoIFRoZSBjb2xsZWN0aW9uIGxlbmd0aC5cbiAqIEBwYXJhbSBjb21wYXJlVG9LZXkgQSBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGluZGV4IG9mIGFuIGVsZW1lbnQgaW4gdGhlXG4gKiAgIGNvbGxlY3Rpb24gYW5kIHJldHVybnMgemVybyBpZiB0aGUgdmFsdWUgYXQgdGhpcyBpbmRleCBpcyBlcXVhbCB0byB0aGVcbiAqICAgc2VhcmNoIGtleSwgYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIHZhbHVlIHByZWNlZGVzIHRoZSBzZWFyY2gga2V5IGluIHRoZVxuICogICBzb3J0aW5nIG9yZGVyLCBvciBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgc2VhcmNoIGtleSBwcmVjZWRlcyB0aGUgdmFsdWUuXG4gKiBAcmV0dXJuIEEgbm9uLW5lZ2F0aXZlIGluZGV4IG9mIGFuIGVsZW1lbnQsIGlmIGZvdW5kLiBJZiBub3QgZm91bmQsIHRoZVxuICogICByZXN1bHQgaXMgLShuKzEpIChvciB+biwgdXNpbmcgYml0d2lzZSBub3RhdGlvbiksIHdoZXJlIG4gaXMgdGhlIGluZGV4XG4gKiAgIHdoZXJlIHRoZSBrZXkgc2hvdWxkIGJlIGluc2VydGVkIHRvIG1haW50YWluIHRoZSBzb3J0aW5nIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5U2VhcmNoMihsZW5ndGgsIGNvbXBhcmVUb0tleSkge1xuICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICAgICAgY29uc3QgbWlkID0gKChsb3cgKyBoaWdoKSAvIDIpIHwgMDtcbiAgICAgICAgY29uc3QgY29tcCA9IGNvbXBhcmVUb0tleShtaWQpO1xuICAgICAgICBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29tcCA+IDApIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1pZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLShsb3cgKyAxKTtcbn1cbi8qKlxuICogVGFrZXMgYSBzb3J0ZWQgYXJyYXkgYW5kIGEgZnVuY3Rpb24gcC4gVGhlIGFycmF5IGlzIHNvcnRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgYWxsIGVsZW1lbnRzIHdoZXJlIHAoeCkgaXMgZmFsc2VcbiAqIGFyZSBsb2NhdGVkIGJlZm9yZSBhbGwgZWxlbWVudHMgd2hlcmUgcCh4KSBpcyB0cnVlLlxuICogQHJldHVybnMgdGhlIGxlYXN0IHggZm9yIHdoaWNoIHAoeCkgaXMgdHJ1ZSBvciBhcnJheS5sZW5ndGggaWYgbm8gZWxlbWVudCBmdWxsZmlsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEZpcnN0SW5Tb3J0ZWQoYXJyYXksIHApIHtcbiAgICBsZXQgbG93ID0gMCwgaGlnaCA9IGFycmF5Lmxlbmd0aDtcbiAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDsgLy8gbm8gY2hpbGRyZW5cbiAgICB9XG4gICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgY29uc3QgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgaWYgKHAoYXJyYXlbbWlkXSkpIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG59XG5leHBvcnQgZnVuY3Rpb24gcXVpY2tTZWxlY3QobnRoLCBkYXRhLCBjb21wYXJlKSB7XG4gICAgbnRoID0gbnRoIHwgMDtcbiAgICBpZiAobnRoID49IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgaW5kZXgnKTtcbiAgICB9XG4gICAgY29uc3QgcGl2b3RWYWx1ZSA9IGRhdGFbTWF0aC5mbG9vcihkYXRhLmxlbmd0aCAqIE1hdGgucmFuZG9tKCkpXTtcbiAgICBjb25zdCBsb3dlciA9IFtdO1xuICAgIGNvbnN0IGhpZ2hlciA9IFtdO1xuICAgIGNvbnN0IHBpdm90cyA9IFtdO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZGF0YSkge1xuICAgICAgICBjb25zdCB2YWwgPSBjb21wYXJlKHZhbHVlLCBwaXZvdFZhbHVlKTtcbiAgICAgICAgaWYgKHZhbCA8IDApIHtcbiAgICAgICAgICAgIGxvd2VyLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbCA+IDApIHtcbiAgICAgICAgICAgIGhpZ2hlci5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBpdm90cy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobnRoIDwgbG93ZXIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBxdWlja1NlbGVjdChudGgsIGxvd2VyLCBjb21wYXJlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobnRoIDwgbG93ZXIubGVuZ3RoICsgcGl2b3RzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcGl2b3RzWzBdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1aWNrU2VsZWN0KG50aCAtIChsb3dlci5sZW5ndGggKyBwaXZvdHMubGVuZ3RoKSwgaGlnaGVyLCBjb21wYXJlKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeShkYXRhLCBjb21wYXJlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGN1cnJlbnRHcm91cCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZGF0YS5zbGljZSgwKS5zb3J0KGNvbXBhcmUpKSB7XG4gICAgICAgIGlmICghY3VycmVudEdyb3VwIHx8IGNvbXBhcmUoY3VycmVudEdyb3VwWzBdLCBlbGVtZW50KSAhPT0gMCkge1xuICAgICAgICAgICAgY3VycmVudEdyb3VwID0gW2VsZW1lbnRdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VycmVudEdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRHcm91cC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEByZXR1cm5zIE5ldyBhcnJheSB3aXRoIGFsbCBmYWxzeSB2YWx1ZXMgcmVtb3ZlZC4gVGhlIG9yaWdpbmFsIGFycmF5IElTIE5PVCBtb2RpZmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvYWxlc2NlKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LmZpbHRlcihlID0+ICEhZSk7XG59XG4vKipcbiAqIFJlbW92ZSBhbGwgZmFsc3kgdmFsdWVzIGZyb20gYGFycmF5YC4gVGhlIG9yaWdpbmFsIGFycmF5IElTIG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29hbGVzY2VJblBsYWNlKGFycmF5KSB7XG4gICAgbGV0IHRvID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghIWFycmF5W2ldKSB7XG4gICAgICAgICAgICBhcnJheVt0b10gPSBhcnJheVtpXTtcbiAgICAgICAgICAgIHRvICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXJyYXkubGVuZ3RoID0gdG87XG59XG4vKipcbiAqIEByZXR1cm5zIGZhbHNlIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXkgYW5kIG5vdCBlbXB0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmFsc3lPckVtcHR5KG9iaikge1xuICAgIHJldHVybiAhQXJyYXkuaXNBcnJheShvYmopIHx8IG9iai5sZW5ndGggPT09IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb25FbXB0eUFycmF5KG9iaikge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA+IDA7XG59XG4vKipcbiAqIFJlbW92ZXMgZHVwbGljYXRlcyBmcm9tIHRoZSBnaXZlbiBhcnJheS4gVGhlIG9wdGlvbmFsIGtleUZuIGFsbG93cyB0byBzcGVjaWZ5XG4gKiBob3cgZWxlbWVudHMgYXJlIGNoZWNrZWQgZm9yIGVxdWFsaXR5IGJ5IHJldHVybmluZyBhbiBhbHRlcm5hdGUgdmFsdWUgZm9yIGVhY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdChhcnJheSwga2V5Rm4gPSB2YWx1ZSA9PiB2YWx1ZSkge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgcmV0dXJuIGFycmF5LmZpbHRlcihlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5Rm4oZWxlbWVudCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3QoYXJyLCBwcmVkaWNhdGUpIHtcbiAgICBjb25zdCBpZHggPSBsYXN0SW5kZXgoYXJyLCBwcmVkaWNhdGUpO1xuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhcnJbaWR4XTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsYXN0SW5kZXgoYXJyYXksIGZuKSB7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpXTtcbiAgICAgICAgaWYgKGZuKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RPckRlZmF1bHQoYXJyYXksIG5vdEZvdW5kVmFsdWUpIHtcbiAgICByZXR1cm4gYXJyYXkubGVuZ3RoID4gMCA/IGFycmF5WzBdIDogbm90Rm91bmRWYWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByYW5nZShhcmcsIHRvKSB7XG4gICAgbGV0IGZyb20gPSB0eXBlb2YgdG8gPT09ICdudW1iZXInID8gYXJnIDogMDtcbiAgICBpZiAodHlwZW9mIHRvID09PSAnbnVtYmVyJykge1xuICAgICAgICBmcm9tID0gYXJnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgIHRvID0gYXJnO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBpZiAoZnJvbSA8PSB0bykge1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA+IHRvOyBpLS0pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEluc2VydCBgaW5zZXJ0QXJyYCBpbnNpZGUgYHRhcmdldGAgYXQgYGluc2VydEluZGV4YC5cbiAqIFBsZWFzZSBkb24ndCB0b3VjaCB1bmxlc3MgeW91IHVuZGVyc3RhbmQgaHR0cHM6Ly9qc3BlcmYuY29tL2luc2VydGluZy1hbi1hcnJheS13aXRoaW4tYW4tYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5SW5zZXJ0KHRhcmdldCwgaW5zZXJ0SW5kZXgsIGluc2VydEFycikge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRhcmdldC5zbGljZSgwLCBpbnNlcnRJbmRleCk7XG4gICAgY29uc3QgYWZ0ZXIgPSB0YXJnZXQuc2xpY2UoaW5zZXJ0SW5kZXgpO1xuICAgIHJldHVybiBiZWZvcmUuY29uY2F0KGluc2VydEFyciwgYWZ0ZXIpO1xufVxuLyoqXG4gKiBQdXNoZXMgYW4gZWxlbWVudCB0byB0aGUgc3RhcnQgb2YgdGhlIGFycmF5LCBpZiBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1c2hUb1N0YXJ0KGFyciwgdmFsdWUpIHtcbiAgICBjb25zdCBpbmRleCA9IGFyci5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgYXJyLnVuc2hpZnQodmFsdWUpO1xuICAgIH1cbn1cbi8qKlxuICogUHVzaGVzIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXksIGlmIGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVzaFRvRW5kKGFyciwgdmFsdWUpIHtcbiAgICBjb25zdCBpbmRleCA9IGFyci5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgYXJyLnB1c2godmFsdWUpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwdXNoTWFueShhcnIsIGl0ZW1zKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGFyci5wdXNoKGl0ZW0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5KHgpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh4KSA/IHggOiBbeF07XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IG1hcHBlZCB2YWx1ZSBvZiB0aGUgYXJyYXkgd2hpY2ggaXMgbm90IHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEZpbmQoYXJyYXksIG1hcEZuKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheSkge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSBtYXBGbih2YWx1ZSk7XG4gICAgICAgIGlmIChtYXBwZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBJbnNlcnQgdGhlIG5ldyBpdGVtcyBpbiB0aGUgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgVGhlIG9yaWdpbmFsIGFycmF5LlxuICogQHBhcmFtIHN0YXJ0IFRoZSB6ZXJvLWJhc2VkIGxvY2F0aW9uIGluIHRoZSBhcnJheSBmcm9tIHdoaWNoIHRvIHN0YXJ0IGluc2VydGluZyBlbGVtZW50cy5cbiAqIEBwYXJhbSBuZXdJdGVtcyBUaGUgaXRlbXMgdG8gYmUgaW5zZXJ0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEludG8oYXJyYXksIHN0YXJ0LCBuZXdJdGVtcykge1xuICAgIGNvbnN0IHN0YXJ0SWR4ID0gZ2V0QWN0dWFsU3RhcnRJbmRleChhcnJheSwgc3RhcnQpO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IG5ld0l0ZW1zTGVuZ3RoID0gbmV3SXRlbXMubGVuZ3RoO1xuICAgIGFycmF5Lmxlbmd0aCA9IG9yaWdpbmFsTGVuZ3RoICsgbmV3SXRlbXNMZW5ndGg7XG4gICAgLy8gTW92ZSB0aGUgaXRlbXMgYWZ0ZXIgdGhlIHN0YXJ0IGluZGV4LCBzdGFydCBmcm9tIHRoZSBlbmQgc28gdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgYW55IHZhbHVlLlxuICAgIGZvciAobGV0IGkgPSBvcmlnaW5hbExlbmd0aCAtIDE7IGkgPj0gc3RhcnRJZHg7IGktLSkge1xuICAgICAgICBhcnJheVtpICsgbmV3SXRlbXNMZW5ndGhdID0gYXJyYXlbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3SXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJheVtpICsgc3RhcnRJZHhdID0gbmV3SXRlbXNbaV07XG4gICAgfVxufVxuLyoqXG4gKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYW5kIGluc2VydHMgbmV3IGVsZW1lbnRzIGluIHRoZWlyIHBsYWNlLCByZXR1cm5pbmcgdGhlIGRlbGV0ZWQgZWxlbWVudHMuIEFsdGVybmF0aXZlIHRvIHRoZSBuYXRpdmUgQXJyYXkuc3BsaWNlIG1ldGhvZCwgaXRcbiAqIGNhbiBvbmx5IHN1cHBvcnQgbGltaXRlZCBudW1iZXIgb2YgaXRlbXMgZHVlIHRvIHRoZSBtYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBsaW1pdC5cbiAqIEBwYXJhbSBhcnJheSBUaGUgb3JpZ2luYWwgYXJyYXkuXG4gKiBAcGFyYW0gc3RhcnQgVGhlIHplcm8tYmFzZWQgbG9jYXRpb24gaW4gdGhlIGFycmF5IGZyb20gd2hpY2ggdG8gc3RhcnQgcmVtb3ZpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZGVsZXRlQ291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGljZShhcnJheSwgc3RhcnQsIGRlbGV0ZUNvdW50LCBuZXdJdGVtcykge1xuICAgIGNvbnN0IGluZGV4ID0gZ2V0QWN0dWFsU3RhcnRJbmRleChhcnJheSwgc3RhcnQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGFycmF5LnNwbGljZShpbmRleCwgZGVsZXRlQ291bnQpO1xuICAgIGluc2VydEludG8oYXJyYXksIGluZGV4LCBuZXdJdGVtcyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSBhY3R1YWwgc3RhcnQgaW5kZXggKHNhbWUgbG9naWMgYXMgdGhlIG5hdGl2ZSBzcGxpY2UoKSBvciBzbGljZSgpKVxuICogSWYgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LCBzdGFydCB3aWxsIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4gSW4gdGhpcyBjYXNlLCBubyBlbGVtZW50IHdpbGwgYmUgZGVsZXRlZCBidXQgdGhlIG1ldGhvZCB3aWxsIGJlaGF2ZSBhcyBhbiBhZGRpbmcgZnVuY3Rpb24sIGFkZGluZyBhcyBtYW55IGVsZW1lbnQgYXMgaXRlbVtuKl0gcHJvdmlkZWQuXG4gKiBJZiBuZWdhdGl2ZSwgaXQgd2lsbCBiZWdpbiB0aGF0IG1hbnkgZWxlbWVudHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBhcnJheS4gKEluIHRoaXMgY2FzZSwgdGhlIG9yaWdpbiAtMSwgbWVhbmluZyAtbiBpcyB0aGUgaW5kZXggb2YgdGhlIG50aCBsYXN0IGVsZW1lbnQsIGFuZCBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudCB0byB0aGUgaW5kZXggb2YgYXJyYXkubGVuZ3RoIC0gbi4pIElmIGFycmF5Lmxlbmd0aCArIHN0YXJ0IGlzIGxlc3MgdGhhbiAwLCBpdCB3aWxsIGJlZ2luIGZyb20gaW5kZXggMC5cbiAqIEBwYXJhbSBhcnJheSBUaGUgdGFyZ2V0IGFycmF5LlxuICogQHBhcmFtIHN0YXJ0IFRoZSBvcGVyYXRpb24gaW5kZXguXG4gKi9cbmZ1bmN0aW9uIGdldEFjdHVhbFN0YXJ0SW5kZXgoYXJyYXksIHN0YXJ0KSB7XG4gICAgcmV0dXJuIHN0YXJ0IDwgMCA/IE1hdGgubWF4KHN0YXJ0ICsgYXJyYXkubGVuZ3RoLCAwKSA6IE1hdGgubWluKHN0YXJ0LCBhcnJheS5sZW5ndGgpO1xufVxuZXhwb3J0IHZhciBDb21wYXJlUmVzdWx0O1xuKGZ1bmN0aW9uIChDb21wYXJlUmVzdWx0KSB7XG4gICAgZnVuY3Rpb24gaXNMZXNzVGhhbihyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA8IDA7XG4gICAgfVxuICAgIENvbXBhcmVSZXN1bHQuaXNMZXNzVGhhbiA9IGlzTGVzc1RoYW47XG4gICAgZnVuY3Rpb24gaXNHcmVhdGVyVGhhbihyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA+IDA7XG4gICAgfVxuICAgIENvbXBhcmVSZXN1bHQuaXNHcmVhdGVyVGhhbiA9IGlzR3JlYXRlclRoYW47XG4gICAgZnVuY3Rpb24gaXNOZWl0aGVyTGVzc09yR3JlYXRlclRoYW4ocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IDA7XG4gICAgfVxuICAgIENvbXBhcmVSZXN1bHQuaXNOZWl0aGVyTGVzc09yR3JlYXRlclRoYW4gPSBpc05laXRoZXJMZXNzT3JHcmVhdGVyVGhhbjtcbiAgICBDb21wYXJlUmVzdWx0LmdyZWF0ZXJUaGFuID0gMTtcbiAgICBDb21wYXJlUmVzdWx0Lmxlc3NUaGFuID0gLTE7XG4gICAgQ29tcGFyZVJlc3VsdC5uZWl0aGVyTGVzc09yR3JlYXRlclRoYW4gPSAwO1xufSkoQ29tcGFyZVJlc3VsdCB8fCAoQ29tcGFyZVJlc3VsdCA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZUJ5KHNlbGVjdG9yLCBjb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIChhLCBiKSA9PiBjb21wYXJhdG9yKHNlbGVjdG9yKGEpLCBzZWxlY3RvcihiKSk7XG59XG4vKipcbiAqIFRoZSBuYXR1cmFsIG9yZGVyIG9uIG51bWJlcnMuXG4qL1xuZXhwb3J0IGNvbnN0IG51bWJlckNvbXBhcmF0b3IgPSAoYSwgYikgPT4gYSAtIGI7XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gdGhhdCBpcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gZXZlcnkgb3RoZXIgaXRlbS5cbiovXG5leHBvcnQgZnVuY3Rpb24gZmluZE1heEJ5KGl0ZW1zLCBjb21wYXJhdG9yKSB7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgbWF4ID0gaXRlbXNbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGlmIChjb21wYXJhdG9yKGl0ZW0sIG1heCkgPiAwKSB7XG4gICAgICAgICAgICBtYXggPSBpdGVtO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXg7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGxhc3QgaXRlbSB0aGF0IGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiBldmVyeSBvdGhlciBpdGVtLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdE1heEJ5KGl0ZW1zLCBjb21wYXJhdG9yKSB7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgbWF4ID0gaXRlbXNbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGlmIChjb21wYXJhdG9yKGl0ZW0sIG1heCkgPj0gMCkge1xuICAgICAgICAgICAgbWF4ID0gaXRlbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF4O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBpdGVtIHRoYXQgaXMgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIGV2ZXJ5IG90aGVyIGl0ZW0uXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNaW5CeShpdGVtcywgY29tcGFyYXRvcikge1xuICAgIHJldHVybiBmaW5kTWF4QnkoaXRlbXMsIChhLCBiKSA9PiAtY29tcGFyYXRvcihhLCBiKSk7XG59XG5leHBvcnQgY2xhc3MgQXJyYXlRdWV1ZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIHF1ZXVlIHRoYXQgaXMgYmFja2VkIGJ5IHRoZSBnaXZlbiBhcnJheS4gUnVudGltZSBpcyBPKDEpLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoaXRlbXMpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICB0aGlzLmZpcnN0SWR4ID0gMDtcbiAgICAgICAgdGhpcy5sYXN0SWR4ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0SWR4IC0gdGhpcy5maXJzdElkeCArIDE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN1bWVzIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUgYXMgbG9uZyBhcyB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS5cbiAgICAgKiBJZiBubyBlbGVtZW50cyB3ZXJlIGNvbnN1bWVkLCBgbnVsbGAgaXMgcmV0dXJuZWQuIEhhcyBhIHJ1bnRpbWUgb2YgTyhyZXN1bHQubGVuZ3RoKS5cbiAgICAqL1xuICAgIHRha2VXaGlsZShwcmVkaWNhdGUpIHtcbiAgICAgICAgLy8gUChrKSA6PSBrIDw9IHRoaXMubGFzdElkeCAmJiBwcmVkaWNhdGUodGhpcy5pdGVtc1trXSlcbiAgICAgICAgLy8gRmluZCBzIDo9IG1pbiB7IGsgfCBrID49IHRoaXMuZmlyc3RJZHggJiYgIVAoaykgfSBhbmQgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLmZpcnN0SWR4Li4ucylcbiAgICAgICAgbGV0IHN0YXJ0SWR4ID0gdGhpcy5maXJzdElkeDtcbiAgICAgICAgd2hpbGUgKHN0YXJ0SWR4IDwgdGhpcy5pdGVtcy5sZW5ndGggJiYgcHJlZGljYXRlKHRoaXMuaXRlbXNbc3RhcnRJZHhdKSkge1xuICAgICAgICAgICAgc3RhcnRJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBzdGFydElkeCA9PT0gdGhpcy5maXJzdElkeCA/IG51bGwgOiB0aGlzLml0ZW1zLnNsaWNlKHRoaXMuZmlyc3RJZHgsIHN0YXJ0SWR4KTtcbiAgICAgICAgdGhpcy5maXJzdElkeCA9IHN0YXJ0SWR4O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdW1lcyBlbGVtZW50cyBmcm9tIHRoZSBlbmQgb2YgdGhlIHF1ZXVlIGFzIGxvbmcgYXMgdGhlIHByZWRpY2F0ZSByZXR1cm5zIHRydWUuXG4gICAgICogSWYgbm8gZWxlbWVudHMgd2VyZSBjb25zdW1lZCwgYG51bGxgIGlzIHJldHVybmVkLlxuICAgICAqIFRoZSByZXN1bHQgaGFzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1bmRlcmx5aW5nIGFycmF5IVxuICAgICovXG4gICAgdGFrZUZyb21FbmRXaGlsZShwcmVkaWNhdGUpIHtcbiAgICAgICAgLy8gUChrKSA6PSB0aGlzLmZpcnN0SWR4ID49IGsgJiYgcHJlZGljYXRlKHRoaXMuaXRlbXNba10pXG4gICAgICAgIC8vIEZpbmQgcyA6PSBtYXggeyBrIHwgayA8PSB0aGlzLmxhc3RJZHggJiYgIVAoaykgfSBhbmQgcmV0dXJuIHRoaXMuZGF0YShzLi4udGhpcy5sYXN0SWR4XVxuICAgICAgICBsZXQgZW5kSWR4ID0gdGhpcy5sYXN0SWR4O1xuICAgICAgICB3aGlsZSAoZW5kSWR4ID49IDAgJiYgcHJlZGljYXRlKHRoaXMuaXRlbXNbZW5kSWR4XSkpIHtcbiAgICAgICAgICAgIGVuZElkeC0tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuZElkeCA9PT0gdGhpcy5sYXN0SWR4ID8gbnVsbCA6IHRoaXMuaXRlbXMuc2xpY2UoZW5kSWR4ICsgMSwgdGhpcy5sYXN0SWR4ICsgMSk7XG4gICAgICAgIHRoaXMubGFzdElkeCA9IGVuZElkeDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcGVlaygpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zW3RoaXMuZmlyc3RJZHhdO1xuICAgIH1cbiAgICBkZXF1ZXVlKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLml0ZW1zW3RoaXMuZmlyc3RJZHhdO1xuICAgICAgICB0aGlzLmZpcnN0SWR4Kys7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRha2VDb3VudChjb3VudCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLml0ZW1zLnNsaWNlKHRoaXMuZmlyc3RJZHgsIHRoaXMuZmlyc3RJZHggKyBjb3VudCk7XG4gICAgICAgIHRoaXMuZmlyc3RJZHggKz0gY291bnQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIGZhc3RlciB0aGFuIGFuIGl0ZXJhdG9yIGFuZCBhcnJheSBmb3IgbGF6eSBjb21wdXRlZCBkYXRhLlxuKi9cbmV4cG9ydCBjbGFzcyBDYWxsYmFja0l0ZXJhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgY2FsbGJhY2sgZm9yIGV2ZXJ5IGl0ZW0uXG4gICAgICogU3RvcHMgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBmYWxzZS5cbiAgICAqL1xuICAgIGl0ZXJhdGUpIHtcbiAgICAgICAgdGhpcy5pdGVyYXRlID0gaXRlcmF0ZTtcbiAgICB9XG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHRoaXMuaXRlcmF0ZShpdGVtID0+IHsgcmVzdWx0LnB1c2goaXRlbSk7IHJldHVybiB0cnVlOyB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmlsdGVyKHByZWRpY2F0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrSXRlcmFibGUoY2IgPT4gdGhpcy5pdGVyYXRlKGl0ZW0gPT4gcHJlZGljYXRlKGl0ZW0pID8gY2IoaXRlbSkgOiB0cnVlKSk7XG4gICAgfVxuICAgIG1hcChtYXBGbikge1xuICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrSXRlcmFibGUoY2IgPT4gdGhpcy5pdGVyYXRlKGl0ZW0gPT4gY2IobWFwRm4oaXRlbSkpKSk7XG4gICAgfVxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZSkge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB0aGlzLml0ZXJhdGUoaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmluZExhc3RNYXhCeShjb21wYXJhdG9yKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIHRoaXMuaXRlcmF0ZShpdGVtID0+IHtcbiAgICAgICAgICAgIGlmIChmaXJzdCB8fCBDb21wYXJlUmVzdWx0LmlzR3JlYXRlclRoYW4oY29tcGFyYXRvcihpdGVtLCByZXN1bHQpKSkge1xuICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5DYWxsYmFja0l0ZXJhYmxlLmVtcHR5ID0gbmV3IENhbGxiYWNrSXRlcmFibGUoX2NhbGxiYWNrID0+IHsgfSk7XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VpbnQ4KHYpIHtcbiAgICBpZiAodiA8IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICh2ID4gMjU1IC8qIENvbnN0YW50cy5NQVhfVUlOVF84ICovKSB7XG4gICAgICAgIHJldHVybiAyNTUgLyogQ29uc3RhbnRzLk1BWF9VSU5UXzggKi87XG4gICAgfVxuICAgIHJldHVybiB2IHwgMDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b1VpbnQzMih2KSB7XG4gICAgaWYgKHYgPCAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAodiA+IDQyOTQ5NjcyOTUgLyogQ29uc3RhbnRzLk1BWF9VSU5UXzMyICovKSB7XG4gICAgICAgIHJldHVybiA0Mjk0OTY3Mjk1IC8qIENvbnN0YW50cy5NQVhfVUlOVF8zMiAqLztcbiAgICB9XG4gICAgcmV0dXJuIHYgfCAwO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBhcnJheUluc2VydCB9IGZyb20gJy4uLy4uLy4uL2Jhc2UvY29tbW9uL2FycmF5cy5qcyc7XG5pbXBvcnQgeyB0b1VpbnQzMiB9IGZyb20gJy4uLy4uLy4uL2Jhc2UvY29tbW9uL3VpbnQuanMnO1xuZXhwb3J0IGNsYXNzIFByZWZpeFN1bUNvbXB1dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZXMpIHtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgIHRoaXMucHJlZml4U3VtID0gbmV3IFVpbnQzMkFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXggPSBuZXcgSW50MzJBcnJheSgxKTtcbiAgICAgICAgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdID0gLTE7XG4gICAgfVxuICAgIGluc2VydFZhbHVlcyhpbnNlcnRJbmRleCwgaW5zZXJ0VmFsdWVzKSB7XG4gICAgICAgIGluc2VydEluZGV4ID0gdG9VaW50MzIoaW5zZXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBvbGRWYWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICAgICAgY29uc3Qgb2xkUHJlZml4U3VtID0gdGhpcy5wcmVmaXhTdW07XG4gICAgICAgIGNvbnN0IGluc2VydFZhbHVlc0xlbiA9IGluc2VydFZhbHVlcy5sZW5ndGg7XG4gICAgICAgIGlmIChpbnNlcnRWYWx1ZXNMZW4gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlcyA9IG5ldyBVaW50MzJBcnJheShvbGRWYWx1ZXMubGVuZ3RoICsgaW5zZXJ0VmFsdWVzTGVuKTtcbiAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9sZFZhbHVlcy5zdWJhcnJheSgwLCBpbnNlcnRJbmRleCksIDApO1xuICAgICAgICB0aGlzLnZhbHVlcy5zZXQob2xkVmFsdWVzLnN1YmFycmF5KGluc2VydEluZGV4KSwgaW5zZXJ0SW5kZXggKyBpbnNlcnRWYWx1ZXNMZW4pO1xuICAgICAgICB0aGlzLnZhbHVlcy5zZXQoaW5zZXJ0VmFsdWVzLCBpbnNlcnRJbmRleCk7XG4gICAgICAgIGlmIChpbnNlcnRJbmRleCAtIDEgPCB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0pIHtcbiAgICAgICAgICAgIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSA9IGluc2VydEluZGV4IC0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZWZpeFN1bSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLnZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBpZiAodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdID49IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJlZml4U3VtLnNldChvbGRQcmVmaXhTdW0uc3ViYXJyYXkoMCwgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdICsgMSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgaW5kZXggPSB0b1VpbnQzMihpbmRleCk7XG4gICAgICAgIHZhbHVlID0gdG9VaW50MzIodmFsdWUpO1xuICAgICAgICBpZiAodGhpcy52YWx1ZXNbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICBpZiAoaW5kZXggLSAxIDwgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKSB7XG4gICAgICAgICAgICB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gPSBpbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJlbW92ZVZhbHVlcyhzdGFydEluZGV4LCBjb3VudCkge1xuICAgICAgICBzdGFydEluZGV4ID0gdG9VaW50MzIoc3RhcnRJbmRleCk7XG4gICAgICAgIGNvdW50ID0gdG9VaW50MzIoY291bnQpO1xuICAgICAgICBjb25zdCBvbGRWYWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICAgICAgY29uc3Qgb2xkUHJlZml4U3VtID0gdGhpcy5wcmVmaXhTdW07XG4gICAgICAgIGlmIChzdGFydEluZGV4ID49IG9sZFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXhDb3VudCA9IG9sZFZhbHVlcy5sZW5ndGggLSBzdGFydEluZGV4O1xuICAgICAgICBpZiAoY291bnQgPj0gbWF4Q291bnQpIHtcbiAgICAgICAgICAgIGNvdW50ID0gbWF4Q291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZXMgPSBuZXcgVWludDMyQXJyYXkob2xkVmFsdWVzLmxlbmd0aCAtIGNvdW50KTtcbiAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9sZFZhbHVlcy5zdWJhcnJheSgwLCBzdGFydEluZGV4KSwgMCk7XG4gICAgICAgIHRoaXMudmFsdWVzLnNldChvbGRWYWx1ZXMuc3ViYXJyYXkoc3RhcnRJbmRleCArIGNvdW50KSwgc3RhcnRJbmRleCk7XG4gICAgICAgIHRoaXMucHJlZml4U3VtID0gbmV3IFVpbnQzMkFycmF5KHRoaXMudmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGlmIChzdGFydEluZGV4IC0gMSA8IHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSkge1xuICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdID0gc3RhcnRJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZWZpeFN1bS5zZXQob2xkUHJlZml4U3VtLnN1YmFycmF5KDAsIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSArIDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0VG90YWxTdW0oKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQcmVmaXhTdW0odGhpcy52YWx1ZXMubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgZmlyc3QgYGluZGV4ICsgMWAgbWFueSBpdGVtcy5cbiAgICAgKiBAcmV0dXJucyBgU1VNKDAgPD0gaiA8PSBpbmRleCwgdmFsdWVzW2pdKWAuXG4gICAgICovXG4gICAgZ2V0UHJlZml4U3VtKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gdG9VaW50MzIoaW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UHJlZml4U3VtKGluZGV4KTtcbiAgICB9XG4gICAgX2dldFByZWZpeFN1bShpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPD0gdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXhTdW1baW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdICsgMTtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJlZml4U3VtWzBdID0gdGhpcy52YWx1ZXNbMF07XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnZhbHVlcy5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDw9IGluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMucHJlZml4U3VtW2ldID0gdGhpcy5wcmVmaXhTdW1baSAtIDFdICsgdGhpcy52YWx1ZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdID0gTWF0aC5tYXgodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdLCBpbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWZpeFN1bVtpbmRleF07XG4gICAgfVxuICAgIGdldEluZGV4T2Yoc3VtKSB7XG4gICAgICAgIHN1bSA9IE1hdGguZmxvb3Ioc3VtKTtcbiAgICAgICAgLy8gQ29tcHV0ZSBhbGwgc3VtcyAodG8gZ2V0IGEgZnVsbHkgdmFsaWQgcHJlZml4U3VtKVxuICAgICAgICB0aGlzLmdldFRvdGFsU3VtKCk7XG4gICAgICAgIGxldCBsb3cgPSAwO1xuICAgICAgICBsZXQgaGlnaCA9IHRoaXMudmFsdWVzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBtaWQgPSAwO1xuICAgICAgICBsZXQgbWlkU3RvcCA9IDA7XG4gICAgICAgIGxldCBtaWRTdGFydCA9IDA7XG4gICAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkge1xuICAgICAgICAgICAgbWlkID0gbG93ICsgKChoaWdoIC0gbG93KSAvIDIpIHwgMDtcbiAgICAgICAgICAgIG1pZFN0b3AgPSB0aGlzLnByZWZpeFN1bVttaWRdO1xuICAgICAgICAgICAgbWlkU3RhcnQgPSBtaWRTdG9wIC0gdGhpcy52YWx1ZXNbbWlkXTtcbiAgICAgICAgICAgIGlmIChzdW0gPCBtaWRTdGFydCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3VtID49IG1pZFN0b3ApIHtcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcmVmaXhTdW1JbmRleE9mUmVzdWx0KG1pZCwgc3VtIC0gbWlkU3RhcnQpO1xuICAgIH1cbn1cbi8qKlxuICoge0BsaW5rIGdldEluZGV4T2Z9IGhhcyBhbiBhbW9ydGl6ZWQgcnVudGltZSBjb21wbGV4aXR5IG9mIE8oMSkuXG4gKlxuICogKHtAbGluayBQcmVmaXhTdW1Db21wdXRlci5nZXRJbmRleE9mfSBpcyBqdXN0ICBPKGxvZyBuKSlcbiovXG5leHBvcnQgY2xhc3MgQ29uc3RhbnRUaW1lUHJlZml4U3VtQ29tcHV0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlcykge1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdmFsaWRFbmRJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLl9wcmVmaXhTdW0gPSBbXTtcbiAgICAgICAgdGhpcy5faW5kZXhCeVN1bSA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBTVU0oMCA8PSBqIDwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzW2pdKVxuICAgICAqL1xuICAgIGdldFRvdGFsU3VtKCkge1xuICAgICAgICB0aGlzLl9lbnN1cmVWYWxpZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXhCeVN1bS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgZmlyc3QgYGNvdW50YCBtYW55IGl0ZW1zLlxuICAgICAqIEByZXR1cm5zIGBTVU0oMCA8PSBqIDwgY291bnQsIHZhbHVlc1tqXSlgLlxuICAgICAqL1xuICAgIGdldFByZWZpeFN1bShjb3VudCkge1xuICAgICAgICB0aGlzLl9lbnN1cmVWYWxpZCgpO1xuICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVmaXhTdW1bY291bnQgLSAxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYHJlc3VsdGAsIHN1Y2ggdGhhdCBgZ2V0UHJlZml4U3VtKHJlc3VsdC5pbmRleCkgKyByZXN1bHQucmVtYWluZGVyID0gc3VtYFxuICAgICAqL1xuICAgIGdldEluZGV4T2Yoc3VtKSB7XG4gICAgICAgIHRoaXMuX2Vuc3VyZVZhbGlkKCk7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX2luZGV4QnlTdW1bc3VtXTtcbiAgICAgICAgY29uc3Qgdmlld0xpbmVzQWJvdmUgPSBpZHggPiAwID8gdGhpcy5fcHJlZml4U3VtW2lkeCAtIDFdIDogMDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcmVmaXhTdW1JbmRleE9mUmVzdWx0KGlkeCwgc3VtIC0gdmlld0xpbmVzQWJvdmUpO1xuICAgIH1cbiAgICByZW1vdmVWYWx1ZXMoc3RhcnQsIGRlbGV0ZUNvdW50KSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KTtcbiAgICAgICAgdGhpcy5faW52YWxpZGF0ZShzdGFydCk7XG4gICAgfVxuICAgIGluc2VydFZhbHVlcyhpbnNlcnRJbmRleCwgaW5zZXJ0QXJyKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5SW5zZXJ0KHRoaXMuX3ZhbHVlcywgaW5zZXJ0SW5kZXgsIGluc2VydEFycik7XG4gICAgICAgIHRoaXMuX2ludmFsaWRhdGUoaW5zZXJ0SW5kZXgpO1xuICAgIH1cbiAgICBfaW52YWxpZGF0ZShpbmRleCkge1xuICAgICAgICB0aGlzLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3ZhbGlkRW5kSW5kZXggPSBNYXRoLm1pbih0aGlzLl92YWxpZEVuZEluZGV4LCBpbmRleCAtIDEpO1xuICAgIH1cbiAgICBfZW5zdXJlVmFsaWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1ZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3ZhbGlkRW5kSW5kZXggKyAxLCBsZW4gPSB0aGlzLl92YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc3VtQWJvdmUgPSBpID4gMCA/IHRoaXMuX3ByZWZpeFN1bVtpIC0gMV0gOiAwO1xuICAgICAgICAgICAgdGhpcy5fcHJlZml4U3VtW2ldID0gc3VtQWJvdmUgKyB2YWx1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWU7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4QnlTdW1bc3VtQWJvdmUgKyBqXSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHJpbSB0aGluZ3NcbiAgICAgICAgdGhpcy5fcHJlZml4U3VtLmxlbmd0aCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX2luZGV4QnlTdW0ubGVuZ3RoID0gdGhpcy5fcHJlZml4U3VtW3RoaXMuX3ByZWZpeFN1bS5sZW5ndGggLSAxXTtcbiAgICAgICAgLy8gbWFyayBhcyB2YWxpZFxuICAgICAgICB0aGlzLl9pc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdmFsaWRFbmRJbmRleCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGggLSAxO1xuICAgIH1cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlc1tpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAvLyBubyBjaGFuZ2VcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2ludmFsaWRhdGUoaW5kZXgpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBQcmVmaXhTdW1JbmRleE9mUmVzdWx0IHtcbiAgICBjb25zdHJ1Y3RvcihpbmRleCwgcmVtYWluZGVyKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5yZW1haW5kZXIgPSByZW1haW5kZXI7XG4gICAgICAgIHRoaXMuX3ByZWZpeFN1bUluZGV4T2ZSZXN1bHRCcmFuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnJlbWFpbmRlciA9IHJlbWFpbmRlcjtcbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IHNwbGl0TGluZXMgfSBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi9zdHJpbmdzLmpzJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vY29yZS9wb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBQcmVmaXhTdW1Db21wdXRlciB9IGZyb20gJy4vcHJlZml4U3VtQ29tcHV0ZXIuanMnO1xuZXhwb3J0IGNsYXNzIE1pcnJvclRleHRNb2RlbCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBsaW5lcywgZW9sLCB2ZXJzaW9uSWQpIHtcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgICAgICB0aGlzLl9saW5lcyA9IGxpbmVzO1xuICAgICAgICB0aGlzLl9lb2wgPSBlb2w7XG4gICAgICAgIHRoaXMuX3ZlcnNpb25JZCA9IHZlcnNpb25JZDtcbiAgICAgICAgdGhpcy5fbGluZVN0YXJ0cyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NhY2hlZFRleHRWYWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2xpbmVzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbklkO1xuICAgIH1cbiAgICBnZXRUZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkVGV4dFZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRUZXh0VmFsdWUgPSB0aGlzLl9saW5lcy5qb2luKHRoaXMuX2VvbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFRleHRWYWx1ZTtcbiAgICB9XG4gICAgb25FdmVudHMoZSkge1xuICAgICAgICBpZiAoZS5lb2wgJiYgZS5lb2wgIT09IHRoaXMuX2VvbCkge1xuICAgICAgICAgICAgdGhpcy5fZW9sID0gZS5lb2w7XG4gICAgICAgICAgICB0aGlzLl9saW5lU3RhcnRzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgbXkgbGluZXNcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IGUuY2hhbmdlcztcbiAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5fYWNjZXB0RGVsZXRlUmFuZ2UoY2hhbmdlLnJhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuX2FjY2VwdEluc2VydFRleHQobmV3IFBvc2l0aW9uKGNoYW5nZS5yYW5nZS5zdGFydExpbmVOdW1iZXIsIGNoYW5nZS5yYW5nZS5zdGFydENvbHVtbiksIGNoYW5nZS50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92ZXJzaW9uSWQgPSBlLnZlcnNpb25JZDtcbiAgICAgICAgdGhpcy5fY2FjaGVkVGV4dFZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgX2Vuc3VyZUxpbmVTdGFydHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbGluZVN0YXJ0cykge1xuICAgICAgICAgICAgY29uc3QgZW9sTGVuZ3RoID0gdGhpcy5fZW9sLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzTGVuZ3RoID0gdGhpcy5fbGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbGluZVN0YXJ0VmFsdWVzID0gbmV3IFVpbnQzMkFycmF5KGxpbmVzTGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxpbmVTdGFydFZhbHVlc1tpXSA9IHRoaXMuX2xpbmVzW2ldLmxlbmd0aCArIGVvbExlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xpbmVTdGFydHMgPSBuZXcgUHJlZml4U3VtQ29tcHV0ZXIobGluZVN0YXJ0VmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGwgY2hhbmdlcyB0byBhIGxpbmUncyB0ZXh0IGdvIHRocm91Z2ggdGhpcyBtZXRob2RcbiAgICAgKi9cbiAgICBfc2V0TGluZVRleHQobGluZUluZGV4LCBuZXdWYWx1ZSkge1xuICAgICAgICB0aGlzLl9saW5lc1tsaW5lSW5kZXhdID0gbmV3VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9saW5lU3RhcnRzKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgcHJlZml4IHN1bVxuICAgICAgICAgICAgdGhpcy5fbGluZVN0YXJ0cy5zZXRWYWx1ZShsaW5lSW5kZXgsIHRoaXMuX2xpbmVzW2xpbmVJbmRleF0ubGVuZ3RoICsgdGhpcy5fZW9sLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2FjY2VwdERlbGV0ZVJhbmdlKHJhbmdlKSB7XG4gICAgICAgIGlmIChyYW5nZS5zdGFydExpbmVOdW1iZXIgPT09IHJhbmdlLmVuZExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydENvbHVtbiA9PT0gcmFuZ2UuZW5kQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkZWxldGVcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEZWxldGUgdGV4dCBvbiB0aGUgYWZmZWN0ZWQgbGluZVxuICAgICAgICAgICAgdGhpcy5fc2V0TGluZVRleHQocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMSwgdGhpcy5fbGluZXNbcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKDAsIHJhbmdlLnN0YXJ0Q29sdW1uIC0gMSlcbiAgICAgICAgICAgICAgICArIHRoaXMuX2xpbmVzW3JhbmdlLnN0YXJ0TGluZU51bWJlciAtIDFdLnN1YnN0cmluZyhyYW5nZS5lbmRDb2x1bW4gLSAxKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGFrZSByZW1haW5pbmcgdGV4dCBvbiBsYXN0IGxpbmUgYW5kIGFwcGVuZCBpdCB0byByZW1haW5pbmcgdGV4dCBvbiBmaXJzdCBsaW5lXG4gICAgICAgIHRoaXMuX3NldExpbmVUZXh0KHJhbmdlLnN0YXJ0TGluZU51bWJlciAtIDEsIHRoaXMuX2xpbmVzW3JhbmdlLnN0YXJ0TGluZU51bWJlciAtIDFdLnN1YnN0cmluZygwLCByYW5nZS5zdGFydENvbHVtbiAtIDEpXG4gICAgICAgICAgICArIHRoaXMuX2xpbmVzW3JhbmdlLmVuZExpbmVOdW1iZXIgLSAxXS5zdWJzdHJpbmcocmFuZ2UuZW5kQ29sdW1uIC0gMSkpO1xuICAgICAgICAvLyBEZWxldGUgbWlkZGxlIGxpbmVzXG4gICAgICAgIHRoaXMuX2xpbmVzLnNwbGljZShyYW5nZS5zdGFydExpbmVOdW1iZXIsIHJhbmdlLmVuZExpbmVOdW1iZXIgLSByYW5nZS5zdGFydExpbmVOdW1iZXIpO1xuICAgICAgICBpZiAodGhpcy5fbGluZVN0YXJ0cykge1xuICAgICAgICAgICAgLy8gdXBkYXRlIHByZWZpeCBzdW1cbiAgICAgICAgICAgIHRoaXMuX2xpbmVTdGFydHMucmVtb3ZlVmFsdWVzKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2UuZW5kTGluZU51bWJlciAtIHJhbmdlLnN0YXJ0TGluZU51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2FjY2VwdEluc2VydFRleHQocG9zaXRpb24sIGluc2VydFRleHQpIHtcbiAgICAgICAgaWYgKGluc2VydFRleHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGluc2VydFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluc2VydExpbmVzID0gc3BsaXRMaW5lcyhpbnNlcnRUZXh0KTtcbiAgICAgICAgaWYgKGluc2VydExpbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0aW5nIHRleHQgb24gb25lIGxpbmVcbiAgICAgICAgICAgIHRoaXMuX3NldExpbmVUZXh0KHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCB0aGlzLl9saW5lc1twb3NpdGlvbi5saW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbiAtIDEpXG4gICAgICAgICAgICAgICAgKyBpbnNlcnRMaW5lc1swXVxuICAgICAgICAgICAgICAgICsgdGhpcy5fbGluZXNbcG9zaXRpb24ubGluZU51bWJlciAtIDFdLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4gLSAxKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXBwZW5kIG92ZXJmbG93aW5nIHRleHQgZnJvbSBmaXJzdCBsaW5lIHRvIHRoZSBlbmQgb2YgdGV4dCB0byBpbnNlcnRcbiAgICAgICAgaW5zZXJ0TGluZXNbaW5zZXJ0TGluZXMubGVuZ3RoIC0gMV0gKz0gdGhpcy5fbGluZXNbcG9zaXRpb24ubGluZU51bWJlciAtIDFdLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4gLSAxKTtcbiAgICAgICAgLy8gRGVsZXRlIG92ZXJmbG93aW5nIHRleHQgZnJvbSBmaXJzdCBsaW5lIGFuZCBpbnNlcnQgdGV4dCBvbiBmaXJzdCBsaW5lXG4gICAgICAgIHRoaXMuX3NldExpbmVUZXh0KHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCB0aGlzLl9saW5lc1twb3NpdGlvbi5saW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbiAtIDEpXG4gICAgICAgICAgICArIGluc2VydExpbmVzWzBdKTtcbiAgICAgICAgLy8gSW5zZXJ0IG5ldyBsaW5lcyAmIHN0b3JlIGxlbmd0aHNcbiAgICAgICAgY29uc3QgbmV3TGVuZ3RocyA9IG5ldyBVaW50MzJBcnJheShpbnNlcnRMaW5lcy5sZW5ndGggLSAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbnNlcnRMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fbGluZXMuc3BsaWNlKHBvc2l0aW9uLmxpbmVOdW1iZXIgKyBpIC0gMSwgMCwgaW5zZXJ0TGluZXNbaV0pO1xuICAgICAgICAgICAgbmV3TGVuZ3Roc1tpIC0gMV0gPSBpbnNlcnRMaW5lc1tpXS5sZW5ndGggKyB0aGlzLl9lb2wubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9saW5lU3RhcnRzKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgcHJlZml4IHN1bVxuICAgICAgICAgICAgdGhpcy5fbGluZVN0YXJ0cy5pbnNlcnRWYWx1ZXMocG9zaXRpb24ubGluZU51bWJlciwgbmV3TGVuZ3Rocyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IEl0ZXJhYmxlIH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24vaXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgTGlua2VkTGlzdCB9IGZyb20gJy4uLy4uLy4uL2Jhc2UvY29tbW9uL2xpbmtlZExpc3QuanMnO1xuZXhwb3J0IGNvbnN0IFVTVUFMX1dPUkRfU0VQQVJBVE9SUyA9ICdgfiFAIyQlXiYqKCktPStbe119XFxcXHw7OlxcJ1wiLC48Pi8/Jztcbi8qKlxuICogQ3JlYXRlIGEgd29yZCBkZWZpbml0aW9uIHJlZ3VsYXIgZXhwcmVzc2lvbiBiYXNlZCBvbiBkZWZhdWx0IHdvcmQgc2VwYXJhdG9ycy5cbiAqIE9wdGlvbmFsbHkgcHJvdmlkZSBhbGxvd2VkIHNlcGFyYXRvcnMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gd29yZHMuXG4gKlxuICogVGhlIGRlZmF1bHQgd291bGQgbG9vayBsaWtlIHRoaXM6XG4gKiAvKC0/XFxkKlxcLlxcZFxcdyopfChbXlxcYFxcflxcIVxcQFxcI1xcJFxcJVxcXlxcJlxcKlxcKFxcKVxcLVxcPVxcK1xcW1xce1xcXVxcfVxcXFxcXHxcXDtcXDpcXCdcXFwiXFwsXFwuXFw8XFw+XFwvXFw/XFxzXSspL2dcbiAqL1xuZnVuY3Rpb24gY3JlYXRlV29yZFJlZ0V4cChhbGxvd0luV29yZHMgPSAnJykge1xuICAgIGxldCBzb3VyY2UgPSAnKC0/XFxcXGQqXFxcXC5cXFxcZFxcXFx3Kil8KFteJztcbiAgICBmb3IgKGNvbnN0IHNlcCBvZiBVU1VBTF9XT1JEX1NFUEFSQVRPUlMpIHtcbiAgICAgICAgaWYgKGFsbG93SW5Xb3Jkcy5pbmRleE9mKHNlcCkgPj0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlICs9ICdcXFxcJyArIHNlcDtcbiAgICB9XG4gICAgc291cmNlICs9ICdcXFxcc10rKSc7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoc291cmNlLCAnZycpO1xufVxuLy8gY2F0Y2hlcyBudW1iZXJzIChpbmNsdWRpbmcgZmxvYXRpbmcgbnVtYmVycykgaW4gdGhlIGZpcnN0IGdyb3VwLCBhbmQgYWxwaGFudW0gaW4gdGhlIHNlY29uZFxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV09SRF9SRUdFWFAgPSBjcmVhdGVXb3JkUmVnRXhwKCk7XG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlVmFsaWRXb3JkRGVmaW5pdGlvbih3b3JkRGVmaW5pdGlvbikge1xuICAgIGxldCByZXN1bHQgPSBERUZBVUxUX1dPUkRfUkVHRVhQO1xuICAgIGlmICh3b3JkRGVmaW5pdGlvbiAmJiAod29yZERlZmluaXRpb24gaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgICAgIGlmICghd29yZERlZmluaXRpb24uZ2xvYmFsKSB7XG4gICAgICAgICAgICBsZXQgZmxhZ3MgPSAnZyc7XG4gICAgICAgICAgICBpZiAod29yZERlZmluaXRpb24uaWdub3JlQ2FzZSkge1xuICAgICAgICAgICAgICAgIGZsYWdzICs9ICdpJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3b3JkRGVmaW5pdGlvbi5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICBmbGFncyArPSAnbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod29yZERlZmluaXRpb24udW5pY29kZSkge1xuICAgICAgICAgICAgICAgIGZsYWdzICs9ICd1JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWdFeHAod29yZERlZmluaXRpb24uc291cmNlLCBmbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB3b3JkRGVmaW5pdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGFzdEluZGV4ID0gMDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgX2RlZmF1bHRDb25maWcgPSBuZXcgTGlua2VkTGlzdCgpO1xuX2RlZmF1bHRDb25maWcudW5zaGlmdCh7XG4gICAgbWF4TGVuOiAxMDAwLFxuICAgIHdpbmRvd1NpemU6IDE1LFxuICAgIHRpbWVCdWRnZXQ6IDE1MFxufSk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0V29yZEF0VGV4dChjb2x1bW4sIHdvcmREZWZpbml0aW9uLCB0ZXh0LCB0ZXh0T2Zmc2V0LCBjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICBjb25maWcgPSBJdGVyYWJsZS5maXJzdChfZGVmYXVsdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICh0ZXh0Lmxlbmd0aCA+IGNvbmZpZy5tYXhMZW4pIHtcbiAgICAgICAgLy8gZG9uJ3QgdGhyb3cgc3RyaW5ncyB0aGF0IGxvbmcgYXQgdGhlIHJlZ2V4cFxuICAgICAgICAvLyBidXQgdXNlIGEgc3ViLXN0cmluZyBpbiB3aGljaCBhIHdvcmQgbXVzdCBvY2N1clxuICAgICAgICBsZXQgc3RhcnQgPSBjb2x1bW4gLSBjb25maWcubWF4TGVuIC8gMjtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGV4dE9mZnNldCArPSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGNvbHVtbiArIGNvbmZpZy5tYXhMZW4gLyAyKTtcbiAgICAgICAgcmV0dXJuIGdldFdvcmRBdFRleHQoY29sdW1uLCB3b3JkRGVmaW5pdGlvbiwgdGV4dCwgdGV4dE9mZnNldCwgY29uZmlnKTtcbiAgICB9XG4gICAgY29uc3QgdDEgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBvcyA9IGNvbHVtbiAtIDEgLSB0ZXh0T2Zmc2V0O1xuICAgIGxldCBwcmV2UmVnZXhJbmRleCA9IC0xO1xuICAgIGxldCBtYXRjaCA9IG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDE7OyBpKyspIHtcbiAgICAgICAgLy8gY2hlY2sgdGltZSBidWRnZXRcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0MSA+PSBjb25maWcudGltZUJ1ZGdldCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzZXQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSByZWdleHAgc2hvdWxkIHN0YXJ0IG1hdGNoaW5nLCBhbHNvIGtub3cgd2hlcmUgaXRcbiAgICAgICAgLy8gc2hvdWxkIHN0b3Agc28gdGhhdCBzdWJzZXF1ZW50IHNlYXJjaCBkb24ndCByZXBlYXQgcHJldmlvdXMgc2VhcmNoZXNcbiAgICAgICAgY29uc3QgcmVnZXhJbmRleCA9IHBvcyAtIGNvbmZpZy53aW5kb3dTaXplICogaTtcbiAgICAgICAgd29yZERlZmluaXRpb24ubGFzdEluZGV4ID0gTWF0aC5tYXgoMCwgcmVnZXhJbmRleCk7XG4gICAgICAgIGNvbnN0IHRoaXNNYXRjaCA9IF9maW5kUmVnZXhNYXRjaEVuY2xvc2luZ1Bvc2l0aW9uKHdvcmREZWZpbml0aW9uLCB0ZXh0LCBwb3MsIHByZXZSZWdleEluZGV4KTtcbiAgICAgICAgaWYgKCF0aGlzTWF0Y2ggJiYgbWF0Y2gpIHtcbiAgICAgICAgICAgIC8vIHN0b3A6IHdlIGhhdmUgc29tZXRoaW5nXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBtYXRjaCA9IHRoaXNNYXRjaDtcbiAgICAgICAgLy8gc3RvcDogc2VhcmNoZWQgYXQgc3RhcnRcbiAgICAgICAgaWYgKHJlZ2V4SW5kZXggPD0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcHJldlJlZ2V4SW5kZXggPSByZWdleEluZGV4O1xuICAgIH1cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgd29yZDogbWF0Y2hbMF0sXG4gICAgICAgICAgICBzdGFydENvbHVtbjogdGV4dE9mZnNldCArIDEgKyBtYXRjaC5pbmRleCxcbiAgICAgICAgICAgIGVuZENvbHVtbjogdGV4dE9mZnNldCArIDEgKyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuICAgICAgICB9O1xuICAgICAgICB3b3JkRGVmaW5pdGlvbi5sYXN0SW5kZXggPSAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIF9maW5kUmVnZXhNYXRjaEVuY2xvc2luZ1Bvc2l0aW9uKHdvcmREZWZpbml0aW9uLCB0ZXh0LCBwb3MsIHN0b3BQb3MpIHtcbiAgICBsZXQgbWF0Y2g7XG4gICAgd2hpbGUgKG1hdGNoID0gd29yZERlZmluaXRpb24uZXhlYyh0ZXh0KSkge1xuICAgICAgICBjb25zdCBtYXRjaEluZGV4ID0gbWF0Y2guaW5kZXggfHwgMDtcbiAgICAgICAgaWYgKG1hdGNoSW5kZXggPD0gcG9zICYmIHdvcmREZWZpbml0aW9uLmxhc3RJbmRleCA+PSBwb3MpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdG9wUG9zID4gMCAmJiBtYXRjaEluZGV4ID4gc3RvcFBvcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IHRvVWludDggfSBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi91aW50LmpzJztcbi8qKlxuICogQSBmYXN0IGNoYXJhY3RlciBjbGFzc2lmaWVyIHRoYXQgdXNlcyBhIGNvbXBhY3QgYXJyYXkgZm9yIEFTQ0lJIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYXJhY3RlckNsYXNzaWZpZXIge1xuICAgIGNvbnN0cnVjdG9yKF9kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdG9VaW50OChfZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLl9hc2NpaU1hcCA9IENoYXJhY3RlckNsYXNzaWZpZXIuX2NyZWF0ZUFzY2lpTWFwKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgc3RhdGljIF9jcmVhdGVBc2NpaU1hcChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgY29uc3QgYXNjaWlNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICAgICAgICBhc2NpaU1hcC5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIHJldHVybiBhc2NpaU1hcDtcbiAgICB9XG4gICAgc2V0KGNoYXJDb2RlLCBfdmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0b1VpbnQ4KF92YWx1ZSk7XG4gICAgICAgIGlmIChjaGFyQ29kZSA+PSAwICYmIGNoYXJDb2RlIDwgMjU2KSB7XG4gICAgICAgICAgICB0aGlzLl9hc2NpaU1hcFtjaGFyQ29kZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoY2hhckNvZGUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQoY2hhckNvZGUpIHtcbiAgICAgICAgaWYgKGNoYXJDb2RlID49IDAgJiYgY2hhckNvZGUgPCAyNTYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hc2NpaU1hcFtjaGFyQ29kZV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuX21hcC5nZXQoY2hhckNvZGUpIHx8IHRoaXMuX2RlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX2FzY2lpTWFwLmZpbGwodGhpcy5fZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgdGhpcy5fbWFwLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENoYXJhY3RlclNldCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2FjdHVhbCA9IG5ldyBDaGFyYWN0ZXJDbGFzc2lmaWVyKDAgLyogQm9vbGVhbi5GYWxzZSAqLyk7XG4gICAgfVxuICAgIGFkZChjaGFyQ29kZSkge1xuICAgICAgICB0aGlzLl9hY3R1YWwuc2V0KGNoYXJDb2RlLCAxIC8qIEJvb2xlYW4uVHJ1ZSAqLyk7XG4gICAgfVxuICAgIGhhcyhjaGFyQ29kZSkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX2FjdHVhbC5nZXQoY2hhckNvZGUpID09PSAxIC8qIEJvb2xlYW4uVHJ1ZSAqLyk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0dWFsLmNsZWFyKCk7XG4gICAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBDaGFyYWN0ZXJDbGFzc2lmaWVyIH0gZnJvbSAnLi4vY29yZS9jaGFyYWN0ZXJDbGFzc2lmaWVyLmpzJztcbmNsYXNzIFVpbnQ4TWF0cml4IHtcbiAgICBjb25zdHJ1Y3Rvcihyb3dzLCBjb2xzLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHJvd3MgKiBjb2xzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJvd3MgKiBjb2xzOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMucm93cyA9IHJvd3M7XG4gICAgICAgIHRoaXMuY29scyA9IGNvbHM7XG4gICAgfVxuICAgIGdldChyb3csIGNvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtyb3cgKiB0aGlzLmNvbHMgKyBjb2xdO1xuICAgIH1cbiAgICBzZXQocm93LCBjb2wsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2RhdGFbcm93ICogdGhpcy5jb2xzICsgY29sXSA9IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBTdGF0ZU1hY2hpbmUge1xuICAgIGNvbnN0cnVjdG9yKGVkZ2VzKSB7XG4gICAgICAgIGxldCBtYXhDaGFyQ29kZSA9IDA7XG4gICAgICAgIGxldCBtYXhTdGF0ZSA9IDAgLyogU3RhdGUuSW52YWxpZCAqLztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVkZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBbZnJvbSwgY2hDb2RlLCB0b10gPSBlZGdlc1tpXTtcbiAgICAgICAgICAgIGlmIChjaENvZGUgPiBtYXhDaGFyQ29kZSkge1xuICAgICAgICAgICAgICAgIG1heENoYXJDb2RlID0gY2hDb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZyb20gPiBtYXhTdGF0ZSkge1xuICAgICAgICAgICAgICAgIG1heFN0YXRlID0gZnJvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0byA+IG1heFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgbWF4U3RhdGUgPSB0bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXhDaGFyQ29kZSsrO1xuICAgICAgICBtYXhTdGF0ZSsrO1xuICAgICAgICBjb25zdCBzdGF0ZXMgPSBuZXcgVWludDhNYXRyaXgobWF4U3RhdGUsIG1heENoYXJDb2RlLCAwIC8qIFN0YXRlLkludmFsaWQgKi8pO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZWRnZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IFtmcm9tLCBjaENvZGUsIHRvXSA9IGVkZ2VzW2ldO1xuICAgICAgICAgICAgc3RhdGVzLnNldChmcm9tLCBjaENvZGUsIHRvKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZXMgPSBzdGF0ZXM7XG4gICAgICAgIHRoaXMuX21heENoYXJDb2RlID0gbWF4Q2hhckNvZGU7XG4gICAgfVxuICAgIG5leHRTdGF0ZShjdXJyZW50U3RhdGUsIGNoQ29kZSkge1xuICAgICAgICBpZiAoY2hDb2RlIDwgMCB8fCBjaENvZGUgPj0gdGhpcy5fbWF4Q2hhckNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFN0YXRlLkludmFsaWQgKi87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5nZXQoY3VycmVudFN0YXRlLCBjaENvZGUpO1xuICAgIH1cbn1cbi8vIFN0YXRlIG1hY2hpbmUgZm9yIGh0dHA6Ly8gb3IgaHR0cHM6Ly8gb3IgZmlsZTovL1xubGV0IF9zdGF0ZU1hY2hpbmUgPSBudWxsO1xuZnVuY3Rpb24gZ2V0U3RhdGVNYWNoaW5lKCkge1xuICAgIGlmIChfc3RhdGVNYWNoaW5lID09PSBudWxsKSB7XG4gICAgICAgIF9zdGF0ZU1hY2hpbmUgPSBuZXcgU3RhdGVNYWNoaW5lKFtcbiAgICAgICAgICAgIFsxIC8qIFN0YXRlLlN0YXJ0ICovLCAxMDQgLyogQ2hhckNvZGUuaCAqLywgMiAvKiBTdGF0ZS5IICovXSxcbiAgICAgICAgICAgIFsxIC8qIFN0YXRlLlN0YXJ0ICovLCA3MiAvKiBDaGFyQ29kZS5IICovLCAyIC8qIFN0YXRlLkggKi9dLFxuICAgICAgICAgICAgWzEgLyogU3RhdGUuU3RhcnQgKi8sIDEwMiAvKiBDaGFyQ29kZS5mICovLCA2IC8qIFN0YXRlLkYgKi9dLFxuICAgICAgICAgICAgWzEgLyogU3RhdGUuU3RhcnQgKi8sIDcwIC8qIENoYXJDb2RlLkYgKi8sIDYgLyogU3RhdGUuRiAqL10sXG4gICAgICAgICAgICBbMiAvKiBTdGF0ZS5IICovLCAxMTYgLyogQ2hhckNvZGUudCAqLywgMyAvKiBTdGF0ZS5IVCAqL10sXG4gICAgICAgICAgICBbMiAvKiBTdGF0ZS5IICovLCA4NCAvKiBDaGFyQ29kZS5UICovLCAzIC8qIFN0YXRlLkhUICovXSxcbiAgICAgICAgICAgIFszIC8qIFN0YXRlLkhUICovLCAxMTYgLyogQ2hhckNvZGUudCAqLywgNCAvKiBTdGF0ZS5IVFQgKi9dLFxuICAgICAgICAgICAgWzMgLyogU3RhdGUuSFQgKi8sIDg0IC8qIENoYXJDb2RlLlQgKi8sIDQgLyogU3RhdGUuSFRUICovXSxcbiAgICAgICAgICAgIFs0IC8qIFN0YXRlLkhUVCAqLywgMTEyIC8qIENoYXJDb2RlLnAgKi8sIDUgLyogU3RhdGUuSFRUUCAqL10sXG4gICAgICAgICAgICBbNCAvKiBTdGF0ZS5IVFQgKi8sIDgwIC8qIENoYXJDb2RlLlAgKi8sIDUgLyogU3RhdGUuSFRUUCAqL10sXG4gICAgICAgICAgICBbNSAvKiBTdGF0ZS5IVFRQICovLCAxMTUgLyogQ2hhckNvZGUucyAqLywgOSAvKiBTdGF0ZS5CZWZvcmVDb2xvbiAqL10sXG4gICAgICAgICAgICBbNSAvKiBTdGF0ZS5IVFRQICovLCA4MyAvKiBDaGFyQ29kZS5TICovLCA5IC8qIFN0YXRlLkJlZm9yZUNvbG9uICovXSxcbiAgICAgICAgICAgIFs1IC8qIFN0YXRlLkhUVFAgKi8sIDU4IC8qIENoYXJDb2RlLkNvbG9uICovLCAxMCAvKiBTdGF0ZS5BZnRlckNvbG9uICovXSxcbiAgICAgICAgICAgIFs2IC8qIFN0YXRlLkYgKi8sIDEwNSAvKiBDaGFyQ29kZS5pICovLCA3IC8qIFN0YXRlLkZJICovXSxcbiAgICAgICAgICAgIFs2IC8qIFN0YXRlLkYgKi8sIDczIC8qIENoYXJDb2RlLkkgKi8sIDcgLyogU3RhdGUuRkkgKi9dLFxuICAgICAgICAgICAgWzcgLyogU3RhdGUuRkkgKi8sIDEwOCAvKiBDaGFyQ29kZS5sICovLCA4IC8qIFN0YXRlLkZJTCAqL10sXG4gICAgICAgICAgICBbNyAvKiBTdGF0ZS5GSSAqLywgNzYgLyogQ2hhckNvZGUuTCAqLywgOCAvKiBTdGF0ZS5GSUwgKi9dLFxuICAgICAgICAgICAgWzggLyogU3RhdGUuRklMICovLCAxMDEgLyogQ2hhckNvZGUuZSAqLywgOSAvKiBTdGF0ZS5CZWZvcmVDb2xvbiAqL10sXG4gICAgICAgICAgICBbOCAvKiBTdGF0ZS5GSUwgKi8sIDY5IC8qIENoYXJDb2RlLkUgKi8sIDkgLyogU3RhdGUuQmVmb3JlQ29sb24gKi9dLFxuICAgICAgICAgICAgWzkgLyogU3RhdGUuQmVmb3JlQ29sb24gKi8sIDU4IC8qIENoYXJDb2RlLkNvbG9uICovLCAxMCAvKiBTdGF0ZS5BZnRlckNvbG9uICovXSxcbiAgICAgICAgICAgIFsxMCAvKiBTdGF0ZS5BZnRlckNvbG9uICovLCA0NyAvKiBDaGFyQ29kZS5TbGFzaCAqLywgMTEgLyogU3RhdGUuQWxtb3N0VGhlcmUgKi9dLFxuICAgICAgICAgICAgWzExIC8qIFN0YXRlLkFsbW9zdFRoZXJlICovLCA0NyAvKiBDaGFyQ29kZS5TbGFzaCAqLywgMTIgLyogU3RhdGUuRW5kICovXSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiBfc3RhdGVNYWNoaW5lO1xufVxubGV0IF9jbGFzc2lmaWVyID0gbnVsbDtcbmZ1bmN0aW9uIGdldENsYXNzaWZpZXIoKSB7XG4gICAgaWYgKF9jbGFzc2lmaWVyID09PSBudWxsKSB7XG4gICAgICAgIF9jbGFzc2lmaWVyID0gbmV3IENoYXJhY3RlckNsYXNzaWZpZXIoMCAvKiBDaGFyYWN0ZXJDbGFzcy5Ob25lICovKTtcbiAgICAgICAgLy8gYWxsb3ctYW55LXVuaWNvZGUtbmV4dC1saW5lXG4gICAgICAgIGNvbnN0IEZPUkNFX1RFUk1JTkFUSU9OX0NIQVJBQ1RFUlMgPSAnIFxcdDw+XFwnXFxcIuOAgeOAgu+9oe+9pO+8jO+8ju+8mu+8m+KAmOOAiOOAjOOAjuOAlO+8iO+8u++9m++9ou+9o++9ne+8ve+8ieOAleOAj+OAjeOAieKAme+9gO+9nuKApic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRk9SQ0VfVEVSTUlOQVRJT05fQ0hBUkFDVEVSUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgX2NsYXNzaWZpZXIuc2V0KEZPUkNFX1RFUk1JTkFUSU9OX0NIQVJBQ1RFUlMuY2hhckNvZGVBdChpKSwgMSAvKiBDaGFyYWN0ZXJDbGFzcy5Gb3JjZVRlcm1pbmF0aW9uICovKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBDQU5OT1RfRU5EX1dJVEhfQ0hBUkFDVEVSUyA9ICcuLDs6JztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDQU5OT1RfRU5EX1dJVEhfQ0hBUkFDVEVSUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgX2NsYXNzaWZpZXIuc2V0KENBTk5PVF9FTkRfV0lUSF9DSEFSQUNURVJTLmNoYXJDb2RlQXQoaSksIDIgLyogQ2hhcmFjdGVyQ2xhc3MuQ2Fubm90RW5kSW4gKi8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfY2xhc3NpZmllcjtcbn1cbmV4cG9ydCBjbGFzcyBMaW5rQ29tcHV0ZXIge1xuICAgIHN0YXRpYyBfY3JlYXRlTGluayhjbGFzc2lmaWVyLCBsaW5lLCBsaW5lTnVtYmVyLCBsaW5rQmVnaW5JbmRleCwgbGlua0VuZEluZGV4KSB7XG4gICAgICAgIC8vIERvIG5vdCBhbGxvdyB0byBlbmQgbGluayBpbiBjZXJ0YWluIGNoYXJhY3RlcnMuLi5cbiAgICAgICAgbGV0IGxhc3RJbmNsdWRlZENoYXJJbmRleCA9IGxpbmtFbmRJbmRleCAtIDE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IGNoQ29kZSA9IGxpbmUuY2hhckNvZGVBdChsYXN0SW5jbHVkZWRDaGFySW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgY2hDbGFzcyA9IGNsYXNzaWZpZXIuZ2V0KGNoQ29kZSk7XG4gICAgICAgICAgICBpZiAoY2hDbGFzcyAhPT0gMiAvKiBDaGFyYWN0ZXJDbGFzcy5DYW5ub3RFbmRJbiAqLykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdEluY2x1ZGVkQ2hhckluZGV4LS07XG4gICAgICAgIH0gd2hpbGUgKGxhc3RJbmNsdWRlZENoYXJJbmRleCA+IGxpbmtCZWdpbkluZGV4KTtcbiAgICAgICAgLy8gSGFuZGxlIGxpbmtzIGVuY2xvc2VkIGluIHBhcmVucywgc3F1YXJlIGJyYWNrZXRzIGFuZCBjdXJseXMuXG4gICAgICAgIGlmIChsaW5rQmVnaW5JbmRleCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlQmVmb3JlTGluayA9IGxpbmUuY2hhckNvZGVBdChsaW5rQmVnaW5JbmRleCAtIDEpO1xuICAgICAgICAgICAgY29uc3QgbGFzdENoYXJDb2RlSW5MaW5rID0gbGluZS5jaGFyQ29kZUF0KGxhc3RJbmNsdWRlZENoYXJJbmRleCk7XG4gICAgICAgICAgICBpZiAoKGNoYXJDb2RlQmVmb3JlTGluayA9PT0gNDAgLyogQ2hhckNvZGUuT3BlblBhcmVuICovICYmIGxhc3RDaGFyQ29kZUluTGluayA9PT0gNDEgLyogQ2hhckNvZGUuQ2xvc2VQYXJlbiAqLylcbiAgICAgICAgICAgICAgICB8fCAoY2hhckNvZGVCZWZvcmVMaW5rID09PSA5MSAvKiBDaGFyQ29kZS5PcGVuU3F1YXJlQnJhY2tldCAqLyAmJiBsYXN0Q2hhckNvZGVJbkxpbmsgPT09IDkzIC8qIENoYXJDb2RlLkNsb3NlU3F1YXJlQnJhY2tldCAqLylcbiAgICAgICAgICAgICAgICB8fCAoY2hhckNvZGVCZWZvcmVMaW5rID09PSAxMjMgLyogQ2hhckNvZGUuT3BlbkN1cmx5QnJhY2UgKi8gJiYgbGFzdENoYXJDb2RlSW5MaW5rID09PSAxMjUgLyogQ2hhckNvZGUuQ2xvc2VDdXJseUJyYWNlICovKSkge1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbmQgaW4gKSBpZiAoIGlzIGJlZm9yZSB0aGUgbGluayBzdGFydFxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbmQgaW4gXSBpZiBbIGlzIGJlZm9yZSB0aGUgbGluayBzdGFydFxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbmQgaW4gfSBpZiB7IGlzIGJlZm9yZSB0aGUgbGluayBzdGFydFxuICAgICAgICAgICAgICAgIGxhc3RJbmNsdWRlZENoYXJJbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogbGluZU51bWJlcixcbiAgICAgICAgICAgICAgICBzdGFydENvbHVtbjogbGlua0JlZ2luSW5kZXggKyAxLFxuICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgZW5kQ29sdW1uOiBsYXN0SW5jbHVkZWRDaGFySW5kZXggKyAyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXJsOiBsaW5lLnN1YnN0cmluZyhsaW5rQmVnaW5JbmRleCwgbGFzdEluY2x1ZGVkQ2hhckluZGV4ICsgMSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc3RhdGljIGNvbXB1dGVMaW5rcyhtb2RlbCwgc3RhdGVNYWNoaW5lID0gZ2V0U3RhdGVNYWNoaW5lKCkpIHtcbiAgICAgICAgY29uc3QgY2xhc3NpZmllciA9IGdldENsYXNzaWZpZXIoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxLCBsaW5lQ291bnQgPSBtb2RlbC5nZXRMaW5lQ291bnQoKTsgaSA8PSBsaW5lQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IG1vZGVsLmdldExpbmVDb250ZW50KGkpO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICBsZXQgbGlua0JlZ2luSW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGxpbmtCZWdpbkNoQ29kZSA9IDA7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSAxIC8qIFN0YXRlLlN0YXJ0ICovO1xuICAgICAgICAgICAgbGV0IGhhc09wZW5QYXJlbnMgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBoYXNPcGVuU3F1YXJlQnJhY2tldCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGluU3F1YXJlQnJhY2tldHMgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBoYXNPcGVuQ3VybHlCcmFja2V0ID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGxlbikge1xuICAgICAgICAgICAgICAgIGxldCByZXNldFN0YXRlTWFjaGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoQ29kZSA9IGxpbmUuY2hhckNvZGVBdChqKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IDEzIC8qIFN0YXRlLkFjY2VwdCAqLykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2hDbGFzcztcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaENvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAgLyogQ2hhckNvZGUuT3BlblBhcmVuICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09wZW5QYXJlbnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAwIC8qIENoYXJhY3RlckNsYXNzLk5vbmUgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQxIC8qIENoYXJDb2RlLkNsb3NlUGFyZW4gKi86XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChoYXNPcGVuUGFyZW5zID8gMCAvKiBDaGFyYWN0ZXJDbGFzcy5Ob25lICovIDogMSAvKiBDaGFyYWN0ZXJDbGFzcy5Gb3JjZVRlcm1pbmF0aW9uICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTEgLyogQ2hhckNvZGUuT3BlblNxdWFyZUJyYWNrZXQgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TcXVhcmVCcmFja2V0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3BlblNxdWFyZUJyYWNrZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAwIC8qIENoYXJhY3RlckNsYXNzLk5vbmUgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDkzIC8qIENoYXJDb2RlLkNsb3NlU3F1YXJlQnJhY2tldCAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNxdWFyZUJyYWNrZXRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChoYXNPcGVuU3F1YXJlQnJhY2tldCA/IDAgLyogQ2hhcmFjdGVyQ2xhc3MuTm9uZSAqLyA6IDEgLyogQ2hhcmFjdGVyQ2xhc3MuRm9yY2VUZXJtaW5hdGlvbiAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyMyAvKiBDaGFyQ29kZS5PcGVuQ3VybHlCcmFjZSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVuQ3VybHlCcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gMCAvKiBDaGFyYWN0ZXJDbGFzcy5Ob25lICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjUgLyogQ2hhckNvZGUuQ2xvc2VDdXJseUJyYWNlICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAoaGFzT3BlbkN1cmx5QnJhY2tldCA/IDAgLyogQ2hhcmFjdGVyQ2xhc3MuTm9uZSAqLyA6IDEgLyogQ2hhcmFjdGVyQ2xhc3MuRm9yY2VUZXJtaW5hdGlvbiAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHRocmVlIHJ1bGVzIG1ha2UgaXQgdGhhdCAnIG9yIFwiIG9yIGAgYXJlIGFsbG93ZWQgaW5zaWRlIGxpbmtzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIHRoZSBsaW5rIGlzIHdyYXBwZWQgYnkgc29tZSBvdGhlciBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzkgLyogQ2hhckNvZGUuU2luZ2xlUXVvdGUgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0IC8qIENoYXJDb2RlLkRvdWJsZVF1b3RlICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5NiAvKiBDaGFyQ29kZS5CYWNrVGljayAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlua0JlZ2luQ2hDb2RlID09PSBjaENvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IDEgLyogQ2hhcmFjdGVyQ2xhc3MuRm9yY2VUZXJtaW5hdGlvbiAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGlua0JlZ2luQ2hDb2RlID09PSAzOSAvKiBDaGFyQ29kZS5TaW5nbGVRdW90ZSAqLyB8fCBsaW5rQmVnaW5DaENvZGUgPT09IDM0IC8qIENoYXJDb2RlLkRvdWJsZVF1b3RlICovIHx8IGxpbmtCZWdpbkNoQ29kZSA9PT0gOTYgLyogQ2hhckNvZGUuQmFja1RpY2sgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IDAgLyogQ2hhcmFjdGVyQ2xhc3MuTm9uZSAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAxIC8qIENoYXJhY3RlckNsYXNzLkZvcmNlVGVybWluYXRpb24gKi87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MiAvKiBDaGFyQ29kZS5Bc3RlcmlzayAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgKmAgdGVybWluYXRlcyBhIGxpbmsgaWYgdGhlIGxpbmsgYmVnYW4gd2l0aCBgKmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gKGxpbmtCZWdpbkNoQ29kZSA9PT0gNDIgLyogQ2hhckNvZGUuQXN0ZXJpc2sgKi8pID8gMSAvKiBDaGFyYWN0ZXJDbGFzcy5Gb3JjZVRlcm1pbmF0aW9uICovIDogMCAvKiBDaGFyYWN0ZXJDbGFzcy5Ob25lICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjQgLyogQ2hhckNvZGUuUGlwZSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgfGAgdGVybWluYXRlcyBhIGxpbmsgaWYgdGhlIGxpbmsgYmVnYW4gd2l0aCBgfGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gKGxpbmtCZWdpbkNoQ29kZSA9PT0gMTI0IC8qIENoYXJDb2RlLlBpcGUgKi8pID8gMSAvKiBDaGFyYWN0ZXJDbGFzcy5Gb3JjZVRlcm1pbmF0aW9uICovIDogMCAvKiBDaGFyYWN0ZXJDbGFzcy5Ob25lICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMiAvKiBDaGFyQ29kZS5TcGFjZSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgIGAgYWxsb3cgc3BhY2UgaW4gYmV0d2VlbiBbIGFuZCBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChpblNxdWFyZUJyYWNrZXRzID8gMCAvKiBDaGFyYWN0ZXJDbGFzcy5Ob25lICovIDogMSAvKiBDaGFyYWN0ZXJDbGFzcy5Gb3JjZVRlcm1pbmF0aW9uICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IGNsYXNzaWZpZXIuZ2V0KGNoQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2hhcmFjdGVyIHRlcm1pbmF0ZXMgbGlua1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hDbGFzcyA9PT0gMSAvKiBDaGFyYWN0ZXJDbGFzcy5Gb3JjZVRlcm1pbmF0aW9uICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChMaW5rQ29tcHV0ZXIuX2NyZWF0ZUxpbmsoY2xhc3NpZmllciwgbGluZSwgaSwgbGlua0JlZ2luSW5kZXgsIGopKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0U3RhdGVNYWNoaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gMTIgLyogU3RhdGUuRW5kICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaENsYXNzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hDb2RlID09PSA5MSAvKiBDaGFyQ29kZS5PcGVuU3F1YXJlQnJhY2tldCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgZm9yIHRoZSBhdXRob3JpdHkgcGFydCB0byBjb250YWluIGlwdjYgYWRkcmVzc2VzIHdoaWNoIGNvbnRhaW4gWyBhbmQgXVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3BlblNxdWFyZUJyYWNrZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IDAgLyogQ2hhcmFjdGVyQ2xhc3MuTm9uZSAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSBjbGFzc2lmaWVyLmdldChjaENvZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGNoYXJhY3RlciB0ZXJtaW5hdGVzIGxpbmtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoQ2xhc3MgPT09IDEgLyogQ2hhcmFjdGVyQ2xhc3MuRm9yY2VUZXJtaW5hdGlvbiAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRTdGF0ZU1hY2hpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxMyAvKiBTdGF0ZS5BY2NlcHQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVNYWNoaW5lLm5leHRTdGF0ZShzdGF0ZSwgY2hDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAwIC8qIFN0YXRlLkludmFsaWQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0U3RhdGVNYWNoaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzZXRTdGF0ZU1hY2hpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxIC8qIFN0YXRlLlN0YXJ0ICovO1xuICAgICAgICAgICAgICAgICAgICBoYXNPcGVuUGFyZW5zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGhhc09wZW5TcXVhcmVCcmFja2V0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGhhc09wZW5DdXJseUJyYWNrZXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3JkIHdoZXJlIHRoZSBsaW5rIHN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgbGlua0JlZ2luSW5kZXggPSBqICsgMTtcbiAgICAgICAgICAgICAgICAgICAgbGlua0JlZ2luQ2hDb2RlID0gY2hDb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IDEzIC8qIFN0YXRlLkFjY2VwdCAqLykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKExpbmtDb21wdXRlci5fY3JlYXRlTGluayhjbGFzc2lmaWVyLCBsaW5lLCBpLCBsaW5rQmVnaW5JbmRleCwgbGVuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGxpbmtzIGNvbnRhaW5zIGluIHRoZSBwcm92aWRlZFxuICogZG9jdW1lbnQuICpOb3RlKiB0aGF0IHRoaXMgb3BlcmF0aW9uIGlzIGNvbXB1dGF0aW9uYWxcbiAqIGV4cGVuc2l2ZSBhbmQgc2hvdWxkIG5vdCBydW4gaW4gdGhlIFVJIHRocmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVMaW5rcyhtb2RlbCkge1xuICAgIGlmICghbW9kZWwgfHwgdHlwZW9mIG1vZGVsLmdldExpbmVDb3VudCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgbW9kZWwuZ2V0TGluZUNvbnRlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVW5rbm93biBjYWxsZXIhXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIExpbmtDb21wdXRlci5jb21wdXRlTGlua3MobW9kZWwpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgY2xhc3MgQmFzaWNJbnBsYWNlUmVwbGFjZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZVNldCA9IFtcbiAgICAgICAgICAgIFsndHJ1ZScsICdmYWxzZSddLFxuICAgICAgICAgICAgWydUcnVlJywgJ0ZhbHNlJ10sXG4gICAgICAgICAgICBbJ1ByaXZhdGUnLCAnUHVibGljJywgJ0ZyaWVuZCcsICdSZWFkT25seScsICdQYXJ0aWFsJywgJ1Byb3RlY3RlZCcsICdXcml0ZU9ubHknXSxcbiAgICAgICAgICAgIFsncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJ10sXG4gICAgICAgIF07XG4gICAgfVxuICAgIG5hdmlnYXRlVmFsdWVTZXQocmFuZ2UxLCB0ZXh0MSwgcmFuZ2UyLCB0ZXh0MiwgdXApIHtcbiAgICAgICAgaWYgKHJhbmdlMSAmJiB0ZXh0MSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kb05hdmlnYXRlVmFsdWVTZXQodGV4dDEsIHVwKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByYW5nZTogcmFuZ2UxLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuZ2UyICYmIHRleHQyKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmRvTmF2aWdhdGVWYWx1ZVNldCh0ZXh0MiwgdXApO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiByYW5nZTIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkb05hdmlnYXRlVmFsdWVTZXQodGV4dCwgdXApIHtcbiAgICAgICAgY29uc3QgbnVtYmVyUmVzdWx0ID0gdGhpcy5udW1iZXJSZXBsYWNlKHRleHQsIHVwKTtcbiAgICAgICAgaWYgKG51bWJlclJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlclJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0UmVwbGFjZSh0ZXh0LCB1cCk7XG4gICAgfVxuICAgIG51bWJlclJlcGxhY2UodmFsdWUsIHVwKSB7XG4gICAgICAgIGNvbnN0IHByZWNpc2lvbiA9IE1hdGgucG93KDEwLCB2YWx1ZS5sZW5ndGggLSAodmFsdWUubGFzdEluZGV4T2YoJy4nKSArIDEpKTtcbiAgICAgICAgbGV0IG4xID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgY29uc3QgbjIgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgaWYgKCFpc05hTihuMSkgJiYgIWlzTmFOKG4yKSAmJiBuMSA9PT0gbjIpIHtcbiAgICAgICAgICAgIGlmIChuMSA9PT0gMCAmJiAhdXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gZG9uJ3QgZG8gbmVnYXRpdmVcbiAgICAgICAgICAgICAgICAvL1x0XHRcdH0gZWxzZSBpZihuMSA9PT0gOSAmJiB1cCkge1xuICAgICAgICAgICAgICAgIC8vXHRcdFx0XHRyZXR1cm4gbnVsbDsgLy8gZG9uJ3QgaW5zZXJ0IDEwIGludG8gYSBudW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG4xID0gTWF0aC5mbG9vcihuMSAqIHByZWNpc2lvbik7XG4gICAgICAgICAgICAgICAgbjEgKz0gdXAgPyBwcmVjaXNpb24gOiAtcHJlY2lzaW9uO1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcobjEgLyBwcmVjaXNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0ZXh0UmVwbGFjZSh2YWx1ZSwgdXApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVTZXRzUmVwbGFjZSh0aGlzLl9kZWZhdWx0VmFsdWVTZXQsIHZhbHVlLCB1cCk7XG4gICAgfVxuICAgIHZhbHVlU2V0c1JlcGxhY2UodmFsdWVTZXRzLCB2YWx1ZSwgdXApIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB2YWx1ZVNldHMubGVuZ3RoOyByZXN1bHQgPT09IG51bGwgJiYgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnZhbHVlU2V0UmVwbGFjZSh2YWx1ZVNldHNbaV0sIHZhbHVlLCB1cCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdmFsdWVTZXRSZXBsYWNlKHZhbHVlU2V0LCB2YWx1ZSwgdXApIHtcbiAgICAgICAgbGV0IGlkeCA9IHZhbHVlU2V0LmluZGV4T2YodmFsdWUpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIGlkeCArPSB1cCA/ICsxIDogLTE7XG4gICAgICAgICAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgICAgICAgICAgIGlkeCA9IHZhbHVlU2V0Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZHggJT0gdmFsdWVTZXQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlU2V0W2lkeF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuQmFzaWNJbnBsYWNlUmVwbGFjZS5JTlNUQU5DRSA9IG5ldyBCYXNpY0lucGxhY2VSZXBsYWNlKCk7XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IEVtaXR0ZXIsIEV2ZW50IH0gZnJvbSAnLi9ldmVudC5qcyc7XG5jb25zdCBzaG9ydGN1dEV2ZW50ID0gT2JqZWN0LmZyZWV6ZShmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICBjb25zdCBoYW5kbGUgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLmJpbmQoY29udGV4dCksIDApO1xuICAgIHJldHVybiB7IGRpc3Bvc2UoKSB7IGNsZWFyVGltZW91dChoYW5kbGUpOyB9IH07XG59KTtcbmV4cG9ydCB2YXIgQ2FuY2VsbGF0aW9uVG9rZW47XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblRva2VuKSB7XG4gICAgZnVuY3Rpb24gaXNDYW5jZWxsYXRpb25Ub2tlbih0aGluZykge1xuICAgICAgICBpZiAodGhpbmcgPT09IENhbmNlbGxhdGlvblRva2VuLk5vbmUgfHwgdGhpbmcgPT09IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgTXV0YWJsZVRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaW5nIHx8IHR5cGVvZiB0aGluZyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaW5nLmlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkID09PSAnYm9vbGVhbidcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5vbkNhbmNlbGxhdGlvblJlcXVlc3RlZCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXNDYW5jZWxsYXRpb25Ub2tlbiA9IGlzQ2FuY2VsbGF0aW9uVG9rZW47XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDogZmFsc2UsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBFdmVudC5Ob25lXG4gICAgfSk7XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uQ2FuY2VsbGVkID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiB0cnVlLFxuICAgICAgICBvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDogc2hvcnRjdXRFdmVudFxuICAgIH0pO1xufSkoQ2FuY2VsbGF0aW9uVG9rZW4gfHwgKENhbmNlbGxhdGlvblRva2VuID0ge30pKTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBudWxsO1xuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNDYW5jZWxsZWQ7XG4gICAgfVxuICAgIGdldCBvbkNhbmNlbGxhdGlvblJlcXVlc3RlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc2hvcnRjdXRFdmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9lbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9wYXJlbnRMaXN0ZW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fcGFyZW50TGlzdGVuZXIgPSBwYXJlbnQgJiYgcGFyZW50Lm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKHRoaXMuY2FuY2VsLCB0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgY2FuY2VsXG4gICAgICAgICAgICB0aGlzLl90b2tlbi5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXNwb3NlKGNhbmNlbCA9IGZhbHNlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGNhbmNlbCkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLl9wYXJlbnRMaXN0ZW5lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gZW5zdXJlIHRvIGluaXRpYWxpemUgd2l0aCBhbiBlbXB0eSB0b2tlbiBpZiB3ZSBoYWQgbm9uZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3Rva2VuIGluc3RhbmNlb2YgTXV0YWJsZVRva2VuKSB7XG4gICAgICAgICAgICAvLyBhY3R1YWxseSBkaXNwb3NlXG4gICAgICAgICAgICB0aGlzLl90b2tlbi5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmNsYXNzIEtleUNvZGVTdHJNYXAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9rZXlDb2RlVG9TdHIgPSBbXTtcbiAgICAgICAgdGhpcy5fc3RyVG9LZXlDb2RlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgZGVmaW5lKGtleUNvZGUsIHN0cikge1xuICAgICAgICB0aGlzLl9rZXlDb2RlVG9TdHJba2V5Q29kZV0gPSBzdHI7XG4gICAgICAgIHRoaXMuX3N0clRvS2V5Q29kZVtzdHIudG9Mb3dlckNhc2UoKV0gPSBrZXlDb2RlO1xuICAgIH1cbiAgICBrZXlDb2RlVG9TdHIoa2V5Q29kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5Q29kZVRvU3RyW2tleUNvZGVdO1xuICAgIH1cbiAgICBzdHJUb0tleUNvZGUoc3RyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJUb0tleUNvZGVbc3RyLnRvTG93ZXJDYXNlKCldIHx8IDAgLyogS2V5Q29kZS5Vbmtub3duICovO1xuICAgIH1cbn1cbmNvbnN0IHVpTWFwID0gbmV3IEtleUNvZGVTdHJNYXAoKTtcbmNvbnN0IHVzZXJTZXR0aW5nc1VTTWFwID0gbmV3IEtleUNvZGVTdHJNYXAoKTtcbmNvbnN0IHVzZXJTZXR0aW5nc0dlbmVyYWxNYXAgPSBuZXcgS2V5Q29kZVN0ck1hcCgpO1xuZXhwb3J0IGNvbnN0IEVWRU5UX0tFWV9DT0RFX01BUCA9IG5ldyBBcnJheSgyMzApO1xuZXhwb3J0IGNvbnN0IE5BVElWRV9XSU5ET1dTX0tFWV9DT0RFX1RPX0tFWV9DT0RFID0ge307XG5jb25zdCBzY2FuQ29kZUludFRvU3RyID0gW107XG5jb25zdCBzY2FuQ29kZVN0clRvSW50ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmNvbnN0IHNjYW5Db2RlTG93ZXJDYXNlU3RyVG9JbnQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG4gKiAtMSBpZiBhIFNjYW5Db2RlID0+IEtleUNvZGUgbWFwcGluZyBkZXBlbmRzIG9uIGtiIGxheW91dC5cbiAqL1xuZXhwb3J0IGNvbnN0IElNTVVUQUJMRV9DT0RFX1RPX0tFWV9DT0RFID0gW107XG4vKipcbiAqIC0xIGlmIGEgS2V5Q29kZSA9PiBTY2FuQ29kZSBtYXBwaW5nIGRlcGVuZHMgb24ga2IgbGF5b3V0LlxuICovXG5leHBvcnQgY29uc3QgSU1NVVRBQkxFX0tFWV9DT0RFX1RPX0NPREUgPSBbXTtcbmZvciAobGV0IGkgPSAwOyBpIDw9IDE5MyAvKiBTY2FuQ29kZS5NQVhfVkFMVUUgKi87IGkrKykge1xuICAgIElNTVVUQUJMRV9DT0RFX1RPX0tFWV9DT0RFW2ldID0gLTEgLyogS2V5Q29kZS5EZXBlbmRzT25LYkxheW91dCAqLztcbn1cbmZvciAobGV0IGkgPSAwOyBpIDw9IDEzMiAvKiBLZXlDb2RlLk1BWF9WQUxVRSAqLzsgaSsrKSB7XG4gICAgSU1NVVRBQkxFX0tFWV9DT0RFX1RPX0NPREVbaV0gPSAtMSAvKiBTY2FuQ29kZS5EZXBlbmRzT25LYkxheW91dCAqLztcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgLy8gU2VlIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2RkMzc1NzMxKHY9dnMuODUpLmFzcHhcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9ub2RlLW5hdGl2ZS1rZXltYXAvYmxvYi84OGMwYjBlNS9kZXBzL2Nocm9taXVtL2tleWJvYXJkX2NvZGVzX3dpbi5oXG4gICAgY29uc3QgZW1wdHkgPSAnJztcbiAgICBjb25zdCBtYXBwaW5ncyA9IFtcbiAgICAgICAgLy8gaW1tdXRhYmxlLCBzY2FuQ29kZSwgc2NhbkNvZGVTdHIsIGtleUNvZGUsIGtleUNvZGVTdHIsIGV2ZW50S2V5Q29kZSwgdmtleSwgdXNVc2VyU2V0dGluZ3NMYWJlbCwgZ2VuZXJhbFVzZXJTZXR0aW5nc0xhYmVsXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sICdOb25lJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sICd1bmtub3duJywgMCwgJ1ZLX1VOS05PV04nLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMSAvKiBTY2FuQ29kZS5IeXBlciAqLywgJ0h5cGVyJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDIgLyogU2NhbkNvZGUuU3VwZXIgKi8sICdTdXBlcicsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAzIC8qIFNjYW5Db2RlLkZuICovLCAnRm4nLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgNCAvKiBTY2FuQ29kZS5GbkxvY2sgKi8sICdGbkxvY2snLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgNSAvKiBTY2FuQ29kZS5TdXNwZW5kICovLCAnU3VzcGVuZCcsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA2IC8qIFNjYW5Db2RlLlJlc3VtZSAqLywgJ1Jlc3VtZScsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA3IC8qIFNjYW5Db2RlLlR1cmJvICovLCAnVHVyYm8nLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgOCAvKiBTY2FuQ29kZS5TbGVlcCAqLywgJ1NsZWVwJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfU0xFRVAnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgOSAvKiBTY2FuQ29kZS5XYWtlVXAgKi8sICdXYWtlVXAnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMTAgLyogU2NhbkNvZGUuS2V5QSAqLywgJ0tleUEnLCAzMSAvKiBLZXlDb2RlLktleUEgKi8sICdBJywgNjUsICdWS19BJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDExIC8qIFNjYW5Db2RlLktleUIgKi8sICdLZXlCJywgMzIgLyogS2V5Q29kZS5LZXlCICovLCAnQicsIDY2LCAnVktfQicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAxMiAvKiBTY2FuQ29kZS5LZXlDICovLCAnS2V5QycsIDMzIC8qIEtleUNvZGUuS2V5QyAqLywgJ0MnLCA2NywgJ1ZLX0MnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMTMgLyogU2NhbkNvZGUuS2V5RCAqLywgJ0tleUQnLCAzNCAvKiBLZXlDb2RlLktleUQgKi8sICdEJywgNjgsICdWS19EJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDE0IC8qIFNjYW5Db2RlLktleUUgKi8sICdLZXlFJywgMzUgLyogS2V5Q29kZS5LZXlFICovLCAnRScsIDY5LCAnVktfRScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAxNSAvKiBTY2FuQ29kZS5LZXlGICovLCAnS2V5RicsIDM2IC8qIEtleUNvZGUuS2V5RiAqLywgJ0YnLCA3MCwgJ1ZLX0YnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMTYgLyogU2NhbkNvZGUuS2V5RyAqLywgJ0tleUcnLCAzNyAvKiBLZXlDb2RlLktleUcgKi8sICdHJywgNzEsICdWS19HJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDE3IC8qIFNjYW5Db2RlLktleUggKi8sICdLZXlIJywgMzggLyogS2V5Q29kZS5LZXlIICovLCAnSCcsIDcyLCAnVktfSCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAxOCAvKiBTY2FuQ29kZS5LZXlJICovLCAnS2V5SScsIDM5IC8qIEtleUNvZGUuS2V5SSAqLywgJ0knLCA3MywgJ1ZLX0knLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMTkgLyogU2NhbkNvZGUuS2V5SiAqLywgJ0tleUonLCA0MCAvKiBLZXlDb2RlLktleUogKi8sICdKJywgNzQsICdWS19KJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDIwIC8qIFNjYW5Db2RlLktleUsgKi8sICdLZXlLJywgNDEgLyogS2V5Q29kZS5LZXlLICovLCAnSycsIDc1LCAnVktfSycsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAyMSAvKiBTY2FuQ29kZS5LZXlMICovLCAnS2V5TCcsIDQyIC8qIEtleUNvZGUuS2V5TCAqLywgJ0wnLCA3NiwgJ1ZLX0wnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMjIgLyogU2NhbkNvZGUuS2V5TSAqLywgJ0tleU0nLCA0MyAvKiBLZXlDb2RlLktleU0gKi8sICdNJywgNzcsICdWS19NJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDIzIC8qIFNjYW5Db2RlLktleU4gKi8sICdLZXlOJywgNDQgLyogS2V5Q29kZS5LZXlOICovLCAnTicsIDc4LCAnVktfTicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAyNCAvKiBTY2FuQ29kZS5LZXlPICovLCAnS2V5TycsIDQ1IC8qIEtleUNvZGUuS2V5TyAqLywgJ08nLCA3OSwgJ1ZLX08nLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMjUgLyogU2NhbkNvZGUuS2V5UCAqLywgJ0tleVAnLCA0NiAvKiBLZXlDb2RlLktleVAgKi8sICdQJywgODAsICdWS19QJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDI2IC8qIFNjYW5Db2RlLktleVEgKi8sICdLZXlRJywgNDcgLyogS2V5Q29kZS5LZXlRICovLCAnUScsIDgxLCAnVktfUScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAyNyAvKiBTY2FuQ29kZS5LZXlSICovLCAnS2V5UicsIDQ4IC8qIEtleUNvZGUuS2V5UiAqLywgJ1InLCA4MiwgJ1ZLX1InLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMjggLyogU2NhbkNvZGUuS2V5UyAqLywgJ0tleVMnLCA0OSAvKiBLZXlDb2RlLktleVMgKi8sICdTJywgODMsICdWS19TJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDI5IC8qIFNjYW5Db2RlLktleVQgKi8sICdLZXlUJywgNTAgLyogS2V5Q29kZS5LZXlUICovLCAnVCcsIDg0LCAnVktfVCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAzMCAvKiBTY2FuQ29kZS5LZXlVICovLCAnS2V5VScsIDUxIC8qIEtleUNvZGUuS2V5VSAqLywgJ1UnLCA4NSwgJ1ZLX1UnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMzEgLyogU2NhbkNvZGUuS2V5ViAqLywgJ0tleVYnLCA1MiAvKiBLZXlDb2RlLktleVYgKi8sICdWJywgODYsICdWS19WJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDMyIC8qIFNjYW5Db2RlLktleVcgKi8sICdLZXlXJywgNTMgLyogS2V5Q29kZS5LZXlXICovLCAnVycsIDg3LCAnVktfVycsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAzMyAvKiBTY2FuQ29kZS5LZXlYICovLCAnS2V5WCcsIDU0IC8qIEtleUNvZGUuS2V5WCAqLywgJ1gnLCA4OCwgJ1ZLX1gnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMzQgLyogU2NhbkNvZGUuS2V5WSAqLywgJ0tleVknLCA1NSAvKiBLZXlDb2RlLktleVkgKi8sICdZJywgODksICdWS19ZJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDM1IC8qIFNjYW5Db2RlLktleVogKi8sICdLZXlaJywgNTYgLyogS2V5Q29kZS5LZXlaICovLCAnWicsIDkwLCAnVktfWicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAzNiAvKiBTY2FuQ29kZS5EaWdpdDEgKi8sICdEaWdpdDEnLCAyMiAvKiBLZXlDb2RlLkRpZ2l0MSAqLywgJzEnLCA0OSwgJ1ZLXzEnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgMzcgLyogU2NhbkNvZGUuRGlnaXQyICovLCAnRGlnaXQyJywgMjMgLyogS2V5Q29kZS5EaWdpdDIgKi8sICcyJywgNTAsICdWS18yJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDM4IC8qIFNjYW5Db2RlLkRpZ2l0MyAqLywgJ0RpZ2l0MycsIDI0IC8qIEtleUNvZGUuRGlnaXQzICovLCAnMycsIDUxLCAnVktfMycsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAzOSAvKiBTY2FuQ29kZS5EaWdpdDQgKi8sICdEaWdpdDQnLCAyNSAvKiBLZXlDb2RlLkRpZ2l0NCAqLywgJzQnLCA1MiwgJ1ZLXzQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgNDAgLyogU2NhbkNvZGUuRGlnaXQ1ICovLCAnRGlnaXQ1JywgMjYgLyogS2V5Q29kZS5EaWdpdDUgKi8sICc1JywgNTMsICdWS181JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDQxIC8qIFNjYW5Db2RlLkRpZ2l0NiAqLywgJ0RpZ2l0NicsIDI3IC8qIEtleUNvZGUuRGlnaXQ2ICovLCAnNicsIDU0LCAnVktfNicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCA0MiAvKiBTY2FuQ29kZS5EaWdpdDcgKi8sICdEaWdpdDcnLCAyOCAvKiBLZXlDb2RlLkRpZ2l0NyAqLywgJzcnLCA1NSwgJ1ZLXzcnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgNDMgLyogU2NhbkNvZGUuRGlnaXQ4ICovLCAnRGlnaXQ4JywgMjkgLyogS2V5Q29kZS5EaWdpdDggKi8sICc4JywgNTYsICdWS184JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDQ0IC8qIFNjYW5Db2RlLkRpZ2l0OSAqLywgJ0RpZ2l0OScsIDMwIC8qIEtleUNvZGUuRGlnaXQ5ICovLCAnOScsIDU3LCAnVktfOScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCA0NSAvKiBTY2FuQ29kZS5EaWdpdDAgKi8sICdEaWdpdDAnLCAyMSAvKiBLZXlDb2RlLkRpZ2l0MCAqLywgJzAnLCA0OCwgJ1ZLXzAnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgNDYgLyogU2NhbkNvZGUuRW50ZXIgKi8sICdFbnRlcicsIDMgLyogS2V5Q29kZS5FbnRlciAqLywgJ0VudGVyJywgMTMsICdWS19SRVRVUk4nLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgNDcgLyogU2NhbkNvZGUuRXNjYXBlICovLCAnRXNjYXBlJywgOSAvKiBLZXlDb2RlLkVzY2FwZSAqLywgJ0VzY2FwZScsIDI3LCAnVktfRVNDQVBFJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDQ4IC8qIFNjYW5Db2RlLkJhY2tzcGFjZSAqLywgJ0JhY2tzcGFjZScsIDEgLyogS2V5Q29kZS5CYWNrc3BhY2UgKi8sICdCYWNrc3BhY2UnLCA4LCAnVktfQkFDSycsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA0OSAvKiBTY2FuQ29kZS5UYWIgKi8sICdUYWInLCAyIC8qIEtleUNvZGUuVGFiICovLCAnVGFiJywgOSwgJ1ZLX1RBQicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA1MCAvKiBTY2FuQ29kZS5TcGFjZSAqLywgJ1NwYWNlJywgMTAgLyogS2V5Q29kZS5TcGFjZSAqLywgJ1NwYWNlJywgMzIsICdWS19TUEFDRScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCA1MSAvKiBTY2FuQ29kZS5NaW51cyAqLywgJ01pbnVzJywgODggLyogS2V5Q29kZS5NaW51cyAqLywgJy0nLCAxODksICdWS19PRU1fTUlOVVMnLCAnLScsICdPRU1fTUlOVVMnXSxcbiAgICAgICAgWzAsIDUyIC8qIFNjYW5Db2RlLkVxdWFsICovLCAnRXF1YWwnLCA4NiAvKiBLZXlDb2RlLkVxdWFsICovLCAnPScsIDE4NywgJ1ZLX09FTV9QTFVTJywgJz0nLCAnT0VNX1BMVVMnXSxcbiAgICAgICAgWzAsIDUzIC8qIFNjYW5Db2RlLkJyYWNrZXRMZWZ0ICovLCAnQnJhY2tldExlZnQnLCA5MiAvKiBLZXlDb2RlLkJyYWNrZXRMZWZ0ICovLCAnWycsIDIxOSwgJ1ZLX09FTV80JywgJ1snLCAnT0VNXzQnXSxcbiAgICAgICAgWzAsIDU0IC8qIFNjYW5Db2RlLkJyYWNrZXRSaWdodCAqLywgJ0JyYWNrZXRSaWdodCcsIDk0IC8qIEtleUNvZGUuQnJhY2tldFJpZ2h0ICovLCAnXScsIDIyMSwgJ1ZLX09FTV82JywgJ10nLCAnT0VNXzYnXSxcbiAgICAgICAgWzAsIDU1IC8qIFNjYW5Db2RlLkJhY2tzbGFzaCAqLywgJ0JhY2tzbGFzaCcsIDkzIC8qIEtleUNvZGUuQmFja3NsYXNoICovLCAnXFxcXCcsIDIyMCwgJ1ZLX09FTV81JywgJ1xcXFwnLCAnT0VNXzUnXSxcbiAgICAgICAgWzAsIDU2IC8qIFNjYW5Db2RlLkludGxIYXNoICovLCAnSW50bEhhc2gnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMCwgNTcgLyogU2NhbkNvZGUuU2VtaWNvbG9uICovLCAnU2VtaWNvbG9uJywgODUgLyogS2V5Q29kZS5TZW1pY29sb24gKi8sICc7JywgMTg2LCAnVktfT0VNXzEnLCAnOycsICdPRU1fMSddLFxuICAgICAgICBbMCwgNTggLyogU2NhbkNvZGUuUXVvdGUgKi8sICdRdW90ZScsIDk1IC8qIEtleUNvZGUuUXVvdGUgKi8sICdcXCcnLCAyMjIsICdWS19PRU1fNycsICdcXCcnLCAnT0VNXzcnXSxcbiAgICAgICAgWzAsIDU5IC8qIFNjYW5Db2RlLkJhY2txdW90ZSAqLywgJ0JhY2txdW90ZScsIDkxIC8qIEtleUNvZGUuQmFja3F1b3RlICovLCAnYCcsIDE5MiwgJ1ZLX09FTV8zJywgJ2AnLCAnT0VNXzMnXSxcbiAgICAgICAgWzAsIDYwIC8qIFNjYW5Db2RlLkNvbW1hICovLCAnQ29tbWEnLCA4NyAvKiBLZXlDb2RlLkNvbW1hICovLCAnLCcsIDE4OCwgJ1ZLX09FTV9DT01NQScsICcsJywgJ09FTV9DT01NQSddLFxuICAgICAgICBbMCwgNjEgLyogU2NhbkNvZGUuUGVyaW9kICovLCAnUGVyaW9kJywgODkgLyogS2V5Q29kZS5QZXJpb2QgKi8sICcuJywgMTkwLCAnVktfT0VNX1BFUklPRCcsICcuJywgJ09FTV9QRVJJT0QnXSxcbiAgICAgICAgWzAsIDYyIC8qIFNjYW5Db2RlLlNsYXNoICovLCAnU2xhc2gnLCA5MCAvKiBLZXlDb2RlLlNsYXNoICovLCAnLycsIDE5MSwgJ1ZLX09FTV8yJywgJy8nLCAnT0VNXzInXSxcbiAgICAgICAgWzEsIDYzIC8qIFNjYW5Db2RlLkNhcHNMb2NrICovLCAnQ2Fwc0xvY2snLCA4IC8qIEtleUNvZGUuQ2Fwc0xvY2sgKi8sICdDYXBzTG9jaycsIDIwLCAnVktfQ0FQSVRBTCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA2NCAvKiBTY2FuQ29kZS5GMSAqLywgJ0YxJywgNTkgLyogS2V5Q29kZS5GMSAqLywgJ0YxJywgMTEyLCAnVktfRjEnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgNjUgLyogU2NhbkNvZGUuRjIgKi8sICdGMicsIDYwIC8qIEtleUNvZGUuRjIgKi8sICdGMicsIDExMywgJ1ZLX0YyJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDY2IC8qIFNjYW5Db2RlLkYzICovLCAnRjMnLCA2MSAvKiBLZXlDb2RlLkYzICovLCAnRjMnLCAxMTQsICdWS19GMycsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA2NyAvKiBTY2FuQ29kZS5GNCAqLywgJ0Y0JywgNjIgLyogS2V5Q29kZS5GNCAqLywgJ0Y0JywgMTE1LCAnVktfRjQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgNjggLyogU2NhbkNvZGUuRjUgKi8sICdGNScsIDYzIC8qIEtleUNvZGUuRjUgKi8sICdGNScsIDExNiwgJ1ZLX0Y1JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDY5IC8qIFNjYW5Db2RlLkY2ICovLCAnRjYnLCA2NCAvKiBLZXlDb2RlLkY2ICovLCAnRjYnLCAxMTcsICdWS19GNicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA3MCAvKiBTY2FuQ29kZS5GNyAqLywgJ0Y3JywgNjUgLyogS2V5Q29kZS5GNyAqLywgJ0Y3JywgMTE4LCAnVktfRjcnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgNzEgLyogU2NhbkNvZGUuRjggKi8sICdGOCcsIDY2IC8qIEtleUNvZGUuRjggKi8sICdGOCcsIDExOSwgJ1ZLX0Y4JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDcyIC8qIFNjYW5Db2RlLkY5ICovLCAnRjknLCA2NyAvKiBLZXlDb2RlLkY5ICovLCAnRjknLCAxMjAsICdWS19GOScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA3MyAvKiBTY2FuQ29kZS5GMTAgKi8sICdGMTAnLCA2OCAvKiBLZXlDb2RlLkYxMCAqLywgJ0YxMCcsIDEyMSwgJ1ZLX0YxMCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA3NCAvKiBTY2FuQ29kZS5GMTEgKi8sICdGMTEnLCA2OSAvKiBLZXlDb2RlLkYxMSAqLywgJ0YxMScsIDEyMiwgJ1ZLX0YxMScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA3NSAvKiBTY2FuQ29kZS5GMTIgKi8sICdGMTInLCA3MCAvKiBLZXlDb2RlLkYxMiAqLywgJ0YxMicsIDEyMywgJ1ZLX0YxMicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA3NiAvKiBTY2FuQ29kZS5QcmludFNjcmVlbiAqLywgJ1ByaW50U2NyZWVuJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDc3IC8qIFNjYW5Db2RlLlNjcm9sbExvY2sgKi8sICdTY3JvbGxMb2NrJywgODQgLyogS2V5Q29kZS5TY3JvbGxMb2NrICovLCAnU2Nyb2xsTG9jaycsIDE0NSwgJ1ZLX1NDUk9MTCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA3OCAvKiBTY2FuQ29kZS5QYXVzZSAqLywgJ1BhdXNlJywgNyAvKiBLZXlDb2RlLlBhdXNlQnJlYWsgKi8sICdQYXVzZUJyZWFrJywgMTksICdWS19QQVVTRScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA3OSAvKiBTY2FuQ29kZS5JbnNlcnQgKi8sICdJbnNlcnQnLCAxOSAvKiBLZXlDb2RlLkluc2VydCAqLywgJ0luc2VydCcsIDQ1LCAnVktfSU5TRVJUJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDgwIC8qIFNjYW5Db2RlLkhvbWUgKi8sICdIb21lJywgMTQgLyogS2V5Q29kZS5Ib21lICovLCAnSG9tZScsIDM2LCAnVktfSE9NRScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA4MSAvKiBTY2FuQ29kZS5QYWdlVXAgKi8sICdQYWdlVXAnLCAxMSAvKiBLZXlDb2RlLlBhZ2VVcCAqLywgJ1BhZ2VVcCcsIDMzLCAnVktfUFJJT1InLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgODIgLyogU2NhbkNvZGUuRGVsZXRlICovLCAnRGVsZXRlJywgMjAgLyogS2V5Q29kZS5EZWxldGUgKi8sICdEZWxldGUnLCA0NiwgJ1ZLX0RFTEVURScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA4MyAvKiBTY2FuQ29kZS5FbmQgKi8sICdFbmQnLCAxMyAvKiBLZXlDb2RlLkVuZCAqLywgJ0VuZCcsIDM1LCAnVktfRU5EJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDg0IC8qIFNjYW5Db2RlLlBhZ2VEb3duICovLCAnUGFnZURvd24nLCAxMiAvKiBLZXlDb2RlLlBhZ2VEb3duICovLCAnUGFnZURvd24nLCAzNCwgJ1ZLX05FWFQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgODUgLyogU2NhbkNvZGUuQXJyb3dSaWdodCAqLywgJ0Fycm93UmlnaHQnLCAxNyAvKiBLZXlDb2RlLlJpZ2h0QXJyb3cgKi8sICdSaWdodEFycm93JywgMzksICdWS19SSUdIVCcsICdSaWdodCcsIGVtcHR5XSxcbiAgICAgICAgWzEsIDg2IC8qIFNjYW5Db2RlLkFycm93TGVmdCAqLywgJ0Fycm93TGVmdCcsIDE1IC8qIEtleUNvZGUuTGVmdEFycm93ICovLCAnTGVmdEFycm93JywgMzcsICdWS19MRUZUJywgJ0xlZnQnLCBlbXB0eV0sXG4gICAgICAgIFsxLCA4NyAvKiBTY2FuQ29kZS5BcnJvd0Rvd24gKi8sICdBcnJvd0Rvd24nLCAxOCAvKiBLZXlDb2RlLkRvd25BcnJvdyAqLywgJ0Rvd25BcnJvdycsIDQwLCAnVktfRE9XTicsICdEb3duJywgZW1wdHldLFxuICAgICAgICBbMSwgODggLyogU2NhbkNvZGUuQXJyb3dVcCAqLywgJ0Fycm93VXAnLCAxNiAvKiBLZXlDb2RlLlVwQXJyb3cgKi8sICdVcEFycm93JywgMzgsICdWS19VUCcsICdVcCcsIGVtcHR5XSxcbiAgICAgICAgWzEsIDg5IC8qIFNjYW5Db2RlLk51bUxvY2sgKi8sICdOdW1Mb2NrJywgODMgLyogS2V5Q29kZS5OdW1Mb2NrICovLCAnTnVtTG9jaycsIDE0NCwgJ1ZLX05VTUxPQ0snLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgOTAgLyogU2NhbkNvZGUuTnVtcGFkRGl2aWRlICovLCAnTnVtcGFkRGl2aWRlJywgMTEzIC8qIEtleUNvZGUuTnVtcGFkRGl2aWRlICovLCAnTnVtUGFkX0RpdmlkZScsIDExMSwgJ1ZLX0RJVklERScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA5MSAvKiBTY2FuQ29kZS5OdW1wYWRNdWx0aXBseSAqLywgJ051bXBhZE11bHRpcGx5JywgMTA4IC8qIEtleUNvZGUuTnVtcGFkTXVsdGlwbHkgKi8sICdOdW1QYWRfTXVsdGlwbHknLCAxMDYsICdWS19NVUxUSVBMWScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA5MiAvKiBTY2FuQ29kZS5OdW1wYWRTdWJ0cmFjdCAqLywgJ051bXBhZFN1YnRyYWN0JywgMTExIC8qIEtleUNvZGUuTnVtcGFkU3VidHJhY3QgKi8sICdOdW1QYWRfU3VidHJhY3QnLCAxMDksICdWS19TVUJUUkFDVCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA5MyAvKiBTY2FuQ29kZS5OdW1wYWRBZGQgKi8sICdOdW1wYWRBZGQnLCAxMDkgLyogS2V5Q29kZS5OdW1wYWRBZGQgKi8sICdOdW1QYWRfQWRkJywgMTA3LCAnVktfQUREJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDk0IC8qIFNjYW5Db2RlLk51bXBhZEVudGVyICovLCAnTnVtcGFkRW50ZXInLCAzIC8qIEtleUNvZGUuRW50ZXIgKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDk1IC8qIFNjYW5Db2RlLk51bXBhZDEgKi8sICdOdW1wYWQxJywgOTkgLyogS2V5Q29kZS5OdW1wYWQxICovLCAnTnVtUGFkMScsIDk3LCAnVktfTlVNUEFEMScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCA5NiAvKiBTY2FuQ29kZS5OdW1wYWQyICovLCAnTnVtcGFkMicsIDEwMCAvKiBLZXlDb2RlLk51bXBhZDIgKi8sICdOdW1QYWQyJywgOTgsICdWS19OVU1QQUQyJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDk3IC8qIFNjYW5Db2RlLk51bXBhZDMgKi8sICdOdW1wYWQzJywgMTAxIC8qIEtleUNvZGUuTnVtcGFkMyAqLywgJ051bVBhZDMnLCA5OSwgJ1ZLX05VTVBBRDMnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgOTggLyogU2NhbkNvZGUuTnVtcGFkNCAqLywgJ051bXBhZDQnLCAxMDIgLyogS2V5Q29kZS5OdW1wYWQ0ICovLCAnTnVtUGFkNCcsIDEwMCwgJ1ZLX05VTVBBRDQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgOTkgLyogU2NhbkNvZGUuTnVtcGFkNSAqLywgJ051bXBhZDUnLCAxMDMgLyogS2V5Q29kZS5OdW1wYWQ1ICovLCAnTnVtUGFkNScsIDEwMSwgJ1ZLX05VTVBBRDUnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTAwIC8qIFNjYW5Db2RlLk51bXBhZDYgKi8sICdOdW1wYWQ2JywgMTA0IC8qIEtleUNvZGUuTnVtcGFkNiAqLywgJ051bVBhZDYnLCAxMDIsICdWS19OVU1QQUQ2JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDEwMSAvKiBTY2FuQ29kZS5OdW1wYWQ3ICovLCAnTnVtcGFkNycsIDEwNSAvKiBLZXlDb2RlLk51bXBhZDcgKi8sICdOdW1QYWQ3JywgMTAzLCAnVktfTlVNUEFENycsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMDIgLyogU2NhbkNvZGUuTnVtcGFkOCAqLywgJ051bXBhZDgnLCAxMDYgLyogS2V5Q29kZS5OdW1wYWQ4ICovLCAnTnVtUGFkOCcsIDEwNCwgJ1ZLX05VTVBBRDgnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTAzIC8qIFNjYW5Db2RlLk51bXBhZDkgKi8sICdOdW1wYWQ5JywgMTA3IC8qIEtleUNvZGUuTnVtcGFkOSAqLywgJ051bVBhZDknLCAxMDUsICdWS19OVU1QQUQ5JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDEwNCAvKiBTY2FuQ29kZS5OdW1wYWQwICovLCAnTnVtcGFkMCcsIDk4IC8qIEtleUNvZGUuTnVtcGFkMCAqLywgJ051bVBhZDAnLCA5NiwgJ1ZLX05VTVBBRDAnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTA1IC8qIFNjYW5Db2RlLk51bXBhZERlY2ltYWwgKi8sICdOdW1wYWREZWNpbWFsJywgMTEyIC8qIEtleUNvZGUuTnVtcGFkRGVjaW1hbCAqLywgJ051bVBhZF9EZWNpbWFsJywgMTEwLCAnVktfREVDSU1BTCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAxMDYgLyogU2NhbkNvZGUuSW50bEJhY2tzbGFzaCAqLywgJ0ludGxCYWNrc2xhc2gnLCA5NyAvKiBLZXlDb2RlLkludGxCYWNrc2xhc2ggKi8sICdPRU1fMTAyJywgMjI2LCAnVktfT0VNXzEwMicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMDcgLyogU2NhbkNvZGUuQ29udGV4dE1lbnUgKi8sICdDb250ZXh0TWVudScsIDU4IC8qIEtleUNvZGUuQ29udGV4dE1lbnUgKi8sICdDb250ZXh0TWVudScsIDkzLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDEwOCAvKiBTY2FuQ29kZS5Qb3dlciAqLywgJ1Bvd2VyJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDEwOSAvKiBTY2FuQ29kZS5OdW1wYWRFcXVhbCAqLywgJ051bXBhZEVxdWFsJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDExMCAvKiBTY2FuQ29kZS5GMTMgKi8sICdGMTMnLCA3MSAvKiBLZXlDb2RlLkYxMyAqLywgJ0YxMycsIDEyNCwgJ1ZLX0YxMycsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMTEgLyogU2NhbkNvZGUuRjE0ICovLCAnRjE0JywgNzIgLyogS2V5Q29kZS5GMTQgKi8sICdGMTQnLCAxMjUsICdWS19GMTQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTEyIC8qIFNjYW5Db2RlLkYxNSAqLywgJ0YxNScsIDczIC8qIEtleUNvZGUuRjE1ICovLCAnRjE1JywgMTI2LCAnVktfRjE1JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDExMyAvKiBTY2FuQ29kZS5GMTYgKi8sICdGMTYnLCA3NCAvKiBLZXlDb2RlLkYxNiAqLywgJ0YxNicsIDEyNywgJ1ZLX0YxNicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMTQgLyogU2NhbkNvZGUuRjE3ICovLCAnRjE3JywgNzUgLyogS2V5Q29kZS5GMTcgKi8sICdGMTcnLCAxMjgsICdWS19GMTcnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTE1IC8qIFNjYW5Db2RlLkYxOCAqLywgJ0YxOCcsIDc2IC8qIEtleUNvZGUuRjE4ICovLCAnRjE4JywgMTI5LCAnVktfRjE4JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDExNiAvKiBTY2FuQ29kZS5GMTkgKi8sICdGMTknLCA3NyAvKiBLZXlDb2RlLkYxOSAqLywgJ0YxOScsIDEzMCwgJ1ZLX0YxOScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMTcgLyogU2NhbkNvZGUuRjIwICovLCAnRjIwJywgNzggLyogS2V5Q29kZS5GMjAgKi8sICdGMjAnLCAxMzEsICdWS19GMjAnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTE4IC8qIFNjYW5Db2RlLkYyMSAqLywgJ0YyMScsIDc5IC8qIEtleUNvZGUuRjIxICovLCAnRjIxJywgMTMyLCAnVktfRjIxJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDExOSAvKiBTY2FuQ29kZS5GMjIgKi8sICdGMjInLCA4MCAvKiBLZXlDb2RlLkYyMiAqLywgJ0YyMicsIDEzMywgJ1ZLX0YyMicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMjAgLyogU2NhbkNvZGUuRjIzICovLCAnRjIzJywgODEgLyogS2V5Q29kZS5GMjMgKi8sICdGMjMnLCAxMzQsICdWS19GMjMnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTIxIC8qIFNjYW5Db2RlLkYyNCAqLywgJ0YyNCcsIDgyIC8qIEtleUNvZGUuRjI0ICovLCAnRjI0JywgMTM1LCAnVktfRjI0JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDEyMiAvKiBTY2FuQ29kZS5PcGVuICovLCAnT3BlbicsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMjMgLyogU2NhbkNvZGUuSGVscCAqLywgJ0hlbHAnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTI0IC8qIFNjYW5Db2RlLlNlbGVjdCAqLywgJ1NlbGVjdCcsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMjUgLyogU2NhbkNvZGUuQWdhaW4gKi8sICdBZ2FpbicsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMjYgLyogU2NhbkNvZGUuVW5kbyAqLywgJ1VuZG8nLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTI3IC8qIFNjYW5Db2RlLkN1dCAqLywgJ0N1dCcsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMjggLyogU2NhbkNvZGUuQ29weSAqLywgJ0NvcHknLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTI5IC8qIFNjYW5Db2RlLlBhc3RlICovLCAnUGFzdGUnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTMwIC8qIFNjYW5Db2RlLkZpbmQgKi8sICdGaW5kJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDEzMSAvKiBTY2FuQ29kZS5BdWRpb1ZvbHVtZU11dGUgKi8sICdBdWRpb1ZvbHVtZU11dGUnLCAxMTcgLyogS2V5Q29kZS5BdWRpb1ZvbHVtZU11dGUgKi8sICdBdWRpb1ZvbHVtZU11dGUnLCAxNzMsICdWS19WT0xVTUVfTVVURScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMzIgLyogU2NhbkNvZGUuQXVkaW9Wb2x1bWVVcCAqLywgJ0F1ZGlvVm9sdW1lVXAnLCAxMTggLyogS2V5Q29kZS5BdWRpb1ZvbHVtZVVwICovLCAnQXVkaW9Wb2x1bWVVcCcsIDE3NSwgJ1ZLX1ZPTFVNRV9VUCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMzMgLyogU2NhbkNvZGUuQXVkaW9Wb2x1bWVEb3duICovLCAnQXVkaW9Wb2x1bWVEb3duJywgMTE5IC8qIEtleUNvZGUuQXVkaW9Wb2x1bWVEb3duICovLCAnQXVkaW9Wb2x1bWVEb3duJywgMTc0LCAnVktfVk9MVU1FX0RPV04nLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTM0IC8qIFNjYW5Db2RlLk51bXBhZENvbW1hICovLCAnTnVtcGFkQ29tbWEnLCAxMTAgLyogS2V5Q29kZS5OVU1QQURfU0VQQVJBVE9SICovLCAnTnVtUGFkX1NlcGFyYXRvcicsIDEwOCwgJ1ZLX1NFUEFSQVRPUicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFswLCAxMzUgLyogU2NhbkNvZGUuSW50bFJvICovLCAnSW50bFJvJywgMTE1IC8qIEtleUNvZGUuQUJOVF9DMSAqLywgJ0FCTlRfQzEnLCAxOTMsICdWS19BQk5UX0MxJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDEzNiAvKiBTY2FuQ29kZS5LYW5hTW9kZSAqLywgJ0thbmFNb2RlJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzAsIDEzNyAvKiBTY2FuQ29kZS5JbnRsWWVuICovLCAnSW50bFllbicsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxMzggLyogU2NhbkNvZGUuQ29udmVydCAqLywgJ0NvbnZlcnQnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTM5IC8qIFNjYW5Db2RlLk5vbkNvbnZlcnQgKi8sICdOb25Db252ZXJ0JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0MCAvKiBTY2FuQ29kZS5MYW5nMSAqLywgJ0xhbmcxJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0MSAvKiBTY2FuQ29kZS5MYW5nMiAqLywgJ0xhbmcyJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0MiAvKiBTY2FuQ29kZS5MYW5nMyAqLywgJ0xhbmczJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0MyAvKiBTY2FuQ29kZS5MYW5nNCAqLywgJ0xhbmc0JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0NCAvKiBTY2FuQ29kZS5MYW5nNSAqLywgJ0xhbmc1JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0NSAvKiBTY2FuQ29kZS5BYm9ydCAqLywgJ0Fib3J0JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0NiAvKiBTY2FuQ29kZS5Qcm9wcyAqLywgJ1Byb3BzJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0NyAvKiBTY2FuQ29kZS5OdW1wYWRQYXJlbkxlZnQgKi8sICdOdW1wYWRQYXJlbkxlZnQnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTQ4IC8qIFNjYW5Db2RlLk51bXBhZFBhcmVuUmlnaHQgKi8sICdOdW1wYWRQYXJlblJpZ2h0JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE0OSAvKiBTY2FuQ29kZS5OdW1wYWRCYWNrc3BhY2UgKi8sICdOdW1wYWRCYWNrc3BhY2UnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTUwIC8qIFNjYW5Db2RlLk51bXBhZE1lbW9yeVN0b3JlICovLCAnTnVtcGFkTWVtb3J5U3RvcmUnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTUxIC8qIFNjYW5Db2RlLk51bXBhZE1lbW9yeVJlY2FsbCAqLywgJ051bXBhZE1lbW9yeVJlY2FsbCcsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNTIgLyogU2NhbkNvZGUuTnVtcGFkTWVtb3J5Q2xlYXIgKi8sICdOdW1wYWRNZW1vcnlDbGVhcicsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNTMgLyogU2NhbkNvZGUuTnVtcGFkTWVtb3J5QWRkICovLCAnTnVtcGFkTWVtb3J5QWRkJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE1NCAvKiBTY2FuQ29kZS5OdW1wYWRNZW1vcnlTdWJ0cmFjdCAqLywgJ051bXBhZE1lbW9yeVN1YnRyYWN0JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE1NSAvKiBTY2FuQ29kZS5OdW1wYWRDbGVhciAqLywgJ051bXBhZENsZWFyJywgMTMxIC8qIEtleUNvZGUuQ2xlYXIgKi8sICdDbGVhcicsIDEyLCAnVktfQ0xFQVInLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTU2IC8qIFNjYW5Db2RlLk51bXBhZENsZWFyRW50cnkgKi8sICdOdW1wYWRDbGVhckVudHJ5JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDUgLyogS2V5Q29kZS5DdHJsICovLCAnQ3RybCcsIDE3LCAnVktfQ09OVFJPTCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCA0IC8qIEtleUNvZGUuU2hpZnQgKi8sICdTaGlmdCcsIDE2LCAnVktfU0hJRlQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgNiAvKiBLZXlDb2RlLkFsdCAqLywgJ0FsdCcsIDE4LCAnVktfTUVOVScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCA1NyAvKiBLZXlDb2RlLk1ldGEgKi8sICdNZXRhJywgOTEsICdWS19DT01NQU5EJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE1NyAvKiBTY2FuQ29kZS5Db250cm9sTGVmdCAqLywgJ0NvbnRyb2xMZWZ0JywgNSAvKiBLZXlDb2RlLkN0cmwgKi8sIGVtcHR5LCAwLCAnVktfTENPTlRST0wnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTU4IC8qIFNjYW5Db2RlLlNoaWZ0TGVmdCAqLywgJ1NoaWZ0TGVmdCcsIDQgLyogS2V5Q29kZS5TaGlmdCAqLywgZW1wdHksIDAsICdWS19MU0hJRlQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTU5IC8qIFNjYW5Db2RlLkFsdExlZnQgKi8sICdBbHRMZWZ0JywgNiAvKiBLZXlDb2RlLkFsdCAqLywgZW1wdHksIDAsICdWS19MTUVOVScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNjAgLyogU2NhbkNvZGUuTWV0YUxlZnQgKi8sICdNZXRhTGVmdCcsIDU3IC8qIEtleUNvZGUuTWV0YSAqLywgZW1wdHksIDAsICdWS19MV0lOJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE2MSAvKiBTY2FuQ29kZS5Db250cm9sUmlnaHQgKi8sICdDb250cm9sUmlnaHQnLCA1IC8qIEtleUNvZGUuQ3RybCAqLywgZW1wdHksIDAsICdWS19SQ09OVFJPTCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNjIgLyogU2NhbkNvZGUuU2hpZnRSaWdodCAqLywgJ1NoaWZ0UmlnaHQnLCA0IC8qIEtleUNvZGUuU2hpZnQgKi8sIGVtcHR5LCAwLCAnVktfUlNISUZUJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE2MyAvKiBTY2FuQ29kZS5BbHRSaWdodCAqLywgJ0FsdFJpZ2h0JywgNiAvKiBLZXlDb2RlLkFsdCAqLywgZW1wdHksIDAsICdWS19STUVOVScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNjQgLyogU2NhbkNvZGUuTWV0YVJpZ2h0ICovLCAnTWV0YVJpZ2h0JywgNTcgLyogS2V5Q29kZS5NZXRhICovLCBlbXB0eSwgMCwgJ1ZLX1JXSU4nLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTY1IC8qIFNjYW5Db2RlLkJyaWdodG5lc3NVcCAqLywgJ0JyaWdodG5lc3NVcCcsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNjYgLyogU2NhbkNvZGUuQnJpZ2h0bmVzc0Rvd24gKi8sICdCcmlnaHRuZXNzRG93bicsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNjcgLyogU2NhbkNvZGUuTWVkaWFQbGF5ICovLCAnTWVkaWFQbGF5JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE2OCAvKiBTY2FuQ29kZS5NZWRpYVJlY29yZCAqLywgJ01lZGlhUmVjb3JkJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE2OSAvKiBTY2FuQ29kZS5NZWRpYUZhc3RGb3J3YXJkICovLCAnTWVkaWFGYXN0Rm9yd2FyZCcsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNzAgLyogU2NhbkNvZGUuTWVkaWFSZXdpbmQgKi8sICdNZWRpYVJld2luZCcsIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNzEgLyogU2NhbkNvZGUuTWVkaWFUcmFja05leHQgKi8sICdNZWRpYVRyYWNrTmV4dCcsIDEyNCAvKiBLZXlDb2RlLk1lZGlhVHJhY2tOZXh0ICovLCAnTWVkaWFUcmFja05leHQnLCAxNzYsICdWS19NRURJQV9ORVhUX1RSQUNLJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE3MiAvKiBTY2FuQ29kZS5NZWRpYVRyYWNrUHJldmlvdXMgKi8sICdNZWRpYVRyYWNrUHJldmlvdXMnLCAxMjUgLyogS2V5Q29kZS5NZWRpYVRyYWNrUHJldmlvdXMgKi8sICdNZWRpYVRyYWNrUHJldmlvdXMnLCAxNzcsICdWS19NRURJQV9QUkVWX1RSQUNLJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE3MyAvKiBTY2FuQ29kZS5NZWRpYVN0b3AgKi8sICdNZWRpYVN0b3AnLCAxMjYgLyogS2V5Q29kZS5NZWRpYVN0b3AgKi8sICdNZWRpYVN0b3AnLCAxNzgsICdWS19NRURJQV9TVE9QJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE3NCAvKiBTY2FuQ29kZS5FamVjdCAqLywgJ0VqZWN0JywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE3NSAvKiBTY2FuQ29kZS5NZWRpYVBsYXlQYXVzZSAqLywgJ01lZGlhUGxheVBhdXNlJywgMTI3IC8qIEtleUNvZGUuTWVkaWFQbGF5UGF1c2UgKi8sICdNZWRpYVBsYXlQYXVzZScsIDE3OSwgJ1ZLX01FRElBX1BMQVlfUEFVU0UnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTc2IC8qIFNjYW5Db2RlLk1lZGlhU2VsZWN0ICovLCAnTWVkaWFTZWxlY3QnLCAxMjggLyogS2V5Q29kZS5MYXVuY2hNZWRpYVBsYXllciAqLywgJ0xhdW5jaE1lZGlhUGxheWVyJywgMTgxLCAnVktfTUVESUFfTEFVTkNIX01FRElBX1NFTEVDVCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxNzcgLyogU2NhbkNvZGUuTGF1bmNoTWFpbCAqLywgJ0xhdW5jaE1haWwnLCAxMjkgLyogS2V5Q29kZS5MYXVuY2hNYWlsICovLCAnTGF1bmNoTWFpbCcsIDE4MCwgJ1ZLX01FRElBX0xBVU5DSF9NQUlMJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE3OCAvKiBTY2FuQ29kZS5MYXVuY2hBcHAyICovLCAnTGF1bmNoQXBwMicsIDEzMCAvKiBLZXlDb2RlLkxhdW5jaEFwcDIgKi8sICdMYXVuY2hBcHAyJywgMTgzLCAnVktfTUVESUFfTEFVTkNIX0FQUDInLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTc5IC8qIFNjYW5Db2RlLkxhdW5jaEFwcDEgKi8sICdMYXVuY2hBcHAxJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfTUVESUFfTEFVTkNIX0FQUDEnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTgwIC8qIFNjYW5Db2RlLlNlbGVjdFRhc2sgKi8sICdTZWxlY3RUYXNrJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE4MSAvKiBTY2FuQ29kZS5MYXVuY2hTY3JlZW5TYXZlciAqLywgJ0xhdW5jaFNjcmVlblNhdmVyJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE4MiAvKiBTY2FuQ29kZS5Ccm93c2VyU2VhcmNoICovLCAnQnJvd3NlclNlYXJjaCcsIDEyMCAvKiBLZXlDb2RlLkJyb3dzZXJTZWFyY2ggKi8sICdCcm93c2VyU2VhcmNoJywgMTcwLCAnVktfQlJPV1NFUl9TRUFSQ0gnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTgzIC8qIFNjYW5Db2RlLkJyb3dzZXJIb21lICovLCAnQnJvd3NlckhvbWUnLCAxMjEgLyogS2V5Q29kZS5Ccm93c2VySG9tZSAqLywgJ0Jyb3dzZXJIb21lJywgMTcyLCAnVktfQlJPV1NFUl9IT01FJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE4NCAvKiBTY2FuQ29kZS5Ccm93c2VyQmFjayAqLywgJ0Jyb3dzZXJCYWNrJywgMTIyIC8qIEtleUNvZGUuQnJvd3NlckJhY2sgKi8sICdCcm93c2VyQmFjaycsIDE2NiwgJ1ZLX0JST1dTRVJfQkFDSycsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAxODUgLyogU2NhbkNvZGUuQnJvd3NlckZvcndhcmQgKi8sICdCcm93c2VyRm9yd2FyZCcsIDEyMyAvKiBLZXlDb2RlLkJyb3dzZXJGb3J3YXJkICovLCAnQnJvd3NlckZvcndhcmQnLCAxNjcsICdWS19CUk9XU0VSX0ZPUldBUkQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTg2IC8qIFNjYW5Db2RlLkJyb3dzZXJTdG9wICovLCAnQnJvd3NlclN0b3AnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19CUk9XU0VSX1NUT1AnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTg3IC8qIFNjYW5Db2RlLkJyb3dzZXJSZWZyZXNoICovLCAnQnJvd3NlclJlZnJlc2gnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19CUk9XU0VSX1JFRlJFU0gnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTg4IC8qIFNjYW5Db2RlLkJyb3dzZXJGYXZvcml0ZXMgKi8sICdCcm93c2VyRmF2b3JpdGVzJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfQlJPV1NFUl9GQVZPUklURVMnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTg5IC8qIFNjYW5Db2RlLlpvb21Ub2dnbGUgKi8sICdab29tVG9nZ2xlJywgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDE5MCAvKiBTY2FuQ29kZS5NYWlsUmVwbHkgKi8sICdNYWlsUmVwbHknLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTkxIC8qIFNjYW5Db2RlLk1haWxGb3J3YXJkICovLCAnTWFpbEZvcndhcmQnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMTkyIC8qIFNjYW5Db2RlLk1haWxTZW5kICovLCAnTWFpbFNlbmQnLCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9saXN0cy53My5vcmcvQXJjaGl2ZXMvUHVibGljL3d3dy1kb20vMjAxMEp1bFNlcC9hdHQtMDE4Mi9rZXlDb2RlLXNwZWMuaHRtbFxuICAgICAgICAvLyBJZiBhbiBJbnB1dCBNZXRob2QgRWRpdG9yIGlzIHByb2Nlc3Npbmcga2V5IGlucHV0IGFuZCB0aGUgZXZlbnQgaXMga2V5ZG93biwgcmV0dXJuIDIyOS5cbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDExNCAvKiBLZXlDb2RlLktFWV9JTl9DT01QT1NJVElPTiAqLywgJ0tleUluQ29tcG9zaXRpb24nLCAyMjksIGVtcHR5LCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMTE2IC8qIEtleUNvZGUuQUJOVF9DMiAqLywgJ0FCTlRfQzInLCAxOTQsICdWS19BQk5UX0MyJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDk2IC8qIEtleUNvZGUuT0VNXzggKi8sICdPRU1fOCcsIDIyMywgJ1ZLX09FTV84JywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0tBTkEnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfSEFOR1VMJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0pVTkpBJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0ZJTkFMJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0hBTkpBJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0tBTkpJJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0NPTlZFUlQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfTk9OQ09OVkVSVCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19BQ0NFUFQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfTU9ERUNIQU5HRScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19TRUxFQ1QnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfUFJJTlQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfRVhFQ1VURScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19TTkFQU0hPVCcsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19IRUxQJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0FQUFMnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfUFJPQ0VTU0tFWScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19QQUNLRVQnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfREJFX1NCQ1NDSEFSJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0RCRV9EQkNTQ0hBUicsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19BVFROJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0NSU0VMJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0VYU0VMJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0VSRU9GJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1BMQVknLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfWk9PTScsIGVtcHR5LCBlbXB0eV0sXG4gICAgICAgIFsxLCAwIC8qIFNjYW5Db2RlLk5vbmUgKi8sIGVtcHR5LCAwIC8qIEtleUNvZGUuVW5rbm93biAqLywgZW1wdHksIDAsICdWS19OT05BTUUnLCBlbXB0eSwgZW1wdHldLFxuICAgICAgICBbMSwgMCAvKiBTY2FuQ29kZS5Ob25lICovLCBlbXB0eSwgMCAvKiBLZXlDb2RlLlVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfUEExJywgZW1wdHksIGVtcHR5XSxcbiAgICAgICAgWzEsIDAgLyogU2NhbkNvZGUuTm9uZSAqLywgZW1wdHksIDAgLyogS2V5Q29kZS5Vbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX09FTV9DTEVBUicsIGVtcHR5LCBlbXB0eV0sXG4gICAgXTtcbiAgICBjb25zdCBzZWVuS2V5Q29kZSA9IFtdO1xuICAgIGNvbnN0IHNlZW5TY2FuQ29kZSA9IFtdO1xuICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBtYXBwaW5ncykge1xuICAgICAgICBjb25zdCBbaW1tdXRhYmxlLCBzY2FuQ29kZSwgc2NhbkNvZGVTdHIsIGtleUNvZGUsIGtleUNvZGVTdHIsIGV2ZW50S2V5Q29kZSwgdmtleSwgdXNVc2VyU2V0dGluZ3NMYWJlbCwgZ2VuZXJhbFVzZXJTZXR0aW5nc0xhYmVsXSA9IG1hcHBpbmc7XG4gICAgICAgIGlmICghc2VlblNjYW5Db2RlW3NjYW5Db2RlXSkge1xuICAgICAgICAgICAgc2VlblNjYW5Db2RlW3NjYW5Db2RlXSA9IHRydWU7XG4gICAgICAgICAgICBzY2FuQ29kZUludFRvU3RyW3NjYW5Db2RlXSA9IHNjYW5Db2RlU3RyO1xuICAgICAgICAgICAgc2NhbkNvZGVTdHJUb0ludFtzY2FuQ29kZVN0cl0gPSBzY2FuQ29kZTtcbiAgICAgICAgICAgIHNjYW5Db2RlTG93ZXJDYXNlU3RyVG9JbnRbc2NhbkNvZGVTdHIudG9Mb3dlckNhc2UoKV0gPSBzY2FuQ29kZTtcbiAgICAgICAgICAgIGlmIChpbW11dGFibGUpIHtcbiAgICAgICAgICAgICAgICBJTU1VVEFCTEVfQ09ERV9UT19LRVlfQ09ERVtzY2FuQ29kZV0gPSBrZXlDb2RlO1xuICAgICAgICAgICAgICAgIGlmICgoa2V5Q29kZSAhPT0gMCAvKiBLZXlDb2RlLlVua25vd24gKi8pXG4gICAgICAgICAgICAgICAgICAgICYmIChrZXlDb2RlICE9PSAzIC8qIEtleUNvZGUuRW50ZXIgKi8pXG4gICAgICAgICAgICAgICAgICAgICYmIChrZXlDb2RlICE9PSA1IC8qIEtleUNvZGUuQ3RybCAqLylcbiAgICAgICAgICAgICAgICAgICAgJiYgKGtleUNvZGUgIT09IDQgLyogS2V5Q29kZS5TaGlmdCAqLylcbiAgICAgICAgICAgICAgICAgICAgJiYgKGtleUNvZGUgIT09IDYgLyogS2V5Q29kZS5BbHQgKi8pXG4gICAgICAgICAgICAgICAgICAgICYmIChrZXlDb2RlICE9PSA1NyAvKiBLZXlDb2RlLk1ldGEgKi8pKSB7XG4gICAgICAgICAgICAgICAgICAgIElNTVVUQUJMRV9LRVlfQ09ERV9UT19DT0RFW2tleUNvZGVdID0gc2NhbkNvZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghc2VlbktleUNvZGVba2V5Q29kZV0pIHtcbiAgICAgICAgICAgIHNlZW5LZXlDb2RlW2tleUNvZGVdID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICgha2V5Q29kZVN0cikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG1pc3NpbmcgZm9yIGtleSBjb2RlICR7a2V5Q29kZX0gYXJvdW5kIHNjYW4gY29kZSAke3NjYW5Db2RlU3RyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdWlNYXAuZGVmaW5lKGtleUNvZGUsIGtleUNvZGVTdHIpO1xuICAgICAgICAgICAgdXNlclNldHRpbmdzVVNNYXAuZGVmaW5lKGtleUNvZGUsIHVzVXNlclNldHRpbmdzTGFiZWwgfHwga2V5Q29kZVN0cik7XG4gICAgICAgICAgICB1c2VyU2V0dGluZ3NHZW5lcmFsTWFwLmRlZmluZShrZXlDb2RlLCBnZW5lcmFsVXNlclNldHRpbmdzTGFiZWwgfHwgdXNVc2VyU2V0dGluZ3NMYWJlbCB8fCBrZXlDb2RlU3RyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRLZXlDb2RlKSB7XG4gICAgICAgICAgICBFVkVOVF9LRVlfQ09ERV9NQVBbZXZlbnRLZXlDb2RlXSA9IGtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZrZXkpIHtcbiAgICAgICAgICAgIE5BVElWRV9XSU5ET1dTX0tFWV9DT0RFX1RPX0tFWV9DT0RFW3ZrZXldID0ga2V5Q29kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYW51YWxseSBhZGRlZCBkdWUgdG8gdGhlIGV4Y2x1c2lvbiBhYm92ZSAoZHVlIHRvIGR1cGxpY2F0aW9uIHdpdGggTnVtcGFkRW50ZXIpXG4gICAgSU1NVVRBQkxFX0tFWV9DT0RFX1RPX0NPREVbMyAvKiBLZXlDb2RlLkVudGVyICovXSA9IDQ2IC8qIFNjYW5Db2RlLkVudGVyICovO1xufSkoKTtcbmV4cG9ydCB2YXIgS2V5Q29kZVV0aWxzO1xuKGZ1bmN0aW9uIChLZXlDb2RlVXRpbHMpIHtcbiAgICBmdW5jdGlvbiB0b1N0cmluZyhrZXlDb2RlKSB7XG4gICAgICAgIHJldHVybiB1aU1hcC5rZXlDb2RlVG9TdHIoa2V5Q29kZSk7XG4gICAgfVxuICAgIEtleUNvZGVVdGlscy50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcoa2V5KSB7XG4gICAgICAgIHJldHVybiB1aU1hcC5zdHJUb0tleUNvZGUoa2V5KTtcbiAgICB9XG4gICAgS2V5Q29kZVV0aWxzLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xuICAgIGZ1bmN0aW9uIHRvVXNlclNldHRpbmdzVVMoa2V5Q29kZSkge1xuICAgICAgICByZXR1cm4gdXNlclNldHRpbmdzVVNNYXAua2V5Q29kZVRvU3RyKGtleUNvZGUpO1xuICAgIH1cbiAgICBLZXlDb2RlVXRpbHMudG9Vc2VyU2V0dGluZ3NVUyA9IHRvVXNlclNldHRpbmdzVVM7XG4gICAgZnVuY3Rpb24gdG9Vc2VyU2V0dGluZ3NHZW5lcmFsKGtleUNvZGUpIHtcbiAgICAgICAgcmV0dXJuIHVzZXJTZXR0aW5nc0dlbmVyYWxNYXAua2V5Q29kZVRvU3RyKGtleUNvZGUpO1xuICAgIH1cbiAgICBLZXlDb2RlVXRpbHMudG9Vc2VyU2V0dGluZ3NHZW5lcmFsID0gdG9Vc2VyU2V0dGluZ3NHZW5lcmFsO1xuICAgIGZ1bmN0aW9uIGZyb21Vc2VyU2V0dGluZ3Moa2V5KSB7XG4gICAgICAgIHJldHVybiB1c2VyU2V0dGluZ3NVU01hcC5zdHJUb0tleUNvZGUoa2V5KSB8fCB1c2VyU2V0dGluZ3NHZW5lcmFsTWFwLnN0clRvS2V5Q29kZShrZXkpO1xuICAgIH1cbiAgICBLZXlDb2RlVXRpbHMuZnJvbVVzZXJTZXR0aW5ncyA9IGZyb21Vc2VyU2V0dGluZ3M7XG4gICAgZnVuY3Rpb24gdG9FbGVjdHJvbkFjY2VsZXJhdG9yKGtleUNvZGUpIHtcbiAgICAgICAgaWYgKGtleUNvZGUgPj0gOTggLyogS2V5Q29kZS5OdW1wYWQwICovICYmIGtleUNvZGUgPD0gMTEzIC8qIEtleUNvZGUuTnVtcGFkRGl2aWRlICovKSB7XG4gICAgICAgICAgICAvLyBbRWxlY3Ryb24gQWNjZWxlcmF0b3JzXSBFbGVjdHJvbiBpcyBhYmxlIHRvIHBhcnNlIG51bXBhZCBrZXlzLCBidXQgdW5mb3J0dW5hdGVseSBpdFxuICAgICAgICAgICAgLy8gcmVuZGVycyB0aGVtIGp1c3QgYXMgcmVndWxhciBrZXlzIGluIG1lbnVzLiBGb3IgZXhhbXBsZSwgbnVtMCBpcyByZW5kZXJlZCBhcyBcIjBcIixcbiAgICAgICAgICAgIC8vIG51bWRpdiBpcyByZW5kZXJlZCBhcyBcIi9cIiwgbnVtc3ViIGlzIHJlbmRlcmVkIGFzIFwiLVwiLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoaXMgY2FuIGxlYWQgdG8gaW5jcmVkaWJsZSBjb25mdXNpb24sIGFzIGl0IG1ha2VzIG51bXBhZCBiYXNlZCBrZXliaW5kaW5ncyBpbmRpc3Rpbmd1aXNoYWJsZVxuICAgICAgICAgICAgLy8gZnJvbSBrZXliaW5kaW5ncyBiYXNlZCBvbiByZWd1bGFyIGtleXMuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gV2UgdGhlcmVmb3JlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIGN1c3RvbSByZW5kZXJpbmcgZm9yIG51bXBhZCBrZXlzLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7XG4gICAgICAgICAgICBjYXNlIDE2IC8qIEtleUNvZGUuVXBBcnJvdyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1VwJztcbiAgICAgICAgICAgIGNhc2UgMTggLyogS2V5Q29kZS5Eb3duQXJyb3cgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuICdEb3duJztcbiAgICAgICAgICAgIGNhc2UgMTUgLyogS2V5Q29kZS5MZWZ0QXJyb3cgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuICdMZWZ0JztcbiAgICAgICAgICAgIGNhc2UgMTcgLyogS2V5Q29kZS5SaWdodEFycm93ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiAnUmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1aU1hcC5rZXlDb2RlVG9TdHIoa2V5Q29kZSk7XG4gICAgfVxuICAgIEtleUNvZGVVdGlscy50b0VsZWN0cm9uQWNjZWxlcmF0b3IgPSB0b0VsZWN0cm9uQWNjZWxlcmF0b3I7XG59KShLZXlDb2RlVXRpbHMgfHwgKEtleUNvZGVVdGlscyA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gS2V5Q2hvcmQoZmlyc3RQYXJ0LCBzZWNvbmRQYXJ0KSB7XG4gICAgY29uc3QgY2hvcmRQYXJ0ID0gKChzZWNvbmRQYXJ0ICYgMHgwMDAwRkZGRikgPDwgMTYpID4+PiAwO1xuICAgIHJldHVybiAoZmlyc3RQYXJ0IHwgY2hvcmRQYXJ0KSA+Pj4gMDtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgUG9zaXRpb24gfSBmcm9tICcuL3Bvc2l0aW9uLmpzJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi9yYW5nZS5qcyc7XG4vKipcbiAqIEEgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IuXG4gKiBUaGUgc2VsZWN0aW9uIGlzIGEgcmFuZ2UgdGhhdCBoYXMgYW4gb3JpZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb24gZXh0ZW5kcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3Ioc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLCBzZWxlY3Rpb25TdGFydENvbHVtbiwgcG9zaXRpb25MaW5lTnVtYmVyLCBwb3NpdGlvbkNvbHVtbikge1xuICAgICAgICBzdXBlcihzZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsIHNlbGVjdGlvblN0YXJ0Q29sdW1uLCBwb3NpdGlvbkxpbmVOdW1iZXIsIHBvc2l0aW9uQ29sdW1uKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIgPSBzZWxlY3Rpb25TdGFydExpbmVOdW1iZXI7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4gPSBzZWxlY3Rpb25TdGFydENvbHVtbjtcbiAgICAgICAgdGhpcy5wb3NpdGlvbkxpbmVOdW1iZXIgPSBwb3NpdGlvbkxpbmVOdW1iZXI7XG4gICAgICAgIHRoaXMucG9zaXRpb25Db2x1bW4gPSBwb3NpdGlvbkNvbHVtbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHRvIGEgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAnWycgKyB0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciArICcsJyArIHRoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4gKyAnIC0+ICcgKyB0aGlzLnBvc2l0aW9uTGluZU51bWJlciArICcsJyArIHRoaXMucG9zaXRpb25Db2x1bW4gKyAnXSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgZXF1YWxzIG90aGVyIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBlcXVhbHNTZWxlY3Rpb24ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIChTZWxlY3Rpb24uc2VsZWN0aW9uc0VxdWFsKHRoaXMsIG90aGVyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgdGhlIHR3byBzZWxlY3Rpb25zIGFyZSBlcXVhbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2VsZWN0aW9uc0VxdWFsKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIChhLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciA9PT0gYi5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIgJiZcbiAgICAgICAgICAgIGEuc2VsZWN0aW9uU3RhcnRDb2x1bW4gPT09IGIuc2VsZWN0aW9uU3RhcnRDb2x1bW4gJiZcbiAgICAgICAgICAgIGEucG9zaXRpb25MaW5lTnVtYmVyID09PSBiLnBvc2l0aW9uTGluZU51bWJlciAmJlxuICAgICAgICAgICAgYS5wb3NpdGlvbkNvbHVtbiA9PT0gYi5wb3NpdGlvbkNvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBkaXJlY3Rpb25zIChMVFIgb3IgUlRMKS5cbiAgICAgKi9cbiAgICBnZXREaXJlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciA9PT0gdGhpcy5zdGFydExpbmVOdW1iZXIgJiYgdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbiA9PT0gdGhpcy5zdGFydENvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogU2VsZWN0aW9uRGlyZWN0aW9uLkxUUiAqLztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMSAvKiBTZWxlY3Rpb25EaXJlY3Rpb24uUlRMICovO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgc2VsZWN0aW9uIHdpdGggYSBkaWZmZXJlbnQgYHBvc2l0aW9uTGluZU51bWJlcmAgYW5kIGBwb3NpdGlvbkNvbHVtbmAuXG4gICAgICovXG4gICAgc2V0RW5kUG9zaXRpb24oZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKSB7XG4gICAgICAgIGlmICh0aGlzLmdldERpcmVjdGlvbigpID09PSAwIC8qIFNlbGVjdGlvbkRpcmVjdGlvbi5MVFIgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuc3RhcnRMaW5lTnVtYmVyLCB0aGlzLnN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyLCBlbmRDb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbiwgdGhpcy5zdGFydExpbmVOdW1iZXIsIHRoaXMuc3RhcnRDb2x1bW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIGF0IGBwb3NpdGlvbkxpbmVOdW1iZXJgIGFuZCBgcG9zaXRpb25Db2x1bW5gLlxuICAgICAqL1xuICAgIGdldFBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMucG9zaXRpb25MaW5lTnVtYmVyLCB0aGlzLnBvc2l0aW9uQ29sdW1uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb3NpdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIGdldFNlbGVjdGlvblN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLCB0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHNlbGVjdGlvbiB3aXRoIGEgZGlmZmVyZW50IGBzZWxlY3Rpb25TdGFydExpbmVOdW1iZXJgIGFuZCBgc2VsZWN0aW9uU3RhcnRDb2x1bW5gLlxuICAgICAqL1xuICAgIHNldFN0YXJ0UG9zaXRpb24oc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbikge1xuICAgICAgICBpZiAodGhpcy5nZXREaXJlY3Rpb24oKSA9PT0gMCAvKiBTZWxlY3Rpb25EaXJlY3Rpb24uTFRSICovKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uLCB0aGlzLmVuZExpbmVOdW1iZXIsIHRoaXMuZW5kQ29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLmVuZExpbmVOdW1iZXIsIHRoaXMuZW5kQ29sdW1uLCBzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uKTtcbiAgICB9XG4gICAgLy8gLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGBTZWxlY3Rpb25gIGZyb20gb25lIG9yIHR3byBwb3NpdGlvbnNcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVBvc2l0aW9ucyhzdGFydCwgZW5kID0gc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3RhcnQubGluZU51bWJlciwgc3RhcnQuY29sdW1uLCBlbmQubGluZU51bWJlciwgZW5kLmNvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgU2VsZWN0aW9uYCBmcm9tIGEgcmFuZ2UsIGdpdmVuIGEgZGlyZWN0aW9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tUmFuZ2UocmFuZ2UsIGRpcmVjdGlvbikge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAwIC8qIFNlbGVjdGlvbkRpcmVjdGlvbi5MVFIgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4sIHJhbmdlLmVuZExpbmVOdW1iZXIsIHJhbmdlLmVuZENvbHVtbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihyYW5nZS5lbmRMaW5lTnVtYmVyLCByYW5nZS5lbmRDb2x1bW4sIHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGBTZWxlY3Rpb25gIGZyb20gYW4gYElTZWxlY3Rpb25gLlxuICAgICAqL1xuICAgIHN0YXRpYyBsaWZ0U2VsZWN0aW9uKHNlbCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihzZWwuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLCBzZWwuc2VsZWN0aW9uU3RhcnRDb2x1bW4sIHNlbC5wb3NpdGlvbkxpbmVOdW1iZXIsIHNlbC5wb3NpdGlvbkNvbHVtbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGBhYCBlcXVhbHMgYGJgLlxuICAgICAqL1xuICAgIHN0YXRpYyBzZWxlY3Rpb25zQXJyRXF1YWwoYSwgYikge1xuICAgICAgICBpZiAoYSAmJiAhYiB8fCAhYSAmJiBiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhICYmICFiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGEubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb25zRXF1YWwoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgYG9iamAgaXMgYW4gYElTZWxlY3Rpb25gLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0lTZWxlY3Rpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqXG4gICAgICAgICAgICAmJiAodHlwZW9mIG9iai5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouc2VsZWN0aW9uU3RhcnRDb2x1bW4gPT09ICdudW1iZXInKVxuICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmoucG9zaXRpb25MaW5lTnVtYmVyID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICYmICh0eXBlb2Ygb2JqLnBvc2l0aW9uQ29sdW1uID09PSAnbnVtYmVyJykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgd2l0aCBhIGRpcmVjdGlvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlV2l0aERpcmVjdGlvbihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyLCBlbmRDb2x1bW4sIGRpcmVjdGlvbikge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAwIC8qIFNlbGVjdGlvbkRpcmVjdGlvbi5MVFIgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHN0YXJ0TGluZU51bWJlciwgc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oZW5kTGluZU51bWJlciwgZW5kQ29sdW1uLCBzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uKTtcbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyIGlzIGEgSmF2YVNjcmlwdCBTdHJpbmcgb3Igbm90LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcoc3RyKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyk7XG59XG4vKipcbiAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBpcyBvZiB0eXBlIGBvYmplY3RgIGJ1dCAqKm5vdCoqXG4gKlx0YG51bGxgLCBhbiBgYXJyYXlgLCBhIGByZWdleHBgLCBub3IgYSBgZGF0ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICAvLyBUaGUgbWV0aG9kIGNhbid0IGRvIGEgdHlwZSBjYXN0IHNpbmNlIHRoZXJlIGFyZSB0eXBlIChsaWtlIHN0cmluZ3MpIHdoaWNoXG4gICAgLy8gYXJlIHN1YmNsYXNzZXMgb2YgYW55IHB1dCBub3QgcG9zaXR2ZWx5IG1hdGNoZWQgYnkgdGhlIGZ1bmN0aW9uLiBIZW5jZSB0eXBlXG4gICAgLy8gbmFycm93aW5nIHJlc3VsdHMgaW4gd3JvbmcgcmVzdWx0cy5cbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcbiAgICAgICAgJiYgb2JqICE9PSBudWxsXG4gICAgICAgICYmICFBcnJheS5pc0FycmF5KG9iailcbiAgICAgICAgJiYgIShvYmogaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgICYmICEob2JqIGluc3RhbmNlb2YgRGF0ZSk7XG59XG4vKipcbiAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBpcyBvZiB0eXBlIGBCdWZmZXJgIG9yIFVpbnQ4QXJyYXkgZGVydml2ZWQgdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlZEFycmF5KG9iaikge1xuICAgIGNvbnN0IFR5cGVkQXJyYXkgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSk7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG4gICAgICAgICYmIG9iaiBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG59XG4vKipcbiAqIEluICoqY29udHJhc3QqKiB0byBqdXN0IGNoZWNraW5nIGB0eXBlb2ZgIHRoaXMgd2lsbCByZXR1cm4gYGZhbHNlYCBmb3IgYE5hTmAuXG4gKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIgaXMgYSBKYXZhU2NyaXB0IE51bWJlciBvciBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihvYmopIHtcbiAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICdudW1iZXInICYmICFpc05hTihvYmopKTtcbn1cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyIGlzIGFuIEl0ZXJhYmxlLCBjYXN0aW5nIHRvIHRoZSBnaXZlbiBnZW5lcmljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0l0ZXJhYmxlKG9iaikge1xuICAgIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG59XG4vKipcbiAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBpcyBhIEphdmFTY3JpcHQgQm9vbGVhbiBvciBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4ob2JqKSB7XG4gICAgcmV0dXJuIChvYmogPT09IHRydWUgfHwgb2JqID09PSBmYWxzZSk7XG59XG4vKipcbiAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZChvYmopIHtcbiAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKTtcbn1cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyIGlzIGRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlZmluZWQoYXJnKSB7XG4gICAgcmV0dXJuICFpc1VuZGVmaW5lZE9yTnVsbChhcmcpO1xufVxuLyoqXG4gKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZE9yTnVsbChvYmopIHtcbiAgICByZXR1cm4gKGlzVW5kZWZpbmVkKG9iaikgfHwgb2JqID09PSBudWxsKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlKGNvbmRpdGlvbiwgdHlwZSkge1xuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0eXBlID8gYFVuZXhwZWN0ZWQgdHlwZSwgZXhwZWN0ZWQgJyR7dHlwZX0nYCA6ICdVbmV4cGVjdGVkIHR5cGUnKTtcbiAgICB9XG59XG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgYXJndW1lbnQgcGFzc2VkIGluIGlzIG5laXRoZXIgdW5kZWZpbmVkIG5vciBudWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNEZWZpbmVkKGFyZykge1xuICAgIGlmIChpc1VuZGVmaW5lZE9yTnVsbChhcmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXJ0aW9uIEZhaWxlZDogYXJndW1lbnQgaXMgdW5kZWZpbmVkIG9yIG51bGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIGFyZztcbn1cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyIGlzIGEgSmF2YVNjcmlwdCBGdW5jdGlvbiBvciBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb25zdHJhaW50cyhhcmdzLCBjb25zdHJhaW50cykge1xuICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGFyZ3MubGVuZ3RoLCBjb25zdHJhaW50cy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDb25zdHJhaW50KGFyZ3NbaV0sIGNvbnN0cmFpbnRzW2ldKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb25zdHJhaW50KGFyZywgY29uc3RyYWludCkge1xuICAgIGlmIChpc1N0cmluZyhjb25zdHJhaW50KSkge1xuICAgICAgICBpZiAodHlwZW9mIGFyZyAhPT0gY29uc3RyYWludCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhcmd1bWVudCBkb2VzIG5vdCBtYXRjaCBjb25zdHJhaW50OiB0eXBlb2YgJHtjb25zdHJhaW50fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24oY29uc3RyYWludCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBjb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZE9yTnVsbChhcmcpICYmIGFyZy5jb25zdHJ1Y3RvciA9PT0gY29uc3RyYWludCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zdHJhaW50Lmxlbmd0aCA9PT0gMSAmJiBjb25zdHJhaW50LmNhbGwodW5kZWZpbmVkLCBhcmcpID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhcmd1bWVudCBkb2VzIG5vdCBtYXRjaCBvbmUgb2YgdGhlc2UgY29uc3RyYWludHM6IGFyZyBpbnN0YW5jZW9mIGNvbnN0cmFpbnQsIGFyZy5jb25zdHJ1Y3RvciA9PT0gY29uc3RyYWludCwgbm9yIGNvbnN0cmFpbnQoYXJnKSA9PT0gdHJ1ZWApO1xuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgbnVsbCB0byB1bmRlZmluZWQsIHBhc3NlcyBhbGwgb3RoZXIgdmFsdWVzIHRocm91Z2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTnVsbEFzVW5kZWZpbmVkKHgpIHtcbiAgICByZXR1cm4geCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHg7XG59XG4vKipcbiAqIENvbnZlcnRzIHVuZGVmaW5lZCB0byBudWxsLCBwYXNzZXMgYWxsIG90aGVyIHZhbHVlcyB0aHJvdWdoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFVuZGVmaW5lZEFzTnVsbCh4KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB4O1xufVxuIiwiaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmNvbnN0IF9jb2RpY29uRm9udENoYXJhY3RlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gcmVnaXN0ZXIoaWQsIGZvbnRDaGFyYWN0ZXIpIHtcbiAgICBpZiAoaXNTdHJpbmcoZm9udENoYXJhY3RlcikpIHtcbiAgICAgICAgY29uc3QgdmFsID0gX2NvZGljb25Gb250Q2hhcmFjdGVyc1tmb250Q2hhcmFjdGVyXTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7aWR9IHJlZmVyZW5jZXMgYW4gdW5rbm93biBjb2RpY29uOiAke2ZvbnRDaGFyYWN0ZXJ9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9udENoYXJhY3RlciA9IHZhbDtcbiAgICB9XG4gICAgX2NvZGljb25Gb250Q2hhcmFjdGVyc1tpZF0gPSBmb250Q2hhcmFjdGVyO1xuICAgIHJldHVybiB7IGlkIH07XG59XG4vKipcbiAqIE9ubHkgdG8gYmUgdXNlZCBieSB0aGUgaWNvblJlZ2lzdHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29kaWNvbkZvbnRDaGFyYWN0ZXJzKCkge1xuICAgIHJldHVybiBfY29kaWNvbkZvbnRDaGFyYWN0ZXJzO1xufVxuLyoqXG4gKiBUaGUgQ29kaWNvbiBsaWJyYXJ5IGlzIGEgc2V0IG9mIGRlZmF1bHQgaWNvbnMgdGhhdCBhcmUgYnVpbHQtaW4gaW4gVlMgQ29kZS5cbiAqXG4gKiBJbiB0aGUgcHJvZHVjdCAob3V0c2lkZSBvZiBiYXNlKSBDb2RpY29ucyBzaG91bGQgb25seSBiZSB1c2VkIGFzIGRlZmF1bHRzLiBJbiBvcmRlciB0byBoYXZlIGFsbCBpY29ucyBpbiBWUyBDb2RlXG4gKiB0aGVtZWFibGUsIGNvbXBvbmVudCBzaG91bGQgZGVmaW5lIG5ldywgVUkgY29tcG9uZW50IHNwZWNpZmljIGljb25zIHVzaW5nIGBpY29uUmVnaXN0cnkucmVnaXN0ZXJJY29uYC5cbiAqIEluIHRoYXQgY2FsbCBhIENvZGljb24gY2FuIGJlIG5hbWVkIGFzIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBDb2RpY29uID0ge1xuICAgIC8vIGJ1aWx0LWluIGljb25zLCB3aXRoIGltYWdlIG5hbWVcbiAgICBhZGQ6IHJlZ2lzdGVyKCdhZGQnLCAweGVhNjApLFxuICAgIHBsdXM6IHJlZ2lzdGVyKCdwbHVzJywgMHhlYTYwKSxcbiAgICBnaXN0TmV3OiByZWdpc3RlcignZ2lzdC1uZXcnLCAweGVhNjApLFxuICAgIHJlcG9DcmVhdGU6IHJlZ2lzdGVyKCdyZXBvLWNyZWF0ZScsIDB4ZWE2MCksXG4gICAgbGlnaHRidWxiOiByZWdpc3RlcignbGlnaHRidWxiJywgMHhlYTYxKSxcbiAgICBsaWdodEJ1bGI6IHJlZ2lzdGVyKCdsaWdodC1idWxiJywgMHhlYTYxKSxcbiAgICByZXBvOiByZWdpc3RlcigncmVwbycsIDB4ZWE2MiksXG4gICAgcmVwb0RlbGV0ZTogcmVnaXN0ZXIoJ3JlcG8tZGVsZXRlJywgMHhlYTYyKSxcbiAgICBnaXN0Rm9yazogcmVnaXN0ZXIoJ2dpc3QtZm9yaycsIDB4ZWE2MyksXG4gICAgcmVwb0ZvcmtlZDogcmVnaXN0ZXIoJ3JlcG8tZm9ya2VkJywgMHhlYTYzKSxcbiAgICBnaXRQdWxsUmVxdWVzdDogcmVnaXN0ZXIoJ2dpdC1wdWxsLXJlcXVlc3QnLCAweGVhNjQpLFxuICAgIGdpdFB1bGxSZXF1ZXN0QWJhbmRvbmVkOiByZWdpc3RlcignZ2l0LXB1bGwtcmVxdWVzdC1hYmFuZG9uZWQnLCAweGVhNjQpLFxuICAgIHJlY29yZEtleXM6IHJlZ2lzdGVyKCdyZWNvcmQta2V5cycsIDB4ZWE2NSksXG4gICAga2V5Ym9hcmQ6IHJlZ2lzdGVyKCdrZXlib2FyZCcsIDB4ZWE2NSksXG4gICAgdGFnOiByZWdpc3RlcigndGFnJywgMHhlYTY2KSxcbiAgICB0YWdBZGQ6IHJlZ2lzdGVyKCd0YWctYWRkJywgMHhlYTY2KSxcbiAgICB0YWdSZW1vdmU6IHJlZ2lzdGVyKCd0YWctcmVtb3ZlJywgMHhlYTY2KSxcbiAgICBwZXJzb246IHJlZ2lzdGVyKCdwZXJzb24nLCAweGVhNjcpLFxuICAgIHBlcnNvbkZvbGxvdzogcmVnaXN0ZXIoJ3BlcnNvbi1mb2xsb3cnLCAweGVhNjcpLFxuICAgIHBlcnNvbk91dGxpbmU6IHJlZ2lzdGVyKCdwZXJzb24tb3V0bGluZScsIDB4ZWE2NyksXG4gICAgcGVyc29uRmlsbGVkOiByZWdpc3RlcigncGVyc29uLWZpbGxlZCcsIDB4ZWE2NyksXG4gICAgZ2l0QnJhbmNoOiByZWdpc3RlcignZ2l0LWJyYW5jaCcsIDB4ZWE2OCksXG4gICAgZ2l0QnJhbmNoQ3JlYXRlOiByZWdpc3RlcignZ2l0LWJyYW5jaC1jcmVhdGUnLCAweGVhNjgpLFxuICAgIGdpdEJyYW5jaERlbGV0ZTogcmVnaXN0ZXIoJ2dpdC1icmFuY2gtZGVsZXRlJywgMHhlYTY4KSxcbiAgICBzb3VyY2VDb250cm9sOiByZWdpc3Rlcignc291cmNlLWNvbnRyb2wnLCAweGVhNjgpLFxuICAgIG1pcnJvcjogcmVnaXN0ZXIoJ21pcnJvcicsIDB4ZWE2OSksXG4gICAgbWlycm9yUHVibGljOiByZWdpc3RlcignbWlycm9yLXB1YmxpYycsIDB4ZWE2OSksXG4gICAgc3RhcjogcmVnaXN0ZXIoJ3N0YXInLCAweGVhNmEpLFxuICAgIHN0YXJBZGQ6IHJlZ2lzdGVyKCdzdGFyLWFkZCcsIDB4ZWE2YSksXG4gICAgc3RhckRlbGV0ZTogcmVnaXN0ZXIoJ3N0YXItZGVsZXRlJywgMHhlYTZhKSxcbiAgICBzdGFyRW1wdHk6IHJlZ2lzdGVyKCdzdGFyLWVtcHR5JywgMHhlYTZhKSxcbiAgICBjb21tZW50OiByZWdpc3RlcignY29tbWVudCcsIDB4ZWE2YiksXG4gICAgY29tbWVudEFkZDogcmVnaXN0ZXIoJ2NvbW1lbnQtYWRkJywgMHhlYTZiKSxcbiAgICBhbGVydDogcmVnaXN0ZXIoJ2FsZXJ0JywgMHhlYTZjKSxcbiAgICB3YXJuaW5nOiByZWdpc3Rlcignd2FybmluZycsIDB4ZWE2YyksXG4gICAgc2VhcmNoOiByZWdpc3Rlcignc2VhcmNoJywgMHhlYTZkKSxcbiAgICBzZWFyY2hTYXZlOiByZWdpc3Rlcignc2VhcmNoLXNhdmUnLCAweGVhNmQpLFxuICAgIGxvZ091dDogcmVnaXN0ZXIoJ2xvZy1vdXQnLCAweGVhNmUpLFxuICAgIHNpZ25PdXQ6IHJlZ2lzdGVyKCdzaWduLW91dCcsIDB4ZWE2ZSksXG4gICAgbG9nSW46IHJlZ2lzdGVyKCdsb2ctaW4nLCAweGVhNmYpLFxuICAgIHNpZ25JbjogcmVnaXN0ZXIoJ3NpZ24taW4nLCAweGVhNmYpLFxuICAgIGV5ZTogcmVnaXN0ZXIoJ2V5ZScsIDB4ZWE3MCksXG4gICAgZXllVW53YXRjaDogcmVnaXN0ZXIoJ2V5ZS11bndhdGNoJywgMHhlYTcwKSxcbiAgICBleWVXYXRjaDogcmVnaXN0ZXIoJ2V5ZS13YXRjaCcsIDB4ZWE3MCksXG4gICAgY2lyY2xlRmlsbGVkOiByZWdpc3RlcignY2lyY2xlLWZpbGxlZCcsIDB4ZWE3MSksXG4gICAgcHJpbWl0aXZlRG90OiByZWdpc3RlcigncHJpbWl0aXZlLWRvdCcsIDB4ZWE3MSksXG4gICAgY2xvc2VEaXJ0eTogcmVnaXN0ZXIoJ2Nsb3NlLWRpcnR5JywgMHhlYTcxKSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnQ6IHJlZ2lzdGVyKCdkZWJ1Zy1icmVha3BvaW50JywgMHhlYTcxKSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnREaXNhYmxlZDogcmVnaXN0ZXIoJ2RlYnVnLWJyZWFrcG9pbnQtZGlzYWJsZWQnLCAweGVhNzEpLFxuICAgIGRlYnVnSGludDogcmVnaXN0ZXIoJ2RlYnVnLWhpbnQnLCAweGVhNzEpLFxuICAgIHByaW1pdGl2ZVNxdWFyZTogcmVnaXN0ZXIoJ3ByaW1pdGl2ZS1zcXVhcmUnLCAweGVhNzIpLFxuICAgIGVkaXQ6IHJlZ2lzdGVyKCdlZGl0JywgMHhlYTczKSxcbiAgICBwZW5jaWw6IHJlZ2lzdGVyKCdwZW5jaWwnLCAweGVhNzMpLFxuICAgIGluZm86IHJlZ2lzdGVyKCdpbmZvJywgMHhlYTc0KSxcbiAgICBpc3N1ZU9wZW5lZDogcmVnaXN0ZXIoJ2lzc3VlLW9wZW5lZCcsIDB4ZWE3NCksXG4gICAgZ2lzdFByaXZhdGU6IHJlZ2lzdGVyKCdnaXN0LXByaXZhdGUnLCAweGVhNzUpLFxuICAgIGdpdEZvcmtQcml2YXRlOiByZWdpc3RlcignZ2l0LWZvcmstcHJpdmF0ZScsIDB4ZWE3NSksXG4gICAgbG9jazogcmVnaXN0ZXIoJ2xvY2snLCAweGVhNzUpLFxuICAgIG1pcnJvclByaXZhdGU6IHJlZ2lzdGVyKCdtaXJyb3ItcHJpdmF0ZScsIDB4ZWE3NSksXG4gICAgY2xvc2U6IHJlZ2lzdGVyKCdjbG9zZScsIDB4ZWE3NiksXG4gICAgcmVtb3ZlQ2xvc2U6IHJlZ2lzdGVyKCdyZW1vdmUtY2xvc2UnLCAweGVhNzYpLFxuICAgIHg6IHJlZ2lzdGVyKCd4JywgMHhlYTc2KSxcbiAgICByZXBvU3luYzogcmVnaXN0ZXIoJ3JlcG8tc3luYycsIDB4ZWE3NyksXG4gICAgc3luYzogcmVnaXN0ZXIoJ3N5bmMnLCAweGVhNzcpLFxuICAgIGNsb25lOiByZWdpc3RlcignY2xvbmUnLCAweGVhNzgpLFxuICAgIGRlc2t0b3BEb3dubG9hZDogcmVnaXN0ZXIoJ2Rlc2t0b3AtZG93bmxvYWQnLCAweGVhNzgpLFxuICAgIGJlYWtlcjogcmVnaXN0ZXIoJ2JlYWtlcicsIDB4ZWE3OSksXG4gICAgbWljcm9zY29wZTogcmVnaXN0ZXIoJ21pY3Jvc2NvcGUnLCAweGVhNzkpLFxuICAgIHZtOiByZWdpc3Rlcigndm0nLCAweGVhN2EpLFxuICAgIGRldmljZURlc2t0b3A6IHJlZ2lzdGVyKCdkZXZpY2UtZGVza3RvcCcsIDB4ZWE3YSksXG4gICAgZmlsZTogcmVnaXN0ZXIoJ2ZpbGUnLCAweGVhN2IpLFxuICAgIGZpbGVUZXh0OiByZWdpc3RlcignZmlsZS10ZXh0JywgMHhlYTdiKSxcbiAgICBtb3JlOiByZWdpc3RlcignbW9yZScsIDB4ZWE3YyksXG4gICAgZWxsaXBzaXM6IHJlZ2lzdGVyKCdlbGxpcHNpcycsIDB4ZWE3YyksXG4gICAga2ViYWJIb3Jpem9udGFsOiByZWdpc3Rlcigna2ViYWItaG9yaXpvbnRhbCcsIDB4ZWE3YyksXG4gICAgbWFpbFJlcGx5OiByZWdpc3RlcignbWFpbC1yZXBseScsIDB4ZWE3ZCksXG4gICAgcmVwbHk6IHJlZ2lzdGVyKCdyZXBseScsIDB4ZWE3ZCksXG4gICAgb3JnYW5pemF0aW9uOiByZWdpc3Rlcignb3JnYW5pemF0aW9uJywgMHhlYTdlKSxcbiAgICBvcmdhbml6YXRpb25GaWxsZWQ6IHJlZ2lzdGVyKCdvcmdhbml6YXRpb24tZmlsbGVkJywgMHhlYTdlKSxcbiAgICBvcmdhbml6YXRpb25PdXRsaW5lOiByZWdpc3Rlcignb3JnYW5pemF0aW9uLW91dGxpbmUnLCAweGVhN2UpLFxuICAgIG5ld0ZpbGU6IHJlZ2lzdGVyKCduZXctZmlsZScsIDB4ZWE3ZiksXG4gICAgZmlsZUFkZDogcmVnaXN0ZXIoJ2ZpbGUtYWRkJywgMHhlYTdmKSxcbiAgICBuZXdGb2xkZXI6IHJlZ2lzdGVyKCduZXctZm9sZGVyJywgMHhlYTgwKSxcbiAgICBmaWxlRGlyZWN0b3J5Q3JlYXRlOiByZWdpc3RlcignZmlsZS1kaXJlY3RvcnktY3JlYXRlJywgMHhlYTgwKSxcbiAgICB0cmFzaDogcmVnaXN0ZXIoJ3RyYXNoJywgMHhlYTgxKSxcbiAgICB0cmFzaGNhbjogcmVnaXN0ZXIoJ3RyYXNoY2FuJywgMHhlYTgxKSxcbiAgICBoaXN0b3J5OiByZWdpc3RlcignaGlzdG9yeScsIDB4ZWE4MiksXG4gICAgY2xvY2s6IHJlZ2lzdGVyKCdjbG9jaycsIDB4ZWE4MiksXG4gICAgZm9sZGVyOiByZWdpc3RlcignZm9sZGVyJywgMHhlYTgzKSxcbiAgICBmaWxlRGlyZWN0b3J5OiByZWdpc3RlcignZmlsZS1kaXJlY3RvcnknLCAweGVhODMpLFxuICAgIHN5bWJvbEZvbGRlcjogcmVnaXN0ZXIoJ3N5bWJvbC1mb2xkZXInLCAweGVhODMpLFxuICAgIGxvZ29HaXRodWI6IHJlZ2lzdGVyKCdsb2dvLWdpdGh1YicsIDB4ZWE4NCksXG4gICAgbWFya0dpdGh1YjogcmVnaXN0ZXIoJ21hcmstZ2l0aHViJywgMHhlYTg0KSxcbiAgICBnaXRodWI6IHJlZ2lzdGVyKCdnaXRodWInLCAweGVhODQpLFxuICAgIHRlcm1pbmFsOiByZWdpc3RlcigndGVybWluYWwnLCAweGVhODUpLFxuICAgIGNvbnNvbGU6IHJlZ2lzdGVyKCdjb25zb2xlJywgMHhlYTg1KSxcbiAgICByZXBsOiByZWdpc3RlcigncmVwbCcsIDB4ZWE4NSksXG4gICAgemFwOiByZWdpc3RlcignemFwJywgMHhlYTg2KSxcbiAgICBzeW1ib2xFdmVudDogcmVnaXN0ZXIoJ3N5bWJvbC1ldmVudCcsIDB4ZWE4NiksXG4gICAgZXJyb3I6IHJlZ2lzdGVyKCdlcnJvcicsIDB4ZWE4NyksXG4gICAgc3RvcDogcmVnaXN0ZXIoJ3N0b3AnLCAweGVhODcpLFxuICAgIHZhcmlhYmxlOiByZWdpc3RlcigndmFyaWFibGUnLCAweGVhODgpLFxuICAgIHN5bWJvbFZhcmlhYmxlOiByZWdpc3Rlcignc3ltYm9sLXZhcmlhYmxlJywgMHhlYTg4KSxcbiAgICBhcnJheTogcmVnaXN0ZXIoJ2FycmF5JywgMHhlYThhKSxcbiAgICBzeW1ib2xBcnJheTogcmVnaXN0ZXIoJ3N5bWJvbC1hcnJheScsIDB4ZWE4YSksXG4gICAgc3ltYm9sTW9kdWxlOiByZWdpc3Rlcignc3ltYm9sLW1vZHVsZScsIDB4ZWE4YiksXG4gICAgc3ltYm9sUGFja2FnZTogcmVnaXN0ZXIoJ3N5bWJvbC1wYWNrYWdlJywgMHhlYThiKSxcbiAgICBzeW1ib2xOYW1lc3BhY2U6IHJlZ2lzdGVyKCdzeW1ib2wtbmFtZXNwYWNlJywgMHhlYThiKSxcbiAgICBzeW1ib2xPYmplY3Q6IHJlZ2lzdGVyKCdzeW1ib2wtb2JqZWN0JywgMHhlYThiKSxcbiAgICBzeW1ib2xNZXRob2Q6IHJlZ2lzdGVyKCdzeW1ib2wtbWV0aG9kJywgMHhlYThjKSxcbiAgICBzeW1ib2xGdW5jdGlvbjogcmVnaXN0ZXIoJ3N5bWJvbC1mdW5jdGlvbicsIDB4ZWE4YyksXG4gICAgc3ltYm9sQ29uc3RydWN0b3I6IHJlZ2lzdGVyKCdzeW1ib2wtY29uc3RydWN0b3InLCAweGVhOGMpLFxuICAgIHN5bWJvbEJvb2xlYW46IHJlZ2lzdGVyKCdzeW1ib2wtYm9vbGVhbicsIDB4ZWE4ZiksXG4gICAgc3ltYm9sTnVsbDogcmVnaXN0ZXIoJ3N5bWJvbC1udWxsJywgMHhlYThmKSxcbiAgICBzeW1ib2xOdW1lcmljOiByZWdpc3Rlcignc3ltYm9sLW51bWVyaWMnLCAweGVhOTApLFxuICAgIHN5bWJvbE51bWJlcjogcmVnaXN0ZXIoJ3N5bWJvbC1udW1iZXInLCAweGVhOTApLFxuICAgIHN5bWJvbFN0cnVjdHVyZTogcmVnaXN0ZXIoJ3N5bWJvbC1zdHJ1Y3R1cmUnLCAweGVhOTEpLFxuICAgIHN5bWJvbFN0cnVjdDogcmVnaXN0ZXIoJ3N5bWJvbC1zdHJ1Y3QnLCAweGVhOTEpLFxuICAgIHN5bWJvbFBhcmFtZXRlcjogcmVnaXN0ZXIoJ3N5bWJvbC1wYXJhbWV0ZXInLCAweGVhOTIpLFxuICAgIHN5bWJvbFR5cGVQYXJhbWV0ZXI6IHJlZ2lzdGVyKCdzeW1ib2wtdHlwZS1wYXJhbWV0ZXInLCAweGVhOTIpLFxuICAgIHN5bWJvbEtleTogcmVnaXN0ZXIoJ3N5bWJvbC1rZXknLCAweGVhOTMpLFxuICAgIHN5bWJvbFRleHQ6IHJlZ2lzdGVyKCdzeW1ib2wtdGV4dCcsIDB4ZWE5MyksXG4gICAgc3ltYm9sUmVmZXJlbmNlOiByZWdpc3Rlcignc3ltYm9sLXJlZmVyZW5jZScsIDB4ZWE5NCksXG4gICAgZ29Ub0ZpbGU6IHJlZ2lzdGVyKCdnby10by1maWxlJywgMHhlYTk0KSxcbiAgICBzeW1ib2xFbnVtOiByZWdpc3Rlcignc3ltYm9sLWVudW0nLCAweGVhOTUpLFxuICAgIHN5bWJvbFZhbHVlOiByZWdpc3Rlcignc3ltYm9sLXZhbHVlJywgMHhlYTk1KSxcbiAgICBzeW1ib2xSdWxlcjogcmVnaXN0ZXIoJ3N5bWJvbC1ydWxlcicsIDB4ZWE5NiksXG4gICAgc3ltYm9sVW5pdDogcmVnaXN0ZXIoJ3N5bWJvbC11bml0JywgMHhlYTk2KSxcbiAgICBhY3RpdmF0ZUJyZWFrcG9pbnRzOiByZWdpc3RlcignYWN0aXZhdGUtYnJlYWtwb2ludHMnLCAweGVhOTcpLFxuICAgIGFyY2hpdmU6IHJlZ2lzdGVyKCdhcmNoaXZlJywgMHhlYTk4KSxcbiAgICBhcnJvd0JvdGg6IHJlZ2lzdGVyKCdhcnJvdy1ib3RoJywgMHhlYTk5KSxcbiAgICBhcnJvd0Rvd246IHJlZ2lzdGVyKCdhcnJvdy1kb3duJywgMHhlYTlhKSxcbiAgICBhcnJvd0xlZnQ6IHJlZ2lzdGVyKCdhcnJvdy1sZWZ0JywgMHhlYTliKSxcbiAgICBhcnJvd1JpZ2h0OiByZWdpc3RlcignYXJyb3ctcmlnaHQnLCAweGVhOWMpLFxuICAgIGFycm93U21hbGxEb3duOiByZWdpc3RlcignYXJyb3ctc21hbGwtZG93bicsIDB4ZWE5ZCksXG4gICAgYXJyb3dTbWFsbExlZnQ6IHJlZ2lzdGVyKCdhcnJvdy1zbWFsbC1sZWZ0JywgMHhlYTllKSxcbiAgICBhcnJvd1NtYWxsUmlnaHQ6IHJlZ2lzdGVyKCdhcnJvdy1zbWFsbC1yaWdodCcsIDB4ZWE5ZiksXG4gICAgYXJyb3dTbWFsbFVwOiByZWdpc3RlcignYXJyb3ctc21hbGwtdXAnLCAweGVhYTApLFxuICAgIGFycm93VXA6IHJlZ2lzdGVyKCdhcnJvdy11cCcsIDB4ZWFhMSksXG4gICAgYmVsbDogcmVnaXN0ZXIoJ2JlbGwnLCAweGVhYTIpLFxuICAgIGJvbGQ6IHJlZ2lzdGVyKCdib2xkJywgMHhlYWEzKSxcbiAgICBib29rOiByZWdpc3RlcignYm9vaycsIDB4ZWFhNCksXG4gICAgYm9va21hcms6IHJlZ2lzdGVyKCdib29rbWFyaycsIDB4ZWFhNSksXG4gICAgZGVidWdCcmVha3BvaW50Q29uZGl0aW9uYWxVbnZlcmlmaWVkOiByZWdpc3RlcignZGVidWctYnJlYWtwb2ludC1jb25kaXRpb25hbC11bnZlcmlmaWVkJywgMHhlYWE2KSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnRDb25kaXRpb25hbDogcmVnaXN0ZXIoJ2RlYnVnLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwnLCAweGVhYTcpLFxuICAgIGRlYnVnQnJlYWtwb2ludENvbmRpdGlvbmFsRGlzYWJsZWQ6IHJlZ2lzdGVyKCdkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsLWRpc2FibGVkJywgMHhlYWE3KSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnREYXRhVW52ZXJpZmllZDogcmVnaXN0ZXIoJ2RlYnVnLWJyZWFrcG9pbnQtZGF0YS11bnZlcmlmaWVkJywgMHhlYWE4KSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnREYXRhOiByZWdpc3RlcignZGVidWctYnJlYWtwb2ludC1kYXRhJywgMHhlYWE5KSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnREYXRhRGlzYWJsZWQ6IHJlZ2lzdGVyKCdkZWJ1Zy1icmVha3BvaW50LWRhdGEtZGlzYWJsZWQnLCAweGVhYTkpLFxuICAgIGRlYnVnQnJlYWtwb2ludExvZ1VudmVyaWZpZWQ6IHJlZ2lzdGVyKCdkZWJ1Zy1icmVha3BvaW50LWxvZy11bnZlcmlmaWVkJywgMHhlYWFhKSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnRMb2c6IHJlZ2lzdGVyKCdkZWJ1Zy1icmVha3BvaW50LWxvZycsIDB4ZWFhYiksXG4gICAgZGVidWdCcmVha3BvaW50TG9nRGlzYWJsZWQ6IHJlZ2lzdGVyKCdkZWJ1Zy1icmVha3BvaW50LWxvZy1kaXNhYmxlZCcsIDB4ZWFhYiksXG4gICAgYnJpZWZjYXNlOiByZWdpc3RlcignYnJpZWZjYXNlJywgMHhlYWFjKSxcbiAgICBicm9hZGNhc3Q6IHJlZ2lzdGVyKCdicm9hZGNhc3QnLCAweGVhYWQpLFxuICAgIGJyb3dzZXI6IHJlZ2lzdGVyKCdicm93c2VyJywgMHhlYWFlKSxcbiAgICBidWc6IHJlZ2lzdGVyKCdidWcnLCAweGVhYWYpLFxuICAgIGNhbGVuZGFyOiByZWdpc3RlcignY2FsZW5kYXInLCAweGVhYjApLFxuICAgIGNhc2VTZW5zaXRpdmU6IHJlZ2lzdGVyKCdjYXNlLXNlbnNpdGl2ZScsIDB4ZWFiMSksXG4gICAgY2hlY2s6IHJlZ2lzdGVyKCdjaGVjaycsIDB4ZWFiMiksXG4gICAgY2hlY2tsaXN0OiByZWdpc3RlcignY2hlY2tsaXN0JywgMHhlYWIzKSxcbiAgICBjaGV2cm9uRG93bjogcmVnaXN0ZXIoJ2NoZXZyb24tZG93bicsIDB4ZWFiNCksXG4gICAgZHJvcERvd25CdXR0b246IHJlZ2lzdGVyKCdkcm9wLWRvd24tYnV0dG9uJywgMHhlYWI0KSxcbiAgICBjaGV2cm9uTGVmdDogcmVnaXN0ZXIoJ2NoZXZyb24tbGVmdCcsIDB4ZWFiNSksXG4gICAgY2hldnJvblJpZ2h0OiByZWdpc3RlcignY2hldnJvbi1yaWdodCcsIDB4ZWFiNiksXG4gICAgY2hldnJvblVwOiByZWdpc3RlcignY2hldnJvbi11cCcsIDB4ZWFiNyksXG4gICAgY2hyb21lQ2xvc2U6IHJlZ2lzdGVyKCdjaHJvbWUtY2xvc2UnLCAweGVhYjgpLFxuICAgIGNocm9tZU1heGltaXplOiByZWdpc3RlcignY2hyb21lLW1heGltaXplJywgMHhlYWI5KSxcbiAgICBjaHJvbWVNaW5pbWl6ZTogcmVnaXN0ZXIoJ2Nocm9tZS1taW5pbWl6ZScsIDB4ZWFiYSksXG4gICAgY2hyb21lUmVzdG9yZTogcmVnaXN0ZXIoJ2Nocm9tZS1yZXN0b3JlJywgMHhlYWJiKSxcbiAgICBjaXJjbGU6IHJlZ2lzdGVyKCdjaXJjbGUnLCAweGVhYmMpLFxuICAgIGNpcmNsZU91dGxpbmU6IHJlZ2lzdGVyKCdjaXJjbGUtb3V0bGluZScsIDB4ZWFiYyksXG4gICAgZGVidWdCcmVha3BvaW50VW52ZXJpZmllZDogcmVnaXN0ZXIoJ2RlYnVnLWJyZWFrcG9pbnQtdW52ZXJpZmllZCcsIDB4ZWFiYyksXG4gICAgY2lyY2xlU2xhc2g6IHJlZ2lzdGVyKCdjaXJjbGUtc2xhc2gnLCAweGVhYmQpLFxuICAgIGNpcmN1aXRCb2FyZDogcmVnaXN0ZXIoJ2NpcmN1aXQtYm9hcmQnLCAweGVhYmUpLFxuICAgIGNsZWFyQWxsOiByZWdpc3RlcignY2xlYXItYWxsJywgMHhlYWJmKSxcbiAgICBjbGlwcHk6IHJlZ2lzdGVyKCdjbGlwcHknLCAweGVhYzApLFxuICAgIGNsb3NlQWxsOiByZWdpc3RlcignY2xvc2UtYWxsJywgMHhlYWMxKSxcbiAgICBjbG91ZERvd25sb2FkOiByZWdpc3RlcignY2xvdWQtZG93bmxvYWQnLCAweGVhYzIpLFxuICAgIGNsb3VkVXBsb2FkOiByZWdpc3RlcignY2xvdWQtdXBsb2FkJywgMHhlYWMzKSxcbiAgICBjb2RlOiByZWdpc3RlcignY29kZScsIDB4ZWFjNCksXG4gICAgY29sbGFwc2VBbGw6IHJlZ2lzdGVyKCdjb2xsYXBzZS1hbGwnLCAweGVhYzUpLFxuICAgIGNvbG9yTW9kZTogcmVnaXN0ZXIoJ2NvbG9yLW1vZGUnLCAweGVhYzYpLFxuICAgIGNvbW1lbnREaXNjdXNzaW9uOiByZWdpc3RlcignY29tbWVudC1kaXNjdXNzaW9uJywgMHhlYWM3KSxcbiAgICBjb21wYXJlQ2hhbmdlczogcmVnaXN0ZXIoJ2NvbXBhcmUtY2hhbmdlcycsIDB4ZWFmZCksXG4gICAgY3JlZGl0Q2FyZDogcmVnaXN0ZXIoJ2NyZWRpdC1jYXJkJywgMHhlYWM5KSxcbiAgICBkYXNoOiByZWdpc3RlcignZGFzaCcsIDB4ZWFjYyksXG4gICAgZGFzaGJvYXJkOiByZWdpc3RlcignZGFzaGJvYXJkJywgMHhlYWNkKSxcbiAgICBkYXRhYmFzZTogcmVnaXN0ZXIoJ2RhdGFiYXNlJywgMHhlYWNlKSxcbiAgICBkZWJ1Z0NvbnRpbnVlOiByZWdpc3RlcignZGVidWctY29udGludWUnLCAweGVhY2YpLFxuICAgIGRlYnVnRGlzY29ubmVjdDogcmVnaXN0ZXIoJ2RlYnVnLWRpc2Nvbm5lY3QnLCAweGVhZDApLFxuICAgIGRlYnVnUGF1c2U6IHJlZ2lzdGVyKCdkZWJ1Zy1wYXVzZScsIDB4ZWFkMSksXG4gICAgZGVidWdSZXN0YXJ0OiByZWdpc3RlcignZGVidWctcmVzdGFydCcsIDB4ZWFkMiksXG4gICAgZGVidWdTdGFydDogcmVnaXN0ZXIoJ2RlYnVnLXN0YXJ0JywgMHhlYWQzKSxcbiAgICBkZWJ1Z1N0ZXBJbnRvOiByZWdpc3RlcignZGVidWctc3RlcC1pbnRvJywgMHhlYWQ0KSxcbiAgICBkZWJ1Z1N0ZXBPdXQ6IHJlZ2lzdGVyKCdkZWJ1Zy1zdGVwLW91dCcsIDB4ZWFkNSksXG4gICAgZGVidWdTdGVwT3ZlcjogcmVnaXN0ZXIoJ2RlYnVnLXN0ZXAtb3ZlcicsIDB4ZWFkNiksXG4gICAgZGVidWdTdG9wOiByZWdpc3RlcignZGVidWctc3RvcCcsIDB4ZWFkNyksXG4gICAgZGVidWc6IHJlZ2lzdGVyKCdkZWJ1ZycsIDB4ZWFkOCksXG4gICAgZGV2aWNlQ2FtZXJhVmlkZW86IHJlZ2lzdGVyKCdkZXZpY2UtY2FtZXJhLXZpZGVvJywgMHhlYWQ5KSxcbiAgICBkZXZpY2VDYW1lcmE6IHJlZ2lzdGVyKCdkZXZpY2UtY2FtZXJhJywgMHhlYWRhKSxcbiAgICBkZXZpY2VNb2JpbGU6IHJlZ2lzdGVyKCdkZXZpY2UtbW9iaWxlJywgMHhlYWRiKSxcbiAgICBkaWZmQWRkZWQ6IHJlZ2lzdGVyKCdkaWZmLWFkZGVkJywgMHhlYWRjKSxcbiAgICBkaWZmSWdub3JlZDogcmVnaXN0ZXIoJ2RpZmYtaWdub3JlZCcsIDB4ZWFkZCksXG4gICAgZGlmZk1vZGlmaWVkOiByZWdpc3RlcignZGlmZi1tb2RpZmllZCcsIDB4ZWFkZSksXG4gICAgZGlmZlJlbW92ZWQ6IHJlZ2lzdGVyKCdkaWZmLXJlbW92ZWQnLCAweGVhZGYpLFxuICAgIGRpZmZSZW5hbWVkOiByZWdpc3RlcignZGlmZi1yZW5hbWVkJywgMHhlYWUwKSxcbiAgICBkaWZmOiByZWdpc3RlcignZGlmZicsIDB4ZWFlMSksXG4gICAgZGlzY2FyZDogcmVnaXN0ZXIoJ2Rpc2NhcmQnLCAweGVhZTIpLFxuICAgIGVkaXRvckxheW91dDogcmVnaXN0ZXIoJ2VkaXRvci1sYXlvdXQnLCAweGVhZTMpLFxuICAgIGVtcHR5V2luZG93OiByZWdpc3RlcignZW1wdHktd2luZG93JywgMHhlYWU0KSxcbiAgICBleGNsdWRlOiByZWdpc3RlcignZXhjbHVkZScsIDB4ZWFlNSksXG4gICAgZXh0ZW5zaW9uczogcmVnaXN0ZXIoJ2V4dGVuc2lvbnMnLCAweGVhZTYpLFxuICAgIGV5ZUNsb3NlZDogcmVnaXN0ZXIoJ2V5ZS1jbG9zZWQnLCAweGVhZTcpLFxuICAgIGZpbGVCaW5hcnk6IHJlZ2lzdGVyKCdmaWxlLWJpbmFyeScsIDB4ZWFlOCksXG4gICAgZmlsZUNvZGU6IHJlZ2lzdGVyKCdmaWxlLWNvZGUnLCAweGVhZTkpLFxuICAgIGZpbGVNZWRpYTogcmVnaXN0ZXIoJ2ZpbGUtbWVkaWEnLCAweGVhZWEpLFxuICAgIGZpbGVQZGY6IHJlZ2lzdGVyKCdmaWxlLXBkZicsIDB4ZWFlYiksXG4gICAgZmlsZVN1Ym1vZHVsZTogcmVnaXN0ZXIoJ2ZpbGUtc3VibW9kdWxlJywgMHhlYWVjKSxcbiAgICBmaWxlU3ltbGlua0RpcmVjdG9yeTogcmVnaXN0ZXIoJ2ZpbGUtc3ltbGluay1kaXJlY3RvcnknLCAweGVhZWQpLFxuICAgIGZpbGVTeW1saW5rRmlsZTogcmVnaXN0ZXIoJ2ZpbGUtc3ltbGluay1maWxlJywgMHhlYWVlKSxcbiAgICBmaWxlWmlwOiByZWdpc3RlcignZmlsZS16aXAnLCAweGVhZWYpLFxuICAgIGZpbGVzOiByZWdpc3RlcignZmlsZXMnLCAweGVhZjApLFxuICAgIGZpbHRlcjogcmVnaXN0ZXIoJ2ZpbHRlcicsIDB4ZWFmMSksXG4gICAgZmxhbWU6IHJlZ2lzdGVyKCdmbGFtZScsIDB4ZWFmMiksXG4gICAgZm9sZERvd246IHJlZ2lzdGVyKCdmb2xkLWRvd24nLCAweGVhZjMpLFxuICAgIGZvbGRVcDogcmVnaXN0ZXIoJ2ZvbGQtdXAnLCAweGVhZjQpLFxuICAgIGZvbGQ6IHJlZ2lzdGVyKCdmb2xkJywgMHhlYWY1KSxcbiAgICBmb2xkZXJBY3RpdmU6IHJlZ2lzdGVyKCdmb2xkZXItYWN0aXZlJywgMHhlYWY2KSxcbiAgICBmb2xkZXJPcGVuZWQ6IHJlZ2lzdGVyKCdmb2xkZXItb3BlbmVkJywgMHhlYWY3KSxcbiAgICBnZWFyOiByZWdpc3RlcignZ2VhcicsIDB4ZWFmOCksXG4gICAgZ2lmdDogcmVnaXN0ZXIoJ2dpZnQnLCAweGVhZjkpLFxuICAgIGdpc3RTZWNyZXQ6IHJlZ2lzdGVyKCdnaXN0LXNlY3JldCcsIDB4ZWFmYSksXG4gICAgZ2lzdDogcmVnaXN0ZXIoJ2dpc3QnLCAweGVhZmIpLFxuICAgIGdpdENvbW1pdDogcmVnaXN0ZXIoJ2dpdC1jb21taXQnLCAweGVhZmMpLFxuICAgIGdpdENvbXBhcmU6IHJlZ2lzdGVyKCdnaXQtY29tcGFyZScsIDB4ZWFmZCksXG4gICAgZ2l0TWVyZ2U6IHJlZ2lzdGVyKCdnaXQtbWVyZ2UnLCAweGVhZmUpLFxuICAgIGdpdGh1YkFjdGlvbjogcmVnaXN0ZXIoJ2dpdGh1Yi1hY3Rpb24nLCAweGVhZmYpLFxuICAgIGdpdGh1YkFsdDogcmVnaXN0ZXIoJ2dpdGh1Yi1hbHQnLCAweGViMDApLFxuICAgIGdsb2JlOiByZWdpc3RlcignZ2xvYmUnLCAweGViMDEpLFxuICAgIGdyYWJiZXI6IHJlZ2lzdGVyKCdncmFiYmVyJywgMHhlYjAyKSxcbiAgICBncmFwaDogcmVnaXN0ZXIoJ2dyYXBoJywgMHhlYjAzKSxcbiAgICBncmlwcGVyOiByZWdpc3RlcignZ3JpcHBlcicsIDB4ZWIwNCksXG4gICAgaGVhcnQ6IHJlZ2lzdGVyKCdoZWFydCcsIDB4ZWIwNSksXG4gICAgaG9tZTogcmVnaXN0ZXIoJ2hvbWUnLCAweGViMDYpLFxuICAgIGhvcml6b250YWxSdWxlOiByZWdpc3RlcignaG9yaXpvbnRhbC1ydWxlJywgMHhlYjA3KSxcbiAgICBodWJvdDogcmVnaXN0ZXIoJ2h1Ym90JywgMHhlYjA4KSxcbiAgICBpbmJveDogcmVnaXN0ZXIoJ2luYm94JywgMHhlYjA5KSxcbiAgICBpc3N1ZUNsb3NlZDogcmVnaXN0ZXIoJ2lzc3VlLWNsb3NlZCcsIDB4ZWJhNCksXG4gICAgaXNzdWVSZW9wZW5lZDogcmVnaXN0ZXIoJ2lzc3VlLXJlb3BlbmVkJywgMHhlYjBiKSxcbiAgICBpc3N1ZXM6IHJlZ2lzdGVyKCdpc3N1ZXMnLCAweGViMGMpLFxuICAgIGl0YWxpYzogcmVnaXN0ZXIoJ2l0YWxpYycsIDB4ZWIwZCksXG4gICAgamVyc2V5OiByZWdpc3RlcignamVyc2V5JywgMHhlYjBlKSxcbiAgICBqc29uOiByZWdpc3RlcignanNvbicsIDB4ZWIwZiksXG4gICAgYnJhY2tldDogcmVnaXN0ZXIoJ2JyYWNrZXQnLCAweGViMGYpLFxuICAgIGtlYmFiVmVydGljYWw6IHJlZ2lzdGVyKCdrZWJhYi12ZXJ0aWNhbCcsIDB4ZWIxMCksXG4gICAga2V5OiByZWdpc3Rlcigna2V5JywgMHhlYjExKSxcbiAgICBsYXc6IHJlZ2lzdGVyKCdsYXcnLCAweGViMTIpLFxuICAgIGxpZ2h0YnVsYkF1dG9maXg6IHJlZ2lzdGVyKCdsaWdodGJ1bGItYXV0b2ZpeCcsIDB4ZWIxMyksXG4gICAgbGlua0V4dGVybmFsOiByZWdpc3RlcignbGluay1leHRlcm5hbCcsIDB4ZWIxNCksXG4gICAgbGluazogcmVnaXN0ZXIoJ2xpbmsnLCAweGViMTUpLFxuICAgIGxpc3RPcmRlcmVkOiByZWdpc3RlcignbGlzdC1vcmRlcmVkJywgMHhlYjE2KSxcbiAgICBsaXN0VW5vcmRlcmVkOiByZWdpc3RlcignbGlzdC11bm9yZGVyZWQnLCAweGViMTcpLFxuICAgIGxpdmVTaGFyZTogcmVnaXN0ZXIoJ2xpdmUtc2hhcmUnLCAweGViMTgpLFxuICAgIGxvYWRpbmc6IHJlZ2lzdGVyKCdsb2FkaW5nJywgMHhlYjE5KSxcbiAgICBsb2NhdGlvbjogcmVnaXN0ZXIoJ2xvY2F0aW9uJywgMHhlYjFhKSxcbiAgICBtYWlsUmVhZDogcmVnaXN0ZXIoJ21haWwtcmVhZCcsIDB4ZWIxYiksXG4gICAgbWFpbDogcmVnaXN0ZXIoJ21haWwnLCAweGViMWMpLFxuICAgIG1hcmtkb3duOiByZWdpc3RlcignbWFya2Rvd24nLCAweGViMWQpLFxuICAgIG1lZ2FwaG9uZTogcmVnaXN0ZXIoJ21lZ2FwaG9uZScsIDB4ZWIxZSksXG4gICAgbWVudGlvbjogcmVnaXN0ZXIoJ21lbnRpb24nLCAweGViMWYpLFxuICAgIG1pbGVzdG9uZTogcmVnaXN0ZXIoJ21pbGVzdG9uZScsIDB4ZWIyMCksXG4gICAgbW9ydGFyQm9hcmQ6IHJlZ2lzdGVyKCdtb3J0YXItYm9hcmQnLCAweGViMjEpLFxuICAgIG1vdmU6IHJlZ2lzdGVyKCdtb3ZlJywgMHhlYjIyKSxcbiAgICBtdWx0aXBsZVdpbmRvd3M6IHJlZ2lzdGVyKCdtdWx0aXBsZS13aW5kb3dzJywgMHhlYjIzKSxcbiAgICBtdXRlOiByZWdpc3RlcignbXV0ZScsIDB4ZWIyNCksXG4gICAgbm9OZXdsaW5lOiByZWdpc3Rlcignbm8tbmV3bGluZScsIDB4ZWIyNSksXG4gICAgbm90ZTogcmVnaXN0ZXIoJ25vdGUnLCAweGViMjYpLFxuICAgIG9jdG9mYWNlOiByZWdpc3Rlcignb2N0b2ZhY2UnLCAweGViMjcpLFxuICAgIG9wZW5QcmV2aWV3OiByZWdpc3Rlcignb3Blbi1wcmV2aWV3JywgMHhlYjI4KSxcbiAgICBwYWNrYWdlXzogcmVnaXN0ZXIoJ3BhY2thZ2UnLCAweGViMjkpLFxuICAgIHBhaW50Y2FuOiByZWdpc3RlcigncGFpbnRjYW4nLCAweGViMmEpLFxuICAgIHBpbjogcmVnaXN0ZXIoJ3BpbicsIDB4ZWIyYiksXG4gICAgcGxheTogcmVnaXN0ZXIoJ3BsYXknLCAweGViMmMpLFxuICAgIHJ1bjogcmVnaXN0ZXIoJ3J1bicsIDB4ZWIyYyksXG4gICAgcGx1ZzogcmVnaXN0ZXIoJ3BsdWcnLCAweGViMmQpLFxuICAgIHByZXNlcnZlQ2FzZTogcmVnaXN0ZXIoJ3ByZXNlcnZlLWNhc2UnLCAweGViMmUpLFxuICAgIHByZXZpZXc6IHJlZ2lzdGVyKCdwcmV2aWV3JywgMHhlYjJmKSxcbiAgICBwcm9qZWN0OiByZWdpc3RlcigncHJvamVjdCcsIDB4ZWIzMCksXG4gICAgcHVsc2U6IHJlZ2lzdGVyKCdwdWxzZScsIDB4ZWIzMSksXG4gICAgcXVlc3Rpb246IHJlZ2lzdGVyKCdxdWVzdGlvbicsIDB4ZWIzMiksXG4gICAgcXVvdGU6IHJlZ2lzdGVyKCdxdW90ZScsIDB4ZWIzMyksXG4gICAgcmFkaW9Ub3dlcjogcmVnaXN0ZXIoJ3JhZGlvLXRvd2VyJywgMHhlYjM0KSxcbiAgICByZWFjdGlvbnM6IHJlZ2lzdGVyKCdyZWFjdGlvbnMnLCAweGViMzUpLFxuICAgIHJlZmVyZW5jZXM6IHJlZ2lzdGVyKCdyZWZlcmVuY2VzJywgMHhlYjM2KSxcbiAgICByZWZyZXNoOiByZWdpc3RlcigncmVmcmVzaCcsIDB4ZWIzNyksXG4gICAgcmVnZXg6IHJlZ2lzdGVyKCdyZWdleCcsIDB4ZWIzOCksXG4gICAgcmVtb3RlRXhwbG9yZXI6IHJlZ2lzdGVyKCdyZW1vdGUtZXhwbG9yZXInLCAweGViMzkpLFxuICAgIHJlbW90ZTogcmVnaXN0ZXIoJ3JlbW90ZScsIDB4ZWIzYSksXG4gICAgcmVtb3ZlOiByZWdpc3RlcigncmVtb3ZlJywgMHhlYjNiKSxcbiAgICByZXBsYWNlQWxsOiByZWdpc3RlcigncmVwbGFjZS1hbGwnLCAweGViM2MpLFxuICAgIHJlcGxhY2U6IHJlZ2lzdGVyKCdyZXBsYWNlJywgMHhlYjNkKSxcbiAgICByZXBvQ2xvbmU6IHJlZ2lzdGVyKCdyZXBvLWNsb25lJywgMHhlYjNlKSxcbiAgICByZXBvRm9yY2VQdXNoOiByZWdpc3RlcigncmVwby1mb3JjZS1wdXNoJywgMHhlYjNmKSxcbiAgICByZXBvUHVsbDogcmVnaXN0ZXIoJ3JlcG8tcHVsbCcsIDB4ZWI0MCksXG4gICAgcmVwb1B1c2g6IHJlZ2lzdGVyKCdyZXBvLXB1c2gnLCAweGViNDEpLFxuICAgIHJlcG9ydDogcmVnaXN0ZXIoJ3JlcG9ydCcsIDB4ZWI0MiksXG4gICAgcmVxdWVzdENoYW5nZXM6IHJlZ2lzdGVyKCdyZXF1ZXN0LWNoYW5nZXMnLCAweGViNDMpLFxuICAgIHJvY2tldDogcmVnaXN0ZXIoJ3JvY2tldCcsIDB4ZWI0NCksXG4gICAgcm9vdEZvbGRlck9wZW5lZDogcmVnaXN0ZXIoJ3Jvb3QtZm9sZGVyLW9wZW5lZCcsIDB4ZWI0NSksXG4gICAgcm9vdEZvbGRlcjogcmVnaXN0ZXIoJ3Jvb3QtZm9sZGVyJywgMHhlYjQ2KSxcbiAgICByc3M6IHJlZ2lzdGVyKCdyc3MnLCAweGViNDcpLFxuICAgIHJ1Ynk6IHJlZ2lzdGVyKCdydWJ5JywgMHhlYjQ4KSxcbiAgICBzYXZlQWxsOiByZWdpc3Rlcignc2F2ZS1hbGwnLCAweGViNDkpLFxuICAgIHNhdmVBczogcmVnaXN0ZXIoJ3NhdmUtYXMnLCAweGViNGEpLFxuICAgIHNhdmU6IHJlZ2lzdGVyKCdzYXZlJywgMHhlYjRiKSxcbiAgICBzY3JlZW5GdWxsOiByZWdpc3Rlcignc2NyZWVuLWZ1bGwnLCAweGViNGMpLFxuICAgIHNjcmVlbk5vcm1hbDogcmVnaXN0ZXIoJ3NjcmVlbi1ub3JtYWwnLCAweGViNGQpLFxuICAgIHNlYXJjaFN0b3A6IHJlZ2lzdGVyKCdzZWFyY2gtc3RvcCcsIDB4ZWI0ZSksXG4gICAgc2VydmVyOiByZWdpc3Rlcignc2VydmVyJywgMHhlYjUwKSxcbiAgICBzZXR0aW5nc0dlYXI6IHJlZ2lzdGVyKCdzZXR0aW5ncy1nZWFyJywgMHhlYjUxKSxcbiAgICBzZXR0aW5nczogcmVnaXN0ZXIoJ3NldHRpbmdzJywgMHhlYjUyKSxcbiAgICBzaGllbGQ6IHJlZ2lzdGVyKCdzaGllbGQnLCAweGViNTMpLFxuICAgIHNtaWxleTogcmVnaXN0ZXIoJ3NtaWxleScsIDB4ZWI1NCksXG4gICAgc29ydFByZWNlZGVuY2U6IHJlZ2lzdGVyKCdzb3J0LXByZWNlZGVuY2UnLCAweGViNTUpLFxuICAgIHNwbGl0SG9yaXpvbnRhbDogcmVnaXN0ZXIoJ3NwbGl0LWhvcml6b250YWwnLCAweGViNTYpLFxuICAgIHNwbGl0VmVydGljYWw6IHJlZ2lzdGVyKCdzcGxpdC12ZXJ0aWNhbCcsIDB4ZWI1NyksXG4gICAgc3F1aXJyZWw6IHJlZ2lzdGVyKCdzcXVpcnJlbCcsIDB4ZWI1OCksXG4gICAgc3RhckZ1bGw6IHJlZ2lzdGVyKCdzdGFyLWZ1bGwnLCAweGViNTkpLFxuICAgIHN0YXJIYWxmOiByZWdpc3Rlcignc3Rhci1oYWxmJywgMHhlYjVhKSxcbiAgICBzeW1ib2xDbGFzczogcmVnaXN0ZXIoJ3N5bWJvbC1jbGFzcycsIDB4ZWI1YiksXG4gICAgc3ltYm9sQ29sb3I6IHJlZ2lzdGVyKCdzeW1ib2wtY29sb3InLCAweGViNWMpLFxuICAgIHN5bWJvbEN1c3RvbUNvbG9yOiByZWdpc3Rlcignc3ltYm9sLWN1c3RvbWNvbG9yJywgMHhlYjVjKSxcbiAgICBzeW1ib2xDb25zdGFudDogcmVnaXN0ZXIoJ3N5bWJvbC1jb25zdGFudCcsIDB4ZWI1ZCksXG4gICAgc3ltYm9sRW51bU1lbWJlcjogcmVnaXN0ZXIoJ3N5bWJvbC1lbnVtLW1lbWJlcicsIDB4ZWI1ZSksXG4gICAgc3ltYm9sRmllbGQ6IHJlZ2lzdGVyKCdzeW1ib2wtZmllbGQnLCAweGViNWYpLFxuICAgIHN5bWJvbEZpbGU6IHJlZ2lzdGVyKCdzeW1ib2wtZmlsZScsIDB4ZWI2MCksXG4gICAgc3ltYm9sSW50ZXJmYWNlOiByZWdpc3Rlcignc3ltYm9sLWludGVyZmFjZScsIDB4ZWI2MSksXG4gICAgc3ltYm9sS2V5d29yZDogcmVnaXN0ZXIoJ3N5bWJvbC1rZXl3b3JkJywgMHhlYjYyKSxcbiAgICBzeW1ib2xNaXNjOiByZWdpc3Rlcignc3ltYm9sLW1pc2MnLCAweGViNjMpLFxuICAgIHN5bWJvbE9wZXJhdG9yOiByZWdpc3Rlcignc3ltYm9sLW9wZXJhdG9yJywgMHhlYjY0KSxcbiAgICBzeW1ib2xQcm9wZXJ0eTogcmVnaXN0ZXIoJ3N5bWJvbC1wcm9wZXJ0eScsIDB4ZWI2NSksXG4gICAgd3JlbmNoOiByZWdpc3Rlcignd3JlbmNoJywgMHhlYjY1KSxcbiAgICB3cmVuY2hTdWJhY3Rpb246IHJlZ2lzdGVyKCd3cmVuY2gtc3ViYWN0aW9uJywgMHhlYjY1KSxcbiAgICBzeW1ib2xTbmlwcGV0OiByZWdpc3Rlcignc3ltYm9sLXNuaXBwZXQnLCAweGViNjYpLFxuICAgIHRhc2tsaXN0OiByZWdpc3RlcigndGFza2xpc3QnLCAweGViNjcpLFxuICAgIHRlbGVzY29wZTogcmVnaXN0ZXIoJ3RlbGVzY29wZScsIDB4ZWI2OCksXG4gICAgdGV4dFNpemU6IHJlZ2lzdGVyKCd0ZXh0LXNpemUnLCAweGViNjkpLFxuICAgIHRocmVlQmFyczogcmVnaXN0ZXIoJ3RocmVlLWJhcnMnLCAweGViNmEpLFxuICAgIHRodW1ic2Rvd246IHJlZ2lzdGVyKCd0aHVtYnNkb3duJywgMHhlYjZiKSxcbiAgICB0aHVtYnN1cDogcmVnaXN0ZXIoJ3RodW1ic3VwJywgMHhlYjZjKSxcbiAgICB0b29sczogcmVnaXN0ZXIoJ3Rvb2xzJywgMHhlYjZkKSxcbiAgICB0cmlhbmdsZURvd246IHJlZ2lzdGVyKCd0cmlhbmdsZS1kb3duJywgMHhlYjZlKSxcbiAgICB0cmlhbmdsZUxlZnQ6IHJlZ2lzdGVyKCd0cmlhbmdsZS1sZWZ0JywgMHhlYjZmKSxcbiAgICB0cmlhbmdsZVJpZ2h0OiByZWdpc3RlcigndHJpYW5nbGUtcmlnaHQnLCAweGViNzApLFxuICAgIHRyaWFuZ2xlVXA6IHJlZ2lzdGVyKCd0cmlhbmdsZS11cCcsIDB4ZWI3MSksXG4gICAgdHdpdHRlcjogcmVnaXN0ZXIoJ3R3aXR0ZXInLCAweGViNzIpLFxuICAgIHVuZm9sZDogcmVnaXN0ZXIoJ3VuZm9sZCcsIDB4ZWI3MyksXG4gICAgdW5sb2NrOiByZWdpc3RlcigndW5sb2NrJywgMHhlYjc0KSxcbiAgICB1bm11dGU6IHJlZ2lzdGVyKCd1bm11dGUnLCAweGViNzUpLFxuICAgIHVudmVyaWZpZWQ6IHJlZ2lzdGVyKCd1bnZlcmlmaWVkJywgMHhlYjc2KSxcbiAgICB2ZXJpZmllZDogcmVnaXN0ZXIoJ3ZlcmlmaWVkJywgMHhlYjc3KSxcbiAgICB2ZXJzaW9uczogcmVnaXN0ZXIoJ3ZlcnNpb25zJywgMHhlYjc4KSxcbiAgICB2bUFjdGl2ZTogcmVnaXN0ZXIoJ3ZtLWFjdGl2ZScsIDB4ZWI3OSksXG4gICAgdm1PdXRsaW5lOiByZWdpc3Rlcigndm0tb3V0bGluZScsIDB4ZWI3YSksXG4gICAgdm1SdW5uaW5nOiByZWdpc3Rlcigndm0tcnVubmluZycsIDB4ZWI3YiksXG4gICAgd2F0Y2g6IHJlZ2lzdGVyKCd3YXRjaCcsIDB4ZWI3YyksXG4gICAgd2hpdGVzcGFjZTogcmVnaXN0ZXIoJ3doaXRlc3BhY2UnLCAweGViN2QpLFxuICAgIHdob2xlV29yZDogcmVnaXN0ZXIoJ3dob2xlLXdvcmQnLCAweGViN2UpLFxuICAgIHdpbmRvdzogcmVnaXN0ZXIoJ3dpbmRvdycsIDB4ZWI3ZiksXG4gICAgd29yZFdyYXA6IHJlZ2lzdGVyKCd3b3JkLXdyYXAnLCAweGViODApLFxuICAgIHpvb21JbjogcmVnaXN0ZXIoJ3pvb20taW4nLCAweGViODEpLFxuICAgIHpvb21PdXQ6IHJlZ2lzdGVyKCd6b29tLW91dCcsIDB4ZWI4MiksXG4gICAgbGlzdEZpbHRlcjogcmVnaXN0ZXIoJ2xpc3QtZmlsdGVyJywgMHhlYjgzKSxcbiAgICBsaXN0RmxhdDogcmVnaXN0ZXIoJ2xpc3QtZmxhdCcsIDB4ZWI4NCksXG4gICAgbGlzdFNlbGVjdGlvbjogcmVnaXN0ZXIoJ2xpc3Qtc2VsZWN0aW9uJywgMHhlYjg1KSxcbiAgICBzZWxlY3Rpb246IHJlZ2lzdGVyKCdzZWxlY3Rpb24nLCAweGViODUpLFxuICAgIGxpc3RUcmVlOiByZWdpc3RlcignbGlzdC10cmVlJywgMHhlYjg2KSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnRGdW5jdGlvblVudmVyaWZpZWQ6IHJlZ2lzdGVyKCdkZWJ1Zy1icmVha3BvaW50LWZ1bmN0aW9uLXVudmVyaWZpZWQnLCAweGViODcpLFxuICAgIGRlYnVnQnJlYWtwb2ludEZ1bmN0aW9uOiByZWdpc3RlcignZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbicsIDB4ZWI4OCksXG4gICAgZGVidWdCcmVha3BvaW50RnVuY3Rpb25EaXNhYmxlZDogcmVnaXN0ZXIoJ2RlYnVnLWJyZWFrcG9pbnQtZnVuY3Rpb24tZGlzYWJsZWQnLCAweGViODgpLFxuICAgIGRlYnVnU3RhY2tmcmFtZUFjdGl2ZTogcmVnaXN0ZXIoJ2RlYnVnLXN0YWNrZnJhbWUtYWN0aXZlJywgMHhlYjg5KSxcbiAgICBjaXJjbGVTbWFsbEZpbGxlZDogcmVnaXN0ZXIoJ2NpcmNsZS1zbWFsbC1maWxsZWQnLCAweGViOGEpLFxuICAgIGRlYnVnU3RhY2tmcmFtZURvdDogcmVnaXN0ZXIoJ2RlYnVnLXN0YWNrZnJhbWUtZG90JywgMHhlYjhhKSxcbiAgICBkZWJ1Z1N0YWNrZnJhbWU6IHJlZ2lzdGVyKCdkZWJ1Zy1zdGFja2ZyYW1lJywgMHhlYjhiKSxcbiAgICBkZWJ1Z1N0YWNrZnJhbWVGb2N1c2VkOiByZWdpc3RlcignZGVidWctc3RhY2tmcmFtZS1mb2N1c2VkJywgMHhlYjhiKSxcbiAgICBkZWJ1Z0JyZWFrcG9pbnRVbnN1cHBvcnRlZDogcmVnaXN0ZXIoJ2RlYnVnLWJyZWFrcG9pbnQtdW5zdXBwb3J0ZWQnLCAweGViOGMpLFxuICAgIHN5bWJvbFN0cmluZzogcmVnaXN0ZXIoJ3N5bWJvbC1zdHJpbmcnLCAweGViOGQpLFxuICAgIGRlYnVnUmV2ZXJzZUNvbnRpbnVlOiByZWdpc3RlcignZGVidWctcmV2ZXJzZS1jb250aW51ZScsIDB4ZWI4ZSksXG4gICAgZGVidWdTdGVwQmFjazogcmVnaXN0ZXIoJ2RlYnVnLXN0ZXAtYmFjaycsIDB4ZWI4ZiksXG4gICAgZGVidWdSZXN0YXJ0RnJhbWU6IHJlZ2lzdGVyKCdkZWJ1Zy1yZXN0YXJ0LWZyYW1lJywgMHhlYjkwKSxcbiAgICBjYWxsSW5jb21pbmc6IHJlZ2lzdGVyKCdjYWxsLWluY29taW5nJywgMHhlYjkyKSxcbiAgICBjYWxsT3V0Z29pbmc6IHJlZ2lzdGVyKCdjYWxsLW91dGdvaW5nJywgMHhlYjkzKSxcbiAgICBtZW51OiByZWdpc3RlcignbWVudScsIDB4ZWI5NCksXG4gICAgZXhwYW5kQWxsOiByZWdpc3RlcignZXhwYW5kLWFsbCcsIDB4ZWI5NSksXG4gICAgZmVlZGJhY2s6IHJlZ2lzdGVyKCdmZWVkYmFjaycsIDB4ZWI5NiksXG4gICAgZ3JvdXBCeVJlZlR5cGU6IHJlZ2lzdGVyKCdncm91cC1ieS1yZWYtdHlwZScsIDB4ZWI5NyksXG4gICAgdW5ncm91cEJ5UmVmVHlwZTogcmVnaXN0ZXIoJ3VuZ3JvdXAtYnktcmVmLXR5cGUnLCAweGViOTgpLFxuICAgIGFjY291bnQ6IHJlZ2lzdGVyKCdhY2NvdW50JywgMHhlYjk5KSxcbiAgICBiZWxsRG90OiByZWdpc3RlcignYmVsbC1kb3QnLCAweGViOWEpLFxuICAgIGRlYnVnQ29uc29sZTogcmVnaXN0ZXIoJ2RlYnVnLWNvbnNvbGUnLCAweGViOWIpLFxuICAgIGxpYnJhcnk6IHJlZ2lzdGVyKCdsaWJyYXJ5JywgMHhlYjljKSxcbiAgICBvdXRwdXQ6IHJlZ2lzdGVyKCdvdXRwdXQnLCAweGViOWQpLFxuICAgIHJ1bkFsbDogcmVnaXN0ZXIoJ3J1bi1hbGwnLCAweGViOWUpLFxuICAgIHN5bmNJZ25vcmVkOiByZWdpc3Rlcignc3luYy1pZ25vcmVkJywgMHhlYjlmKSxcbiAgICBwaW5uZWQ6IHJlZ2lzdGVyKCdwaW5uZWQnLCAweGViYTApLFxuICAgIGdpdGh1YkludmVydGVkOiByZWdpc3RlcignZ2l0aHViLWludmVydGVkJywgMHhlYmExKSxcbiAgICBkZWJ1Z0FsdDogcmVnaXN0ZXIoJ2RlYnVnLWFsdCcsIDB4ZWI5MSksXG4gICAgc2VydmVyUHJvY2VzczogcmVnaXN0ZXIoJ3NlcnZlci1wcm9jZXNzJywgMHhlYmEyKSxcbiAgICBzZXJ2ZXJFbnZpcm9ubWVudDogcmVnaXN0ZXIoJ3NlcnZlci1lbnZpcm9ubWVudCcsIDB4ZWJhMyksXG4gICAgcGFzczogcmVnaXN0ZXIoJ3Bhc3MnLCAweGViYTQpLFxuICAgIHN0b3BDaXJjbGU6IHJlZ2lzdGVyKCdzdG9wLWNpcmNsZScsIDB4ZWJhNSksXG4gICAgcGxheUNpcmNsZTogcmVnaXN0ZXIoJ3BsYXktY2lyY2xlJywgMHhlYmE2KSxcbiAgICByZWNvcmQ6IHJlZ2lzdGVyKCdyZWNvcmQnLCAweGViYTcpLFxuICAgIGRlYnVnQWx0U21hbGw6IHJlZ2lzdGVyKCdkZWJ1Zy1hbHQtc21hbGwnLCAweGViYTgpLFxuICAgIHZtQ29ubmVjdDogcmVnaXN0ZXIoJ3ZtLWNvbm5lY3QnLCAweGViYTkpLFxuICAgIGNsb3VkOiByZWdpc3RlcignY2xvdWQnLCAweGViYWEpLFxuICAgIG1lcmdlOiByZWdpc3RlcignbWVyZ2UnLCAweGViYWIpLFxuICAgIGV4cG9ydEljb246IHJlZ2lzdGVyKCdleHBvcnQnLCAweGViYWMpLFxuICAgIGdyYXBoTGVmdDogcmVnaXN0ZXIoJ2dyYXBoLWxlZnQnLCAweGViYWQpLFxuICAgIG1hZ25ldDogcmVnaXN0ZXIoJ21hZ25ldCcsIDB4ZWJhZSksXG4gICAgbm90ZWJvb2s6IHJlZ2lzdGVyKCdub3RlYm9vaycsIDB4ZWJhZiksXG4gICAgcmVkbzogcmVnaXN0ZXIoJ3JlZG8nLCAweGViYjApLFxuICAgIGNoZWNrQWxsOiByZWdpc3RlcignY2hlY2stYWxsJywgMHhlYmIxKSxcbiAgICBwaW5uZWREaXJ0eTogcmVnaXN0ZXIoJ3Bpbm5lZC1kaXJ0eScsIDB4ZWJiMiksXG4gICAgcGFzc0ZpbGxlZDogcmVnaXN0ZXIoJ3Bhc3MtZmlsbGVkJywgMHhlYmIzKSxcbiAgICBjaXJjbGVMYXJnZUZpbGxlZDogcmVnaXN0ZXIoJ2NpcmNsZS1sYXJnZS1maWxsZWQnLCAweGViYjQpLFxuICAgIGNpcmNsZUxhcmdlOiByZWdpc3RlcignY2lyY2xlLWxhcmdlJywgMHhlYmI1KSxcbiAgICBjaXJjbGVMYXJnZU91dGxpbmU6IHJlZ2lzdGVyKCdjaXJjbGUtbGFyZ2Utb3V0bGluZScsIDB4ZWJiNSksXG4gICAgY29tYmluZTogcmVnaXN0ZXIoJ2NvbWJpbmUnLCAweGViYjYpLFxuICAgIGdhdGhlcjogcmVnaXN0ZXIoJ2dhdGhlcicsIDB4ZWJiNiksXG4gICAgdGFibGU6IHJlZ2lzdGVyKCd0YWJsZScsIDB4ZWJiNyksXG4gICAgdmFyaWFibGVHcm91cDogcmVnaXN0ZXIoJ3ZhcmlhYmxlLWdyb3VwJywgMHhlYmI4KSxcbiAgICB0eXBlSGllcmFyY2h5OiByZWdpc3RlcigndHlwZS1oaWVyYXJjaHknLCAweGViYjkpLFxuICAgIHR5cGVIaWVyYXJjaHlTdWI6IHJlZ2lzdGVyKCd0eXBlLWhpZXJhcmNoeS1zdWInLCAweGViYmEpLFxuICAgIHR5cGVIaWVyYXJjaHlTdXBlcjogcmVnaXN0ZXIoJ3R5cGUtaGllcmFyY2h5LXN1cGVyJywgMHhlYmJiKSxcbiAgICBnaXRQdWxsUmVxdWVzdENyZWF0ZTogcmVnaXN0ZXIoJ2dpdC1wdWxsLXJlcXVlc3QtY3JlYXRlJywgMHhlYmJjKSxcbiAgICBydW5BYm92ZTogcmVnaXN0ZXIoJ3J1bi1hYm92ZScsIDB4ZWJiZCksXG4gICAgcnVuQmVsb3c6IHJlZ2lzdGVyKCdydW4tYmVsb3cnLCAweGViYmUpLFxuICAgIG5vdGVib29rVGVtcGxhdGU6IHJlZ2lzdGVyKCdub3RlYm9vay10ZW1wbGF0ZScsIDB4ZWJiZiksXG4gICAgZGVidWdSZXJ1bjogcmVnaXN0ZXIoJ2RlYnVnLXJlcnVuJywgMHhlYmMwKSxcbiAgICB3b3Jrc3BhY2VUcnVzdGVkOiByZWdpc3Rlcignd29ya3NwYWNlLXRydXN0ZWQnLCAweGViYzEpLFxuICAgIHdvcmtzcGFjZVVudHJ1c3RlZDogcmVnaXN0ZXIoJ3dvcmtzcGFjZS11bnRydXN0ZWQnLCAweGViYzIpLFxuICAgIHdvcmtzcGFjZVVuc3BlY2lmaWVkOiByZWdpc3Rlcignd29ya3NwYWNlLXVuc3BlY2lmaWVkJywgMHhlYmMzKSxcbiAgICB0ZXJtaW5hbENtZDogcmVnaXN0ZXIoJ3Rlcm1pbmFsLWNtZCcsIDB4ZWJjNCksXG4gICAgdGVybWluYWxEZWJpYW46IHJlZ2lzdGVyKCd0ZXJtaW5hbC1kZWJpYW4nLCAweGViYzUpLFxuICAgIHRlcm1pbmFsTGludXg6IHJlZ2lzdGVyKCd0ZXJtaW5hbC1saW51eCcsIDB4ZWJjNiksXG4gICAgdGVybWluYWxQb3dlcnNoZWxsOiByZWdpc3RlcigndGVybWluYWwtcG93ZXJzaGVsbCcsIDB4ZWJjNyksXG4gICAgdGVybWluYWxUbXV4OiByZWdpc3RlcigndGVybWluYWwtdG11eCcsIDB4ZWJjOCksXG4gICAgdGVybWluYWxVYnVudHU6IHJlZ2lzdGVyKCd0ZXJtaW5hbC11YnVudHUnLCAweGViYzkpLFxuICAgIHRlcm1pbmFsQmFzaDogcmVnaXN0ZXIoJ3Rlcm1pbmFsLWJhc2gnLCAweGViY2EpLFxuICAgIGFycm93U3dhcDogcmVnaXN0ZXIoJ2Fycm93LXN3YXAnLCAweGViY2IpLFxuICAgIGNvcHk6IHJlZ2lzdGVyKCdjb3B5JywgMHhlYmNjKSxcbiAgICBwZXJzb25BZGQ6IHJlZ2lzdGVyKCdwZXJzb24tYWRkJywgMHhlYmNkKSxcbiAgICBmaWx0ZXJGaWxsZWQ6IHJlZ2lzdGVyKCdmaWx0ZXItZmlsbGVkJywgMHhlYmNlKSxcbiAgICB3YW5kOiByZWdpc3Rlcignd2FuZCcsIDB4ZWJjZiksXG4gICAgZGVidWdMaW5lQnlMaW5lOiByZWdpc3RlcignZGVidWctbGluZS1ieS1saW5lJywgMHhlYmQwKSxcbiAgICBpbnNwZWN0OiByZWdpc3RlcignaW5zcGVjdCcsIDB4ZWJkMSksXG4gICAgbGF5ZXJzOiByZWdpc3RlcignbGF5ZXJzJywgMHhlYmQyKSxcbiAgICBsYXllcnNEb3Q6IHJlZ2lzdGVyKCdsYXllcnMtZG90JywgMHhlYmQzKSxcbiAgICBsYXllcnNBY3RpdmU6IHJlZ2lzdGVyKCdsYXllcnMtYWN0aXZlJywgMHhlYmQ0KSxcbiAgICBjb21wYXNzOiByZWdpc3RlcignY29tcGFzcycsIDB4ZWJkNSksXG4gICAgY29tcGFzc0RvdDogcmVnaXN0ZXIoJ2NvbXBhc3MtZG90JywgMHhlYmQ2KSxcbiAgICBjb21wYXNzQWN0aXZlOiByZWdpc3RlcignY29tcGFzcy1hY3RpdmUnLCAweGViZDcpLFxuICAgIGF6dXJlOiByZWdpc3RlcignYXp1cmUnLCAweGViZDgpLFxuICAgIGlzc3VlRHJhZnQ6IHJlZ2lzdGVyKCdpc3N1ZS1kcmFmdCcsIDB4ZWJkOSksXG4gICAgZ2l0UHVsbFJlcXVlc3RDbG9zZWQ6IHJlZ2lzdGVyKCdnaXQtcHVsbC1yZXF1ZXN0LWNsb3NlZCcsIDB4ZWJkYSksXG4gICAgZ2l0UHVsbFJlcXVlc3REcmFmdDogcmVnaXN0ZXIoJ2dpdC1wdWxsLXJlcXVlc3QtZHJhZnQnLCAweGViZGIpLFxuICAgIGRlYnVnQWxsOiByZWdpc3RlcignZGVidWctYWxsJywgMHhlYmRjKSxcbiAgICBkZWJ1Z0NvdmVyYWdlOiByZWdpc3RlcignZGVidWctY292ZXJhZ2UnLCAweGViZGQpLFxuICAgIHJ1bkVycm9yczogcmVnaXN0ZXIoJ3J1bi1lcnJvcnMnLCAweGViZGUpLFxuICAgIGZvbGRlckxpYnJhcnk6IHJlZ2lzdGVyKCdmb2xkZXItbGlicmFyeScsIDB4ZWJkZiksXG4gICAgZGVidWdDb250aW51ZVNtYWxsOiByZWdpc3RlcignZGVidWctY29udGludWUtc21hbGwnLCAweGViZTApLFxuICAgIGJlYWtlclN0b3A6IHJlZ2lzdGVyKCdiZWFrZXItc3RvcCcsIDB4ZWJlMSksXG4gICAgZ3JhcGhMaW5lOiByZWdpc3RlcignZ3JhcGgtbGluZScsIDB4ZWJlMiksXG4gICAgZ3JhcGhTY2F0dGVyOiByZWdpc3RlcignZ3JhcGgtc2NhdHRlcicsIDB4ZWJlMyksXG4gICAgcGllQ2hhcnQ6IHJlZ2lzdGVyKCdwaWUtY2hhcnQnLCAweGViZTQpLFxuICAgIGJyYWNrZXREb3Q6IHJlZ2lzdGVyKCdicmFja2V0LWRvdCcsIDB4ZWJlNSksXG4gICAgYnJhY2tldEVycm9yOiByZWdpc3RlcignYnJhY2tldC1lcnJvcicsIDB4ZWJlNiksXG4gICAgbG9ja1NtYWxsOiByZWdpc3RlcignbG9jay1zbWFsbCcsIDB4ZWJlNyksXG4gICAgYXp1cmVEZXZvcHM6IHJlZ2lzdGVyKCdhenVyZS1kZXZvcHMnLCAweGViZTgpLFxuICAgIHZlcmlmaWVkRmlsbGVkOiByZWdpc3RlcigndmVyaWZpZWQtZmlsbGVkJywgMHhlYmU5KSxcbiAgICBuZXdMaW5lOiByZWdpc3RlcignbmV3bGluZScsIDB4ZWJlYSksXG4gICAgbGF5b3V0OiByZWdpc3RlcignbGF5b3V0JywgMHhlYmViKSxcbiAgICBsYXlvdXRBY3Rpdml0eWJhckxlZnQ6IHJlZ2lzdGVyKCdsYXlvdXQtYWN0aXZpdHliYXItbGVmdCcsIDB4ZWJlYyksXG4gICAgbGF5b3V0QWN0aXZpdHliYXJSaWdodDogcmVnaXN0ZXIoJ2xheW91dC1hY3Rpdml0eWJhci1yaWdodCcsIDB4ZWJlZCksXG4gICAgbGF5b3V0UGFuZWxMZWZ0OiByZWdpc3RlcignbGF5b3V0LXBhbmVsLWxlZnQnLCAweGViZWUpLFxuICAgIGxheW91dFBhbmVsQ2VudGVyOiByZWdpc3RlcignbGF5b3V0LXBhbmVsLWNlbnRlcicsIDB4ZWJlZiksXG4gICAgbGF5b3V0UGFuZWxKdXN0aWZ5OiByZWdpc3RlcignbGF5b3V0LXBhbmVsLWp1c3RpZnknLCAweGViZjApLFxuICAgIGxheW91dFBhbmVsUmlnaHQ6IHJlZ2lzdGVyKCdsYXlvdXQtcGFuZWwtcmlnaHQnLCAweGViZjEpLFxuICAgIGxheW91dFBhbmVsOiByZWdpc3RlcignbGF5b3V0LXBhbmVsJywgMHhlYmYyKSxcbiAgICBsYXlvdXRTaWRlYmFyTGVmdDogcmVnaXN0ZXIoJ2xheW91dC1zaWRlYmFyLWxlZnQnLCAweGViZjMpLFxuICAgIGxheW91dFNpZGViYXJSaWdodDogcmVnaXN0ZXIoJ2xheW91dC1zaWRlYmFyLXJpZ2h0JywgMHhlYmY0KSxcbiAgICBsYXlvdXRTdGF0dXNiYXI6IHJlZ2lzdGVyKCdsYXlvdXQtc3RhdHVzYmFyJywgMHhlYmY1KSxcbiAgICBsYXlvdXRNZW51YmFyOiByZWdpc3RlcignbGF5b3V0LW1lbnViYXInLCAweGViZjYpLFxuICAgIGxheW91dENlbnRlcmVkOiByZWdpc3RlcignbGF5b3V0LWNlbnRlcmVkJywgMHhlYmY3KSxcbiAgICBsYXlvdXRTaWRlYmFyUmlnaHRPZmY6IHJlZ2lzdGVyKCdsYXlvdXQtc2lkZWJhci1yaWdodC1vZmYnLCAweGVjMDApLFxuICAgIGxheW91dFBhbmVsT2ZmOiByZWdpc3RlcignbGF5b3V0LXBhbmVsLW9mZicsIDB4ZWMwMSksXG4gICAgbGF5b3V0U2lkZWJhckxlZnRPZmY6IHJlZ2lzdGVyKCdsYXlvdXQtc2lkZWJhci1sZWZ0LW9mZicsIDB4ZWMwMiksXG4gICAgdGFyZ2V0OiByZWdpc3RlcigndGFyZ2V0JywgMHhlYmY4KSxcbiAgICBpbmRlbnQ6IHJlZ2lzdGVyKCdpbmRlbnQnLCAweGViZjkpLFxuICAgIHJlY29yZFNtYWxsOiByZWdpc3RlcigncmVjb3JkLXNtYWxsJywgMHhlYmZhKSxcbiAgICBlcnJvclNtYWxsOiByZWdpc3RlcignZXJyb3Itc21hbGwnLCAweGViZmIpLFxuICAgIGFycm93Q2lyY2xlRG93bjogcmVnaXN0ZXIoJ2Fycm93LWNpcmNsZS1kb3duJywgMHhlYmZjKSxcbiAgICBhcnJvd0NpcmNsZUxlZnQ6IHJlZ2lzdGVyKCdhcnJvdy1jaXJjbGUtbGVmdCcsIDB4ZWJmZCksXG4gICAgYXJyb3dDaXJjbGVSaWdodDogcmVnaXN0ZXIoJ2Fycm93LWNpcmNsZS1yaWdodCcsIDB4ZWJmZSksXG4gICAgYXJyb3dDaXJjbGVVcDogcmVnaXN0ZXIoJ2Fycm93LWNpcmNsZS11cCcsIDB4ZWJmZiksXG4gICAgaGVhcnRGaWxsZWQ6IHJlZ2lzdGVyKCdoZWFydC1maWxsZWQnLCAweGVjMDQpLFxuICAgIG1hcDogcmVnaXN0ZXIoJ21hcCcsIDB4ZWMwNSksXG4gICAgbWFwRmlsbGVkOiByZWdpc3RlcignbWFwLWZpbGxlZCcsIDB4ZWMwNiksXG4gICAgY2lyY2xlU21hbGw6IHJlZ2lzdGVyKCdjaXJjbGUtc21hbGwnLCAweGVjMDcpLFxuICAgIGJlbGxTbGFzaDogcmVnaXN0ZXIoJ2JlbGwtc2xhc2gnLCAweGVjMDgpLFxuICAgIGJlbGxTbGFzaERvdDogcmVnaXN0ZXIoJ2JlbGwtc2xhc2gtZG90JywgMHhlYzA5KSxcbiAgICBjb21tZW50VW5yZXNvbHZlZDogcmVnaXN0ZXIoJ2NvbW1lbnQtdW5yZXNvbHZlZCcsIDB4ZWMwYSksXG4gICAgZ2l0UHVsbFJlcXVlc3RHb1RvQ2hhbmdlczogcmVnaXN0ZXIoJ2dpdC1wdWxsLXJlcXVlc3QtZ28tdG8tY2hhbmdlcycsIDB4ZWMwYiksXG4gICAgZ2l0UHVsbFJlcXVlc3ROZXdDaGFuZ2VzOiByZWdpc3RlcignZ2l0LXB1bGwtcmVxdWVzdC1uZXctY2hhbmdlcycsIDB4ZWMwYyksXG4gICAgc2VhcmNoRnV6enk6IHJlZ2lzdGVyKCdzZWFyY2gtZnV6enknLCAweGVjMGQpLFxuICAgIGNvbW1lbnREcmFmdDogcmVnaXN0ZXIoJ2NvbW1lbnQtZHJhZnQnLCAweGVjMGUpLFxuICAgIHNlbmQ6IHJlZ2lzdGVyKCdzZW5kJywgMHhlYzBmKSxcbiAgICBzcGFya2xlOiByZWdpc3Rlcignc3BhcmtsZScsIDB4ZWMxMCksXG4gICAgaW5zZXJ0OiByZWdpc3RlcignaW5zZXJ0JywgMHhlYzExKSxcbiAgICAvLyBkZXJpdmVkIGljb25zLCB0aGF0IGNvdWxkIGJlY29tZSBzZXBhcmF0ZSBpY29uc1xuICAgIGRpYWxvZ0Vycm9yOiByZWdpc3RlcignZGlhbG9nLWVycm9yJywgJ2Vycm9yJyksXG4gICAgZGlhbG9nV2FybmluZzogcmVnaXN0ZXIoJ2RpYWxvZy13YXJuaW5nJywgJ3dhcm5pbmcnKSxcbiAgICBkaWFsb2dJbmZvOiByZWdpc3RlcignZGlhbG9nLWluZm8nLCAnaW5mbycpLFxuICAgIGRpYWxvZ0Nsb3NlOiByZWdpc3RlcignZGlhbG9nLWNsb3NlJywgJ2Nsb3NlJyksXG4gICAgdHJlZUl0ZW1FeHBhbmRlZDogcmVnaXN0ZXIoJ3RyZWUtaXRlbS1leHBhbmRlZCcsICdjaGV2cm9uLWRvd24nKSxcbiAgICB0cmVlRmlsdGVyT25UeXBlT246IHJlZ2lzdGVyKCd0cmVlLWZpbHRlci1vbi10eXBlLW9uJywgJ2xpc3QtZmlsdGVyJyksXG4gICAgdHJlZUZpbHRlck9uVHlwZU9mZjogcmVnaXN0ZXIoJ3RyZWUtZmlsdGVyLW9uLXR5cGUtb2ZmJywgJ2xpc3Qtc2VsZWN0aW9uJyksXG4gICAgdHJlZUZpbHRlckNsZWFyOiByZWdpc3RlcigndHJlZS1maWx0ZXItY2xlYXInLCAnY2xvc2UnKSxcbiAgICB0cmVlSXRlbUxvYWRpbmc6IHJlZ2lzdGVyKCd0cmVlLWl0ZW0tbG9hZGluZycsICdsb2FkaW5nJyksXG4gICAgbWVudVNlbGVjdGlvbjogcmVnaXN0ZXIoJ21lbnUtc2VsZWN0aW9uJywgJ2NoZWNrJyksXG4gICAgbWVudVN1Ym1lbnU6IHJlZ2lzdGVyKCdtZW51LXN1Ym1lbnUnLCAnY2hldnJvbi1yaWdodCcpLFxuICAgIG1lbnVCYXJNb3JlOiByZWdpc3RlcignbWVudWJhci1tb3JlJywgJ21vcmUnKSxcbiAgICBzY3JvbGxiYXJCdXR0b25MZWZ0OiByZWdpc3Rlcignc2Nyb2xsYmFyLWJ1dHRvbi1sZWZ0JywgJ3RyaWFuZ2xlLWxlZnQnKSxcbiAgICBzY3JvbGxiYXJCdXR0b25SaWdodDogcmVnaXN0ZXIoJ3Njcm9sbGJhci1idXR0b24tcmlnaHQnLCAndHJpYW5nbGUtcmlnaHQnKSxcbiAgICBzY3JvbGxiYXJCdXR0b25VcDogcmVnaXN0ZXIoJ3Njcm9sbGJhci1idXR0b24tdXAnLCAndHJpYW5nbGUtdXAnKSxcbiAgICBzY3JvbGxiYXJCdXR0b25Eb3duOiByZWdpc3Rlcignc2Nyb2xsYmFyLWJ1dHRvbi1kb3duJywgJ3RyaWFuZ2xlLWRvd24nKSxcbiAgICB0b29sQmFyTW9yZTogcmVnaXN0ZXIoJ3Rvb2xiYXItbW9yZScsICdtb3JlJyksXG4gICAgcXVpY2tJbnB1dEJhY2s6IHJlZ2lzdGVyKCdxdWljay1pbnB1dC1iYWNrJywgJ2Fycm93LWxlZnQnKVxufTtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSAnLi4vLi4vYmFzZS9jb21tb24vZXZlbnQuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnLi4vLi4vYmFzZS9jb21tb24vbGlmZWN5Y2xlLmpzJztcbmV4cG9ydCBjbGFzcyBUb2tlbml6YXRpb25SZWdpc3RyeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9mYWN0b3JpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX29uRGlkQ2hhbmdlID0gbmV3IEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5vbkRpZENoYW5nZSA9IHRoaXMuX29uRGlkQ2hhbmdlLmV2ZW50O1xuICAgICAgICB0aGlzLl9jb2xvck1hcCA9IG51bGw7XG4gICAgfVxuICAgIGhhbmRsZUNoYW5nZShsYW5ndWFnZUlkcykge1xuICAgICAgICB0aGlzLl9vbkRpZENoYW5nZS5maXJlKHtcbiAgICAgICAgICAgIGNoYW5nZWRMYW5ndWFnZXM6IGxhbmd1YWdlSWRzLFxuICAgICAgICAgICAgY2hhbmdlZENvbG9yTWFwOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVnaXN0ZXIobGFuZ3VhZ2VJZCwgc3VwcG9ydCkge1xuICAgICAgICB0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5zZXQobGFuZ3VhZ2VJZCwgc3VwcG9ydCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKFtsYW5ndWFnZUlkXSk7XG4gICAgICAgIHJldHVybiB0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmdldChsYW5ndWFnZUlkKSAhPT0gc3VwcG9ydCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmRlbGV0ZShsYW5ndWFnZUlkKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKFtsYW5ndWFnZUlkXSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQobGFuZ3VhZ2VJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHMuZ2V0KGxhbmd1YWdlSWQpIHx8IG51bGw7XG4gICAgfVxuICAgIHJlZ2lzdGVyRmFjdG9yeShsYW5ndWFnZUlkLCBmYWN0b3J5KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5fZmFjdG9yaWVzLmdldChsYW5ndWFnZUlkKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRpc3Bvc2UoKTtcbiAgICAgICAgY29uc3QgbXlEYXRhID0gbmV3IFRva2VuaXphdGlvblN1cHBvcnRGYWN0b3J5RGF0YSh0aGlzLCBsYW5ndWFnZUlkLCBmYWN0b3J5KTtcbiAgICAgICAgdGhpcy5fZmFjdG9yaWVzLnNldChsYW5ndWFnZUlkLCBteURhdGEpO1xuICAgICAgICByZXR1cm4gdG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLl9mYWN0b3JpZXMuZ2V0KGxhbmd1YWdlSWQpO1xuICAgICAgICAgICAgaWYgKCF2IHx8IHYgIT09IG15RGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZhY3Rvcmllcy5kZWxldGUobGFuZ3VhZ2VJZCk7XG4gICAgICAgICAgICB2LmRpc3Bvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldE9yQ3JlYXRlKGxhbmd1YWdlSWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZpcnN0IGlmIHRoZSBzdXBwb3J0IGlzIGFscmVhZHkgc2V0XG4gICAgICAgICAgICBjb25zdCB0b2tlbml6YXRpb25TdXBwb3J0ID0gdGhpcy5nZXQobGFuZ3VhZ2VJZCk7XG4gICAgICAgICAgICBpZiAodG9rZW5pemF0aW9uU3VwcG9ydCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbml6YXRpb25TdXBwb3J0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuX2ZhY3Rvcmllcy5nZXQobGFuZ3VhZ2VJZCk7XG4gICAgICAgICAgICBpZiAoIWZhY3RvcnkgfHwgZmFjdG9yeS5pc1Jlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gZmFjdG9yeSBvciBmYWN0b3J5LnJlc29sdmUgYWxyZWFkeSBmaW5pc2hlZFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgZmFjdG9yeS5yZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQobGFuZ3VhZ2VJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpc1Jlc29sdmVkKGxhbmd1YWdlSWQpIHtcbiAgICAgICAgY29uc3QgdG9rZW5pemF0aW9uU3VwcG9ydCA9IHRoaXMuZ2V0KGxhbmd1YWdlSWQpO1xuICAgICAgICBpZiAodG9rZW5pemF0aW9uU3VwcG9ydCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuX2ZhY3Rvcmllcy5nZXQobGFuZ3VhZ2VJZCk7XG4gICAgICAgIGlmICghZmFjdG9yeSB8fCBmYWN0b3J5LmlzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0Q29sb3JNYXAoY29sb3JNYXApIHtcbiAgICAgICAgdGhpcy5fY29sb3JNYXAgPSBjb2xvck1hcDtcbiAgICAgICAgdGhpcy5fb25EaWRDaGFuZ2UuZmlyZSh7XG4gICAgICAgICAgICBjaGFuZ2VkTGFuZ3VhZ2VzOiBBcnJheS5mcm9tKHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmtleXMoKSksXG4gICAgICAgICAgICBjaGFuZ2VkQ29sb3JNYXA6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldENvbG9yTWFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sb3JNYXA7XG4gICAgfVxuICAgIGdldERlZmF1bHRCYWNrZ3JvdW5kKCkge1xuICAgICAgICBpZiAodGhpcy5fY29sb3JNYXAgJiYgdGhpcy5fY29sb3JNYXAubGVuZ3RoID4gMiAvKiBDb2xvcklkLkRlZmF1bHRCYWNrZ3JvdW5kICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sb3JNYXBbMiAvKiBDb2xvcklkLkRlZmF1bHRCYWNrZ3JvdW5kICovXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5jbGFzcyBUb2tlbml6YXRpb25TdXBwb3J0RmFjdG9yeURhdGEgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBnZXQgaXNSZXNvbHZlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmVzb2x2ZWQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKF9yZWdpc3RyeSwgX2xhbmd1YWdlSWQsIF9mYWN0b3J5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gX3JlZ2lzdHJ5O1xuICAgICAgICB0aGlzLl9sYW5ndWFnZUlkID0gX2xhbmd1YWdlSWQ7XG4gICAgICAgIHRoaXMuX2ZhY3RvcnkgPSBfZmFjdG9yeTtcbiAgICAgICAgdGhpcy5faXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZXNvbHZlUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2lzUmVzb2x2ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmVzb2x2ZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcmVzb2x2ZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvbHZlUHJvbWlzZSA9IHRoaXMuX2NyZWF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQcm9taXNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2NyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geWllbGQgdGhpcy5fZmFjdG9yeS50b2tlbml6YXRpb25TdXBwb3J0O1xuICAgICAgICAgICAgdGhpcy5faXNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgIXRoaXMuX2lzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3Rlcih0aGlzLl9yZWdpc3RyeS5yZWdpc3Rlcih0aGlzLl9sYW5ndWFnZUlkLCB2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb2RpY29uIH0gZnJvbSAnLi4vLi4vYmFzZS9jb21tb24vY29kaWNvbnMuanMnO1xuaW1wb3J0IHsgVVJJIH0gZnJvbSAnLi4vLi4vYmFzZS9jb21tb24vdXJpLmpzJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi9jb3JlL3JhbmdlLmpzJztcbmltcG9ydCB7IFRva2VuaXphdGlvblJlZ2lzdHJ5IGFzIFRva2VuaXphdGlvblJlZ2lzdHJ5SW1wbCB9IGZyb20gJy4vdG9rZW5pemF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tICcuLi8uLi9ubHMuanMnO1xuZXhwb3J0IGNsYXNzIFRva2VuIHtcbiAgICBjb25zdHJ1Y3RvcihvZmZzZXQsIHR5cGUsIGxhbmd1YWdlKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgICAgIHRoaXMuX3Rva2VuQnJhbmQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gJygnICsgdGhpcy5vZmZzZXQgKyAnLCAnICsgdGhpcy50eXBlICsgJyknO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUb2tlbml6YXRpb25SZXN1bHQge1xuICAgIGNvbnN0cnVjdG9yKHRva2VucywgZW5kU3RhdGUpIHtcbiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgICAgIHRoaXMuZW5kU3RhdGUgPSBlbmRTdGF0ZTtcbiAgICAgICAgdGhpcy5fdG9rZW5pemF0aW9uUmVzdWx0QnJhbmQgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEVuY29kZWRUb2tlbml6YXRpb25SZXN1bHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSB0b2tlbnMgaW4gYmluYXJ5IGZvcm1hdC4gRWFjaCB0b2tlbiBvY2N1cGllcyB0d28gYXJyYXkgaW5kaWNlcy4gRm9yIHRva2VuIGk6XG4gICAgICogIC0gYXQgb2Zmc2V0IDIqaSA9PiBzdGFydEluZGV4XG4gICAgICogIC0gYXQgb2Zmc2V0IDIqaSArIDEgPT4gbWV0YWRhdGFcbiAgICAgKlxuICAgICAqL1xuICAgIHRva2VucywgZW5kU3RhdGUpIHtcbiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgICAgIHRoaXMuZW5kU3RhdGUgPSBlbmRTdGF0ZTtcbiAgICAgICAgdGhpcy5fZW5jb2RlZFRva2VuaXphdGlvblJlc3VsdEJyYW5kID0gdW5kZWZpbmVkO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1LaW5kcztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kcykge1xuICAgIGNvbnN0IGJ5S2luZCA9IG5ldyBNYXAoKTtcbiAgICBieUtpbmQuc2V0KDAgLyogQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZCAqLywgQ29kaWNvbi5zeW1ib2xNZXRob2QpO1xuICAgIGJ5S2luZC5zZXQoMSAvKiBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gKi8sIENvZGljb24uc3ltYm9sRnVuY3Rpb24pO1xuICAgIGJ5S2luZC5zZXQoMiAvKiBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3IgKi8sIENvZGljb24uc3ltYm9sQ29uc3RydWN0b3IpO1xuICAgIGJ5S2luZC5zZXQoMyAvKiBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQgKi8sIENvZGljb24uc3ltYm9sRmllbGQpO1xuICAgIGJ5S2luZC5zZXQoNCAvKiBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgKi8sIENvZGljb24uc3ltYm9sVmFyaWFibGUpO1xuICAgIGJ5S2luZC5zZXQoNSAvKiBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3MgKi8sIENvZGljb24uc3ltYm9sQ2xhc3MpO1xuICAgIGJ5S2luZC5zZXQoNiAvKiBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ICovLCBDb2RpY29uLnN5bWJvbFN0cnVjdCk7XG4gICAgYnlLaW5kLnNldCg3IC8qIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2UgKi8sIENvZGljb24uc3ltYm9sSW50ZXJmYWNlKTtcbiAgICBieUtpbmQuc2V0KDggLyogQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSAqLywgQ29kaWNvbi5zeW1ib2xNb2R1bGUpO1xuICAgIGJ5S2luZC5zZXQoOSAvKiBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHkgKi8sIENvZGljb24uc3ltYm9sUHJvcGVydHkpO1xuICAgIGJ5S2luZC5zZXQoMTAgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ICovLCBDb2RpY29uLnN5bWJvbEV2ZW50KTtcbiAgICBieUtpbmQuc2V0KDExIC8qIENvbXBsZXRpb25JdGVtS2luZC5PcGVyYXRvciAqLywgQ29kaWNvbi5zeW1ib2xPcGVyYXRvcik7XG4gICAgYnlLaW5kLnNldCgxMiAvKiBDb21wbGV0aW9uSXRlbUtpbmQuVW5pdCAqLywgQ29kaWNvbi5zeW1ib2xVbml0KTtcbiAgICBieUtpbmQuc2V0KDEzIC8qIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZSAqLywgQ29kaWNvbi5zeW1ib2xWYWx1ZSk7XG4gICAgYnlLaW5kLnNldCgxNSAvKiBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSAqLywgQ29kaWNvbi5zeW1ib2xFbnVtKTtcbiAgICBieUtpbmQuc2V0KDE0IC8qIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudCAqLywgQ29kaWNvbi5zeW1ib2xDb25zdGFudCk7XG4gICAgYnlLaW5kLnNldCgxNSAvKiBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSAqLywgQ29kaWNvbi5zeW1ib2xFbnVtKTtcbiAgICBieUtpbmQuc2V0KDE2IC8qIENvbXBsZXRpb25JdGVtS2luZC5FbnVtTWVtYmVyICovLCBDb2RpY29uLnN5bWJvbEVudW1NZW1iZXIpO1xuICAgIGJ5S2luZC5zZXQoMTcgLyogQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQgKi8sIENvZGljb24uc3ltYm9sS2V5d29yZCk7XG4gICAgYnlLaW5kLnNldCgyNyAvKiBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCAqLywgQ29kaWNvbi5zeW1ib2xTbmlwcGV0KTtcbiAgICBieUtpbmQuc2V0KDE4IC8qIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ICovLCBDb2RpY29uLnN5bWJvbFRleHQpO1xuICAgIGJ5S2luZC5zZXQoMTkgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkNvbG9yICovLCBDb2RpY29uLnN5bWJvbENvbG9yKTtcbiAgICBieUtpbmQuc2V0KDIwIC8qIENvbXBsZXRpb25JdGVtS2luZC5GaWxlICovLCBDb2RpY29uLnN5bWJvbEZpbGUpO1xuICAgIGJ5S2luZC5zZXQoMjEgLyogQ29tcGxldGlvbkl0ZW1LaW5kLlJlZmVyZW5jZSAqLywgQ29kaWNvbi5zeW1ib2xSZWZlcmVuY2UpO1xuICAgIGJ5S2luZC5zZXQoMjIgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkN1c3RvbWNvbG9yICovLCBDb2RpY29uLnN5bWJvbEN1c3RvbUNvbG9yKTtcbiAgICBieUtpbmQuc2V0KDIzIC8qIENvbXBsZXRpb25JdGVtS2luZC5Gb2xkZXIgKi8sIENvZGljb24uc3ltYm9sRm9sZGVyKTtcbiAgICBieUtpbmQuc2V0KDI0IC8qIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyICovLCBDb2RpY29uLnN5bWJvbFR5cGVQYXJhbWV0ZXIpO1xuICAgIGJ5S2luZC5zZXQoMjUgLyogQ29tcGxldGlvbkl0ZW1LaW5kLlVzZXIgKi8sIENvZGljb24uYWNjb3VudCk7XG4gICAgYnlLaW5kLnNldCgyNiAvKiBDb21wbGV0aW9uSXRlbUtpbmQuSXNzdWUgKi8sIENvZGljb24uaXNzdWVzKTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0ljb24oa2luZCkge1xuICAgICAgICBsZXQgY29kaWNvbiA9IGJ5S2luZC5nZXQoa2luZCk7XG4gICAgICAgIGlmICghY29kaWNvbikge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdObyBjb2RpY29uIGZvdW5kIGZvciBDb21wbGV0aW9uSXRlbUtpbmQgJyArIGtpbmQpO1xuICAgICAgICAgICAgY29kaWNvbiA9IENvZGljb24uc3ltYm9sUHJvcGVydHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvZGljb247XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtS2luZHMudG9JY29uID0gdG9JY29uO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgTWFwKCk7XG4gICAgZGF0YS5zZXQoJ21ldGhvZCcsIDAgLyogQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZCAqLyk7XG4gICAgZGF0YS5zZXQoJ2Z1bmN0aW9uJywgMSAvKiBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gKi8pO1xuICAgIGRhdGEuc2V0KCdjb25zdHJ1Y3RvcicsIDIgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yICovKTtcbiAgICBkYXRhLnNldCgnZmllbGQnLCAzIC8qIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZCAqLyk7XG4gICAgZGF0YS5zZXQoJ3ZhcmlhYmxlJywgNCAvKiBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgKi8pO1xuICAgIGRhdGEuc2V0KCdjbGFzcycsIDUgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzICovKTtcbiAgICBkYXRhLnNldCgnc3RydWN0JywgNiAvKiBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ICovKTtcbiAgICBkYXRhLnNldCgnaW50ZXJmYWNlJywgNyAvKiBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlICovKTtcbiAgICBkYXRhLnNldCgnbW9kdWxlJywgOCAvKiBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlICovKTtcbiAgICBkYXRhLnNldCgncHJvcGVydHknLCA5IC8qIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eSAqLyk7XG4gICAgZGF0YS5zZXQoJ2V2ZW50JywgMTAgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ICovKTtcbiAgICBkYXRhLnNldCgnb3BlcmF0b3InLCAxMSAvKiBDb21wbGV0aW9uSXRlbUtpbmQuT3BlcmF0b3IgKi8pO1xuICAgIGRhdGEuc2V0KCd1bml0JywgMTIgLyogQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgKi8pO1xuICAgIGRhdGEuc2V0KCd2YWx1ZScsIDEzIC8qIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZSAqLyk7XG4gICAgZGF0YS5zZXQoJ2NvbnN0YW50JywgMTQgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50ICovKTtcbiAgICBkYXRhLnNldCgnZW51bScsIDE1IC8qIENvbXBsZXRpb25JdGVtS2luZC5FbnVtICovKTtcbiAgICBkYXRhLnNldCgnZW51bS1tZW1iZXInLCAxNiAvKiBDb21wbGV0aW9uSXRlbUtpbmQuRW51bU1lbWJlciAqLyk7XG4gICAgZGF0YS5zZXQoJ2VudW1NZW1iZXInLCAxNiAvKiBDb21wbGV0aW9uSXRlbUtpbmQuRW51bU1lbWJlciAqLyk7XG4gICAgZGF0YS5zZXQoJ2tleXdvcmQnLCAxNyAvKiBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCAqLyk7XG4gICAgZGF0YS5zZXQoJ3NuaXBwZXQnLCAyNyAvKiBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCAqLyk7XG4gICAgZGF0YS5zZXQoJ3RleHQnLCAxOCAvKiBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dCAqLyk7XG4gICAgZGF0YS5zZXQoJ2NvbG9yJywgMTkgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkNvbG9yICovKTtcbiAgICBkYXRhLnNldCgnZmlsZScsIDIwIC8qIENvbXBsZXRpb25JdGVtS2luZC5GaWxlICovKTtcbiAgICBkYXRhLnNldCgncmVmZXJlbmNlJywgMjEgLyogQ29tcGxldGlvbkl0ZW1LaW5kLlJlZmVyZW5jZSAqLyk7XG4gICAgZGF0YS5zZXQoJ2N1c3RvbWNvbG9yJywgMjIgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkN1c3RvbWNvbG9yICovKTtcbiAgICBkYXRhLnNldCgnZm9sZGVyJywgMjMgLyogQ29tcGxldGlvbkl0ZW1LaW5kLkZvbGRlciAqLyk7XG4gICAgZGF0YS5zZXQoJ3R5cGUtcGFyYW1ldGVyJywgMjQgLyogQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgKi8pO1xuICAgIGRhdGEuc2V0KCd0eXBlUGFyYW1ldGVyJywgMjQgLyogQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgKi8pO1xuICAgIGRhdGEuc2V0KCdhY2NvdW50JywgMjUgLyogQ29tcGxldGlvbkl0ZW1LaW5kLlVzZXIgKi8pO1xuICAgIGRhdGEuc2V0KCdpc3N1ZScsIDI2IC8qIENvbXBsZXRpb25JdGVtS2luZC5Jc3N1ZSAqLyk7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVN0cmluZyh2YWx1ZSwgc3RyaWN0KSB7XG4gICAgICAgIGxldCByZXMgPSBkYXRhLmdldCh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAndW5kZWZpbmVkJyAmJiAhc3RyaWN0KSB7XG4gICAgICAgICAgICByZXMgPSA5IC8qIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eSAqLztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUtpbmRzLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xufSkoQ29tcGxldGlvbkl0ZW1LaW5kcyB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kcyA9IHt9KSk7XG4vKipcbiAqIEhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbnNQcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC5cbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICogSXQgaXMgc3VmZmljaWVudCB0byByZXR1cm4gYSBzaW5nbGUgY29tcGxldGlvbiBpdGVtIGluIHRoaXMgY2FzZS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmRbSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kW1wiQXV0b21hdGljXCJdID0gMF0gPSBcIkF1dG9tYXRpY1wiO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBleHBsaWNpdGx5IGJ5IGEgdXNlciBnZXN0dXJlLlxuICAgICAqIFJldHVybiBtdWx0aXBsZSBjb21wbGV0aW9uIGl0ZW1zIHRvIGVuYWJsZSBjeWNsaW5nIHRocm91Z2ggdGhlbS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmRbSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kW1wiRXhwbGljaXRcIl0gPSAxXSA9IFwiRXhwbGljaXRcIjtcbn0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTtcbmV4cG9ydCBjbGFzcyBTZWxlY3RlZFN1Z2dlc3Rpb25JbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihyYW5nZSwgdGV4dCwgY29tcGxldGlvbktpbmQsIGlzU25pcHBldFRleHQpIHtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmNvbXBsZXRpb25LaW5kID0gY29tcGxldGlvbktpbmQ7XG4gICAgICAgIHRoaXMuaXNTbmlwcGV0VGV4dCA9IGlzU25pcHBldFRleHQ7XG4gICAgfVxuICAgIGVxdWFscyhvdGhlcikge1xuICAgICAgICByZXR1cm4gUmFuZ2UubGlmdCh0aGlzLnJhbmdlKS5lcXVhbHNSYW5nZShvdGhlci5yYW5nZSlcbiAgICAgICAgICAgICYmIHRoaXMudGV4dCA9PT0gb3RoZXIudGV4dFxuICAgICAgICAgICAgJiYgdGhpcy5jb21wbGV0aW9uS2luZCA9PT0gb3RoZXIuY29tcGxldGlvbktpbmRcbiAgICAgICAgICAgICYmIHRoaXMuaXNTbmlwcGV0VGV4dCA9PT0gb3RoZXIuaXNTbmlwcGV0VGV4dDtcbiAgICB9XG59XG5leHBvcnQgdmFyIFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kKSB7XG4gICAgU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kW1NpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFtcIkludm9rZVwiXSA9IDFdID0gXCJJbnZva2VcIjtcbiAgICBTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmRbU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kW1wiVHJpZ2dlckNoYXJhY3RlclwiXSA9IDJdID0gXCJUcmlnZ2VyQ2hhcmFjdGVyXCI7XG4gICAgU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kW1NpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFtcIkNvbnRlbnRDaGFuZ2VcIl0gPSAzXSA9IFwiQ29udGVudENoYW5nZVwiO1xufSkoU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kIHx8IChTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kW0RvY3VtZW50SGlnaGxpZ2h0S2luZFtcIlRleHRcIl0gPSAwXSA9IFwiVGV4dFwiO1xuICAgIC8qKlxuICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmRbRG9jdW1lbnRIaWdobGlnaHRLaW5kW1wiUmVhZFwiXSA9IDFdID0gXCJSZWFkXCI7XG4gICAgLyoqXG4gICAgICogV3JpdGUtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmRbRG9jdW1lbnRIaWdobGlnaHRLaW5kW1wiV3JpdGVcIl0gPSAyXSA9IFwiV3JpdGVcIjtcbn0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvY2F0aW9uTGluayh0aGluZykge1xuICAgIHJldHVybiB0aGluZ1xuICAgICAgICAmJiBVUkkuaXNVcmkodGhpbmcudXJpKVxuICAgICAgICAmJiBSYW5nZS5pc0lSYW5nZSh0aGluZy5yYW5nZSlcbiAgICAgICAgJiYgKFJhbmdlLmlzSVJhbmdlKHRoaW5nLm9yaWdpblNlbGVjdGlvblJhbmdlKSB8fCBSYW5nZS5pc0lSYW5nZSh0aGluZy50YXJnZXRTZWxlY3Rpb25SYW5nZSkpO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bWJvbEtpbmROYW1lcyA9IHtcbiAgICBbMTcgLyogU3ltYm9sS2luZC5BcnJheSAqL106IGxvY2FsaXplKCdBcnJheScsIFwiYXJyYXlcIiksXG4gICAgWzE2IC8qIFN5bWJvbEtpbmQuQm9vbGVhbiAqL106IGxvY2FsaXplKCdCb29sZWFuJywgXCJib29sZWFuXCIpLFxuICAgIFs0IC8qIFN5bWJvbEtpbmQuQ2xhc3MgKi9dOiBsb2NhbGl6ZSgnQ2xhc3MnLCBcImNsYXNzXCIpLFxuICAgIFsxMyAvKiBTeW1ib2xLaW5kLkNvbnN0YW50ICovXTogbG9jYWxpemUoJ0NvbnN0YW50JywgXCJjb25zdGFudFwiKSxcbiAgICBbOCAvKiBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yICovXTogbG9jYWxpemUoJ0NvbnN0cnVjdG9yJywgXCJjb25zdHJ1Y3RvclwiKSxcbiAgICBbOSAvKiBTeW1ib2xLaW5kLkVudW0gKi9dOiBsb2NhbGl6ZSgnRW51bScsIFwiZW51bWVyYXRpb25cIiksXG4gICAgWzIxIC8qIFN5bWJvbEtpbmQuRW51bU1lbWJlciAqL106IGxvY2FsaXplKCdFbnVtTWVtYmVyJywgXCJlbnVtZXJhdGlvbiBtZW1iZXJcIiksXG4gICAgWzIzIC8qIFN5bWJvbEtpbmQuRXZlbnQgKi9dOiBsb2NhbGl6ZSgnRXZlbnQnLCBcImV2ZW50XCIpLFxuICAgIFs3IC8qIFN5bWJvbEtpbmQuRmllbGQgKi9dOiBsb2NhbGl6ZSgnRmllbGQnLCBcImZpZWxkXCIpLFxuICAgIFswIC8qIFN5bWJvbEtpbmQuRmlsZSAqL106IGxvY2FsaXplKCdGaWxlJywgXCJmaWxlXCIpLFxuICAgIFsxMSAvKiBTeW1ib2xLaW5kLkZ1bmN0aW9uICovXTogbG9jYWxpemUoJ0Z1bmN0aW9uJywgXCJmdW5jdGlvblwiKSxcbiAgICBbMTAgLyogU3ltYm9sS2luZC5JbnRlcmZhY2UgKi9dOiBsb2NhbGl6ZSgnSW50ZXJmYWNlJywgXCJpbnRlcmZhY2VcIiksXG4gICAgWzE5IC8qIFN5bWJvbEtpbmQuS2V5ICovXTogbG9jYWxpemUoJ0tleScsIFwia2V5XCIpLFxuICAgIFs1IC8qIFN5bWJvbEtpbmQuTWV0aG9kICovXTogbG9jYWxpemUoJ01ldGhvZCcsIFwibWV0aG9kXCIpLFxuICAgIFsxIC8qIFN5bWJvbEtpbmQuTW9kdWxlICovXTogbG9jYWxpemUoJ01vZHVsZScsIFwibW9kdWxlXCIpLFxuICAgIFsyIC8qIFN5bWJvbEtpbmQuTmFtZXNwYWNlICovXTogbG9jYWxpemUoJ05hbWVzcGFjZScsIFwibmFtZXNwYWNlXCIpLFxuICAgIFsyMCAvKiBTeW1ib2xLaW5kLk51bGwgKi9dOiBsb2NhbGl6ZSgnTnVsbCcsIFwibnVsbFwiKSxcbiAgICBbMTUgLyogU3ltYm9sS2luZC5OdW1iZXIgKi9dOiBsb2NhbGl6ZSgnTnVtYmVyJywgXCJudW1iZXJcIiksXG4gICAgWzE4IC8qIFN5bWJvbEtpbmQuT2JqZWN0ICovXTogbG9jYWxpemUoJ09iamVjdCcsIFwib2JqZWN0XCIpLFxuICAgIFsyNCAvKiBTeW1ib2xLaW5kLk9wZXJhdG9yICovXTogbG9jYWxpemUoJ09wZXJhdG9yJywgXCJvcGVyYXRvclwiKSxcbiAgICBbMyAvKiBTeW1ib2xLaW5kLlBhY2thZ2UgKi9dOiBsb2NhbGl6ZSgnUGFja2FnZScsIFwicGFja2FnZVwiKSxcbiAgICBbNiAvKiBTeW1ib2xLaW5kLlByb3BlcnR5ICovXTogbG9jYWxpemUoJ1Byb3BlcnR5JywgXCJwcm9wZXJ0eVwiKSxcbiAgICBbMTQgLyogU3ltYm9sS2luZC5TdHJpbmcgKi9dOiBsb2NhbGl6ZSgnU3RyaW5nJywgXCJzdHJpbmdcIiksXG4gICAgWzIyIC8qIFN5bWJvbEtpbmQuU3RydWN0ICovXTogbG9jYWxpemUoJ1N0cnVjdCcsIFwic3RydWN0XCIpLFxuICAgIFsyNSAvKiBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgKi9dOiBsb2NhbGl6ZSgnVHlwZVBhcmFtZXRlcicsIFwidHlwZSBwYXJhbWV0ZXJcIiksXG4gICAgWzEyIC8qIFN5bWJvbEtpbmQuVmFyaWFibGUgKi9dOiBsb2NhbGl6ZSgnVmFyaWFibGUnLCBcInZhcmlhYmxlXCIpLFxufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcmlhTGFiZWxGb3JTeW1ib2woc3ltYm9sTmFtZSwga2luZCkge1xuICAgIHJldHVybiBsb2NhbGl6ZSgnc3ltYm9sQXJpYUxhYmVsJywgJ3swfSAoezF9KScsIHN5bWJvbE5hbWUsIHN5bWJvbEtpbmROYW1lc1traW5kXSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdmFyIFN5bWJvbEtpbmRzO1xuKGZ1bmN0aW9uIChTeW1ib2xLaW5kcykge1xuICAgIGNvbnN0IGJ5S2luZCA9IG5ldyBNYXAoKTtcbiAgICBieUtpbmQuc2V0KDAgLyogU3ltYm9sS2luZC5GaWxlICovLCBDb2RpY29uLnN5bWJvbEZpbGUpO1xuICAgIGJ5S2luZC5zZXQoMSAvKiBTeW1ib2xLaW5kLk1vZHVsZSAqLywgQ29kaWNvbi5zeW1ib2xNb2R1bGUpO1xuICAgIGJ5S2luZC5zZXQoMiAvKiBTeW1ib2xLaW5kLk5hbWVzcGFjZSAqLywgQ29kaWNvbi5zeW1ib2xOYW1lc3BhY2UpO1xuICAgIGJ5S2luZC5zZXQoMyAvKiBTeW1ib2xLaW5kLlBhY2thZ2UgKi8sIENvZGljb24uc3ltYm9sUGFja2FnZSk7XG4gICAgYnlLaW5kLnNldCg0IC8qIFN5bWJvbEtpbmQuQ2xhc3MgKi8sIENvZGljb24uc3ltYm9sQ2xhc3MpO1xuICAgIGJ5S2luZC5zZXQoNSAvKiBTeW1ib2xLaW5kLk1ldGhvZCAqLywgQ29kaWNvbi5zeW1ib2xNZXRob2QpO1xuICAgIGJ5S2luZC5zZXQoNiAvKiBTeW1ib2xLaW5kLlByb3BlcnR5ICovLCBDb2RpY29uLnN5bWJvbFByb3BlcnR5KTtcbiAgICBieUtpbmQuc2V0KDcgLyogU3ltYm9sS2luZC5GaWVsZCAqLywgQ29kaWNvbi5zeW1ib2xGaWVsZCk7XG4gICAgYnlLaW5kLnNldCg4IC8qIFN5bWJvbEtpbmQuQ29uc3RydWN0b3IgKi8sIENvZGljb24uc3ltYm9sQ29uc3RydWN0b3IpO1xuICAgIGJ5S2luZC5zZXQoOSAvKiBTeW1ib2xLaW5kLkVudW0gKi8sIENvZGljb24uc3ltYm9sRW51bSk7XG4gICAgYnlLaW5kLnNldCgxMCAvKiBTeW1ib2xLaW5kLkludGVyZmFjZSAqLywgQ29kaWNvbi5zeW1ib2xJbnRlcmZhY2UpO1xuICAgIGJ5S2luZC5zZXQoMTEgLyogU3ltYm9sS2luZC5GdW5jdGlvbiAqLywgQ29kaWNvbi5zeW1ib2xGdW5jdGlvbik7XG4gICAgYnlLaW5kLnNldCgxMiAvKiBTeW1ib2xLaW5kLlZhcmlhYmxlICovLCBDb2RpY29uLnN5bWJvbFZhcmlhYmxlKTtcbiAgICBieUtpbmQuc2V0KDEzIC8qIFN5bWJvbEtpbmQuQ29uc3RhbnQgKi8sIENvZGljb24uc3ltYm9sQ29uc3RhbnQpO1xuICAgIGJ5S2luZC5zZXQoMTQgLyogU3ltYm9sS2luZC5TdHJpbmcgKi8sIENvZGljb24uc3ltYm9sU3RyaW5nKTtcbiAgICBieUtpbmQuc2V0KDE1IC8qIFN5bWJvbEtpbmQuTnVtYmVyICovLCBDb2RpY29uLnN5bWJvbE51bWJlcik7XG4gICAgYnlLaW5kLnNldCgxNiAvKiBTeW1ib2xLaW5kLkJvb2xlYW4gKi8sIENvZGljb24uc3ltYm9sQm9vbGVhbik7XG4gICAgYnlLaW5kLnNldCgxNyAvKiBTeW1ib2xLaW5kLkFycmF5ICovLCBDb2RpY29uLnN5bWJvbEFycmF5KTtcbiAgICBieUtpbmQuc2V0KDE4IC8qIFN5bWJvbEtpbmQuT2JqZWN0ICovLCBDb2RpY29uLnN5bWJvbE9iamVjdCk7XG4gICAgYnlLaW5kLnNldCgxOSAvKiBTeW1ib2xLaW5kLktleSAqLywgQ29kaWNvbi5zeW1ib2xLZXkpO1xuICAgIGJ5S2luZC5zZXQoMjAgLyogU3ltYm9sS2luZC5OdWxsICovLCBDb2RpY29uLnN5bWJvbE51bGwpO1xuICAgIGJ5S2luZC5zZXQoMjEgLyogU3ltYm9sS2luZC5FbnVtTWVtYmVyICovLCBDb2RpY29uLnN5bWJvbEVudW1NZW1iZXIpO1xuICAgIGJ5S2luZC5zZXQoMjIgLyogU3ltYm9sS2luZC5TdHJ1Y3QgKi8sIENvZGljb24uc3ltYm9sU3RydWN0KTtcbiAgICBieUtpbmQuc2V0KDIzIC8qIFN5bWJvbEtpbmQuRXZlbnQgKi8sIENvZGljb24uc3ltYm9sRXZlbnQpO1xuICAgIGJ5S2luZC5zZXQoMjQgLyogU3ltYm9sS2luZC5PcGVyYXRvciAqLywgQ29kaWNvbi5zeW1ib2xPcGVyYXRvcik7XG4gICAgYnlLaW5kLnNldCgyNSAvKiBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgKi8sIENvZGljb24uc3ltYm9sVHlwZVBhcmFtZXRlcik7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JY29uKGtpbmQpIHtcbiAgICAgICAgbGV0IGljb24gPSBieUtpbmQuZ2V0KGtpbmQpO1xuICAgICAgICBpZiAoIWljb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnTm8gY29kaWNvbiBmb3VuZCBmb3IgU3ltYm9sS2luZCAnICsga2luZCk7XG4gICAgICAgICAgICBpY29uID0gQ29kaWNvbi5zeW1ib2xQcm9wZXJ0eTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWNvbjtcbiAgICB9XG4gICAgU3ltYm9sS2luZHMudG9JY29uID0gdG9JY29uO1xufSkoU3ltYm9sS2luZHMgfHwgKFN5bWJvbEtpbmRzID0ge30pKTtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjbGFzcyBUZXh0RWRpdCB7XG59XG5leHBvcnQgY2xhc3MgRm9sZGluZ1JhbmdlS2luZCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBGb2xkaW5nUmFuZ2VLaW5kfSBmb3IgdGhlIGdpdmVuIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIG9mIHRoZSBraW5kLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tVmFsdWUodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHJldHVybiBGb2xkaW5nUmFuZ2VLaW5kLkNvbW1lbnQ7XG4gICAgICAgICAgICBjYXNlICdpbXBvcnRzJzogcmV0dXJuIEZvbGRpbmdSYW5nZUtpbmQuSW1wb3J0cztcbiAgICAgICAgICAgIGNhc2UgJ3JlZ2lvbic6IHJldHVybiBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZvbGRpbmdSYW5nZUtpbmQodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBGb2xkaW5nUmFuZ2VLaW5kfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBvZiB0aGUga2luZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxufVxuLyoqXG4gKiBLaW5kIGZvciBmb2xkaW5nIHJhbmdlIHJlcHJlc2VudGluZyBhIGNvbW1lbnQuIFRoZSB2YWx1ZSBvZiB0aGUga2luZCBpcyAnY29tbWVudCcuXG4gKi9cbkZvbGRpbmdSYW5nZUtpbmQuQ29tbWVudCA9IG5ldyBGb2xkaW5nUmFuZ2VLaW5kKCdjb21tZW50Jyk7XG4vKipcbiAqIEtpbmQgZm9yIGZvbGRpbmcgcmFuZ2UgcmVwcmVzZW50aW5nIGEgaW1wb3J0LiBUaGUgdmFsdWUgb2YgdGhlIGtpbmQgaXMgJ2ltcG9ydHMnLlxuICovXG5Gb2xkaW5nUmFuZ2VLaW5kLkltcG9ydHMgPSBuZXcgRm9sZGluZ1JhbmdlS2luZCgnaW1wb3J0cycpO1xuLyoqXG4gKiBLaW5kIGZvciBmb2xkaW5nIHJhbmdlIHJlcHJlc2VudGluZyByZWdpb25zIChmb3IgZXhhbXBsZSBtYXJrZWQgYnkgYCNyZWdpb25gLCBgI2VuZHJlZ2lvbmApLlxuICogVGhlIHZhbHVlIG9mIHRoZSBraW5kIGlzICdyZWdpb24nLlxuICovXG5Gb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9IG5ldyBGb2xkaW5nUmFuZ2VLaW5kKCdyZWdpb24nKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB2YXIgQ29tbWFuZDtcbihmdW5jdGlvbiAoQ29tbWFuZCkge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKG9iaikge1xuICAgICAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqLmlkID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai50aXRsZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRLaW5kO1xuKGZ1bmN0aW9uIChJbmxheUhpbnRLaW5kKSB7XG4gICAgSW5sYXlIaW50S2luZFtJbmxheUhpbnRLaW5kW1wiVHlwZVwiXSA9IDFdID0gXCJUeXBlXCI7XG4gICAgSW5sYXlIaW50S2luZFtJbmxheUhpbnRLaW5kW1wiUGFyYW1ldGVyXCJdID0gMl0gPSBcIlBhcmFtZXRlclwiO1xufSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTGF6eVRva2VuaXphdGlvblN1cHBvcnQge1xuICAgIGNvbnN0cnVjdG9yKGNyZWF0ZVN1cHBvcnQpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVTdXBwb3J0ID0gY3JlYXRlU3VwcG9ydDtcbiAgICAgICAgdGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydCA9IG51bGw7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0KSB7XG4gICAgICAgICAgICB0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0LnRoZW4oKHN1cHBvcnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgdG9rZW5pemF0aW9uU3VwcG9ydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0KSB7XG4gICAgICAgICAgICB0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0ID0gdGhpcy5jcmVhdGVTdXBwb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFRva2VuaXphdGlvblJlZ2lzdHJ5ID0gbmV3IFRva2VuaXphdGlvblJlZ2lzdHJ5SW1wbCgpO1xuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUuIERPIE5PVCBFRElUIERJUkVDVExZLlxuZXhwb3J0IHZhciBBY2Nlc3NpYmlsaXR5U3VwcG9ydDtcbihmdW5jdGlvbiAoQWNjZXNzaWJpbGl0eVN1cHBvcnQpIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIHNob3VsZCBiZSB0aGUgYnJvd3NlciBjYXNlIHdoZXJlIGl0IGlzIG5vdCBrbm93biBpZiBhIHNjcmVlbiByZWFkZXIgaXMgYXR0YWNoZWQgb3Igbm8uXG4gICAgICovXG4gICAgQWNjZXNzaWJpbGl0eVN1cHBvcnRbQWNjZXNzaWJpbGl0eVN1cHBvcnRbXCJVbmtub3duXCJdID0gMF0gPSBcIlVua25vd25cIjtcbiAgICBBY2Nlc3NpYmlsaXR5U3VwcG9ydFtBY2Nlc3NpYmlsaXR5U3VwcG9ydFtcIkRpc2FibGVkXCJdID0gMV0gPSBcIkRpc2FibGVkXCI7XG4gICAgQWNjZXNzaWJpbGl0eVN1cHBvcnRbQWNjZXNzaWJpbGl0eVN1cHBvcnRbXCJFbmFibGVkXCJdID0gMl0gPSBcIkVuYWJsZWRcIjtcbn0pKEFjY2Vzc2liaWxpdHlTdXBwb3J0IHx8IChBY2Nlc3NpYmlsaXR5U3VwcG9ydCA9IHt9KSk7XG5leHBvcnQgdmFyIENvZGVBY3Rpb25UcmlnZ2VyVHlwZTtcbihmdW5jdGlvbiAoQ29kZUFjdGlvblRyaWdnZXJUeXBlKSB7XG4gICAgQ29kZUFjdGlvblRyaWdnZXJUeXBlW0NvZGVBY3Rpb25UcmlnZ2VyVHlwZVtcIkludm9rZVwiXSA9IDFdID0gXCJJbnZva2VcIjtcbiAgICBDb2RlQWN0aW9uVHJpZ2dlclR5cGVbQ29kZUFjdGlvblRyaWdnZXJUeXBlW1wiQXV0b1wiXSA9IDJdID0gXCJBdXRvXCI7XG59KShDb2RlQWN0aW9uVHJpZ2dlclR5cGUgfHwgKENvZGVBY3Rpb25UcmlnZ2VyVHlwZSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGU7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUpIHtcbiAgICBDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlW0NvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGVbXCJOb25lXCJdID0gMF0gPSBcIk5vbmVcIjtcbiAgICAvKipcbiAgICAgKiBBZGp1c3Qgd2hpdGVzcGFjZS9pbmRlbnRhdGlvbiBvZiBtdWx0aWxpbmUgaW5zZXJ0IHRleHRzIHRvXG4gICAgICogbWF0Y2ggdGhlIGN1cnJlbnQgbGluZSBpbmRlbnRhdGlvbi5cbiAgICAgKi9cbiAgICBDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlW0NvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGVbXCJLZWVwV2hpdGVzcGFjZVwiXSA9IDFdID0gXCJLZWVwV2hpdGVzcGFjZVwiO1xuICAgIC8qKlxuICAgICAqIGBpbnNlcnRUZXh0YCBpcyBhIHNuaXBwZXQuXG4gICAgICovXG4gICAgQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZVtDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlW1wiSW5zZXJ0QXNTbmlwcGV0XCJdID0gNF0gPSBcIkluc2VydEFzU25pcHBldFwiO1xufSkoQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZSB8fCAoQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtS2luZDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kKSB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFtcIk1ldGhvZFwiXSA9IDBdID0gXCJNZXRob2RcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiRnVuY3Rpb25cIl0gPSAxXSA9IFwiRnVuY3Rpb25cIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiQ29uc3RydWN0b3JcIl0gPSAyXSA9IFwiQ29uc3RydWN0b3JcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiRmllbGRcIl0gPSAzXSA9IFwiRmllbGRcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiVmFyaWFibGVcIl0gPSA0XSA9IFwiVmFyaWFibGVcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiQ2xhc3NcIl0gPSA1XSA9IFwiQ2xhc3NcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiU3RydWN0XCJdID0gNl0gPSBcIlN0cnVjdFwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJJbnRlcmZhY2VcIl0gPSA3XSA9IFwiSW50ZXJmYWNlXCI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFtcIk1vZHVsZVwiXSA9IDhdID0gXCJNb2R1bGVcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiUHJvcGVydHlcIl0gPSA5XSA9IFwiUHJvcGVydHlcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiRXZlbnRcIl0gPSAxMF0gPSBcIkV2ZW50XCI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFtcIk9wZXJhdG9yXCJdID0gMTFdID0gXCJPcGVyYXRvclwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJVbml0XCJdID0gMTJdID0gXCJVbml0XCI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFtcIlZhbHVlXCJdID0gMTNdID0gXCJWYWx1ZVwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJDb25zdGFudFwiXSA9IDE0XSA9IFwiQ29uc3RhbnRcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiRW51bVwiXSA9IDE1XSA9IFwiRW51bVwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJFbnVtTWVtYmVyXCJdID0gMTZdID0gXCJFbnVtTWVtYmVyXCI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFtcIktleXdvcmRcIl0gPSAxN10gPSBcIktleXdvcmRcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiVGV4dFwiXSA9IDE4XSA9IFwiVGV4dFwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJDb2xvclwiXSA9IDE5XSA9IFwiQ29sb3JcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiRmlsZVwiXSA9IDIwXSA9IFwiRmlsZVwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJSZWZlcmVuY2VcIl0gPSAyMV0gPSBcIlJlZmVyZW5jZVwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJDdXN0b21jb2xvclwiXSA9IDIyXSA9IFwiQ3VzdG9tY29sb3JcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiRm9sZGVyXCJdID0gMjNdID0gXCJGb2xkZXJcIjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kW1wiVHlwZVBhcmFtZXRlclwiXSA9IDI0XSA9IFwiVHlwZVBhcmFtZXRlclwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJVc2VyXCJdID0gMjVdID0gXCJVc2VyXCI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFtcIklzc3VlXCJdID0gMjZdID0gXCJJc3N1ZVwiO1xuICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbXCJTbmlwcGV0XCJdID0gMjddID0gXCJTbmlwcGV0XCI7XG59KShDb21wbGV0aW9uSXRlbUtpbmQgfHwgKENvbXBsZXRpb25JdGVtS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIENvbXBsZXRpb25JdGVtVGFnW0NvbXBsZXRpb25JdGVtVGFnW1wiRGVwcmVjYXRlZFwiXSA9IDFdID0gXCJEZXByZWNhdGVkXCI7XG59KShDb21wbGV0aW9uSXRlbVRhZyB8fCAoQ29tcGxldGlvbkl0ZW1UYWcgPSB7fSkpO1xuLyoqXG4gKiBIb3cgYSBzdWdnZXN0IHByb3ZpZGVyIHdhcyB0cmlnZ2VyZWQuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICBDb21wbGV0aW9uVHJpZ2dlcktpbmRbQ29tcGxldGlvblRyaWdnZXJLaW5kW1wiSW52b2tlXCJdID0gMF0gPSBcIkludm9rZVwiO1xuICAgIENvbXBsZXRpb25UcmlnZ2VyS2luZFtDb21wbGV0aW9uVHJpZ2dlcktpbmRbXCJUcmlnZ2VyQ2hhcmFjdGVyXCJdID0gMV0gPSBcIlRyaWdnZXJDaGFyYWN0ZXJcIjtcbiAgICBDb21wbGV0aW9uVHJpZ2dlcktpbmRbQ29tcGxldGlvblRyaWdnZXJLaW5kW1wiVHJpZ2dlckZvckluY29tcGxldGVDb21wbGV0aW9uc1wiXSA9IDJdID0gXCJUcmlnZ2VyRm9ySW5jb21wbGV0ZUNvbXBsZXRpb25zXCI7XG59KShDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKENvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG4vKipcbiAqIEEgcG9zaXRpb25pbmcgcHJlZmVyZW5jZSBmb3IgcmVuZGVyaW5nIGNvbnRlbnQgd2lkZ2V0cy5cbiAqL1xuZXhwb3J0IHZhciBDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlO1xuKGZ1bmN0aW9uIChDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlKSB7XG4gICAgLyoqXG4gICAgICogUGxhY2UgdGhlIGNvbnRlbnQgd2lkZ2V0IGV4YWN0bHkgYXQgYSBwb3NpdGlvblxuICAgICAqL1xuICAgIENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtcIkVYQUNUXCJdID0gMF0gPSBcIkVYQUNUXCI7XG4gICAgLyoqXG4gICAgICogUGxhY2UgdGhlIGNvbnRlbnQgd2lkZ2V0IGFib3ZlIGEgcG9zaXRpb25cbiAgICAgKi9cbiAgICBDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlW0NvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbXCJBQk9WRVwiXSA9IDFdID0gXCJBQk9WRVwiO1xuICAgIC8qKlxuICAgICAqIFBsYWNlIHRoZSBjb250ZW50IHdpZGdldCBiZWxvdyBhIHBvc2l0aW9uXG4gICAgICovXG4gICAgQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlW1wiQkVMT1dcIl0gPSAyXSA9IFwiQkVMT1dcIjtcbn0pKENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2UgfHwgKENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2UgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgdGhlIHJlYXNvbiB0aGUgY3Vyc29yIGhhcyBjaGFuZ2VkIGl0cyBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IHZhciBDdXJzb3JDaGFuZ2VSZWFzb247XG4oZnVuY3Rpb24gKEN1cnNvckNoYW5nZVJlYXNvbikge1xuICAgIC8qKlxuICAgICAqIFVua25vd24gb3Igbm90IHNldC5cbiAgICAgKi9cbiAgICBDdXJzb3JDaGFuZ2VSZWFzb25bQ3Vyc29yQ2hhbmdlUmVhc29uW1wiTm90U2V0XCJdID0gMF0gPSBcIk5vdFNldFwiO1xuICAgIC8qKlxuICAgICAqIEEgYG1vZGVsLnNldFZhbHVlKClgIHdhcyBjYWxsZWQuXG4gICAgICovXG4gICAgQ3Vyc29yQ2hhbmdlUmVhc29uW0N1cnNvckNoYW5nZVJlYXNvbltcIkNvbnRlbnRGbHVzaFwiXSA9IDFdID0gXCJDb250ZW50Rmx1c2hcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgYG1vZGVsYCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgb2YgdGhpcyBjdXJzb3IgYW5kIHRoZSBjdXJzb3IgcmVjb3ZlcnMgaXRzIHBvc2l0aW9uIGZyb20gYXNzb2NpYXRlZCBtYXJrZXJzLlxuICAgICAqL1xuICAgIEN1cnNvckNoYW5nZVJlYXNvbltDdXJzb3JDaGFuZ2VSZWFzb25bXCJSZWNvdmVyRnJvbU1hcmtlcnNcIl0gPSAyXSA9IFwiUmVjb3ZlckZyb21NYXJrZXJzXCI7XG4gICAgLyoqXG4gICAgICogVGhlcmUgd2FzIGFuIGV4cGxpY2l0IHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBDdXJzb3JDaGFuZ2VSZWFzb25bQ3Vyc29yQ2hhbmdlUmVhc29uW1wiRXhwbGljaXRcIl0gPSAzXSA9IFwiRXhwbGljaXRcIjtcbiAgICAvKipcbiAgICAgKiBUaGVyZSB3YXMgYSBQYXN0ZS5cbiAgICAgKi9cbiAgICBDdXJzb3JDaGFuZ2VSZWFzb25bQ3Vyc29yQ2hhbmdlUmVhc29uW1wiUGFzdGVcIl0gPSA0XSA9IFwiUGFzdGVcIjtcbiAgICAvKipcbiAgICAgKiBUaGVyZSB3YXMgYW4gVW5kby5cbiAgICAgKi9cbiAgICBDdXJzb3JDaGFuZ2VSZWFzb25bQ3Vyc29yQ2hhbmdlUmVhc29uW1wiVW5kb1wiXSA9IDVdID0gXCJVbmRvXCI7XG4gICAgLyoqXG4gICAgICogVGhlcmUgd2FzIGEgUmVkby5cbiAgICAgKi9cbiAgICBDdXJzb3JDaGFuZ2VSZWFzb25bQ3Vyc29yQ2hhbmdlUmVhc29uW1wiUmVkb1wiXSA9IDZdID0gXCJSZWRvXCI7XG59KShDdXJzb3JDaGFuZ2VSZWFzb24gfHwgKEN1cnNvckNoYW5nZVJlYXNvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGVuZCBvZiBsaW5lIHRvIHVzZSB3aGVuIGluc3RhbnRpYXRpbmcgbW9kZWxzLlxuICovXG5leHBvcnQgdmFyIERlZmF1bHRFbmRPZkxpbmU7XG4oZnVuY3Rpb24gKERlZmF1bHRFbmRPZkxpbmUpIHtcbiAgICAvKipcbiAgICAgKiBVc2UgbGluZSBmZWVkIChcXG4pIGFzIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgRGVmYXVsdEVuZE9mTGluZVtEZWZhdWx0RW5kT2ZMaW5lW1wiTEZcIl0gPSAxXSA9IFwiTEZcIjtcbiAgICAvKipcbiAgICAgKiBVc2UgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQgKFxcclxcbikgYXMgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBEZWZhdWx0RW5kT2ZMaW5lW0RlZmF1bHRFbmRPZkxpbmVbXCJDUkxGXCJdID0gMl0gPSBcIkNSTEZcIjtcbn0pKERlZmF1bHRFbmRPZkxpbmUgfHwgKERlZmF1bHRFbmRPZkxpbmUgPSB7fSkpO1xuLyoqXG4gKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kW0RvY3VtZW50SGlnaGxpZ2h0S2luZFtcIlRleHRcIl0gPSAwXSA9IFwiVGV4dFwiO1xuICAgIC8qKlxuICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmRbRG9jdW1lbnRIaWdobGlnaHRLaW5kW1wiUmVhZFwiXSA9IDFdID0gXCJSZWFkXCI7XG4gICAgLyoqXG4gICAgICogV3JpdGUtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmRbRG9jdW1lbnRIaWdobGlnaHRLaW5kW1wiV3JpdGVcIl0gPSAyXSA9IFwiV3JpdGVcIjtcbn0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTtcbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhdXRvIGluZGVudGF0aW9uIGluIHRoZSBlZGl0b3JcbiAqL1xuZXhwb3J0IHZhciBFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3k7XG4oZnVuY3Rpb24gKEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneSkge1xuICAgIEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneVtFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbXCJOb25lXCJdID0gMF0gPSBcIk5vbmVcIjtcbiAgICBFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5W1wiS2VlcFwiXSA9IDFdID0gXCJLZWVwXCI7XG4gICAgRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5W0VkaXRvckF1dG9JbmRlbnRTdHJhdGVneVtcIkJyYWNrZXRzXCJdID0gMl0gPSBcIkJyYWNrZXRzXCI7XG4gICAgRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5W0VkaXRvckF1dG9JbmRlbnRTdHJhdGVneVtcIkFkdmFuY2VkXCJdID0gM10gPSBcIkFkdmFuY2VkXCI7XG4gICAgRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5W0VkaXRvckF1dG9JbmRlbnRTdHJhdGVneVtcIkZ1bGxcIl0gPSA0XSA9IFwiRnVsbFwiO1xufSkoRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5IHx8IChFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3kgPSB7fSkpO1xuZXhwb3J0IHZhciBFZGl0b3JPcHRpb247XG4oZnVuY3Rpb24gKEVkaXRvck9wdGlvbikge1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJhY2NlcHRTdWdnZXN0aW9uT25Db21taXRDaGFyYWN0ZXJcIl0gPSAwXSA9IFwiYWNjZXB0U3VnZ2VzdGlvbk9uQ29tbWl0Q2hhcmFjdGVyXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyXCJdID0gMV0gPSBcImFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImFjY2Vzc2liaWxpdHlTdXBwb3J0XCJdID0gMl0gPSBcImFjY2Vzc2liaWxpdHlTdXBwb3J0XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImFjY2Vzc2liaWxpdHlQYWdlU2l6ZVwiXSA9IDNdID0gXCJhY2Nlc3NpYmlsaXR5UGFnZVNpemVcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiYXJpYUxhYmVsXCJdID0gNF0gPSBcImFyaWFMYWJlbFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJhcmlhUmVxdWlyZWRcIl0gPSA1XSA9IFwiYXJpYVJlcXVpcmVkXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImF1dG9DbG9zaW5nQnJhY2tldHNcIl0gPSA2XSA9IFwiYXV0b0Nsb3NpbmdCcmFja2V0c1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzY3JlZW5SZWFkZXJBbm5vdW5jZUlubGluZVN1Z2dlc3Rpb25cIl0gPSA3XSA9IFwic2NyZWVuUmVhZGVyQW5ub3VuY2VJbmxpbmVTdWdnZXN0aW9uXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImF1dG9DbG9zaW5nRGVsZXRlXCJdID0gOF0gPSBcImF1dG9DbG9zaW5nRGVsZXRlXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImF1dG9DbG9zaW5nT3ZlcnR5cGVcIl0gPSA5XSA9IFwiYXV0b0Nsb3NpbmdPdmVydHlwZVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJhdXRvQ2xvc2luZ1F1b3Rlc1wiXSA9IDEwXSA9IFwiYXV0b0Nsb3NpbmdRdW90ZXNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiYXV0b0luZGVudFwiXSA9IDExXSA9IFwiYXV0b0luZGVudFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJhdXRvbWF0aWNMYXlvdXRcIl0gPSAxMl0gPSBcImF1dG9tYXRpY0xheW91dFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJhdXRvU3Vycm91bmRcIl0gPSAxM10gPSBcImF1dG9TdXJyb3VuZFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJicmFja2V0UGFpckNvbG9yaXphdGlvblwiXSA9IDE0XSA9IFwiYnJhY2tldFBhaXJDb2xvcml6YXRpb25cIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZ3VpZGVzXCJdID0gMTVdID0gXCJndWlkZXNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiY29kZUxlbnNcIl0gPSAxNl0gPSBcImNvZGVMZW5zXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImNvZGVMZW5zRm9udEZhbWlseVwiXSA9IDE3XSA9IFwiY29kZUxlbnNGb250RmFtaWx5XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImNvZGVMZW5zRm9udFNpemVcIl0gPSAxOF0gPSBcImNvZGVMZW5zRm9udFNpemVcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiY29sb3JEZWNvcmF0b3JzXCJdID0gMTldID0gXCJjb2xvckRlY29yYXRvcnNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiY29sb3JEZWNvcmF0b3JzTGltaXRcIl0gPSAyMF0gPSBcImNvbG9yRGVjb3JhdG9yc0xpbWl0XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImNvbHVtblNlbGVjdGlvblwiXSA9IDIxXSA9IFwiY29sdW1uU2VsZWN0aW9uXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImNvbW1lbnRzXCJdID0gMjJdID0gXCJjb21tZW50c1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJjb250ZXh0bWVudVwiXSA9IDIzXSA9IFwiY29udGV4dG1lbnVcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiY29weVdpdGhTeW50YXhIaWdobGlnaHRpbmdcIl0gPSAyNF0gPSBcImNvcHlXaXRoU3ludGF4SGlnaGxpZ2h0aW5nXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImN1cnNvckJsaW5raW5nXCJdID0gMjVdID0gXCJjdXJzb3JCbGlua2luZ1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJjdXJzb3JTbW9vdGhDYXJldEFuaW1hdGlvblwiXSA9IDI2XSA9IFwiY3Vyc29yU21vb3RoQ2FyZXRBbmltYXRpb25cIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiY3Vyc29yU3R5bGVcIl0gPSAyN10gPSBcImN1cnNvclN0eWxlXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImN1cnNvclN1cnJvdW5kaW5nTGluZXNcIl0gPSAyOF0gPSBcImN1cnNvclN1cnJvdW5kaW5nTGluZXNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiY3Vyc29yU3Vycm91bmRpbmdMaW5lc1N0eWxlXCJdID0gMjldID0gXCJjdXJzb3JTdXJyb3VuZGluZ0xpbmVzU3R5bGVcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiY3Vyc29yV2lkdGhcIl0gPSAzMF0gPSBcImN1cnNvcldpZHRoXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImRpc2FibGVMYXllckhpbnRpbmdcIl0gPSAzMV0gPSBcImRpc2FibGVMYXllckhpbnRpbmdcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZGlzYWJsZU1vbm9zcGFjZU9wdGltaXphdGlvbnNcIl0gPSAzMl0gPSBcImRpc2FibGVNb25vc3BhY2VPcHRpbWl6YXRpb25zXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImRvbVJlYWRPbmx5XCJdID0gMzNdID0gXCJkb21SZWFkT25seVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJkcmFnQW5kRHJvcFwiXSA9IDM0XSA9IFwiZHJhZ0FuZERyb3BcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZHJvcEludG9FZGl0b3JcIl0gPSAzNV0gPSBcImRyb3BJbnRvRWRpdG9yXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImVtcHR5U2VsZWN0aW9uQ2xpcGJvYXJkXCJdID0gMzZdID0gXCJlbXB0eVNlbGVjdGlvbkNsaXBib2FyZFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJleHBlcmltZW50YWxXaGl0ZXNwYWNlUmVuZGVyaW5nXCJdID0gMzddID0gXCJleHBlcmltZW50YWxXaGl0ZXNwYWNlUmVuZGVyaW5nXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImV4dHJhRWRpdG9yQ2xhc3NOYW1lXCJdID0gMzhdID0gXCJleHRyYUVkaXRvckNsYXNzTmFtZVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJmYXN0U2Nyb2xsU2Vuc2l0aXZpdHlcIl0gPSAzOV0gPSBcImZhc3RTY3JvbGxTZW5zaXRpdml0eVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJmaW5kXCJdID0gNDBdID0gXCJmaW5kXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImZpeGVkT3ZlcmZsb3dXaWRnZXRzXCJdID0gNDFdID0gXCJmaXhlZE92ZXJmbG93V2lkZ2V0c1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJmb2xkaW5nXCJdID0gNDJdID0gXCJmb2xkaW5nXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImZvbGRpbmdTdHJhdGVneVwiXSA9IDQzXSA9IFwiZm9sZGluZ1N0cmF0ZWd5XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImZvbGRpbmdIaWdobGlnaHRcIl0gPSA0NF0gPSBcImZvbGRpbmdIaWdobGlnaHRcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZm9sZGluZ0ltcG9ydHNCeURlZmF1bHRcIl0gPSA0NV0gPSBcImZvbGRpbmdJbXBvcnRzQnlEZWZhdWx0XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImZvbGRpbmdNYXhpbXVtUmVnaW9uc1wiXSA9IDQ2XSA9IFwiZm9sZGluZ01heGltdW1SZWdpb25zXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInVuZm9sZE9uQ2xpY2tBZnRlckVuZE9mTGluZVwiXSA9IDQ3XSA9IFwidW5mb2xkT25DbGlja0FmdGVyRW5kT2ZMaW5lXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImZvbnRGYW1pbHlcIl0gPSA0OF0gPSBcImZvbnRGYW1pbHlcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZm9udEluZm9cIl0gPSA0OV0gPSBcImZvbnRJbmZvXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImZvbnRMaWdhdHVyZXNcIl0gPSA1MF0gPSBcImZvbnRMaWdhdHVyZXNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZm9udFNpemVcIl0gPSA1MV0gPSBcImZvbnRTaXplXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImZvbnRXZWlnaHRcIl0gPSA1Ml0gPSBcImZvbnRXZWlnaHRcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZm9udFZhcmlhdGlvbnNcIl0gPSA1M10gPSBcImZvbnRWYXJpYXRpb25zXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImZvcm1hdE9uUGFzdGVcIl0gPSA1NF0gPSBcImZvcm1hdE9uUGFzdGVcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZm9ybWF0T25UeXBlXCJdID0gNTVdID0gXCJmb3JtYXRPblR5cGVcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZ2x5cGhNYXJnaW5cIl0gPSA1Nl0gPSBcImdseXBoTWFyZ2luXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImdvdG9Mb2NhdGlvblwiXSA9IDU3XSA9IFwiZ290b0xvY2F0aW9uXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImhpZGVDdXJzb3JJbk92ZXJ2aWV3UnVsZXJcIl0gPSA1OF0gPSBcImhpZGVDdXJzb3JJbk92ZXJ2aWV3UnVsZXJcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiaG92ZXJcIl0gPSA1OV0gPSBcImhvdmVyXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImluRGlmZkVkaXRvclwiXSA9IDYwXSA9IFwiaW5EaWZmRWRpdG9yXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImlubGluZVN1Z2dlc3RcIl0gPSA2MV0gPSBcImlubGluZVN1Z2dlc3RcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wibGV0dGVyU3BhY2luZ1wiXSA9IDYyXSA9IFwibGV0dGVyU3BhY2luZ1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJsaWdodGJ1bGJcIl0gPSA2M10gPSBcImxpZ2h0YnVsYlwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJsaW5lRGVjb3JhdGlvbnNXaWR0aFwiXSA9IDY0XSA9IFwibGluZURlY29yYXRpb25zV2lkdGhcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wibGluZUhlaWdodFwiXSA9IDY1XSA9IFwibGluZUhlaWdodFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJsaW5lTnVtYmVyc1wiXSA9IDY2XSA9IFwibGluZU51bWJlcnNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wibGluZU51bWJlcnNNaW5DaGFyc1wiXSA9IDY3XSA9IFwibGluZU51bWJlcnNNaW5DaGFyc1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJsaW5rZWRFZGl0aW5nXCJdID0gNjhdID0gXCJsaW5rZWRFZGl0aW5nXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImxpbmtzXCJdID0gNjldID0gXCJsaW5rc1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJtYXRjaEJyYWNrZXRzXCJdID0gNzBdID0gXCJtYXRjaEJyYWNrZXRzXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcIm1pbmltYXBcIl0gPSA3MV0gPSBcIm1pbmltYXBcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wibW91c2VTdHlsZVwiXSA9IDcyXSA9IFwibW91c2VTdHlsZVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJtb3VzZVdoZWVsU2Nyb2xsU2Vuc2l0aXZpdHlcIl0gPSA3M10gPSBcIm1vdXNlV2hlZWxTY3JvbGxTZW5zaXRpdml0eVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJtb3VzZVdoZWVsWm9vbVwiXSA9IDc0XSA9IFwibW91c2VXaGVlbFpvb21cIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wibXVsdGlDdXJzb3JNZXJnZU92ZXJsYXBwaW5nXCJdID0gNzVdID0gXCJtdWx0aUN1cnNvck1lcmdlT3ZlcmxhcHBpbmdcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wibXVsdGlDdXJzb3JNb2RpZmllclwiXSA9IDc2XSA9IFwibXVsdGlDdXJzb3JNb2RpZmllclwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJtdWx0aUN1cnNvclBhc3RlXCJdID0gNzddID0gXCJtdWx0aUN1cnNvclBhc3RlXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcIm11bHRpQ3Vyc29yTGltaXRcIl0gPSA3OF0gPSBcIm11bHRpQ3Vyc29yTGltaXRcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wib2NjdXJyZW5jZXNIaWdobGlnaHRcIl0gPSA3OV0gPSBcIm9jY3VycmVuY2VzSGlnaGxpZ2h0XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcIm92ZXJ2aWV3UnVsZXJCb3JkZXJcIl0gPSA4MF0gPSBcIm92ZXJ2aWV3UnVsZXJCb3JkZXJcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wib3ZlcnZpZXdSdWxlckxhbmVzXCJdID0gODFdID0gXCJvdmVydmlld1J1bGVyTGFuZXNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wicGFkZGluZ1wiXSA9IDgyXSA9IFwicGFkZGluZ1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJwYXN0ZUFzXCJdID0gODNdID0gXCJwYXN0ZUFzXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInBhcmFtZXRlckhpbnRzXCJdID0gODRdID0gXCJwYXJhbWV0ZXJIaW50c1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJwZWVrV2lkZ2V0RGVmYXVsdEZvY3VzXCJdID0gODVdID0gXCJwZWVrV2lkZ2V0RGVmYXVsdEZvY3VzXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcImRlZmluaXRpb25MaW5rT3BlbnNJblBlZWtcIl0gPSA4Nl0gPSBcImRlZmluaXRpb25MaW5rT3BlbnNJblBlZWtcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wicXVpY2tTdWdnZXN0aW9uc1wiXSA9IDg3XSA9IFwicXVpY2tTdWdnZXN0aW9uc1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJxdWlja1N1Z2dlc3Rpb25zRGVsYXlcIl0gPSA4OF0gPSBcInF1aWNrU3VnZ2VzdGlvbnNEZWxheVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJyZWFkT25seVwiXSA9IDg5XSA9IFwicmVhZE9ubHlcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wicmVhZE9ubHlNZXNzYWdlXCJdID0gOTBdID0gXCJyZWFkT25seU1lc3NhZ2VcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wicmVuYW1lT25UeXBlXCJdID0gOTFdID0gXCJyZW5hbWVPblR5cGVcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wicmVuZGVyQ29udHJvbENoYXJhY3RlcnNcIl0gPSA5Ml0gPSBcInJlbmRlckNvbnRyb2xDaGFyYWN0ZXJzXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInJlbmRlckZpbmFsTmV3bGluZVwiXSA9IDkzXSA9IFwicmVuZGVyRmluYWxOZXdsaW5lXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInJlbmRlckxpbmVIaWdobGlnaHRcIl0gPSA5NF0gPSBcInJlbmRlckxpbmVIaWdobGlnaHRcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wicmVuZGVyTGluZUhpZ2hsaWdodE9ubHlXaGVuRm9jdXNcIl0gPSA5NV0gPSBcInJlbmRlckxpbmVIaWdobGlnaHRPbmx5V2hlbkZvY3VzXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInJlbmRlclZhbGlkYXRpb25EZWNvcmF0aW9uc1wiXSA9IDk2XSA9IFwicmVuZGVyVmFsaWRhdGlvbkRlY29yYXRpb25zXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInJlbmRlcldoaXRlc3BhY2VcIl0gPSA5N10gPSBcInJlbmRlcldoaXRlc3BhY2VcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wicmV2ZWFsSG9yaXpvbnRhbFJpZ2h0UGFkZGluZ1wiXSA9IDk4XSA9IFwicmV2ZWFsSG9yaXpvbnRhbFJpZ2h0UGFkZGluZ1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJyb3VuZGVkU2VsZWN0aW9uXCJdID0gOTldID0gXCJyb3VuZGVkU2VsZWN0aW9uXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInJ1bGVyc1wiXSA9IDEwMF0gPSBcInJ1bGVyc1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzY3JvbGxiYXJcIl0gPSAxMDFdID0gXCJzY3JvbGxiYXJcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic2Nyb2xsQmV5b25kTGFzdENvbHVtblwiXSA9IDEwMl0gPSBcInNjcm9sbEJleW9uZExhc3RDb2x1bW5cIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic2Nyb2xsQmV5b25kTGFzdExpbmVcIl0gPSAxMDNdID0gXCJzY3JvbGxCZXlvbmRMYXN0TGluZVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzY3JvbGxQcmVkb21pbmFudEF4aXNcIl0gPSAxMDRdID0gXCJzY3JvbGxQcmVkb21pbmFudEF4aXNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic2VsZWN0aW9uQ2xpcGJvYXJkXCJdID0gMTA1XSA9IFwic2VsZWN0aW9uQ2xpcGJvYXJkXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInNlbGVjdGlvbkhpZ2hsaWdodFwiXSA9IDEwNl0gPSBcInNlbGVjdGlvbkhpZ2hsaWdodFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzZWxlY3RPbkxpbmVOdW1iZXJzXCJdID0gMTA3XSA9IFwic2VsZWN0T25MaW5lTnVtYmVyc1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzaG93Rm9sZGluZ0NvbnRyb2xzXCJdID0gMTA4XSA9IFwic2hvd0ZvbGRpbmdDb250cm9sc1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzaG93VW51c2VkXCJdID0gMTA5XSA9IFwic2hvd1VudXNlZFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzbmlwcGV0U3VnZ2VzdGlvbnNcIl0gPSAxMTBdID0gXCJzbmlwcGV0U3VnZ2VzdGlvbnNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic21hcnRTZWxlY3RcIl0gPSAxMTFdID0gXCJzbWFydFNlbGVjdFwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzbW9vdGhTY3JvbGxpbmdcIl0gPSAxMTJdID0gXCJzbW9vdGhTY3JvbGxpbmdcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic3RpY2t5U2Nyb2xsXCJdID0gMTEzXSA9IFwic3RpY2t5U2Nyb2xsXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInN0aWNreVRhYlN0b3BzXCJdID0gMTE0XSA9IFwic3RpY2t5VGFiU3RvcHNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic3RvcFJlbmRlcmluZ0xpbmVBZnRlclwiXSA9IDExNV0gPSBcInN0b3BSZW5kZXJpbmdMaW5lQWZ0ZXJcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic3VnZ2VzdFwiXSA9IDExNl0gPSBcInN1Z2dlc3RcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic3VnZ2VzdEZvbnRTaXplXCJdID0gMTE3XSA9IFwic3VnZ2VzdEZvbnRTaXplXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInN1Z2dlc3RMaW5lSGVpZ2h0XCJdID0gMTE4XSA9IFwic3VnZ2VzdExpbmVIZWlnaHRcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wic3VnZ2VzdE9uVHJpZ2dlckNoYXJhY3RlcnNcIl0gPSAxMTldID0gXCJzdWdnZXN0T25UcmlnZ2VyQ2hhcmFjdGVyc1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJzdWdnZXN0U2VsZWN0aW9uXCJdID0gMTIwXSA9IFwic3VnZ2VzdFNlbGVjdGlvblwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJ0YWJDb21wbGV0aW9uXCJdID0gMTIxXSA9IFwidGFiQ29tcGxldGlvblwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJ0YWJJbmRleFwiXSA9IDEyMl0gPSBcInRhYkluZGV4XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInVuaWNvZGVIaWdobGlnaHRpbmdcIl0gPSAxMjNdID0gXCJ1bmljb2RlSGlnaGxpZ2h0aW5nXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInVudXN1YWxMaW5lVGVybWluYXRvcnNcIl0gPSAxMjRdID0gXCJ1bnVzdWFsTGluZVRlcm1pbmF0b3JzXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInVzZVNoYWRvd0RPTVwiXSA9IDEyNV0gPSBcInVzZVNoYWRvd0RPTVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJ1c2VUYWJTdG9wc1wiXSA9IDEyNl0gPSBcInVzZVRhYlN0b3BzXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcIndvcmRCcmVha1wiXSA9IDEyN10gPSBcIndvcmRCcmVha1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJ3b3JkU2VwYXJhdG9yc1wiXSA9IDEyOF0gPSBcIndvcmRTZXBhcmF0b3JzXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcIndvcmRXcmFwXCJdID0gMTI5XSA9IFwid29yZFdyYXBcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wid29yZFdyYXBCcmVha0FmdGVyQ2hhcmFjdGVyc1wiXSA9IDEzMF0gPSBcIndvcmRXcmFwQnJlYWtBZnRlckNoYXJhY3RlcnNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wid29yZFdyYXBCcmVha0JlZm9yZUNoYXJhY3RlcnNcIl0gPSAxMzFdID0gXCJ3b3JkV3JhcEJyZWFrQmVmb3JlQ2hhcmFjdGVyc1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJ3b3JkV3JhcENvbHVtblwiXSA9IDEzMl0gPSBcIndvcmRXcmFwQ29sdW1uXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcIndvcmRXcmFwT3ZlcnJpZGUxXCJdID0gMTMzXSA9IFwid29yZFdyYXBPdmVycmlkZTFcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wid29yZFdyYXBPdmVycmlkZTJcIl0gPSAxMzRdID0gXCJ3b3JkV3JhcE92ZXJyaWRlMlwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJ3cmFwcGluZ0luZGVudFwiXSA9IDEzNV0gPSBcIndyYXBwaW5nSW5kZW50XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcIndyYXBwaW5nU3RyYXRlZ3lcIl0gPSAxMzZdID0gXCJ3cmFwcGluZ1N0cmF0ZWd5XCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInNob3dEZXByZWNhdGVkXCJdID0gMTM3XSA9IFwic2hvd0RlcHJlY2F0ZWRcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiaW5sYXlIaW50c1wiXSA9IDEzOF0gPSBcImlubGF5SGludHNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZWRpdG9yQ2xhc3NOYW1lXCJdID0gMTM5XSA9IFwiZWRpdG9yQ2xhc3NOYW1lXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInBpeGVsUmF0aW9cIl0gPSAxNDBdID0gXCJwaXhlbFJhdGlvXCI7XG4gICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvbltcInRhYkZvY3VzTW9kZVwiXSA9IDE0MV0gPSBcInRhYkZvY3VzTW9kZVwiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJsYXlvdXRJbmZvXCJdID0gMTQyXSA9IFwibGF5b3V0SW5mb1wiO1xuICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bXCJ3cmFwcGluZ0luZm9cIl0gPSAxNDNdID0gXCJ3cmFwcGluZ0luZm9cIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiZGVmYXVsdENvbG9yRGVjb3JhdG9yc1wiXSA9IDE0NF0gPSBcImRlZmF1bHRDb2xvckRlY29yYXRvcnNcIjtcbiAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uW1wiY29sb3JEZWNvcmF0b3JzQWN0aXZhdGVkT25cIl0gPSAxNDVdID0gXCJjb2xvckRlY29yYXRvcnNBY3RpdmF0ZWRPblwiO1xufSkoRWRpdG9yT3B0aW9uIHx8IChFZGl0b3JPcHRpb24gPSB7fSkpO1xuLyoqXG4gKiBFbmQgb2YgbGluZSBjaGFyYWN0ZXIgcHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IHZhciBFbmRPZkxpbmVQcmVmZXJlbmNlO1xuKGZ1bmN0aW9uIChFbmRPZkxpbmVQcmVmZXJlbmNlKSB7XG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIgaWRlbnRpZmllZCBpbiB0aGUgdGV4dCBidWZmZXIuXG4gICAgICovXG4gICAgRW5kT2ZMaW5lUHJlZmVyZW5jZVtFbmRPZkxpbmVQcmVmZXJlbmNlW1wiVGV4dERlZmluZWRcIl0gPSAwXSA9IFwiVGV4dERlZmluZWRcIjtcbiAgICAvKipcbiAgICAgKiBVc2UgbGluZSBmZWVkIChcXG4pIGFzIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgRW5kT2ZMaW5lUHJlZmVyZW5jZVtFbmRPZkxpbmVQcmVmZXJlbmNlW1wiTEZcIl0gPSAxXSA9IFwiTEZcIjtcbiAgICAvKipcbiAgICAgKiBVc2UgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQgKFxcclxcbikgYXMgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBFbmRPZkxpbmVQcmVmZXJlbmNlW0VuZE9mTGluZVByZWZlcmVuY2VbXCJDUkxGXCJdID0gMl0gPSBcIkNSTEZcIjtcbn0pKEVuZE9mTGluZVByZWZlcmVuY2UgfHwgKEVuZE9mTGluZVByZWZlcmVuY2UgPSB7fSkpO1xuLyoqXG4gKiBFbmQgb2YgbGluZSBjaGFyYWN0ZXIgcHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IHZhciBFbmRPZkxpbmVTZXF1ZW5jZTtcbihmdW5jdGlvbiAoRW5kT2ZMaW5lU2VxdWVuY2UpIHtcbiAgICAvKipcbiAgICAgKiBVc2UgbGluZSBmZWVkIChcXG4pIGFzIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgRW5kT2ZMaW5lU2VxdWVuY2VbRW5kT2ZMaW5lU2VxdWVuY2VbXCJMRlwiXSA9IDBdID0gXCJMRlwiO1xuICAgIC8qKlxuICAgICAqIFVzZSBjYXJyaWFnZSByZXR1cm4gYW5kIGxpbmUgZmVlZCAoXFxyXFxuKSBhcyB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIEVuZE9mTGluZVNlcXVlbmNlW0VuZE9mTGluZVNlcXVlbmNlW1wiQ1JMRlwiXSA9IDFdID0gXCJDUkxGXCI7XG59KShFbmRPZkxpbmVTZXF1ZW5jZSB8fCAoRW5kT2ZMaW5lU2VxdWVuY2UgPSB7fSkpO1xuLyoqXG4gKiBWZXJ0aWNhbCBMYW5lIGluIHRoZSBnbHlwaCBtYXJnaW4gb2YgdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IHZhciBHbHlwaE1hcmdpbkxhbmU7XG4oZnVuY3Rpb24gKEdseXBoTWFyZ2luTGFuZSkge1xuICAgIEdseXBoTWFyZ2luTGFuZVtHbHlwaE1hcmdpbkxhbmVbXCJMZWZ0XCJdID0gMV0gPSBcIkxlZnRcIjtcbiAgICBHbHlwaE1hcmdpbkxhbmVbR2x5cGhNYXJnaW5MYW5lW1wiUmlnaHRcIl0gPSAyXSA9IFwiUmlnaHRcIjtcbn0pKEdseXBoTWFyZ2luTGFuZSB8fCAoR2x5cGhNYXJnaW5MYW5lID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgaW5kZW50YXRpb24gd2hlbiBwcmVzc2luZyBFbnRlci5cbiAqL1xuZXhwb3J0IHZhciBJbmRlbnRBY3Rpb247XG4oZnVuY3Rpb24gKEluZGVudEFjdGlvbikge1xuICAgIC8qKlxuICAgICAqIEluc2VydCBuZXcgbGluZSBhbmQgY29weSB0aGUgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uLlxuICAgICAqL1xuICAgIEluZGVudEFjdGlvbltJbmRlbnRBY3Rpb25bXCJOb25lXCJdID0gMF0gPSBcIk5vbmVcIjtcbiAgICAvKipcbiAgICAgKiBJbnNlcnQgbmV3IGxpbmUgYW5kIGluZGVudCBvbmNlIChyZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uKS5cbiAgICAgKi9cbiAgICBJbmRlbnRBY3Rpb25bSW5kZW50QWN0aW9uW1wiSW5kZW50XCJdID0gMV0gPSBcIkluZGVudFwiO1xuICAgIC8qKlxuICAgICAqIEluc2VydCB0d28gbmV3IGxpbmVzOlxuICAgICAqICAtIHRoZSBmaXJzdCBvbmUgaW5kZW50ZWQgd2hpY2ggd2lsbCBob2xkIHRoZSBjdXJzb3JcbiAgICAgKiAgLSB0aGUgc2Vjb25kIG9uZSBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAqL1xuICAgIEluZGVudEFjdGlvbltJbmRlbnRBY3Rpb25bXCJJbmRlbnRPdXRkZW50XCJdID0gMl0gPSBcIkluZGVudE91dGRlbnRcIjtcbiAgICAvKipcbiAgICAgKiBJbnNlcnQgbmV3IGxpbmUgYW5kIG91dGRlbnQgb25jZSAocmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvbikuXG4gICAgICovXG4gICAgSW5kZW50QWN0aW9uW0luZGVudEFjdGlvbltcIk91dGRlbnRcIl0gPSAzXSA9IFwiT3V0ZGVudFwiO1xufSkoSW5kZW50QWN0aW9uIHx8IChJbmRlbnRBY3Rpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmplY3RlZFRleHRDdXJzb3JTdG9wcztcbihmdW5jdGlvbiAoSW5qZWN0ZWRUZXh0Q3Vyc29yU3RvcHMpIHtcbiAgICBJbmplY3RlZFRleHRDdXJzb3JTdG9wc1tJbmplY3RlZFRleHRDdXJzb3JTdG9wc1tcIkJvdGhcIl0gPSAwXSA9IFwiQm90aFwiO1xuICAgIEluamVjdGVkVGV4dEN1cnNvclN0b3BzW0luamVjdGVkVGV4dEN1cnNvclN0b3BzW1wiUmlnaHRcIl0gPSAxXSA9IFwiUmlnaHRcIjtcbiAgICBJbmplY3RlZFRleHRDdXJzb3JTdG9wc1tJbmplY3RlZFRleHRDdXJzb3JTdG9wc1tcIkxlZnRcIl0gPSAyXSA9IFwiTGVmdFwiO1xuICAgIEluamVjdGVkVGV4dEN1cnNvclN0b3BzW0luamVjdGVkVGV4dEN1cnNvclN0b3BzW1wiTm9uZVwiXSA9IDNdID0gXCJOb25lXCI7XG59KShJbmplY3RlZFRleHRDdXJzb3JTdG9wcyB8fCAoSW5qZWN0ZWRUZXh0Q3Vyc29yU3RvcHMgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRLaW5kO1xuKGZ1bmN0aW9uIChJbmxheUhpbnRLaW5kKSB7XG4gICAgSW5sYXlIaW50S2luZFtJbmxheUhpbnRLaW5kW1wiVHlwZVwiXSA9IDFdID0gXCJUeXBlXCI7XG4gICAgSW5sYXlIaW50S2luZFtJbmxheUhpbnRLaW5kW1wiUGFyYW1ldGVyXCJdID0gMl0gPSBcIlBhcmFtZXRlclwiO1xufSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7XG4vKipcbiAqIEhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbnNQcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC5cbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICogSXQgaXMgc3VmZmljaWVudCB0byByZXR1cm4gYSBzaW5nbGUgY29tcGxldGlvbiBpdGVtIGluIHRoaXMgY2FzZS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmRbSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kW1wiQXV0b21hdGljXCJdID0gMF0gPSBcIkF1dG9tYXRpY1wiO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBleHBsaWNpdGx5IGJ5IGEgdXNlciBnZXN0dXJlLlxuICAgICAqIFJldHVybiBtdWx0aXBsZSBjb21wbGV0aW9uIGl0ZW1zIHRvIGVuYWJsZSBjeWNsaW5nIHRocm91Z2ggdGhlbS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmRbSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kW1wiRXhwbGljaXRcIl0gPSAxXSA9IFwiRXhwbGljaXRcIjtcbn0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTtcbi8qKlxuICogVmlydHVhbCBLZXkgQ29kZXMsIHRoZSB2YWx1ZSBkb2VzIG5vdCBob2xkIGFueSBpbmhlcmVudCBtZWFuaW5nLlxuICogSW5zcGlyZWQgc29tZXdoYXQgZnJvbSBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9kZDM3NTczMSh2PXZzLjg1KS5hc3B4XG4gKiBCdXQgdGhlc2UgYXJlIFwibW9yZSBnZW5lcmFsXCIsIGFzIHRoZXkgc2hvdWxkIHdvcmsgYWNyb3NzIGJyb3dzZXJzICYgT1Ngcy5cbiAqL1xuZXhwb3J0IHZhciBLZXlDb2RlO1xuKGZ1bmN0aW9uIChLZXlDb2RlKSB7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRGVwZW5kc09uS2JMYXlvdXRcIl0gPSAtMV0gPSBcIkRlcGVuZHNPbktiTGF5b3V0XCI7XG4gICAgLyoqXG4gICAgICogUGxhY2VkIGZpcnN0IHRvIGNvdmVyIHRoZSAwIHZhbHVlIG9mIHRoZSBlbnVtLlxuICAgICAqL1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIlVua25vd25cIl0gPSAwXSA9IFwiVW5rbm93blwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkJhY2tzcGFjZVwiXSA9IDFdID0gXCJCYWNrc3BhY2VcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJUYWJcIl0gPSAyXSA9IFwiVGFiXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRW50ZXJcIl0gPSAzXSA9IFwiRW50ZXJcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJTaGlmdFwiXSA9IDRdID0gXCJTaGlmdFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkN0cmxcIl0gPSA1XSA9IFwiQ3RybFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkFsdFwiXSA9IDZdID0gXCJBbHRcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJQYXVzZUJyZWFrXCJdID0gN10gPSBcIlBhdXNlQnJlYWtcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJDYXBzTG9ja1wiXSA9IDhdID0gXCJDYXBzTG9ja1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkVzY2FwZVwiXSA9IDldID0gXCJFc2NhcGVcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJTcGFjZVwiXSA9IDEwXSA9IFwiU3BhY2VcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJQYWdlVXBcIl0gPSAxMV0gPSBcIlBhZ2VVcFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIlBhZ2VEb3duXCJdID0gMTJdID0gXCJQYWdlRG93blwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkVuZFwiXSA9IDEzXSA9IFwiRW5kXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiSG9tZVwiXSA9IDE0XSA9IFwiSG9tZVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkxlZnRBcnJvd1wiXSA9IDE1XSA9IFwiTGVmdEFycm93XCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiVXBBcnJvd1wiXSA9IDE2XSA9IFwiVXBBcnJvd1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIlJpZ2h0QXJyb3dcIl0gPSAxN10gPSBcIlJpZ2h0QXJyb3dcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJEb3duQXJyb3dcIl0gPSAxOF0gPSBcIkRvd25BcnJvd1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkluc2VydFwiXSA9IDE5XSA9IFwiSW5zZXJ0XCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRGVsZXRlXCJdID0gMjBdID0gXCJEZWxldGVcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJEaWdpdDBcIl0gPSAyMV0gPSBcIkRpZ2l0MFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkRpZ2l0MVwiXSA9IDIyXSA9IFwiRGlnaXQxXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRGlnaXQyXCJdID0gMjNdID0gXCJEaWdpdDJcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJEaWdpdDNcIl0gPSAyNF0gPSBcIkRpZ2l0M1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkRpZ2l0NFwiXSA9IDI1XSA9IFwiRGlnaXQ0XCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRGlnaXQ1XCJdID0gMjZdID0gXCJEaWdpdDVcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJEaWdpdDZcIl0gPSAyN10gPSBcIkRpZ2l0NlwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkRpZ2l0N1wiXSA9IDI4XSA9IFwiRGlnaXQ3XCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRGlnaXQ4XCJdID0gMjldID0gXCJEaWdpdDhcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJEaWdpdDlcIl0gPSAzMF0gPSBcIkRpZ2l0OVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleUFcIl0gPSAzMV0gPSBcIktleUFcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlCXCJdID0gMzJdID0gXCJLZXlCXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiS2V5Q1wiXSA9IDMzXSA9IFwiS2V5Q1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleURcIl0gPSAzNF0gPSBcIktleURcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlFXCJdID0gMzVdID0gXCJLZXlFXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiS2V5RlwiXSA9IDM2XSA9IFwiS2V5RlwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleUdcIl0gPSAzN10gPSBcIktleUdcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlIXCJdID0gMzhdID0gXCJLZXlIXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiS2V5SVwiXSA9IDM5XSA9IFwiS2V5SVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleUpcIl0gPSA0MF0gPSBcIktleUpcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlLXCJdID0gNDFdID0gXCJLZXlLXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiS2V5TFwiXSA9IDQyXSA9IFwiS2V5TFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleU1cIl0gPSA0M10gPSBcIktleU1cIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlOXCJdID0gNDRdID0gXCJLZXlOXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiS2V5T1wiXSA9IDQ1XSA9IFwiS2V5T1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleVBcIl0gPSA0Nl0gPSBcIktleVBcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlRXCJdID0gNDddID0gXCJLZXlRXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiS2V5UlwiXSA9IDQ4XSA9IFwiS2V5UlwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleVNcIl0gPSA0OV0gPSBcIktleVNcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlUXCJdID0gNTBdID0gXCJLZXlUXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiS2V5VVwiXSA9IDUxXSA9IFwiS2V5VVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleVZcIl0gPSA1Ml0gPSBcIktleVZcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlXXCJdID0gNTNdID0gXCJLZXlXXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiS2V5WFwiXSA9IDU0XSA9IFwiS2V5WFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktleVlcIl0gPSA1NV0gPSBcIktleVlcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJLZXlaXCJdID0gNTZdID0gXCJLZXlaXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTWV0YVwiXSA9IDU3XSA9IFwiTWV0YVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkNvbnRleHRNZW51XCJdID0gNThdID0gXCJDb250ZXh0TWVudVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkYxXCJdID0gNTldID0gXCJGMVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkYyXCJdID0gNjBdID0gXCJGMlwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkYzXCJdID0gNjFdID0gXCJGM1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkY0XCJdID0gNjJdID0gXCJGNFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkY1XCJdID0gNjNdID0gXCJGNVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkY2XCJdID0gNjRdID0gXCJGNlwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkY3XCJdID0gNjVdID0gXCJGN1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkY4XCJdID0gNjZdID0gXCJGOFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkY5XCJdID0gNjddID0gXCJGOVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkYxMFwiXSA9IDY4XSA9IFwiRjEwXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRjExXCJdID0gNjldID0gXCJGMTFcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJGMTJcIl0gPSA3MF0gPSBcIkYxMlwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkYxM1wiXSA9IDcxXSA9IFwiRjEzXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRjE0XCJdID0gNzJdID0gXCJGMTRcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJGMTVcIl0gPSA3M10gPSBcIkYxNVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkYxNlwiXSA9IDc0XSA9IFwiRjE2XCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRjE3XCJdID0gNzVdID0gXCJGMTdcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJGMThcIl0gPSA3Nl0gPSBcIkYxOFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkYxOVwiXSA9IDc3XSA9IFwiRjE5XCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRjIwXCJdID0gNzhdID0gXCJGMjBcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJGMjFcIl0gPSA3OV0gPSBcIkYyMVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkYyMlwiXSA9IDgwXSA9IFwiRjIyXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRjIzXCJdID0gODFdID0gXCJGMjNcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJGMjRcIl0gPSA4Ml0gPSBcIkYyNFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk51bUxvY2tcIl0gPSA4M10gPSBcIk51bUxvY2tcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJTY3JvbGxMb2NrXCJdID0gODRdID0gXCJTY3JvbGxMb2NrXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC5cbiAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJzs6JyBrZXlcbiAgICAgKi9cbiAgICBLZXlDb2RlW0tleUNvZGVbXCJTZW1pY29sb25cIl0gPSA4NV0gPSBcIlNlbWljb2xvblwiO1xuICAgIC8qKlxuICAgICAqIEZvciBhbnkgY291bnRyeS9yZWdpb24sIHRoZSAnKycga2V5XG4gICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICc9Kycga2V5XG4gICAgICovXG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiRXF1YWxcIl0gPSA4Nl0gPSBcIkVxdWFsXCI7XG4gICAgLyoqXG4gICAgICogRm9yIGFueSBjb3VudHJ5L3JlZ2lvbiwgdGhlICcsJyBrZXlcbiAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJyw8JyBrZXlcbiAgICAgKi9cbiAgICBLZXlDb2RlW0tleUNvZGVbXCJDb21tYVwiXSA9IDg3XSA9IFwiQ29tbWFcIjtcbiAgICAvKipcbiAgICAgKiBGb3IgYW55IGNvdW50cnkvcmVnaW9uLCB0aGUgJy0nIGtleVxuICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnLV8nIGtleVxuICAgICAqL1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk1pbnVzXCJdID0gODhdID0gXCJNaW51c1wiO1xuICAgIC8qKlxuICAgICAqIEZvciBhbnkgY291bnRyeS9yZWdpb24sIHRoZSAnLicga2V5XG4gICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICcuPicga2V5XG4gICAgICovXG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiUGVyaW9kXCJdID0gODldID0gXCJQZXJpb2RcIjtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLlxuICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnLz8nIGtleVxuICAgICAqL1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIlNsYXNoXCJdID0gOTBdID0gXCJTbGFzaFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuXG4gICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICdgficga2V5XG4gICAgICovXG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiQmFja3F1b3RlXCJdID0gOTFdID0gXCJCYWNrcXVvdGVcIjtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLlxuICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnW3snIGtleVxuICAgICAqL1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkJyYWNrZXRMZWZ0XCJdID0gOTJdID0gXCJCcmFja2V0TGVmdFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuXG4gICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICdcXHwnIGtleVxuICAgICAqL1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkJhY2tzbGFzaFwiXSA9IDkzXSA9IFwiQmFja3NsYXNoXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC5cbiAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJ119JyBrZXlcbiAgICAgKi9cbiAgICBLZXlDb2RlW0tleUNvZGVbXCJCcmFja2V0UmlnaHRcIl0gPSA5NF0gPSBcIkJyYWNrZXRSaWdodFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuXG4gICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICcnXCInIGtleVxuICAgICAqL1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIlF1b3RlXCJdID0gOTVdID0gXCJRdW90ZVwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuXG4gICAgICovXG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiT0VNXzhcIl0gPSA5Nl0gPSBcIk9FTV84XCI7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIHRoZSBhbmdsZSBicmFja2V0IGtleSBvciB0aGUgYmFja3NsYXNoIGtleSBvbiB0aGUgUlQgMTAyLWtleSBrZXlib2FyZC5cbiAgICAgKi9cbiAgICBLZXlDb2RlW0tleUNvZGVbXCJJbnRsQmFja3NsYXNoXCJdID0gOTddID0gXCJJbnRsQmFja3NsYXNoXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTnVtcGFkMFwiXSA9IDk4XSA9IFwiTnVtcGFkMFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk51bXBhZDFcIl0gPSA5OV0gPSBcIk51bXBhZDFcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJOdW1wYWQyXCJdID0gMTAwXSA9IFwiTnVtcGFkMlwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk51bXBhZDNcIl0gPSAxMDFdID0gXCJOdW1wYWQzXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTnVtcGFkNFwiXSA9IDEwMl0gPSBcIk51bXBhZDRcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJOdW1wYWQ1XCJdID0gMTAzXSA9IFwiTnVtcGFkNVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk51bXBhZDZcIl0gPSAxMDRdID0gXCJOdW1wYWQ2XCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTnVtcGFkN1wiXSA9IDEwNV0gPSBcIk51bXBhZDdcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJOdW1wYWQ4XCJdID0gMTA2XSA9IFwiTnVtcGFkOFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk51bXBhZDlcIl0gPSAxMDddID0gXCJOdW1wYWQ5XCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTnVtcGFkTXVsdGlwbHlcIl0gPSAxMDhdID0gXCJOdW1wYWRNdWx0aXBseVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk51bXBhZEFkZFwiXSA9IDEwOV0gPSBcIk51bXBhZEFkZFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk5VTVBBRF9TRVBBUkFUT1JcIl0gPSAxMTBdID0gXCJOVU1QQURfU0VQQVJBVE9SXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTnVtcGFkU3VidHJhY3RcIl0gPSAxMTFdID0gXCJOdW1wYWRTdWJ0cmFjdFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk51bXBhZERlY2ltYWxcIl0gPSAxMTJdID0gXCJOdW1wYWREZWNpbWFsXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTnVtcGFkRGl2aWRlXCJdID0gMTEzXSA9IFwiTnVtcGFkRGl2aWRlXCI7XG4gICAgLyoqXG4gICAgICogQ292ZXIgYWxsIGtleSBjb2RlcyB3aGVuIElNRSBpcyBwcm9jZXNzaW5nIGlucHV0LlxuICAgICAqL1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIktFWV9JTl9DT01QT1NJVElPTlwiXSA9IDExNF0gPSBcIktFWV9JTl9DT01QT1NJVElPTlwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkFCTlRfQzFcIl0gPSAxMTVdID0gXCJBQk5UX0MxXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiQUJOVF9DMlwiXSA9IDExNl0gPSBcIkFCTlRfQzJcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJBdWRpb1ZvbHVtZU11dGVcIl0gPSAxMTddID0gXCJBdWRpb1ZvbHVtZU11dGVcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJBdWRpb1ZvbHVtZVVwXCJdID0gMTE4XSA9IFwiQXVkaW9Wb2x1bWVVcFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkF1ZGlvVm9sdW1lRG93blwiXSA9IDExOV0gPSBcIkF1ZGlvVm9sdW1lRG93blwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkJyb3dzZXJTZWFyY2hcIl0gPSAxMjBdID0gXCJCcm93c2VyU2VhcmNoXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiQnJvd3NlckhvbWVcIl0gPSAxMjFdID0gXCJCcm93c2VySG9tZVwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIkJyb3dzZXJCYWNrXCJdID0gMTIyXSA9IFwiQnJvd3NlckJhY2tcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJCcm93c2VyRm9yd2FyZFwiXSA9IDEyM10gPSBcIkJyb3dzZXJGb3J3YXJkXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTWVkaWFUcmFja05leHRcIl0gPSAxMjRdID0gXCJNZWRpYVRyYWNrTmV4dFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk1lZGlhVHJhY2tQcmV2aW91c1wiXSA9IDEyNV0gPSBcIk1lZGlhVHJhY2tQcmV2aW91c1wiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk1lZGlhU3RvcFwiXSA9IDEyNl0gPSBcIk1lZGlhU3RvcFwiO1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk1lZGlhUGxheVBhdXNlXCJdID0gMTI3XSA9IFwiTWVkaWFQbGF5UGF1c2VcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJMYXVuY2hNZWRpYVBsYXllclwiXSA9IDEyOF0gPSBcIkxhdW5jaE1lZGlhUGxheWVyXCI7XG4gICAgS2V5Q29kZVtLZXlDb2RlW1wiTGF1bmNoTWFpbFwiXSA9IDEyOV0gPSBcIkxhdW5jaE1haWxcIjtcbiAgICBLZXlDb2RlW0tleUNvZGVbXCJMYXVuY2hBcHAyXCJdID0gMTMwXSA9IFwiTGF1bmNoQXBwMlwiO1xuICAgIC8qKlxuICAgICAqIFZLX0NMRUFSLCAweDBDLCBDTEVBUiBrZXlcbiAgICAgKi9cbiAgICBLZXlDb2RlW0tleUNvZGVbXCJDbGVhclwiXSA9IDEzMV0gPSBcIkNsZWFyXCI7XG4gICAgLyoqXG4gICAgICogUGxhY2VkIGxhc3QgdG8gY292ZXIgdGhlIGxlbmd0aCBvZiB0aGUgZW51bS5cbiAgICAgKiBQbGVhc2UgZG8gbm90IGRlcGVuZCBvbiB0aGlzIHZhbHVlIVxuICAgICAqL1xuICAgIEtleUNvZGVbS2V5Q29kZVtcIk1BWF9WQUxVRVwiXSA9IDEzMl0gPSBcIk1BWF9WQUxVRVwiO1xufSkoS2V5Q29kZSB8fCAoS2V5Q29kZSA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmtlclNldmVyaXR5O1xuKGZ1bmN0aW9uIChNYXJrZXJTZXZlcml0eSkge1xuICAgIE1hcmtlclNldmVyaXR5W01hcmtlclNldmVyaXR5W1wiSGludFwiXSA9IDFdID0gXCJIaW50XCI7XG4gICAgTWFya2VyU2V2ZXJpdHlbTWFya2VyU2V2ZXJpdHlbXCJJbmZvXCJdID0gMl0gPSBcIkluZm9cIjtcbiAgICBNYXJrZXJTZXZlcml0eVtNYXJrZXJTZXZlcml0eVtcIldhcm5pbmdcIl0gPSA0XSA9IFwiV2FybmluZ1wiO1xuICAgIE1hcmtlclNldmVyaXR5W01hcmtlclNldmVyaXR5W1wiRXJyb3JcIl0gPSA4XSA9IFwiRXJyb3JcIjtcbn0pKE1hcmtlclNldmVyaXR5IHx8IChNYXJrZXJTZXZlcml0eSA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmtlclRhZztcbihmdW5jdGlvbiAoTWFya2VyVGFnKSB7XG4gICAgTWFya2VyVGFnW01hcmtlclRhZ1tcIlVubmVjZXNzYXJ5XCJdID0gMV0gPSBcIlVubmVjZXNzYXJ5XCI7XG4gICAgTWFya2VyVGFnW01hcmtlclRhZ1tcIkRlcHJlY2F0ZWRcIl0gPSAyXSA9IFwiRGVwcmVjYXRlZFwiO1xufSkoTWFya2VyVGFnIHx8IChNYXJrZXJUYWcgPSB7fSkpO1xuLyoqXG4gKiBQb3NpdGlvbiBpbiB0aGUgbWluaW1hcCB0byByZW5kZXIgdGhlIGRlY29yYXRpb24uXG4gKi9cbmV4cG9ydCB2YXIgTWluaW1hcFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChNaW5pbWFwUG9zaXRpb24pIHtcbiAgICBNaW5pbWFwUG9zaXRpb25bTWluaW1hcFBvc2l0aW9uW1wiSW5saW5lXCJdID0gMV0gPSBcIklubGluZVwiO1xuICAgIE1pbmltYXBQb3NpdGlvbltNaW5pbWFwUG9zaXRpb25bXCJHdXR0ZXJcIl0gPSAyXSA9IFwiR3V0dGVyXCI7XG59KShNaW5pbWFwUG9zaXRpb24gfHwgKE1pbmltYXBQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFR5cGUgb2YgaGl0IGVsZW1lbnQgd2l0aCB0aGUgbW91c2UgaW4gdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IHZhciBNb3VzZVRhcmdldFR5cGU7XG4oZnVuY3Rpb24gKE1vdXNlVGFyZ2V0VHlwZSkge1xuICAgIC8qKlxuICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBhbiB1bmtub3duIGVsZW1lbnQuXG4gICAgICovXG4gICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVtcIlVOS05PV05cIl0gPSAwXSA9IFwiVU5LTk9XTlwiO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiB0aGUgdGV4dGFyZWEgdXNlZCBmb3IgaW5wdXQuXG4gICAgICovXG4gICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVtcIlRFWFRBUkVBXCJdID0gMV0gPSBcIlRFWFRBUkVBXCI7XG4gICAgLyoqXG4gICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSBnbHlwaCBtYXJnaW5cbiAgICAgKi9cbiAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlW1wiR1VUVEVSX0dMWVBIX01BUkdJTlwiXSA9IDJdID0gXCJHVVRURVJfR0xZUEhfTUFSR0lOXCI7XG4gICAgLyoqXG4gICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSBsaW5lIG51bWJlcnNcbiAgICAgKi9cbiAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlW1wiR1VUVEVSX0xJTkVfTlVNQkVSU1wiXSA9IDNdID0gXCJHVVRURVJfTElORV9OVU1CRVJTXCI7XG4gICAgLyoqXG4gICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSBsaW5lIGRlY29yYXRpb25zXG4gICAgICovXG4gICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVtcIkdVVFRFUl9MSU5FX0RFQ09SQVRJT05TXCJdID0gNF0gPSBcIkdVVFRFUl9MSU5FX0RFQ09SQVRJT05TXCI7XG4gICAgLyoqXG4gICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSB3aGl0ZXNwYWNlIGxlZnQgaW4gdGhlIGd1dHRlciBieSBhIHZpZXcgem9uZS5cbiAgICAgKi9cbiAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlW1wiR1VUVEVSX1ZJRVdfWk9ORVwiXSA9IDVdID0gXCJHVVRURVJfVklFV19aT05FXCI7XG4gICAgLyoqXG4gICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRleHQgaW4gdGhlIGNvbnRlbnQuXG4gICAgICovXG4gICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVtcIkNPTlRFTlRfVEVYVFwiXSA9IDZdID0gXCJDT05URU5UX1RFWFRcIjtcbiAgICAvKipcbiAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgZW1wdHkgc3BhY2UgaW4gdGhlIGNvbnRlbnQgKGUuZy4gYWZ0ZXIgbGluZSB0ZXh0IG9yIGJlbG93IGxhc3QgbGluZSlcbiAgICAgKi9cbiAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlW1wiQ09OVEVOVF9FTVBUWVwiXSA9IDddID0gXCJDT05URU5UX0VNUFRZXCI7XG4gICAgLyoqXG4gICAgICogTW91c2UgaXMgb24gdG9wIG9mIGEgdmlldyB6b25lIGluIHRoZSBjb250ZW50LlxuICAgICAqL1xuICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbXCJDT05URU5UX1ZJRVdfWk9ORVwiXSA9IDhdID0gXCJDT05URU5UX1ZJRVdfWk9ORVwiO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBhIGNvbnRlbnQgd2lkZ2V0LlxuICAgICAqL1xuICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbXCJDT05URU5UX1dJREdFVFwiXSA9IDldID0gXCJDT05URU5UX1dJREdFVFwiO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiB0aGUgZGVjb3JhdGlvbnMgb3ZlcnZpZXcgcnVsZXIuXG4gICAgICovXG4gICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVtcIk9WRVJWSUVXX1JVTEVSXCJdID0gMTBdID0gXCJPVkVSVklFV19SVUxFUlwiO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBhIHNjcm9sbGJhci5cbiAgICAgKi9cbiAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlW1wiU0NST0xMQkFSXCJdID0gMTFdID0gXCJTQ1JPTExCQVJcIjtcbiAgICAvKipcbiAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgYW4gb3ZlcmxheSB3aWRnZXQuXG4gICAgICovXG4gICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVtcIk9WRVJMQVlfV0lER0VUXCJdID0gMTJdID0gXCJPVkVSTEFZX1dJREdFVFwiO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIGlzIG91dHNpZGUgb2YgdGhlIGVkaXRvci5cbiAgICAgKi9cbiAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlW1wiT1VUU0lERV9FRElUT1JcIl0gPSAxM10gPSBcIk9VVFNJREVfRURJVE9SXCI7XG59KShNb3VzZVRhcmdldFR5cGUgfHwgKE1vdXNlVGFyZ2V0VHlwZSA9IHt9KSk7XG4vKipcbiAqIEEgcG9zaXRpb25pbmcgcHJlZmVyZW5jZSBmb3IgcmVuZGVyaW5nIG92ZXJsYXkgd2lkZ2V0cy5cbiAqL1xuZXhwb3J0IHZhciBPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlO1xuKGZ1bmN0aW9uIChPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlKSB7XG4gICAgLyoqXG4gICAgICogUG9zaXRpb24gdGhlIG92ZXJsYXkgd2lkZ2V0IGluIHRoZSB0b3AgcmlnaHQgY29ybmVyXG4gICAgICovXG4gICAgT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlW1wiVE9QX1JJR0hUX0NPUk5FUlwiXSA9IDBdID0gXCJUT1BfUklHSFRfQ09STkVSXCI7XG4gICAgLyoqXG4gICAgICogUG9zaXRpb24gdGhlIG92ZXJsYXkgd2lkZ2V0IGluIHRoZSBib3R0b20gcmlnaHQgY29ybmVyXG4gICAgICovXG4gICAgT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlW1wiQk9UVE9NX1JJR0hUX0NPUk5FUlwiXSA9IDFdID0gXCJCT1RUT01fUklHSFRfQ09STkVSXCI7XG4gICAgLyoqXG4gICAgICogUG9zaXRpb24gdGhlIG92ZXJsYXkgd2lkZ2V0IGluIHRoZSB0b3AgY2VudGVyXG4gICAgICovXG4gICAgT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlW1wiVE9QX0NFTlRFUlwiXSA9IDJdID0gXCJUT1BfQ0VOVEVSXCI7XG59KShPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlIHx8IChPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlID0ge30pKTtcbi8qKlxuICogVmVydGljYWwgTGFuZSBpbiB0aGUgb3ZlcnZpZXcgcnVsZXIgb2YgdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IHZhciBPdmVydmlld1J1bGVyTGFuZTtcbihmdW5jdGlvbiAoT3ZlcnZpZXdSdWxlckxhbmUpIHtcbiAgICBPdmVydmlld1J1bGVyTGFuZVtPdmVydmlld1J1bGVyTGFuZVtcIkxlZnRcIl0gPSAxXSA9IFwiTGVmdFwiO1xuICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lW1wiQ2VudGVyXCJdID0gMl0gPSBcIkNlbnRlclwiO1xuICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lW1wiUmlnaHRcIl0gPSA0XSA9IFwiUmlnaHRcIjtcbiAgICBPdmVydmlld1J1bGVyTGFuZVtPdmVydmlld1J1bGVyTGFuZVtcIkZ1bGxcIl0gPSA3XSA9IFwiRnVsbFwiO1xufSkoT3ZlcnZpZXdSdWxlckxhbmUgfHwgKE92ZXJ2aWV3UnVsZXJMYW5lID0ge30pKTtcbmV4cG9ydCB2YXIgUG9zaXRpb25BZmZpbml0eTtcbihmdW5jdGlvbiAoUG9zaXRpb25BZmZpbml0eSkge1xuICAgIC8qKlxuICAgICAqIFByZWZlcnMgdGhlIGxlZnQgbW9zdCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIFBvc2l0aW9uQWZmaW5pdHlbUG9zaXRpb25BZmZpbml0eVtcIkxlZnRcIl0gPSAwXSA9IFwiTGVmdFwiO1xuICAgIC8qKlxuICAgICAqIFByZWZlcnMgdGhlIHJpZ2h0IG1vc3QgcG9zaXRpb24uXG4gICAgKi9cbiAgICBQb3NpdGlvbkFmZmluaXR5W1Bvc2l0aW9uQWZmaW5pdHlbXCJSaWdodFwiXSA9IDFdID0gXCJSaWdodFwiO1xuICAgIC8qKlxuICAgICAqIE5vIHByZWZlcmVuY2UuXG4gICAgKi9cbiAgICBQb3NpdGlvbkFmZmluaXR5W1Bvc2l0aW9uQWZmaW5pdHlbXCJOb25lXCJdID0gMl0gPSBcIk5vbmVcIjtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgb24gaW5qZWN0ZWQgdGV4dCwgcHJlZmVycyB0aGUgcG9zaXRpb24gbGVmdCBvZiBpdC5cbiAgICAqL1xuICAgIFBvc2l0aW9uQWZmaW5pdHlbUG9zaXRpb25BZmZpbml0eVtcIkxlZnRPZkluamVjdGVkVGV4dFwiXSA9IDNdID0gXCJMZWZ0T2ZJbmplY3RlZFRleHRcIjtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgb24gaW5qZWN0ZWQgdGV4dCwgcHJlZmVycyB0aGUgcG9zaXRpb24gcmlnaHQgb2YgaXQuXG4gICAgKi9cbiAgICBQb3NpdGlvbkFmZmluaXR5W1Bvc2l0aW9uQWZmaW5pdHlbXCJSaWdodE9mSW5qZWN0ZWRUZXh0XCJdID0gNF0gPSBcIlJpZ2h0T2ZJbmplY3RlZFRleHRcIjtcbn0pKFBvc2l0aW9uQWZmaW5pdHkgfHwgKFBvc2l0aW9uQWZmaW5pdHkgPSB7fSkpO1xuZXhwb3J0IHZhciBSZW5kZXJMaW5lTnVtYmVyc1R5cGU7XG4oZnVuY3Rpb24gKFJlbmRlckxpbmVOdW1iZXJzVHlwZSkge1xuICAgIFJlbmRlckxpbmVOdW1iZXJzVHlwZVtSZW5kZXJMaW5lTnVtYmVyc1R5cGVbXCJPZmZcIl0gPSAwXSA9IFwiT2ZmXCI7XG4gICAgUmVuZGVyTGluZU51bWJlcnNUeXBlW1JlbmRlckxpbmVOdW1iZXJzVHlwZVtcIk9uXCJdID0gMV0gPSBcIk9uXCI7XG4gICAgUmVuZGVyTGluZU51bWJlcnNUeXBlW1JlbmRlckxpbmVOdW1iZXJzVHlwZVtcIlJlbGF0aXZlXCJdID0gMl0gPSBcIlJlbGF0aXZlXCI7XG4gICAgUmVuZGVyTGluZU51bWJlcnNUeXBlW1JlbmRlckxpbmVOdW1iZXJzVHlwZVtcIkludGVydmFsXCJdID0gM10gPSBcIkludGVydmFsXCI7XG4gICAgUmVuZGVyTGluZU51bWJlcnNUeXBlW1JlbmRlckxpbmVOdW1iZXJzVHlwZVtcIkN1c3RvbVwiXSA9IDRdID0gXCJDdXN0b21cIjtcbn0pKFJlbmRlckxpbmVOdW1iZXJzVHlwZSB8fCAoUmVuZGVyTGluZU51bWJlcnNUeXBlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuZGVyTWluaW1hcDtcbihmdW5jdGlvbiAoUmVuZGVyTWluaW1hcCkge1xuICAgIFJlbmRlck1pbmltYXBbUmVuZGVyTWluaW1hcFtcIk5vbmVcIl0gPSAwXSA9IFwiTm9uZVwiO1xuICAgIFJlbmRlck1pbmltYXBbUmVuZGVyTWluaW1hcFtcIlRleHRcIl0gPSAxXSA9IFwiVGV4dFwiO1xuICAgIFJlbmRlck1pbmltYXBbUmVuZGVyTWluaW1hcFtcIkJsb2Nrc1wiXSA9IDJdID0gXCJCbG9ja3NcIjtcbn0pKFJlbmRlck1pbmltYXAgfHwgKFJlbmRlck1pbmltYXAgPSB7fSkpO1xuZXhwb3J0IHZhciBTY3JvbGxUeXBlO1xuKGZ1bmN0aW9uIChTY3JvbGxUeXBlKSB7XG4gICAgU2Nyb2xsVHlwZVtTY3JvbGxUeXBlW1wiU21vb3RoXCJdID0gMF0gPSBcIlNtb290aFwiO1xuICAgIFNjcm9sbFR5cGVbU2Nyb2xsVHlwZVtcIkltbWVkaWF0ZVwiXSA9IDFdID0gXCJJbW1lZGlhdGVcIjtcbn0pKFNjcm9sbFR5cGUgfHwgKFNjcm9sbFR5cGUgPSB7fSkpO1xuZXhwb3J0IHZhciBTY3JvbGxiYXJWaXNpYmlsaXR5O1xuKGZ1bmN0aW9uIChTY3JvbGxiYXJWaXNpYmlsaXR5KSB7XG4gICAgU2Nyb2xsYmFyVmlzaWJpbGl0eVtTY3JvbGxiYXJWaXNpYmlsaXR5W1wiQXV0b1wiXSA9IDFdID0gXCJBdXRvXCI7XG4gICAgU2Nyb2xsYmFyVmlzaWJpbGl0eVtTY3JvbGxiYXJWaXNpYmlsaXR5W1wiSGlkZGVuXCJdID0gMl0gPSBcIkhpZGRlblwiO1xuICAgIFNjcm9sbGJhclZpc2liaWxpdHlbU2Nyb2xsYmFyVmlzaWJpbGl0eVtcIlZpc2libGVcIl0gPSAzXSA9IFwiVmlzaWJsZVwiO1xufSkoU2Nyb2xsYmFyVmlzaWJpbGl0eSB8fCAoU2Nyb2xsYmFyVmlzaWJpbGl0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaXJlY3Rpb24gb2YgYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0aW9uRGlyZWN0aW9uO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25EaXJlY3Rpb24pIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VsZWN0aW9uIHN0YXJ0cyBhYm92ZSB3aGVyZSBpdCBlbmRzLlxuICAgICAqL1xuICAgIFNlbGVjdGlvbkRpcmVjdGlvbltTZWxlY3Rpb25EaXJlY3Rpb25bXCJMVFJcIl0gPSAwXSA9IFwiTFRSXCI7XG4gICAgLyoqXG4gICAgICogVGhlIHNlbGVjdGlvbiBzdGFydHMgYmVsb3cgd2hlcmUgaXQgZW5kcy5cbiAgICAgKi9cbiAgICBTZWxlY3Rpb25EaXJlY3Rpb25bU2VsZWN0aW9uRGlyZWN0aW9uW1wiUlRMXCJdID0gMV0gPSBcIlJUTFwiO1xufSkoU2VsZWN0aW9uRGlyZWN0aW9uIHx8IChTZWxlY3Rpb25EaXJlY3Rpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZCkge1xuICAgIFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFtTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmRbXCJJbnZva2VcIl0gPSAxXSA9IFwiSW52b2tlXCI7XG4gICAgU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kW1NpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFtcIlRyaWdnZXJDaGFyYWN0ZXJcIl0gPSAyXSA9IFwiVHJpZ2dlckNoYXJhY3RlclwiO1xuICAgIFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFtTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmRbXCJDb250ZW50Q2hhbmdlXCJdID0gM10gPSBcIkNvbnRlbnRDaGFuZ2VcIjtcbn0pKFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZCB8fCAoU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kID0ge30pKTtcbi8qKlxuICogQSBzeW1ib2wga2luZC5cbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xLaW5kO1xuKGZ1bmN0aW9uIChTeW1ib2xLaW5kKSB7XG4gICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kW1wiRmlsZVwiXSA9IDBdID0gXCJGaWxlXCI7XG4gICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kW1wiTW9kdWxlXCJdID0gMV0gPSBcIk1vZHVsZVwiO1xuICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFtcIk5hbWVzcGFjZVwiXSA9IDJdID0gXCJOYW1lc3BhY2VcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJQYWNrYWdlXCJdID0gM10gPSBcIlBhY2thZ2VcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJDbGFzc1wiXSA9IDRdID0gXCJDbGFzc1wiO1xuICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFtcIk1ldGhvZFwiXSA9IDVdID0gXCJNZXRob2RcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJQcm9wZXJ0eVwiXSA9IDZdID0gXCJQcm9wZXJ0eVwiO1xuICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFtcIkZpZWxkXCJdID0gN10gPSBcIkZpZWxkXCI7XG4gICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kW1wiQ29uc3RydWN0b3JcIl0gPSA4XSA9IFwiQ29uc3RydWN0b3JcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJFbnVtXCJdID0gOV0gPSBcIkVudW1cIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJJbnRlcmZhY2VcIl0gPSAxMF0gPSBcIkludGVyZmFjZVwiO1xuICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFtcIkZ1bmN0aW9uXCJdID0gMTFdID0gXCJGdW5jdGlvblwiO1xuICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFtcIlZhcmlhYmxlXCJdID0gMTJdID0gXCJWYXJpYWJsZVwiO1xuICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFtcIkNvbnN0YW50XCJdID0gMTNdID0gXCJDb25zdGFudFwiO1xuICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFtcIlN0cmluZ1wiXSA9IDE0XSA9IFwiU3RyaW5nXCI7XG4gICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kW1wiTnVtYmVyXCJdID0gMTVdID0gXCJOdW1iZXJcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJCb29sZWFuXCJdID0gMTZdID0gXCJCb29sZWFuXCI7XG4gICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kW1wiQXJyYXlcIl0gPSAxN10gPSBcIkFycmF5XCI7XG4gICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kW1wiT2JqZWN0XCJdID0gMThdID0gXCJPYmplY3RcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJLZXlcIl0gPSAxOV0gPSBcIktleVwiO1xuICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFtcIk51bGxcIl0gPSAyMF0gPSBcIk51bGxcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJFbnVtTWVtYmVyXCJdID0gMjFdID0gXCJFbnVtTWVtYmVyXCI7XG4gICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kW1wiU3RydWN0XCJdID0gMjJdID0gXCJTdHJ1Y3RcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJFdmVudFwiXSA9IDIzXSA9IFwiRXZlbnRcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJPcGVyYXRvclwiXSA9IDI0XSA9IFwiT3BlcmF0b3JcIjtcbiAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbXCJUeXBlUGFyYW1ldGVyXCJdID0gMjVdID0gXCJUeXBlUGFyYW1ldGVyXCI7XG59KShTeW1ib2xLaW5kIHx8IChTeW1ib2xLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICBTeW1ib2xUYWdbU3ltYm9sVGFnW1wiRGVwcmVjYXRlZFwiXSA9IDFdID0gXCJEZXByZWNhdGVkXCI7XG59KShTeW1ib2xUYWcgfHwgKFN5bWJvbFRhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGFuaW1hdGlvbiBpbiB3aGljaCB0aGUgZWRpdG9yJ3MgY3Vyc29yIHNob3VsZCBiZSByZW5kZXJlZC5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZTtcbihmdW5jdGlvbiAoVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGUpIHtcbiAgICAvKipcbiAgICAgKiBIaWRkZW5cbiAgICAgKi9cbiAgICBUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtcIkhpZGRlblwiXSA9IDBdID0gXCJIaWRkZW5cIjtcbiAgICAvKipcbiAgICAgKiBCbGlua2luZ1xuICAgICAqL1xuICAgIFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlW1RleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlW1wiQmxpbmtcIl0gPSAxXSA9IFwiQmxpbmtcIjtcbiAgICAvKipcbiAgICAgKiBCbGlua2luZyB3aXRoIHNtb290aCBmYWRpbmdcbiAgICAgKi9cbiAgICBUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtcIlNtb290aFwiXSA9IDJdID0gXCJTbW9vdGhcIjtcbiAgICAvKipcbiAgICAgKiBCbGlua2luZyB3aXRoIHByb2xvbmdlZCBmaWxsZWQgc3RhdGUgYW5kIHNtb290aCBmYWRpbmdcbiAgICAgKi9cbiAgICBUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtcIlBoYXNlXCJdID0gM10gPSBcIlBoYXNlXCI7XG4gICAgLyoqXG4gICAgICogRXhwYW5kIGNvbGxhcHNlIGFuaW1hdGlvbiBvbiB0aGUgeSBheGlzXG4gICAgICovXG4gICAgVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGVbVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGVbXCJFeHBhbmRcIl0gPSA0XSA9IFwiRXhwYW5kXCI7XG4gICAgLyoqXG4gICAgICogTm8tQmxpbmtpbmdcbiAgICAgKi9cbiAgICBUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtcIlNvbGlkXCJdID0gNV0gPSBcIlNvbGlkXCI7XG59KShUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZSB8fCAoVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGUgPSB7fSkpO1xuLyoqXG4gKiBUaGUgc3R5bGUgaW4gd2hpY2ggdGhlIGVkaXRvcidzIGN1cnNvciBzaG91bGQgYmUgcmVuZGVyZWQuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dEVkaXRvckN1cnNvclN0eWxlO1xuKGZ1bmN0aW9uIChUZXh0RWRpdG9yQ3Vyc29yU3R5bGUpIHtcbiAgICAvKipcbiAgICAgKiBBcyBhIHZlcnRpY2FsIGxpbmUgKHNpdHRpbmcgYmV0d2VlbiB0d28gY2hhcmFjdGVycykuXG4gICAgICovXG4gICAgVGV4dEVkaXRvckN1cnNvclN0eWxlW1RleHRFZGl0b3JDdXJzb3JTdHlsZVtcIkxpbmVcIl0gPSAxXSA9IFwiTGluZVwiO1xuICAgIC8qKlxuICAgICAqIEFzIGEgYmxvY2sgKHNpdHRpbmcgb24gdG9wIG9mIGEgY2hhcmFjdGVyKS5cbiAgICAgKi9cbiAgICBUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbVGV4dEVkaXRvckN1cnNvclN0eWxlW1wiQmxvY2tcIl0gPSAyXSA9IFwiQmxvY2tcIjtcbiAgICAvKipcbiAgICAgKiBBcyBhIGhvcml6b250YWwgbGluZSAoc2l0dGluZyB1bmRlciBhIGNoYXJhY3RlcikuXG4gICAgICovXG4gICAgVGV4dEVkaXRvckN1cnNvclN0eWxlW1RleHRFZGl0b3JDdXJzb3JTdHlsZVtcIlVuZGVybGluZVwiXSA9IDNdID0gXCJVbmRlcmxpbmVcIjtcbiAgICAvKipcbiAgICAgKiBBcyBhIHRoaW4gdmVydGljYWwgbGluZSAoc2l0dGluZyBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzKS5cbiAgICAgKi9cbiAgICBUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbVGV4dEVkaXRvckN1cnNvclN0eWxlW1wiTGluZVRoaW5cIl0gPSA0XSA9IFwiTGluZVRoaW5cIjtcbiAgICAvKipcbiAgICAgKiBBcyBhbiBvdXRsaW5lZCBibG9jayAoc2l0dGluZyBvbiB0b3Agb2YgYSBjaGFyYWN0ZXIpLlxuICAgICAqL1xuICAgIFRleHRFZGl0b3JDdXJzb3JTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbXCJCbG9ja091dGxpbmVcIl0gPSA1XSA9IFwiQmxvY2tPdXRsaW5lXCI7XG4gICAgLyoqXG4gICAgICogQXMgYSB0aGluIGhvcml6b250YWwgbGluZSAoc2l0dGluZyB1bmRlciBhIGNoYXJhY3RlcikuXG4gICAgICovXG4gICAgVGV4dEVkaXRvckN1cnNvclN0eWxlW1RleHRFZGl0b3JDdXJzb3JTdHlsZVtcIlVuZGVybGluZVRoaW5cIl0gPSA2XSA9IFwiVW5kZXJsaW5lVGhpblwiO1xufSkoVGV4dEVkaXRvckN1cnNvclN0eWxlIHx8IChUZXh0RWRpdG9yQ3Vyc29yU3R5bGUgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGJlaGF2aW9yIG9mIGRlY29yYXRpb25zIHdoZW4gdHlwaW5nL2VkaXRpbmcgbmVhciB0aGVpciBlZGdlcy5cbiAqIE5vdGU6IFBsZWFzZSBkbyBub3QgZWRpdCB0aGUgdmFsdWVzLCBhcyB0aGV5IHZlcnkgY2FyZWZ1bGx5IG1hdGNoIGBEZWNvcmF0aW9uUmFuZ2VCZWhhdmlvcmBcbiAqL1xuZXhwb3J0IHZhciBUcmFja2VkUmFuZ2VTdGlja2luZXNzO1xuKGZ1bmN0aW9uIChUcmFja2VkUmFuZ2VTdGlja2luZXNzKSB7XG4gICAgVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1tUcmFja2VkUmFuZ2VTdGlja2luZXNzW1wiQWx3YXlzR3Jvd3NXaGVuVHlwaW5nQXRFZGdlc1wiXSA9IDBdID0gXCJBbHdheXNHcm93c1doZW5UeXBpbmdBdEVkZ2VzXCI7XG4gICAgVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1tUcmFja2VkUmFuZ2VTdGlja2luZXNzW1wiTmV2ZXJHcm93c1doZW5UeXBpbmdBdEVkZ2VzXCJdID0gMV0gPSBcIk5ldmVyR3Jvd3NXaGVuVHlwaW5nQXRFZGdlc1wiO1xuICAgIFRyYWNrZWRSYW5nZVN0aWNraW5lc3NbVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1tcIkdyb3dzT25seVdoZW5UeXBpbmdCZWZvcmVcIl0gPSAyXSA9IFwiR3Jvd3NPbmx5V2hlblR5cGluZ0JlZm9yZVwiO1xuICAgIFRyYWNrZWRSYW5nZVN0aWNraW5lc3NbVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1tcIkdyb3dzT25seVdoZW5UeXBpbmdBZnRlclwiXSA9IDNdID0gXCJHcm93c09ubHlXaGVuVHlwaW5nQWZ0ZXJcIjtcbn0pKFRyYWNrZWRSYW5nZVN0aWNraW5lc3MgfHwgKFRyYWNrZWRSYW5nZVN0aWNraW5lc3MgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IHRvIGluZGVudCB3cmFwcGVkIGxpbmVzLlxuICovXG5leHBvcnQgdmFyIFdyYXBwaW5nSW5kZW50O1xuKGZ1bmN0aW9uIChXcmFwcGluZ0luZGVudCkge1xuICAgIC8qKlxuICAgICAqIE5vIGluZGVudGF0aW9uID0+IHdyYXBwZWQgbGluZXMgYmVnaW4gYXQgY29sdW1uIDEuXG4gICAgICovXG4gICAgV3JhcHBpbmdJbmRlbnRbV3JhcHBpbmdJbmRlbnRbXCJOb25lXCJdID0gMF0gPSBcIk5vbmVcIjtcbiAgICAvKipcbiAgICAgKiBTYW1lID0+IHdyYXBwZWQgbGluZXMgZ2V0IHRoZSBzYW1lIGluZGVudGF0aW9uIGFzIHRoZSBwYXJlbnQuXG4gICAgICovXG4gICAgV3JhcHBpbmdJbmRlbnRbV3JhcHBpbmdJbmRlbnRbXCJTYW1lXCJdID0gMV0gPSBcIlNhbWVcIjtcbiAgICAvKipcbiAgICAgKiBJbmRlbnQgPT4gd3JhcHBlZCBsaW5lcyBnZXQgKzEgaW5kZW50YXRpb24gdG93YXJkIHRoZSBwYXJlbnQuXG4gICAgICovXG4gICAgV3JhcHBpbmdJbmRlbnRbV3JhcHBpbmdJbmRlbnRbXCJJbmRlbnRcIl0gPSAyXSA9IFwiSW5kZW50XCI7XG4gICAgLyoqXG4gICAgICogRGVlcEluZGVudCA9PiB3cmFwcGVkIGxpbmVzIGdldCArMiBpbmRlbnRhdGlvbiB0b3dhcmQgdGhlIHBhcmVudC5cbiAgICAgKi9cbiAgICBXcmFwcGluZ0luZGVudFtXcmFwcGluZ0luZGVudFtcIkRlZXBJbmRlbnRcIl0gPSAzXSA9IFwiRGVlcEluZGVudFwiO1xufSkoV3JhcHBpbmdJbmRlbnQgfHwgKFdyYXBwaW5nSW5kZW50ID0ge30pKTtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi9jYW5jZWxsYXRpb24uanMnO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gJy4uLy4uLy4uL2Jhc2UvY29tbW9uL2V2ZW50LmpzJztcbmltcG9ydCB7IEtleUNob3JkIH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24va2V5Q29kZXMuanMnO1xuaW1wb3J0IHsgVVJJIH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24vdXJpLmpzJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vY29yZS9wb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL2NvcmUvcmFuZ2UuanMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAnLi4vY29yZS9zZWxlY3Rpb24uanMnO1xuaW1wb3J0IHsgVG9rZW4gfSBmcm9tICcuLi9sYW5ndWFnZXMuanMnO1xuaW1wb3J0ICogYXMgc3RhbmRhbG9uZUVudW1zIGZyb20gJy4uL3N0YW5kYWxvbmUvc3RhbmRhbG9uZUVudW1zLmpzJztcbmV4cG9ydCBjbGFzcyBLZXlNb2Qge1xuICAgIHN0YXRpYyBjaG9yZChmaXJzdFBhcnQsIHNlY29uZFBhcnQpIHtcbiAgICAgICAgcmV0dXJuIEtleUNob3JkKGZpcnN0UGFydCwgc2Vjb25kUGFydCk7XG4gICAgfVxufVxuS2V5TW9kLkN0cmxDbWQgPSAyMDQ4IC8qIENvbnN0S2V5TW9kLkN0cmxDbWQgKi87XG5LZXlNb2QuU2hpZnQgPSAxMDI0IC8qIENvbnN0S2V5TW9kLlNoaWZ0ICovO1xuS2V5TW9kLkFsdCA9IDUxMiAvKiBDb25zdEtleU1vZC5BbHQgKi87XG5LZXlNb2QuV2luQ3RybCA9IDI1NiAvKiBDb25zdEtleU1vZC5XaW5DdHJsICovO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vbmFjb0Jhc2VBUEkoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWRpdG9yOiB1bmRlZmluZWQsXG4gICAgICAgIGxhbmd1YWdlczogdW5kZWZpbmVkLFxuICAgICAgICBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZTogQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UsXG4gICAgICAgIEVtaXR0ZXI6IEVtaXR0ZXIsXG4gICAgICAgIEtleUNvZGU6IHN0YW5kYWxvbmVFbnVtcy5LZXlDb2RlLFxuICAgICAgICBLZXlNb2Q6IEtleU1vZCxcbiAgICAgICAgUG9zaXRpb246IFBvc2l0aW9uLFxuICAgICAgICBSYW5nZTogUmFuZ2UsXG4gICAgICAgIFNlbGVjdGlvbjogU2VsZWN0aW9uLFxuICAgICAgICBTZWxlY3Rpb25EaXJlY3Rpb246IHN0YW5kYWxvbmVFbnVtcy5TZWxlY3Rpb25EaXJlY3Rpb24sXG4gICAgICAgIE1hcmtlclNldmVyaXR5OiBzdGFuZGFsb25lRW51bXMuTWFya2VyU2V2ZXJpdHksXG4gICAgICAgIE1hcmtlclRhZzogc3RhbmRhbG9uZUVudW1zLk1hcmtlclRhZyxcbiAgICAgICAgVXJpOiBVUkksXG4gICAgICAgIFRva2VuOiBUb2tlblxuICAgIH07XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IENoYXJhY3RlckNsYXNzaWZpZXIgfSBmcm9tICcuL2NoYXJhY3RlckNsYXNzaWZpZXIuanMnO1xuZXhwb3J0IGNsYXNzIFdvcmRDaGFyYWN0ZXJDbGFzc2lmaWVyIGV4dGVuZHMgQ2hhcmFjdGVyQ2xhc3NpZmllciB7XG4gICAgY29uc3RydWN0b3Iod29yZFNlcGFyYXRvcnMpIHtcbiAgICAgICAgc3VwZXIoMCAvKiBXb3JkQ2hhcmFjdGVyQ2xhc3MuUmVndWxhciAqLyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB3b3JkU2VwYXJhdG9ycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdGhpcy5zZXQod29yZFNlcGFyYXRvcnMuY2hhckNvZGVBdChpKSwgMiAvKiBXb3JkQ2hhcmFjdGVyQ2xhc3MuV29yZFNlcGFyYXRvciAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXQoMzIgLyogQ2hhckNvZGUuU3BhY2UgKi8sIDEgLyogV29yZENoYXJhY3RlckNsYXNzLldoaXRlc3BhY2UgKi8pO1xuICAgICAgICB0aGlzLnNldCg5IC8qIENoYXJDb2RlLlRhYiAqLywgMSAvKiBXb3JkQ2hhcmFjdGVyQ2xhc3MuV2hpdGVzcGFjZSAqLyk7XG4gICAgfVxufVxuZnVuY3Rpb24gb25jZShjb21wdXRlRm4pIHtcbiAgICBjb25zdCBjYWNoZSA9IHt9OyAvLyBUT0RPQEFsZXggdW5ib3VuZGVkIGNhY2hlXG4gICAgcmV0dXJuIChpbnB1dCkgPT4ge1xuICAgICAgICBpZiAoIWNhY2hlLmhhc093blByb3BlcnR5KGlucHV0KSkge1xuICAgICAgICAgICAgY2FjaGVbaW5wdXRdID0gY29tcHV0ZUZuKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVbaW5wdXRdO1xuICAgIH07XG59XG5leHBvcnQgY29uc3QgZ2V0TWFwRm9yV29yZFNlcGFyYXRvcnMgPSBvbmNlKChpbnB1dCkgPT4gbmV3IFdvcmRDaGFyYWN0ZXJDbGFzc2lmaWVyKGlucHV0KSk7XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IGVxdWFscyB9IGZyb20gJy4uLy4uL2Jhc2UvY29tbW9uL29iamVjdHMuanMnO1xuLyoqXG4gKiBWZXJ0aWNhbCBMYW5lIGluIHRoZSBvdmVydmlldyBydWxlciBvZiB0aGUgZWRpdG9yLlxuICovXG5leHBvcnQgdmFyIE92ZXJ2aWV3UnVsZXJMYW5lO1xuKGZ1bmN0aW9uIChPdmVydmlld1J1bGVyTGFuZSkge1xuICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lW1wiTGVmdFwiXSA9IDFdID0gXCJMZWZ0XCI7XG4gICAgT3ZlcnZpZXdSdWxlckxhbmVbT3ZlcnZpZXdSdWxlckxhbmVbXCJDZW50ZXJcIl0gPSAyXSA9IFwiQ2VudGVyXCI7XG4gICAgT3ZlcnZpZXdSdWxlckxhbmVbT3ZlcnZpZXdSdWxlckxhbmVbXCJSaWdodFwiXSA9IDRdID0gXCJSaWdodFwiO1xuICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lW1wiRnVsbFwiXSA9IDddID0gXCJGdWxsXCI7XG59KShPdmVydmlld1J1bGVyTGFuZSB8fCAoT3ZlcnZpZXdSdWxlckxhbmUgPSB7fSkpO1xuLyoqXG4gKiBWZXJ0aWNhbCBMYW5lIGluIHRoZSBnbHlwaCBtYXJnaW4gb2YgdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IHZhciBHbHlwaE1hcmdpbkxhbmU7XG4oZnVuY3Rpb24gKEdseXBoTWFyZ2luTGFuZSkge1xuICAgIEdseXBoTWFyZ2luTGFuZVtHbHlwaE1hcmdpbkxhbmVbXCJMZWZ0XCJdID0gMV0gPSBcIkxlZnRcIjtcbiAgICBHbHlwaE1hcmdpbkxhbmVbR2x5cGhNYXJnaW5MYW5lW1wiUmlnaHRcIl0gPSAyXSA9IFwiUmlnaHRcIjtcbn0pKEdseXBoTWFyZ2luTGFuZSB8fCAoR2x5cGhNYXJnaW5MYW5lID0ge30pKTtcbi8qKlxuICogUG9zaXRpb24gaW4gdGhlIG1pbmltYXAgdG8gcmVuZGVyIHRoZSBkZWNvcmF0aW9uLlxuICovXG5leHBvcnQgdmFyIE1pbmltYXBQb3NpdGlvbjtcbihmdW5jdGlvbiAoTWluaW1hcFBvc2l0aW9uKSB7XG4gICAgTWluaW1hcFBvc2l0aW9uW01pbmltYXBQb3NpdGlvbltcIklubGluZVwiXSA9IDFdID0gXCJJbmxpbmVcIjtcbiAgICBNaW5pbWFwUG9zaXRpb25bTWluaW1hcFBvc2l0aW9uW1wiR3V0dGVyXCJdID0gMl0gPSBcIkd1dHRlclwiO1xufSkoTWluaW1hcFBvc2l0aW9uIHx8IChNaW5pbWFwUG9zaXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmplY3RlZFRleHRDdXJzb3JTdG9wcztcbihmdW5jdGlvbiAoSW5qZWN0ZWRUZXh0Q3Vyc29yU3RvcHMpIHtcbiAgICBJbmplY3RlZFRleHRDdXJzb3JTdG9wc1tJbmplY3RlZFRleHRDdXJzb3JTdG9wc1tcIkJvdGhcIl0gPSAwXSA9IFwiQm90aFwiO1xuICAgIEluamVjdGVkVGV4dEN1cnNvclN0b3BzW0luamVjdGVkVGV4dEN1cnNvclN0b3BzW1wiUmlnaHRcIl0gPSAxXSA9IFwiUmlnaHRcIjtcbiAgICBJbmplY3RlZFRleHRDdXJzb3JTdG9wc1tJbmplY3RlZFRleHRDdXJzb3JTdG9wc1tcIkxlZnRcIl0gPSAyXSA9IFwiTGVmdFwiO1xuICAgIEluamVjdGVkVGV4dEN1cnNvclN0b3BzW0luamVjdGVkVGV4dEN1cnNvclN0b3BzW1wiTm9uZVwiXSA9IDNdID0gXCJOb25lXCI7XG59KShJbmplY3RlZFRleHRDdXJzb3JTdG9wcyB8fCAoSW5qZWN0ZWRUZXh0Q3Vyc29yU3RvcHMgPSB7fSkpO1xuZXhwb3J0IGNsYXNzIFRleHRNb2RlbFJlc29sdmVkT3B0aW9ucyB7XG4gICAgZ2V0IG9yaWdpbmFsSW5kZW50U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luZGVudFNpemVJc1RhYlNpemUgPyAndGFiU2l6ZScgOiB0aGlzLmluZGVudFNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNyYykge1xuICAgICAgICB0aGlzLl90ZXh0TW9kZWxSZXNvbHZlZE9wdGlvbnNCcmFuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50YWJTaXplID0gTWF0aC5tYXgoMSwgc3JjLnRhYlNpemUgfCAwKTtcbiAgICAgICAgaWYgKHNyYy5pbmRlbnRTaXplID09PSAndGFiU2l6ZScpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50U2l6ZSA9IHRoaXMudGFiU2l6ZTtcbiAgICAgICAgICAgIHRoaXMuX2luZGVudFNpemVJc1RhYlNpemUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbmRlbnRTaXplID0gTWF0aC5tYXgoMSwgc3JjLmluZGVudFNpemUgfCAwKTtcbiAgICAgICAgICAgIHRoaXMuX2luZGVudFNpemVJc1RhYlNpemUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc2VydFNwYWNlcyA9IEJvb2xlYW4oc3JjLmluc2VydFNwYWNlcyk7XG4gICAgICAgIHRoaXMuZGVmYXVsdEVPTCA9IHNyYy5kZWZhdWx0RU9MIHwgMDtcbiAgICAgICAgdGhpcy50cmltQXV0b1doaXRlc3BhY2UgPSBCb29sZWFuKHNyYy50cmltQXV0b1doaXRlc3BhY2UpO1xuICAgICAgICB0aGlzLmJyYWNrZXRQYWlyQ29sb3JpemF0aW9uT3B0aW9ucyA9IHNyYy5icmFja2V0UGFpckNvbG9yaXphdGlvbk9wdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGVxdWFscyhvdGhlcikge1xuICAgICAgICByZXR1cm4gKHRoaXMudGFiU2l6ZSA9PT0gb3RoZXIudGFiU2l6ZVxuICAgICAgICAgICAgJiYgdGhpcy5faW5kZW50U2l6ZUlzVGFiU2l6ZSA9PT0gb3RoZXIuX2luZGVudFNpemVJc1RhYlNpemVcbiAgICAgICAgICAgICYmIHRoaXMuaW5kZW50U2l6ZSA9PT0gb3RoZXIuaW5kZW50U2l6ZVxuICAgICAgICAgICAgJiYgdGhpcy5pbnNlcnRTcGFjZXMgPT09IG90aGVyLmluc2VydFNwYWNlc1xuICAgICAgICAgICAgJiYgdGhpcy5kZWZhdWx0RU9MID09PSBvdGhlci5kZWZhdWx0RU9MXG4gICAgICAgICAgICAmJiB0aGlzLnRyaW1BdXRvV2hpdGVzcGFjZSA9PT0gb3RoZXIudHJpbUF1dG9XaGl0ZXNwYWNlXG4gICAgICAgICAgICAmJiBlcXVhbHModGhpcy5icmFja2V0UGFpckNvbG9yaXphdGlvbk9wdGlvbnMsIG90aGVyLmJyYWNrZXRQYWlyQ29sb3JpemF0aW9uT3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjcmVhdGVDaGFuZ2VFdmVudChuZXdPcHRzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWJTaXplOiB0aGlzLnRhYlNpemUgIT09IG5ld09wdHMudGFiU2l6ZSxcbiAgICAgICAgICAgIGluZGVudFNpemU6IHRoaXMuaW5kZW50U2l6ZSAhPT0gbmV3T3B0cy5pbmRlbnRTaXplLFxuICAgICAgICAgICAgaW5zZXJ0U3BhY2VzOiB0aGlzLmluc2VydFNwYWNlcyAhPT0gbmV3T3B0cy5pbnNlcnRTcGFjZXMsXG4gICAgICAgICAgICB0cmltQXV0b1doaXRlc3BhY2U6IHRoaXMudHJpbUF1dG9XaGl0ZXNwYWNlICE9PSBuZXdPcHRzLnRyaW1BdXRvV2hpdGVzcGFjZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRmluZE1hdGNoIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyYW5nZSwgbWF0Y2hlcykge1xuICAgICAgICB0aGlzLl9maW5kTWF0Y2hCcmFuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgICAgICB0aGlzLm1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lUZXh0U25hcHNob3Qob2JqKSB7XG4gICAgcmV0dXJuIChvYmogJiYgdHlwZW9mIG9iai5yZWFkID09PSAnZnVuY3Rpb24nKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZEFubm90YXRlZEVkaXRPcGVyYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKGlkZW50aWZpZXIsIHJhbmdlLCB0ZXh0LCBmb3JjZU1vdmVNYXJrZXJzLCBpc0F1dG9XaGl0ZXNwYWNlRWRpdCwgX2lzVHJhY2tlZCkge1xuICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuZm9yY2VNb3ZlTWFya2VycyA9IGZvcmNlTW92ZU1hcmtlcnM7XG4gICAgICAgIHRoaXMuaXNBdXRvV2hpdGVzcGFjZUVkaXQgPSBpc0F1dG9XaGl0ZXNwYWNlRWRpdDtcbiAgICAgICAgdGhpcy5faXNUcmFja2VkID0gX2lzVHJhY2tlZDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoRGF0YSB7XG4gICAgY29uc3RydWN0b3IocmVnZXgsIHdvcmRTZXBhcmF0b3JzLCBzaW1wbGVTZWFyY2gpIHtcbiAgICAgICAgdGhpcy5yZWdleCA9IHJlZ2V4O1xuICAgICAgICB0aGlzLndvcmRTZXBhcmF0b3JzID0gd29yZFNlcGFyYXRvcnM7XG4gICAgICAgIHRoaXMuc2ltcGxlU2VhcmNoID0gc2ltcGxlU2VhcmNoO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBseUVkaXRzUmVzdWx0IHtcbiAgICBjb25zdHJ1Y3RvcihyZXZlcnNlRWRpdHMsIGNoYW5nZXMsIHRyaW1BdXRvV2hpdGVzcGFjZUxpbmVOdW1iZXJzKSB7XG4gICAgICAgIHRoaXMucmV2ZXJzZUVkaXRzID0gcmV2ZXJzZUVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBjaGFuZ2VzO1xuICAgICAgICB0aGlzLnRyaW1BdXRvV2hpdGVzcGFjZUxpbmVOdW1iZXJzID0gdHJpbUF1dG9XaGl0ZXNwYWNlTGluZU51bWJlcnM7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN5bmNocm9uaXplTW9kZWwobW9kZWwpIHtcbiAgICByZXR1cm4gKCFtb2RlbC5pc1Rvb0xhcmdlRm9yU3luY2luZygpICYmICFtb2RlbC5pc0ZvclNpbXBsZVdpZGdldCk7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCAqIGFzIHN0cmluZ3MgZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24vc3RyaW5ncy5qcyc7XG5pbXBvcnQgeyBnZXRNYXBGb3JXb3JkU2VwYXJhdG9ycyB9IGZyb20gJy4uL2NvcmUvd29yZENoYXJhY3RlckNsYXNzaWZpZXIuanMnO1xuaW1wb3J0IHsgUG9zaXRpb24gfSBmcm9tICcuLi9jb3JlL3Bvc2l0aW9uLmpzJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vY29yZS9yYW5nZS5qcyc7XG5pbXBvcnQgeyBGaW5kTWF0Y2gsIFNlYXJjaERhdGEgfSBmcm9tICcuLi9tb2RlbC5qcyc7XG5jb25zdCBMSU1JVF9GSU5EX0NPVU5UID0gOTk5O1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBhcmFtcyB7XG4gICAgY29uc3RydWN0b3Ioc2VhcmNoU3RyaW5nLCBpc1JlZ2V4LCBtYXRjaENhc2UsIHdvcmRTZXBhcmF0b3JzKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3RyaW5nID0gc2VhcmNoU3RyaW5nO1xuICAgICAgICB0aGlzLmlzUmVnZXggPSBpc1JlZ2V4O1xuICAgICAgICB0aGlzLm1hdGNoQ2FzZSA9IG1hdGNoQ2FzZTtcbiAgICAgICAgdGhpcy53b3JkU2VwYXJhdG9ycyA9IHdvcmRTZXBhcmF0b3JzO1xuICAgIH1cbiAgICBwYXJzZVNlYXJjaFJlcXVlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFN0cmluZyA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYSBSZWdFeHAgb3V0IG9mIHRoZSBwYXJhbXNcbiAgICAgICAgbGV0IG11bHRpbGluZTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWdleCkge1xuICAgICAgICAgICAgbXVsdGlsaW5lID0gaXNNdWx0aWxpbmVSZWdleFNvdXJjZSh0aGlzLnNlYXJjaFN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtdWx0aWxpbmUgPSAodGhpcy5zZWFyY2hTdHJpbmcuaW5kZXhPZignXFxuJykgPj0gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlZ2V4ID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlZ2V4ID0gc3RyaW5ncy5jcmVhdGVSZWdFeHAodGhpcy5zZWFyY2hTdHJpbmcsIHRoaXMuaXNSZWdleCwge1xuICAgICAgICAgICAgICAgIG1hdGNoQ2FzZTogdGhpcy5tYXRjaENhc2UsXG4gICAgICAgICAgICAgICAgd2hvbGVXb3JkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtdWx0aWxpbmU6IG11bHRpbGluZSxcbiAgICAgICAgICAgICAgICBnbG9iYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgdW5pY29kZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZWdleCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhblVzZVNpbXBsZVNlYXJjaCA9ICghdGhpcy5pc1JlZ2V4ICYmICFtdWx0aWxpbmUpO1xuICAgICAgICBpZiAoY2FuVXNlU2ltcGxlU2VhcmNoICYmIHRoaXMuc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMuc2VhcmNoU3RyaW5nLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIC8vIGNhc2luZyBtaWdodCBtYWtlIGEgZGlmZmVyZW5jZVxuICAgICAgICAgICAgY2FuVXNlU2ltcGxlU2VhcmNoID0gdGhpcy5tYXRjaENhc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hEYXRhKHJlZ2V4LCB0aGlzLndvcmRTZXBhcmF0b3JzID8gZ2V0TWFwRm9yV29yZFNlcGFyYXRvcnModGhpcy53b3JkU2VwYXJhdG9ycykgOiBudWxsLCBjYW5Vc2VTaW1wbGVTZWFyY2ggPyB0aGlzLnNlYXJjaFN0cmluZyA6IG51bGwpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc011bHRpbGluZVJlZ2V4U291cmNlKHNlYXJjaFN0cmluZykge1xuICAgIGlmICghc2VhcmNoU3RyaW5nIHx8IHNlYXJjaFN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2VhcmNoU3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoQ29kZSA9IHNlYXJjaFN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY2hDb2RlID09PSAxMCAvKiBDaGFyQ29kZS5MaW5lRmVlZCAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoQ29kZSA9PT0gOTIgLyogQ2hhckNvZGUuQmFja3NsYXNoICovKSB7XG4gICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgY2hhclxuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaWYgKGkgPj0gbGVuKSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nIGVuZHMgd2l0aCBhIFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0Q2hDb2RlID0gc2VhcmNoU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoQ29kZSA9PT0gMTEwIC8qIENoYXJDb2RlLm4gKi8gfHwgbmV4dENoQ29kZSA9PT0gMTE0IC8qIENoYXJDb2RlLnIgKi8gfHwgbmV4dENoQ29kZSA9PT0gODcgLyogQ2hhckNvZGUuVyAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaW5kTWF0Y2gocmFuZ2UsIHJhd01hdGNoZXMsIGNhcHR1cmVNYXRjaGVzKSB7XG4gICAgaWYgKCFjYXB0dXJlTWF0Y2hlcykge1xuICAgICAgICByZXR1cm4gbmV3IEZpbmRNYXRjaChyYW5nZSwgbnVsbCk7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmF3TWF0Y2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBtYXRjaGVzW2ldID0gcmF3TWF0Y2hlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGaW5kTWF0Y2gocmFuZ2UsIG1hdGNoZXMpO1xufVxuY2xhc3MgTGluZUZlZWRDb3VudGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0KSB7XG4gICAgICAgIGNvbnN0IGxpbmVGZWVkc09mZnNldHMgPSBbXTtcbiAgICAgICAgbGV0IGxpbmVGZWVkc09mZnNldHNMZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgdGV4dExlbiA9IHRleHQubGVuZ3RoOyBpIDwgdGV4dExlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkpID09PSAxMCAvKiBDaGFyQ29kZS5MaW5lRmVlZCAqLykge1xuICAgICAgICAgICAgICAgIGxpbmVGZWVkc09mZnNldHNbbGluZUZlZWRzT2Zmc2V0c0xlbisrXSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGluZUZlZWRzT2Zmc2V0cyA9IGxpbmVGZWVkc09mZnNldHM7XG4gICAgfVxuICAgIGZpbmRMaW5lRmVlZENvdW50QmVmb3JlT2Zmc2V0KG9mZnNldCkge1xuICAgICAgICBjb25zdCBsaW5lRmVlZHNPZmZzZXRzID0gdGhpcy5fbGluZUZlZWRzT2Zmc2V0cztcbiAgICAgICAgbGV0IG1pbiA9IDA7XG4gICAgICAgIGxldCBtYXggPSBsaW5lRmVlZHNPZmZzZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChtYXggPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBubyBsaW5lIGZlZWRzXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2Zmc2V0IDw9IGxpbmVGZWVkc09mZnNldHNbMF0pIHtcbiAgICAgICAgICAgIC8vIGJlZm9yZSBmaXJzdCBsaW5lIGZlZWRcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChtaW4gPCBtYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZCA9IG1pbiArICgobWF4IC0gbWluKSAvIDIgPj4gMCk7XG4gICAgICAgICAgICBpZiAobGluZUZlZWRzT2Zmc2V0c1ttaWRdID49IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobGluZUZlZWRzT2Zmc2V0c1ttaWQgKyAxXSA+PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYmluZ28hXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pZDtcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWluID0gbWlkICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbiArIDE7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRleHRNb2RlbFNlYXJjaCB7XG4gICAgc3RhdGljIGZpbmRNYXRjaGVzKG1vZGVsLCBzZWFyY2hQYXJhbXMsIHNlYXJjaFJhbmdlLCBjYXB0dXJlTWF0Y2hlcywgbGltaXRSZXN1bHRDb3VudCkge1xuICAgICAgICBjb25zdCBzZWFyY2hEYXRhID0gc2VhcmNoUGFyYW1zLnBhcnNlU2VhcmNoUmVxdWVzdCgpO1xuICAgICAgICBpZiAoIXNlYXJjaERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VhcmNoRGF0YS5yZWdleC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kb0ZpbmRNYXRjaGVzTXVsdGlsaW5lKG1vZGVsLCBzZWFyY2hSYW5nZSwgbmV3IFNlYXJjaGVyKHNlYXJjaERhdGEud29yZFNlcGFyYXRvcnMsIHNlYXJjaERhdGEucmVnZXgpLCBjYXB0dXJlTWF0Y2hlcywgbGltaXRSZXN1bHRDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvRmluZE1hdGNoZXNMaW5lQnlMaW5lKG1vZGVsLCBzZWFyY2hSYW5nZSwgc2VhcmNoRGF0YSwgY2FwdHVyZU1hdGNoZXMsIGxpbWl0UmVzdWx0Q291bnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNdWx0aWxpbmUgc2VhcmNoIGFsd2F5cyBleGVjdXRlcyBvbiB0aGUgbGluZXMgY29uY2F0ZW5hdGVkIHdpdGggXFxuLlxuICAgICAqIFdlIG11c3QgdGhlcmVmb3JlIGNvbXBlbnNhdGUgZm9yIHRoZSBjb3VudCBvZiBcXG4gaW4gY2FzZSB0aGUgbW9kZWwgaXMgQ1JMRlxuICAgICAqL1xuICAgIHN0YXRpYyBfZ2V0TXVsdGlsaW5lTWF0Y2hSYW5nZShtb2RlbCwgZGVsdGFPZmZzZXQsIHRleHQsIGxmQ291bnRlciwgbWF0Y2hJbmRleCwgbWF0Y2gwKSB7XG4gICAgICAgIGxldCBzdGFydE9mZnNldDtcbiAgICAgICAgbGV0IGxpbmVGZWVkQ291bnRCZWZvcmVNYXRjaCA9IDA7XG4gICAgICAgIGlmIChsZkNvdW50ZXIpIHtcbiAgICAgICAgICAgIGxpbmVGZWVkQ291bnRCZWZvcmVNYXRjaCA9IGxmQ291bnRlci5maW5kTGluZUZlZWRDb3VudEJlZm9yZU9mZnNldChtYXRjaEluZGV4KTtcbiAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gZGVsdGFPZmZzZXQgKyBtYXRjaEluZGV4ICsgbGluZUZlZWRDb3VudEJlZm9yZU1hdGNoIC8qIGFkZCBhcyBtYW55IFxcciBhcyB0aGVyZSB3ZXJlIFxcbiAqLztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gZGVsdGFPZmZzZXQgKyBtYXRjaEluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbmRPZmZzZXQ7XG4gICAgICAgIGlmIChsZkNvdW50ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVGZWVkQ291bnRCZWZvcmVFbmRPZk1hdGNoID0gbGZDb3VudGVyLmZpbmRMaW5lRmVlZENvdW50QmVmb3JlT2Zmc2V0KG1hdGNoSW5kZXggKyBtYXRjaDAubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVGZWVkQ291bnRJbk1hdGNoID0gbGluZUZlZWRDb3VudEJlZm9yZUVuZE9mTWF0Y2ggLSBsaW5lRmVlZENvdW50QmVmb3JlTWF0Y2g7XG4gICAgICAgICAgICBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIG1hdGNoMC5sZW5ndGggKyBsaW5lRmVlZENvdW50SW5NYXRjaCAvKiBhZGQgYXMgbWFueSBcXHIgYXMgdGhlcmUgd2VyZSBcXG4gKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIG1hdGNoMC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IG1vZGVsLmdldFBvc2l0aW9uQXQoc3RhcnRPZmZzZXQpO1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IG1vZGVsLmdldFBvc2l0aW9uQXQoZW5kT2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0UG9zaXRpb24uY29sdW1uLCBlbmRQb3NpdGlvbi5saW5lTnVtYmVyLCBlbmRQb3NpdGlvbi5jb2x1bW4pO1xuICAgIH1cbiAgICBzdGF0aWMgX2RvRmluZE1hdGNoZXNNdWx0aWxpbmUobW9kZWwsIHNlYXJjaFJhbmdlLCBzZWFyY2hlciwgY2FwdHVyZU1hdGNoZXMsIGxpbWl0UmVzdWx0Q291bnQpIHtcbiAgICAgICAgY29uc3QgZGVsdGFPZmZzZXQgPSBtb2RlbC5nZXRPZmZzZXRBdChzZWFyY2hSYW5nZS5nZXRTdGFydFBvc2l0aW9uKCkpO1xuICAgICAgICAvLyBXZSBhbHdheXMgZXhlY3V0ZSBtdWx0aWxpbmUgc2VhcmNoIG92ZXIgdGhlIGxpbmVzIGpvaW5lZCB3aXRoIFxcblxuICAgICAgICAvLyBUaGlzIG1ha2VzIGl0IHRoYXQgXFxuIHdpbGwgbWF0Y2ggdGhlIEVPTCBmb3IgYm90aCBDUkxGIGFuZCBMRiBtb2RlbHNcbiAgICAgICAgLy8gV2UgY29tcGVuc2F0ZSBmb3Igb2Zmc2V0IGVycm9ycyBpbiBgX2dldE11bHRpbGluZU1hdGNoUmFuZ2VgXG4gICAgICAgIGNvbnN0IHRleHQgPSBtb2RlbC5nZXRWYWx1ZUluUmFuZ2Uoc2VhcmNoUmFuZ2UsIDEgLyogRW5kT2ZMaW5lUHJlZmVyZW5jZS5MRiAqLyk7XG4gICAgICAgIGNvbnN0IGxmQ291bnRlciA9IChtb2RlbC5nZXRFT0woKSA9PT0gJ1xcclxcbicgPyBuZXcgTGluZUZlZWRDb3VudGVyKHRleHQpIDogbnVsbCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGxldCBtO1xuICAgICAgICBzZWFyY2hlci5yZXNldCgwKTtcbiAgICAgICAgd2hpbGUgKChtID0gc2VhcmNoZXIubmV4dCh0ZXh0KSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtjb3VudGVyKytdID0gY3JlYXRlRmluZE1hdGNoKHRoaXMuX2dldE11bHRpbGluZU1hdGNoUmFuZ2UobW9kZWwsIGRlbHRhT2Zmc2V0LCB0ZXh0LCBsZkNvdW50ZXIsIG0uaW5kZXgsIG1bMF0pLCBtLCBjYXB0dXJlTWF0Y2hlcyk7XG4gICAgICAgICAgICBpZiAoY291bnRlciA+PSBsaW1pdFJlc3VsdENvdW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgX2RvRmluZE1hdGNoZXNMaW5lQnlMaW5lKG1vZGVsLCBzZWFyY2hSYW5nZSwgc2VhcmNoRGF0YSwgY2FwdHVyZU1hdGNoZXMsIGxpbWl0UmVzdWx0Q291bnQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCByZXN1bHRMZW4gPSAwO1xuICAgICAgICAvLyBFYXJseSBjYXNlIGZvciBhIHNlYXJjaCByYW5nZSB0aGF0IHN0YXJ0cyAmIHN0b3BzIG9uIHRoZSBzYW1lIGxpbmUgbnVtYmVyXG4gICAgICAgIGlmIChzZWFyY2hSYW5nZS5zdGFydExpbmVOdW1iZXIgPT09IHNlYXJjaFJhbmdlLmVuZExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBtb2RlbC5nZXRMaW5lQ29udGVudChzZWFyY2hSYW5nZS5zdGFydExpbmVOdW1iZXIpLnN1YnN0cmluZyhzZWFyY2hSYW5nZS5zdGFydENvbHVtbiAtIDEsIHNlYXJjaFJhbmdlLmVuZENvbHVtbiAtIDEpO1xuICAgICAgICAgICAgcmVzdWx0TGVuID0gdGhpcy5fZmluZE1hdGNoZXNJbkxpbmUoc2VhcmNoRGF0YSwgdGV4dCwgc2VhcmNoUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCBzZWFyY2hSYW5nZS5zdGFydENvbHVtbiAtIDEsIHJlc3VsdExlbiwgcmVzdWx0LCBjYXB0dXJlTWF0Y2hlcywgbGltaXRSZXN1bHRDb3VudCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbGxlY3QgcmVzdWx0cyBmcm9tIGZpcnN0IGxpbmVcbiAgICAgICAgY29uc3QgdGV4dCA9IG1vZGVsLmdldExpbmVDb250ZW50KHNlYXJjaFJhbmdlLnN0YXJ0TGluZU51bWJlcikuc3Vic3RyaW5nKHNlYXJjaFJhbmdlLnN0YXJ0Q29sdW1uIC0gMSk7XG4gICAgICAgIHJlc3VsdExlbiA9IHRoaXMuX2ZpbmRNYXRjaGVzSW5MaW5lKHNlYXJjaERhdGEsIHRleHQsIHNlYXJjaFJhbmdlLnN0YXJ0TGluZU51bWJlciwgc2VhcmNoUmFuZ2Uuc3RhcnRDb2x1bW4gLSAxLCByZXN1bHRMZW4sIHJlc3VsdCwgY2FwdHVyZU1hdGNoZXMsIGxpbWl0UmVzdWx0Q291bnQpO1xuICAgICAgICAvLyBDb2xsZWN0IHJlc3VsdHMgZnJvbSBtaWRkbGUgbGluZXNcbiAgICAgICAgZm9yIChsZXQgbGluZU51bWJlciA9IHNlYXJjaFJhbmdlLnN0YXJ0TGluZU51bWJlciArIDE7IGxpbmVOdW1iZXIgPCBzZWFyY2hSYW5nZS5lbmRMaW5lTnVtYmVyICYmIHJlc3VsdExlbiA8IGxpbWl0UmVzdWx0Q291bnQ7IGxpbmVOdW1iZXIrKykge1xuICAgICAgICAgICAgcmVzdWx0TGVuID0gdGhpcy5fZmluZE1hdGNoZXNJbkxpbmUoc2VhcmNoRGF0YSwgbW9kZWwuZ2V0TGluZUNvbnRlbnQobGluZU51bWJlciksIGxpbmVOdW1iZXIsIDAsIHJlc3VsdExlbiwgcmVzdWx0LCBjYXB0dXJlTWF0Y2hlcywgbGltaXRSZXN1bHRDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29sbGVjdCByZXN1bHRzIGZyb20gbGFzdCBsaW5lXG4gICAgICAgIGlmIChyZXN1bHRMZW4gPCBsaW1pdFJlc3VsdENvdW50KSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gbW9kZWwuZ2V0TGluZUNvbnRlbnQoc2VhcmNoUmFuZ2UuZW5kTGluZU51bWJlcikuc3Vic3RyaW5nKDAsIHNlYXJjaFJhbmdlLmVuZENvbHVtbiAtIDEpO1xuICAgICAgICAgICAgcmVzdWx0TGVuID0gdGhpcy5fZmluZE1hdGNoZXNJbkxpbmUoc2VhcmNoRGF0YSwgdGV4dCwgc2VhcmNoUmFuZ2UuZW5kTGluZU51bWJlciwgMCwgcmVzdWx0TGVuLCByZXN1bHQsIGNhcHR1cmVNYXRjaGVzLCBsaW1pdFJlc3VsdENvdW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgX2ZpbmRNYXRjaGVzSW5MaW5lKHNlYXJjaERhdGEsIHRleHQsIGxpbmVOdW1iZXIsIGRlbHRhT2Zmc2V0LCByZXN1bHRMZW4sIHJlc3VsdCwgY2FwdHVyZU1hdGNoZXMsIGxpbWl0UmVzdWx0Q291bnQpIHtcbiAgICAgICAgY29uc3Qgd29yZFNlcGFyYXRvcnMgPSBzZWFyY2hEYXRhLndvcmRTZXBhcmF0b3JzO1xuICAgICAgICBpZiAoIWNhcHR1cmVNYXRjaGVzICYmIHNlYXJjaERhdGEuc2ltcGxlU2VhcmNoKSB7XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hTdHJpbmcgPSBzZWFyY2hEYXRhLnNpbXBsZVNlYXJjaDtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFN0cmluZ0xlbiA9IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbGFzdE1hdGNoSW5kZXggPSAtc2VhcmNoU3RyaW5nTGVuO1xuICAgICAgICAgICAgd2hpbGUgKChsYXN0TWF0Y2hJbmRleCA9IHRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGxhc3RNYXRjaEluZGV4ICsgc2VhcmNoU3RyaW5nTGVuKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JkU2VwYXJhdG9ycyB8fCBpc1ZhbGlkTWF0Y2god29yZFNlcGFyYXRvcnMsIHRleHQsIHRleHRMZW5ndGgsIGxhc3RNYXRjaEluZGV4LCBzZWFyY2hTdHJpbmdMZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHRMZW4rK10gPSBuZXcgRmluZE1hdGNoKG5ldyBSYW5nZShsaW5lTnVtYmVyLCBsYXN0TWF0Y2hJbmRleCArIDEgKyBkZWx0YU9mZnNldCwgbGluZU51bWJlciwgbGFzdE1hdGNoSW5kZXggKyAxICsgc2VhcmNoU3RyaW5nTGVuICsgZGVsdGFPZmZzZXQpLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdExlbiA+PSBsaW1pdFJlc3VsdENvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0TGVuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExlbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWFyY2hlciA9IG5ldyBTZWFyY2hlcihzZWFyY2hEYXRhLndvcmRTZXBhcmF0b3JzLCBzZWFyY2hEYXRhLnJlZ2V4KTtcbiAgICAgICAgbGV0IG07XG4gICAgICAgIC8vIFJlc2V0IHJlZ2V4IHRvIHNlYXJjaCBmcm9tIHRoZSBiZWdpbm5pbmdcbiAgICAgICAgc2VhcmNoZXIucmVzZXQoMCk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG0gPSBzZWFyY2hlci5uZXh0KHRleHQpO1xuICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcmVzdWx0TGVuKytdID0gY3JlYXRlRmluZE1hdGNoKG5ldyBSYW5nZShsaW5lTnVtYmVyLCBtLmluZGV4ICsgMSArIGRlbHRhT2Zmc2V0LCBsaW5lTnVtYmVyLCBtLmluZGV4ICsgMSArIG1bMF0ubGVuZ3RoICsgZGVsdGFPZmZzZXQpLCBtLCBjYXB0dXJlTWF0Y2hlcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdExlbiA+PSBsaW1pdFJlc3VsdENvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRMZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChtKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdExlbjtcbiAgICB9XG4gICAgc3RhdGljIGZpbmROZXh0TWF0Y2gobW9kZWwsIHNlYXJjaFBhcmFtcywgc2VhcmNoU3RhcnQsIGNhcHR1cmVNYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaERhdGEgPSBzZWFyY2hQYXJhbXMucGFyc2VTZWFyY2hSZXF1ZXN0KCk7XG4gICAgICAgIGlmICghc2VhcmNoRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VhcmNoZXIgPSBuZXcgU2VhcmNoZXIoc2VhcmNoRGF0YS53b3JkU2VwYXJhdG9ycywgc2VhcmNoRGF0YS5yZWdleCk7XG4gICAgICAgIGlmIChzZWFyY2hEYXRhLnJlZ2V4Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RvRmluZE5leHRNYXRjaE11bHRpbGluZShtb2RlbCwgc2VhcmNoU3RhcnQsIHNlYXJjaGVyLCBjYXB0dXJlTWF0Y2hlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvRmluZE5leHRNYXRjaExpbmVCeUxpbmUobW9kZWwsIHNlYXJjaFN0YXJ0LCBzZWFyY2hlciwgY2FwdHVyZU1hdGNoZXMpO1xuICAgIH1cbiAgICBzdGF0aWMgX2RvRmluZE5leHRNYXRjaE11bHRpbGluZShtb2RlbCwgc2VhcmNoU3RhcnQsIHNlYXJjaGVyLCBjYXB0dXJlTWF0Y2hlcykge1xuICAgICAgICBjb25zdCBzZWFyY2hUZXh0U3RhcnQgPSBuZXcgUG9zaXRpb24oc2VhcmNoU3RhcnQubGluZU51bWJlciwgMSk7XG4gICAgICAgIGNvbnN0IGRlbHRhT2Zmc2V0ID0gbW9kZWwuZ2V0T2Zmc2V0QXQoc2VhcmNoVGV4dFN0YXJ0KTtcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gbW9kZWwuZ2V0TGluZUNvdW50KCk7XG4gICAgICAgIC8vIFdlIGFsd2F5cyBleGVjdXRlIG11bHRpbGluZSBzZWFyY2ggb3ZlciB0aGUgbGluZXMgam9pbmVkIHdpdGggXFxuXG4gICAgICAgIC8vIFRoaXMgbWFrZXMgaXQgdGhhdCBcXG4gd2lsbCBtYXRjaCB0aGUgRU9MIGZvciBib3RoIENSTEYgYW5kIExGIG1vZGVsc1xuICAgICAgICAvLyBXZSBjb21wZW5zYXRlIGZvciBvZmZzZXQgZXJyb3JzIGluIGBfZ2V0TXVsdGlsaW5lTWF0Y2hSYW5nZWBcbiAgICAgICAgY29uc3QgdGV4dCA9IG1vZGVsLmdldFZhbHVlSW5SYW5nZShuZXcgUmFuZ2Uoc2VhcmNoVGV4dFN0YXJ0LmxpbmVOdW1iZXIsIHNlYXJjaFRleHRTdGFydC5jb2x1bW4sIGxpbmVDb3VudCwgbW9kZWwuZ2V0TGluZU1heENvbHVtbihsaW5lQ291bnQpKSwgMSAvKiBFbmRPZkxpbmVQcmVmZXJlbmNlLkxGICovKTtcbiAgICAgICAgY29uc3QgbGZDb3VudGVyID0gKG1vZGVsLmdldEVPTCgpID09PSAnXFxyXFxuJyA/IG5ldyBMaW5lRmVlZENvdW50ZXIodGV4dCkgOiBudWxsKTtcbiAgICAgICAgc2VhcmNoZXIucmVzZXQoc2VhcmNoU3RhcnQuY29sdW1uIC0gMSk7XG4gICAgICAgIGNvbnN0IG0gPSBzZWFyY2hlci5uZXh0KHRleHQpO1xuICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUZpbmRNYXRjaCh0aGlzLl9nZXRNdWx0aWxpbmVNYXRjaFJhbmdlKG1vZGVsLCBkZWx0YU9mZnNldCwgdGV4dCwgbGZDb3VudGVyLCBtLmluZGV4LCBtWzBdKSwgbSwgY2FwdHVyZU1hdGNoZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWFyY2hTdGFydC5saW5lTnVtYmVyICE9PSAxIHx8IHNlYXJjaFN0YXJ0LmNvbHVtbiAhPT0gMSkge1xuICAgICAgICAgICAgLy8gVHJ5IGFnYWluIGZyb20gdGhlIHRvcFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RvRmluZE5leHRNYXRjaE11bHRpbGluZShtb2RlbCwgbmV3IFBvc2l0aW9uKDEsIDEpLCBzZWFyY2hlciwgY2FwdHVyZU1hdGNoZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgX2RvRmluZE5leHRNYXRjaExpbmVCeUxpbmUobW9kZWwsIHNlYXJjaFN0YXJ0LCBzZWFyY2hlciwgY2FwdHVyZU1hdGNoZXMpIHtcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gbW9kZWwuZ2V0TGluZUNvdW50KCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0TGluZU51bWJlciA9IHNlYXJjaFN0YXJ0LmxpbmVOdW1iZXI7XG4gICAgICAgIC8vIExvb2sgaW4gZmlyc3QgbGluZVxuICAgICAgICBjb25zdCB0ZXh0ID0gbW9kZWwuZ2V0TGluZUNvbnRlbnQoc3RhcnRMaW5lTnVtYmVyKTtcbiAgICAgICAgY29uc3QgciA9IHRoaXMuX2ZpbmRGaXJzdE1hdGNoSW5MaW5lKHNlYXJjaGVyLCB0ZXh0LCBzdGFydExpbmVOdW1iZXIsIHNlYXJjaFN0YXJ0LmNvbHVtbiwgY2FwdHVyZU1hdGNoZXMpO1xuICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbGluZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVJbmRleCA9IChzdGFydExpbmVOdW1iZXIgKyBpIC0gMSkgJSBsaW5lQ291bnQ7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gbW9kZWwuZ2V0TGluZUNvbnRlbnQobGluZUluZGV4ICsgMSk7XG4gICAgICAgICAgICBjb25zdCByID0gdGhpcy5fZmluZEZpcnN0TWF0Y2hJbkxpbmUoc2VhcmNoZXIsIHRleHQsIGxpbmVJbmRleCArIDEsIDEsIGNhcHR1cmVNYXRjaGVzKTtcbiAgICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBfZmluZEZpcnN0TWF0Y2hJbkxpbmUoc2VhcmNoZXIsIHRleHQsIGxpbmVOdW1iZXIsIGZyb21Db2x1bW4sIGNhcHR1cmVNYXRjaGVzKSB7XG4gICAgICAgIC8vIFNldCByZWdleCB0byBzZWFyY2ggZnJvbSBjb2x1bW5cbiAgICAgICAgc2VhcmNoZXIucmVzZXQoZnJvbUNvbHVtbiAtIDEpO1xuICAgICAgICBjb25zdCBtID0gc2VhcmNoZXIubmV4dCh0ZXh0KTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVGaW5kTWF0Y2gobmV3IFJhbmdlKGxpbmVOdW1iZXIsIG0uaW5kZXggKyAxLCBsaW5lTnVtYmVyLCBtLmluZGV4ICsgMSArIG1bMF0ubGVuZ3RoKSwgbSwgY2FwdHVyZU1hdGNoZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgZmluZFByZXZpb3VzTWF0Y2gobW9kZWwsIHNlYXJjaFBhcmFtcywgc2VhcmNoU3RhcnQsIGNhcHR1cmVNYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaERhdGEgPSBzZWFyY2hQYXJhbXMucGFyc2VTZWFyY2hSZXF1ZXN0KCk7XG4gICAgICAgIGlmICghc2VhcmNoRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VhcmNoZXIgPSBuZXcgU2VhcmNoZXIoc2VhcmNoRGF0YS53b3JkU2VwYXJhdG9ycywgc2VhcmNoRGF0YS5yZWdleCk7XG4gICAgICAgIGlmIChzZWFyY2hEYXRhLnJlZ2V4Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RvRmluZFByZXZpb3VzTWF0Y2hNdWx0aWxpbmUobW9kZWwsIHNlYXJjaFN0YXJ0LCBzZWFyY2hlciwgY2FwdHVyZU1hdGNoZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kb0ZpbmRQcmV2aW91c01hdGNoTGluZUJ5TGluZShtb2RlbCwgc2VhcmNoU3RhcnQsIHNlYXJjaGVyLCBjYXB0dXJlTWF0Y2hlcyk7XG4gICAgfVxuICAgIHN0YXRpYyBfZG9GaW5kUHJldmlvdXNNYXRjaE11bHRpbGluZShtb2RlbCwgc2VhcmNoU3RhcnQsIHNlYXJjaGVyLCBjYXB0dXJlTWF0Y2hlcykge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5fZG9GaW5kTWF0Y2hlc011bHRpbGluZShtb2RlbCwgbmV3IFJhbmdlKDEsIDEsIHNlYXJjaFN0YXJ0LmxpbmVOdW1iZXIsIHNlYXJjaFN0YXJ0LmNvbHVtbiksIHNlYXJjaGVyLCBjYXB0dXJlTWF0Y2hlcywgMTAgKiBMSU1JVF9GSU5EX0NPVU5UKTtcbiAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSBtb2RlbC5nZXRMaW5lQ291bnQoKTtcbiAgICAgICAgaWYgKHNlYXJjaFN0YXJ0LmxpbmVOdW1iZXIgIT09IGxpbmVDb3VudCB8fCBzZWFyY2hTdGFydC5jb2x1bW4gIT09IG1vZGVsLmdldExpbmVNYXhDb2x1bW4obGluZUNvdW50KSkge1xuICAgICAgICAgICAgLy8gVHJ5IGFnYWluIHdpdGggYWxsIGNvbnRlbnRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kb0ZpbmRQcmV2aW91c01hdGNoTXVsdGlsaW5lKG1vZGVsLCBuZXcgUG9zaXRpb24obGluZUNvdW50LCBtb2RlbC5nZXRMaW5lTWF4Q29sdW1uKGxpbmVDb3VudCkpLCBzZWFyY2hlciwgY2FwdHVyZU1hdGNoZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgX2RvRmluZFByZXZpb3VzTWF0Y2hMaW5lQnlMaW5lKG1vZGVsLCBzZWFyY2hTdGFydCwgc2VhcmNoZXIsIGNhcHR1cmVNYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IG1vZGVsLmdldExpbmVDb3VudCgpO1xuICAgICAgICBjb25zdCBzdGFydExpbmVOdW1iZXIgPSBzZWFyY2hTdGFydC5saW5lTnVtYmVyO1xuICAgICAgICAvLyBMb29rIGluIGZpcnN0IGxpbmVcbiAgICAgICAgY29uc3QgdGV4dCA9IG1vZGVsLmdldExpbmVDb250ZW50KHN0YXJ0TGluZU51bWJlcikuc3Vic3RyaW5nKDAsIHNlYXJjaFN0YXJ0LmNvbHVtbiAtIDEpO1xuICAgICAgICBjb25zdCByID0gdGhpcy5fZmluZExhc3RNYXRjaEluTGluZShzZWFyY2hlciwgdGV4dCwgc3RhcnRMaW5lTnVtYmVyLCBjYXB0dXJlTWF0Y2hlcyk7XG4gICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBsaW5lQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZUluZGV4ID0gKGxpbmVDb3VudCArIHN0YXJ0TGluZU51bWJlciAtIGkgLSAxKSAlIGxpbmVDb3VudDtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBtb2RlbC5nZXRMaW5lQ29udGVudChsaW5lSW5kZXggKyAxKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLl9maW5kTGFzdE1hdGNoSW5MaW5lKHNlYXJjaGVyLCB0ZXh0LCBsaW5lSW5kZXggKyAxLCBjYXB0dXJlTWF0Y2hlcyk7XG4gICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgX2ZpbmRMYXN0TWF0Y2hJbkxpbmUoc2VhcmNoZXIsIHRleHQsIGxpbmVOdW1iZXIsIGNhcHR1cmVNYXRjaGVzKSB7XG4gICAgICAgIGxldCBiZXN0UmVzdWx0ID0gbnVsbDtcbiAgICAgICAgbGV0IG07XG4gICAgICAgIHNlYXJjaGVyLnJlc2V0KDApO1xuICAgICAgICB3aGlsZSAoKG0gPSBzZWFyY2hlci5uZXh0KHRleHQpKSkge1xuICAgICAgICAgICAgYmVzdFJlc3VsdCA9IGNyZWF0ZUZpbmRNYXRjaChuZXcgUmFuZ2UobGluZU51bWJlciwgbS5pbmRleCArIDEsIGxpbmVOdW1iZXIsIG0uaW5kZXggKyAxICsgbVswXS5sZW5ndGgpLCBtLCBjYXB0dXJlTWF0Y2hlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJlc3RSZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gbGVmdElzV29yZEJvdW5kYXkod29yZFNlcGFyYXRvcnMsIHRleHQsIHRleHRMZW5ndGgsIG1hdGNoU3RhcnRJbmRleCwgbWF0Y2hMZW5ndGgpIHtcbiAgICBpZiAobWF0Y2hTdGFydEluZGV4ID09PSAwKSB7XG4gICAgICAgIC8vIE1hdGNoIHN0YXJ0cyBhdCBzdGFydCBvZiBzdHJpbmdcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNoYXJCZWZvcmUgPSB0ZXh0LmNoYXJDb2RlQXQobWF0Y2hTdGFydEluZGV4IC0gMSk7XG4gICAgaWYgKHdvcmRTZXBhcmF0b3JzLmdldChjaGFyQmVmb3JlKSAhPT0gMCAvKiBXb3JkQ2hhcmFjdGVyQ2xhc3MuUmVndWxhciAqLykge1xuICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgbWF0Y2ggaXMgYSB3b3JkIHNlcGFyYXRvclxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJCZWZvcmUgPT09IDEzIC8qIENoYXJDb2RlLkNhcnJpYWdlUmV0dXJuICovIHx8IGNoYXJCZWZvcmUgPT09IDEwIC8qIENoYXJDb2RlLkxpbmVGZWVkICovKSB7XG4gICAgICAgIC8vIFRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBtYXRjaCBpcyBsaW5lIGJyZWFrIG9yIGNhcnJpYWdlIHJldHVybi5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChtYXRjaExlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlyc3RDaGFySW5NYXRjaCA9IHRleHQuY2hhckNvZGVBdChtYXRjaFN0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAod29yZFNlcGFyYXRvcnMuZ2V0KGZpcnN0Q2hhckluTWF0Y2gpICE9PSAwIC8qIFdvcmRDaGFyYWN0ZXJDbGFzcy5SZWd1bGFyICovKSB7XG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgY2hhcmFjdGVyIGluc2lkZSB0aGUgbWF0Y2ggaXMgYSB3b3JkIHNlcGFyYXRvclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcmlnaHRJc1dvcmRCb3VuZGF5KHdvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSB7XG4gICAgaWYgKG1hdGNoU3RhcnRJbmRleCArIG1hdGNoTGVuZ3RoID09PSB0ZXh0TGVuZ3RoKSB7XG4gICAgICAgIC8vIE1hdGNoIGVuZHMgYXQgZW5kIG9mIHN0cmluZ1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY2hhckFmdGVyID0gdGV4dC5jaGFyQ29kZUF0KG1hdGNoU3RhcnRJbmRleCArIG1hdGNoTGVuZ3RoKTtcbiAgICBpZiAod29yZFNlcGFyYXRvcnMuZ2V0KGNoYXJBZnRlcikgIT09IDAgLyogV29yZENoYXJhY3RlckNsYXNzLlJlZ3VsYXIgKi8pIHtcbiAgICAgICAgLy8gVGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbWF0Y2ggaXMgYSB3b3JkIHNlcGFyYXRvclxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJBZnRlciA9PT0gMTMgLyogQ2hhckNvZGUuQ2FycmlhZ2VSZXR1cm4gKi8gfHwgY2hhckFmdGVyID09PSAxMCAvKiBDaGFyQ29kZS5MaW5lRmVlZCAqLykge1xuICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBtYXRjaCBpcyBsaW5lIGJyZWFrIG9yIGNhcnJpYWdlIHJldHVybi5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChtYXRjaExlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbGFzdENoYXJJbk1hdGNoID0gdGV4dC5jaGFyQ29kZUF0KG1hdGNoU3RhcnRJbmRleCArIG1hdGNoTGVuZ3RoIC0gMSk7XG4gICAgICAgIGlmICh3b3JkU2VwYXJhdG9ycy5nZXQobGFzdENoYXJJbk1hdGNoKSAhPT0gMCAvKiBXb3JkQ2hhcmFjdGVyQ2xhc3MuUmVndWxhciAqLykge1xuICAgICAgICAgICAgLy8gVGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBtYXRjaCBpcyBhIHdvcmQgc2VwYXJhdG9yXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1hdGNoKHdvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSB7XG4gICAgcmV0dXJuIChsZWZ0SXNXb3JkQm91bmRheSh3b3JkU2VwYXJhdG9ycywgdGV4dCwgdGV4dExlbmd0aCwgbWF0Y2hTdGFydEluZGV4LCBtYXRjaExlbmd0aClcbiAgICAgICAgJiYgcmlnaHRJc1dvcmRCb3VuZGF5KHdvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSk7XG59XG5leHBvcnQgY2xhc3MgU2VhcmNoZXIge1xuICAgIGNvbnN0cnVjdG9yKHdvcmRTZXBhcmF0b3JzLCBzZWFyY2hSZWdleCkge1xuICAgICAgICB0aGlzLl93b3JkU2VwYXJhdG9ycyA9IHdvcmRTZXBhcmF0b3JzO1xuICAgICAgICB0aGlzLl9zZWFyY2hSZWdleCA9IHNlYXJjaFJlZ2V4O1xuICAgICAgICB0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuX3ByZXZNYXRjaExlbmd0aCA9IDA7XG4gICAgfVxuICAgIHJlc2V0KGxhc3RJbmRleCkge1xuICAgICAgICB0aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgIHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5fcHJldk1hdGNoTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgbmV4dCh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgbGV0IG07XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4ICsgdGhpcy5fcHJldk1hdGNoTGVuZ3RoID09PSB0ZXh0TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtID0gdGhpcy5fc2VhcmNoUmVnZXguZXhlYyh0ZXh0KTtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWF0Y2hTdGFydEluZGV4ID0gbS5pbmRleDtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoTGVuZ3RoID0gbVswXS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobWF0Y2hTdGFydEluZGV4ID09PSB0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4ICYmIG1hdGNoTGVuZ3RoID09PSB0aGlzLl9wcmV2TWF0Y2hMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlYXJjaCByZXN1bHQgaXMgYW4gZW1wdHkgc3RyaW5nIGFuZCB3b24ndCBhZHZhbmNlIGByZWdleC5sYXN0SW5kZXhgLCBzbyBgcmVnZXguZXhlY2Agd2lsbCBzdHVjayBoZXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIHRoYXQgYnkgYWR2YW5jaW5nIGJ5IHR3byBpZiBzdXJyb2dhdGUgcGFpciBmb3VuZCBhbmQgYnkgb25lIG90aGVyd2lzZVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5ncy5nZXROZXh0Q29kZVBvaW50KHRleHQsIHRleHRMZW5ndGgsIHRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCkgPiAweEZGRkYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCArPSAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEV4aXQgZWFybHkgaWYgdGhlIHJlZ2V4IG1hdGNoZXMgdGhlIHNhbWUgcmFuZ2UgdHdpY2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXggPSBtYXRjaFN0YXJ0SW5kZXg7XG4gICAgICAgICAgICB0aGlzLl9wcmV2TWF0Y2hMZW5ndGggPSBtYXRjaExlbmd0aDtcbiAgICAgICAgICAgIGlmICghdGhpcy5fd29yZFNlcGFyYXRvcnMgfHwgaXNWYWxpZE1hdGNoKHRoaXMuX3dvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChtKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBCdWdJbmRpY2F0aW5nRXJyb3IsIG9uVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZSBpZiB0aGUgcHJvdmlkZWQgdmFsdWUgZG9lcyBub3QgZXZhbHVhdGUgdG8gYSB0cnVlIEphdmFzY3JpcHQgdmFsdWUuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBhc3NlcnQoLi4uKWAgaW5zdGVhZC5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgdXNlZCBsaWtlIHRoaXM6XG4gKiBgYGB0c1xuICogaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL2Fzc2VydCc7XG4gKiBhc3NlcnQub2soLi4uKTtcbiAqIGBgYFxuICpcbiAqIEhvd2V2ZXIsIGBhc3NlcnRgIGluIHRoYXQgZXhhbXBsZSBpcyBhIHVzZXIgY2hvc2VuIG5hbWUuXG4gKiBUaGVyZSBpcyBubyB0b29saW5nIGZvciBnZW5lcmF0aW5nIHN1Y2ggYW4gaW1wb3J0IHN0YXRlbWVudC5cbiAqIFRodXMsIHRoZSBgYXNzZXJ0KC4uLilgIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvayh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgPyBgQXNzZXJ0aW9uIGZhaWxlZCAoJHttZXNzYWdlfSlgIDogJ0Fzc2VydGlvbiBGYWlsZWQnKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWUsIG1lc3NhZ2UgPSAnVW5yZWFjaGFibGUnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuLyoqXG4gKiBjb25kaXRpb24gbXVzdCBiZSBzaWRlLWVmZmVjdCBmcmVlIVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Rm4oY29uZGl0aW9uKSB7XG4gICAgaWYgKCFjb25kaXRpb24oKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXJcbiAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIC8vIFJlZXZhbHVhdGUgYGNvbmRpdGlvbmAgYWdhaW4gdG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyXG4gICAgICAgIGNvbmRpdGlvbigpO1xuICAgICAgICBvblVuZXhwZWN0ZWRFcnJvcihuZXcgQnVnSW5kaWNhdGluZ0Vycm9yKCdBc3NlcnRpb24gRmFpbGVkJykpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FkamFjZW50SXRlbXMoaXRlbXMsIHByZWRpY2F0ZSkge1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGl0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29uc3QgYSA9IGl0ZW1zW2ldO1xuICAgICAgICBjb25zdCBiID0gaXRlbXNbaSArIDFdO1xuICAgICAgICBpZiAoIXByZWRpY2F0ZShhLCBiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vY29yZS9yYW5nZS5qcyc7XG5pbXBvcnQgeyBTZWFyY2hlciB9IGZyb20gJy4uL21vZGVsL3RleHRNb2RlbFNlYXJjaC5qcyc7XG5pbXBvcnQgKiBhcyBzdHJpbmdzIGZyb20gJy4uLy4uLy4uL2Jhc2UvY29tbW9uL3N0cmluZ3MuanMnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi9hc3NlcnQuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9XT1JEX1JFR0VYUCwgZ2V0V29yZEF0VGV4dCB9IGZyb20gJy4uL2NvcmUvd29yZEhlbHBlci5qcyc7XG5leHBvcnQgY2xhc3MgVW5pY29kZVRleHRNb2RlbEhpZ2hsaWdodGVyIHtcbiAgICBzdGF0aWMgY29tcHV0ZVVuaWNvZGVIaWdobGlnaHRzKG1vZGVsLCBvcHRpb25zLCByYW5nZSkge1xuICAgICAgICBjb25zdCBzdGFydExpbmUgPSByYW5nZSA/IHJhbmdlLnN0YXJ0TGluZU51bWJlciA6IDE7XG4gICAgICAgIGNvbnN0IGVuZExpbmUgPSByYW5nZSA/IHJhbmdlLmVuZExpbmVOdW1iZXIgOiBtb2RlbC5nZXRMaW5lQ291bnQoKTtcbiAgICAgICAgY29uc3QgY29kZVBvaW50SGlnaGxpZ2h0ZXIgPSBuZXcgQ29kZVBvaW50SGlnaGxpZ2h0ZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBjb2RlUG9pbnRIaWdobGlnaHRlci5nZXRDYW5kaWRhdGVDb2RlUG9pbnRzKCk7XG4gICAgICAgIGxldCByZWdleDtcbiAgICAgICAgaWYgKGNhbmRpZGF0ZXMgPT09ICdhbGxOb25CYXNpY0FzY2lpJykge1xuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKCdbXlxcXFx0XFxcXG5cXFxcclxcXFx4MjAtXFxcXHg3RV0nLCAnZycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKGAke2J1aWxkUmVnRXhwQ2hhckNsYXNzRXhwcihBcnJheS5mcm9tKGNhbmRpZGF0ZXMpKX1gLCAnZycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlYXJjaGVyID0gbmV3IFNlYXJjaGVyKG51bGwsIHJlZ2V4KTtcbiAgICAgICAgY29uc3QgcmFuZ2VzID0gW107XG4gICAgICAgIGxldCBoYXNNb3JlID0gZmFsc2U7XG4gICAgICAgIGxldCBtO1xuICAgICAgICBsZXQgYW1iaWd1b3VzQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICBsZXQgaW52aXNpYmxlQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICBsZXQgbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgZm9yTG9vcDogZm9yIChsZXQgbGluZU51bWJlciA9IHN0YXJ0TGluZSwgbGluZUNvdW50ID0gZW5kTGluZTsgbGluZU51bWJlciA8PSBsaW5lQ291bnQ7IGxpbmVOdW1iZXIrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBtb2RlbC5nZXRMaW5lQ29udGVudChsaW5lTnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBsaW5lQ29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAvLyBSZXNldCByZWdleCB0byBzZWFyY2ggZnJvbSB0aGUgYmVnaW5uaW5nXG4gICAgICAgICAgICBzZWFyY2hlci5yZXNldCgwKTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBtID0gc2VhcmNoZXIubmV4dChsaW5lQ29udGVudCk7XG4gICAgICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBtLmluZGV4O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBtLmluZGV4ICsgbVswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4dGVuZCByYW5nZSB0byBlbnRpcmUgY29kZSBwb2ludFxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlQmVmb3JlID0gbGluZUNvbnRlbnQuY2hhckNvZGVBdChzdGFydEluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5ncy5pc0hpZ2hTdXJyb2dhdGUoY2hhckNvZGVCZWZvcmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCArIDEgPCBsaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZUJlZm9yZSA9IGxpbmVDb250ZW50LmNoYXJDb2RlQXQoZW5kSW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmdzLmlzSGlnaFN1cnJvZ2F0ZShjaGFyQ29kZUJlZm9yZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGxpbmVDb250ZW50LnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3b3JkID0gZ2V0V29yZEF0VGV4dChzdGFydEluZGV4ICsgMSwgREVGQVVMVF9XT1JEX1JFR0VYUCwgbGluZUNvbnRlbnQsIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAod29yZCAmJiB3b3JkLmVuZENvbHVtbiA8PSBzdGFydEluZGV4ICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdvcmQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcHJvYmxlbWF0aWMgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIHdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodFJlYXNvbiA9IGNvZGVQb2ludEhpZ2hsaWdodGVyLnNob3VsZEhpZ2hsaWdodE5vbkJhc2ljQVNDSUkoc3RyLCB3b3JkID8gd29yZC53b3JkIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZWFzb24gIT09IDAgLyogU2ltcGxlSGlnaGxpZ2h0UmVhc29uLk5vbmUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZWFzb24gPT09IDMgLyogU2ltcGxlSGlnaGxpZ2h0UmVhc29uLkFtYmlndW91cyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtYmlndW91c0NoYXJhY3RlckNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoaWdobGlnaHRSZWFzb24gPT09IDIgLyogU2ltcGxlSGlnaGxpZ2h0UmVhc29uLkludmlzaWJsZSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmlzaWJsZUNoYXJhY3RlckNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoaWdobGlnaHRSZWFzb24gPT09IDEgLyogU2ltcGxlSGlnaGxpZ2h0UmVhc29uLk5vbkJhc2ljQVNDSUkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25CYXNpY0FzY2lpQ2hhcmFjdGVyQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5ldmVyKGhpZ2hsaWdodFJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQVhfUkVTVUxUX0xFTkdUSCA9IDEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA+PSBNQVhfUkVTVUxUX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGZvckxvb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMucHVzaChuZXcgUmFuZ2UobGluZU51bWJlciwgc3RhcnRJbmRleCArIDEsIGxpbmVOdW1iZXIsIGVuZEluZGV4ICsgMSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAobSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlcyxcbiAgICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgICBhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudCxcbiAgICAgICAgICAgIGludmlzaWJsZUNoYXJhY3RlckNvdW50LFxuICAgICAgICAgICAgbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50XG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXRpYyBjb21wdXRlVW5pY29kZUhpZ2hsaWdodFJlYXNvbihjaGFyLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludEhpZ2hsaWdodGVyID0gbmV3IENvZGVQb2ludEhpZ2hsaWdodGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZWFzb24gPSBjb2RlUG9pbnRIaWdobGlnaHRlci5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKGNoYXIsIG51bGwpO1xuICAgICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgY2FzZSAwIC8qIFNpbXBsZUhpZ2hsaWdodFJlYXNvbi5Ob25lICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FzZSAyIC8qIFNpbXBsZUhpZ2hsaWdodFJlYXNvbi5JbnZpc2libGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2luZDogMSAvKiBVbmljb2RlSGlnaGxpZ2h0ZXJSZWFzb25LaW5kLkludmlzaWJsZSAqLyB9O1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNpbXBsZUhpZ2hsaWdodFJlYXNvbi5BbWJpZ3VvdXMgKi86IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBjaGFyLmNvZGVQb2ludEF0KDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1hcnlDb25mdXNhYmxlID0gY29kZVBvaW50SGlnaGxpZ2h0ZXIuYW1iaWd1b3VzQ2hhcmFjdGVycy5nZXRQcmltYXJ5Q29uZnVzYWJsZShjb2RlUG9pbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdEFtYmlndW91c0luTG9jYWxlcyA9IHN0cmluZ3MuQW1iaWd1b3VzQ2hhcmFjdGVycy5nZXRMb2NhbGVzKCkuZmlsdGVyKChsKSA9PiAhc3RyaW5ncy5BbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldEluc3RhbmNlKG5ldyBTZXQoWy4uLm9wdGlvbnMuYWxsb3dlZExvY2FsZXMsIGxdKSkuaXNBbWJpZ3VvdXMoY29kZVBvaW50KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2luZDogMCAvKiBVbmljb2RlSGlnaGxpZ2h0ZXJSZWFzb25LaW5kLkFtYmlndW91cyAqLywgY29uZnVzYWJsZVdpdGg6IFN0cmluZy5mcm9tQ29kZVBvaW50KHByaW1hcnlDb25mdXNhYmxlKSwgbm90QW1iaWd1b3VzSW5Mb2NhbGVzIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIDEgLyogU2ltcGxlSGlnaGxpZ2h0UmVhc29uLk5vbkJhc2ljQVNDSUkgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2luZDogMiAvKiBVbmljb2RlSGlnaGxpZ2h0ZXJSZWFzb25LaW5kLk5vbkJhc2ljQXNjaWkgKi8gfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGJ1aWxkUmVnRXhwQ2hhckNsYXNzRXhwcihjb2RlUG9pbnRzLCBmbGFncykge1xuICAgIGNvbnN0IHNyYyA9IGBbJHtzdHJpbmdzLmVzY2FwZVJlZ0V4cENoYXJhY3RlcnMoY29kZVBvaW50cy5tYXAoKGkpID0+IFN0cmluZy5mcm9tQ29kZVBvaW50KGkpKS5qb2luKCcnKSl9XWA7XG4gICAgcmV0dXJuIHNyYztcbn1cbmNsYXNzIENvZGVQb2ludEhpZ2hsaWdodGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuYWxsb3dlZENvZGVQb2ludHMgPSBuZXcgU2V0KG9wdGlvbnMuYWxsb3dlZENvZGVQb2ludHMpO1xuICAgICAgICB0aGlzLmFtYmlndW91c0NoYXJhY3RlcnMgPSBzdHJpbmdzLkFtYmlndW91c0NoYXJhY3RlcnMuZ2V0SW5zdGFuY2UobmV3IFNldChvcHRpb25zLmFsbG93ZWRMb2NhbGVzKSk7XG4gICAgfVxuICAgIGdldENhbmRpZGF0ZUNvZGVQb2ludHMoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9uQmFzaWNBU0NJSSkge1xuICAgICAgICAgICAgcmV0dXJuICdhbGxOb25CYXNpY0FzY2lpJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW52aXNpYmxlQ2hhcmFjdGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBzdHJpbmdzLkludmlzaWJsZUNoYXJhY3RlcnMuY29kZVBvaW50cykge1xuICAgICAgICAgICAgICAgIGlmICghaXNBbGxvd2VkSW52aXNpYmxlQ2hhcmFjdGVyKFN0cmluZy5mcm9tQ29kZVBvaW50KGNwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChjcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW1iaWd1b3VzQ2hhcmFjdGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiB0aGlzLmFtYmlndW91c0NoYXJhY3RlcnMuZ2V0Q29uZnVzYWJsZUNvZGVQb2ludHMoKSkge1xuICAgICAgICAgICAgICAgIHNldC5hZGQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY3Agb2YgdGhpcy5hbGxvd2VkQ29kZVBvaW50cykge1xuICAgICAgICAgICAgc2V0LmRlbGV0ZShjcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgc2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSShjaGFyYWN0ZXIsIHdvcmRDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGNoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKTtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dlZENvZGVQb2ludHMuaGFzKGNvZGVQb2ludCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFNpbXBsZUhpZ2hsaWdodFJlYXNvbi5Ob25lICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9uQmFzaWNBU0NJSSkge1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogU2ltcGxlSGlnaGxpZ2h0UmVhc29uLk5vbkJhc2ljQVNDSUkgKi87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhhc0Jhc2ljQVNDSUlDaGFyYWN0ZXJzID0gZmFsc2U7XG4gICAgICAgIGxldCBoYXNOb25Db25mdXNhYmxlTm9uQmFzaWNBc2NpaUNoYXJhY3RlciA9IGZhbHNlO1xuICAgICAgICBpZiAod29yZENvbnRleHQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hhciBvZiB3b3JkQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGNoYXIuY29kZVBvaW50QXQoMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNCYXNpY0FTQ0lJID0gc3RyaW5ncy5pc0Jhc2ljQVNDSUkoY2hhcik7XG4gICAgICAgICAgICAgICAgaGFzQmFzaWNBU0NJSUNoYXJhY3RlcnMgPSBoYXNCYXNpY0FTQ0lJQ2hhcmFjdGVycyB8fCBpc0Jhc2ljQVNDSUk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Jhc2ljQVNDSUkgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycy5pc0FtYmlndW91cyhjb2RlUG9pbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICFzdHJpbmdzLkludmlzaWJsZUNoYXJhY3RlcnMuaXNJbnZpc2libGVDaGFyYWN0ZXIoY29kZVBvaW50KSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNOb25Db25mdXNhYmxlTm9uQmFzaWNBc2NpaUNoYXJhY3RlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgLyogRG9uJ3QgYWxsb3cgbWl4aW5nIHdlaXJkIGxvb2tpbmcgY2hhcmFjdGVycyB3aXRoIEFTQ0lJICovICFoYXNCYXNpY0FTQ0lJQ2hhcmFjdGVycyAmJlxuICAgICAgICAgICAgLyogSXMgdGhlcmUgYW4gb2J2aW91c2x5IHdlaXJkIGxvb2tpbmcgY2hhcmFjdGVyPyAqLyBoYXNOb25Db25mdXNhYmxlTm9uQmFzaWNBc2NpaUNoYXJhY3Rlcikge1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogU2ltcGxlSGlnaGxpZ2h0UmVhc29uLk5vbmUgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnZpc2libGVDaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICAvLyBUT0RPIGNoZWNrIGZvciBlbW9qaXNcbiAgICAgICAgICAgIGlmICghaXNBbGxvd2VkSW52aXNpYmxlQ2hhcmFjdGVyKGNoYXJhY3RlcikgJiYgc3RyaW5ncy5JbnZpc2libGVDaGFyYWN0ZXJzLmlzSW52aXNpYmxlQ2hhcmFjdGVyKGNvZGVQb2ludCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMiAvKiBTaW1wbGVIaWdobGlnaHRSZWFzb24uSW52aXNpYmxlICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW1iaWd1b3VzQ2hhcmFjdGVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycy5pc0FtYmlndW91cyhjb2RlUG9pbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMgLyogU2ltcGxlSGlnaGxpZ2h0UmVhc29uLkFtYmlndW91cyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMCAvKiBTaW1wbGVIaWdobGlnaHRSZWFzb24uTm9uZSAqLztcbiAgICB9XG59XG5mdW5jdGlvbiBpc0FsbG93ZWRJbnZpc2libGVDaGFyYWN0ZXIoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIGNoYXJhY3RlciA9PT0gJyAnIHx8IGNoYXJhY3RlciA9PT0gJ1xcbicgfHwgY2hhcmFjdGVyID09PSAnXFx0Jztcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgQnVnSW5kaWNhdGluZ0Vycm9yIH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24vZXJyb3JzLmpzJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi9yYW5nZS5qcyc7XG4vKipcbiAqIEEgcmFuZ2Ugb2YgbGluZXMgKDEtYmFzZWQpLlxuICovXG5leHBvcnQgY2xhc3MgTGluZVJhbmdlIHtcbiAgICBzdGF0aWMgZnJvbVJhbmdlKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGluZVJhbmdlKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2UuZW5kTGluZU51bWJlcik7XG4gICAgfVxuICAgIHN0YXRpYyBzdWJ0cmFjdChhLCBiKSB7XG4gICAgICAgIGlmICghYikge1xuICAgICAgICAgICAgcmV0dXJuIFthXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5zdGFydExpbmVOdW1iZXIgPCBiLnN0YXJ0TGluZU51bWJlciAmJiBiLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgPCBhLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbmV3IExpbmVSYW5nZShhLnN0YXJ0TGluZU51bWJlciwgYi5zdGFydExpbmVOdW1iZXIpLFxuICAgICAgICAgICAgICAgIG5ldyBMaW5lUmFuZ2UoYi5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLCBhLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIuc3RhcnRMaW5lTnVtYmVyIDw9IGEuc3RhcnRMaW5lTnVtYmVyICYmIGEuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSA8PSBiLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgPCBhLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IExpbmVSYW5nZShNYXRoLm1heChiLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsIGEuc3RhcnRMaW5lTnVtYmVyKSwgYS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBMaW5lUmFuZ2UoYS5zdGFydExpbmVOdW1iZXIsIE1hdGgubWluKGIuc3RhcnRMaW5lTnVtYmVyLCBhLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpKV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGxpbmVSYW5nZXMgQW4gYXJyYXkgb2Ygc29ydGVkIGxpbmUgcmFuZ2VzLlxuICAgICAqL1xuICAgIHN0YXRpYyBqb2luTWFueShsaW5lUmFuZ2VzKSB7XG4gICAgICAgIGlmIChsaW5lUmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBsaW5lUmFuZ2VzWzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVSYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuam9pbihyZXN1bHQsIGxpbmVSYW5nZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBsaW5lUmFuZ2VzMSBNdXN0IGJlIHNvcnRlZC5cbiAgICAgKiBAcGFyYW0gbGluZVJhbmdlczIgTXVzdCBiZSBzb3J0ZWQuXG4gICAgICovXG4gICAgc3RhdGljIGpvaW4obGluZVJhbmdlczEsIGxpbmVSYW5nZXMyKSB7XG4gICAgICAgIGlmIChsaW5lUmFuZ2VzMS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lUmFuZ2VzMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZVJhbmdlczIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZVJhbmdlczE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCBpMSA9IDA7XG4gICAgICAgIGxldCBpMiA9IDA7XG4gICAgICAgIGxldCBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGkxIDwgbGluZVJhbmdlczEubGVuZ3RoIHx8IGkyIDwgbGluZVJhbmdlczIubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaTEgPCBsaW5lUmFuZ2VzMS5sZW5ndGggJiYgaTIgPCBsaW5lUmFuZ2VzMi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lUmFuZ2UxID0gbGluZVJhbmdlczFbaTFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVSYW5nZTIgPSBsaW5lUmFuZ2VzMltpMl07XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVSYW5nZTEuc3RhcnRMaW5lTnVtYmVyIDwgbGluZVJhbmdlMi5zdGFydExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGxpbmVSYW5nZTE7XG4gICAgICAgICAgICAgICAgICAgIGkxKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbGluZVJhbmdlMjtcbiAgICAgICAgICAgICAgICAgICAgaTIrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpMSA8IGxpbmVSYW5nZXMxLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBsaW5lUmFuZ2VzMVtpMV07XG4gICAgICAgICAgICAgICAgaTErKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHQgPSBsaW5lUmFuZ2VzMltpMl07XG4gICAgICAgICAgICAgICAgaTIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlID49IG5leHQuc3RhcnRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgTGluZVJhbmdlKGN1cnJlbnQuc3RhcnRMaW5lTnVtYmVyLCBNYXRoLm1heChjdXJyZW50LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsIG5leHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHVzaFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgb2ZMZW5ndGgoc3RhcnRMaW5lTnVtYmVyLCBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lUmFuZ2Uoc3RhcnRMaW5lTnVtYmVyLCBzdGFydExpbmVOdW1iZXIgKyBsZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUobGluZVJhbmdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGluZVJhbmdlKGxpbmVSYW5nZVswXSwgbGluZVJhbmdlWzFdKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3RhcnRMaW5lTnVtYmVyLCBlbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSB7XG4gICAgICAgIGlmIChzdGFydExpbmVOdW1iZXIgPiBlbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQnVnSW5kaWNhdGluZ0Vycm9yKGBzdGFydExpbmVOdW1iZXIgJHtzdGFydExpbmVOdW1iZXJ9IGNhbm5vdCBiZSBhZnRlciBlbmRMaW5lTnVtYmVyRXhjbHVzaXZlICR7ZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0TGluZU51bWJlciA9IHN0YXJ0TGluZU51bWJlcjtcbiAgICAgICAgdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlID0gZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoaXMgbGluZSByYW5nZSBjb250YWlucyB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuXG4gICAgICovXG4gICAgY29udGFpbnMobGluZU51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXIgPD0gbGluZU51bWJlciAmJiBsaW5lTnVtYmVyIDwgdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBsaW5lIHJhbmdlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIGdldCBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXIgPT09IHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhpcyBsaW5lIHJhbmdlIGJ5IHRoZSBnaXZlbiBvZmZzZXQgb2YgbGluZSBudW1iZXJzLlxuICAgICAqL1xuICAgIGRlbHRhKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IExpbmVSYW5nZSh0aGlzLnN0YXJ0TGluZU51bWJlciArIG9mZnNldCwgdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlICsgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBsaW5lcyB0aGlzIGxpbmUgcmFuZ2Ugc3BhbnMuXG4gICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSAtIHRoaXMuc3RhcnRMaW5lTnVtYmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbGluZSByYW5nZSB0aGF0IGNvbWJpbmVzIHRoaXMgYW5kIHRoZSBnaXZlbiBsaW5lIHJhbmdlLlxuICAgICAqL1xuICAgIGpvaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lUmFuZ2UoTWF0aC5taW4odGhpcy5zdGFydExpbmVOdW1iZXIsIG90aGVyLnN0YXJ0TGluZU51bWJlciksIE1hdGgubWF4KHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwgb3RoZXIuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0aGlzLnN0YXJ0TGluZU51bWJlcn0sJHt0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9KWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHRpbmcgcmFuZ2UgaXMgZW1wdHkgaWYgdGhlIHJhbmdlcyBkbyBub3QgaW50ZXJzZWN0LCBidXQgdG91Y2guXG4gICAgICogSWYgdGhlIHJhbmdlcyBkb24ndCBldmVuIHRvdWNoLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBpbnRlcnNlY3Qob3RoZXIpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRMaW5lTnVtYmVyID0gTWF0aC5tYXgodGhpcy5zdGFydExpbmVOdW1iZXIsIG90aGVyLnN0YXJ0TGluZU51bWJlcik7XG4gICAgICAgIGNvbnN0IGVuZExpbmVOdW1iZXJFeGNsdXNpdmUgPSBNYXRoLm1pbih0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsIG90aGVyLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpO1xuICAgICAgICBpZiAoc3RhcnRMaW5lTnVtYmVyIDw9IGVuZExpbmVOdW1iZXJFeGNsdXNpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZVJhbmdlKHN0YXJ0TGluZU51bWJlciwgZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaW50ZXJzZWN0c1N0cmljdChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXIgPCBvdGhlci5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlICYmIG90aGVyLnN0YXJ0TGluZU51bWJlciA8IHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtcbiAgICB9XG4gICAgb3ZlcmxhcE9yVG91Y2gob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyIDw9IG90aGVyLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgJiYgb3RoZXIuc3RhcnRMaW5lTnVtYmVyIDw9IHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtcbiAgICB9XG4gICAgZXF1YWxzKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyID09PSBiLnN0YXJ0TGluZU51bWJlciAmJiB0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgPT09IGIuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtcbiAgICB9XG4gICAgdG9JbmNsdXNpdmVSYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0TGluZU51bWJlciwgMSwgdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlIC0gMSwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICAgIH1cbiAgICB0b0V4Y2x1c2l2ZVJhbmdlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnRMaW5lTnVtYmVyLCAxLCB0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsIDEpO1xuICAgIH1cbiAgICBtYXBUb0xpbmVBcnJheShmKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBsaW5lTnVtYmVyID0gdGhpcy5zdGFydExpbmVOdW1iZXI7IGxpbmVOdW1iZXIgPCB0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU7IGxpbmVOdW1iZXIrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZihsaW5lTnVtYmVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZm9yRWFjaChmKSB7XG4gICAgICAgIGZvciAobGV0IGxpbmVOdW1iZXIgPSB0aGlzLnN0YXJ0TGluZU51bWJlcjsgbGluZU51bWJlciA8IHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTsgbGluZU51bWJlcisrKSB7XG4gICAgICAgICAgICBmKGxpbmVOdW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnN0YXJ0TGluZU51bWJlciwgdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlXTtcbiAgICB9XG4gICAgaW5jbHVkZXMobGluZU51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXIgPD0gbGluZU51bWJlciAmJiBsaW5lTnVtYmVyIDwgdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlO1xuICAgIH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgTGluZVJhbmdlIH0gZnJvbSAnLi4vY29yZS9saW5lUmFuZ2UuanMnO1xuZXhwb3J0IGNsYXNzIExpbmVzRGlmZiB7XG4gICAgY29uc3RydWN0b3IoY2hhbmdlcywgXG4gICAgLyoqXG4gICAgICogU29ydGVkIGJ5IG9yaWdpbmFsIGxpbmUgcmFuZ2VzLlxuICAgICAqIFRoZSBvcmlnaW5hbCBsaW5lIHJhbmdlcyBhbmQgdGhlIG1vZGlmaWVkIGxpbmUgcmFuZ2VzIG11c3QgYmUgZGlzam9pbnQgKGJ1dCBjYW4gYmUgdG91Y2hpbmcpLlxuICAgICAqL1xuICAgIG1vdmVzLCBcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRpbWUgb3V0IHdhcyByZWFjaGVkLlxuICAgICAqIEluIHRoYXQgY2FzZSwgdGhlIGRpZmZzIG1pZ2h0IGJlIGFuIGFwcHJveGltYXRpb24gYW5kIHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCB0byByZXJ1biB0aGUgZGlmZiB3aXRoIG1vcmUgdGltZS5cbiAgICAgKi9cbiAgICBoaXRUaW1lb3V0KSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IGNoYW5nZXM7XG4gICAgICAgIHRoaXMubW92ZXMgPSBtb3ZlcztcbiAgICAgICAgdGhpcy5oaXRUaW1lb3V0ID0gaGl0VGltZW91dDtcbiAgICB9XG59XG4vKipcbiAqIE1hcHMgYSBsaW5lIHJhbmdlIGluIHRoZSBvcmlnaW5hbCB0ZXh0IG1vZGVsIHRvIGEgbGluZSByYW5nZSBpbiB0aGUgbW9kaWZpZWQgdGV4dCBtb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIExpbmVSYW5nZU1hcHBpbmcge1xuICAgIHN0YXRpYyBpbnZlcnNlKG1hcHBpbmcsIG9yaWdpbmFsTGluZUNvdW50LCBtb2RpZmllZExpbmVDb3VudCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGxhc3RPcmlnaW5hbEVuZExpbmVOdW1iZXIgPSAxO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkRW5kTGluZU51bWJlciA9IDE7XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBtYXBwaW5nKSB7XG4gICAgICAgICAgICBjb25zdCByID0gbmV3IExpbmVSYW5nZU1hcHBpbmcobmV3IExpbmVSYW5nZShsYXN0T3JpZ2luYWxFbmRMaW5lTnVtYmVyLCBtLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyKSwgbmV3IExpbmVSYW5nZShsYXN0TW9kaWZpZWRFbmRMaW5lTnVtYmVyLCBtLm1vZGlmaWVkUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyKSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghci5tb2RpZmllZFJhbmdlLmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RPcmlnaW5hbEVuZExpbmVOdW1iZXIgPSBtLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZEVuZExpbmVOdW1iZXIgPSBtLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gbmV3IExpbmVSYW5nZU1hcHBpbmcobmV3IExpbmVSYW5nZShsYXN0T3JpZ2luYWxFbmRMaW5lTnVtYmVyLCBvcmlnaW5hbExpbmVDb3VudCArIDEpLCBuZXcgTGluZVJhbmdlKGxhc3RNb2RpZmllZEVuZExpbmVOdW1iZXIsIG1vZGlmaWVkTGluZUNvdW50ICsgMSksIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICghci5tb2RpZmllZFJhbmdlLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG9yaWdpbmFsUmFuZ2UsIG1vZGlmaWVkUmFuZ2UsIGlubmVyQ2hhbmdlcykge1xuICAgICAgICB0aGlzLm9yaWdpbmFsUmFuZ2UgPSBvcmlnaW5hbFJhbmdlO1xuICAgICAgICB0aGlzLm1vZGlmaWVkUmFuZ2UgPSBtb2RpZmllZFJhbmdlO1xuICAgICAgICB0aGlzLmlubmVyQ2hhbmdlcyA9IGlubmVyQ2hhbmdlcztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgeyR7dGhpcy5vcmlnaW5hbFJhbmdlLnRvU3RyaW5nKCl9LT4ke3RoaXMubW9kaWZpZWRSYW5nZS50b1N0cmluZygpfX1gO1xuICAgIH1cbiAgICBnZXQgY2hhbmdlZExpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMub3JpZ2luYWxSYW5nZS5sZW5ndGgsIHRoaXMubW9kaWZpZWRSYW5nZS5sZW5ndGgpO1xuICAgIH1cbiAgICBmbGlwKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiBuZXcgTGluZVJhbmdlTWFwcGluZyh0aGlzLm1vZGlmaWVkUmFuZ2UsIHRoaXMub3JpZ2luYWxSYW5nZSwgKF9hID0gdGhpcy5pbm5lckNoYW5nZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoYyA9PiBjLmZsaXAoKSkpO1xuICAgIH1cbn1cbi8qKlxuICogTWFwcyBhIHJhbmdlIGluIHRoZSBvcmlnaW5hbCB0ZXh0IG1vZGVsIHRvIGEgcmFuZ2UgaW4gdGhlIG1vZGlmaWVkIHRleHQgbW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZU1hcHBpbmcge1xuICAgIGNvbnN0cnVjdG9yKG9yaWdpbmFsUmFuZ2UsIG1vZGlmaWVkUmFuZ2UpIHtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFJhbmdlID0gb3JpZ2luYWxSYW5nZTtcbiAgICAgICAgdGhpcy5tb2RpZmllZFJhbmdlID0gbW9kaWZpZWRSYW5nZTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgeyR7dGhpcy5vcmlnaW5hbFJhbmdlLnRvU3RyaW5nKCl9LT4ke3RoaXMubW9kaWZpZWRSYW5nZS50b1N0cmluZygpfX1gO1xuICAgIH1cbiAgICBmbGlwKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlTWFwcGluZyh0aGlzLm1vZGlmaWVkUmFuZ2UsIHRoaXMub3JpZ2luYWxSYW5nZSk7XG4gICAgfVxufVxuLy8gVE9ET0BoZWRpZXQ6IE1ha2UgTGluZVJhbmdlTWFwcGluZyBleHRlbmQgZnJvbSB0aGlzIVxuZXhwb3J0IGNsYXNzIFNpbXBsZUxpbmVSYW5nZU1hcHBpbmcge1xuICAgIGNvbnN0cnVjdG9yKG9yaWdpbmFsLCBtb2RpZmllZCkge1xuICAgICAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWw7XG4gICAgICAgIHRoaXMubW9kaWZpZWQgPSBtb2RpZmllZDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgeyR7dGhpcy5vcmlnaW5hbC50b1N0cmluZygpfS0+JHt0aGlzLm1vZGlmaWVkLnRvU3RyaW5nKCl9fWA7XG4gICAgfVxuICAgIGZsaXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2ltcGxlTGluZVJhbmdlTWFwcGluZyh0aGlzLm1vZGlmaWVkLCB0aGlzLm9yaWdpbmFsKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTW92ZWRUZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihsaW5lUmFuZ2VNYXBwaW5nLCBjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMubGluZVJhbmdlTWFwcGluZyA9IGxpbmVSYW5nZU1hcHBpbmc7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IGNoYW5nZXM7XG4gICAgfVxuICAgIGZsaXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW92ZWRUZXh0KHRoaXMubGluZVJhbmdlTWFwcGluZy5mbGlwKCksIHRoaXMuY2hhbmdlcy5tYXAoYyA9PiBjLmZsaXAoKSkpO1xuICAgIH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgTGNzRGlmZiB9IGZyb20gJy4uLy4uLy4uL2Jhc2UvY29tbW9uL2RpZmYvZGlmZi5qcyc7XG5pbXBvcnQgeyBSYW5nZU1hcHBpbmcsIExpbmVSYW5nZU1hcHBpbmcsIExpbmVzRGlmZiB9IGZyb20gJy4vbGluZXNEaWZmQ29tcHV0ZXIuanMnO1xuaW1wb3J0ICogYXMgc3RyaW5ncyBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi9zdHJpbmdzLmpzJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vY29yZS9yYW5nZS5qcyc7XG5pbXBvcnQgeyBhc3NlcnRGbiwgY2hlY2tBZGphY2VudEl0ZW1zIH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24vYXNzZXJ0LmpzJztcbmltcG9ydCB7IExpbmVSYW5nZSB9IGZyb20gJy4uL2NvcmUvbGluZVJhbmdlLmpzJztcbmNvbnN0IE1JTklNVU1fTUFUQ0hJTkdfQ0hBUkFDVEVSX0xFTkdUSCA9IDM7XG5leHBvcnQgY2xhc3MgU21hcnRMaW5lc0RpZmZDb21wdXRlciB7XG4gICAgY29tcHV0ZURpZmYob3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcywgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGRpZmZDb21wdXRlciA9IG5ldyBEaWZmQ29tcHV0ZXIob3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcywge1xuICAgICAgICAgICAgbWF4Q29tcHV0YXRpb25UaW1lOiBvcHRpb25zLm1heENvbXB1dGF0aW9uVGltZU1zLFxuICAgICAgICAgICAgc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2U6IG9wdGlvbnMuaWdub3JlVHJpbVdoaXRlc3BhY2UsXG4gICAgICAgICAgICBzaG91bGRDb21wdXRlQ2hhckNoYW5nZXM6IHRydWUsXG4gICAgICAgICAgICBzaG91bGRNYWtlUHJldHR5RGlmZjogdHJ1ZSxcbiAgICAgICAgICAgIHNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkaWZmQ29tcHV0ZXIuY29tcHV0ZURpZmYoKTtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IFtdO1xuICAgICAgICBsZXQgbGFzdENoYW5nZSA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiByZXN1bHQuY2hhbmdlcykge1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsUmFuZ2U7XG4gICAgICAgICAgICBpZiAoYy5vcmlnaW5hbEVuZExpbmVOdW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJbnNlcnRpb25cbiAgICAgICAgICAgICAgICBvcmlnaW5hbFJhbmdlID0gbmV3IExpbmVSYW5nZShjLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyICsgMSwgYy5vcmlnaW5hbFN0YXJ0TGluZU51bWJlciArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxSYW5nZSA9IG5ldyBMaW5lUmFuZ2UoYy5vcmlnaW5hbFN0YXJ0TGluZU51bWJlciwgYy5vcmlnaW5hbEVuZExpbmVOdW1iZXIgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb2RpZmllZFJhbmdlO1xuICAgICAgICAgICAgaWYgKGMubW9kaWZpZWRFbmRMaW5lTnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVsZXRpb25cbiAgICAgICAgICAgICAgICBtb2RpZmllZFJhbmdlID0gbmV3IExpbmVSYW5nZShjLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyICsgMSwgYy5tb2RpZmllZFN0YXJ0TGluZU51bWJlciArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9kaWZpZWRSYW5nZSA9IG5ldyBMaW5lUmFuZ2UoYy5tb2RpZmllZFN0YXJ0TGluZU51bWJlciwgYy5tb2RpZmllZEVuZExpbmVOdW1iZXIgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjaGFuZ2UgPSBuZXcgTGluZVJhbmdlTWFwcGluZyhvcmlnaW5hbFJhbmdlLCBtb2RpZmllZFJhbmdlLCAoX2EgPSBjLmNoYXJDaGFuZ2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGMgPT4gbmV3IFJhbmdlTWFwcGluZyhuZXcgUmFuZ2UoYy5vcmlnaW5hbFN0YXJ0TGluZU51bWJlciwgYy5vcmlnaW5hbFN0YXJ0Q29sdW1uLCBjLm9yaWdpbmFsRW5kTGluZU51bWJlciwgYy5vcmlnaW5hbEVuZENvbHVtbiksIG5ldyBSYW5nZShjLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLCBjLm1vZGlmaWVkU3RhcnRDb2x1bW4sIGMubW9kaWZpZWRFbmRMaW5lTnVtYmVyLCBjLm1vZGlmaWVkRW5kQ29sdW1uKSkpKTtcbiAgICAgICAgICAgIGlmIChsYXN0Q2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RDaGFuZ2UubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlID09PSBjaGFuZ2UubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgfHwgbGFzdENoYW5nZS5vcmlnaW5hbFJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgPT09IGNoYW5nZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBqb2luIHRvdWNoaW5nIGRpZmZzLiBQcm9iYWJseSBtb3ZpbmcgZGlmZnMgdXAvZG93biBpbiB0aGUgYWxnb3JpdGhtIGNhdXNlcyB0b3VjaGluZyBkaWZmcy5cbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gbmV3IExpbmVSYW5nZU1hcHBpbmcobGFzdENoYW5nZS5vcmlnaW5hbFJhbmdlLmpvaW4oY2hhbmdlLm9yaWdpbmFsUmFuZ2UpLCBsYXN0Q2hhbmdlLm1vZGlmaWVkUmFuZ2Uuam9pbihjaGFuZ2UubW9kaWZpZWRSYW5nZSksIGxhc3RDaGFuZ2UuaW5uZXJDaGFuZ2VzICYmIGNoYW5nZS5pbm5lckNoYW5nZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoYW5nZS5pbm5lckNoYW5nZXMuY29uY2F0KGNoYW5nZS5pbm5lckNoYW5nZXMpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgICAgIGxhc3RDaGFuZ2UgPSBjaGFuZ2U7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrQWRqYWNlbnRJdGVtcyhjaGFuZ2VzLCAobTEsIG0yKSA9PiBtMi5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlciAtIG0xLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSA9PT0gbTIubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIgLSBtMS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgJiZcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBoYXMgdG8gYmUgYW4gdW5jaGFuZ2VkIGxpbmUgaW4gYmV0d2VlbiAob3RoZXJ3aXNlIGJvdGggZGlmZnMgc2hvdWxkIGhhdmUgYmVlbiBqb2luZWQpXG4gICAgICAgICAgICAgICAgbTEub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlIDwgbTIub3JpZ2luYWxSYW5nZS5zdGFydExpbmVOdW1iZXIgJiZcbiAgICAgICAgICAgICAgICBtMS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgPCBtMi5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IExpbmVzRGlmZihjaGFuZ2VzLCBbXSwgcmVzdWx0LnF1aXRFYXJseSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZURpZmYob3JpZ2luYWxTZXF1ZW5jZSwgbW9kaWZpZWRTZXF1ZW5jZSwgY29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlLCBwcmV0dHkpIHtcbiAgICBjb25zdCBkaWZmQWxnbyA9IG5ldyBMY3NEaWZmKG9yaWdpbmFsU2VxdWVuY2UsIG1vZGlmaWVkU2VxdWVuY2UsIGNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZSk7XG4gICAgcmV0dXJuIGRpZmZBbGdvLkNvbXB1dGVEaWZmKHByZXR0eSk7XG59XG5jbGFzcyBMaW5lU2VxdWVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKGxpbmVzKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q29sdW1ucyA9IFtdO1xuICAgICAgICBjb25zdCBlbmRDb2x1bW5zID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBsaW5lcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3RhcnRDb2x1bW5zW2ldID0gZ2V0Rmlyc3ROb25CbGFua0NvbHVtbihsaW5lc1tpXSwgMSk7XG4gICAgICAgICAgICBlbmRDb2x1bW5zW2ldID0gZ2V0TGFzdE5vbkJsYW5rQ29sdW1uKGxpbmVzW2ldLCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XG4gICAgICAgIHRoaXMuX3N0YXJ0Q29sdW1ucyA9IHN0YXJ0Q29sdW1ucztcbiAgICAgICAgdGhpcy5fZW5kQ29sdW1ucyA9IGVuZENvbHVtbnM7XG4gICAgfVxuICAgIGdldEVsZW1lbnRzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5saW5lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgZWxlbWVudHNbaV0gPSB0aGlzLmxpbmVzW2ldLnN1YnN0cmluZyh0aGlzLl9zdGFydENvbHVtbnNbaV0gLSAxLCB0aGlzLl9lbmRDb2x1bW5zW2ldIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgIH1cbiAgICBnZXRTdHJpY3RFbGVtZW50KGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzW2luZGV4XTtcbiAgICB9XG4gICAgZ2V0U3RhcnRMaW5lTnVtYmVyKGkpIHtcbiAgICAgICAgcmV0dXJuIGkgKyAxO1xuICAgIH1cbiAgICBnZXRFbmRMaW5lTnVtYmVyKGkpIHtcbiAgICAgICAgcmV0dXJuIGkgKyAxO1xuICAgIH1cbiAgICBjcmVhdGVDaGFyU2VxdWVuY2Uoc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7XG4gICAgICAgIGNvbnN0IGNoYXJDb2RlcyA9IFtdO1xuICAgICAgICBjb25zdCBsaW5lTnVtYmVycyA9IFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG4gICAgICAgIGxldCBsZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDw9IGVuZEluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lQ29udGVudCA9IHRoaXMubGluZXNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb2x1bW4gPSAoc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UgPyB0aGlzLl9zdGFydENvbHVtbnNbaW5kZXhdIDogMSk7XG4gICAgICAgICAgICBjb25zdCBlbmRDb2x1bW4gPSAoc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UgPyB0aGlzLl9lbmRDb2x1bW5zW2luZGV4XSA6IGxpbmVDb250ZW50Lmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgZm9yIChsZXQgY29sID0gc3RhcnRDb2x1bW47IGNvbCA8IGVuZENvbHVtbjsgY29sKyspIHtcbiAgICAgICAgICAgICAgICBjaGFyQ29kZXNbbGVuXSA9IGxpbmVDb250ZW50LmNoYXJDb2RlQXQoY29sIC0gMSk7XG4gICAgICAgICAgICAgICAgbGluZU51bWJlcnNbbGVuXSA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zW2xlbl0gPSBjb2w7XG4gICAgICAgICAgICAgICAgbGVuKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlICYmIGluZGV4IDwgZW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgXFxuIGlmIHRyaW0gd2hpdGVzcGFjZSBpcyBub3QgaWdub3JlZFxuICAgICAgICAgICAgICAgIGNoYXJDb2Rlc1tsZW5dID0gMTAgLyogQ2hhckNvZGUuTGluZUZlZWQgKi87XG4gICAgICAgICAgICAgICAgbGluZU51bWJlcnNbbGVuXSA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zW2xlbl0gPSBsaW5lQ29udGVudC5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIGxlbisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhclNlcXVlbmNlKGNoYXJDb2RlcywgbGluZU51bWJlcnMsIGNvbHVtbnMpO1xuICAgIH1cbn1cbmNsYXNzIENoYXJTZXF1ZW5jZSB7XG4gICAgY29uc3RydWN0b3IoY2hhckNvZGVzLCBsaW5lTnVtYmVycywgY29sdW1ucykge1xuICAgICAgICB0aGlzLl9jaGFyQ29kZXMgPSBjaGFyQ29kZXM7XG4gICAgICAgIHRoaXMuX2xpbmVOdW1iZXJzID0gbGluZU51bWJlcnM7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSBjb2x1bW5zO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuICgnWycgKyB0aGlzLl9jaGFyQ29kZXMubWFwKChzLCBpZHgpID0+IChzID09PSAxMCAvKiBDaGFyQ29kZS5MaW5lRmVlZCAqLyA/ICdcXFxcbicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKHMpKSArIGAtKCR7dGhpcy5fbGluZU51bWJlcnNbaWR4XX0sJHt0aGlzLl9jb2x1bW5zW2lkeF19KWApLmpvaW4oJywgJykgKyAnXScpO1xuICAgIH1cbiAgICBfYXNzZXJ0SW5kZXgoaW5kZXgsIGFycikge1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWxsZWdhbCBpbmRleGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEVsZW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhckNvZGVzO1xuICAgIH1cbiAgICBnZXRTdGFydExpbmVOdW1iZXIoaSkge1xuICAgICAgICBpZiAoaSA+IDAgJiYgaSA9PT0gdGhpcy5fbGluZU51bWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyB0aGUgc3RhcnQgbGluZSBudW1iZXIgb2YgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudFxuICAgICAgICAgICAgLy8gaXMgdGhlIGVuZCBsaW5lIG51bWJlciBvZiB0aGUgbGFzdCBlbGVtZW50XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFbmRMaW5lTnVtYmVyKGkgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hc3NlcnRJbmRleChpLCB0aGlzLl9saW5lTnVtYmVycyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lTnVtYmVyc1tpXTtcbiAgICB9XG4gICAgZ2V0RW5kTGluZU51bWJlcihpKSB7XG4gICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gdGhlIGVuZCBsaW5lIG51bWJlciBvZiB0aGUgZWxlbWVudCBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGlzIHRoZSBzdGFydCBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhcnRMaW5lTnVtYmVyKGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hc3NlcnRJbmRleChpLCB0aGlzLl9saW5lTnVtYmVycyk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFyQ29kZXNbaV0gPT09IDEwIC8qIENoYXJDb2RlLkxpbmVGZWVkICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGluZU51bWJlcnNbaV0gKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lTnVtYmVyc1tpXTtcbiAgICB9XG4gICAgZ2V0U3RhcnRDb2x1bW4oaSkge1xuICAgICAgICBpZiAoaSA+IDAgJiYgaSA9PT0gdGhpcy5fY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjb2x1bW4gb2YgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudFxuICAgICAgICAgICAgLy8gaXMgdGhlIGVuZCBjb2x1bW4gb2YgdGhlIGxhc3QgZWxlbWVudFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RW5kQ29sdW1uKGkgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hc3NlcnRJbmRleChpLCB0aGlzLl9jb2x1bW5zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnNbaV07XG4gICAgfVxuICAgIGdldEVuZENvbHVtbihpKSB7XG4gICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gdGhlIGVuZCBjb2x1bW4gb2YgdGhlIGVsZW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAgICAvLyBpcyB0aGUgc3RhcnQgY29sdW1uIG9mIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFydENvbHVtbihpICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYXNzZXJ0SW5kZXgoaSwgdGhpcy5fY29sdW1ucyk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFyQ29kZXNbaV0gPT09IDEwIC8qIENoYXJDb2RlLkxpbmVGZWVkICovKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uc1tpXSArIDE7XG4gICAgfVxufVxuY2xhc3MgQ2hhckNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iob3JpZ2luYWxTdGFydExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsRW5kTGluZU51bWJlciwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0Q29sdW1uLCBtb2RpZmllZEVuZExpbmVOdW1iZXIsIG1vZGlmaWVkRW5kQ29sdW1uKSB7XG4gICAgICAgIHRoaXMub3JpZ2luYWxTdGFydExpbmVOdW1iZXIgPSBvcmlnaW5hbFN0YXJ0TGluZU51bWJlcjtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFN0YXJ0Q29sdW1uID0gb3JpZ2luYWxTdGFydENvbHVtbjtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEVuZExpbmVOdW1iZXIgPSBvcmlnaW5hbEVuZExpbmVOdW1iZXI7XG4gICAgICAgIHRoaXMub3JpZ2luYWxFbmRDb2x1bW4gPSBvcmlnaW5hbEVuZENvbHVtbjtcbiAgICAgICAgdGhpcy5tb2RpZmllZFN0YXJ0TGluZU51bWJlciA9IG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICB0aGlzLm1vZGlmaWVkU3RhcnRDb2x1bW4gPSBtb2RpZmllZFN0YXJ0Q29sdW1uO1xuICAgICAgICB0aGlzLm1vZGlmaWVkRW5kTGluZU51bWJlciA9IG1vZGlmaWVkRW5kTGluZU51bWJlcjtcbiAgICAgICAgdGhpcy5tb2RpZmllZEVuZENvbHVtbiA9IG1vZGlmaWVkRW5kQ29sdW1uO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlRnJvbURpZmZDaGFuZ2UoZGlmZkNoYW5nZSwgb3JpZ2luYWxDaGFyU2VxdWVuY2UsIG1vZGlmaWVkQ2hhclNlcXVlbmNlKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxDaGFyU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3RhcnRDb2x1bW4gPSBvcmlnaW5hbENoYXJTZXF1ZW5jZS5nZXRTdGFydENvbHVtbihkaWZmQ2hhbmdlLm9yaWdpbmFsU3RhcnQpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbEVuZExpbmVOdW1iZXIgPSBvcmlnaW5hbENoYXJTZXF1ZW5jZS5nZXRFbmRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCArIGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmRDb2x1bW4gPSBvcmlnaW5hbENoYXJTZXF1ZW5jZS5nZXRFbmRDb2x1bW4oZGlmZkNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBtb2RpZmllZFN0YXJ0TGluZU51bWJlciA9IG1vZGlmaWVkQ2hhclNlcXVlbmNlLmdldFN0YXJ0TGluZU51bWJlcihkaWZmQ2hhbmdlLm1vZGlmaWVkU3RhcnQpO1xuICAgICAgICBjb25zdCBtb2RpZmllZFN0YXJ0Q29sdW1uID0gbW9kaWZpZWRDaGFyU2VxdWVuY2UuZ2V0U3RhcnRDb2x1bW4oZGlmZkNoYW5nZS5tb2RpZmllZFN0YXJ0KTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWRFbmRMaW5lTnVtYmVyID0gbW9kaWZpZWRDaGFyU2VxdWVuY2UuZ2V0RW5kTGluZU51bWJlcihkaWZmQ2hhbmdlLm1vZGlmaWVkU3RhcnQgKyBkaWZmQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoIC0gMSk7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkRW5kQ29sdW1uID0gbW9kaWZpZWRDaGFyU2VxdWVuY2UuZ2V0RW5kQ29sdW1uKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCArIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggLSAxKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFyQ2hhbmdlKG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBvcmlnaW5hbEVuZExpbmVOdW1iZXIsIG9yaWdpbmFsRW5kQ29sdW1uLCBtb2RpZmllZFN0YXJ0TGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRFbmRMaW5lTnVtYmVyLCBtb2RpZmllZEVuZENvbHVtbik7XG4gICAgfVxufVxuZnVuY3Rpb24gcG9zdFByb2Nlc3NDaGFyQ2hhbmdlcyhyYXdDaGFuZ2VzKSB7XG4gICAgaWYgKHJhd0NoYW5nZXMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuIHJhd0NoYW5nZXM7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IFtyYXdDaGFuZ2VzWzBdXTtcbiAgICBsZXQgcHJldkNoYW5nZSA9IHJlc3VsdFswXTtcbiAgICBmb3IgKGxldCBpID0gMSwgbGVuID0gcmF3Q2hhbmdlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyQ2hhbmdlID0gcmF3Q2hhbmdlc1tpXTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNYXRjaGluZ0xlbmd0aCA9IGN1cnJDaGFuZ2Uub3JpZ2luYWxTdGFydCAtIChwcmV2Q2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBwcmV2Q2hhbmdlLm9yaWdpbmFsTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWRNYXRjaGluZ0xlbmd0aCA9IGN1cnJDaGFuZ2UubW9kaWZpZWRTdGFydCAtIChwcmV2Q2hhbmdlLm1vZGlmaWVkU3RhcnQgKyBwcmV2Q2hhbmdlLm1vZGlmaWVkTGVuZ3RoKTtcbiAgICAgICAgLy8gQm90aCBvZiB0aGUgYWJvdmUgc2hvdWxkIGJlIGVxdWFsLCBidXQgdGhlIGNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZSBtYXkgcHJldmVudCB0aGlzIGZyb20gYmVpbmcgdHJ1ZVxuICAgICAgICBjb25zdCBtYXRjaGluZ0xlbmd0aCA9IE1hdGgubWluKG9yaWdpbmFsTWF0Y2hpbmdMZW5ndGgsIG1vZGlmaWVkTWF0Y2hpbmdMZW5ndGgpO1xuICAgICAgICBpZiAobWF0Y2hpbmdMZW5ndGggPCBNSU5JTVVNX01BVENISU5HX0NIQVJBQ1RFUl9MRU5HVEgpIHtcbiAgICAgICAgICAgIC8vIE1lcmdlIHRoZSBjdXJyZW50IGNoYW5nZSBpbnRvIHRoZSBwcmV2aW91cyBvbmVcbiAgICAgICAgICAgIHByZXZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPSAoY3VyckNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgY3VyckNoYW5nZS5vcmlnaW5hbExlbmd0aCkgLSBwcmV2Q2hhbmdlLm9yaWdpbmFsU3RhcnQ7XG4gICAgICAgICAgICBwcmV2Q2hhbmdlLm1vZGlmaWVkTGVuZ3RoID0gKGN1cnJDaGFuZ2UubW9kaWZpZWRTdGFydCArIGN1cnJDaGFuZ2UubW9kaWZpZWRMZW5ndGgpIC0gcHJldkNoYW5nZS5tb2RpZmllZFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IGNoYW5nZVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VyckNoYW5nZSk7XG4gICAgICAgICAgICBwcmV2Q2hhbmdlID0gY3VyckNoYW5nZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgTGluZUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iob3JpZ2luYWxTdGFydExpbmVOdW1iZXIsIG9yaWdpbmFsRW5kTGluZU51bWJlciwgbW9kaWZpZWRTdGFydExpbmVOdW1iZXIsIG1vZGlmaWVkRW5kTGluZU51bWJlciwgY2hhckNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFN0YXJ0TGluZU51bWJlciA9IG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRW5kTGluZU51bWJlciA9IG9yaWdpbmFsRW5kTGluZU51bWJlcjtcbiAgICAgICAgdGhpcy5tb2RpZmllZFN0YXJ0TGluZU51bWJlciA9IG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICB0aGlzLm1vZGlmaWVkRW5kTGluZU51bWJlciA9IG1vZGlmaWVkRW5kTGluZU51bWJlcjtcbiAgICAgICAgdGhpcy5jaGFyQ2hhbmdlcyA9IGNoYXJDaGFuZ2VzO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlRnJvbURpZmZSZXN1bHQoc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UsIGRpZmZDaGFuZ2UsIG9yaWdpbmFsTGluZVNlcXVlbmNlLCBtb2RpZmllZExpbmVTZXF1ZW5jZSwgY29udGludWVDaGFyRGlmZiwgc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLCBzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKSB7XG4gICAgICAgIGxldCBvcmlnaW5hbFN0YXJ0TGluZU51bWJlcjtcbiAgICAgICAgbGV0IG9yaWdpbmFsRW5kTGluZU51bWJlcjtcbiAgICAgICAgbGV0IG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyO1xuICAgICAgICBsZXQgbW9kaWZpZWRFbmRMaW5lTnVtYmVyO1xuICAgICAgICBsZXQgY2hhckNoYW5nZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkaWZmQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBvcmlnaW5hbFN0YXJ0TGluZU51bWJlciA9IG9yaWdpbmFsTGluZVNlcXVlbmNlLmdldFN0YXJ0TGluZU51bWJlcihkaWZmQ2hhbmdlLm9yaWdpbmFsU3RhcnQpIC0gMTtcbiAgICAgICAgICAgIG9yaWdpbmFsRW5kTGluZU51bWJlciA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmlnaW5hbFN0YXJ0TGluZU51bWJlciA9IG9yaWdpbmFsTGluZVNlcXVlbmNlLmdldFN0YXJ0TGluZU51bWJlcihkaWZmQ2hhbmdlLm9yaWdpbmFsU3RhcnQpO1xuICAgICAgICAgICAgb3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gb3JpZ2luYWxMaW5lU2VxdWVuY2UuZ2V0RW5kTGluZU51bWJlcihkaWZmQ2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBkaWZmQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyID0gbW9kaWZpZWRMaW5lU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCkgLSAxO1xuICAgICAgICAgICAgbW9kaWZpZWRFbmRMaW5lTnVtYmVyID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyID0gbW9kaWZpZWRMaW5lU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCk7XG4gICAgICAgICAgICBtb2RpZmllZEVuZExpbmVOdW1iZXIgPSBtb2RpZmllZExpbmVTZXF1ZW5jZS5nZXRFbmRMaW5lTnVtYmVyKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCArIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzICYmIGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPiAwICYmIGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPCAyMCAmJiBkaWZmQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoID4gMCAmJiBkaWZmQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoIDwgMjAgJiYgY29udGludWVDaGFyRGlmZigpKSB7XG4gICAgICAgICAgICAvLyBDb21wdXRlIGNoYXJhY3RlciBjaGFuZ2VzIGZvciBkaWZmIGNodW5rcyBvZiBhdCBtb3N0IDIwIGxpbmVzLi4uXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbENoYXJTZXF1ZW5jZSA9IG9yaWdpbmFsTGluZVNlcXVlbmNlLmNyZWF0ZUNoYXJTZXF1ZW5jZShzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSwgZGlmZkNoYW5nZS5vcmlnaW5hbFN0YXJ0LCBkaWZmQ2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBkaWZmQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZENoYXJTZXF1ZW5jZSA9IG1vZGlmaWVkTGluZVNlcXVlbmNlLmNyZWF0ZUNoYXJTZXF1ZW5jZShzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSwgZGlmZkNoYW5nZS5tb2RpZmllZFN0YXJ0LCBkaWZmQ2hhbmdlLm1vZGlmaWVkU3RhcnQgKyBkaWZmQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxDaGFyU2VxdWVuY2UuZ2V0RWxlbWVudHMoKS5sZW5ndGggPiAwICYmIG1vZGlmaWVkQ2hhclNlcXVlbmNlLmdldEVsZW1lbnRzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByYXdDaGFuZ2VzID0gY29tcHV0ZURpZmYob3JpZ2luYWxDaGFyU2VxdWVuY2UsIG1vZGlmaWVkQ2hhclNlcXVlbmNlLCBjb250aW51ZUNoYXJEaWZmLCB0cnVlKS5jaGFuZ2VzO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhd0NoYW5nZXMgPSBwb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKHJhd0NoYW5nZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGFyQ2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByYXdDaGFuZ2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJDaGFuZ2VzLnB1c2goQ2hhckNoYW5nZS5jcmVhdGVGcm9tRGlmZkNoYW5nZShyYXdDaGFuZ2VzW2ldLCBvcmlnaW5hbENoYXJTZXF1ZW5jZSwgbW9kaWZpZWRDaGFyU2VxdWVuY2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQ2hhbmdlKG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyLCBvcmlnaW5hbEVuZExpbmVOdW1iZXIsIG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLCBtb2RpZmllZEVuZExpbmVOdW1iZXIsIGNoYXJDaGFuZ2VzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRGlmZkNvbXB1dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcmlnaW5hbExpbmVzLCBtb2RpZmllZExpbmVzLCBvcHRzKSB7XG4gICAgICAgIHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzID0gb3B0cy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXM7XG4gICAgICAgIHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcyA9IG9wdHMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcztcbiAgICAgICAgdGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSA9IG9wdHMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2U7XG4gICAgICAgIHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmYgPSBvcHRzLnNob3VsZE1ha2VQcmV0dHlEaWZmO1xuICAgICAgICB0aGlzLm9yaWdpbmFsTGluZXMgPSBvcmlnaW5hbExpbmVzO1xuICAgICAgICB0aGlzLm1vZGlmaWVkTGluZXMgPSBtb2RpZmllZExpbmVzO1xuICAgICAgICB0aGlzLm9yaWdpbmFsID0gbmV3IExpbmVTZXF1ZW5jZShvcmlnaW5hbExpbmVzKTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IG5ldyBMaW5lU2VxdWVuY2UobW9kaWZpZWRMaW5lcyk7XG4gICAgICAgIHRoaXMuY29udGludWVMaW5lRGlmZiA9IGNyZWF0ZUNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZShvcHRzLm1heENvbXB1dGF0aW9uVGltZSk7XG4gICAgICAgIHRoaXMuY29udGludWVDaGFyRGlmZiA9IGNyZWF0ZUNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZShvcHRzLm1heENvbXB1dGF0aW9uVGltZSA9PT0gMCA/IDAgOiBNYXRoLm1pbihvcHRzLm1heENvbXB1dGF0aW9uVGltZSwgNTAwMCkpOyAvLyBuZXZlciBydW4gYWZ0ZXIgNXMgZm9yIGNoYXJhY3RlciBjaGFuZ2VzLi4uXG4gICAgfVxuICAgIGNvbXB1dGVEaWZmKCkge1xuICAgICAgICBpZiAodGhpcy5vcmlnaW5hbC5saW5lcy5sZW5ndGggPT09IDEgJiYgdGhpcy5vcmlnaW5hbC5saW5lc1swXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGVtcHR5IG9yaWdpbmFsID0+IGZhc3QgcGF0aFxuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoID09PSAxICYmIHRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlczogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBxdWl0RWFybHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNoYW5nZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFN0YXJ0TGluZU51bWJlcjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kTGluZU51bWJlcjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFbmRMaW5lTnVtYmVyOiB0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJDaGFuZ2VzOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoID09PSAxICYmIHRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBlbXB0eSBtb2RpZmllZCA9PiBmYXN0IHBhdGhcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydExpbmVOdW1iZXI6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEVuZExpbmVOdW1iZXI6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFyQ2hhbmdlczogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpZmZSZXN1bHQgPSBjb21wdXRlRGlmZih0aGlzLm9yaWdpbmFsLCB0aGlzLm1vZGlmaWVkLCB0aGlzLmNvbnRpbnVlTGluZURpZmYsIHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmYpO1xuICAgICAgICBjb25zdCByYXdDaGFuZ2VzID0gZGlmZlJlc3VsdC5jaGFuZ2VzO1xuICAgICAgICBjb25zdCBxdWl0RWFybHkgPSBkaWZmUmVzdWx0LnF1aXRFYXJseTtcbiAgICAgICAgLy8gVGhlIGRpZmYgaXMgYWx3YXlzIGNvbXB1dGVkIHdpdGggaWdub3JpbmcgdHJpbSB3aGl0ZXNwYWNlXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBnZXQgdGhlIHByZXR0aWVzdCBkaWZmXG4gICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lQ2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJhd0NoYW5nZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsaW5lQ2hhbmdlcy5wdXNoKExpbmVDaGFuZ2UuY3JlYXRlRnJvbURpZmZSZXN1bHQodGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSwgcmF3Q2hhbmdlc1tpXSwgdGhpcy5vcmlnaW5hbCwgdGhpcy5tb2RpZmllZCwgdGhpcy5jb250aW51ZUNoYXJEaWZmLCB0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcywgdGhpcy5zaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHF1aXRFYXJseTogcXVpdEVhcmx5LFxuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGxpbmVDaGFuZ2VzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIE5lZWQgdG8gcG9zdC1wcm9jZXNzIGFuZCBpbnRyb2R1Y2UgY2hhbmdlcyB3aGVyZSB0aGUgdHJpbSB3aGl0ZXNwYWNlIGlzIGRpZmZlcmVudFxuICAgICAgICAvLyBOb3RlIHRoYXQgd2UgYXJlIGxvb3Bpbmcgc3RhcnRpbmcgYXQgLTEgdG8gYWxzbyBjb3ZlciB0aGUgbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBjaGFuZ2VcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCBvcmlnaW5hbExpbmVJbmRleCA9IDA7XG4gICAgICAgIGxldCBtb2RpZmllZExpbmVJbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAtMSAvKiAhISEhICovLCBsZW4gPSByYXdDaGFuZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0Q2hhbmdlID0gKGkgKyAxIDwgbGVuID8gcmF3Q2hhbmdlc1tpICsgMV0gOiBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU3RvcCA9IChuZXh0Q2hhbmdlID8gbmV4dENoYW5nZS5vcmlnaW5hbFN0YXJ0IDogdGhpcy5vcmlnaW5hbExpbmVzLmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZFN0b3AgPSAobmV4dENoYW5nZSA/IG5leHRDaGFuZ2UubW9kaWZpZWRTdGFydCA6IHRoaXMubW9kaWZpZWRMaW5lcy5sZW5ndGgpO1xuICAgICAgICAgICAgd2hpbGUgKG9yaWdpbmFsTGluZUluZGV4IDwgb3JpZ2luYWxTdG9wICYmIG1vZGlmaWVkTGluZUluZGV4IDwgbW9kaWZpZWRTdG9wKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lID0gdGhpcy5vcmlnaW5hbExpbmVzW29yaWdpbmFsTGluZUluZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZExpbmUgPSB0aGlzLm1vZGlmaWVkTGluZXNbbW9kaWZpZWRMaW5lSW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbExpbmUgIT09IG1vZGlmaWVkTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBsaW5lcyBkaWZmZXIgb25seSBpbiB0cmltIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3JpZ2luYWxTdGFydENvbHVtbiA9IGdldEZpcnN0Tm9uQmxhbmtDb2x1bW4ob3JpZ2luYWxMaW5lLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtb2RpZmllZFN0YXJ0Q29sdW1uID0gZ2V0Rmlyc3ROb25CbGFua0NvbHVtbihtb2RpZmllZExpbmUsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9yaWdpbmFsU3RhcnRDb2x1bW4gPiAxICYmIG1vZGlmaWVkU3RhcnRDb2x1bW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxDaGFyID0gb3JpZ2luYWxMaW5lLmNoYXJDb2RlQXQob3JpZ2luYWxTdGFydENvbHVtbiAtIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkQ2hhciA9IG1vZGlmaWVkTGluZS5jaGFyQ29kZUF0KG1vZGlmaWVkU3RhcnRDb2x1bW4gLSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxDaGFyICE9PSBtb2RpZmllZENoYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRDb2x1bW4tLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0Q29sdW1uLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxTdGFydENvbHVtbiA+IDEgfHwgbW9kaWZpZWRTdGFydENvbHVtbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wdXNoVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHJlc3VsdCwgb3JpZ2luYWxMaW5lSW5kZXggKyAxLCAxLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBtb2RpZmllZExpbmVJbmRleCArIDEsIDEsIG1vZGlmaWVkU3RhcnRDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbEVuZENvbHVtbiA9IGdldExhc3ROb25CbGFua0NvbHVtbihvcmlnaW5hbExpbmUsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGlmaWVkRW5kQ29sdW1uID0gZ2V0TGFzdE5vbkJsYW5rQ29sdW1uKG1vZGlmaWVkTGluZSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbE1heENvbHVtbiA9IG9yaWdpbmFsTGluZS5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRNYXhDb2x1bW4gPSBtb2RpZmllZExpbmUubGVuZ3RoICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvcmlnaW5hbEVuZENvbHVtbiA8IG9yaWdpbmFsTWF4Q29sdW1uICYmIG1vZGlmaWVkRW5kQ29sdW1uIDwgbW9kaWZpZWRNYXhDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbENoYXIgPSBvcmlnaW5hbExpbmUuY2hhckNvZGVBdChvcmlnaW5hbEVuZENvbHVtbiAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkQ2hhciA9IG9yaWdpbmFsTGluZS5jaGFyQ29kZUF0KG1vZGlmaWVkRW5kQ29sdW1uIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ2hhciAhPT0gbW9kaWZpZWRDaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZENvbHVtbisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kQ29sdW1uKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxFbmRDb2x1bW4gPCBvcmlnaW5hbE1heENvbHVtbiB8fCBtb2RpZmllZEVuZENvbHVtbiA8IG1vZGlmaWVkTWF4Q29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShyZXN1bHQsIG9yaWdpbmFsTGluZUluZGV4ICsgMSwgb3JpZ2luYWxFbmRDb2x1bW4sIG9yaWdpbmFsTWF4Q29sdW1uLCBtb2RpZmllZExpbmVJbmRleCArIDEsIG1vZGlmaWVkRW5kQ29sdW1uLCBtb2RpZmllZE1heENvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxMaW5lSW5kZXgrKztcbiAgICAgICAgICAgICAgICBtb2RpZmllZExpbmVJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5leHRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAvLyBFbWl0IHRoZSBhY3R1YWwgY2hhbmdlXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goTGluZUNoYW5nZS5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLCBuZXh0Q2hhbmdlLCB0aGlzLm9yaWdpbmFsLCB0aGlzLm1vZGlmaWVkLCB0aGlzLmNvbnRpbnVlQ2hhckRpZmYsIHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLCB0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbExpbmVJbmRleCArPSBuZXh0Q2hhbmdlLm9yaWdpbmFsTGVuZ3RoO1xuICAgICAgICAgICAgICAgIG1vZGlmaWVkTGluZUluZGV4ICs9IG5leHRDaGFuZ2UubW9kaWZpZWRMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1aXRFYXJseTogcXVpdEVhcmx5LFxuICAgICAgICAgICAgY2hhbmdlczogcmVzdWx0XG4gICAgICAgIH07XG4gICAgfVxuICAgIF9wdXNoVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHJlc3VsdCwgb3JpZ2luYWxMaW5lTnVtYmVyLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBvcmlnaW5hbEVuZENvbHVtbiwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0Q29sdW1uLCBtb2RpZmllZEVuZENvbHVtbikge1xuICAgICAgICBpZiAodGhpcy5fbWVyZ2VUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UocmVzdWx0LCBvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsRW5kQ29sdW1uLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkU3RhcnRDb2x1bW4sIG1vZGlmaWVkRW5kQ29sdW1uKSkge1xuICAgICAgICAgICAgLy8gTWVyZ2VkIGludG8gcHJldmlvdXNcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2hhckNoYW5nZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcykge1xuICAgICAgICAgICAgY2hhckNoYW5nZXMgPSBbbmV3IENoYXJDaGFuZ2Uob3JpZ2luYWxMaW5lTnVtYmVyLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsRW5kQ29sdW1uLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkU3RhcnRDb2x1bW4sIG1vZGlmaWVkTGluZU51bWJlciwgbW9kaWZpZWRFbmRDb2x1bW4pXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaChuZXcgTGluZUNoYW5nZShvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsTGluZU51bWJlciwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZExpbmVOdW1iZXIsIGNoYXJDaGFuZ2VzKSk7XG4gICAgfVxuICAgIF9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShyZXN1bHQsIG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxTdGFydENvbHVtbiwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkTGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRFbmRDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgbGVuID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZDaGFuZ2UgPSByZXN1bHRbbGVuIC0gMV07XG4gICAgICAgIGlmIChwcmV2Q2hhbmdlLm9yaWdpbmFsRW5kTGluZU51bWJlciA9PT0gMCB8fCBwcmV2Q2hhbmdlLm1vZGlmaWVkRW5kTGluZU51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgbWVyZ2Ugd2l0aCBpbnNlcnRzL2RlbGV0ZXNcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldkNoYW5nZS5vcmlnaW5hbEVuZExpbmVOdW1iZXIgPT09IG9yaWdpbmFsTGluZU51bWJlciAmJiBwcmV2Q2hhbmdlLm1vZGlmaWVkRW5kTGluZU51bWJlciA9PT0gbW9kaWZpZWRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMgJiYgcHJldkNoYW5nZS5jaGFyQ2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHByZXZDaGFuZ2UuY2hhckNoYW5nZXMucHVzaChuZXcgQ2hhckNoYW5nZShvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkTGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZEVuZENvbHVtbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZDaGFuZ2Uub3JpZ2luYWxFbmRMaW5lTnVtYmVyICsgMSA9PT0gb3JpZ2luYWxMaW5lTnVtYmVyICYmIHByZXZDaGFuZ2UubW9kaWZpZWRFbmRMaW5lTnVtYmVyICsgMSA9PT0gbW9kaWZpZWRMaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICBwcmV2Q2hhbmdlLm9yaWdpbmFsRW5kTGluZU51bWJlciA9IG9yaWdpbmFsTGluZU51bWJlcjtcbiAgICAgICAgICAgIHByZXZDaGFuZ2UubW9kaWZpZWRFbmRMaW5lTnVtYmVyID0gbW9kaWZpZWRMaW5lTnVtYmVyO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzICYmIHByZXZDaGFuZ2UuY2hhckNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhbmdlLmNoYXJDaGFuZ2VzLnB1c2gobmV3IENoYXJDaGFuZ2Uob3JpZ2luYWxMaW5lTnVtYmVyLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsRW5kQ29sdW1uLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkU3RhcnRDb2x1bW4sIG1vZGlmaWVkTGluZU51bWJlciwgbW9kaWZpZWRFbmRDb2x1bW4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRGaXJzdE5vbkJsYW5rQ29sdW1uKHR4dCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgY29uc3QgciA9IHN0cmluZ3MuZmlyc3ROb25XaGl0ZXNwYWNlSW5kZXgodHh0KTtcbiAgICBpZiAociA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHIgKyAxO1xufVxuZnVuY3Rpb24gZ2V0TGFzdE5vbkJsYW5rQ29sdW1uKHR4dCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgY29uc3QgciA9IHN0cmluZ3MubGFzdE5vbldoaXRlc3BhY2VJbmRleCh0eHQpO1xuICAgIGlmIChyID09PSAtMSkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gciArIDI7XG59XG5mdW5jdGlvbiBjcmVhdGVDb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUobWF4aW11bVJ1bnRpbWUpIHtcbiAgICBpZiAobWF4aW11bVJ1bnRpbWUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBtYXhpbXVtUnVudGltZTtcbiAgICB9O1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBCdWdJbmRpY2F0aW5nRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi9lcnJvcnMuanMnO1xuLyoqXG4gKiBBIHJhbmdlIG9mIG9mZnNldHMgKDAtYmFzZWQpLlxuKi9cbmV4cG9ydCBjbGFzcyBPZmZzZXRSYW5nZSB7XG4gICAgc3RhdGljIGFkZFJhbmdlKHJhbmdlLCBzb3J0ZWRSYW5nZXMpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHNvcnRlZFJhbmdlcy5sZW5ndGggJiYgc29ydGVkUmFuZ2VzW2ldLmVuZEV4Y2x1c2l2ZSA8IHJhbmdlLnN0YXJ0KSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGogPSBpO1xuICAgICAgICB3aGlsZSAoaiA8IHNvcnRlZFJhbmdlcy5sZW5ndGggJiYgc29ydGVkUmFuZ2VzW2pdLnN0YXJ0IDw9IHJhbmdlLmVuZEV4Y2x1c2l2ZSkge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgICAgICBzb3J0ZWRSYW5nZXMuc3BsaWNlKGksIDAsIHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIHNvcnRlZFJhbmdlc1tpXS5zdGFydCk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1heChyYW5nZS5lbmRFeGNsdXNpdmUsIHNvcnRlZFJhbmdlc1tqIC0gMV0uZW5kRXhjbHVzaXZlKTtcbiAgICAgICAgICAgIHNvcnRlZFJhbmdlcy5zcGxpY2UoaSwgaiAtIGksIG5ldyBPZmZzZXRSYW5nZShzdGFydCwgZW5kKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHRyeUNyZWF0ZShzdGFydCwgZW5kRXhjbHVzaXZlKSB7XG4gICAgICAgIGlmIChzdGFydCA+IGVuZEV4Y2x1c2l2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE9mZnNldFJhbmdlKHN0YXJ0LCBlbmRFeGNsdXNpdmUpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihzdGFydCwgZW5kRXhjbHVzaXZlKSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5lbmRFeGNsdXNpdmUgPSBlbmRFeGNsdXNpdmU7XG4gICAgICAgIGlmIChzdGFydCA+IGVuZEV4Y2x1c2l2ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJ1Z0luZGljYXRpbmdFcnJvcihgSW52YWxpZCByYW5nZTogJHt0aGlzLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0ID09PSB0aGlzLmVuZEV4Y2x1c2l2ZTtcbiAgICB9XG4gICAgZGVsdGEob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgT2Zmc2V0UmFuZ2UodGhpcy5zdGFydCArIG9mZnNldCwgdGhpcy5lbmRFeGNsdXNpdmUgKyBvZmZzZXQpO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmRFeGNsdXNpdmUgLSB0aGlzLnN0YXJ0O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0aGlzLnN0YXJ0fSwgJHt0aGlzLmVuZEV4Y2x1c2l2ZX0pYDtcbiAgICB9XG4gICAgZXF1YWxzKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0ID09PSBvdGhlci5zdGFydCAmJiB0aGlzLmVuZEV4Y2x1c2l2ZSA9PT0gb3RoZXIuZW5kRXhjbHVzaXZlO1xuICAgIH1cbiAgICBjb250YWluc1JhbmdlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0IDw9IG90aGVyLnN0YXJ0ICYmIG90aGVyLmVuZEV4Y2x1c2l2ZSA8PSB0aGlzLmVuZEV4Y2x1c2l2ZTtcbiAgICB9XG4gICAgY29udGFpbnMob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0IDw9IG9mZnNldCAmJiBvZmZzZXQgPCB0aGlzLmVuZEV4Y2x1c2l2ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZm9yIGFsbCBudW1iZXJzIG46IHJhbmdlMS5jb250YWlucyhuKSBvciByYW5nZTIuY29udGFpbnMobikgPT4gcmFuZ2UxLmpvaW4ocmFuZ2UyKS5jb250YWlucyhuKVxuICAgICAqIFRoZSBqb2luZWQgcmFuZ2UgaXMgdGhlIHNtYWxsZXN0IHJhbmdlIHRoYXQgY29udGFpbnMgYm90aCByYW5nZXMuXG4gICAgICovXG4gICAgam9pbihvdGhlcikge1xuICAgICAgICByZXR1cm4gbmV3IE9mZnNldFJhbmdlKE1hdGgubWluKHRoaXMuc3RhcnQsIG90aGVyLnN0YXJ0KSwgTWF0aC5tYXgodGhpcy5lbmRFeGNsdXNpdmUsIG90aGVyLmVuZEV4Y2x1c2l2ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBmb3IgYWxsIG51bWJlcnMgbjogcmFuZ2UxLmNvbnRhaW5zKG4pIGFuZCByYW5nZTIuY29udGFpbnMobikgPD0+IHJhbmdlMS5pbnRlcnNlY3QocmFuZ2UyKS5jb250YWlucyhuKVxuICAgICAqXG4gICAgICogVGhlIHJlc3VsdGluZyByYW5nZSBpcyBlbXB0eSBpZiB0aGUgcmFuZ2VzIGRvIG5vdCBpbnRlcnNlY3QsIGJ1dCB0b3VjaC5cbiAgICAgKiBJZiB0aGUgcmFuZ2VzIGRvbid0IGV2ZW4gdG91Y2gsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIGludGVyc2VjdChvdGhlcikge1xuICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KHRoaXMuc3RhcnQsIG90aGVyLnN0YXJ0KTtcbiAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4odGhpcy5lbmRFeGNsdXNpdmUsIG90aGVyLmVuZEV4Y2x1c2l2ZSk7XG4gICAgICAgIGlmIChzdGFydCA8PSBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2Zmc2V0UmFuZ2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IEJ1Z0luZGljYXRpbmdFcnJvciB9IGZyb20gJy4uLy4uLy4uLy4uL2Jhc2UvY29tbW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBPZmZzZXRSYW5nZSB9IGZyb20gJy4uLy4uL2NvcmUvb2Zmc2V0UmFuZ2UuanMnO1xuZXhwb3J0IGNsYXNzIERpZmZBbGdvcml0aG1SZXN1bHQge1xuICAgIHN0YXRpYyB0cml2aWFsKHNlcTEsIHNlcTIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEaWZmQWxnb3JpdGhtUmVzdWx0KFtuZXcgU2VxdWVuY2VEaWZmKG5ldyBPZmZzZXRSYW5nZSgwLCBzZXExLmxlbmd0aCksIG5ldyBPZmZzZXRSYW5nZSgwLCBzZXEyLmxlbmd0aCkpXSwgZmFsc2UpO1xuICAgIH1cbiAgICBzdGF0aWMgdHJpdmlhbFRpbWVkT3V0KHNlcTEsIHNlcTIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEaWZmQWxnb3JpdGhtUmVzdWx0KFtuZXcgU2VxdWVuY2VEaWZmKG5ldyBPZmZzZXRSYW5nZSgwLCBzZXExLmxlbmd0aCksIG5ldyBPZmZzZXRSYW5nZSgwLCBzZXEyLmxlbmd0aCkpXSwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGRpZmZzLCBcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRpbWUgb3V0IHdhcyByZWFjaGVkLlxuICAgICAqIEluIHRoYXQgY2FzZSwgdGhlIGRpZmZzIG1pZ2h0IGJlIGFuIGFwcHJveGltYXRpb24gYW5kIHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCB0byByZXJ1biB0aGUgZGlmZiB3aXRoIG1vcmUgdGltZS5cbiAgICAgKi9cbiAgICBoaXRUaW1lb3V0KSB7XG4gICAgICAgIHRoaXMuZGlmZnMgPSBkaWZmcztcbiAgICAgICAgdGhpcy5oaXRUaW1lb3V0ID0gaGl0VGltZW91dDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgU2VxdWVuY2VEaWZmIHtcbiAgICBjb25zdHJ1Y3RvcihzZXExUmFuZ2UsIHNlcTJSYW5nZSkge1xuICAgICAgICB0aGlzLnNlcTFSYW5nZSA9IHNlcTFSYW5nZTtcbiAgICAgICAgdGhpcy5zZXEyUmFuZ2UgPSBzZXEyUmFuZ2U7XG4gICAgfVxuICAgIHJldmVyc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VxdWVuY2VEaWZmKHRoaXMuc2VxMlJhbmdlLCB0aGlzLnNlcTFSYW5nZSk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5zZXExUmFuZ2V9IDwtPiAke3RoaXMuc2VxMlJhbmdlfWA7XG4gICAgfVxuICAgIGpvaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXF1ZW5jZURpZmYodGhpcy5zZXExUmFuZ2Uuam9pbihvdGhlci5zZXExUmFuZ2UpLCB0aGlzLnNlcTJSYW5nZS5qb2luKG90aGVyLnNlcTJSYW5nZSkpO1xuICAgIH1cbiAgICBkZWx0YShvZmZzZXQpIHtcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTZXF1ZW5jZURpZmYodGhpcy5zZXExUmFuZ2UuZGVsdGEob2Zmc2V0KSwgdGhpcy5zZXEyUmFuZ2UuZGVsdGEob2Zmc2V0KSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEluZmluaXRlVGltZW91dCB7XG4gICAgaXNWYWxpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuSW5maW5pdGVUaW1lb3V0Lmluc3RhbmNlID0gbmV3IEluZmluaXRlVGltZW91dCgpO1xuZXhwb3J0IGNsYXNzIERhdGVUaW1lb3V0IHtcbiAgICBjb25zdHJ1Y3Rvcih0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCdWdJbmRpY2F0aW5nRXJyb3IoJ3RpbWVvdXQgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJlY29tbWVuZGF0aW9uOiBTZXQgYSBsb2ctcG9pbnQgYHt0aGlzLmRpc2FibGUoKX1gIGluIHRoZSBib2R5XG4gICAgaXNWYWxpZCgpIHtcbiAgICAgICAgY29uc3QgdmFsaWQgPSBEYXRlLm5vdygpIC0gdGhpcy5zdGFydFRpbWUgPCB0aGlzLnRpbWVvdXQ7XG4gICAgICAgIGlmICghdmFsaWQgJiYgdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlOyAvLyB0aW1lb3V0IHJlYWNoZWRcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlclxuICAgICAgICAgICAgZGVidWdnZXI7IC8vIFdBUk5JTkc6IE1vc3QgbGlrZWx5IGRlYnVnZ2luZyBjYXVzZWQgdGhlIHRpbWVvdXQuIENhbGwgYHRoaXMuZGlzYWJsZSgpYCB0byBjb250aW51ZSB3aXRob3V0IHRpbWluZyBvdXQuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gICAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgY2xhc3MgQXJyYXkyRCB7XG4gICAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgIHRoaXMuYXJyYXkgPSBuZXcgQXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICAgIH1cbiAgICBnZXQoeCwgeSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJheVt4ICsgeSAqIHRoaXMud2lkdGhdO1xuICAgIH1cbiAgICBzZXQoeCwgeSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5hcnJheVt4ICsgeSAqIHRoaXMud2lkdGhdID0gdmFsdWU7XG4gICAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBPZmZzZXRSYW5nZSB9IGZyb20gJy4uLy4uL2NvcmUvb2Zmc2V0UmFuZ2UuanMnO1xuaW1wb3J0IHsgU2VxdWVuY2VEaWZmLCBJbmZpbml0ZVRpbWVvdXQsIERpZmZBbGdvcml0aG1SZXN1bHQgfSBmcm9tICcuL2RpZmZBbGdvcml0aG0uanMnO1xuaW1wb3J0IHsgQXJyYXkyRCB9IGZyb20gJy4vdXRpbHMuanMnO1xuLyoqXG4gKiBBIE8oTU4pIGRpZmZpbmcgYWxnb3JpdGhtIHRoYXQgc3VwcG9ydHMgYSBzY29yZSBmdW5jdGlvbi5cbiAqIFRoZSBhbGdvcml0aG0gY2FuIGJlIGltcHJvdmVkIGJ5IHByb2Nlc3NpbmcgdGhlIDJkIGFycmF5IGRpYWdvbmFsbHkuXG4qL1xuZXhwb3J0IGNsYXNzIER5bmFtaWNQcm9ncmFtbWluZ0RpZmZpbmcge1xuICAgIGNvbXB1dGUoc2VxdWVuY2UxLCBzZXF1ZW5jZTIsIHRpbWVvdXQgPSBJbmZpbml0ZVRpbWVvdXQuaW5zdGFuY2UsIGVxdWFsaXR5U2NvcmUpIHtcbiAgICAgICAgaWYgKHNlcXVlbmNlMS5sZW5ndGggPT09IDAgfHwgc2VxdWVuY2UyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIERpZmZBbGdvcml0aG1SZXN1bHQudHJpdmlhbChzZXF1ZW5jZTEsIHNlcXVlbmNlMik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGxjc0xlbmd0aHMuZ2V0KGksIGopOiBMZW5ndGggb2YgdGhlIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlIG9mIHNlcXVlbmNlMS5zdWJzdHJpbmcoMCwgaSArIDEpIGFuZCBzZXF1ZW5jZTIuc3Vic3RyaW5nKDAsIGogKyAxKS5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGxjc0xlbmd0aHMgPSBuZXcgQXJyYXkyRChzZXF1ZW5jZTEubGVuZ3RoLCBzZXF1ZW5jZTIubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9ucyA9IG5ldyBBcnJheTJEKHNlcXVlbmNlMS5sZW5ndGgsIHNlcXVlbmNlMi5sZW5ndGgpO1xuICAgICAgICBjb25zdCBsZW5ndGhzID0gbmV3IEFycmF5MkQoc2VxdWVuY2UxLmxlbmd0aCwgc2VxdWVuY2UyLmxlbmd0aCk7XG4gICAgICAgIC8vID09PT0gSW5pdGlhbGl6aW5nIGxjc0xlbmd0aHMgPT09PVxuICAgICAgICBmb3IgKGxldCBzMSA9IDA7IHMxIDwgc2VxdWVuY2UxLmxlbmd0aDsgczErKykge1xuICAgICAgICAgICAgZm9yIChsZXQgczIgPSAwOyBzMiA8IHNlcXVlbmNlMi5sZW5ndGg7IHMyKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbWVvdXQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBEaWZmQWxnb3JpdGhtUmVzdWx0LnRyaXZpYWxUaW1lZE91dChzZXF1ZW5jZTEsIHNlcXVlbmNlMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxMZW4gPSBzMSA9PT0gMCA/IDAgOiBsY3NMZW5ndGhzLmdldChzMSAtIDEsIHMyKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbExlbiA9IHMyID09PSAwID8gMCA6IGxjc0xlbmd0aHMuZ2V0KHMxLCBzMiAtIDEpO1xuICAgICAgICAgICAgICAgIGxldCBleHRlbmRlZFNlcVNjb3JlO1xuICAgICAgICAgICAgICAgIGlmIChzZXF1ZW5jZTEuZ2V0RWxlbWVudChzMSkgPT09IHNlcXVlbmNlMi5nZXRFbGVtZW50KHMyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoczEgPT09IDAgfHwgczIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkU2VxU2NvcmUgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRTZXFTY29yZSA9IGxjc0xlbmd0aHMuZ2V0KHMxIC0gMSwgczIgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoczEgPiAwICYmIHMyID4gMCAmJiBkaXJlY3Rpb25zLmdldChzMSAtIDEsIHMyIC0gMSkgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBjb25zZWN1dGl2ZSBkaWFnb25hbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkU2VxU2NvcmUgKz0gbGVuZ3Rocy5nZXQoczEgLSAxLCBzMiAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkU2VxU2NvcmUgKz0gKGVxdWFsaXR5U2NvcmUgPyBlcXVhbGl0eVNjb3JlKHMxLCBzMikgOiAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkU2VxU2NvcmUgPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBNYXRoLm1heChob3Jpem9udGFsTGVuLCB2ZXJ0aWNhbExlbiwgZXh0ZW5kZWRTZXFTY29yZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSBleHRlbmRlZFNlcVNjb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBkaWFnb25hbHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkxlbiA9IHMxID4gMCAmJiBzMiA+IDAgPyBsZW5ndGhzLmdldChzMSAtIDEsIHMyIC0gMSkgOiAwO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGhzLnNldChzMSwgczIsIHByZXZMZW4gKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9ucy5zZXQoczEsIHMyLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3VmFsdWUgPT09IGhvcml6b250YWxMZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3Rocy5zZXQoczEsIHMyLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9ucy5zZXQoczEsIHMyLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3VmFsdWUgPT09IHZlcnRpY2FsTGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aHMuc2V0KHMxLCBzMiwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMuc2V0KHMxLCBzMiwgMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxjc0xlbmd0aHMuc2V0KHMxLCBzMiwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vID09PT0gQmFja3RyYWNraW5nID09PT1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCBsYXN0QWxpZ25pbmdQb3NTMSA9IHNlcXVlbmNlMS5sZW5ndGg7XG4gICAgICAgIGxldCBsYXN0QWxpZ25pbmdQb3NTMiA9IHNlcXVlbmNlMi5sZW5ndGg7XG4gICAgICAgIGZ1bmN0aW9uIHJlcG9ydERlY3JlYXNpbmdBbGlnbmluZ1Bvc2l0aW9ucyhzMSwgczIpIHtcbiAgICAgICAgICAgIGlmIChzMSArIDEgIT09IGxhc3RBbGlnbmluZ1Bvc1MxIHx8IHMyICsgMSAhPT0gbGFzdEFsaWduaW5nUG9zUzIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU2VxdWVuY2VEaWZmKG5ldyBPZmZzZXRSYW5nZShzMSArIDEsIGxhc3RBbGlnbmluZ1Bvc1MxKSwgbmV3IE9mZnNldFJhbmdlKHMyICsgMSwgbGFzdEFsaWduaW5nUG9zUzIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0QWxpZ25pbmdQb3NTMSA9IHMxO1xuICAgICAgICAgICAgbGFzdEFsaWduaW5nUG9zUzIgPSBzMjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgczEgPSBzZXF1ZW5jZTEubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IHMyID0gc2VxdWVuY2UyLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChzMSA+PSAwICYmIHMyID49IDApIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zLmdldChzMSwgczIpID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcmVwb3J0RGVjcmVhc2luZ0FsaWduaW5nUG9zaXRpb25zKHMxLCBzMik7XG4gICAgICAgICAgICAgICAgczEtLTtcbiAgICAgICAgICAgICAgICBzMi0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbnMuZ2V0KHMxLCBzMikgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgczEtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHMyLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcG9ydERlY3JlYXNpbmdBbGlnbmluZ1Bvc2l0aW9ucygtMSwgLTEpO1xuICAgICAgICByZXN1bHQucmV2ZXJzZSgpO1xuICAgICAgICByZXR1cm4gbmV3IERpZmZBbGdvcml0aG1SZXN1bHQocmVzdWx0LCBmYWxzZSk7XG4gICAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBPZmZzZXRSYW5nZSB9IGZyb20gJy4uLy4uL2NvcmUvb2Zmc2V0UmFuZ2UuanMnO1xuaW1wb3J0IHsgU2VxdWVuY2VEaWZmIH0gZnJvbSAnLi9kaWZmQWxnb3JpdGhtLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBvcHRpbWl6ZVNlcXVlbmNlRGlmZnMoc2VxdWVuY2UxLCBzZXF1ZW5jZTIsIHNlcXVlbmNlRGlmZnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gc2VxdWVuY2VEaWZmcztcbiAgICByZXN1bHQgPSBqb2luU2VxdWVuY2VEaWZmcyhzZXF1ZW5jZTEsIHNlcXVlbmNlMiwgcmVzdWx0KTtcbiAgICByZXN1bHQgPSBzaGlmdFNlcXVlbmNlRGlmZnMoc2VxdWVuY2UxLCBzZXF1ZW5jZTIsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzbW9vdGhlblNlcXVlbmNlRGlmZnMoc2VxdWVuY2UxLCBzZXF1ZW5jZTIsIHNlcXVlbmNlRGlmZnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc2VxdWVuY2VEaWZmcykge1xuICAgICAgICBjb25zdCBsYXN0ID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFsYXN0KSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChzKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLnNlcTFSYW5nZS5zdGFydCAtIGxhc3Quc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSA8PSAyIHx8IHMuc2VxMlJhbmdlLnN0YXJ0IC0gbGFzdC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlIDw9IDIpIHtcbiAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBuZXcgU2VxdWVuY2VEaWZmKGxhc3Quc2VxMVJhbmdlLmpvaW4ocy5zZXExUmFuZ2UpLCBsYXN0LnNlcTJSYW5nZS5qb2luKHMuc2VxMlJhbmdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVJhbmRvbU1hdGNoZXMoc2VxdWVuY2UxLCBzZXF1ZW5jZTIsIHNlcXVlbmNlRGlmZnMpIHtcbiAgICBsZXQgZGlmZnMgPSBzZXF1ZW5jZURpZmZzO1xuICAgIGlmIChkaWZmcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRpZmZzO1xuICAgIH1cbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgbGV0IHNob3VsZFJlcGVhdDtcbiAgICBkbyB7XG4gICAgICAgIHNob3VsZFJlcGVhdCA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXG4gICAgICAgICAgICBkaWZmc1swXVxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGRpZmZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjdXIgPSBkaWZmc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSZXN1bHQgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkSm9pbkRpZmZzKGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1bmNoYW5nZWRSYW5nZSA9IG5ldyBPZmZzZXRSYW5nZShsYXN0UmVzdWx0LnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUsIGN1ci5zZXExUmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuY2hhbmdlZExpbmVDb3VudCA9IHNlcXVlbmNlMS5jb3VudExpbmVzSW4odW5jaGFuZ2VkUmFuZ2UpO1xuICAgICAgICAgICAgICAgIGlmICh1bmNoYW5nZWRMaW5lQ291bnQgPiA1IHx8IHVuY2hhbmdlZFJhbmdlLmxlbmd0aCA+IDUwMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHVuY2hhbmdlZFRleHQgPSBzZXF1ZW5jZTEuZ2V0VGV4dCh1bmNoYW5nZWRSYW5nZSkudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh1bmNoYW5nZWRUZXh0Lmxlbmd0aCA+IDIwIHx8IHVuY2hhbmdlZFRleHQuc3BsaXQoL1xcclxcbnxcXHJ8XFxuLykubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZUxpbmVDb3VudDEgPSBzZXF1ZW5jZTEuY291bnRMaW5lc0luKGJlZm9yZS5zZXExUmFuZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZVNlcTFMZW5ndGggPSBiZWZvcmUuc2VxMVJhbmdlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVMaW5lQ291bnQyID0gc2VxdWVuY2UyLmNvdW50TGluZXNJbihiZWZvcmUuc2VxMlJhbmdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVTZXEyTGVuZ3RoID0gYmVmb3JlLnNlcTJSYW5nZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJMaW5lQ291bnQxID0gc2VxdWVuY2UxLmNvdW50TGluZXNJbihhZnRlci5zZXExUmFuZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyU2VxMUxlbmd0aCA9IGFmdGVyLnNlcTFSYW5nZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJMaW5lQ291bnQyID0gc2VxdWVuY2UyLmNvdW50TGluZXNJbihhZnRlci5zZXEyUmFuZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyU2VxMkxlbmd0aCA9IGFmdGVyLnNlcTJSYW5nZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogTWF5YmUgYSBuZXVyYWwgbmV0IGNhbiBiZSB1c2VkIHRvIGRlcml2ZSB0aGUgcmVzdWx0IGZyb20gdGhlc2UgbnVtYmVyc1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IDIgKiA0MCArIDUwO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhcCh2KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2LCBtYXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5wb3coTWF0aC5wb3coY2FwKGJlZm9yZUxpbmVDb3VudDEgKiA0MCArIGJlZm9yZVNlcTFMZW5ndGgpLCAxLjUpICsgTWF0aC5wb3coY2FwKGJlZm9yZUxpbmVDb3VudDIgKiA0MCArIGJlZm9yZVNlcTJMZW5ndGgpLCAxLjUpLCAxLjUpXG4gICAgICAgICAgICAgICAgICAgICsgTWF0aC5wb3coTWF0aC5wb3coY2FwKGFmdGVyTGluZUNvdW50MSAqIDQwICsgYWZ0ZXJTZXExTGVuZ3RoKSwgMS41KSArIE1hdGgucG93KGNhcChhZnRlckxpbmVDb3VudDIgKiA0MCArIGFmdGVyU2VxMkxlbmd0aCksIDEuNSksIDEuNSkgPiAoTWF0aC5wb3coKE1hdGgucG93KG1heCwgMS41KSksIDEuNSkpICogMS4zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaG91bGRKb2luID0gc2hvdWxkSm9pbkRpZmZzKGxhc3RSZXN1bHQsIGN1cik7XG4gICAgICAgICAgICBpZiAoc2hvdWxkSm9pbikge1xuICAgICAgICAgICAgICAgIHNob3VsZFJlcGVhdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0uam9pbihjdXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaWZmcyA9IHJlc3VsdDtcbiAgICB9IHdoaWxlIChjb3VudGVyKysgPCAxMCAmJiBzaG91bGRSZXBlYXQpO1xuICAgIHJldHVybiBkaWZmcztcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBmaXhlcyBpc3N1ZXMgbGlrZSB0aGlzOlxuICogYGBgXG4gKiBpbXBvcnQgeyBCYXosIEJhciB9IGZyb20gXCJmb29cIjtcbiAqIGBgYFxuICogPC0+XG4gKiBgYGBcbiAqIGltcG9ydCB7IEJheiwgQmFyLCBGb28gfSBmcm9tIFwiZm9vXCI7XG4gKiBgYGBcbiAqIENvbXB1dGVkIGRpZmY6IFsge0FkZCBcIixcIiBhZnRlciBCYXJ9LCB7QWRkIFwiRm9vIFwiIGFmdGVyIHNwYWNlfSB9XG4gKiBJbXByb3ZlZCBkaWZmOiBbe0FkZCBcIiwgRm9vXCIgYWZ0ZXIgQmFyfV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvaW5TZXF1ZW5jZURpZmZzKHNlcXVlbmNlMSwgc2VxdWVuY2UyLCBzZXF1ZW5jZURpZmZzKSB7XG4gICAgaWYgKHNlcXVlbmNlRGlmZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzZXF1ZW5jZURpZmZzO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICByZXN1bHQucHVzaChzZXF1ZW5jZURpZmZzWzBdKTtcbiAgICAvLyBGaXJzdCBtb3ZlIHRoZW0gYWxsIHRvIHRoZSBsZWZ0IGFzIG11Y2ggYXMgcG9zc2libGUgYW5kIGpvaW4gdGhlbSBpZiBwb3NzaWJsZVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2VxdWVuY2VEaWZmcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcmV2UmVzdWx0ID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IGN1ciA9IHNlcXVlbmNlRGlmZnNbaV07XG4gICAgICAgIGlmIChjdXIuc2VxMVJhbmdlLmlzRW1wdHkgfHwgY3VyLnNlcTJSYW5nZS5pc0VtcHR5KSB7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBjdXIuc2VxMVJhbmdlLnN0YXJ0IC0gcHJldlJlc3VsdC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlO1xuICAgICAgICAgICAgbGV0IGQ7XG4gICAgICAgICAgICBmb3IgKGQgPSAxOyBkIDw9IGxlbmd0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlcXVlbmNlMS5nZXRFbGVtZW50KGN1ci5zZXExUmFuZ2Uuc3RhcnQgLSBkKSAhPT0gc2VxdWVuY2UxLmdldEVsZW1lbnQoY3VyLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUgLSBkKSB8fFxuICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZTIuZ2V0RWxlbWVudChjdXIuc2VxMlJhbmdlLnN0YXJ0IC0gZCkgIT09IHNlcXVlbmNlMi5nZXRFbGVtZW50KGN1ci5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlIC0gZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZC0tO1xuICAgICAgICAgICAgaWYgKGQgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIE1lcmdlIHByZXZpb3VzIGFuZCBjdXJyZW50IGRpZmZcbiAgICAgICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gbmV3IFNlcXVlbmNlRGlmZihuZXcgT2Zmc2V0UmFuZ2UocHJldlJlc3VsdC5zZXExUmFuZ2Uuc3RhcnQsIGN1ci5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlIC0gbGVuZ3RoKSwgbmV3IE9mZnNldFJhbmdlKHByZXZSZXN1bHQuc2VxMlJhbmdlLnN0YXJ0LCBjdXIuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSAtIGxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyID0gY3VyLmRlbHRhKC1kKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaChjdXIpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQyID0gW107XG4gICAgLy8gVGhlbiBtb3ZlIHRoZW0gYWxsIHRvIHRoZSByaWdodCBhbmQgam9pbiB0aGVtIGFnYWluIGlmIHBvc3NpYmxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5leHRSZXN1bHQgPSByZXN1bHRbaSArIDFdO1xuICAgICAgICBsZXQgY3VyID0gcmVzdWx0W2ldO1xuICAgICAgICBpZiAoY3VyLnNlcTFSYW5nZS5pc0VtcHR5IHx8IGN1ci5zZXEyUmFuZ2UuaXNFbXB0eSkge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gbmV4dFJlc3VsdC5zZXExUmFuZ2Uuc3RhcnQgLSBjdXIuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZTtcbiAgICAgICAgICAgIGxldCBkO1xuICAgICAgICAgICAgZm9yIChkID0gMDsgZCA8IGxlbmd0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlcXVlbmNlMS5nZXRFbGVtZW50KGN1ci5zZXExUmFuZ2Uuc3RhcnQgKyBkKSAhPT0gc2VxdWVuY2UxLmdldEVsZW1lbnQoY3VyLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUgKyBkKSB8fFxuICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZTIuZ2V0RWxlbWVudChjdXIuc2VxMlJhbmdlLnN0YXJ0ICsgZCkgIT09IHNlcXVlbmNlMi5nZXRFbGVtZW50KGN1ci5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlICsgZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGQgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIE1lcmdlIHByZXZpb3VzIGFuZCBjdXJyZW50IGRpZmYsIHdyaXRlIHRvIHJlc3VsdCFcbiAgICAgICAgICAgICAgICByZXN1bHRbaSArIDFdID0gbmV3IFNlcXVlbmNlRGlmZihuZXcgT2Zmc2V0UmFuZ2UoY3VyLnNlcTFSYW5nZS5zdGFydCArIGxlbmd0aCwgbmV4dFJlc3VsdC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlKSwgbmV3IE9mZnNldFJhbmdlKGN1ci5zZXEyUmFuZ2Uuc3RhcnQgKyBsZW5ndGgsIG5leHRSZXN1bHQuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY3VyID0gY3VyLmRlbHRhKGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdDIucHVzaChjdXIpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0Mi5wdXNoKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0Mjtcbn1cbi8vIGFsaWduIGNoYXJhY3RlciBsZXZlbCBkaWZmcyBhdCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcbi8vIGltcG9ydCB7IElCYXIgfSBmcm9tIFwiZm9vXCI7XG4vLyBpbXBvcnQgeyBJW0FyciwgSV1CYXIgfSBmcm9tIFwiZm9vXCI7XG4vLyAtPlxuLy8gaW1wb3J0IHsgW0lBcnIsIF1JQmFyIH0gZnJvbSBcImZvb1wiO1xuLy8gaW1wb3J0IHsgSVRyYW5zYWN0aW9uLCBvYnNlcnZhYmxlVmFsdWUsIHRyYW5zYWN0aW9uIH0gZnJvbSAndnMvYmFzZS9jb21tb24vb2JzZXJ2YWJsZSc7XG4vLyBpbXBvcnQgeyBJVHJhbnNhY3Rpb24sIG9ic2VydmFibGVbRnJvbUV2ZW50LCBvYnNlcnZhYmxlXVZhbHVlLCB0cmFuc2FjdGlvbiB9IGZyb20gJ3ZzL2Jhc2UvY29tbW9uL29ic2VydmFibGUnO1xuLy8gLT5cbi8vIGltcG9ydCB7IElUcmFuc2FjdGlvbiwgW29ic2VydmFibGVGcm9tRXZlbnQsIF1vYnNlcnZhYmxlVmFsdWUsIHRyYW5zYWN0aW9uIH0gZnJvbSAndnMvYmFzZS9jb21tb24vb2JzZXJ2YWJsZSc7XG4vLyBjb2xsZWN0QnJhY2tldHMobGV2ZWwgKyAxLCBsZXZlbFBlckJyYWNrZXRUeXBlKTtcbi8vIGNvbGxlY3RCcmFja2V0cyhsZXZlbCArIDEsIGxldmVsUGVyQnJhY2tldFsgKyAxLCBsZXZlbFBlckJyYWNrZXRdVHlwZSk7XG4vLyAtPlxuLy8gY29sbGVjdEJyYWNrZXRzKGxldmVsICsgMSwgW2xldmVsUGVyQnJhY2tldCArIDEsIF1sZXZlbFBlckJyYWNrZXRUeXBlKTtcbmV4cG9ydCBmdW5jdGlvbiBzaGlmdFNlcXVlbmNlRGlmZnMoc2VxdWVuY2UxLCBzZXF1ZW5jZTIsIHNlcXVlbmNlRGlmZnMpIHtcbiAgICBpZiAoIXNlcXVlbmNlMS5nZXRCb3VuZGFyeVNjb3JlIHx8ICFzZXF1ZW5jZTIuZ2V0Qm91bmRhcnlTY29yZSkge1xuICAgICAgICByZXR1cm4gc2VxdWVuY2VEaWZmcztcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZURpZmZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByZXZEaWZmID0gKGkgPiAwID8gc2VxdWVuY2VEaWZmc1tpIC0gMV0gOiB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBkaWZmID0gc2VxdWVuY2VEaWZmc1tpXTtcbiAgICAgICAgY29uc3QgbmV4dERpZmYgPSAoaSArIDEgPCBzZXF1ZW5jZURpZmZzLmxlbmd0aCA/IHNlcXVlbmNlRGlmZnNbaSArIDFdIDogdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3Qgc2VxMVZhbGlkUmFuZ2UgPSBuZXcgT2Zmc2V0UmFuZ2UocHJldkRpZmYgPyBwcmV2RGlmZi5zZXExUmFuZ2Uuc3RhcnQgKyAxIDogMCwgbmV4dERpZmYgPyBuZXh0RGlmZi5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlIC0gMSA6IHNlcXVlbmNlMS5sZW5ndGgpO1xuICAgICAgICBjb25zdCBzZXEyVmFsaWRSYW5nZSA9IG5ldyBPZmZzZXRSYW5nZShwcmV2RGlmZiA/IHByZXZEaWZmLnNlcTJSYW5nZS5zdGFydCArIDEgOiAwLCBuZXh0RGlmZiA/IG5leHREaWZmLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUgLSAxIDogc2VxdWVuY2UyLmxlbmd0aCk7XG4gICAgICAgIGlmIChkaWZmLnNlcTFSYW5nZS5pc0VtcHR5KSB7XG4gICAgICAgICAgICBzZXF1ZW5jZURpZmZzW2ldID0gc2hpZnREaWZmVG9CZXR0ZXJQb3NpdGlvbihkaWZmLCBzZXF1ZW5jZTEsIHNlcXVlbmNlMiwgc2VxMVZhbGlkUmFuZ2UsIHNlcTJWYWxpZFJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaWZmLnNlcTJSYW5nZS5pc0VtcHR5KSB7XG4gICAgICAgICAgICBzZXF1ZW5jZURpZmZzW2ldID0gc2hpZnREaWZmVG9CZXR0ZXJQb3NpdGlvbihkaWZmLnJldmVyc2UoKSwgc2VxdWVuY2UyLCBzZXF1ZW5jZTEsIHNlcTJWYWxpZFJhbmdlLCBzZXExVmFsaWRSYW5nZSkucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXF1ZW5jZURpZmZzO1xufVxuZnVuY3Rpb24gc2hpZnREaWZmVG9CZXR0ZXJQb3NpdGlvbihkaWZmLCBzZXF1ZW5jZTEsIHNlcXVlbmNlMiwgc2VxMVZhbGlkUmFuZ2UsIHNlcTJWYWxpZFJhbmdlKSB7XG4gICAgY29uc3QgbWF4U2hpZnRMaW1pdCA9IDEwMDsgLy8gVG8gcHJldmVudCBwZXJmb3JtYW5jZSBpc3N1ZXNcbiAgICAvLyBkb24ndCB0b3VjaCBwcmV2aW91cyBvciBuZXh0IVxuICAgIGxldCBkZWx0YUJlZm9yZSA9IDE7XG4gICAgd2hpbGUgKGRpZmYuc2VxMVJhbmdlLnN0YXJ0IC0gZGVsdGFCZWZvcmUgPj0gc2VxMVZhbGlkUmFuZ2Uuc3RhcnQgJiZcbiAgICAgICAgZGlmZi5zZXEyUmFuZ2Uuc3RhcnQgLSBkZWx0YUJlZm9yZSA+PSBzZXEyVmFsaWRSYW5nZS5zdGFydCAmJlxuICAgICAgICBzZXF1ZW5jZTIuZ2V0RWxlbWVudChkaWZmLnNlcTJSYW5nZS5zdGFydCAtIGRlbHRhQmVmb3JlKSA9PT1cbiAgICAgICAgICAgIHNlcXVlbmNlMi5nZXRFbGVtZW50KGRpZmYuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSAtIGRlbHRhQmVmb3JlKSAmJiBkZWx0YUJlZm9yZSA8IG1heFNoaWZ0TGltaXQpIHtcbiAgICAgICAgZGVsdGFCZWZvcmUrKztcbiAgICB9XG4gICAgZGVsdGFCZWZvcmUtLTtcbiAgICBsZXQgZGVsdGFBZnRlciA9IDA7XG4gICAgd2hpbGUgKGRpZmYuc2VxMVJhbmdlLnN0YXJ0ICsgZGVsdGFBZnRlciA8IHNlcTFWYWxpZFJhbmdlLmVuZEV4Y2x1c2l2ZSAmJlxuICAgICAgICBkaWZmLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUgKyBkZWx0YUFmdGVyIDwgc2VxMlZhbGlkUmFuZ2UuZW5kRXhjbHVzaXZlICYmXG4gICAgICAgIHNlcXVlbmNlMi5nZXRFbGVtZW50KGRpZmYuc2VxMlJhbmdlLnN0YXJ0ICsgZGVsdGFBZnRlcikgPT09XG4gICAgICAgICAgICBzZXF1ZW5jZTIuZ2V0RWxlbWVudChkaWZmLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUgKyBkZWx0YUFmdGVyKSAmJiBkZWx0YUFmdGVyIDwgbWF4U2hpZnRMaW1pdCkge1xuICAgICAgICBkZWx0YUFmdGVyKys7XG4gICAgfVxuICAgIGlmIChkZWx0YUJlZm9yZSA9PT0gMCAmJiBkZWx0YUFmdGVyID09PSAwKSB7XG4gICAgICAgIHJldHVybiBkaWZmO1xuICAgIH1cbiAgICAvLyBWaXN1YWxpemUgYFtzZXF1ZW5jZTEudGV4dCwgZGlmZi5zZXExUmFuZ2Uuc3RhcnQgKyBkZWx0YUFmdGVyXWBcbiAgICAvLyBhbmQgYFtzZXF1ZW5jZTIudGV4dCwgZGlmZi5zZXEyUmFuZ2Uuc3RhcnQgKyBkZWx0YUFmdGVyLCBkaWZmLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUgKyBkZWx0YUFmdGVyXWBcbiAgICBsZXQgYmVzdERlbHRhID0gMDtcbiAgICBsZXQgYmVzdFNjb3JlID0gLTE7XG4gICAgLy8gZmluZCBiZXN0IHNjb3JlZCBkZWx0YVxuICAgIGZvciAobGV0IGRlbHRhID0gLWRlbHRhQmVmb3JlOyBkZWx0YSA8PSBkZWx0YUFmdGVyOyBkZWx0YSsrKSB7XG4gICAgICAgIGNvbnN0IHNlcTJPZmZzZXRTdGFydCA9IGRpZmYuc2VxMlJhbmdlLnN0YXJ0ICsgZGVsdGE7XG4gICAgICAgIGNvbnN0IHNlcTJPZmZzZXRFbmRFeGNsdXNpdmUgPSBkaWZmLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUgKyBkZWx0YTtcbiAgICAgICAgY29uc3Qgc2VxMU9mZnNldCA9IGRpZmYuc2VxMVJhbmdlLnN0YXJ0ICsgZGVsdGE7XG4gICAgICAgIGNvbnN0IHNjb3JlID0gc2VxdWVuY2UxLmdldEJvdW5kYXJ5U2NvcmUoc2VxMU9mZnNldCkgKyBzZXF1ZW5jZTIuZ2V0Qm91bmRhcnlTY29yZShzZXEyT2Zmc2V0U3RhcnQpICsgc2VxdWVuY2UyLmdldEJvdW5kYXJ5U2NvcmUoc2VxMk9mZnNldEVuZEV4Y2x1c2l2ZSk7XG4gICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkge1xuICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7XG4gICAgICAgICAgICBiZXN0RGVsdGEgPSBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZi5kZWx0YShiZXN0RGVsdGEpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBPZmZzZXRSYW5nZSB9IGZyb20gJy4uLy4uL2NvcmUvb2Zmc2V0UmFuZ2UuanMnO1xuaW1wb3J0IHsgRGlmZkFsZ29yaXRobVJlc3VsdCwgSW5maW5pdGVUaW1lb3V0LCBTZXF1ZW5jZURpZmYgfSBmcm9tICcuL2RpZmZBbGdvcml0aG0uanMnO1xuLyoqXG4gKiBBbiBPKE5EKSBkaWZmIGFsZ29yaXRobSB0aGF0IGhhcyBhIHF1YWRyYXRpYyBzcGFjZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkuXG4qL1xuZXhwb3J0IGNsYXNzIE15ZXJzRGlmZkFsZ29yaXRobSB7XG4gICAgY29tcHV0ZShzZXExLCBzZXEyLCB0aW1lb3V0ID0gSW5maW5pdGVUaW1lb3V0Lmluc3RhbmNlKSB7XG4gICAgICAgIC8vIFRoZXNlIGFyZSBjb21tb24gc3BlY2lhbCBjYXNlcy5cbiAgICAgICAgLy8gVGhlIGVhcmx5IHJldHVybiBpbXByb3ZlcyBwZXJmb3JtYW5jZSBkcmFtYXRpY2FsbHkuXG4gICAgICAgIGlmIChzZXExLmxlbmd0aCA9PT0gMCB8fCBzZXEyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIERpZmZBbGdvcml0aG1SZXN1bHQudHJpdmlhbChzZXExLCBzZXEyKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRYQWZ0ZXJTbmFrZSh4LCB5KSB7XG4gICAgICAgICAgICB3aGlsZSAoeCA8IHNlcTEubGVuZ3RoICYmIHkgPCBzZXEyLmxlbmd0aCAmJiBzZXExLmdldEVsZW1lbnQoeCkgPT09IHNlcTIuZ2V0RWxlbWVudCh5KSkge1xuICAgICAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgICAgICB5Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZCA9IDA7XG4gICAgICAgIC8vIFZba106IFggdmFsdWUgb2YgbG9uZ2VzdCBkLWxpbmUgdGhhdCBlbmRzIGluIGRpYWdvbmFsIGsuXG4gICAgICAgIC8vIGQtbGluZTogcGF0aCBmcm9tICgwLDApIHRvICh4LHkpIHRoYXQgdXNlcyBleGFjdGx5IGQgbm9uLWRpYWdvbmFscy5cbiAgICAgICAgLy8gZGlhZ29uYWwgazogU2V0IG9mIHBvaW50cyAoeCx5KSB3aXRoIHgteSA9IGsuXG4gICAgICAgIGNvbnN0IFYgPSBuZXcgRmFzdEludDMyQXJyYXkoKTtcbiAgICAgICAgVi5zZXQoMCwgZ2V0WEFmdGVyU25ha2UoMCwgMCkpO1xuICAgICAgICBjb25zdCBwYXRocyA9IG5ldyBGYXN0QXJyYXlOZWdhdGl2ZUluZGljZXMoKTtcbiAgICAgICAgcGF0aHMuc2V0KDAsIFYuZ2V0KDApID09PSAwID8gbnVsbCA6IG5ldyBTbmFrZVBhdGgobnVsbCwgMCwgMCwgVi5nZXQoMCkpKTtcbiAgICAgICAgbGV0IGsgPSAwO1xuICAgICAgICBsb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgZCsrO1xuICAgICAgICAgICAgaWYgKCF0aW1lb3V0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBEaWZmQWxnb3JpdGhtUmVzdWx0LnRyaXZpYWxUaW1lZE91dChzZXExLCBzZXEyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBwYXBlciBoYXMgYGZvciAoayA9IC1kOyBrIDw9IGQ7IGsgKz0gMilgLCBidXQgd2UgY2FuIGlnbm9yZSBkaWFnb25hbHMgdGhhdCBjYW5ub3QgaW5mbHVlbmNlIHRoZSByZXN1bHQuXG4gICAgICAgICAgICBjb25zdCBsb3dlckJvdW5kID0gLU1hdGgubWluKGQsIHNlcTIubGVuZ3RoICsgKGQgJSAyKSk7XG4gICAgICAgICAgICBjb25zdCB1cHBlckJvdW5kID0gTWF0aC5taW4oZCwgc2VxMS5sZW5ndGggKyAoZCAlIDIpKTtcbiAgICAgICAgICAgIGZvciAoayA9IGxvd2VyQm91bmQ7IGsgPD0gdXBwZXJCb3VuZDsgayArPSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSB0aGUgWCB2YWx1ZXMgb2YgKGQtMSktbGluZXMgdG8gY29tcHV0ZSBYIHZhbHVlIG9mIHRoZSBsb25nZXN0IGQtbGluZXMuXG4gICAgICAgICAgICAgICAgY29uc3QgbWF4WG9mRExpbmVUb3AgPSBrID09PSB1cHBlckJvdW5kID8gLTEgOiBWLmdldChrICsgMSk7IC8vIFdlIHRha2UgYSB2ZXJ0aWNhbCBub24tZGlhZ29uYWwgKGFkZCBhIHN5bWJvbCBpbiBzZXExKVxuICAgICAgICAgICAgICAgIGNvbnN0IG1heFhvZkRMaW5lTGVmdCA9IGsgPT09IGxvd2VyQm91bmQgPyAtMSA6IFYuZ2V0KGsgLSAxKSArIDE7IC8vIFdlIHRha2UgYSBob3Jpem9udGFsIG5vbi1kaWFnb25hbCAoKzEgeCkgKGRlbGV0ZSBhIHN5bWJvbCBpbiBzZXExKVxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBNYXRoLm1pbihNYXRoLm1heChtYXhYb2ZETGluZVRvcCwgbWF4WG9mRExpbmVMZWZ0KSwgc2VxMS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB4IC0gaztcbiAgICAgICAgICAgICAgICBpZiAoeCA+IHNlcTEubGVuZ3RoIHx8IHkgPiBzZXEyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGRpYWdvbmFsIGlzIGlycmVsZXZhbnQgZm9yIHRoZSByZXN1bHQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IERvbid0IHBheSB0aGUgY29zdCBmb3IgdGhpcyBpbiB0aGUgbmV4dCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdNYXhYID0gZ2V0WEFmdGVyU25ha2UoeCwgeSk7XG4gICAgICAgICAgICAgICAgVi5zZXQoaywgbmV3TWF4WCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFBhdGggPSB4ID09PSBtYXhYb2ZETGluZVRvcCA/IHBhdGhzLmdldChrICsgMSkgOiBwYXRocy5nZXQoayAtIDEpO1xuICAgICAgICAgICAgICAgIHBhdGhzLnNldChrLCBuZXdNYXhYICE9PSB4ID8gbmV3IFNuYWtlUGF0aChsYXN0UGF0aCwgeCwgeSwgbmV3TWF4WCAtIHgpIDogbGFzdFBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChWLmdldChrKSA9PT0gc2VxMS5sZW5ndGggJiYgVi5nZXQoaykgLSBrID09PSBzZXEyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF0aCA9IHBhdGhzLmdldChrKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCBsYXN0QWxpZ25pbmdQb3NTMSA9IHNlcTEubGVuZ3RoO1xuICAgICAgICBsZXQgbGFzdEFsaWduaW5nUG9zUzIgPSBzZXEyLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZFggPSBwYXRoID8gcGF0aC54ICsgcGF0aC5sZW5ndGggOiAwO1xuICAgICAgICAgICAgY29uc3QgZW5kWSA9IHBhdGggPyBwYXRoLnkgKyBwYXRoLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICBpZiAoZW5kWCAhPT0gbGFzdEFsaWduaW5nUG9zUzEgfHwgZW5kWSAhPT0gbGFzdEFsaWduaW5nUG9zUzIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU2VxdWVuY2VEaWZmKG5ldyBPZmZzZXRSYW5nZShlbmRYLCBsYXN0QWxpZ25pbmdQb3NTMSksIG5ldyBPZmZzZXRSYW5nZShlbmRZLCBsYXN0QWxpZ25pbmdQb3NTMikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdEFsaWduaW5nUG9zUzEgPSBwYXRoLng7XG4gICAgICAgICAgICBsYXN0QWxpZ25pbmdQb3NTMiA9IHBhdGgueTtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnByZXY7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnJldmVyc2UoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEaWZmQWxnb3JpdGhtUmVzdWx0KHJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbn1cbmNsYXNzIFNuYWtlUGF0aCB7XG4gICAgY29uc3RydWN0b3IocHJldiwgeCwgeSwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucHJldiA9IHByZXY7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIH1cbn1cbi8qKlxuICogQW4gYXJyYXkgdGhhdCBzdXBwb3J0cyBmYXN0IG5lZ2F0aXZlIGluZGljZXMuXG4qL1xuY2xhc3MgRmFzdEludDMyQXJyYXkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnBvc2l0aXZlQXJyID0gbmV3IEludDMyQXJyYXkoMTApO1xuICAgICAgICB0aGlzLm5lZ2F0aXZlQXJyID0gbmV3IEludDMyQXJyYXkoMTApO1xuICAgIH1cbiAgICBnZXQoaWR4KSB7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSAtaWR4IC0gMTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlQXJyW2lkeF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGl2ZUFycltpZHhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldChpZHgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSAtaWR4IC0gMTtcbiAgICAgICAgICAgIGlmIChpZHggPj0gdGhpcy5uZWdhdGl2ZUFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0aGlzLm5lZ2F0aXZlQXJyO1xuICAgICAgICAgICAgICAgIHRoaXMubmVnYXRpdmVBcnIgPSBuZXcgSW50MzJBcnJheShhcnIubGVuZ3RoICogMik7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWdhdGl2ZUFyci5zZXQoYXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmVnYXRpdmVBcnJbaWR4XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlkeCA+PSB0aGlzLnBvc2l0aXZlQXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IHRoaXMucG9zaXRpdmVBcnI7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGl2ZUFyciA9IG5ldyBJbnQzMkFycmF5KGFyci5sZW5ndGggKiAyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aXZlQXJyLnNldChhcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb3NpdGl2ZUFycltpZHhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEFuIGFycmF5IHRoYXQgc3VwcG9ydHMgZmFzdCBuZWdhdGl2ZSBpbmRpY2VzLlxuKi9cbmNsYXNzIEZhc3RBcnJheU5lZ2F0aXZlSW5kaWNlcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucG9zaXRpdmVBcnIgPSBbXTtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZUFyciA9IFtdO1xuICAgIH1cbiAgICBnZXQoaWR4KSB7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSAtaWR4IC0gMTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlQXJyW2lkeF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGl2ZUFycltpZHhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldChpZHgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSAtaWR4IC0gMTtcbiAgICAgICAgICAgIHRoaXMubmVnYXRpdmVBcnJbaWR4XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGl2ZUFycltpZHhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IGFzc2VydEZuLCBjaGVja0FkamFjZW50SXRlbXMgfSBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi9hc3NlcnQuanMnO1xuaW1wb3J0IHsgTGluZVJhbmdlIH0gZnJvbSAnLi4vY29yZS9saW5lUmFuZ2UuanMnO1xuaW1wb3J0IHsgT2Zmc2V0UmFuZ2UgfSBmcm9tICcuLi9jb3JlL29mZnNldFJhbmdlLmpzJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vY29yZS9wb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL2NvcmUvcmFuZ2UuanMnO1xuaW1wb3J0IHsgRGF0ZVRpbWVvdXQsIEluZmluaXRlVGltZW91dCwgU2VxdWVuY2VEaWZmIH0gZnJvbSAnLi9hbGdvcml0aG1zL2RpZmZBbGdvcml0aG0uanMnO1xuaW1wb3J0IHsgRHluYW1pY1Byb2dyYW1taW5nRGlmZmluZyB9IGZyb20gJy4vYWxnb3JpdGhtcy9keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nLmpzJztcbmltcG9ydCB7IG9wdGltaXplU2VxdWVuY2VEaWZmcywgcmVtb3ZlUmFuZG9tTWF0Y2hlcywgc21vb3RoZW5TZXF1ZW5jZURpZmZzIH0gZnJvbSAnLi9hbGdvcml0aG1zL2pvaW5TZXF1ZW5jZURpZmZzLmpzJztcbmltcG9ydCB7IE15ZXJzRGlmZkFsZ29yaXRobSB9IGZyb20gJy4vYWxnb3JpdGhtcy9teWVyc0RpZmZBbGdvcml0aG0uanMnO1xuaW1wb3J0IHsgTGluZVJhbmdlTWFwcGluZywgTGluZXNEaWZmLCBNb3ZlZFRleHQsIFJhbmdlTWFwcGluZywgU2ltcGxlTGluZVJhbmdlTWFwcGluZyB9IGZyb20gJy4vbGluZXNEaWZmQ29tcHV0ZXIuanMnO1xuZXhwb3J0IGNsYXNzIFN0YW5kYXJkTGluZXNEaWZmQ29tcHV0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmR5bmFtaWNQcm9ncmFtbWluZ0RpZmZpbmcgPSBuZXcgRHluYW1pY1Byb2dyYW1taW5nRGlmZmluZygpO1xuICAgICAgICB0aGlzLm15ZXJzRGlmZmluZ0FsZ29yaXRobSA9IG5ldyBNeWVyc0RpZmZBbGdvcml0aG0oKTtcbiAgICB9XG4gICAgY29tcHV0ZURpZmYob3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcywgb3B0aW9ucykge1xuICAgICAgICBpZiAob3JpZ2luYWxMaW5lcy5sZW5ndGggPT09IDEgJiYgb3JpZ2luYWxMaW5lc1swXS5sZW5ndGggPT09IDAgfHwgbW9kaWZpZWRMaW5lcy5sZW5ndGggPT09IDEgJiYgbW9kaWZpZWRMaW5lc1swXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY2hhbmdlczogW1xuICAgICAgICAgICAgICAgICAgICBuZXcgTGluZVJhbmdlTWFwcGluZyhuZXcgTGluZVJhbmdlKDEsIG9yaWdpbmFsTGluZXMubGVuZ3RoICsgMSksIG5ldyBMaW5lUmFuZ2UoMSwgbW9kaWZpZWRMaW5lcy5sZW5ndGggKyAxKSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmdlTWFwcGluZyhuZXcgUmFuZ2UoMSwgMSwgb3JpZ2luYWxMaW5lcy5sZW5ndGgsIG9yaWdpbmFsTGluZXNbMF0ubGVuZ3RoICsgMSksIG5ldyBSYW5nZSgxLCAxLCBtb2RpZmllZExpbmVzLmxlbmd0aCwgbW9kaWZpZWRMaW5lc1swXS5sZW5ndGggKyAxKSlcbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGhpdFRpbWVvdXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1vdmVzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMubWF4Q29tcHV0YXRpb25UaW1lTXMgPT09IDAgPyBJbmZpbml0ZVRpbWVvdXQuaW5zdGFuY2UgOiBuZXcgRGF0ZVRpbWVvdXQob3B0aW9ucy5tYXhDb21wdXRhdGlvblRpbWVNcyk7XG4gICAgICAgIGNvbnN0IGNvbnNpZGVyV2hpdGVzcGFjZUNoYW5nZXMgPSAhb3B0aW9ucy5pZ25vcmVUcmltV2hpdGVzcGFjZTtcbiAgICAgICAgY29uc3QgcGVyZmVjdEhhc2hlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgZnVuY3Rpb24gZ2V0T3JDcmVhdGVIYXNoKHRleHQpIHtcbiAgICAgICAgICAgIGxldCBoYXNoID0gcGVyZmVjdEhhc2hlcy5nZXQodGV4dCk7XG4gICAgICAgICAgICBpZiAoaGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaGFzaCA9IHBlcmZlY3RIYXNoZXMuc2l6ZTtcbiAgICAgICAgICAgICAgICBwZXJmZWN0SGFzaGVzLnNldCh0ZXh0LCBoYXNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYXNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNyY0RvY0xpbmVzID0gb3JpZ2luYWxMaW5lcy5tYXAoKGwpID0+IGdldE9yQ3JlYXRlSGFzaChsLnRyaW0oKSkpO1xuICAgICAgICBjb25zdCB0Z3REb2NMaW5lcyA9IG1vZGlmaWVkTGluZXMubWFwKChsKSA9PiBnZXRPckNyZWF0ZUhhc2gobC50cmltKCkpKTtcbiAgICAgICAgY29uc3Qgc2VxdWVuY2UxID0gbmV3IExpbmVTZXF1ZW5jZShzcmNEb2NMaW5lcywgb3JpZ2luYWxMaW5lcyk7XG4gICAgICAgIGNvbnN0IHNlcXVlbmNlMiA9IG5ldyBMaW5lU2VxdWVuY2UodGd0RG9jTGluZXMsIG1vZGlmaWVkTGluZXMpO1xuICAgICAgICBjb25zdCBsaW5lQWxpZ25tZW50UmVzdWx0ID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzZXF1ZW5jZTEubGVuZ3RoICsgc2VxdWVuY2UyLmxlbmd0aCA8IDE1MDApIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGltcHJvdmVkIGFsZ29yaXRobSBmb3Igc21hbGwgZmlsZXNcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nLmNvbXB1dGUoc2VxdWVuY2UxLCBzZXF1ZW5jZTIsIHRpbWVvdXQsIChvZmZzZXQxLCBvZmZzZXQyKSA9PiBvcmlnaW5hbExpbmVzW29mZnNldDFdID09PSBtb2RpZmllZExpbmVzW29mZnNldDJdXG4gICAgICAgICAgICAgICAgICAgID8gbW9kaWZpZWRMaW5lc1tvZmZzZXQyXS5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMC4xXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDEgKyBNYXRoLmxvZygxICsgbW9kaWZpZWRMaW5lc1tvZmZzZXQyXS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIDogMC45OSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5teWVyc0RpZmZpbmdBbGdvcml0aG0uY29tcHV0ZShzZXF1ZW5jZTEsIHNlcXVlbmNlMik7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGxldCBsaW5lQWxpZ25tZW50cyA9IGxpbmVBbGlnbm1lbnRSZXN1bHQuZGlmZnM7XG4gICAgICAgIGxldCBoaXRUaW1lb3V0ID0gbGluZUFsaWdubWVudFJlc3VsdC5oaXRUaW1lb3V0O1xuICAgICAgICBsaW5lQWxpZ25tZW50cyA9IG9wdGltaXplU2VxdWVuY2VEaWZmcyhzZXF1ZW5jZTEsIHNlcXVlbmNlMiwgbGluZUFsaWdubWVudHMpO1xuICAgICAgICBjb25zdCBhbGlnbm1lbnRzID0gW107XG4gICAgICAgIGNvbnN0IHNjYW5Gb3JXaGl0ZXNwYWNlQ2hhbmdlcyA9IChlcXVhbExpbmVzQ291bnQpID0+IHtcbiAgICAgICAgICAgIGlmICghY29uc2lkZXJXaGl0ZXNwYWNlQ2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXF1YWxMaW5lc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXExT2Zmc2V0ID0gc2VxMUxhc3RTdGFydCArIGk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VxMk9mZnNldCA9IHNlcTJMYXN0U3RhcnQgKyBpO1xuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbExpbmVzW3NlcTFPZmZzZXRdICE9PSBtb2RpZmllZExpbmVzW3NlcTJPZmZzZXRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBvZiB3aGl0ZXNwYWNlIGNoYW5nZXMsIGRpZmYgdGhlc2UgbGluZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcmFjdGVyRGlmZnMgPSB0aGlzLnJlZmluZURpZmYob3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcywgbmV3IFNlcXVlbmNlRGlmZihuZXcgT2Zmc2V0UmFuZ2Uoc2VxMU9mZnNldCwgc2VxMU9mZnNldCArIDEpLCBuZXcgT2Zmc2V0UmFuZ2Uoc2VxMk9mZnNldCwgc2VxMk9mZnNldCArIDEpKSwgdGltZW91dCwgY29uc2lkZXJXaGl0ZXNwYWNlQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBjaGFyYWN0ZXJEaWZmcy5tYXBwaW5ncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50cy5wdXNoKGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJEaWZmcy5oaXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXRUaW1lb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHNlcTFMYXN0U3RhcnQgPSAwO1xuICAgICAgICBsZXQgc2VxMkxhc3RTdGFydCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZGlmZiBvZiBsaW5lQWxpZ25tZW50cykge1xuICAgICAgICAgICAgYXNzZXJ0Rm4oKCkgPT4gZGlmZi5zZXExUmFuZ2Uuc3RhcnQgLSBzZXExTGFzdFN0YXJ0ID09PSBkaWZmLnNlcTJSYW5nZS5zdGFydCAtIHNlcTJMYXN0U3RhcnQpO1xuICAgICAgICAgICAgY29uc3QgZXF1YWxMaW5lc0NvdW50ID0gZGlmZi5zZXExUmFuZ2Uuc3RhcnQgLSBzZXExTGFzdFN0YXJ0O1xuICAgICAgICAgICAgc2NhbkZvcldoaXRlc3BhY2VDaGFuZ2VzKGVxdWFsTGluZXNDb3VudCk7XG4gICAgICAgICAgICBzZXExTGFzdFN0YXJ0ID0gZGlmZi5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlO1xuICAgICAgICAgICAgc2VxMkxhc3RTdGFydCA9IGRpZmYuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJhY3RlckRpZmZzID0gdGhpcy5yZWZpbmVEaWZmKG9yaWdpbmFsTGluZXMsIG1vZGlmaWVkTGluZXMsIGRpZmYsIHRpbWVvdXQsIGNvbnNpZGVyV2hpdGVzcGFjZUNoYW5nZXMpO1xuICAgICAgICAgICAgaWYgKGNoYXJhY3RlckRpZmZzLmhpdFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBoaXRUaW1lb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBjaGFyYWN0ZXJEaWZmcy5tYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGFsaWdubWVudHMucHVzaChhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzY2FuRm9yV2hpdGVzcGFjZUNoYW5nZXMob3JpZ2luYWxMaW5lcy5sZW5ndGggLSBzZXExTGFzdFN0YXJ0KTtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IGxpbmVSYW5nZU1hcHBpbmdGcm9tUmFuZ2VNYXBwaW5ncyhhbGlnbm1lbnRzLCBvcmlnaW5hbExpbmVzLCBtb2RpZmllZExpbmVzKTtcbiAgICAgICAgY29uc3QgbW92ZXMgPSBbXTtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29tcHV0ZU1vdmVzKSB7XG4gICAgICAgICAgICBjb25zdCBkZWxldGlvbnMgPSBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjID0+IGMubW9kaWZpZWRSYW5nZS5pc0VtcHR5ICYmIGMub3JpZ2luYWxSYW5nZS5sZW5ndGggPj0gMylcbiAgICAgICAgICAgICAgICAubWFwKGQgPT4gbmV3IExpbmVSYW5nZUZyYWdtZW50KGQub3JpZ2luYWxSYW5nZSwgb3JpZ2luYWxMaW5lcykpO1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0aW9ucyA9IG5ldyBTZXQoY2hhbmdlc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoYyA9PiBjLm9yaWdpbmFsUmFuZ2UuaXNFbXB0eSAmJiBjLm1vZGlmaWVkUmFuZ2UubGVuZ3RoID49IDMpXG4gICAgICAgICAgICAgICAgLm1hcChkID0+IG5ldyBMaW5lUmFuZ2VGcmFnbWVudChkLm1vZGlmaWVkUmFuZ2UsIG1vZGlmaWVkTGluZXMpKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlbGV0aW9uIG9mIGRlbGV0aW9ucykge1xuICAgICAgICAgICAgICAgIGxldCBoaWdoZXN0U2ltaWxhcml0eSA9IC0xO1xuICAgICAgICAgICAgICAgIGxldCBiZXN0O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5zZXJ0aW9uIG9mIGluc2VydGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IGRlbGV0aW9uLmNvbXB1dGVTaW1pbGFyaXR5KGluc2VydGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaW1pbGFyaXR5ID4gaGlnaGVzdFNpbWlsYXJpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3RTaW1pbGFyaXR5ID0gc2ltaWxhcml0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBpbnNlcnRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhpZ2hlc3RTaW1pbGFyaXR5ID4gMC45MCAmJiBiZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vdmVDaGFuZ2VzID0gdGhpcy5yZWZpbmVEaWZmKG9yaWdpbmFsTGluZXMsIG1vZGlmaWVkTGluZXMsIG5ldyBTZXF1ZW5jZURpZmYobmV3IE9mZnNldFJhbmdlKGRlbGV0aW9uLnJhbmdlLnN0YXJ0TGluZU51bWJlciAtIDEsIGRlbGV0aW9uLnJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgLSAxKSwgbmV3IE9mZnNldFJhbmdlKGJlc3QucmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMSwgYmVzdC5yYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlIC0gMSkpLCB0aW1lb3V0LCBjb25zaWRlcldoaXRlc3BhY2VDaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGluZ3MgPSBsaW5lUmFuZ2VNYXBwaW5nRnJvbVJhbmdlTWFwcGluZ3MobW92ZUNoYW5nZXMubWFwcGluZ3MsIG9yaWdpbmFsTGluZXMsIG1vZGlmaWVkTGluZXMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25zLmRlbGV0ZShiZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgbW92ZXMucHVzaChuZXcgTW92ZWRUZXh0KG5ldyBTaW1wbGVMaW5lUmFuZ2VNYXBwaW5nKGRlbGV0aW9uLnJhbmdlLCBiZXN0LnJhbmdlKSwgbWFwcGluZ3MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCByYW5nZXMgYXJlIHZhbGlkXG4gICAgICAgIGFzc2VydEZuKCgpID0+IHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlUG9zaXRpb24ocG9zLCBsaW5lcykge1xuICAgICAgICAgICAgICAgIGlmIChwb3MubGluZU51bWJlciA8IDEgfHwgcG9zLmxpbmVOdW1iZXIgPiBsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbcG9zLmxpbmVOdW1iZXIgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAocG9zLmNvbHVtbiA8IDEgfHwgcG9zLmNvbHVtbiA+IGxpbmUubGVuZ3RoICsgMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGVSYW5nZShyYW5nZSwgbGluZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIDwgMSB8fCByYW5nZS5zdGFydExpbmVOdW1iZXIgPiBsaW5lcy5sZW5ndGggKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgPCAxIHx8IHJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgPiBsaW5lcy5sZW5ndGggKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGlmICghYy5pbm5lckNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGljIG9mIGMuaW5uZXJDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVQb3NpdGlvbihpYy5tb2RpZmllZFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSwgbW9kaWZpZWRMaW5lcykgJiYgdmFsaWRhdGVQb3NpdGlvbihpYy5tb2RpZmllZFJhbmdlLmdldEVuZFBvc2l0aW9uKCksIG1vZGlmaWVkTGluZXMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVBvc2l0aW9uKGljLm9yaWdpbmFsUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpLCBvcmlnaW5hbExpbmVzKSAmJiB2YWxpZGF0ZVBvc2l0aW9uKGljLm9yaWdpbmFsUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKSwgb3JpZ2luYWxMaW5lcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlUmFuZ2UoYy5tb2RpZmllZFJhbmdlLCBtb2RpZmllZExpbmVzKSB8fCAhdmFsaWRhdGVSYW5nZShjLm9yaWdpbmFsUmFuZ2UsIG9yaWdpbmFsTGluZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTGluZXNEaWZmKGNoYW5nZXMsIG1vdmVzLCBoaXRUaW1lb3V0KTtcbiAgICB9XG4gICAgcmVmaW5lRGlmZihvcmlnaW5hbExpbmVzLCBtb2RpZmllZExpbmVzLCBkaWZmLCB0aW1lb3V0LCBjb25zaWRlcldoaXRlc3BhY2VDaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IHNsaWNlMSA9IG5ldyBMaW5lc1NsaWNlQ2hhclNlcXVlbmNlKG9yaWdpbmFsTGluZXMsIGRpZmYuc2VxMVJhbmdlLCBjb25zaWRlcldoaXRlc3BhY2VDaGFuZ2VzKTtcbiAgICAgICAgY29uc3Qgc2xpY2UyID0gbmV3IExpbmVzU2xpY2VDaGFyU2VxdWVuY2UobW9kaWZpZWRMaW5lcywgZGlmZi5zZXEyUmFuZ2UsIGNvbnNpZGVyV2hpdGVzcGFjZUNoYW5nZXMpO1xuICAgICAgICBjb25zdCBkaWZmUmVzdWx0ID0gc2xpY2UxLmxlbmd0aCArIHNsaWNlMi5sZW5ndGggPCA1MDBcbiAgICAgICAgICAgID8gdGhpcy5keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nLmNvbXB1dGUoc2xpY2UxLCBzbGljZTIsIHRpbWVvdXQpXG4gICAgICAgICAgICA6IHRoaXMubXllcnNEaWZmaW5nQWxnb3JpdGhtLmNvbXB1dGUoc2xpY2UxLCBzbGljZTIsIHRpbWVvdXQpO1xuICAgICAgICBsZXQgZGlmZnMgPSBkaWZmUmVzdWx0LmRpZmZzO1xuICAgICAgICBkaWZmcyA9IG9wdGltaXplU2VxdWVuY2VEaWZmcyhzbGljZTEsIHNsaWNlMiwgZGlmZnMpO1xuICAgICAgICBkaWZmcyA9IGNvdmVyRnVsbFdvcmRzKHNsaWNlMSwgc2xpY2UyLCBkaWZmcyk7XG4gICAgICAgIGRpZmZzID0gc21vb3RoZW5TZXF1ZW5jZURpZmZzKHNsaWNlMSwgc2xpY2UyLCBkaWZmcyk7XG4gICAgICAgIGRpZmZzID0gcmVtb3ZlUmFuZG9tTWF0Y2hlcyhzbGljZTEsIHNsaWNlMiwgZGlmZnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkaWZmcy5tYXAoKGQpID0+IG5ldyBSYW5nZU1hcHBpbmcoc2xpY2UxLnRyYW5zbGF0ZVJhbmdlKGQuc2VxMVJhbmdlKSwgc2xpY2UyLnRyYW5zbGF0ZVJhbmdlKGQuc2VxMlJhbmdlKSkpO1xuICAgICAgICAvLyBBc3NlcnQ6IHJlc3VsdCBhcHBsaWVkIG9uIG9yaWdpbmFsIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBkaWZmIGFwcGxpZWQgdG8gb3JpZ2luYWxcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hcHBpbmdzOiByZXN1bHQsXG4gICAgICAgICAgICBoaXRUaW1lb3V0OiBkaWZmUmVzdWx0LmhpdFRpbWVvdXQsXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gY292ZXJGdWxsV29yZHMoc2VxdWVuY2UxLCBzZXF1ZW5jZTIsIHNlcXVlbmNlRGlmZnMpIHtcbiAgICBjb25zdCBhZGRpdGlvbmFsID0gW107XG4gICAgbGV0IGxhc3RNb2RpZmllZFdvcmQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gbWF5YmVQdXNoV29yZFRvQWRkaXRpb25hbCgpIHtcbiAgICAgICAgaWYgKCFsYXN0TW9kaWZpZWRXb3JkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxMZW5ndGgxID0gbGFzdE1vZGlmaWVkV29yZC5zMVJhbmdlLmxlbmd0aCAtIGxhc3RNb2RpZmllZFdvcmQuZGVsZXRlZDtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxMZW5ndGgyID0gbGFzdE1vZGlmaWVkV29yZC5zMlJhbmdlLmxlbmd0aCAtIGxhc3RNb2RpZmllZFdvcmQuYWRkZWQ7XG4gICAgICAgIGlmIChvcmlnaW5hbExlbmd0aDEgIT09IG9yaWdpbmFsTGVuZ3RoMikge1xuICAgICAgICAgICAgLy8gVE9ETyBmaWd1cmUgb3V0IHdoeSB0aGlzIGhhcHBlbnNcbiAgICAgICAgfVxuICAgICAgICBpZiAoTWF0aC5tYXgobGFzdE1vZGlmaWVkV29yZC5kZWxldGVkLCBsYXN0TW9kaWZpZWRXb3JkLmFkZGVkKSArIChsYXN0TW9kaWZpZWRXb3JkLmNvdW50IC0gMSkgPiBvcmlnaW5hbExlbmd0aDEpIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWwucHVzaChuZXcgU2VxdWVuY2VEaWZmKGxhc3RNb2RpZmllZFdvcmQuczFSYW5nZSwgbGFzdE1vZGlmaWVkV29yZC5zMlJhbmdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdE1vZGlmaWVkV29yZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzIG9mIHNlcXVlbmNlRGlmZnMpIHtcbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1dvcmQoczFSYW5nZSwgczJSYW5nZSkge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAgICAgaWYgKCFsYXN0TW9kaWZpZWRXb3JkIHx8ICFsYXN0TW9kaWZpZWRXb3JkLnMxUmFuZ2UuY29udGFpbnNSYW5nZShzMVJhbmdlKSB8fCAhbGFzdE1vZGlmaWVkV29yZC5zMlJhbmdlLmNvbnRhaW5zUmFuZ2UoczJSYW5nZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkV29yZCAmJiAhKGxhc3RNb2RpZmllZFdvcmQuczFSYW5nZS5lbmRFeGNsdXNpdmUgPCBzMVJhbmdlLnN0YXJ0ICYmIGxhc3RNb2RpZmllZFdvcmQuczJSYW5nZS5lbmRFeGNsdXNpdmUgPCBzMlJhbmdlLnN0YXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzMUFkZGVkID0gT2Zmc2V0UmFuZ2UudHJ5Q3JlYXRlKGxhc3RNb2RpZmllZFdvcmQuczFSYW5nZS5lbmRFeGNsdXNpdmUsIHMxUmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzMkFkZGVkID0gT2Zmc2V0UmFuZ2UudHJ5Q3JlYXRlKGxhc3RNb2RpZmllZFdvcmQuczJSYW5nZS5lbmRFeGNsdXNpdmUsIHMyUmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWRXb3JkLmRlbGV0ZWQgKz0gKF9hID0gczFBZGRlZCA9PT0gbnVsbCB8fCBzMUFkZGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzMUFkZGVkLmxlbmd0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkV29yZC5hZGRlZCArPSAoX2IgPSBzMkFkZGVkID09PSBudWxsIHx8IHMyQWRkZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHMyQWRkZWQubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWRXb3JkLnMxUmFuZ2UgPSBsYXN0TW9kaWZpZWRXb3JkLnMxUmFuZ2Uuam9pbihzMVJhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkV29yZC5zMlJhbmdlID0gbGFzdE1vZGlmaWVkV29yZC5zMlJhbmdlLmpvaW4oczJSYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXliZVB1c2hXb3JkVG9BZGRpdGlvbmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZFdvcmQgPSB7IGFkZGVkOiAwLCBkZWxldGVkOiAwLCBjb3VudDogMCwgczFSYW5nZTogczFSYW5nZSwgczJSYW5nZTogczJSYW5nZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRTMSA9IHMxUmFuZ2UuaW50ZXJzZWN0KHMuc2VxMVJhbmdlKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRTMiA9IHMyUmFuZ2UuaW50ZXJzZWN0KHMuc2VxMlJhbmdlKTtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZFdvcmQuY291bnQrKztcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZFdvcmQuZGVsZXRlZCArPSAoX2MgPSBjaGFuZ2VkUzEgPT09IG51bGwgfHwgY2hhbmdlZFMxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGFuZ2VkUzEubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkV29yZC5hZGRlZCArPSAoX2QgPSBjaGFuZ2VkUzIgPT09IG51bGwgfHwgY2hhbmdlZFMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGFuZ2VkUzIubGVuZ3RoKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHcxQmVmb3JlID0gc2VxdWVuY2UxLmZpbmRXb3JkQ29udGFpbmluZyhzLnNlcTFSYW5nZS5zdGFydCAtIDEpO1xuICAgICAgICBjb25zdCB3MkJlZm9yZSA9IHNlcXVlbmNlMi5maW5kV29yZENvbnRhaW5pbmcocy5zZXEyUmFuZ2Uuc3RhcnQgLSAxKTtcbiAgICAgICAgY29uc3QgdzFBZnRlciA9IHNlcXVlbmNlMS5maW5kV29yZENvbnRhaW5pbmcocy5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlKTtcbiAgICAgICAgY29uc3QgdzJBZnRlciA9IHNlcXVlbmNlMi5maW5kV29yZENvbnRhaW5pbmcocy5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlKTtcbiAgICAgICAgaWYgKHcxQmVmb3JlICYmIHcxQWZ0ZXIgJiYgdzJCZWZvcmUgJiYgdzJBZnRlciAmJiB3MUJlZm9yZS5lcXVhbHModzFBZnRlcikgJiYgdzJCZWZvcmUuZXF1YWxzKHcyQWZ0ZXIpKSB7XG4gICAgICAgICAgICBwcm9jZXNzV29yZCh3MUJlZm9yZSwgdzJCZWZvcmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHcxQmVmb3JlICYmIHcyQmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1dvcmQodzFCZWZvcmUsIHcyQmVmb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3MUFmdGVyICYmIHcyQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzV29yZCh3MUFmdGVyLCB3MkFmdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBtYXliZVB1c2hXb3JkVG9BZGRpdGlvbmFsKCk7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VTZXF1ZW5jZURpZmZzKHNlcXVlbmNlRGlmZnMsIGFkZGl0aW9uYWwpO1xuICAgIHJldHVybiBtZXJnZWQ7XG59XG5mdW5jdGlvbiBtZXJnZVNlcXVlbmNlRGlmZnMoc2VxdWVuY2VEaWZmczEsIHNlcXVlbmNlRGlmZnMyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKHNlcXVlbmNlRGlmZnMxLmxlbmd0aCA+IDAgfHwgc2VxdWVuY2VEaWZmczIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBzZDEgPSBzZXF1ZW5jZURpZmZzMVswXTtcbiAgICAgICAgY29uc3Qgc2QyID0gc2VxdWVuY2VEaWZmczJbMF07XG4gICAgICAgIGxldCBuZXh0O1xuICAgICAgICBpZiAoc2QxICYmICghc2QyIHx8IHNkMS5zZXExUmFuZ2Uuc3RhcnQgPCBzZDIuc2VxMVJhbmdlLnN0YXJ0KSkge1xuICAgICAgICAgICAgbmV4dCA9IHNlcXVlbmNlRGlmZnMxLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXh0ID0gc2VxdWVuY2VEaWZmczIuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDAgJiYgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlID49IG5leHQuc2VxMVJhbmdlLnN0YXJ0KSB7XG4gICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS5qb2luKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsaW5lUmFuZ2VNYXBwaW5nRnJvbVJhbmdlTWFwcGluZ3MoYWxpZ25tZW50cywgb3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcywgZG9udEFzc2VydFN0YXJ0TGluZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hhbmdlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZyBvZiBncm91cChhbGlnbm1lbnRzLm1hcChhID0+IGdldExpbmVSYW5nZU1hcHBpbmcoYSwgb3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcykpLCAoYTEsIGEyKSA9PiBhMS5vcmlnaW5hbFJhbmdlLm92ZXJsYXBPclRvdWNoKGEyLm9yaWdpbmFsUmFuZ2UpXG4gICAgICAgIHx8IGExLm1vZGlmaWVkUmFuZ2Uub3ZlcmxhcE9yVG91Y2goYTIubW9kaWZpZWRSYW5nZSkpKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gZ1swXTtcbiAgICAgICAgY29uc3QgbGFzdCA9IGdbZy5sZW5ndGggLSAxXTtcbiAgICAgICAgY2hhbmdlcy5wdXNoKG5ldyBMaW5lUmFuZ2VNYXBwaW5nKGZpcnN0Lm9yaWdpbmFsUmFuZ2Uuam9pbihsYXN0Lm9yaWdpbmFsUmFuZ2UpLCBmaXJzdC5tb2RpZmllZFJhbmdlLmpvaW4obGFzdC5tb2RpZmllZFJhbmdlKSwgZy5tYXAoYSA9PiBhLmlubmVyQ2hhbmdlc1swXSkpKTtcbiAgICB9XG4gICAgYXNzZXJ0Rm4oKCkgPT4ge1xuICAgICAgICBpZiAoIWRvbnRBc3NlcnRTdGFydExpbmUpIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDAgJiYgY2hhbmdlc1swXS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlciAhPT0gY2hhbmdlc1swXS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hlY2tBZGphY2VudEl0ZW1zKGNoYW5nZXMsIChtMSwgbTIpID0+IG0yLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gbTEub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlID09PSBtMi5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlciAtIG0xLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSAmJlxuICAgICAgICAgICAgLy8gVGhlcmUgaGFzIHRvIGJlIGFuIHVuY2hhbmdlZCBsaW5lIGluIGJldHdlZW4gKG90aGVyd2lzZSBib3RoIGRpZmZzIHNob3VsZCBoYXZlIGJlZW4gam9pbmVkKVxuICAgICAgICAgICAgbTEub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlIDwgbTIub3JpZ2luYWxSYW5nZS5zdGFydExpbmVOdW1iZXIgJiZcbiAgICAgICAgICAgIG0xLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSA8IG0yLm1vZGlmaWVkUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lUmFuZ2VNYXBwaW5nKHJhbmdlTWFwcGluZywgb3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcykge1xuICAgIGxldCBsaW5lU3RhcnREZWx0YSA9IDA7XG4gICAgbGV0IGxpbmVFbmREZWx0YSA9IDA7XG4gICAgLy8gcmFuZ2VNYXBwaW5nIGRlc2NyaWJlcyB0aGUgZWRpdCB0aGF0IHJlcGxhY2VzIGByYW5nZU1hcHBpbmcub3JpZ2luYWxSYW5nZWAgd2l0aCBgbmV3VGV4dCA6PSBnZXRUZXh0KG1vZGlmaWVkTGluZXMsIHJhbmdlTWFwcGluZy5tb2RpZmllZFJhbmdlKWAuXG4gICAgLy8gb3JpZ2luYWw6IF14eHggXFxuIDwtIHRoaXMgbGluZSBpcyBub3QgbW9kaWZpZWRcbiAgICAvLyBtb2RpZmllZDogXXh4ICBcXG5cbiAgICBpZiAocmFuZ2VNYXBwaW5nLm1vZGlmaWVkUmFuZ2UuZW5kQ29sdW1uID09PSAxICYmIHJhbmdlTWFwcGluZy5vcmlnaW5hbFJhbmdlLmVuZENvbHVtbiA9PT0gMVxuICAgICAgICAmJiByYW5nZU1hcHBpbmcub3JpZ2luYWxSYW5nZS5zdGFydExpbmVOdW1iZXIgKyBsaW5lU3RhcnREZWx0YSA8PSByYW5nZU1hcHBpbmcub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyXG4gICAgICAgICYmIHJhbmdlTWFwcGluZy5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlciArIGxpbmVTdGFydERlbHRhIDw9IHJhbmdlTWFwcGluZy5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXIpIHtcbiAgICAgICAgLy8gV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgcmFuZ2UgaXMgbm90IGVtcHR5IHlldFxuICAgICAgICBsaW5lRW5kRGVsdGEgPSAtMTtcbiAgICB9XG4gICAgLy8gb3JpZ2luYWw6IHh4eFsgXFxuIDwtIHRoaXMgbGluZSBpcyBub3QgbW9kaWZpZWRcbiAgICAvLyBtb2RpZmllZDogeHh4WyBcXG5cbiAgICBpZiAocmFuZ2VNYXBwaW5nLm1vZGlmaWVkUmFuZ2Uuc3RhcnRDb2x1bW4gLSAxID49IG1vZGlmaWVkTGluZXNbcmFuZ2VNYXBwaW5nLm1vZGlmaWVkUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMV0ubGVuZ3RoXG4gICAgICAgICYmIHJhbmdlTWFwcGluZy5vcmlnaW5hbFJhbmdlLnN0YXJ0Q29sdW1uIC0gMSA+PSBvcmlnaW5hbExpbmVzW3JhbmdlTWFwcGluZy5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlciAtIDFdLmxlbmd0aFxuICAgICAgICAmJiByYW5nZU1hcHBpbmcub3JpZ2luYWxSYW5nZS5zdGFydExpbmVOdW1iZXIgPD0gcmFuZ2VNYXBwaW5nLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlciArIGxpbmVFbmREZWx0YVxuICAgICAgICAmJiByYW5nZU1hcHBpbmcubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIgPD0gcmFuZ2VNYXBwaW5nLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlciArIGxpbmVFbmREZWx0YSkge1xuICAgICAgICAvLyBXZSBjYW4gb25seSBkbyB0aGlzIGlmIHRoZSByYW5nZSBpcyBub3QgZW1wdHkgeWV0XG4gICAgICAgIGxpbmVTdGFydERlbHRhID0gMTtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxMaW5lUmFuZ2UgPSBuZXcgTGluZVJhbmdlKHJhbmdlTWFwcGluZy5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlciArIGxpbmVTdGFydERlbHRhLCByYW5nZU1hcHBpbmcub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyICsgMSArIGxpbmVFbmREZWx0YSk7XG4gICAgY29uc3QgbW9kaWZpZWRMaW5lUmFuZ2UgPSBuZXcgTGluZVJhbmdlKHJhbmdlTWFwcGluZy5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlciArIGxpbmVTdGFydERlbHRhLCByYW5nZU1hcHBpbmcubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyICsgMSArIGxpbmVFbmREZWx0YSk7XG4gICAgcmV0dXJuIG5ldyBMaW5lUmFuZ2VNYXBwaW5nKG9yaWdpbmFsTGluZVJhbmdlLCBtb2RpZmllZExpbmVSYW5nZSwgW3JhbmdlTWFwcGluZ10pO1xufVxuZnVuY3Rpb24qIGdyb3VwKGl0ZW1zLCBzaG91bGRCZUdyb3VwZWQpIHtcbiAgICBsZXQgY3VycmVudEdyb3VwO1xuICAgIGxldCBsYXN0O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBpZiAobGFzdCAhPT0gdW5kZWZpbmVkICYmIHNob3VsZEJlR3JvdXBlZChsYXN0LCBpdGVtKSkge1xuICAgICAgICAgICAgY3VycmVudEdyb3VwLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgY3VycmVudEdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudEdyb3VwID0gW2l0ZW1dO1xuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSBpdGVtO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEdyb3VwKSB7XG4gICAgICAgIHlpZWxkIGN1cnJlbnRHcm91cDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTGluZVNlcXVlbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0cmltbWVkSGFzaCwgbGluZXMpIHtcbiAgICAgICAgdGhpcy50cmltbWVkSGFzaCA9IHRyaW1tZWRIYXNoO1xuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XG4gICAgfVxuICAgIGdldEVsZW1lbnQob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyaW1tZWRIYXNoW29mZnNldF07XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyaW1tZWRIYXNoLmxlbmd0aDtcbiAgICB9XG4gICAgZ2V0Qm91bmRhcnlTY29yZShsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgaW5kZW50YXRpb25CZWZvcmUgPSBsZW5ndGggPT09IDAgPyAwIDogZ2V0SW5kZW50YXRpb24odGhpcy5saW5lc1tsZW5ndGggLSAxXSk7XG4gICAgICAgIGNvbnN0IGluZGVudGF0aW9uQWZ0ZXIgPSBsZW5ndGggPT09IHRoaXMubGluZXMubGVuZ3RoID8gMCA6IGdldEluZGVudGF0aW9uKHRoaXMubGluZXNbbGVuZ3RoXSk7XG4gICAgICAgIHJldHVybiAxMDAwIC0gKGluZGVudGF0aW9uQmVmb3JlICsgaW5kZW50YXRpb25BZnRlcik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0SW5kZW50YXRpb24oc3RyKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgc3RyLmxlbmd0aCAmJiAoc3RyLmNoYXJDb2RlQXQoaSkgPT09IDMyIC8qIENoYXJDb2RlLlNwYWNlICovIHx8IHN0ci5jaGFyQ29kZUF0KGkpID09PSA5IC8qIENoYXJDb2RlLlRhYiAqLykpIHtcbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbn1cbmV4cG9ydCBjbGFzcyBMaW5lc1NsaWNlQ2hhclNlcXVlbmNlIHtcbiAgICBjb25zdHJ1Y3RvcihsaW5lcywgbGluZVJhbmdlLCBjb25zaWRlcldoaXRlc3BhY2VDaGFuZ2VzKSB7XG4gICAgICAgIC8vIFRoaXMgc2xpY2UgaGFzIHRvIGhhdmUgbGluZVJhbmdlLmxlbmd0aCBtYW55IFxcbiEgKG90aGVyd2lzZSBkaWZmaW5nIGFnYWluc3QgYW4gZW1wdHkgc2xpY2Ugd2lsbCBiZSBwcm9ibGVtYXRpYylcbiAgICAgICAgLy8gKFVubGVzcyBpdCBjb3ZlcnMgdGhlIGVudGlyZSBkb2N1bWVudCwgaW4gdGhhdCBjYXNlIHRoZSBvdGhlciBzbGljZSBhbHNvIGhhcyB0byBjb3ZlciB0aGUgZW50aXJlIGRvY3VtZW50IGFuZHMgaXQncyBva2F5KVxuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XG4gICAgICAgIHRoaXMuY29uc2lkZXJXaGl0ZXNwYWNlQ2hhbmdlcyA9IGNvbnNpZGVyV2hpdGVzcGFjZUNoYW5nZXM7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5maXJzdENoYXJPZmZzZXRCeUxpbmVNaW51c09uZSA9IFtdO1xuICAgICAgICAvLyBUbyBhY2NvdW50IGZvciB0cmltbWluZ1xuICAgICAgICB0aGlzLm9mZnNldEJ5TGluZSA9IFtdO1xuICAgICAgICAvLyBJZiB0aGUgc2xpY2UgY292ZXJzIHRoZSBlbmQsIGJ1dCBkb2VzIG5vdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLCB3ZSBpbmNsdWRlIGp1c3QgdGhlIFxcbiBvZiB0aGUgcHJldmlvdXMgbGluZS5cbiAgICAgICAgbGV0IHRyaW1GaXJzdExpbmVGdWxseSA9IGZhbHNlO1xuICAgICAgICBpZiAobGluZVJhbmdlLnN0YXJ0ID4gMCAmJiBsaW5lUmFuZ2UuZW5kRXhjbHVzaXZlID49IGxpbmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGluZVJhbmdlID0gbmV3IE9mZnNldFJhbmdlKGxpbmVSYW5nZS5zdGFydCAtIDEsIGxpbmVSYW5nZS5lbmRFeGNsdXNpdmUpO1xuICAgICAgICAgICAgdHJpbUZpcnN0TGluZUZ1bGx5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpbmVSYW5nZSA9IGxpbmVSYW5nZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGluZVJhbmdlLnN0YXJ0OyBpIDwgdGhpcy5saW5lUmFuZ2UuZW5kRXhjbHVzaXZlOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGlmICh0cmltRmlyc3RMaW5lRnVsbHkpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsaW5lID0gJyc7XG4gICAgICAgICAgICAgICAgdHJpbUZpcnN0TGluZUZ1bGx5ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghY29uc2lkZXJXaGl0ZXNwYWNlQ2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWRTdGFydExpbmUgPSBsaW5lLnRyaW1TdGFydCgpO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGxpbmUubGVuZ3RoIC0gdHJpbW1lZFN0YXJ0TGluZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGluZSA9IHRyaW1tZWRTdGFydExpbmUudHJpbUVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vZmZzZXRCeUxpbmUucHVzaChvZmZzZXQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKGxpbmUuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEb24ndCBhZGQgYW4gXFxuIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRvY3VtZW50LlxuICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKCdcXG4nLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RDaGFyT2Zmc2V0QnlMaW5lTWludXNPbmVbaSAtIHRoaXMubGluZVJhbmdlLnN0YXJ0XSA9IHRoaXMuZWxlbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRvIGFjY291bnQgZm9yIHRoZSBsYXN0IGxpbmVcbiAgICAgICAgdGhpcy5vZmZzZXRCeUxpbmUucHVzaCgwKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgU2xpY2U6IFwiJHt0aGlzLnRleHR9XCJgO1xuICAgIH1cbiAgICBnZXQgdGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dChuZXcgT2Zmc2V0UmFuZ2UoMCwgdGhpcy5sZW5ndGgpKTtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5zbGljZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kRXhjbHVzaXZlKS5tYXAoZSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKS5qb2luKCcnKTtcbiAgICB9XG4gICAgZ2V0RWxlbWVudChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbb2Zmc2V0XTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMubGVuZ3RoO1xuICAgIH1cbiAgICBnZXRCb3VuZGFyeVNjb3JlKGxlbmd0aCkge1xuICAgICAgICAvLyAgIGEgICBiICAgYyAgICwgICAgICAgICAgIGQgICBlICAgZlxuICAgICAgICAvLyAxMSAgMCAgIDAgICAxMiAgMTUgIDYgICAxMyAgMCAgIDAgICAxMVxuICAgICAgICBjb25zdCBwcmV2Q2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShsZW5ndGggPiAwID8gdGhpcy5lbGVtZW50c1tsZW5ndGggLSAxXSA6IC0xKTtcbiAgICAgICAgY29uc3QgbmV4dENhdGVnb3J5ID0gZ2V0Q2F0ZWdvcnkobGVuZ3RoIDwgdGhpcy5lbGVtZW50cy5sZW5ndGggPyB0aGlzLmVsZW1lbnRzW2xlbmd0aF0gOiAtMSk7XG4gICAgICAgIGlmIChwcmV2Q2F0ZWdvcnkgPT09IDYgLyogQ2hhckJvdW5kYXJ5Q2F0ZWdvcnkuTGluZUJyZWFrQ1IgKi8gJiYgbmV4dENhdGVnb3J5ID09PSA3IC8qIENoYXJCb3VuZGFyeUNhdGVnb3J5LkxpbmVCcmVha0xGICovKSB7XG4gICAgICAgICAgICAvLyBkb24ndCBicmVhayBiZXR3ZWVuIFxcciBhbmQgXFxuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2NvcmUgPSAwO1xuICAgICAgICBpZiAocHJldkNhdGVnb3J5ICE9PSBuZXh0Q2F0ZWdvcnkpIHtcbiAgICAgICAgICAgIHNjb3JlICs9IDEwO1xuICAgICAgICAgICAgaWYgKG5leHRDYXRlZ29yeSA9PT0gMSAvKiBDaGFyQm91bmRhcnlDYXRlZ29yeS5Xb3JkVXBwZXIgKi8pIHtcbiAgICAgICAgICAgICAgICBzY29yZSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjb3JlICs9IGdldENhdGVnb3J5Qm91bmRhcnlTY29yZShwcmV2Q2F0ZWdvcnkpO1xuICAgICAgICBzY29yZSArPSBnZXRDYXRlZ29yeUJvdW5kYXJ5U2NvcmUobmV4dENhdGVnb3J5KTtcbiAgICAgICAgcmV0dXJuIHNjb3JlO1xuICAgIH1cbiAgICB0cmFuc2xhdGVPZmZzZXQob2Zmc2V0KSB7XG4gICAgICAgIC8vIGZpbmQgc21hbGxlc3QgaSwgc28gdGhhdCBsaW5lQnJlYWtPZmZzZXRzW2ldIDw9IG9mZnNldCB1c2luZyBiaW5hcnkgc2VhcmNoXG4gICAgICAgIGlmICh0aGlzLmxpbmVSYW5nZS5pc0VtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMubGluZVJhbmdlLnN0YXJ0ICsgMSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgaiA9IHRoaXMuZmlyc3RDaGFyT2Zmc2V0QnlMaW5lTWludXNPbmUubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBNYXRoLmZsb29yKChpICsgaikgLyAyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0Q2hhck9mZnNldEJ5TGluZU1pbnVzT25lW2tdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaiA9IGs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gayArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2Zmc2V0T2ZGaXJzdENoYXJJbkxpbmUgPSBpID09PSAwID8gMCA6IHRoaXMuZmlyc3RDaGFyT2Zmc2V0QnlMaW5lTWludXNPbmVbaSAtIDFdO1xuICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMubGluZVJhbmdlLnN0YXJ0ICsgaSArIDEsIG9mZnNldCAtIG9mZnNldE9mRmlyc3RDaGFySW5MaW5lICsgMSArIHRoaXMub2Zmc2V0QnlMaW5lW2ldKTtcbiAgICB9XG4gICAgdHJhbnNsYXRlUmFuZ2UocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb3NpdGlvbnModGhpcy50cmFuc2xhdGVPZmZzZXQocmFuZ2Uuc3RhcnQpLCB0aGlzLnRyYW5zbGF0ZU9mZnNldChyYW5nZS5lbmRFeGNsdXNpdmUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHdvcmQgdGhhdCBjb250YWlucyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBvZmZzZXRcbiAgICAgKi9cbiAgICBmaW5kV29yZENvbnRhaW5pbmcob2Zmc2V0KSB7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSB0aGlzLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzV29yZENoYXIodGhpcy5lbGVtZW50c1tvZmZzZXRdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIHN0YXJ0XG4gICAgICAgIGxldCBzdGFydCA9IG9mZnNldDtcbiAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCAmJiBpc1dvcmRDaGFyKHRoaXMuZWxlbWVudHNbc3RhcnQgLSAxXSkpIHtcbiAgICAgICAgICAgIHN0YXJ0LS07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmluZCBlbmRcbiAgICAgICAgbGV0IGVuZCA9IG9mZnNldDtcbiAgICAgICAgd2hpbGUgKGVuZCA8IHRoaXMuZWxlbWVudHMubGVuZ3RoICYmIGlzV29yZENoYXIodGhpcy5lbGVtZW50c1tlbmRdKSkge1xuICAgICAgICAgICAgZW5kKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBPZmZzZXRSYW5nZShzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgY291bnRMaW5lc0luKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9mZnNldChyYW5nZS5lbmRFeGNsdXNpdmUpLmxpbmVOdW1iZXIgLSB0aGlzLnRyYW5zbGF0ZU9mZnNldChyYW5nZS5zdGFydCkubGluZU51bWJlcjtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1dvcmRDaGFyKGNoYXJDb2RlKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlID49IDk3IC8qIENoYXJDb2RlLmEgKi8gJiYgY2hhckNvZGUgPD0gMTIyIC8qIENoYXJDb2RlLnogKi9cbiAgICAgICAgfHwgY2hhckNvZGUgPj0gNjUgLyogQ2hhckNvZGUuQSAqLyAmJiBjaGFyQ29kZSA8PSA5MCAvKiBDaGFyQ29kZS5aICovXG4gICAgICAgIHx8IGNoYXJDb2RlID49IDQ4IC8qIENoYXJDb2RlLkRpZ2l0MCAqLyAmJiBjaGFyQ29kZSA8PSA1NyAvKiBDaGFyQ29kZS5EaWdpdDkgKi87XG59XG5jb25zdCBzY29yZSA9IHtcbiAgICBbMCAvKiBDaGFyQm91bmRhcnlDYXRlZ29yeS5Xb3JkTG93ZXIgKi9dOiAwLFxuICAgIFsxIC8qIENoYXJCb3VuZGFyeUNhdGVnb3J5LldvcmRVcHBlciAqL106IDAsXG4gICAgWzIgLyogQ2hhckJvdW5kYXJ5Q2F0ZWdvcnkuV29yZE51bWJlciAqL106IDAsXG4gICAgWzMgLyogQ2hhckJvdW5kYXJ5Q2F0ZWdvcnkuRW5kICovXTogMTAsXG4gICAgWzQgLyogQ2hhckJvdW5kYXJ5Q2F0ZWdvcnkuT3RoZXIgKi9dOiAyLFxuICAgIFs1IC8qIENoYXJCb3VuZGFyeUNhdGVnb3J5LlNwYWNlICovXTogMyxcbiAgICBbNiAvKiBDaGFyQm91bmRhcnlDYXRlZ29yeS5MaW5lQnJlYWtDUiAqL106IDEwLFxuICAgIFs3IC8qIENoYXJCb3VuZGFyeUNhdGVnb3J5LkxpbmVCcmVha0xGICovXTogMTAsXG59O1xuZnVuY3Rpb24gZ2V0Q2F0ZWdvcnlCb3VuZGFyeVNjb3JlKGNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIHNjb3JlW2NhdGVnb3J5XTtcbn1cbmZ1bmN0aW9uIGdldENhdGVnb3J5KGNoYXJDb2RlKSB7XG4gICAgaWYgKGNoYXJDb2RlID09PSAxMCAvKiBDaGFyQ29kZS5MaW5lRmVlZCAqLykge1xuICAgICAgICByZXR1cm4gNyAvKiBDaGFyQm91bmRhcnlDYXRlZ29yeS5MaW5lQnJlYWtMRiAqLztcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hhckNvZGUgPT09IDEzIC8qIENoYXJDb2RlLkNhcnJpYWdlUmV0dXJuICovKSB7XG4gICAgICAgIHJldHVybiA2IC8qIENoYXJCb3VuZGFyeUNhdGVnb3J5LkxpbmVCcmVha0NSICovO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1NwYWNlKGNoYXJDb2RlKSkge1xuICAgICAgICByZXR1cm4gNSAvKiBDaGFyQm91bmRhcnlDYXRlZ29yeS5TcGFjZSAqLztcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hhckNvZGUgPj0gOTcgLyogQ2hhckNvZGUuYSAqLyAmJiBjaGFyQ29kZSA8PSAxMjIgLyogQ2hhckNvZGUueiAqLykge1xuICAgICAgICByZXR1cm4gMCAvKiBDaGFyQm91bmRhcnlDYXRlZ29yeS5Xb3JkTG93ZXIgKi87XG4gICAgfVxuICAgIGVsc2UgaWYgKGNoYXJDb2RlID49IDY1IC8qIENoYXJDb2RlLkEgKi8gJiYgY2hhckNvZGUgPD0gOTAgLyogQ2hhckNvZGUuWiAqLykge1xuICAgICAgICByZXR1cm4gMSAvKiBDaGFyQm91bmRhcnlDYXRlZ29yeS5Xb3JkVXBwZXIgKi87XG4gICAgfVxuICAgIGVsc2UgaWYgKGNoYXJDb2RlID49IDQ4IC8qIENoYXJDb2RlLkRpZ2l0MCAqLyAmJiBjaGFyQ29kZSA8PSA1NyAvKiBDaGFyQ29kZS5EaWdpdDkgKi8pIHtcbiAgICAgICAgcmV0dXJuIDIgLyogQ2hhckJvdW5kYXJ5Q2F0ZWdvcnkuV29yZE51bWJlciAqLztcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hhckNvZGUgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiAzIC8qIENoYXJCb3VuZGFyeUNhdGVnb3J5LkVuZCAqLztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiA0IC8qIENoYXJCb3VuZGFyeUNhdGVnb3J5Lk90aGVyICovO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzU3BhY2UoY2hhckNvZGUpIHtcbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDMyIC8qIENoYXJDb2RlLlNwYWNlICovIHx8IGNoYXJDb2RlID09PSA5IC8qIENoYXJDb2RlLlRhYiAqLztcbn1cbmNvbnN0IGNocktleXMgPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiBnZXRLZXkoY2hyKSB7XG4gICAgbGV0IGtleSA9IGNocktleXMuZ2V0KGNocik7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleSA9IGNocktleXMuc2l6ZTtcbiAgICAgICAgY2hyS2V5cy5zZXQoY2hyLCBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xufVxuY2xhc3MgTGluZVJhbmdlRnJhZ21lbnQge1xuICAgIGNvbnN0cnVjdG9yKHJhbmdlLCBsaW5lcykge1xuICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgICAgICAgdGhpcy5oaXN0b2dyYW0gPSBbXTtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMTsgaSA8IHJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUgLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICBjb25zdCBjaHIgPSBsaW5lW2pdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGdldEtleShjaHIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9ncmFtW2tleV0gPSAodGhpcy5oaXN0b2dyYW1ba2V5XSB8fCAwKSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBnZXRLZXkoJ1xcbicpO1xuICAgICAgICAgICAgdGhpcy5oaXN0b2dyYW1ba2V5XSA9ICh0aGlzLmhpc3RvZ3JhbVtrZXldIHx8IDApICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSBjb3VudGVyO1xuICAgIH1cbiAgICBjb21wdXRlU2ltaWxhcml0eShvdGhlcikge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBsZXQgc3VtRGlmZmVyZW5jZXMgPSAwO1xuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCh0aGlzLmhpc3RvZ3JhbS5sZW5ndGgsIG90aGVyLmhpc3RvZ3JhbS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdW1EaWZmZXJlbmNlcyArPSBNYXRoLmFicygoKF9hID0gdGhpcy5oaXN0b2dyYW1baV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApIC0gKChfYiA9IG90aGVyLmhpc3RvZ3JhbVtpXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxIC0gKHN1bURpZmZlcmVuY2VzIC8gKHRoaXMudG90YWxDb3VudCArIG90aGVyLnRvdGFsQ291bnQpKTtcbiAgICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IFNtYXJ0TGluZXNEaWZmQ29tcHV0ZXIgfSBmcm9tICcuL3NtYXJ0TGluZXNEaWZmQ29tcHV0ZXIuanMnO1xuaW1wb3J0IHsgU3RhbmRhcmRMaW5lc0RpZmZDb21wdXRlciB9IGZyb20gJy4vc3RhbmRhcmRMaW5lc0RpZmZDb21wdXRlci5qcyc7XG5leHBvcnQgY29uc3QgbGluZXNEaWZmQ29tcHV0ZXJzID0ge1xuICAgIGdldExlZ2FjeTogKCkgPT4gbmV3IFNtYXJ0TGluZXNEaWZmQ29tcHV0ZXIoKSxcbiAgICBnZXRBZHZhbmNlZDogKCkgPT4gbmV3IFN0YW5kYXJkTGluZXNEaWZmQ29tcHV0ZXIoKSxcbn07XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIHJvdW5kRmxvYXQobnVtYmVyLCBkZWNpbWFsUG9pbnRzKSB7XG4gICAgY29uc3QgZGVjaW1hbCA9IE1hdGgucG93KDEwLCBkZWNpbWFsUG9pbnRzKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIgKiBkZWNpbWFsKSAvIGRlY2ltYWw7XG59XG5leHBvcnQgY2xhc3MgUkdCQSB7XG4gICAgY29uc3RydWN0b3IociwgZywgYiwgYSA9IDEpIHtcbiAgICAgICAgdGhpcy5fcmdiYUJyYW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnIgPSBNYXRoLm1pbigyNTUsIE1hdGgubWF4KDAsIHIpKSB8IDA7XG4gICAgICAgIHRoaXMuZyA9IE1hdGgubWluKDI1NSwgTWF0aC5tYXgoMCwgZykpIHwgMDtcbiAgICAgICAgdGhpcy5iID0gTWF0aC5taW4oMjU1LCBNYXRoLm1heCgwLCBiKSkgfCAwO1xuICAgICAgICB0aGlzLmEgPSByb3VuZEZsb2F0KE1hdGgubWF4KE1hdGgubWluKDEsIGEpLCAwKSwgMyk7XG4gICAgfVxuICAgIHN0YXRpYyBlcXVhbHMoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5yID09PSBiLnIgJiYgYS5nID09PSBiLmcgJiYgYS5iID09PSBiLmIgJiYgYS5hID09PSBiLmE7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEhTTEEge1xuICAgIGNvbnN0cnVjdG9yKGgsIHMsIGwsIGEpIHtcbiAgICAgICAgdGhpcy5faHNsYUJyYW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmggPSBNYXRoLm1heChNYXRoLm1pbigzNjAsIGgpLCAwKSB8IDA7XG4gICAgICAgIHRoaXMucyA9IHJvdW5kRmxvYXQoTWF0aC5tYXgoTWF0aC5taW4oMSwgcyksIDApLCAzKTtcbiAgICAgICAgdGhpcy5sID0gcm91bmRGbG9hdChNYXRoLm1heChNYXRoLm1pbigxLCBsKSwgMCksIDMpO1xuICAgICAgICB0aGlzLmEgPSByb3VuZEZsb2F0KE1hdGgubWF4KE1hdGgubWluKDEsIGEpLCAwKSwgMyk7XG4gICAgfVxuICAgIHN0YXRpYyBlcXVhbHMoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5oID09PSBiLmggJiYgYS5zID09PSBiLnMgJiYgYS5sID09PSBiLmwgJiYgYS5hID09PSBiLmE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIFJHQiBjb2xvciB2YWx1ZSB0byBIU0wuIENvbnZlcnNpb24gZm9ybXVsYVxuICAgICAqIGFkYXB0ZWQgZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hTTF9jb2xvcl9zcGFjZS5cbiAgICAgKiBBc3N1bWVzIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XSBhbmRcbiAgICAgKiByZXR1cm5zIGggaW4gdGhlIHNldCBbMCwgMzYwXSwgcywgYW5kIGwgaW4gdGhlIHNldCBbMCwgMV0uXG4gICAgICovXG4gICAgc3RhdGljIGZyb21SR0JBKHJnYmEpIHtcbiAgICAgICAgY29uc3QgciA9IHJnYmEuciAvIDI1NTtcbiAgICAgICAgY29uc3QgZyA9IHJnYmEuZyAvIDI1NTtcbiAgICAgICAgY29uc3QgYiA9IHJnYmEuYiAvIDI1NTtcbiAgICAgICAgY29uc3QgYSA9IHJnYmEuYTtcbiAgICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG4gICAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuICAgICAgICBsZXQgaCA9IDA7XG4gICAgICAgIGxldCBzID0gMDtcbiAgICAgICAgY29uc3QgbCA9IChtaW4gKyBtYXgpIC8gMjtcbiAgICAgICAgY29uc3QgY2hyb21hID0gbWF4IC0gbWluO1xuICAgICAgICBpZiAoY2hyb21hID4gMCkge1xuICAgICAgICAgICAgcyA9IE1hdGgubWluKChsIDw9IDAuNSA/IGNocm9tYSAvICgyICogbCkgOiBjaHJvbWEgLyAoMiAtICgyICogbCkpKSwgMSk7XG4gICAgICAgICAgICBzd2l0Y2ggKG1heCkge1xuICAgICAgICAgICAgICAgIGNhc2UgcjpcbiAgICAgICAgICAgICAgICAgICAgaCA9IChnIC0gYikgLyBjaHJvbWEgKyAoZyA8IGIgPyA2IDogMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZzpcbiAgICAgICAgICAgICAgICAgICAgaCA9IChiIC0gcikgLyBjaHJvbWEgKyAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGI6XG4gICAgICAgICAgICAgICAgICAgIGggPSAociAtIGcpIC8gY2hyb21hICsgNDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoICo9IDYwO1xuICAgICAgICAgICAgaCA9IE1hdGgucm91bmQoaCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBIU0xBKGgsIHMsIGwsIGEpO1xuICAgIH1cbiAgICBzdGF0aWMgX2h1ZTJyZ2IocCwgcSwgdCkge1xuICAgICAgICBpZiAodCA8IDApIHtcbiAgICAgICAgICAgIHQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHQgLT0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCA8IDEgLyA2KSB7XG4gICAgICAgICAgICByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCA8IDEgLyAyKSB7XG4gICAgICAgICAgICByZXR1cm4gcTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCA8IDIgLyAzKSB7XG4gICAgICAgICAgICByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIEhTTCBjb2xvciB2YWx1ZSB0byBSR0IuIENvbnZlcnNpb24gZm9ybXVsYVxuICAgICAqIGFkYXB0ZWQgZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hTTF9jb2xvcl9zcGFjZS5cbiAgICAgKiBBc3N1bWVzIGggaW4gdGhlIHNldCBbMCwgMzYwXSBzLCBhbmQgbCBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDFdIGFuZFxuICAgICAqIHJldHVybnMgciwgZywgYW5kIGIgaW4gdGhlIHNldCBbMCwgMjU1XS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdG9SR0JBKGhzbGEpIHtcbiAgICAgICAgY29uc3QgaCA9IGhzbGEuaCAvIDM2MDtcbiAgICAgICAgY29uc3QgeyBzLCBsLCBhIH0gPSBoc2xhO1xuICAgICAgICBsZXQgciwgZywgYjtcbiAgICAgICAgaWYgKHMgPT09IDApIHtcbiAgICAgICAgICAgIHIgPSBnID0gYiA9IGw7IC8vIGFjaHJvbWF0aWNcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICAgICAgY29uc3QgcCA9IDIgKiBsIC0gcTtcbiAgICAgICAgICAgIHIgPSBIU0xBLl9odWUycmdiKHAsIHEsIGggKyAxIC8gMyk7XG4gICAgICAgICAgICBnID0gSFNMQS5faHVlMnJnYihwLCBxLCBoKTtcbiAgICAgICAgICAgIGIgPSBIU0xBLl9odWUycmdiKHAsIHEsIGggLSAxIC8gMyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSR0JBKE1hdGgucm91bmQociAqIDI1NSksIE1hdGgucm91bmQoZyAqIDI1NSksIE1hdGgucm91bmQoYiAqIDI1NSksIGEpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBIU1ZBIHtcbiAgICBjb25zdHJ1Y3RvcihoLCBzLCB2LCBhKSB7XG4gICAgICAgIHRoaXMuX2hzdmFCcmFuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5oID0gTWF0aC5tYXgoTWF0aC5taW4oMzYwLCBoKSwgMCkgfCAwO1xuICAgICAgICB0aGlzLnMgPSByb3VuZEZsb2F0KE1hdGgubWF4KE1hdGgubWluKDEsIHMpLCAwKSwgMyk7XG4gICAgICAgIHRoaXMudiA9IHJvdW5kRmxvYXQoTWF0aC5tYXgoTWF0aC5taW4oMSwgdiksIDApLCAzKTtcbiAgICAgICAgdGhpcy5hID0gcm91bmRGbG9hdChNYXRoLm1heChNYXRoLm1pbigxLCBhKSwgMCksIDMpO1xuICAgIH1cbiAgICBzdGF0aWMgZXF1YWxzKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEuaCA9PT0gYi5oICYmIGEucyA9PT0gYi5zICYmIGEudiA9PT0gYi52ICYmIGEuYSA9PT0gYi5hO1xuICAgIH1cbiAgICAvLyBmcm9tIGh0dHA6Ly93d3cucmFwaWR0YWJsZXMuY29tL2NvbnZlcnQvY29sb3IvcmdiLXRvLWhzdi5odG1cbiAgICBzdGF0aWMgZnJvbVJHQkEocmdiYSkge1xuICAgICAgICBjb25zdCByID0gcmdiYS5yIC8gMjU1O1xuICAgICAgICBjb25zdCBnID0gcmdiYS5nIC8gMjU1O1xuICAgICAgICBjb25zdCBiID0gcmdiYS5iIC8gMjU1O1xuICAgICAgICBjb25zdCBjbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG4gICAgICAgIGNvbnN0IGNtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICAgICAgY29uc3QgZGVsdGEgPSBjbWF4IC0gY21pbjtcbiAgICAgICAgY29uc3QgcyA9IGNtYXggPT09IDAgPyAwIDogKGRlbHRhIC8gY21heCk7XG4gICAgICAgIGxldCBtO1xuICAgICAgICBpZiAoZGVsdGEgPT09IDApIHtcbiAgICAgICAgICAgIG0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNtYXggPT09IHIpIHtcbiAgICAgICAgICAgIG0gPSAoKCgoZyAtIGIpIC8gZGVsdGEpICUgNikgKyA2KSAlIDY7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY21heCA9PT0gZykge1xuICAgICAgICAgICAgbSA9ICgoYiAtIHIpIC8gZGVsdGEpICsgMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG0gPSAoKHIgLSBnKSAvIGRlbHRhKSArIDQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBIU1ZBKE1hdGgucm91bmQobSAqIDYwKSwgcywgY21heCwgcmdiYS5hKTtcbiAgICB9XG4gICAgLy8gZnJvbSBodHRwOi8vd3d3LnJhcGlkdGFibGVzLmNvbS9jb252ZXJ0L2NvbG9yL2hzdi10by1yZ2IuaHRtXG4gICAgc3RhdGljIHRvUkdCQShoc3ZhKSB7XG4gICAgICAgIGNvbnN0IHsgaCwgcywgdiwgYSB9ID0gaHN2YTtcbiAgICAgICAgY29uc3QgYyA9IHYgKiBzO1xuICAgICAgICBjb25zdCB4ID0gYyAqICgxIC0gTWF0aC5hYnMoKGggLyA2MCkgJSAyIC0gMSkpO1xuICAgICAgICBjb25zdCBtID0gdiAtIGM7XG4gICAgICAgIGxldCBbciwgZywgYl0gPSBbMCwgMCwgMF07XG4gICAgICAgIGlmIChoIDwgNjApIHtcbiAgICAgICAgICAgIHIgPSBjO1xuICAgICAgICAgICAgZyA9IHg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaCA8IDEyMCkge1xuICAgICAgICAgICAgciA9IHg7XG4gICAgICAgICAgICBnID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoIDwgMTgwKSB7XG4gICAgICAgICAgICBnID0gYztcbiAgICAgICAgICAgIGIgPSB4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGggPCAyNDApIHtcbiAgICAgICAgICAgIGcgPSB4O1xuICAgICAgICAgICAgYiA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaCA8IDMwMCkge1xuICAgICAgICAgICAgciA9IHg7XG4gICAgICAgICAgICBiID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoIDw9IDM2MCkge1xuICAgICAgICAgICAgciA9IGM7XG4gICAgICAgICAgICBiID0geDtcbiAgICAgICAgfVxuICAgICAgICByID0gTWF0aC5yb3VuZCgociArIG0pICogMjU1KTtcbiAgICAgICAgZyA9IE1hdGgucm91bmQoKGcgKyBtKSAqIDI1NSk7XG4gICAgICAgIGIgPSBNYXRoLnJvdW5kKChiICsgbSkgKiAyNTUpO1xuICAgICAgICByZXR1cm4gbmV3IFJHQkEociwgZywgYiwgYSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbG9yIHtcbiAgICBzdGF0aWMgZnJvbUhleChoZXgpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yLkZvcm1hdC5DU1MucGFyc2VIZXgoaGV4KSB8fCBDb2xvci5yZWQ7XG4gICAgfVxuICAgIHN0YXRpYyBlcXVhbHMoYSwgYikge1xuICAgICAgICBpZiAoIWEgJiYgIWIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYSB8fCAhYikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhLmVxdWFscyhiKTtcbiAgICB9XG4gICAgZ2V0IGhzbGEoKSB7XG4gICAgICAgIGlmICh0aGlzLl9oc2xhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faHNsYTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBIU0xBLmZyb21SR0JBKHRoaXMucmdiYSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGhzdmEoKSB7XG4gICAgICAgIGlmICh0aGlzLl9oc3ZhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faHN2YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSFNWQS5mcm9tUkdCQSh0aGlzLnJnYmEpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihhcmcpIHtcbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3IgbmVlZHMgYSB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIFJHQkEpIHtcbiAgICAgICAgICAgIHRoaXMucmdiYSA9IGFyZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBIU0xBKSB7XG4gICAgICAgICAgICB0aGlzLl9oc2xhID0gYXJnO1xuICAgICAgICAgICAgdGhpcy5yZ2JhID0gSFNMQS50b1JHQkEoYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBIU1ZBKSB7XG4gICAgICAgICAgICB0aGlzLl9oc3ZhID0gYXJnO1xuICAgICAgICAgICAgdGhpcy5yZ2JhID0gSFNWQS50b1JHQkEoYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2xvciBjdG9yIGFyZ3VtZW50Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXF1YWxzKG90aGVyKSB7XG4gICAgICAgIHJldHVybiAhIW90aGVyICYmIFJHQkEuZXF1YWxzKHRoaXMucmdiYSwgb3RoZXIucmdiYSkgJiYgSFNMQS5lcXVhbHModGhpcy5oc2xhLCBvdGhlci5oc2xhKSAmJiBIU1ZBLmVxdWFscyh0aGlzLmhzdmEsIG90aGVyLmhzdmEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIGluIHRoZSBzZXQgWzAsIDFdLiBPID0+IERhcmtlc3QgQmxhY2suIDEgPT4gTGlnaHRlc3Qgd2hpdGUuXG4gICAgICovXG4gICAgZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKSB7XG4gICAgICAgIGNvbnN0IFIgPSBDb2xvci5fcmVsYXRpdmVMdW1pbmFuY2VGb3JDb21wb25lbnQodGhpcy5yZ2JhLnIpO1xuICAgICAgICBjb25zdCBHID0gQ29sb3IuX3JlbGF0aXZlTHVtaW5hbmNlRm9yQ29tcG9uZW50KHRoaXMucmdiYS5nKTtcbiAgICAgICAgY29uc3QgQiA9IENvbG9yLl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuYik7XG4gICAgICAgIGNvbnN0IGx1bWluYW5jZSA9IDAuMjEyNiAqIFIgKyAwLjcxNTIgKiBHICsgMC4wNzIyICogQjtcbiAgICAgICAgcmV0dXJuIHJvdW5kRmxvYXQobHVtaW5hbmNlLCA0KTtcbiAgICB9XG4gICAgc3RhdGljIF9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudChjb2xvcikge1xuICAgICAgICBjb25zdCBjID0gY29sb3IgLyAyNTU7XG4gICAgICAgIHJldHVybiAoYyA8PSAwLjAzOTI4KSA/IGMgLyAxMi45MiA6IE1hdGgucG93KCgoYyArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpcdGh0dHA6Ly8yNHdheXMub3JnLzIwMTAvY2FsY3VsYXRpbmctY29sb3ItY29udHJhc3RcbiAgICAgKiAgUmV0dXJuICd0cnVlJyBpZiBsaWdodGVyIGNvbG9yIG90aGVyd2lzZSAnZmFsc2UnXG4gICAgICovXG4gICAgaXNMaWdodGVyKCkge1xuICAgICAgICBjb25zdCB5aXEgPSAodGhpcy5yZ2JhLnIgKiAyOTkgKyB0aGlzLnJnYmEuZyAqIDU4NyArIHRoaXMucmdiYS5iICogMTE0KSAvIDEwMDA7XG4gICAgICAgIHJldHVybiB5aXEgPj0gMTI4O1xuICAgIH1cbiAgICBpc0xpZ2h0ZXJUaGFuKGFub3RoZXIpIHtcbiAgICAgICAgY29uc3QgbHVtMSA9IHRoaXMuZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgY29uc3QgbHVtMiA9IGFub3RoZXIuZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgcmV0dXJuIGx1bTEgPiBsdW0yO1xuICAgIH1cbiAgICBpc0RhcmtlclRoYW4oYW5vdGhlcikge1xuICAgICAgICBjb25zdCBsdW0xID0gdGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBjb25zdCBsdW0yID0gYW5vdGhlci5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICByZXR1cm4gbHVtMSA8IGx1bTI7XG4gICAgfVxuICAgIGxpZ2h0ZW4oZmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IobmV3IEhTTEEodGhpcy5oc2xhLmgsIHRoaXMuaHNsYS5zLCB0aGlzLmhzbGEubCArIHRoaXMuaHNsYS5sICogZmFjdG9yLCB0aGlzLmhzbGEuYSkpO1xuICAgIH1cbiAgICBkYXJrZW4oZmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IobmV3IEhTTEEodGhpcy5oc2xhLmgsIHRoaXMuaHNsYS5zLCB0aGlzLmhzbGEubCAtIHRoaXMuaHNsYS5sICogZmFjdG9yLCB0aGlzLmhzbGEuYSkpO1xuICAgIH1cbiAgICB0cmFuc3BhcmVudChmYWN0b3IpIHtcbiAgICAgICAgY29uc3QgeyByLCBnLCBiLCBhIH0gPSB0aGlzLnJnYmE7XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IobmV3IFJHQkEociwgZywgYiwgYSAqIGZhY3RvcikpO1xuICAgIH1cbiAgICBpc1RyYW5zcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZ2JhLmEgPT09IDA7XG4gICAgfVxuICAgIGlzT3BhcXVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZ2JhLmEgPT09IDE7XG4gICAgfVxuICAgIG9wcG9zaXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yKG5ldyBSR0JBKDI1NSAtIHRoaXMucmdiYS5yLCAyNTUgLSB0aGlzLnJnYmEuZywgMjU1IC0gdGhpcy5yZ2JhLmIsIHRoaXMucmdiYS5hKSk7XG4gICAgfVxuICAgIG1ha2VPcGFxdWUob3BhcXVlQmFja2dyb3VuZCkge1xuICAgICAgICBpZiAodGhpcy5pc09wYXF1ZSgpIHx8IG9wYXF1ZUJhY2tncm91bmQucmdiYS5hICE9PSAxKSB7XG4gICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRvIGJsZW5kIG9udG8gYSBub24tb3BhcXVlIGNvbG9yIG9udG8gYSBvcGFxdWUgY29sb3JcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gdGhpcy5yZ2JhO1xuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjIyODU0OC9maW5kaW5nLWVxdWl2YWxlbnQtY29sb3Itd2l0aC1vcGFjaXR5XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IobmV3IFJHQkEob3BhcXVlQmFja2dyb3VuZC5yZ2JhLnIgLSBhICogKG9wYXF1ZUJhY2tncm91bmQucmdiYS5yIC0gciksIG9wYXF1ZUJhY2tncm91bmQucmdiYS5nIC0gYSAqIChvcGFxdWVCYWNrZ3JvdW5kLnJnYmEuZyAtIGcpLCBvcGFxdWVCYWNrZ3JvdW5kLnJnYmEuYiAtIGEgKiAob3BhcXVlQmFja2dyb3VuZC5yZ2JhLmIgLSBiKSwgMSkpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b1N0cmluZykge1xuICAgICAgICAgICAgdGhpcy5fdG9TdHJpbmcgPSBDb2xvci5Gb3JtYXQuQ1NTLmZvcm1hdCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9TdHJpbmc7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRMaWdodGVyQ29sb3Iob2YsIHJlbGF0aXZlLCBmYWN0b3IpIHtcbiAgICAgICAgaWYgKG9mLmlzTGlnaHRlclRoYW4ocmVsYXRpdmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Y7XG4gICAgICAgIH1cbiAgICAgICAgZmFjdG9yID0gZmFjdG9yID8gZmFjdG9yIDogMC41O1xuICAgICAgICBjb25zdCBsdW0xID0gb2YuZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgY29uc3QgbHVtMiA9IHJlbGF0aXZlLmdldFJlbGF0aXZlTHVtaW5hbmNlKCk7XG4gICAgICAgIGZhY3RvciA9IGZhY3RvciAqIChsdW0yIC0gbHVtMSkgLyBsdW0yO1xuICAgICAgICByZXR1cm4gb2YubGlnaHRlbihmYWN0b3IpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0RGFya2VyQ29sb3Iob2YsIHJlbGF0aXZlLCBmYWN0b3IpIHtcbiAgICAgICAgaWYgKG9mLmlzRGFya2VyVGhhbihyZWxhdGl2ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvZjtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3IgPSBmYWN0b3IgPyBmYWN0b3IgOiAwLjU7XG4gICAgICAgIGNvbnN0IGx1bTEgPSBvZi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBjb25zdCBsdW0yID0gcmVsYXRpdmUuZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgZmFjdG9yID0gZmFjdG9yICogKGx1bTEgLSBsdW0yKSAvIGx1bTE7XG4gICAgICAgIHJldHVybiBvZi5kYXJrZW4oZmFjdG9yKTtcbiAgICB9XG59XG5Db2xvci53aGl0ZSA9IG5ldyBDb2xvcihuZXcgUkdCQSgyNTUsIDI1NSwgMjU1LCAxKSk7XG5Db2xvci5ibGFjayA9IG5ldyBDb2xvcihuZXcgUkdCQSgwLCAwLCAwLCAxKSk7XG5Db2xvci5yZWQgPSBuZXcgQ29sb3IobmV3IFJHQkEoMjU1LCAwLCAwLCAxKSk7XG5Db2xvci5ibHVlID0gbmV3IENvbG9yKG5ldyBSR0JBKDAsIDAsIDI1NSwgMSkpO1xuQ29sb3IuZ3JlZW4gPSBuZXcgQ29sb3IobmV3IFJHQkEoMCwgMjU1LCAwLCAxKSk7XG5Db2xvci5jeWFuID0gbmV3IENvbG9yKG5ldyBSR0JBKDAsIDI1NSwgMjU1LCAxKSk7XG5Db2xvci5saWdodGdyZXkgPSBuZXcgQ29sb3IobmV3IFJHQkEoMjExLCAyMTEsIDIxMSwgMSkpO1xuQ29sb3IudHJhbnNwYXJlbnQgPSBuZXcgQ29sb3IobmV3IFJHQkEoMCwgMCwgMCwgMCkpO1xuKGZ1bmN0aW9uIChDb2xvcikge1xuICAgIGxldCBGb3JtYXQ7XG4gICAgKGZ1bmN0aW9uIChGb3JtYXQpIHtcbiAgICAgICAgbGV0IENTUztcbiAgICAgICAgKGZ1bmN0aW9uIChDU1MpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFJHQihjb2xvcikge1xuICAgICAgICAgICAgICAgIGlmIChjb2xvci5yZ2JhLmEgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGByZ2IoJHtjb2xvci5yZ2JhLnJ9LCAke2NvbG9yLnJnYmEuZ30sICR7Y29sb3IucmdiYS5ifSlgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRm9ybWF0LkNTUy5mb3JtYXRSR0JBKGNvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENTUy5mb3JtYXRSR0IgPSBmb3JtYXRSR0I7XG4gICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRSR0JBKGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGByZ2JhKCR7Y29sb3IucmdiYS5yfSwgJHtjb2xvci5yZ2JhLmd9LCAke2NvbG9yLnJnYmEuYn0sICR7Kyhjb2xvci5yZ2JhLmEpLnRvRml4ZWQoMil9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDU1MuZm9ybWF0UkdCQSA9IGZvcm1hdFJHQkE7XG4gICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRIU0woY29sb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sb3IuaHNsYS5hID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgaHNsKCR7Y29sb3IuaHNsYS5ofSwgJHsoY29sb3IuaHNsYS5zICogMTAwKS50b0ZpeGVkKDIpfSUsICR7KGNvbG9yLmhzbGEubCAqIDEwMCkudG9GaXhlZCgyKX0lKWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5Gb3JtYXQuQ1NTLmZvcm1hdEhTTEEoY29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ1NTLmZvcm1hdEhTTCA9IGZvcm1hdEhTTDtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdEhTTEEoY29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYGhzbGEoJHtjb2xvci5oc2xhLmh9LCAkeyhjb2xvci5oc2xhLnMgKiAxMDApLnRvRml4ZWQoMil9JSwgJHsoY29sb3IuaHNsYS5sICogMTAwKS50b0ZpeGVkKDIpfSUsICR7Y29sb3IuaHNsYS5hLnRvRml4ZWQoMil9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDU1MuZm9ybWF0SFNMQSA9IGZvcm1hdEhTTEE7XG4gICAgICAgICAgICBmdW5jdGlvbiBfdG9Ud29EaWdpdEhleChuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IG4udG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgICAgIHJldHVybiByLmxlbmd0aCAhPT0gMiA/ICcwJyArIHIgOiByO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBGb3JtYXRzIHRoZSBjb2xvciBhcyAjUlJHR0JCXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdEhleChjb2xvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBgIyR7X3RvVHdvRGlnaXRIZXgoY29sb3IucmdiYS5yKX0ke190b1R3b0RpZ2l0SGV4KGNvbG9yLnJnYmEuZyl9JHtfdG9Ud29EaWdpdEhleChjb2xvci5yZ2JhLmIpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDU1MuZm9ybWF0SGV4ID0gZm9ybWF0SGV4O1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBGb3JtYXRzIHRoZSBjb2xvciBhcyAjUlJHR0JCQUFcbiAgICAgICAgICAgICAqIElmICdjb21wYWN0JyBpcyBzZXQsIGNvbG9ycyB3aXRob3V0IHRyYW5zcGFyYW5jeSB3aWxsIGJlIHByaW50ZWQgYXMgI1JSR0dCQlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRIZXhBKGNvbG9yLCBjb21wYWN0ID0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcGFjdCAmJiBjb2xvci5yZ2JhLmEgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZvcm1hdC5DU1MuZm9ybWF0SGV4KGNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAjJHtfdG9Ud29EaWdpdEhleChjb2xvci5yZ2JhLnIpfSR7X3RvVHdvRGlnaXRIZXgoY29sb3IucmdiYS5nKX0ke190b1R3b0RpZ2l0SGV4KGNvbG9yLnJnYmEuYil9JHtfdG9Ud29EaWdpdEhleChNYXRoLnJvdW5kKGNvbG9yLnJnYmEuYSAqIDI1NSkpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDU1MuZm9ybWF0SGV4QSA9IGZvcm1hdEhleEE7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBkZWZhdWx0IGZvcm1hdCB3aWxsIHVzZSBIRVggaWYgb3BhcXVlIGFuZCBSR0JBIG90aGVyd2lzZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0KGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbG9yLmlzT3BhcXVlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZvcm1hdC5DU1MuZm9ybWF0SGV4KGNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZvcm1hdC5DU1MuZm9ybWF0UkdCQShjb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDU1MuZm9ybWF0ID0gZm9ybWF0O1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDb252ZXJ0cyBhbiBIZXggY29sb3IgdmFsdWUgdG8gYSBDb2xvci5cbiAgICAgICAgICAgICAqIHJldHVybnMgciwgZywgYW5kIGIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2V0IFswLCAyNTVdXG4gICAgICAgICAgICAgKiBAcGFyYW0gaGV4IHN0cmluZyAoI1JHQiwgI1JHQkEsICNSUkdHQkIgb3IgI1JSR0dCQkFBKS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VIZXgoaGV4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gaGV4Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoZXguY2hhckNvZGVBdCgwKSAhPT0gMzUgLyogQ2hhckNvZGUuSGFzaCAqLykge1xuICAgICAgICAgICAgICAgICAgICAvLyBEb2VzIG5vdCBiZWdpbiB3aXRoIGEgI1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gNykge1xuICAgICAgICAgICAgICAgICAgICAvLyAjUlJHR0JCIGZvcm1hdFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gMTYgKiBfcGFyc2VIZXhEaWdpdChoZXguY2hhckNvZGVBdCgxKSkgKyBfcGFyc2VIZXhEaWdpdChoZXguY2hhckNvZGVBdCgyKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGcgPSAxNiAqIF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDMpKSArIF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDQpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IDE2ICogX3BhcnNlSGV4RGlnaXQoaGV4LmNoYXJDb2RlQXQoNSkpICsgX3BhcnNlSGV4RGlnaXQoaGV4LmNoYXJDb2RlQXQoNikpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKG5ldyBSR0JBKHIsIGcsIGIsIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gOSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAjUlJHR0JCQUEgZm9ybWF0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSAxNiAqIF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDEpKSArIF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDIpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZyA9IDE2ICogX3BhcnNlSGV4RGlnaXQoaGV4LmNoYXJDb2RlQXQoMykpICsgX3BhcnNlSGV4RGlnaXQoaGV4LmNoYXJDb2RlQXQoNCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gMTYgKiBfcGFyc2VIZXhEaWdpdChoZXguY2hhckNvZGVBdCg1KSkgKyBfcGFyc2VIZXhEaWdpdChoZXguY2hhckNvZGVBdCg2KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSAxNiAqIF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDcpKSArIF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihuZXcgUkdCQShyLCBnLCBiLCBhIC8gMjU1KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gI1JHQiBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDEpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZyA9IF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDIpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IF9wYXJzZUhleERpZ2l0KGhleC5jaGFyQ29kZUF0KDMpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihuZXcgUkdCQSgxNiAqIHIgKyByLCAxNiAqIGcgKyBnLCAxNiAqIGIgKyBiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gI1JHQkEgZm9ybWF0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBfcGFyc2VIZXhEaWdpdChoZXguY2hhckNvZGVBdCgxKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGcgPSBfcGFyc2VIZXhEaWdpdChoZXguY2hhckNvZGVBdCgyKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBfcGFyc2VIZXhEaWdpdChoZXguY2hhckNvZGVBdCgzKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBfcGFyc2VIZXhEaWdpdChoZXguY2hhckNvZGVBdCg0KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IobmV3IFJHQkEoMTYgKiByICsgciwgMTYgKiBnICsgZywgMTYgKiBiICsgYiwgKDE2ICogYSArIGEpIC8gMjU1KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEludmFsaWQgY29sb3JcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENTUy5wYXJzZUhleCA9IHBhcnNlSGV4O1xuICAgICAgICAgICAgZnVuY3Rpb24gX3BhcnNlSGV4RGlnaXQoY2hhckNvZGUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoYXJDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDggLyogQ2hhckNvZGUuRGlnaXQwICovOiByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OSAvKiBDaGFyQ29kZS5EaWdpdDEgKi86IHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDUwIC8qIENoYXJDb2RlLkRpZ2l0MiAqLzogcmV0dXJuIDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTEgLyogQ2hhckNvZGUuRGlnaXQzICovOiByZXR1cm4gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MiAvKiBDaGFyQ29kZS5EaWdpdDQgKi86IHJldHVybiA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDUzIC8qIENoYXJDb2RlLkRpZ2l0NSAqLzogcmV0dXJuIDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTQgLyogQ2hhckNvZGUuRGlnaXQ2ICovOiByZXR1cm4gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1NSAvKiBDaGFyQ29kZS5EaWdpdDcgKi86IHJldHVybiA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU2IC8qIENoYXJDb2RlLkRpZ2l0OCAqLzogcmV0dXJuIDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTcgLyogQ2hhckNvZGUuRGlnaXQ5ICovOiByZXR1cm4gOTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NyAvKiBDaGFyQ29kZS5hICovOiByZXR1cm4gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjUgLyogQ2hhckNvZGUuQSAqLzogcmV0dXJuIDEwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk4IC8qIENoYXJDb2RlLmIgKi86IHJldHVybiAxMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2NiAvKiBDaGFyQ29kZS5CICovOiByZXR1cm4gMTE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTkgLyogQ2hhckNvZGUuYyAqLzogcmV0dXJuIDEyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY3IC8qIENoYXJDb2RlLkMgKi86IHJldHVybiAxMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDAgLyogQ2hhckNvZGUuZCAqLzogcmV0dXJuIDEzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY4IC8qIENoYXJDb2RlLkQgKi86IHJldHVybiAxMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDEgLyogQ2hhckNvZGUuZSAqLzogcmV0dXJuIDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY5IC8qIENoYXJDb2RlLkUgKi86IHJldHVybiAxNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDIgLyogQ2hhckNvZGUuZiAqLzogcmV0dXJuIDE1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDcwIC8qIENoYXJDb2RlLkYgKi86IHJldHVybiAxNTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKENTUyA9IEZvcm1hdC5DU1MgfHwgKEZvcm1hdC5DU1MgPSB7fSkpO1xuICAgIH0pKEZvcm1hdCA9IENvbG9yLkZvcm1hdCB8fCAoQ29sb3IuRm9ybWF0ID0ge30pKTtcbn0pKENvbG9yIHx8IChDb2xvciA9IHt9KSk7XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IENvbG9yLCBIU0xBIH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24vY29sb3IuanMnO1xuZnVuY3Rpb24gX3BhcnNlQ2FwdHVyZUdyb3VwcyhjYXB0dXJlR3JvdXBzKSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgZm9yIChjb25zdCBjYXB0dXJlR3JvdXAgb2YgY2FwdHVyZUdyb3Vwcykge1xuICAgICAgICBjb25zdCBwYXJzZWROdW1iZXIgPSBOdW1iZXIoY2FwdHVyZUdyb3VwKTtcbiAgICAgICAgaWYgKHBhcnNlZE51bWJlciB8fCBwYXJzZWROdW1iZXIgPT09IDAgJiYgY2FwdHVyZUdyb3VwLnJlcGxhY2UoL1xccy9nLCAnJykgIT09ICcnKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChwYXJzZWROdW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBfdG9JQ29sb3IociwgZywgYiwgYSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlZDogciAvIDI1NSxcbiAgICAgICAgYmx1ZTogYiAvIDI1NSxcbiAgICAgICAgZ3JlZW46IGcgLyAyNTUsXG4gICAgICAgIGFscGhhOiBhXG4gICAgfTtcbn1cbmZ1bmN0aW9uIF9maW5kUmFuZ2UobW9kZWwsIG1hdGNoKSB7XG4gICAgY29uc3QgaW5kZXggPSBtYXRjaC5pbmRleDtcbiAgICBjb25zdCBsZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBtb2RlbC5wb3NpdGlvbkF0KGluZGV4KTtcbiAgICBjb25zdCByYW5nZSA9IHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBzdGFydFBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiBzdGFydFBvc2l0aW9uLmNvbHVtbixcbiAgICAgICAgZW5kTGluZU51bWJlcjogc3RhcnRQb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBlbmRDb2x1bW46IHN0YXJ0UG9zaXRpb24uY29sdW1uICsgbGVuZ3RoXG4gICAgfTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5mdW5jdGlvbiBfZmluZEhleENvbG9ySW5mb3JtYXRpb24ocmFuZ2UsIGhleFZhbHVlKSB7XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZEhleENvbG9yID0gQ29sb3IuRm9ybWF0LkNTUy5wYXJzZUhleChoZXhWYWx1ZSk7XG4gICAgaWYgKCFwYXJzZWRIZXhDb2xvcikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJhbmdlOiByYW5nZSxcbiAgICAgICAgY29sb3I6IF90b0lDb2xvcihwYXJzZWRIZXhDb2xvci5yZ2JhLnIsIHBhcnNlZEhleENvbG9yLnJnYmEuZywgcGFyc2VkSGV4Q29sb3IucmdiYS5iLCBwYXJzZWRIZXhDb2xvci5yZ2JhLmEpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIF9maW5kUkdCQ29sb3JJbmZvcm1hdGlvbihyYW5nZSwgbWF0Y2hlcywgaXNBbHBoYSkge1xuICAgIGlmICghcmFuZ2UgfHwgbWF0Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaCA9IG1hdGNoZXNbMF07XG4gICAgY29uc3QgY2FwdHVyZUdyb3VwcyA9IG1hdGNoLnZhbHVlcygpO1xuICAgIGNvbnN0IHBhcnNlZFJlZ2V4ID0gX3BhcnNlQ2FwdHVyZUdyb3VwcyhjYXB0dXJlR3JvdXBzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICByYW5nZTogcmFuZ2UsXG4gICAgICAgIGNvbG9yOiBfdG9JQ29sb3IocGFyc2VkUmVnZXhbMF0sIHBhcnNlZFJlZ2V4WzFdLCBwYXJzZWRSZWdleFsyXSwgaXNBbHBoYSA/IHBhcnNlZFJlZ2V4WzNdIDogMSlcbiAgICB9O1xufVxuZnVuY3Rpb24gX2ZpbmRIU0xDb2xvckluZm9ybWF0aW9uKHJhbmdlLCBtYXRjaGVzLCBpc0FscGhhKSB7XG4gICAgaWYgKCFyYW5nZSB8fCBtYXRjaGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlc1swXTtcbiAgICBjb25zdCBjYXB0dXJlR3JvdXBzID0gbWF0Y2gudmFsdWVzKCk7XG4gICAgY29uc3QgcGFyc2VkUmVnZXggPSBfcGFyc2VDYXB0dXJlR3JvdXBzKGNhcHR1cmVHcm91cHMpO1xuICAgIGNvbnN0IGNvbG9yRXF1aXZhbGVudCA9IG5ldyBDb2xvcihuZXcgSFNMQShwYXJzZWRSZWdleFswXSwgcGFyc2VkUmVnZXhbMV0gLyAxMDAsIHBhcnNlZFJlZ2V4WzJdIC8gMTAwLCBpc0FscGhhID8gcGFyc2VkUmVnZXhbM10gOiAxKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmFuZ2U6IHJhbmdlLFxuICAgICAgICBjb2xvcjogX3RvSUNvbG9yKGNvbG9yRXF1aXZhbGVudC5yZ2JhLnIsIGNvbG9yRXF1aXZhbGVudC5yZ2JhLmcsIGNvbG9yRXF1aXZhbGVudC5yZ2JhLmIsIGNvbG9yRXF1aXZhbGVudC5yZ2JhLmEpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIF9maW5kTWF0Y2hlcyhtb2RlbCwgcmVnZXgpIHtcbiAgICBpZiAodHlwZW9mIG1vZGVsID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gWy4uLm1vZGVsLm1hdGNoQWxsKHJlZ2V4KV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbW9kZWwuZmluZE1hdGNoZXMocmVnZXgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVDb2xvcnMobW9kZWwpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAvLyBFYXJseSB2YWxpZGF0aW9uIGZvciBSR0IgYW5kIEhTTFxuICAgIGNvbnN0IGluaXRpYWxWYWxpZGF0aW9uUmVnZXggPSAvXFxiKHJnYnxyZ2JhfGhzbHxoc2xhKShcXChbMC05XFxzLC5cXCVdKlxcKSl8KCMpKFtBLUZhLWYwLTldezN9KVxcYnwoIykoW0EtRmEtZjAtOV17NH0pXFxifCgjKShbQS1GYS1mMC05XXs2fSlcXGJ8KCMpKFtBLUZhLWYwLTldezh9KVxcYi9nbTtcbiAgICBjb25zdCBpbml0aWFsVmFsaWRhdGlvbk1hdGNoZXMgPSBfZmluZE1hdGNoZXMobW9kZWwsIGluaXRpYWxWYWxpZGF0aW9uUmVnZXgpO1xuICAgIC8vIFBvdGVudGlhbCBjb2xvcnMgaGF2ZSBiZWVuIGZvdW5kLCB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVyc1xuICAgIGlmIChpbml0aWFsVmFsaWRhdGlvbk1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGluaXRpYWxNYXRjaCBvZiBpbml0aWFsVmFsaWRhdGlvbk1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxDYXB0dXJlR3JvdXBzID0gaW5pdGlhbE1hdGNoLmZpbHRlcihjYXB0dXJlR3JvdXAgPT4gY2FwdHVyZUdyb3VwICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgY29sb3JTY2hlbWUgPSBpbml0aWFsQ2FwdHVyZUdyb3Vwc1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yUGFyYW1ldGVycyA9IGluaXRpYWxDYXB0dXJlR3JvdXBzWzJdO1xuICAgICAgICAgICAgaWYgKCFjb2xvclBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb2xvckluZm9ybWF0aW9uO1xuICAgICAgICAgICAgaWYgKGNvbG9yU2NoZW1lID09PSAncmdiJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4UGFyYW1ldGVycyA9IC9eXFwoXFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxccyosXFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxccyosXFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxccypcXCkkL2dtO1xuICAgICAgICAgICAgICAgIGNvbG9ySW5mb3JtYXRpb24gPSBfZmluZFJHQkNvbG9ySW5mb3JtYXRpb24oX2ZpbmRSYW5nZShtb2RlbCwgaW5pdGlhbE1hdGNoKSwgX2ZpbmRNYXRjaGVzKGNvbG9yUGFyYW1ldGVycywgcmVnZXhQYXJhbWV0ZXJzKSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29sb3JTY2hlbWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4UGFyYW1ldGVycyA9IC9eXFwoXFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxccyosXFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxccyosXFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxccyosXFxzKigwWy5dWzAtOV0rfFsuXVswLTldK3xbMDFdWy5dfFswMV0pXFxzKlxcKSQvZ207XG4gICAgICAgICAgICAgICAgY29sb3JJbmZvcm1hdGlvbiA9IF9maW5kUkdCQ29sb3JJbmZvcm1hdGlvbihfZmluZFJhbmdlKG1vZGVsLCBpbml0aWFsTWF0Y2gpLCBfZmluZE1hdGNoZXMoY29sb3JQYXJhbWV0ZXJzLCByZWdleFBhcmFtZXRlcnMpLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9yU2NoZW1lID09PSAnaHNsJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4UGFyYW1ldGVycyA9IC9eXFwoXFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlcXHMqLFxccyooMTAwfFxcZHsxLDJ9Wy5dXFxkKnxcXGR7MSwyfSklXFxzKixcXHMqKDEwMHxcXGR7MSwyfVsuXVxcZCp8XFxkezEsMn0pJVxccypcXCkkL2dtO1xuICAgICAgICAgICAgICAgIGNvbG9ySW5mb3JtYXRpb24gPSBfZmluZEhTTENvbG9ySW5mb3JtYXRpb24oX2ZpbmRSYW5nZShtb2RlbCwgaW5pdGlhbE1hdGNoKSwgX2ZpbmRNYXRjaGVzKGNvbG9yUGFyYW1ldGVycywgcmVnZXhQYXJhbWV0ZXJzKSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29sb3JTY2hlbWUgPT09ICdoc2xhJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4UGFyYW1ldGVycyA9IC9eXFwoXFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlcXHMqLFxccyooMTAwfFxcZHsxLDJ9Wy5dXFxkKnxcXGR7MSwyfSklXFxzKixcXHMqKDEwMHxcXGR7MSwyfVsuXVxcZCp8XFxkezEsMn0pJVxccyosXFxzKigwWy5dWzAtOV0rfFsuXVswLTldK3xbMDFdWy5dfFswMV0pXFxzKlxcKSQvZ207XG4gICAgICAgICAgICAgICAgY29sb3JJbmZvcm1hdGlvbiA9IF9maW5kSFNMQ29sb3JJbmZvcm1hdGlvbihfZmluZFJhbmdlKG1vZGVsLCBpbml0aWFsTWF0Y2gpLCBfZmluZE1hdGNoZXMoY29sb3JQYXJhbWV0ZXJzLCByZWdleFBhcmFtZXRlcnMpLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9yU2NoZW1lID09PSAnIycpIHtcbiAgICAgICAgICAgICAgICBjb2xvckluZm9ybWF0aW9uID0gX2ZpbmRIZXhDb2xvckluZm9ybWF0aW9uKF9maW5kUmFuZ2UobW9kZWwsIGluaXRpYWxNYXRjaCksIGNvbG9yU2NoZW1lICsgY29sb3JQYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2xvckluZm9ybWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29sb3JJbmZvcm1hdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgZGVmYXVsdCBkb2N1bWVudCBjb2xvcnMgaW4gdGhlIHByb3ZpZGVkIGRvY3VtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlRGVmYXVsdERvY3VtZW50Q29sb3JzKG1vZGVsKSB7XG4gICAgaWYgKCFtb2RlbCB8fCB0eXBlb2YgbW9kZWwuZ2V0VmFsdWUgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG1vZGVsLnBvc2l0aW9uQXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVW5rbm93biBjYWxsZXIhXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVDb2xvcnMobW9kZWwpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IHN0cmluZ0RpZmYgfSBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi9kaWZmL2RpZmYuanMnO1xuaW1wb3J0IHsgVVJJIH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24vdXJpLmpzJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vY29yZS9wb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL2NvcmUvcmFuZ2UuanMnO1xuaW1wb3J0IHsgTWlycm9yVGV4dE1vZGVsIGFzIEJhc2VNaXJyb3JNb2RlbCB9IGZyb20gJy4uL21vZGVsL21pcnJvclRleHRNb2RlbC5qcyc7XG5pbXBvcnQgeyBlbnN1cmVWYWxpZFdvcmREZWZpbml0aW9uLCBnZXRXb3JkQXRUZXh0IH0gZnJvbSAnLi4vY29yZS93b3JkSGVscGVyLmpzJztcbmltcG9ydCB7IGNvbXB1dGVMaW5rcyB9IGZyb20gJy4uL2xhbmd1YWdlcy9saW5rQ29tcHV0ZXIuanMnO1xuaW1wb3J0IHsgQmFzaWNJbnBsYWNlUmVwbGFjZSB9IGZyb20gJy4uL2xhbmd1YWdlcy9zdXBwb3J0cy9pbnBsYWNlUmVwbGFjZVN1cHBvcnQuanMnO1xuaW1wb3J0IHsgY3JlYXRlTW9uYWNvQmFzZUFQSSB9IGZyb20gJy4vZWRpdG9yQmFzZUFwaS5qcyc7XG5pbXBvcnQgeyBTdG9wV2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9iYXNlL2NvbW1vbi9zdG9wd2F0Y2guanMnO1xuaW1wb3J0IHsgVW5pY29kZVRleHRNb2RlbEhpZ2hsaWdodGVyIH0gZnJvbSAnLi91bmljb2RlVGV4dE1vZGVsSGlnaGxpZ2h0ZXIuanMnO1xuaW1wb3J0IHsgbGluZXNEaWZmQ29tcHV0ZXJzIH0gZnJvbSAnLi4vZGlmZi9saW5lc0RpZmZDb21wdXRlcnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlUHJveHlPYmplY3QsIGdldEFsbE1ldGhvZE5hbWVzIH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9jb21tb24vb2JqZWN0cy5qcyc7XG5pbXBvcnQgeyBjb21wdXRlRGVmYXVsdERvY3VtZW50Q29sb3JzIH0gZnJvbSAnLi4vbGFuZ3VhZ2VzL2RlZmF1bHREb2N1bWVudENvbG9yc0NvbXB1dGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIE1pcnJvck1vZGVsIGV4dGVuZHMgQmFzZU1pcnJvck1vZGVsIHtcbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgZW9sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW9sO1xuICAgIH1cbiAgICBnZXRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpO1xuICAgIH1cbiAgICBmaW5kTWF0Y2hlcyhyZWdleCkge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9saW5lc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFRvQWRkID0gdGhpcy5vZmZzZXRBdChuZXcgUG9zaXRpb24oaSArIDEsIDEpKTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yT3Zlck1hdGNoZXMgPSBsaW5lLm1hdGNoQWxsKHJlZ2V4KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgaXRlcmF0b3JPdmVyTWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaC5pbmRleCB8fCBtYXRjaC5pbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaC5pbmRleCA9IG1hdGNoLmluZGV4ICsgb2Zmc2V0VG9BZGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChtYXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfVxuICAgIGdldExpbmVzQ29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzLnNsaWNlKDApO1xuICAgIH1cbiAgICBnZXRMaW5lQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGg7XG4gICAgfVxuICAgIGdldExpbmVDb250ZW50KGxpbmVOdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzW2xpbmVOdW1iZXIgLSAxXTtcbiAgICB9XG4gICAgZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24sIHdvcmREZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IHdvcmRBdFRleHQgPSBnZXRXb3JkQXRUZXh0KHBvc2l0aW9uLmNvbHVtbiwgZW5zdXJlVmFsaWRXb3JkRGVmaW5pdGlvbih3b3JkRGVmaW5pdGlvbiksIHRoaXMuX2xpbmVzW3Bvc2l0aW9uLmxpbmVOdW1iZXIgLSAxXSwgMCk7XG4gICAgICAgIGlmICh3b3JkQXRUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHBvc2l0aW9uLmxpbmVOdW1iZXIsIHdvcmRBdFRleHQuc3RhcnRDb2x1bW4sIHBvc2l0aW9uLmxpbmVOdW1iZXIsIHdvcmRBdFRleHQuZW5kQ29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgd29yZHMod29yZERlZmluaXRpb24pIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSB0aGlzLl9saW5lcztcbiAgICAgICAgY29uc3Qgd29yZGVuaXplID0gdGhpcy5fd29yZGVuaXplLmJpbmQodGhpcyk7XG4gICAgICAgIGxldCBsaW5lTnVtYmVyID0gMDtcbiAgICAgICAgbGV0IGxpbmVUZXh0ID0gJyc7XG4gICAgICAgIGxldCB3b3JkUmFuZ2VzSWR4ID0gMDtcbiAgICAgICAgbGV0IHdvcmRSYW5nZXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod29yZFJhbmdlc0lkeCA8IHdvcmRSYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxpbmVUZXh0LnN1YnN0cmluZyh3b3JkUmFuZ2VzW3dvcmRSYW5nZXNJZHhdLnN0YXJ0LCB3b3JkUmFuZ2VzW3dvcmRSYW5nZXNJZHhdLmVuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkUmFuZ2VzSWR4ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyIDwgbGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVRleHQgPSBsaW5lc1tsaW5lTnVtYmVyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkUmFuZ2VzID0gd29yZGVuaXplKGxpbmVUZXh0LCB3b3JkRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFJhbmdlc0lkeCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldExpbmVXb3JkcyhsaW5lTnVtYmVyLCB3b3JkRGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fbGluZXNbbGluZU51bWJlciAtIDFdO1xuICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLl93b3JkZW5pemUoY29udGVudCwgd29yZERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB3b3JkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgICAgICAgICAgd29yZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgd29yZDogY29udGVudC5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCksXG4gICAgICAgICAgICAgICAgc3RhcnRDb2x1bW46IHJhbmdlLnN0YXJ0ICsgMSxcbiAgICAgICAgICAgICAgICBlbmRDb2x1bW46IHJhbmdlLmVuZCArIDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3b3JkcztcbiAgICB9XG4gICAgX3dvcmRlbml6ZShjb250ZW50LCB3b3JkRGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICB3b3JkRGVmaW5pdGlvbi5sYXN0SW5kZXggPSAwOyAvLyByZXNldCBsYXN0SW5kZXgganVzdCB0byBiZSBzdXJlXG4gICAgICAgIHdoaWxlIChtYXRjaCA9IHdvcmREZWZpbml0aW9uLmV4ZWMoY29udGVudCkpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaFswXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBpdCBkaWQgbWF0Y2ggdGhlIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBzdGFydDogbWF0Y2guaW5kZXgsIGVuZDogbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0VmFsdWVJblJhbmdlKHJhbmdlKSB7XG4gICAgICAgIHJhbmdlID0gdGhpcy5fdmFsaWRhdGVSYW5nZShyYW5nZSk7XG4gICAgICAgIGlmIChyYW5nZS5zdGFydExpbmVOdW1iZXIgPT09IHJhbmdlLmVuZExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVOdW1iZXIgLSAxXS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnRDb2x1bW4gLSAxLCByYW5nZS5lbmRDb2x1bW4gLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaW5lRW5kaW5nID0gdGhpcy5fZW9sO1xuICAgICAgICBjb25zdCBzdGFydExpbmVJbmRleCA9IHJhbmdlLnN0YXJ0TGluZU51bWJlciAtIDE7XG4gICAgICAgIGNvbnN0IGVuZExpbmVJbmRleCA9IHJhbmdlLmVuZExpbmVOdW1iZXIgLSAxO1xuICAgICAgICBjb25zdCByZXN1bHRMaW5lcyA9IFtdO1xuICAgICAgICByZXN1bHRMaW5lcy5wdXNoKHRoaXMuX2xpbmVzW3N0YXJ0TGluZUluZGV4XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnRDb2x1bW4gLSAxKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydExpbmVJbmRleCArIDE7IGkgPCBlbmRMaW5lSW5kZXg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0TGluZXMucHVzaCh0aGlzLl9saW5lc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0TGluZXMucHVzaCh0aGlzLl9saW5lc1tlbmRMaW5lSW5kZXhdLnN1YnN0cmluZygwLCByYW5nZS5lbmRDb2x1bW4gLSAxKSk7XG4gICAgICAgIHJldHVybiByZXN1bHRMaW5lcy5qb2luKGxpbmVFbmRpbmcpO1xuICAgIH1cbiAgICBvZmZzZXRBdChwb3NpdGlvbikge1xuICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX3ZhbGlkYXRlUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lU3RhcnRzLmdldFByZWZpeFN1bShwb3NpdGlvbi5saW5lTnVtYmVyIC0gMikgKyAocG9zaXRpb24uY29sdW1uIC0gMSk7XG4gICAgfVxuICAgIHBvc2l0aW9uQXQob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCA9IE1hdGguZmxvb3Iob2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fZW5zdXJlTGluZVN0YXJ0cygpO1xuICAgICAgICBjb25zdCBvdXQgPSB0aGlzLl9saW5lU3RhcnRzLmdldEluZGV4T2Yob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IHRoaXMuX2xpbmVzW291dC5pbmRleF0ubGVuZ3RoO1xuICAgICAgICAvLyBFbnN1cmUgd2UgcmV0dXJuIGEgdmFsaWQgcG9zaXRpb25cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmVOdW1iZXI6IDEgKyBvdXQuaW5kZXgsXG4gICAgICAgICAgICBjb2x1bW46IDEgKyBNYXRoLm1pbihvdXQucmVtYWluZGVyLCBsaW5lTGVuZ3RoKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBfdmFsaWRhdGVSYW5nZShyYW5nZSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oeyBsaW5lTnVtYmVyOiByYW5nZS5zdGFydExpbmVOdW1iZXIsIGNvbHVtbjogcmFuZ2Uuc3RhcnRDb2x1bW4gfSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oeyBsaW5lTnVtYmVyOiByYW5nZS5lbmRMaW5lTnVtYmVyLCBjb2x1bW46IHJhbmdlLmVuZENvbHVtbiB9KTtcbiAgICAgICAgaWYgKHN0YXJ0LmxpbmVOdW1iZXIgIT09IHJhbmdlLnN0YXJ0TGluZU51bWJlclxuICAgICAgICAgICAgfHwgc3RhcnQuY29sdW1uICE9PSByYW5nZS5zdGFydENvbHVtblxuICAgICAgICAgICAgfHwgZW5kLmxpbmVOdW1iZXIgIT09IHJhbmdlLmVuZExpbmVOdW1iZXJcbiAgICAgICAgICAgIHx8IGVuZC5jb2x1bW4gIT09IHJhbmdlLmVuZENvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IHN0YXJ0LmxpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgc3RhcnRDb2x1bW46IHN0YXJ0LmNvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiBlbmQubGluZU51bWJlcixcbiAgICAgICAgICAgICAgICBlbmRDb2x1bW46IGVuZC5jb2x1bW5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cbiAgICBfdmFsaWRhdGVQb3NpdGlvbihwb3NpdGlvbikge1xuICAgICAgICBpZiAoIVBvc2l0aW9uLmlzSVBvc2l0aW9uKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9zaXRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBsaW5lTnVtYmVyLCBjb2x1bW4gfSA9IHBvc2l0aW9uO1xuICAgICAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAobGluZU51bWJlciA8IDEpIHtcbiAgICAgICAgICAgIGxpbmVOdW1iZXIgPSAxO1xuICAgICAgICAgICAgY29sdW1uID0gMTtcbiAgICAgICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmVOdW1iZXIgPiB0aGlzLl9saW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxpbmVOdW1iZXIgPSB0aGlzLl9saW5lcy5sZW5ndGg7XG4gICAgICAgICAgICBjb2x1bW4gPSB0aGlzLl9saW5lc1tsaW5lTnVtYmVyIC0gMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWF4Q2hhcmFjdGVyID0gdGhpcy5fbGluZXNbbGluZU51bWJlciAtIDFdLmxlbmd0aCArIDE7XG4gICAgICAgICAgICBpZiAoY29sdW1uIDwgMSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IDE7XG4gICAgICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2x1bW4gPiBtYXhDaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBtYXhDaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lTnVtYmVyLCBjb2x1bW4gfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBFZGl0b3JTaW1wbGVXb3JrZXIge1xuICAgIGNvbnN0cnVjdG9yKGhvc3QsIGZvcmVpZ25Nb2R1bGVGYWN0b3J5KSB7XG4gICAgICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgICAgICB0aGlzLl9tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeSA9IGZvcmVpZ25Nb2R1bGVGYWN0b3J5O1xuICAgICAgICB0aGlzLl9mb3JlaWduTW9kdWxlID0gbnVsbDtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5fbW9kZWxzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgX2dldE1vZGVsKHVyaSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxzW3VyaV07XG4gICAgfVxuICAgIF9nZXRNb2RlbHMoKSB7XG4gICAgICAgIGNvbnN0IGFsbCA9IFtdO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9tb2RlbHMpLmZvckVhY2goKGtleSkgPT4gYWxsLnB1c2godGhpcy5fbW9kZWxzW2tleV0pKTtcbiAgICAgICAgcmV0dXJuIGFsbDtcbiAgICB9XG4gICAgYWNjZXB0TmV3TW9kZWwoZGF0YSkge1xuICAgICAgICB0aGlzLl9tb2RlbHNbZGF0YS51cmxdID0gbmV3IE1pcnJvck1vZGVsKFVSSS5wYXJzZShkYXRhLnVybCksIGRhdGEubGluZXMsIGRhdGEuRU9MLCBkYXRhLnZlcnNpb25JZCk7XG4gICAgfVxuICAgIGFjY2VwdE1vZGVsQ2hhbmdlZChzdHJVUkwsIGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tb2RlbHNbc3RyVVJMXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fbW9kZWxzW3N0clVSTF07XG4gICAgICAgIG1vZGVsLm9uRXZlbnRzKGUpO1xuICAgIH1cbiAgICBhY2NlcHRSZW1vdmVkTW9kZWwoc3RyVVJMKSB7XG4gICAgICAgIGlmICghdGhpcy5fbW9kZWxzW3N0clVSTF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5fbW9kZWxzW3N0clVSTF07XG4gICAgfVxuICAgIGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh1cmwsIG9wdGlvbnMsIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2dldE1vZGVsKHVybCk7XG4gICAgICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2VzOiBbXSwgaGFzTW9yZTogZmFsc2UsIGFtYmlndW91c0NoYXJhY3RlckNvdW50OiAwLCBpbnZpc2libGVDaGFyYWN0ZXJDb3VudDogMCwgbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50OiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVW5pY29kZVRleHRNb2RlbEhpZ2hsaWdodGVyLmNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyhtb2RlbCwgb3B0aW9ucywgcmFuZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gLS0tLSBCRUdJTiBkaWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29tcHV0ZURpZmYob3JpZ2luYWxVcmwsIG1vZGlmaWVkVXJsLCBvcHRpb25zLCBhbGdvcml0aG0pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gdGhpcy5fZ2V0TW9kZWwob3JpZ2luYWxVcmwpO1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSB0aGlzLl9nZXRNb2RlbChtb2RpZmllZFVybCk7XG4gICAgICAgICAgICBpZiAoIW9yaWdpbmFsIHx8ICFtb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNpbXBsZVdvcmtlci5jb21wdXRlRGlmZihvcmlnaW5hbCwgbW9kaWZpZWQsIG9wdGlvbnMsIGFsZ29yaXRobSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY29tcHV0ZURpZmYob3JpZ2luYWxUZXh0TW9kZWwsIG1vZGlmaWVkVGV4dE1vZGVsLCBvcHRpb25zLCBhbGdvcml0aG0pIHtcbiAgICAgICAgY29uc3QgZGlmZkFsZ29yaXRobSA9IGFsZ29yaXRobSA9PT0gJ2FkdmFuY2VkJyA/IGxpbmVzRGlmZkNvbXB1dGVycy5nZXRBZHZhbmNlZCgpIDogbGluZXNEaWZmQ29tcHV0ZXJzLmdldExlZ2FjeSgpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbExpbmVzID0gb3JpZ2luYWxUZXh0TW9kZWwuZ2V0TGluZXNDb250ZW50KCk7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkTGluZXMgPSBtb2RpZmllZFRleHRNb2RlbC5nZXRMaW5lc0NvbnRlbnQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGlmZkFsZ29yaXRobS5jb21wdXRlRGlmZihvcmlnaW5hbExpbmVzLCBtb2RpZmllZExpbmVzLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaWRlbnRpY2FsID0gKHJlc3VsdC5jaGFuZ2VzLmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRoaXMuX21vZGVsc0FyZUlkZW50aWNhbChvcmlnaW5hbFRleHRNb2RlbCwgbW9kaWZpZWRUZXh0TW9kZWwpKTtcbiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZUNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXMubWFwKG0gPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFttLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCBtLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwgbS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlciwgbS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsIChfYSA9IG0uaW5uZXJDaGFuZ2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKG0gPT4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgbS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG0ub3JpZ2luYWxSYW5nZS5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG0ub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbS5vcmlnaW5hbFJhbmdlLmVuZENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG0ubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtLm1vZGlmaWVkUmFuZ2Uuc3RhcnRDb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBtLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG0ubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgIF0pXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWRlbnRpY2FsLFxuICAgICAgICAgICAgcXVpdEVhcmx5OiByZXN1bHQuaGl0VGltZW91dCxcbiAgICAgICAgICAgIGNoYW5nZXM6IGdldExpbmVDaGFuZ2VzKHJlc3VsdC5jaGFuZ2VzKSxcbiAgICAgICAgICAgIG1vdmVzOiByZXN1bHQubW92ZXMubWFwKG0gPT4gKFtcbiAgICAgICAgICAgICAgICBtLmxpbmVSYW5nZU1hcHBpbmcub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLFxuICAgICAgICAgICAgICAgIG0ubGluZVJhbmdlTWFwcGluZy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLFxuICAgICAgICAgICAgICAgIG0ubGluZVJhbmdlTWFwcGluZy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgbS5saW5lUmFuZ2VNYXBwaW5nLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsXG4gICAgICAgICAgICAgICAgZ2V0TGluZUNoYW5nZXMobS5jaGFuZ2VzKVxuICAgICAgICAgICAgXSkpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGF0aWMgX21vZGVsc0FyZUlkZW50aWNhbChvcmlnaW5hbCwgbW9kaWZpZWQpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lQ291bnQgPSBvcmlnaW5hbC5nZXRMaW5lQ291bnQoKTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWRMaW5lQ291bnQgPSBtb2RpZmllZC5nZXRMaW5lQ291bnQoKTtcbiAgICAgICAgaWYgKG9yaWdpbmFsTGluZUNvdW50ICE9PSBtb2RpZmllZExpbmVDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGxpbmUgPSAxOyBsaW5lIDw9IG9yaWdpbmFsTGluZUNvdW50OyBsaW5lKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmdldExpbmVDb250ZW50KGxpbmUpO1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRMaW5lID0gbW9kaWZpZWQuZ2V0TGluZUNvbnRlbnQobGluZSk7XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxMaW5lICE9PSBtb2RpZmllZExpbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbXB1dGVNb3JlTWluaW1hbEVkaXRzKG1vZGVsVXJsLCBlZGl0cywgcHJldHR5KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2dldE1vZGVsKG1vZGVsVXJsKTtcbiAgICAgICAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWRpdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGxldCBsYXN0RW9sID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZWRpdHMgPSBlZGl0cy5zbGljZSgwKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEucmFuZ2UgJiYgYi5yYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKGEucmFuZ2UsIGIucmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlb2wgb25seSBjaGFuZ2VzIHNob3VsZCBnbyB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgY29uc3QgYVJuZyA9IGEucmFuZ2UgPyAwIDogMTtcbiAgICAgICAgICAgICAgICBjb25zdCBiUm5nID0gYi5yYW5nZSA/IDAgOiAxO1xuICAgICAgICAgICAgICAgIHJldHVybiBhUm5nIC0gYlJuZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yIChsZXQgeyByYW5nZSwgdGV4dCwgZW9sIH0gb2YgZWRpdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVvbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdEVvbCA9IGVvbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFJhbmdlLmlzRW1wdHkocmFuZ2UpICYmICF0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IGNoYW5nZVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBtb2RlbC5nZXRWYWx1ZUluUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcclxcbnxcXG58XFxyL2csIG1vZGVsLmVvbCk7XG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsID09PSB0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBkaWZmIHdvbid0IHRha2UgdG9vIGxvbmdcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5tYXgodGV4dC5sZW5ndGgsIG9yaWdpbmFsLmxlbmd0aCkgPiBFZGl0b3JTaW1wbGVXb3JrZXIuX2RpZmZMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IHJhbmdlLCB0ZXh0IH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBkaWZmIGJldHdlZW4gb3JpZ2luYWwgYW5kIGVkaXQudGV4dFxuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBzdHJpbmdEaWZmKG9yaWdpbmFsLCB0ZXh0LCBwcmV0dHkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRPZmZzZXQgPSBtb2RlbC5vZmZzZXRBdChSYW5nZS5saWZ0KHJhbmdlKS5nZXRTdGFydFBvc2l0aW9uKCkpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBtb2RlbC5wb3NpdGlvbkF0KGVkaXRPZmZzZXQgKyBjaGFuZ2Uub3JpZ2luYWxTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IG1vZGVsLnBvc2l0aW9uQXQoZWRpdE9mZnNldCArIGNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRleHQuc3Vic3RyKGNoYW5nZS5tb2RpZmllZFN0YXJ0LCBjaGFuZ2UubW9kaWZpZWRMZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBzdGFydC5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogc3RhcnQuY29sdW1uLCBlbmRMaW5lTnVtYmVyOiBlbmQubGluZU51bWJlciwgZW5kQ29sdW1uOiBlbmQuY29sdW1uIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldFZhbHVlSW5SYW5nZShuZXdFZGl0LnJhbmdlKSAhPT0gbmV3RWRpdC50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdFZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFzdEVvbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGVvbDogbGFzdEVvbCwgdGV4dDogJycsIHJhbmdlOiB7IHN0YXJ0TGluZU51bWJlcjogMCwgc3RhcnRDb2x1bW46IDAsIGVuZExpbmVOdW1iZXI6IDAsIGVuZENvbHVtbjogMCB9IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIC0tLS0gRU5EIG1pbmltYWwgZWRpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29tcHV0ZUxpbmtzKG1vZGVsVXJsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2dldE1vZGVsKG1vZGVsVXJsKTtcbiAgICAgICAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb21wdXRlTGlua3MobW9kZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gLS0tIEJFR0lOIGRlZmF1bHQgZG9jdW1lbnQgY29sb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29tcHV0ZURlZmF1bHREb2N1bWVudENvbG9ycyhtb2RlbFVybCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9nZXRNb2RlbChtb2RlbFVybCk7XG4gICAgICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZURlZmF1bHREb2N1bWVudENvbG9ycyhtb2RlbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0ZXh0dWFsU3VnZ2VzdChtb2RlbFVybHMsIGxlYWRpbmdXb3JkLCB3b3JkRGVmLCB3b3JkRGVmRmxhZ3MpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHN3ID0gbmV3IFN0b3BXYXRjaCgpO1xuICAgICAgICAgICAgY29uc3Qgd29yZERlZlJlZ0V4cCA9IG5ldyBSZWdFeHAod29yZERlZiwgd29yZERlZkZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBvdXRlcjogZm9yIChjb25zdCB1cmwgb2YgbW9kZWxVcmxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9nZXRNb2RlbCh1cmwpO1xuICAgICAgICAgICAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiBtb2RlbC53b3Jkcyh3b3JkRGVmUmVnRXhwKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod29yZCA9PT0gbGVhZGluZ1dvcmQgfHwgIWlzTmFOKE51bWJlcih3b3JkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKHdvcmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2Vlbi5zaXplID4gRWRpdG9yU2ltcGxlV29ya2VyLl9zdWdnZXN0aW9uc0xpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHdvcmRzOiBBcnJheS5mcm9tKHNlZW4pLCBkdXJhdGlvbjogc3cuZWxhcHNlZCgpIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyAtLS0tIEVORCBzdWdnZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8jcmVnaW9uIC0tIHdvcmQgcmFuZ2VzIC0tXG4gICAgY29tcHV0ZVdvcmRSYW5nZXMobW9kZWxVcmwsIHJhbmdlLCB3b3JkRGVmLCB3b3JkRGVmRmxhZ3MpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fZ2V0TW9kZWwobW9kZWxVcmwpO1xuICAgICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd29yZERlZlJlZ0V4cCA9IG5ldyBSZWdFeHAod29yZERlZiwgd29yZERlZkZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICBmb3IgKGxldCBsaW5lID0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyOyBsaW5lIDwgcmFuZ2UuZW5kTGluZU51bWJlcjsgbGluZSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZHMgPSBtb2RlbC5nZXRMaW5lV29yZHMobGluZSwgd29yZERlZlJlZ0V4cCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIHdvcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oTnVtYmVyKHdvcmQud29yZCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSByZXN1bHRbd29yZC53b3JkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3b3JkLndvcmRdID0gYXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6IGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRDb2x1bW46IHdvcmQuZW5kQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyNlbmRyZWdpb25cbiAgICBuYXZpZ2F0ZVZhbHVlU2V0KG1vZGVsVXJsLCByYW5nZSwgdXAsIHdvcmREZWYsIHdvcmREZWZGbGFncykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9nZXRNb2RlbChtb2RlbFVybCk7XG4gICAgICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3b3JkRGVmUmVnRXhwID0gbmV3IFJlZ0V4cCh3b3JkRGVmLCB3b3JkRGVmRmxhZ3MpO1xuICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29sdW1uID09PSByYW5nZS5lbmRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByYW5nZS5zdGFydExpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiByYW5nZS5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgZW5kTGluZU51bWJlcjogcmFuZ2UuZW5kTGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiByYW5nZS5lbmRDb2x1bW4gKyAxXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblRleHQgPSBtb2RlbC5nZXRWYWx1ZUluUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgY29uc3Qgd29yZFJhbmdlID0gbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24oeyBsaW5lTnVtYmVyOiByYW5nZS5zdGFydExpbmVOdW1iZXIsIGNvbHVtbjogcmFuZ2Uuc3RhcnRDb2x1bW4gfSwgd29yZERlZlJlZ0V4cCk7XG4gICAgICAgICAgICBpZiAoIXdvcmRSYW5nZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFZhbHVlSW5SYW5nZSh3b3JkUmFuZ2UpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gQmFzaWNJbnBsYWNlUmVwbGFjZS5JTlNUQU5DRS5uYXZpZ2F0ZVZhbHVlU2V0KHJhbmdlLCBzZWxlY3Rpb25UZXh0LCB3b3JkUmFuZ2UsIHdvcmQsIHVwKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyAtLS0tIEJFR0lOIGZvcmVpZ24gbW9kdWxlIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsb2FkRm9yZWlnbk1vZHVsZShtb2R1bGVJZCwgY3JlYXRlRGF0YSwgZm9yZWlnbkhvc3RNZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHByb3h5TWV0aG9kUmVxdWVzdCA9IChtZXRob2QsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ob3N0LmZocihtZXRob2QsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmb3JlaWduSG9zdCA9IGNyZWF0ZVByb3h5T2JqZWN0KGZvcmVpZ25Ib3N0TWV0aG9kcywgcHJveHlNZXRob2RSZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgaG9zdDogZm9yZWlnbkhvc3QsXG4gICAgICAgICAgICBnZXRNaXJyb3JNb2RlbHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TW9kZWxzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeSkge1xuICAgICAgICAgICAgdGhpcy5fZm9yZWlnbk1vZHVsZSA9IHRoaXMuX2ZvcmVpZ25Nb2R1bGVGYWN0b3J5KGN0eCwgY3JlYXRlRGF0YSk7XG4gICAgICAgICAgICAvLyBzdGF0aWMgZm9yZWluZyBtb2R1bGVcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZ2V0QWxsTWV0aG9kTmFtZXModGhpcy5fZm9yZWlnbk1vZHVsZSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVTTS1jb21tZW50LWJlZ2luXG4gICAgICAgIC8vIFx0XHRyZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIFx0XHRcdHJlcXVpcmUoW21vZHVsZUlkXSwgKGZvcmVpZ25Nb2R1bGU6IHsgY3JlYXRlOiBJRm9yZWlnbk1vZHVsZUZhY3RvcnkgfSkgPT4ge1xuICAgICAgICAvLyBcdFx0XHRcdHRoaXMuX2ZvcmVpZ25Nb2R1bGUgPSBmb3JlaWduTW9kdWxlLmNyZWF0ZShjdHgsIGNyZWF0ZURhdGEpO1xuICAgICAgICAvLyBcbiAgICAgICAgLy8gXHRcdFx0XHRyZXNvbHZlKGdldEFsbE1ldGhvZE5hbWVzKHRoaXMuX2ZvcmVpZ25Nb2R1bGUpKTtcbiAgICAgICAgLy8gXG4gICAgICAgIC8vIFx0XHRcdH0sIHJlamVjdCk7XG4gICAgICAgIC8vIFx0XHR9KTtcbiAgICAgICAgLy8gRVNNLWNvbW1lbnQtZW5kXG4gICAgICAgIC8vIEVTTS11bmNvbW1lbnQtYmVnaW5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5leHBlY3RlZCB1c2FnZWApKTtcbiAgICAgICAgLy8gRVNNLXVuY29tbWVudC1lbmRcbiAgICB9XG4gICAgLy8gZm9yZWlnbiBtZXRob2QgcmVxdWVzdFxuICAgIGZtcihtZXRob2QsIGFyZ3MpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mb3JlaWduTW9kdWxlIHx8IHR5cGVvZiB0aGlzLl9mb3JlaWduTW9kdWxlW21ldGhvZF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWVzdEhhbmRsZXIgb3IgbWV0aG9kOiAnICsgbWV0aG9kKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZm9yZWlnbk1vZHVsZVttZXRob2RdLmFwcGx5KHRoaXMuX2ZvcmVpZ25Nb2R1bGUsIGFyZ3MpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gLS0tLSBFTkQgZGlmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gLS0tLSBCRUdJTiBtaW5pbWFsIGVkaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuRWRpdG9yU2ltcGxlV29ya2VyLl9kaWZmTGltaXQgPSAxMDAwMDA7XG4vLyAtLS0tIEJFR0lOIHN1Z2dlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkVkaXRvclNpbXBsZVdvcmtlci5fc3VnZ2VzdGlvbnNMaW1pdCA9IDEwMDAwO1xuLyoqXG4gKiBDYWxsZWQgb24gdGhlIHdvcmtlciBzaWRlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShob3N0KSB7XG4gICAgcmV0dXJuIG5ldyBFZGl0b3JTaW1wbGVXb3JrZXIoaG9zdCwgbnVsbCk7XG59XG5pZiAodHlwZW9mIGltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBSdW5uaW5nIGluIGEgd2ViIHdvcmtlclxuICAgIGdsb2JhbFRoaXMubW9uYWNvID0gY3JlYXRlTW9uYWNvQmFzZUFQSSgpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBTaW1wbGVXb3JrZXJTZXJ2ZXIgfSBmcm9tICcuLi9iYXNlL2NvbW1vbi93b3JrZXIvc2ltcGxlV29ya2VyLmpzJztcbmltcG9ydCB7IEVkaXRvclNpbXBsZVdvcmtlciB9IGZyb20gJy4vY29tbW9uL3NlcnZpY2VzL2VkaXRvclNpbXBsZVdvcmtlci5qcyc7XG5sZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplKGZvcmVpZ25Nb2R1bGUpIHtcbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgY29uc3Qgc2ltcGxlV29ya2VyID0gbmV3IFNpbXBsZVdvcmtlclNlcnZlcigobXNnKSA9PiB7XG4gICAgICAgIGdsb2JhbFRoaXMucG9zdE1lc3NhZ2UobXNnKTtcbiAgICB9LCAoaG9zdCkgPT4gbmV3IEVkaXRvclNpbXBsZVdvcmtlcihob3N0LCBmb3JlaWduTW9kdWxlKSk7XG4gICAgZ2xvYmFsVGhpcy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuICAgICAgICBzaW1wbGVXb3JrZXIub25tZXNzYWdlKGUuZGF0YSk7XG4gICAgfTtcbn1cbmdsb2JhbFRoaXMub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAvLyBJZ25vcmUgZmlyc3QgbWVzc2FnZSBpbiB0aGlzIGNhc2UgYW5kIGluaXRpYWxpemUgaWYgbm90IHlldCBpbml0aWFsaXplZFxuICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgaW5pdGlhbGl6ZShudWxsKTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7078\n");
/***/ })
/******/ });
/************************************************************************/
/******/ // The require scope
/******/ var __webpack_require__ = {};
/******/
/************************************************************************/
/******/ /* webpack/runtime/global */
/******/ (() => {
/******/ __webpack_require__.g = (function() {
/******/ if (typeof globalThis === 'object') return globalThis;
/******/ try {
/******/ return this || new Function('return this')();
/******/ } catch (e) {
/******/ if (typeof window === 'object') return window;
/******/ }
/******/ })();
/******/ })();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
/******/ var __webpack_exports__ = {};
/******/ __webpack_modules__[7078](0, __webpack_exports__, __webpack_require__);
/******/
/******/ })()
;