blob: a87d81af66815726fedc7e2149d05277d95fbf49 [file]
import { createWriteStream, createReadStream } from 'node:fs';
import { readFile, stat, readdir, readlink } from 'node:fs/promises';
import * as path from 'node:path';
import { Readable as Readable$2 } from 'node:stream';
import { pathToFileURL } from 'node:url';
import { createGzip } from 'node:zlib';
import require$$0$1 from 'stream';
import require$$0 from 'buffer';
import require$$2 from 'events';
import require$$13 from 'string_decoder';
import require$$0$2 from 'fs';
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function getAugmentedNamespace(n) {
var f = n.default;
if (typeof f == "function") {
var a = function () {
return f.apply(this, arguments);
};
a.prototype = f.prototype;
} else a = {};
Object.defineProperty(a, '__esModule', {value: true});
Object.keys(n).forEach(function (k) {
var d = Object.getOwnPropertyDescriptor(n, k);
Object.defineProperty(a, k, d.get ? d : {
enumerable: true,
get: function () {
return n[k];
}
});
});
return a;
}
var bl = {exports: {}};
var ours = {exports: {}};
var stream = {exports: {}};
var primordials;
var hasRequiredPrimordials;
function requirePrimordials () {
if (hasRequiredPrimordials) return primordials;
hasRequiredPrimordials = 1;
/*
This file is a reduced and adapted version of the main lib/internal/per_context/primordials.js file defined at
https://github.com/nodejs/node/blob/master/lib/internal/per_context/primordials.js
Don't try to replace with the original file and keep it up to date with the upstream file.
*/
primordials = {
ArrayIsArray(self) {
return Array.isArray(self)
},
ArrayPrototypeIncludes(self, el) {
return self.includes(el)
},
ArrayPrototypeIndexOf(self, el) {
return self.indexOf(el)
},
ArrayPrototypeJoin(self, sep) {
return self.join(sep)
},
ArrayPrototypeMap(self, fn) {
return self.map(fn)
},
ArrayPrototypePop(self, el) {
return self.pop(el)
},
ArrayPrototypePush(self, el) {
return self.push(el)
},
ArrayPrototypeSlice(self, start, end) {
return self.slice(start, end)
},
Error,
FunctionPrototypeCall(fn, thisArgs, ...args) {
return fn.call(thisArgs, ...args)
},
FunctionPrototypeSymbolHasInstance(self, instance) {
return Function.prototype[Symbol.hasInstance].call(self, instance)
},
MathFloor: Math.floor,
Number,
NumberIsInteger: Number.isInteger,
NumberIsNaN: Number.isNaN,
NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER,
NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER,
NumberParseInt: Number.parseInt,
ObjectDefineProperties(self, props) {
return Object.defineProperties(self, props)
},
ObjectDefineProperty(self, name, prop) {
return Object.defineProperty(self, name, prop)
},
ObjectGetOwnPropertyDescriptor(self, name) {
return Object.getOwnPropertyDescriptor(self, name)
},
ObjectKeys(obj) {
return Object.keys(obj)
},
ObjectSetPrototypeOf(target, proto) {
return Object.setPrototypeOf(target, proto)
},
Promise,
PromisePrototypeCatch(self, fn) {
return self.catch(fn)
},
PromisePrototypeThen(self, thenFn, catchFn) {
return self.then(thenFn, catchFn)
},
PromiseReject(err) {
return Promise.reject(err)
},
ReflectApply: Reflect.apply,
RegExpPrototypeTest(self, value) {
return self.test(value)
},
SafeSet: Set,
String,
StringPrototypeSlice(self, start, end) {
return self.slice(start, end)
},
StringPrototypeToLowerCase(self) {
return self.toLowerCase()
},
StringPrototypeToUpperCase(self) {
return self.toUpperCase()
},
StringPrototypeTrim(self) {
return self.trim()
},
Symbol,
SymbolAsyncIterator: Symbol.asyncIterator,
SymbolHasInstance: Symbol.hasInstance,
SymbolIterator: Symbol.iterator,
TypedArrayPrototypeSet(self, buf, len) {
return self.set(buf, len)
},
Uint8Array
};
return primordials;
}
var util = {exports: {}};
var hasRequiredUtil;
function requireUtil () {
if (hasRequiredUtil) return util.exports;
hasRequiredUtil = 1;
(function (module) {
const bufferModule = require$$0;
const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;
const Blob = globalThis.Blob || bufferModule.Blob;
/* eslint-disable indent */
const isBlob =
typeof Blob !== 'undefined'
? function isBlob(b) {
// eslint-disable-next-line indent
return b instanceof Blob
}
: function isBlob(b) {
return false
};
/* eslint-enable indent */
// This is a simplified version of AggregateError
class AggregateError extends Error {
constructor(errors) {
if (!Array.isArray(errors)) {
throw new TypeError(`Expected input to be an Array, got ${typeof errors}`)
}
let message = '';
for (let i = 0; i < errors.length; i++) {
message += ` ${errors[i].stack}\n`;
}
super(message);
this.name = 'AggregateError';
this.errors = errors;
}
}
module.exports = {
AggregateError,
kEmptyObject: Object.freeze({}),
once(callback) {
let called = false;
return function (...args) {
if (called) {
return
}
called = true;
callback.apply(this, args);
}
},
createDeferredPromise: function () {
let resolve;
let reject;
// eslint-disable-next-line promise/param-names
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return {
promise,
resolve,
reject
}
},
promisify(fn) {
return new Promise((resolve, reject) => {
fn((err, ...args) => {
if (err) {
return reject(err)
}
return resolve(...args)
});
})
},
debuglog() {
return function () {}
},
format(format, ...args) {
// Simplified version of https://nodejs.org/api/util.html#utilformatformat-args
return format.replace(/%([sdifj])/g, function (...[_unused, type]) {
const replacement = args.shift();
if (type === 'f') {
return replacement.toFixed(6)
} else if (type === 'j') {
return JSON.stringify(replacement)
} else if (type === 's' && typeof replacement === 'object') {
const ctor = replacement.constructor !== Object ? replacement.constructor.name : '';
return `${ctor} {}`.trim()
} else {
return replacement.toString()
}
})
},
inspect(value) {
// Vastly simplified version of https://nodejs.org/api/util.html#utilinspectobject-options
switch (typeof value) {
case 'string':
if (value.includes("'")) {
if (!value.includes('"')) {
return `"${value}"`
} else if (!value.includes('`') && !value.includes('${')) {
return `\`${value}\``
}
}
return `'${value}'`
case 'number':
if (isNaN(value)) {
return 'NaN'
} else if (Object.is(value, -0)) {
return String(value)
}
return value
case 'bigint':
return `${String(value)}n`
case 'boolean':
case 'undefined':
return String(value)
case 'object':
return '{}'
}
},
types: {
isAsyncFunction(fn) {
return fn instanceof AsyncFunction
},
isArrayBufferView(arr) {
return ArrayBuffer.isView(arr)
}
},
isBlob
};
module.exports.promisify.custom = Symbol.for('nodejs.util.promisify.custom');
} (util));
return util.exports;
}
var operators = {};
/**
* @author Toru Nagashima <https://github.com/mysticatea>
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
/**
* @typedef {object} PrivateData
* @property {EventTarget} eventTarget The event target.
* @property {{type:string}} event The original event object.
* @property {number} eventPhase The current event phase.
* @property {EventTarget|null} currentTarget The current event target.
* @property {boolean} canceled The flag to prevent default.
* @property {boolean} stopped The flag to stop propagation.
* @property {boolean} immediateStopped The flag to stop propagation immediately.
* @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null.
* @property {number} timeStamp The unix time.
* @private
*/
/**
* Private data for event wrappers.
* @type {WeakMap<Event, PrivateData>}
* @private
*/
const privateData = new WeakMap();
/**
* Cache for wrapper classes.
* @type {WeakMap<Object, Function>}
* @private
*/
const wrappers = new WeakMap();
/**
* Get private data.
* @param {Event} event The event object to get private data.
* @returns {PrivateData} The private data of the event.
* @private
*/
function pd(event) {
const retv = privateData.get(event);
console.assert(
retv != null,
"'this' is expected an Event object, but got",
event
);
return retv
}
/**
* https://dom.spec.whatwg.org/#set-the-canceled-flag
* @param data {PrivateData} private data.
*/
function setCancelFlag(data) {
if (data.passiveListener != null) {
if (
typeof console !== "undefined" &&
typeof console.error === "function"
) {
console.error(
"Unable to preventDefault inside passive event listener invocation.",
data.passiveListener
);
}
return
}
if (!data.event.cancelable) {
return
}
data.canceled = true;
if (typeof data.event.preventDefault === "function") {
data.event.preventDefault();
}
}
/**
* @see https://dom.spec.whatwg.org/#interface-event
* @private
*/
/**
* The event wrapper.
* @constructor
* @param {EventTarget} eventTarget The event target of this dispatching.
* @param {Event|{type:string}} event The original event to wrap.
*/
function Event(eventTarget, event) {
privateData.set(this, {
eventTarget,
event,
eventPhase: 2,
currentTarget: eventTarget,
canceled: false,
stopped: false,
immediateStopped: false,
passiveListener: null,
timeStamp: event.timeStamp || Date.now(),
});
// https://heycam.github.io/webidl/#Unforgeable
Object.defineProperty(this, "isTrusted", { value: false, enumerable: true });
// Define accessors
const keys = Object.keys(event);
for (let i = 0; i < keys.length; ++i) {
const key = keys[i];
if (!(key in this)) {
Object.defineProperty(this, key, defineRedirectDescriptor(key));
}
}
}
// Should be enumerable, but class methods are not enumerable.
Event.prototype = {
/**
* The type of this event.
* @type {string}
*/
get type() {
return pd(this).event.type
},
/**
* The target of this event.
* @type {EventTarget}
*/
get target() {
return pd(this).eventTarget
},
/**
* The target of this event.
* @type {EventTarget}
*/
get currentTarget() {
return pd(this).currentTarget
},
/**
* @returns {EventTarget[]} The composed path of this event.
*/
composedPath() {
const currentTarget = pd(this).currentTarget;
if (currentTarget == null) {
return []
}
return [currentTarget]
},
/**
* Constant of NONE.
* @type {number}
*/
get NONE() {
return 0
},
/**
* Constant of CAPTURING_PHASE.
* @type {number}
*/
get CAPTURING_PHASE() {
return 1
},
/**
* Constant of AT_TARGET.
* @type {number}
*/
get AT_TARGET() {
return 2
},
/**
* Constant of BUBBLING_PHASE.
* @type {number}
*/
get BUBBLING_PHASE() {
return 3
},
/**
* The target of this event.
* @type {number}
*/
get eventPhase() {
return pd(this).eventPhase
},
/**
* Stop event bubbling.
* @returns {void}
*/
stopPropagation() {
const data = pd(this);
data.stopped = true;
if (typeof data.event.stopPropagation === "function") {
data.event.stopPropagation();
}
},
/**
* Stop event bubbling.
* @returns {void}
*/
stopImmediatePropagation() {
const data = pd(this);
data.stopped = true;
data.immediateStopped = true;
if (typeof data.event.stopImmediatePropagation === "function") {
data.event.stopImmediatePropagation();
}
},
/**
* The flag to be bubbling.
* @type {boolean}
*/
get bubbles() {
return Boolean(pd(this).event.bubbles)
},
/**
* The flag to be cancelable.
* @type {boolean}
*/
get cancelable() {
return Boolean(pd(this).event.cancelable)
},
/**
* Cancel this event.
* @returns {void}
*/
preventDefault() {
setCancelFlag(pd(this));
},
/**
* The flag to indicate cancellation state.
* @type {boolean}
*/
get defaultPrevented() {
return pd(this).canceled
},
/**
* The flag to be composed.
* @type {boolean}
*/
get composed() {
return Boolean(pd(this).event.composed)
},
/**
* The unix time of this event.
* @type {number}
*/
get timeStamp() {
return pd(this).timeStamp
},
/**
* The target of this event.
* @type {EventTarget}
* @deprecated
*/
get srcElement() {
return pd(this).eventTarget
},
/**
* The flag to stop event bubbling.
* @type {boolean}
* @deprecated
*/
get cancelBubble() {
return pd(this).stopped
},
set cancelBubble(value) {
if (!value) {
return
}
const data = pd(this);
data.stopped = true;
if (typeof data.event.cancelBubble === "boolean") {
data.event.cancelBubble = true;
}
},
/**
* The flag to indicate cancellation state.
* @type {boolean}
* @deprecated
*/
get returnValue() {
return !pd(this).canceled
},
set returnValue(value) {
if (!value) {
setCancelFlag(pd(this));
}
},
/**
* Initialize this event object. But do nothing under event dispatching.
* @param {string} type The event type.
* @param {boolean} [bubbles=false] The flag to be possible to bubble up.
* @param {boolean} [cancelable=false] The flag to be possible to cancel.
* @deprecated
*/
initEvent() {
// Do nothing.
},
};
// `constructor` is not enumerable.
Object.defineProperty(Event.prototype, "constructor", {
value: Event,
configurable: true,
writable: true,
});
// Ensure `event instanceof window.Event` is `true`.
if (typeof window !== "undefined" && typeof window.Event !== "undefined") {
Object.setPrototypeOf(Event.prototype, window.Event.prototype);
// Make association for wrappers.
wrappers.set(window.Event.prototype, Event);
}
/**
* Get the property descriptor to redirect a given property.
* @param {string} key Property name to define property descriptor.
* @returns {PropertyDescriptor} The property descriptor to redirect the property.
* @private
*/
function defineRedirectDescriptor(key) {
return {
get() {
return pd(this).event[key]
},
set(value) {
pd(this).event[key] = value;
},
configurable: true,
enumerable: true,
}
}
/**
* Get the property descriptor to call a given method property.
* @param {string} key Property name to define property descriptor.
* @returns {PropertyDescriptor} The property descriptor to call the method property.
* @private
*/
function defineCallDescriptor(key) {
return {
value() {
const event = pd(this).event;
return event[key].apply(event, arguments)
},
configurable: true,
enumerable: true,
}
}
/**
* Define new wrapper class.
* @param {Function} BaseEvent The base wrapper class.
* @param {Object} proto The prototype of the original event.
* @returns {Function} The defined wrapper class.
* @private
*/
function defineWrapper(BaseEvent, proto) {
const keys = Object.keys(proto);
if (keys.length === 0) {
return BaseEvent
}
/** CustomEvent */
function CustomEvent(eventTarget, event) {
BaseEvent.call(this, eventTarget, event);
}
CustomEvent.prototype = Object.create(BaseEvent.prototype, {
constructor: { value: CustomEvent, configurable: true, writable: true },
});
// Define accessors.
for (let i = 0; i < keys.length; ++i) {
const key = keys[i];
if (!(key in BaseEvent.prototype)) {
const descriptor = Object.getOwnPropertyDescriptor(proto, key);
const isFunc = typeof descriptor.value === "function";
Object.defineProperty(
CustomEvent.prototype,
key,
isFunc
? defineCallDescriptor(key)
: defineRedirectDescriptor(key)
);
}
}
return CustomEvent
}
/**
* Get the wrapper class of a given prototype.
* @param {Object} proto The prototype of the original event to get its wrapper.
* @returns {Function} The wrapper class.
* @private
*/
function getWrapper(proto) {
if (proto == null || proto === Object.prototype) {
return Event
}
let wrapper = wrappers.get(proto);
if (wrapper == null) {
wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto);
wrappers.set(proto, wrapper);
}
return wrapper
}
/**
* Wrap a given event to management a dispatching.
* @param {EventTarget} eventTarget The event target of this dispatching.
* @param {Object} event The event to wrap.
* @returns {Event} The wrapper instance.
* @private
*/
function wrapEvent(eventTarget, event) {
const Wrapper = getWrapper(Object.getPrototypeOf(event));
return new Wrapper(eventTarget, event)
}
/**
* Get the immediateStopped flag of a given event.
* @param {Event} event The event to get.
* @returns {boolean} The flag to stop propagation immediately.
* @private
*/
function isStopped(event) {
return pd(event).immediateStopped
}
/**
* Set the current event phase of a given event.
* @param {Event} event The event to set current target.
* @param {number} eventPhase New event phase.
* @returns {void}
* @private
*/
function setEventPhase(event, eventPhase) {
pd(event).eventPhase = eventPhase;
}
/**
* Set the current target of a given event.
* @param {Event} event The event to set current target.
* @param {EventTarget|null} currentTarget New current target.
* @returns {void}
* @private
*/
function setCurrentTarget(event, currentTarget) {
pd(event).currentTarget = currentTarget;
}
/**
* Set a passive listener of a given event.
* @param {Event} event The event to set current target.
* @param {Function|null} passiveListener New passive listener.
* @returns {void}
* @private
*/
function setPassiveListener(event, passiveListener) {
pd(event).passiveListener = passiveListener;
}
/**
* @typedef {object} ListenerNode
* @property {Function} listener
* @property {1|2|3} listenerType
* @property {boolean} passive
* @property {boolean} once
* @property {ListenerNode|null} next
* @private
*/
/**
* @type {WeakMap<object, Map<string, ListenerNode>>}
* @private
*/
const listenersMap = new WeakMap();
// Listener types
const CAPTURE = 1;
const BUBBLE = 2;
const ATTRIBUTE = 3;
/**
* Check whether a given value is an object or not.
* @param {any} x The value to check.
* @returns {boolean} `true` if the value is an object.
*/
function isObject(x) {
return x !== null && typeof x === "object" //eslint-disable-line no-restricted-syntax
}
/**
* Get listeners.
* @param {EventTarget} eventTarget The event target to get.
* @returns {Map<string, ListenerNode>} The listeners.
* @private
*/
function getListeners(eventTarget) {
const listeners = listenersMap.get(eventTarget);
if (listeners == null) {
throw new TypeError(
"'this' is expected an EventTarget object, but got another value."
)
}
return listeners
}
/**
* Get the property descriptor for the event attribute of a given event.
* @param {string} eventName The event name to get property descriptor.
* @returns {PropertyDescriptor} The property descriptor.
* @private
*/
function defineEventAttributeDescriptor(eventName) {
return {
get() {
const listeners = getListeners(this);
let node = listeners.get(eventName);
while (node != null) {
if (node.listenerType === ATTRIBUTE) {
return node.listener
}
node = node.next;
}
return null
},
set(listener) {
if (typeof listener !== "function" && !isObject(listener)) {
listener = null; // eslint-disable-line no-param-reassign
}
const listeners = getListeners(this);
// Traverse to the tail while removing old value.
let prev = null;
let node = listeners.get(eventName);
while (node != null) {
if (node.listenerType === ATTRIBUTE) {
// Remove old value.
if (prev !== null) {
prev.next = node.next;
} else if (node.next !== null) {
listeners.set(eventName, node.next);
} else {
listeners.delete(eventName);
}
} else {
prev = node;
}
node = node.next;
}
// Add new value.
if (listener !== null) {
const newNode = {
listener,
listenerType: ATTRIBUTE,
passive: false,
once: false,
next: null,
};
if (prev === null) {
listeners.set(eventName, newNode);
} else {
prev.next = newNode;
}
}
},
configurable: true,
enumerable: true,
}
}
/**
* Define an event attribute (e.g. `eventTarget.onclick`).
* @param {Object} eventTargetPrototype The event target prototype to define an event attrbite.
* @param {string} eventName The event name to define.
* @returns {void}
*/
function defineEventAttribute(eventTargetPrototype, eventName) {
Object.defineProperty(
eventTargetPrototype,
`on${eventName}`,
defineEventAttributeDescriptor(eventName)
);
}
/**
* Define a custom EventTarget with event attributes.
* @param {string[]} eventNames Event names for event attributes.
* @returns {EventTarget} The custom EventTarget.
* @private
*/
function defineCustomEventTarget(eventNames) {
/** CustomEventTarget */
function CustomEventTarget() {
EventTarget.call(this);
}
CustomEventTarget.prototype = Object.create(EventTarget.prototype, {
constructor: {
value: CustomEventTarget,
configurable: true,
writable: true,
},
});
for (let i = 0; i < eventNames.length; ++i) {
defineEventAttribute(CustomEventTarget.prototype, eventNames[i]);
}
return CustomEventTarget
}
/**
* EventTarget.
*
* - This is constructor if no arguments.
* - This is a function which returns a CustomEventTarget constructor if there are arguments.
*
* For example:
*
* class A extends EventTarget {}
* class B extends EventTarget("message") {}
* class C extends EventTarget("message", "error") {}
* class D extends EventTarget(["message", "error"]) {}
*/
function EventTarget() {
/*eslint-disable consistent-return */
if (this instanceof EventTarget) {
listenersMap.set(this, new Map());
return
}
if (arguments.length === 1 && Array.isArray(arguments[0])) {
return defineCustomEventTarget(arguments[0])
}
if (arguments.length > 0) {
const types = new Array(arguments.length);
for (let i = 0; i < arguments.length; ++i) {
types[i] = arguments[i];
}
return defineCustomEventTarget(types)
}
throw new TypeError("Cannot call a class as a function")
/*eslint-enable consistent-return */
}
// Should be enumerable, but class methods are not enumerable.
EventTarget.prototype = {
/**
* Add a given listener to this event target.
* @param {string} eventName The event name to add.
* @param {Function} listener The listener to add.
* @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.
* @returns {void}
*/
addEventListener(eventName, listener, options) {
if (listener == null) {
return
}
if (typeof listener !== "function" && !isObject(listener)) {
throw new TypeError("'listener' should be a function or an object.")
}
const listeners = getListeners(this);
const optionsIsObj = isObject(options);
const capture = optionsIsObj
? Boolean(options.capture)
: Boolean(options);
const listenerType = capture ? CAPTURE : BUBBLE;
const newNode = {
listener,
listenerType,
passive: optionsIsObj && Boolean(options.passive),
once: optionsIsObj && Boolean(options.once),
next: null,
};
// Set it as the first node if the first node is null.
let node = listeners.get(eventName);
if (node === undefined) {
listeners.set(eventName, newNode);
return
}
// Traverse to the tail while checking duplication..
let prev = null;
while (node != null) {
if (
node.listener === listener &&
node.listenerType === listenerType
) {
// Should ignore duplication.
return
}
prev = node;
node = node.next;
}
// Add it.
prev.next = newNode;
},
/**
* Remove a given listener from this event target.
* @param {string} eventName The event name to remove.
* @param {Function} listener The listener to remove.
* @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.
* @returns {void}
*/
removeEventListener(eventName, listener, options) {
if (listener == null) {
return
}
const listeners = getListeners(this);
const capture = isObject(options)
? Boolean(options.capture)
: Boolean(options);
const listenerType = capture ? CAPTURE : BUBBLE;
let prev = null;
let node = listeners.get(eventName);
while (node != null) {
if (
node.listener === listener &&
node.listenerType === listenerType
) {
if (prev !== null) {
prev.next = node.next;
} else if (node.next !== null) {
listeners.set(eventName, node.next);
} else {
listeners.delete(eventName);
}
return
}
prev = node;
node = node.next;
}
},
/**
* Dispatch a given event.
* @param {Event|{type:string}} event The event to dispatch.
* @returns {boolean} `false` if canceled.
*/
dispatchEvent(event) {
if (event == null || typeof event.type !== "string") {
throw new TypeError('"event.type" should be a string.')
}
// If listeners aren't registered, terminate.
const listeners = getListeners(this);
const eventName = event.type;
let node = listeners.get(eventName);
if (node == null) {
return true
}
// Since we cannot rewrite several properties, so wrap object.
const wrappedEvent = wrapEvent(this, event);
// This doesn't process capturing phase and bubbling phase.
// This isn't participating in a tree.
let prev = null;
while (node != null) {
// Remove this listener if it's once
if (node.once) {
if (prev !== null) {
prev.next = node.next;
} else if (node.next !== null) {
listeners.set(eventName, node.next);
} else {
listeners.delete(eventName);
}
} else {
prev = node;
}
// Call this listener
setPassiveListener(
wrappedEvent,
node.passive ? node.listener : null
);
if (typeof node.listener === "function") {
try {
node.listener.call(this, wrappedEvent);
} catch (err) {
if (
typeof console !== "undefined" &&
typeof console.error === "function"
) {
console.error(err);
}
}
} else if (
node.listenerType !== ATTRIBUTE &&
typeof node.listener.handleEvent === "function"
) {
node.listener.handleEvent(wrappedEvent);
}
// Break if `event.stopImmediatePropagation` was called.
if (isStopped(wrappedEvent)) {
break
}
node = node.next;
}
setPassiveListener(wrappedEvent, null);
setEventPhase(wrappedEvent, 0);
setCurrentTarget(wrappedEvent, null);
return !wrappedEvent.defaultPrevented
},
};
// `constructor` is not enumerable.
Object.defineProperty(EventTarget.prototype, "constructor", {
value: EventTarget,
configurable: true,
writable: true,
});
// Ensure `eventTarget instanceof window.EventTarget` is `true`.
if (
typeof window !== "undefined" &&
typeof window.EventTarget !== "undefined"
) {
Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype);
}
/**
* @author Toru Nagashima <https://github.com/mysticatea>
* See LICENSE file in root directory for full license.
*/
/**
* The signal class.
* @see https://dom.spec.whatwg.org/#abortsignal
*/
class AbortSignal extends EventTarget {
/**
* AbortSignal cannot be constructed directly.
*/
constructor() {
super();
throw new TypeError("AbortSignal cannot be constructed directly");
}
/**
* Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise.
*/
get aborted() {
const aborted = abortedFlags.get(this);
if (typeof aborted !== "boolean") {
throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`);
}
return aborted;
}
}
defineEventAttribute(AbortSignal.prototype, "abort");
/**
* Create an AbortSignal object.
*/
function createAbortSignal() {
const signal = Object.create(AbortSignal.prototype);
EventTarget.call(signal);
abortedFlags.set(signal, false);
return signal;
}
/**
* Abort a given signal.
*/
function abortSignal(signal) {
if (abortedFlags.get(signal) !== false) {
return;
}
abortedFlags.set(signal, true);
signal.dispatchEvent({ type: "abort" });
}
/**
* Aborted flag for each instances.
*/
const abortedFlags = new WeakMap();
// Properties should be enumerable.
Object.defineProperties(AbortSignal.prototype, {
aborted: { enumerable: true },
});
// `toString()` should return `"[object AbortSignal]"`
if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") {
Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, {
configurable: true,
value: "AbortSignal",
});
}
/**
* The AbortController.
* @see https://dom.spec.whatwg.org/#abortcontroller
*/
class AbortController {
/**
* Initialize this controller.
*/
constructor() {
signals.set(this, createAbortSignal());
}
/**
* Returns the `AbortSignal` object associated with this object.
*/
get signal() {
return getSignal(this);
}
/**
* Abort and signal to any observers that the associated activity is to be aborted.
*/
abort() {
abortSignal(getSignal(this));
}
}
/**
* Associated signals.
*/
const signals = new WeakMap();
/**
* Get the associated signal of a given controller.
*/
function getSignal(controller) {
const signal = signals.get(controller);
if (signal == null) {
throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`);
}
return signal;
}
// Properties should be enumerable.
Object.defineProperties(AbortController.prototype, {
signal: { enumerable: true },
abort: { enumerable: true },
});
if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") {
Object.defineProperty(AbortController.prototype, Symbol.toStringTag, {
configurable: true,
value: "AbortController",
});
}
var abortController = /*#__PURE__*/Object.freeze({
__proto__: null,
'default': AbortController,
AbortController: AbortController,
AbortSignal: AbortSignal
});
var require$$9 = /*@__PURE__*/getAugmentedNamespace(abortController);
var errors;
var hasRequiredErrors;
function requireErrors () {
if (hasRequiredErrors) return errors;
hasRequiredErrors = 1;
const { format, inspect, AggregateError: CustomAggregateError } = requireUtil();
/*
This file is a reduced and adapted version of the main lib/internal/errors.js file defined at
https://github.com/nodejs/node/blob/master/lib/internal/errors.js
Don't try to replace with the original file and keep it up to date (starting from E(...) definitions)
with the upstream file.
*/
const AggregateError = globalThis.AggregateError || CustomAggregateError;
const kIsNodeError = Symbol('kIsNodeError');
const kTypes = [
'string',
'function',
'number',
'object',
// Accept 'Function' and 'Object' as alternative to the lower cased version.
'Function',
'Object',
'boolean',
'bigint',
'symbol'
];
const classRegExp = /^([A-Z][a-z0-9]*)+$/;
const nodeInternalPrefix = '__node_internal_';
const codes = {};
function assert(value, message) {
if (!value) {
throw new codes.ERR_INTERNAL_ASSERTION(message)
}
}
// Only use this for integers! Decimal numbers do not work with this function.
function addNumericalSeparator(val) {
let res = '';
let i = val.length;
const start = val[0] === '-' ? 1 : 0;
for (; i >= start + 4; i -= 3) {
res = `_${val.slice(i - 3, i)}${res}`;
}
return `${val.slice(0, i)}${res}`
}
function getMessage(key, msg, args) {
if (typeof msg === 'function') {
assert(
msg.length <= args.length,
// Default options do not count.
`Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).`
);
return msg(...args)
}
const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length;
assert(
expectedLength === args.length,
`Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).`
);
if (args.length === 0) {
return msg
}
return format(msg, ...args)
}
function E(code, message, Base) {
if (!Base) {
Base = Error;
}
class NodeError extends Base {
constructor(...args) {
super(getMessage(code, message, args));
}
toString() {
return `${this.name} [${code}]: ${this.message}`
}
}
Object.defineProperties(NodeError.prototype, {
name: {
value: Base.name,
writable: true,
enumerable: false,
configurable: true
},
toString: {
value() {
return `${this.name} [${code}]: ${this.message}`
},
writable: true,
enumerable: false,
configurable: true
}
});
NodeError.prototype.code = code;
NodeError.prototype[kIsNodeError] = true;
codes[code] = NodeError;
}
function hideStackFrames(fn) {
// We rename the functions that will be hidden to cut off the stacktrace
// at the outermost one
const hidden = nodeInternalPrefix + fn.name;
Object.defineProperty(fn, 'name', {
value: hidden
});
return fn
}
function aggregateTwoErrors(innerError, outerError) {
if (innerError && outerError && innerError !== outerError) {
if (Array.isArray(outerError.errors)) {
// If `outerError` is already an `AggregateError`.
outerError.errors.push(innerError);
return outerError
}
const err = new AggregateError([outerError, innerError], outerError.message);
err.code = outerError.code;
return err
}
return innerError || outerError
}
class AbortError extends Error {
constructor(message = 'The operation was aborted', options = undefined) {
if (options !== undefined && typeof options !== 'object') {
throw new codes.ERR_INVALID_ARG_TYPE('options', 'Object', options)
}
super(message, options);
this.code = 'ABORT_ERR';
this.name = 'AbortError';
}
}
E('ERR_ASSERTION', '%s', Error);
E(
'ERR_INVALID_ARG_TYPE',
(name, expected, actual) => {
assert(typeof name === 'string', "'name' must be a string");
if (!Array.isArray(expected)) {
expected = [expected];
}
let msg = 'The ';
if (name.endsWith(' argument')) {
// For cases like 'first argument'
msg += `${name} `;
} else {
msg += `"${name}" ${name.includes('.') ? 'property' : 'argument'} `;
}
msg += 'must be ';
const types = [];
const instances = [];
const other = [];
for (const value of expected) {
assert(typeof value === 'string', 'All expected entries have to be of type string');
if (kTypes.includes(value)) {
types.push(value.toLowerCase());
} else if (classRegExp.test(value)) {
instances.push(value);
} else {
assert(value !== 'object', 'The value "object" should be written as "Object"');
other.push(value);
}
}
// Special handle `object` in case other instances are allowed to outline
// the differences between each other.
if (instances.length > 0) {
const pos = types.indexOf('object');
if (pos !== -1) {
types.splice(types, pos, 1);
instances.push('Object');
}
}
if (types.length > 0) {
switch (types.length) {
case 1:
msg += `of type ${types[0]}`;
break
case 2:
msg += `one of type ${types[0]} or ${types[1]}`;
break
default: {
const last = types.pop();
msg += `one of type ${types.join(', ')}, or ${last}`;
}
}
if (instances.length > 0 || other.length > 0) {
msg += ' or ';
}
}
if (instances.length > 0) {
switch (instances.length) {
case 1:
msg += `an instance of ${instances[0]}`;
break
case 2:
msg += `an instance of ${instances[0]} or ${instances[1]}`;
break
default: {
const last = instances.pop();
msg += `an instance of ${instances.join(', ')}, or ${last}`;
}
}
if (other.length > 0) {
msg += ' or ';
}
}
switch (other.length) {
case 0:
break
case 1:
if (other[0].toLowerCase() !== other[0]) {
msg += 'an ';
}
msg += `${other[0]}`;
break
case 2:
msg += `one of ${other[0]} or ${other[1]}`;
break
default: {
const last = other.pop();
msg += `one of ${other.join(', ')}, or ${last}`;
}
}
if (actual == null) {
msg += `. Received ${actual}`;
} else if (typeof actual === 'function' && actual.name) {
msg += `. Received function ${actual.name}`;
} else if (typeof actual === 'object') {
var _actual$constructor;
if (
(_actual$constructor = actual.constructor) !== null &&
_actual$constructor !== undefined &&
_actual$constructor.name
) {
msg += `. Received an instance of ${actual.constructor.name}`;
} else {
const inspected = inspect(actual, {
depth: -1
});
msg += `. Received ${inspected}`;
}
} else {
let inspected = inspect(actual, {
colors: false
});
if (inspected.length > 25) {
inspected = `${inspected.slice(0, 25)}...`;
}
msg += `. Received type ${typeof actual} (${inspected})`;
}
return msg
},
TypeError
);
E(
'ERR_INVALID_ARG_VALUE',
(name, value, reason = 'is invalid') => {
let inspected = inspect(value);
if (inspected.length > 128) {
inspected = inspected.slice(0, 128) + '...';
}
const type = name.includes('.') ? 'property' : 'argument';
return `The ${type} '${name}' ${reason}. Received ${inspected}`
},
TypeError
);
E(
'ERR_INVALID_RETURN_VALUE',
(input, name, value) => {
var _value$constructor;
const type =
value !== null &&
value !== undefined &&
(_value$constructor = value.constructor) !== null &&
_value$constructor !== undefined &&
_value$constructor.name
? `instance of ${value.constructor.name}`
: `type ${typeof value}`;
return `Expected ${input} to be returned from the "${name}"` + ` function but got ${type}.`
},
TypeError
);
E(
'ERR_MISSING_ARGS',
(...args) => {
assert(args.length > 0, 'At least one arg needs to be specified');
let msg;
const len = args.length;
args = (Array.isArray(args) ? args : [args]).map((a) => `"${a}"`).join(' or ');
switch (len) {
case 1:
msg += `The ${args[0]} argument`;
break
case 2:
msg += `The ${args[0]} and ${args[1]} arguments`;
break
default:
{
const last = args.pop();
msg += `The ${args.join(', ')}, and ${last} arguments`;
}
break
}
return `${msg} must be specified`
},
TypeError
);
E(
'ERR_OUT_OF_RANGE',
(str, range, input) => {
assert(range, 'Missing "range" argument');
let received;
if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {
received = addNumericalSeparator(String(input));
} else if (typeof input === 'bigint') {
received = String(input);
if (input > 2n ** 32n || input < -(2n ** 32n)) {
received = addNumericalSeparator(received);
}
received += 'n';
} else {
received = inspect(input);
}
return `The value of "${str}" is out of range. It must be ${range}. Received ${received}`
},
RangeError
);
E('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times', Error);
E('ERR_METHOD_NOT_IMPLEMENTED', 'The %s method is not implemented', Error);
E('ERR_STREAM_ALREADY_FINISHED', 'Cannot call %s after a stream was finished', Error);
E('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable', Error);
E('ERR_STREAM_DESTROYED', 'Cannot call %s after a stream was destroyed', Error);
E('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
E('ERR_STREAM_PREMATURE_CLOSE', 'Premature close', Error);
E('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF', Error);
E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event', Error);
E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error);
E('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError);
errors = {
AbortError,
aggregateTwoErrors: hideStackFrames(aggregateTwoErrors),
hideStackFrames,
codes
};
return errors;
}
var validators;
var hasRequiredValidators;
function requireValidators () {
if (hasRequiredValidators) return validators;
hasRequiredValidators = 1;
const {
ArrayIsArray,
ArrayPrototypeIncludes,
ArrayPrototypeJoin,
ArrayPrototypeMap,
NumberIsInteger,
NumberIsNaN,
NumberMAX_SAFE_INTEGER,
NumberMIN_SAFE_INTEGER,
NumberParseInt,
ObjectPrototypeHasOwnProperty,
RegExpPrototypeExec,
String,
StringPrototypeToUpperCase,
StringPrototypeTrim
} = requirePrimordials();
const {
hideStackFrames,
codes: { ERR_SOCKET_BAD_PORT, ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE, ERR_UNKNOWN_SIGNAL }
} = requireErrors();
const { normalizeEncoding } = requireUtil();
const { isAsyncFunction, isArrayBufferView } = requireUtil().types;
const signals = {};
/**
* @param {*} value
* @returns {boolean}
*/
function isInt32(value) {
return value === (value | 0)
}
/**
* @param {*} value
* @returns {boolean}
*/
function isUint32(value) {
return value === value >>> 0
}
const octalReg = /^[0-7]+$/;
const modeDesc = 'must be a 32-bit unsigned integer or an octal string';
/**
* Parse and validate values that will be converted into mode_t (the S_*
* constants). Only valid numbers and octal strings are allowed. They could be
* converted to 32-bit unsigned integers or non-negative signed integers in the
* C++ land, but any value higher than 0o777 will result in platform-specific
* behaviors.
*
* @param {*} value Values to be validated
* @param {string} name Name of the argument
* @param {number} [def] If specified, will be returned for invalid values
* @returns {number}
*/
function parseFileMode(value, name, def) {
if (typeof value === 'undefined') {
value = def;
}
if (typeof value === 'string') {
if (RegExpPrototypeExec(octalReg, value) === null) {
throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc)
}
value = NumberParseInt(value, 8);
}
validateUint32(value, name);
return value
}
/**
* @callback validateInteger
* @param {*} value
* @param {string} name
* @param {number} [min]
* @param {number} [max]
* @returns {asserts value is number}
*/
/** @type {validateInteger} */
const validateInteger = hideStackFrames((value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER) => {
if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
if (!NumberIsInteger(value)) throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
if (value < min || value > max) throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
});
/**
* @callback validateInt32
* @param {*} value
* @param {string} name
* @param {number} [min]
* @param {number} [max]
* @returns {asserts value is number}
*/
/** @type {validateInt32} */
const validateInt32 = hideStackFrames((value, name, min = -2147483648, max = 2147483647) => {
// The defaults for min and max correspond to the limits of 32-bit integers.
if (typeof value !== 'number') {
throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
}
if (!NumberIsInteger(value)) {
throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
}
if (value < min || value > max) {
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
}
});
/**
* @callback validateUint32
* @param {*} value
* @param {string} name
* @param {number|boolean} [positive=false]
* @returns {asserts value is number}
*/
/** @type {validateUint32} */
const validateUint32 = hideStackFrames((value, name, positive = false) => {
if (typeof value !== 'number') {
throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
}
if (!NumberIsInteger(value)) {
throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
}
const min = positive ? 1 : 0;
// 2 ** 32 === 4294967296
const max = 4294967295;
if (value < min || value > max) {
throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
}
});
/**
* @callback validateString
* @param {*} value
* @param {string} name
* @returns {asserts value is string}
*/
/** @type {validateString} */
function validateString(value, name) {
if (typeof value !== 'string') throw new ERR_INVALID_ARG_TYPE(name, 'string', value)
}
/**
* @callback validateNumber
* @param {*} value
* @param {string} name
* @param {number} [min]
* @param {number} [max]
* @returns {asserts value is number}
*/
/** @type {validateNumber} */
function validateNumber(value, name, min = undefined, max) {
if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
if (
(min != null && value < min) ||
(max != null && value > max) ||
((min != null || max != null) && NumberIsNaN(value))
) {
throw new ERR_OUT_OF_RANGE(
name,
`${min != null ? `>= ${min}` : ''}${min != null && max != null ? ' && ' : ''}${max != null ? `<= ${max}` : ''}`,
value
)
}
}
/**
* @callback validateOneOf
* @template T
* @param {T} value
* @param {string} name
* @param {T[]} oneOf
*/
/** @type {validateOneOf} */
const validateOneOf = hideStackFrames((value, name, oneOf) => {
if (!ArrayPrototypeIncludes(oneOf, value)) {
const allowed = ArrayPrototypeJoin(
ArrayPrototypeMap(oneOf, (v) => (typeof v === 'string' ? `'${v}'` : String(v))),
', '
);
const reason = 'must be one of: ' + allowed;
throw new ERR_INVALID_ARG_VALUE(name, value, reason)
}
});
/**
* @callback validateBoolean
* @param {*} value
* @param {string} name
* @returns {asserts value is boolean}
*/
/** @type {validateBoolean} */
function validateBoolean(value, name) {
if (typeof value !== 'boolean') throw new ERR_INVALID_ARG_TYPE(name, 'boolean', value)
}
function getOwnPropertyValueOrDefault(options, key, defaultValue) {
return options == null || !ObjectPrototypeHasOwnProperty(options, key) ? defaultValue : options[key]
}
/**
* @callback validateObject
* @param {*} value
* @param {string} name
* @param {{
* allowArray?: boolean,
* allowFunction?: boolean,
* nullable?: boolean
* }} [options]
*/
/** @type {validateObject} */
const validateObject = hideStackFrames((value, name, options = null) => {
const allowArray = getOwnPropertyValueOrDefault(options, 'allowArray', false);
const allowFunction = getOwnPropertyValueOrDefault(options, 'allowFunction', false);
const nullable = getOwnPropertyValueOrDefault(options, 'nullable', false);
if (
(!nullable && value === null) ||
(!allowArray && ArrayIsArray(value)) ||
(typeof value !== 'object' && (!allowFunction || typeof value !== 'function'))
) {
throw new ERR_INVALID_ARG_TYPE(name, 'Object', value)
}
});
/**
* @callback validateArray
* @param {*} value
* @param {string} name
* @param {number} [minLength]
* @returns {asserts value is any[]}
*/
/** @type {validateArray} */
const validateArray = hideStackFrames((value, name, minLength = 0) => {
if (!ArrayIsArray(value)) {
throw new ERR_INVALID_ARG_TYPE(name, 'Array', value)
}
if (value.length < minLength) {
const reason = `must be longer than ${minLength}`;
throw new ERR_INVALID_ARG_VALUE(name, value, reason)
}
});
// eslint-disable-next-line jsdoc/require-returns-check
/**
* @param {*} signal
* @param {string} [name='signal']
* @returns {asserts signal is keyof signals}
*/
function validateSignalName(signal, name = 'signal') {
validateString(signal, name);
if (signals[signal] === undefined) {
if (signals[StringPrototypeToUpperCase(signal)] !== undefined) {
throw new ERR_UNKNOWN_SIGNAL(signal + ' (signals must use all capital letters)')
}
throw new ERR_UNKNOWN_SIGNAL(signal)
}
}
/**
* @callback validateBuffer
* @param {*} buffer
* @param {string} [name='buffer']
* @returns {asserts buffer is ArrayBufferView}
*/
/** @type {validateBuffer} */
const validateBuffer = hideStackFrames((buffer, name = 'buffer') => {
if (!isArrayBufferView(buffer)) {
throw new ERR_INVALID_ARG_TYPE(name, ['Buffer', 'TypedArray', 'DataView'], buffer)
}
});
/**
* @param {string} data
* @param {string} encoding
*/
function validateEncoding(data, encoding) {
const normalizedEncoding = normalizeEncoding(encoding);
const length = data.length;
if (normalizedEncoding === 'hex' && length % 2 !== 0) {
throw new ERR_INVALID_ARG_VALUE('encoding', encoding, `is invalid for data of length ${length}`)
}
}
/**
* Check that the port number is not NaN when coerced to a number,
* is an integer and that it falls within the legal range of port numbers.
* @param {*} port
* @param {string} [name='Port']
* @param {boolean} [allowZero=true]
* @returns {number}
*/
function validatePort(port, name = 'Port', allowZero = true) {
if (
(typeof port !== 'number' && typeof port !== 'string') ||
(typeof port === 'string' && StringPrototypeTrim(port).length === 0) ||
+port !== +port >>> 0 ||
port > 0xffff ||
(port === 0 && !allowZero)
) {
throw new ERR_SOCKET_BAD_PORT(name, port, allowZero)
}
return port | 0
}
/**
* @callback validateAbortSignal
* @param {*} signal
* @param {string} name
*/
/** @type {validateAbortSignal} */
const validateAbortSignal = hideStackFrames((signal, name) => {
if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) {
throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
}
});
/**
* @callback validateFunction
* @param {*} value
* @param {string} name
* @returns {asserts value is Function}
*/
/** @type {validateFunction} */
const validateFunction = hideStackFrames((value, name) => {
if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
});
/**
* @callback validatePlainFunction
* @param {*} value
* @param {string} name
* @returns {asserts value is Function}
*/
/** @type {validatePlainFunction} */
const validatePlainFunction = hideStackFrames((value, name) => {
if (typeof value !== 'function' || isAsyncFunction(value)) throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
});
/**
* @callback validateUndefined
* @param {*} value
* @param {string} name
* @returns {asserts value is undefined}
*/
/** @type {validateUndefined} */
const validateUndefined = hideStackFrames((value, name) => {
if (value !== undefined) throw new ERR_INVALID_ARG_TYPE(name, 'undefined', value)
});
/**
* @template T
* @param {T} value
* @param {string} name
* @param {T[]} union
*/
function validateUnion(value, name, union) {
if (!ArrayPrototypeIncludes(union, value)) {
throw new ERR_INVALID_ARG_TYPE(name, `('${ArrayPrototypeJoin(union, '|')}')`, value)
}
}
validators = {
isInt32,
isUint32,
parseFileMode,
validateArray,
validateBoolean,
validateBuffer,
validateEncoding,
validateFunction,
validateInt32,
validateInteger,
validateNumber,
validateObject,
validateOneOf,
validatePlainFunction,
validatePort,
validateSignalName,
validateString,
validateUint32,
validateUndefined,
validateUnion,
validateAbortSignal
};
return validators;
}
var endOfStream = {exports: {}};
var process$1;
var hasRequiredProcess;
function requireProcess () {
if (hasRequiredProcess) return process$1;
hasRequiredProcess = 1;
// for now just expose the builtin process global from node.js
process$1 = commonjsGlobal.process;
return process$1;
}
var utils;
var hasRequiredUtils;
function requireUtils () {
if (hasRequiredUtils) return utils;
hasRequiredUtils = 1;
const { Symbol, SymbolAsyncIterator, SymbolIterator } = requirePrimordials();
const kDestroyed = Symbol('kDestroyed');
const kIsErrored = Symbol('kIsErrored');
const kIsReadable = Symbol('kIsReadable');
const kIsDisturbed = Symbol('kIsDisturbed');
function isReadableNodeStream(obj, strict = false) {
var _obj$_readableState;
return !!(
(
obj &&
typeof obj.pipe === 'function' &&
typeof obj.on === 'function' &&
(!strict || (typeof obj.pause === 'function' && typeof obj.resume === 'function')) &&
(!obj._writableState ||
((_obj$_readableState = obj._readableState) === null || _obj$_readableState === undefined
? undefined
: _obj$_readableState.readable) !== false) &&
// Duplex
(!obj._writableState || obj._readableState)
) // Writable has .pipe.
)
}
function isWritableNodeStream(obj) {
var _obj$_writableState;
return !!(
(
obj &&
typeof obj.write === 'function' &&
typeof obj.on === 'function' &&
(!obj._readableState ||
((_obj$_writableState = obj._writableState) === null || _obj$_writableState === undefined
? undefined
: _obj$_writableState.writable) !== false)
) // Duplex
)
}
function isDuplexNodeStream(obj) {
return !!(
obj &&
typeof obj.pipe === 'function' &&
obj._readableState &&
typeof obj.on === 'function' &&
typeof obj.write === 'function'
)
}
function isNodeStream(obj) {
return (
obj &&
(obj._readableState ||
obj._writableState ||
(typeof obj.write === 'function' && typeof obj.on === 'function') ||
(typeof obj.pipe === 'function' && typeof obj.on === 'function'))
)
}
function isIterable(obj, isAsync) {
if (obj == null) return false
if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'
if (isAsync === false) return typeof obj[SymbolIterator] === 'function'
return typeof obj[SymbolAsyncIterator] === 'function' || typeof obj[SymbolIterator] === 'function'
}
function isDestroyed(stream) {
if (!isNodeStream(stream)) return null
const wState = stream._writableState;
const rState = stream._readableState;
const state = wState || rState;
return !!(stream.destroyed || stream[kDestroyed] || (state !== null && state !== undefined && state.destroyed))
}
// Have been end():d.
function isWritableEnded(stream) {
if (!isWritableNodeStream(stream)) return null
if (stream.writableEnded === true) return true
const wState = stream._writableState;
if (wState !== null && wState !== undefined && wState.errored) return false
if (typeof (wState === null || wState === undefined ? undefined : wState.ended) !== 'boolean') return null
return wState.ended
}
// Have emitted 'finish'.
function isWritableFinished(stream, strict) {
if (!isWritableNodeStream(stream)) return null
if (stream.writableFinished === true) return true
const wState = stream._writableState;
if (wState !== null && wState !== undefined && wState.errored) return false
if (typeof (wState === null || wState === undefined ? undefined : wState.finished) !== 'boolean') return null
return !!(wState.finished || (strict === false && wState.ended === true && wState.length === 0))
}
// Have been push(null):d.
function isReadableEnded(stream) {
if (!isReadableNodeStream(stream)) return null
if (stream.readableEnded === true) return true
const rState = stream._readableState;
if (!rState || rState.errored) return false
if (typeof (rState === null || rState === undefined ? undefined : rState.ended) !== 'boolean') return null
return rState.ended
}
// Have emitted 'end'.
function isReadableFinished(stream, strict) {
if (!isReadableNodeStream(stream)) return null
const rState = stream._readableState;
if (rState !== null && rState !== undefined && rState.errored) return false
if (typeof (rState === null || rState === undefined ? undefined : rState.endEmitted) !== 'boolean') return null
return !!(rState.endEmitted || (strict === false && rState.ended === true && rState.length === 0))
}
function isReadable(stream) {
if (stream && stream[kIsReadable] != null) return stream[kIsReadable]
if (typeof (stream === null || stream === undefined ? undefined : stream.readable) !== 'boolean') return null
if (isDestroyed(stream)) return false
return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream)
}
function isWritable(stream) {
if (typeof (stream === null || stream === undefined ? undefined : stream.writable) !== 'boolean') return null
if (isDestroyed(stream)) return false
return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream)
}
function isFinished(stream, opts) {
if (!isNodeStream(stream)) {
return null
}
if (isDestroyed(stream)) {
return true
}
if ((opts === null || opts === undefined ? undefined : opts.readable) !== false && isReadable(stream)) {
return false
}
if ((opts === null || opts === undefined ? undefined : opts.writable) !== false && isWritable(stream)) {
return false
}
return true
}
function isWritableErrored(stream) {
var _stream$_writableStat, _stream$_writableStat2;
if (!isNodeStream(stream)) {
return null
}
if (stream.writableErrored) {
return stream.writableErrored
}
return (_stream$_writableStat =
(_stream$_writableStat2 = stream._writableState) === null || _stream$_writableStat2 === undefined
? undefined
: _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined
? _stream$_writableStat
: null
}
function isReadableErrored(stream) {
var _stream$_readableStat, _stream$_readableStat2;
if (!isNodeStream(stream)) {
return null
}
if (stream.readableErrored) {
return stream.readableErrored
}
return (_stream$_readableStat =
(_stream$_readableStat2 = stream._readableState) === null || _stream$_readableStat2 === undefined
? undefined
: _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined
? _stream$_readableStat
: null
}
function isClosed(stream) {
if (!isNodeStream(stream)) {
return null
}
if (typeof stream.closed === 'boolean') {
return stream.closed
}
const wState = stream._writableState;
const rState = stream._readableState;
if (
typeof (wState === null || wState === undefined ? undefined : wState.closed) === 'boolean' ||
typeof (rState === null || rState === undefined ? undefined : rState.closed) === 'boolean'
) {
return (
(wState === null || wState === undefined ? undefined : wState.closed) ||
(rState === null || rState === undefined ? undefined : rState.closed)
)
}
if (typeof stream._closed === 'boolean' && isOutgoingMessage(stream)) {
return stream._closed
}
return null
}
function isOutgoingMessage(stream) {
return (
typeof stream._closed === 'boolean' &&
typeof stream._defaultKeepAlive === 'boolean' &&
typeof stream._removedConnection === 'boolean' &&
typeof stream._removedContLen === 'boolean'
)
}
function isServerResponse(stream) {
return typeof stream._sent100 === 'boolean' && isOutgoingMessage(stream)
}
function isServerRequest(stream) {
var _stream$req;
return (
typeof stream._consuming === 'boolean' &&
typeof stream._dumped === 'boolean' &&
((_stream$req = stream.req) === null || _stream$req === undefined ? undefined : _stream$req.upgradeOrConnect) ===
undefined
)
}
function willEmitClose(stream) {
if (!isNodeStream(stream)) return null
const wState = stream._writableState;
const rState = stream._readableState;
const state = wState || rState;
return (
(!state && isServerResponse(stream)) || !!(state && state.autoDestroy && state.emitClose && state.closed === false)
)
}
function isDisturbed(stream) {
var _stream$kIsDisturbed;
return !!(
stream &&
((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && _stream$kIsDisturbed !== undefined
? _stream$kIsDisturbed
: stream.readableDidRead || stream.readableAborted)
)
}
function isErrored(stream) {
var _ref,
_ref2,
_ref3,
_ref4,
_ref5,
_stream$kIsErrored,
_stream$_readableStat3,
_stream$_writableStat3,
_stream$_readableStat4,
_stream$_writableStat4;
return !!(
stream &&
((_ref =
(_ref2 =
(_ref3 =
(_ref4 =
(_ref5 =
(_stream$kIsErrored = stream[kIsErrored]) !== null && _stream$kIsErrored !== undefined
? _stream$kIsErrored
: stream.readableErrored) !== null && _ref5 !== undefined
? _ref5
: stream.writableErrored) !== null && _ref4 !== undefined
? _ref4
: (_stream$_readableStat3 = stream._readableState) === null || _stream$_readableStat3 === undefined
? undefined
: _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined
? _ref3
: (_stream$_writableStat3 = stream._writableState) === null || _stream$_writableStat3 === undefined
? undefined
: _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined
? _ref2
: (_stream$_readableStat4 = stream._readableState) === null || _stream$_readableStat4 === undefined
? undefined
: _stream$_readableStat4.errored) !== null && _ref !== undefined
? _ref
: (_stream$_writableStat4 = stream._writableState) === null || _stream$_writableStat4 === undefined
? undefined
: _stream$_writableStat4.errored)
)
}
utils = {
kDestroyed,
isDisturbed,
kIsDisturbed,
isErrored,
kIsErrored,
isReadable,
kIsReadable,
isClosed,
isDestroyed,
isDuplexNodeStream,
isFinished,
isIterable,
isReadableNodeStream,
isReadableEnded,
isReadableFinished,
isReadableErrored,
isNodeStream,
isWritable,
isWritableNodeStream,
isWritableEnded,
isWritableFinished,
isWritableErrored,
isServerRequest,
isServerResponse,
willEmitClose
};
return utils;
}
/* replacement start */
var hasRequiredEndOfStream;
function requireEndOfStream () {
if (hasRequiredEndOfStream) return endOfStream.exports;
hasRequiredEndOfStream = 1;
const process = requireProcess()
/* replacement end */
// Ported from https://github.com/mafintosh/end-of-stream with
// permission from the author, Mathias Buus (@mafintosh).
; const { AbortError, codes } = requireErrors();
const { ERR_INVALID_ARG_TYPE, ERR_STREAM_PREMATURE_CLOSE } = codes;
const { kEmptyObject, once } = requireUtil();
const { validateAbortSignal, validateFunction, validateObject } = requireValidators();
const { Promise } = requirePrimordials();
const {
isClosed,
isReadable,
isReadableNodeStream,
isReadableFinished,
isReadableErrored,
isWritable,
isWritableNodeStream,
isWritableFinished,
isWritableErrored,
isNodeStream,
willEmitClose: _willEmitClose
} = requireUtils();
function isRequest(stream) {
return stream.setHeader && typeof stream.abort === 'function'
}
const nop = () => {};
function eos(stream, options, callback) {
var _options$readable, _options$writable;
if (arguments.length === 2) {
callback = options;
options = kEmptyObject;
} else if (options == null) {
options = kEmptyObject;
} else {
validateObject(options, 'options');
}
validateFunction(callback, 'callback');
validateAbortSignal(options.signal, 'options.signal');
callback = once(callback);
const readable =
(_options$readable = options.readable) !== null && _options$readable !== undefined
? _options$readable
: isReadableNodeStream(stream);
const writable =
(_options$writable = options.writable) !== null && _options$writable !== undefined
? _options$writable
: isWritableNodeStream(stream);
if (!isNodeStream(stream)) {
// TODO: Webstreams.
throw new ERR_INVALID_ARG_TYPE('stream', 'Stream', stream)
}
const wState = stream._writableState;
const rState = stream._readableState;
const onlegacyfinish = () => {
if (!stream.writable) {
onfinish();
}
};
// TODO (ronag): Improve soft detection to include core modules and
// common ecosystem modules that do properly emit 'close' but fail
// this generic check.
let willEmitClose =
_willEmitClose(stream) && isReadableNodeStream(stream) === readable && isWritableNodeStream(stream) === writable;
let writableFinished = isWritableFinished(stream, false);
const onfinish = () => {
writableFinished = true;
// Stream should not be destroyed here. If it is that
// means that user space is doing something differently and
// we cannot trust willEmitClose.
if (stream.destroyed) {
willEmitClose = false;
}
if (willEmitClose && (!stream.readable || readable)) {
return
}
if (!readable || readableFinished) {
callback.call(stream);
}
};
let readableFinished = isReadableFinished(stream, false);
const onend = () => {
readableFinished = true;
// Stream should not be destroyed here. If it is that
// means that user space is doing something differently and
// we cannot trust willEmitClose.
if (stream.destroyed) {
willEmitClose = false;
}
if (willEmitClose && (!stream.writable || writable)) {
return
}
if (!writable || writableFinished) {
callback.call(stream);
}
};
const onerror = (err) => {
callback.call(stream, err);
};
let closed = isClosed(stream);
const onclose = () => {
closed = true;
const errored = isWritableErrored(stream) || isReadableErrored(stream);
if (errored && typeof errored !== 'boolean') {
return callback.call(stream, errored)
}
if (readable && !readableFinished && isReadableNodeStream(stream, true)) {
if (!isReadableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())
}
if (writable && !writableFinished) {
if (!isWritableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())
}
callback.call(stream);
};
const onrequest = () => {
stream.req.on('finish', onfinish);
};
if (isRequest(stream)) {
stream.on('complete', onfinish);
if (!willEmitClose) {
stream.on('abort', onclose);
}
if (stream.req) {
onrequest();
} else {
stream.on('request', onrequest);
}
} else if (writable && !wState) {
// legacy streams
stream.on('end', onlegacyfinish);
stream.on('close', onlegacyfinish);
}
// Not all streams will emit 'close' after 'aborted'.
if (!willEmitClose && typeof stream.aborted === 'boolean') {
stream.on('aborted', onclose);
}
stream.on('end', onend);
stream.on('finish', onfinish);
if (options.error !== false) {
stream.on('error', onerror);
}
stream.on('close', onclose);
if (closed) {
process.nextTick(onclose);
} else if (
(wState !== null && wState !== undefined && wState.errorEmitted) ||
(rState !== null && rState !== undefined && rState.errorEmitted)
) {
if (!willEmitClose) {
process.nextTick(onclose);
}
} else if (
!readable &&
(!willEmitClose || isReadable(stream)) &&
(writableFinished || isWritable(stream) === false)
) {
process.nextTick(onclose);
} else if (
!writable &&
(!willEmitClose || isWritable(stream)) &&
(readableFinished || isReadable(stream) === false)
) {
process.nextTick(onclose);
} else if (rState && stream.req && stream.aborted) {
process.nextTick(onclose);
}
const cleanup = () => {
callback = nop;
stream.removeListener('aborted', onclose);
stream.removeListener('complete', onfinish);
stream.removeListener('abort', onclose);
stream.removeListener('request', onrequest);
if (stream.req) stream.req.removeListener('finish', onfinish);
stream.removeListener('end', onlegacyfinish);
stream.removeListener('close', onlegacyfinish);
stream.removeListener('finish', onfinish);
stream.removeListener('end', onend);
stream.removeListener('error', onerror);
stream.removeListener('close', onclose);
};
if (options.signal && !closed) {
const abort = () => {
// Keep it because cleanup removes it.
const endCallback = callback;
cleanup();
endCallback.call(
stream,
new AbortError(undefined, {
cause: options.signal.reason
})
);
};
if (options.signal.aborted) {
process.nextTick(abort);
} else {
const originalCallback = callback;
callback = once((...args) => {
options.signal.removeEventListener('abort', abort);
originalCallback.apply(stream, args);
});
options.signal.addEventListener('abort', abort);
}
}
return cleanup
}
function finished(stream, opts) {
return new Promise((resolve, reject) => {
eos(stream, opts, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
})
}
endOfStream.exports = eos;
endOfStream.exports.finished = finished;
return endOfStream.exports;
}
var hasRequiredOperators;
function requireOperators () {
if (hasRequiredOperators) return operators;
hasRequiredOperators = 1;
const AbortController = globalThis.AbortController || require$$9.AbortController;
const {
codes: { ERR_INVALID_ARG_TYPE, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE },
AbortError
} = requireErrors();
const { validateAbortSignal, validateInteger, validateObject } = requireValidators();
const kWeakHandler = requirePrimordials().Symbol('kWeak');
const { finished } = requireEndOfStream();
const {
ArrayPrototypePush,
MathFloor,
Number,
NumberIsNaN,
Promise,
PromiseReject,
PromisePrototypeThen,
Symbol
} = requirePrimordials();
const kEmpty = Symbol('kEmpty');
const kEof = Symbol('kEof');
function map(fn, options) {
if (typeof fn !== 'function') {
throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
}
if (options != null) {
validateObject(options, 'options');
}
if ((options === null || options === undefined ? undefined : options.signal) != null) {
validateAbortSignal(options.signal, 'options.signal');
}
let concurrency = 1;
if ((options === null || options === undefined ? undefined : options.concurrency) != null) {
concurrency = MathFloor(options.concurrency);
}
validateInteger(concurrency, 'concurrency', 1);
return async function* map() {
var _options$signal, _options$signal2;
const ac = new AbortController();
const stream = this;
const queue = [];
const signal = ac.signal;
const signalOpt = {
signal
};
const abort = () => ac.abort();
if (
options !== null &&
options !== undefined &&
(_options$signal = options.signal) !== null &&
_options$signal !== undefined &&
_options$signal.aborted
) {
abort();
}
options === null || options === undefined
? undefined
: (_options$signal2 = options.signal) === null || _options$signal2 === undefined
? undefined
: _options$signal2.addEventListener('abort', abort);
let next;
let resume;
let done = false;
function onDone() {
done = true;
}
async function pump() {
try {
for await (let val of stream) {
var _val;
if (done) {
return
}
if (signal.aborted) {
throw new AbortError()
}
try {
val = fn(val, signalOpt);
} catch (err) {
val = PromiseReject(err);
}
if (val === kEmpty) {
continue
}
if (typeof ((_val = val) === null || _val === undefined ? undefined : _val.catch) === 'function') {
val.catch(onDone);
}
queue.push(val);
if (next) {
next();
next = null;
}
if (!done && queue.length && queue.length >= concurrency) {
await new Promise((resolve) => {
resume = resolve;
});
}
}
queue.push(kEof);
} catch (err) {
const val = PromiseReject(err);
PromisePrototypeThen(val, undefined, onDone);
queue.push(val);
} finally {
var _options$signal3;
done = true;
if (next) {
next();
next = null;
}
options === null || options === undefined
? undefined
: (_options$signal3 = options.signal) === null || _options$signal3 === undefined
? undefined
: _options$signal3.removeEventListener('abort', abort);
}
}
pump();
try {
while (true) {
while (queue.length > 0) {
const val = await queue[0];
if (val === kEof) {
return
}
if (signal.aborted) {
throw new AbortError()
}
if (val !== kEmpty) {
yield val;
}
queue.shift();
if (resume) {
resume();
resume = null;
}
}
await new Promise((resolve) => {
next = resolve;
});
}
} finally {
ac.abort();
done = true;
if (resume) {
resume();
resume = null;
}
}
}.call(this)
}
function asIndexedPairs(options = undefined) {
if (options != null) {
validateObject(options, 'options');
}
if ((options === null || options === undefined ? undefined : options.signal) != null) {
validateAbortSignal(options.signal, 'options.signal');
}
return async function* asIndexedPairs() {
let index = 0;
for await (const val of this) {
var _options$signal4;
if (
options !== null &&
options !== undefined &&
(_options$signal4 = options.signal) !== null &&
_options$signal4 !== undefined &&
_options$signal4.aborted
) {
throw new AbortError({
cause: options.signal.reason
})
}
yield [index++, val];
}
}.call(this)
}
async function some(fn, options = undefined) {
for await (const unused of filter.call(this, fn, options)) {
return true
}
return false
}
async function every(fn, options = undefined) {
if (typeof fn !== 'function') {
throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
}
// https://en.wikipedia.org/wiki/De_Morgan%27s_laws
return !(await some.call(
this,
async (...args) => {
return !(await fn(...args))
},
options
))
}
async function find(fn, options) {
for await (const result of filter.call(this, fn, options)) {
return result
}
return undefined
}
async function forEach(fn, options) {
if (typeof fn !== 'function') {
throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
}
async function forEachFn(value, options) {
await fn(value, options);
return kEmpty
}
// eslint-disable-next-line no-unused-vars
for await (const unused of map.call(this, forEachFn, options));
}
function filter(fn, options) {
if (typeof fn !== 'function') {
throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
}
async function filterFn(value, options) {
if (await fn(value, options)) {
return value
}
return kEmpty
}
return map.call(this, filterFn, options)
}
// Specific to provide better error to reduce since the argument is only
// missing if the stream has no items in it - but the code is still appropriate
class ReduceAwareErrMissingArgs extends ERR_MISSING_ARGS {
constructor() {
super('reduce');
this.message = 'Reduce of an empty stream requires an initial value';
}
}
async function reduce(reducer, initialValue, options) {
var _options$signal5;
if (typeof reducer !== 'function') {
throw new ERR_INVALID_ARG_TYPE('reducer', ['Function', 'AsyncFunction'], reducer)
}
if (options != null) {
validateObject(options, 'options');
}
if ((options === null || options === undefined ? undefined : options.signal) != null) {
validateAbortSignal(options.signal, 'options.signal');
}
let hasInitialValue = arguments.length > 1;
if (
options !== null &&
options !== undefined &&
(_options$signal5 = options.signal) !== null &&
_options$signal5 !== undefined &&
_options$signal5.aborted
) {
const err = new AbortError(undefined, {
cause: options.signal.reason
});
this.once('error', () => {}); // The error is already propagated
await finished(this.destroy(err));
throw err
}
const ac = new AbortController();
const signal = ac.signal;
if (options !== null && options !== undefined && options.signal) {
const opts = {
once: true,
[kWeakHandler]: this
};
options.signal.addEventListener('abort', () => ac.abort(), opts);
}
let gotAnyItemFromStream = false;
try {
for await (const value of this) {
var _options$signal6;
gotAnyItemFromStream = true;
if (
options !== null &&
options !== undefined &&
(_options$signal6 = options.signal) !== null &&
_options$signal6 !== undefined &&
_options$signal6.aborted
) {
throw new AbortError()
}
if (!hasInitialValue) {
initialValue = value;
hasInitialValue = true;
} else {
initialValue = await reducer(initialValue, value, {
signal
});
}
}
if (!gotAnyItemFromStream && !hasInitialValue) {
throw new ReduceAwareErrMissingArgs()
}
} finally {
ac.abort();
}
return initialValue
}
async function toArray(options) {
if (options != null) {
validateObject(options, 'options');
}
if ((options === null || options === undefined ? undefined : options.signal) != null) {
validateAbortSignal(options.signal, 'options.signal');
}
const result = [];
for await (const val of this) {
var _options$signal7;
if (
options !== null &&
options !== undefined &&
(_options$signal7 = options.signal) !== null &&
_options$signal7 !== undefined &&
_options$signal7.aborted
) {
throw new AbortError(undefined, {
cause: options.signal.reason
})
}
ArrayPrototypePush(result, val);
}
return result
}
function flatMap(fn, options) {
const values = map.call(this, fn, options);
return async function* flatMap() {
for await (const val of values) {
yield* val;
}
}.call(this)
}
function toIntegerOrInfinity(number) {
// We coerce here to align with the spec
// https://github.com/tc39/proposal-iterator-helpers/issues/169
number = Number(number);
if (NumberIsNaN(number)) {
return 0
}
if (number < 0) {
throw new ERR_OUT_OF_RANGE('number', '>= 0', number)
}
return number
}
function drop(number, options = undefined) {
if (options != null) {
validateObject(options, 'options');
}
if ((options === null || options === undefined ? undefined : options.signal) != null) {
validateAbortSignal(options.signal, 'options.signal');
}
number = toIntegerOrInfinity(number);
return async function* drop() {
var _options$signal8;
if (
options !== null &&
options !== undefined &&
(_options$signal8 = options.signal) !== null &&
_options$signal8 !== undefined &&
_options$signal8.aborted
) {
throw new AbortError()
}
for await (const val of this) {
var _options$signal9;
if (
options !== null &&
options !== undefined &&
(_options$signal9 = options.signal) !== null &&
_options$signal9 !== undefined &&
_options$signal9.aborted
) {
throw new AbortError()
}
if (number-- <= 0) {
yield val;
}
}
}.call(this)
}
function take(number, options = undefined) {
if (options != null) {
validateObject(options, 'options');
}
if ((options === null || options === undefined ? undefined : options.signal) != null) {
validateAbortSignal(options.signal, 'options.signal');
}
number = toIntegerOrInfinity(number);
return async function* take() {
var _options$signal10;
if (
options !== null &&
options !== undefined &&
(_options$signal10 = options.signal) !== null &&
_options$signal10 !== undefined &&
_options$signal10.aborted
) {
throw new AbortError()
}
for await (const val of this) {
var _options$signal11;
if (
options !== null &&
options !== undefined &&
(_options$signal11 = options.signal) !== null &&
_options$signal11 !== undefined &&
_options$signal11.aborted
) {
throw new AbortError()
}
if (number-- > 0) {
yield val;
} else {
return
}
}
}.call(this)
}
operators.streamReturningOperators = {
asIndexedPairs,
drop,
filter,
flatMap,
map,
take
};
operators.promiseReturningOperators = {
every,
forEach,
reduce,
toArray,
some,
find
};
return operators;
}
var destroy_1;
var hasRequiredDestroy;
function requireDestroy () {
if (hasRequiredDestroy) return destroy_1;
hasRequiredDestroy = 1;
/* replacement start */
const process = requireProcess();
/* replacement end */
const {
aggregateTwoErrors,
codes: { ERR_MULTIPLE_CALLBACK },
AbortError
} = requireErrors();
const { Symbol } = requirePrimordials();
const { kDestroyed, isDestroyed, isFinished, isServerRequest } = requireUtils();
const kDestroy = Symbol('kDestroy');
const kConstruct = Symbol('kConstruct');
function checkError(err, w, r) {
if (err) {
// Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
err.stack; // eslint-disable-line no-unused-expressions
if (w && !w.errored) {
w.errored = err;
}
if (r && !r.errored) {
r.errored = err;
}
}
}
// Backwards compat. cb() is undocumented and unused in core but
// unfortunately might be used by modules.
function destroy(err, cb) {
const r = this._readableState;
const w = this._writableState;
// With duplex streams we use the writable side for state.
const s = w || r;
if ((w && w.destroyed) || (r && r.destroyed)) {
if (typeof cb === 'function') {
cb();
}
return this
}
// We set destroyed to true before firing error callbacks in order
// to make it re-entrance safe in case destroy() is called within callbacks
checkError(err, w, r);
if (w) {
w.destroyed = true;
}
if (r) {
r.destroyed = true;
}
// If still constructing then defer calling _destroy.
if (!s.constructed) {
this.once(kDestroy, function (er) {
_destroy(this, aggregateTwoErrors(er, err), cb);
});
} else {
_destroy(this, err, cb);
}
return this
}
function _destroy(self, err, cb) {
let called = false;
function onDestroy(err) {
if (called) {
return
}
called = true;
const r = self._readableState;
const w = self._writableState;
checkError(err, w, r);
if (w) {
w.closed = true;
}
if (r) {
r.closed = true;
}
if (typeof cb === 'function') {
cb(err);
}
if (err) {
process.nextTick(emitErrorCloseNT, self, err);
} else {
process.nextTick(emitCloseNT, self);
}
}
try {
self._destroy(err || null, onDestroy);
} catch (err) {
onDestroy(err);
}
}
function emitErrorCloseNT(self, err) {
emitErrorNT(self, err);
emitCloseNT(self);
}
function emitCloseNT(self) {
const r = self._readableState;
const w = self._writableState;
if (w) {
w.closeEmitted = true;
}
if (r) {
r.closeEmitted = true;
}
if ((w && w.emitClose) || (r && r.emitClose)) {
self.emit('close');
}
}
function emitErrorNT(self, err) {
const r = self._readableState;
const w = self._writableState;
if ((w && w.errorEmitted) || (r && r.errorEmitted)) {
return
}
if (w) {
w.errorEmitted = true;
}
if (r) {
r.errorEmitted = true;
}
self.emit('error', err);
}
function undestroy() {
const r = this._readableState;
const w = this._writableState;
if (r) {
r.constructed = true;
r.closed = false;
r.closeEmitted = false;
r.destroyed = false;
r.errored = null;
r.errorEmitted = false;
r.reading = false;
r.ended = r.readable === false;
r.endEmitted = r.readable === false;
}
if (w) {
w.constructed = true;
w.destroyed = false;
w.closed = false;
w.closeEmitted = false;
w.errored = null;
w.errorEmitted = false;
w.finalCalled = false;
w.prefinished = false;
w.ended = w.writable === false;
w.ending = w.writable === false;
w.finished = w.writable === false;
}
}
function errorOrDestroy(stream, err, sync) {
// We have tests that rely on errors being emitted
// in the same tick, so changing this is semver major.
// For now when you opt-in to autoDestroy we allow
// the error to be emitted nextTick. In a future
// semver major update we should change the default to this.
const r = stream._readableState;
const w = stream._writableState;
if ((w && w.destroyed) || (r && r.destroyed)) {
return this
}
if ((r && r.autoDestroy) || (w && w.autoDestroy)) stream.destroy(err);
else if (err) {
// Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
err.stack; // eslint-disable-line no-unused-expressions
if (w && !w.errored) {
w.errored = err;
}
if (r && !r.errored) {
r.errored = err;
}
if (sync) {
process.nextTick(emitErrorNT, stream, err);
} else {
emitErrorNT(stream, err);
}
}
}
function construct(stream, cb) {
if (typeof stream._construct !== 'function') {
return
}
const r = stream._readableState;
const w = stream._writableState;
if (r) {
r.constructed = false;
}
if (w) {
w.constructed = false;
}
stream.once(kConstruct, cb);
if (stream.listenerCount(kConstruct) > 1) {
// Duplex
return
}
process.nextTick(constructNT, stream);
}
function constructNT(stream) {
let called = false;
function onConstruct(err) {
if (called) {
errorOrDestroy(stream, err !== null && err !== undefined ? err : new ERR_MULTIPLE_CALLBACK());
return
}
called = true;
const r = stream._readableState;
const w = stream._writableState;
const s = w || r;
if (r) {
r.constructed = true;
}
if (w) {
w.constructed = true;
}
if (s.destroyed) {
stream.emit(kDestroy, err);
} else if (err) {
errorOrDestroy(stream, err, true);
} else {
process.nextTick(emitConstructNT, stream);
}
}
try {
stream._construct(onConstruct);
} catch (err) {
onConstruct(err);
}
}
function emitConstructNT(stream) {
stream.emit(kConstruct);
}
function isRequest(stream) {
return stream && stream.setHeader && typeof stream.abort === 'function'
}
function emitCloseLegacy(stream) {
stream.emit('close');
}
function emitErrorCloseLegacy(stream, err) {
stream.emit('error', err);
process.nextTick(emitCloseLegacy, stream);
}
// Normalize destroy for legacy.
function destroyer(stream, err) {
if (!stream || isDestroyed(stream)) {
return
}
if (!err && !isFinished(stream)) {
err = new AbortError();
}
// TODO: Remove isRequest branches.
if (isServerRequest(stream)) {
stream.socket = null;
stream.destroy(err);
} else if (isRequest(stream)) {
stream.abort();
} else if (isRequest(stream.req)) {
stream.req.abort();
} else if (typeof stream.destroy === 'function') {
stream.destroy(err);
} else if (typeof stream.close === 'function') {
// TODO: Don't lose err?
stream.close();
} else if (err) {
process.nextTick(emitErrorCloseLegacy, stream, err);
} else {
process.nextTick(emitCloseLegacy, stream);
}
if (!stream.destroyed) {
stream[kDestroyed] = true;
}
}
destroy_1 = {
construct,
destroyer,
destroy,
undestroy,
errorOrDestroy
};
return destroy_1;
}
var legacy;
var hasRequiredLegacy;
function requireLegacy () {
if (hasRequiredLegacy) return legacy;
hasRequiredLegacy = 1;
const { ArrayIsArray, ObjectSetPrototypeOf } = requirePrimordials();
const { EventEmitter: EE } = require$$2;
function Stream(opts) {
EE.call(this, opts);
}
ObjectSetPrototypeOf(Stream.prototype, EE.prototype);
ObjectSetPrototypeOf(Stream, EE);
Stream.prototype.pipe = function (dest, options) {
const source = this;
function ondata(chunk) {
if (dest.writable && dest.write(chunk) === false && source.pause) {
source.pause();
}
}
source.on('data', ondata);
function ondrain() {
if (source.readable && source.resume) {
source.resume();
}
}
dest.on('drain', ondrain);
// If the 'end' option is not supplied, dest.end() will be called when
// source gets the 'end' or 'close' events. Only dest.end() once.
if (!dest._isStdio && (!options || options.end !== false)) {
source.on('end', onend);
source.on('close', onclose);
}
let didOnEnd = false;
function onend() {
if (didOnEnd) return
didOnEnd = true;
dest.end();
}
function onclose() {
if (didOnEnd) return
didOnEnd = true;
if (typeof dest.destroy === 'function') dest.destroy();
}
// Don't leave dangling pipes when there are errors.
function onerror(er) {
cleanup();
if (EE.listenerCount(this, 'error') === 0) {
this.emit('error', er);
}
}
prependListener(source, 'error', onerror);
prependListener(dest, 'error', onerror);
// Remove all the event listeners that were added.
function cleanup() {
source.removeListener('data', ondata);
dest.removeListener('drain', ondrain);
source.removeListener('end', onend);
source.removeListener('close', onclose);
source.removeListener('error', onerror);
dest.removeListener('error', onerror);
source.removeListener('end', cleanup);
source.removeListener('close', cleanup);
dest.removeListener('close', cleanup);
}
source.on('end', cleanup);
source.on('close', cleanup);
dest.on('close', cleanup);
dest.emit('pipe', source);
// Allow for unix-like usage: A.pipe(B).pipe(C)
return dest
};
function prependListener(emitter, event, fn) {
// Sadly this is not cacheable as some libraries bundle their own
// event emitter implementation with them.
if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn)
// This is a hack to make sure that our error handler is attached before any
// userland ones. NEVER DO THIS. This is here only because this code needs
// to continue to work with older versions of Node.js that do not include
// the prependListener() method. The goal is to eventually remove this hack.
if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);
else if (ArrayIsArray(emitter._events[event])) emitter._events[event].unshift(fn);
else emitter._events[event] = [fn, emitter._events[event]];
}
legacy = {
Stream,
prependListener
};
return legacy;
}
var addAbortSignal = {exports: {}};
var hasRequiredAddAbortSignal;
function requireAddAbortSignal () {
if (hasRequiredAddAbortSignal) return addAbortSignal.exports;
hasRequiredAddAbortSignal = 1;
(function (module) {
const { AbortError, codes } = requireErrors();
const eos = requireEndOfStream();
const { ERR_INVALID_ARG_TYPE } = codes;
// This method is inlined here for readable-stream
// It also does not allow for signal to not exist on the stream
// https://github.com/nodejs/node/pull/36061#discussion_r533718029
const validateAbortSignal = (signal, name) => {
if (typeof signal !== 'object' || !('aborted' in signal)) {
throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
}
};
function isNodeStream(obj) {
return !!(obj && typeof obj.pipe === 'function')
}
module.exports.addAbortSignal = function addAbortSignal(signal, stream) {
validateAbortSignal(signal, 'signal');
if (!isNodeStream(stream)) {
throw new ERR_INVALID_ARG_TYPE('stream', 'stream.Stream', stream)
}
return module.exports.addAbortSignalNoValidate(signal, stream)
};
module.exports.addAbortSignalNoValidate = function (signal, stream) {
if (typeof signal !== 'object' || !('aborted' in signal)) {
return stream
}
const onAbort = () => {
stream.destroy(
new AbortError(undefined, {
cause: signal.reason
})
);
};
if (signal.aborted) {
onAbort();
} else {
signal.addEventListener('abort', onAbort);
eos(stream, () => signal.removeEventListener('abort', onAbort));
}
return stream
};
} (addAbortSignal));
return addAbortSignal.exports;
}
var buffer_list;
var hasRequiredBuffer_list;
function requireBuffer_list () {
if (hasRequiredBuffer_list) return buffer_list;
hasRequiredBuffer_list = 1;
const { StringPrototypeSlice, SymbolIterator, TypedArrayPrototypeSet, Uint8Array } = requirePrimordials();
const { Buffer } = require$$0;
const { inspect } = requireUtil();
buffer_list = class BufferList {
constructor() {
this.head = null;
this.tail = null;
this.length = 0;
}
push(v) {
const entry = {
data: v,
next: null
};
if (this.length > 0) this.tail.next = entry;
else this.head = entry;
this.tail = entry;
++this.length;
}
unshift(v) {
const entry = {
data: v,
next: this.head
};
if (this.length === 0) this.tail = entry;
this.head = entry;
++this.length;
}
shift() {
if (this.length === 0) return
const ret = this.head.data;
if (this.length === 1) this.head = this.tail = null;
else this.head = this.head.next;
--this.length;
return ret
}
clear() {
this.head = this.tail = null;
this.length = 0;
}
join(s) {
if (this.length === 0) return ''
let p = this.head;
let ret = '' + p.data;
while ((p = p.next) !== null) ret += s + p.data;
return ret
}
concat(n) {
if (this.length === 0) return Buffer.alloc(0)
const ret = Buffer.allocUnsafe(n >>> 0);
let p = this.head;
let i = 0;
while (p) {
TypedArrayPrototypeSet(ret, p.data, i);
i += p.data.length;
p = p.next;
}
return ret
}
// Consumes a specified amount of bytes or characters from the buffered data.
consume(n, hasStrings) {
const data = this.head.data;
if (n < data.length) {
// `slice` is the same for buffers and strings.
const slice = data.slice(0, n);
this.head.data = data.slice(n);
return slice
}
if (n === data.length) {
// First chunk is a perfect match.
return this.shift()
}
// Result spans more than one buffer.
return hasStrings ? this._getString(n) : this._getBuffer(n)
}
first() {
return this.head.data
}
*[SymbolIterator]() {
for (let p = this.head; p; p = p.next) {
yield p.data;
}
}
// Consumes a specified amount of characters from the buffered data.
_getString(n) {
let ret = '';
let p = this.head;
let c = 0;
do {
const str = p.data;
if (n > str.length) {
ret += str;
n -= str.length;
} else {
if (n === str.length) {
ret += str;
++c;
if (p.next) this.head = p.next;
else this.head = this.tail = null;
} else {
ret += StringPrototypeSlice(str, 0, n);
this.head = p;
p.data = StringPrototypeSlice(str, n);
}
break
}
++c;
} while ((p = p.next) !== null)
this.length -= c;
return ret
}
// Consumes a specified amount of bytes from the buffered data.
_getBuffer(n) {
const ret = Buffer.allocUnsafe(n);
const retLen = n;
let p = this.head;
let c = 0;
do {
const buf = p.data;
if (n > buf.length) {
TypedArrayPrototypeSet(ret, buf, retLen - n);
n -= buf.length;
} else {
if (n === buf.length) {
TypedArrayPrototypeSet(ret, buf, retLen - n);
++c;
if (p.next) this.head = p.next;
else this.head = this.tail = null;
} else {
TypedArrayPrototypeSet(ret, new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n);
this.head = p;
p.data = buf.slice(n);
}
break
}
++c;
} while ((p = p.next) !== null)
this.length -= c;
return ret
}
// Make sure the linked list only shows the minimal necessary information.
[Symbol.for('nodejs.util.inspect.custom')](_, options) {
return inspect(this, {
...options,
// Only inspect one level.
depth: 0,
// It should not recurse.
customInspect: false
})
}
};
return buffer_list;
}
var state;
var hasRequiredState;
function requireState () {
if (hasRequiredState) return state;
hasRequiredState = 1;
const { MathFloor, NumberIsInteger } = requirePrimordials();
const { ERR_INVALID_ARG_VALUE } = requireErrors().codes;
function highWaterMarkFrom(options, isDuplex, duplexKey) {
return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null
}
function getDefaultHighWaterMark(objectMode) {
return objectMode ? 16 : 16 * 1024
}
function getHighWaterMark(state, options, duplexKey, isDuplex) {
const hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
if (hwm != null) {
if (!NumberIsInteger(hwm) || hwm < 0) {
const name = isDuplex ? `options.${duplexKey}` : 'options.highWaterMark';
throw new ERR_INVALID_ARG_VALUE(name, hwm)
}
return MathFloor(hwm)
}
// Default value
return getDefaultHighWaterMark(state.objectMode)
}
state = {
getHighWaterMark,
getDefaultHighWaterMark
};
return state;
}
var from_1;
var hasRequiredFrom;
function requireFrom () {
if (hasRequiredFrom) return from_1;
hasRequiredFrom = 1;
/* replacement start */
const process = requireProcess();
/* replacement end */
const { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = requirePrimordials();
const { Buffer } = require$$0;
const { ERR_INVALID_ARG_TYPE, ERR_STREAM_NULL_VALUES } = requireErrors().codes;
function from(Readable, iterable, opts) {
let iterator;
if (typeof iterable === 'string' || iterable instanceof Buffer) {
return new Readable({
objectMode: true,
...opts,
read() {
this.push(iterable);
this.push(null);
}
})
}
let isAsync;
if (iterable && iterable[SymbolAsyncIterator]) {
isAsync = true;
iterator = iterable[SymbolAsyncIterator]();
} else if (iterable && iterable[SymbolIterator]) {
isAsync = false;
iterator = iterable[SymbolIterator]();
} else {
throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable)
}
const readable = new Readable({
objectMode: true,
highWaterMark: 1,
// TODO(ronag): What options should be allowed?
...opts
});
// Flag to protect against _read
// being called before last iteration completion.
let reading = false;
readable._read = function () {
if (!reading) {
reading = true;
next();
}
};
readable._destroy = function (error, cb) {
PromisePrototypeThen(
close(error),
() => process.nextTick(cb, error),
// nextTick is here in case cb throws
(e) => process.nextTick(cb, e || error)
);
};
async function close(error) {
const hadError = error !== undefined && error !== null;
const hasThrow = typeof iterator.throw === 'function';
if (hadError && hasThrow) {
const { value, done } = await iterator.throw(error);
await value;
if (done) {
return
}
}
if (typeof iterator.return === 'function') {
const { value } = await iterator.return();
await value;
}
}
async function next() {
for (;;) {
try {
const { value, done } = isAsync ? await iterator.next() : iterator.next();
if (done) {
readable.push(null);
} else {
const res = value && typeof value.then === 'function' ? await value : value;
if (res === null) {
reading = false;
throw new ERR_STREAM_NULL_VALUES()
} else if (readable.push(res)) {
continue
} else {
reading = false;
}
}
} catch (err) {
readable.destroy(err);
}
break
}
}
return readable
}
from_1 = from;
return from_1;
}
/* replacement start */
var readable;
var hasRequiredReadable;
function requireReadable () {
if (hasRequiredReadable) return readable;
hasRequiredReadable = 1;
const process = requireProcess()
/* replacement end */
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
; const {
ArrayPrototypeIndexOf,
NumberIsInteger,
NumberIsNaN,
NumberParseInt,
ObjectDefineProperties,
ObjectKeys,
ObjectSetPrototypeOf,
Promise,
SafeSet,
SymbolAsyncIterator,
Symbol
} = requirePrimordials();
readable = Readable;
Readable.ReadableState = ReadableState;
const { EventEmitter: EE } = require$$2;
const { Stream, prependListener } = requireLegacy();
const { Buffer } = require$$0;
const { addAbortSignal } = requireAddAbortSignal();
const eos = requireEndOfStream();
let debug = requireUtil().debuglog('stream', (fn) => {
debug = fn;
});
const BufferList = requireBuffer_list();
const destroyImpl = requireDestroy();
const { getHighWaterMark, getDefaultHighWaterMark } = requireState();
const {
aggregateTwoErrors,
codes: {
ERR_INVALID_ARG_TYPE,
ERR_METHOD_NOT_IMPLEMENTED,
ERR_OUT_OF_RANGE,
ERR_STREAM_PUSH_AFTER_EOF,
ERR_STREAM_UNSHIFT_AFTER_END_EVENT
}
} = requireErrors();
const { validateObject } = requireValidators();
const kPaused = Symbol('kPaused');
const { StringDecoder } = require$$13;
const from = requireFrom();
ObjectSetPrototypeOf(Readable.prototype, Stream.prototype);
ObjectSetPrototypeOf(Readable, Stream);
const nop = () => {};
const { errorOrDestroy } = destroyImpl;
function ReadableState(options, stream, isDuplex) {
// Duplex streams are both readable and writable, but share
// the same options object.
// However, some cases require setting options to different
// values for the readable and the writable sides of the duplex stream.
// These options can be provided separately as readableXXX and writableXXX.
if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof requireDuplex();
// Object stream flag. Used to make read(n) ignore n and to
// make all the buffer merging and length checks go away.
this.objectMode = !!(options && options.objectMode);
if (isDuplex) this.objectMode = this.objectMode || !!(options && options.readableObjectMode);
// The point at which it stops calling _read() to fill the buffer
// Note: 0 is a valid value, means "don't call _read preemptively ever"
this.highWaterMark = options
? getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex)
: getDefaultHighWaterMark(false);
// A linked list is used to store data chunks instead of an array because the
// linked list can remove elements from the beginning faster than
// array.shift().
this.buffer = new BufferList();
this.length = 0;
this.pipes = [];
this.flowing = null;
this.ended = false;
this.endEmitted = false;
this.reading = false;
// Stream is still being constructed and cannot be
// destroyed until construction finished or failed.
// Async construction is opt in, therefore we start as
// constructed.
this.constructed = true;
// A flag to be able to tell if the event 'readable'/'data' is emitted
// immediately, or on a later tick. We set this to true at first, because
// any actions that shouldn't happen until "later" should generally also
// not happen before the first read call.
this.sync = true;
// Whenever we return null, then we set a flag to say
// that we're awaiting a 'readable' event emission.
this.needReadable = false;
this.emittedReadable = false;
this.readableListening = false;
this.resumeScheduled = false;
this[kPaused] = null;
// True if the error was already emitted and should not be thrown again.
this.errorEmitted = false;
// Should close be emitted on destroy. Defaults to true.
this.emitClose = !options || options.emitClose !== false;
// Should .destroy() be called after 'end' (and potentially 'finish').
this.autoDestroy = !options || options.autoDestroy !== false;
// Has it been destroyed.
this.destroyed = false;
// Indicates whether the stream has errored. When true no further
// _read calls, 'data' or 'readable' events should occur. This is needed
// since when autoDestroy is disabled we need a way to tell whether the
// stream has failed.
this.errored = null;
// Indicates whether the stream has finished destroying.
this.closed = false;
// True if close has been emitted or would have been emitted
// depending on emitClose.
this.closeEmitted = false;
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this.defaultEncoding = (options && options.defaultEncoding) || 'utf8';
// Ref the piped dest which we need a drain event on it
// type: null | Writable | Set<Writable>.
this.awaitDrainWriters = null;
this.multiAwaitDrain = false;
// If true, a maybeReadMore has been scheduled.
this.readingMore = false;
this.dataEmitted = false;
this.decoder = null;
this.encoding = null;
if (options && options.encoding) {
this.decoder = new StringDecoder(options.encoding);
this.encoding = options.encoding;
}
}
function Readable(options) {
if (!(this instanceof Readable)) return new Readable(options)
// Checking for a Stream.Duplex instance is faster here instead of inside
// the ReadableState constructor, at least with V8 6.5.
const isDuplex = this instanceof requireDuplex();
this._readableState = new ReadableState(options, this, isDuplex);
if (options) {
if (typeof options.read === 'function') this._read = options.read;
if (typeof options.destroy === 'function') this._destroy = options.destroy;
if (typeof options.construct === 'function') this._construct = options.construct;
if (options.signal && !isDuplex) addAbortSignal(options.signal, this);
}
Stream.call(this, options);
destroyImpl.construct(this, () => {
if (this._readableState.needReadable) {
maybeReadMore(this, this._readableState);
}
});
}
Readable.prototype.destroy = destroyImpl.destroy;
Readable.prototype._undestroy = destroyImpl.undestroy;
Readable.prototype._destroy = function (err, cb) {
cb(err);
};
Readable.prototype[EE.captureRejectionSymbol] = function (err) {
this.destroy(err);
};
// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
Readable.prototype.push = function (chunk, encoding) {
return readableAddChunk(this, chunk, encoding, false)
};
// Unshift should *always* be something directly out of read().
Readable.prototype.unshift = function (chunk, encoding) {
return readableAddChunk(this, chunk, encoding, true)
};
function readableAddChunk(stream, chunk, encoding, addToFront) {
debug('readableAddChunk', chunk);
const state = stream._readableState;
let err;
if (!state.objectMode) {
if (typeof chunk === 'string') {
encoding = encoding || state.defaultEncoding;
if (state.encoding !== encoding) {
if (addToFront && state.encoding) {
// When unshifting, if state.encoding is set, we have to save
// the string in the BufferList with the state encoding.
chunk = Buffer.from(chunk, encoding).toString(state.encoding);
} else {
chunk = Buffer.from(chunk, encoding);
encoding = '';
}
}
} else if (chunk instanceof Buffer) {
encoding = '';
} else if (Stream._isUint8Array(chunk)) {
chunk = Stream._uint8ArrayToBuffer(chunk);
encoding = '';
} else if (chunk != null) {
err = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
}
}
if (err) {
errorOrDestroy(stream, err);
} else if (chunk === null) {
state.reading = false;
onEofChunk(stream, state);
} else if (state.objectMode || (chunk && chunk.length > 0)) {
if (addToFront) {
if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());
else if (state.destroyed || state.errored) return false
else addChunk(stream, state, chunk, true);
} else if (state.ended) {
errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
} else if (state.destroyed || state.errored) {
return false
} else {
state.reading = false;
if (state.decoder && !encoding) {
chunk = state.decoder.write(chunk);
if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);
else maybeReadMore(stream, state);
} else {
addChunk(stream, state, chunk, false);
}
}
} else if (!addToFront) {
state.reading = false;
maybeReadMore(stream, state);
}
// We can push more data if we are below the highWaterMark.
// Also, if we have no data yet, we can stand some more bytes.
// This is to work around cases where hwm=0, such as the repl.
return !state.ended && (state.length < state.highWaterMark || state.length === 0)
}
function addChunk(stream, state, chunk, addToFront) {
if (state.flowing && state.length === 0 && !state.sync && stream.listenerCount('data') > 0) {
// Use the guard to avoid creating `Set()` repeatedly
// when we have multiple pipes.
if (state.multiAwaitDrain) {
state.awaitDrainWriters.clear();
} else {
state.awaitDrainWriters = null;
}
state.dataEmitted = true;
stream.emit('data', chunk);
} else {
// Update the buffer info.
state.length += state.objectMode ? 1 : chunk.length;
if (addToFront) state.buffer.unshift(chunk);
else state.buffer.push(chunk);
if (state.needReadable) emitReadable(stream);
}
maybeReadMore(stream, state);
}
Readable.prototype.isPaused = function () {
const state = this._readableState;
return state[kPaused] === true || state.flowing === false
};
// Backwards compatibility.
Readable.prototype.setEncoding = function (enc) {
const decoder = new StringDecoder(enc);
this._readableState.decoder = decoder;
// If setEncoding(null), decoder.encoding equals utf8.
this._readableState.encoding = this._readableState.decoder.encoding;
const buffer = this._readableState.buffer;
// Iterate over current buffer to convert already stored Buffers:
let content = '';
for (const data of buffer) {
content += decoder.write(data);
}
buffer.clear();
if (content !== '') buffer.push(content);
this._readableState.length = content.length;
return this
};
// Don't raise the hwm > 1GB.
const MAX_HWM = 0x40000000;
function computeNewHighWaterMark(n) {
if (n > MAX_HWM) {
throw new ERR_OUT_OF_RANGE('size', '<= 1GiB', n)
} else {
// Get the next highest power of 2 to prevent increasing hwm excessively in
// tiny amounts.
n--;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
n++;
}
return n
}
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function howMuchToRead(n, state) {
if (n <= 0 || (state.length === 0 && state.ended)) return 0
if (state.objectMode) return 1
if (NumberIsNaN(n)) {
// Only flow one buffer at a time.
if (state.flowing && state.length) return state.buffer.first().length
return state.length
}
if (n <= state.length) return n
return state.ended ? state.length : 0
}
// You can override either this method, or the async _read(n) below.
Readable.prototype.read = function (n) {
debug('read', n);
// Same as parseInt(undefined, 10), however V8 7.3 performance regressed
// in this scenario, so we are doing it manually.
if (n === undefined) {
n = NaN;
} else if (!NumberIsInteger(n)) {
n = NumberParseInt(n, 10);
}
const state = this._readableState;
const nOrig = n;
// If we're asking for more than the current hwm, then raise the hwm.
if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
if (n !== 0) state.emittedReadable = false;
// If we're doing read(0) to trigger a readable event, but we
// already have a bunch of data in the buffer, then just trigger
// the 'readable' event and move on.
if (
n === 0 &&
state.needReadable &&
((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)
) {
debug('read: emitReadable', state.length, state.ended);
if (state.length === 0 && state.ended) endReadable(this);
else emitReadable(this);
return null
}
n = howMuchToRead(n, state);
// If we've ended, and we're now clear, then finish it up.
if (n === 0 && state.ended) {
if (state.length === 0) endReadable(this);
return null
}
// All the actual chunk generation logic needs to be
// *below* the call to _read. The reason is that in certain
// synthetic stream cases, such as passthrough streams, _read
// may be a completely synchronous operation which may change
// the state of the read buffer, providing enough data when
// before there was *not* enough.
//
// So, the steps are:
// 1. Figure out what the state of things will be after we do
// a read from the buffer.
//
// 2. If that resulting state will trigger a _read, then call _read.
// Note that this may be asynchronous, or synchronous. Yes, it is
// deeply ugly to write APIs this way, but that still doesn't mean
// that the Readable class should behave improperly, as streams are
// designed to be sync/async agnostic.
// Take note if the _read call is sync or async (ie, if the read call
// has returned yet), so that we know whether or not it's safe to emit
// 'readable' etc.
//
// 3. Actually pull the requested chunks out of the buffer and return.
// if we need a readable event, then we need to do some reading.
let doRead = state.needReadable;
debug('need readable', doRead);
// If we currently have less than the highWaterMark, then also read some.
if (state.length === 0 || state.length - n < state.highWaterMark) {
doRead = true;
debug('length less than watermark', doRead);
}
// However, if we've ended, then there's no point, if we're already
// reading, then it's unnecessary, if we're constructing we have to wait,
// and if we're destroyed or errored, then it's not allowed,
if (state.ended || state.reading || state.destroyed || state.errored || !state.constructed) {
doRead = false;
debug('reading, ended or constructing', doRead);
} else if (doRead) {
debug('do read');
state.reading = true;
state.sync = true;
// If the length is currently zero, then we *need* a readable event.
if (state.length === 0) state.needReadable = true;
// Call internal read method
try {
this._read(state.highWaterMark);
} catch (err) {
errorOrDestroy(this, err);
}
state.sync = false;
// If _read pushed data synchronously, then `reading` will be false,
// and we need to re-evaluate how much data we can return to the user.
if (!state.reading) n = howMuchToRead(nOrig, state);
}
let ret;
if (n > 0) ret = fromList(n, state);
else ret = null;
if (ret === null) {
state.needReadable = state.length <= state.highWaterMark;
n = 0;
} else {
state.length -= n;
if (state.multiAwaitDrain) {
state.awaitDrainWriters.clear();
} else {
state.awaitDrainWriters = null;
}
}
if (state.length === 0) {
// If we have nothing in the buffer, then we want to know
// as soon as we *do* get something into the buffer.
if (!state.ended) state.needReadable = true;
// If we tried to read() past the EOF, then emit end on the next tick.
if (nOrig !== n && state.ended) endReadable(this);
}
if (ret !== null && !state.errorEmitted && !state.closeEmitted) {
state.dataEmitted = true;
this.emit('data', ret);
}
return ret
};
function onEofChunk(stream, state) {
debug('onEofChunk');
if (state.ended) return
if (state.decoder) {
const chunk = state.decoder.end();
if (chunk && chunk.length) {
state.buffer.push(chunk);
state.length += state.objectMode ? 1 : chunk.length;
}
}
state.ended = true;
if (state.sync) {
// If we are sync, wait until next tick to emit the data.
// Otherwise we risk emitting data in the flow()
// the readable code triggers during a read() call.
emitReadable(stream);
} else {
// Emit 'readable' now to make sure it gets picked up.
state.needReadable = false;
state.emittedReadable = true;
// We have to emit readable now that we are EOF. Modules
// in the ecosystem (e.g. dicer) rely on this event being sync.
emitReadable_(stream);
}
}
// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow. This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable(stream) {
const state = stream._readableState;
debug('emitReadable', state.needReadable, state.emittedReadable);
state.needReadable = false;
if (!state.emittedReadable) {
debug('emitReadable', state.flowing);
state.emittedReadable = true;
process.nextTick(emitReadable_, stream);
}
}
function emitReadable_(stream) {
const state = stream._readableState;
debug('emitReadable_', state.destroyed, state.length, state.ended);
if (!state.destroyed && !state.errored && (state.length || state.ended)) {
stream.emit('readable');
state.emittedReadable = false;
}
// The stream needs another readable event if:
// 1. It is not flowing, as the flow mechanism will take
// care of it.
// 2. It is not ended.
// 3. It is below the highWaterMark, so we can schedule
// another readable later.
state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
flow(stream);
}
// At this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data. that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore(stream, state) {
if (!state.readingMore && state.constructed) {
state.readingMore = true;
process.nextTick(maybeReadMore_, stream, state);
}
}
function maybeReadMore_(stream, state) {
// Attempt to read more data if we should.
//
// The conditions for reading more data are (one of):
// - Not enough data buffered (state.length < state.highWaterMark). The loop
// is responsible for filling the buffer with enough data if such data
// is available. If highWaterMark is 0 and we are not in the flowing mode
// we should _not_ attempt to buffer any extra data. We'll get more data
// when the stream consumer calls read() instead.
// - No data in the buffer, and the stream is in flowing mode. In this mode
// the loop below is responsible for ensuring read() is called. Failing to
// call read here would abort the flow and there's no other mechanism for
// continuing the flow if the stream consumer has just subscribed to the
// 'data' event.
//
// In addition to the above conditions to keep reading data, the following
// conditions prevent the data from being read:
// - The stream has ended (state.ended).
// - There is already a pending 'read' operation (state.reading). This is a
// case where the stream has called the implementation defined _read()
// method, but they are processing the call asynchronously and have _not_
// called push() with new data. In this case we skip performing more
// read()s. The execution ends in this method again after the _read() ends
// up calling push() with more data.
while (
!state.reading &&
!state.ended &&
(state.length < state.highWaterMark || (state.flowing && state.length === 0))
) {
const len = state.length;
debug('maybeReadMore read 0');
stream.read(0);
if (len === state.length)
// Didn't get any data, stop spinning.
break
}
state.readingMore = false;
}
// Abstract method. to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
Readable.prototype._read = function (n) {
throw new ERR_METHOD_NOT_IMPLEMENTED('_read()')
};
Readable.prototype.pipe = function (dest, pipeOpts) {
const src = this;
const state = this._readableState;
if (state.pipes.length === 1) {
if (!state.multiAwaitDrain) {
state.multiAwaitDrain = true;
state.awaitDrainWriters = new SafeSet(state.awaitDrainWriters ? [state.awaitDrainWriters] : []);
}
}
state.pipes.push(dest);
debug('pipe count=%d opts=%j', state.pipes.length, pipeOpts);
const doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
const endFn = doEnd ? onend : unpipe;
if (state.endEmitted) process.nextTick(endFn);
else src.once('end', endFn);
dest.on('unpipe', onunpipe);
function onunpipe(readable, unpipeInfo) {
debug('onunpipe');
if (readable === src) {
if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
unpipeInfo.hasUnpiped = true;
cleanup();
}
}
}
function onend() {
debug('onend');
dest.end();
}
let ondrain;
let cleanedUp = false;
function cleanup() {
debug('cleanup');
// Cleanup event handlers once the pipe is broken.
dest.removeListener('close', onclose);
dest.removeListener('finish', onfinish);
if (ondrain) {
dest.removeListener('drain', ondrain);
}
dest.removeListener('error', onerror);
dest.removeListener('unpipe', onunpipe);
src.removeListener('end', onend);
src.removeListener('end', unpipe);
src.removeListener('data', ondata);
cleanedUp = true;
// If the reader is waiting for a drain event from this
// specific writer, then it would cause it to never start
// flowing again.
// So, if this is awaiting a drain, then we just call it now.
// If we don't know, then assume that we are waiting for one.
if (ondrain && state.awaitDrainWriters && (!dest._writableState || dest._writableState.needDrain)) ondrain();
}
function pause() {
// If the user unpiped during `dest.write()`, it is possible
// to get stuck in a permanently paused state if that write
// also returned false.
// => Check whether `dest` is still a piping destination.
if (!cleanedUp) {
if (state.pipes.length === 1 && state.pipes[0] === dest) {
debug('false write response, pause', 0);
state.awaitDrainWriters = dest;
state.multiAwaitDrain = false;
} else if (state.pipes.length > 1 && state.pipes.includes(dest)) {
debug('false write response, pause', state.awaitDrainWriters.size);
state.awaitDrainWriters.add(dest);
}
src.pause();
}
if (!ondrain) {
// When the dest drains, it reduces the awaitDrain counter
// on the source. This would be more elegant with a .once()
// handler in flow(), but adding and removing repeatedly is
// too slow.
ondrain = pipeOnDrain(src, dest);
dest.on('drain', ondrain);
}
}
src.on('data', ondata);
function ondata(chunk) {
debug('ondata');
const ret = dest.write(chunk);
debug('dest.write', ret);
if (ret === false) {
pause();
}
}
// If the dest has an error, then stop piping into it.
// However, don't suppress the throwing behavior for this.
function onerror(er) {
debug('onerror', er);
unpipe();
dest.removeListener('error', onerror);
if (dest.listenerCount('error') === 0) {
const s = dest._writableState || dest._readableState;
if (s && !s.errorEmitted) {
// User incorrectly emitted 'error' directly on the stream.
errorOrDestroy(dest, er);
} else {
dest.emit('error', er);
}
}
}
// Make sure our error handler is attached before userland ones.
prependListener(dest, 'error', onerror);
// Both close and finish should trigger unpipe, but only once.
function onclose() {
dest.removeListener('finish', onfinish);
unpipe();
}
dest.once('close', onclose);
function onfinish() {
debug('onfinish');
dest.removeListener('close', onclose);
unpipe();
}
dest.once('finish', onfinish);
function unpipe() {
debug('unpipe');
src.unpipe(dest);
}
// Tell the dest that it's being piped to.
dest.emit('pipe', src);
// Start the flow if it hasn't been started already.
if (dest.writableNeedDrain === true) {
if (state.flowing) {
pause();
}
} else if (!state.flowing) {
debug('pipe resume');
src.resume();
}
return dest
};
function pipeOnDrain(src, dest) {
return function pipeOnDrainFunctionResult() {
const state = src._readableState;
// `ondrain` will call directly,
// `this` maybe not a reference to dest,
// so we use the real dest here.
if (state.awaitDrainWriters === dest) {
debug('pipeOnDrain', 1);
state.awaitDrainWriters = null;
} else if (state.multiAwaitDrain) {
debug('pipeOnDrain', state.awaitDrainWriters.size);
state.awaitDrainWriters.delete(dest);
}
if ((!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && src.listenerCount('data')) {
src.resume();
}
}
}
Readable.prototype.unpipe = function (dest) {
const state = this._readableState;
const unpipeInfo = {
hasUnpiped: false
};
// If we're not piping anywhere, then do nothing.
if (state.pipes.length === 0) return this
if (!dest) {
// remove all.
const dests = state.pipes;
state.pipes = [];
this.pause();
for (let i = 0; i < dests.length; i++)
dests[i].emit('unpipe', this, {
hasUnpiped: false
});
return this
}
// Try to find the right one.
const index = ArrayPrototypeIndexOf(state.pipes, dest);
if (index === -1) return this
state.pipes.splice(index, 1);
if (state.pipes.length === 0) this.pause();
dest.emit('unpipe', this, unpipeInfo);
return this
};
// Set up data events if they are asked for
// Ensure readable listeners eventually get something.
Readable.prototype.on = function (ev, fn) {
const res = Stream.prototype.on.call(this, ev, fn);
const state = this._readableState;
if (ev === 'data') {
// Update readableListening so that resume() may be a no-op
// a few lines down. This is needed to support once('readable').
state.readableListening = this.listenerCount('readable') > 0;
// Try start flowing on next tick if stream isn't explicitly paused.
if (state.flowing !== false) this.resume();
} else if (ev === 'readable') {
if (!state.endEmitted && !state.readableListening) {
state.readableListening = state.needReadable = true;
state.flowing = false;
state.emittedReadable = false;
debug('on readable', state.length, state.reading);
if (state.length) {
emitReadable(this);
} else if (!state.reading) {
process.nextTick(nReadingNextTick, this);
}
}
}
return res
};
Readable.prototype.addListener = Readable.prototype.on;
Readable.prototype.removeListener = function (ev, fn) {
const res = Stream.prototype.removeListener.call(this, ev, fn);
if (ev === 'readable') {
// We need to check if there is someone still listening to
// readable and reset the state. However this needs to happen
// after readable has been emitted but before I/O (nextTick) to
// support once('readable', fn) cycles. This means that calling
// resume within the same tick will have no
// effect.
process.nextTick(updateReadableListening, this);
}
return res
};
Readable.prototype.off = Readable.prototype.removeListener;
Readable.prototype.removeAllListeners = function (ev) {
const res = Stream.prototype.removeAllListeners.apply(this, arguments);
if (ev === 'readable' || ev === undefined) {
// We need to check if there is someone still listening to
// readable and reset the state. However this needs to happen
// after readable has been emitted but before I/O (nextTick) to
// support once('readable', fn) cycles. This means that calling
// resume within the same tick will have no
// effect.
process.nextTick(updateReadableListening, this);
}
return res
};
function updateReadableListening(self) {
const state = self._readableState;
state.readableListening = self.listenerCount('readable') > 0;
if (state.resumeScheduled && state[kPaused] === false) {
// Flowing needs to be set to true now, otherwise
// the upcoming resume will not flow.
state.flowing = true;
// Crude way to check if we should resume.
} else if (self.listenerCount('data') > 0) {
self.resume();
} else if (!state.readableListening) {
state.flowing = null;
}
}
function nReadingNextTick(self) {
debug('readable nexttick read 0');
self.read(0);
}
// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
Readable.prototype.resume = function () {
const state = this._readableState;
if (!state.flowing) {
debug('resume');
// We flow only if there is no one listening
// for readable, but we still have to call
// resume().
state.flowing = !state.readableListening;
resume(this, state);
}
state[kPaused] = false;
return this
};
function resume(stream, state) {
if (!state.resumeScheduled) {
state.resumeScheduled = true;
process.nextTick(resume_, stream, state);
}
}
function resume_(stream, state) {
debug('resume', state.reading);
if (!state.reading) {
stream.read(0);
}
state.resumeScheduled = false;
stream.emit('resume');
flow(stream);
if (state.flowing && !state.reading) stream.read(0);
}
Readable.prototype.pause = function () {
debug('call pause flowing=%j', this._readableState.flowing);
if (this._readableState.flowing !== false) {
debug('pause');
this._readableState.flowing = false;
this.emit('pause');
}
this._readableState[kPaused] = true;
return this
};
function flow(stream) {
const state = stream._readableState;
debug('flow', state.flowing);
while (state.flowing && stream.read() !== null);
}
// Wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
Readable.prototype.wrap = function (stream) {
let paused = false;
// TODO (ronag): Should this.destroy(err) emit
// 'error' on the wrapped stream? Would require
// a static factory method, e.g. Readable.wrap(stream).
stream.on('data', (chunk) => {
if (!this.push(chunk) && stream.pause) {
paused = true;
stream.pause();
}
});
stream.on('end', () => {
this.push(null);
});
stream.on('error', (err) => {
errorOrDestroy(this, err);
});
stream.on('close', () => {
this.destroy();
});
stream.on('destroy', () => {
this.destroy();
});
this._read = () => {
if (paused && stream.resume) {
paused = false;
stream.resume();
}
};
// Proxy all the other methods. Important when wrapping filters and duplexes.
const streamKeys = ObjectKeys(stream);
for (let j = 1; j < streamKeys.length; j++) {
const i = streamKeys[j];
if (this[i] === undefined && typeof stream[i] === 'function') {
this[i] = stream[i].bind(stream);
}
}
return this
};
Readable.prototype[SymbolAsyncIterator] = function () {
return streamToAsyncIterator(this)
};
Readable.prototype.iterator = function (options) {
if (options !== undefined) {
validateObject(options, 'options');
}
return streamToAsyncIterator(this, options)
};
function streamToAsyncIterator(stream, options) {
if (typeof stream.read !== 'function') {
stream = Readable.wrap(stream, {
objectMode: true
});
}
const iter = createAsyncIterator(stream, options);
iter.stream = stream;
return iter
}
async function* createAsyncIterator(stream, options) {
let callback = nop;
function next(resolve) {
if (this === stream) {
callback();
callback = nop;
} else {
callback = resolve;
}
}
stream.on('readable', next);
let error;
const cleanup = eos(
stream,
{
writable: false
},
(err) => {
error = err ? aggregateTwoErrors(error, err) : null;
callback();
callback = nop;
}
);
try {
while (true) {
const chunk = stream.destroyed ? null : stream.read();
if (chunk !== null) {
yield chunk;
} else if (error) {
throw error
} else if (error === null) {
return
} else {
await new Promise(next);
}
}
} catch (err) {
error = aggregateTwoErrors(error, err);
throw error
} finally {
if (
(error || (options === null || options === undefined ? undefined : options.destroyOnReturn) !== false) &&
(error === undefined || stream._readableState.autoDestroy)
) {
destroyImpl.destroyer(stream, null);
} else {
stream.off('readable', next);
cleanup();
}
}
}
// Making it explicit these properties are not enumerable
// because otherwise some prototype manipulation in
// userland will fail.
ObjectDefineProperties(Readable.prototype, {
readable: {
__proto__: null,
get() {
const r = this._readableState;
// r.readable === false means that this is part of a Duplex stream
// where the readable side was disabled upon construction.
// Compat. The user might manually disable readable side through
// deprecated setter.
return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted
},
set(val) {
// Backwards compat.
if (this._readableState) {
this._readableState.readable = !!val;
}
}
},
readableDidRead: {
__proto__: null,
enumerable: false,
get: function () {
return this._readableState.dataEmitted
}
},
readableAborted: {
__proto__: null,
enumerable: false,
get: function () {
return !!(
this._readableState.readable !== false &&
(this._readableState.destroyed || this._readableState.errored) &&
!this._readableState.endEmitted
)
}
},
readableHighWaterMark: {
__proto__: null,
enumerable: false,
get: function () {
return this._readableState.highWaterMark
}
},
readableBuffer: {
__proto__: null,
enumerable: false,
get: function () {
return this._readableState && this._readableState.buffer
}
},
readableFlowing: {
__proto__: null,
enumerable: false,
get: function () {
return this._readableState.flowing
},
set: function (state) {
if (this._readableState) {
this._readableState.flowing = state;
}
}
},
readableLength: {
__proto__: null,
enumerable: false,
get() {
return this._readableState.length
}
},
readableObjectMode: {
__proto__: null,
enumerable: false,
get() {
return this._readableState ? this._readableState.objectMode : false
}
},
readableEncoding: {
__proto__: null,
enumerable: false,
get() {
return this._readableState ? this._readableState.encoding : null
}
},
errored: {
__proto__: null,
enumerable: false,
get() {
return this._readableState ? this._readableState.errored : null
}
},
closed: {
__proto__: null,
get() {
return this._readableState ? this._readableState.closed : false
}
},
destroyed: {
__proto__: null,
enumerable: false,
get() {
return this._readableState ? this._readableState.destroyed : false
},
set(value) {
// We ignore the value if the stream
// has not been initialized yet.
if (!this._readableState) {
return
}
// Backward compatibility, the user is explicitly
// managing destroyed.
this._readableState.destroyed = value;
}
},
readableEnded: {
__proto__: null,
enumerable: false,
get() {
return this._readableState ? this._readableState.endEmitted : false
}
}
});
ObjectDefineProperties(ReadableState.prototype, {
// Legacy getter for `pipesCount`.
pipesCount: {
__proto__: null,
get() {
return this.pipes.length
}
},
// Legacy property for `paused`.
paused: {
__proto__: null,
get() {
return this[kPaused] !== false
},
set(value) {
this[kPaused] = !!value;
}
}
});
// Exposed for testing purposes only.
Readable._fromList = fromList;
// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromList(n, state) {
// nothing buffered.
if (state.length === 0) return null
let ret;
if (state.objectMode) ret = state.buffer.shift();
else if (!n || n >= state.length) {
// Read it all, truncate the list.
if (state.decoder) ret = state.buffer.join('');
else if (state.buffer.length === 1) ret = state.buffer.first();
else ret = state.buffer.concat(state.length);
state.buffer.clear();
} else {
// read part of list.
ret = state.buffer.consume(n, state.decoder);
}
return ret
}
function endReadable(stream) {
const state = stream._readableState;
debug('endReadable', state.endEmitted);
if (!state.endEmitted) {
state.ended = true;
process.nextTick(endReadableNT, state, stream);
}
}
function endReadableNT(state, stream) {
debug('endReadableNT', state.endEmitted, state.length);
// Check that we didn't get one last unshift.
if (!state.errored && !state.closeEmitted && !state.endEmitted && state.length === 0) {
state.endEmitted = true;
stream.emit('end');
if (stream.writable && stream.allowHalfOpen === false) {
process.nextTick(endWritableNT, stream);
} else if (state.autoDestroy) {
// In case of duplex streams we need a way to detect
// if the writable side is ready for autoDestroy as well.
const wState = stream._writableState;
const autoDestroy =
!wState ||
(wState.autoDestroy &&
// We don't expect the writable to ever 'finish'
// if writable is explicitly set to false.
(wState.finished || wState.writable === false));
if (autoDestroy) {
stream.destroy();
}
}
}
}
function endWritableNT(stream) {
const writable = stream.writable && !stream.writableEnded && !stream.destroyed;
if (writable) {
stream.end();
}
}
Readable.from = function (iterable, opts) {
return from(Readable, iterable, opts)
};
let webStreamsAdapters;
// Lazy to avoid circular references
function lazyWebStreams() {
if (webStreamsAdapters === undefined) webStreamsAdapters = {};
return webStreamsAdapters
}
Readable.fromWeb = function (readableStream, options) {
return lazyWebStreams().newStreamReadableFromReadableStream(readableStream, options)
};
Readable.toWeb = function (streamReadable, options) {
return lazyWebStreams().newReadableStreamFromStreamReadable(streamReadable, options)
};
Readable.wrap = function (src, options) {
var _ref, _src$readableObjectMo;
return new Readable({
objectMode:
(_ref =
(_src$readableObjectMo = src.readableObjectMode) !== null && _src$readableObjectMo !== undefined
? _src$readableObjectMo
: src.objectMode) !== null && _ref !== undefined
? _ref
: true,
...options,
destroy(err, callback) {
destroyImpl.destroyer(src, err);
callback(err);
}
}).wrap(src)
};
return readable;
}
/* replacement start */
var writable;
var hasRequiredWritable;
function requireWritable () {
if (hasRequiredWritable) return writable;
hasRequiredWritable = 1;
const process = requireProcess()
/* replacement end */
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// A bit simpler than readable streams.
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
// the drain event emission and buffering.
; const {
ArrayPrototypeSlice,
Error,
FunctionPrototypeSymbolHasInstance,
ObjectDefineProperty,
ObjectDefineProperties,
ObjectSetPrototypeOf,
StringPrototypeToLowerCase,
Symbol,
SymbolHasInstance
} = requirePrimordials();
writable = Writable;
Writable.WritableState = WritableState;
const { EventEmitter: EE } = require$$2;
const Stream = requireLegacy().Stream;
const { Buffer } = require$$0;
const destroyImpl = requireDestroy();
const { addAbortSignal } = requireAddAbortSignal();
const { getHighWaterMark, getDefaultHighWaterMark } = requireState();
const {
ERR_INVALID_ARG_TYPE,
ERR_METHOD_NOT_IMPLEMENTED,
ERR_MULTIPLE_CALLBACK,
ERR_STREAM_CANNOT_PIPE,
ERR_STREAM_DESTROYED,
ERR_STREAM_ALREADY_FINISHED,
ERR_STREAM_NULL_VALUES,
ERR_STREAM_WRITE_AFTER_END,
ERR_UNKNOWN_ENCODING
} = requireErrors().codes;
const { errorOrDestroy } = destroyImpl;
ObjectSetPrototypeOf(Writable.prototype, Stream.prototype);
ObjectSetPrototypeOf(Writable, Stream);
function nop() {}
const kOnFinished = Symbol('kOnFinished');
function WritableState(options, stream, isDuplex) {
// Duplex streams are both readable and writable, but share
// the same options object.
// However, some cases require setting options to different
// values for the readable and the writable sides of the duplex stream,
// e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof requireDuplex();
// Object stream flag to indicate whether or not this stream
// contains buffers or objects.
this.objectMode = !!(options && options.objectMode);
if (isDuplex) this.objectMode = this.objectMode || !!(options && options.writableObjectMode);
// The point at which write() starts returning false
// Note: 0 is a valid value, means that we always return false if
// the entire buffer is not flushed immediately on write().
this.highWaterMark = options
? getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex)
: getDefaultHighWaterMark(false);
// if _final has been called.
this.finalCalled = false;
// drain event flag.
this.needDrain = false;
// At the start of calling end()
this.ending = false;
// When end() has been called, and returned.
this.ended = false;
// When 'finish' is emitted.
this.finished = false;
// Has it been destroyed
this.destroyed = false;
// Should we decode strings into buffers before passing to _write?
// this is here so that some node-core streams can optimize string
// handling at a lower level.
const noDecode = !!(options && options.decodeStrings === false);
this.decodeStrings = !noDecode;
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this.defaultEncoding = (options && options.defaultEncoding) || 'utf8';
// Not an actual buffer we keep track of, but a measurement
// of how much we're waiting to get pushed to some underlying
// socket or file.
this.length = 0;
// A flag to see when we're in the middle of a write.
this.writing = false;
// When true all writes will be buffered until .uncork() call.
this.corked = 0;
// A flag to be able to tell if the onwrite cb is called immediately,
// or on a later tick. We set this to true at first, because any
// actions that shouldn't happen until "later" should generally also
// not happen before the first write call.
this.sync = true;
// A flag to know if we're processing previously buffered items, which
// may call the _write() callback in the same tick, so that we don't
// end up in an overlapped onwrite situation.
this.bufferProcessing = false;
// The callback that's passed to _write(chunk, cb).
this.onwrite = onwrite.bind(undefined, stream);
// The callback that the user supplies to write(chunk, encoding, cb).
this.writecb = null;
// The amount that is being written when _write is called.
this.writelen = 0;
// Storage for data passed to the afterWrite() callback in case of
// synchronous _write() completion.
this.afterWriteTickInfo = null;
resetBuffer(this);
// Number of pending user-supplied write callbacks
// this must be 0 before 'finish' can be emitted.
this.pendingcb = 0;
// Stream is still being constructed and cannot be
// destroyed until construction finished or failed.
// Async construction is opt in, therefore we start as
// constructed.
this.constructed = true;
// Emit prefinish if the only thing we're waiting for is _write cbs
// This is relevant for synchronous Transform streams.
this.prefinished = false;
// True if the error was already emitted and should not be thrown again.
this.errorEmitted = false;
// Should close be emitted on destroy. Defaults to true.
this.emitClose = !options || options.emitClose !== false;
// Should .destroy() be called after 'finish' (and potentially 'end').
this.autoDestroy = !options || options.autoDestroy !== false;
// Indicates whether the stream has errored. When true all write() calls
// should return false. This is needed since when autoDestroy
// is disabled we need a way to tell whether the stream has failed.
this.errored = null;
// Indicates whether the stream has finished destroying.
this.closed = false;
// True if close has been emitted or would have been emitted
// depending on emitClose.
this.closeEmitted = false;
this[kOnFinished] = [];
}
function resetBuffer(state) {
state.buffered = [];
state.bufferedIndex = 0;
state.allBuffers = true;
state.allNoop = true;
}
WritableState.prototype.getBuffer = function getBuffer() {
return ArrayPrototypeSlice(this.buffered, this.bufferedIndex)
};
ObjectDefineProperty(WritableState.prototype, 'bufferedRequestCount', {
__proto__: null,
get() {
return this.buffered.length - this.bufferedIndex
}
});
function Writable(options) {
// Writable ctor is applied to Duplexes, too.
// `realHasInstance` is necessary because using plain `instanceof`
// would return false, as no `_writableState` property is attached.
// Trying to use the custom `instanceof` for Writable here will also break the
// Node.js LazyTransform implementation, which has a non-trivial getter for
// `_writableState` that would lead to infinite recursion.
// Checking for a Stream.Duplex instance is faster here instead of inside
// the WritableState constructor, at least with V8 6.5.
const isDuplex = this instanceof requireDuplex();
if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) return new Writable(options)
this._writableState = new WritableState(options, this, isDuplex);
if (options) {
if (typeof options.write === 'function') this._write = options.write;
if (typeof options.writev === 'function') this._writev = options.writev;
if (typeof options.destroy === 'function') this._destroy = options.destroy;
if (typeof options.final === 'function') this._final = options.final;
if (typeof options.construct === 'function') this._construct = options.construct;
if (options.signal) addAbortSignal(options.signal, this);
}
Stream.call(this, options);
destroyImpl.construct(this, () => {
const state = this._writableState;
if (!state.writing) {
clearBuffer(this, state);
}
finishMaybe(this, state);
});
}
ObjectDefineProperty(Writable, SymbolHasInstance, {
__proto__: null,
value: function (object) {
if (FunctionPrototypeSymbolHasInstance(this, object)) return true
if (this !== Writable) return false
return object && object._writableState instanceof WritableState
}
});
// Otherwise people can pipe Writable streams, which is just wrong.
Writable.prototype.pipe = function () {
errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
};
function _write(stream, chunk, encoding, cb) {
const state = stream._writableState;
if (typeof encoding === 'function') {
cb = encoding;
encoding = state.defaultEncoding;
} else {
if (!encoding) encoding = state.defaultEncoding;
else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)
if (typeof cb !== 'function') cb = nop;
}
if (chunk === null) {
throw new ERR_STREAM_NULL_VALUES()
} else if (!state.objectMode) {
if (typeof chunk === 'string') {
if (state.decodeStrings !== false) {
chunk = Buffer.from(chunk, encoding);
encoding = 'buffer';
}
} else if (chunk instanceof Buffer) {
encoding = 'buffer';
} else if (Stream._isUint8Array(chunk)) {
chunk = Stream._uint8ArrayToBuffer(chunk);
encoding = 'buffer';
} else {
throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk)
}
}
let err;
if (state.ending) {
err = new ERR_STREAM_WRITE_AFTER_END();
} else if (state.destroyed) {
err = new ERR_STREAM_DESTROYED('write');
}
if (err) {
process.nextTick(cb, err);
errorOrDestroy(stream, err, true);
return err
}
state.pendingcb++;
return writeOrBuffer(stream, state, chunk, encoding, cb)
}
Writable.prototype.write = function (chunk, encoding, cb) {
return _write(this, chunk, encoding, cb) === true
};
Writable.prototype.cork = function () {
this._writableState.corked++;
};
Writable.prototype.uncork = function () {
const state = this._writableState;
if (state.corked) {
state.corked--;
if (!state.writing) clearBuffer(this, state);
}
};
Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
// node::ParseEncoding() requires lower case.
if (typeof encoding === 'string') encoding = StringPrototypeToLowerCase(encoding);
if (!Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)
this._writableState.defaultEncoding = encoding;
return this
};
// If we're already writing something, then just put this
// in the queue, and wait our turn. Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
function writeOrBuffer(stream, state, chunk, encoding, callback) {
const len = state.objectMode ? 1 : chunk.length;
state.length += len;
// stream._write resets state.length
const ret = state.length < state.highWaterMark;
// We must ensure that previous needDrain will not be reset to false.
if (!ret) state.needDrain = true;
if (state.writing || state.corked || state.errored || !state.constructed) {
state.buffered.push({
chunk,
encoding,
callback
});
if (state.allBuffers && encoding !== 'buffer') {
state.allBuffers = false;
}
if (state.allNoop && callback !== nop) {
state.allNoop = false;
}
} else {
state.writelen = len;
state.writecb = callback;
state.writing = true;
state.sync = true;
stream._write(chunk, encoding, state.onwrite);
state.sync = false;
}
// Return false if errored or destroyed in order to break
// any synchronous while(stream.write(data)) loops.
return ret && !state.errored && !state.destroyed
}
function doWrite(stream, state, writev, len, chunk, encoding, cb) {
state.writelen = len;
state.writecb = cb;
state.writing = true;
state.sync = true;
if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));
else if (writev) stream._writev(chunk, state.onwrite);
else stream._write(chunk, encoding, state.onwrite);
state.sync = false;
}
function onwriteError(stream, state, er, cb) {
--state.pendingcb;
cb(er);
// Ensure callbacks are invoked even when autoDestroy is
// not enabled. Passing `er` here doesn't make sense since
// it's related to one specific write, not to the buffered
// writes.
errorBuffer(state);
// This can emit error, but error must always follow cb.
errorOrDestroy(stream, er);
}
function onwrite(stream, er) {
const state = stream._writableState;
const sync = state.sync;
const cb = state.writecb;
if (typeof cb !== 'function') {
errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK());
return
}
state.writing = false;
state.writecb = null;
state.length -= state.writelen;
state.writelen = 0;
if (er) {
// Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
er.stack; // eslint-disable-line no-unused-expressions
if (!state.errored) {
state.errored = er;
}
// In case of duplex streams we need to notify the readable side of the
// error.
if (stream._readableState && !stream._readableState.errored) {
stream._readableState.errored = er;
}
if (sync) {
process.nextTick(onwriteError, stream, state, er, cb);
} else {
onwriteError(stream, state, er, cb);
}
} else {
if (state.buffered.length > state.bufferedIndex) {
clearBuffer(stream, state);
}
if (sync) {
// It is a common case that the callback passed to .write() is always
// the same. In that case, we do not schedule a new nextTick(), but
// rather just increase a counter, to improve performance and avoid
// memory allocations.
if (state.afterWriteTickInfo !== null && state.afterWriteTickInfo.cb === cb) {
state.afterWriteTickInfo.count++;
} else {
state.afterWriteTickInfo = {
count: 1,
cb,
stream,
state
};
process.nextTick(afterWriteTick, state.afterWriteTickInfo);
}
} else {
afterWrite(stream, state, 1, cb);
}
}
}
function afterWriteTick({ stream, state, count, cb }) {
state.afterWriteTickInfo = null;
return afterWrite(stream, state, count, cb)
}
function afterWrite(stream, state, count, cb) {
const needDrain = !state.ending && !stream.destroyed && state.length === 0 && state.needDrain;
if (needDrain) {
state.needDrain = false;
stream.emit('drain');
}
while (count-- > 0) {
state.pendingcb--;
cb();
}
if (state.destroyed) {
errorBuffer(state);
}
finishMaybe(stream, state);
}
// If there's something in the buffer waiting, then invoke callbacks.
function errorBuffer(state) {
if (state.writing) {
return
}
for (let n = state.bufferedIndex; n < state.buffered.length; ++n) {
var _state$errored;
const { chunk, callback } = state.buffered[n];
const len = state.objectMode ? 1 : chunk.length;
state.length -= len;
callback(
(_state$errored = state.errored) !== null && _state$errored !== undefined
? _state$errored
: new ERR_STREAM_DESTROYED('write')
);
}
const onfinishCallbacks = state[kOnFinished].splice(0);
for (let i = 0; i < onfinishCallbacks.length; i++) {
var _state$errored2;
onfinishCallbacks[i](
(_state$errored2 = state.errored) !== null && _state$errored2 !== undefined
? _state$errored2
: new ERR_STREAM_DESTROYED('end')
);
}
resetBuffer(state);
}
// If there's something in the buffer waiting, then process it.
function clearBuffer(stream, state) {
if (state.corked || state.bufferProcessing || state.destroyed || !state.constructed) {
return
}
const { buffered, bufferedIndex, objectMode } = state;
const bufferedLength = buffered.length - bufferedIndex;
if (!bufferedLength) {
return
}
let i = bufferedIndex;
state.bufferProcessing = true;
if (bufferedLength > 1 && stream._writev) {
state.pendingcb -= bufferedLength - 1;
const callback = state.allNoop
? nop
: (err) => {
for (let n = i; n < buffered.length; ++n) {
buffered[n].callback(err);
}
};
// Make a copy of `buffered` if it's going to be used by `callback` above,
// since `doWrite` will mutate the array.
const chunks = state.allNoop && i === 0 ? buffered : ArrayPrototypeSlice(buffered, i);
chunks.allBuffers = state.allBuffers;
doWrite(stream, state, true, state.length, chunks, '', callback);
resetBuffer(state);
} else {
do {
const { chunk, encoding, callback } = buffered[i];
buffered[i++] = null;
const len = objectMode ? 1 : chunk.length;
doWrite(stream, state, false, len, chunk, encoding, callback);
} while (i < buffered.length && !state.writing)
if (i === buffered.length) {
resetBuffer(state);
} else if (i > 256) {
buffered.splice(0, i);
state.bufferedIndex = 0;
} else {
state.bufferedIndex = i;
}
}
state.bufferProcessing = false;
}
Writable.prototype._write = function (chunk, encoding, cb) {
if (this._writev) {
this._writev(
[
{
chunk,
encoding
}
],
cb
);
} else {
throw new ERR_METHOD_NOT_IMPLEMENTED('_write()')
}
};
Writable.prototype._writev = null;
Writable.prototype.end = function (chunk, encoding, cb) {
const state = this._writableState;
if (typeof chunk === 'function') {
cb = chunk;
chunk = null;
encoding = null;
} else if (typeof encoding === 'function') {
cb = encoding;
encoding = null;
}
let err;
if (chunk !== null && chunk !== undefined) {
const ret = _write(this, chunk, encoding);
if (ret instanceof Error) {
err = ret;
}
}
// .end() fully uncorks.
if (state.corked) {
state.corked = 1;
this.uncork();
}
if (err) ; else if (!state.errored && !state.ending) {
// This is forgiving in terms of unnecessary calls to end() and can hide
// logic errors. However, usually such errors are harmless and causing a
// hard error can be disproportionately destructive. It is not always
// trivial for the user to determine whether end() needs to be called
// or not.
state.ending = true;
finishMaybe(this, state, true);
state.ended = true;
} else if (state.finished) {
err = new ERR_STREAM_ALREADY_FINISHED('end');
} else if (state.destroyed) {
err = new ERR_STREAM_DESTROYED('end');
}
if (typeof cb === 'function') {
if (err || state.finished) {
process.nextTick(cb, err);
} else {
state[kOnFinished].push(cb);
}
}
return this
};
function needFinish(state) {
return (
state.ending &&
!state.destroyed &&
state.constructed &&
state.length === 0 &&
!state.errored &&
state.buffered.length === 0 &&
!state.finished &&
!state.writing &&
!state.errorEmitted &&
!state.closeEmitted
)
}
function callFinal(stream, state) {
let called = false;
function onFinish(err) {
if (called) {
errorOrDestroy(stream, err !== null && err !== undefined ? err : ERR_MULTIPLE_CALLBACK());
return
}
called = true;
state.pendingcb--;
if (err) {
const onfinishCallbacks = state[kOnFinished].splice(0);
for (let i = 0; i < onfinishCallbacks.length; i++) {
onfinishCallbacks[i](err);
}
errorOrDestroy(stream, err, state.sync);
} else if (needFinish(state)) {
state.prefinished = true;
stream.emit('prefinish');
// Backwards compat. Don't check state.sync here.
// Some streams assume 'finish' will be emitted
// asynchronously relative to _final callback.
state.pendingcb++;
process.nextTick(finish, stream, state);
}
}
state.sync = true;
state.pendingcb++;
try {
stream._final(onFinish);
} catch (err) {
onFinish(err);
}
state.sync = false;
}
function prefinish(stream, state) {
if (!state.prefinished && !state.finalCalled) {
if (typeof stream._final === 'function' && !state.destroyed) {
state.finalCalled = true;
callFinal(stream, state);
} else {
state.prefinished = true;
stream.emit('prefinish');
}
}
}
function finishMaybe(stream, state, sync) {
if (needFinish(state)) {
prefinish(stream, state);
if (state.pendingcb === 0) {
if (sync) {
state.pendingcb++;
process.nextTick(
(stream, state) => {
if (needFinish(state)) {
finish(stream, state);
} else {
state.pendingcb--;
}
},
stream,
state
);
} else if (needFinish(state)) {
state.pendingcb++;
finish(stream, state);
}
}
}
}
function finish(stream, state) {
state.pendingcb--;
state.finished = true;
const onfinishCallbacks = state[kOnFinished].splice(0);
for (let i = 0; i < onfinishCallbacks.length; i++) {
onfinishCallbacks[i]();
}
stream.emit('finish');
if (state.autoDestroy) {
// In case of duplex streams we need a way to detect
// if the readable side is ready for autoDestroy as well.
const rState = stream._readableState;
const autoDestroy =
!rState ||
(rState.autoDestroy &&
// We don't expect the readable to ever 'end'
// if readable is explicitly set to false.
(rState.endEmitted || rState.readable === false));
if (autoDestroy) {
stream.destroy();
}
}
}
ObjectDefineProperties(Writable.prototype, {
closed: {
__proto__: null,
get() {
return this._writableState ? this._writableState.closed : false
}
},
destroyed: {
__proto__: null,
get() {
return this._writableState ? this._writableState.destroyed : false
},
set(value) {
// Backward compatibility, the user is explicitly managing destroyed.
if (this._writableState) {
this._writableState.destroyed = value;
}
}
},
writable: {
__proto__: null,
get() {
const w = this._writableState;
// w.writable === false means that this is part of a Duplex stream
// where the writable side was disabled upon construction.
// Compat. The user might manually disable writable side through
// deprecated setter.
return !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended
},
set(val) {
// Backwards compatible.
if (this._writableState) {
this._writableState.writable = !!val;
}
}
},
writableFinished: {
__proto__: null,
get() {
return this._writableState ? this._writableState.finished : false
}
},
writableObjectMode: {
__proto__: null,
get() {
return this._writableState ? this._writableState.objectMode : false
}
},
writableBuffer: {
__proto__: null,
get() {
return this._writableState && this._writableState.getBuffer()
}
},
writableEnded: {
__proto__: null,
get() {
return this._writableState ? this._writableState.ending : false
}
},
writableNeedDrain: {
__proto__: null,
get() {
const wState = this._writableState;
if (!wState) return false
return !wState.destroyed && !wState.ending && wState.needDrain
}
},
writableHighWaterMark: {
__proto__: null,
get() {
return this._writableState && this._writableState.highWaterMark
}
},
writableCorked: {
__proto__: null,
get() {
return this._writableState ? this._writableState.corked : 0
}
},
writableLength: {
__proto__: null,
get() {
return this._writableState && this._writableState.length
}
},
errored: {
__proto__: null,
enumerable: false,
get() {
return this._writableState ? this._writableState.errored : null
}
},
writableAborted: {
__proto__: null,
enumerable: false,
get: function () {
return !!(
this._writableState.writable !== false &&
(this._writableState.destroyed || this._writableState.errored) &&
!this._writableState.finished
)
}
}
});
const destroy = destroyImpl.destroy;
Writable.prototype.destroy = function (err, cb) {
const state = this._writableState;
// Invoke pending callbacks.
if (!state.destroyed && (state.bufferedIndex < state.buffered.length || state[kOnFinished].length)) {
process.nextTick(errorBuffer, state);
}
destroy.call(this, err, cb);
return this
};
Writable.prototype._undestroy = destroyImpl.undestroy;
Writable.prototype._destroy = function (err, cb) {
cb(err);
};
Writable.prototype[EE.captureRejectionSymbol] = function (err) {
this.destroy(err);
};
let webStreamsAdapters;
// Lazy to avoid circular references
function lazyWebStreams() {
if (webStreamsAdapters === undefined) webStreamsAdapters = {};
return webStreamsAdapters
}
Writable.fromWeb = function (writableStream, options) {
return lazyWebStreams().newStreamWritableFromWritableStream(writableStream, options)
};
Writable.toWeb = function (streamWritable) {
return lazyWebStreams().newWritableStreamFromStreamWritable(streamWritable)
};
return writable;
}
/* replacement start */
var duplexify;
var hasRequiredDuplexify;
function requireDuplexify () {
if (hasRequiredDuplexify) return duplexify;
hasRequiredDuplexify = 1;
const process = requireProcess()
/* replacement end */
; const bufferModule = require$$0;
const {
isReadable,
isWritable,
isIterable,
isNodeStream,
isReadableNodeStream,
isWritableNodeStream,
isDuplexNodeStream
} = requireUtils();
const eos = requireEndOfStream();
const {
AbortError,
codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_RETURN_VALUE }
} = requireErrors();
const { destroyer } = requireDestroy();
const Duplex = requireDuplex();
const Readable = requireReadable();
const { createDeferredPromise } = requireUtil();
const from = requireFrom();
const Blob = globalThis.Blob || bufferModule.Blob;
const isBlob =
typeof Blob !== 'undefined'
? function isBlob(b) {
return b instanceof Blob
}
: function isBlob(b) {
return false
};
const AbortController = globalThis.AbortController || require$$9.AbortController;
const { FunctionPrototypeCall } = requirePrimordials();
// This is needed for pre node 17.
class Duplexify extends Duplex {
constructor(options) {
super(options);
// https://github.com/nodejs/node/pull/34385
if ((options === null || options === undefined ? undefined : options.readable) === false) {
this._readableState.readable = false;
this._readableState.ended = true;
this._readableState.endEmitted = true;
}
if ((options === null || options === undefined ? undefined : options.writable) === false) {
this._writableState.writable = false;
this._writableState.ending = true;
this._writableState.ended = true;
this._writableState.finished = true;
}
}
}
duplexify = function duplexify(body, name) {
if (isDuplexNodeStream(body)) {
return body
}
if (isReadableNodeStream(body)) {
return _duplexify({
readable: body
})
}
if (isWritableNodeStream(body)) {
return _duplexify({
writable: body
})
}
if (isNodeStream(body)) {
return _duplexify({
writable: false,
readable: false
})
}
// TODO: Webstreams
// if (isReadableStream(body)) {
// return _duplexify({ readable: Readable.fromWeb(body) });
// }
// TODO: Webstreams
// if (isWritableStream(body)) {
// return _duplexify({ writable: Writable.fromWeb(body) });
// }
if (typeof body === 'function') {
const { value, write, final, destroy } = fromAsyncGen(body);
if (isIterable(value)) {
return from(Duplexify, value, {
// TODO (ronag): highWaterMark?
objectMode: true,
write,
final,
destroy
})
}
const then = value === null || value === undefined ? undefined : value.then;
if (typeof then === 'function') {
let d;
const promise = FunctionPrototypeCall(
then,
value,
(val) => {
if (val != null) {
throw new ERR_INVALID_RETURN_VALUE('nully', 'body', val)
}
},
(err) => {
destroyer(d, err);
}
);
return (d = new Duplexify({
// TODO (ronag): highWaterMark?
objectMode: true,
readable: false,
write,
final(cb) {
final(async () => {
try {
await promise;
process.nextTick(cb, null);
} catch (err) {
process.nextTick(cb, err);
}
});
},
destroy
}))
}
throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or AsyncFunction', name, value)
}
if (isBlob(body)) {
return duplexify(body.arrayBuffer())
}
if (isIterable(body)) {
return from(Duplexify, body, {
// TODO (ronag): highWaterMark?
objectMode: true,
writable: false
})
}
// TODO: Webstreams.
// if (
// isReadableStream(body?.readable) &&
// isWritableStream(body?.writable)
// ) {
// return Duplexify.fromWeb(body);
// }
if (
typeof (body === null || body === undefined ? undefined : body.writable) === 'object' ||
typeof (body === null || body === undefined ? undefined : body.readable) === 'object'
) {
const readable =
body !== null && body !== undefined && body.readable
? isReadableNodeStream(body === null || body === undefined ? undefined : body.readable)
? body === null || body === undefined
? undefined
: body.readable
: duplexify(body.readable)
: undefined;
const writable =
body !== null && body !== undefined && body.writable
? isWritableNodeStream(body === null || body === undefined ? undefined : body.writable)
? body === null || body === undefined
? undefined
: body.writable
: duplexify(body.writable)
: undefined;
return _duplexify({
readable,
writable
})
}
const then = body === null || body === undefined ? undefined : body.then;
if (typeof then === 'function') {
let d;
FunctionPrototypeCall(
then,
body,
(val) => {
if (val != null) {
d.push(val);
}
d.push(null);
},
(err) => {
destroyer(d, err);
}
);
return (d = new Duplexify({
objectMode: true,
writable: false,
read() {}
}))
}
throw new ERR_INVALID_ARG_TYPE(
name,
[
'Blob',
'ReadableStream',
'WritableStream',
'Stream',
'Iterable',
'AsyncIterable',
'Function',
'{ readable, writable } pair',
'Promise'
],
body
)
};
function fromAsyncGen(fn) {
let { promise, resolve } = createDeferredPromise();
const ac = new AbortController();
const signal = ac.signal;
const value = fn(
(async function* () {
while (true) {
const _promise = promise;
promise = null;
const { chunk, done, cb } = await _promise;
process.nextTick(cb);
if (done) return
if (signal.aborted)
throw new AbortError(undefined, {
cause: signal.reason
})
;({ promise, resolve } = createDeferredPromise());
yield chunk;
}
})(),
{
signal
}
);
return {
value,
write(chunk, encoding, cb) {
const _resolve = resolve;
resolve = null;
_resolve({
chunk,
done: false,
cb
});
},
final(cb) {
const _resolve = resolve;
resolve = null;
_resolve({
done: true,
cb
});
},
destroy(err, cb) {
ac.abort();
cb(err);
}
}
}
function _duplexify(pair) {
const r = pair.readable && typeof pair.readable.read !== 'function' ? Readable.wrap(pair.readable) : pair.readable;
const w = pair.writable;
let readable = !!isReadable(r);
let writable = !!isWritable(w);
let ondrain;
let onfinish;
let onreadable;
let onclose;
let d;
function onfinished(err) {
const cb = onclose;
onclose = null;
if (cb) {
cb(err);
} else if (err) {
d.destroy(err);
} else if (!readable && !writable) {
d.destroy();
}
}
// TODO(ronag): Avoid double buffering.
// Implement Writable/Readable/Duplex traits.
// See, https://github.com/nodejs/node/pull/33515.
d = new Duplexify({
// TODO (ronag): highWaterMark?
readableObjectMode: !!(r !== null && r !== undefined && r.readableObjectMode),
writableObjectMode: !!(w !== null && w !== undefined && w.writableObjectMode),
readable,
writable
});
if (writable) {
eos(w, (err) => {
writable = false;
if (err) {
destroyer(r, err);
}
onfinished(err);
});
d._write = function (chunk, encoding, callback) {
if (w.write(chunk, encoding)) {
callback();
} else {
ondrain = callback;
}
};
d._final = function (callback) {
w.end();
onfinish = callback;
};
w.on('drain', function () {
if (ondrain) {
const cb = ondrain;
ondrain = null;
cb();
}
});
w.on('finish', function () {
if (onfinish) {
const cb = onfinish;
onfinish = null;
cb();
}
});
}
if (readable) {
eos(r, (err) => {
readable = false;
if (err) {
destroyer(r, err);
}
onfinished(err);
});
r.on('readable', function () {
if (onreadable) {
const cb = onreadable;
onreadable = null;
cb();
}
});
r.on('end', function () {
d.push(null);
});
d._read = function () {
while (true) {
const buf = r.read();
if (buf === null) {
onreadable = d._read;
return
}
if (!d.push(buf)) {
return
}
}
};
}
d._destroy = function (err, callback) {
if (!err && onclose !== null) {
err = new AbortError();
}
onreadable = null;
ondrain = null;
onfinish = null;
if (onclose === null) {
callback(err);
} else {
onclose = callback;
destroyer(w, err);
destroyer(r, err);
}
};
return d
}
return duplexify;
}
var duplex;
var hasRequiredDuplex;
function requireDuplex () {
if (hasRequiredDuplex) return duplex;
hasRequiredDuplex = 1;
const {
ObjectDefineProperties,
ObjectGetOwnPropertyDescriptor,
ObjectKeys,
ObjectSetPrototypeOf
} = requirePrimordials();
duplex = Duplex;
const Readable = requireReadable();
const Writable = requireWritable();
ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype);
ObjectSetPrototypeOf(Duplex, Readable);
{
const keys = ObjectKeys(Writable.prototype);
// Allow the keys array to be GC'ed.
for (let i = 0; i < keys.length; i++) {
const method = keys[i];
if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
}
}
function Duplex(options) {
if (!(this instanceof Duplex)) return new Duplex(options)
Readable.call(this, options);
Writable.call(this, options);
if (options) {
this.allowHalfOpen = options.allowHalfOpen !== false;
if (options.readable === false) {
this._readableState.readable = false;
this._readableState.ended = true;
this._readableState.endEmitted = true;
}
if (options.writable === false) {
this._writableState.writable = false;
this._writableState.ending = true;
this._writableState.ended = true;
this._writableState.finished = true;
}
} else {
this.allowHalfOpen = true;
}
}
ObjectDefineProperties(Duplex.prototype, {
writable: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writable')
},
writableHighWaterMark: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableHighWaterMark')
},
writableObjectMode: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableObjectMode')
},
writableBuffer: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableBuffer')
},
writableLength: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableLength')
},
writableFinished: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableFinished')
},
writableCorked: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableCorked')
},
writableEnded: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableEnded')
},
writableNeedDrain: {
__proto__: null,
...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableNeedDrain')
},
destroyed: {
__proto__: null,
get() {
if (this._readableState === undefined || this._writableState === undefined) {
return false
}
return this._readableState.destroyed && this._writableState.destroyed
},
set(value) {
// Backward compatibility, the user is explicitly
// managing destroyed.
if (this._readableState && this._writableState) {
this._readableState.destroyed = value;
this._writableState.destroyed = value;
}
}
}
});
let webStreamsAdapters;
// Lazy to avoid circular references
function lazyWebStreams() {
if (webStreamsAdapters === undefined) webStreamsAdapters = {};
return webStreamsAdapters
}
Duplex.fromWeb = function (pair, options) {
return lazyWebStreams().newStreamDuplexFromReadableWritablePair(pair, options)
};
Duplex.toWeb = function (duplex) {
return lazyWebStreams().newReadableWritablePairFromDuplex(duplex)
};
let duplexify;
Duplex.from = function (body) {
if (!duplexify) {
duplexify = requireDuplexify();
}
return duplexify(body, 'body')
};
return duplex;
}
var transform;
var hasRequiredTransform;
function requireTransform () {
if (hasRequiredTransform) return transform;
hasRequiredTransform = 1;
const { ObjectSetPrototypeOf, Symbol } = requirePrimordials();
transform = Transform;
const { ERR_METHOD_NOT_IMPLEMENTED } = requireErrors().codes;
const Duplex = requireDuplex();
const { getHighWaterMark } = requireState();
ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype);
ObjectSetPrototypeOf(Transform, Duplex);
const kCallback = Symbol('kCallback');
function Transform(options) {
if (!(this instanceof Transform)) return new Transform(options)
// TODO (ronag): This should preferably always be
// applied but would be semver-major. Or even better;
// make Transform a Readable with the Writable interface.
const readableHighWaterMark = options ? getHighWaterMark(this, options, 'readableHighWaterMark', true) : null;
if (readableHighWaterMark === 0) {
// A Duplex will buffer both on the writable and readable side while
// a Transform just wants to buffer hwm number of elements. To avoid
// buffering twice we disable buffering on the writable side.
options = {
...options,
highWaterMark: null,
readableHighWaterMark,
// TODO (ronag): 0 is not optimal since we have
// a "bug" where we check needDrain before calling _write and not after.
// Refs: https://github.com/nodejs/node/pull/32887
// Refs: https://github.com/nodejs/node/pull/35941
writableHighWaterMark: options.writableHighWaterMark || 0
};
}
Duplex.call(this, options);
// We have implemented the _read method, and done the other things
// that Readable wants before the first _read call, so unset the
// sync guard flag.
this._readableState.sync = false;
this[kCallback] = null;
if (options) {
if (typeof options.transform === 'function') this._transform = options.transform;
if (typeof options.flush === 'function') this._flush = options.flush;
}
// When the writable side finishes, then flush out anything remaining.
// Backwards compat. Some Transform streams incorrectly implement _final
// instead of or in addition to _flush. By using 'prefinish' instead of
// implementing _final we continue supporting this unfortunate use case.
this.on('prefinish', prefinish);
}
function final(cb) {
if (typeof this._flush === 'function' && !this.destroyed) {
this._flush((er, data) => {
if (er) {
if (cb) {
cb(er);
} else {
this.destroy(er);
}
return
}
if (data != null) {
this.push(data);
}
this.push(null);
if (cb) {
cb();
}
});
} else {
this.push(null);
if (cb) {
cb();
}
}
}
function prefinish() {
if (this._final !== final) {
final.call(this);
}
}
Transform.prototype._final = final;
Transform.prototype._transform = function (chunk, encoding, callback) {
throw new ERR_METHOD_NOT_IMPLEMENTED('_transform()')
};
Transform.prototype._write = function (chunk, encoding, callback) {
const rState = this._readableState;
const wState = this._writableState;
const length = rState.length;
this._transform(chunk, encoding, (err, val) => {
if (err) {
callback(err);
return
}
if (val != null) {
this.push(val);
}
if (
wState.ended ||
// Backwards compat.
length === rState.length ||
// Backwards compat.
rState.length < rState.highWaterMark
) {
callback();
} else {
this[kCallback] = callback;
}
});
};
Transform.prototype._read = function () {
if (this[kCallback]) {
const callback = this[kCallback];
this[kCallback] = null;
callback();
}
};
return transform;
}
var passthrough;
var hasRequiredPassthrough;
function requirePassthrough () {
if (hasRequiredPassthrough) return passthrough;
hasRequiredPassthrough = 1;
const { ObjectSetPrototypeOf } = requirePrimordials();
passthrough = PassThrough;
const Transform = requireTransform();
ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype);
ObjectSetPrototypeOf(PassThrough, Transform);
function PassThrough(options) {
if (!(this instanceof PassThrough)) return new PassThrough(options)
Transform.call(this, options);
}
PassThrough.prototype._transform = function (chunk, encoding, cb) {
cb(null, chunk);
};
return passthrough;
}
/* replacement start */
var pipeline_1;
var hasRequiredPipeline;
function requirePipeline () {
if (hasRequiredPipeline) return pipeline_1;
hasRequiredPipeline = 1;
const process = requireProcess()
/* replacement end */
// Ported from https://github.com/mafintosh/pump with
// permission from the author, Mathias Buus (@mafintosh).
; const { ArrayIsArray, Promise, SymbolAsyncIterator } = requirePrimordials();
const eos = requireEndOfStream();
const { once } = requireUtil();
const destroyImpl = requireDestroy();
const Duplex = requireDuplex();
const {
aggregateTwoErrors,
codes: {
ERR_INVALID_ARG_TYPE,
ERR_INVALID_RETURN_VALUE,
ERR_MISSING_ARGS,
ERR_STREAM_DESTROYED,
ERR_STREAM_PREMATURE_CLOSE
},
AbortError
} = requireErrors();
const { validateFunction, validateAbortSignal } = requireValidators();
const { isIterable, isReadable, isReadableNodeStream, isNodeStream } = requireUtils();
const AbortController = globalThis.AbortController || require$$9.AbortController;
let PassThrough;
let Readable;
function destroyer(stream, reading, writing) {
let finished = false;
stream.on('close', () => {
finished = true;
});
const cleanup = eos(
stream,
{
readable: reading,
writable: writing
},
(err) => {
finished = !err;
}
);
return {
destroy: (err) => {
if (finished) return
finished = true;
destroyImpl.destroyer(stream, err || new ERR_STREAM_DESTROYED('pipe'));
},
cleanup
}
}
function popCallback(streams) {
// Streams should never be an empty array. It should always contain at least
// a single stream. Therefore optimize for the average case instead of
// checking for length === 0 as well.
validateFunction(streams[streams.length - 1], 'streams[stream.length - 1]');
return streams.pop()
}
function makeAsyncIterable(val) {
if (isIterable(val)) {
return val
} else if (isReadableNodeStream(val)) {
// Legacy streams are not Iterable.
return fromReadable(val)
}
throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], val)
}
async function* fromReadable(val) {
if (!Readable) {
Readable = requireReadable();
}
yield* Readable.prototype[SymbolAsyncIterator].call(val);
}
async function pump(iterable, writable, finish, { end }) {
let error;
let onresolve = null;
const resume = (err) => {
if (err) {
error = err;
}
if (onresolve) {
const callback = onresolve;
onresolve = null;
callback();
}
};
const wait = () =>
new Promise((resolve, reject) => {
if (error) {
reject(error);
} else {
onresolve = () => {
if (error) {
reject(error);
} else {
resolve();
}
};
}
});
writable.on('drain', resume);
const cleanup = eos(
writable,
{
readable: false
},
resume
);
try {
if (writable.writableNeedDrain) {
await wait();
}
for await (const chunk of iterable) {
if (!writable.write(chunk)) {
await wait();
}
}
if (end) {
writable.end();
}
await wait();
finish();
} catch (err) {
finish(error !== err ? aggregateTwoErrors(error, err) : err);
} finally {
cleanup();
writable.off('drain', resume);
}
}
function pipeline(...streams) {
return pipelineImpl(streams, once(popCallback(streams)))
}
function pipelineImpl(streams, callback, opts) {
if (streams.length === 1 && ArrayIsArray(streams[0])) {
streams = streams[0];
}
if (streams.length < 2) {
throw new ERR_MISSING_ARGS('streams')
}
const ac = new AbortController();
const signal = ac.signal;
const outerSignal = opts === null || opts === undefined ? undefined : opts.signal;
// Need to cleanup event listeners if last stream is readable
// https://github.com/nodejs/node/issues/35452
const lastStreamCleanup = [];
validateAbortSignal(outerSignal, 'options.signal');
function abort() {
finishImpl(new AbortError());
}
outerSignal === null || outerSignal === undefined ? undefined : outerSignal.addEventListener('abort', abort);
let error;
let value;
const destroys = [];
let finishCount = 0;
function finish(err) {
finishImpl(err, --finishCount === 0);
}
function finishImpl(err, final) {
if (err && (!error || error.code === 'ERR_STREAM_PREMATURE_CLOSE')) {
error = err;
}
if (!error && !final) {
return
}
while (destroys.length) {
destroys.shift()(error);
}
outerSignal === null || outerSignal === undefined ? undefined : outerSignal.removeEventListener('abort', abort);
ac.abort();
if (final) {
if (!error) {
lastStreamCleanup.forEach((fn) => fn());
}
process.nextTick(callback, error, value);
}
}
let ret;
for (let i = 0; i < streams.length; i++) {
const stream = streams[i];
const reading = i < streams.length - 1;
const writing = i > 0;
const end = reading || (opts === null || opts === undefined ? undefined : opts.end) !== false;
const isLastStream = i === streams.length - 1;
if (isNodeStream(stream)) {
if (end) {
const { destroy, cleanup } = destroyer(stream, reading, writing);
destroys.push(destroy);
if (isReadable(stream) && isLastStream) {
lastStreamCleanup.push(cleanup);
}
}
// Catch stream errors that occur after pipe/pump has completed.
function onError(err) {
if (err && err.name !== 'AbortError' && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
finish(err);
}
}
stream.on('error', onError);
if (isReadable(stream) && isLastStream) {
lastStreamCleanup.push(() => {
stream.removeListener('error', onError);
});
}
}
if (i === 0) {
if (typeof stream === 'function') {
ret = stream({
signal
});
if (!isIterable(ret)) {
throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or Stream', 'source', ret)
}
} else if (isIterable(stream) || isReadableNodeStream(stream)) {
ret = stream;
} else {
ret = Duplex.from(stream);
}
} else if (typeof stream === 'function') {
ret = makeAsyncIterable(ret);
ret = stream(ret, {
signal
});
if (reading) {
if (!isIterable(ret, true)) {
throw new ERR_INVALID_RETURN_VALUE('AsyncIterable', `transform[${i - 1}]`, ret)
}
} else {
var _ret;
if (!PassThrough) {
PassThrough = requirePassthrough();
}
// If the last argument to pipeline is not a stream
// we must create a proxy stream so that pipeline(...)
// always returns a stream which can be further
// composed through `.pipe(stream)`.
const pt = new PassThrough({
objectMode: true
});
// Handle Promises/A+ spec, `then` could be a getter that throws on
// second use.
const then = (_ret = ret) === null || _ret === undefined ? undefined : _ret.then;
if (typeof then === 'function') {
finishCount++;
then.call(
ret,
(val) => {
value = val;
if (val != null) {
pt.write(val);
}
if (end) {
pt.end();
}
process.nextTick(finish);
},
(err) => {
pt.destroy(err);
process.nextTick(finish, err);
}
);
} else if (isIterable(ret, true)) {
finishCount++;
pump(ret, pt, finish, {
end
});
} else {
throw new ERR_INVALID_RETURN_VALUE('AsyncIterable or Promise', 'destination', ret)
}
ret = pt;
const { destroy, cleanup } = destroyer(ret, false, true);
destroys.push(destroy);
if (isLastStream) {
lastStreamCleanup.push(cleanup);
}
}
} else if (isNodeStream(stream)) {
if (isReadableNodeStream(ret)) {
finishCount += 2;
const cleanup = pipe(ret, stream, finish, {
end
});
if (isReadable(stream) && isLastStream) {
lastStreamCleanup.push(cleanup);
}
} else if (isIterable(ret)) {
finishCount++;
pump(ret, stream, finish, {
end
});
} else {
throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], ret)
}
ret = stream;
} else {
ret = Duplex.from(stream);
}
}
if (
(signal !== null && signal !== undefined && signal.aborted) ||
(outerSignal !== null && outerSignal !== undefined && outerSignal.aborted)
) {
process.nextTick(abort);
}
return ret
}
function pipe(src, dst, finish, { end }) {
let ended = false;
dst.on('close', () => {
if (!ended) {
// Finish if the destination closes before the source has completed.
finish(new ERR_STREAM_PREMATURE_CLOSE());
}
});
src.pipe(dst, {
end
});
if (end) {
// Compat. Before node v10.12.0 stdio used to throw an error so
// pipe() did/does not end() stdio destinations.
// Now they allow it but "secretly" don't close the underlying fd.
src.once('end', () => {
ended = true;
dst.end();
});
} else {
finish();
}
eos(
src,
{
readable: true,
writable: false
},
(err) => {
const rState = src._readableState;
if (
err &&
err.code === 'ERR_STREAM_PREMATURE_CLOSE' &&
rState &&
rState.ended &&
!rState.errored &&
!rState.errorEmitted
) {
// Some readable streams will emit 'close' before 'end'. However, since
// this is on the readable side 'end' should still be emitted if the
// stream has been ended and no error emitted. This should be allowed in
// favor of backwards compatibility. Since the stream is piped to a
// destination this should not result in any observable difference.
// We don't need to check if this is a writable premature close since
// eos will only fail with premature close on the reading side for
// duplex streams.
src.once('end', finish).once('error', finish);
} else {
finish(err);
}
}
);
return eos(
dst,
{
readable: false,
writable: true
},
finish
)
}
pipeline_1 = {
pipelineImpl,
pipeline
};
return pipeline_1;
}
var compose;
var hasRequiredCompose;
function requireCompose () {
if (hasRequiredCompose) return compose;
hasRequiredCompose = 1;
const { pipeline } = requirePipeline();
const Duplex = requireDuplex();
const { destroyer } = requireDestroy();
const { isNodeStream, isReadable, isWritable } = requireUtils();
const {
AbortError,
codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS }
} = requireErrors();
compose = function compose(...streams) {
if (streams.length === 0) {
throw new ERR_MISSING_ARGS('streams')
}
if (streams.length === 1) {
return Duplex.from(streams[0])
}
const orgStreams = [...streams];
if (typeof streams[0] === 'function') {
streams[0] = Duplex.from(streams[0]);
}
if (typeof streams[streams.length - 1] === 'function') {
const idx = streams.length - 1;
streams[idx] = Duplex.from(streams[idx]);
}
for (let n = 0; n < streams.length; ++n) {
if (!isNodeStream(streams[n])) {
// TODO(ronag): Add checks for non streams.
continue
}
if (n < streams.length - 1 && !isReadable(streams[n])) {
throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be readable')
}
if (n > 0 && !isWritable(streams[n])) {
throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be writable')
}
}
let ondrain;
let onfinish;
let onreadable;
let onclose;
let d;
function onfinished(err) {
const cb = onclose;
onclose = null;
if (cb) {
cb(err);
} else if (err) {
d.destroy(err);
} else if (!readable && !writable) {
d.destroy();
}
}
const head = streams[0];
const tail = pipeline(streams, onfinished);
const writable = !!isWritable(head);
const readable = !!isReadable(tail);
// TODO(ronag): Avoid double buffering.
// Implement Writable/Readable/Duplex traits.
// See, https://github.com/nodejs/node/pull/33515.
d = new Duplex({
// TODO (ronag): highWaterMark?
writableObjectMode: !!(head !== null && head !== undefined && head.writableObjectMode),
readableObjectMode: !!(tail !== null && tail !== undefined && tail.writableObjectMode),
writable,
readable
});
if (writable) {
d._write = function (chunk, encoding, callback) {
if (head.write(chunk, encoding)) {
callback();
} else {
ondrain = callback;
}
};
d._final = function (callback) {
head.end();
onfinish = callback;
};
head.on('drain', function () {
if (ondrain) {
const cb = ondrain;
ondrain = null;
cb();
}
});
tail.on('finish', function () {
if (onfinish) {
const cb = onfinish;
onfinish = null;
cb();
}
});
}
if (readable) {
tail.on('readable', function () {
if (onreadable) {
const cb = onreadable;
onreadable = null;
cb();
}
});
tail.on('end', function () {
d.push(null);
});
d._read = function () {
while (true) {
const buf = tail.read();
if (buf === null) {
onreadable = d._read;
return
}
if (!d.push(buf)) {
return
}
}
};
}
d._destroy = function (err, callback) {
if (!err && onclose !== null) {
err = new AbortError();
}
onreadable = null;
ondrain = null;
onfinish = null;
if (onclose === null) {
callback(err);
} else {
onclose = callback;
destroyer(tail, err);
}
};
return d
};
return compose;
}
var promises;
var hasRequiredPromises;
function requirePromises () {
if (hasRequiredPromises) return promises;
hasRequiredPromises = 1;
const { ArrayPrototypePop, Promise } = requirePrimordials();
const { isIterable, isNodeStream } = requireUtils();
const { pipelineImpl: pl } = requirePipeline();
const { finished } = requireEndOfStream();
function pipeline(...streams) {
return new Promise((resolve, reject) => {
let signal;
let end;
const lastArg = streams[streams.length - 1];
if (lastArg && typeof lastArg === 'object' && !isNodeStream(lastArg) && !isIterable(lastArg)) {
const options = ArrayPrototypePop(streams);
signal = options.signal;
end = options.end;
}
pl(
streams,
(err, value) => {
if (err) {
reject(err);
} else {
resolve(value);
}
},
{
signal,
end
}
);
})
}
promises = {
finished,
pipeline
};
return promises;
}
/* replacement start */
var hasRequiredStream;
function requireStream () {
if (hasRequiredStream) return stream.exports;
hasRequiredStream = 1;
const { Buffer } = require$$0
/* replacement end */
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
; const { ObjectDefineProperty, ObjectKeys, ReflectApply } = requirePrimordials();
const {
promisify: { custom: customPromisify }
} = requireUtil();
const { streamReturningOperators, promiseReturningOperators } = requireOperators();
const {
codes: { ERR_ILLEGAL_CONSTRUCTOR }
} = requireErrors();
const compose = requireCompose();
const { pipeline } = requirePipeline();
const { destroyer } = requireDestroy();
const eos = requireEndOfStream();
const promises = requirePromises();
const utils = requireUtils();
const Stream = (stream.exports = requireLegacy().Stream);
Stream.isDisturbed = utils.isDisturbed;
Stream.isErrored = utils.isErrored;
Stream.isReadable = utils.isReadable;
Stream.Readable = requireReadable();
for (const key of ObjectKeys(streamReturningOperators)) {
const op = streamReturningOperators[key];
function fn(...args) {
if (new.target) {
throw ERR_ILLEGAL_CONSTRUCTOR()
}
return Stream.Readable.from(ReflectApply(op, this, args))
}
ObjectDefineProperty(fn, 'name', {
__proto__: null,
value: op.name
});
ObjectDefineProperty(fn, 'length', {
__proto__: null,
value: op.length
});
ObjectDefineProperty(Stream.Readable.prototype, key, {
__proto__: null,
value: fn,
enumerable: false,
configurable: true,
writable: true
});
}
for (const key of ObjectKeys(promiseReturningOperators)) {
const op = promiseReturningOperators[key];
function fn(...args) {
if (new.target) {
throw ERR_ILLEGAL_CONSTRUCTOR()
}
return ReflectApply(op, this, args)
}
ObjectDefineProperty(fn, 'name', {
__proto__: null,
value: op.name
});
ObjectDefineProperty(fn, 'length', {
__proto__: null,
value: op.length
});
ObjectDefineProperty(Stream.Readable.prototype, key, {
__proto__: null,
value: fn,
enumerable: false,
configurable: true,
writable: true
});
}
Stream.Writable = requireWritable();
Stream.Duplex = requireDuplex();
Stream.Transform = requireTransform();
Stream.PassThrough = requirePassthrough();
Stream.pipeline = pipeline;
const { addAbortSignal } = requireAddAbortSignal();
Stream.addAbortSignal = addAbortSignal;
Stream.finished = eos;
Stream.destroy = destroyer;
Stream.compose = compose;
ObjectDefineProperty(Stream, 'promises', {
__proto__: null,
configurable: true,
enumerable: true,
get() {
return promises
}
});
ObjectDefineProperty(pipeline, customPromisify, {
__proto__: null,
enumerable: true,
get() {
return promises.pipeline
}
});
ObjectDefineProperty(eos, customPromisify, {
__proto__: null,
enumerable: true,
get() {
return promises.finished
}
});
// Backwards-compat with node 0.4.x
Stream.Stream = Stream;
Stream._isUint8Array = function isUint8Array(value) {
return value instanceof Uint8Array
};
Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) {
return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
};
return stream.exports;
}
(function (module) {
const Stream = require$$0$1;
if (Stream && process.env.READABLE_STREAM === 'disable') {
const promises = Stream.promises;
// Explicit export naming is needed for ESM
module.exports._uint8ArrayToBuffer = Stream._uint8ArrayToBuffer;
module.exports._isUint8Array = Stream._isUint8Array;
module.exports.isDisturbed = Stream.isDisturbed;
module.exports.isErrored = Stream.isErrored;
module.exports.isReadable = Stream.isReadable;
module.exports.Readable = Stream.Readable;
module.exports.Writable = Stream.Writable;
module.exports.Duplex = Stream.Duplex;
module.exports.Transform = Stream.Transform;
module.exports.PassThrough = Stream.PassThrough;
module.exports.addAbortSignal = Stream.addAbortSignal;
module.exports.finished = Stream.finished;
module.exports.destroy = Stream.destroy;
module.exports.pipeline = Stream.pipeline;
module.exports.compose = Stream.compose;
Object.defineProperty(Stream, 'promises', {
configurable: true,
enumerable: true,
get() {
return promises
}
});
module.exports.Stream = Stream.Stream;
} else {
const CustomStream = requireStream();
const promises = requirePromises();
const originalDestroy = CustomStream.Readable.destroy;
module.exports = CustomStream.Readable;
// Explicit export naming is needed for ESM
module.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer;
module.exports._isUint8Array = CustomStream._isUint8Array;
module.exports.isDisturbed = CustomStream.isDisturbed;
module.exports.isErrored = CustomStream.isErrored;
module.exports.isReadable = CustomStream.isReadable;
module.exports.Readable = CustomStream.Readable;
module.exports.Writable = CustomStream.Writable;
module.exports.Duplex = CustomStream.Duplex;
module.exports.Transform = CustomStream.Transform;
module.exports.PassThrough = CustomStream.PassThrough;
module.exports.addAbortSignal = CustomStream.addAbortSignal;
module.exports.finished = CustomStream.finished;
module.exports.destroy = CustomStream.destroy;
module.exports.destroy = originalDestroy;
module.exports.pipeline = CustomStream.pipeline;
module.exports.compose = CustomStream.compose;
Object.defineProperty(CustomStream, 'promises', {
configurable: true,
enumerable: true,
get() {
return promises
}
});
module.exports.Stream = CustomStream.Stream;
}
// Allow default importing
module.exports.default = module.exports;
} (ours));
var inherits$1 = {exports: {}};
var inherits_browser = {exports: {}};
var hasRequiredInherits_browser;
function requireInherits_browser () {
if (hasRequiredInherits_browser) return inherits_browser.exports;
hasRequiredInherits_browser = 1;
if (typeof Object.create === 'function') {
// implementation from standard node.js 'util' module
inherits_browser.exports = function inherits(ctor, superCtor) {
if (superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
}
};
} else {
// old school shim for old browsers
inherits_browser.exports = function inherits(ctor, superCtor) {
if (superCtor) {
ctor.super_ = superCtor;
var TempCtor = function () {};
TempCtor.prototype = superCtor.prototype;
ctor.prototype = new TempCtor();
ctor.prototype.constructor = ctor;
}
};
}
return inherits_browser.exports;
}
(function (module) {
try {
var util = require('util');
/* istanbul ignore next */
if (typeof util.inherits !== 'function') throw '';
module.exports = util.inherits;
} catch (e) {
/* istanbul ignore next */
module.exports = requireInherits_browser();
}
} (inherits$1));
const { Buffer: Buffer$1 } = require$$0;
const symbol = Symbol.for('BufferList');
function BufferList$1 (buf) {
if (!(this instanceof BufferList$1)) {
return new BufferList$1(buf)
}
BufferList$1._init.call(this, buf);
}
BufferList$1._init = function _init (buf) {
Object.defineProperty(this, symbol, { value: true });
this._bufs = [];
this.length = 0;
if (buf) {
this.append(buf);
}
};
BufferList$1.prototype._new = function _new (buf) {
return new BufferList$1(buf)
};
BufferList$1.prototype._offset = function _offset (offset) {
if (offset === 0) {
return [0, 0]
}
let tot = 0;
for (let i = 0; i < this._bufs.length; i++) {
const _t = tot + this._bufs[i].length;
if (offset < _t || i === this._bufs.length - 1) {
return [i, offset - tot]
}
tot = _t;
}
};
BufferList$1.prototype._reverseOffset = function (blOffset) {
const bufferId = blOffset[0];
let offset = blOffset[1];
for (let i = 0; i < bufferId; i++) {
offset += this._bufs[i].length;
}
return offset
};
BufferList$1.prototype.get = function get (index) {
if (index > this.length || index < 0) {
return undefined
}
const offset = this._offset(index);
return this._bufs[offset[0]][offset[1]]
};
BufferList$1.prototype.slice = function slice (start, end) {
if (typeof start === 'number' && start < 0) {
start += this.length;
}
if (typeof end === 'number' && end < 0) {
end += this.length;
}
return this.copy(null, 0, start, end)
};
BufferList$1.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
if (typeof srcStart !== 'number' || srcStart < 0) {
srcStart = 0;
}
if (typeof srcEnd !== 'number' || srcEnd > this.length) {
srcEnd = this.length;
}
if (srcStart >= this.length) {
return dst || Buffer$1.alloc(0)
}
if (srcEnd <= 0) {
return dst || Buffer$1.alloc(0)
}
const copy = !!dst;
const off = this._offset(srcStart);
const len = srcEnd - srcStart;
let bytes = len;
let bufoff = (copy && dstStart) || 0;
let start = off[1];
// copy/slice everything
if (srcStart === 0 && srcEnd === this.length) {
if (!copy) {
// slice, but full concat if multiple buffers
return this._bufs.length === 1
? this._bufs[0]
: Buffer$1.concat(this._bufs, this.length)
}
// copy, need to copy individual buffers
for (let i = 0; i < this._bufs.length; i++) {
this._bufs[i].copy(dst, bufoff);
bufoff += this._bufs[i].length;
}
return dst
}
// easy, cheap case where it's a subset of one of the buffers
if (bytes <= this._bufs[off[0]].length - start) {
return copy
? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
: this._bufs[off[0]].slice(start, start + bytes)
}
if (!copy) {
// a slice, we need something to copy in to
dst = Buffer$1.allocUnsafe(len);
}
for (let i = off[0]; i < this._bufs.length; i++) {
const l = this._bufs[i].length - start;
if (bytes > l) {
this._bufs[i].copy(dst, bufoff, start);
bufoff += l;
} else {
this._bufs[i].copy(dst, bufoff, start, start + bytes);
bufoff += l;
break
}
bytes -= l;
if (start) {
start = 0;
}
}
// safeguard so that we don't return uninitialized memory
if (dst.length > bufoff) return dst.slice(0, bufoff)
return dst
};
BufferList$1.prototype.shallowSlice = function shallowSlice (start, end) {
start = start || 0;
end = typeof end !== 'number' ? this.length : end;
if (start < 0) {
start += this.length;
}
if (end < 0) {
end += this.length;
}
if (start === end) {
return this._new()
}
const startOffset = this._offset(start);
const endOffset = this._offset(end);
const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1);
if (endOffset[1] === 0) {
buffers.pop();
} else {
buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1]);
}
if (startOffset[1] !== 0) {
buffers[0] = buffers[0].slice(startOffset[1]);
}
return this._new(buffers)
};
BufferList$1.prototype.toString = function toString (encoding, start, end) {
return this.slice(start, end).toString(encoding)
};
BufferList$1.prototype.consume = function consume (bytes) {
// first, normalize the argument, in accordance with how Buffer does it
bytes = Math.trunc(bytes);
// do nothing if not a positive number
if (Number.isNaN(bytes) || bytes <= 0) return this
while (this._bufs.length) {
if (bytes >= this._bufs[0].length) {
bytes -= this._bufs[0].length;
this.length -= this._bufs[0].length;
this._bufs.shift();
} else {
this._bufs[0] = this._bufs[0].slice(bytes);
this.length -= bytes;
break
}
}
return this
};
BufferList$1.prototype.duplicate = function duplicate () {
const copy = this._new();
for (let i = 0; i < this._bufs.length; i++) {
copy.append(this._bufs[i]);
}
return copy
};
BufferList$1.prototype.append = function append (buf) {
if (buf == null) {
return this
}
if (buf.buffer) {
// append a view of the underlying ArrayBuffer
this._appendBuffer(Buffer$1.from(buf.buffer, buf.byteOffset, buf.byteLength));
} else if (Array.isArray(buf)) {
for (let i = 0; i < buf.length; i++) {
this.append(buf[i]);
}
} else if (this._isBufferList(buf)) {
// unwrap argument into individual BufferLists
for (let i = 0; i < buf._bufs.length; i++) {
this.append(buf._bufs[i]);
}
} else {
// coerce number arguments to strings, since Buffer(number) does
// uninitialized memory allocation
if (typeof buf === 'number') {
buf = buf.toString();
}
this._appendBuffer(Buffer$1.from(buf));
}
return this
};
BufferList$1.prototype._appendBuffer = function appendBuffer (buf) {
this._bufs.push(buf);
this.length += buf.length;
};
BufferList$1.prototype.indexOf = function (search, offset, encoding) {
if (encoding === undefined && typeof offset === 'string') {
encoding = offset;
offset = undefined;
}
if (typeof search === 'function' || Array.isArray(search)) {
throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.')
} else if (typeof search === 'number') {
search = Buffer$1.from([search]);
} else if (typeof search === 'string') {
search = Buffer$1.from(search, encoding);
} else if (this._isBufferList(search)) {
search = search.slice();
} else if (Array.isArray(search.buffer)) {
search = Buffer$1.from(search.buffer, search.byteOffset, search.byteLength);
} else if (!Buffer$1.isBuffer(search)) {
search = Buffer$1.from(search);
}
offset = Number(offset || 0);
if (isNaN(offset)) {
offset = 0;
}
if (offset < 0) {
offset = this.length + offset;
}
if (offset < 0) {
offset = 0;
}
if (search.length === 0) {
return offset > this.length ? this.length : offset
}
const blOffset = this._offset(offset);
let blIndex = blOffset[0]; // index of which internal buffer we're working on
let buffOffset = blOffset[1]; // offset of the internal buffer we're working on
// scan over each buffer
for (; blIndex < this._bufs.length; blIndex++) {
const buff = this._bufs[blIndex];
while (buffOffset < buff.length) {
const availableWindow = buff.length - buffOffset;
if (availableWindow >= search.length) {
const nativeSearchResult = buff.indexOf(search, buffOffset);
if (nativeSearchResult !== -1) {
return this._reverseOffset([blIndex, nativeSearchResult])
}
buffOffset = buff.length - search.length + 1; // end of native search window
} else {
const revOffset = this._reverseOffset([blIndex, buffOffset]);
if (this._match(revOffset, search)) {
return revOffset
}
buffOffset++;
}
}
buffOffset = 0;
}
return -1
};
BufferList$1.prototype._match = function (offset, search) {
if (this.length - offset < search.length) {
return false
}
for (let searchOffset = 0; searchOffset < search.length; searchOffset++) {
if (this.get(offset + searchOffset) !== search[searchOffset]) {
return false
}
}
return true
}
;(function () {
const methods = {
readDoubleBE: 8,
readDoubleLE: 8,
readFloatBE: 4,
readFloatLE: 4,
readBigInt64BE: 8,
readBigInt64LE: 8,
readBigUInt64BE: 8,
readBigUInt64LE: 8,
readInt32BE: 4,
readInt32LE: 4,
readUInt32BE: 4,
readUInt32LE: 4,
readInt16BE: 2,
readInt16LE: 2,
readUInt16BE: 2,
readUInt16LE: 2,
readInt8: 1,
readUInt8: 1,
readIntBE: null,
readIntLE: null,
readUIntBE: null,
readUIntLE: null
};
for (const m in methods) {
(function (m) {
if (methods[m] === null) {
BufferList$1.prototype[m] = function (offset, byteLength) {
return this.slice(offset, offset + byteLength)[m](0, byteLength)
};
} else {
BufferList$1.prototype[m] = function (offset = 0) {
return this.slice(offset, offset + methods[m])[m](0)
};
}
}(m));
}
}());
// Used internally by the class and also as an indicator of this object being
// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser
// environment because there could be multiple different copies of the
// BufferList class and some `BufferList`s might be `BufferList`s.
BufferList$1.prototype._isBufferList = function _isBufferList (b) {
return b instanceof BufferList$1 || BufferList$1.isBufferList(b)
};
BufferList$1.isBufferList = function isBufferList (b) {
return b != null && b[symbol]
};
var BufferList_1 = BufferList$1;
const DuplexStream = ours.exports.Duplex;
const inherits = inherits$1.exports;
const BufferList = BufferList_1;
function BufferListStream (callback) {
if (!(this instanceof BufferListStream)) {
return new BufferListStream(callback)
}
if (typeof callback === 'function') {
this._callback = callback;
const piper = function piper (err) {
if (this._callback) {
this._callback(err);
this._callback = null;
}
}.bind(this);
this.on('pipe', function onPipe (src) {
src.on('error', piper);
});
this.on('unpipe', function onUnpipe (src) {
src.removeListener('error', piper);
});
callback = null;
}
BufferList._init.call(this, callback);
DuplexStream.call(this);
}
inherits(BufferListStream, DuplexStream);
Object.assign(BufferListStream.prototype, BufferList.prototype);
BufferListStream.prototype._new = function _new (callback) {
return new BufferListStream(callback)
};
BufferListStream.prototype._write = function _write (buf, encoding, callback) {
this._appendBuffer(buf);
if (typeof callback === 'function') {
callback();
}
};
BufferListStream.prototype._read = function _read (size) {
if (!this.length) {
return this.push(null)
}
size = Math.min(size, this.length);
this.push(this.slice(0, size));
this.consume(size);
};
BufferListStream.prototype.end = function end (chunk) {
DuplexStream.prototype.end.call(this, chunk);
if (this._callback) {
this._callback(null, this.slice());
this._callback = null;
}
};
BufferListStream.prototype._destroy = function _destroy (err, cb) {
this._bufs.length = 0;
this.length = 0;
cb(err);
};
BufferListStream.prototype._isBufferList = function _isBufferList (b) {
return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b)
};
BufferListStream.isBufferList = BufferList.isBufferList;
bl.exports = BufferListStream;
bl.exports.BufferListStream = BufferListStream;
bl.exports.BufferList = BufferList;
var queueMicrotask_1;
var hasRequiredQueueMicrotask;
function requireQueueMicrotask () {
if (hasRequiredQueueMicrotask) return queueMicrotask_1;
hasRequiredQueueMicrotask = 1;
queueMicrotask_1 = typeof queueMicrotask === 'function' ? queueMicrotask : (fn) => Promise.resolve().then(fn);
return queueMicrotask_1;
}
var processNextTick = (typeof process !== 'undefined' && typeof process.nextTick === 'function')
? process.nextTick.bind(process)
: requireQueueMicrotask();
var fixedSize = class FixedFIFO {
constructor (hwm) {
if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) throw new Error('Max size for a FixedFIFO should be a power of two')
this.buffer = new Array(hwm);
this.mask = hwm - 1;
this.top = 0;
this.btm = 0;
this.next = null;
}
push (data) {
if (this.buffer[this.top] !== undefined) return false
this.buffer[this.top] = data;
this.top = (this.top + 1) & this.mask;
return true
}
shift () {
const last = this.buffer[this.btm];
if (last === undefined) return undefined
this.buffer[this.btm] = undefined;
this.btm = (this.btm + 1) & this.mask;
return last
}
peek () {
return this.buffer[this.btm]
}
isEmpty () {
return this.buffer[this.btm] === undefined
}
};
const FixedFIFO = fixedSize;
var fastFifo = class FastFIFO {
constructor (hwm) {
this.hwm = hwm || 16;
this.head = new FixedFIFO(this.hwm);
this.tail = this.head;
}
push (val) {
if (!this.head.push(val)) {
const prev = this.head;
this.head = prev.next = new FixedFIFO(2 * this.head.buffer.length);
this.head.push(val);
}
}
shift () {
const val = this.tail.shift();
if (val === undefined && this.tail.next) {
const next = this.tail.next;
this.tail.next = null;
this.tail = next;
return this.tail.shift()
}
return val
}
peek () {
return this.tail.peek()
}
isEmpty () {
return this.head.isEmpty()
}
};
const { EventEmitter } = require$$2;
const STREAM_DESTROYED = new Error('Stream was destroyed');
const PREMATURE_CLOSE = new Error('Premature close');
const queueTick = processNextTick;
const FIFO = fastFifo;
/* eslint-disable no-multi-spaces */
// 26 bits used total (4 from shared, 13 from read, and 9 from write)
const MAX = ((1 << 26) - 1);
// Shared state
const OPENING = 0b0001;
const PREDESTROYING = 0b0010;
const DESTROYING = 0b0100;
const DESTROYED = 0b1000;
const NOT_OPENING = MAX ^ OPENING;
const NOT_PREDESTROYING = MAX ^ PREDESTROYING;
// Read state (4 bit offset from shared state)
const READ_ACTIVE = 0b0000000000001 << 4;
const READ_PRIMARY = 0b0000000000010 << 4;
const READ_SYNC = 0b0000000000100 << 4;
const READ_QUEUED = 0b0000000001000 << 4;
const READ_RESUMED = 0b0000000010000 << 4;
const READ_PIPE_DRAINED = 0b0000000100000 << 4;
const READ_ENDING = 0b0000001000000 << 4;
const READ_EMIT_DATA = 0b0000010000000 << 4;
const READ_EMIT_READABLE = 0b0000100000000 << 4;
const READ_EMITTED_READABLE = 0b0001000000000 << 4;
const READ_DONE = 0b0010000000000 << 4;
const READ_NEXT_TICK = 0b0100000000001 << 4; // also active
const READ_NEEDS_PUSH = 0b1000000000000 << 4;
// Combined read state
const READ_FLOWING = READ_RESUMED | READ_PIPE_DRAINED;
const READ_ACTIVE_AND_SYNC = READ_ACTIVE | READ_SYNC;
const READ_ACTIVE_AND_SYNC_AND_NEEDS_PUSH = READ_ACTIVE | READ_SYNC | READ_NEEDS_PUSH;
const READ_PRIMARY_AND_ACTIVE = READ_PRIMARY | READ_ACTIVE;
const READ_EMIT_READABLE_AND_QUEUED = READ_EMIT_READABLE | READ_QUEUED;
const READ_NOT_ACTIVE = MAX ^ READ_ACTIVE;
const READ_NON_PRIMARY = MAX ^ READ_PRIMARY;
const READ_NON_PRIMARY_AND_PUSHED = MAX ^ (READ_PRIMARY | READ_NEEDS_PUSH);
const READ_NOT_SYNC = MAX ^ READ_SYNC;
const READ_PUSHED = MAX ^ READ_NEEDS_PUSH;
const READ_PAUSED = MAX ^ READ_RESUMED;
const READ_NOT_QUEUED = MAX ^ (READ_QUEUED | READ_EMITTED_READABLE);
const READ_NOT_ENDING = MAX ^ READ_ENDING;
const READ_PIPE_NOT_DRAINED = MAX ^ READ_FLOWING;
const READ_NOT_NEXT_TICK = MAX ^ READ_NEXT_TICK;
// Write state (17 bit offset, 4 bit offset from shared state and 13 from read state)
const WRITE_ACTIVE = 0b000000001 << 17;
const WRITE_PRIMARY = 0b000000010 << 17;
const WRITE_SYNC = 0b000000100 << 17;
const WRITE_QUEUED = 0b000001000 << 17;
const WRITE_UNDRAINED = 0b000010000 << 17;
const WRITE_DONE = 0b000100000 << 17;
const WRITE_EMIT_DRAIN = 0b001000000 << 17;
const WRITE_NEXT_TICK = 0b010000001 << 17; // also active
const WRITE_FINISHING = 0b100000000 << 17;
const WRITE_NOT_ACTIVE = MAX ^ WRITE_ACTIVE;
const WRITE_NOT_SYNC = MAX ^ WRITE_SYNC;
const WRITE_NON_PRIMARY = MAX ^ WRITE_PRIMARY;
const WRITE_NOT_FINISHING = MAX ^ WRITE_FINISHING;
const WRITE_DRAINED = MAX ^ WRITE_UNDRAINED;
const WRITE_NOT_QUEUED = MAX ^ WRITE_QUEUED;
const WRITE_NOT_NEXT_TICK = MAX ^ WRITE_NEXT_TICK;
// Combined shared state
const ACTIVE = READ_ACTIVE | WRITE_ACTIVE;
const NOT_ACTIVE = MAX ^ ACTIVE;
const DONE = READ_DONE | WRITE_DONE;
const DESTROY_STATUS = DESTROYING | DESTROYED | PREDESTROYING;
const OPEN_STATUS = DESTROY_STATUS | OPENING;
const AUTO_DESTROY = DESTROY_STATUS | DONE;
const NON_PRIMARY = WRITE_NON_PRIMARY & READ_NON_PRIMARY;
const ACTIVE_OR_TICKING = WRITE_NEXT_TICK | READ_NEXT_TICK;
const TICKING = ACTIVE_OR_TICKING & NOT_ACTIVE;
const IS_OPENING = OPEN_STATUS | TICKING;
// Combined shared state and read state
const READ_PRIMARY_STATUS = OPEN_STATUS | READ_ENDING | READ_DONE;
const READ_STATUS = OPEN_STATUS | READ_DONE | READ_QUEUED;
const READ_ENDING_STATUS = OPEN_STATUS | READ_ENDING | READ_QUEUED;
const READ_READABLE_STATUS = OPEN_STATUS | READ_EMIT_READABLE | READ_QUEUED | READ_EMITTED_READABLE;
const SHOULD_NOT_READ = OPEN_STATUS | READ_ACTIVE | READ_ENDING | READ_DONE | READ_NEEDS_PUSH;
const READ_BACKPRESSURE_STATUS = DESTROY_STATUS | READ_ENDING | READ_DONE;
// Combined write state
const WRITE_PRIMARY_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_DONE;
const WRITE_QUEUED_AND_UNDRAINED = WRITE_QUEUED | WRITE_UNDRAINED;
const WRITE_QUEUED_AND_ACTIVE = WRITE_QUEUED | WRITE_ACTIVE;
const WRITE_DRAIN_STATUS = WRITE_QUEUED | WRITE_UNDRAINED | OPEN_STATUS | WRITE_ACTIVE;
const WRITE_STATUS = OPEN_STATUS | WRITE_ACTIVE | WRITE_QUEUED;
const WRITE_PRIMARY_AND_ACTIVE = WRITE_PRIMARY | WRITE_ACTIVE;
const WRITE_ACTIVE_AND_SYNC = WRITE_ACTIVE | WRITE_SYNC;
const WRITE_FINISHING_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_QUEUED_AND_ACTIVE | WRITE_DONE;
const WRITE_BACKPRESSURE_STATUS = WRITE_UNDRAINED | DESTROY_STATUS | WRITE_FINISHING | WRITE_DONE;
const asyncIterator = Symbol.asyncIterator || Symbol('asyncIterator');
class WritableState {
constructor (stream, { highWaterMark = 16384, map = null, mapWritable, byteLength, byteLengthWritable } = {}) {
this.stream = stream;
this.queue = new FIFO();
this.highWaterMark = highWaterMark;
this.buffered = 0;
this.error = null;
this.pipeline = null;
this.byteLength = byteLengthWritable || byteLength || defaultByteLength;
this.map = mapWritable || map;
this.afterWrite = afterWrite.bind(this);
this.afterUpdateNextTick = updateWriteNT.bind(this);
}
get ended () {
return (this.stream._duplexState & WRITE_DONE) !== 0
}
push (data) {
if (this.map !== null) data = this.map(data);
this.buffered += this.byteLength(data);
this.queue.push(data);
if (this.buffered < this.highWaterMark) {
this.stream._duplexState |= WRITE_QUEUED;
return true
}
this.stream._duplexState |= WRITE_QUEUED_AND_UNDRAINED;
return false
}
shift () {
const data = this.queue.shift();
const stream = this.stream;
this.buffered -= this.byteLength(data);
if (this.buffered === 0) stream._duplexState &= WRITE_NOT_QUEUED;
return data
}
end (data) {
if (typeof data === 'function') this.stream.once('finish', data);
else if (data !== undefined && data !== null) this.push(data);
this.stream._duplexState = (this.stream._duplexState | WRITE_FINISHING) & WRITE_NON_PRIMARY;
}
autoBatch (data, cb) {
const buffer = [];
const stream = this.stream;
buffer.push(data);
while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED_AND_ACTIVE) {
buffer.push(stream._writableState.shift());
}
if ((stream._duplexState & OPEN_STATUS) !== 0) return cb(null)
stream._writev(buffer, cb);
}
update () {
const stream = this.stream;
while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED) {
const data = this.shift();
stream._duplexState |= WRITE_ACTIVE_AND_SYNC;
stream._write(data, this.afterWrite);
stream._duplexState &= WRITE_NOT_SYNC;
}
if ((stream._duplexState & WRITE_PRIMARY_AND_ACTIVE) === 0) this.updateNonPrimary();
}
updateNonPrimary () {
const stream = this.stream;
if ((stream._duplexState & WRITE_FINISHING_STATUS) === WRITE_FINISHING) {
stream._duplexState = (stream._duplexState | WRITE_ACTIVE) & WRITE_NOT_FINISHING;
stream._final(afterFinal.bind(this));
return
}
if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) {
if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) {
stream._duplexState |= ACTIVE;
stream._destroy(afterDestroy.bind(this));
}
return
}
if ((stream._duplexState & IS_OPENING) === OPENING) {
stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING;
stream._open(afterOpen.bind(this));
}
}
updateNextTick () {
if ((this.stream._duplexState & WRITE_NEXT_TICK) !== 0) return
this.stream._duplexState |= WRITE_NEXT_TICK;
queueTick(this.afterUpdateNextTick);
}
}
class ReadableState {
constructor (stream, { highWaterMark = 16384, map = null, mapReadable, byteLength, byteLengthReadable } = {}) {
this.stream = stream;
this.queue = new FIFO();
this.highWaterMark = highWaterMark;
this.buffered = 0;
this.error = null;
this.pipeline = null;
this.byteLength = byteLengthReadable || byteLength || defaultByteLength;
this.map = mapReadable || map;
this.pipeTo = null;
this.afterRead = afterRead.bind(this);
this.afterUpdateNextTick = updateReadNT.bind(this);
}
get ended () {
return (this.stream._duplexState & READ_DONE) !== 0
}
pipe (pipeTo, cb) {
if (this.pipeTo !== null) throw new Error('Can only pipe to one destination')
if (typeof cb !== 'function') cb = null;
this.stream._duplexState |= READ_PIPE_DRAINED;
this.pipeTo = pipeTo;
this.pipeline = new Pipeline(this.stream, pipeTo, cb);
if (cb) this.stream.on('error', noop$1); // We already error handle this so supress crashes
if (isStreamx(pipeTo)) {
pipeTo._writableState.pipeline = this.pipeline;
if (cb) pipeTo.on('error', noop$1); // We already error handle this so supress crashes
pipeTo.on('finish', this.pipeline.finished.bind(this.pipeline)); // TODO: just call finished from pipeTo itself
} else {
const onerror = this.pipeline.done.bind(this.pipeline, pipeTo);
const onclose = this.pipeline.done.bind(this.pipeline, pipeTo, null); // onclose has a weird bool arg
pipeTo.on('error', onerror);
pipeTo.on('close', onclose);
pipeTo.on('finish', this.pipeline.finished.bind(this.pipeline));
}
pipeTo.on('drain', afterDrain.bind(this));
this.stream.emit('piping', pipeTo);
pipeTo.emit('pipe', this.stream);
}
push (data) {
const stream = this.stream;
if (data === null) {
this.highWaterMark = 0;
stream._duplexState = (stream._duplexState | READ_ENDING) & READ_NON_PRIMARY_AND_PUSHED;
return false
}
if (this.map !== null) data = this.map(data);
this.buffered += this.byteLength(data);
this.queue.push(data);
stream._duplexState = (stream._duplexState | READ_QUEUED) & READ_PUSHED;
return this.buffered < this.highWaterMark
}
shift () {
const data = this.queue.shift();
this.buffered -= this.byteLength(data);
if (this.buffered === 0) this.stream._duplexState &= READ_NOT_QUEUED;
return data
}
unshift (data) {
let tail;
const pending = [];
while ((tail = this.queue.shift()) !== undefined) {
pending.push(tail);
}
this.push(data);
for (let i = 0; i < pending.length; i++) {
this.queue.push(pending[i]);
}
}
read () {
const stream = this.stream;
if ((stream._duplexState & READ_STATUS) === READ_QUEUED) {
const data = this.shift();
if (this.pipeTo !== null && this.pipeTo.write(data) === false) stream._duplexState &= READ_PIPE_NOT_DRAINED;
if ((stream._duplexState & READ_EMIT_DATA) !== 0) stream.emit('data', data);
return data
}
return null
}
drain () {
const stream = this.stream;
while ((stream._duplexState & READ_STATUS) === READ_QUEUED && (stream._duplexState & READ_FLOWING) !== 0) {
const data = this.shift();
if (this.pipeTo !== null && this.pipeTo.write(data) === false) stream._duplexState &= READ_PIPE_NOT_DRAINED;
if ((stream._duplexState & READ_EMIT_DATA) !== 0) stream.emit('data', data);
}
}
update () {
const stream = this.stream;
this.drain();
while (this.buffered < this.highWaterMark && (stream._duplexState & SHOULD_NOT_READ) === 0) {
stream._duplexState |= READ_ACTIVE_AND_SYNC_AND_NEEDS_PUSH;
stream._read(this.afterRead);
stream._duplexState &= READ_NOT_SYNC;
if ((stream._duplexState & READ_ACTIVE) === 0) this.drain();
}
if ((stream._duplexState & READ_READABLE_STATUS) === READ_EMIT_READABLE_AND_QUEUED) {
stream._duplexState |= READ_EMITTED_READABLE;
stream.emit('readable');
}
if ((stream._duplexState & READ_PRIMARY_AND_ACTIVE) === 0) this.updateNonPrimary();
}
updateNonPrimary () {
const stream = this.stream;
if ((stream._duplexState & READ_ENDING_STATUS) === READ_ENDING) {
stream._duplexState = (stream._duplexState | READ_DONE) & READ_NOT_ENDING;
stream.emit('end');
if ((stream._duplexState & AUTO_DESTROY) === DONE) stream._duplexState |= DESTROYING;
if (this.pipeTo !== null) this.pipeTo.end();
}
if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) {
if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) {
stream._duplexState |= ACTIVE;
stream._destroy(afterDestroy.bind(this));
}
return
}
if ((stream._duplexState & IS_OPENING) === OPENING) {
stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING;
stream._open(afterOpen.bind(this));
}
}
updateNextTick () {
if ((this.stream._duplexState & READ_NEXT_TICK) !== 0) return
this.stream._duplexState |= READ_NEXT_TICK;
queueTick(this.afterUpdateNextTick);
}
}
class TransformState {
constructor (stream) {
this.data = null;
this.afterTransform = afterTransform.bind(stream);
this.afterFinal = null;
}
}
class Pipeline {
constructor (src, dst, cb) {
this.from = src;
this.to = dst;
this.afterPipe = cb;
this.error = null;
this.pipeToFinished = false;
}
finished () {
this.pipeToFinished = true;
}
done (stream, err) {
if (err) this.error = err;
if (stream === this.to) {
this.to = null;
if (this.from !== null) {
if ((this.from._duplexState & READ_DONE) === 0 || !this.pipeToFinished) {
this.from.destroy(this.error || new Error('Writable stream closed prematurely'));
}
return
}
}
if (stream === this.from) {
this.from = null;
if (this.to !== null) {
if ((stream._duplexState & READ_DONE) === 0) {
this.to.destroy(this.error || new Error('Readable stream closed before ending'));
}
return
}
}
if (this.afterPipe !== null) this.afterPipe(this.error);
this.to = this.from = this.afterPipe = null;
}
}
function afterDrain () {
this.stream._duplexState |= READ_PIPE_DRAINED;
if ((this.stream._duplexState & READ_ACTIVE_AND_SYNC) === 0) this.updateNextTick();
else this.drain();
}
function afterFinal (err) {
const stream = this.stream;
if (err) stream.destroy(err);
if ((stream._duplexState & DESTROY_STATUS) === 0) {
stream._duplexState |= WRITE_DONE;
stream.emit('finish');
}
if ((stream._duplexState & AUTO_DESTROY) === DONE) {
stream._duplexState |= DESTROYING;
}
stream._duplexState &= WRITE_NOT_ACTIVE;
this.update();
}
function afterDestroy (err) {
const stream = this.stream;
if (!err && this.error !== STREAM_DESTROYED) err = this.error;
if (err) stream.emit('error', err);
stream._duplexState |= DESTROYED;
stream.emit('close');
const rs = stream._readableState;
const ws = stream._writableState;
if (rs !== null && rs.pipeline !== null) rs.pipeline.done(stream, err);
if (ws !== null && ws.pipeline !== null) ws.pipeline.done(stream, err);
}
function afterWrite (err) {
const stream = this.stream;
if (err) stream.destroy(err);
stream._duplexState &= WRITE_NOT_ACTIVE;
if ((stream._duplexState & WRITE_DRAIN_STATUS) === WRITE_UNDRAINED) {
stream._duplexState &= WRITE_DRAINED;
if ((stream._duplexState & WRITE_EMIT_DRAIN) === WRITE_EMIT_DRAIN) {
stream.emit('drain');
}
}
if ((stream._duplexState & WRITE_SYNC) === 0) this.update();
}
function afterRead (err) {
if (err) this.stream.destroy(err);
this.stream._duplexState &= READ_NOT_ACTIVE;
if ((this.stream._duplexState & READ_SYNC) === 0) this.update();
}
function updateReadNT () {
this.stream._duplexState &= READ_NOT_NEXT_TICK;
this.update();
}
function updateWriteNT () {
this.stream._duplexState &= WRITE_NOT_NEXT_TICK;
this.update();
}
function afterOpen (err) {
const stream = this.stream;
if (err) stream.destroy(err);
if ((stream._duplexState & DESTROYING) === 0) {
if ((stream._duplexState & READ_PRIMARY_STATUS) === 0) stream._duplexState |= READ_PRIMARY;
if ((stream._duplexState & WRITE_PRIMARY_STATUS) === 0) stream._duplexState |= WRITE_PRIMARY;
stream.emit('open');
}
stream._duplexState &= NOT_ACTIVE;
if (stream._writableState !== null) {
stream._writableState.update();
}
if (stream._readableState !== null) {
stream._readableState.update();
}
}
function afterTransform (err, data) {
if (data !== undefined && data !== null) this.push(data);
this._writableState.afterWrite(err);
}
class Stream extends EventEmitter {
constructor (opts) {
super();
this._duplexState = 0;
this._readableState = null;
this._writableState = null;
if (opts) {
if (opts.open) this._open = opts.open;
if (opts.destroy) this._destroy = opts.destroy;
if (opts.predestroy) this._predestroy = opts.predestroy;
if (opts.signal) {
opts.signal.addEventListener('abort', abort.bind(this));
}
}
}
_open (cb) {
cb(null);
}
_destroy (cb) {
cb(null);
}
_predestroy () {
// does nothing
}
get readable () {
return this._readableState !== null ? true : undefined
}
get writable () {
return this._writableState !== null ? true : undefined
}
get destroyed () {
return (this._duplexState & DESTROYED) !== 0
}
get destroying () {
return (this._duplexState & DESTROY_STATUS) !== 0
}
destroy (err) {
if ((this._duplexState & DESTROY_STATUS) === 0) {
if (!err) err = STREAM_DESTROYED;
this._duplexState = (this._duplexState | DESTROYING) & NON_PRIMARY;
if (this._readableState !== null) this._readableState.error = err;
if (this._writableState !== null) this._writableState.error = err;
this._duplexState |= PREDESTROYING;
this._predestroy();
this._duplexState &= NOT_PREDESTROYING;
if (this._readableState !== null) this._readableState.updateNextTick();
if (this._writableState !== null) this._writableState.updateNextTick();
}
}
on (name, fn) {
if (this._readableState !== null) {
if (name === 'data') {
this._duplexState |= (READ_EMIT_DATA | READ_RESUMED);
this._readableState.updateNextTick();
}
if (name === 'readable') {
this._duplexState |= READ_EMIT_READABLE;
this._readableState.updateNextTick();
}
}
if (this._writableState !== null) {
if (name === 'drain') {
this._duplexState |= WRITE_EMIT_DRAIN;
this._writableState.updateNextTick();
}
}
return super.on(name, fn)
}
}
class Readable$1 extends Stream {
constructor (opts) {
super(opts);
this._duplexState |= OPENING | WRITE_DONE;
this._readableState = new ReadableState(this, opts);
if (opts) {
if (opts.read) this._read = opts.read;
if (opts.eagerOpen) this.resume().pause();
}
}
_read (cb) {
cb(null);
}
pipe (dest, cb) {
this._readableState.pipe(dest, cb);
this._readableState.updateNextTick();
return dest
}
read () {
this._readableState.updateNextTick();
return this._readableState.read()
}
push (data) {
this._readableState.updateNextTick();
return this._readableState.push(data)
}
unshift (data) {
this._readableState.updateNextTick();
return this._readableState.unshift(data)
}
resume () {
this._duplexState |= READ_RESUMED;
this._readableState.updateNextTick();
return this
}
pause () {
this._duplexState &= READ_PAUSED;
return this
}
static _fromAsyncIterator (ite, opts) {
let destroy;
const rs = new Readable$1({
...opts,
read (cb) {
ite.next().then(push).then(cb.bind(null, null)).catch(cb);
},
predestroy () {
destroy = ite.return();
},
destroy (cb) {
if (!destroy) return cb(null)
destroy.then(cb.bind(null, null)).catch(cb);
}
});
return rs
function push (data) {
if (data.done) rs.push(null);
else rs.push(data.value);
}
}
static from (data, opts) {
if (isReadStreamx(data)) return data
if (data[asyncIterator]) return this._fromAsyncIterator(data[asyncIterator](), opts)
if (!Array.isArray(data)) data = data === undefined ? [] : [data];
let i = 0;
return new Readable$1({
...opts,
read (cb) {
this.push(i === data.length ? null : data[i++]);
cb(null);
}
})
}
static isBackpressured (rs) {
return (rs._duplexState & READ_BACKPRESSURE_STATUS) !== 0 || rs._readableState.buffered >= rs._readableState.highWaterMark
}
static isPaused (rs) {
return (rs._duplexState & READ_RESUMED) === 0
}
[asyncIterator] () {
const stream = this;
let error = null;
let promiseResolve = null;
let promiseReject = null;
this.on('error', (err) => { error = err; });
this.on('readable', onreadable);
this.on('close', onclose);
return {
[asyncIterator] () {
return this
},
next () {
return new Promise(function (resolve, reject) {
promiseResolve = resolve;
promiseReject = reject;
const data = stream.read();
if (data !== null) ondata(data);
else if ((stream._duplexState & DESTROYED) !== 0) ondata(null);
})
},
return () {
return destroy(null)
},
throw (err) {
return destroy(err)
}
}
function onreadable () {
if (promiseResolve !== null) ondata(stream.read());
}
function onclose () {
if (promiseResolve !== null) ondata(null);
}
function ondata (data) {
if (promiseReject === null) return
if (error) promiseReject(error);
else if (data === null && (stream._duplexState & READ_DONE) === 0) promiseReject(STREAM_DESTROYED);
else promiseResolve({ value: data, done: data === null });
promiseReject = promiseResolve = null;
}
function destroy (err) {
stream.destroy(err);
return new Promise((resolve, reject) => {
if (stream._duplexState & DESTROYED) return resolve({ value: undefined, done: true })
stream.once('close', function () {
if (err) reject(err);
else resolve({ value: undefined, done: true });
});
})
}
}
}
class Writable$1 extends Stream {
constructor (opts) {
super(opts);
this._duplexState |= OPENING | READ_DONE;
this._writableState = new WritableState(this, opts);
if (opts) {
if (opts.writev) this._writev = opts.writev;
if (opts.write) this._write = opts.write;
if (opts.final) this._final = opts.final;
}
}
_writev (batch, cb) {
cb(null);
}
_write (data, cb) {
this._writableState.autoBatch(data, cb);
}
_final (cb) {
cb(null);
}
static isBackpressured (ws) {
return (ws._duplexState & WRITE_BACKPRESSURE_STATUS) !== 0
}
write (data) {
this._writableState.updateNextTick();
return this._writableState.push(data)
}
end (data) {
this._writableState.updateNextTick();
this._writableState.end(data);
return this
}
}
class Duplex extends Readable$1 { // and Writable
constructor (opts) {
super(opts);
this._duplexState = OPENING;
this._writableState = new WritableState(this, opts);
if (opts) {
if (opts.writev) this._writev = opts.writev;
if (opts.write) this._write = opts.write;
if (opts.final) this._final = opts.final;
}
}
_writev (batch, cb) {
cb(null);
}
_write (data, cb) {
this._writableState.autoBatch(data, cb);
}
_final (cb) {
cb(null);
}
write (data) {
this._writableState.updateNextTick();
return this._writableState.push(data)
}
end (data) {
this._writableState.updateNextTick();
this._writableState.end(data);
return this
}
}
class Transform extends Duplex {
constructor (opts) {
super(opts);
this._transformState = new TransformState(this);
if (opts) {
if (opts.transform) this._transform = opts.transform;
if (opts.flush) this._flush = opts.flush;
}
}
_write (data, cb) {
if (this._readableState.buffered >= this._readableState.highWaterMark) {
this._transformState.data = data;
} else {
this._transform(data, this._transformState.afterTransform);
}
}
_read (cb) {
if (this._transformState.data !== null) {
const data = this._transformState.data;
this._transformState.data = null;
cb(null);
this._transform(data, this._transformState.afterTransform);
} else {
cb(null);
}
}
_transform (data, cb) {
cb(null, data);
}
_flush (cb) {
cb(null);
}
_final (cb) {
this._transformState.afterFinal = cb;
this._flush(transformAfterFlush.bind(this));
}
}
class PassThrough extends Transform {}
function transformAfterFlush (err, data) {
const cb = this._transformState.afterFinal;
if (err) return cb(err)
if (data !== null && data !== undefined) this.push(data);
this.push(null);
cb(null);
}
function pipelinePromise (...streams) {
return new Promise((resolve, reject) => {
return pipeline(...streams, (err) => {
if (err) return reject(err)
resolve();
})
})
}
function pipeline (stream, ...streams) {
const all = Array.isArray(stream) ? [...stream, ...streams] : [stream, ...streams];
const done = (all.length && typeof all[all.length - 1] === 'function') ? all.pop() : null;
if (all.length < 2) throw new Error('Pipeline requires at least 2 streams')
let src = all[0];
let dest = null;
let error = null;
for (let i = 1; i < all.length; i++) {
dest = all[i];
if (isStreamx(src)) {
src.pipe(dest, onerror);
} else {
errorHandle(src, true, i > 1, onerror);
src.pipe(dest);
}
src = dest;
}
if (done) {
let fin = false;
dest.on('finish', () => { fin = true; });
dest.on('error', err => { error = error || err; });
dest.on('close', () => done(error || (fin ? null : PREMATURE_CLOSE)));
}
return dest
function errorHandle (s, rd, wr, onerror) {
s.on('error', onerror);
s.on('close', onclose);
function onclose () {
if (rd && s._readableState && !s._readableState.ended) return onerror(PREMATURE_CLOSE)
if (wr && s._writableState && !s._writableState.ended) return onerror(PREMATURE_CLOSE)
}
}
function onerror (err) {
if (!err || error) return
error = err;
for (const s of all) {
s.destroy(err);
}
}
}
function isStream (stream) {
return !!stream._readableState || !!stream._writableState
}
function isStreamx (stream) {
return typeof stream._duplexState === 'number' && isStream(stream)
}
function getStreamError (stream) {
return (stream._readableState && stream._readableState.error) || (stream._writableState && stream._writableState.error)
}
function isReadStreamx (stream) {
return isStreamx(stream) && stream.readable
}
function isTypedArray (data) {
return typeof data === 'object' && data !== null && typeof data.byteLength === 'number'
}
function defaultByteLength (data) {
return isTypedArray(data) ? data.byteLength : 1024
}
function noop$1 () {}
function abort () {
this.destroy(new Error('Stream aborted.'));
}
var streamx = {
pipeline,
pipelinePromise,
isStream,
isStreamx,
getStreamError,
Stream,
Writable: Writable$1,
Readable: Readable$1,
Duplex,
Transform,
// Export PassThrough for compatibility with Node.js core's stream module
PassThrough
};
var headers$1 = {};
function isBuffer (value) {
return Buffer.isBuffer(value) || value instanceof Uint8Array
}
function isEncoding (encoding) {
return Buffer.isEncoding(encoding)
}
function alloc (size, fill, encoding) {
return Buffer.alloc(size, fill, encoding)
}
function allocUnsafe (size) {
return Buffer.allocUnsafe(size)
}
function allocUnsafeSlow (size) {
return Buffer.allocUnsafeSlow(size)
}
function byteLength (string, encoding) {
return Buffer.byteLength(string, encoding)
}
function compare (a, b) {
return Buffer.compare(a, b)
}
function concat (buffers, totalLength) {
return Buffer.concat(buffers, totalLength)
}
function copy (source, target, targetStart, start, end) {
return toBuffer(source).copy(target, targetStart, start, end)
}
function equals (a, b) {
return toBuffer(a).equals(b)
}
function fill (buffer, value, offset, end, encoding) {
return toBuffer(buffer).fill(value, offset, end, encoding)
}
function from (value, encodingOrOffset, length) {
return Buffer.from(value, encodingOrOffset, length)
}
function includes (buffer, value, byteOffset, encoding) {
return toBuffer(buffer).includes(value, byteOffset, encoding)
}
function indexOf$1 (buffer, value, byfeOffset, encoding) {
return toBuffer(buffer).indexOf(value, byfeOffset, encoding)
}
function lastIndexOf (buffer, value, byteOffset, encoding) {
return toBuffer(buffer).lastIndexOf(value, byteOffset, encoding)
}
function swap16 (buffer) {
return toBuffer(buffer).swap16()
}
function swap32 (buffer) {
return toBuffer(buffer).swap32()
}
function swap64 (buffer) {
return toBuffer(buffer).swap64()
}
function toBuffer (buffer) {
if (Buffer.isBuffer(buffer)) return buffer
return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength)
}
function toString (buffer, encoding, start, end) {
return toBuffer(buffer).toString(encoding, start, end)
}
function write (buffer, string, offset, length, encoding) {
return toBuffer(buffer).write(string, offset, length, encoding)
}
function writeDoubleLE (buffer, value, offset) {
return toBuffer(buffer).writeDoubleLE(value, offset)
}
function writeFloatLE (buffer, value, offset) {
return toBuffer(buffer).writeFloatLE(value, offset)
}
function writeUInt32LE (buffer, value, offset) {
return toBuffer(buffer).writeUInt32LE(value, offset)
}
function writeInt32LE (buffer, value, offset) {
return toBuffer(buffer).writeInt32LE(value, offset)
}
function readDoubleLE (buffer, offset) {
return toBuffer(buffer).readDoubleLE(offset)
}
function readFloatLE (buffer, offset) {
return toBuffer(buffer).readFloatLE(offset)
}
function readUInt32LE (buffer, offset) {
return toBuffer(buffer).readUInt32LE(offset)
}
function readInt32LE (buffer, offset) {
return toBuffer(buffer).readInt32LE(offset)
}
var b4a$2 = {
isBuffer,
isEncoding,
alloc,
allocUnsafe,
allocUnsafeSlow,
byteLength,
compare,
concat,
copy,
equals,
fill,
from,
includes,
indexOf: indexOf$1,
lastIndexOf,
swap16,
swap32,
swap64,
toBuffer,
toString,
write,
writeDoubleLE,
writeFloatLE,
writeUInt32LE,
writeInt32LE,
readDoubleLE,
readFloatLE,
readUInt32LE,
readInt32LE
};
const b4a$1 = b4a$2;
const ZEROS = '0000000000000000000';
const SEVENS = '7777777777777777777';
const ZERO_OFFSET = '0'.charCodeAt(0);
const USTAR_MAGIC = b4a$1.from('ustar\x00', 'binary');
const USTAR_VER = b4a$1.from('00', 'binary');
const GNU_MAGIC = b4a$1.from('ustar\x20', 'binary');
const GNU_VER = b4a$1.from('\x20\x00', 'binary');
const MASK = 0o7777;
const MAGIC_OFFSET = 257;
const VERSION_OFFSET = 263;
const clamp = function (index, len, defaultValue) {
if (typeof index !== 'number') return defaultValue
index = ~~index; // Coerce to integer.
if (index >= len) return len
if (index >= 0) return index
index += len;
if (index >= 0) return index
return 0
};
const toType = function (flag) {
switch (flag) {
case 0:
return 'file'
case 1:
return 'link'
case 2:
return 'symlink'
case 3:
return 'character-device'
case 4:
return 'block-device'
case 5:
return 'directory'
case 6:
return 'fifo'
case 7:
return 'contiguous-file'
case 72:
return 'pax-header'
case 55:
return 'pax-global-header'
case 27:
return 'gnu-long-link-path'
case 28:
case 30:
return 'gnu-long-path'
}
return null
};
const toTypeflag = function (flag) {
switch (flag) {
case 'file':
return 0
case 'link':
return 1
case 'symlink':
return 2
case 'character-device':
return 3
case 'block-device':
return 4
case 'directory':
return 5
case 'fifo':
return 6
case 'contiguous-file':
return 7
case 'pax-header':
return 72
}
return 0
};
const indexOf = function (block, num, offset, end) {
for (; offset < end; offset++) {
if (block[offset] === num) return offset
}
return end
};
const cksum = function (block) {
let sum = 8 * 32;
for (let i = 0; i < 148; i++) sum += block[i];
for (let j = 156; j < 512; j++) sum += block[j];
return sum
};
const encodeOct = function (val, n) {
val = val.toString(8);
if (val.length > n) return SEVENS.slice(0, n) + ' '
else return ZEROS.slice(0, n - val.length) + val + ' '
};
/* Copied from the node-tar repo and modified to meet
* tar-stream coding standard.
*
* Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349
*/
function parse256 (buf) {
// first byte MUST be either 80 or FF
// 80 for positive, FF for 2's comp
let positive;
if (buf[0] === 0x80) positive = true;
else if (buf[0] === 0xFF) positive = false;
else return null
// build up a base-256 tuple from the least sig to the highest
const tuple = [];
let i;
for (i = buf.length - 1; i > 0; i--) {
const byte = buf[i];
if (positive) tuple.push(byte);
else tuple.push(0xFF - byte);
}
let sum = 0;
const l = tuple.length;
for (i = 0; i < l; i++) {
sum += tuple[i] * Math.pow(256, i);
}
return positive ? sum : -1 * sum
}
const decodeOct = function (val, offset, length) {
val = val.slice(offset, offset + length);
offset = 0;
// If prefixed with 0x80 then parse as a base-256 integer
if (val[offset] & 0x80) {
return parse256(val)
} else {
// Older versions of tar can prefix with spaces
while (offset < val.length && val[offset] === 32) offset++;
const end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length);
while (offset < end && val[offset] === 0) offset++;
if (end === offset) return 0
return parseInt(val.slice(offset, end).toString(), 8)
}
};
const decodeStr = function (val, offset, length, encoding) {
return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding)
};
const addLength = function (str) {
const len = b4a$1.byteLength(str);
let digits = Math.floor(Math.log(len) / Math.log(10)) + 1;
if (len + digits >= Math.pow(10, digits)) digits++;
return (len + digits) + str
};
headers$1.decodeLongPath = function (buf, encoding) {
return decodeStr(buf, 0, buf.length, encoding)
};
headers$1.encodePax = function (opts) { // TODO: encode more stuff in pax
let result = '';
if (opts.name) result += addLength(' path=' + opts.name + '\n');
if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\n');
const pax = opts.pax;
if (pax) {
for (const key in pax) {
result += addLength(' ' + key + '=' + pax[key] + '\n');
}
}
return b4a$1.from(result)
};
headers$1.decodePax = function (buf) {
const result = {};
while (buf.length) {
let i = 0;
while (i < buf.length && buf[i] !== 32) i++;
const len = parseInt(buf.slice(0, i).toString(), 10);
if (!len) return result
const b = buf.slice(i + 1, len - 1).toString();
const keyIndex = b.indexOf('=');
if (keyIndex === -1) return result
result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1);
buf = buf.slice(len);
}
return result
};
headers$1.encode = function (opts) {
const buf = b4a$1.alloc(512);
let name = opts.name;
let prefix = '';
if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/';
if (b4a$1.byteLength(name) !== name.length) return null // utf-8
while (b4a$1.byteLength(name) > 100) {
const i = name.indexOf('/');
if (i === -1) return null
prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i);
name = name.slice(i + 1);
}
if (b4a$1.byteLength(name) > 100 || b4a$1.byteLength(prefix) > 155) return null
if (opts.linkname && b4a$1.byteLength(opts.linkname) > 100) return null
b4a$1.write(buf, name);
b4a$1.write(buf, encodeOct(opts.mode & MASK, 6), 100);
b4a$1.write(buf, encodeOct(opts.uid, 6), 108);
b4a$1.write(buf, encodeOct(opts.gid, 6), 116);
b4a$1.write(buf, encodeOct(opts.size, 11), 124);
b4a$1.write(buf, encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136);
buf[156] = ZERO_OFFSET + toTypeflag(opts.type);
if (opts.linkname) b4a$1.write(buf, opts.linkname, 157);
b4a$1.copy(USTAR_MAGIC, buf, MAGIC_OFFSET);
b4a$1.copy(USTAR_VER, buf, VERSION_OFFSET);
if (opts.uname) b4a$1.write(buf, opts.uname, 265);
if (opts.gname) b4a$1.write(buf, opts.gname, 297);
b4a$1.write(buf, encodeOct(opts.devmajor || 0, 6), 329);
b4a$1.write(buf, encodeOct(opts.devminor || 0, 6), 337);
if (prefix) b4a$1.write(buf, prefix, 345);
b4a$1.write(buf, encodeOct(cksum(buf), 6), 148);
return buf
};
headers$1.decode = function (buf, filenameEncoding, allowUnknownFormat) {
let typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET;
let name = decodeStr(buf, 0, 100, filenameEncoding);
const mode = decodeOct(buf, 100, 8);
const uid = decodeOct(buf, 108, 8);
const gid = decodeOct(buf, 116, 8);
const size = decodeOct(buf, 124, 12);
const mtime = decodeOct(buf, 136, 12);
const type = toType(typeflag);
const linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding);
const uname = decodeStr(buf, 265, 32);
const gname = decodeStr(buf, 297, 32);
const devmajor = decodeOct(buf, 329, 8);
const devminor = decodeOct(buf, 337, 8);
const c = cksum(buf);
// checksum is still initial value if header was null.
if (c === 8 * 32) return null
// valid checksum
if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?')
if (USTAR_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0) {
// ustar (posix) format.
// prepend prefix, if present.
if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name;
} else if (GNU_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0 &&
GNU_VER.compare(buf, VERSION_OFFSET, VERSION_OFFSET + 2) === 0) ; else {
if (!allowUnknownFormat) {
throw new Error('Invalid tar header: unknown format.')
}
}
// to support old tar versions that use trailing / to indicate dirs
if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5;
return {
name,
mode,
uid,
gid,
size,
mtime: new Date(1000 * mtime),
type,
linkname,
uname,
gname,
devmajor,
devminor
}
};
const { constants } = require$$0$2;
const { Readable, Writable } = streamx;
const { StringDecoder } = require$$13;
const b4a = b4a$2;
const headers = headers$1;
const DMODE = 0o755;
const FMODE = 0o644;
const END_OF_TAR = b4a.alloc(1024);
const noop = function () {};
const overflow = function (self, size) {
size &= 511;
if (size) self.push(END_OF_TAR.subarray(0, 512 - size));
};
function modeToType (mode) {
switch (mode & constants.S_IFMT) {
case constants.S_IFBLK: return 'block-device'
case constants.S_IFCHR: return 'character-device'
case constants.S_IFDIR: return 'directory'
case constants.S_IFIFO: return 'fifo'
case constants.S_IFLNK: return 'symlink'
}
return 'file'
}
class Sink extends Writable {
constructor (to) {
super();
this.written = 0;
this._to = to;
}
_write (data, cb) {
this.written += data.byteLength;
if (this._to.push(data)) return cb()
this._to._drain = cb;
}
}
class LinkSink extends Writable {
constructor () {
super();
this.linkname = '';
this._decoder = new StringDecoder('utf-8');
}
_write (data, cb) {
this.linkname += this._decoder.write(data);
cb();
}
}
class Void extends Writable {
_write (data, cb) {
cb(new Error('No body allowed for this entry'));
}
}
class Pack extends Readable {
constructor (opts) {
super(opts);
this._drain = noop;
this._finalized = false;
this._finalizing = false;
this._stream = null;
}
entry (header, buffer, callback) {
if (this._stream) throw new Error('already piping an entry')
if (this._finalized || this.destroyed) return
if (typeof buffer === 'function') {
callback = buffer;
buffer = null;
}
if (!callback) callback = noop;
const self = this;
if (!header.size || header.type === 'symlink') header.size = 0;
if (!header.type) header.type = modeToType(header.mode);
if (!header.mode) header.mode = header.type === 'directory' ? DMODE : FMODE;
if (!header.uid) header.uid = 0;
if (!header.gid) header.gid = 0;
if (!header.mtime) header.mtime = new Date();
if (typeof buffer === 'string') buffer = b4a.from(buffer);
if (b4a.isBuffer(buffer)) {
header.size = buffer.byteLength;
this._encode(header);
const ok = this.push(buffer);
overflow(self, header.size);
if (ok) process.nextTick(callback);
else this._drain = callback;
return new Void()
}
if (header.type === 'symlink' && !header.linkname) {
const linkSink = new LinkSink();
linkSink
.on('error', function (err) {
self.destroy();
callback(err);
})
.on('close', function () {
header.linkname = linkSink.linkname;
self._encode(header);
callback();
});
return linkSink
}
this._encode(header);
if (header.type !== 'file' && header.type !== 'contiguous-file') {
process.nextTick(callback);
return new Void()
}
const sink = new Sink(this);
sink
.on('error', function (err) {
self._stream = null;
self.destroy();
callback(err);
})
.on('close', function () {
self._stream = null;
if (sink.written !== header.size) ;
overflow(self, header.size);
if (self._finalizing) { self.finalize(); }
callback();
});
this._stream = sink;
return sink
}
finalize () {
if (this._stream) {
this._finalizing = true;
return
}
if (this._finalized) return
this._finalized = true;
this.push(END_OF_TAR);
this.push(null);
}
_encode (header) {
if (!header.pax) {
const buf = headers.encode(header);
if (buf) {
this.push(buf);
return
}
}
this._encodePax(header);
}
_encodePax (header) {
const paxHeader = headers.encodePax({
name: header.name,
linkname: header.linkname,
pax: header.pax
});
const newHeader = {
name: 'PaxHeader',
mode: header.mode,
uid: header.uid,
gid: header.gid,
size: paxHeader.byteLength,
mtime: header.mtime,
type: 'pax-header',
linkname: header.linkname && 'PaxHeader',
uname: header.uname,
gname: header.gname,
devmajor: header.devmajor,
devminor: header.devminor
};
this.push(headers.encode(newHeader));
this.push(paxHeader);
overflow(this, paxHeader.byteLength);
newHeader.size = header.size;
newHeader.type = header.type;
this.push(headers.encode(newHeader));
}
_read (cb) {
const drain = this._drain;
this._drain = noop;
drain();
cb();
}
}
var pack$1 = function pack (opts) {
return new Pack(opts)
};
var pack = pack$1;
const MTIME = new Date(0);
const MODE_FOR_DIR = 0o755;
const MODE_FOR_FILE = 0o555;
const MODE_FOR_SYMLINK = 0o775;
function findKeyByValue(entries, value) {
for (const [key, { dest: val }] of Object.entries(entries)) {
if (val == value) {
return key;
}
}
return undefined;
}
async function readlinkSafe(p) {
try {
const link = await readlink(p);
return path.resolve(path.dirname(p), link);
}
catch (e) {
if (e.code == 'EINVAL') {
return p;
}
throw e;
}
}
async function resolveSymlink(p) {
let prevHop = path.resolve(p);
let hopped = false;
while (true) {
// /output-base/sandbox/4/execroot/wksp/bazel-out
// /output-base/execroot/wksp/bazel-out
let nextHop = await readlinkSafe(prevHop);
if (!nextHop.startsWith(process.env.JS_BINARY__EXECROOT)) {
return hopped ? prevHop : undefined;
}
if (nextHop != prevHop) {
prevHop = nextHop;
hopped = true;
}
else if (!hopped) {
return undefined;
}
else {
return nextHop;
}
}
}
async function* walk(dir, accumulate = '') {
const dirents = await readdir(dir, { withFileTypes: true });
for (const dirent of dirents) {
let isDirectory = dirent.isDirectory();
if (dirent.isSymbolicLink() &&
!dirent.isDirectory() &&
!dirent.isFile()) {
// On OSX we sometimes encounter this bug: https://github.com/nodejs/node/issues/30646
// The entry is apparently a symlink, but it's ambiguous whether it's a symlink to a
// file or to a directory, and lstat doesn't tell us either. Determine the type by
// attempting to read it as a directory.
try {
await readdir(path.join(dir, dirent.name));
isDirectory = true;
}
catch (error) {
if (error.code === 'ENOTDIR') {
isDirectory = false;
}
else {
throw error;
}
}
}
if (isDirectory) {
yield* walk(path.join(dir, dirent.name), path.join(accumulate, dirent.name));
}
else {
yield path.join(accumulate, dirent.name);
}
}
}
function add_parents(name, pkg, existing_paths, owner) {
const segments = path.dirname(name).split('/');
let prev = '';
const stats = {
// this is an intermediate directory and bazel does not allow specifying
// modes for intermediate directories.
mode: MODE_FOR_DIR,
mtime: MTIME,
};
for (const part of segments) {
if (!part) {
continue;
}
prev = path.join(prev, part);
// check if the directory has been has been created before.
if (existing_paths.has(prev)) {
continue;
}
existing_paths.add(prev);
add_directory(prev, pkg, owner, stats);
}
}
function add_directory(name, pkg, owner, stats) {
pkg.entry({
type: 'directory',
name: name.replace(/^\//, ''),
mode: stats.mode,
mtime: MTIME,
gid: owner.gid,
uid: owner.uid,
}).end();
}
function add_symlink(name, linkname, pkg, owner, stats) {
const link_parent = path.dirname(name);
pkg.entry({
type: 'symlink',
name: name.replace(/^\//, ''),
linkname: path.relative(link_parent, linkname),
mode: stats.mode,
mtime: MTIME,
uid: owner.uid,
gid: owner.gid,
}).end();
}
function add_file(name, content, pkg, owner, stats) {
return new Promise((resolve, reject) => {
const entry = pkg.entry({
type: 'file',
name: name.replace(/^\//, ''),
mode: stats.mode,
size: stats.size,
mtime: MTIME,
uid: owner.uid,
gid: owner.gid,
}, (err) => {
if (err) {
reject(err);
}
else {
resolve(undefined);
}
});
content.pipe(entry);
});
}
async function build(entries, outputPath, compression, owner) {
const output = pack();
const existing_paths = new Set();
let write = output;
if (compression == 'gzip') {
write = write.pipe(createGzip());
}
write.pipe(createWriteStream(outputPath));
for (const key of Object.keys(entries).sort()) {
const { dest, is_directory, is_source, is_external, root, remove_non_hermetic_lines, } = entries[key];
// its a treeartifact. expand it and add individual entries.
if (is_directory) {
for await (const sub_key of walk(dest)) {
const new_key = path.join(key, sub_key);
const new_dest = path.join(dest, sub_key);
add_parents(new_key, output, existing_paths, owner);
const stats = await stat(new_dest);
await add_file(new_key, createReadStream(new_dest), output, owner, stats);
}
continue;
}
// create parents of current path.
add_parents(key, output, existing_paths, owner);
// A source file from workspace, not an output of a target.
if (is_source) {
const originalStat = await stat(dest);
// use stable mode bits instead of preserving the one from file.
const stats = {
mode: MODE_FOR_FILE,
mtime: MTIME,
size: originalStat.size,
};
await add_file(key, createReadStream(dest), output, owner, stats);
continue;
}
// root indicates where the generated source comes from. it looks like
// `bazel-out/darwin_arm64-fastbuild` when there's no transition.
if (!root) {
// everything except sources should have
throw new Error(`unexpected entry format. ${JSON.stringify(entries[key])}. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose`);
}
const realp = await resolveSymlink(dest);
// it's important that we don't treat any symlink pointing out of execroot since
// bazel symlinks external files into sandbox to make them available to us.
if (realp && !is_external) {
const output_path = realp.slice(realp.indexOf(root));
// interestingly, bazel 5 and 6 sets different mode bits on symlinks.
// well use `0o755` to allow owner&group to `rwx` and others `rx`
// see: https://chmodcommand.com/chmod-775/
// const stats = await stat(dest)
const stats = { mode: MODE_FOR_SYMLINK, mtime: MTIME };
const linkname = findKeyByValue(entries, output_path);
if (linkname == undefined) {
throw new Error(`Couldn't map symbolic link ${output_path} to a path. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose\n\n` +
`dest: ${dest}\n` +
`realpath: ${realp}\n` +
`outputpath: ${output_path}\n` +
`root: ${root}\n` +
`runfiles: ${key}\n\n`);
}
add_symlink(key, linkname, output, owner, stats);
}
else {
// Due to filesystems setting different bits depending on the os we have to opt-in
// to use a stable mode for files.
// In the future, we might want to hand off fine-grained control of these to users
// see: https://chmodcommand.com/chmod-0555/
const originalStat = await stat(dest);
const stats = {
mode: MODE_FOR_FILE,
mtime: MTIME,
size: originalStat.size,
};
let stream = createReadStream(dest);
if (remove_non_hermetic_lines) {
const content = await readFile(dest);
const replaced = Buffer.from(content
.toString()
.replace(/.*JS_BINARY__TARGET_CPU=".*?"/g, `export JS_BINARY__TARGET_CPU="$(uname -m)"`)
.replace(/.*JS_BINARY__BINDIR=".*"/g, `export JS_BINARY__BINDIR="$(pwd)"`));
stream = Readable$2.from(replaced);
stats.size = replaced.byteLength;
}
await add_file(key, stream, output, owner, stats);
}
}
output.finalize();
}
if (import.meta.url === pathToFileURL(process.argv[1]).href) {
const [entriesPath, outputPath, compression, owner,] = process.argv.slice(2);
const raw_entries = await readFile(entriesPath);
const entries = JSON.parse(raw_entries.toString());
const [uid, gid] = owner.split(':').map(Number);
build(entries, outputPath, compression, { uid, gid });
}
export { build };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvb3Vycy9wcmltb3JkaWFscy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9vdXJzL3V0aWwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9ldmVudC10YXJnZXQtc2hpbUA1LjAuMS9ub2RlX21vZHVsZXMvZXZlbnQtdGFyZ2V0LXNoaW0vZGlzdC9ldmVudC10YXJnZXQtc2hpbS5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9hYm9ydC1jb250cm9sbGVyQDMuMC4wL25vZGVfbW9kdWxlcy9hYm9ydC1jb250cm9sbGVyL2Rpc3QvYWJvcnQtY29udHJvbGxlci5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvb3Vycy9lcnJvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvdmFsaWRhdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3Byb2Nlc3NAMC4xMS4xMC9ub2RlX21vZHVsZXMvcHJvY2Vzcy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL29wZXJhdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9sZWdhY3kuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9hZGQtYWJvcnQtc2lnbmFsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYnVmZmVyX2xpc3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9yZWFkYWJsZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3dyaXRhYmxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4aWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvdHJhbnNmb3JtLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGFzc3Rocm91Z2guanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2NvbXBvc2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvc3RyZWFtL3Byb21pc2VzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL3N0cmVhbS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9vdXJzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvaW5oZXJpdHNAMi4wLjQvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9pbmhlcml0c0AyLjAuNC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9ibEA2LjAuMC9ub2RlX21vZHVsZXMvYmwvQnVmZmVyTGlzdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL2JsQDYuMC4wL25vZGVfbW9kdWxlcy9ibC9ibC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3F1ZXVlLXRpY2tAMS4wLjEvbm9kZV9tb2R1bGVzL3F1ZXVlLXRpY2svcXVldWUtbWljcm90YXNrLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcXVldWUtdGlja0AxLjAuMS9ub2RlX21vZHVsZXMvcXVldWUtdGljay9wcm9jZXNzLW5leHQtdGljay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL2Zhc3QtZmlmb0AxLjEuMC9ub2RlX21vZHVsZXMvZmFzdC1maWZvL2ZpeGVkLXNpemUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9mYXN0LWZpZm9AMS4xLjAvbm9kZV9tb2R1bGVzL2Zhc3QtZmlmby9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3N0cmVhbXhAMi4xMy4yL25vZGVfbW9kdWxlcy9zdHJlYW14L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvYjRhQDEuNi4xL25vZGVfbW9kdWxlcy9iNGEvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2hlYWRlcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL3BhY2suanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2luZGV4LmpzIiwiaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbi8qXG4gIFRoaXMgZmlsZSBpcyBhIHJlZHVjZWQgYW5kIGFkYXB0ZWQgdmVyc2lvbiBvZiB0aGUgbWFpbiBsaWIvaW50ZXJuYWwvcGVyX2NvbnRleHQvcHJpbW9yZGlhbHMuanMgZmlsZSBkZWZpbmVkIGF0XG5cbiAgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9wZXJfY29udGV4dC9wcmltb3JkaWFscy5qc1xuXG4gIERvbid0IHRyeSB0byByZXBsYWNlIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgYW5kIGtlZXAgaXQgdXAgdG8gZGF0ZSB3aXRoIHRoZSB1cHN0cmVhbSBmaWxlLlxuKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBcnJheUlzQXJyYXkoc2VsZikge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNlbGYpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlSW5jbHVkZXMoc2VsZiwgZWwpIHtcbiAgICByZXR1cm4gc2VsZi5pbmNsdWRlcyhlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVJbmRleE9mKHNlbGYsIGVsKSB7XG4gICAgcmV0dXJuIHNlbGYuaW5kZXhPZihlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVKb2luKHNlbGYsIHNlcCkge1xuICAgIHJldHVybiBzZWxmLmpvaW4oc2VwKVxuICB9LFxuICBBcnJheVByb3RvdHlwZU1hcChzZWxmLCBmbikge1xuICAgIHJldHVybiBzZWxmLm1hcChmbilcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVQb3Aoc2VsZiwgZWwpIHtcbiAgICByZXR1cm4gc2VsZi5wb3AoZWwpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlUHVzaChzZWxmLCBlbCkge1xuICAgIHJldHVybiBzZWxmLnB1c2goZWwpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlU2xpY2Uoc2VsZiwgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBzZWxmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0sXG4gIEVycm9yLFxuICBGdW5jdGlvblByb3RvdHlwZUNhbGwoZm4sIHRoaXNBcmdzLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwodGhpc0FyZ3MsIC4uLmFyZ3MpXG4gIH0sXG4gIEZ1bmN0aW9uUHJvdG90eXBlU3ltYm9sSGFzSW5zdGFuY2Uoc2VsZiwgaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0uY2FsbChzZWxmLCBpbnN0YW5jZSlcbiAgfSxcbiAgTWF0aEZsb29yOiBNYXRoLmZsb29yLFxuICBOdW1iZXIsXG4gIE51bWJlcklzSW50ZWdlcjogTnVtYmVyLmlzSW50ZWdlcixcbiAgTnVtYmVySXNOYU46IE51bWJlci5pc05hTixcbiAgTnVtYmVyTUFYX1NBRkVfSU5URUdFUjogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gIE51bWJlck1JTl9TQUZFX0lOVEVHRVI6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJQYXJzZUludDogTnVtYmVyLnBhcnNlSW50LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0aWVzKHNlbGYsIHByb3BzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNlbGYsIHByb3BzKVxuICB9LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShzZWxmLCBuYW1lLCBwcm9wKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBuYW1lLCBwcm9wKVxuICB9LFxuICBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VsZiwgbmFtZSkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNlbGYsIG5hbWUpXG4gIH0sXG4gIE9iamVjdEtleXMob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgfSxcbiAgT2JqZWN0U2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bylcbiAgfSxcbiAgUHJvbWlzZSxcbiAgUHJvbWlzZVByb3RvdHlwZUNhdGNoKHNlbGYsIGZuKSB7XG4gICAgcmV0dXJuIHNlbGYuY2F0Y2goZm4pXG4gIH0sXG4gIFByb21pc2VQcm90b3R5cGVUaGVuKHNlbGYsIHRoZW5GbiwgY2F0Y2hGbikge1xuICAgIHJldHVybiBzZWxmLnRoZW4odGhlbkZuLCBjYXRjaEZuKVxuICB9LFxuICBQcm9taXNlUmVqZWN0KGVycikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpXG4gIH0sXG4gIFJlZmxlY3RBcHBseTogUmVmbGVjdC5hcHBseSxcbiAgUmVnRXhwUHJvdG90eXBlVGVzdChzZWxmLCB2YWx1ZSkge1xuICAgIHJldHVybiBzZWxmLnRlc3QodmFsdWUpXG4gIH0sXG4gIFNhZmVTZXQ6IFNldCxcbiAgU3RyaW5nLFxuICBTdHJpbmdQcm90b3R5cGVTbGljZShzZWxmLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNlbGYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvTG93ZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvVXBwZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVHJpbShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYudHJpbSgpXG4gIH0sXG4gIFN5bWJvbCxcbiAgU3ltYm9sQXN5bmNJdGVyYXRvcjogU3ltYm9sLmFzeW5jSXRlcmF0b3IsXG4gIFN5bWJvbEhhc0luc3RhbmNlOiBTeW1ib2wuaGFzSW5zdGFuY2UsXG4gIFN5bWJvbEl0ZXJhdG9yOiBTeW1ib2wuaXRlcmF0b3IsXG4gIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQoc2VsZiwgYnVmLCBsZW4pIHtcbiAgICByZXR1cm4gc2VsZi5zZXQoYnVmLCBsZW4pXG4gIH0sXG4gIFVpbnQ4QXJyYXlcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBidWZmZXJNb2R1bGUgPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3QgQXN5bmNGdW5jdGlvbiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbiAoKSB7fSkuY29uc3RydWN0b3JcbmNvbnN0IEJsb2IgPSBnbG9iYWxUaGlzLkJsb2IgfHwgYnVmZmVyTW9kdWxlLkJsb2Jcbi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuY29uc3QgaXNCbG9iID1cbiAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnXG4gICAgPyBmdW5jdGlvbiBpc0Jsb2IoYikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW5kZW50XG4gICAgICAgIHJldHVybiBiIGluc3RhbmNlb2YgQmxvYlxuICAgICAgfVxuICAgIDogZnVuY3Rpb24gaXNCbG9iKGIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4vKiBlc2xpbnQtZW5hYmxlIGluZGVudCAqL1xuXG4vLyBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIEFnZ3JlZ2F0ZUVycm9yXG5jbGFzcyBBZ2dyZWdhdGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZXJyb3JzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVycm9ycykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGlucHV0IHRvIGJlIGFuIEFycmF5LCBnb3QgJHt0eXBlb2YgZXJyb3JzfWApXG4gICAgfVxuICAgIGxldCBtZXNzYWdlID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgbWVzc2FnZSArPSBgICAgICR7ZXJyb3JzW2ldLnN0YWNrfVxcbmBcbiAgICB9XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnQWdncmVnYXRlRXJyb3InXG4gICAgdGhpcy5lcnJvcnMgPSBlcnJvcnNcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFnZ3JlZ2F0ZUVycm9yLFxuICBrRW1wdHlPYmplY3Q6IE9iamVjdC5mcmVlemUoe30pLFxuICBvbmNlKGNhbGxiYWNrKSB7XG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlXG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICBpZiAoY2FsbGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FsbGVkID0gdHJ1ZVxuICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJncylcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZTogZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXNvbHZlXG4gICAgbGV0IHJlamVjdFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICByZXNvbHZlID0gcmVzXG4gICAgICByZWplY3QgPSByZWpcbiAgICB9KVxuICAgIHJldHVybiB7XG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdFxuICAgIH1cbiAgfSxcbiAgcHJvbWlzaWZ5KGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZuKChlcnIsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlKC4uLmFyZ3MpXG4gICAgICB9KVxuICAgIH0pXG4gIH0sXG4gIGRlYnVnbG9nKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fVxuICB9LFxuICBmb3JtYXQoZm9ybWF0LCAuLi5hcmdzKSB7XG4gICAgLy8gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvdXRpbC5odG1sI3V0aWxmb3JtYXRmb3JtYXQtYXJnc1xuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgvJShbc2RpZmpdKS9nLCBmdW5jdGlvbiAoLi4uW191bnVzZWQsIHR5cGVdKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IGFyZ3Muc2hpZnQoKVxuICAgICAgaWYgKHR5cGUgPT09ICdmJykge1xuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQudG9GaXhlZCg2KVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaicpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50KVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncycgJiYgdHlwZW9mIHJlcGxhY2VtZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjdG9yID0gcmVwbGFjZW1lbnQuY29uc3RydWN0b3IgIT09IE9iamVjdCA/IHJlcGxhY2VtZW50LmNvbnN0cnVjdG9yLm5hbWUgOiAnJ1xuICAgICAgICByZXR1cm4gYCR7Y3Rvcn0ge31gLnRyaW0oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50LnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBpbnNwZWN0KHZhbHVlKSB7XG4gICAgLy8gVmFzdGx5IHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL25vZGVqcy5vcmcvYXBpL3V0aWwuaHRtbCN1dGlsaW5zcGVjdG9iamVjdC1vcHRpb25zXG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHtcbiAgICAgICAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5pbmNsdWRlcygnYCcpICYmICF2YWx1ZS5pbmNsdWRlcygnJHsnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBcXGAke3ZhbHVlfVxcYGBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAnJHt2YWx1ZX0nYFxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiAnTmFOJ1xuICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5pcyh2YWx1ZSwgLTApKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICAgIHJldHVybiBgJHtTdHJpbmcodmFsdWUpfW5gXG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ3t9J1xuICAgIH1cbiAgfSxcbiAgdHlwZXM6IHtcbiAgICBpc0FzeW5jRnVuY3Rpb24oZm4pIHtcbiAgICAgIHJldHVybiBmbiBpbnN0YW5jZW9mIEFzeW5jRnVuY3Rpb25cbiAgICB9LFxuICAgIGlzQXJyYXlCdWZmZXJWaWV3KGFycikge1xuICAgICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnIpXG4gICAgfVxuICB9LFxuICBpc0Jsb2Jcbn1cbm1vZHVsZS5leHBvcnRzLnByb21pc2lmeS5jdXN0b20gPSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5wcm9taXNpZnkuY3VzdG9tJylcbiIsIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpdmF0ZURhdGFcbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3t0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZXZlbnRQaGFzZSBUaGUgY3VycmVudCBldmVudCBwaGFzZS5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR8bnVsbH0gY3VycmVudFRhcmdldCBUaGUgY3VycmVudCBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNhbmNlbGVkIFRoZSBmbGFnIHRvIHByZXZlbnQgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3RvcHBlZCBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW1lZGlhdGVTdG9wcGVkIFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24gaW1tZWRpYXRlbHkuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufG51bGx9IHBhc3NpdmVMaXN0ZW5lciBUaGUgbGlzdGVuZXIgaWYgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaXMgcGFzc2l2ZS4gT3RoZXJ3aXNlIHRoaXMgaXMgbnVsbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lU3RhbXAgVGhlIHVuaXggdGltZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBQcml2YXRlIGRhdGEgZm9yIGV2ZW50IHdyYXBwZXJzLlxuICogQHR5cGUge1dlYWtNYXA8RXZlbnQsIFByaXZhdGVEYXRhPn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHByaXZhdGVEYXRhID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDYWNoZSBmb3Igd3JhcHBlciBjbGFzc2VzLlxuICogQHR5cGUge1dlYWtNYXA8T2JqZWN0LCBGdW5jdGlvbj59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB3cmFwcGVycyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogR2V0IHByaXZhdGUgZGF0YS5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCBvYmplY3QgdG8gZ2V0IHByaXZhdGUgZGF0YS5cbiAqIEByZXR1cm5zIHtQcml2YXRlRGF0YX0gVGhlIHByaXZhdGUgZGF0YSBvZiB0aGUgZXZlbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwZChldmVudCkge1xuICAgIGNvbnN0IHJldHYgPSBwcml2YXRlRGF0YS5nZXQoZXZlbnQpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICByZXR2ICE9IG51bGwsXG4gICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50IG9iamVjdCwgYnV0IGdvdFwiLFxuICAgICAgICBldmVudFxuICAgICk7XG4gICAgcmV0dXJuIHJldHZcbn1cblxuLyoqXG4gKiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI3NldC10aGUtY2FuY2VsZWQtZmxhZ1xuICogQHBhcmFtIGRhdGEge1ByaXZhdGVEYXRhfSBwcml2YXRlIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHNldENhbmNlbEZsYWcoZGF0YSkge1xuICAgIGlmIChkYXRhLnBhc3NpdmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlVuYWJsZSB0byBwcmV2ZW50RGVmYXVsdCBpbnNpZGUgcGFzc2l2ZSBldmVudCBsaXN0ZW5lciBpbnZvY2F0aW9uLlwiLFxuICAgICAgICAgICAgICAgIGRhdGEucGFzc2l2ZUxpc3RlbmVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIWRhdGEuZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkYXRhLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQucHJldmVudERlZmF1bHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBkYXRhLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtZXZlbnRcbiAqIEBwcml2YXRlXG4gKi9cbi8qKlxuICogVGhlIGV2ZW50IHdyYXBwZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2YgdGhpcyBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50IHRvIHdyYXAuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIHByaXZhdGVEYXRhLnNldCh0aGlzLCB7XG4gICAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgICBldmVudCxcbiAgICAgICAgZXZlbnRQaGFzZTogMixcbiAgICAgICAgY3VycmVudFRhcmdldDogZXZlbnRUYXJnZXQsXG4gICAgICAgIGNhbmNlbGVkOiBmYWxzZSxcbiAgICAgICAgc3RvcHBlZDogZmFsc2UsXG4gICAgICAgIGltbWVkaWF0ZVN0b3BwZWQ6IGZhbHNlLFxuICAgICAgICBwYXNzaXZlTGlzdGVuZXI6IG51bGwsXG4gICAgICAgIHRpbWVTdGFtcDogZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCksXG4gICAgfSk7XG5cbiAgICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNVbmZvcmdlYWJsZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzVHJ1c3RlZFwiLCB7IHZhbHVlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcykpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudC50eXBlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5jdXJyZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtFdmVudFRhcmdldFtdfSBUaGUgY29tcG9zZWQgcGF0aCBvZiB0aGlzIGV2ZW50LlxuICAgICAqL1xuICAgIGNvbXBvc2VkUGF0aCgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IHBkKHRoaXMpLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY3VycmVudFRhcmdldF1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgTk9ORS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBOT05FKCkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBDQVBUVVJJTkdfUEhBU0UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQ0FQVFVSSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBBVF9UQVJHRVQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQVRfVEFSR0VUKCkge1xuICAgICAgICByZXR1cm4gMlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBCVUJCTElOR19QSEFTRS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBCVUJCTElOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIDNcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGV2ZW50UGhhc2UoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFBoYXNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgZGF0YS5pbW1lZGlhdGVTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGJ1YmJsaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBidWJibGVzKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5idWJibGVzKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBjYW5jZWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjYW5jZWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5jYW5jZWxhYmxlKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhpcyBldmVudC5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgc2V0Q2FuY2VsRmxhZyhwZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmNhbmNlbGVkXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGNvbXBvc2VkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjb21wb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuY29tcG9zZWQpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bml4IHRpbWUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCB0aW1lU3RhbXAoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS50aW1lU3RhbXBcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBzcmNFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gc3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBjYW5jZWxCdWJibGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5zdG9wcGVkXG4gICAgfSxcbiAgICBzZXQgY2FuY2VsQnViYmxlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuY2FuY2VsQnViYmxlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCByZXR1cm5WYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuICFwZCh0aGlzKS5jYW5jZWxlZFxuICAgIH0sXG4gICAgc2V0IHJldHVyblZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHNldENhbmNlbEZsYWcocGQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhpcyBldmVudCBvYmplY3QuIEJ1dCBkbyBub3RoaW5nIHVuZGVyIGV2ZW50IGRpc3BhdGNoaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdIFRoZSBmbGFnIHRvIGJlIHBvc3NpYmxlIHRvIGJ1YmJsZSB1cC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYW5jZWxhYmxlPWZhbHNlXSBUaGUgZmxhZyB0byBiZSBwb3NzaWJsZSB0byBjYW5jZWwuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbml0RXZlbnQoKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfSxcbn07XG5cbi8vIGBjb25zdHJ1Y3RvcmAgaXMgbm90IGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQucHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogRXZlbnQsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxufSk7XG5cbi8vIEVuc3VyZSBgZXZlbnQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRgIGlzIGB0cnVlYC5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnQucHJvdG90eXBlKTtcblxuICAgIC8vIE1ha2UgYXNzb2NpYXRpb24gZm9yIHdyYXBwZXJzLlxuICAgIHdyYXBwZXJzLnNldCh3aW5kb3cuRXZlbnQucHJvdG90eXBlLCBFdmVudCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0IGEgZ2l2ZW4gcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byByZWRpcmVjdCB0aGUgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50W2tleV1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBwZCh0aGlzKS5ldmVudFtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGNhbGwgYSBnaXZlbiBtZXRob2QgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byBjYWxsIHRoZSBtZXRob2QgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVDYWxsRGVzY3JpcHRvcihrZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcGQodGhpcykuZXZlbnQ7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRba2V5XS5hcHBseShldmVudCwgYXJndW1lbnRzKVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBuZXcgd3JhcHBlciBjbGFzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IEJhc2VFdmVudCBUaGUgYmFzZSB3cmFwcGVyIGNsYXNzLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgZGVmaW5lZCB3cmFwcGVyIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lV3JhcHBlcihCYXNlRXZlbnQsIHByb3RvKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3RvKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJhc2VFdmVudFxuICAgIH1cblxuICAgIC8qKiBDdXN0b21FdmVudCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgICAgICBCYXNlRXZlbnQuY2FsbCh0aGlzLCBldmVudFRhcmdldCwgZXZlbnQpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogQ3VzdG9tRXZlbnQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghKGtleSBpbiBCYXNlRXZlbnQucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBpc0Z1bmMgPSB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgaXNGdW5jXG4gICAgICAgICAgICAgICAgICAgID8gZGVmaW5lQ2FsbERlc2NyaXB0b3Ioa2V5KVxuICAgICAgICAgICAgICAgICAgICA6IGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50XG59XG5cbi8qKlxuICogR2V0IHRoZSB3cmFwcGVyIGNsYXNzIG9mIGEgZ2l2ZW4gcHJvdG90eXBlLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGdldCBpdHMgd3JhcHBlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHdyYXBwZXIgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRXcmFwcGVyKHByb3RvKSB7XG4gICAgaWYgKHByb3RvID09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXIgPSB3cmFwcGVycy5nZXQocHJvdG8pO1xuICAgIGlmICh3cmFwcGVyID09IG51bGwpIHtcbiAgICAgICAgd3JhcHBlciA9IGRlZmluZVdyYXBwZXIoZ2V0V3JhcHBlcihPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKSwgcHJvdG8pO1xuICAgICAgICB3cmFwcGVycy5zZXQocHJvdG8sIHdyYXBwZXIpO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlclxufVxuXG4vKipcbiAqIFdyYXAgYSBnaXZlbiBldmVudCB0byBtYW5hZ2VtZW50IGEgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IG9mIHRoaXMgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHRvIHdyYXAuXG4gKiBAcmV0dXJucyB7RXZlbnR9IFRoZSB3cmFwcGVyIGluc3RhbmNlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gd3JhcEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIGNvbnN0IFdyYXBwZXIgPSBnZXRXcmFwcGVyKE9iamVjdC5nZXRQcm90b3R5cGVPZihldmVudCkpO1xuICAgIHJldHVybiBuZXcgV3JhcHBlcihldmVudFRhcmdldCwgZXZlbnQpXG59XG5cbi8qKlxuICogR2V0IHRoZSBpbW1lZGlhdGVTdG9wcGVkIGZsYWcgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbiBpbW1lZGlhdGVseS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3RvcHBlZChldmVudCkge1xuICAgIHJldHVybiBwZChldmVudCkuaW1tZWRpYXRlU3RvcHBlZFxufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCBldmVudCBwaGFzZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBldmVudFBoYXNlIE5ldyBldmVudCBwaGFzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnRQaGFzZShldmVudCwgZXZlbnRQaGFzZSkge1xuICAgIHBkKGV2ZW50KS5ldmVudFBoYXNlID0gZXZlbnRQaGFzZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtFdmVudFRhcmdldHxudWxsfSBjdXJyZW50VGFyZ2V0IE5ldyBjdXJyZW50IHRhcmdldC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0Q3VycmVudFRhcmdldChldmVudCwgY3VycmVudFRhcmdldCkge1xuICAgIHBkKGV2ZW50KS5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbn1cblxuLyoqXG4gKiBTZXQgYSBwYXNzaXZlIGxpc3RlbmVyIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSBwYXNzaXZlTGlzdGVuZXIgTmV3IHBhc3NpdmUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldFBhc3NpdmVMaXN0ZW5lcihldmVudCwgcGFzc2l2ZUxpc3RlbmVyKSB7XG4gICAgcGQoZXZlbnQpLnBhc3NpdmVMaXN0ZW5lciA9IHBhc3NpdmVMaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMaXN0ZW5lck5vZGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiBAcHJvcGVydHkgezF8MnwzfSBsaXN0ZW5lclR5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFzc2l2ZVxuICogQHByb3BlcnR5IHtib29sZWFufSBvbmNlXG4gKiBAcHJvcGVydHkge0xpc3RlbmVyTm9kZXxudWxsfSBuZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBMaXN0ZW5lck5vZGU+Pn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGxpc3RlbmVyc01hcCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8vIExpc3RlbmVyIHR5cGVzXG5jb25zdCBDQVBUVVJFID0gMTtcbmNvbnN0IEJVQkJMRSA9IDI7XG5jb25zdCBBVFRSSUJVVEUgPSAzO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3Qgb3Igbm90LlxuICogQHBhcmFtIHthbnl9IHggVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc09iamVjdCh4KSB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG59XG5cbi8qKlxuICogR2V0IGxpc3RlbmVycy5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgdG8gZ2V0LlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIExpc3RlbmVyTm9kZT59IFRoZSBsaXN0ZW5lcnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcnMoZXZlbnRUYXJnZXQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50VGFyZ2V0KTtcbiAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50VGFyZ2V0IG9iamVjdCwgYnV0IGdvdCBhbm90aGVyIHZhbHVlLlwiXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RlbmVyc1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIGV2ZW50IGF0dHJpYnV0ZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBnZXQgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RlbmVyVHlwZSA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmxpc3RlbmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuXG4gICAgICAgIHNldChsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmICFpc09iamVjdChsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcblxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgcmVtb3Zpbmcgb2xkIHZhbHVlLlxuICAgICAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXJUeXBlID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9sZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIG5ldyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclR5cGU6IEFUVFJJQlVURSxcbiAgICAgICAgICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ld05vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBhbiBldmVudCBhdHRyaWJ1dGUgKGUuZy4gYGV2ZW50VGFyZ2V0Lm9uY2xpY2tgKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFRhcmdldFByb3RvdHlwZSBUaGUgZXZlbnQgdGFyZ2V0IHByb3RvdHlwZSB0byBkZWZpbmUgYW4gZXZlbnQgYXR0cmJpdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGRlZmluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWZpbmVFdmVudEF0dHJpYnV0ZShldmVudFRhcmdldFByb3RvdHlwZSwgZXZlbnROYW1lKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBldmVudFRhcmdldFByb3RvdHlwZSxcbiAgICAgICAgYG9uJHtldmVudE5hbWV9YCxcbiAgICAgICAgZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSlcbiAgICApO1xufVxuXG4vKipcbiAqIERlZmluZSBhIGN1c3RvbSBFdmVudFRhcmdldCB3aXRoIGV2ZW50IGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBldmVudE5hbWVzIEV2ZW50IG5hbWVzIGZvciBldmVudCBhdHRyaWJ1dGVzLlxuICogQHJldHVybnMge0V2ZW50VGFyZ2V0fSBUaGUgY3VzdG9tIEV2ZW50VGFyZ2V0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoZXZlbnROYW1lcykge1xuICAgIC8qKiBDdXN0b21FdmVudFRhcmdldCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50VGFyZ2V0KCkge1xuICAgICAgICBFdmVudFRhcmdldC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICB2YWx1ZTogQ3VzdG9tRXZlbnRUYXJnZXQsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBkZWZpbmVFdmVudEF0dHJpYnV0ZShDdXN0b21FdmVudFRhcmdldC5wcm90b3R5cGUsIGV2ZW50TmFtZXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21FdmVudFRhcmdldFxufVxuXG4vKipcbiAqIEV2ZW50VGFyZ2V0LlxuICpcbiAqIC0gVGhpcyBpcyBjb25zdHJ1Y3RvciBpZiBubyBhcmd1bWVudHMuXG4gKiAtIFRoaXMgaXMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgQ3VzdG9tRXZlbnRUYXJnZXQgY29uc3RydWN0b3IgaWYgdGhlcmUgYXJlIGFyZ3VtZW50cy5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgY2xhc3MgQSBleHRlbmRzIEV2ZW50VGFyZ2V0IHt9XG4gKiAgICAgY2xhc3MgQiBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiKSB7fVxuICogICAgIGNsYXNzIEMgZXh0ZW5kcyBFdmVudFRhcmdldChcIm1lc3NhZ2VcIiwgXCJlcnJvclwiKSB7fVxuICogICAgIGNsYXNzIEQgZXh0ZW5kcyBFdmVudFRhcmdldChbXCJtZXNzYWdlXCIsIFwiZXJyb3JcIl0pIHt9XG4gKi9cbmZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIGxpc3RlbmVyc01hcC5zZXQodGhpcywgbmV3IE1hcCgpKTtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoYXJndW1lbnRzWzBdKVxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQodHlwZXMpXG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIilcbiAgICAvKmVzbGludC1lbmFibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnaXZlbiBsaXN0ZW5lciB0byB0aGlzIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnx7Y2FwdHVyZT86Ym9vbGVhbixwYXNzaXZlPzpib29sZWFuLG9uY2U/OmJvb2xlYW59fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIgJiYgIWlzT2JqZWN0KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidsaXN0ZW5lcicgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBvcHRpb25zSXNPYmogPSBpc09iamVjdChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IG9wdGlvbnNJc09ialxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgICAgIGxpc3RlbmVyVHlwZSxcbiAgICAgICAgICAgIHBhc3NpdmU6IG9wdGlvbnNJc09iaiAmJiBCb29sZWFuKG9wdGlvbnMucGFzc2l2ZSksXG4gICAgICAgICAgICBvbmNlOiBvcHRpb25zSXNPYmogJiYgQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgaXQgYXMgdGhlIGZpcnN0IG5vZGUgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbnVsbC5cbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBuZXdOb2RlKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgY2hlY2tpbmcgZHVwbGljYXRpb24uLlxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyID09PSBsaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlID09PSBsaXN0ZW5lclR5cGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBpZ25vcmUgZHVwbGljYXRpb24uXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgaXQuXG4gICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBldmVudCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58e2NhcHR1cmU/OmJvb2xlYW4scGFzc2l2ZT86Ym9vbGVhbixvbmNlPzpib29sZWFufX0gW29wdGlvbnNdIFRoZSBvcHRpb25zIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBpc09iamVjdChvcHRpb25zKVxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgPT09IGxpc3RlbmVyVHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGdpdmVuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgZmFsc2VgIGlmIGNhbmNlbGVkLlxuICAgICAqL1xuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50ID09IG51bGwgfHwgdHlwZW9mIGV2ZW50LnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZXZlbnQudHlwZVwiIHNob3VsZCBiZSBhIHN0cmluZy4nKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbGlzdGVuZXJzIGFyZW4ndCByZWdpc3RlcmVkLCB0ZXJtaW5hdGUuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gZXZlbnQudHlwZTtcbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSB3ZSBjYW5ub3QgcmV3cml0ZSBzZXZlcmFsIHByb3BlcnRpZXMsIHNvIHdyYXAgb2JqZWN0LlxuICAgICAgICBjb25zdCB3cmFwcGVkRXZlbnQgPSB3cmFwRXZlbnQodGhpcywgZXZlbnQpO1xuXG4gICAgICAgIC8vIFRoaXMgZG9lc24ndCBwcm9jZXNzIGNhcHR1cmluZyBwaGFzZSBhbmQgYnViYmxpbmcgcGhhc2UuXG4gICAgICAgIC8vIFRoaXMgaXNuJ3QgcGFydGljaXBhdGluZyBpbiBhIHRyZWUuXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbGlzdGVuZXIgaWYgaXQncyBvbmNlXG4gICAgICAgICAgICBpZiAobm9kZS5vbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICAgIHNldFBhc3NpdmVMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgbm9kZS5wYXNzaXZlID8gbm9kZS5saXN0ZW5lciA6IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUubGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuY2FsbCh0aGlzLCB3cmFwcGVkRXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgIT09IEFUVFJJQlVURSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuaGFuZGxlRXZlbnQod3JhcHBlZEV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgaWYgYGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbmAgd2FzIGNhbGxlZC5cbiAgICAgICAgICAgIGlmIChpc1N0b3BwZWQod3JhcHBlZEV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UGFzc2l2ZUxpc3RlbmVyKHdyYXBwZWRFdmVudCwgbnVsbCk7XG4gICAgICAgIHNldEV2ZW50UGhhc2Uod3JhcHBlZEV2ZW50LCAwKTtcbiAgICAgICAgc2V0Q3VycmVudFRhcmdldCh3cmFwcGVkRXZlbnQsIG51bGwpO1xuXG4gICAgICAgIHJldHVybiAhd3JhcHBlZEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWRcbiAgICB9LFxufTtcblxuLy8gYGNvbnN0cnVjdG9yYCBpcyBub3QgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudFRhcmdldC5wcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG59KTtcblxuLy8gRW5zdXJlIGBldmVudFRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudFRhcmdldGAgaXMgYHRydWVgLlxuaWYgKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2Ygd2luZG93LkV2ZW50VGFyZ2V0ICE9PSBcInVuZGVmaW5lZFwiXG4pIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRUYXJnZXQ7XG5leHBvcnQgeyBkZWZpbmVFdmVudEF0dHJpYnV0ZSwgRXZlbnRUYXJnZXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZW50LXRhcmdldC1zaGltLm1qcy5tYXBcbiIsIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IEV2ZW50VGFyZ2V0LCBkZWZpbmVFdmVudEF0dHJpYnV0ZSB9IGZyb20gJ2V2ZW50LXRhcmdldC1zaGltJztcblxuLyoqXG4gKiBUaGUgc2lnbmFsIGNsYXNzLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2Fib3J0c2lnbmFsXG4gKi9cbmNsYXNzIEFib3J0U2lnbmFsIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBgQWJvcnRTaWduYWxgJ3MgYEFib3J0Q29udHJvbGxlcmAgaGFzIHNpZ25hbGVkIHRvIGFib3J0LCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZ2V0IGFib3J0ZWQoKSB7XG4gICAgICAgIGNvbnN0IGFib3J0ZWQgPSBhYm9ydGVkRmxhZ3MuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIGFib3J0ZWQgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0U2lnbmFsJyBvYmplY3QsIGJ1dCBnb3QgJHt0aGlzID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdGhpc31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWJvcnRlZDtcbiAgICB9XG59XG5kZWZpbmVFdmVudEF0dHJpYnV0ZShBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFwiYWJvcnRcIik7XG4vKipcbiAqIENyZWF0ZSBhbiBBYm9ydFNpZ25hbCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFib3J0U2lnbmFsKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IE9iamVjdC5jcmVhdGUoQWJvcnRTaWduYWwucHJvdG90eXBlKTtcbiAgICBFdmVudFRhcmdldC5jYWxsKHNpZ25hbCk7XG4gICAgYWJvcnRlZEZsYWdzLnNldChzaWduYWwsIGZhbHNlKTtcbiAgICByZXR1cm4gc2lnbmFsO1xufVxuLyoqXG4gKiBBYm9ydCBhIGdpdmVuIHNpZ25hbC5cbiAqL1xuZnVuY3Rpb24gYWJvcnRTaWduYWwoc2lnbmFsKSB7XG4gICAgaWYgKGFib3J0ZWRGbGFncy5nZXQoc2lnbmFsKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhYm9ydGVkRmxhZ3Muc2V0KHNpZ25hbCwgdHJ1ZSk7XG4gICAgc2lnbmFsLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiBcImFib3J0XCIgfSk7XG59XG4vKipcbiAqIEFib3J0ZWQgZmxhZyBmb3IgZWFjaCBpbnN0YW5jZXMuXG4gKi9cbmNvbnN0IGFib3J0ZWRGbGFncyA9IG5ldyBXZWFrTWFwKCk7XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRTaWduYWwucHJvdG90eXBlLCB7XG4gICAgYWJvcnRlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG59KTtcbi8vIGB0b1N0cmluZygpYCBzaG91bGQgcmV0dXJuIGBcIltvYmplY3QgQWJvcnRTaWduYWxdXCJgXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRTaWduYWwucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogXCJBYm9ydFNpZ25hbFwiLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoZSBBYm9ydENvbnRyb2xsZXIuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jYWJvcnRjb250cm9sbGVyXG4gKi9cbmNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHNpZ25hbHMuc2V0KHRoaXMsIGNyZWF0ZUFib3J0U2lnbmFsKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgQWJvcnRTaWduYWxgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNpZ25hbCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWJvcnQgYW5kIHNpZ25hbCB0byBhbnkgb2JzZXJ2ZXJzIHRoYXQgdGhlIGFzc29jaWF0ZWQgYWN0aXZpdHkgaXMgdG8gYmUgYWJvcnRlZC5cbiAgICAgKi9cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgYWJvcnRTaWduYWwoZ2V0U2lnbmFsKHRoaXMpKTtcbiAgICB9XG59XG4vKipcbiAqIEFzc29jaWF0ZWQgc2lnbmFscy5cbiAqL1xuY29uc3Qgc2lnbmFscyA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdldCB0aGUgYXNzb2NpYXRlZCBzaWduYWwgb2YgYSBnaXZlbiBjb250cm9sbGVyLlxuICovXG5mdW5jdGlvbiBnZXRTaWduYWwoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZ2V0KGNvbnRyb2xsZXIpO1xuICAgIGlmIChzaWduYWwgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0Q29udHJvbGxlcicgb2JqZWN0LCBidXQgZ290ICR7Y29udHJvbGxlciA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGNvbnRyb2xsZXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBzaWduYWw7XG59XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIHNpZ25hbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgYWJvcnQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxufSk7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFwiQWJvcnRDb250cm9sbGVyXCIsXG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCB7IEFib3J0Q29udHJvbGxlciwgQWJvcnRTaWduYWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFib3J0LWNvbnRyb2xsZXIubWpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZm9ybWF0LCBpbnNwZWN0LCBBZ2dyZWdhdGVFcnJvcjogQ3VzdG9tQWdncmVnYXRlRXJyb3IgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8qXG4gIFRoaXMgZmlsZSBpcyBhIHJlZHVjZWQgYW5kIGFkYXB0ZWQgdmVyc2lvbiBvZiB0aGUgbWFpbiBsaWIvaW50ZXJuYWwvZXJyb3JzLmpzIGZpbGUgZGVmaW5lZCBhdFxuXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21hc3Rlci9saWIvaW50ZXJuYWwvZXJyb3JzLmpzXG5cbiAgRG9uJ3QgdHJ5IHRvIHJlcGxhY2Ugd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSBhbmQga2VlcCBpdCB1cCB0byBkYXRlIChzdGFydGluZyBmcm9tIEUoLi4uKSBkZWZpbml0aW9ucylcbiAgd2l0aCB0aGUgdXBzdHJlYW0gZmlsZS5cbiovXG5cbmNvbnN0IEFnZ3JlZ2F0ZUVycm9yID0gZ2xvYmFsVGhpcy5BZ2dyZWdhdGVFcnJvciB8fCBDdXN0b21BZ2dyZWdhdGVFcnJvclxuY29uc3Qga0lzTm9kZUVycm9yID0gU3ltYm9sKCdrSXNOb2RlRXJyb3InKVxuY29uc3Qga1R5cGVzID0gW1xuICAnc3RyaW5nJyxcbiAgJ2Z1bmN0aW9uJyxcbiAgJ251bWJlcicsXG4gICdvYmplY3QnLFxuICAvLyBBY2NlcHQgJ0Z1bmN0aW9uJyBhbmQgJ09iamVjdCcgYXMgYWx0ZXJuYXRpdmUgdG8gdGhlIGxvd2VyIGNhc2VkIHZlcnNpb24uXG4gICdGdW5jdGlvbicsXG4gICdPYmplY3QnLFxuICAnYm9vbGVhbicsXG4gICdiaWdpbnQnLFxuICAnc3ltYm9sJ1xuXVxuY29uc3QgY2xhc3NSZWdFeHAgPSAvXihbQS1aXVthLXowLTldKikrJC9cbmNvbnN0IG5vZGVJbnRlcm5hbFByZWZpeCA9ICdfX25vZGVfaW50ZXJuYWxfJ1xuY29uc3QgY29kZXMgPSB7fVxuZnVuY3Rpb24gYXNzZXJ0KHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgY29kZXMuRVJSX0lOVEVSTkFMX0FTU0VSVElPTihtZXNzYWdlKVxuICB9XG59XG5cbi8vIE9ubHkgdXNlIHRoaXMgZm9yIGludGVnZXJzISBEZWNpbWFsIG51bWJlcnMgZG8gbm90IHdvcmsgd2l0aCB0aGlzIGZ1bmN0aW9uLlxuZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHZhbCkge1xuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSB2YWwubGVuZ3RoXG4gIGNvbnN0IHN0YXJ0ID0gdmFsWzBdID09PSAnLScgPyAxIDogMFxuICBmb3IgKDsgaSA+PSBzdGFydCArIDQ7IGkgLT0gMykge1xuICAgIHJlcyA9IGBfJHt2YWwuc2xpY2UoaSAtIDMsIGkpfSR7cmVzfWBcbiAgfVxuICByZXR1cm4gYCR7dmFsLnNsaWNlKDAsIGkpfSR7cmVzfWBcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoa2V5LCBtc2csIGFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBtc2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NlcnQoXG4gICAgICBtc2cubGVuZ3RoIDw9IGFyZ3MubGVuZ3RoLFxuICAgICAgLy8gRGVmYXVsdCBvcHRpb25zIGRvIG5vdCBjb3VudC5cbiAgICAgIGBDb2RlOiAke2tleX07IFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbGVuZ3RoICgke2FyZ3MubGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIG9uZXMgKCR7bXNnLmxlbmd0aH0pLmBcbiAgICApXG4gICAgcmV0dXJuIG1zZyguLi5hcmdzKVxuICB9XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gKG1zZy5tYXRjaCgvJVtkZmlqb09zXS9nKSB8fCBbXSkubGVuZ3RoXG4gIGFzc2VydChcbiAgICBleHBlY3RlZExlbmd0aCA9PT0gYXJncy5sZW5ndGgsXG4gICAgYENvZGU6ICR7a2V5fTsgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBsZW5ndGggKCR7YXJncy5sZW5ndGh9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgb25lcyAoJHtleHBlY3RlZExlbmd0aH0pLmBcbiAgKVxuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbXNnXG4gIH1cbiAgcmV0dXJuIGZvcm1hdChtc2csIC4uLmFyZ3MpXG59XG5mdW5jdGlvbiBFKGNvZGUsIG1lc3NhZ2UsIEJhc2UpIHtcbiAgaWYgKCFCYXNlKSB7XG4gICAgQmFzZSA9IEVycm9yXG4gIH1cbiAgY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgc3VwZXIoZ2V0TWVzc2FnZShjb2RlLCBtZXNzYWdlLCBhcmdzKSlcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtjb2RlfV06ICR7dGhpcy5tZXNzYWdlfWBcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTm9kZUVycm9yLnByb3RvdHlwZSwge1xuICAgIG5hbWU6IHtcbiAgICAgIHZhbHVlOiBCYXNlLm5hbWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSxcbiAgICB0b1N0cmluZzoge1xuICAgICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske2NvZGV9XTogJHt0aGlzLm1lc3NhZ2V9YFxuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pXG4gIE5vZGVFcnJvci5wcm90b3R5cGUuY29kZSA9IGNvZGVcbiAgTm9kZUVycm9yLnByb3RvdHlwZVtrSXNOb2RlRXJyb3JdID0gdHJ1ZVxuICBjb2Rlc1tjb2RlXSA9IE5vZGVFcnJvclxufVxuZnVuY3Rpb24gaGlkZVN0YWNrRnJhbWVzKGZuKSB7XG4gIC8vIFdlIHJlbmFtZSB0aGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBoaWRkZW4gdG8gY3V0IG9mZiB0aGUgc3RhY2t0cmFjZVxuICAvLyBhdCB0aGUgb3V0ZXJtb3N0IG9uZVxuICBjb25zdCBoaWRkZW4gPSBub2RlSW50ZXJuYWxQcmVmaXggKyBmbi5uYW1lXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7XG4gICAgdmFsdWU6IGhpZGRlblxuICB9KVxuICByZXR1cm4gZm5cbn1cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhpbm5lckVycm9yLCBvdXRlckVycm9yKSB7XG4gIGlmIChpbm5lckVycm9yICYmIG91dGVyRXJyb3IgJiYgaW5uZXJFcnJvciAhPT0gb3V0ZXJFcnJvcikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGVyRXJyb3IuZXJyb3JzKSkge1xuICAgICAgLy8gSWYgYG91dGVyRXJyb3JgIGlzIGFscmVhZHkgYW4gYEFnZ3JlZ2F0ZUVycm9yYC5cbiAgICAgIG91dGVyRXJyb3IuZXJyb3JzLnB1c2goaW5uZXJFcnJvcilcbiAgICAgIHJldHVybiBvdXRlckVycm9yXG4gICAgfVxuICAgIGNvbnN0IGVyciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihbb3V0ZXJFcnJvciwgaW5uZXJFcnJvcl0sIG91dGVyRXJyb3IubWVzc2FnZSlcbiAgICBlcnIuY29kZSA9IG91dGVyRXJyb3IuY29kZVxuICAgIHJldHVybiBlcnJcbiAgfVxuICByZXR1cm4gaW5uZXJFcnJvciB8fCBvdXRlckVycm9yXG59XG5jbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQnLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBjb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnb3B0aW9ucycsICdPYmplY3QnLCBvcHRpb25zKVxuICAgIH1cbiAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKVxuICAgIHRoaXMuY29kZSA9ICdBQk9SVF9FUlInXG4gICAgdGhpcy5uYW1lID0gJ0Fib3J0RXJyb3InXG4gIH1cbn1cbkUoJ0VSUl9BU1NFUlRJT04nLCAnJXMnLCBFcnJvcilcbkUoXG4gICdFUlJfSU5WQUxJRF9BUkdfVFlQRScsXG4gIChuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSA9PiB7XG4gICAgYXNzZXJ0KHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJywgXCInbmFtZScgbXVzdCBiZSBhIHN0cmluZ1wiKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICAgIGV4cGVjdGVkID0gW2V4cGVjdGVkXVxuICAgIH1cbiAgICBsZXQgbXNnID0gJ1RoZSAnXG4gICAgaWYgKG5hbWUuZW5kc1dpdGgoJyBhcmd1bWVudCcpKSB7XG4gICAgICAvLyBGb3IgY2FzZXMgbGlrZSAnZmlyc3QgYXJndW1lbnQnXG4gICAgICBtc2cgKz0gYCR7bmFtZX0gYFxuICAgIH0gZWxzZSB7XG4gICAgICBtc2cgKz0gYFwiJHtuYW1lfVwiICR7bmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCd9IGBcbiAgICB9XG4gICAgbXNnICs9ICdtdXN0IGJlICdcbiAgICBjb25zdCB0eXBlcyA9IFtdXG4gICAgY29uc3QgaW5zdGFuY2VzID0gW11cbiAgICBjb25zdCBvdGhlciA9IFtdXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBleHBlY3RlZCkge1xuICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsICdBbGwgZXhwZWN0ZWQgZW50cmllcyBoYXZlIHRvIGJlIG9mIHR5cGUgc3RyaW5nJylcbiAgICAgIGlmIChrVHlwZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIHR5cGVzLnB1c2godmFsdWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIH0gZWxzZSBpZiAoY2xhc3NSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgaW5zdGFuY2VzLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQodmFsdWUgIT09ICdvYmplY3QnLCAnVGhlIHZhbHVlIFwib2JqZWN0XCIgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgXCJPYmplY3RcIicpXG4gICAgICAgIG90aGVyLnB1c2godmFsdWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGUgYG9iamVjdGAgaW4gY2FzZSBvdGhlciBpbnN0YW5jZXMgYXJlIGFsbG93ZWQgdG8gb3V0bGluZVxuICAgIC8vIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVhY2ggb3RoZXIuXG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwb3MgPSB0eXBlcy5pbmRleE9mKCdvYmplY3QnKVxuICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgdHlwZXMuc3BsaWNlKHR5cGVzLCBwb3MsIDEpXG4gICAgICAgIGluc3RhbmNlcy5wdXNoKCdPYmplY3QnKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3dpdGNoICh0eXBlcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIG1zZyArPSBgb2YgdHlwZSAke3R5cGVzWzBdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbXNnICs9IGBvbmUgb2YgdHlwZSAke3R5cGVzWzBdfSBvciAke3R5cGVzWzFdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IHR5cGVzLnBvcCgpXG4gICAgICAgICAgbXNnICs9IGBvbmUgb2YgdHlwZSAke3R5cGVzLmpvaW4oJywgJyl9LCBvciAke2xhc3R9YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaW5zdGFuY2VzLmxlbmd0aCA+IDAgfHwgb3RoZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBtc2cgKz0gJyBvciAnXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3dpdGNoIChpbnN0YW5jZXMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBtc2cgKz0gYGFuIGluc3RhbmNlIG9mICR7aW5zdGFuY2VzWzBdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlc1swXX0gb3IgJHtpbnN0YW5jZXNbMV19YFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gaW5zdGFuY2VzLnBvcCgpXG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlcy5qb2luKCcsICcpfSwgb3IgJHtsYXN0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbXNnICs9ICcgb3IgJ1xuICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKG90aGVyLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAob3RoZXJbMF0udG9Mb3dlckNhc2UoKSAhPT0gb3RoZXJbMF0pIHtcbiAgICAgICAgICBtc2cgKz0gJ2FuICdcbiAgICAgICAgfVxuICAgICAgICBtc2cgKz0gYCR7b3RoZXJbMF19YFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICBtc2cgKz0gYG9uZSBvZiAke290aGVyWzBdfSBvciAke290aGVyWzFdfWBcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbGFzdCA9IG90aGVyLnBvcCgpXG4gICAgICAgIG1zZyArPSBgb25lIG9mICR7b3RoZXIuam9pbignLCAnKX0sIG9yICR7bGFzdH1gXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhY3R1YWwgPT0gbnVsbCkge1xuICAgICAgbXNnICs9IGAuIFJlY2VpdmVkICR7YWN0dWFsfWBcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgPT09ICdmdW5jdGlvbicgJiYgYWN0dWFsLm5hbWUpIHtcbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCBmdW5jdGlvbiAke2FjdHVhbC5uYW1lfWBcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2FjdHVhbCRjb25zdHJ1Y3RvclxuICAgICAgaWYgKFxuICAgICAgICAoX2FjdHVhbCRjb25zdHJ1Y3RvciA9IGFjdHVhbC5jb25zdHJ1Y3RvcikgIT09IG51bGwgJiZcbiAgICAgICAgX2FjdHVhbCRjb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9hY3R1YWwkY29uc3RydWN0b3IubmFtZVxuICAgICAgKSB7XG4gICAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCBhbiBpbnN0YW5jZSBvZiAke2FjdHVhbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluc3BlY3RlZCA9IGluc3BlY3QoYWN0dWFsLCB7XG4gICAgICAgICAgZGVwdGg6IC0xXG4gICAgICAgIH0pXG4gICAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCAke2luc3BlY3RlZH1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpbnNwZWN0ZWQgPSBpbnNwZWN0KGFjdHVhbCwge1xuICAgICAgICBjb2xvcnM6IGZhbHNlXG4gICAgICB9KVxuICAgICAgaWYgKGluc3BlY3RlZC5sZW5ndGggPiAyNSkge1xuICAgICAgICBpbnNwZWN0ZWQgPSBgJHtpbnNwZWN0ZWQuc2xpY2UoMCwgMjUpfS4uLmBcbiAgICAgIH1cbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGFjdHVhbH0gKCR7aW5zcGVjdGVkfSlgXG4gICAgfVxuICAgIHJldHVybiBtc2dcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX0lOVkFMSURfQVJHX1ZBTFVFJyxcbiAgKG5hbWUsIHZhbHVlLCByZWFzb24gPSAnaXMgaW52YWxpZCcpID0+IHtcbiAgICBsZXQgaW5zcGVjdGVkID0gaW5zcGVjdCh2YWx1ZSlcbiAgICBpZiAoaW5zcGVjdGVkLmxlbmd0aCA+IDEyOCkge1xuICAgICAgaW5zcGVjdGVkID0gaW5zcGVjdGVkLnNsaWNlKDAsIDEyOCkgKyAnLi4uJ1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gbmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCdcbiAgICByZXR1cm4gYFRoZSAke3R5cGV9ICcke25hbWV9JyAke3JlYXNvbn0uIFJlY2VpdmVkICR7aW5zcGVjdGVkfWBcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFJyxcbiAgKGlucHV0LCBuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIHZhciBfdmFsdWUkY29uc3RydWN0b3JcbiAgICBjb25zdCB0eXBlID1cbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX3ZhbHVlJGNvbnN0cnVjdG9yID0gdmFsdWUuY29uc3RydWN0b3IpICE9PSBudWxsICYmXG4gICAgICBfdmFsdWUkY29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgX3ZhbHVlJGNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgPyBgaW5zdGFuY2Ugb2YgJHt2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgOiBgdHlwZSAke3R5cGVvZiB2YWx1ZX1gXG4gICAgcmV0dXJuIGBFeHBlY3RlZCAke2lucHV0fSB0byBiZSByZXR1cm5lZCBmcm9tIHRoZSBcIiR7bmFtZX1cImAgKyBgIGZ1bmN0aW9uIGJ1dCBnb3QgJHt0eXBlfS5gXG4gIH0sXG4gIFR5cGVFcnJvclxuKVxuRShcbiAgJ0VSUl9NSVNTSU5HX0FSR1MnLFxuICAoLi4uYXJncykgPT4ge1xuICAgIGFzc2VydChhcmdzLmxlbmd0aCA+IDAsICdBdCBsZWFzdCBvbmUgYXJnIG5lZWRzIHRvIGJlIHNwZWNpZmllZCcpXG4gICAgbGV0IG1zZ1xuICAgIGNvbnN0IGxlbiA9IGFyZ3MubGVuZ3RoXG4gICAgYXJncyA9IChBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXSkubWFwKChhKSA9PiBgXCIke2F9XCJgKS5qb2luKCcgb3IgJylcbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3NbMF19IGFyZ3VtZW50YFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3NbMF19IGFuZCAke2FyZ3NbMV19IGFyZ3VtZW50c2BcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gYXJncy5wb3AoKVxuICAgICAgICAgIG1zZyArPSBgVGhlICR7YXJncy5qb2luKCcsICcpfSwgYW5kICR7bGFzdH0gYXJndW1lbnRzYFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIHJldHVybiBgJHttc2d9IG11c3QgYmUgc3BlY2lmaWVkYFxuICB9LFxuICBUeXBlRXJyb3JcbilcbkUoXG4gICdFUlJfT1VUX09GX1JBTkdFJyxcbiAgKHN0ciwgcmFuZ2UsIGlucHV0KSA9PiB7XG4gICAgYXNzZXJ0KHJhbmdlLCAnTWlzc2luZyBcInJhbmdlXCIgYXJndW1lbnQnKVxuICAgIGxldCByZWNlaXZlZFxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSAmJiBNYXRoLmFicyhpbnB1dCkgPiAyICoqIDMyKSB7XG4gICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihTdHJpbmcoaW5wdXQpKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpXG4gICAgICBpZiAoaW5wdXQgPiAybiAqKiAzMm4gfHwgaW5wdXQgPCAtKDJuICoqIDMybikpIHtcbiAgICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IocmVjZWl2ZWQpXG4gICAgICB9XG4gICAgICByZWNlaXZlZCArPSAnbidcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjZWl2ZWQgPSBpbnNwZWN0KGlucHV0KVxuICAgIH1cbiAgICByZXR1cm4gYFRoZSB2YWx1ZSBvZiBcIiR7c3RyfVwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSAke3JhbmdlfS4gUmVjZWl2ZWQgJHtyZWNlaXZlZH1gXG4gIH0sXG4gIFJhbmdlRXJyb3JcbilcbkUoJ0VSUl9NVUxUSVBMRV9DQUxMQkFDSycsICdDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnLCBFcnJvcilcbkUoJ0VSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEJywgJ1RoZSAlcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQnLCAnQ2Fubm90IGNhbGwgJXMgYWZ0ZXIgYSBzdHJlYW0gd2FzIGZpbmlzaGVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0NBTk5PVF9QSVBFJywgJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fREVTVFJPWUVEJywgJ0Nhbm5vdCBjYWxsICVzIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fTlVMTF9WQUxVRVMnLCAnTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nLCBUeXBlRXJyb3IpXG5FKCdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScsICdQcmVtYXR1cmUgY2xvc2UnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YnLCAnc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQnLCAnc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EJywgJ3dyaXRlIGFmdGVyIGVuZCcsIEVycm9yKVxuRSgnRVJSX1VOS05PV05fRU5DT0RJTkcnLCAnVW5rbm93biBlbmNvZGluZzogJXMnLCBUeXBlRXJyb3IpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQWJvcnRFcnJvcixcbiAgYWdncmVnYXRlVHdvRXJyb3JzOiBoaWRlU3RhY2tGcmFtZXMoYWdncmVnYXRlVHdvRXJyb3JzKSxcbiAgaGlkZVN0YWNrRnJhbWVzLFxuICBjb2Rlc1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgQXJyYXlJc0FycmF5LFxuICBBcnJheVByb3RvdHlwZUluY2x1ZGVzLFxuICBBcnJheVByb3RvdHlwZUpvaW4sXG4gIEFycmF5UHJvdG90eXBlTWFwLFxuICBOdW1iZXJJc0ludGVnZXIsXG4gIE51bWJlcklzTmFOLFxuICBOdW1iZXJNQVhfU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJNSU5fU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJQYXJzZUludCxcbiAgT2JqZWN0UHJvdG90eXBlSGFzT3duUHJvcGVydHksXG4gIFJlZ0V4cFByb3RvdHlwZUV4ZWMsXG4gIFN0cmluZyxcbiAgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2UsXG4gIFN0cmluZ1Byb3RvdHlwZVRyaW1cbn0gPSByZXF1aXJlKCcuLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHtcbiAgaGlkZVN0YWNrRnJhbWVzLFxuICBjb2RlczogeyBFUlJfU09DS0VUX0JBRF9QT1JULCBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX0lOVkFMSURfQVJHX1ZBTFVFLCBFUlJfT1VUX09GX1JBTkdFLCBFUlJfVU5LTk9XTl9TSUdOQUwgfVxufSA9IHJlcXVpcmUoJy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgbm9ybWFsaXplRW5jb2RpbmcgfSA9IHJlcXVpcmUoJy4uL291cnMvdXRpbCcpXG5jb25zdCB7IGlzQXN5bmNGdW5jdGlvbiwgaXNBcnJheUJ1ZmZlclZpZXcgfSA9IHJlcXVpcmUoJy4uL291cnMvdXRpbCcpLnR5cGVzXG5jb25zdCBzaWduYWxzID0ge31cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNJbnQzMih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09ICh2YWx1ZSB8IDApXG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVWludDMyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPj4+IDBcbn1cbmNvbnN0IG9jdGFsUmVnID0gL15bMC03XSskL1xuY29uc3QgbW9kZURlc2MgPSAnbXVzdCBiZSBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIG9yIGFuIG9jdGFsIHN0cmluZydcblxuLyoqXG4gKiBQYXJzZSBhbmQgdmFsaWRhdGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBtb2RlX3QgKHRoZSBTXypcbiAqIGNvbnN0YW50cykuIE9ubHkgdmFsaWQgbnVtYmVycyBhbmQgb2N0YWwgc3RyaW5ncyBhcmUgYWxsb3dlZC4gVGhleSBjb3VsZCBiZVxuICogY29udmVydGVkIHRvIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycyBvciBub24tbmVnYXRpdmUgc2lnbmVkIGludGVnZXJzIGluIHRoZVxuICogQysrIGxhbmQsIGJ1dCBhbnkgdmFsdWUgaGlnaGVyIHRoYW4gMG83Nzcgd2lsbCByZXN1bHQgaW4gcGxhdGZvcm0tc3BlY2lmaWNcbiAqIGJlaGF2aW9ycy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGFyZ3VtZW50XG4gKiBAcGFyYW0ge251bWJlcn0gW2RlZl0gSWYgc3BlY2lmaWVkLCB3aWxsIGJlIHJldHVybmVkIGZvciBpbnZhbGlkIHZhbHVlc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gcGFyc2VGaWxlTW9kZSh2YWx1ZSwgbmFtZSwgZGVmKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFsdWUgPSBkZWZcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChSZWdFeHBQcm90b3R5cGVFeGVjKG9jdGFsUmVnLCB2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUobmFtZSwgdmFsdWUsIG1vZGVEZXNjKVxuICAgIH1cbiAgICB2YWx1ZSA9IE51bWJlclBhcnNlSW50KHZhbHVlLCA4KVxuICB9XG4gIHZhbGlkYXRlVWludDMyKHZhbHVlLCBuYW1lKVxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVJbnRlZ2VyXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IFttaW5dXG4gKiBAcGFyYW0ge251bWJlcn0gW21heF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIG51bWJlcn1cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlSW50ZWdlcn0gKi9cbmNvbnN0IHZhbGlkYXRlSW50ZWdlciA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbiA9IE51bWJlck1JTl9TQUZFX0lOVEVHRVIsIG1heCA9IE51bWJlck1BWF9TQUZFX0lOVEVHRVIpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIGlmICghTnVtYmVySXNJbnRlZ2VyKHZhbHVlKSkgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShuYW1lLCBgPj0gJHttaW59ICYmIDw9ICR7bWF4fWAsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVJbnQzMlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluXVxuICogQHBhcmFtIHtudW1iZXJ9IFttYXhdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUludDMyfSAqL1xuY29uc3QgdmFsaWRhdGVJbnQzMiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbiA9IC0yMTQ3NDgzNjQ4LCBtYXggPSAyMTQ3NDgzNjQ3KSA9PiB7XG4gIC8vIFRoZSBkZWZhdWx0cyBmb3IgbWluIGFuZCBtYXggY29ycmVzcG9uZCB0byB0aGUgbGltaXRzIG9mIDMyLWJpdCBpbnRlZ2Vycy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG4gIGlmICghTnVtYmVySXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsICdhbiBpbnRlZ2VyJywgdmFsdWUpXG4gIH1cbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgYD49ICR7bWlufSAmJiA8PSAke21heH1gLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVVaW50MzJcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge251bWJlcnxib29sZWFufSBbcG9zaXRpdmU9ZmFsc2VdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVVpbnQzMn0gKi9cbmNvbnN0IHZhbGlkYXRlVWludDMyID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSwgcG9zaXRpdmUgPSBmYWxzZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIH1cbiAgaWYgKCFOdW1iZXJJc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgfVxuICBjb25zdCBtaW4gPSBwb3NpdGl2ZSA/IDEgOiAwXG4gIC8vIDIgKiogMzIgPT09IDQyOTQ5NjcyOTZcbiAgY29uc3QgbWF4ID0gNDI5NDk2NzI5NVxuICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShuYW1lLCBgPj0gJHttaW59ICYmIDw9ICR7bWF4fWAsIHZhbHVlKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZVN0cmluZ1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIHN0cmluZ31cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlU3RyaW5nfSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnc3RyaW5nJywgdmFsdWUpXG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlTnVtYmVyXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IFttaW5dXG4gKiBAcGFyYW0ge251bWJlcn0gW21heF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIG51bWJlcn1cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlTnVtYmVyfSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIodmFsdWUsIG5hbWUsIG1pbiA9IHVuZGVmaW5lZCwgbWF4KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICBpZiAoXG4gICAgKG1pbiAhPSBudWxsICYmIHZhbHVlIDwgbWluKSB8fFxuICAgIChtYXggIT0gbnVsbCAmJiB2YWx1ZSA+IG1heCkgfHxcbiAgICAoKG1pbiAhPSBudWxsIHx8IG1heCAhPSBudWxsKSAmJiBOdW1iZXJJc05hTih2YWx1ZSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKFxuICAgICAgbmFtZSxcbiAgICAgIGAke21pbiAhPSBudWxsID8gYD49ICR7bWlufWAgOiAnJ30ke21pbiAhPSBudWxsICYmIG1heCAhPSBudWxsID8gJyAmJiAnIDogJyd9JHttYXggIT0gbnVsbCA/IGA8PSAke21heH1gIDogJyd9YCxcbiAgICAgIHZhbHVlXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlT25lT2ZcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtUW119IG9uZU9mXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZU9uZU9mfSAqL1xuY29uc3QgdmFsaWRhdGVPbmVPZiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG9uZU9mKSA9PiB7XG4gIGlmICghQXJyYXlQcm90b3R5cGVJbmNsdWRlcyhvbmVPZiwgdmFsdWUpKSB7XG4gICAgY29uc3QgYWxsb3dlZCA9IEFycmF5UHJvdG90eXBlSm9pbihcbiAgICAgIEFycmF5UHJvdG90eXBlTWFwKG9uZU9mLCAodikgPT4gKHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IGAnJHt2fSdgIDogU3RyaW5nKHYpKSksXG4gICAgICAnLCAnXG4gICAgKVxuICAgIGNvbnN0IHJlYXNvbiA9ICdtdXN0IGJlIG9uZSBvZjogJyArIGFsbG93ZWRcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKG5hbWUsIHZhbHVlLCByZWFzb24pXG4gIH1cbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlQm9vbGVhblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIGJvb2xlYW59XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUJvb2xlYW59ICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJvb2xlYW4odmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ2Jvb2xlYW4nLCB2YWx1ZSlcbn1cbmZ1bmN0aW9uIGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIG9wdGlvbnMgPT0gbnVsbCB8fCAhT2JqZWN0UHJvdG90eXBlSGFzT3duUHJvcGVydHkob3B0aW9ucywga2V5KSA/IGRlZmF1bHRWYWx1ZSA6IG9wdGlvbnNba2V5XVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZU9iamVjdFxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7e1xuICogICBhbGxvd0FycmF5PzogYm9vbGVhbixcbiAqICAgYWxsb3dGdW5jdGlvbj86IGJvb2xlYW4sXG4gKiAgIG51bGxhYmxlPzogYm9vbGVhblxuICogfX0gW29wdGlvbnNdXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZU9iamVjdH0gKi9cbmNvbnN0IHZhbGlkYXRlT2JqZWN0ID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSwgb3B0aW9ucyA9IG51bGwpID0+IHtcbiAgY29uc3QgYWxsb3dBcnJheSA9IGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywgJ2FsbG93QXJyYXknLCBmYWxzZSlcbiAgY29uc3QgYWxsb3dGdW5jdGlvbiA9IGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywgJ2FsbG93RnVuY3Rpb24nLCBmYWxzZSlcbiAgY29uc3QgbnVsbGFibGUgPSBnZXRPd25Qcm9wZXJ0eVZhbHVlT3JEZWZhdWx0KG9wdGlvbnMsICdudWxsYWJsZScsIGZhbHNlKVxuICBpZiAoXG4gICAgKCFudWxsYWJsZSAmJiB2YWx1ZSA9PT0gbnVsbCkgfHxcbiAgICAoIWFsbG93QXJyYXkgJiYgQXJyYXlJc0FycmF5KHZhbHVlKSkgfHxcbiAgICAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiAoIWFsbG93RnVuY3Rpb24gfHwgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdPYmplY3QnLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVBcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluTGVuZ3RoXVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgYW55W119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFycmF5fSAqL1xuY29uc3QgdmFsaWRhdGVBcnJheSA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbkxlbmd0aCA9IDApID0+IHtcbiAgaWYgKCFBcnJheUlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBcnJheScsIHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZS5sZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICBjb25zdCByZWFzb24gPSBgbXVzdCBiZSBsb25nZXIgdGhhbiAke21pbkxlbmd0aH1gXG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShuYW1lLCB2YWx1ZSwgcmVhc29uKVxuICB9XG59KVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrXG4vKipcbiAqIEBwYXJhbSB7Kn0gc2lnbmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J3NpZ25hbCddXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzaWduYWwgaXMga2V5b2Ygc2lnbmFsc31cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTaWduYWxOYW1lKHNpZ25hbCwgbmFtZSA9ICdzaWduYWwnKSB7XG4gIHZhbGlkYXRlU3RyaW5nKHNpZ25hbCwgbmFtZSlcbiAgaWYgKHNpZ25hbHNbc2lnbmFsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNpZ25hbHNbU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2Uoc2lnbmFsKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVSUl9VTktOT1dOX1NJR05BTChzaWduYWwgKyAnIChzaWduYWxzIG11c3QgdXNlIGFsbCBjYXBpdGFsIGxldHRlcnMpJylcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVSUl9VTktOT1dOX1NJR05BTChzaWduYWwpXG4gIH1cbn1cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVCdWZmZXJcbiAqIEBwYXJhbSB7Kn0gYnVmZmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J2J1ZmZlciddXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBidWZmZXIgaXMgQXJyYXlCdWZmZXJWaWV3fVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVCdWZmZXJ9ICovXG5jb25zdCB2YWxpZGF0ZUJ1ZmZlciA9IGhpZGVTdGFja0ZyYW1lcygoYnVmZmVyLCBuYW1lID0gJ2J1ZmZlcicpID0+IHtcbiAgaWYgKCFpc0FycmF5QnVmZmVyVmlldyhidWZmZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsIFsnQnVmZmVyJywgJ1R5cGVkQXJyYXknLCAnRGF0YVZpZXcnXSwgYnVmZmVyKVxuICB9XG59KVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFbmNvZGluZyhkYXRhLCBlbmNvZGluZykge1xuICBjb25zdCBub3JtYWxpemVkRW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZylcbiAgY29uc3QgbGVuZ3RoID0gZGF0YS5sZW5ndGhcbiAgaWYgKG5vcm1hbGl6ZWRFbmNvZGluZyA9PT0gJ2hleCcgJiYgbGVuZ3RoICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoJ2VuY29kaW5nJywgZW5jb2RpbmcsIGBpcyBpbnZhbGlkIGZvciBkYXRhIG9mIGxlbmd0aCAke2xlbmd0aH1gKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgcG9ydCBudW1iZXIgaXMgbm90IE5hTiB3aGVuIGNvZXJjZWQgdG8gYSBudW1iZXIsXG4gKiBpcyBhbiBpbnRlZ2VyIGFuZCB0aGF0IGl0IGZhbGxzIHdpdGhpbiB0aGUgbGVnYWwgcmFuZ2Ugb2YgcG9ydCBudW1iZXJzLlxuICogQHBhcmFtIHsqfSBwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J1BvcnQnXVxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3daZXJvPXRydWVdXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVBvcnQocG9ydCwgbmFtZSA9ICdQb3J0JywgYWxsb3daZXJvID0gdHJ1ZSkge1xuICBpZiAoXG4gICAgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgcG9ydCAhPT0gJ3N0cmluZycpIHx8XG4gICAgKHR5cGVvZiBwb3J0ID09PSAnc3RyaW5nJyAmJiBTdHJpbmdQcm90b3R5cGVUcmltKHBvcnQpLmxlbmd0aCA9PT0gMCkgfHxcbiAgICArcG9ydCAhPT0gK3BvcnQgPj4+IDAgfHxcbiAgICBwb3J0ID4gMHhmZmZmIHx8XG4gICAgKHBvcnQgPT09IDAgJiYgIWFsbG93WmVybylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9TT0NLRVRfQkFEX1BPUlQobmFtZSwgcG9ydCwgYWxsb3daZXJvKVxuICB9XG4gIHJldHVybiBwb3J0IHwgMFxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUFib3J0U2lnbmFsXG4gKiBAcGFyYW0geyp9IHNpZ25hbFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlQWJvcnRTaWduYWx9ICovXG5jb25zdCB2YWxpZGF0ZUFib3J0U2lnbmFsID0gaGlkZVN0YWNrRnJhbWVzKChzaWduYWwsIG5hbWUpID0+IHtcbiAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmIChzaWduYWwgPT09IG51bGwgfHwgdHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUZ1bmN0aW9ufSAqL1xuY29uc3QgdmFsaWRhdGVGdW5jdGlvbiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdGdW5jdGlvbicsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVQbGFpbkZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVBsYWluRnVuY3Rpb259ICovXG5jb25zdCB2YWxpZGF0ZVBsYWluRnVuY3Rpb24gPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgfHwgaXNBc3luY0Z1bmN0aW9uKHZhbHVlKSkgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdGdW5jdGlvbicsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVVbmRlZmluZWRcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVVuZGVmaW5lZH0gKi9cbmNvbnN0IHZhbGlkYXRlVW5kZWZpbmVkID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICd1bmRlZmluZWQnLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1RbXX0gdW5pb25cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVVbmlvbih2YWx1ZSwgbmFtZSwgdW5pb24pIHtcbiAgaWYgKCFBcnJheVByb3RvdHlwZUluY2x1ZGVzKHVuaW9uLCB2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgYCgnJHtBcnJheVByb3RvdHlwZUpvaW4odW5pb24sICd8Jyl9JylgLCB2YWx1ZSlcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzSW50MzIsXG4gIGlzVWludDMyLFxuICBwYXJzZUZpbGVNb2RlLFxuICB2YWxpZGF0ZUFycmF5LFxuICB2YWxpZGF0ZUJvb2xlYW4sXG4gIHZhbGlkYXRlQnVmZmVyLFxuICB2YWxpZGF0ZUVuY29kaW5nLFxuICB2YWxpZGF0ZUZ1bmN0aW9uLFxuICB2YWxpZGF0ZUludDMyLFxuICB2YWxpZGF0ZUludGVnZXIsXG4gIHZhbGlkYXRlTnVtYmVyLFxuICB2YWxpZGF0ZU9iamVjdCxcbiAgdmFsaWRhdGVPbmVPZixcbiAgdmFsaWRhdGVQbGFpbkZ1bmN0aW9uLFxuICB2YWxpZGF0ZVBvcnQsXG4gIHZhbGlkYXRlU2lnbmFsTmFtZSxcbiAgdmFsaWRhdGVTdHJpbmcsXG4gIHZhbGlkYXRlVWludDMyLFxuICB2YWxpZGF0ZVVuZGVmaW5lZCxcbiAgdmFsaWRhdGVVbmlvbixcbiAgdmFsaWRhdGVBYm9ydFNpZ25hbFxufVxuIiwiLy8gZm9yIG5vdyBqdXN0IGV4cG9zZSB0aGUgYnVpbHRpbiBwcm9jZXNzIGdsb2JhbCBmcm9tIG5vZGUuanNcbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLnByb2Nlc3M7XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBTeW1ib2wsIFN5bWJvbEFzeW5jSXRlcmF0b3IsIFN5bWJvbEl0ZXJhdG9yIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IGtEZXN0cm95ZWQgPSBTeW1ib2woJ2tEZXN0cm95ZWQnKVxuY29uc3Qga0lzRXJyb3JlZCA9IFN5bWJvbCgna0lzRXJyb3JlZCcpXG5jb25zdCBrSXNSZWFkYWJsZSA9IFN5bWJvbCgna0lzUmVhZGFibGUnKVxuY29uc3Qga0lzRGlzdHVyYmVkID0gU3ltYm9sKCdrSXNEaXN0dXJiZWQnKVxuZnVuY3Rpb24gaXNSZWFkYWJsZU5vZGVTdHJlYW0ob2JqLCBzdHJpY3QgPSBmYWxzZSkge1xuICB2YXIgX29iaiRfcmVhZGFibGVTdGF0ZVxuICByZXR1cm4gISEoXG4gICAgKFxuICAgICAgb2JqICYmXG4gICAgICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICghc3RyaWN0IHx8ICh0eXBlb2Ygb2JqLnBhdXNlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmoucmVzdW1lID09PSAnZnVuY3Rpb24nKSkgJiZcbiAgICAgICghb2JqLl93cml0YWJsZVN0YXRlIHx8XG4gICAgICAgICgoX29iaiRfcmVhZGFibGVTdGF0ZSA9IG9iai5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX29iaiRfcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IF9vYmokX3JlYWRhYmxlU3RhdGUucmVhZGFibGUpICE9PSBmYWxzZSkgJiZcbiAgICAgIC8vIER1cGxleFxuICAgICAgKCFvYmouX3dyaXRhYmxlU3RhdGUgfHwgb2JqLl9yZWFkYWJsZVN0YXRlKVxuICAgICkgLy8gV3JpdGFibGUgaGFzIC5waXBlLlxuICApXG59XG5cbmZ1bmN0aW9uIGlzV3JpdGFibGVOb2RlU3RyZWFtKG9iaikge1xuICB2YXIgX29iaiRfd3JpdGFibGVTdGF0ZVxuICByZXR1cm4gISEoXG4gICAgKFxuICAgICAgb2JqICYmXG4gICAgICB0eXBlb2Ygb2JqLndyaXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoIW9iai5fcmVhZGFibGVTdGF0ZSB8fFxuICAgICAgICAoKF9vYmokX3dyaXRhYmxlU3RhdGUgPSBvYmouX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9vYmokX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBfb2JqJF93cml0YWJsZVN0YXRlLndyaXRhYmxlKSAhPT0gZmFsc2UpXG4gICAgKSAvLyBEdXBsZXhcbiAgKVxufVxuXG5mdW5jdGlvbiBpc0R1cGxleE5vZGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAhIShcbiAgICBvYmogJiZcbiAgICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICBvYmouX3JlYWRhYmxlU3RhdGUgJiZcbiAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5mdW5jdGlvbiBpc05vZGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAoXG4gICAgb2JqICYmXG4gICAgKG9iai5fcmVhZGFibGVTdGF0ZSB8fFxuICAgICAgb2JqLl93cml0YWJsZVN0YXRlIHx8XG4gICAgICAodHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgKHR5cGVvZiBvYmoucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nKSlcbiAgKVxufVxuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmosIGlzQXN5bmMpIHtcbiAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKGlzQXN5bmMgPT09IHRydWUpIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG4gIGlmIChpc0FzeW5jID09PSBmYWxzZSkgcmV0dXJuIHR5cGVvZiBvYmpbU3ltYm9sSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG4gIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG59XG5mdW5jdGlvbiBpc0Rlc3Ryb3llZChzdHJlYW0pIHtcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCBzdGF0ZSA9IHdTdGF0ZSB8fCByU3RhdGVcbiAgcmV0dXJuICEhKHN0cmVhbS5kZXN0cm95ZWQgfHwgc3RyZWFtW2tEZXN0cm95ZWRdIHx8IChzdGF0ZSAhPT0gbnVsbCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLmRlc3Ryb3llZCkpXG59XG5cbi8vIEhhdmUgYmVlbiBlbmQoKTpkLlxuZnVuY3Rpb24gaXNXcml0YWJsZUVuZGVkKHN0cmVhbSkge1xuICBpZiAoIWlzV3JpdGFibGVOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGlmIChzdHJlYW0ud3JpdGFibGVFbmRlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWVcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICh3U3RhdGUgIT09IG51bGwgJiYgd1N0YXRlICE9PSB1bmRlZmluZWQgJiYgd1N0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuZW5kZWQpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIHJldHVybiB3U3RhdGUuZW5kZWRcbn1cblxuLy8gSGF2ZSBlbWl0dGVkICdmaW5pc2gnLlxuZnVuY3Rpb24gaXNXcml0YWJsZUZpbmlzaGVkKHN0cmVhbSwgc3RyaWN0KSB7XG4gIGlmICghaXNXcml0YWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS53cml0YWJsZUZpbmlzaGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHdTdGF0ZSAhPT0gbnVsbCAmJiB3U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB3U3RhdGUuZXJyb3JlZCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5maW5pc2hlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuICEhKHdTdGF0ZS5maW5pc2hlZCB8fCAoc3RyaWN0ID09PSBmYWxzZSAmJiB3U3RhdGUuZW5kZWQgPT09IHRydWUgJiYgd1N0YXRlLmxlbmd0aCA9PT0gMCkpXG59XG5cbi8vIEhhdmUgYmVlbiBwdXNoKG51bGwpOmQuXG5mdW5jdGlvbiBpc1JlYWRhYmxlRW5kZWQoc3RyZWFtKSB7XG4gIGlmICghaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS5yZWFkYWJsZUVuZGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuZW5kZWQpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIHJldHVybiByU3RhdGUuZW5kZWRcbn1cblxuLy8gSGF2ZSBlbWl0dGVkICdlbmQnLlxuZnVuY3Rpb24gaXNSZWFkYWJsZUZpbmlzaGVkKHN0cmVhbSwgc3RyaWN0KSB7XG4gIGlmICghaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChyU3RhdGUgIT09IG51bGwgJiYgclN0YXRlICE9PSB1bmRlZmluZWQgJiYgclN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuZW5kRW1pdHRlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuICEhKHJTdGF0ZS5lbmRFbWl0dGVkIHx8IChzdHJpY3QgPT09IGZhbHNlICYmIHJTdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiByU3RhdGUubGVuZ3RoID09PSAwKSlcbn1cbmZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyZWFtKSB7XG4gIGlmIChzdHJlYW0gJiYgc3RyZWFtW2tJc1JlYWRhYmxlXSAhPSBudWxsKSByZXR1cm4gc3RyZWFtW2tJc1JlYWRhYmxlXVxuICBpZiAodHlwZW9mIChzdHJlYW0gPT09IG51bGwgfHwgc3RyZWFtID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzdHJlYW0ucmVhZGFibGUpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIGlmIChpc0Rlc3Ryb3llZChzdHJlYW0pKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGlzUmVhZGFibGVOb2RlU3RyZWFtKHN0cmVhbSkgJiYgc3RyZWFtLnJlYWRhYmxlICYmICFpc1JlYWRhYmxlRmluaXNoZWQoc3RyZWFtKVxufVxuZnVuY3Rpb24gaXNXcml0YWJsZShzdHJlYW0pIHtcbiAgaWYgKHR5cGVvZiAoc3RyZWFtID09PSBudWxsIHx8IHN0cmVhbSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc3RyZWFtLndyaXRhYmxlKSAhPT0gJ2Jvb2xlYW4nKSByZXR1cm4gbnVsbFxuICBpZiAoaXNEZXN0cm95ZWQoc3RyZWFtKSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pICYmIHN0cmVhbS53cml0YWJsZSAmJiAhaXNXcml0YWJsZUVuZGVkKHN0cmVhbSlcbn1cbmZ1bmN0aW9uIGlzRmluaXNoZWQoc3RyZWFtLCBvcHRzKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChpc0Rlc3Ryb3llZChzdHJlYW0pKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0cy5yZWFkYWJsZSkgIT09IGZhbHNlICYmIGlzUmVhZGFibGUoc3RyZWFtKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGlmICgob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLndyaXRhYmxlKSAhPT0gZmFsc2UgJiYgaXNXcml0YWJsZShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cbmZ1bmN0aW9uIGlzV3JpdGFibGVFcnJvcmVkKHN0cmVhbSkge1xuICB2YXIgX3N0cmVhbSRfd3JpdGFibGVTdGF0LCBfc3RyZWFtJF93cml0YWJsZVN0YXQyXG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChzdHJlYW0ud3JpdGFibGVFcnJvcmVkKSB7XG4gICAgcmV0dXJuIHN0cmVhbS53cml0YWJsZUVycm9yZWRcbiAgfVxuICByZXR1cm4gKF9zdHJlYW0kX3dyaXRhYmxlU3RhdCA9XG4gICAgKF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogX3N0cmVhbSRfd3JpdGFibGVTdGF0Mi5lcnJvcmVkKSAhPT0gbnVsbCAmJiBfc3RyZWFtJF93cml0YWJsZVN0YXQgIT09IHVuZGVmaW5lZFxuICAgID8gX3N0cmVhbSRfd3JpdGFibGVTdGF0XG4gICAgOiBudWxsXG59XG5mdW5jdGlvbiBpc1JlYWRhYmxlRXJyb3JlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0kX3JlYWRhYmxlU3RhdCwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MlxuICBpZiAoIWlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAoc3RyZWFtLnJlYWRhYmxlRXJyb3JlZCkge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZGFibGVFcnJvcmVkXG4gIH1cbiAgcmV0dXJuIChfc3RyZWFtJF9yZWFkYWJsZVN0YXQgPVxuICAgIChfc3RyZWFtJF9yZWFkYWJsZVN0YXQyID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF9yZWFkYWJsZVN0YXQyID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3JlYWRhYmxlU3RhdDIuZXJyb3JlZCkgIT09IG51bGwgJiYgX3N0cmVhbSRfcmVhZGFibGVTdGF0ICE9PSB1bmRlZmluZWRcbiAgICA/IF9zdHJlYW0kX3JlYWRhYmxlU3RhdFxuICAgIDogbnVsbFxufVxuZnVuY3Rpb24gaXNDbG9zZWQoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtLmNsb3NlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5jbG9zZWRcbiAgfVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChcbiAgICB0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5jbG9zZWQpID09PSAnYm9vbGVhbicgfHxcbiAgICB0eXBlb2YgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5jbG9zZWQpID09PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuY2xvc2VkKSB8fFxuICAgICAgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5jbG9zZWQpXG4gICAgKVxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtLl9jbG9zZWQgPT09ICdib29sZWFuJyAmJiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5fY2xvc2VkXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbmZ1bmN0aW9uIGlzT3V0Z29pbmdNZXNzYWdlKHN0cmVhbSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBzdHJlYW0uX2Nsb3NlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fZGVmYXVsdEtlZXBBbGl2ZSA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fcmVtb3ZlZENvbm5lY3Rpb24gPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0uX3JlbW92ZWRDb250TGVuID09PSAnYm9vbGVhbidcbiAgKVxufVxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXNwb25zZShzdHJlYW0pIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHJlYW0uX3NlbnQxMDAgPT09ICdib29sZWFuJyAmJiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pXG59XG5mdW5jdGlvbiBpc1NlcnZlclJlcXVlc3Qoc3RyZWFtKSB7XG4gIHZhciBfc3RyZWFtJHJlcVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiBzdHJlYW0uX2NvbnN1bWluZyA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fZHVtcGVkID09PSAnYm9vbGVhbicgJiZcbiAgICAoKF9zdHJlYW0kcmVxID0gc3RyZWFtLnJlcSkgPT09IG51bGwgfHwgX3N0cmVhbSRyZXEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9zdHJlYW0kcmVxLnVwZ3JhZGVPckNvbm5lY3QpID09PVxuICAgICAgdW5kZWZpbmVkXG4gIClcbn1cbmZ1bmN0aW9uIHdpbGxFbWl0Q2xvc2Uoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGNvbnN0IHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgc3RhdGUgPSB3U3RhdGUgfHwgclN0YXRlXG4gIHJldHVybiAoXG4gICAgKCFzdGF0ZSAmJiBpc1NlcnZlclJlc3BvbnNlKHN0cmVhbSkpIHx8ICEhKHN0YXRlICYmIHN0YXRlLmF1dG9EZXN0cm95ICYmIHN0YXRlLmVtaXRDbG9zZSAmJiBzdGF0ZS5jbG9zZWQgPT09IGZhbHNlKVxuICApXG59XG5mdW5jdGlvbiBpc0Rpc3R1cmJlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0ka0lzRGlzdHVyYmVkXG4gIHJldHVybiAhIShcbiAgICBzdHJlYW0gJiZcbiAgICAoKF9zdHJlYW0ka0lzRGlzdHVyYmVkID0gc3RyZWFtW2tJc0Rpc3R1cmJlZF0pICE9PSBudWxsICYmIF9zdHJlYW0ka0lzRGlzdHVyYmVkICE9PSB1bmRlZmluZWRcbiAgICAgID8gX3N0cmVhbSRrSXNEaXN0dXJiZWRcbiAgICAgIDogc3RyZWFtLnJlYWRhYmxlRGlkUmVhZCB8fCBzdHJlYW0ucmVhZGFibGVBYm9ydGVkKVxuICApXG59XG5mdW5jdGlvbiBpc0Vycm9yZWQoc3RyZWFtKSB7XG4gIHZhciBfcmVmLFxuICAgIF9yZWYyLFxuICAgIF9yZWYzLFxuICAgIF9yZWY0LFxuICAgIF9yZWY1LFxuICAgIF9zdHJlYW0ka0lzRXJyb3JlZCxcbiAgICBfc3RyZWFtJF9yZWFkYWJsZVN0YXQzLFxuICAgIF9zdHJlYW0kX3dyaXRhYmxlU3RhdDMsXG4gICAgX3N0cmVhbSRfcmVhZGFibGVTdGF0NCxcbiAgICBfc3RyZWFtJF93cml0YWJsZVN0YXQ0XG4gIHJldHVybiAhIShcbiAgICBzdHJlYW0gJiZcbiAgICAoKF9yZWYgPVxuICAgICAgKF9yZWYyID1cbiAgICAgICAgKF9yZWYzID1cbiAgICAgICAgICAoX3JlZjQgPVxuICAgICAgICAgICAgKF9yZWY1ID1cbiAgICAgICAgICAgICAgKF9zdHJlYW0ka0lzRXJyb3JlZCA9IHN0cmVhbVtrSXNFcnJvcmVkXSkgIT09IG51bGwgJiYgX3N0cmVhbSRrSXNFcnJvcmVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IF9zdHJlYW0ka0lzRXJyb3JlZFxuICAgICAgICAgICAgICAgIDogc3RyZWFtLnJlYWRhYmxlRXJyb3JlZCkgIT09IG51bGwgJiYgX3JlZjUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IF9yZWY1XG4gICAgICAgICAgICAgIDogc3RyZWFtLndyaXRhYmxlRXJyb3JlZCkgIT09IG51bGwgJiYgX3JlZjQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBfcmVmNFxuICAgICAgICAgICAgOiAoX3N0cmVhbSRfcmVhZGFibGVTdGF0MyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQzLmVycm9yRW1pdHRlZCkgIT09IG51bGwgJiYgX3JlZjMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gX3JlZjNcbiAgICAgICAgICA6IChfc3RyZWFtJF93cml0YWJsZVN0YXQzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogX3N0cmVhbSRfd3JpdGFibGVTdGF0My5lcnJvckVtaXR0ZWQpICE9PSBudWxsICYmIF9yZWYyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfcmVmMlxuICAgICAgICA6IChfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0ID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0LmVycm9yZWQpICE9PSBudWxsICYmIF9yZWYgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfcmVmXG4gICAgICA6IChfc3RyZWFtJF93cml0YWJsZVN0YXQ0ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQ0ID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDQuZXJyb3JlZClcbiAgKVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtEZXN0cm95ZWQsXG4gIGlzRGlzdHVyYmVkLFxuICBrSXNEaXN0dXJiZWQsXG4gIGlzRXJyb3JlZCxcbiAga0lzRXJyb3JlZCxcbiAgaXNSZWFkYWJsZSxcbiAga0lzUmVhZGFibGUsXG4gIGlzQ2xvc2VkLFxuICBpc0Rlc3Ryb3llZCxcbiAgaXNEdXBsZXhOb2RlU3RyZWFtLFxuICBpc0ZpbmlzaGVkLFxuICBpc0l0ZXJhYmxlLFxuICBpc1JlYWRhYmxlTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZUVuZGVkLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc05vZGVTdHJlYW0sXG4gIGlzV3JpdGFibGUsXG4gIGlzV3JpdGFibGVOb2RlU3RyZWFtLFxuICBpc1dyaXRhYmxlRW5kZWQsXG4gIGlzV3JpdGFibGVGaW5pc2hlZCxcbiAgaXNXcml0YWJsZUVycm9yZWQsXG4gIGlzU2VydmVyUmVxdWVzdCxcbiAgaXNTZXJ2ZXJSZXNwb25zZSxcbiAgd2lsbEVtaXRDbG9zZVxufVxuIiwiLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ3Byb2Nlc3MvJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWFmaW50b3NoL2VuZC1vZi1zdHJlYW0gd2l0aFxuLy8gcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IsIE1hdGhpYXMgQnV1cyAoQG1hZmludG9zaCkuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3QgeyBBYm9ydEVycm9yLCBjb2RlcyB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UgfSA9IGNvZGVzXG5jb25zdCB7IGtFbXB0eU9iamVjdCwgb25jZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbmNvbnN0IHsgdmFsaWRhdGVBYm9ydFNpZ25hbCwgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVPYmplY3QgfSA9IHJlcXVpcmUoJy4uL3ZhbGlkYXRvcnMnKVxuY29uc3QgeyBQcm9taXNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHtcbiAgaXNDbG9zZWQsXG4gIGlzUmVhZGFibGUsXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc1dyaXRhYmxlLFxuICBpc1dyaXRhYmxlTm9kZVN0cmVhbSxcbiAgaXNXcml0YWJsZUZpbmlzaGVkLFxuICBpc1dyaXRhYmxlRXJyb3JlZCxcbiAgaXNOb2RlU3RyZWFtLFxuICB3aWxsRW1pdENsb3NlOiBfd2lsbEVtaXRDbG9zZVxufSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nXG59XG5jb25zdCBub3AgPSAoKSA9PiB7fVxuZnVuY3Rpb24gZW9zKHN0cmVhbSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIF9vcHRpb25zJHJlYWRhYmxlLCBfb3B0aW9ucyR3cml0YWJsZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBrRW1wdHlPYmplY3RcbiAgfSBlbHNlIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICBvcHRpb25zID0ga0VtcHR5T2JqZWN0XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIHZhbGlkYXRlRnVuY3Rpb24oY2FsbGJhY2ssICdjYWxsYmFjaycpXG4gIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjaylcbiAgY29uc3QgcmVhZGFibGUgPVxuICAgIChfb3B0aW9ucyRyZWFkYWJsZSA9IG9wdGlvbnMucmVhZGFibGUpICE9PSBudWxsICYmIF9vcHRpb25zJHJlYWRhYmxlICE9PSB1bmRlZmluZWRcbiAgICAgID8gX29wdGlvbnMkcmVhZGFibGVcbiAgICAgIDogaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKVxuICBjb25zdCB3cml0YWJsZSA9XG4gICAgKF9vcHRpb25zJHdyaXRhYmxlID0gb3B0aW9ucy53cml0YWJsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkd3JpdGFibGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfb3B0aW9ucyR3cml0YWJsZVxuICAgICAgOiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pXG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAvLyBUT0RPOiBXZWJzdHJlYW1zLlxuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc3RyZWFtJywgJ1N0cmVhbScsIHN0cmVhbSlcbiAgfVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IG9ubGVnYWN5ZmluaXNoID0gKCkgPT4ge1xuICAgIGlmICghc3RyZWFtLndyaXRhYmxlKSB7XG4gICAgICBvbmZpbmlzaCgpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyAocm9uYWcpOiBJbXByb3ZlIHNvZnQgZGV0ZWN0aW9uIHRvIGluY2x1ZGUgY29yZSBtb2R1bGVzIGFuZFxuICAvLyBjb21tb24gZWNvc3lzdGVtIG1vZHVsZXMgdGhhdCBkbyBwcm9wZXJseSBlbWl0ICdjbG9zZScgYnV0IGZhaWxcbiAgLy8gdGhpcyBnZW5lcmljIGNoZWNrLlxuICBsZXQgd2lsbEVtaXRDbG9zZSA9XG4gICAgX3dpbGxFbWl0Q2xvc2Uoc3RyZWFtKSAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pID09PSByZWFkYWJsZSAmJiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pID09PSB3cml0YWJsZVxuICBsZXQgd3JpdGFibGVGaW5pc2hlZCA9IGlzV3JpdGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKVxuICBjb25zdCBvbmZpbmlzaCA9ICgpID0+IHtcbiAgICB3cml0YWJsZUZpbmlzaGVkID0gdHJ1ZVxuICAgIC8vIFN0cmVhbSBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCBoZXJlLiBJZiBpdCBpcyB0aGF0XG4gICAgLy8gbWVhbnMgdGhhdCB1c2VyIHNwYWNlIGlzIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnRseSBhbmRcbiAgICAvLyB3ZSBjYW5ub3QgdHJ1c3Qgd2lsbEVtaXRDbG9zZS5cbiAgICBpZiAoc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgd2lsbEVtaXRDbG9zZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICh3aWxsRW1pdENsb3NlICYmICghc3RyZWFtLnJlYWRhYmxlIHx8IHJlYWRhYmxlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVhZGFibGUgfHwgcmVhZGFibGVGaW5pc2hlZCkge1xuICAgICAgY2FsbGJhY2suY2FsbChzdHJlYW0pXG4gICAgfVxuICB9XG4gIGxldCByZWFkYWJsZUZpbmlzaGVkID0gaXNSZWFkYWJsZUZpbmlzaGVkKHN0cmVhbSwgZmFsc2UpXG4gIGNvbnN0IG9uZW5kID0gKCkgPT4ge1xuICAgIHJlYWRhYmxlRmluaXNoZWQgPSB0cnVlXG4gICAgLy8gU3RyZWFtIHNob3VsZCBub3QgYmUgZGVzdHJveWVkIGhlcmUuIElmIGl0IGlzIHRoYXRcbiAgICAvLyBtZWFucyB0aGF0IHVzZXIgc3BhY2UgaXMgZG9pbmcgc29tZXRoaW5nIGRpZmZlcmVudGx5IGFuZFxuICAgIC8vIHdlIGNhbm5vdCB0cnVzdCB3aWxsRW1pdENsb3NlLlxuICAgIGlmIChzdHJlYW0uZGVzdHJveWVkKSB7XG4gICAgICB3aWxsRW1pdENsb3NlID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKHdpbGxFbWl0Q2xvc2UgJiYgKCFzdHJlYW0ud3JpdGFibGUgfHwgd3JpdGFibGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCF3cml0YWJsZSB8fCB3cml0YWJsZUZpbmlzaGVkKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSlcbiAgICB9XG4gIH1cbiAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKVxuICB9XG4gIGxldCBjbG9zZWQgPSBpc0Nsb3NlZChzdHJlYW0pXG4gIGNvbnN0IG9uY2xvc2UgPSAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZVxuICAgIGNvbnN0IGVycm9yZWQgPSBpc1dyaXRhYmxlRXJyb3JlZChzdHJlYW0pIHx8IGlzUmVhZGFibGVFcnJvcmVkKHN0cmVhbSlcbiAgICBpZiAoZXJyb3JlZCAmJiB0eXBlb2YgZXJyb3JlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycm9yZWQpXG4gICAgfVxuICAgIGlmIChyZWFkYWJsZSAmJiAhcmVhZGFibGVGaW5pc2hlZCAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0sIHRydWUpKSB7XG4gICAgICBpZiAoIWlzUmVhZGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKSlcbiAgICB9XG4gICAgaWYgKHdyaXRhYmxlICYmICF3cml0YWJsZUZpbmlzaGVkKSB7XG4gICAgICBpZiAoIWlzV3JpdGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKSlcbiAgICB9XG4gICAgY2FsbGJhY2suY2FsbChzdHJlYW0pXG4gIH1cbiAgY29uc3Qgb25yZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHN0cmVhbS5yZXEub24oJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICB9XG4gIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5vbignY29tcGxldGUnLCBvbmZpbmlzaClcbiAgICBpZiAoIXdpbGxFbWl0Q2xvc2UpIHtcbiAgICAgIHN0cmVhbS5vbignYWJvcnQnLCBvbmNsb3NlKVxuICAgIH1cbiAgICBpZiAoc3RyZWFtLnJlcSkge1xuICAgICAgb25yZXF1ZXN0KClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLm9uKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KVxuICAgIH1cbiAgfSBlbHNlIGlmICh3cml0YWJsZSAmJiAhd1N0YXRlKSB7XG4gICAgLy8gbGVnYWN5IHN0cmVhbXNcbiAgICBzdHJlYW0ub24oJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKVxuICAgIHN0cmVhbS5vbignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaClcbiAgfVxuXG4gIC8vIE5vdCBhbGwgc3RyZWFtcyB3aWxsIGVtaXQgJ2Nsb3NlJyBhZnRlciAnYWJvcnRlZCcuXG4gIGlmICghd2lsbEVtaXRDbG9zZSAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgIHN0cmVhbS5vbignYWJvcnRlZCcsIG9uY2xvc2UpXG4gIH1cbiAgc3RyZWFtLm9uKCdlbmQnLCBvbmVuZClcbiAgc3RyZWFtLm9uKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgaWYgKG9wdGlvbnMuZXJyb3IgIT09IGZhbHNlKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIG9uZXJyb3IpXG4gIH1cbiAgc3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpXG4gIGlmIChjbG9zZWQpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2UpXG4gIH0gZWxzZSBpZiAoXG4gICAgKHdTdGF0ZSAhPT0gbnVsbCAmJiB3U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB3U3RhdGUuZXJyb3JFbWl0dGVkKSB8fFxuICAgIChyU3RhdGUgIT09IG51bGwgJiYgclN0YXRlICE9PSB1bmRlZmluZWQgJiYgclN0YXRlLmVycm9yRW1pdHRlZClcbiAgKSB7XG4gICAgaWYgKCF3aWxsRW1pdENsb3NlKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2UpXG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAgICFyZWFkYWJsZSAmJlxuICAgICghd2lsbEVtaXRDbG9zZSB8fCBpc1JlYWRhYmxlKHN0cmVhbSkpICYmXG4gICAgKHdyaXRhYmxlRmluaXNoZWQgfHwgaXNXcml0YWJsZShzdHJlYW0pID09PSBmYWxzZSlcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9IGVsc2UgaWYgKFxuICAgICF3cml0YWJsZSAmJlxuICAgICghd2lsbEVtaXRDbG9zZSB8fCBpc1dyaXRhYmxlKHN0cmVhbSkpICYmXG4gICAgKHJlYWRhYmxlRmluaXNoZWQgfHwgaXNSZWFkYWJsZShzdHJlYW0pID09PSBmYWxzZSlcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9IGVsc2UgaWYgKHJTdGF0ZSAmJiBzdHJlYW0ucmVxICYmIHN0cmVhbS5hYm9ydGVkKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY2FsbGJhY2sgPSBub3BcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0ZWQnLCBvbmNsb3NlKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0Jywgb25jbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpXG4gICAgaWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25sZWdhY3lmaW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgfVxuICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWNsb3NlZCkge1xuICAgIGNvbnN0IGFib3J0ID0gKCkgPT4ge1xuICAgICAgLy8gS2VlcCBpdCBiZWNhdXNlIGNsZWFudXAgcmVtb3ZlcyBpdC5cbiAgICAgIGNvbnN0IGVuZENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNsZWFudXAoKVxuICAgICAgZW5kQ2FsbGJhY2suY2FsbChcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBuZXcgQWJvcnRFcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGFib3J0KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNhbGxiYWNrID0gb25jZSgoLi4uYXJncykgPT4ge1xuICAgICAgICBvcHRpb25zLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmFwcGx5KHN0cmVhbSwgYXJncylcbiAgICAgIH0pXG4gICAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xlYW51cFxufVxuZnVuY3Rpb24gZmluaXNoZWQoc3RyZWFtLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZW9zKHN0cmVhbSwgb3B0cywgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QoZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn1cbm1vZHVsZS5leHBvcnRzID0gZW9zXG5tb2R1bGUuZXhwb3J0cy5maW5pc2hlZCA9IGZpbmlzaGVkXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgQWJvcnRDb250cm9sbGVyID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0Q29udHJvbGxlclxuY29uc3Qge1xuICBjb2RlczogeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX01JU1NJTkdfQVJHUywgRVJSX09VVF9PRl9SQU5HRSB9LFxuICBBYm9ydEVycm9yXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyB2YWxpZGF0ZUFib3J0U2lnbmFsLCB2YWxpZGF0ZUludGVnZXIsIHZhbGlkYXRlT2JqZWN0IH0gPSByZXF1aXJlKCcuLi92YWxpZGF0b3JzJylcbmNvbnN0IGtXZWFrSGFuZGxlciA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKS5TeW1ib2woJ2tXZWFrJylcbmNvbnN0IHsgZmluaXNoZWQgfSA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5jb25zdCB7XG4gIEFycmF5UHJvdG90eXBlUHVzaCxcbiAgTWF0aEZsb29yLFxuICBOdW1iZXIsXG4gIE51bWJlcklzTmFOLFxuICBQcm9taXNlLFxuICBQcm9taXNlUmVqZWN0LFxuICBQcm9taXNlUHJvdG90eXBlVGhlbixcbiAgU3ltYm9sXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBrRW1wdHkgPSBTeW1ib2woJ2tFbXB0eScpXG5jb25zdCBrRW9mID0gU3ltYm9sKCdrRW9mJylcbmZ1bmN0aW9uIG1hcChmbiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgbGV0IGNvbmN1cnJlbmN5ID0gMVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5jb25jdXJyZW5jeSkgIT0gbnVsbCkge1xuICAgIGNvbmN1cnJlbmN5ID0gTWF0aEZsb29yKG9wdGlvbnMuY29uY3VycmVuY3kpXG4gIH1cbiAgdmFsaWRhdGVJbnRlZ2VyKGNvbmN1cnJlbmN5LCAnY29uY3VycmVuY3knLCAxKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIG1hcCgpIHtcbiAgICB2YXIgX29wdGlvbnMkc2lnbmFsLCBfb3B0aW9ucyRzaWduYWwyXG4gICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG4gICAgY29uc3QgcXVldWUgPSBbXVxuICAgIGNvbnN0IHNpZ25hbCA9IGFjLnNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbE9wdCA9IHtcbiAgICAgIHNpZ25hbFxuICAgIH1cbiAgICBjb25zdCBhYm9ydCA9ICgpID0+IGFjLmFib3J0KClcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWwgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwuYWJvcnRlZFxuICAgICkge1xuICAgICAgYWJvcnQoKVxuICAgIH1cbiAgICBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogKF9vcHRpb25zJHNpZ25hbDIgPSBvcHRpb25zLnNpZ25hbCkgPT09IG51bGwgfHwgX29wdGlvbnMkc2lnbmFsMiA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBfb3B0aW9ucyRzaWduYWwyLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpXG4gICAgbGV0IG5leHRcbiAgICBsZXQgcmVzdW1lXG4gICAgbGV0IGRvbmUgPSBmYWxzZVxuICAgIGZ1bmN0aW9uIG9uRG9uZSgpIHtcbiAgICAgIGRvbmUgPSB0cnVlXG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGxldCB2YWwgb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgdmFyIF92YWxcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsID0gZm4odmFsLCBzaWduYWxPcHQpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB2YWwgPSBQcm9taXNlUmVqZWN0KGVycilcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbCA9PT0ga0VtcHR5KSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mICgoX3ZhbCA9IHZhbCkgPT09IG51bGwgfHwgX3ZhbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX3ZhbC5jYXRjaCkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbC5jYXRjaChvbkRvbmUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnB1c2godmFsKVxuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICAgIG5leHQgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZG9uZSAmJiBxdWV1ZS5sZW5ndGggJiYgcXVldWUubGVuZ3RoID49IGNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICByZXN1bWUgPSByZXNvbHZlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZS5wdXNoKGtFb2YpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgdmFsID0gUHJvbWlzZVJlamVjdChlcnIpXG4gICAgICAgIFByb21pc2VQcm90b3R5cGVUaGVuKHZhbCwgdW5kZWZpbmVkLCBvbkRvbmUpXG4gICAgICAgIHF1ZXVlLnB1c2godmFsKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdmFyIF9vcHRpb25zJHNpZ25hbDNcbiAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICBuZXh0KClcbiAgICAgICAgICBuZXh0ID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IChfb3B0aW9ucyRzaWduYWwzID0gb3B0aW9ucy5zaWduYWwpID09PSBudWxsIHx8IF9vcHRpb25zJHNpZ25hbDMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBfb3B0aW9ucyRzaWduYWwzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpXG4gICAgICB9XG4gICAgfVxuICAgIHB1bXAoKVxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGF3YWl0IHF1ZXVlWzBdXG4gICAgICAgICAgaWYgKHZhbCA9PT0ga0VvZikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsICE9PSBrRW1wdHkpIHtcbiAgICAgICAgICAgIHlpZWxkIHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgaWYgKHJlc3VtZSkge1xuICAgICAgICAgICAgcmVzdW1lKClcbiAgICAgICAgICAgIHJlc3VtZSA9IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBuZXh0ID0gcmVzb2x2ZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhYy5hYm9ydCgpXG4gICAgICBkb25lID0gdHJ1ZVxuICAgICAgaWYgKHJlc3VtZSkge1xuICAgICAgICByZXN1bWUoKVxuICAgICAgICByZXN1bWUgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIGFzSW5kZXhlZFBhaXJzKG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiogYXNJbmRleGVkUGFpcnMoKSB7XG4gICAgbGV0IGluZGV4ID0gMFxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWw0XG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChfb3B0aW9ucyRzaWduYWw0ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw0LmFib3J0ZWRcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcih7XG4gICAgICAgICAgY2F1c2U6IG9wdGlvbnMuc2lnbmFsLnJlYXNvblxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgeWllbGQgW2luZGV4KyssIHZhbF1cbiAgICB9XG4gIH0uY2FsbCh0aGlzKVxufVxuYXN5bmMgZnVuY3Rpb24gc29tZShmbiwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICBmb3IgYXdhaXQgKGNvbnN0IHVudXNlZCBvZiBmaWx0ZXIuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuYXN5bmMgZnVuY3Rpb24gZXZlcnkoZm4sIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVfTW9yZ2FuJTI3c19sYXdzXG4gIHJldHVybiAhKGF3YWl0IHNvbWUuY2FsbChcbiAgICB0aGlzLFxuICAgIGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICByZXR1cm4gIShhd2FpdCBmbiguLi5hcmdzKSlcbiAgICB9LFxuICAgIG9wdGlvbnNcbiAgKSlcbn1cbmFzeW5jIGZ1bmN0aW9uIGZpbmQoZm4sIG9wdGlvbnMpIHtcbiAgZm9yIGF3YWl0IChjb25zdCByZXN1bHQgb2YgZmlsdGVyLmNhbGwodGhpcywgZm4sIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cbmFzeW5jIGZ1bmN0aW9uIGZvckVhY2goZm4sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gZm9yRWFjaEZuKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgYXdhaXQgZm4odmFsdWUsIG9wdGlvbnMpXG4gICAgcmV0dXJuIGtFbXB0eVxuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBmb3IgYXdhaXQgKGNvbnN0IHVudXNlZCBvZiBtYXAuY2FsbCh0aGlzLCBmb3JFYWNoRm4sIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIGZpbHRlcihmbiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBmaWx0ZXJGbih2YWx1ZSwgb3B0aW9ucykge1xuICAgIGlmIChhd2FpdCBmbih2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICByZXR1cm4ga0VtcHR5XG4gIH1cbiAgcmV0dXJuIG1hcC5jYWxsKHRoaXMsIGZpbHRlckZuLCBvcHRpb25zKVxufVxuXG4vLyBTcGVjaWZpYyB0byBwcm92aWRlIGJldHRlciBlcnJvciB0byByZWR1Y2Ugc2luY2UgdGhlIGFyZ3VtZW50IGlzIG9ubHlcbi8vIG1pc3NpbmcgaWYgdGhlIHN0cmVhbSBoYXMgbm8gaXRlbXMgaW4gaXQgLSBidXQgdGhlIGNvZGUgaXMgc3RpbGwgYXBwcm9wcmlhdGVcbmNsYXNzIFJlZHVjZUF3YXJlRXJyTWlzc2luZ0FyZ3MgZXh0ZW5kcyBFUlJfTUlTU0lOR19BUkdTIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ3JlZHVjZScpXG4gICAgdGhpcy5tZXNzYWdlID0gJ1JlZHVjZSBvZiBhbiBlbXB0eSBzdHJlYW0gcmVxdWlyZXMgYW4gaW5pdGlhbCB2YWx1ZSdcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcmVkdWNlKHJlZHVjZXIsIGluaXRpYWxWYWx1ZSwgb3B0aW9ucykge1xuICB2YXIgX29wdGlvbnMkc2lnbmFsNVxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3JlZHVjZXInLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgcmVkdWNlcilcbiAgfVxuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgbGV0IGhhc0luaXRpYWxWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gIGlmIChcbiAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgKF9vcHRpb25zJHNpZ25hbDUgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICBfb3B0aW9ucyRzaWduYWw1ICE9PSB1bmRlZmluZWQgJiZcbiAgICBfb3B0aW9ucyRzaWduYWw1LmFib3J0ZWRcbiAgKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgfSlcbiAgICB0aGlzLm9uY2UoJ2Vycm9yJywgKCkgPT4ge30pIC8vIFRoZSBlcnJvciBpcyBhbHJlYWR5IHByb3BhZ2F0ZWRcbiAgICBhd2FpdCBmaW5pc2hlZCh0aGlzLmRlc3Ryb3koZXJyKSlcbiAgICB0aHJvdyBlcnJcbiAgfVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuc2lnbmFsKSB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBba1dlYWtIYW5kbGVyXTogdGhpc1xuICAgIH1cbiAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGFjLmFib3J0KCksIG9wdHMpXG4gIH1cbiAgbGV0IGdvdEFueUl0ZW1Gcm9tU3RyZWFtID0gZmFsc2VcbiAgdHJ5IHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWw2XG4gICAgICBnb3RBbnlJdGVtRnJvbVN0cmVhbSA9IHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKF9vcHRpb25zJHNpZ25hbDYgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsNiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDYuYWJvcnRlZFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKClcbiAgICAgIH1cbiAgICAgIGlmICghaGFzSW5pdGlhbFZhbHVlKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IHZhbHVlXG4gICAgICAgIGhhc0luaXRpYWxWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IGF3YWl0IHJlZHVjZXIoaW5pdGlhbFZhbHVlLCB2YWx1ZSwge1xuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWdvdEFueUl0ZW1Gcm9tU3RyZWFtICYmICFoYXNJbml0aWFsVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBSZWR1Y2VBd2FyZUVyck1pc3NpbmdBcmdzKClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYWMuYWJvcnQoKVxuICB9XG4gIHJldHVybiBpbml0aWFsVmFsdWVcbn1cbmFzeW5jIGZ1bmN0aW9uIHRvQXJyYXkob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgZm9yIGF3YWl0IChjb25zdCB2YWwgb2YgdGhpcykge1xuICAgIHZhciBfb3B0aW9ucyRzaWduYWw3XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX29wdGlvbnMkc2lnbmFsNyA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgX29wdGlvbnMkc2lnbmFsNyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw3LmFib3J0ZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICB9KVxuICAgIH1cbiAgICBBcnJheVByb3RvdHlwZVB1c2gocmVzdWx0LCB2YWwpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuZnVuY3Rpb24gZmxhdE1hcChmbiwgb3B0aW9ucykge1xuICBjb25zdCB2YWx1ZXMgPSBtYXAuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucylcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiBmbGF0TWFwKCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHZhbHVlcykge1xuICAgICAgeWllbGQqIHZhbFxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5mdW5jdGlvbiB0b0ludGVnZXJPckluZmluaXR5KG51bWJlcikge1xuICAvLyBXZSBjb2VyY2UgaGVyZSB0byBhbGlnbiB3aXRoIHRoZSBzcGVjXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMvaXNzdWVzLzE2OVxuICBudW1iZXIgPSBOdW1iZXIobnVtYmVyKVxuICBpZiAoTnVtYmVySXNOYU4obnVtYmVyKSkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKG51bWJlciA8IDApIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRSgnbnVtYmVyJywgJz49IDAnLCBudW1iZXIpXG4gIH1cbiAgcmV0dXJuIG51bWJlclxufVxuZnVuY3Rpb24gZHJvcChudW1iZXIsIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIG51bWJlciA9IHRvSW50ZWdlck9ySW5maW5pdHkobnVtYmVyKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIGRyb3AoKSB7XG4gICAgdmFyIF9vcHRpb25zJHNpZ25hbDhcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWw4ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbDguYWJvcnRlZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbCBvZiB0aGlzKSB7XG4gICAgICB2YXIgX29wdGlvbnMkc2lnbmFsOVxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsOSA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsOS5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKG51bWJlci0tIDw9IDApIHtcbiAgICAgICAgeWllbGQgdmFsXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIHRha2UobnVtYmVyLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICBudW1iZXIgPSB0b0ludGVnZXJPckluZmluaXR5KG51bWJlcilcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiB0YWtlKCkge1xuICAgIHZhciBfb3B0aW9ucyRzaWduYWwxMFxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKF9vcHRpb25zJHNpZ25hbDEwID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwxMCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwxMC5hYm9ydGVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWwxMVxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsMTEgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsMTEgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWwxMS5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKG51bWJlci0tID4gMCkge1xuICAgICAgICB5aWVsZCB2YWxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5tb2R1bGUuZXhwb3J0cy5zdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMgPSB7XG4gIGFzSW5kZXhlZFBhaXJzLFxuICBkcm9wLFxuICBmaWx0ZXIsXG4gIGZsYXRNYXAsXG4gIG1hcCxcbiAgdGFrZVxufVxubW9kdWxlLmV4cG9ydHMucHJvbWlzZVJldHVybmluZ09wZXJhdG9ycyA9IHtcbiAgZXZlcnksXG4gIGZvckVhY2gsXG4gIHJlZHVjZSxcbiAgdG9BcnJheSxcbiAgc29tZSxcbiAgZmluZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuXG5jb25zdCB7XG4gIGFnZ3JlZ2F0ZVR3b0Vycm9ycyxcbiAgY29kZXM6IHsgRVJSX01VTFRJUExFX0NBTExCQUNLIH0sXG4gIEFib3J0RXJyb3Jcbn0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCB7IFN5bWJvbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IGtEZXN0cm95ZWQsIGlzRGVzdHJveWVkLCBpc0ZpbmlzaGVkLCBpc1NlcnZlclJlcXVlc3QgfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuY29uc3Qga0Rlc3Ryb3kgPSBTeW1ib2woJ2tEZXN0cm95JylcbmNvbnN0IGtDb25zdHJ1Y3QgPSBTeW1ib2woJ2tDb25zdHJ1Y3QnKVxuZnVuY3Rpb24gY2hlY2tFcnJvcihlcnIsIHcsIHIpIHtcbiAgaWYgKGVycikge1xuICAgIC8vIEF2b2lkIFY4IGxlYWssIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM0MTAzI2lzc3VlY29tbWVudC02NTIwMDIzNjRcbiAgICBlcnIuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuICAgIGlmICh3ICYmICF3LmVycm9yZWQpIHtcbiAgICAgIHcuZXJyb3JlZCA9IGVyclxuICAgIH1cbiAgICBpZiAociAmJiAhci5lcnJvcmVkKSB7XG4gICAgICByLmVycm9yZWQgPSBlcnJcbiAgICB9XG4gIH1cbn1cblxuLy8gQmFja3dhcmRzIGNvbXBhdC4gY2IoKSBpcyB1bmRvY3VtZW50ZWQgYW5kIHVudXNlZCBpbiBjb3JlIGJ1dFxuLy8gdW5mb3J0dW5hdGVseSBtaWdodCBiZSB1c2VkIGJ5IG1vZHVsZXMuXG5mdW5jdGlvbiBkZXN0cm95KGVyciwgY2IpIHtcbiAgY29uc3QgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgLy8gV2l0aCBkdXBsZXggc3RyZWFtcyB3ZSB1c2UgdGhlIHdyaXRhYmxlIHNpZGUgZm9yIHN0YXRlLlxuICBjb25zdCBzID0gdyB8fCByXG4gIGlmICgodyAmJiB3LmRlc3Ryb3llZCkgfHwgKHIgJiYgci5kZXN0cm95ZWQpKSB7XG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gV2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuICBjaGVja0Vycm9yKGVyciwgdywgcilcbiAgaWYgKHcpIHtcbiAgICB3LmRlc3Ryb3llZCA9IHRydWVcbiAgfVxuICBpZiAocikge1xuICAgIHIuZGVzdHJveWVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gSWYgc3RpbGwgY29uc3RydWN0aW5nIHRoZW4gZGVmZXIgY2FsbGluZyBfZGVzdHJveS5cbiAgaWYgKCFzLmNvbnN0cnVjdGVkKSB7XG4gICAgdGhpcy5vbmNlKGtEZXN0cm95LCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgIF9kZXN0cm95KHRoaXMsIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlciwgZXJyKSwgY2IpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBfZGVzdHJveSh0aGlzLCBlcnIsIGNiKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5mdW5jdGlvbiBfZGVzdHJveShzZWxmLCBlcnIsIGNiKSB7XG4gIGxldCBjYWxsZWQgPSBmYWxzZVxuICBmdW5jdGlvbiBvbkRlc3Ryb3koZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWVcbiAgICBjb25zdCByID0gc2VsZi5fcmVhZGFibGVTdGF0ZVxuICAgIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gICAgY2hlY2tFcnJvcihlcnIsIHcsIHIpXG4gICAgaWYgKHcpIHtcbiAgICAgIHcuY2xvc2VkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAocikge1xuICAgICAgci5jbG9zZWQgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiKGVycilcbiAgICB9XG4gICAgaWYgKGVycikge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JDbG9zZU5ULCBzZWxmLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIHNlbGYpXG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgc2VsZi5fZGVzdHJveShlcnIgfHwgbnVsbCwgb25EZXN0cm95KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBvbkRlc3Ryb3koZXJyKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JDbG9zZU5UKHNlbGYsIGVycikge1xuICBlbWl0RXJyb3JOVChzZWxmLCBlcnIpXG4gIGVtaXRDbG9zZU5UKHNlbGYpXG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIGNvbnN0IHIgPSBzZWxmLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gIGlmICh3KSB7XG4gICAgdy5jbG9zZUVtaXR0ZWQgPSB0cnVlXG4gIH1cbiAgaWYgKHIpIHtcbiAgICByLmNsb3NlRW1pdHRlZCA9IHRydWVcbiAgfVxuICBpZiAoKHcgJiYgdy5lbWl0Q2xvc2UpIHx8IChyICYmIHIuZW1pdENsb3NlKSkge1xuICAgIHNlbGYuZW1pdCgnY2xvc2UnKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JOVChzZWxmLCBlcnIpIHtcbiAgY29uc3QgciA9IHNlbGYuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHNlbGYuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKCh3ICYmIHcuZXJyb3JFbWl0dGVkKSB8fCAociAmJiByLmVycm9yRW1pdHRlZCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodykge1xuICAgIHcuZXJyb3JFbWl0dGVkID0gdHJ1ZVxuICB9XG4gIGlmIChyKSB7XG4gICAgci5lcnJvckVtaXR0ZWQgPSB0cnVlXG4gIH1cbiAgc2VsZi5lbWl0KCdlcnJvcicsIGVycilcbn1cbmZ1bmN0aW9uIHVuZGVzdHJveSgpIHtcbiAgY29uc3QgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHIpIHtcbiAgICByLmNvbnN0cnVjdGVkID0gdHJ1ZVxuICAgIHIuY2xvc2VkID0gZmFsc2VcbiAgICByLmNsb3NlRW1pdHRlZCA9IGZhbHNlXG4gICAgci5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIHIuZXJyb3JlZCA9IG51bGxcbiAgICByLmVycm9yRW1pdHRlZCA9IGZhbHNlXG4gICAgci5yZWFkaW5nID0gZmFsc2VcbiAgICByLmVuZGVkID0gci5yZWFkYWJsZSA9PT0gZmFsc2VcbiAgICByLmVuZEVtaXR0ZWQgPSByLnJlYWRhYmxlID09PSBmYWxzZVxuICB9XG4gIGlmICh3KSB7XG4gICAgdy5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICB3LmRlc3Ryb3llZCA9IGZhbHNlXG4gICAgdy5jbG9zZWQgPSBmYWxzZVxuICAgIHcuY2xvc2VFbWl0dGVkID0gZmFsc2VcbiAgICB3LmVycm9yZWQgPSBudWxsXG4gICAgdy5lcnJvckVtaXR0ZWQgPSBmYWxzZVxuICAgIHcuZmluYWxDYWxsZWQgPSBmYWxzZVxuICAgIHcucHJlZmluaXNoZWQgPSBmYWxzZVxuICAgIHcuZW5kZWQgPSB3LndyaXRhYmxlID09PSBmYWxzZVxuICAgIHcuZW5kaW5nID0gdy53cml0YWJsZSA9PT0gZmFsc2VcbiAgICB3LmZpbmlzaGVkID0gdy53cml0YWJsZSA9PT0gZmFsc2VcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIsIHN5bmMpIHtcbiAgLy8gV2UgaGF2ZSB0ZXN0cyB0aGF0IHJlbHkgb24gZXJyb3JzIGJlaW5nIGVtaXR0ZWRcbiAgLy8gaW4gdGhlIHNhbWUgdGljaywgc28gY2hhbmdpbmcgdGhpcyBpcyBzZW12ZXIgbWFqb3IuXG4gIC8vIEZvciBub3cgd2hlbiB5b3Ugb3B0LWluIHRvIGF1dG9EZXN0cm95IHdlIGFsbG93XG4gIC8vIHRoZSBlcnJvciB0byBiZSBlbWl0dGVkIG5leHRUaWNrLiBJbiBhIGZ1dHVyZVxuICAvLyBzZW12ZXIgbWFqb3IgdXBkYXRlIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gdGhpcy5cblxuICBjb25zdCByID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKCh3ICYmIHcuZGVzdHJveWVkKSB8fCAociAmJiByLmRlc3Ryb3llZCkpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIGlmICgociAmJiByLmF1dG9EZXN0cm95KSB8fCAodyAmJiB3LmF1dG9EZXN0cm95KSkgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICBlbHNlIGlmIChlcnIpIHtcbiAgICAvLyBBdm9pZCBWOCBsZWFrLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDEwMyNpc3N1ZWNvbW1lbnQtNjUyMDAyMzY0XG4gICAgZXJyLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cbiAgICBpZiAodyAmJiAhdy5lcnJvcmVkKSB7XG4gICAgICB3LmVycm9yZWQgPSBlcnJcbiAgICB9XG4gICAgaWYgKHIgJiYgIXIuZXJyb3JlZCkge1xuICAgICAgci5lcnJvcmVkID0gZXJyXG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvck5ULCBzdHJlYW0sIGVycilcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdEVycm9yTlQoc3RyZWFtLCBlcnIpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb25zdHJ1Y3Qoc3RyZWFtLCBjYikge1xuICBpZiAodHlwZW9mIHN0cmVhbS5fY29uc3RydWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgciA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmIChyKSB7XG4gICAgci5jb25zdHJ1Y3RlZCA9IGZhbHNlXG4gIH1cbiAgaWYgKHcpIHtcbiAgICB3LmNvbnN0cnVjdGVkID0gZmFsc2VcbiAgfVxuICBzdHJlYW0ub25jZShrQ29uc3RydWN0LCBjYilcbiAgaWYgKHN0cmVhbS5saXN0ZW5lckNvdW50KGtDb25zdHJ1Y3QpID4gMSkge1xuICAgIC8vIER1cGxleFxuICAgIHJldHVyblxuICB9XG4gIHByb2Nlc3MubmV4dFRpY2soY29uc3RydWN0TlQsIHN0cmVhbSlcbn1cbmZ1bmN0aW9uIGNvbnN0cnVjdE5UKHN0cmVhbSkge1xuICBsZXQgY2FsbGVkID0gZmFsc2VcbiAgZnVuY3Rpb24gb25Db25zdHJ1Y3QoZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIgIT09IG51bGwgJiYgZXJyICE9PSB1bmRlZmluZWQgPyBlcnIgOiBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIGNvbnN0IHIgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgICBjb25zdCB3ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gICAgY29uc3QgcyA9IHcgfHwgclxuICAgIGlmIChyKSB7XG4gICAgICByLmNvbnN0cnVjdGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodykge1xuICAgICAgdy5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKHMuZGVzdHJveWVkKSB7XG4gICAgICBzdHJlYW0uZW1pdChrRGVzdHJveSwgZXJyKVxuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyciwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q29uc3RydWN0TlQsIHN0cmVhbSlcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICBzdHJlYW0uX2NvbnN0cnVjdChvbkNvbnN0cnVjdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb25Db25zdHJ1Y3QoZXJyKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0Q29uc3RydWN0TlQoc3RyZWFtKSB7XG4gIHN0cmVhbS5lbWl0KGtDb25zdHJ1Y3QpXG59XG5mdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0gJiYgc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nXG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VMZWdhY3koc3RyZWFtKSB7XG4gIHN0cmVhbS5lbWl0KCdjbG9zZScpXG59XG5mdW5jdGlvbiBlbWl0RXJyb3JDbG9zZUxlZ2FjeShzdHJlYW0sIGVycikge1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTGVnYWN5LCBzdHJlYW0pXG59XG5cbi8vIE5vcm1hbGl6ZSBkZXN0cm95IGZvciBsZWdhY3kuXG5mdW5jdGlvbiBkZXN0cm95ZXIoc3RyZWFtLCBlcnIpIHtcbiAgaWYgKCFzdHJlYW0gfHwgaXNEZXN0cm95ZWQoc3RyZWFtKSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICghZXJyICYmICFpc0ZpbmlzaGVkKHN0cmVhbSkpIHtcbiAgICBlcnIgPSBuZXcgQWJvcnRFcnJvcigpXG4gIH1cblxuICAvLyBUT0RPOiBSZW1vdmUgaXNSZXF1ZXN0IGJyYW5jaGVzLlxuICBpZiAoaXNTZXJ2ZXJSZXF1ZXN0KHN0cmVhbSkpIHtcbiAgICBzdHJlYW0uc29ja2V0ID0gbnVsbFxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfSBlbHNlIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5hYm9ydCgpXG4gIH0gZWxzZSBpZiAoaXNSZXF1ZXN0KHN0cmVhbS5yZXEpKSB7XG4gICAgc3RyZWFtLnJlcS5hYm9ydCgpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHN0cmVhbS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzdHJlYW0uY2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUT0RPOiBEb24ndCBsb3NlIGVycj9cbiAgICBzdHJlYW0uY2xvc2UoKVxuICB9IGVsc2UgaWYgKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQ2xvc2VMZWdhY3ksIHN0cmVhbSwgZXJyKVxuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTGVnYWN5LCBzdHJlYW0pXG4gIH1cbiAgaWYgKCFzdHJlYW0uZGVzdHJveWVkKSB7XG4gICAgc3RyZWFtW2tEZXN0cm95ZWRdID0gdHJ1ZVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29uc3RydWN0LFxuICBkZXN0cm95ZXIsXG4gIGRlc3Ryb3ksXG4gIHVuZGVzdHJveSxcbiAgZXJyb3JPckRlc3Ryb3lcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFycmF5SXNBcnJheSwgT2JqZWN0U2V0UHJvdG90eXBlT2YgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuZnVuY3Rpb24gU3RyZWFtKG9wdHMpIHtcbiAgRUUuY2FsbCh0aGlzLCBvcHRzKVxufVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLnByb3RvdHlwZSwgRUUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLCBFRSlcblN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHRoaXNcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgaWYgKGRlc3Qud3JpdGFibGUgJiYgZGVzdC53cml0ZShjaHVuaykgPT09IGZhbHNlICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgc291cmNlLnBhdXNlKClcbiAgICB9XG4gIH1cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpXG4gICAgfVxuICB9XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5vbignY2xvc2UnLCBvbmNsb3NlKVxuICB9XG4gIGxldCBkaWRPbkVuZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuXG4gICAgZGlkT25FbmQgPSB0cnVlXG4gICAgZGVzdC5lbmQoKVxuICB9XG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm5cbiAgICBkaWRPbkVuZCA9IHRydWVcbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KClcbiAgfVxuXG4gIC8vIERvbid0IGxlYXZlIGRhbmdsaW5nIHBpcGVzIHdoZW4gdGhlcmUgYXJlIGVycm9ycy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGNsZWFudXAoKVxuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXIpXG4gICAgfVxuICB9XG4gIHByZXBlbmRMaXN0ZW5lcihzb3VyY2UsICdlcnJvcicsIG9uZXJyb3IpXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKVxuXG4gIC8vIFJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKVxuICB9XG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cClcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cClcbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKVxuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0XG59XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKVxuXG4gIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkgZW1pdHRlci5vbihldmVudCwgZm4pXG4gIGVsc2UgaWYgKEFycmF5SXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKVxuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU3RyZWFtLFxuICBwcmVwZW5kTGlzdGVuZXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFib3J0RXJyb3IsIGNvZGVzIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSB9ID0gY29kZXNcblxuLy8gVGhpcyBtZXRob2QgaXMgaW5saW5lZCBoZXJlIGZvciByZWFkYWJsZS1zdHJlYW1cbi8vIEl0IGFsc28gZG9lcyBub3QgYWxsb3cgZm9yIHNpZ25hbCB0byBub3QgZXhpc3Qgb24gdGhlIHN0cmVhbVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzYwNjEjZGlzY3Vzc2lvbl9yNTMzNzE4MDI5XG5jb25zdCB2YWxpZGF0ZUFib3J0U2lnbmFsID0gKHNpZ25hbCwgbmFtZSkgPT4ge1xuICBpZiAodHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnQWJvcnRTaWduYWwnLCBzaWduYWwpXG4gIH1cbn1cbmZ1bmN0aW9uIGlzTm9kZVN0cmVhbShvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicpXG59XG5tb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IGZ1bmN0aW9uIGFkZEFib3J0U2lnbmFsKHNpZ25hbCwgc3RyZWFtKSB7XG4gIHZhbGlkYXRlQWJvcnRTaWduYWwoc2lnbmFsLCAnc2lnbmFsJylcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc3RyZWFtJywgJ3N0cmVhbS5TdHJlYW0nLCBzdHJlYW0pXG4gIH1cbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZShzaWduYWwsIHN0cmVhbSlcbn1cbm1vZHVsZS5leHBvcnRzLmFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZSA9IGZ1bmN0aW9uIChzaWduYWwsIHN0cmVhbSkge1xuICBpZiAodHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkge1xuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgIHN0cmVhbS5kZXN0cm95KFxuICAgICAgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgIGNhdXNlOiBzaWduYWwucmVhc29uXG4gICAgICB9KVxuICAgIClcbiAgfVxuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBvbkFib3J0KClcbiAgfSBlbHNlIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KVxuICAgIGVvcyhzdHJlYW0sICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpKVxuICB9XG4gIHJldHVybiBzdHJlYW1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IFN0cmluZ1Byb3RvdHlwZVNsaWNlLCBTeW1ib2xJdGVyYXRvciwgVHlwZWRBcnJheVByb3RvdHlwZVNldCwgVWludDhBcnJheSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgaW5zcGVjdCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQnVmZmVyTGlzdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IG51bGxcbiAgICB0aGlzLnRhaWwgPSBudWxsXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cbiAgcHVzaCh2KSB7XG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICBkYXRhOiB2LFxuICAgICAgbmV4dDogbnVsbFxuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5XG4gICAgZWxzZSB0aGlzLmhlYWQgPSBlbnRyeVxuICAgIHRoaXMudGFpbCA9IGVudHJ5XG4gICAgKyt0aGlzLmxlbmd0aFxuICB9XG4gIHVuc2hpZnQodikge1xuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgZGF0YTogdixcbiAgICAgIG5leHQ6IHRoaXMuaGVhZFxuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5XG4gICAgdGhpcy5oZWFkID0gZW50cnlcbiAgICArK3RoaXMubGVuZ3RoXG4gIH1cbiAgc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCByZXQgPSB0aGlzLmhlYWQuZGF0YVxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHRcbiAgICAtLXRoaXMubGVuZ3RoXG4gICAgcmV0dXJuIHJldFxuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuICBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJ1xuICAgIGxldCBwID0gdGhpcy5oZWFkXG4gICAgbGV0IHJldCA9ICcnICsgcC5kYXRhXG4gICAgd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbCkgcmV0ICs9IHMgKyBwLmRhdGFcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgY29uY2F0KG4pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgICBjb25zdCByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMClcbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChwKSB7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHJldCwgcC5kYXRhLCBpKVxuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoXG4gICAgICBwID0gcC5uZXh0XG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIGNvbnN1bWUobiwgaGFzU3RyaW5ncykge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmhlYWQuZGF0YVxuICAgIGlmIChuIDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vIGBzbGljZWAgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICBjb25zdCBzbGljZSA9IGRhdGEuc2xpY2UoMCwgbilcbiAgICAgIHRoaXMuaGVhZC5kYXRhID0gZGF0YS5zbGljZShuKVxuICAgICAgcmV0dXJuIHNsaWNlXG4gICAgfVxuICAgIGlmIChuID09PSBkYXRhLmxlbmd0aCkge1xuICAgICAgLy8gRmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoLlxuICAgICAgcmV0dXJuIHRoaXMuc2hpZnQoKVxuICAgIH1cbiAgICAvLyBSZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXIuXG4gICAgcmV0dXJuIGhhc1N0cmluZ3MgPyB0aGlzLl9nZXRTdHJpbmcobikgOiB0aGlzLl9nZXRCdWZmZXIobilcbiAgfVxuICBmaXJzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGFcbiAgfVxuICAqW1N5bWJvbEl0ZXJhdG9yXSgpIHtcbiAgICBmb3IgKGxldCBwID0gdGhpcy5oZWFkOyBwOyBwID0gcC5uZXh0KSB7XG4gICAgICB5aWVsZCBwLmRhdGFcbiAgICB9XG4gIH1cblxuICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICBfZ2V0U3RyaW5nKG4pIHtcbiAgICBsZXQgcmV0ID0gJydcbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBjID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHN0ciA9IHAuZGF0YVxuICAgICAgaWYgKG4gPiBzdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldCArPSBzdHJcbiAgICAgICAgbiAtPSBzdHIubGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICAgIHJldCArPSBzdHJcbiAgICAgICAgICArK2NcbiAgICAgICAgICBpZiAocC5uZXh0KSB0aGlzLmhlYWQgPSBwLm5leHRcbiAgICAgICAgICBlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgKz0gU3RyaW5nUHJvdG90eXBlU2xpY2Uoc3RyLCAwLCBuKVxuICAgICAgICAgIHRoaXMuaGVhZCA9IHBcbiAgICAgICAgICBwLmRhdGEgPSBTdHJpbmdQcm90b3R5cGVTbGljZShzdHIsIG4pXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgICsrY1xuICAgIH0gd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbClcbiAgICB0aGlzLmxlbmd0aCAtPSBjXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIF9nZXRCdWZmZXIobikge1xuICAgIGNvbnN0IHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKVxuICAgIGNvbnN0IHJldExlbiA9IG5cbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBjID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IHAuZGF0YVxuICAgICAgaWYgKG4gPiBidWYubGVuZ3RoKSB7XG4gICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBidWYsIHJldExlbiAtIG4pXG4gICAgICAgIG4gLT0gYnVmLmxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG4gPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHJldCwgYnVmLCByZXRMZW4gLSBuKVxuICAgICAgICAgICsrY1xuICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dFxuICAgICAgICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbiksIHJldExlbiAtIG4pXG4gICAgICAgICAgdGhpcy5oZWFkID0gcFxuICAgICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICArK2NcbiAgICB9IHdoaWxlICgocCA9IHAubmV4dCkgIT09IG51bGwpXG4gICAgdGhpcy5sZW5ndGggLT0gY1xuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB0aGUgbGlua2VkIGxpc3Qgb25seSBzaG93cyB0aGUgbWluaW1hbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24uXG4gIFtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXShfLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3BlY3QodGhpcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIE9ubHkgaW5zcGVjdCBvbmUgbGV2ZWwuXG4gICAgICBkZXB0aDogMCxcbiAgICAgIC8vIEl0IHNob3VsZCBub3QgcmVjdXJzZS5cbiAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlXG4gICAgfSlcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgTWF0aEZsb29yLCBOdW1iZXJJc0ludGVnZXIgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJykuY29kZXNcbmZ1bmN0aW9uIGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpIHtcbiAgcmV0dXJuIG9wdGlvbnMuaGlnaFdhdGVyTWFyayAhPSBudWxsID8gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIDogaXNEdXBsZXggPyBvcHRpb25zW2R1cGxleEtleV0gOiBudWxsXG59XG5mdW5jdGlvbiBnZXREZWZhdWx0SGlnaFdhdGVyTWFyayhvYmplY3RNb2RlKSB7XG4gIHJldHVybiBvYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjRcbn1cbmZ1bmN0aW9uIGdldEhpZ2hXYXRlck1hcmsoc3RhdGUsIG9wdGlvbnMsIGR1cGxleEtleSwgaXNEdXBsZXgpIHtcbiAgY29uc3QgaHdtID0gaGlnaFdhdGVyTWFya0Zyb20ob3B0aW9ucywgaXNEdXBsZXgsIGR1cGxleEtleSlcbiAgaWYgKGh3bSAhPSBudWxsKSB7XG4gICAgaWYgKCFOdW1iZXJJc0ludGVnZXIoaHdtKSB8fCBod20gPCAwKSB7XG4gICAgICBjb25zdCBuYW1lID0gaXNEdXBsZXggPyBgb3B0aW9ucy4ke2R1cGxleEtleX1gIDogJ29wdGlvbnMuaGlnaFdhdGVyTWFyaydcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUobmFtZSwgaHdtKVxuICAgIH1cbiAgICByZXR1cm4gTWF0aEZsb29yKGh3bSlcbiAgfVxuXG4gIC8vIERlZmF1bHQgdmFsdWVcbiAgcmV0dXJuIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKHN0YXRlLm9iamVjdE1vZGUpXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0SGlnaFdhdGVyTWFyayxcbiAgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cblxuY29uc3QgeyBQcm9taXNlUHJvdG90eXBlVGhlbiwgU3ltYm9sQXN5bmNJdGVyYXRvciwgU3ltYm9sSXRlcmF0b3IgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfU1RSRUFNX05VTExfVkFMVUVTIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpLmNvZGVzXG5mdW5jdGlvbiBmcm9tKFJlYWRhYmxlLCBpdGVyYWJsZSwgb3B0cykge1xuICBsZXQgaXRlcmF0b3JcbiAgaWYgKHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycgfHwgaXRlcmFibGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKGl0ZXJhYmxlKVxuICAgICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGxldCBpc0FzeW5jXG4gIGlmIChpdGVyYWJsZSAmJiBpdGVyYWJsZVtTeW1ib2xBc3luY0l0ZXJhdG9yXSkge1xuICAgIGlzQXN5bmMgPSB0cnVlXG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2xBc3luY0l0ZXJhdG9yXSgpXG4gIH0gZWxzZSBpZiAoaXRlcmFibGUgJiYgaXRlcmFibGVbU3ltYm9sSXRlcmF0b3JdKSB7XG4gICAgaXNBc3luYyA9IGZhbHNlXG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2xJdGVyYXRvcl0oKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnaXRlcmFibGUnLCBbJ0l0ZXJhYmxlJ10sIGl0ZXJhYmxlKVxuICB9XG4gIGNvbnN0IHJlYWRhYmxlID0gbmV3IFJlYWRhYmxlKHtcbiAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgIGhpZ2hXYXRlck1hcms6IDEsXG4gICAgLy8gVE9ETyhyb25hZyk6IFdoYXQgb3B0aW9ucyBzaG91bGQgYmUgYWxsb3dlZD9cbiAgICAuLi5vcHRzXG4gIH0pXG5cbiAgLy8gRmxhZyB0byBwcm90ZWN0IGFnYWluc3QgX3JlYWRcbiAgLy8gYmVpbmcgY2FsbGVkIGJlZm9yZSBsYXN0IGl0ZXJhdGlvbiBjb21wbGV0aW9uLlxuICBsZXQgcmVhZGluZyA9IGZhbHNlXG4gIHJlYWRhYmxlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcmVhZGluZykge1xuICAgICAgcmVhZGluZyA9IHRydWVcbiAgICAgIG5leHQoKVxuICAgIH1cbiAgfVxuICByZWFkYWJsZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnJvciwgY2IpIHtcbiAgICBQcm9taXNlUHJvdG90eXBlVGhlbihcbiAgICAgIGNsb3NlKGVycm9yKSxcbiAgICAgICgpID0+IHByb2Nlc3MubmV4dFRpY2soY2IsIGVycm9yKSxcbiAgICAgIC8vIG5leHRUaWNrIGlzIGhlcmUgaW4gY2FzZSBjYiB0aHJvd3NcbiAgICAgIChlKSA9PiBwcm9jZXNzLm5leHRUaWNrKGNiLCBlIHx8IGVycm9yKVxuICAgIClcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjbG9zZShlcnJvcikge1xuICAgIGNvbnN0IGhhZEVycm9yID0gZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBlcnJvciAhPT0gbnVsbFxuICAgIGNvbnN0IGhhc1Rocm93ID0gdHlwZW9mIGl0ZXJhdG9yLnRocm93ID09PSAnZnVuY3Rpb24nXG4gICAgaWYgKGhhZEVycm9yICYmIGhhc1Rocm93KSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnJvcilcbiAgICAgIGF3YWl0IHZhbHVlXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICBhd2FpdCB2YWx1ZVxuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBuZXh0KCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlzQXN5bmMgPyBhd2FpdCBpdGVyYXRvci5uZXh0KCkgOiBpdGVyYXRvci5uZXh0KClcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICByZWFkYWJsZS5wdXNoKG51bGwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicgPyBhd2FpdCB2YWx1ZSA6IHZhbHVlXG4gICAgICAgICAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpXG4gICAgICAgICAgfSBlbHNlIGlmIChyZWFkYWJsZS5wdXNoKHJlcykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlYWRhYmxlLmRlc3Ryb3koZXJyKVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlYWRhYmxlXG59XG5tb2R1bGUuZXhwb3J0cyA9IGZyb21cbiIsIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3Qge1xuICBBcnJheVByb3RvdHlwZUluZGV4T2YsXG4gIE51bWJlcklzSW50ZWdlcixcbiAgTnVtYmVySXNOYU4sXG4gIE51bWJlclBhcnNlSW50LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0aWVzLFxuICBPYmplY3RLZXlzLFxuICBPYmplY3RTZXRQcm90b3R5cGVPZixcbiAgUHJvbWlzZSxcbiAgU2FmZVNldCxcbiAgU3ltYm9sQXN5bmNJdGVyYXRvcixcbiAgU3ltYm9sXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgeyBTdHJlYW0sIHByZXBlbmRMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9sZWdhY3knKVxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IGFkZEFib3J0U2lnbmFsIH0gPSByZXF1aXJlKCcuL2FkZC1hYm9ydC1zaWduYWwnKVxuY29uc3QgZW9zID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJylcbmxldCBkZWJ1ZyA9IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpLmRlYnVnbG9nKCdzdHJlYW0nLCAoZm4pID0+IHtcbiAgZGVidWcgPSBmblxufSlcbmNvbnN0IEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2J1ZmZlcl9saXN0JylcbmNvbnN0IGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IHsgZ2V0SGlnaFdhdGVyTWFyaywgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsgfSA9IHJlcXVpcmUoJy4vc3RhdGUnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gICAgRVJSX09VVF9PRl9SQU5HRSxcbiAgICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GLFxuICAgIEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlRcbiAgfVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVPYmplY3QgfSA9IHJlcXVpcmUoJy4uL3ZhbGlkYXRvcnMnKVxuY29uc3Qga1BhdXNlZCA9IFN5bWJvbCgna1BhdXNlZCcpXG5jb25zdCB7IFN0cmluZ0RlY29kZXIgfSA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJylcbmNvbnN0IGZyb20gPSByZXF1aXJlKCcuL2Zyb20nKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUmVhZGFibGUucHJvdG90eXBlLCBTdHJlYW0ucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUmVhZGFibGUsIFN0cmVhbSlcbmNvbnN0IG5vcCA9ICgpID0+IHt9XG5jb25zdCB7IGVycm9yT3JEZXN0cm95IH0gPSBkZXN0cm95SW1wbFxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7XG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcblxuICAvLyBPYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheS5cbiAgdGhpcy5vYmplY3RNb2RlID0gISEob3B0aW9ucyAmJiBvcHRpb25zLm9iamVjdE1vZGUpXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUpXG5cbiAgLy8gVGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBvcHRpb25zXG4gICAgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleClcbiAgICA6IGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKGZhbHNlKVxuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KCkuXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKVxuICB0aGlzLmxlbmd0aCA9IDBcbiAgdGhpcy5waXBlcyA9IFtdXG4gIHRoaXMuZmxvd2luZyA9IG51bGxcbiAgdGhpcy5lbmRlZCA9IGZhbHNlXG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlXG4gIHRoaXMucmVhZGluZyA9IGZhbHNlXG5cbiAgLy8gU3RyZWFtIGlzIHN0aWxsIGJlaW5nIGNvbnN0cnVjdGVkIGFuZCBjYW5ub3QgYmVcbiAgLy8gZGVzdHJveWVkIHVudGlsIGNvbnN0cnVjdGlvbiBmaW5pc2hlZCBvciBmYWlsZWQuXG4gIC8vIEFzeW5jIGNvbnN0cnVjdGlvbiBpcyBvcHQgaW4sIHRoZXJlZm9yZSB3ZSBzdGFydCBhc1xuICAvLyBjb25zdHJ1Y3RlZC5cbiAgdGhpcy5jb25zdHJ1Y3RlZCA9IHRydWVcblxuICAvLyBBIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWVcblxuICAvLyBXaGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZVxuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlXG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZVxuICB0aGlzLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlXG4gIHRoaXNba1BhdXNlZF0gPSBudWxsXG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW4uXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2VcblxuICAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuICB0aGlzLmVtaXRDbG9zZSA9ICFvcHRpb25zIHx8IG9wdGlvbnMuZW1pdENsb3NlICE9PSBmYWxzZVxuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZW5kJyAoYW5kIHBvdGVudGlhbGx5ICdmaW5pc2gnKS5cbiAgdGhpcy5hdXRvRGVzdHJveSA9ICFvcHRpb25zIHx8IG9wdGlvbnMuYXV0b0Rlc3Ryb3kgIT09IGZhbHNlXG5cbiAgLy8gSGFzIGl0IGJlZW4gZGVzdHJveWVkLlxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlXG5cbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZXJyb3JlZC4gV2hlbiB0cnVlIG5vIGZ1cnRoZXJcbiAgLy8gX3JlYWQgY2FsbHMsICdkYXRhJyBvciAncmVhZGFibGUnIGV2ZW50cyBzaG91bGQgb2NjdXIuIFRoaXMgaXMgbmVlZGVkXG4gIC8vIHNpbmNlIHdoZW4gYXV0b0Rlc3Ryb3kgaXMgZGlzYWJsZWQgd2UgbmVlZCBhIHdheSB0byB0ZWxsIHdoZXRoZXIgdGhlXG4gIC8vIHN0cmVhbSBoYXMgZmFpbGVkLlxuICB0aGlzLmVycm9yZWQgPSBudWxsXG5cbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZGVzdHJveWluZy5cbiAgdGhpcy5jbG9zZWQgPSBmYWxzZVxuXG4gIC8vIFRydWUgaWYgY2xvc2UgaGFzIGJlZW4gZW1pdHRlZCBvciB3b3VsZCBoYXZlIGJlZW4gZW1pdHRlZFxuICAvLyBkZXBlbmRpbmcgb24gZW1pdENsb3NlLlxuICB0aGlzLmNsb3NlRW1pdHRlZCA9IGZhbHNlXG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRFbmNvZGluZykgfHwgJ3V0ZjgnXG5cbiAgLy8gUmVmIHRoZSBwaXBlZCBkZXN0IHdoaWNoIHdlIG5lZWQgYSBkcmFpbiBldmVudCBvbiBpdFxuICAvLyB0eXBlOiBudWxsIHwgV3JpdGFibGUgfCBTZXQ8V3JpdGFibGU+LlxuICB0aGlzLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICB0aGlzLm11bHRpQXdhaXREcmFpbiA9IGZhbHNlXG5cbiAgLy8gSWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZC5cbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlXG4gIHRoaXMuZGF0YUVtaXR0ZWQgPSBmYWxzZVxuICB0aGlzLmRlY29kZXIgPSBudWxsXG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKVxuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nXG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKVxuXG4gIC8vIENoZWNraW5nIGZvciBhIFN0cmVhbS5EdXBsZXggaW5zdGFuY2UgaXMgZmFzdGVyIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGVcbiAgLy8gdGhlIFJlYWRhYmxlU3RhdGUgY29uc3RydWN0b3IsIGF0IGxlYXN0IHdpdGggVjggNi41LlxuICBjb25zdCBpc0R1cGxleCA9IHRoaXMgaW5zdGFuY2VvZiByZXF1aXJlKCcuL2R1cGxleCcpXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzLCBpc0R1cGxleClcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZFxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnN0cnVjdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fY29uc3RydWN0ID0gb3B0aW9ucy5jb25zdHJ1Y3RcbiAgICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWlzRHVwbGV4KSBhZGRBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgdGhpcylcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzLCBvcHRpb25zKVxuICBkZXN0cm95SW1wbC5jb25zdHJ1Y3QodGhpcywgKCkgPT4ge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSkge1xuICAgICAgbWF5YmVSZWFkTW9yZSh0aGlzLCB0aGlzLl9yZWFkYWJsZVN0YXRlKVxuICAgIH1cbiAgfSlcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveVxuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3lcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycilcbn1cblJlYWRhYmxlLnByb3RvdHlwZVtFRS5jYXB0dXJlUmVqZWN0aW9uU3ltYm9sXSA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdGhpcy5kZXN0cm95KGVycilcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpXG59XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpLlxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgdHJ1ZSlcbn1cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgZGVidWcoJ3JlYWRhYmxlQWRkQ2h1bmsnLCBjaHVuaylcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgbGV0IGVyclxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2RpbmdcbiAgICAgIGlmIChzdGF0ZS5lbmNvZGluZyAhPT0gZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKGFkZFRvRnJvbnQgJiYgc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgICAvLyBXaGVuIHVuc2hpZnRpbmcsIGlmIHN0YXRlLmVuY29kaW5nIGlzIHNldCwgd2UgaGF2ZSB0byBzYXZlXG4gICAgICAgICAgLy8gdGhlIHN0cmluZyBpbiB0aGUgQnVmZmVyTGlzdCB3aXRoIHRoZSBzdGF0ZSBlbmNvZGluZy5cbiAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZykudG9TdHJpbmcoc3RhdGUuZW5jb2RpbmcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpXG4gICAgICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgIH0gZWxzZSBpZiAoU3RyZWFtLl9pc1VpbnQ4QXJyYXkoY2h1bmspKSB7XG4gICAgICBjaHVuayA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyKGNodW5rKVxuICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgIH0gZWxzZSBpZiAoY2h1bmsgIT0gbnVsbCkge1xuICAgICAgZXJyID0gbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdjaHVuaycsIFsnc3RyaW5nJywgJ0J1ZmZlcicsICdVaW50OEFycmF5J10sIGNodW5rKVxuICAgIH1cbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpXG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpXG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkpIHtcbiAgICBpZiAoYWRkVG9Gcm9udCkge1xuICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQoKSlcbiAgICAgIGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCB8fCBzdGF0ZS5lcnJvcmVkKSByZXR1cm4gZmFsc2VcbiAgICAgIGVsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRigpKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkIHx8IHN0YXRlLmVycm9yZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspXG4gICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKVxuICAgICAgICBlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpXG4gIH1cblxuICAvLyBXZSBjYW4gcHVzaCBtb3JlIGRhdGEgaWYgd2UgYXJlIGJlbG93IHRoZSBoaWdoV2F0ZXJNYXJrLlxuICAvLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZSBtb3JlIGJ5dGVzLlxuICAvLyBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLCBzdWNoIGFzIHRoZSByZXBsLlxuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMClcbn1cbmZ1bmN0aW9uIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBhZGRUb0Zyb250KSB7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYyAmJiBzdHJlYW0ubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIC8vIFVzZSB0aGUgZ3VhcmQgdG8gYXZvaWQgY3JlYXRpbmcgYFNldCgpYCByZXBlYXRlZGx5XG4gICAgLy8gd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHBpcGVzLlxuICAgIGlmIChzdGF0ZS5tdWx0aUF3YWl0RHJhaW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gICAgfVxuICAgIHN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspXG4gIH0gZWxzZSB7XG4gICAgLy8gVXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGhcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspXG4gICAgZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuaylcbiAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKVxuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSlcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIHJldHVybiBzdGF0ZVtrUGF1c2VkXSA9PT0gdHJ1ZSB8fCBzdGF0ZS5mbG93aW5nID09PSBmYWxzZVxufVxuXG4vLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYylcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gZGVjb2RlclxuICAvLyBJZiBzZXRFbmNvZGluZyhudWxsKSwgZGVjb2Rlci5lbmNvZGluZyBlcXVhbHMgdXRmOC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZ1xuICBjb25zdCBidWZmZXIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlclxuICAvLyBJdGVyYXRlIG92ZXIgY3VycmVudCBidWZmZXIgdG8gY29udmVydCBhbHJlYWR5IHN0b3JlZCBCdWZmZXJzOlxuICBsZXQgY29udGVudCA9ICcnXG4gIGZvciAoY29uc3QgZGF0YSBvZiBidWZmZXIpIHtcbiAgICBjb250ZW50ICs9IGRlY29kZXIud3JpdGUoZGF0YSlcbiAgfVxuICBidWZmZXIuY2xlYXIoKVxuICBpZiAoY29udGVudCAhPT0gJycpIGJ1ZmZlci5wdXNoKGNvbnRlbnQpXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoID0gY29udGVudC5sZW5ndGhcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDFHQi5cbmNvbnN0IE1BWF9IV00gPSAweDQwMDAwMDAwXG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID4gTUFYX0hXTSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKCdzaXplJywgJzw9IDFHaUInLCBuKVxuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIgdG8gcHJldmVudCBpbmNyZWFzaW5nIGh3bSBleGNlc3NpdmVseSBpblxuICAgIC8vIHRpbnkgYW1vdW50cy5cbiAgICBuLS1cbiAgICBuIHw9IG4gPj4+IDFcbiAgICBuIHw9IG4gPj4+IDJcbiAgICBuIHw9IG4gPj4+IDRcbiAgICBuIHw9IG4gPj4+IDhcbiAgICBuIHw9IG4gPj4+IDE2XG4gICAgbisrXG4gIH1cbiAgcmV0dXJuIG5cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkpIHJldHVybiAwXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXR1cm4gMVxuICBpZiAoTnVtYmVySXNOYU4obikpIHtcbiAgICAvLyBPbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWUuXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmZpcnN0KCkubGVuZ3RoXG4gICAgcmV0dXJuIHN0YXRlLmxlbmd0aFxuICB9XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG5cbiAgcmV0dXJuIHN0YXRlLmVuZGVkID8gc3RhdGUubGVuZ3RoIDogMFxufVxuXG4vLyBZb3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pXG4gIC8vIFNhbWUgYXMgcGFyc2VJbnQodW5kZWZpbmVkLCAxMCksIGhvd2V2ZXIgVjggNy4zIHBlcmZvcm1hbmNlIHJlZ3Jlc3NlZFxuICAvLyBpbiB0aGlzIHNjZW5hcmlvLCBzbyB3ZSBhcmUgZG9pbmcgaXQgbWFudWFsbHkuXG4gIGlmIChuID09PSB1bmRlZmluZWQpIHtcbiAgICBuID0gTmFOXG4gIH0gZWxzZSBpZiAoIU51bWJlcklzSW50ZWdlcihuKSkge1xuICAgIG4gPSBOdW1iZXJQYXJzZUludChuLCAxMClcbiAgfVxuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgbk9yaWcgPSBuXG5cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgaHdtLCB0aGVuIHJhaXNlIHRoZSBod20uXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pXG4gIGlmIChuICE9PSAwKSBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZVxuXG4gIC8vIElmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKFxuICAgIG4gPT09IDAgJiZcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgJiZcbiAgICAoKHN0YXRlLmhpZ2hXYXRlck1hcmsgIT09IDAgPyBzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayA6IHN0YXRlLmxlbmd0aCA+IDApIHx8IHN0YXRlLmVuZGVkKVxuICApIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZClcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKVxuICAgIGVsc2UgZW1pdFJlYWRhYmxlKHRoaXMpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSlcblxuICAvLyBJZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcylcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIGxldCBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGVcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpXG5cbiAgLy8gSWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lLlxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZVxuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZClcbiAgfVxuXG4gIC8vIEhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LCBpZiB3ZSdyZSBjb25zdHJ1Y3Rpbmcgd2UgaGF2ZSB0byB3YWl0LFxuICAvLyBhbmQgaWYgd2UncmUgZGVzdHJveWVkIG9yIGVycm9yZWQsIHRoZW4gaXQncyBub3QgYWxsb3dlZCxcbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcgfHwgc3RhdGUuZGVzdHJveWVkIHx8IHN0YXRlLmVycm9yZWQgfHwgIXN0YXRlLmNvbnN0cnVjdGVkKSB7XG4gICAgZG9SZWFkID0gZmFsc2VcbiAgICBkZWJ1ZygncmVhZGluZywgZW5kZWQgb3IgY29uc3RydWN0aW5nJywgZG9SZWFkKVxuICB9IGVsc2UgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJylcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZVxuICAgIHN0YXRlLnN5bmMgPSB0cnVlXG4gICAgLy8gSWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlXG5cbiAgICAvLyBDYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHRoaXMsIGVycilcbiAgICB9XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlXG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpXG4gIH1cbiAgbGV0IHJldFxuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKVxuICBlbHNlIHJldCA9IG51bGxcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgbiA9IDBcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gblxuICAgIGlmIChzdGF0ZS5tdWx0aUF3YWl0RHJhaW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gICAgfVxuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZVxuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcylcbiAgfVxuICBpZiAocmV0ICE9PSBudWxsICYmICFzdGF0ZS5lcnJvckVtaXR0ZWQgJiYgIXN0YXRlLmNsb3NlRW1pdHRlZCkge1xuICAgIHN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIHRoaXMuZW1pdCgnZGF0YScsIHJldClcbiAgfVxuICByZXR1cm4gcmV0XG59XG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ29uRW9mQ2h1bmsnKVxuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVyblxuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIGNvbnN0IGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKVxuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKVxuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZVxuICBpZiAoc3RhdGUuc3luYykge1xuICAgIC8vIElmIHdlIGFyZSBzeW5jLCB3YWl0IHVudGlsIG5leHQgdGljayB0byBlbWl0IHRoZSBkYXRhLlxuICAgIC8vIE90aGVyd2lzZSB3ZSByaXNrIGVtaXR0aW5nIGRhdGEgaW4gdGhlIGZsb3coKVxuICAgIC8vIHRoZSByZWFkYWJsZSBjb2RlIHRyaWdnZXJzIGR1cmluZyBhIHJlYWQoKSBjYWxsLlxuICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2VcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlXG4gICAgLy8gV2UgaGF2ZSB0byBlbWl0IHJlYWRhYmxlIG5vdyB0aGF0IHdlIGFyZSBFT0YuIE1vZHVsZXNcbiAgICAvLyBpbiB0aGUgZWNvc3lzdGVtIChlLmcuIGRpY2VyKSByZWx5IG9uIHRoaXMgZXZlbnQgYmVpbmcgc3luYy5cbiAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSlcbiAgfVxufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpXG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlXG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZVxuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW1pdFJlYWRhYmxlXycsIHN0YXRlLmRlc3Ryb3llZCwgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZClcbiAgaWYgKCFzdGF0ZS5kZXN0cm95ZWQgJiYgIXN0YXRlLmVycm9yZWQgJiYgKHN0YXRlLmxlbmd0aCB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlXG4gIH1cblxuICAvLyBUaGUgc3RyZWFtIG5lZWRzIGFub3RoZXIgcmVhZGFibGUgZXZlbnQgaWY6XG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgZmxvdyhzdHJlYW0pXG59XG5cbi8vIEF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUgJiYgc3RhdGUuY29uc3RydWN0ZWQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWVcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKVxuICB9XG59XG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIC8vIEF0dGVtcHQgdG8gcmVhZCBtb3JlIGRhdGEgaWYgd2Ugc2hvdWxkLlxuICAvL1xuICAvLyBUaGUgY29uZGl0aW9ucyBmb3IgcmVhZGluZyBtb3JlIGRhdGEgYXJlIChvbmUgb2YpOlxuICAvLyAtIE5vdCBlbm91Z2ggZGF0YSBidWZmZXJlZCAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykuIFRoZSBsb29wXG4gIC8vICAgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgdGhlIGJ1ZmZlciB3aXRoIGVub3VnaCBkYXRhIGlmIHN1Y2ggZGF0YVxuICAvLyAgIGlzIGF2YWlsYWJsZS4gSWYgaGlnaFdhdGVyTWFyayBpcyAwIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBmbG93aW5nIG1vZGVcbiAgLy8gICB3ZSBzaG91bGQgX25vdF8gYXR0ZW1wdCB0byBidWZmZXIgYW55IGV4dHJhIGRhdGEuIFdlJ2xsIGdldCBtb3JlIGRhdGFcbiAgLy8gICB3aGVuIHRoZSBzdHJlYW0gY29uc3VtZXIgY2FsbHMgcmVhZCgpIGluc3RlYWQuXG4gIC8vIC0gTm8gZGF0YSBpbiB0aGUgYnVmZmVyLCBhbmQgdGhlIHN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUuIEluIHRoaXMgbW9kZVxuICAvLyAgIHRoZSBsb29wIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyByZWFkKCkgaXMgY2FsbGVkLiBGYWlsaW5nIHRvXG4gIC8vICAgY2FsbCByZWFkIGhlcmUgd291bGQgYWJvcnQgdGhlIGZsb3cgYW5kIHRoZXJlJ3Mgbm8gb3RoZXIgbWVjaGFuaXNtIGZvclxuICAvLyAgIGNvbnRpbnVpbmcgdGhlIGZsb3cgaWYgdGhlIHN0cmVhbSBjb25zdW1lciBoYXMganVzdCBzdWJzY3JpYmVkIHRvIHRoZVxuICAvLyAgICdkYXRhJyBldmVudC5cbiAgLy9cbiAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGNvbmRpdGlvbnMgdG8ga2VlcCByZWFkaW5nIGRhdGEsIHRoZSBmb2xsb3dpbmdcbiAgLy8gY29uZGl0aW9ucyBwcmV2ZW50IHRoZSBkYXRhIGZyb20gYmVpbmcgcmVhZDpcbiAgLy8gLSBUaGUgc3RyZWFtIGhhcyBlbmRlZCAoc3RhdGUuZW5kZWQpLlxuICAvLyAtIFRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nICdyZWFkJyBvcGVyYXRpb24gKHN0YXRlLnJlYWRpbmcpLiBUaGlzIGlzIGFcbiAgLy8gICBjYXNlIHdoZXJlIHRoZSBzdHJlYW0gaGFzIGNhbGxlZCB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBfcmVhZCgpXG4gIC8vICAgbWV0aG9kLCBidXQgdGhleSBhcmUgcHJvY2Vzc2luZyB0aGUgY2FsbCBhc3luY2hyb25vdXNseSBhbmQgaGF2ZSBfbm90X1xuICAvLyAgIGNhbGxlZCBwdXNoKCkgd2l0aCBuZXcgZGF0YS4gSW4gdGhpcyBjYXNlIHdlIHNraXAgcGVyZm9ybWluZyBtb3JlXG4gIC8vICAgcmVhZCgpcy4gVGhlIGV4ZWN1dGlvbiBlbmRzIGluIHRoaXMgbWV0aG9kIGFnYWluIGFmdGVyIHRoZSBfcmVhZCgpIGVuZHNcbiAgLy8gICB1cCBjYWxsaW5nIHB1c2goKSB3aXRoIG1vcmUgZGF0YS5cbiAgd2hpbGUgKFxuICAgICFzdGF0ZS5yZWFkaW5nICYmXG4gICAgIXN0YXRlLmVuZGVkICYmXG4gICAgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSlcbiAgKSB7XG4gICAgY29uc3QgbGVuID0gc3RhdGUubGVuZ3RoXG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJylcbiAgICBzdHJlYW0ucmVhZCgwKVxuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIERpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVha1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2Vcbn1cblxuLy8gQWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aHJvdyBuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ19yZWFkKCknKVxufVxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgY29uc3Qgc3JjID0gdGhpc1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgaWYgKHN0YXRlLnBpcGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICghc3RhdGUubXVsdGlBd2FpdERyYWluKSB7XG4gICAgICBzdGF0ZS5tdWx0aUF3YWl0RHJhaW4gPSB0cnVlXG4gICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IG5ldyBTYWZlU2V0KHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID8gW3N0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzXSA6IFtdKVxuICAgIH1cbiAgfVxuICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpXG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlcy5sZW5ndGgsIHBpcGVPcHRzKVxuICBjb25zdCBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnJcbiAgY29uc3QgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlXG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzLm5leHRUaWNrKGVuZEZuKVxuICBlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbilcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpXG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlLCB1bnBpcGVJbmZvKSB7XG4gICAgZGVidWcoJ29udW5waXBlJylcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlXG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKVxuICAgIGRlc3QuZW5kKClcbiAgfVxuICBsZXQgb25kcmFpblxuICBsZXQgY2xlYW5lZFVwID0gZmFsc2VcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpXG4gICAgLy8gQ2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlbi5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgaWYgKG9uZHJhaW4pIHtcbiAgICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICB9XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKVxuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGNsZWFuZWRVcCA9IHRydWVcblxuICAgIC8vIElmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKG9uZHJhaW4gJiYgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgJiYgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSkgb25kcmFpbigpXG4gIH1cbiAgZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgIGlmICghY2xlYW5lZFVwKSB7XG4gICAgICBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID09PSAxICYmIHN0YXRlLnBpcGVzWzBdID09PSBkZXN0KSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCAwKVxuICAgICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IGRlc3RcbiAgICAgICAgc3RhdGUubXVsdGlBd2FpdERyYWluID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID4gMSAmJiBzdGF0ZS5waXBlcy5pbmNsdWRlcyhkZXN0KSkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuc2l6ZSlcbiAgICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuYWRkKGRlc3QpXG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKVxuICAgIH1cbiAgICBpZiAoIW9uZHJhaW4pIHtcbiAgICAgIC8vIFdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgICAgIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAgICAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgICAgIC8vIHRvbyBzbG93LlxuICAgICAgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYywgZGVzdClcbiAgICAgIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcbiAgICB9XG4gIH1cbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJylcbiAgICBjb25zdCByZXQgPSBkZXN0LndyaXRlKGNodW5rKVxuICAgIGRlYnVnKCdkZXN0LndyaXRlJywgcmV0KVxuICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICBwYXVzZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIEhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpXG4gICAgdW5waXBlKClcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgaWYgKGRlc3QubGlzdGVuZXJDb3VudCgnZXJyb3InKSA9PT0gMCkge1xuICAgICAgY29uc3QgcyA9IGRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKHMgJiYgIXMuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIC8vIFVzZXIgaW5jb3JyZWN0bHkgZW1pdHRlZCAnZXJyb3InIGRpcmVjdGx5IG9uIHRoZSBzdHJlYW0uXG4gICAgICAgIGVycm9yT3JEZXN0cm95KGRlc3QsIGVyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpXG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgICB1bnBpcGUoKVxuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKVxuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgICB1bnBpcGUoKVxuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJylcbiAgICBzcmMudW5waXBlKGRlc3QpXG4gIH1cblxuICAvLyBUZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0by5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKVxuXG4gIC8vIFN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cblxuICBpZiAoZGVzdC53cml0YWJsZU5lZWREcmFpbiA9PT0gdHJ1ZSkge1xuICAgIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgICBwYXVzZSgpXG4gICAgfVxuICB9IGVsc2UgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJylcbiAgICBzcmMucmVzdW1lKClcbiAgfVxuICByZXR1cm4gZGVzdFxufVxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjLCBkZXN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBwaXBlT25EcmFpbkZ1bmN0aW9uUmVzdWx0KCkge1xuICAgIGNvbnN0IHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlXG5cbiAgICAvLyBgb25kcmFpbmAgd2lsbCBjYWxsIGRpcmVjdGx5LFxuICAgIC8vIGB0aGlzYCBtYXliZSBub3QgYSByZWZlcmVuY2UgdG8gZGVzdCxcbiAgICAvLyBzbyB3ZSB1c2UgdGhlIHJlYWwgZGVzdCBoZXJlLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9PT0gZGVzdCkge1xuICAgICAgZGVidWcoJ3BpcGVPbkRyYWluJywgMSlcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICAgIH0gZWxzZSBpZiAoc3RhdGUubXVsdGlBd2FpdERyYWluKSB7XG4gICAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluV3JpdGVycy5zaXplKVxuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuZGVsZXRlKGRlc3QpXG4gICAgfVxuICAgIGlmICgoIXN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzIHx8IHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLnNpemUgPT09IDApICYmIHNyYy5saXN0ZW5lckNvdW50KCdkYXRhJykpIHtcbiAgICAgIHNyYy5yZXN1bWUoKVxuICAgIH1cbiAgfVxufVxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB1bnBpcGVJbmZvID0ge1xuICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gIH1cblxuICAvLyBJZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlcy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgY29uc3QgZGVzdHMgPSBzdGF0ZS5waXBlc1xuICAgIHN0YXRlLnBpcGVzID0gW11cbiAgICB0aGlzLnBhdXNlKClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3RzLmxlbmd0aDsgaSsrKVxuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcywge1xuICAgICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgICAgfSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gVHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgY29uc3QgaW5kZXggPSBBcnJheVByb3RvdHlwZUluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpXG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwgMSlcbiAgaWYgKHN0YXRlLnBpcGVzLmxlbmd0aCA9PT0gMCkgdGhpcy5wYXVzZSgpXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gU2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmcuXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIGNvbnN0IHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pXG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgIC8vIFVwZGF0ZSByZWFkYWJsZUxpc3RlbmluZyBzbyB0aGF0IHJlc3VtZSgpIG1heSBiZSBhIG5vLW9wXG4gICAgLy8gYSBmZXcgbGluZXMgZG93bi4gVGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScpLlxuICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdGhpcy5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuXG4gICAgLy8gVHJ5IHN0YXJ0IGZsb3dpbmcgb24gbmV4dCB0aWNrIGlmIHN0cmVhbSBpc24ndCBleHBsaWNpdGx5IHBhdXNlZC5cbiAgICBpZiAoc3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKClcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZVxuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlXG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZVxuICAgICAgZGVidWcoJ29uIHJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5yZWFkaW5nKVxuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcylcbiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub25cblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgY29uc3QgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbilcbiAgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuUmVhZGFibGUucHJvdG90eXBlLm9mZiA9IFJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lclxuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIChldikge1xuICBjb25zdCByZXMgPSBTdHJlYW0ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZikge1xuICBjb25zdCBzdGF0ZSA9IHNlbGYuX3JlYWRhYmxlU3RhdGVcbiAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzZWxmLmxpc3RlbmVyQ291bnQoJ3JlYWRhYmxlJykgPiAwXG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgc3RhdGVba1BhdXNlZF0gPT09IGZhbHNlKSB7XG4gICAgLy8gRmxvd2luZyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZSBub3csIG90aGVyd2lzZVxuICAgIC8vIHRoZSB1cGNvbWluZyByZXN1bWUgd2lsbCBub3QgZmxvdy5cbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZVxuXG4gICAgLy8gQ3J1ZGUgd2F5IHRvIGNoZWNrIGlmIHdlIHNob3VsZCByZXN1bWUuXG4gIH0gZWxzZSBpZiAoc2VsZi5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKSB7XG4gICAgc2VsZi5yZXN1bWUoKVxuICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgIHN0YXRlLmZsb3dpbmcgPSBudWxsXG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJylcbiAgc2VsZi5yZWFkKDApXG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJylcbiAgICAvLyBXZSBmbG93IG9ubHkgaWYgdGhlcmUgaXMgbm8gb25lIGxpc3RlbmluZ1xuICAgIC8vIGZvciByZWFkYWJsZSwgYnV0IHdlIHN0aWxsIGhhdmUgdG8gY2FsbFxuICAgIC8vIHJlc3VtZSgpLlxuICAgIHN0YXRlLmZsb3dpbmcgPSAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmdcbiAgICByZXN1bWUodGhpcywgc3RhdGUpXG4gIH1cbiAgc3RhdGVba1BhdXNlZF0gPSBmYWxzZVxuICByZXR1cm4gdGhpc1xufVxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKVxuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpXG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIHN0cmVhbS5yZWFkKDApXG4gIH1cbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2VcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpXG4gIGZsb3coc3RyZWFtKVxuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMClcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZylcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHtcbiAgICBkZWJ1ZygncGF1c2UnKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdwYXVzZScpXG4gIH1cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZVtrUGF1c2VkXSA9IHRydWVcbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZylcbiAgd2hpbGUgKHN0YXRlLmZsb3dpbmcgJiYgc3RyZWFtLnJlYWQoKSAhPT0gbnVsbCk7XG59XG5cbi8vIFdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICBsZXQgcGF1c2VkID0gZmFsc2VcblxuICAvLyBUT0RPIChyb25hZyk6IFNob3VsZCB0aGlzLmRlc3Ryb3koZXJyKSBlbWl0XG4gIC8vICdlcnJvcicgb24gdGhlIHdyYXBwZWQgc3RyZWFtPyBXb3VsZCByZXF1aXJlXG4gIC8vIGEgc3RhdGljIGZhY3RvcnkgbWV0aG9kLCBlLmcuIFJlYWRhYmxlLndyYXAoc3RyZWFtKS5cblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBpZiAoIXRoaXMucHVzaChjaHVuaykgJiYgc3RyZWFtLnBhdXNlKSB7XG4gICAgICBwYXVzZWQgPSB0cnVlXG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcbiAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgdGhpcy5wdXNoKG51bGwpXG4gIH0pXG4gIHN0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgZXJyb3JPckRlc3Ryb3kodGhpcywgZXJyKVxuICB9KVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIHRoaXMuZGVzdHJveSgpXG4gIH0pXG4gIHN0cmVhbS5vbignZGVzdHJveScsICgpID0+IHtcbiAgICB0aGlzLmRlc3Ryb3koKVxuICB9KVxuICB0aGlzLl9yZWFkID0gKCkgPT4ge1xuICAgIGlmIChwYXVzZWQgJiYgc3RyZWFtLnJlc3VtZSkge1xuICAgICAgcGF1c2VkID0gZmFsc2VcbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy4gSW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGNvbnN0IHN0cmVhbUtleXMgPSBPYmplY3RLZXlzKHN0cmVhbSlcbiAgZm9yIChsZXQgaiA9IDE7IGogPCBzdHJlYW1LZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgY29uc3QgaSA9IHN0cmVhbUtleXNbal1cbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBzdHJlYW1baV0uYmluZChzdHJlYW0pXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5SZWFkYWJsZS5wcm90b3R5cGVbU3ltYm9sQXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBzdHJlYW1Ub0FzeW5jSXRlcmF0b3IodGhpcylcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pdGVyYXRvciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVRvQXN5bmNJdGVyYXRvcih0aGlzLCBvcHRpb25zKVxufVxuZnVuY3Rpb24gc3RyZWFtVG9Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHN0cmVhbS5yZWFkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtID0gUmVhZGFibGUud3JhcChzdHJlYW0sIHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWVcbiAgICB9KVxuICB9XG4gIGNvbnN0IGl0ZXIgPSBjcmVhdGVBc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucylcbiAgaXRlci5zdHJlYW0gPSBzdHJlYW1cbiAgcmV0dXJuIGl0ZXJcbn1cbmFzeW5jIGZ1bmN0aW9uKiBjcmVhdGVBc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucykge1xuICBsZXQgY2FsbGJhY2sgPSBub3BcbiAgZnVuY3Rpb24gbmV4dChyZXNvbHZlKSB7XG4gICAgaWYgKHRoaXMgPT09IHN0cmVhbSkge1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgY2FsbGJhY2sgPSBub3BcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSByZXNvbHZlXG4gICAgfVxuICB9XG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBuZXh0KVxuICBsZXQgZXJyb3JcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICAoZXJyKSA9PiB7XG4gICAgICBlcnJvciA9IGVyciA/IGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlcnJvciwgZXJyKSA6IG51bGxcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIGNhbGxiYWNrID0gbm9wXG4gICAgfVxuICApXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gc3RyZWFtLmRlc3Ryb3llZCA/IG51bGwgOiBzdHJlYW0ucmVhZCgpXG4gICAgICBpZiAoY2h1bmsgIT09IG51bGwpIHtcbiAgICAgICAgeWllbGQgY2h1bmtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShuZXh0KVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3IgPSBhZ2dyZWdhdGVUd29FcnJvcnMoZXJyb3IsIGVycilcbiAgICB0aHJvdyBlcnJvclxuICB9IGZpbmFsbHkge1xuICAgIGlmIChcbiAgICAgIChlcnJvciB8fCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLmRlc3Ryb3lPblJldHVybikgIT09IGZhbHNlKSAmJlxuICAgICAgKGVycm9yID09PSB1bmRlZmluZWQgfHwgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmF1dG9EZXN0cm95KVxuICAgICkge1xuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgbnVsbClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLm9mZigncmVhZGFibGUnLCBuZXh0KVxuICAgICAgY2xlYW51cCgpXG4gICAgfVxuICB9XG59XG5cbi8vIE1ha2luZyBpdCBleHBsaWNpdCB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgZW51bWVyYWJsZVxuLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4vLyB1c2VybGFuZCB3aWxsIGZhaWwuXG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlLnByb3RvdHlwZSwge1xuICByZWFkYWJsZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICAgICAgLy8gci5yZWFkYWJsZSA9PT0gZmFsc2UgbWVhbnMgdGhhdCB0aGlzIGlzIHBhcnQgb2YgYSBEdXBsZXggc3RyZWFtXG4gICAgICAvLyB3aGVyZSB0aGUgcmVhZGFibGUgc2lkZSB3YXMgZGlzYWJsZWQgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAvLyBDb21wYXQuIFRoZSB1c2VyIG1pZ2h0IG1hbnVhbGx5IGRpc2FibGUgcmVhZGFibGUgc2lkZSB0aHJvdWdoXG4gICAgICAvLyBkZXByZWNhdGVkIHNldHRlci5cbiAgICAgIHJldHVybiAhIXIgJiYgci5yZWFkYWJsZSAhPT0gZmFsc2UgJiYgIXIuZGVzdHJveWVkICYmICFyLmVycm9yRW1pdHRlZCAmJiAhci5lbmRFbWl0dGVkXG4gICAgfSxcbiAgICBzZXQodmFsKSB7XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LlxuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9ICEhdmFsXG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZWFkYWJsZURpZFJlYWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZFxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVBYm9ydGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhKFxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRhYmxlICE9PSBmYWxzZSAmJlxuICAgICAgICAodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgfHwgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvcmVkKSAmJlxuICAgICAgICAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkXG4gICAgICApXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUhpZ2hXYXRlck1hcms6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUJ1ZmZlcjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUZsb3dpbmc6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gc3RhdGVcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aFxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVPYmplY3RNb2RlOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlRW5jb2Rpbmc6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nIDogbnVsbFxuICAgIH1cbiAgfSxcbiAgZXJyb3JlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCA6IG51bGxcbiAgICB9XG4gIH0sXG4gIGNsb3NlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuY2xvc2VkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGRlc3Ryb3llZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkIDogZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgLy8gV2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LlxuICAgICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWQuXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkIDogZmFsc2VcbiAgICB9XG4gIH1cbn0pXG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RhdGUucHJvdG90eXBlLCB7XG4gIC8vIExlZ2FjeSBnZXR0ZXIgZm9yIGBwaXBlc0NvdW50YC5cbiAgcGlwZXNDb3VudDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5waXBlcy5sZW5ndGhcbiAgICB9XG4gIH0sXG4gIC8vIExlZ2FjeSBwcm9wZXJ0eSBmb3IgYHBhdXNlZGAuXG4gIHBhdXNlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpc1trUGF1c2VkXSAhPT0gZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgdGhpc1trUGF1c2VkXSA9ICEhdmFsdWVcbiAgICB9XG4gIH1cbn0pXG5cbi8vIEV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWQuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG4gIGxldCByZXRcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpXG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gUmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0LlxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJylcbiAgICBlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuZmlyc3QoKVxuICAgIGVsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpXG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKClcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdC5cbiAgICByZXQgPSBzdGF0ZS5idWZmZXIuY29uc3VtZShuLCBzdGF0ZS5kZWNvZGVyKVxuICB9XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKVxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWVcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pXG4gIH1cbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICBkZWJ1ZygnZW5kUmVhZGFibGVOVCcsIHN0YXRlLmVuZEVtaXR0ZWQsIHN0YXRlLmxlbmd0aClcblxuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lcnJvcmVkICYmICFzdGF0ZS5jbG9zZUVtaXR0ZWQgJiYgIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWVcbiAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICBpZiAoc3RyZWFtLndyaXRhYmxlICYmIHN0cmVhbS5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRXcml0YWJsZU5ULCBzdHJlYW0pXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIGEgd2F5IHRvIGRldGVjdFxuICAgICAgLy8gaWYgdGhlIHdyaXRhYmxlIHNpZGUgaXMgcmVhZHkgZm9yIGF1dG9EZXN0cm95IGFzIHdlbGwuXG4gICAgICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgICAgIGNvbnN0IGF1dG9EZXN0cm95ID1cbiAgICAgICAgIXdTdGF0ZSB8fFxuICAgICAgICAod1N0YXRlLmF1dG9EZXN0cm95ICYmXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHRoZSB3cml0YWJsZSB0byBldmVyICdmaW5pc2gnXG4gICAgICAgICAgLy8gaWYgd3JpdGFibGUgaXMgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgKHdTdGF0ZS5maW5pc2hlZCB8fCB3U3RhdGUud3JpdGFibGUgPT09IGZhbHNlKSlcbiAgICAgIGlmIChhdXRvRGVzdHJveSkge1xuICAgICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbmRXcml0YWJsZU5UKHN0cmVhbSkge1xuICBjb25zdCB3cml0YWJsZSA9IHN0cmVhbS53cml0YWJsZSAmJiAhc3RyZWFtLndyaXRhYmxlRW5kZWQgJiYgIXN0cmVhbS5kZXN0cm95ZWRcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgc3RyZWFtLmVuZCgpXG4gIH1cbn1cblJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbiAoaXRlcmFibGUsIG9wdHMpIHtcbiAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKVxufVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cblJlYWRhYmxlLmZyb21XZWIgPSBmdW5jdGlvbiAocmVhZGFibGVTdHJlYW0sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtUmVhZGFibGVGcm9tUmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0sIG9wdGlvbnMpXG59XG5SZWFkYWJsZS50b1dlYiA9IGZ1bmN0aW9uIChzdHJlYW1SZWFkYWJsZSwgb3B0aW9ucykge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdSZWFkYWJsZVN0cmVhbUZyb21TdHJlYW1SZWFkYWJsZShzdHJlYW1SZWFkYWJsZSwgb3B0aW9ucylcbn1cblJlYWRhYmxlLndyYXAgPSBmdW5jdGlvbiAoc3JjLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmLCBfc3JjJHJlYWRhYmxlT2JqZWN0TW9cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgb2JqZWN0TW9kZTpcbiAgICAgIChfcmVmID1cbiAgICAgICAgKF9zcmMkcmVhZGFibGVPYmplY3RNbyA9IHNyYy5yZWFkYWJsZU9iamVjdE1vZGUpICE9PSBudWxsICYmIF9zcmMkcmVhZGFibGVPYmplY3RNbyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBfc3JjJHJlYWRhYmxlT2JqZWN0TW9cbiAgICAgICAgICA6IHNyYy5vYmplY3RNb2RlKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfcmVmXG4gICAgICAgIDogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICAgIGRlc3Ryb3koZXJyLCBjYWxsYmFjaykge1xuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHNyYywgZXJyKVxuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH1cbiAgfSkud3JhcChzcmMpXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3Qge1xuICBBcnJheVByb3RvdHlwZVNsaWNlLFxuICBFcnJvcixcbiAgRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZSxcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHksXG4gIE9iamVjdERlZmluZVByb3BlcnRpZXMsXG4gIE9iamVjdFNldFByb3RvdHlwZU9mLFxuICBTdHJpbmdQcm90b3R5cGVUb0xvd2VyQ2FzZSxcbiAgU3ltYm9sLFxuICBTeW1ib2xIYXNJbnN0YW5jZVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZVxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGVcbmNvbnN0IHsgRXZlbnRFbWl0dGVyOiBFRSB9ID0gcmVxdWlyZSgnZXZlbnRzJylcbmNvbnN0IFN0cmVhbSA9IHJlcXVpcmUoJy4vbGVnYWN5JykuU3RyZWFtXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IHsgYWRkQWJvcnRTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWRkLWFib3J0LXNpZ25hbCcpXG5jb25zdCB7IGdldEhpZ2hXYXRlck1hcmssIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrIH0gPSByZXF1aXJlKCcuL3N0YXRlJylcbmNvbnN0IHtcbiAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELFxuICBFUlJfTVVMVElQTEVfQ0FMTEJBQ0ssXG4gIEVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsXG4gIEVSUl9TVFJFQU1fREVTVFJPWUVELFxuICBFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQsXG4gIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMsXG4gIEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELFxuICBFUlJfVU5LTk9XTl9FTkNPRElOR1xufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJykuY29kZXNcbmNvbnN0IHsgZXJyb3JPckRlc3Ryb3kgfSA9IGRlc3Ryb3lJbXBsXG5PYmplY3RTZXRQcm90b3R5cGVPZihXcml0YWJsZS5wcm90b3R5cGUsIFN0cmVhbS5wcm90b3R5cGUpXG5PYmplY3RTZXRQcm90b3R5cGVPZihXcml0YWJsZSwgU3RyZWFtKVxuZnVuY3Rpb24gbm9wKCkge31cbmNvbnN0IGtPbkZpbmlzaGVkID0gU3ltYm9sKCdrT25GaW5pc2hlZCcpXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSwgaXNEdXBsZXgpIHtcbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0sXG4gIC8vIGUuZy4gb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUgdnMuIG9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlLCBldGMuXG4gIGlmICh0eXBlb2YgaXNEdXBsZXggIT09ICdib29sZWFuJykgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiByZXF1aXJlKCcuL2R1cGxleCcpXG5cbiAgLy8gT2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISEob3B0aW9ucyAmJiBvcHRpb25zLm9iamVjdE1vZGUpXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGUpXG5cbiAgLy8gVGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBvcHRpb25zXG4gICAgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleClcbiAgICA6IGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKGZhbHNlKVxuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWQuXG4gIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZVxuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2VcbiAgLy8gQXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZVxuICAvLyBXaGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkLlxuICB0aGlzLmVuZGVkID0gZmFsc2VcbiAgLy8gV2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkLlxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2VcblxuICAvLyBIYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZVxuXG4gIC8vIFNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgY29uc3Qgbm9EZWNvZGUgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2UpXG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZVxuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpIHx8ICd1dGY4J1xuXG4gIC8vIE5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMFxuXG4gIC8vIEEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlXG5cbiAgLy8gV2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbC5cbiAgdGhpcy5jb3JrZWQgPSAwXG5cbiAgLy8gQSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWVcblxuICAvLyBBIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZVxuXG4gIC8vIFRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuaywgY2IpLlxuICB0aGlzLm9ud3JpdGUgPSBvbndyaXRlLmJpbmQodW5kZWZpbmVkLCBzdHJlYW0pXG5cbiAgLy8gVGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYikuXG4gIHRoaXMud3JpdGVjYiA9IG51bGxcblxuICAvLyBUaGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwXG5cbiAgLy8gU3RvcmFnZSBmb3IgZGF0YSBwYXNzZWQgdG8gdGhlIGFmdGVyV3JpdGUoKSBjYWxsYmFjayBpbiBjYXNlIG9mXG4gIC8vIHN5bmNocm9ub3VzIF93cml0ZSgpIGNvbXBsZXRpb24uXG4gIHRoaXMuYWZ0ZXJXcml0ZVRpY2tJbmZvID0gbnVsbFxuICByZXNldEJ1ZmZlcih0aGlzKVxuXG4gIC8vIE51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZC5cbiAgdGhpcy5wZW5kaW5nY2IgPSAwXG5cbiAgLy8gU3RyZWFtIGlzIHN0aWxsIGJlaW5nIGNvbnN0cnVjdGVkIGFuZCBjYW5ub3QgYmVcbiAgLy8gZGVzdHJveWVkIHVudGlsIGNvbnN0cnVjdGlvbiBmaW5pc2hlZCBvciBmYWlsZWQuXG4gIC8vIEFzeW5jIGNvbnN0cnVjdGlvbiBpcyBvcHQgaW4sIHRoZXJlZm9yZSB3ZSBzdGFydCBhc1xuICAvLyBjb25zdHJ1Y3RlZC5cbiAgdGhpcy5jb25zdHJ1Y3RlZCA9IHRydWVcblxuICAvLyBFbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zLlxuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2VcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2Fpbi5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZVxuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gIW9wdGlvbnMgfHwgb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlXG5cbiAgLy8gU2hvdWxkIC5kZXN0cm95KCkgYmUgY2FsbGVkIGFmdGVyICdmaW5pc2gnIChhbmQgcG90ZW50aWFsbHkgJ2VuZCcpLlxuICB0aGlzLmF1dG9EZXN0cm95ID0gIW9wdGlvbnMgfHwgb3B0aW9ucy5hdXRvRGVzdHJveSAhPT0gZmFsc2VcblxuICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBlcnJvcmVkLiBXaGVuIHRydWUgYWxsIHdyaXRlKCkgY2FsbHNcbiAgLy8gc2hvdWxkIHJldHVybiBmYWxzZS4gVGhpcyBpcyBuZWVkZWQgc2luY2Ugd2hlbiBhdXRvRGVzdHJveVxuICAvLyBpcyBkaXNhYmxlZCB3ZSBuZWVkIGEgd2F5IHRvIHRlbGwgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBmYWlsZWQuXG4gIHRoaXMuZXJyb3JlZCA9IG51bGxcblxuICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBmaW5pc2hlZCBkZXN0cm95aW5nLlxuICB0aGlzLmNsb3NlZCA9IGZhbHNlXG5cbiAgLy8gVHJ1ZSBpZiBjbG9zZSBoYXMgYmVlbiBlbWl0dGVkIG9yIHdvdWxkIGhhdmUgYmVlbiBlbWl0dGVkXG4gIC8vIGRlcGVuZGluZyBvbiBlbWl0Q2xvc2UuXG4gIHRoaXMuY2xvc2VFbWl0dGVkID0gZmFsc2VcbiAgdGhpc1trT25GaW5pc2hlZF0gPSBbXVxufVxuZnVuY3Rpb24gcmVzZXRCdWZmZXIoc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyZWQgPSBbXVxuICBzdGF0ZS5idWZmZXJlZEluZGV4ID0gMFxuICBzdGF0ZS5hbGxCdWZmZXJzID0gdHJ1ZVxuICBzdGF0ZS5hbGxOb29wID0gdHJ1ZVxufVxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICByZXR1cm4gQXJyYXlQcm90b3R5cGVTbGljZSh0aGlzLmJ1ZmZlcmVkLCB0aGlzLmJ1ZmZlcmVkSW5kZXgpXG59XG5PYmplY3REZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcmVkUmVxdWVzdENvdW50Jywge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJlZC5sZW5ndGggLSB0aGlzLmJ1ZmZlcmVkSW5kZXhcbiAgfVxufSlcbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG5cbiAgLy8gQ2hlY2tpbmcgZm9yIGEgU3RyZWFtLkR1cGxleCBpbnN0YW5jZSBpcyBmYXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZVxuICAvLyB0aGUgV3JpdGFibGVTdGF0ZSBjb25zdHJ1Y3RvciwgYXQgbGVhc3Qgd2l0aCBWOCA2LjUuXG4gIGNvbnN0IGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcbiAgaWYgKCFpc0R1cGxleCAmJiAhRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZShXcml0YWJsZSwgdGhpcykpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucylcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMsIGlzRHVwbGV4KVxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXZcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maW5hbCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmluYWwgPSBvcHRpb25zLmZpbmFsXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnN0cnVjdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fY29uc3RydWN0ID0gb3B0aW9ucy5jb25zdHJ1Y3RcbiAgICBpZiAob3B0aW9ucy5zaWduYWwpIGFkZEFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCB0aGlzKVxuICB9XG4gIFN0cmVhbS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGRlc3Ryb3lJbXBsLmNvbnN0cnVjdCh0aGlzLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nKSB7XG4gICAgICBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSlcbiAgICB9XG4gICAgZmluaXNoTWF5YmUodGhpcywgc3RhdGUpXG4gIH0pXG59XG5PYmplY3REZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sSGFzSW5zdGFuY2UsIHtcbiAgX19wcm90b19fOiBudWxsLFxuICB2YWx1ZTogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIGlmIChGdW5jdGlvblByb3RvdHlwZVN5bWJvbEhhc0luc3RhbmNlKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlXG4gICAgaWYgKHRoaXMgIT09IFdyaXRhYmxlKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGVcbiAgfVxufSlcblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIGVycm9yT3JEZXN0cm95KHRoaXMsIG5ldyBFUlJfU1RSRUFNX0NBTk5PVF9QSVBFKCkpXG59XG5mdW5jdGlvbiBfd3JpdGUoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2RpbmdcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZ1xuICAgIGVsc2UgaWYgKGVuY29kaW5nICE9PSAnYnVmZmVyJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB0aHJvdyBuZXcgRVJSX1VOS05PV05fRU5DT0RJTkcoZW5jb2RpbmcpXG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3BcbiAgfVxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpXG4gIH0gZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICdidWZmZXInXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJ1xuICAgIH0gZWxzZSBpZiAoU3RyZWFtLl9pc1VpbnQ4QXJyYXkoY2h1bmspKSB7XG4gICAgICBjaHVuayA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyKGNodW5rKVxuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJywgJ1VpbnQ4QXJyYXknXSwgY2h1bmspXG4gICAgfVxuICB9XG4gIGxldCBlcnJcbiAgaWYgKHN0YXRlLmVuZGluZykge1xuICAgIGVyciA9IG5ldyBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCgpXG4gIH0gZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgZXJyID0gbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCd3cml0ZScpXG4gIH1cbiAgaWYgKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIGVycilcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyciwgdHJ1ZSlcbiAgICByZXR1cm4gZXJyXG4gIH1cbiAgc3RhdGUucGVuZGluZ2NiKytcbiAgcmV0dXJuIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYilcbn1cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHJldHVybiBfd3JpdGUodGhpcywgY2h1bmssIGVuY29kaW5nLCBjYikgPT09IHRydWVcbn1cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrXG59XG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nKSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSlcbiAgfVxufVxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2UoZW5jb2RpbmcpXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB0aHJvdyBuZXcgRVJSX1VOS05PV05fRU5DT0RJTkcoZW5jb2RpbmcpXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2RpbmdcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjb25zdCBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICBzdGF0ZS5sZW5ndGggKz0gbGVuXG5cbiAgLy8gc3RyZWFtLl93cml0ZSByZXNldHMgc3RhdGUubGVuZ3RoXG4gIGNvbnN0IHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgLy8gV2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCB8fCBzdGF0ZS5lcnJvcmVkIHx8ICFzdGF0ZS5jb25zdHJ1Y3RlZCkge1xuICAgIHN0YXRlLmJ1ZmZlcmVkLnB1c2goe1xuICAgICAgY2h1bmssXG4gICAgICBlbmNvZGluZyxcbiAgICAgIGNhbGxiYWNrXG4gICAgfSlcbiAgICBpZiAoc3RhdGUuYWxsQnVmZmVycyAmJiBlbmNvZGluZyAhPT0gJ2J1ZmZlcicpIHtcbiAgICAgIHN0YXRlLmFsbEJ1ZmZlcnMgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoc3RhdGUuYWxsTm9vcCAmJiBjYWxsYmFjayAhPT0gbm9wKSB7XG4gICAgICBzdGF0ZS5hbGxOb29wID0gZmFsc2VcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUud3JpdGVsZW4gPSBsZW5cbiAgICBzdGF0ZS53cml0ZWNiID0gY2FsbGJhY2tcbiAgICBzdGF0ZS53cml0aW5nID0gdHJ1ZVxuICAgIHN0YXRlLnN5bmMgPSB0cnVlXG4gICAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpXG4gICAgc3RhdGUuc3luYyA9IGZhbHNlXG4gIH1cblxuICAvLyBSZXR1cm4gZmFsc2UgaWYgZXJyb3JlZCBvciBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gYnJlYWtcbiAgLy8gYW55IHN5bmNocm9ub3VzIHdoaWxlKHN0cmVhbS53cml0ZShkYXRhKSkgbG9vcHMuXG4gIHJldHVybiByZXQgJiYgIXN0YXRlLmVycm9yZWQgJiYgIXN0YXRlLmRlc3Ryb3llZFxufVxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlblxuICBzdGF0ZS53cml0ZWNiID0gY2JcbiAgc3RhdGUud3JpdGluZyA9IHRydWVcbiAgc3RhdGUuc3luYyA9IHRydWVcbiAgaWYgKHN0YXRlLmRlc3Ryb3llZCkgc3RhdGUub253cml0ZShuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoJ3dyaXRlJykpXG4gIGVsc2UgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpXG4gIGVsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpXG4gIHN0YXRlLnN5bmMgPSBmYWxzZVxufVxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYlxuICBjYihlcilcbiAgLy8gRW5zdXJlIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBldmVuIHdoZW4gYXV0b0Rlc3Ryb3kgaXNcbiAgLy8gbm90IGVuYWJsZWQuIFBhc3NpbmcgYGVyYCBoZXJlIGRvZXNuJ3QgbWFrZSBzZW5zZSBzaW5jZVxuICAvLyBpdCdzIHJlbGF0ZWQgdG8gb25lIHNwZWNpZmljIHdyaXRlLCBub3QgdG8gdGhlIGJ1ZmZlcmVkXG4gIC8vIHdyaXRlcy5cbiAgZXJyb3JCdWZmZXIoc3RhdGUpXG4gIC8vIFRoaXMgY2FuIGVtaXQgZXJyb3IsIGJ1dCBlcnJvciBtdXN0IGFsd2F5cyBmb2xsb3cgY2IuXG4gIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpXG59XG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3Qgc3luYyA9IHN0YXRlLnN5bmNcbiAgY29uc3QgY2IgPSBzdGF0ZS53cml0ZWNiXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKSlcbiAgICByZXR1cm5cbiAgfVxuICBzdGF0ZS53cml0aW5nID0gZmFsc2VcbiAgc3RhdGUud3JpdGVjYiA9IG51bGxcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuXG4gIHN0YXRlLndyaXRlbGVuID0gMFxuICBpZiAoZXIpIHtcbiAgICAvLyBBdm9pZCBWOCBsZWFrLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDEwMyNpc3N1ZWNvbW1lbnQtNjUyMDAyMzY0XG4gICAgZXIuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuICAgIGlmICghc3RhdGUuZXJyb3JlZCkge1xuICAgICAgc3RhdGUuZXJyb3JlZCA9IGVyXG4gICAgfVxuXG4gICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgcmVhZGFibGUgc2lkZSBvZiB0aGVcbiAgICAvLyBlcnJvci5cbiAgICBpZiAoc3RyZWFtLl9yZWFkYWJsZVN0YXRlICYmICFzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCkge1xuICAgICAgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVycm9yZWQgPSBlclxuICAgIH1cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhvbndyaXRlRXJyb3IsIHN0cmVhbSwgc3RhdGUsIGVyLCBjYilcbiAgICB9IGVsc2Uge1xuICAgICAgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIGVyLCBjYilcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHN0YXRlLmJ1ZmZlcmVkLmxlbmd0aCA+IHN0YXRlLmJ1ZmZlcmVkSW5kZXgpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpXG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvLyBJdCBpcyBhIGNvbW1vbiBjYXNlIHRoYXQgdGhlIGNhbGxiYWNrIHBhc3NlZCB0byAud3JpdGUoKSBpcyBhbHdheXNcbiAgICAgIC8vIHRoZSBzYW1lLiBJbiB0aGF0IGNhc2UsIHdlIGRvIG5vdCBzY2hlZHVsZSBhIG5ldyBuZXh0VGljaygpLCBidXRcbiAgICAgIC8vIHJhdGhlciBqdXN0IGluY3JlYXNlIGEgY291bnRlciwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgYXZvaWRcbiAgICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucy5cbiAgICAgIGlmIChzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8gIT09IG51bGwgJiYgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvLmNiID09PSBjYikge1xuICAgICAgICBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8uY291bnQrK1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvID0ge1xuICAgICAgICAgIGNvdW50OiAxLFxuICAgICAgICAgIGNiLFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soYWZ0ZXJXcml0ZVRpY2ssIHN0YXRlLmFmdGVyV3JpdGVUaWNrSW5mbylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCAxLCBjYilcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGFmdGVyV3JpdGVUaWNrKHsgc3RyZWFtLCBzdGF0ZSwgY291bnQsIGNiIH0pIHtcbiAgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvID0gbnVsbFxuICByZXR1cm4gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBjb3VudCwgY2IpXG59XG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGNvdW50LCBjYikge1xuICBjb25zdCBuZWVkRHJhaW4gPSAhc3RhdGUuZW5kaW5nICYmICFzdHJlYW0uZGVzdHJveWVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW5cbiAgaWYgKG5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlXG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJylcbiAgfVxuICB3aGlsZSAoY291bnQtLSA+IDApIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLVxuICAgIGNiKClcbiAgfVxuICBpZiAoc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgZXJyb3JCdWZmZXIoc3RhdGUpXG4gIH1cbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSlcbn1cblxuLy8gSWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIGludm9rZSBjYWxsYmFja3MuXG5mdW5jdGlvbiBlcnJvckJ1ZmZlcihzdGF0ZSkge1xuICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgIHJldHVyblxuICB9XG4gIGZvciAobGV0IG4gPSBzdGF0ZS5idWZmZXJlZEluZGV4OyBuIDwgc3RhdGUuYnVmZmVyZWQubGVuZ3RoOyArK24pIHtcbiAgICB2YXIgX3N0YXRlJGVycm9yZWRcbiAgICBjb25zdCB7IGNodW5rLCBjYWxsYmFjayB9ID0gc3RhdGUuYnVmZmVyZWRbbl1cbiAgICBjb25zdCBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICAgIHN0YXRlLmxlbmd0aCAtPSBsZW5cbiAgICBjYWxsYmFjayhcbiAgICAgIChfc3RhdGUkZXJyb3JlZCA9IHN0YXRlLmVycm9yZWQpICE9PSBudWxsICYmIF9zdGF0ZSRlcnJvcmVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfc3RhdGUkZXJyb3JlZFxuICAgICAgICA6IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnd3JpdGUnKVxuICAgIClcbiAgfVxuICBjb25zdCBvbmZpbmlzaENhbGxiYWNrcyA9IHN0YXRlW2tPbkZpbmlzaGVkXS5zcGxpY2UoMClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmZpbmlzaENhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfc3RhdGUkZXJyb3JlZDJcbiAgICBvbmZpbmlzaENhbGxiYWNrc1tpXShcbiAgICAgIChfc3RhdGUkZXJyb3JlZDIgPSBzdGF0ZS5lcnJvcmVkKSAhPT0gbnVsbCAmJiBfc3RhdGUkZXJyb3JlZDIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IF9zdGF0ZSRlcnJvcmVkMlxuICAgICAgICA6IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnZW5kJylcbiAgICApXG4gIH1cbiAgcmVzZXRCdWZmZXIoc3RhdGUpXG59XG5cbi8vIElmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0LlxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuY29ya2VkIHx8IHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgfHwgc3RhdGUuZGVzdHJveWVkIHx8ICFzdGF0ZS5jb25zdHJ1Y3RlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHsgYnVmZmVyZWQsIGJ1ZmZlcmVkSW5kZXgsIG9iamVjdE1vZGUgfSA9IHN0YXRlXG4gIGNvbnN0IGJ1ZmZlcmVkTGVuZ3RoID0gYnVmZmVyZWQubGVuZ3RoIC0gYnVmZmVyZWRJbmRleFxuICBpZiAoIWJ1ZmZlcmVkTGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGV0IGkgPSBidWZmZXJlZEluZGV4XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlXG4gIGlmIChidWZmZXJlZExlbmd0aCA+IDEgJiYgc3RyZWFtLl93cml0ZXYpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IgLT0gYnVmZmVyZWRMZW5ndGggLSAxXG4gICAgY29uc3QgY2FsbGJhY2sgPSBzdGF0ZS5hbGxOb29wXG4gICAgICA/IG5vcFxuICAgICAgOiAoZXJyKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgbiA9IGk7IG4gPCBidWZmZXJlZC5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgYnVmZmVyZWRbbl0uY2FsbGJhY2soZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIC8vIE1ha2UgYSBjb3B5IG9mIGBidWZmZXJlZGAgaWYgaXQncyBnb2luZyB0byBiZSB1c2VkIGJ5IGBjYWxsYmFja2AgYWJvdmUsXG4gICAgLy8gc2luY2UgYGRvV3JpdGVgIHdpbGwgbXV0YXRlIHRoZSBhcnJheS5cbiAgICBjb25zdCBjaHVua3MgPSBzdGF0ZS5hbGxOb29wICYmIGkgPT09IDAgPyBidWZmZXJlZCA6IEFycmF5UHJvdG90eXBlU2xpY2UoYnVmZmVyZWQsIGkpXG4gICAgY2h1bmtzLmFsbEJ1ZmZlcnMgPSBzdGF0ZS5hbGxCdWZmZXJzXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGNodW5rcywgJycsIGNhbGxiYWNrKVxuICAgIHJlc2V0QnVmZmVyKHN0YXRlKVxuICB9IGVsc2Uge1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHsgY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjayB9ID0gYnVmZmVyZWRbaV1cbiAgICAgIGJ1ZmZlcmVkW2krK10gPSBudWxsXG4gICAgICBjb25zdCBsZW4gPSBvYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKVxuICAgIH0gd2hpbGUgKGkgPCBidWZmZXJlZC5sZW5ndGggJiYgIXN0YXRlLndyaXRpbmcpXG4gICAgaWYgKGkgPT09IGJ1ZmZlcmVkLmxlbmd0aCkge1xuICAgICAgcmVzZXRCdWZmZXIoc3RhdGUpXG4gICAgfSBlbHNlIGlmIChpID4gMjU2KSB7XG4gICAgICBidWZmZXJlZC5zcGxpY2UoMCwgaSlcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkSW5kZXggPSAwXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkSW5kZXggPSBpXG4gICAgfVxuICB9XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZVxufVxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGlmICh0aGlzLl93cml0ZXYpIHtcbiAgICB0aGlzLl93cml0ZXYoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjaHVuayxcbiAgICAgICAgICBlbmNvZGluZ1xuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgY2JcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfd3JpdGUoKScpXG4gIH1cbn1cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbFxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVua1xuICAgIGNodW5rID0gbnVsbFxuICAgIGVuY29kaW5nID0gbnVsbFxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2RpbmdcbiAgICBlbmNvZGluZyA9IG51bGxcbiAgfVxuICBsZXQgZXJyXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0ID0gX3dyaXRlKHRoaXMsIGNodW5rLCBlbmNvZGluZylcbiAgICBpZiAocmV0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGVyciA9IHJldFxuICAgIH1cbiAgfVxuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzLlxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMVxuICAgIHRoaXMudW5jb3JrKClcbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgLy8gRG8gbm90aGluZy4uLlxuICB9IGVsc2UgaWYgKCFzdGF0ZS5lcnJvcmVkICYmICFzdGF0ZS5lbmRpbmcpIHtcbiAgICAvLyBUaGlzIGlzIGZvcmdpdmluZyBpbiB0ZXJtcyBvZiB1bm5lY2Vzc2FyeSBjYWxscyB0byBlbmQoKSBhbmQgY2FuIGhpZGVcbiAgICAvLyBsb2dpYyBlcnJvcnMuIEhvd2V2ZXIsIHVzdWFsbHkgc3VjaCBlcnJvcnMgYXJlIGhhcm1sZXNzIGFuZCBjYXVzaW5nIGFcbiAgICAvLyBoYXJkIGVycm9yIGNhbiBiZSBkaXNwcm9wb3J0aW9uYXRlbHkgZGVzdHJ1Y3RpdmUuIEl0IGlzIG5vdCBhbHdheXNcbiAgICAvLyB0cml2aWFsIGZvciB0aGUgdXNlciB0byBkZXRlcm1pbmUgd2hldGhlciBlbmQoKSBuZWVkcyB0byBiZSBjYWxsZWRcbiAgICAvLyBvciBub3QuXG5cbiAgICBzdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgZmluaXNoTWF5YmUodGhpcywgc3RhdGUsIHRydWUpXG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlXG4gIH0gZWxzZSBpZiAoc3RhdGUuZmluaXNoZWQpIHtcbiAgICBlcnIgPSBuZXcgRVJSX1NUUkVBTV9BTFJFQURZX0ZJTklTSEVEKCdlbmQnKVxuICB9IGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCkge1xuICAgIGVyciA9IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnZW5kJylcbiAgfVxuICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGVyciB8fCBzdGF0ZS5maW5pc2hlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZVtrT25GaW5pc2hlZF0ucHVzaChjYilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIChcbiAgICBzdGF0ZS5lbmRpbmcgJiZcbiAgICAhc3RhdGUuZGVzdHJveWVkICYmXG4gICAgc3RhdGUuY29uc3RydWN0ZWQgJiZcbiAgICBzdGF0ZS5sZW5ndGggPT09IDAgJiZcbiAgICAhc3RhdGUuZXJyb3JlZCAmJlxuICAgIHN0YXRlLmJ1ZmZlcmVkLmxlbmd0aCA9PT0gMCAmJlxuICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICFzdGF0ZS53cml0aW5nICYmXG4gICAgIXN0YXRlLmVycm9yRW1pdHRlZCAmJlxuICAgICFzdGF0ZS5jbG9zZUVtaXR0ZWRcbiAgKVxufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uRmluaXNoKGVycikge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyICE9PSBudWxsICYmIGVyciAhPT0gdW5kZWZpbmVkID8gZXJyIDogRVJSX01VTFRJUExFX0NBTExCQUNLKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIHN0YXRlLnBlbmRpbmdjYi0tXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc3Qgb25maW5pc2hDYWxsYmFja3MgPSBzdGF0ZVtrT25GaW5pc2hlZF0uc3BsaWNlKDApXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9uZmluaXNoQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9uZmluaXNoQ2FsbGJhY2tzW2ldKGVycilcbiAgICAgIH1cbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyLCBzdGF0ZS5zeW5jKVxuICAgIH0gZWxzZSBpZiAobmVlZEZpbmlzaChzdGF0ZSkpIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZVxuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpXG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LiBEb24ndCBjaGVjayBzdGF0ZS5zeW5jIGhlcmUuXG4gICAgICAvLyBTb21lIHN0cmVhbXMgYXNzdW1lICdmaW5pc2gnIHdpbGwgYmUgZW1pdHRlZFxuICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcmVsYXRpdmUgdG8gX2ZpbmFsIGNhbGxiYWNrLlxuICAgICAgc3RhdGUucGVuZGluZ2NiKytcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmluaXNoLCBzdHJlYW0sIHN0YXRlKVxuICAgIH1cbiAgfVxuICBzdGF0ZS5zeW5jID0gdHJ1ZVxuICBzdGF0ZS5wZW5kaW5nY2IrK1xuICB0cnkge1xuICAgIHN0cmVhbS5fZmluYWwob25GaW5pc2gpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG9uRmluaXNoKGVycilcbiAgfVxuICBzdGF0ZS5zeW5jID0gZmFsc2Vcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nICYmICFzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZVxuICAgICAgY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZVxuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlLCBzeW5jKSB7XG4gIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKVxuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmdjYisrXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soXG4gICAgICAgICAgKHN0cmVhbSwgc3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgICAgICAgICAgICBmaW5pc2goc3RyZWFtLCBzdGF0ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLnBlbmRpbmdjYi0tXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nY2IrK1xuICAgICAgICBmaW5pc2goc3RyZWFtLCBzdGF0ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLnBlbmRpbmdjYi0tXG4gIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZVxuICBjb25zdCBvbmZpbmlzaENhbGxiYWNrcyA9IHN0YXRlW2tPbkZpbmlzaGVkXS5zcGxpY2UoMClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmZpbmlzaENhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgIG9uZmluaXNoQ2FsbGJhY2tzW2ldKClcbiAgfVxuICBzdHJlYW0uZW1pdCgnZmluaXNoJylcbiAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIGEgd2F5IHRvIGRldGVjdFxuICAgIC8vIGlmIHRoZSByZWFkYWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsLlxuICAgIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICAgIGNvbnN0IGF1dG9EZXN0cm95ID1cbiAgICAgICFyU3RhdGUgfHxcbiAgICAgIChyU3RhdGUuYXV0b0Rlc3Ryb3kgJiZcbiAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHRoZSByZWFkYWJsZSB0byBldmVyICdlbmQnXG4gICAgICAgIC8vIGlmIHJlYWRhYmxlIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLlxuICAgICAgICAoclN0YXRlLmVuZEVtaXR0ZWQgfHwgclN0YXRlLnJlYWRhYmxlID09PSBmYWxzZSkpXG4gICAgaWYgKGF1dG9EZXN0cm95KSB7XG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgfVxuICB9XG59XG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlLnByb3RvdHlwZSwge1xuICBjbG9zZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmNsb3NlZCA6IGZhbHNlXG4gICAgfVxuICB9LFxuICBkZXN0cm95ZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA6IGZhbHNlXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHkgbWFuYWdpbmcgZGVzdHJveWVkLlxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgICAgIC8vIHcud3JpdGFibGUgPT09IGZhbHNlIG1lYW5zIHRoYXQgdGhpcyBpcyBwYXJ0IG9mIGEgRHVwbGV4IHN0cmVhbVxuICAgICAgLy8gd2hlcmUgdGhlIHdyaXRhYmxlIHNpZGUgd2FzIGRpc2FibGVkIHVwb24gY29uc3RydWN0aW9uLlxuICAgICAgLy8gQ29tcGF0LiBUaGUgdXNlciBtaWdodCBtYW51YWxseSBkaXNhYmxlIHdyaXRhYmxlIHNpZGUgdGhyb3VnaFxuICAgICAgLy8gZGVwcmVjYXRlZCBzZXR0ZXIuXG4gICAgICByZXR1cm4gISF3ICYmIHcud3JpdGFibGUgIT09IGZhbHNlICYmICF3LmRlc3Ryb3llZCAmJiAhdy5lcnJvcmVkICYmICF3LmVuZGluZyAmJiAhdy5lbmRlZFxuICAgIH0sXG4gICAgc2V0KHZhbCkge1xuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGlibGUuXG4gICAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLndyaXRhYmxlID0gISF2YWxcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlRmluaXNoZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlT2JqZWN0TW9kZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUub2JqZWN0TW9kZSA6IGZhbHNlXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUJ1ZmZlcjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgOiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVOZWVkRHJhaW46IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3Qgd1N0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICAgICAgaWYgKCF3U3RhdGUpIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuICF3U3RhdGUuZGVzdHJveWVkICYmICF3U3RhdGUuZW5kaW5nICYmIHdTdGF0ZS5uZWVkRHJhaW5cbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlSGlnaFdhdGVyTWFyazoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlQ29ya2VkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQgOiAwXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUxlbmd0aDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aFxuICAgIH1cbiAgfSxcbiAgZXJyb3JlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JlZCA6IG51bGxcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlQWJvcnRlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIShcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS53cml0YWJsZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JlZCkgJiZcbiAgICAgICAgIXRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWRcbiAgICAgIClcbiAgICB9XG4gIH1cbn0pXG5jb25zdCBkZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveVxuV3JpdGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcblxuICAvLyBJbnZva2UgcGVuZGluZyBjYWxsYmFja3MuXG4gIGlmICghc3RhdGUuZGVzdHJveWVkICYmIChzdGF0ZS5idWZmZXJlZEluZGV4IDwgc3RhdGUuYnVmZmVyZWQubGVuZ3RoIHx8IHN0YXRlW2tPbkZpbmlzaGVkXS5sZW5ndGgpKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlcnJvckJ1ZmZlciwgc3RhdGUpXG4gIH1cbiAgZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgY2IpXG4gIHJldHVybiB0aGlzXG59XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveVxuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgY2IoZXJyKVxufVxuV3JpdGFibGUucHJvdG90eXBlW0VFLmNhcHR1cmVSZWplY3Rpb25TeW1ib2xdID0gZnVuY3Rpb24gKGVycikge1xuICB0aGlzLmRlc3Ryb3koZXJyKVxufVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cbldyaXRhYmxlLmZyb21XZWIgPSBmdW5jdGlvbiAod3JpdGFibGVTdHJlYW0sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtV3JpdGFibGVGcm9tV3JpdGFibGVTdHJlYW0od3JpdGFibGVTdHJlYW0sIG9wdGlvbnMpXG59XG5Xcml0YWJsZS50b1dlYiA9IGZ1bmN0aW9uIChzdHJlYW1Xcml0YWJsZSkge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdXcml0YWJsZVN0cmVhbUZyb21TdHJlYW1Xcml0YWJsZShzdHJlYW1Xcml0YWJsZSlcbn1cbiIsIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuXG47KCd1c2Ugc3RyaWN0JylcbmNvbnN0IGJ1ZmZlck1vZHVsZSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7XG4gIGlzUmVhZGFibGUsXG4gIGlzV3JpdGFibGUsXG4gIGlzSXRlcmFibGUsXG4gIGlzTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZU5vZGVTdHJlYW0sXG4gIGlzV3JpdGFibGVOb2RlU3RyZWFtLFxuICBpc0R1cGxleE5vZGVTdHJlYW1cbn0gPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5jb25zdCB7XG4gIEFib3J0RXJyb3IsXG4gIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUgfVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgZGVzdHJveWVyIH0gPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgUmVhZGFibGUgPSByZXF1aXJlKCcuL3JlYWRhYmxlJylcbmNvbnN0IHsgY3JlYXRlRGVmZXJyZWRQcm9taXNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxuY29uc3QgZnJvbSA9IHJlcXVpcmUoJy4vZnJvbScpXG5jb25zdCBCbG9iID0gZ2xvYmFsVGhpcy5CbG9iIHx8IGJ1ZmZlck1vZHVsZS5CbG9iXG5jb25zdCBpc0Jsb2IgPVxuICB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IGZ1bmN0aW9uIGlzQmxvYihiKSB7XG4gICAgICAgIHJldHVybiBiIGluc3RhbmNlb2YgQmxvYlxuICAgICAgfVxuICAgIDogZnVuY3Rpb24gaXNCbG9iKGIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5jb25zdCBBYm9ydENvbnRyb2xsZXIgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciB8fCByZXF1aXJlKCdhYm9ydC1jb250cm9sbGVyJykuQWJvcnRDb250cm9sbGVyXG5jb25zdCB7IEZ1bmN0aW9uUHJvdG90eXBlQ2FsbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5cbi8vIFRoaXMgaXMgbmVlZGVkIGZvciBwcmUgbm9kZSAxNy5cbmNsYXNzIER1cGxleGlmeSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzQzODVcblxuICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnJlYWRhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMud3JpdGFibGUpID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS53cml0YWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IHRydWVcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkdXBsZXhpZnkoYm9keSwgbmFtZSkge1xuICBpZiAoaXNEdXBsZXhOb2RlU3RyZWFtKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHlcbiAgfVxuICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICByZWFkYWJsZTogYm9keVxuICAgIH0pXG4gIH1cbiAgaWYgKGlzV3JpdGFibGVOb2RlU3RyZWFtKGJvZHkpKSB7XG4gICAgcmV0dXJuIF9kdXBsZXhpZnkoe1xuICAgICAgd3JpdGFibGU6IGJvZHlcbiAgICB9KVxuICB9XG4gIGlmIChpc05vZGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICByZWFkYWJsZTogZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgLy8gVE9ETzogV2Vic3RyZWFtc1xuICAvLyBpZiAoaXNSZWFkYWJsZVN0cmVhbShib2R5KSkge1xuICAvLyAgIHJldHVybiBfZHVwbGV4aWZ5KHsgcmVhZGFibGU6IFJlYWRhYmxlLmZyb21XZWIoYm9keSkgfSk7XG4gIC8vIH1cblxuICAvLyBUT0RPOiBXZWJzdHJlYW1zXG4gIC8vIGlmIChpc1dyaXRhYmxlU3RyZWFtKGJvZHkpKSB7XG4gIC8vICAgcmV0dXJuIF9kdXBsZXhpZnkoeyB3cml0YWJsZTogV3JpdGFibGUuZnJvbVdlYihib2R5KSB9KTtcbiAgLy8gfVxuXG4gIGlmICh0eXBlb2YgYm9keSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHsgdmFsdWUsIHdyaXRlLCBmaW5hbCwgZGVzdHJveSB9ID0gZnJvbUFzeW5jR2VuKGJvZHkpXG4gICAgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZnJvbShEdXBsZXhpZnksIHZhbHVlLCB7XG4gICAgICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgd3JpdGUsXG4gICAgICAgIGZpbmFsLFxuICAgICAgICBkZXN0cm95XG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCB0aGVuID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHZhbHVlLnRoZW5cbiAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxldCBkXG4gICAgICBjb25zdCBwcm9taXNlID0gRnVuY3Rpb25Qcm90b3R5cGVDYWxsKFxuICAgICAgICB0aGVuLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgKHZhbCkgPT4ge1xuICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX1JFVFVSTl9WQUxVRSgnbnVsbHknLCAnYm9keScsIHZhbClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICBkZXN0cm95ZXIoZCwgZXJyKVxuICAgICAgICB9XG4gICAgICApXG4gICAgICByZXR1cm4gKGQgPSBuZXcgRHVwbGV4aWZ5KHtcbiAgICAgICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICByZWFkYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRlLFxuICAgICAgICBmaW5hbChjYikge1xuICAgICAgICAgIGZpbmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHByb21pc2VcbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgbnVsbClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcnIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveVxuICAgICAgfSkpXG4gICAgfVxuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0l0ZXJhYmxlLCBBc3luY0l0ZXJhYmxlIG9yIEFzeW5jRnVuY3Rpb24nLCBuYW1lLCB2YWx1ZSlcbiAgfVxuICBpZiAoaXNCbG9iKGJvZHkpKSB7XG4gICAgcmV0dXJuIGR1cGxleGlmeShib2R5LmFycmF5QnVmZmVyKCkpXG4gIH1cbiAgaWYgKGlzSXRlcmFibGUoYm9keSkpIHtcbiAgICByZXR1cm4gZnJvbShEdXBsZXhpZnksIGJvZHksIHtcbiAgICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgLy8gVE9ETzogV2Vic3RyZWFtcy5cbiAgLy8gaWYgKFxuICAvLyAgIGlzUmVhZGFibGVTdHJlYW0oYm9keT8ucmVhZGFibGUpICYmXG4gIC8vICAgaXNXcml0YWJsZVN0cmVhbShib2R5Py53cml0YWJsZSlcbiAgLy8gKSB7XG4gIC8vICAgcmV0dXJuIER1cGxleGlmeS5mcm9tV2ViKGJvZHkpO1xuICAvLyB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LndyaXRhYmxlKSA9PT0gJ29iamVjdCcgfHxcbiAgICB0eXBlb2YgKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS5yZWFkYWJsZSkgPT09ICdvYmplY3QnXG4gICkge1xuICAgIGNvbnN0IHJlYWRhYmxlID1cbiAgICAgIGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkICYmIGJvZHkucmVhZGFibGVcbiAgICAgICAgPyBpc1JlYWRhYmxlTm9kZVN0cmVhbShib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkucmVhZGFibGUpXG4gICAgICAgICAgPyBib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogYm9keS5yZWFkYWJsZVxuICAgICAgICAgIDogZHVwbGV4aWZ5KGJvZHkucmVhZGFibGUpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3Qgd3JpdGFibGUgPVxuICAgICAgYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQgJiYgYm9keS53cml0YWJsZVxuICAgICAgICA/IGlzV3JpdGFibGVOb2RlU3RyZWFtKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS53cml0YWJsZSlcbiAgICAgICAgICA/IGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBib2R5LndyaXRhYmxlXG4gICAgICAgICAgOiBkdXBsZXhpZnkoYm9keS53cml0YWJsZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICByZWFkYWJsZSxcbiAgICAgIHdyaXRhYmxlXG4gICAgfSlcbiAgfVxuICBjb25zdCB0aGVuID0gYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LnRoZW5cbiAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbGV0IGRcbiAgICBGdW5jdGlvblByb3RvdHlwZUNhbGwoXG4gICAgICB0aGVuLFxuICAgICAgYm9keSxcbiAgICAgICh2YWwpID0+IHtcbiAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgZC5wdXNoKHZhbClcbiAgICAgICAgfVxuICAgICAgICBkLnB1c2gobnVsbClcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGRlc3Ryb3llcihkLCBlcnIpXG4gICAgICB9XG4gICAgKVxuICAgIHJldHVybiAoZCA9IG5ldyBEdXBsZXhpZnkoe1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHJlYWQoKSB7fVxuICAgIH0pKVxuICB9XG4gIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShcbiAgICBuYW1lLFxuICAgIFtcbiAgICAgICdCbG9iJyxcbiAgICAgICdSZWFkYWJsZVN0cmVhbScsXG4gICAgICAnV3JpdGFibGVTdHJlYW0nLFxuICAgICAgJ1N0cmVhbScsXG4gICAgICAnSXRlcmFibGUnLFxuICAgICAgJ0FzeW5jSXRlcmFibGUnLFxuICAgICAgJ0Z1bmN0aW9uJyxcbiAgICAgICd7IHJlYWRhYmxlLCB3cml0YWJsZSB9IHBhaXInLFxuICAgICAgJ1Byb21pc2UnXG4gICAgXSxcbiAgICBib2R5XG4gIClcbn1cbmZ1bmN0aW9uIGZyb21Bc3luY0dlbihmbikge1xuICBsZXQgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgY29uc3QgdmFsdWUgPSBmbihcbiAgICAoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IF9wcm9taXNlID0gcHJvbWlzZVxuICAgICAgICBwcm9taXNlID0gbnVsbFxuICAgICAgICBjb25zdCB7IGNodW5rLCBkb25lLCBjYiB9ID0gYXdhaXQgX3Byb21pc2VcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYilcbiAgICAgICAgaWYgKGRvbmUpIHJldHVyblxuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBjYXVzZTogc2lnbmFsLnJlYXNvblxuICAgICAgICAgIH0pXG4gICAgICAgIDsoeyBwcm9taXNlLCByZXNvbHZlIH0gPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKSlcbiAgICAgICAgeWllbGQgY2h1bmtcbiAgICAgIH1cbiAgICB9KSgpLFxuICAgIHtcbiAgICAgIHNpZ25hbFxuICAgIH1cbiAgKVxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICAgIGNvbnN0IF9yZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgcmVzb2x2ZSA9IG51bGxcbiAgICAgIF9yZXNvbHZlKHtcbiAgICAgICAgY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICBjYlxuICAgICAgfSlcbiAgICB9LFxuICAgIGZpbmFsKGNiKSB7XG4gICAgICBjb25zdCBfcmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIHJlc29sdmUgPSBudWxsXG4gICAgICBfcmVzb2x2ZSh7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIGNiXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGVzdHJveShlcnIsIGNiKSB7XG4gICAgICBhYy5hYm9ydCgpXG4gICAgICBjYihlcnIpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBfZHVwbGV4aWZ5KHBhaXIpIHtcbiAgY29uc3QgciA9IHBhaXIucmVhZGFibGUgJiYgdHlwZW9mIHBhaXIucmVhZGFibGUucmVhZCAhPT0gJ2Z1bmN0aW9uJyA/IFJlYWRhYmxlLndyYXAocGFpci5yZWFkYWJsZSkgOiBwYWlyLnJlYWRhYmxlXG4gIGNvbnN0IHcgPSBwYWlyLndyaXRhYmxlXG4gIGxldCByZWFkYWJsZSA9ICEhaXNSZWFkYWJsZShyKVxuICBsZXQgd3JpdGFibGUgPSAhIWlzV3JpdGFibGUodylcbiAgbGV0IG9uZHJhaW5cbiAgbGV0IG9uZmluaXNoXG4gIGxldCBvbnJlYWRhYmxlXG4gIGxldCBvbmNsb3NlXG4gIGxldCBkXG4gIGZ1bmN0aW9uIG9uZmluaXNoZWQoZXJyKSB7XG4gICAgY29uc3QgY2IgPSBvbmNsb3NlXG4gICAgb25jbG9zZSA9IG51bGxcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycilcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgZC5kZXN0cm95KGVycilcbiAgICB9IGVsc2UgaWYgKCFyZWFkYWJsZSAmJiAhd3JpdGFibGUpIHtcbiAgICAgIGQuZGVzdHJveSgpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyhyb25hZyk6IEF2b2lkIGRvdWJsZSBidWZmZXJpbmcuXG4gIC8vIEltcGxlbWVudCBXcml0YWJsZS9SZWFkYWJsZS9EdXBsZXggdHJhaXRzLlxuICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMzNTE1LlxuICBkID0gbmV3IER1cGxleGlmeSh7XG4gICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgIHJlYWRhYmxlT2JqZWN0TW9kZTogISEociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5yZWFkYWJsZU9iamVjdE1vZGUpLFxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogISEodyAhPT0gbnVsbCAmJiB3ICE9PSB1bmRlZmluZWQgJiYgdy53cml0YWJsZU9iamVjdE1vZGUpLFxuICAgIHJlYWRhYmxlLFxuICAgIHdyaXRhYmxlXG4gIH0pXG4gIGlmICh3cml0YWJsZSkge1xuICAgIGVvcyh3LCAoZXJyKSA9PiB7XG4gICAgICB3cml0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGRlc3Ryb3llcihyLCBlcnIpXG4gICAgICB9XG4gICAgICBvbmZpbmlzaGVkKGVycilcbiAgICB9KVxuICAgIGQuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgIGlmICh3LndyaXRlKGNodW5rLCBlbmNvZGluZykpIHtcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25kcmFpbiA9IGNhbGxiYWNrXG4gICAgICB9XG4gICAgfVxuICAgIGQuX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICB3LmVuZCgpXG4gICAgICBvbmZpbmlzaCA9IGNhbGxiYWNrXG4gICAgfVxuICAgIHcub24oJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9uZHJhaW4pIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbmRyYWluXG4gICAgICAgIG9uZHJhaW4gPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHcub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbmZpbmlzaCkge1xuICAgICAgICBjb25zdCBjYiA9IG9uZmluaXNoXG4gICAgICAgIG9uZmluaXNoID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBpZiAocmVhZGFibGUpIHtcbiAgICBlb3MociwgKGVycikgPT4ge1xuICAgICAgcmVhZGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBkZXN0cm95ZXIociwgZXJyKVxuICAgICAgfVxuICAgICAgb25maW5pc2hlZChlcnIpXG4gICAgfSlcbiAgICByLm9uKCdyZWFkYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbnJlYWRhYmxlKSB7XG4gICAgICAgIGNvbnN0IGNiID0gb25yZWFkYWJsZVxuICAgICAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgICByLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkLnB1c2gobnVsbClcbiAgICB9KVxuICAgIGQuX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBidWYgPSByLnJlYWQoKVxuICAgICAgICBpZiAoYnVmID09PSBudWxsKSB7XG4gICAgICAgICAgb25yZWFkYWJsZSA9IGQuX3JlYWRcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWQucHVzaChidWYpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZC5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFlcnIgJiYgb25jbG9zZSAhPT0gbnVsbCkge1xuICAgICAgZXJyID0gbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgIG9uZHJhaW4gPSBudWxsXG4gICAgb25maW5pc2ggPSBudWxsXG4gICAgaWYgKG9uY2xvc2UgPT09IG51bGwpIHtcbiAgICAgIGNhbGxiYWNrKGVycilcbiAgICB9IGVsc2Uge1xuICAgICAgb25jbG9zZSA9IGNhbGxiYWNrXG4gICAgICBkZXN0cm95ZXIodywgZXJyKVxuICAgICAgZGVzdHJveWVyKHIsIGVycilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwZSBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBpY2FsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgT2JqZWN0RGVmaW5lUHJvcGVydGllcyxcbiAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBPYmplY3RLZXlzLFxuICBPYmplY3RTZXRQcm90b3R5cGVPZlxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXhcbmNvbnN0IFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG5jb25zdCBXcml0YWJsZSA9IHJlcXVpcmUoJy4vd3JpdGFibGUnKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LnByb3RvdHlwZSwgUmVhZGFibGUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LCBSZWFkYWJsZSlcbntcbiAgY29uc3Qga2V5cyA9IE9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKVxuICAvLyBBbGxvdyB0aGUga2V5cyBhcnJheSB0byBiZSBHQydlZC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWV0aG9kID0ga2V5c1tpXVxuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXVxuICB9XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucylcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKVxuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gb3B0aW9ucy5hbGxvd0hhbGZPcGVuICE9PSBmYWxzZVxuICAgIGlmIChvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZVxuICB9XG59XG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKER1cGxleC5wcm90b3R5cGUsIHtcbiAgd3JpdGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlJylcbiAgfSxcbiAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnKVxuICB9LFxuICB3cml0YWJsZU9iamVjdE1vZGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlT2JqZWN0TW9kZScpXG4gIH0sXG4gIHdyaXRhYmxlQnVmZmVyOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicpXG4gIH0sXG4gIHdyaXRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUxlbmd0aCcpXG4gIH0sXG4gIHdyaXRhYmxlRmluaXNoZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlRmluaXNoZWQnKVxuICB9LFxuICB3cml0YWJsZUNvcmtlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAuLi5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVDb3JrZWQnKVxuICB9LFxuICB3cml0YWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUVuZGVkJylcbiAgfSxcbiAgd3JpdGFibGVOZWVkRHJhaW46IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlTmVlZERyYWluJylcbiAgfSxcbiAgZGVzdHJveWVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZC5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cbkR1cGxleC5mcm9tV2ViID0gZnVuY3Rpb24gKHBhaXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtRHVwbGV4RnJvbVJlYWRhYmxlV3JpdGFibGVQYWlyKHBhaXIsIG9wdGlvbnMpXG59XG5EdXBsZXgudG9XZWIgPSBmdW5jdGlvbiAoZHVwbGV4KSB7XG4gIHJldHVybiBsYXp5V2ViU3RyZWFtcygpLm5ld1JlYWRhYmxlV3JpdGFibGVQYWlyRnJvbUR1cGxleChkdXBsZXgpXG59XG5sZXQgZHVwbGV4aWZ5XG5EdXBsZXguZnJvbSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gIGlmICghZHVwbGV4aWZ5KSB7XG4gICAgZHVwbGV4aWZ5ID0gcmVxdWlyZSgnLi9kdXBsZXhpZnknKVxuICB9XG4gIHJldHVybiBkdXBsZXhpZnkoYm9keSwgJ2JvZHknKVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgT2JqZWN0U2V0UHJvdG90eXBlT2YsIFN5bWJvbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybVxuY29uc3QgeyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKS5jb2Rlc1xuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgeyBnZXRIaWdoV2F0ZXJNYXJrIH0gPSByZXF1aXJlKCcuL3N0YXRlJylcbk9iamVjdFNldFByb3RvdHlwZU9mKFRyYW5zZm9ybS5wcm90b3R5cGUsIER1cGxleC5wcm90b3R5cGUpXG5PYmplY3RTZXRQcm90b3R5cGVPZihUcmFuc2Zvcm0sIER1cGxleClcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgna0NhbGxiYWNrJylcbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKVxuXG4gIC8vIFRPRE8gKHJvbmFnKTogVGhpcyBzaG91bGQgcHJlZmVyYWJseSBhbHdheXMgYmVcbiAgLy8gYXBwbGllZCBidXQgd291bGQgYmUgc2VtdmVyLW1ham9yLiBPciBldmVuIGJldHRlcjtcbiAgLy8gbWFrZSBUcmFuc2Zvcm0gYSBSZWFkYWJsZSB3aXRoIHRoZSBXcml0YWJsZSBpbnRlcmZhY2UuXG4gIGNvbnN0IHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IG9wdGlvbnMgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB0cnVlKSA6IG51bGxcbiAgaWYgKHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9PT0gMCkge1xuICAgIC8vIEEgRHVwbGV4IHdpbGwgYnVmZmVyIGJvdGggb24gdGhlIHdyaXRhYmxlIGFuZCByZWFkYWJsZSBzaWRlIHdoaWxlXG4gICAgLy8gYSBUcmFuc2Zvcm0ganVzdCB3YW50cyB0byBidWZmZXIgaHdtIG51bWJlciBvZiBlbGVtZW50cy4gVG8gYXZvaWRcbiAgICAvLyBidWZmZXJpbmcgdHdpY2Ugd2UgZGlzYWJsZSBidWZmZXJpbmcgb24gdGhlIHdyaXRhYmxlIHNpZGUuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoaWdoV2F0ZXJNYXJrOiBudWxsLFxuICAgICAgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLFxuICAgICAgLy8gVE9ETyAocm9uYWcpOiAwIGlzIG5vdCBvcHRpbWFsIHNpbmNlIHdlIGhhdmVcbiAgICAgIC8vIGEgXCJidWdcIiB3aGVyZSB3ZSBjaGVjayBuZWVkRHJhaW4gYmVmb3JlIGNhbGxpbmcgX3dyaXRlIGFuZCBub3QgYWZ0ZXIuXG4gICAgICAvLyBSZWZzOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zMjg4N1xuICAgICAgLy8gUmVmczogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzU5NDFcbiAgICAgIHdyaXRhYmxlSGlnaFdhdGVyTWFyazogb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcmsgfHwgMFxuICAgIH1cbiAgfVxuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKVxuXG4gIC8vIFdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2VcbiAgdGhpc1trQ2FsbGJhY2tdID0gbnVsbFxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2hcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgLy8gQmFja3dhcmRzIGNvbXBhdC4gU29tZSBUcmFuc2Zvcm0gc3RyZWFtcyBpbmNvcnJlY3RseSBpbXBsZW1lbnQgX2ZpbmFsXG4gIC8vIGluc3RlYWQgb2Ygb3IgaW4gYWRkaXRpb24gdG8gX2ZsdXNoLiBCeSB1c2luZyAncHJlZmluaXNoJyBpbnN0ZWFkIG9mXG4gIC8vIGltcGxlbWVudGluZyBfZmluYWwgd2UgY29udGludWUgc3VwcG9ydGluZyB0aGlzIHVuZm9ydHVuYXRlIHVzZSBjYXNlLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpXG59XG5mdW5jdGlvbiBmaW5hbChjYikge1xuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nICYmICF0aGlzLmRlc3Ryb3llZCkge1xuICAgIHRoaXMuX2ZsdXNoKChlciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVyKSB7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgIGNiKGVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGVzdHJveShlcilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wdXNoKGRhdGEpXG4gICAgICB9XG4gICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIGlmIChjYikge1xuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnB1c2gobnVsbClcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKClcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgaWYgKHRoaXMuX2ZpbmFsICE9PSBmaW5hbCkge1xuICAgIGZpbmFsLmNhbGwodGhpcylcbiAgfVxufVxuVHJhbnNmb3JtLnByb3RvdHlwZS5fZmluYWwgPSBmaW5hbFxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgdGhyb3cgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfdHJhbnNmb3JtKCknKVxufVxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjb25zdCByU3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHdTdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgbGVuZ3RoID0gclN0YXRlLmxlbmd0aFxuICB0aGlzLl90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCAoZXJyLCB2YWwpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnB1c2godmFsKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB3U3RhdGUuZW5kZWQgfHxcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXQuXG4gICAgICBsZW5ndGggPT09IHJTdGF0ZS5sZW5ndGggfHxcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXQuXG4gICAgICByU3RhdGUubGVuZ3RoIDwgclN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgICApIHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trQ2FsbGJhY2tdID0gY2FsbGJhY2tcbiAgICB9XG4gIH0pXG59XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpc1trQ2FsbGJhY2tdKSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzW2tDYWxsYmFja11cbiAgICB0aGlzW2tDYWxsYmFja10gPSBudWxsXG4gICAgY2FsbGJhY2soKVxuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE9iamVjdFNldFByb3RvdHlwZU9mIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2hcbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtJylcbk9iamVjdFNldFByb3RvdHlwZU9mKFBhc3NUaHJvdWdoLnByb3RvdHlwZSwgVHJhbnNmb3JtLnByb3RvdHlwZSlcbk9iamVjdFNldFByb3RvdHlwZU9mKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucylcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucylcbn1cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IEFycmF5SXNBcnJheSwgUHJvbWlzZSwgU3ltYm9sQXN5bmNJdGVyYXRvciB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBvbmNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxuY29uc3QgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFLFxuICAgIEVSUl9NSVNTSU5HX0FSR1MsXG4gICAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gICAgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcbiAgfSxcbiAgQWJvcnRFcnJvclxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9ycycpXG5jb25zdCB7IGlzSXRlcmFibGUsIGlzUmVhZGFibGUsIGlzUmVhZGFibGVOb2RlU3RyZWFtLCBpc05vZGVTdHJlYW0gfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuY29uc3QgQWJvcnRDb250cm9sbGVyID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0Q29udHJvbGxlclxubGV0IFBhc3NUaHJvdWdoXG5sZXQgUmVhZGFibGVcbmZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcpIHtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2VcbiAgc3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgfSlcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgICB3cml0YWJsZTogd3JpdGluZ1xuICAgIH0sXG4gICAgKGVycikgPT4ge1xuICAgICAgZmluaXNoZWQgPSAhZXJyXG4gICAgfVxuICApXG4gIHJldHVybiB7XG4gICAgZGVzdHJveTogKGVycikgPT4ge1xuICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm5cbiAgICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgZXJyIHx8IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgncGlwZScpKVxuICAgIH0sXG4gICAgY2xlYW51cFxuICB9XG59XG5mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKSB7XG4gIC8vIFN0cmVhbXMgc2hvdWxkIG5ldmVyIGJlIGFuIGVtcHR5IGFycmF5LiBJdCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gYXQgbGVhc3RcbiAgLy8gYSBzaW5nbGUgc3RyZWFtLiBUaGVyZWZvcmUgb3B0aW1pemUgZm9yIHRoZSBhdmVyYWdlIGNhc2UgaW5zdGVhZCBvZlxuICAvLyBjaGVja2luZyBmb3IgbGVuZ3RoID09PSAwIGFzIHdlbGwuXG4gIHZhbGlkYXRlRnVuY3Rpb24oc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdLCAnc3RyZWFtc1tzdHJlYW0ubGVuZ3RoIC0gMV0nKVxuICByZXR1cm4gc3RyZWFtcy5wb3AoKVxufVxuZnVuY3Rpb24gbWFrZUFzeW5jSXRlcmFibGUodmFsKSB7XG4gIGlmIChpc0l0ZXJhYmxlKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsXG4gIH0gZWxzZSBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0odmFsKSkge1xuICAgIC8vIExlZ2FjeSBzdHJlYW1zIGFyZSBub3QgSXRlcmFibGUuXG4gICAgcmV0dXJuIGZyb21SZWFkYWJsZSh2YWwpXG4gIH1cbiAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCd2YWwnLCBbJ1JlYWRhYmxlJywgJ0l0ZXJhYmxlJywgJ0FzeW5jSXRlcmFibGUnXSwgdmFsKVxufVxuYXN5bmMgZnVuY3Rpb24qIGZyb21SZWFkYWJsZSh2YWwpIHtcbiAgaWYgKCFSZWFkYWJsZSkge1xuICAgIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG4gIH1cbiAgeWllbGQqIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2xBc3luY0l0ZXJhdG9yXS5jYWxsKHZhbClcbn1cbmFzeW5jIGZ1bmN0aW9uIHB1bXAoaXRlcmFibGUsIHdyaXRhYmxlLCBmaW5pc2gsIHsgZW5kIH0pIHtcbiAgbGV0IGVycm9yXG4gIGxldCBvbnJlc29sdmUgPSBudWxsXG4gIGNvbnN0IHJlc3VtZSA9IChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAob25yZXNvbHZlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IG9ucmVzb2x2ZVxuICAgICAgb25yZXNvbHZlID0gbnVsbFxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuICBjb25zdCB3YWl0ID0gKCkgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25yZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB3cml0YWJsZS5vbignZHJhaW4nLCByZXN1bWUpXG4gIGNvbnN0IGNsZWFudXAgPSBlb3MoXG4gICAgd3JpdGFibGUsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICByZXN1bWVcbiAgKVxuICB0cnkge1xuICAgIGlmICh3cml0YWJsZS53cml0YWJsZU5lZWREcmFpbikge1xuICAgICAgYXdhaXQgd2FpdCgpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICAgIGlmICghd3JpdGFibGUud3JpdGUoY2h1bmspKSB7XG4gICAgICAgIGF3YWl0IHdhaXQoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICB3cml0YWJsZS5lbmQoKVxuICAgIH1cbiAgICBhd2FpdCB3YWl0KClcbiAgICBmaW5pc2goKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBmaW5pc2goZXJyb3IgIT09IGVyciA/IGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlcnJvciwgZXJyKSA6IGVycilcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhbnVwKClcbiAgICB3cml0YWJsZS5vZmYoJ2RyYWluJywgcmVzdW1lKVxuICB9XG59XG5mdW5jdGlvbiBwaXBlbGluZSguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBwaXBlbGluZUltcGwoc3RyZWFtcywgb25jZShwb3BDYWxsYmFjayhzdHJlYW1zKSkpXG59XG5mdW5jdGlvbiBwaXBlbGluZUltcGwoc3RyZWFtcywgY2FsbGJhY2ssIG9wdHMpIHtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAxICYmIEFycmF5SXNBcnJheShzdHJlYW1zWzBdKSkge1xuICAgIHN0cmVhbXMgPSBzdHJlYW1zWzBdXG4gIH1cbiAgaWYgKHN0cmVhbXMubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCdzdHJlYW1zJylcbiAgfVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgY29uc3Qgb3V0ZXJTaWduYWwgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdHMuc2lnbmFsXG5cbiAgLy8gTmVlZCB0byBjbGVhbnVwIGV2ZW50IGxpc3RlbmVycyBpZiBsYXN0IHN0cmVhbSBpcyByZWFkYWJsZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzM1NDUyXG4gIGNvbnN0IGxhc3RTdHJlYW1DbGVhbnVwID0gW11cbiAgdmFsaWRhdGVBYm9ydFNpZ25hbChvdXRlclNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgZmluaXNoSW1wbChuZXcgQWJvcnRFcnJvcigpKVxuICB9XG4gIG91dGVyU2lnbmFsID09PSBudWxsIHx8IG91dGVyU2lnbmFsID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvdXRlclNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICBsZXQgZXJyb3JcbiAgbGV0IHZhbHVlXG4gIGNvbnN0IGRlc3Ryb3lzID0gW11cbiAgbGV0IGZpbmlzaENvdW50ID0gMFxuICBmdW5jdGlvbiBmaW5pc2goZXJyKSB7XG4gICAgZmluaXNoSW1wbChlcnIsIC0tZmluaXNoQ291bnQgPT09IDApXG4gIH1cbiAgZnVuY3Rpb24gZmluaXNoSW1wbChlcnIsIGZpbmFsKSB7XG4gICAgaWYgKGVyciAmJiAoIWVycm9yIHx8IGVycm9yLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAoIWVycm9yICYmICFmaW5hbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdoaWxlIChkZXN0cm95cy5sZW5ndGgpIHtcbiAgICAgIGRlc3Ryb3lzLnNoaWZ0KCkoZXJyb3IpXG4gICAgfVxuICAgIG91dGVyU2lnbmFsID09PSBudWxsIHx8IG91dGVyU2lnbmFsID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvdXRlclNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgIGFjLmFib3J0KClcbiAgICBpZiAoZmluYWwpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgbGFzdFN0cmVhbUNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpXG4gICAgICB9XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBlcnJvciwgdmFsdWUpXG4gICAgfVxuICB9XG4gIGxldCByZXRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJlYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1tpXVxuICAgIGNvbnN0IHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgY29uc3Qgd3JpdGluZyA9IGkgPiAwXG4gICAgY29uc3QgZW5kID0gcmVhZGluZyB8fCAob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLmVuZCkgIT09IGZhbHNlXG4gICAgY29uc3QgaXNMYXN0U3RyZWFtID0gaSA9PT0gc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgZGVzdHJveSwgY2xlYW51cCB9ID0gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZylcbiAgICAgICAgZGVzdHJveXMucHVzaChkZXN0cm95KVxuICAgICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pICYmIGlzTGFzdFN0cmVhbSkge1xuICAgICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goY2xlYW51cClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYXRjaCBzdHJlYW0gZXJyb3JzIHRoYXQgb2NjdXIgYWZ0ZXIgcGlwZS9wdW1wIGhhcyBjb21wbGV0ZWQuXG4gICAgICBmdW5jdGlvbiBvbkVycm9yKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lICE9PSAnQWJvcnRFcnJvcicgJiYgZXJyLmNvZGUgIT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpIHtcbiAgICAgICAgICBmaW5pc2goZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25FcnJvcilcbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkgJiYgaXNMYXN0U3RyZWFtKSB7XG4gICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goKCkgPT4ge1xuICAgICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgaWYgKHR5cGVvZiBzdHJlYW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0ID0gc3RyZWFtKHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKCFpc0l0ZXJhYmxlKHJldCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdJdGVyYWJsZSwgQXN5bmNJdGVyYWJsZSBvciBTdHJlYW0nLCAnc291cmNlJywgcmV0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUoc3RyZWFtKSB8fCBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICAgIHJldCA9IHN0cmVhbVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gRHVwbGV4LmZyb20oc3RyZWFtKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0ID0gbWFrZUFzeW5jSXRlcmFibGUocmV0KVxuICAgICAgcmV0ID0gc3RyZWFtKHJldCwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pXG4gICAgICBpZiAocmVhZGluZykge1xuICAgICAgICBpZiAoIWlzSXRlcmFibGUocmV0LCB0cnVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0FzeW5jSXRlcmFibGUnLCBgdHJhbnNmb3JtWyR7aSAtIDF9XWAsIHJldClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9yZXRcbiAgICAgICAgaWYgKCFQYXNzVGhyb3VnaCkge1xuICAgICAgICAgIFBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9wYXNzdGhyb3VnaCcpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgbGFzdCBhcmd1bWVudCB0byBwaXBlbGluZSBpcyBub3QgYSBzdHJlYW1cbiAgICAgICAgLy8gd2UgbXVzdCBjcmVhdGUgYSBwcm94eSBzdHJlYW0gc28gdGhhdCBwaXBlbGluZSguLi4pXG4gICAgICAgIC8vIGFsd2F5cyByZXR1cm5zIGEgc3RyZWFtIHdoaWNoIGNhbiBiZSBmdXJ0aGVyXG4gICAgICAgIC8vIGNvbXBvc2VkIHRocm91Z2ggYC5waXBlKHN0cmVhbSlgLlxuXG4gICAgICAgIGNvbnN0IHB0ID0gbmV3IFBhc3NUaHJvdWdoKHtcbiAgICAgICAgICBvYmplY3RNb2RlOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gSGFuZGxlIFByb21pc2VzL0ErIHNwZWMsIGB0aGVuYCBjb3VsZCBiZSBhIGdldHRlciB0aGF0IHRocm93cyBvblxuICAgICAgICAvLyBzZWNvbmQgdXNlLlxuICAgICAgICBjb25zdCB0aGVuID0gKF9yZXQgPSByZXQpID09PSBudWxsIHx8IF9yZXQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9yZXQudGhlblxuICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgICAgdGhlbi5jYWxsKFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgKHZhbCkgPT4ge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbFxuICAgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwdC53cml0ZSh2YWwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgICAgIHB0LmVuZCgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2gpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICBwdC5kZXN0cm95KGVycilcbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2gsIGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZShyZXQsIHRydWUpKSB7XG4gICAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICAgIHB1bXAocmV0LCBwdCwgZmluaXNoLCB7XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0FzeW5jSXRlcmFibGUgb3IgUHJvbWlzZScsICdkZXN0aW5hdGlvbicsIHJldClcbiAgICAgICAgfVxuICAgICAgICByZXQgPSBwdFxuICAgICAgICBjb25zdCB7IGRlc3Ryb3ksIGNsZWFudXAgfSA9IGRlc3Ryb3llcihyZXQsIGZhbHNlLCB0cnVlKVxuICAgICAgICBkZXN0cm95cy5wdXNoKGRlc3Ryb3kpXG4gICAgICAgIGlmIChpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0ocmV0KSkge1xuICAgICAgICBmaW5pc2hDb3VudCArPSAyXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSBwaXBlKHJldCwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGlzUmVhZGFibGUoc3RyZWFtKSAmJiBpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZShyZXQpKSB7XG4gICAgICAgIGZpbmlzaENvdW50KytcbiAgICAgICAgcHVtcChyZXQsIHN0cmVhbSwgZmluaXNoLCB7XG4gICAgICAgICAgZW5kXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3ZhbCcsIFsnUmVhZGFibGUnLCAnSXRlcmFibGUnLCAnQXN5bmNJdGVyYWJsZSddLCByZXQpXG4gICAgICB9XG4gICAgICByZXQgPSBzdHJlYW1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0ID0gRHVwbGV4LmZyb20oc3RyZWFtKVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKHNpZ25hbCAhPT0gbnVsbCAmJiBzaWduYWwgIT09IHVuZGVmaW5lZCAmJiBzaWduYWwuYWJvcnRlZCkgfHxcbiAgICAob3V0ZXJTaWduYWwgIT09IG51bGwgJiYgb3V0ZXJTaWduYWwgIT09IHVuZGVmaW5lZCAmJiBvdXRlclNpZ25hbC5hYm9ydGVkKVxuICApIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGFib3J0KVxuICB9XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIHBpcGUoc3JjLCBkc3QsIGZpbmlzaCwgeyBlbmQgfSkge1xuICBsZXQgZW5kZWQgPSBmYWxzZVxuICBkc3Qub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghZW5kZWQpIHtcbiAgICAgIC8vIEZpbmlzaCBpZiB0aGUgZGVzdGluYXRpb24gY2xvc2VzIGJlZm9yZSB0aGUgc291cmNlIGhhcyBjb21wbGV0ZWQuXG4gICAgICBmaW5pc2gobmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCkpXG4gICAgfVxuICB9KVxuICBzcmMucGlwZShkc3QsIHtcbiAgICBlbmRcbiAgfSlcbiAgaWYgKGVuZCkge1xuICAgIC8vIENvbXBhdC4gQmVmb3JlIG5vZGUgdjEwLjEyLjAgc3RkaW8gdXNlZCB0byB0aHJvdyBhbiBlcnJvciBzb1xuICAgIC8vIHBpcGUoKSBkaWQvZG9lcyBub3QgZW5kKCkgc3RkaW8gZGVzdGluYXRpb25zLlxuICAgIC8vIE5vdyB0aGV5IGFsbG93IGl0IGJ1dCBcInNlY3JldGx5XCIgZG9uJ3QgY2xvc2UgdGhlIHVuZGVybHlpbmcgZmQuXG4gICAgc3JjLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgZHN0LmVuZCgpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBmaW5pc2goKVxuICB9XG4gIGVvcyhcbiAgICBzcmMsXG4gICAge1xuICAgICAgcmVhZGFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9LFxuICAgIChlcnIpID0+IHtcbiAgICAgIGNvbnN0IHJTdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKFxuICAgICAgICBlcnIgJiZcbiAgICAgICAgZXJyLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScgJiZcbiAgICAgICAgclN0YXRlICYmXG4gICAgICAgIHJTdGF0ZS5lbmRlZCAmJlxuICAgICAgICAhclN0YXRlLmVycm9yZWQgJiZcbiAgICAgICAgIXJTdGF0ZS5lcnJvckVtaXR0ZWRcbiAgICAgICkge1xuICAgICAgICAvLyBTb21lIHJlYWRhYmxlIHN0cmVhbXMgd2lsbCBlbWl0ICdjbG9zZScgYmVmb3JlICdlbmQnLiBIb3dldmVyLCBzaW5jZVxuICAgICAgICAvLyB0aGlzIGlzIG9uIHRoZSByZWFkYWJsZSBzaWRlICdlbmQnIHNob3VsZCBzdGlsbCBiZSBlbWl0dGVkIGlmIHRoZVxuICAgICAgICAvLyBzdHJlYW0gaGFzIGJlZW4gZW5kZWQgYW5kIG5vIGVycm9yIGVtaXR0ZWQuIFRoaXMgc2hvdWxkIGJlIGFsbG93ZWQgaW5cbiAgICAgICAgLy8gZmF2b3Igb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNpbmNlIHRoZSBzdHJlYW0gaXMgcGlwZWQgdG8gYVxuICAgICAgICAvLyBkZXN0aW5hdGlvbiB0aGlzIHNob3VsZCBub3QgcmVzdWx0IGluIGFueSBvYnNlcnZhYmxlIGRpZmZlcmVuY2UuXG4gICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBhIHdyaXRhYmxlIHByZW1hdHVyZSBjbG9zZSBzaW5jZVxuICAgICAgICAvLyBlb3Mgd2lsbCBvbmx5IGZhaWwgd2l0aCBwcmVtYXR1cmUgY2xvc2Ugb24gdGhlIHJlYWRpbmcgc2lkZSBmb3JcbiAgICAgICAgLy8gZHVwbGV4IHN0cmVhbXMuXG4gICAgICAgIHNyYy5vbmNlKCdlbmQnLCBmaW5pc2gpLm9uY2UoJ2Vycm9yJywgZmluaXNoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluaXNoKGVycilcbiAgICAgIH1cbiAgICB9XG4gIClcbiAgcmV0dXJuIGVvcyhcbiAgICBkc3QsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9LFxuICAgIGZpbmlzaFxuICApXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGlwZWxpbmVJbXBsLFxuICBwaXBlbGluZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcGlwZWxpbmUgfSA9IHJlcXVpcmUoJy4vcGlwZWxpbmUnKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgeyBkZXN0cm95ZXIgfSA9IHJlcXVpcmUoJy4vZGVzdHJveScpXG5jb25zdCB7IGlzTm9kZVN0cmVhbSwgaXNSZWFkYWJsZSwgaXNXcml0YWJsZSB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCB7XG4gIEFib3J0RXJyb3IsXG4gIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19WQUxVRSwgRVJSX01JU1NJTkdfQVJHUyB9XG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wb3NlKC4uLnN0cmVhbXMpIHtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoJ3N0cmVhbXMnKVxuICB9XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBEdXBsZXguZnJvbShzdHJlYW1zWzBdKVxuICB9XG4gIGNvbnN0IG9yZ1N0cmVhbXMgPSBbLi4uc3RyZWFtc11cbiAgaWYgKHR5cGVvZiBzdHJlYW1zWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtc1swXSA9IER1cGxleC5mcm9tKHN0cmVhbXNbMF0pXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBpZHggPSBzdHJlYW1zLmxlbmd0aCAtIDFcbiAgICBzdHJlYW1zW2lkeF0gPSBEdXBsZXguZnJvbShzdHJlYW1zW2lkeF0pXG4gIH1cbiAgZm9yIChsZXQgbiA9IDA7IG4gPCBzdHJlYW1zLmxlbmd0aDsgKytuKSB7XG4gICAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtc1tuXSkpIHtcbiAgICAgIC8vIFRPRE8ocm9uYWcpOiBBZGQgY2hlY2tzIGZvciBub24gc3RyZWFtcy5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChuIDwgc3RyZWFtcy5sZW5ndGggLSAxICYmICFpc1JlYWRhYmxlKHN0cmVhbXNbbl0pKSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKGBzdHJlYW1zWyR7bn1dYCwgb3JnU3RyZWFtc1tuXSwgJ211c3QgYmUgcmVhZGFibGUnKVxuICAgIH1cbiAgICBpZiAobiA+IDAgJiYgIWlzV3JpdGFibGUoc3RyZWFtc1tuXSkpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoYHN0cmVhbXNbJHtufV1gLCBvcmdTdHJlYW1zW25dLCAnbXVzdCBiZSB3cml0YWJsZScpXG4gICAgfVxuICB9XG4gIGxldCBvbmRyYWluXG4gIGxldCBvbmZpbmlzaFxuICBsZXQgb25yZWFkYWJsZVxuICBsZXQgb25jbG9zZVxuICBsZXQgZFxuICBmdW5jdGlvbiBvbmZpbmlzaGVkKGVycikge1xuICAgIGNvbnN0IGNiID0gb25jbG9zZVxuICAgIG9uY2xvc2UgPSBudWxsXG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpXG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIGQuZGVzdHJveShlcnIpXG4gICAgfSBlbHNlIGlmICghcmVhZGFibGUgJiYgIXdyaXRhYmxlKSB7XG4gICAgICBkLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuICBjb25zdCBoZWFkID0gc3RyZWFtc1swXVxuICBjb25zdCB0YWlsID0gcGlwZWxpbmUoc3RyZWFtcywgb25maW5pc2hlZClcbiAgY29uc3Qgd3JpdGFibGUgPSAhIWlzV3JpdGFibGUoaGVhZClcbiAgY29uc3QgcmVhZGFibGUgPSAhIWlzUmVhZGFibGUodGFpbClcblxuICAvLyBUT0RPKHJvbmFnKTogQXZvaWQgZG91YmxlIGJ1ZmZlcmluZy5cbiAgLy8gSW1wbGVtZW50IFdyaXRhYmxlL1JlYWRhYmxlL0R1cGxleCB0cmFpdHMuXG4gIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzM1MTUuXG4gIGQgPSBuZXcgRHVwbGV4KHtcbiAgICAvLyBUT0RPIChyb25hZyk6IGhpZ2hXYXRlck1hcms/XG4gICAgd3JpdGFibGVPYmplY3RNb2RlOiAhIShoZWFkICE9PSBudWxsICYmIGhlYWQgIT09IHVuZGVmaW5lZCAmJiBoZWFkLndyaXRhYmxlT2JqZWN0TW9kZSksXG4gICAgcmVhZGFibGVPYmplY3RNb2RlOiAhISh0YWlsICE9PSBudWxsICYmIHRhaWwgIT09IHVuZGVmaW5lZCAmJiB0YWlsLndyaXRhYmxlT2JqZWN0TW9kZSksXG4gICAgd3JpdGFibGUsXG4gICAgcmVhZGFibGVcbiAgfSlcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgZC5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgaWYgKGhlYWQud3JpdGUoY2h1bmssIGVuY29kaW5nKSkge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbmRyYWluID0gY2FsbGJhY2tcbiAgICAgIH1cbiAgICB9XG4gICAgZC5fZmluYWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGhlYWQuZW5kKClcbiAgICAgIG9uZmluaXNoID0gY2FsbGJhY2tcbiAgICB9XG4gICAgaGVhZC5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob25kcmFpbikge1xuICAgICAgICBjb25zdCBjYiA9IG9uZHJhaW5cbiAgICAgICAgb25kcmFpbiA9IG51bGxcbiAgICAgICAgY2IoKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGFpbC5vbignZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9uZmluaXNoKSB7XG4gICAgICAgIGNvbnN0IGNiID0gb25maW5pc2hcbiAgICAgICAgb25maW5pc2ggPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGlmIChyZWFkYWJsZSkge1xuICAgIHRhaWwub24oJ3JlYWRhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9ucmVhZGFibGUpIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbnJlYWRhYmxlXG4gICAgICAgIG9ucmVhZGFibGUgPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHRhaWwub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGQucHVzaChudWxsKVxuICAgIH0pXG4gICAgZC5fcmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IHRhaWwucmVhZCgpXG4gICAgICAgIGlmIChidWYgPT09IG51bGwpIHtcbiAgICAgICAgICBvbnJlYWRhYmxlID0gZC5fcmVhZFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZC5wdXNoKGJ1ZikpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBkLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWVyciAmJiBvbmNsb3NlICE9PSBudWxsKSB7XG4gICAgICBlcnIgPSBuZXcgQWJvcnRFcnJvcigpXG4gICAgfVxuICAgIG9ucmVhZGFibGUgPSBudWxsXG4gICAgb25kcmFpbiA9IG51bGxcbiAgICBvbmZpbmlzaCA9IG51bGxcbiAgICBpZiAob25jbG9zZSA9PT0gbnVsbCkge1xuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbmNsb3NlID0gY2FsbGJhY2tcbiAgICAgIGRlc3Ryb3llcih0YWlsLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiBkXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBcnJheVByb3RvdHlwZVBvcCwgUHJvbWlzZSB9ID0gcmVxdWlyZSgnLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IGlzSXRlcmFibGUsIGlzTm9kZVN0cmVhbSB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvc3RyZWFtcy91dGlscycpXG5jb25zdCB7IHBpcGVsaW5lSW1wbDogcGwgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUnKVxuY29uc3QgeyBmaW5pc2hlZCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtJylcbmZ1bmN0aW9uIHBpcGVsaW5lKC4uLnN0cmVhbXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgc2lnbmFsXG4gICAgbGV0IGVuZFxuICAgIGNvbnN0IGxhc3RBcmcgPSBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV1cbiAgICBpZiAobGFzdEFyZyAmJiB0eXBlb2YgbGFzdEFyZyA9PT0gJ29iamVjdCcgJiYgIWlzTm9kZVN0cmVhbShsYXN0QXJnKSAmJiAhaXNJdGVyYWJsZShsYXN0QXJnKSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5UHJvdG90eXBlUG9wKHN0cmVhbXMpXG4gICAgICBzaWduYWwgPSBvcHRpb25zLnNpZ25hbFxuICAgICAgZW5kID0gb3B0aW9ucy5lbmRcbiAgICB9XG4gICAgcGwoXG4gICAgICBzdHJlYW1zLFxuICAgICAgKGVyciwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBlbmRcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmluaXNoZWQsXG4gIHBpcGVsaW5lXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IE9iamVjdERlZmluZVByb3BlcnR5LCBPYmplY3RLZXlzLCBSZWZsZWN0QXBwbHkgfSA9IHJlcXVpcmUoJy4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7XG4gIHByb21pc2lmeTogeyBjdXN0b206IGN1c3RvbVByb21pc2lmeSB9XG59ID0gcmVxdWlyZSgnLi9vdXJzL3V0aWwnKVxuY29uc3QgeyBzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMsIHByb21pc2VSZXR1cm5pbmdPcGVyYXRvcnMgfSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9vcGVyYXRvcnMnKVxuY29uc3Qge1xuICBjb2RlczogeyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUiB9XG59ID0gcmVxdWlyZSgnLi9vdXJzL2Vycm9ycycpXG5jb25zdCBjb21wb3NlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2NvbXBvc2UnKVxuY29uc3QgeyBwaXBlbGluZSB9ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lJylcbmNvbnN0IHsgZGVzdHJveWVyIH0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbScpXG5jb25zdCBpbnRlcm5hbEJ1ZmZlciA9IHt9XG5jb25zdCBwcm9taXNlcyA9IHJlcXVpcmUoJy4vc3RyZWFtL3Byb21pc2VzJylcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzJylcbmNvbnN0IFN0cmVhbSA9IChtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9sZWdhY3knKS5TdHJlYW0pXG5TdHJlYW0uaXNEaXN0dXJiZWQgPSB1dGlscy5pc0Rpc3R1cmJlZFxuU3RyZWFtLmlzRXJyb3JlZCA9IHV0aWxzLmlzRXJyb3JlZFxuU3RyZWFtLmlzUmVhZGFibGUgPSB1dGlscy5pc1JlYWRhYmxlXG5TdHJlYW0uUmVhZGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvcmVhZGFibGUnKVxuZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0S2V5cyhzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMpKSB7XG4gIGNvbnN0IG9wID0gc3RyZWFtUmV0dXJuaW5nT3BlcmF0b3JzW2tleV1cbiAgZnVuY3Rpb24gZm4oLi4uYXJncykge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUigpXG4gICAgfVxuICAgIHJldHVybiBTdHJlYW0uUmVhZGFibGUuZnJvbShSZWZsZWN0QXBwbHkob3AsIHRoaXMsIGFyZ3MpKVxuICB9XG4gIE9iamVjdERlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLm5hbWVcbiAgfSlcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICdsZW5ndGgnLCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBvcC5sZW5ndGhcbiAgfSlcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoU3RyZWFtLlJlYWRhYmxlLnByb3RvdHlwZSwga2V5LCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBmbixcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcbn1cbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdEtleXMocHJvbWlzZVJldHVybmluZ09wZXJhdG9ycykpIHtcbiAgY29uc3Qgb3AgPSBwcm9taXNlUmV0dXJuaW5nT3BlcmF0b3JzW2tleV1cbiAgZnVuY3Rpb24gZm4oLi4uYXJncykge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUigpXG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0QXBwbHkob3AsIHRoaXMsIGFyZ3MpXG4gIH1cbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogb3AubmFtZVxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShmbiwgJ2xlbmd0aCcsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLmxlbmd0aFxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShTdHJlYW0uUmVhZGFibGUucHJvdG90eXBlLCBrZXksIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IGZuLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3dyaXRhYmxlJylcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4JylcblN0cmVhbS5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvdHJhbnNmb3JtJylcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9wYXNzdGhyb3VnaCcpXG5TdHJlYW0ucGlwZWxpbmUgPSBwaXBlbGluZVxuY29uc3QgeyBhZGRBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2FkZC1hYm9ydC1zaWduYWwnKVxuU3RyZWFtLmFkZEFib3J0U2lnbmFsID0gYWRkQWJvcnRTaWduYWxcblN0cmVhbS5maW5pc2hlZCA9IGVvc1xuU3RyZWFtLmRlc3Ryb3kgPSBkZXN0cm95ZXJcblN0cmVhbS5jb21wb3NlID0gY29tcG9zZVxuT2JqZWN0RGVmaW5lUHJvcGVydHkoU3RyZWFtLCAncHJvbWlzZXMnLCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHByb21pc2VzXG4gIH1cbn0pXG5PYmplY3REZWZpbmVQcm9wZXJ0eShwaXBlbGluZSwgY3VzdG9tUHJvbWlzaWZ5LCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0KCkge1xuICAgIHJldHVybiBwcm9taXNlcy5waXBlbGluZVxuICB9XG59KVxuT2JqZWN0RGVmaW5lUHJvcGVydHkoZW9zLCBjdXN0b21Qcm9taXNpZnksIHtcbiAgX19wcm90b19fOiBudWxsLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHByb21pc2VzLmZpbmlzaGVkXG4gIH1cbn0pXG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtXG5TdHJlYW0uX2lzVWludDhBcnJheSA9IGZ1bmN0aW9uIGlzVWludDhBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5XG59XG5TdHJlYW0uX3VpbnQ4QXJyYXlUb0J1ZmZlciA9IGZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rLmJ1ZmZlciwgY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZUxlbmd0aClcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuaWYgKFN0cmVhbSAmJiBwcm9jZXNzLmVudi5SRUFEQUJMRV9TVFJFQU0gPT09ICdkaXNhYmxlJykge1xuICBjb25zdCBwcm9taXNlcyA9IFN0cmVhbS5wcm9taXNlc1xuXG4gIC8vIEV4cGxpY2l0IGV4cG9ydCBuYW1pbmcgaXMgbmVlZGVkIGZvciBFU01cbiAgbW9kdWxlLmV4cG9ydHMuX3VpbnQ4QXJyYXlUb0J1ZmZlciA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyXG4gIG1vZHVsZS5leHBvcnRzLl9pc1VpbnQ4QXJyYXkgPSBTdHJlYW0uX2lzVWludDhBcnJheVxuICBtb2R1bGUuZXhwb3J0cy5pc0Rpc3R1cmJlZCA9IFN0cmVhbS5pc0Rpc3R1cmJlZFxuICBtb2R1bGUuZXhwb3J0cy5pc0Vycm9yZWQgPSBTdHJlYW0uaXNFcnJvcmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzUmVhZGFibGUgPSBTdHJlYW0uaXNSZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5SZWFkYWJsZSA9IFN0cmVhbS5SZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5Xcml0YWJsZSA9IFN0cmVhbS5Xcml0YWJsZVxuICBtb2R1bGUuZXhwb3J0cy5EdXBsZXggPSBTdHJlYW0uRHVwbGV4XG4gIG1vZHVsZS5leHBvcnRzLlRyYW5zZm9ybSA9IFN0cmVhbS5UcmFuc2Zvcm1cbiAgbW9kdWxlLmV4cG9ydHMuUGFzc1Rocm91Z2ggPSBTdHJlYW0uUGFzc1Rocm91Z2hcbiAgbW9kdWxlLmV4cG9ydHMuYWRkQWJvcnRTaWduYWwgPSBTdHJlYW0uYWRkQWJvcnRTaWduYWxcbiAgbW9kdWxlLmV4cG9ydHMuZmluaXNoZWQgPSBTdHJlYW0uZmluaXNoZWRcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IFN0cmVhbS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzLnBpcGVsaW5lID0gU3RyZWFtLnBpcGVsaW5lXG4gIG1vZHVsZS5leHBvcnRzLmNvbXBvc2UgPSBTdHJlYW0uY29tcG9zZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyZWFtLCAncHJvbWlzZXMnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHByb21pc2VzXG4gICAgfVxuICB9KVxuICBtb2R1bGUuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0uU3RyZWFtXG59IGVsc2Uge1xuICBjb25zdCBDdXN0b21TdHJlYW0gPSByZXF1aXJlKCcuLi9zdHJlYW0nKVxuICBjb25zdCBwcm9taXNlcyA9IHJlcXVpcmUoJy4uL3N0cmVhbS9wcm9taXNlcycpXG4gIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IEN1c3RvbVN0cmVhbS5SZWFkYWJsZS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzID0gQ3VzdG9tU3RyZWFtLlJlYWRhYmxlXG5cbiAgLy8gRXhwbGljaXQgZXhwb3J0IG5hbWluZyBpcyBuZWVkZWQgZm9yIEVTTVxuICBtb2R1bGUuZXhwb3J0cy5fdWludDhBcnJheVRvQnVmZmVyID0gQ3VzdG9tU3RyZWFtLl91aW50OEFycmF5VG9CdWZmZXJcbiAgbW9kdWxlLmV4cG9ydHMuX2lzVWludDhBcnJheSA9IEN1c3RvbVN0cmVhbS5faXNVaW50OEFycmF5XG4gIG1vZHVsZS5leHBvcnRzLmlzRGlzdHVyYmVkID0gQ3VzdG9tU3RyZWFtLmlzRGlzdHVyYmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzRXJyb3JlZCA9IEN1c3RvbVN0cmVhbS5pc0Vycm9yZWRcbiAgbW9kdWxlLmV4cG9ydHMuaXNSZWFkYWJsZSA9IEN1c3RvbVN0cmVhbS5pc1JlYWRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLlJlYWRhYmxlID0gQ3VzdG9tU3RyZWFtLlJlYWRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLldyaXRhYmxlID0gQ3VzdG9tU3RyZWFtLldyaXRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLkR1cGxleCA9IEN1c3RvbVN0cmVhbS5EdXBsZXhcbiAgbW9kdWxlLmV4cG9ydHMuVHJhbnNmb3JtID0gQ3VzdG9tU3RyZWFtLlRyYW5zZm9ybVxuICBtb2R1bGUuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IEN1c3RvbVN0cmVhbS5QYXNzVGhyb3VnaFxuICBtb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IEN1c3RvbVN0cmVhbS5hZGRBYm9ydFNpZ25hbFxuICBtb2R1bGUuZXhwb3J0cy5maW5pc2hlZCA9IEN1c3RvbVN0cmVhbS5maW5pc2hlZFxuICBtb2R1bGUuZXhwb3J0cy5kZXN0cm95ID0gQ3VzdG9tU3RyZWFtLmRlc3Ryb3lcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IG9yaWdpbmFsRGVzdHJveVxuICBtb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IEN1c3RvbVN0cmVhbS5waXBlbGluZVxuICBtb2R1bGUuZXhwb3J0cy5jb21wb3NlID0gQ3VzdG9tU3RyZWFtLmNvbXBvc2VcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEN1c3RvbVN0cmVhbSwgJ3Byb21pc2VzJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlc1xuICAgIH1cbiAgfSlcbiAgbW9kdWxlLmV4cG9ydHMuU3RyZWFtID0gQ3VzdG9tU3RyZWFtLlN0cmVhbVxufVxuXG4vLyBBbGxvdyBkZWZhdWx0IGltcG9ydGluZ1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IG1vZHVsZS5leHBvcnRzXG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgQnVmZmVyIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcignQnVmZmVyTGlzdCcpXG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QgKGJ1Zikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyTGlzdCkpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlckxpc3QoYnVmKVxuICB9XG5cbiAgQnVmZmVyTGlzdC5faW5pdC5jYWxsKHRoaXMsIGJ1Zilcbn1cblxuQnVmZmVyTGlzdC5faW5pdCA9IGZ1bmN0aW9uIF9pbml0IChidWYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN5bWJvbCwgeyB2YWx1ZTogdHJ1ZSB9KVxuXG4gIHRoaXMuX2J1ZnMgPSBbXVxuICB0aGlzLmxlbmd0aCA9IDBcblxuICBpZiAoYnVmKSB7XG4gICAgdGhpcy5hcHBlbmQoYnVmKVxuICB9XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9uZXcgPSBmdW5jdGlvbiBfbmV3IChidWYpIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0KGJ1Zilcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX29mZnNldCA9IGZ1bmN0aW9uIF9vZmZzZXQgKG9mZnNldCkge1xuICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgcmV0dXJuIFswLCAwXVxuICB9XG5cbiAgbGV0IHRvdCA9IDBcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBfdCA9IHRvdCArIHRoaXMuX2J1ZnNbaV0ubGVuZ3RoXG4gICAgaWYgKG9mZnNldCA8IF90IHx8IGkgPT09IHRoaXMuX2J1ZnMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIFtpLCBvZmZzZXQgLSB0b3RdXG4gICAgfVxuICAgIHRvdCA9IF90XG4gIH1cbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX3JldmVyc2VPZmZzZXQgPSBmdW5jdGlvbiAoYmxPZmZzZXQpIHtcbiAgY29uc3QgYnVmZmVySWQgPSBibE9mZnNldFswXVxuICBsZXQgb2Zmc2V0ID0gYmxPZmZzZXRbMV1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcklkOyBpKyspIHtcbiAgICBvZmZzZXQgKz0gdGhpcy5fYnVmc1tpXS5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCkge1xuICBpZiAoaW5kZXggPiB0aGlzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSB0aGlzLl9vZmZzZXQoaW5kZXgpXG5cbiAgcmV0dXJuIHRoaXMuX2J1ZnNbb2Zmc2V0WzBdXVtvZmZzZXRbMV1dXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ251bWJlcicgJiYgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5kID09PSAnbnVtYmVyJyAmJiBlbmQgPCAwKSB7XG4gICAgZW5kICs9IHRoaXMubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhpcy5jb3B5KG51bGwsIDAsIHN0YXJ0LCBlbmQpXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkc3QsIGRzdFN0YXJ0LCBzcmNTdGFydCwgc3JjRW5kKSB7XG4gIGlmICh0eXBlb2Ygc3JjU3RhcnQgIT09ICdudW1iZXInIHx8IHNyY1N0YXJ0IDwgMCkge1xuICAgIHNyY1N0YXJ0ID0gMFxuICB9XG5cbiAgaWYgKHR5cGVvZiBzcmNFbmQgIT09ICdudW1iZXInIHx8IHNyY0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgc3JjRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzcmNTdGFydCA+PSB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiBkc3QgfHwgQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICBpZiAoc3JjRW5kIDw9IDApIHtcbiAgICByZXR1cm4gZHN0IHx8IEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgY29uc3QgY29weSA9ICEhZHN0XG4gIGNvbnN0IG9mZiA9IHRoaXMuX29mZnNldChzcmNTdGFydClcbiAgY29uc3QgbGVuID0gc3JjRW5kIC0gc3JjU3RhcnRcbiAgbGV0IGJ5dGVzID0gbGVuXG4gIGxldCBidWZvZmYgPSAoY29weSAmJiBkc3RTdGFydCkgfHwgMFxuICBsZXQgc3RhcnQgPSBvZmZbMV1cblxuICAvLyBjb3B5L3NsaWNlIGV2ZXJ5dGhpbmdcbiAgaWYgKHNyY1N0YXJ0ID09PSAwICYmIHNyY0VuZCA9PT0gdGhpcy5sZW5ndGgpIHtcbiAgICBpZiAoIWNvcHkpIHtcbiAgICAgIC8vIHNsaWNlLCBidXQgZnVsbCBjb25jYXQgaWYgbXVsdGlwbGUgYnVmZmVyc1xuICAgICAgcmV0dXJuIHRoaXMuX2J1ZnMubGVuZ3RoID09PSAxXG4gICAgICAgID8gdGhpcy5fYnVmc1swXVxuICAgICAgICA6IEJ1ZmZlci5jb25jYXQodGhpcy5fYnVmcywgdGhpcy5sZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gY29weSwgbmVlZCB0byBjb3B5IGluZGl2aWR1YWwgYnVmZmVyc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmKVxuICAgICAgYnVmb2ZmICs9IHRoaXMuX2J1ZnNbaV0ubGVuZ3RoXG4gICAgfVxuXG4gICAgcmV0dXJuIGRzdFxuICB9XG5cbiAgLy8gZWFzeSwgY2hlYXAgY2FzZSB3aGVyZSBpdCdzIGEgc3Vic2V0IG9mIG9uZSBvZiB0aGUgYnVmZmVyc1xuICBpZiAoYnl0ZXMgPD0gdGhpcy5fYnVmc1tvZmZbMF1dLmxlbmd0aCAtIHN0YXJ0KSB7XG4gICAgcmV0dXJuIGNvcHlcbiAgICAgID8gdGhpcy5fYnVmc1tvZmZbMF1dLmNvcHkoZHN0LCBkc3RTdGFydCwgc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gICAgICA6IHRoaXMuX2J1ZnNbb2ZmWzBdXS5zbGljZShzdGFydCwgc3RhcnQgKyBieXRlcylcbiAgfVxuXG4gIGlmICghY29weSkge1xuICAgIC8vIGEgc2xpY2UsIHdlIG5lZWQgc29tZXRoaW5nIHRvIGNvcHkgaW4gdG9cbiAgICBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG9mZlswXTsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBsID0gdGhpcy5fYnVmc1tpXS5sZW5ndGggLSBzdGFydFxuXG4gICAgaWYgKGJ5dGVzID4gbCkge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmLCBzdGFydClcbiAgICAgIGJ1Zm9mZiArPSBsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2J1ZnNbaV0uY29weShkc3QsIGJ1Zm9mZiwgc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gICAgICBidWZvZmYgKz0gbFxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBieXRlcyAtPSBsXG5cbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgIHN0YXJ0ID0gMFxuICAgIH1cbiAgfVxuXG4gIC8vIHNhZmVndWFyZCBzbyB0aGF0IHdlIGRvbid0IHJldHVybiB1bmluaXRpYWxpemVkIG1lbW9yeVxuICBpZiAoZHN0Lmxlbmd0aCA+IGJ1Zm9mZikgcmV0dXJuIGRzdC5zbGljZSgwLCBidWZvZmYpXG5cbiAgcmV0dXJuIGRzdFxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zaGFsbG93U2xpY2UgPSBmdW5jdGlvbiBzaGFsbG93U2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwXG4gIGVuZCA9IHR5cGVvZiBlbmQgIT09ICdudW1iZXInID8gdGhpcy5sZW5ndGggOiBlbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgIHJldHVybiB0aGlzLl9uZXcoKVxuICB9XG5cbiAgY29uc3Qgc3RhcnRPZmZzZXQgPSB0aGlzLl9vZmZzZXQoc3RhcnQpXG4gIGNvbnN0IGVuZE9mZnNldCA9IHRoaXMuX29mZnNldChlbmQpXG4gIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9idWZzLnNsaWNlKHN0YXJ0T2Zmc2V0WzBdLCBlbmRPZmZzZXRbMF0gKyAxKVxuXG4gIGlmIChlbmRPZmZzZXRbMV0gPT09IDApIHtcbiAgICBidWZmZXJzLnBvcCgpXG4gIH0gZWxzZSB7XG4gICAgYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdID0gYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdLnNsaWNlKDAsIGVuZE9mZnNldFsxXSlcbiAgfVxuXG4gIGlmIChzdGFydE9mZnNldFsxXSAhPT0gMCkge1xuICAgIGJ1ZmZlcnNbMF0gPSBidWZmZXJzWzBdLnNsaWNlKHN0YXJ0T2Zmc2V0WzFdKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMuX25ldyhidWZmZXJzKVxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZylcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uIGNvbnN1bWUgKGJ5dGVzKSB7XG4gIC8vIGZpcnN0LCBub3JtYWxpemUgdGhlIGFyZ3VtZW50LCBpbiBhY2NvcmRhbmNlIHdpdGggaG93IEJ1ZmZlciBkb2VzIGl0XG4gIGJ5dGVzID0gTWF0aC50cnVuYyhieXRlcylcbiAgLy8gZG8gbm90aGluZyBpZiBub3QgYSBwb3NpdGl2ZSBudW1iZXJcbiAgaWYgKE51bWJlci5pc05hTihieXRlcykgfHwgYnl0ZXMgPD0gMCkgcmV0dXJuIHRoaXNcblxuICB3aGlsZSAodGhpcy5fYnVmcy5sZW5ndGgpIHtcbiAgICBpZiAoYnl0ZXMgPj0gdGhpcy5fYnVmc1swXS5sZW5ndGgpIHtcbiAgICAgIGJ5dGVzIC09IHRoaXMuX2J1ZnNbMF0ubGVuZ3RoXG4gICAgICB0aGlzLmxlbmd0aCAtPSB0aGlzLl9idWZzWzBdLmxlbmd0aFxuICAgICAgdGhpcy5fYnVmcy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2J1ZnNbMF0gPSB0aGlzLl9idWZzWzBdLnNsaWNlKGJ5dGVzKVxuICAgICAgdGhpcy5sZW5ndGggLT0gYnl0ZXNcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZHVwbGljYXRlID0gZnVuY3Rpb24gZHVwbGljYXRlICgpIHtcbiAgY29uc3QgY29weSA9IHRoaXMuX25ldygpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9idWZzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29weS5hcHBlbmQodGhpcy5fYnVmc1tpXSlcbiAgfVxuXG4gIHJldHVybiBjb3B5XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAoYnVmKSB7XG4gIGlmIChidWYgPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoYnVmLmJ1ZmZlcikge1xuICAgIC8vIGFwcGVuZCBhIHZpZXcgb2YgdGhlIHVuZGVybHlpbmcgQXJyYXlCdWZmZXJcbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoQnVmZmVyLmZyb20oYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKSlcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGJ1ZikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcHBlbmQoYnVmW2ldKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aGlzLl9pc0J1ZmZlckxpc3QoYnVmKSkge1xuICAgIC8vIHVud3JhcCBhcmd1bWVudCBpbnRvIGluZGl2aWR1YWwgQnVmZmVyTGlzdHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcHBlbmQoYnVmLl9idWZzW2ldKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjb2VyY2UgbnVtYmVyIGFyZ3VtZW50cyB0byBzdHJpbmdzLCBzaW5jZSBCdWZmZXIobnVtYmVyKSBkb2VzXG4gICAgLy8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvblxuICAgIGlmICh0eXBlb2YgYnVmID09PSAnbnVtYmVyJykge1xuICAgICAgYnVmID0gYnVmLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoQnVmZmVyLmZyb20oYnVmKSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9hcHBlbmRCdWZmZXIgPSBmdW5jdGlvbiBhcHBlbmRCdWZmZXIgKGJ1Zikge1xuICB0aGlzLl9idWZzLnB1c2goYnVmKVxuICB0aGlzLmxlbmd0aCArPSBidWYubGVuZ3RoXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAoc2VhcmNoLCBvZmZzZXQsIGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkoc2VhcmNoKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQnVmZmVyTGlzdCwgb3IgVWludDhBcnJheS4nKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWFyY2ggPT09ICdudW1iZXInKSB7XG4gICAgc2VhcmNoID0gQnVmZmVyLmZyb20oW3NlYXJjaF0pXG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICBzZWFyY2ggPSBCdWZmZXIuZnJvbShzZWFyY2gsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKHRoaXMuX2lzQnVmZmVyTGlzdChzZWFyY2gpKSB7XG4gICAgc2VhcmNoID0gc2VhcmNoLnNsaWNlKClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaC5idWZmZXIpKSB7XG4gICAgc2VhcmNoID0gQnVmZmVyLmZyb20oc2VhcmNoLmJ1ZmZlciwgc2VhcmNoLmJ5dGVPZmZzZXQsIHNlYXJjaC5ieXRlTGVuZ3RoKVxuICB9IGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgIHNlYXJjaCA9IEJ1ZmZlci5mcm9tKHNlYXJjaClcbiAgfVxuXG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQgfHwgMClcblxuICBpZiAoaXNOYU4ob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IDBcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgb2Zmc2V0ID0gdGhpcy5sZW5ndGggKyBvZmZzZXRcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgb2Zmc2V0ID0gMFxuICB9XG5cbiAgaWYgKHNlYXJjaC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2Zmc2V0ID4gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aCA6IG9mZnNldFxuICB9XG5cbiAgY29uc3QgYmxPZmZzZXQgPSB0aGlzLl9vZmZzZXQob2Zmc2V0KVxuICBsZXQgYmxJbmRleCA9IGJsT2Zmc2V0WzBdIC8vIGluZGV4IG9mIHdoaWNoIGludGVybmFsIGJ1ZmZlciB3ZSdyZSB3b3JraW5nIG9uXG4gIGxldCBidWZmT2Zmc2V0ID0gYmxPZmZzZXRbMV0gLy8gb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIgd2UncmUgd29ya2luZyBvblxuXG4gIC8vIHNjYW4gb3ZlciBlYWNoIGJ1ZmZlclxuICBmb3IgKDsgYmxJbmRleCA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBibEluZGV4KyspIHtcbiAgICBjb25zdCBidWZmID0gdGhpcy5fYnVmc1tibEluZGV4XVxuXG4gICAgd2hpbGUgKGJ1ZmZPZmZzZXQgPCBidWZmLmxlbmd0aCkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlV2luZG93ID0gYnVmZi5sZW5ndGggLSBidWZmT2Zmc2V0XG5cbiAgICAgIGlmIChhdmFpbGFibGVXaW5kb3cgPj0gc2VhcmNoLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuYXRpdmVTZWFyY2hSZXN1bHQgPSBidWZmLmluZGV4T2Yoc2VhcmNoLCBidWZmT2Zmc2V0KVxuXG4gICAgICAgIGlmIChuYXRpdmVTZWFyY2hSZXN1bHQgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JldmVyc2VPZmZzZXQoW2JsSW5kZXgsIG5hdGl2ZVNlYXJjaFJlc3VsdF0pXG4gICAgICAgIH1cblxuICAgICAgICBidWZmT2Zmc2V0ID0gYnVmZi5sZW5ndGggLSBzZWFyY2gubGVuZ3RoICsgMSAvLyBlbmQgb2YgbmF0aXZlIHNlYXJjaCB3aW5kb3dcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJldk9mZnNldCA9IHRoaXMuX3JldmVyc2VPZmZzZXQoW2JsSW5kZXgsIGJ1ZmZPZmZzZXRdKVxuXG4gICAgICAgIGlmICh0aGlzLl9tYXRjaChyZXZPZmZzZXQsIHNlYXJjaCkpIHtcbiAgICAgICAgICByZXR1cm4gcmV2T2Zmc2V0XG4gICAgICAgIH1cblxuICAgICAgICBidWZmT2Zmc2V0KytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBidWZmT2Zmc2V0ID0gMFxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9tYXRjaCA9IGZ1bmN0aW9uIChvZmZzZXQsIHNlYXJjaCkge1xuICBpZiAodGhpcy5sZW5ndGggLSBvZmZzZXQgPCBzZWFyY2gubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGxldCBzZWFyY2hPZmZzZXQgPSAwOyBzZWFyY2hPZmZzZXQgPCBzZWFyY2gubGVuZ3RoOyBzZWFyY2hPZmZzZXQrKykge1xuICAgIGlmICh0aGlzLmdldChvZmZzZXQgKyBzZWFyY2hPZmZzZXQpICE9PSBzZWFyY2hbc2VhcmNoT2Zmc2V0XSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbjsoZnVuY3Rpb24gKCkge1xuICBjb25zdCBtZXRob2RzID0ge1xuICAgIHJlYWREb3VibGVCRTogOCxcbiAgICByZWFkRG91YmxlTEU6IDgsXG4gICAgcmVhZEZsb2F0QkU6IDQsXG4gICAgcmVhZEZsb2F0TEU6IDQsXG4gICAgcmVhZEJpZ0ludDY0QkU6IDgsXG4gICAgcmVhZEJpZ0ludDY0TEU6IDgsXG4gICAgcmVhZEJpZ1VJbnQ2NEJFOiA4LFxuICAgIHJlYWRCaWdVSW50NjRMRTogOCxcbiAgICByZWFkSW50MzJCRTogNCxcbiAgICByZWFkSW50MzJMRTogNCxcbiAgICByZWFkVUludDMyQkU6IDQsXG4gICAgcmVhZFVJbnQzMkxFOiA0LFxuICAgIHJlYWRJbnQxNkJFOiAyLFxuICAgIHJlYWRJbnQxNkxFOiAyLFxuICAgIHJlYWRVSW50MTZCRTogMixcbiAgICByZWFkVUludDE2TEU6IDIsXG4gICAgcmVhZEludDg6IDEsXG4gICAgcmVhZFVJbnQ4OiAxLFxuICAgIHJlYWRJbnRCRTogbnVsbCxcbiAgICByZWFkSW50TEU6IG51bGwsXG4gICAgcmVhZFVJbnRCRTogbnVsbCxcbiAgICByZWFkVUludExFOiBudWxsXG4gIH1cblxuICBmb3IgKGNvbnN0IG0gaW4gbWV0aG9kcykge1xuICAgIChmdW5jdGlvbiAobSkge1xuICAgICAgaWYgKG1ldGhvZHNbbV0gPT09IG51bGwpIHtcbiAgICAgICAgQnVmZmVyTGlzdC5wcm90b3R5cGVbbV0gPSBmdW5jdGlvbiAob2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlTGVuZ3RoKVttXSgwLCBieXRlTGVuZ3RoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBCdWZmZXJMaXN0LnByb3RvdHlwZVttXSA9IGZ1bmN0aW9uIChvZmZzZXQgPSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtZXRob2RzW21dKVttXSgwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfShtKSlcbiAgfVxufSgpKVxuXG4vLyBVc2VkIGludGVybmFsbHkgYnkgdGhlIGNsYXNzIGFuZCBhbHNvIGFzIGFuIGluZGljYXRvciBvZiB0aGlzIG9iamVjdCBiZWluZ1xuLy8gYSBgQnVmZmVyTGlzdGAuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJMaXN0YCBpbiBhIGJyb3dzZXJcbi8vIGVudmlyb25tZW50IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50IGNvcGllcyBvZiB0aGVcbi8vIEJ1ZmZlckxpc3QgY2xhc3MgYW5kIHNvbWUgYEJ1ZmZlckxpc3RgcyBtaWdodCBiZSBgQnVmZmVyTGlzdGBzLlxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX2lzQnVmZmVyTGlzdCA9IGZ1bmN0aW9uIF9pc0J1ZmZlckxpc3QgKGIpIHtcbiAgcmV0dXJuIGIgaW5zdGFuY2VvZiBCdWZmZXJMaXN0IHx8IEJ1ZmZlckxpc3QuaXNCdWZmZXJMaXN0KGIpXG59XG5cbkJ1ZmZlckxpc3QuaXNCdWZmZXJMaXN0ID0gZnVuY3Rpb24gaXNCdWZmZXJMaXN0IChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYltzeW1ib2xdXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyTGlzdFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IER1cGxleFN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLkR1cGxleFxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG5jb25zdCBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9CdWZmZXJMaXN0JylcblxuZnVuY3Rpb24gQnVmZmVyTGlzdFN0cmVhbSAoY2FsbGJhY2spIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlckxpc3RTdHJlYW0pKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0U3RyZWFtKGNhbGxiYWNrKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2tcblxuICAgIGNvbnN0IHBpcGVyID0gZnVuY3Rpb24gcGlwZXIgKGVycikge1xuICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrKGVycilcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsXG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLm9uKCdwaXBlJywgZnVuY3Rpb24gb25QaXBlIChzcmMpIHtcbiAgICAgIHNyYy5vbignZXJyb3InLCBwaXBlcilcbiAgICB9KVxuICAgIHRoaXMub24oJ3VucGlwZScsIGZ1bmN0aW9uIG9uVW5waXBlIChzcmMpIHtcbiAgICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBwaXBlcilcbiAgICB9KVxuXG4gICAgY2FsbGJhY2sgPSBudWxsXG4gIH1cblxuICBCdWZmZXJMaXN0Ll9pbml0LmNhbGwodGhpcywgY2FsbGJhY2spXG4gIER1cGxleFN0cmVhbS5jYWxsKHRoaXMpXG59XG5cbmluaGVyaXRzKEJ1ZmZlckxpc3RTdHJlYW0sIER1cGxleFN0cmVhbSlcbk9iamVjdC5hc3NpZ24oQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUsIEJ1ZmZlckxpc3QucHJvdG90eXBlKVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fbmV3ID0gZnVuY3Rpb24gX25ldyAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0U3RyZWFtKGNhbGxiYWNrKVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiBfd3JpdGUgKGJ1ZiwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHRoaXMuX2FwcGVuZEJ1ZmZlcihidWYpXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIF9yZWFkIChzaXplKSB7XG4gIGlmICghdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5wdXNoKG51bGwpXG4gIH1cblxuICBzaXplID0gTWF0aC5taW4oc2l6ZSwgdGhpcy5sZW5ndGgpXG4gIHRoaXMucHVzaCh0aGlzLnNsaWNlKDAsIHNpemUpKVxuICB0aGlzLmNvbnN1bWUoc2l6ZSlcbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gZW5kIChjaHVuaykge1xuICBEdXBsZXhTdHJlYW0ucHJvdG90eXBlLmVuZC5jYWxsKHRoaXMsIGNodW5rKVxuXG4gIGlmICh0aGlzLl9jYWxsYmFjaykge1xuICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsIHRoaXMuc2xpY2UoKSlcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGxcbiAgfVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIF9kZXN0cm95IChlcnIsIGNiKSB7XG4gIHRoaXMuX2J1ZnMubGVuZ3RoID0gMFxuICB0aGlzLmxlbmd0aCA9IDBcbiAgY2IoZXJyKVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5faXNCdWZmZXJMaXN0ID0gZnVuY3Rpb24gX2lzQnVmZmVyTGlzdCAoYikge1xuICByZXR1cm4gYiBpbnN0YW5jZW9mIEJ1ZmZlckxpc3RTdHJlYW0gfHwgYiBpbnN0YW5jZW9mIEJ1ZmZlckxpc3QgfHwgQnVmZmVyTGlzdFN0cmVhbS5pc0J1ZmZlckxpc3QoYilcbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5pc0J1ZmZlckxpc3QgPSBCdWZmZXJMaXN0LmlzQnVmZmVyTGlzdFxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlckxpc3RTdHJlYW1cbm1vZHVsZS5leHBvcnRzLkJ1ZmZlckxpc3RTdHJlYW0gPSBCdWZmZXJMaXN0U3RyZWFtXG5tb2R1bGUuZXhwb3J0cy5CdWZmZXJMaXN0ID0gQnVmZmVyTGlzdFxuIiwibW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IChmbikgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbilcbiIsIm1vZHVsZS5leHBvcnRzID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJylcbiAgPyBwcm9jZXNzLm5leHRUaWNrLmJpbmQocHJvY2VzcylcbiAgOiByZXF1aXJlKCcuL3F1ZXVlLW1pY3JvdGFzaycpXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEZpeGVkRklGTyB7XG4gIGNvbnN0cnVjdG9yIChod20pIHtcbiAgICBpZiAoIShod20gPiAwKSB8fCAoKGh3bSAtIDEpICYgaHdtKSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdNYXggc2l6ZSBmb3IgYSBGaXhlZEZJRk8gc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvJylcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheShod20pXG4gICAgdGhpcy5tYXNrID0gaHdtIC0gMVxuICAgIHRoaXMudG9wID0gMFxuICAgIHRoaXMuYnRtID0gMFxuICAgIHRoaXMubmV4dCA9IG51bGxcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodGhpcy5idWZmZXJbdGhpcy50b3BdICE9PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZVxuICAgIHRoaXMuYnVmZmVyW3RoaXMudG9wXSA9IGRhdGFcbiAgICB0aGlzLnRvcCA9ICh0aGlzLnRvcCArIDEpICYgdGhpcy5tYXNrXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5idWZmZXJbdGhpcy5idG1dXG4gICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuYnRtID0gKHRoaXMuYnRtICsgMSkgJiB0aGlzLm1hc2tcbiAgICByZXR1cm4gbGFzdFxuICB9XG5cbiAgcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXVxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9PT0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImNvbnN0IEZpeGVkRklGTyA9IHJlcXVpcmUoJy4vZml4ZWQtc2l6ZScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRmFzdEZJRk8ge1xuICBjb25zdHJ1Y3RvciAoaHdtKSB7XG4gICAgdGhpcy5od20gPSBod20gfHwgMTZcbiAgICB0aGlzLmhlYWQgPSBuZXcgRml4ZWRGSUZPKHRoaXMuaHdtKVxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZFxuICB9XG5cbiAgcHVzaCAodmFsKSB7XG4gICAgaWYgKCF0aGlzLmhlYWQucHVzaCh2YWwpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5oZWFkXG4gICAgICB0aGlzLmhlYWQgPSBwcmV2Lm5leHQgPSBuZXcgRml4ZWRGSUZPKDIgKiB0aGlzLmhlYWQuYnVmZmVyLmxlbmd0aClcbiAgICAgIHRoaXMuaGVhZC5wdXNoKHZhbClcbiAgICB9XG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy50YWlsLnNoaWZ0KClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnRhaWwubmV4dFxuICAgICAgdGhpcy50YWlsLm5leHQgPSBudWxsXG4gICAgICB0aGlzLnRhaWwgPSBuZXh0XG4gICAgICByZXR1cm4gdGhpcy50YWlsLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFpbC5wZWVrKClcbiAgfVxuXG4gIGlzRW1wdHkgKCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuaXNFbXB0eSgpXG4gIH1cbn1cbiIsImNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgU1RSRUFNX0RFU1RST1lFRCA9IG5ldyBFcnJvcignU3RyZWFtIHdhcyBkZXN0cm95ZWQnKVxuY29uc3QgUFJFTUFUVVJFX0NMT1NFID0gbmV3IEVycm9yKCdQcmVtYXR1cmUgY2xvc2UnKVxuXG5jb25zdCBxdWV1ZVRpY2sgPSByZXF1aXJlKCdxdWV1ZS10aWNrJylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zcGFjZXMgKi9cblxuLy8gMjYgYml0cyB1c2VkIHRvdGFsICg0IGZyb20gc2hhcmVkLCAxMyBmcm9tIHJlYWQsIGFuZCA5IGZyb20gd3JpdGUpXG5jb25zdCBNQVggPSAoKDEgPDwgMjYpIC0gMSlcblxuLy8gU2hhcmVkIHN0YXRlXG5jb25zdCBPUEVOSU5HICAgICAgID0gMGIwMDAxXG5jb25zdCBQUkVERVNUUk9ZSU5HID0gMGIwMDEwXG5jb25zdCBERVNUUk9ZSU5HICAgID0gMGIwMTAwXG5jb25zdCBERVNUUk9ZRUQgICAgID0gMGIxMDAwXG5cbmNvbnN0IE5PVF9PUEVOSU5HID0gTUFYIF4gT1BFTklOR1xuY29uc3QgTk9UX1BSRURFU1RST1lJTkcgPSBNQVggXiBQUkVERVNUUk9ZSU5HXG5cbi8vIFJlYWQgc3RhdGUgKDQgYml0IG9mZnNldCBmcm9tIHNoYXJlZCBzdGF0ZSlcbmNvbnN0IFJFQURfQUNUSVZFICAgICAgICAgICA9IDBiMDAwMDAwMDAwMDAwMSA8PCA0XG5jb25zdCBSRUFEX1BSSU1BUlkgICAgICAgICAgPSAwYjAwMDAwMDAwMDAwMTAgPDwgNFxuY29uc3QgUkVBRF9TWU5DICAgICAgICAgICAgID0gMGIwMDAwMDAwMDAwMTAwIDw8IDRcbmNvbnN0IFJFQURfUVVFVUVEICAgICAgICAgICA9IDBiMDAwMDAwMDAwMTAwMCA8PCA0XG5jb25zdCBSRUFEX1JFU1VNRUQgICAgICAgICAgPSAwYjAwMDAwMDAwMTAwMDAgPDwgNFxuY29uc3QgUkVBRF9QSVBFX0RSQUlORUQgICAgID0gMGIwMDAwMDAwMTAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU5ESU5HICAgICAgICAgICA9IDBiMDAwMDAwMTAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VNSVRfREFUQSAgICAgICAgPSAwYjAwMDAwMTAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFICAgID0gMGIwMDAwMTAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU1JVFRFRF9SRUFEQUJMRSA9IDBiMDAwMTAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0RPTkUgICAgICAgICAgICAgPSAwYjAwMTAwMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9ORVhUX1RJQ0sgICAgICAgID0gMGIwMTAwMDAwMDAwMDAxIDw8IDQgLy8gYWxzbyBhY3RpdmVcbmNvbnN0IFJFQURfTkVFRFNfUFVTSCAgICAgICA9IDBiMTAwMDAwMDAwMDAwMCA8PCA0XG5cbi8vIENvbWJpbmVkIHJlYWQgc3RhdGVcbmNvbnN0IFJFQURfRkxPV0lORyA9IFJFQURfUkVTVU1FRCB8IFJFQURfUElQRV9EUkFJTkVEXG5jb25zdCBSRUFEX0FDVElWRV9BTkRfU1lOQyA9IFJFQURfQUNUSVZFIHwgUkVBRF9TWU5DXG5jb25zdCBSRUFEX0FDVElWRV9BTkRfU1lOQ19BTkRfTkVFRFNfUFVTSCA9IFJFQURfQUNUSVZFIHwgUkVBRF9TWU5DIHwgUkVBRF9ORUVEU19QVVNIXG5jb25zdCBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSA9IFJFQURfUFJJTUFSWSB8IFJFQURfQUNUSVZFXG5jb25zdCBSRUFEX0VNSVRfUkVBREFCTEVfQU5EX1FVRVVFRCA9IFJFQURfRU1JVF9SRUFEQUJMRSB8IFJFQURfUVVFVUVEXG5cbmNvbnN0IFJFQURfTk9UX0FDVElWRSAgICAgICAgICAgICA9IE1BWCBeIFJFQURfQUNUSVZFXG5jb25zdCBSRUFEX05PTl9QUklNQVJZICAgICAgICAgICAgPSBNQVggXiBSRUFEX1BSSU1BUllcbmNvbnN0IFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRCA9IE1BWCBeIChSRUFEX1BSSU1BUlkgfCBSRUFEX05FRURTX1BVU0gpXG5jb25zdCBSRUFEX05PVF9TWU5DICAgICAgICAgICAgICAgPSBNQVggXiBSRUFEX1NZTkNcbmNvbnN0IFJFQURfUFVTSEVEICAgICAgICAgICAgICAgICA9IE1BWCBeIFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QQVVTRUQgICAgICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9SRVNVTUVEXG5jb25zdCBSRUFEX05PVF9RVUVVRUQgICAgICAgICAgICAgPSBNQVggXiAoUkVBRF9RVUVVRUQgfCBSRUFEX0VNSVRURURfUkVBREFCTEUpXG5jb25zdCBSRUFEX05PVF9FTkRJTkcgICAgICAgICAgICAgPSBNQVggXiBSRUFEX0VORElOR1xuY29uc3QgUkVBRF9QSVBFX05PVF9EUkFJTkVEICAgICAgID0gTUFYIF4gUkVBRF9GTE9XSU5HXG5jb25zdCBSRUFEX05PVF9ORVhUX1RJQ0sgICAgICAgICAgPSBNQVggXiBSRUFEX05FWFRfVElDS1xuXG4vLyBXcml0ZSBzdGF0ZSAoMTcgYml0IG9mZnNldCwgNCBiaXQgb2Zmc2V0IGZyb20gc2hhcmVkIHN0YXRlIGFuZCAxMyBmcm9tIHJlYWQgc3RhdGUpXG5jb25zdCBXUklURV9BQ1RJVkUgICAgID0gMGIwMDAwMDAwMDEgPDwgMTdcbmNvbnN0IFdSSVRFX1BSSU1BUlkgICAgPSAwYjAwMDAwMDAxMCA8PCAxN1xuY29uc3QgV1JJVEVfU1lOQyAgICAgICA9IDBiMDAwMDAwMTAwIDw8IDE3XG5jb25zdCBXUklURV9RVUVVRUQgICAgID0gMGIwMDAwMDEwMDAgPDwgMTdcbmNvbnN0IFdSSVRFX1VORFJBSU5FRCAgPSAwYjAwMDAxMDAwMCA8PCAxN1xuY29uc3QgV1JJVEVfRE9ORSAgICAgICA9IDBiMDAwMTAwMDAwIDw8IDE3XG5jb25zdCBXUklURV9FTUlUX0RSQUlOID0gMGIwMDEwMDAwMDAgPDwgMTdcbmNvbnN0IFdSSVRFX05FWFRfVElDSyAgPSAwYjAxMDAwMDAwMSA8PCAxNyAvLyBhbHNvIGFjdGl2ZVxuY29uc3QgV1JJVEVfRklOSVNISU5HICA9IDBiMTAwMDAwMDAwIDw8IDE3XG5cbmNvbnN0IFdSSVRFX05PVF9BQ1RJVkUgICAgPSBNQVggXiBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX05PVF9TWU5DICAgICAgPSBNQVggXiBXUklURV9TWU5DXG5jb25zdCBXUklURV9OT05fUFJJTUFSWSAgID0gTUFYIF4gV1JJVEVfUFJJTUFSWVxuY29uc3QgV1JJVEVfTk9UX0ZJTklTSElORyA9IE1BWCBeIFdSSVRFX0ZJTklTSElOR1xuY29uc3QgV1JJVEVfRFJBSU5FRCAgICAgICA9IE1BWCBeIFdSSVRFX1VORFJBSU5FRFxuY29uc3QgV1JJVEVfTk9UX1FVRVVFRCAgICA9IE1BWCBeIFdSSVRFX1FVRVVFRFxuY29uc3QgV1JJVEVfTk9UX05FWFRfVElDSyA9IE1BWCBeIFdSSVRFX05FWFRfVElDS1xuXG4vLyBDb21iaW5lZCBzaGFyZWQgc3RhdGVcbmNvbnN0IEFDVElWRSA9IFJFQURfQUNUSVZFIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBOT1RfQUNUSVZFID0gTUFYIF4gQUNUSVZFXG5jb25zdCBET05FID0gUkVBRF9ET05FIHwgV1JJVEVfRE9ORVxuY29uc3QgREVTVFJPWV9TVEFUVVMgPSBERVNUUk9ZSU5HIHwgREVTVFJPWUVEIHwgUFJFREVTVFJPWUlOR1xuY29uc3QgT1BFTl9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IE9QRU5JTkdcbmNvbnN0IEFVVE9fREVTVFJPWSA9IERFU1RST1lfU1RBVFVTIHwgRE9ORVxuY29uc3QgTk9OX1BSSU1BUlkgPSBXUklURV9OT05fUFJJTUFSWSAmIFJFQURfTk9OX1BSSU1BUllcbmNvbnN0IEFDVElWRV9PUl9USUNLSU5HID0gV1JJVEVfTkVYVF9USUNLIHwgUkVBRF9ORVhUX1RJQ0tcbmNvbnN0IFRJQ0tJTkcgPSBBQ1RJVkVfT1JfVElDS0lORyAmIE5PVF9BQ1RJVkVcbmNvbnN0IElTX09QRU5JTkcgPSBPUEVOX1NUQVRVUyB8IFRJQ0tJTkdcblxuLy8gQ29tYmluZWQgc2hhcmVkIHN0YXRlIGFuZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX1BSSU1BUllfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORVxuY29uc3QgUkVBRF9TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRE9ORSB8IFJFQURfUVVFVUVEXG5jb25zdCBSRUFEX0VORElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9RVUVVRURcbmNvbnN0IFJFQURfUkVBREFCTEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRCB8IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuY29uc3QgU0hPVUxEX05PVF9SRUFEID0gT1BFTl9TVEFUVVMgfCBSRUFEX0FDVElWRSB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FIHwgUkVBRF9ORUVEU19QVVNIXG5jb25zdCBSRUFEX0JBQ0tQUkVTU1VSRV9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FXG5cbi8vIENvbWJpbmVkIHdyaXRlIHN0YXRlXG5jb25zdCBXUklURV9QUklNQVJZX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORUQgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBXUklURV9EUkFJTl9TVEFUVVMgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORUQgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX0FDVElWRVxuY29uc3QgV1JJVEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBXUklURV9BQ1RJVkUgfCBXUklURV9RVUVVRURcbmNvbnN0IFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSA9IFdSSVRFX1BSSU1BUlkgfCBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX0FDVElWRV9BTkRfU1lOQyA9IFdSSVRFX0FDVElWRSB8IFdSSVRFX1NZTkNcbmNvbnN0IFdSSVRFX0ZJTklTSElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfQkFDS1BSRVNTVVJFX1NUQVRVUyA9IFdSSVRFX1VORFJBSU5FRCB8IERFU1RST1lfU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuXG5jb25zdCBhc3luY0l0ZXJhdG9yID0gU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgU3ltYm9sKCdhc3luY0l0ZXJhdG9yJylcblxuY2xhc3MgV3JpdGFibGVTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0sIHsgaGlnaFdhdGVyTWFyayA9IDE2Mzg0LCBtYXAgPSBudWxsLCBtYXBXcml0YWJsZSwgYnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aFdyaXRhYmxlIH0gPSB7fSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBGSUZPKClcbiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrXG4gICAgdGhpcy5idWZmZXJlZCA9IDBcbiAgICB0aGlzLmVycm9yID0gbnVsbFxuICAgIHRoaXMucGlwZWxpbmUgPSBudWxsXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFdyaXRhYmxlIHx8IGJ5dGVMZW5ndGggfHwgZGVmYXVsdEJ5dGVMZW5ndGhcbiAgICB0aGlzLm1hcCA9IG1hcFdyaXRhYmxlIHx8IG1hcFxuICAgIHRoaXMuYWZ0ZXJXcml0ZSA9IGFmdGVyV3JpdGUuYmluZCh0aGlzKVxuICAgIHRoaXMuYWZ0ZXJVcGRhdGVOZXh0VGljayA9IHVwZGF0ZVdyaXRlTlQuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IGVuZGVkICgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0RPTkUpICE9PSAwXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSBkYXRhID0gdGhpcy5tYXAoZGF0YSlcblxuICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG5cbiAgICBpZiAodGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFyaykge1xuICAgICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX1FVRVVFRFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORURcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5xdWV1ZS5zaGlmdCgpXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHRoaXMuYnVmZmVyZWQgLT0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgaWYgKHRoaXMuYnVmZmVyZWQgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX1FVRVVFRFxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGVuZCAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5zdHJlYW0ub25jZSgnZmluaXNoJywgZGF0YSlcbiAgICBlbHNlIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCkgdGhpcy5wdXNoKGRhdGEpXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlID0gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFdSSVRFX0ZJTklTSElORykgJiBXUklURV9OT05fUFJJTUFSWVxuICB9XG5cbiAgYXV0b0JhdGNoIChkYXRhLCBjYikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtdXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgd2hpbGUgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfU1RBVFVTKSA9PT0gV1JJVEVfUVVFVUVEX0FORF9BQ1RJVkUpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5zaGlmdCgpKVxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIE9QRU5fU1RBVFVTKSAhPT0gMCkgcmV0dXJuIGNiKG51bGwpXG4gICAgc3RyZWFtLl93cml0ZXYoYnVmZmVyLCBjYilcbiAgfVxuXG4gIHVwZGF0ZSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1NUQVRVUykgPT09IFdSSVRFX1FVRVVFRCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2hpZnQoKVxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9BQ1RJVkVfQU5EX1NZTkNcbiAgICAgIHN0cmVhbS5fd3JpdGUoZGF0YSwgdGhpcy5hZnRlcldyaXRlKVxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfU1lOQ1xuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRklOSVNISU5HX1NUQVRVUykgPT09IFdSSVRFX0ZJTklTSElORykge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgV1JJVEVfQUNUSVZFKSAmIFdSSVRFX05PVF9GSU5JU0hJTkdcbiAgICAgIHN0cmVhbS5fZmluYWwoYWZ0ZXJGaW5hbC5iaW5kKHRoaXMpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU5leHRUaWNrICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX05FWFRfVElDSykgIT09IDApIHJldHVyblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9ORVhUX1RJQ0tcbiAgICBxdWV1ZVRpY2sodGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrKVxuICB9XG59XG5cbmNsYXNzIFJlYWRhYmxlU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtLCB7IGhpZ2hXYXRlck1hcmsgPSAxNjM4NCwgbWFwID0gbnVsbCwgbWFwUmVhZGFibGUsIGJ5dGVMZW5ndGgsIGJ5dGVMZW5ndGhSZWFkYWJsZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbVxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFya1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVsaW5lID0gbnVsbFxuICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhSZWFkYWJsZSB8fCBieXRlTGVuZ3RoIHx8IGRlZmF1bHRCeXRlTGVuZ3RoXG4gICAgdGhpcy5tYXAgPSBtYXBSZWFkYWJsZSB8fCBtYXBcbiAgICB0aGlzLnBpcGVUbyA9IG51bGxcbiAgICB0aGlzLmFmdGVyUmVhZCA9IGFmdGVyUmVhZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrID0gdXBkYXRlUmVhZE5ULmJpbmQodGhpcylcbiAgfVxuXG4gIGdldCBlbmRlZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpICE9PSAwXG4gIH1cblxuICBwaXBlIChwaXBlVG8sIGNiKSB7XG4gICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHBpcGUgdG8gb25lIGRlc3RpbmF0aW9uJylcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG51bGxcblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BJUEVfRFJBSU5FRFxuICAgIHRoaXMucGlwZVRvID0gcGlwZVRvXG4gICAgdGhpcy5waXBlbGluZSA9IG5ldyBQaXBlbGluZSh0aGlzLnN0cmVhbSwgcGlwZVRvLCBjYilcblxuICAgIGlmIChjYikgdGhpcy5zdHJlYW0ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcblxuICAgIGlmIChpc1N0cmVhbXgocGlwZVRvKSkge1xuICAgICAgcGlwZVRvLl93cml0YWJsZVN0YXRlLnBpcGVsaW5lID0gdGhpcy5waXBlbGluZVxuICAgICAgaWYgKGNiKSBwaXBlVG8ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcbiAgICAgIHBpcGVUby5vbignZmluaXNoJywgdGhpcy5waXBlbGluZS5maW5pc2hlZC5iaW5kKHRoaXMucGlwZWxpbmUpKSAvLyBUT0RPOiBqdXN0IGNhbGwgZmluaXNoZWQgZnJvbSBwaXBlVG8gaXRzZWxmXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9uZXJyb3IgPSB0aGlzLnBpcGVsaW5lLmRvbmUuYmluZCh0aGlzLnBpcGVsaW5lLCBwaXBlVG8pXG4gICAgICBjb25zdCBvbmNsb3NlID0gdGhpcy5waXBlbGluZS5kb25lLmJpbmQodGhpcy5waXBlbGluZSwgcGlwZVRvLCBudWxsKSAvLyBvbmNsb3NlIGhhcyBhIHdlaXJkIGJvb2wgYXJnXG4gICAgICBwaXBlVG8ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgICAgIHBpcGVUby5vbignY2xvc2UnLCBvbmNsb3NlKVxuICAgICAgcGlwZVRvLm9uKCdmaW5pc2gnLCB0aGlzLnBpcGVsaW5lLmZpbmlzaGVkLmJpbmQodGhpcy5waXBlbGluZSkpXG4gICAgfVxuXG4gICAgcGlwZVRvLm9uKCdkcmFpbicsIGFmdGVyRHJhaW4uYmluZCh0aGlzKSlcbiAgICB0aGlzLnN0cmVhbS5lbWl0KCdwaXBpbmcnLCBwaXBlVG8pXG4gICAgcGlwZVRvLmVtaXQoJ3BpcGUnLCB0aGlzLnN0cmVhbSlcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRU5ESU5HKSAmIFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRFxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSBkYXRhID0gdGhpcy5tYXAoZGF0YSlcbiAgICB0aGlzLmJ1ZmZlcmVkICs9IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgIHRoaXMucXVldWUucHVzaChkYXRhKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgUkVBRF9RVUVVRUQpICYgUkVBRF9QVVNIRURcblxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrXG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucXVldWUuc2hpZnQoKVxuXG4gICAgdGhpcy5idWZmZXJlZCAtPSB0aGlzLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICBpZiAodGhpcy5idWZmZXJlZCA9PT0gMCkgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9UX1FVRVVFRFxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICB1bnNoaWZ0IChkYXRhKSB7XG4gICAgbGV0IHRhaWxcbiAgICBjb25zdCBwZW5kaW5nID0gW11cblxuICAgIHdoaWxlICgodGFpbCA9IHRoaXMucXVldWUuc2hpZnQoKSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGVuZGluZy5wdXNoKHRhaWwpXG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKGRhdGEpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucXVldWUucHVzaChwZW5kaW5nW2ldKVxuICAgIH1cbiAgfVxuXG4gIHJlYWQgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBkcmFpbiAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfU1RBVFVTKSA9PT0gUkVBRF9RVUVVRUQgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0ZMT1dJTkcpICE9PSAwKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgdGhpcy5kcmFpbigpXG5cbiAgICB3aGlsZSAodGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFyayAmJiAoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFNIT1VMRF9OT1RfUkVBRCkgPT09IDApIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9BQ1RJVkVfQU5EX1NZTkNfQU5EX05FRURTX1BVU0hcbiAgICAgIHN0cmVhbS5fcmVhZCh0aGlzLmFmdGVyUmVhZClcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfU1lOQ1xuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9BQ1RJVkUpID09PSAwKSB0aGlzLmRyYWluKClcbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1JFQURBQkxFX1NUQVRVUykgPT09IFJFQURfRU1JVF9SRUFEQUJMRV9BTkRfUVVFVUVEKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuICAgICAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJylcbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTkRJTkdfU1RBVFVTKSA9PT0gUkVBRF9FTkRJTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRE9ORSkgJiBSRUFEX05PVF9FTkRJTkdcbiAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZSU5HXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwpIHRoaXMucGlwZVRvLmVuZCgpXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU5leHRUaWNrICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfTkVYVF9USUNLKSAhPT0gMCkgcmV0dXJuXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfTkVYVF9USUNLXG4gICAgcXVldWVUaWNrKHRoaXMuYWZ0ZXJVcGRhdGVOZXh0VGljaylcbiAgfVxufVxuXG5jbGFzcyBUcmFuc2Zvcm1TdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0pIHtcbiAgICB0aGlzLmRhdGEgPSBudWxsXG4gICAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGFmdGVyVHJhbnNmb3JtLmJpbmQoc3RyZWFtKVxuICAgIHRoaXMuYWZ0ZXJGaW5hbCA9IG51bGxcbiAgfVxufVxuXG5jbGFzcyBQaXBlbGluZSB7XG4gIGNvbnN0cnVjdG9yIChzcmMsIGRzdCwgY2IpIHtcbiAgICB0aGlzLmZyb20gPSBzcmNcbiAgICB0aGlzLnRvID0gZHN0XG4gICAgdGhpcy5hZnRlclBpcGUgPSBjYlxuICAgIHRoaXMuZXJyb3IgPSBudWxsXG4gICAgdGhpcy5waXBlVG9GaW5pc2hlZCA9IGZhbHNlXG4gIH1cblxuICBmaW5pc2hlZCAoKSB7XG4gICAgdGhpcy5waXBlVG9GaW5pc2hlZCA9IHRydWVcbiAgfVxuXG4gIGRvbmUgKHN0cmVhbSwgZXJyKSB7XG4gICAgaWYgKGVycikgdGhpcy5lcnJvciA9IGVyclxuXG4gICAgaWYgKHN0cmVhbSA9PT0gdGhpcy50bykge1xuICAgICAgdGhpcy50byA9IG51bGxcblxuICAgICAgaWYgKHRoaXMuZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKHRoaXMuZnJvbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwIHx8ICF0aGlzLnBpcGVUb0ZpbmlzaGVkKSB7XG4gICAgICAgICAgdGhpcy5mcm9tLmRlc3Ryb3kodGhpcy5lcnJvciB8fCBuZXcgRXJyb3IoJ1dyaXRhYmxlIHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHknKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RyZWFtID09PSB0aGlzLmZyb20pIHtcbiAgICAgIHRoaXMuZnJvbSA9IG51bGxcblxuICAgICAgaWYgKHRoaXMudG8gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9ET05FKSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMudG8uZGVzdHJveSh0aGlzLmVycm9yIHx8IG5ldyBFcnJvcignUmVhZGFibGUgc3RyZWFtIGNsb3NlZCBiZWZvcmUgZW5kaW5nJykpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWZ0ZXJQaXBlICE9PSBudWxsKSB0aGlzLmFmdGVyUGlwZSh0aGlzLmVycm9yKVxuICAgIHRoaXMudG8gPSB0aGlzLmZyb20gPSB0aGlzLmFmdGVyUGlwZSA9IG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlckRyYWluICgpIHtcbiAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfUElQRV9EUkFJTkVEXG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9BQ1RJVkVfQU5EX1NZTkMpID09PSAwKSB0aGlzLnVwZGF0ZU5leHRUaWNrKClcbiAgZWxzZSB0aGlzLmRyYWluKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJGaW5hbCAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG4gIGlmIChlcnIpIHN0cmVhbS5kZXN0cm95KGVycilcbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSAwKSB7XG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9ET05FXG4gICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpXG4gIH1cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUlOR1xuICB9XG5cbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfQUNUSVZFXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJEZXN0cm95IChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoIWVyciAmJiB0aGlzLmVycm9yICE9PSBTVFJFQU1fREVTVFJPWUVEKSBlcnIgPSB0aGlzLmVycm9yXG4gIGlmIChlcnIpIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZRURcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcblxuICBjb25zdCBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuXG4gIGlmIChycyAhPT0gbnVsbCAmJiBycy5waXBlbGluZSAhPT0gbnVsbCkgcnMucGlwZWxpbmUuZG9uZShzdHJlYW0sIGVycilcbiAgaWYgKHdzICE9PSBudWxsICYmIHdzLnBpcGVsaW5lICE9PSBudWxsKSB3cy5waXBlbGluZS5kb25lKHN0cmVhbSwgZXJyKVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0FDVElWRVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0RSQUlOX1NUQVRVUykgPT09IFdSSVRFX1VORFJBSU5FRCkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfRFJBSU5FRFxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0VNSVRfRFJBSU4pID09PSBXUklURV9FTUlUX0RSQUlOKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKVxuICAgIH1cbiAgfVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1NZTkMpID09PSAwKSB0aGlzLnVwZGF0ZSgpXG59XG5cbmZ1bmN0aW9uIGFmdGVyUmVhZCAoZXJyKSB7XG4gIGlmIChlcnIpIHRoaXMuc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfQUNUSVZFXG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9TWU5DKSA9PT0gMCkgdGhpcy51cGRhdGUoKVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWFkTlQgKCkge1xuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfTkVYVF9USUNLXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gdXBkYXRlV3JpdGVOVCAoKSB7XG4gIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfTkVYVF9USUNLXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJPcGVuIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG5cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUlORykgPT09IDApIHtcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfU1RBVFVTKSA9PT0gMCkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BSSU1BUllcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9QUklNQVJZX1NUQVRVUykgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUFJJTUFSWVxuICAgIHN0cmVhbS5lbWl0KCdvcGVuJylcbiAgfVxuXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gTk9UX0FDVElWRVxuXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUudXBkYXRlKClcbiAgfVxuXG4gIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUudXBkYXRlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybSAoZXJyLCBkYXRhKSB7XG4gIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCkgdGhpcy5wdXNoKGRhdGEpXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuYWZ0ZXJXcml0ZShlcnIpXG59XG5cbmNsYXNzIFN0cmVhbSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgPSAwXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG51bGxcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbnVsbFxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLm9wZW4pIHRoaXMuX29wZW4gPSBvcHRzLm9wZW5cbiAgICAgIGlmIChvcHRzLmRlc3Ryb3kpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRzLmRlc3Ryb3lcbiAgICAgIGlmIChvcHRzLnByZWRlc3Ryb3kpIHRoaXMuX3ByZWRlc3Ryb3kgPSBvcHRzLnByZWRlc3Ryb3lcbiAgICAgIGlmIChvcHRzLnNpZ25hbCkge1xuICAgICAgICBvcHRzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0LmJpbmQodGhpcykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX29wZW4gKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgLy8gZG9lcyBub3RoaW5nXG4gIH1cblxuICBnZXQgcmVhZGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IHdyaXRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCA/IHRydWUgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZRUQpICE9PSAwXG4gIH1cblxuICBnZXQgZGVzdHJveWluZyAoKSB7XG4gICAgcmV0dXJuICh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgaWYgKCh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgICAgaWYgKCFlcnIpIGVyciA9IFNUUkVBTV9ERVNUUk9ZRURcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlID0gKHRoaXMuX2R1cGxleFN0YXRlIHwgREVTVFJPWUlORykgJiBOT05fUFJJTUFSWVxuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvciA9IGVyclxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3IgPSBlcnJcblxuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUFJFREVTVFJPWUlOR1xuICAgICAgdGhpcy5fcHJlZGVzdHJveSgpXG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSAmPSBOT1RfUFJFREVTVFJPWUlOR1xuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgfVxuICB9XG5cbiAgb24gKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChuYW1lID09PSAnZGF0YScpIHtcbiAgICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gKFJFQURfRU1JVF9EQVRBIHwgUkVBRF9SRVNVTUVEKVxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVF9SRUFEQUJMRVxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdkcmFpbicpIHtcbiAgICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfRU1JVF9EUkFJTlxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgZm4pXG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgV1JJVEVfRE9ORVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZSh0aGlzLCBvcHRzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnJlYWQpIHRoaXMuX3JlYWQgPSBvcHRzLnJlYWRcbiAgICAgIGlmIChvcHRzLmVhZ2VyT3BlbikgdGhpcy5yZXN1bWUoKS5wYXVzZSgpXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHBpcGUgKGRlc3QsIGNiKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5waXBlKGRlc3QsIGNiKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHJldHVybiBkZXN0XG4gIH1cblxuICByZWFkICgpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkKClcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICB1bnNoaWZ0IChkYXRhKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUudW5zaGlmdChkYXRhKVxuICB9XG5cbiAgcmVzdW1lICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1JFU1VNRURcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcGF1c2UgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IFJFQURfUEFVU0VEXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUFzeW5jSXRlcmF0b3IgKGl0ZSwgb3B0cykge1xuICAgIGxldCBkZXN0cm95XG5cbiAgICBjb25zdCBycyA9IG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgaXRlLm5leHQoKS50aGVuKHB1c2gpLnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9LFxuICAgICAgcHJlZGVzdHJveSAoKSB7XG4gICAgICAgIGRlc3Ryb3kgPSBpdGUucmV0dXJuKClcbiAgICAgIH0sXG4gICAgICBkZXN0cm95IChjYikge1xuICAgICAgICBpZiAoIWRlc3Ryb3kpIHJldHVybiBjYihudWxsKVxuICAgICAgICBkZXN0cm95LnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiByc1xuXG4gICAgZnVuY3Rpb24gcHVzaCAoZGF0YSkge1xuICAgICAgaWYgKGRhdGEuZG9uZSkgcnMucHVzaChudWxsKVxuICAgICAgZWxzZSBycy5wdXNoKGRhdGEudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb20gKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoaXNSZWFkU3RyZWFteChkYXRhKSkgcmV0dXJuIGRhdGFcbiAgICBpZiAoZGF0YVthc3luY0l0ZXJhdG9yXSkgcmV0dXJuIHRoaXMuX2Zyb21Bc3luY0l0ZXJhdG9yKGRhdGFbYXN5bmNJdGVyYXRvcl0oKSwgb3B0cylcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIGRhdGEgPSBkYXRhID09PSB1bmRlZmluZWQgPyBbXSA6IFtkYXRhXVxuXG4gICAgbGV0IGkgPSAwXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgdGhpcy5wdXNoKGkgPT09IGRhdGEubGVuZ3RoID8gbnVsbCA6IGRhdGFbaSsrXSlcbiAgICAgICAgY2IobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAocnMpIHtcbiAgICByZXR1cm4gKHJzLl9kdXBsZXhTdGF0ZSAmIFJFQURfQkFDS1BSRVNTVVJFX1NUQVRVUykgIT09IDAgfHwgcnMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gcnMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgc3RhdGljIGlzUGF1c2VkIChycykge1xuICAgIHJldHVybiAocnMuX2R1cGxleFN0YXRlICYgUkVBRF9SRVNVTUVEKSA9PT0gMFxuICB9XG5cbiAgW2FzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG5cbiAgICBsZXQgZXJyb3IgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZXNvbHZlID0gbnVsbFxuICAgIGxldCBwcm9taXNlUmVqZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7IGVycm9yID0gZXJyIH0pXG4gICAgdGhpcy5vbigncmVhZGFibGUnLCBvbnJlYWRhYmxlKVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIG5leHQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3RcbiAgICAgICAgICBjb25zdCBkYXRhID0gc3RyZWFtLnJlYWQoKVxuICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsKSBvbmRhdGEoZGF0YSlcbiAgICAgICAgICBlbHNlIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lFRCkgIT09IDApIG9uZGF0YShudWxsKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHJldHVybiAoKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KG51bGwpXG4gICAgICB9LFxuICAgICAgdGhyb3cgKGVycikge1xuICAgICAgICByZXR1cm4gZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25yZWFkYWJsZSAoKSB7XG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUgIT09IG51bGwpIG9uZGF0YShzdHJlYW0ucmVhZCgpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHByb21pc2VSZXNvbHZlICE9PSBudWxsKSBvbmRhdGEobnVsbClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmRhdGEgKGRhdGEpIHtcbiAgICAgIGlmIChwcm9taXNlUmVqZWN0ID09PSBudWxsKSByZXR1cm5cbiAgICAgIGlmIChlcnJvcikgcHJvbWlzZVJlamVjdChlcnJvcilcbiAgICAgIGVsc2UgaWYgKGRhdGEgPT09IG51bGwgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSBwcm9taXNlUmVqZWN0KFNUUkVBTV9ERVNUUk9ZRUQpXG4gICAgICBlbHNlIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IGRhdGEsIGRvbmU6IGRhdGEgPT09IG51bGwgfSlcbiAgICAgIHByb21pc2VSZWplY3QgPSBwcm9taXNlUmVzb2x2ZSA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUVEKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpXG4gICAgICAgICAgZWxzZSByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgV3JpdGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgUkVBRF9ET05FXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgIH1cbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHN0YXRpYyBpc0JhY2twcmVzc3VyZWQgKHdzKSB7XG4gICAgcmV0dXJuICh3cy5fZHVwbGV4U3RhdGUgJiBXUklURV9CQUNLUFJFU1NVUkVfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgd3JpdGUgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZChkYXRhKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuY2xhc3MgRHVwbGV4IGV4dGVuZHMgUmVhZGFibGUgeyAvLyBhbmQgV3JpdGFibGVcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgPSBPUEVOSU5HXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgIH1cbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnRyYW5zZm9ybSkgdGhpcy5fdHJhbnNmb3JtID0gb3B0cy50cmFuc2Zvcm1cbiAgICAgIGlmIChvcHRzLmZsdXNoKSB0aGlzLl9mbHVzaCA9IG9wdHMuZmx1c2hcbiAgICB9XG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm0oZGF0YSwgdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJUcmFuc2Zvcm0pXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhXG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gbnVsbFxuICAgICAgY2IobnVsbClcbiAgICAgIHRoaXMuX3RyYW5zZm9ybShkYXRhLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlclRyYW5zZm9ybSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2IobnVsbClcbiAgICB9XG4gIH1cblxuICBfdHJhbnNmb3JtIChkYXRhLCBjYikge1xuICAgIGNiKG51bGwsIGRhdGEpXG4gIH1cblxuICBfZmx1c2ggKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlckZpbmFsID0gY2JcbiAgICB0aGlzLl9mbHVzaCh0cmFuc2Zvcm1BZnRlckZsdXNoLmJpbmQodGhpcykpXG4gIH1cbn1cblxuY2xhc3MgUGFzc1Rocm91Z2ggZXh0ZW5kcyBUcmFuc2Zvcm0ge31cblxuZnVuY3Rpb24gdHJhbnNmb3JtQWZ0ZXJGbHVzaCAoZXJyLCBkYXRhKSB7XG4gIGNvbnN0IGNiID0gdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJGaW5hbFxuICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMucHVzaChkYXRhKVxuICB0aGlzLnB1c2gobnVsbClcbiAgY2IobnVsbClcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmVQcm9taXNlICguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmV0dXJuIHBpcGVsaW5lKC4uLnN0cmVhbXMsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKHN0cmVhbSwgLi4uc3RyZWFtcykge1xuICBjb25zdCBhbGwgPSBBcnJheS5pc0FycmF5KHN0cmVhbSkgPyBbLi4uc3RyZWFtLCAuLi5zdHJlYW1zXSA6IFtzdHJlYW0sIC4uLnN0cmVhbXNdXG4gIGNvbnN0IGRvbmUgPSAoYWxsLmxlbmd0aCAmJiB0eXBlb2YgYWxsW2FsbC5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgPyBhbGwucG9wKCkgOiBudWxsXG5cbiAgaWYgKGFsbC5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ1BpcGVsaW5lIHJlcXVpcmVzIGF0IGxlYXN0IDIgc3RyZWFtcycpXG5cbiAgbGV0IHNyYyA9IGFsbFswXVxuICBsZXQgZGVzdCA9IG51bGxcbiAgbGV0IGVycm9yID0gbnVsbFxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVzdCA9IGFsbFtpXVxuXG4gICAgaWYgKGlzU3RyZWFteChzcmMpKSB7XG4gICAgICBzcmMucGlwZShkZXN0LCBvbmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvckhhbmRsZShzcmMsIHRydWUsIGkgPiAxLCBvbmVycm9yKVxuICAgICAgc3JjLnBpcGUoZGVzdClcbiAgICB9XG5cbiAgICBzcmMgPSBkZXN0XG4gIH1cblxuICBpZiAoZG9uZSkge1xuICAgIGxldCBmaW4gPSBmYWxzZVxuXG4gICAgZGVzdC5vbignZmluaXNoJywgKCkgPT4geyBmaW4gPSB0cnVlIH0pXG4gICAgZGVzdC5vbignZXJyb3InLCBlcnIgPT4geyBlcnJvciA9IGVycm9yIHx8IGVyciB9KVxuICAgIGRlc3Qub24oJ2Nsb3NlJywgKCkgPT4gZG9uZShlcnJvciB8fCAoZmluID8gbnVsbCA6IFBSRU1BVFVSRV9DTE9TRSkpKVxuICB9XG5cbiAgcmV0dXJuIGRlc3RcblxuICBmdW5jdGlvbiBlcnJvckhhbmRsZSAocywgcmQsIHdyLCBvbmVycm9yKSB7XG4gICAgcy5vbignZXJyb3InLCBvbmVycm9yKVxuICAgIHMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHJkICYmIHMuX3JlYWRhYmxlU3RhdGUgJiYgIXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHJldHVybiBvbmVycm9yKFBSRU1BVFVSRV9DTE9TRSlcbiAgICAgIGlmICh3ciAmJiBzLl93cml0YWJsZVN0YXRlICYmICFzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm4gb25lcnJvcihQUkVNQVRVUkVfQ0xPU0UpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lcnJvciAoZXJyKSB7XG4gICAgaWYgKCFlcnIgfHwgZXJyb3IpIHJldHVyblxuICAgIGVycm9yID0gZXJyXG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgYWxsKSB7XG4gICAgICBzLmRlc3Ryb3koZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0cmVhbSAoc3RyZWFtKSB7XG4gIHJldHVybiAhIXN0cmVhbS5fcmVhZGFibGVTdGF0ZSB8fCAhIXN0cmVhbS5fd3JpdGFibGVTdGF0ZVxufVxuXG5mdW5jdGlvbiBpc1N0cmVhbXggKHN0cmVhbSkge1xuICByZXR1cm4gdHlwZW9mIHN0cmVhbS5fZHVwbGV4U3RhdGUgPT09ICdudW1iZXInICYmIGlzU3RyZWFtKHN0cmVhbSlcbn1cblxuZnVuY3Rpb24gZ2V0U3RyZWFtRXJyb3IgKHN0cmVhbSkge1xuICByZXR1cm4gKHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3IpIHx8IChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgJiYgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yKVxufVxuXG5mdW5jdGlvbiBpc1JlYWRTdHJlYW14IChzdHJlYW0pIHtcbiAgcmV0dXJuIGlzU3RyZWFteChzdHJlYW0pICYmIHN0cmVhbS5yZWFkYWJsZVxufVxuXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkgKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhLmJ5dGVMZW5ndGggPT09ICdudW1iZXInXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRCeXRlTGVuZ3RoIChkYXRhKSB7XG4gIHJldHVybiBpc1R5cGVkQXJyYXkoZGF0YSkgPyBkYXRhLmJ5dGVMZW5ndGggOiAxMDI0XG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gYWJvcnQgKCkge1xuICB0aGlzLmRlc3Ryb3kobmV3IEVycm9yKCdTdHJlYW0gYWJvcnRlZC4nKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBpcGVsaW5lLFxuICBwaXBlbGluZVByb21pc2UsXG4gIGlzU3RyZWFtLFxuICBpc1N0cmVhbXgsXG4gIGdldFN0cmVhbUVycm9yLFxuICBTdHJlYW0sXG4gIFdyaXRhYmxlLFxuICBSZWFkYWJsZSxcbiAgRHVwbGV4LFxuICBUcmFuc2Zvcm0sXG4gIC8vIEV4cG9ydCBQYXNzVGhyb3VnaCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE5vZGUuanMgY29yZSdzIHN0cmVhbSBtb2R1bGVcbiAgUGFzc1Rocm91Z2hcbn1cbiIsImZ1bmN0aW9uIGlzQnVmZmVyICh2YWx1ZSkge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbn1cblxuZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZVNsb3cgKHNpemUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3coc2l6ZSlcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUoYSwgYilcbn1cblxuZnVuY3Rpb24gY29uY2F0IChidWZmZXJzLCB0b3RhbExlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzLCB0b3RhbExlbmd0aClcbn1cblxuZnVuY3Rpb24gY29weSAoc291cmNlLCB0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0b0J1ZmZlcihzb3VyY2UpLmNvcHkodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gZXF1YWxzIChhLCBiKSB7XG4gIHJldHVybiB0b0J1ZmZlcihhKS5lcXVhbHMoYilcbn1cblxuZnVuY3Rpb24gZmlsbCAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBlbmQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmZpbGwodmFsdWUsIG9mZnNldCwgZW5kLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXMgKGJ1ZmZlciwgdmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmluY2x1ZGVzKHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gaW5kZXhPZiAoYnVmZmVyLCB2YWx1ZSwgYnlmZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuaW5kZXhPZih2YWx1ZSwgYnlmZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGxhc3RJbmRleE9mIChidWZmZXIsIHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5sYXN0SW5kZXhPZih2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIHN3YXAxNiAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXAxNigpXG59XG5cbmZ1bmN0aW9uIHN3YXAzMiAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXAzMigpXG59XG5cbmZ1bmN0aW9uIHN3YXA2NCAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXA2NCgpXG59XG5cbmZ1bmN0aW9uIHRvQnVmZmVyIChidWZmZXIpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpKSByZXR1cm4gYnVmZmVyXG4gIHJldHVybiBCdWZmZXIuZnJvbShidWZmZXIuYnVmZmVyLCBidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nIChidWZmZXIsIGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnRvU3RyaW5nKGVuY29kaW5nLCBzdGFydCwgZW5kKVxufVxuXG5mdW5jdGlvbiB3cml0ZSAoYnVmZmVyLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZShzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlRG91YmxlTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdExFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVGbG9hdExFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlSW50MzJMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkRG91YmxlTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWREb3VibGVMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdExFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkRmxvYXRMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRVSW50MzJMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZFVJbnQzMkxFKG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZEludDMyTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRJbnQzMkxFKG9mZnNldClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQnVmZmVyLFxuICBpc0VuY29kaW5nLFxuICBhbGxvYyxcbiAgYWxsb2NVbnNhZmUsXG4gIGFsbG9jVW5zYWZlU2xvdyxcbiAgYnl0ZUxlbmd0aCxcbiAgY29tcGFyZSxcbiAgY29uY2F0LFxuICBjb3B5LFxuICBlcXVhbHMsXG4gIGZpbGwsXG4gIGZyb20sXG4gIGluY2x1ZGVzLFxuICBpbmRleE9mLFxuICBsYXN0SW5kZXhPZixcbiAgc3dhcDE2LFxuICBzd2FwMzIsXG4gIHN3YXA2NCxcbiAgdG9CdWZmZXIsXG4gIHRvU3RyaW5nLFxuICB3cml0ZSxcbiAgd3JpdGVEb3VibGVMRSxcbiAgd3JpdGVGbG9hdExFLFxuICB3cml0ZVVJbnQzMkxFLFxuICB3cml0ZUludDMyTEUsXG4gIHJlYWREb3VibGVMRSxcbiAgcmVhZEZsb2F0TEUsXG4gIHJlYWRVSW50MzJMRSxcbiAgcmVhZEludDMyTEVcbn1cbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbmNvbnN0IFpFUk9TID0gJzAwMDAwMDAwMDAwMDAwMDAwMDAnXG5jb25zdCBTRVZFTlMgPSAnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3NydcbmNvbnN0IFpFUk9fT0ZGU0VUID0gJzAnLmNoYXJDb2RlQXQoMClcbmNvbnN0IFVTVEFSX01BR0lDID0gYjRhLmZyb20oJ3VzdGFyXFx4MDAnLCAnYmluYXJ5JylcbmNvbnN0IFVTVEFSX1ZFUiA9IGI0YS5mcm9tKCcwMCcsICdiaW5hcnknKVxuY29uc3QgR05VX01BR0lDID0gYjRhLmZyb20oJ3VzdGFyXFx4MjAnLCAnYmluYXJ5JylcbmNvbnN0IEdOVV9WRVIgPSBiNGEuZnJvbSgnXFx4MjBcXHgwMCcsICdiaW5hcnknKVxuY29uc3QgTUFTSyA9IDBvNzc3N1xuY29uc3QgTUFHSUNfT0ZGU0VUID0gMjU3XG5jb25zdCBWRVJTSU9OX09GRlNFVCA9IDI2M1xuXG5jb25zdCBjbGFtcCA9IGZ1bmN0aW9uIChpbmRleCwgbGVuLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgaW5kZXggPSB+fmluZGV4IC8vIENvZXJjZSB0byBpbnRlZ2VyLlxuICBpZiAoaW5kZXggPj0gbGVuKSByZXR1cm4gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgaW5kZXggKz0gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgcmV0dXJuIDBcbn1cblxuY29uc3QgdG9UeXBlID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdmaWxlJ1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAnbGluaydcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gJ3N5bWxpbmsnXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuICdjaGFyYWN0ZXItZGV2aWNlJ1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiAnZGlyZWN0b3J5J1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiAnZmlmbydcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gJ2NvbnRpZ3VvdXMtZmlsZSdcbiAgICBjYXNlIDcyOlxuICAgICAgcmV0dXJuICdwYXgtaGVhZGVyJ1xuICAgIGNhc2UgNTU6XG4gICAgICByZXR1cm4gJ3BheC1nbG9iYWwtaGVhZGVyJ1xuICAgIGNhc2UgMjc6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLWxpbmstcGF0aCdcbiAgICBjYXNlIDI4OlxuICAgIGNhc2UgMzA6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLXBhdGgnXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCB0b1R5cGVmbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAnZmlsZSc6XG4gICAgICByZXR1cm4gMFxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgcmV0dXJuIDFcbiAgICBjYXNlICdzeW1saW5rJzpcbiAgICAgIHJldHVybiAyXG4gICAgY2FzZSAnY2hhcmFjdGVyLWRldmljZSc6XG4gICAgICByZXR1cm4gM1xuICAgIGNhc2UgJ2Jsb2NrLWRldmljZSc6XG4gICAgICByZXR1cm4gNFxuICAgIGNhc2UgJ2RpcmVjdG9yeSc6XG4gICAgICByZXR1cm4gNVxuICAgIGNhc2UgJ2ZpZm8nOlxuICAgICAgcmV0dXJuIDZcbiAgICBjYXNlICdjb250aWd1b3VzLWZpbGUnOlxuICAgICAgcmV0dXJuIDdcbiAgICBjYXNlICdwYXgtaGVhZGVyJzpcbiAgICAgIHJldHVybiA3MlxuICB9XG5cbiAgcmV0dXJuIDBcbn1cblxuY29uc3QgaW5kZXhPZiA9IGZ1bmN0aW9uIChibG9jaywgbnVtLCBvZmZzZXQsIGVuZCkge1xuICBmb3IgKDsgb2Zmc2V0IDwgZW5kOyBvZmZzZXQrKykge1xuICAgIGlmIChibG9ja1tvZmZzZXRdID09PSBudW0pIHJldHVybiBvZmZzZXRcbiAgfVxuICByZXR1cm4gZW5kXG59XG5cbmNvbnN0IGNrc3VtID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gIGxldCBzdW0gPSA4ICogMzJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDg7IGkrKykgc3VtICs9IGJsb2NrW2ldXG4gIGZvciAobGV0IGogPSAxNTY7IGogPCA1MTI7IGorKykgc3VtICs9IGJsb2NrW2pdXG4gIHJldHVybiBzdW1cbn1cblxuY29uc3QgZW5jb2RlT2N0ID0gZnVuY3Rpb24gKHZhbCwgbikge1xuICB2YWwgPSB2YWwudG9TdHJpbmcoOClcbiAgaWYgKHZhbC5sZW5ndGggPiBuKSByZXR1cm4gU0VWRU5TLnNsaWNlKDAsIG4pICsgJyAnXG4gIGVsc2UgcmV0dXJuIFpFUk9TLnNsaWNlKDAsIG4gLSB2YWwubGVuZ3RoKSArIHZhbCArICcgJ1xufVxuXG4vKiBDb3BpZWQgZnJvbSB0aGUgbm9kZS10YXIgcmVwbyBhbmQgbW9kaWZpZWQgdG8gbWVldFxuICogdGFyLXN0cmVhbSBjb2Rpbmcgc3RhbmRhcmQuXG4gKlxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL25vZGUtdGFyL2Jsb2IvNTFiNjYyN2ExZjM1N2QyZWI0MzNlNzM3OGU1ZjA1ZTgzYjdhYTZjZC9saWIvaGVhZGVyLmpzI0wzNDlcbiAqL1xuZnVuY3Rpb24gcGFyc2UyNTYgKGJ1Zikge1xuICAvLyBmaXJzdCBieXRlIE1VU1QgYmUgZWl0aGVyIDgwIG9yIEZGXG4gIC8vIDgwIGZvciBwb3NpdGl2ZSwgRkYgZm9yIDIncyBjb21wXG4gIGxldCBwb3NpdGl2ZVxuICBpZiAoYnVmWzBdID09PSAweDgwKSBwb3NpdGl2ZSA9IHRydWVcbiAgZWxzZSBpZiAoYnVmWzBdID09PSAweEZGKSBwb3NpdGl2ZSA9IGZhbHNlXG4gIGVsc2UgcmV0dXJuIG51bGxcblxuICAvLyBidWlsZCB1cCBhIGJhc2UtMjU2IHR1cGxlIGZyb20gdGhlIGxlYXN0IHNpZyB0byB0aGUgaGlnaGVzdFxuICBjb25zdCB0dXBsZSA9IFtdXG4gIGxldCBpXG4gIGZvciAoaSA9IGJ1Zi5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgYnl0ZSA9IGJ1ZltpXVxuICAgIGlmIChwb3NpdGl2ZSkgdHVwbGUucHVzaChieXRlKVxuICAgIGVsc2UgdHVwbGUucHVzaCgweEZGIC0gYnl0ZSlcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGNvbnN0IGwgPSB0dXBsZS5sZW5ndGhcbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHN1bSArPSB0dXBsZVtpXSAqIE1hdGgucG93KDI1NiwgaSlcbiAgfVxuXG4gIHJldHVybiBwb3NpdGl2ZSA/IHN1bSA6IC0xICogc3VtXG59XG5cbmNvbnN0IGRlY29kZU9jdCA9IGZ1bmN0aW9uICh2YWwsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHZhbCA9IHZhbC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aClcbiAgb2Zmc2V0ID0gMFxuXG4gIC8vIElmIHByZWZpeGVkIHdpdGggMHg4MCB0aGVuIHBhcnNlIGFzIGEgYmFzZS0yNTYgaW50ZWdlclxuICBpZiAodmFsW29mZnNldF0gJiAweDgwKSB7XG4gICAgcmV0dXJuIHBhcnNlMjU2KHZhbClcbiAgfSBlbHNlIHtcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiB0YXIgY2FuIHByZWZpeCB3aXRoIHNwYWNlc1xuICAgIHdoaWxlIChvZmZzZXQgPCB2YWwubGVuZ3RoICYmIHZhbFtvZmZzZXRdID09PSAzMikgb2Zmc2V0KytcbiAgICBjb25zdCBlbmQgPSBjbGFtcChpbmRleE9mKHZhbCwgMzIsIG9mZnNldCwgdmFsLmxlbmd0aCksIHZhbC5sZW5ndGgsIHZhbC5sZW5ndGgpXG4gICAgd2hpbGUgKG9mZnNldCA8IGVuZCAmJiB2YWxbb2Zmc2V0XSA9PT0gMCkgb2Zmc2V0KytcbiAgICBpZiAoZW5kID09PSBvZmZzZXQpIHJldHVybiAwXG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbC5zbGljZShvZmZzZXQsIGVuZCkudG9TdHJpbmcoKSwgOClcbiAgfVxufVxuXG5jb25zdCBkZWNvZGVTdHIgPSBmdW5jdGlvbiAodmFsLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHZhbC5zbGljZShvZmZzZXQsIGluZGV4T2YodmFsLCAwLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpLnRvU3RyaW5nKGVuY29kaW5nKVxufVxuXG5jb25zdCBhZGRMZW5ndGggPSBmdW5jdGlvbiAoc3RyKSB7XG4gIGNvbnN0IGxlbiA9IGI0YS5ieXRlTGVuZ3RoKHN0cilcbiAgbGV0IGRpZ2l0cyA9IE1hdGguZmxvb3IoTWF0aC5sb2cobGVuKSAvIE1hdGgubG9nKDEwKSkgKyAxXG4gIGlmIChsZW4gKyBkaWdpdHMgPj0gTWF0aC5wb3coMTAsIGRpZ2l0cykpIGRpZ2l0cysrXG5cbiAgcmV0dXJuIChsZW4gKyBkaWdpdHMpICsgc3RyXG59XG5cbmV4cG9ydHMuZGVjb2RlTG9uZ1BhdGggPSBmdW5jdGlvbiAoYnVmLCBlbmNvZGluZykge1xuICByZXR1cm4gZGVjb2RlU3RyKGJ1ZiwgMCwgYnVmLmxlbmd0aCwgZW5jb2RpbmcpXG59XG5cbmV4cG9ydHMuZW5jb2RlUGF4ID0gZnVuY3Rpb24gKG9wdHMpIHsgLy8gVE9ETzogZW5jb2RlIG1vcmUgc3R1ZmYgaW4gcGF4XG4gIGxldCByZXN1bHQgPSAnJ1xuICBpZiAob3B0cy5uYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgcGF0aD0nICsgb3B0cy5uYW1lICsgJ1xcbicpXG4gIGlmIChvcHRzLmxpbmtuYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgbGlua3BhdGg9JyArIG9wdHMubGlua25hbWUgKyAnXFxuJylcbiAgY29uc3QgcGF4ID0gb3B0cy5wYXhcbiAgaWYgKHBheCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHBheCkge1xuICAgICAgcmVzdWx0ICs9IGFkZExlbmd0aCgnICcgKyBrZXkgKyAnPScgKyBwYXhba2V5XSArICdcXG4nKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYjRhLmZyb20ocmVzdWx0KVxufVxuXG5leHBvcnRzLmRlY29kZVBheCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgY29uc3QgcmVzdWx0ID0ge31cblxuICB3aGlsZSAoYnVmLmxlbmd0aCkge1xuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChpIDwgYnVmLmxlbmd0aCAmJiBidWZbaV0gIT09IDMyKSBpKytcbiAgICBjb25zdCBsZW4gPSBwYXJzZUludChidWYuc2xpY2UoMCwgaSkudG9TdHJpbmcoKSwgMTApXG4gICAgaWYgKCFsZW4pIHJldHVybiByZXN1bHRcblxuICAgIGNvbnN0IGIgPSBidWYuc2xpY2UoaSArIDEsIGxlbiAtIDEpLnRvU3RyaW5nKClcbiAgICBjb25zdCBrZXlJbmRleCA9IGIuaW5kZXhPZignPScpXG4gICAgaWYgKGtleUluZGV4ID09PSAtMSkgcmV0dXJuIHJlc3VsdFxuICAgIHJlc3VsdFtiLnNsaWNlKDAsIGtleUluZGV4KV0gPSBiLnNsaWNlKGtleUluZGV4ICsgMSlcblxuICAgIGJ1ZiA9IGJ1Zi5zbGljZShsZW4pXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgY29uc3QgYnVmID0gYjRhLmFsbG9jKDUxMilcbiAgbGV0IG5hbWUgPSBvcHRzLm5hbWVcbiAgbGV0IHByZWZpeCA9ICcnXG5cbiAgaWYgKG9wdHMudHlwZWZsYWcgPT09IDUgJiYgbmFtZVtuYW1lLmxlbmd0aCAtIDFdICE9PSAnLycpIG5hbWUgKz0gJy8nXG4gIGlmIChiNGEuYnl0ZUxlbmd0aChuYW1lKSAhPT0gbmFtZS5sZW5ndGgpIHJldHVybiBudWxsIC8vIHV0Zi04XG5cbiAgd2hpbGUgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwKSB7XG4gICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZignLycpXG4gICAgaWYgKGkgPT09IC0xKSByZXR1cm4gbnVsbFxuICAgIHByZWZpeCArPSBwcmVmaXggPyAnLycgKyBuYW1lLnNsaWNlKDAsIGkpIDogbmFtZS5zbGljZSgwLCBpKVxuICAgIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKVxuICB9XG5cbiAgaWYgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwIHx8IGI0YS5ieXRlTGVuZ3RoKHByZWZpeCkgPiAxNTUpIHJldHVybiBudWxsXG4gIGlmIChvcHRzLmxpbmtuYW1lICYmIGI0YS5ieXRlTGVuZ3RoKG9wdHMubGlua25hbWUpID4gMTAwKSByZXR1cm4gbnVsbFxuXG4gIGI0YS53cml0ZShidWYsIG5hbWUpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLm1vZGUgJiBNQVNLLCA2KSwgMTAwKVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy51aWQsIDYpLCAxMDgpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLmdpZCwgNiksIDExNilcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuc2l6ZSwgMTEpLCAxMjQpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdCgob3B0cy5tdGltZS5nZXRUaW1lKCkgLyAxMDAwKSB8IDAsIDExKSwgMTM2KVxuXG4gIGJ1ZlsxNTZdID0gWkVST19PRkZTRVQgKyB0b1R5cGVmbGFnKG9wdHMudHlwZSlcblxuICBpZiAob3B0cy5saW5rbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5saW5rbmFtZSwgMTU3KVxuXG4gIGI0YS5jb3B5KFVTVEFSX01BR0lDLCBidWYsIE1BR0lDX09GRlNFVClcbiAgYjRhLmNvcHkoVVNUQVJfVkVSLCBidWYsIFZFUlNJT05fT0ZGU0VUKVxuICBpZiAob3B0cy51bmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy51bmFtZSwgMjY1KVxuICBpZiAob3B0cy5nbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5nbmFtZSwgMjk3KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtYWpvciB8fCAwLCA2KSwgMzI5KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtaW5vciB8fCAwLCA2KSwgMzM3KVxuXG4gIGlmIChwcmVmaXgpIGI0YS53cml0ZShidWYsIHByZWZpeCwgMzQ1KVxuXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChja3N1bShidWYpLCA2KSwgMTQ4KVxuXG4gIHJldHVybiBidWZcbn1cblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoYnVmLCBmaWxlbmFtZUVuY29kaW5nLCBhbGxvd1Vua25vd25Gb3JtYXQpIHtcbiAgbGV0IHR5cGVmbGFnID0gYnVmWzE1Nl0gPT09IDAgPyAwIDogYnVmWzE1Nl0gLSBaRVJPX09GRlNFVFxuXG4gIGxldCBuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMCwgMTAwLCBmaWxlbmFtZUVuY29kaW5nKVxuICBjb25zdCBtb2RlID0gZGVjb2RlT2N0KGJ1ZiwgMTAwLCA4KVxuICBjb25zdCB1aWQgPSBkZWNvZGVPY3QoYnVmLCAxMDgsIDgpXG4gIGNvbnN0IGdpZCA9IGRlY29kZU9jdChidWYsIDExNiwgOClcbiAgY29uc3Qgc2l6ZSA9IGRlY29kZU9jdChidWYsIDEyNCwgMTIpXG4gIGNvbnN0IG10aW1lID0gZGVjb2RlT2N0KGJ1ZiwgMTM2LCAxMilcbiAgY29uc3QgdHlwZSA9IHRvVHlwZSh0eXBlZmxhZylcbiAgY29uc3QgbGlua25hbWUgPSBidWZbMTU3XSA9PT0gMCA/IG51bGwgOiBkZWNvZGVTdHIoYnVmLCAxNTcsIDEwMCwgZmlsZW5hbWVFbmNvZGluZylcbiAgY29uc3QgdW5hbWUgPSBkZWNvZGVTdHIoYnVmLCAyNjUsIDMyKVxuICBjb25zdCBnbmFtZSA9IGRlY29kZVN0cihidWYsIDI5NywgMzIpXG4gIGNvbnN0IGRldm1ham9yID0gZGVjb2RlT2N0KGJ1ZiwgMzI5LCA4KVxuICBjb25zdCBkZXZtaW5vciA9IGRlY29kZU9jdChidWYsIDMzNywgOClcblxuICBjb25zdCBjID0gY2tzdW0oYnVmKVxuXG4gIC8vIGNoZWNrc3VtIGlzIHN0aWxsIGluaXRpYWwgdmFsdWUgaWYgaGVhZGVyIHdhcyBudWxsLlxuICBpZiAoYyA9PT0gOCAqIDMyKSByZXR1cm4gbnVsbFxuXG4gIC8vIHZhbGlkIGNoZWNrc3VtXG4gIGlmIChjICE9PSBkZWNvZGVPY3QoYnVmLCAxNDgsIDgpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFyIGhlYWRlci4gTWF5YmUgdGhlIHRhciBpcyBjb3JydXB0ZWQgb3IgaXQgbmVlZHMgdG8gYmUgZ3VuemlwcGVkPycpXG5cbiAgaWYgKFVTVEFSX01BR0lDLmNvbXBhcmUoYnVmLCBNQUdJQ19PRkZTRVQsIE1BR0lDX09GRlNFVCArIDYpID09PSAwKSB7XG4gICAgLy8gdXN0YXIgKHBvc2l4KSBmb3JtYXQuXG4gICAgLy8gcHJlcGVuZCBwcmVmaXgsIGlmIHByZXNlbnQuXG4gICAgaWYgKGJ1ZlszNDVdKSBuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMzQ1LCAxNTUsIGZpbGVuYW1lRW5jb2RpbmcpICsgJy8nICsgbmFtZVxuICB9IGVsc2UgaWYgKEdOVV9NQUdJQy5jb21wYXJlKGJ1ZiwgTUFHSUNfT0ZGU0VULCBNQUdJQ19PRkZTRVQgKyA2KSA9PT0gMCAmJlxuICAgICAgICAgICAgIEdOVV9WRVIuY29tcGFyZShidWYsIFZFUlNJT05fT0ZGU0VULCBWRVJTSU9OX09GRlNFVCArIDIpID09PSAwKSB7XG4gICAgLy8gJ2dudScvJ29sZGdudScgZm9ybWF0LiBTaW1pbGFyIHRvIHVzdGFyLCBidXQgaGFzIHN1cHBvcnQgZm9yIGluY3JlbWVudGFsIGFuZFxuICAgIC8vIG11bHRpLXZvbHVtZSB0YXJiYWxscy5cbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFsbG93VW5rbm93bkZvcm1hdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhciBoZWFkZXI6IHVua25vd24gZm9ybWF0LicpXG4gICAgfVxuICB9XG5cbiAgLy8gdG8gc3VwcG9ydCBvbGQgdGFyIHZlcnNpb25zIHRoYXQgdXNlIHRyYWlsaW5nIC8gdG8gaW5kaWNhdGUgZGlyc1xuICBpZiAodHlwZWZsYWcgPT09IDAgJiYgbmFtZSAmJiBuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcvJykgdHlwZWZsYWcgPSA1XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIG1vZGUsXG4gICAgdWlkLFxuICAgIGdpZCxcbiAgICBzaXplLFxuICAgIG10aW1lOiBuZXcgRGF0ZSgxMDAwICogbXRpbWUpLFxuICAgIHR5cGUsXG4gICAgbGlua25hbWUsXG4gICAgdW5hbWUsXG4gICAgZ25hbWUsXG4gICAgZGV2bWFqb3IsXG4gICAgZGV2bWlub3JcbiAgfVxufVxuIiwiY29uc3QgeyBjb25zdGFudHMgfSA9IHJlcXVpcmUoJ2ZzJylcbmNvbnN0IHsgUmVhZGFibGUsIFdyaXRhYmxlIH0gPSByZXF1aXJlKCdzdHJlYW14JylcbmNvbnN0IHsgU3RyaW5nRGVjb2RlciB9ID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKVxuY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcblxuY29uc3QgaGVhZGVycyA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5cbmNvbnN0IERNT0RFID0gMG83NTVcbmNvbnN0IEZNT0RFID0gMG82NDRcblxuY29uc3QgRU5EX09GX1RBUiA9IGI0YS5hbGxvYygxMDI0KVxuXG5jb25zdCBub29wID0gZnVuY3Rpb24gKCkge31cblxuY29uc3Qgb3ZlcmZsb3cgPSBmdW5jdGlvbiAoc2VsZiwgc2l6ZSkge1xuICBzaXplICY9IDUxMVxuICBpZiAoc2l6ZSkgc2VsZi5wdXNoKEVORF9PRl9UQVIuc3ViYXJyYXkoMCwgNTEyIC0gc2l6ZSkpXG59XG5cbmZ1bmN0aW9uIG1vZGVUb1R5cGUgKG1vZGUpIHtcbiAgc3dpdGNoIChtb2RlICYgY29uc3RhbnRzLlNfSUZNVCkge1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZCTEs6IHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZDSFI6IHJldHVybiAnY2hhcmFjdGVyLWRldmljZSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGRElSOiByZXR1cm4gJ2RpcmVjdG9yeSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGSUZPOiByZXR1cm4gJ2ZpZm8nXG4gICAgY2FzZSBjb25zdGFudHMuU19JRkxOSzogcmV0dXJuICdzeW1saW5rJ1xuICB9XG5cbiAgcmV0dXJuICdmaWxlJ1xufVxuXG5jbGFzcyBTaW5rIGV4dGVuZHMgV3JpdGFibGUge1xuICBjb25zdHJ1Y3RvciAodG8pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy53cml0dGVuID0gMFxuICAgIHRoaXMuX3RvID0gdG9cbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLndyaXR0ZW4gKz0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgaWYgKHRoaXMuX3RvLnB1c2goZGF0YSkpIHJldHVybiBjYigpXG4gICAgdGhpcy5fdG8uX2RyYWluID0gY2JcbiAgfVxufVxuXG5jbGFzcyBMaW5rU2luayBleHRlbmRzIFdyaXRhYmxlIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmxpbmtuYW1lID0gJydcbiAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ3V0Zi04JylcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLmxpbmtuYW1lICs9IHRoaXMuX2RlY29kZXIud3JpdGUoZGF0YSlcbiAgICBjYigpXG4gIH1cbn1cblxuY2xhc3MgVm9pZCBleHRlbmRzIFdyaXRhYmxlIHtcbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIGNiKG5ldyBFcnJvcignTm8gYm9keSBhbGxvd2VkIGZvciB0aGlzIGVudHJ5JykpXG4gIH1cbn1cblxuY2xhc3MgUGFjayBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIHRoaXMuX2ZpbmFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5fZmluYWxpemluZyA9IGZhbHNlXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuICB9XG5cbiAgZW50cnkgKGhlYWRlciwgYnVmZmVyLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9zdHJlYW0pIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBwaXBpbmcgYW4gZW50cnknKVxuICAgIGlmICh0aGlzLl9maW5hbGl6ZWQgfHwgdGhpcy5kZXN0cm95ZWQpIHJldHVyblxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gYnVmZmVyXG4gICAgICBidWZmZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBub29wXG5cbiAgICBjb25zdCBzZWxmID0gdGhpc1xuXG4gICAgaWYgKCFoZWFkZXIuc2l6ZSB8fCBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnKSBoZWFkZXIuc2l6ZSA9IDBcbiAgICBpZiAoIWhlYWRlci50eXBlKSBoZWFkZXIudHlwZSA9IG1vZGVUb1R5cGUoaGVhZGVyLm1vZGUpXG4gICAgaWYgKCFoZWFkZXIubW9kZSkgaGVhZGVyLm1vZGUgPSBoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScgPyBETU9ERSA6IEZNT0RFXG4gICAgaWYgKCFoZWFkZXIudWlkKSBoZWFkZXIudWlkID0gMFxuICAgIGlmICghaGVhZGVyLmdpZCkgaGVhZGVyLmdpZCA9IDBcbiAgICBpZiAoIWhlYWRlci5tdGltZSkgaGVhZGVyLm10aW1lID0gbmV3IERhdGUoKVxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdzdHJpbmcnKSBidWZmZXIgPSBiNGEuZnJvbShidWZmZXIpXG4gICAgaWYgKGI0YS5pc0J1ZmZlcihidWZmZXIpKSB7XG4gICAgICBoZWFkZXIuc2l6ZSA9IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICB0aGlzLl9lbmNvZGUoaGVhZGVyKVxuICAgICAgY29uc3Qgb2sgPSB0aGlzLnB1c2goYnVmZmVyKVxuICAgICAgb3ZlcmZsb3coc2VsZiwgaGVhZGVyLnNpemUpXG4gICAgICBpZiAob2spIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG4gICAgICBlbHNlIHRoaXMuX2RyYWluID0gY2FsbGJhY2tcbiAgICAgIHJldHVybiBuZXcgVm9pZCgpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlci50eXBlID09PSAnc3ltbGluaycgJiYgIWhlYWRlci5saW5rbmFtZSkge1xuICAgICAgY29uc3QgbGlua1NpbmsgPSBuZXcgTGlua1NpbmsoKVxuICAgICAgbGlua1NpbmtcbiAgICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBzZWxmLmRlc3Ryb3koKVxuICAgICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBoZWFkZXIubGlua25hbWUgPSBsaW5rU2luay5saW5rbmFtZVxuICAgICAgICAgIHNlbGYuX2VuY29kZShoZWFkZXIpXG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9KVxuXG4gICAgICByZXR1cm4gbGlua1NpbmtcbiAgICB9XG5cbiAgICB0aGlzLl9lbmNvZGUoaGVhZGVyKVxuXG4gICAgaWYgKGhlYWRlci50eXBlICE9PSAnZmlsZScgJiYgaGVhZGVyLnR5cGUgIT09ICdjb250aWd1b3VzLWZpbGUnKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuIG5ldyBWb2lkKClcbiAgICB9XG5cbiAgICBjb25zdCBzaW5rID0gbmV3IFNpbmsodGhpcylcbiAgICBzaW5rXG4gICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBzZWxmLl9zdHJlYW0gPSBudWxsXG4gICAgICAgIHNlbGYuZGVzdHJveSgpXG4gICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLl9zdHJlYW0gPSBudWxsXG5cbiAgICAgICAgaWYgKHNpbmsud3JpdHRlbiAhPT0gaGVhZGVyLnNpemUpIHsgLy8gY29ycnVwdGluZyB0YXJcbiAgICAgICAgfVxuXG4gICAgICAgIG92ZXJmbG93KHNlbGYsIGhlYWRlci5zaXplKVxuICAgICAgICBpZiAoc2VsZi5fZmluYWxpemluZykgeyBzZWxmLmZpbmFsaXplKCkgfVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9KVxuXG4gICAgdGhpcy5fc3RyZWFtID0gc2lua1xuXG4gICAgcmV0dXJuIHNpbmtcbiAgfVxuXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5fc3RyZWFtKSB7XG4gICAgICB0aGlzLl9maW5hbGl6aW5nID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZpbmFsaXplZCkgcmV0dXJuXG4gICAgdGhpcy5fZmluYWxpemVkID0gdHJ1ZVxuICAgIHRoaXMucHVzaChFTkRfT0ZfVEFSKVxuICAgIHRoaXMucHVzaChudWxsKVxuICB9XG5cbiAgX2VuY29kZSAoaGVhZGVyKSB7XG4gICAgaWYgKCFoZWFkZXIucGF4KSB7XG4gICAgICBjb25zdCBidWYgPSBoZWFkZXJzLmVuY29kZShoZWFkZXIpXG4gICAgICBpZiAoYnVmKSB7XG4gICAgICAgIHRoaXMucHVzaChidWYpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbmNvZGVQYXgoaGVhZGVyKVxuICB9XG5cbiAgX2VuY29kZVBheCAoaGVhZGVyKSB7XG4gICAgY29uc3QgcGF4SGVhZGVyID0gaGVhZGVycy5lbmNvZGVQYXgoe1xuICAgICAgbmFtZTogaGVhZGVyLm5hbWUsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lLFxuICAgICAgcGF4OiBoZWFkZXIucGF4XG4gICAgfSlcblxuICAgIGNvbnN0IG5ld0hlYWRlciA9IHtcbiAgICAgIG5hbWU6ICdQYXhIZWFkZXInLFxuICAgICAgbW9kZTogaGVhZGVyLm1vZGUsXG4gICAgICB1aWQ6IGhlYWRlci51aWQsXG4gICAgICBnaWQ6IGhlYWRlci5naWQsXG4gICAgICBzaXplOiBwYXhIZWFkZXIuYnl0ZUxlbmd0aCxcbiAgICAgIG10aW1lOiBoZWFkZXIubXRpbWUsXG4gICAgICB0eXBlOiAncGF4LWhlYWRlcicsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lICYmICdQYXhIZWFkZXInLFxuICAgICAgdW5hbWU6IGhlYWRlci51bmFtZSxcbiAgICAgIGduYW1lOiBoZWFkZXIuZ25hbWUsXG4gICAgICBkZXZtYWpvcjogaGVhZGVyLmRldm1ham9yLFxuICAgICAgZGV2bWlub3I6IGhlYWRlci5kZXZtaW5vclxuICAgIH1cblxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICAgIHRoaXMucHVzaChwYXhIZWFkZXIpXG4gICAgb3ZlcmZsb3codGhpcywgcGF4SGVhZGVyLmJ5dGVMZW5ndGgpXG5cbiAgICBuZXdIZWFkZXIuc2l6ZSA9IGhlYWRlci5zaXplXG4gICAgbmV3SGVhZGVyLnR5cGUgPSBoZWFkZXIudHlwZVxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgY29uc3QgZHJhaW4gPSB0aGlzLl9kcmFpblxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIGRyYWluKClcbiAgICBjYigpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrIChvcHRzKSB7XG4gIHJldHVybiBuZXcgUGFjayhvcHRzKVxufVxuIiwiZXhwb3J0cy5leHRyYWN0ID0gcmVxdWlyZSgnLi9leHRyYWN0JylcbmV4cG9ydHMucGFjayA9IHJlcXVpcmUoJy4vcGFjaycpXG4iLG51bGxdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJwcm9jZXNzIiwiZ2xvYmFsIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwiZW5kT2ZTdHJlYW1Nb2R1bGUiLCJlbmRPZlN0cmVhbSIsInJlcXVpcmUkJDYiLCJyZXF1aXJlJCQ3IiwicmVxdWlyZSQkOCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxNCIsInJlcXVpcmUkJDE1Iiwic3RyZWFtTW9kdWxlIiwicmVxdWlyZSQkMTMiLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE3IiwiaW5oZXJpdHNfYnJvd3Nlck1vZHVsZSIsIkJ1ZmZlciIsIkJ1ZmZlckxpc3QiLCJibE1vZHVsZSIsImJsIiwibm9vcCIsIlJlYWRhYmxlIiwiV3JpdGFibGUiLCJpbmRleE9mIiwiYjRhIiwiaGVhZGVycyIsInBhY2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsV0FBYyxHQUFHO0dBQ2YsWUFBWSxDQUFDLElBQUksRUFBRTtBQUNyQixLQUFJLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDM0I7QUFDSCxHQUFFLHNCQUFzQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDbkMsS0FBSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3pCO0FBQ0gsR0FBRSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO0FBQ2xDLEtBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN4QjtBQUNILEdBQUUsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNoQyxLQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDdEI7QUFDSCxHQUFFLGlCQUFpQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDOUIsS0FBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ3BCO0FBQ0gsR0FBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO0FBQzlCLEtBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNwQjtBQUNILEdBQUUsa0JBQWtCLENBQUMs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SDtBQUNBLEVBQUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUM7QUFDcEM7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFNBQVMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDekQsRUFBRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO0FBQzlDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFNO0FBQ3hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtBQUMxQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTTtBQUN0QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDdkMsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtBQUM1RSxFQUFFLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7QUFDcEQsSUFBSSxRQUFRLEdBQUcsRUFBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzFELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFNO0FBQ3hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJRCxRQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTtBQUNuQixJQUFJLE9BQU8sR0FBRyxJQUFJQSxRQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFHO0FBQ3BCLEVBQUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUM7QUFDcEMsRUFBRSxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsU0FBUTtBQUMvQixFQUFFLElBQUksS0FBSyxHQUFHLElBQUc7QUFDakIsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxRQUFRLEtBQUssRUFBQztBQUN0QyxFQUFFLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUM7QUFDcEI7QUFDQTtBQUNBLEVBQUUsSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2hELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUNmO0FBQ0EsTUFBTSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7QUFDcEMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2QixVQUFVQSxRQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNoRCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2hELE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBQztBQUNyQyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU07QUFDcEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEdBQUc7QUFDZCxHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFO0FBQ2xELElBQUksT0FBTyxJQUFJO0FBQ2YsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3BFLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdEQsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ2I7QUFDQSxJQUFJLEdBQUcsR0FBR0EsUUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUM7QUFDakMsR0FBRztBQUNIO0FBQ0EsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkQsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFLO0FBQzFDO0FBQ0EsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFDbkIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUs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RztBQUNIO0FBQ0EsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztBQUNwQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUM7QUFDaEMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQztBQUNwQixFQUFDO0FBQ0Q7QUFDQSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUN0RCxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFDO0FBQzlDO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUM7QUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUk7QUFDekIsR0FBRztBQUNILEVBQUM7QUFDRDtBQUNBLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtBQUNsRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDdkIsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDakIsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFDO0FBQ1QsRUFBQztBQUNEO0FBQ0EsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxTQUFTLGFBQWEsRUFBRSxDQUFDLEVBQUU7QUFDdEUsRUFBRSxPQUFPLENBQUMsWUFBWSxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksVUFBVSxJQUFJLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDckcsRUFBQztBQUNEO0FBQ0EsZ0JBQWdCLENBQUMsWUFB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LENBQUM7QUFDRDtBQUNBLFNBQVMsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUN6QixFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUNsQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDekIsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDbEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLEVBQUUsTUFBTSxFQUFFO0FBQzNCLEVBQUUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sTUFBTTtBQUM1QyxFQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUN6RSxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDakQsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDeEQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtBQUMxRCxFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7QUFDakUsQ0FBQztBQUNEO0FBQ0EsU0FBUyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDL0MsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUN0RCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUM5QyxFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQ3JELENBQUM7QUFDRDtBQUNBLFNBQVMsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQy9DLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7QUFDdEQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDOUMsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUNyRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3ZDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUM5QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUM3QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3ZDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUM5QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUM3QyxDQUFDO0FBQ0Q7QUFDQSxJQUFBQyxLQUFjLEdBQUc7QUFDakIsRUFBRSxRQUFRO0FBQ1Ys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QUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBQztBQUNuRixJQUFJLE9BQU8sTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sR0FBRTtBQUN0RCxJQUFJLElBQUksR0FBRyxLQUFLLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDaEMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekQsR0FBRztBQUNILEVBQUM7QUFDRDtBQUNBLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQzNELEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUN2RixFQUFDO0FBQ0Q7QUFDQSxNQUFNLFNBQVMsR0FBRyxVQUFVLEdBQUcsRUFBRTtBQUNqQyxFQUFFLE1BQU0sR0FBRyxHQUFHQSxLQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBQztBQUNqQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBQztBQUMzRCxFQUFFLElBQUksR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUU7QUFDcEQ7QUFDQSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLEdBQUc7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SUFBSSxJQUFJLElBQUc7QUFDdkUsRUFBRSxJQUFJQSxLQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJO0FBQ3ZEO0FBQ0EsRUFBRSxPQUFPQSxLQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtBQUNyQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDO0FBQy9CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJO0FBQzdCLElBQUksTUFBTSxJQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDO0FBQ2hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBQztBQUM1QixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUlBLEtBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJQSxLQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxPQUFPLElBQUk7QUFDN0UsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUlBLEtBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsRUFBRSxPQUFPLElBQUk7QUFDdkU7QUFDQSxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUM7QUFDdEIsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUNyRCxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUM7QUFDN0MsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQzdDLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUMvQyxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQ3ZFO0FBQ0EsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDO0FBQ2hEO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFDO0FBQ3ZEO0FBQ0EsRUFBRUEsS0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBQztBQUMxQyxFQUFFQSxLQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFDO0FBQzFDLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQztBQUNqRCxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUM7QUFDakQsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUN2RCxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQ3ZEO0FBQ0EsRUFBRSxJQUFJLE1BQU0sRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQztBQUN6QztBQUNBLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQy9DO0FBQ0EsRUFBRSxPQUFPLEdBQUc7QUFDWixFQUFDO0FBQ0Q7QUFDQUMsU0FBQSxDQUFBLE1BQWMsR0FBRyxVQUFVLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRTtBQUN0RSxFQUFFLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFXO0FBQzVEO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUM7QUFDckQsRUFBRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDckMsRUFBRSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDcEMsRUFBRSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDcEMsRUFBRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUM7QUFDdEMsRUFBRSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUM7QUFDdkMsRUFBRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFDO0FBQy9CLEVBQUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFDO0FBQ3JGLEVBQUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFDO0FBQ3ZDLEVBQUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFDO0FBQ3ZDLEVBQUUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDO0FBQ3pDLEVBQUUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDO0FBQ3pDO0FBQ0EsRUFBRSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFDO0FBQ3RCO0FBQ0E7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJO0FBQy9CO0FBQ0E7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkVBQTZFLENBQUM7QUFDbEk7QUFDQSxFQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDdEU7QUFDQTtBQUNBLElBQUksSUFBSSxH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