8494 lines
821 KiB
Plaintext
8494 lines
821 KiB
Plaintext
/**
|
|
* @vue/runtime-core v3.5.19
|
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
|
* @license MIT
|
|
**/
|
|
import { pauseTracking, resetTracking, isRef, toRaw, traverse, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, shallowReactive, trigger, ReactiveEffect, watch as watch$1, customRef, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from "/_nuxt/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js?v=e4f18c29";
|
|
export { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from "/_nuxt/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js?v=e4f18c29";
|
|
import { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, NO, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, normalizeCssVarValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, EMPTY_ARR, hyphenate, makeMap, toRawType, hasChanged, looseToNumber, isModelListener, toNumber } from "/_nuxt/node_modules/@vue/shared/dist/shared.esm-bundler.js?v=e4f18c29";
|
|
export { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from "/_nuxt/node_modules/@vue/shared/dist/shared.esm-bundler.js?v=e4f18c29";
|
|
const stack = [];
|
|
function pushWarningContext(vnode) {
|
|
stack.push(vnode);
|
|
}
|
|
function popWarningContext() {
|
|
stack.pop();
|
|
}
|
|
let isWarning = false;
|
|
function warn$1(msg, ...args) {
|
|
if (isWarning) return;
|
|
isWarning = true;
|
|
pauseTracking();
|
|
const instance = stack.length ? stack[stack.length - 1].component : null;
|
|
const appWarnHandler = instance && instance.appContext.config.warnHandler;
|
|
const trace = getComponentTrace();
|
|
if (appWarnHandler) {
|
|
callWithErrorHandling(
|
|
appWarnHandler,
|
|
instance,
|
|
11,
|
|
[
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
msg + args.map((a) => {
|
|
var _a, _b;
|
|
return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);
|
|
}).join(""),
|
|
instance && instance.proxy,
|
|
trace.map(
|
|
({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
|
|
).join("\n"),
|
|
trace
|
|
]
|
|
);
|
|
} else {
|
|
const warnArgs = [`[Vue warn]: ${msg}`, ...args];
|
|
if (trace.length && // avoid spamming console during tests
|
|
true) {
|
|
warnArgs.push(`
|
|
`, ...formatTrace(trace));
|
|
}
|
|
console.warn(...warnArgs);
|
|
}
|
|
resetTracking();
|
|
isWarning = false;
|
|
}
|
|
function getComponentTrace() {
|
|
let currentVNode = stack[stack.length - 1];
|
|
if (!currentVNode) {
|
|
return [];
|
|
}
|
|
const normalizedStack = [];
|
|
while (currentVNode) {
|
|
const last = normalizedStack[0];
|
|
if (last && last.vnode === currentVNode) {
|
|
last.recurseCount++;
|
|
} else {
|
|
normalizedStack.push({
|
|
vnode: currentVNode,
|
|
recurseCount: 0
|
|
});
|
|
}
|
|
const parentInstance = currentVNode.component && currentVNode.component.parent;
|
|
currentVNode = parentInstance && parentInstance.vnode;
|
|
}
|
|
return normalizedStack;
|
|
}
|
|
function formatTrace(trace) {
|
|
const logs = [];
|
|
trace.forEach((entry, i) => {
|
|
logs.push(...i === 0 ? [] : [`
|
|
`], ...formatTraceEntry(entry));
|
|
});
|
|
return logs;
|
|
}
|
|
function formatTraceEntry({ vnode, recurseCount }) {
|
|
const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
|
|
const isRoot = vnode.component ? vnode.component.parent == null : false;
|
|
const open = ` at <${formatComponentName(
|
|
vnode.component,
|
|
vnode.type,
|
|
isRoot
|
|
)}`;
|
|
const close = `>` + postfix;
|
|
return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
|
|
}
|
|
function formatProps(props) {
|
|
const res = [];
|
|
const keys = Object.keys(props);
|
|
keys.slice(0, 3).forEach((key) => {
|
|
res.push(...formatProp(key, props[key]));
|
|
});
|
|
if (keys.length > 3) {
|
|
res.push(` ...`);
|
|
}
|
|
return res;
|
|
}
|
|
function formatProp(key, value, raw) {
|
|
if (isString(value)) {
|
|
value = JSON.stringify(value);
|
|
return raw ? value : [`${key}=${value}`];
|
|
} else if (typeof value === "number" || typeof value === "boolean" || value == null) {
|
|
return raw ? value : [`${key}=${value}`];
|
|
} else if (isRef(value)) {
|
|
value = formatProp(key, toRaw(value.value), true);
|
|
return raw ? value : [`${key}=Ref<`, value, `>`];
|
|
} else if (isFunction(value)) {
|
|
return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
|
|
} else {
|
|
value = toRaw(value);
|
|
return raw ? value : [`${key}=`, value];
|
|
}
|
|
}
|
|
function assertNumber(val, type) {
|
|
if (false) return;
|
|
if (val === void 0) {
|
|
return;
|
|
} else if (typeof val !== "number") {
|
|
warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);
|
|
} else if (isNaN(val)) {
|
|
warn$1(`${type} is NaN - the duration expression might be incorrect.`);
|
|
}
|
|
}
|
|
const ErrorCodes = {
|
|
"SETUP_FUNCTION": 0,
|
|
"0": "SETUP_FUNCTION",
|
|
"RENDER_FUNCTION": 1,
|
|
"1": "RENDER_FUNCTION",
|
|
"NATIVE_EVENT_HANDLER": 5,
|
|
"5": "NATIVE_EVENT_HANDLER",
|
|
"COMPONENT_EVENT_HANDLER": 6,
|
|
"6": "COMPONENT_EVENT_HANDLER",
|
|
"VNODE_HOOK": 7,
|
|
"7": "VNODE_HOOK",
|
|
"DIRECTIVE_HOOK": 8,
|
|
"8": "DIRECTIVE_HOOK",
|
|
"TRANSITION_HOOK": 9,
|
|
"9": "TRANSITION_HOOK",
|
|
"APP_ERROR_HANDLER": 10,
|
|
"10": "APP_ERROR_HANDLER",
|
|
"APP_WARN_HANDLER": 11,
|
|
"11": "APP_WARN_HANDLER",
|
|
"FUNCTION_REF": 12,
|
|
"12": "FUNCTION_REF",
|
|
"ASYNC_COMPONENT_LOADER": 13,
|
|
"13": "ASYNC_COMPONENT_LOADER",
|
|
"SCHEDULER": 14,
|
|
"14": "SCHEDULER",
|
|
"COMPONENT_UPDATE": 15,
|
|
"15": "COMPONENT_UPDATE",
|
|
"APP_UNMOUNT_CLEANUP": 16,
|
|
"16": "APP_UNMOUNT_CLEANUP"
|
|
};
|
|
const ErrorTypeStrings$1 = {
|
|
["sp"]: "serverPrefetch hook",
|
|
["bc"]: "beforeCreate hook",
|
|
["c"]: "created hook",
|
|
["bm"]: "beforeMount hook",
|
|
["m"]: "mounted hook",
|
|
["bu"]: "beforeUpdate hook",
|
|
["u"]: "updated",
|
|
["bum"]: "beforeUnmount hook",
|
|
["um"]: "unmounted hook",
|
|
["a"]: "activated hook",
|
|
["da"]: "deactivated hook",
|
|
["ec"]: "errorCaptured hook",
|
|
["rtc"]: "renderTracked hook",
|
|
["rtg"]: "renderTriggered hook",
|
|
[0]: "setup function",
|
|
[1]: "render function",
|
|
[2]: "watcher getter",
|
|
[3]: "watcher callback",
|
|
[4]: "watcher cleanup function",
|
|
[5]: "native event handler",
|
|
[6]: "component event handler",
|
|
[7]: "vnode hook",
|
|
[8]: "directive hook",
|
|
[9]: "transition hook",
|
|
[10]: "app errorHandler",
|
|
[11]: "app warnHandler",
|
|
[12]: "ref function",
|
|
[13]: "async component loader",
|
|
[14]: "scheduler flush",
|
|
[15]: "component update",
|
|
[16]: "app unmount cleanup function"
|
|
};
|
|
function callWithErrorHandling(fn, instance, type, args) {
|
|
try {
|
|
return args ? fn(...args) : fn();
|
|
} catch (err) {
|
|
handleError(err, instance, type);
|
|
}
|
|
}
|
|
function callWithAsyncErrorHandling(fn, instance, type, args) {
|
|
if (isFunction(fn)) {
|
|
const res = callWithErrorHandling(fn, instance, type, args);
|
|
if (res && isPromise(res)) {
|
|
res.catch((err) => {
|
|
handleError(err, instance, type);
|
|
});
|
|
}
|
|
return res;
|
|
}
|
|
if (isArray(fn)) {
|
|
const values = [];
|
|
for (let i = 0; i < fn.length; i++) {
|
|
values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
|
|
}
|
|
return values;
|
|
} else if (true) {
|
|
warn$1(
|
|
`Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`
|
|
);
|
|
}
|
|
}
|
|
function handleError(err, instance, type, throwInDev = true) {
|
|
const contextVNode = instance ? instance.vnode : null;
|
|
const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;
|
|
if (instance) {
|
|
let cur = instance.parent;
|
|
const exposedInstance = instance.proxy;
|
|
const errorInfo = true ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;
|
|
while (cur) {
|
|
const errorCapturedHooks = cur.ec;
|
|
if (errorCapturedHooks) {
|
|
for (let i = 0; i < errorCapturedHooks.length; i++) {
|
|
if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
cur = cur.parent;
|
|
}
|
|
if (errorHandler) {
|
|
pauseTracking();
|
|
callWithErrorHandling(errorHandler, null, 10, [
|
|
err,
|
|
exposedInstance,
|
|
errorInfo
|
|
]);
|
|
resetTracking();
|
|
return;
|
|
}
|
|
}
|
|
logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);
|
|
}
|
|
function logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {
|
|
if (true) {
|
|
const info = ErrorTypeStrings$1[type];
|
|
if (contextVNode) {
|
|
pushWarningContext(contextVNode);
|
|
}
|
|
warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
|
|
if (contextVNode) {
|
|
popWarningContext();
|
|
}
|
|
if (throwInDev) {
|
|
throw err;
|
|
} else {
|
|
console.error(err);
|
|
}
|
|
} else if (throwInProd) {
|
|
throw err;
|
|
} else {
|
|
console.error(err);
|
|
}
|
|
}
|
|
const queue = [];
|
|
let flushIndex = -1;
|
|
const pendingPostFlushCbs = [];
|
|
let activePostFlushCbs = null;
|
|
let postFlushIndex = 0;
|
|
const resolvedPromise = /* @__PURE__ */ Promise.resolve();
|
|
let currentFlushPromise = null;
|
|
const RECURSION_LIMIT = 100;
|
|
function nextTick(fn) {
|
|
const p = currentFlushPromise || resolvedPromise;
|
|
return fn ? p.then(this ? fn.bind(this) : fn) : p;
|
|
}
|
|
function findInsertionIndex(id) {
|
|
let start = flushIndex + 1;
|
|
let end = queue.length;
|
|
while (start < end) {
|
|
const middle = start + end >>> 1;
|
|
const middleJob = queue[middle];
|
|
const middleJobId = getId(middleJob);
|
|
if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {
|
|
start = middle + 1;
|
|
} else {
|
|
end = middle;
|
|
}
|
|
}
|
|
return start;
|
|
}
|
|
function queueJob(job) {
|
|
if (!(job.flags & 1)) {
|
|
const jobId = getId(job);
|
|
const lastJob = queue[queue.length - 1];
|
|
if (!lastJob || // fast path when the job id is larger than the tail
|
|
!(job.flags & 2) && jobId >= getId(lastJob)) {
|
|
queue.push(job);
|
|
} else {
|
|
queue.splice(findInsertionIndex(jobId), 0, job);
|
|
}
|
|
job.flags |= 1;
|
|
queueFlush();
|
|
}
|
|
}
|
|
function queueFlush() {
|
|
if (!currentFlushPromise) {
|
|
currentFlushPromise = resolvedPromise.then(flushJobs);
|
|
}
|
|
}
|
|
function queuePostFlushCb(cb) {
|
|
if (!isArray(cb)) {
|
|
if (activePostFlushCbs && cb.id === -1) {
|
|
activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);
|
|
} else if (!(cb.flags & 1)) {
|
|
pendingPostFlushCbs.push(cb);
|
|
cb.flags |= 1;
|
|
}
|
|
} else {
|
|
pendingPostFlushCbs.push(...cb);
|
|
}
|
|
queueFlush();
|
|
}
|
|
function flushPreFlushCbs(instance, seen, i = flushIndex + 1) {
|
|
if (true) {
|
|
seen = seen || /* @__PURE__ */ new Map();
|
|
}
|
|
for (; i < queue.length; i++) {
|
|
const cb = queue[i];
|
|
if (cb && cb.flags & 2) {
|
|
if (instance && cb.id !== instance.uid) {
|
|
continue;
|
|
}
|
|
if (checkRecursiveUpdates(seen, cb)) {
|
|
continue;
|
|
}
|
|
queue.splice(i, 1);
|
|
i--;
|
|
if (cb.flags & 4) {
|
|
cb.flags &= -2;
|
|
}
|
|
cb();
|
|
if (!(cb.flags & 4)) {
|
|
cb.flags &= -2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function flushPostFlushCbs(seen) {
|
|
if (pendingPostFlushCbs.length) {
|
|
const deduped = [...new Set(pendingPostFlushCbs)].sort(
|
|
(a, b) => getId(a) - getId(b)
|
|
);
|
|
pendingPostFlushCbs.length = 0;
|
|
if (activePostFlushCbs) {
|
|
activePostFlushCbs.push(...deduped);
|
|
return;
|
|
}
|
|
activePostFlushCbs = deduped;
|
|
if (true) {
|
|
seen = seen || /* @__PURE__ */ new Map();
|
|
}
|
|
for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
|
|
const cb = activePostFlushCbs[postFlushIndex];
|
|
if (checkRecursiveUpdates(seen, cb)) {
|
|
continue;
|
|
}
|
|
if (cb.flags & 4) {
|
|
cb.flags &= -2;
|
|
}
|
|
if (!(cb.flags & 8)) cb();
|
|
cb.flags &= -2;
|
|
}
|
|
activePostFlushCbs = null;
|
|
postFlushIndex = 0;
|
|
}
|
|
}
|
|
const getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;
|
|
function flushJobs(seen) {
|
|
if (true) {
|
|
seen = seen || /* @__PURE__ */ new Map();
|
|
}
|
|
const check = true ? (job) => checkRecursiveUpdates(seen, job) : NOOP;
|
|
try {
|
|
for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
|
|
const job = queue[flushIndex];
|
|
if (job && !(job.flags & 8)) {
|
|
if (check(job)) {
|
|
continue;
|
|
}
|
|
if (job.flags & 4) {
|
|
job.flags &= ~1;
|
|
}
|
|
callWithErrorHandling(
|
|
job,
|
|
job.i,
|
|
job.i ? 15 : 14
|
|
);
|
|
if (!(job.flags & 4)) {
|
|
job.flags &= ~1;
|
|
}
|
|
}
|
|
}
|
|
} finally {
|
|
for (; flushIndex < queue.length; flushIndex++) {
|
|
const job = queue[flushIndex];
|
|
if (job) {
|
|
job.flags &= -2;
|
|
}
|
|
}
|
|
flushIndex = -1;
|
|
queue.length = 0;
|
|
flushPostFlushCbs(seen);
|
|
currentFlushPromise = null;
|
|
if (queue.length || pendingPostFlushCbs.length) {
|
|
flushJobs(seen);
|
|
}
|
|
}
|
|
}
|
|
function checkRecursiveUpdates(seen, fn) {
|
|
const count = seen.get(fn) || 0;
|
|
if (count > RECURSION_LIMIT) {
|
|
const instance = fn.i;
|
|
const componentName = instance && getComponentName(instance.type);
|
|
handleError(
|
|
`Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,
|
|
null,
|
|
10
|
|
);
|
|
return true;
|
|
}
|
|
seen.set(fn, count + 1);
|
|
return false;
|
|
}
|
|
let isHmrUpdating = false;
|
|
const hmrDirtyComponents = /* @__PURE__ */ new Map();
|
|
if (true) {
|
|
getGlobalThis().__VUE_HMR_RUNTIME__ = {
|
|
createRecord: tryWrap(createRecord),
|
|
rerender: tryWrap(rerender),
|
|
reload: tryWrap(reload)
|
|
};
|
|
}
|
|
const map = /* @__PURE__ */ new Map();
|
|
function registerHMR(instance) {
|
|
const id = instance.type.__hmrId;
|
|
let record = map.get(id);
|
|
if (!record) {
|
|
createRecord(id, instance.type);
|
|
record = map.get(id);
|
|
}
|
|
record.instances.add(instance);
|
|
}
|
|
function unregisterHMR(instance) {
|
|
map.get(instance.type.__hmrId).instances.delete(instance);
|
|
}
|
|
function createRecord(id, initialDef) {
|
|
if (map.has(id)) {
|
|
return false;
|
|
}
|
|
map.set(id, {
|
|
initialDef: normalizeClassComponent(initialDef),
|
|
instances: /* @__PURE__ */ new Set()
|
|
});
|
|
return true;
|
|
}
|
|
function normalizeClassComponent(component) {
|
|
return isClassComponent(component) ? component.__vccOpts : component;
|
|
}
|
|
function rerender(id, newRender) {
|
|
const record = map.get(id);
|
|
if (!record) {
|
|
return;
|
|
}
|
|
record.initialDef.render = newRender;
|
|
[...record.instances].forEach((instance) => {
|
|
if (newRender) {
|
|
instance.render = newRender;
|
|
normalizeClassComponent(instance.type).render = newRender;
|
|
}
|
|
instance.renderCache = [];
|
|
isHmrUpdating = true;
|
|
if (!(instance.job.flags & 8)) {
|
|
instance.update();
|
|
}
|
|
isHmrUpdating = false;
|
|
});
|
|
}
|
|
function reload(id, newComp) {
|
|
const record = map.get(id);
|
|
if (!record) return;
|
|
newComp = normalizeClassComponent(newComp);
|
|
updateComponentDef(record.initialDef, newComp);
|
|
const instances = [...record.instances];
|
|
for (let i = 0; i < instances.length; i++) {
|
|
const instance = instances[i];
|
|
const oldComp = normalizeClassComponent(instance.type);
|
|
let dirtyInstances = hmrDirtyComponents.get(oldComp);
|
|
if (!dirtyInstances) {
|
|
if (oldComp !== record.initialDef) {
|
|
updateComponentDef(oldComp, newComp);
|
|
}
|
|
hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());
|
|
}
|
|
dirtyInstances.add(instance);
|
|
instance.appContext.propsCache.delete(instance.type);
|
|
instance.appContext.emitsCache.delete(instance.type);
|
|
instance.appContext.optionsCache.delete(instance.type);
|
|
if (instance.ceReload) {
|
|
dirtyInstances.add(instance);
|
|
instance.ceReload(newComp.styles);
|
|
dirtyInstances.delete(instance);
|
|
} else if (instance.parent) {
|
|
queueJob(() => {
|
|
isHmrUpdating = true;
|
|
instance.parent.update();
|
|
isHmrUpdating = false;
|
|
dirtyInstances.delete(instance);
|
|
});
|
|
} else if (instance.appContext.reload) {
|
|
instance.appContext.reload();
|
|
} else if (typeof window !== "undefined") {
|
|
window.location.reload();
|
|
} else {
|
|
console.warn(
|
|
"[HMR] Root or manually mounted instance modified. Full reload required."
|
|
);
|
|
}
|
|
if (instance.root.ce && instance !== instance.root) {
|
|
instance.root.ce._removeChildStyle(oldComp);
|
|
}
|
|
}
|
|
queuePostFlushCb(() => {
|
|
hmrDirtyComponents.clear();
|
|
});
|
|
}
|
|
function updateComponentDef(oldComp, newComp) {
|
|
extend(oldComp, newComp);
|
|
for (const key in oldComp) {
|
|
if (key !== "__file" && !(key in newComp)) {
|
|
delete oldComp[key];
|
|
}
|
|
}
|
|
}
|
|
function tryWrap(fn) {
|
|
return (id, arg) => {
|
|
try {
|
|
return fn(id, arg);
|
|
} catch (e) {
|
|
console.error(e);
|
|
console.warn(
|
|
`[HMR] Something went wrong during Vue component hot-reload. Full reload required.`
|
|
);
|
|
}
|
|
};
|
|
}
|
|
let devtools$1;
|
|
let buffer = [];
|
|
let devtoolsNotInstalled = false;
|
|
function emit$1(event, ...args) {
|
|
if (devtools$1) {
|
|
devtools$1.emit(event, ...args);
|
|
} else if (!devtoolsNotInstalled) {
|
|
buffer.push({ event, args });
|
|
}
|
|
}
|
|
function setDevtoolsHook$1(hook, target) {
|
|
var _a, _b;
|
|
devtools$1 = hook;
|
|
if (devtools$1) {
|
|
devtools$1.enabled = true;
|
|
buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));
|
|
buffer = [];
|
|
} else if (
|
|
// handle late devtools injection - only do this if we are in an actual
|
|
// browser environment to avoid the timer handle stalling test runner exit
|
|
// (#4815)
|
|
typeof window !== "undefined" && // some envs mock window but not fully
|
|
window.HTMLElement && // also exclude jsdom
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
!((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom"))
|
|
) {
|
|
const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
|
|
replay.push((newHook) => {
|
|
setDevtoolsHook$1(newHook, target);
|
|
});
|
|
setTimeout(() => {
|
|
if (!devtools$1) {
|
|
target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
|
|
devtoolsNotInstalled = true;
|
|
buffer = [];
|
|
}
|
|
}, 3e3);
|
|
} else {
|
|
devtoolsNotInstalled = true;
|
|
buffer = [];
|
|
}
|
|
}
|
|
function devtoolsInitApp(app, version2) {
|
|
emit$1("app:init", app, version2, {
|
|
Fragment,
|
|
Text,
|
|
Comment,
|
|
Static
|
|
});
|
|
}
|
|
function devtoolsUnmountApp(app) {
|
|
emit$1("app:unmount", app);
|
|
}
|
|
const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(
|
|
"component:added"
|
|
/* COMPONENT_ADDED */
|
|
);
|
|
const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(
|
|
"component:updated"
|
|
/* COMPONENT_UPDATED */
|
|
);
|
|
const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(
|
|
"component:removed"
|
|
/* COMPONENT_REMOVED */
|
|
);
|
|
const devtoolsComponentRemoved = (component) => {
|
|
if (devtools$1 && typeof devtools$1.cleanupBuffer === "function" && // remove the component if it wasn't buffered
|
|
!devtools$1.cleanupBuffer(component)) {
|
|
_devtoolsComponentRemoved(component);
|
|
}
|
|
};
|
|
/*! #__NO_SIDE_EFFECTS__ */
|
|
// @__NO_SIDE_EFFECTS__
|
|
function createDevtoolsComponentHook(hook) {
|
|
return (component) => {
|
|
emit$1(
|
|
hook,
|
|
component.appContext.app,
|
|
component.uid,
|
|
component.parent ? component.parent.uid : void 0,
|
|
component
|
|
);
|
|
};
|
|
}
|
|
const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(
|
|
"perf:start"
|
|
/* PERFORMANCE_START */
|
|
);
|
|
const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(
|
|
"perf:end"
|
|
/* PERFORMANCE_END */
|
|
);
|
|
function createDevtoolsPerformanceHook(hook) {
|
|
return (component, type, time) => {
|
|
emit$1(hook, component.appContext.app, component.uid, component, type, time);
|
|
};
|
|
}
|
|
function devtoolsComponentEmit(component, event, params) {
|
|
emit$1(
|
|
"component:emit",
|
|
component.appContext.app,
|
|
component,
|
|
event,
|
|
params
|
|
);
|
|
}
|
|
let currentRenderingInstance = null;
|
|
let currentScopeId = null;
|
|
function setCurrentRenderingInstance(instance) {
|
|
const prev = currentRenderingInstance;
|
|
currentRenderingInstance = instance;
|
|
currentScopeId = instance && instance.type.__scopeId || null;
|
|
return prev;
|
|
}
|
|
function pushScopeId(id) {
|
|
currentScopeId = id;
|
|
}
|
|
function popScopeId() {
|
|
currentScopeId = null;
|
|
}
|
|
const withScopeId = (_id) => withCtx;
|
|
function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
|
|
if (!ctx) return fn;
|
|
if (fn._n) {
|
|
return fn;
|
|
}
|
|
const renderFnWithContext = (...args) => {
|
|
if (renderFnWithContext._d) {
|
|
setBlockTracking(-1);
|
|
}
|
|
const prevInstance = setCurrentRenderingInstance(ctx);
|
|
let res;
|
|
try {
|
|
res = fn(...args);
|
|
} finally {
|
|
setCurrentRenderingInstance(prevInstance);
|
|
if (renderFnWithContext._d) {
|
|
setBlockTracking(1);
|
|
}
|
|
}
|
|
if (true) {
|
|
devtoolsComponentUpdated(ctx);
|
|
}
|
|
return res;
|
|
};
|
|
renderFnWithContext._n = true;
|
|
renderFnWithContext._c = true;
|
|
renderFnWithContext._d = true;
|
|
return renderFnWithContext;
|
|
}
|
|
function validateDirectiveName(name) {
|
|
if (isBuiltInDirective(name)) {
|
|
warn$1("Do not use built-in directive ids as custom directive id: " + name);
|
|
}
|
|
}
|
|
function withDirectives(vnode, directives) {
|
|
if (currentRenderingInstance === null) {
|
|
warn$1(`withDirectives can only be used inside render functions.`);
|
|
return vnode;
|
|
}
|
|
const instance = getComponentPublicInstance(currentRenderingInstance);
|
|
const bindings = vnode.dirs || (vnode.dirs = []);
|
|
for (let i = 0; i < directives.length; i++) {
|
|
let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];
|
|
if (dir) {
|
|
if (isFunction(dir)) {
|
|
dir = {
|
|
mounted: dir,
|
|
updated: dir
|
|
};
|
|
}
|
|
if (dir.deep) {
|
|
traverse(value);
|
|
}
|
|
bindings.push({
|
|
dir,
|
|
instance,
|
|
value,
|
|
oldValue: void 0,
|
|
arg,
|
|
modifiers
|
|
});
|
|
}
|
|
}
|
|
return vnode;
|
|
}
|
|
function invokeDirectiveHook(vnode, prevVNode, instance, name) {
|
|
const bindings = vnode.dirs;
|
|
const oldBindings = prevVNode && prevVNode.dirs;
|
|
for (let i = 0; i < bindings.length; i++) {
|
|
const binding = bindings[i];
|
|
if (oldBindings) {
|
|
binding.oldValue = oldBindings[i].value;
|
|
}
|
|
let hook = binding.dir[name];
|
|
if (hook) {
|
|
pauseTracking();
|
|
callWithAsyncErrorHandling(hook, instance, 8, [
|
|
vnode.el,
|
|
binding,
|
|
vnode,
|
|
prevVNode
|
|
]);
|
|
resetTracking();
|
|
}
|
|
}
|
|
}
|
|
const TeleportEndKey = Symbol("_vte");
|
|
const isTeleport = (type) => type.__isTeleport;
|
|
const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === "");
|
|
const isTeleportDeferred = (props) => props && (props.defer || props.defer === "");
|
|
const isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement;
|
|
const isTargetMathML = (target) => typeof MathMLElement === "function" && target instanceof MathMLElement;
|
|
const resolveTarget = (props, select) => {
|
|
const targetSelector = props && props.to;
|
|
if (isString(targetSelector)) {
|
|
if (!select) {
|
|
warn$1(
|
|
`Current renderer does not support string target for Teleports. (missing querySelector renderer option)`
|
|
);
|
|
return null;
|
|
} else {
|
|
const target = select(targetSelector);
|
|
if (!target && !isTeleportDisabled(props)) {
|
|
warn$1(
|
|
`Failed to locate Teleport target with selector "${targetSelector}". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`
|
|
);
|
|
}
|
|
return target;
|
|
}
|
|
} else {
|
|
if (!targetSelector && !isTeleportDisabled(props)) {
|
|
warn$1(`Invalid Teleport target: ${targetSelector}`);
|
|
}
|
|
return targetSelector;
|
|
}
|
|
};
|
|
const TeleportImpl = {
|
|
name: "Teleport",
|
|
__isTeleport: true,
|
|
process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {
|
|
const {
|
|
mc: mountChildren,
|
|
pc: patchChildren,
|
|
pbc: patchBlockChildren,
|
|
o: { insert, querySelector, createText, createComment }
|
|
} = internals;
|
|
const disabled = isTeleportDisabled(n2.props);
|
|
let { shapeFlag, children, dynamicChildren } = n2;
|
|
if (isHmrUpdating) {
|
|
optimized = false;
|
|
dynamicChildren = null;
|
|
}
|
|
if (n1 == null) {
|
|
const placeholder = n2.el = true ? createComment("teleport start") : createText("");
|
|
const mainAnchor = n2.anchor = true ? createComment("teleport end") : createText("");
|
|
insert(placeholder, container, anchor);
|
|
insert(mainAnchor, container, anchor);
|
|
const mount = (container2, anchor2) => {
|
|
if (shapeFlag & 16) {
|
|
if (parentComponent && parentComponent.isCE) {
|
|
parentComponent.ce._teleportTarget = container2;
|
|
}
|
|
mountChildren(
|
|
children,
|
|
container2,
|
|
anchor2,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
};
|
|
const mountToTarget = () => {
|
|
const target = n2.target = resolveTarget(n2.props, querySelector);
|
|
const targetAnchor = prepareAnchor(target, n2, createText, insert);
|
|
if (target) {
|
|
if (namespace !== "svg" && isTargetSVG(target)) {
|
|
namespace = "svg";
|
|
} else if (namespace !== "mathml" && isTargetMathML(target)) {
|
|
namespace = "mathml";
|
|
}
|
|
if (!disabled) {
|
|
mount(target, targetAnchor);
|
|
updateCssVars(n2, false);
|
|
}
|
|
} else if (!disabled) {
|
|
warn$1(
|
|
"Invalid Teleport target on mount:",
|
|
target,
|
|
`(${typeof target})`
|
|
);
|
|
}
|
|
};
|
|
if (disabled) {
|
|
mount(container, mainAnchor);
|
|
updateCssVars(n2, true);
|
|
}
|
|
if (isTeleportDeferred(n2.props)) {
|
|
n2.el.__isMounted = false;
|
|
queuePostRenderEffect(() => {
|
|
mountToTarget();
|
|
delete n2.el.__isMounted;
|
|
}, parentSuspense);
|
|
} else {
|
|
mountToTarget();
|
|
}
|
|
} else {
|
|
if (isTeleportDeferred(n2.props) && n1.el.__isMounted === false) {
|
|
queuePostRenderEffect(() => {
|
|
TeleportImpl.process(
|
|
n1,
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized,
|
|
internals
|
|
);
|
|
}, parentSuspense);
|
|
return;
|
|
}
|
|
n2.el = n1.el;
|
|
n2.targetStart = n1.targetStart;
|
|
const mainAnchor = n2.anchor = n1.anchor;
|
|
const target = n2.target = n1.target;
|
|
const targetAnchor = n2.targetAnchor = n1.targetAnchor;
|
|
const wasDisabled = isTeleportDisabled(n1.props);
|
|
const currentContainer = wasDisabled ? container : target;
|
|
const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;
|
|
if (namespace === "svg" || isTargetSVG(target)) {
|
|
namespace = "svg";
|
|
} else if (namespace === "mathml" || isTargetMathML(target)) {
|
|
namespace = "mathml";
|
|
}
|
|
if (dynamicChildren) {
|
|
patchBlockChildren(
|
|
n1.dynamicChildren,
|
|
dynamicChildren,
|
|
currentContainer,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds
|
|
);
|
|
traverseStaticChildren(n1, n2, false);
|
|
} else if (!optimized) {
|
|
patchChildren(
|
|
n1,
|
|
n2,
|
|
currentContainer,
|
|
currentAnchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
false
|
|
);
|
|
}
|
|
if (disabled) {
|
|
if (!wasDisabled) {
|
|
moveTeleport(
|
|
n2,
|
|
container,
|
|
mainAnchor,
|
|
internals,
|
|
1
|
|
);
|
|
} else {
|
|
if (n2.props && n1.props && n2.props.to !== n1.props.to) {
|
|
n2.props.to = n1.props.to;
|
|
}
|
|
}
|
|
} else {
|
|
if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {
|
|
const nextTarget = n2.target = resolveTarget(
|
|
n2.props,
|
|
querySelector
|
|
);
|
|
if (nextTarget) {
|
|
moveTeleport(
|
|
n2,
|
|
nextTarget,
|
|
null,
|
|
internals,
|
|
0
|
|
);
|
|
} else if (true) {
|
|
warn$1(
|
|
"Invalid Teleport target on update:",
|
|
target,
|
|
`(${typeof target})`
|
|
);
|
|
}
|
|
} else if (wasDisabled) {
|
|
moveTeleport(
|
|
n2,
|
|
target,
|
|
targetAnchor,
|
|
internals,
|
|
1
|
|
);
|
|
}
|
|
}
|
|
updateCssVars(n2, disabled);
|
|
}
|
|
},
|
|
remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {
|
|
const {
|
|
shapeFlag,
|
|
children,
|
|
anchor,
|
|
targetStart,
|
|
targetAnchor,
|
|
target,
|
|
props
|
|
} = vnode;
|
|
if (target) {
|
|
hostRemove(targetStart);
|
|
hostRemove(targetAnchor);
|
|
}
|
|
doRemove && hostRemove(anchor);
|
|
if (shapeFlag & 16) {
|
|
const shouldRemove = doRemove || !isTeleportDisabled(props);
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
unmount(
|
|
child,
|
|
parentComponent,
|
|
parentSuspense,
|
|
shouldRemove,
|
|
!!child.dynamicChildren
|
|
);
|
|
}
|
|
}
|
|
},
|
|
move: moveTeleport,
|
|
hydrate: hydrateTeleport
|
|
};
|
|
function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {
|
|
if (moveType === 0) {
|
|
insert(vnode.targetAnchor, container, parentAnchor);
|
|
}
|
|
const { el, anchor, shapeFlag, children, props } = vnode;
|
|
const isReorder = moveType === 2;
|
|
if (isReorder) {
|
|
insert(el, container, parentAnchor);
|
|
}
|
|
if (!isReorder || isTeleportDisabled(props)) {
|
|
if (shapeFlag & 16) {
|
|
for (let i = 0; i < children.length; i++) {
|
|
move(
|
|
children[i],
|
|
container,
|
|
parentAnchor,
|
|
2
|
|
);
|
|
}
|
|
}
|
|
}
|
|
if (isReorder) {
|
|
insert(anchor, container, parentAnchor);
|
|
}
|
|
}
|
|
function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {
|
|
o: { nextSibling, parentNode, querySelector, insert, createText }
|
|
}, hydrateChildren) {
|
|
const target = vnode.target = resolveTarget(
|
|
vnode.props,
|
|
querySelector
|
|
);
|
|
if (target) {
|
|
const disabled = isTeleportDisabled(vnode.props);
|
|
const targetNode = target._lpa || target.firstChild;
|
|
if (vnode.shapeFlag & 16) {
|
|
if (disabled) {
|
|
vnode.anchor = hydrateChildren(
|
|
nextSibling(node),
|
|
vnode,
|
|
parentNode(node),
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
vnode.targetStart = targetNode;
|
|
vnode.targetAnchor = targetNode && nextSibling(targetNode);
|
|
} else {
|
|
vnode.anchor = nextSibling(node);
|
|
let targetAnchor = targetNode;
|
|
while (targetAnchor) {
|
|
if (targetAnchor && targetAnchor.nodeType === 8) {
|
|
if (targetAnchor.data === "teleport start anchor") {
|
|
vnode.targetStart = targetAnchor;
|
|
} else if (targetAnchor.data === "teleport anchor") {
|
|
vnode.targetAnchor = targetAnchor;
|
|
target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);
|
|
break;
|
|
}
|
|
}
|
|
targetAnchor = nextSibling(targetAnchor);
|
|
}
|
|
if (!vnode.targetAnchor) {
|
|
prepareAnchor(target, vnode, createText, insert);
|
|
}
|
|
hydrateChildren(
|
|
targetNode && nextSibling(targetNode),
|
|
vnode,
|
|
target,
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
}
|
|
updateCssVars(vnode, disabled);
|
|
}
|
|
return vnode.anchor && nextSibling(vnode.anchor);
|
|
}
|
|
const Teleport = TeleportImpl;
|
|
function updateCssVars(vnode, isDisabled) {
|
|
const ctx = vnode.ctx;
|
|
if (ctx && ctx.ut) {
|
|
let node, anchor;
|
|
if (isDisabled) {
|
|
node = vnode.el;
|
|
anchor = vnode.anchor;
|
|
} else {
|
|
node = vnode.targetStart;
|
|
anchor = vnode.targetAnchor;
|
|
}
|
|
while (node && node !== anchor) {
|
|
if (node.nodeType === 1) node.setAttribute("data-v-owner", ctx.uid);
|
|
node = node.nextSibling;
|
|
}
|
|
ctx.ut();
|
|
}
|
|
}
|
|
function prepareAnchor(target, vnode, createText, insert) {
|
|
const targetStart = vnode.targetStart = createText("");
|
|
const targetAnchor = vnode.targetAnchor = createText("");
|
|
targetStart[TeleportEndKey] = targetAnchor;
|
|
if (target) {
|
|
insert(targetStart, target);
|
|
insert(targetAnchor, target);
|
|
}
|
|
return targetAnchor;
|
|
}
|
|
const leaveCbKey = Symbol("_leaveCb");
|
|
const enterCbKey = Symbol("_enterCb");
|
|
function useTransitionState() {
|
|
const state = {
|
|
isMounted: false,
|
|
isLeaving: false,
|
|
isUnmounting: false,
|
|
leavingVNodes: /* @__PURE__ */ new Map()
|
|
};
|
|
onMounted(() => {
|
|
state.isMounted = true;
|
|
});
|
|
onBeforeUnmount(() => {
|
|
state.isUnmounting = true;
|
|
});
|
|
return state;
|
|
}
|
|
const TransitionHookValidator = [Function, Array];
|
|
const BaseTransitionPropsValidators = {
|
|
mode: String,
|
|
appear: Boolean,
|
|
persisted: Boolean,
|
|
// enter
|
|
onBeforeEnter: TransitionHookValidator,
|
|
onEnter: TransitionHookValidator,
|
|
onAfterEnter: TransitionHookValidator,
|
|
onEnterCancelled: TransitionHookValidator,
|
|
// leave
|
|
onBeforeLeave: TransitionHookValidator,
|
|
onLeave: TransitionHookValidator,
|
|
onAfterLeave: TransitionHookValidator,
|
|
onLeaveCancelled: TransitionHookValidator,
|
|
// appear
|
|
onBeforeAppear: TransitionHookValidator,
|
|
onAppear: TransitionHookValidator,
|
|
onAfterAppear: TransitionHookValidator,
|
|
onAppearCancelled: TransitionHookValidator
|
|
};
|
|
const recursiveGetSubtree = (instance) => {
|
|
const subTree = instance.subTree;
|
|
return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;
|
|
};
|
|
const BaseTransitionImpl = {
|
|
name: `BaseTransition`,
|
|
props: BaseTransitionPropsValidators,
|
|
setup(props, { slots }) {
|
|
const instance = getCurrentInstance();
|
|
const state = useTransitionState();
|
|
return () => {
|
|
const children = slots.default && getTransitionRawChildren(slots.default(), true);
|
|
if (!children || !children.length) {
|
|
return;
|
|
}
|
|
const child = findNonCommentChild(children);
|
|
const rawProps = toRaw(props);
|
|
const { mode } = rawProps;
|
|
if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") {
|
|
warn$1(`invalid <transition> mode: ${mode}`);
|
|
}
|
|
if (state.isLeaving) {
|
|
return emptyPlaceholder(child);
|
|
}
|
|
const innerChild = getInnerChild$1(child);
|
|
if (!innerChild) {
|
|
return emptyPlaceholder(child);
|
|
}
|
|
let enterHooks = resolveTransitionHooks(
|
|
innerChild,
|
|
rawProps,
|
|
state,
|
|
instance,
|
|
// #11061, ensure enterHooks is fresh after clone
|
|
(hooks) => enterHooks = hooks
|
|
);
|
|
if (innerChild.type !== Comment) {
|
|
setTransitionHooks(innerChild, enterHooks);
|
|
}
|
|
let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);
|
|
if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) {
|
|
let leavingHooks = resolveTransitionHooks(
|
|
oldInnerChild,
|
|
rawProps,
|
|
state,
|
|
instance
|
|
);
|
|
setTransitionHooks(oldInnerChild, leavingHooks);
|
|
if (mode === "out-in" && innerChild.type !== Comment) {
|
|
state.isLeaving = true;
|
|
leavingHooks.afterLeave = () => {
|
|
state.isLeaving = false;
|
|
if (!(instance.job.flags & 8)) {
|
|
instance.update();
|
|
}
|
|
delete leavingHooks.afterLeave;
|
|
oldInnerChild = void 0;
|
|
};
|
|
return emptyPlaceholder(child);
|
|
} else if (mode === "in-out" && innerChild.type !== Comment) {
|
|
leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {
|
|
const leavingVNodesCache = getLeavingNodesForType(
|
|
state,
|
|
oldInnerChild
|
|
);
|
|
leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;
|
|
el[leaveCbKey] = () => {
|
|
earlyRemove();
|
|
el[leaveCbKey] = void 0;
|
|
delete enterHooks.delayedLeave;
|
|
oldInnerChild = void 0;
|
|
};
|
|
enterHooks.delayedLeave = () => {
|
|
delayedLeave();
|
|
delete enterHooks.delayedLeave;
|
|
oldInnerChild = void 0;
|
|
};
|
|
};
|
|
} else {
|
|
oldInnerChild = void 0;
|
|
}
|
|
} else if (oldInnerChild) {
|
|
oldInnerChild = void 0;
|
|
}
|
|
return child;
|
|
};
|
|
}
|
|
};
|
|
function findNonCommentChild(children) {
|
|
let child = children[0];
|
|
if (children.length > 1) {
|
|
let hasFound = false;
|
|
for (const c of children) {
|
|
if (c.type !== Comment) {
|
|
if (hasFound) {
|
|
warn$1(
|
|
"<transition> can only be used on a single element or component. Use <transition-group> for lists."
|
|
);
|
|
break;
|
|
}
|
|
child = c;
|
|
hasFound = true;
|
|
if (false) break;
|
|
}
|
|
}
|
|
}
|
|
return child;
|
|
}
|
|
const BaseTransition = BaseTransitionImpl;
|
|
function getLeavingNodesForType(state, vnode) {
|
|
const { leavingVNodes } = state;
|
|
let leavingVNodesCache = leavingVNodes.get(vnode.type);
|
|
if (!leavingVNodesCache) {
|
|
leavingVNodesCache = /* @__PURE__ */ Object.create(null);
|
|
leavingVNodes.set(vnode.type, leavingVNodesCache);
|
|
}
|
|
return leavingVNodesCache;
|
|
}
|
|
function resolveTransitionHooks(vnode, props, state, instance, postClone) {
|
|
const {
|
|
appear,
|
|
mode,
|
|
persisted = false,
|
|
onBeforeEnter,
|
|
onEnter,
|
|
onAfterEnter,
|
|
onEnterCancelled,
|
|
onBeforeLeave,
|
|
onLeave,
|
|
onAfterLeave,
|
|
onLeaveCancelled,
|
|
onBeforeAppear,
|
|
onAppear,
|
|
onAfterAppear,
|
|
onAppearCancelled
|
|
} = props;
|
|
const key = String(vnode.key);
|
|
const leavingVNodesCache = getLeavingNodesForType(state, vnode);
|
|
const callHook2 = (hook, args) => {
|
|
hook && callWithAsyncErrorHandling(
|
|
hook,
|
|
instance,
|
|
9,
|
|
args
|
|
);
|
|
};
|
|
const callAsyncHook = (hook, args) => {
|
|
const done = args[1];
|
|
callHook2(hook, args);
|
|
if (isArray(hook)) {
|
|
if (hook.every((hook2) => hook2.length <= 1)) done();
|
|
} else if (hook.length <= 1) {
|
|
done();
|
|
}
|
|
};
|
|
const hooks = {
|
|
mode,
|
|
persisted,
|
|
beforeEnter(el) {
|
|
let hook = onBeforeEnter;
|
|
if (!state.isMounted) {
|
|
if (appear) {
|
|
hook = onBeforeAppear || onBeforeEnter;
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
if (el[leaveCbKey]) {
|
|
el[leaveCbKey](
|
|
true
|
|
/* cancelled */
|
|
);
|
|
}
|
|
const leavingVNode = leavingVNodesCache[key];
|
|
if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {
|
|
leavingVNode.el[leaveCbKey]();
|
|
}
|
|
callHook2(hook, [el]);
|
|
},
|
|
enter(el) {
|
|
let hook = onEnter;
|
|
let afterHook = onAfterEnter;
|
|
let cancelHook = onEnterCancelled;
|
|
if (!state.isMounted) {
|
|
if (appear) {
|
|
hook = onAppear || onEnter;
|
|
afterHook = onAfterAppear || onAfterEnter;
|
|
cancelHook = onAppearCancelled || onEnterCancelled;
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
let called = false;
|
|
const done = el[enterCbKey] = (cancelled) => {
|
|
if (called) return;
|
|
called = true;
|
|
if (cancelled) {
|
|
callHook2(cancelHook, [el]);
|
|
} else {
|
|
callHook2(afterHook, [el]);
|
|
}
|
|
if (hooks.delayedLeave) {
|
|
hooks.delayedLeave();
|
|
}
|
|
el[enterCbKey] = void 0;
|
|
};
|
|
if (hook) {
|
|
callAsyncHook(hook, [el, done]);
|
|
} else {
|
|
done();
|
|
}
|
|
},
|
|
leave(el, remove2) {
|
|
const key2 = String(vnode.key);
|
|
if (el[enterCbKey]) {
|
|
el[enterCbKey](
|
|
true
|
|
/* cancelled */
|
|
);
|
|
}
|
|
if (state.isUnmounting) {
|
|
return remove2();
|
|
}
|
|
callHook2(onBeforeLeave, [el]);
|
|
let called = false;
|
|
const done = el[leaveCbKey] = (cancelled) => {
|
|
if (called) return;
|
|
called = true;
|
|
remove2();
|
|
if (cancelled) {
|
|
callHook2(onLeaveCancelled, [el]);
|
|
} else {
|
|
callHook2(onAfterLeave, [el]);
|
|
}
|
|
el[leaveCbKey] = void 0;
|
|
if (leavingVNodesCache[key2] === vnode) {
|
|
delete leavingVNodesCache[key2];
|
|
}
|
|
};
|
|
leavingVNodesCache[key2] = vnode;
|
|
if (onLeave) {
|
|
callAsyncHook(onLeave, [el, done]);
|
|
} else {
|
|
done();
|
|
}
|
|
},
|
|
clone(vnode2) {
|
|
const hooks2 = resolveTransitionHooks(
|
|
vnode2,
|
|
props,
|
|
state,
|
|
instance,
|
|
postClone
|
|
);
|
|
if (postClone) postClone(hooks2);
|
|
return hooks2;
|
|
}
|
|
};
|
|
return hooks;
|
|
}
|
|
function emptyPlaceholder(vnode) {
|
|
if (isKeepAlive(vnode)) {
|
|
vnode = cloneVNode(vnode);
|
|
vnode.children = null;
|
|
return vnode;
|
|
}
|
|
}
|
|
function getInnerChild$1(vnode) {
|
|
if (!isKeepAlive(vnode)) {
|
|
if (isTeleport(vnode.type) && vnode.children) {
|
|
return findNonCommentChild(vnode.children);
|
|
}
|
|
return vnode;
|
|
}
|
|
if (vnode.component) {
|
|
return vnode.component.subTree;
|
|
}
|
|
const { shapeFlag, children } = vnode;
|
|
if (children) {
|
|
if (shapeFlag & 16) {
|
|
return children[0];
|
|
}
|
|
if (shapeFlag & 32 && isFunction(children.default)) {
|
|
return children.default();
|
|
}
|
|
}
|
|
}
|
|
function setTransitionHooks(vnode, hooks) {
|
|
if (vnode.shapeFlag & 6 && vnode.component) {
|
|
vnode.transition = hooks;
|
|
setTransitionHooks(vnode.component.subTree, hooks);
|
|
} else if (vnode.shapeFlag & 128) {
|
|
vnode.ssContent.transition = hooks.clone(vnode.ssContent);
|
|
vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
|
|
} else {
|
|
vnode.transition = hooks;
|
|
}
|
|
}
|
|
function getTransitionRawChildren(children, keepComment = false, parentKey) {
|
|
let ret = [];
|
|
let keyedFragmentCount = 0;
|
|
for (let i = 0; i < children.length; i++) {
|
|
let child = children[i];
|
|
const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);
|
|
if (child.type === Fragment) {
|
|
if (child.patchFlag & 128) keyedFragmentCount++;
|
|
ret = ret.concat(
|
|
getTransitionRawChildren(child.children, keepComment, key)
|
|
);
|
|
} else if (keepComment || child.type !== Comment) {
|
|
ret.push(key != null ? cloneVNode(child, { key }) : child);
|
|
}
|
|
}
|
|
if (keyedFragmentCount > 1) {
|
|
for (let i = 0; i < ret.length; i++) {
|
|
ret[i].patchFlag = -2;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
/*! #__NO_SIDE_EFFECTS__ */
|
|
// @__NO_SIDE_EFFECTS__
|
|
function defineComponent(options, extraOptions) {
|
|
return isFunction(options) ? (
|
|
// #8236: extend call and options.name access are considered side-effects
|
|
// by Rollup, so we have to wrap it in a pure-annotated IIFE.
|
|
/* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()
|
|
) : options;
|
|
}
|
|
function useId() {
|
|
const i = getCurrentInstance();
|
|
if (i) {
|
|
return (i.appContext.config.idPrefix || "v") + "-" + i.ids[0] + i.ids[1]++;
|
|
} else if (true) {
|
|
warn$1(
|
|
`useId() is called when there is no active component instance to be associated with.`
|
|
);
|
|
}
|
|
return "";
|
|
}
|
|
function markAsyncBoundary(instance) {
|
|
instance.ids = [instance.ids[0] + instance.ids[2]++ + "-", 0, 0];
|
|
}
|
|
const knownTemplateRefs = /* @__PURE__ */ new WeakSet();
|
|
function useTemplateRef(key) {
|
|
const i = getCurrentInstance();
|
|
const r = shallowRef(null);
|
|
if (i) {
|
|
const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;
|
|
let desc;
|
|
if ((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {
|
|
warn$1(`useTemplateRef('${key}') already exists.`);
|
|
} else {
|
|
Object.defineProperty(refs, key, {
|
|
enumerable: true,
|
|
get: () => r.value,
|
|
set: (val) => r.value = val
|
|
});
|
|
}
|
|
} else if (true) {
|
|
warn$1(
|
|
`useTemplateRef() is called when there is no active component instance to be associated with.`
|
|
);
|
|
}
|
|
const ret = true ? readonly(r) : r;
|
|
if (true) {
|
|
knownTemplateRefs.add(ret);
|
|
}
|
|
return ret;
|
|
}
|
|
function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
|
|
if (isArray(rawRef)) {
|
|
rawRef.forEach(
|
|
(r, i) => setRef(
|
|
r,
|
|
oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),
|
|
parentSuspense,
|
|
vnode,
|
|
isUnmount
|
|
)
|
|
);
|
|
return;
|
|
}
|
|
if (isAsyncWrapper(vnode) && !isUnmount) {
|
|
if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {
|
|
setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);
|
|
}
|
|
return;
|
|
}
|
|
const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;
|
|
const value = isUnmount ? null : refValue;
|
|
const { i: owner, r: ref3 } = rawRef;
|
|
if (!owner) {
|
|
warn$1(
|
|
`Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`
|
|
);
|
|
return;
|
|
}
|
|
const oldRef = oldRawRef && oldRawRef.r;
|
|
const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;
|
|
const setupState = owner.setupState;
|
|
const rawSetupState = toRaw(setupState);
|
|
const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {
|
|
if (true) {
|
|
if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {
|
|
warn$1(
|
|
`Template ref "${key}" used on a non-ref value. It will not work in the production build.`
|
|
);
|
|
}
|
|
if (knownTemplateRefs.has(rawSetupState[key])) {
|
|
return false;
|
|
}
|
|
}
|
|
return hasOwn(rawSetupState, key);
|
|
};
|
|
const canSetRef = (ref22) => {
|
|
return !knownTemplateRefs.has(ref22);
|
|
};
|
|
if (oldRef != null && oldRef !== ref3) {
|
|
if (isString(oldRef)) {
|
|
refs[oldRef] = null;
|
|
if (canSetSetupRef(oldRef)) {
|
|
setupState[oldRef] = null;
|
|
}
|
|
} else if (isRef(oldRef)) {
|
|
if (canSetRef(oldRef)) {
|
|
oldRef.value = null;
|
|
}
|
|
const oldRawRefAtom = oldRawRef;
|
|
if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;
|
|
}
|
|
}
|
|
if (isFunction(ref3)) {
|
|
callWithErrorHandling(ref3, owner, 12, [value, refs]);
|
|
} else {
|
|
const _isString = isString(ref3);
|
|
const _isRef = isRef(ref3);
|
|
if (_isString || _isRef) {
|
|
const doSet = () => {
|
|
if (rawRef.f) {
|
|
const existing = _isString ? canSetSetupRef(ref3) ? setupState[ref3] : refs[ref3] : canSetRef(ref3) || !rawRef.k ? ref3.value : refs[rawRef.k];
|
|
if (isUnmount) {
|
|
isArray(existing) && remove(existing, refValue);
|
|
} else {
|
|
if (!isArray(existing)) {
|
|
if (_isString) {
|
|
refs[ref3] = [refValue];
|
|
if (canSetSetupRef(ref3)) {
|
|
setupState[ref3] = refs[ref3];
|
|
}
|
|
} else {
|
|
const newVal = [refValue];
|
|
if (canSetRef(ref3)) {
|
|
ref3.value = newVal;
|
|
}
|
|
if (rawRef.k) refs[rawRef.k] = newVal;
|
|
}
|
|
} else if (!existing.includes(refValue)) {
|
|
existing.push(refValue);
|
|
}
|
|
}
|
|
} else if (_isString) {
|
|
refs[ref3] = value;
|
|
if (canSetSetupRef(ref3)) {
|
|
setupState[ref3] = value;
|
|
}
|
|
} else if (_isRef) {
|
|
if (canSetRef(ref3)) {
|
|
ref3.value = value;
|
|
}
|
|
if (rawRef.k) refs[rawRef.k] = value;
|
|
} else if (true) {
|
|
warn$1("Invalid template ref type:", ref3, `(${typeof ref3})`);
|
|
}
|
|
};
|
|
if (value) {
|
|
doSet.id = -1;
|
|
queuePostRenderEffect(doSet, parentSuspense);
|
|
} else {
|
|
doSet();
|
|
}
|
|
} else if (true) {
|
|
warn$1("Invalid template ref type:", ref3, `(${typeof ref3})`);
|
|
}
|
|
}
|
|
}
|
|
let hasLoggedMismatchError = false;
|
|
const logMismatchError = () => {
|
|
if (hasLoggedMismatchError) {
|
|
return;
|
|
}
|
|
console.error("Hydration completed but contains mismatches.");
|
|
hasLoggedMismatchError = true;
|
|
};
|
|
const isSVGContainer = (container) => container.namespaceURI.includes("svg") && container.tagName !== "foreignObject";
|
|
const isMathMLContainer = (container) => container.namespaceURI.includes("MathML");
|
|
const getContainerType = (container) => {
|
|
if (container.nodeType !== 1) return void 0;
|
|
if (isSVGContainer(container)) return "svg";
|
|
if (isMathMLContainer(container)) return "mathml";
|
|
return void 0;
|
|
};
|
|
const isComment = (node) => node.nodeType === 8;
|
|
function createHydrationFunctions(rendererInternals) {
|
|
const {
|
|
mt: mountComponent,
|
|
p: patch,
|
|
o: {
|
|
patchProp,
|
|
createText,
|
|
nextSibling,
|
|
parentNode,
|
|
remove: remove2,
|
|
insert,
|
|
createComment
|
|
}
|
|
} = rendererInternals;
|
|
const hydrate = (vnode, container) => {
|
|
if (!container.hasChildNodes()) {
|
|
warn$1(
|
|
`Attempting to hydrate existing markup but container is empty. Performing full mount instead.`
|
|
);
|
|
patch(null, vnode, container);
|
|
flushPostFlushCbs();
|
|
container._vnode = vnode;
|
|
return;
|
|
}
|
|
hydrateNode(container.firstChild, vnode, null, null, null);
|
|
flushPostFlushCbs();
|
|
container._vnode = vnode;
|
|
};
|
|
const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {
|
|
optimized = optimized || !!vnode.dynamicChildren;
|
|
const isFragmentStart = isComment(node) && node.data === "[";
|
|
const onMismatch = () => handleMismatch(
|
|
node,
|
|
vnode,
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
isFragmentStart
|
|
);
|
|
const { type, ref: ref3, shapeFlag, patchFlag } = vnode;
|
|
let domType = node.nodeType;
|
|
vnode.el = node;
|
|
if (true) {
|
|
def(node, "__vnode", vnode, true);
|
|
def(node, "__vueParentComponent", parentComponent, true);
|
|
}
|
|
if (patchFlag === -2) {
|
|
optimized = false;
|
|
vnode.dynamicChildren = null;
|
|
}
|
|
let nextNode = null;
|
|
switch (type) {
|
|
case Text:
|
|
if (domType !== 3) {
|
|
if (vnode.children === "") {
|
|
insert(vnode.el = createText(""), parentNode(node), node);
|
|
nextNode = node;
|
|
} else {
|
|
nextNode = onMismatch();
|
|
}
|
|
} else {
|
|
if (node.data !== vnode.children) {
|
|
warn$1(
|
|
`Hydration text mismatch in`,
|
|
node.parentNode,
|
|
`
|
|
- rendered on server: ${JSON.stringify(
|
|
node.data
|
|
)}
|
|
- expected on client: ${JSON.stringify(vnode.children)}`
|
|
);
|
|
logMismatchError();
|
|
node.data = vnode.children;
|
|
}
|
|
nextNode = nextSibling(node);
|
|
}
|
|
break;
|
|
case Comment:
|
|
if (isTemplateNode(node)) {
|
|
nextNode = nextSibling(node);
|
|
replaceNode(
|
|
vnode.el = node.content.firstChild,
|
|
node,
|
|
parentComponent
|
|
);
|
|
} else if (domType !== 8 || isFragmentStart) {
|
|
nextNode = onMismatch();
|
|
} else {
|
|
nextNode = nextSibling(node);
|
|
}
|
|
break;
|
|
case Static:
|
|
if (isFragmentStart) {
|
|
node = nextSibling(node);
|
|
domType = node.nodeType;
|
|
}
|
|
if (domType === 1 || domType === 3) {
|
|
nextNode = node;
|
|
const needToAdoptContent = !vnode.children.length;
|
|
for (let i = 0; i < vnode.staticCount; i++) {
|
|
if (needToAdoptContent)
|
|
vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;
|
|
if (i === vnode.staticCount - 1) {
|
|
vnode.anchor = nextNode;
|
|
}
|
|
nextNode = nextSibling(nextNode);
|
|
}
|
|
return isFragmentStart ? nextSibling(nextNode) : nextNode;
|
|
} else {
|
|
onMismatch();
|
|
}
|
|
break;
|
|
case Fragment:
|
|
if (!isFragmentStart) {
|
|
nextNode = onMismatch();
|
|
} else {
|
|
nextNode = hydrateFragment(
|
|
node,
|
|
vnode,
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
break;
|
|
default:
|
|
if (shapeFlag & 1) {
|
|
if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {
|
|
nextNode = onMismatch();
|
|
} else {
|
|
nextNode = hydrateElement(
|
|
node,
|
|
vnode,
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
} else if (shapeFlag & 6) {
|
|
vnode.slotScopeIds = slotScopeIds;
|
|
const container = parentNode(node);
|
|
if (isFragmentStart) {
|
|
nextNode = locateClosingAnchor(node);
|
|
} else if (isComment(node) && node.data === "teleport start") {
|
|
nextNode = locateClosingAnchor(node, node.data, "teleport end");
|
|
} else {
|
|
nextNode = nextSibling(node);
|
|
}
|
|
mountComponent(
|
|
vnode,
|
|
container,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
getContainerType(container),
|
|
optimized
|
|
);
|
|
if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {
|
|
let subTree;
|
|
if (isFragmentStart) {
|
|
subTree = createVNode(Fragment);
|
|
subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;
|
|
} else {
|
|
subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div");
|
|
}
|
|
subTree.el = node;
|
|
vnode.component.subTree = subTree;
|
|
}
|
|
} else if (shapeFlag & 64) {
|
|
if (domType !== 8) {
|
|
nextNode = onMismatch();
|
|
} else {
|
|
nextNode = vnode.type.hydrate(
|
|
node,
|
|
vnode,
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
optimized,
|
|
rendererInternals,
|
|
hydrateChildren
|
|
);
|
|
}
|
|
} else if (shapeFlag & 128) {
|
|
nextNode = vnode.type.hydrate(
|
|
node,
|
|
vnode,
|
|
parentComponent,
|
|
parentSuspense,
|
|
getContainerType(parentNode(node)),
|
|
slotScopeIds,
|
|
optimized,
|
|
rendererInternals,
|
|
hydrateNode
|
|
);
|
|
} else if (true) {
|
|
warn$1("Invalid HostVNode type:", type, `(${typeof type})`);
|
|
}
|
|
}
|
|
if (ref3 != null) {
|
|
setRef(ref3, null, parentSuspense, vnode);
|
|
}
|
|
return nextNode;
|
|
};
|
|
const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
|
|
optimized = optimized || !!vnode.dynamicChildren;
|
|
const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;
|
|
const forcePatch = type === "input" || type === "option";
|
|
if (true) {
|
|
if (dirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, "created");
|
|
}
|
|
let needCallTransitionHooks = false;
|
|
if (isTemplateNode(el)) {
|
|
needCallTransitionHooks = needTransition(
|
|
null,
|
|
// no need check parentSuspense in hydration
|
|
transition
|
|
) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;
|
|
const content = el.content.firstChild;
|
|
if (needCallTransitionHooks) {
|
|
const cls = content.getAttribute("class");
|
|
if (cls) content.$cls = cls;
|
|
transition.beforeEnter(content);
|
|
}
|
|
replaceNode(content, el, parentComponent);
|
|
vnode.el = el = content;
|
|
}
|
|
if (shapeFlag & 16 && // skip if element has innerHTML / textContent
|
|
!(props && (props.innerHTML || props.textContent))) {
|
|
let next = hydrateChildren(
|
|
el.firstChild,
|
|
vnode,
|
|
el,
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
let hasWarned2 = false;
|
|
while (next) {
|
|
if (!isMismatchAllowed(
|
|
el,
|
|
1
|
|
/* CHILDREN */
|
|
)) {
|
|
if (!hasWarned2) {
|
|
warn$1(
|
|
`Hydration children mismatch on`,
|
|
el,
|
|
`
|
|
Server rendered element contains more child nodes than client vdom.`
|
|
);
|
|
hasWarned2 = true;
|
|
}
|
|
logMismatchError();
|
|
}
|
|
const cur = next;
|
|
next = next.nextSibling;
|
|
remove2(cur);
|
|
}
|
|
} else if (shapeFlag & 8) {
|
|
let clientText = vnode.children;
|
|
if (clientText[0] === "\n" && (el.tagName === "PRE" || el.tagName === "TEXTAREA")) {
|
|
clientText = clientText.slice(1);
|
|
}
|
|
if (el.textContent !== clientText) {
|
|
if (!isMismatchAllowed(
|
|
el,
|
|
0
|
|
/* TEXT */
|
|
)) {
|
|
warn$1(
|
|
`Hydration text content mismatch on`,
|
|
el,
|
|
`
|
|
- rendered on server: ${el.textContent}
|
|
- expected on client: ${vnode.children}`
|
|
);
|
|
logMismatchError();
|
|
}
|
|
el.textContent = vnode.children;
|
|
}
|
|
}
|
|
if (props) {
|
|
if (true) {
|
|
const isCustomElement = el.tagName.includes("-");
|
|
for (const key in props) {
|
|
if (// #11189 skip if this node has directives that have created hooks
|
|
// as it could have mutated the DOM in any possible way
|
|
!(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {
|
|
logMismatchError();
|
|
}
|
|
if (forcePatch && (key.endsWith("value") || key === "indeterminate") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers
|
|
key[0] === "." || isCustomElement) {
|
|
patchProp(el, key, null, props[key], void 0, parentComponent);
|
|
}
|
|
}
|
|
} else if (props.onClick) {
|
|
patchProp(
|
|
el,
|
|
"onClick",
|
|
null,
|
|
props.onClick,
|
|
void 0,
|
|
parentComponent
|
|
);
|
|
} else if (patchFlag & 4 && isReactive(props.style)) {
|
|
for (const key in props.style) props.style[key];
|
|
}
|
|
}
|
|
let vnodeHooks;
|
|
if (vnodeHooks = props && props.onVnodeBeforeMount) {
|
|
invokeVNodeHook(vnodeHooks, parentComponent, vnode);
|
|
}
|
|
if (dirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
|
|
}
|
|
if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {
|
|
queueEffectWithSuspense(() => {
|
|
vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);
|
|
needCallTransitionHooks && transition.enter(el);
|
|
dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
|
|
}, parentSuspense);
|
|
}
|
|
}
|
|
return el.nextSibling;
|
|
};
|
|
const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {
|
|
optimized = optimized || !!parentVNode.dynamicChildren;
|
|
const children = parentVNode.children;
|
|
const l = children.length;
|
|
let hasWarned2 = false;
|
|
for (let i = 0; i < l; i++) {
|
|
const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);
|
|
const isText = vnode.type === Text;
|
|
if (node) {
|
|
if (isText && !optimized) {
|
|
if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {
|
|
insert(
|
|
createText(
|
|
node.data.slice(vnode.children.length)
|
|
),
|
|
container,
|
|
nextSibling(node)
|
|
);
|
|
node.data = vnode.children;
|
|
}
|
|
}
|
|
node = hydrateNode(
|
|
node,
|
|
vnode,
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else if (isText && !vnode.children) {
|
|
insert(vnode.el = createText(""), container);
|
|
} else {
|
|
if (!isMismatchAllowed(
|
|
container,
|
|
1
|
|
/* CHILDREN */
|
|
)) {
|
|
if (!hasWarned2) {
|
|
warn$1(
|
|
`Hydration children mismatch on`,
|
|
container,
|
|
`
|
|
Server rendered element contains fewer child nodes than client vdom.`
|
|
);
|
|
hasWarned2 = true;
|
|
}
|
|
logMismatchError();
|
|
}
|
|
patch(
|
|
null,
|
|
vnode,
|
|
container,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
getContainerType(container),
|
|
slotScopeIds
|
|
);
|
|
}
|
|
}
|
|
return node;
|
|
};
|
|
const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
|
|
const { slotScopeIds: fragmentSlotScopeIds } = vnode;
|
|
if (fragmentSlotScopeIds) {
|
|
slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
|
|
}
|
|
const container = parentNode(node);
|
|
const next = hydrateChildren(
|
|
nextSibling(node),
|
|
vnode,
|
|
container,
|
|
parentComponent,
|
|
parentSuspense,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
if (next && isComment(next) && next.data === "]") {
|
|
return nextSibling(vnode.anchor = next);
|
|
} else {
|
|
logMismatchError();
|
|
insert(vnode.anchor = createComment(`]`), container, next);
|
|
return next;
|
|
}
|
|
};
|
|
const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {
|
|
if (!isMismatchAllowed(
|
|
node.parentElement,
|
|
1
|
|
/* CHILDREN */
|
|
)) {
|
|
warn$1(
|
|
`Hydration node mismatch:
|
|
- rendered on server:`,
|
|
node,
|
|
node.nodeType === 3 ? `(text)` : isComment(node) && node.data === "[" ? `(start of fragment)` : ``,
|
|
`
|
|
- expected on client:`,
|
|
vnode.type
|
|
);
|
|
logMismatchError();
|
|
}
|
|
vnode.el = null;
|
|
if (isFragment) {
|
|
const end = locateClosingAnchor(node);
|
|
while (true) {
|
|
const next2 = nextSibling(node);
|
|
if (next2 && next2 !== end) {
|
|
remove2(next2);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
const next = nextSibling(node);
|
|
const container = parentNode(node);
|
|
remove2(node);
|
|
patch(
|
|
null,
|
|
vnode,
|
|
container,
|
|
next,
|
|
parentComponent,
|
|
parentSuspense,
|
|
getContainerType(container),
|
|
slotScopeIds
|
|
);
|
|
if (parentComponent) {
|
|
parentComponent.vnode.el = vnode.el;
|
|
updateHOCHostEl(parentComponent, vnode.el);
|
|
}
|
|
return next;
|
|
};
|
|
const locateClosingAnchor = (node, open = "[", close = "]") => {
|
|
let match = 0;
|
|
while (node) {
|
|
node = nextSibling(node);
|
|
if (node && isComment(node)) {
|
|
if (node.data === open) match++;
|
|
if (node.data === close) {
|
|
if (match === 0) {
|
|
return nextSibling(node);
|
|
} else {
|
|
match--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return node;
|
|
};
|
|
const replaceNode = (newNode, oldNode, parentComponent) => {
|
|
const parentNode2 = oldNode.parentNode;
|
|
if (parentNode2) {
|
|
parentNode2.replaceChild(newNode, oldNode);
|
|
}
|
|
let parent = parentComponent;
|
|
while (parent) {
|
|
if (parent.vnode.el === oldNode) {
|
|
parent.vnode.el = parent.subTree.el = newNode;
|
|
}
|
|
parent = parent.parent;
|
|
}
|
|
};
|
|
const isTemplateNode = (node) => {
|
|
return node.nodeType === 1 && node.tagName === "TEMPLATE";
|
|
};
|
|
return [hydrate, hydrateNode];
|
|
}
|
|
function propHasMismatch(el, key, clientValue, vnode, instance) {
|
|
let mismatchType;
|
|
let mismatchKey;
|
|
let actual;
|
|
let expected;
|
|
if (key === "class") {
|
|
if (el.$cls) {
|
|
actual = el.$cls;
|
|
delete el.$cls;
|
|
} else {
|
|
actual = el.getAttribute("class");
|
|
}
|
|
expected = normalizeClass(clientValue);
|
|
if (!isSetEqual(toClassSet(actual || ""), toClassSet(expected))) {
|
|
mismatchType = 2;
|
|
mismatchKey = `class`;
|
|
}
|
|
} else if (key === "style") {
|
|
actual = el.getAttribute("style") || "";
|
|
expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));
|
|
const actualMap = toStyleMap(actual);
|
|
const expectedMap = toStyleMap(expected);
|
|
if (vnode.dirs) {
|
|
for (const { dir, value } of vnode.dirs) {
|
|
if (dir.name === "show" && !value) {
|
|
expectedMap.set("display", "none");
|
|
}
|
|
}
|
|
}
|
|
if (instance) {
|
|
resolveCssVars(instance, vnode, expectedMap);
|
|
}
|
|
if (!isMapEqual(actualMap, expectedMap)) {
|
|
mismatchType = 3;
|
|
mismatchKey = "style";
|
|
}
|
|
} else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {
|
|
if (isBooleanAttr(key)) {
|
|
actual = el.hasAttribute(key);
|
|
expected = includeBooleanAttr(clientValue);
|
|
} else if (clientValue == null) {
|
|
actual = el.hasAttribute(key);
|
|
expected = false;
|
|
} else {
|
|
if (el.hasAttribute(key)) {
|
|
actual = el.getAttribute(key);
|
|
} else if (key === "value" && el.tagName === "TEXTAREA") {
|
|
actual = el.value;
|
|
} else {
|
|
actual = false;
|
|
}
|
|
expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;
|
|
}
|
|
if (actual !== expected) {
|
|
mismatchType = 4;
|
|
mismatchKey = key;
|
|
}
|
|
}
|
|
if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {
|
|
const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}="${v}"`;
|
|
const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;
|
|
const postSegment = `
|
|
- rendered on server: ${format(actual)}
|
|
- expected on client: ${format(expected)}
|
|
Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.
|
|
You should fix the source of the mismatch.`;
|
|
{
|
|
warn$1(preSegment, el, postSegment);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function toClassSet(str) {
|
|
return new Set(str.trim().split(/\s+/));
|
|
}
|
|
function isSetEqual(a, b) {
|
|
if (a.size !== b.size) {
|
|
return false;
|
|
}
|
|
for (const s of a) {
|
|
if (!b.has(s)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function toStyleMap(str) {
|
|
const styleMap = /* @__PURE__ */ new Map();
|
|
for (const item of str.split(";")) {
|
|
let [key, value] = item.split(":");
|
|
key = key.trim();
|
|
value = value && value.trim();
|
|
if (key && value) {
|
|
styleMap.set(key, value);
|
|
}
|
|
}
|
|
return styleMap;
|
|
}
|
|
function isMapEqual(a, b) {
|
|
if (a.size !== b.size) {
|
|
return false;
|
|
}
|
|
for (const [key, value] of a) {
|
|
if (value !== b.get(key)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function resolveCssVars(instance, vnode, expectedMap) {
|
|
const root = instance.subTree;
|
|
if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {
|
|
const cssVars = instance.getCssVars();
|
|
for (const key in cssVars) {
|
|
const value = normalizeCssVarValue(cssVars[key]);
|
|
expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);
|
|
}
|
|
}
|
|
if (vnode === root && instance.parent) {
|
|
resolveCssVars(instance.parent, instance.vnode, expectedMap);
|
|
}
|
|
}
|
|
const allowMismatchAttr = "data-allow-mismatch";
|
|
const MismatchTypeString = {
|
|
[
|
|
0
|
|
/* TEXT */
|
|
]: "text",
|
|
[
|
|
1
|
|
/* CHILDREN */
|
|
]: "children",
|
|
[
|
|
2
|
|
/* CLASS */
|
|
]: "class",
|
|
[
|
|
3
|
|
/* STYLE */
|
|
]: "style",
|
|
[
|
|
4
|
|
/* ATTRIBUTE */
|
|
]: "attribute"
|
|
};
|
|
function isMismatchAllowed(el, allowedType) {
|
|
if (allowedType === 0 || allowedType === 1) {
|
|
while (el && !el.hasAttribute(allowMismatchAttr)) {
|
|
el = el.parentElement;
|
|
}
|
|
}
|
|
const allowedAttr = el && el.getAttribute(allowMismatchAttr);
|
|
if (allowedAttr == null) {
|
|
return false;
|
|
} else if (allowedAttr === "") {
|
|
return true;
|
|
} else {
|
|
const list = allowedAttr.split(",");
|
|
if (allowedType === 0 && list.includes("children")) {
|
|
return true;
|
|
}
|
|
return list.includes(MismatchTypeString[allowedType]);
|
|
}
|
|
}
|
|
const requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));
|
|
const cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));
|
|
const hydrateOnIdle = (timeout = 1e4) => (hydrate) => {
|
|
const id = requestIdleCallback(hydrate, { timeout });
|
|
return () => cancelIdleCallback(id);
|
|
};
|
|
function elementIsVisibleInViewport(el) {
|
|
const { top, left, bottom, right } = el.getBoundingClientRect();
|
|
const { innerHeight, innerWidth } = window;
|
|
return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);
|
|
}
|
|
const hydrateOnVisible = (opts) => (hydrate, forEach) => {
|
|
const ob = new IntersectionObserver((entries) => {
|
|
for (const e of entries) {
|
|
if (!e.isIntersecting) continue;
|
|
ob.disconnect();
|
|
hydrate();
|
|
break;
|
|
}
|
|
}, opts);
|
|
forEach((el) => {
|
|
if (!(el instanceof Element)) return;
|
|
if (elementIsVisibleInViewport(el)) {
|
|
hydrate();
|
|
ob.disconnect();
|
|
return false;
|
|
}
|
|
ob.observe(el);
|
|
});
|
|
return () => ob.disconnect();
|
|
};
|
|
const hydrateOnMediaQuery = (query) => (hydrate) => {
|
|
if (query) {
|
|
const mql = matchMedia(query);
|
|
if (mql.matches) {
|
|
hydrate();
|
|
} else {
|
|
mql.addEventListener("change", hydrate, { once: true });
|
|
return () => mql.removeEventListener("change", hydrate);
|
|
}
|
|
}
|
|
};
|
|
const hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {
|
|
if (isString(interactions)) interactions = [interactions];
|
|
let hasHydrated = false;
|
|
const doHydrate = (e) => {
|
|
if (!hasHydrated) {
|
|
hasHydrated = true;
|
|
teardown();
|
|
hydrate();
|
|
e.target.dispatchEvent(new e.constructor(e.type, e));
|
|
}
|
|
};
|
|
const teardown = () => {
|
|
forEach((el) => {
|
|
for (const i of interactions) {
|
|
el.removeEventListener(i, doHydrate);
|
|
}
|
|
});
|
|
};
|
|
forEach((el) => {
|
|
for (const i of interactions) {
|
|
el.addEventListener(i, doHydrate, { once: true });
|
|
}
|
|
});
|
|
return teardown;
|
|
};
|
|
function forEachElement(node, cb) {
|
|
if (isComment(node) && node.data === "[") {
|
|
let depth = 1;
|
|
let next = node.nextSibling;
|
|
while (next) {
|
|
if (next.nodeType === 1) {
|
|
const result = cb(next);
|
|
if (result === false) {
|
|
break;
|
|
}
|
|
} else if (isComment(next)) {
|
|
if (next.data === "]") {
|
|
if (--depth === 0) break;
|
|
} else if (next.data === "[") {
|
|
depth++;
|
|
}
|
|
}
|
|
next = next.nextSibling;
|
|
}
|
|
} else {
|
|
cb(node);
|
|
}
|
|
}
|
|
const isAsyncWrapper = (i) => !!i.type.__asyncLoader;
|
|
/*! #__NO_SIDE_EFFECTS__ */
|
|
// @__NO_SIDE_EFFECTS__
|
|
function defineAsyncComponent(source) {
|
|
if (isFunction(source)) {
|
|
source = { loader: source };
|
|
}
|
|
const {
|
|
loader,
|
|
loadingComponent,
|
|
errorComponent,
|
|
delay = 200,
|
|
hydrate: hydrateStrategy,
|
|
timeout,
|
|
// undefined = never times out
|
|
suspensible = true,
|
|
onError: userOnError
|
|
} = source;
|
|
let pendingRequest = null;
|
|
let resolvedComp;
|
|
let retries = 0;
|
|
const retry = () => {
|
|
retries++;
|
|
pendingRequest = null;
|
|
return load();
|
|
};
|
|
const load = () => {
|
|
let thisRequest;
|
|
return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {
|
|
err = err instanceof Error ? err : new Error(String(err));
|
|
if (userOnError) {
|
|
return new Promise((resolve2, reject) => {
|
|
const userRetry = () => resolve2(retry());
|
|
const userFail = () => reject(err);
|
|
userOnError(err, userRetry, userFail, retries + 1);
|
|
});
|
|
} else {
|
|
throw err;
|
|
}
|
|
}).then((comp) => {
|
|
if (thisRequest !== pendingRequest && pendingRequest) {
|
|
return pendingRequest;
|
|
}
|
|
if (!comp) {
|
|
warn$1(
|
|
`Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`
|
|
);
|
|
}
|
|
if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) {
|
|
comp = comp.default;
|
|
}
|
|
if (comp && !isObject(comp) && !isFunction(comp)) {
|
|
throw new Error(`Invalid async component load result: ${comp}`);
|
|
}
|
|
resolvedComp = comp;
|
|
return comp;
|
|
}));
|
|
};
|
|
return /* @__PURE__ */ defineComponent({
|
|
name: "AsyncComponentWrapper",
|
|
__asyncLoader: load,
|
|
__asyncHydrate(el, instance, hydrate) {
|
|
let patched = false;
|
|
(instance.bu || (instance.bu = [])).push(() => patched = true);
|
|
const performHydrate = () => {
|
|
if (patched) {
|
|
if (true) {
|
|
warn$1(
|
|
`Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`
|
|
);
|
|
}
|
|
return;
|
|
}
|
|
hydrate();
|
|
};
|
|
const doHydrate = hydrateStrategy ? () => {
|
|
const teardown = hydrateStrategy(
|
|
performHydrate,
|
|
(cb) => forEachElement(el, cb)
|
|
);
|
|
if (teardown) {
|
|
(instance.bum || (instance.bum = [])).push(teardown);
|
|
}
|
|
} : performHydrate;
|
|
if (resolvedComp) {
|
|
doHydrate();
|
|
} else {
|
|
load().then(() => !instance.isUnmounted && doHydrate());
|
|
}
|
|
},
|
|
get __asyncResolved() {
|
|
return resolvedComp;
|
|
},
|
|
setup() {
|
|
const instance = currentInstance;
|
|
markAsyncBoundary(instance);
|
|
if (resolvedComp) {
|
|
return () => createInnerComp(resolvedComp, instance);
|
|
}
|
|
const onError = (err) => {
|
|
pendingRequest = null;
|
|
handleError(
|
|
err,
|
|
instance,
|
|
13,
|
|
!errorComponent
|
|
);
|
|
};
|
|
if (suspensible && instance.suspense || isInSSRComponentSetup) {
|
|
return load().then((comp) => {
|
|
return () => createInnerComp(comp, instance);
|
|
}).catch((err) => {
|
|
onError(err);
|
|
return () => errorComponent ? createVNode(errorComponent, {
|
|
error: err
|
|
}) : null;
|
|
});
|
|
}
|
|
const loaded = ref(false);
|
|
const error = ref();
|
|
const delayed = ref(!!delay);
|
|
if (delay) {
|
|
setTimeout(() => {
|
|
delayed.value = false;
|
|
}, delay);
|
|
}
|
|
if (timeout != null) {
|
|
setTimeout(() => {
|
|
if (!loaded.value && !error.value) {
|
|
const err = new Error(
|
|
`Async component timed out after ${timeout}ms.`
|
|
);
|
|
onError(err);
|
|
error.value = err;
|
|
}
|
|
}, timeout);
|
|
}
|
|
load().then(() => {
|
|
loaded.value = true;
|
|
if (instance.parent && isKeepAlive(instance.parent.vnode)) {
|
|
instance.parent.update();
|
|
}
|
|
}).catch((err) => {
|
|
onError(err);
|
|
error.value = err;
|
|
});
|
|
return () => {
|
|
if (loaded.value && resolvedComp) {
|
|
return createInnerComp(resolvedComp, instance);
|
|
} else if (error.value && errorComponent) {
|
|
return createVNode(errorComponent, {
|
|
error: error.value
|
|
});
|
|
} else if (loadingComponent && !delayed.value) {
|
|
return createVNode(loadingComponent);
|
|
}
|
|
};
|
|
}
|
|
});
|
|
}
|
|
function createInnerComp(comp, parent) {
|
|
const { ref: ref22, props, children, ce } = parent.vnode;
|
|
const vnode = createVNode(comp, props, children);
|
|
vnode.ref = ref22;
|
|
vnode.ce = ce;
|
|
delete parent.vnode.ce;
|
|
return vnode;
|
|
}
|
|
const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
|
|
const KeepAliveImpl = {
|
|
name: `KeepAlive`,
|
|
// Marker for special handling inside the renderer. We are not using a ===
|
|
// check directly on KeepAlive in the renderer, because importing it directly
|
|
// would prevent it from being tree-shaken.
|
|
__isKeepAlive: true,
|
|
props: {
|
|
include: [String, RegExp, Array],
|
|
exclude: [String, RegExp, Array],
|
|
max: [String, Number]
|
|
},
|
|
setup(props, { slots }) {
|
|
const instance = getCurrentInstance();
|
|
const sharedContext = instance.ctx;
|
|
if (!sharedContext.renderer) {
|
|
return () => {
|
|
const children = slots.default && slots.default();
|
|
return children && children.length === 1 ? children[0] : children;
|
|
};
|
|
}
|
|
const cache = /* @__PURE__ */ new Map();
|
|
const keys = /* @__PURE__ */ new Set();
|
|
let current = null;
|
|
if (true) {
|
|
instance.__v_cache = cache;
|
|
}
|
|
const parentSuspense = instance.suspense;
|
|
const {
|
|
renderer: {
|
|
p: patch,
|
|
m: move,
|
|
um: _unmount,
|
|
o: { createElement }
|
|
}
|
|
} = sharedContext;
|
|
const storageContainer = createElement("div");
|
|
sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {
|
|
const instance2 = vnode.component;
|
|
move(vnode, container, anchor, 0, parentSuspense);
|
|
patch(
|
|
instance2.vnode,
|
|
vnode,
|
|
container,
|
|
anchor,
|
|
instance2,
|
|
parentSuspense,
|
|
namespace,
|
|
vnode.slotScopeIds,
|
|
optimized
|
|
);
|
|
queuePostRenderEffect(() => {
|
|
instance2.isDeactivated = false;
|
|
if (instance2.a) {
|
|
invokeArrayFns(instance2.a);
|
|
}
|
|
const vnodeHook = vnode.props && vnode.props.onVnodeMounted;
|
|
if (vnodeHook) {
|
|
invokeVNodeHook(vnodeHook, instance2.parent, vnode);
|
|
}
|
|
}, parentSuspense);
|
|
if (true) {
|
|
devtoolsComponentAdded(instance2);
|
|
}
|
|
};
|
|
sharedContext.deactivate = (vnode) => {
|
|
const instance2 = vnode.component;
|
|
invalidateMount(instance2.m);
|
|
invalidateMount(instance2.a);
|
|
move(vnode, storageContainer, null, 1, parentSuspense);
|
|
queuePostRenderEffect(() => {
|
|
if (instance2.da) {
|
|
invokeArrayFns(instance2.da);
|
|
}
|
|
const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;
|
|
if (vnodeHook) {
|
|
invokeVNodeHook(vnodeHook, instance2.parent, vnode);
|
|
}
|
|
instance2.isDeactivated = true;
|
|
}, parentSuspense);
|
|
if (true) {
|
|
devtoolsComponentAdded(instance2);
|
|
}
|
|
if (true) {
|
|
instance2.__keepAliveStorageContainer = storageContainer;
|
|
}
|
|
};
|
|
function unmount(vnode) {
|
|
resetShapeFlag(vnode);
|
|
_unmount(vnode, instance, parentSuspense, true);
|
|
}
|
|
function pruneCache(filter) {
|
|
cache.forEach((vnode, key) => {
|
|
const name = getComponentName(vnode.type);
|
|
if (name && !filter(name)) {
|
|
pruneCacheEntry(key);
|
|
}
|
|
});
|
|
}
|
|
function pruneCacheEntry(key) {
|
|
const cached = cache.get(key);
|
|
if (cached && (!current || !isSameVNodeType(cached, current))) {
|
|
unmount(cached);
|
|
} else if (current) {
|
|
resetShapeFlag(current);
|
|
}
|
|
cache.delete(key);
|
|
keys.delete(key);
|
|
}
|
|
watch(
|
|
() => [props.include, props.exclude],
|
|
([include, exclude]) => {
|
|
include && pruneCache((name) => matches(include, name));
|
|
exclude && pruneCache((name) => !matches(exclude, name));
|
|
},
|
|
// prune post-render after `current` has been updated
|
|
{ flush: "post", deep: true }
|
|
);
|
|
let pendingCacheKey = null;
|
|
const cacheSubtree = () => {
|
|
if (pendingCacheKey != null) {
|
|
if (isSuspense(instance.subTree.type)) {
|
|
queuePostRenderEffect(() => {
|
|
cache.set(pendingCacheKey, getInnerChild(instance.subTree));
|
|
}, instance.subTree.suspense);
|
|
} else {
|
|
cache.set(pendingCacheKey, getInnerChild(instance.subTree));
|
|
}
|
|
}
|
|
};
|
|
onMounted(cacheSubtree);
|
|
onUpdated(cacheSubtree);
|
|
onBeforeUnmount(() => {
|
|
cache.forEach((cached) => {
|
|
const { subTree, suspense } = instance;
|
|
const vnode = getInnerChild(subTree);
|
|
if (cached.type === vnode.type && cached.key === vnode.key) {
|
|
resetShapeFlag(vnode);
|
|
const da = vnode.component.da;
|
|
da && queuePostRenderEffect(da, suspense);
|
|
return;
|
|
}
|
|
unmount(cached);
|
|
});
|
|
});
|
|
return () => {
|
|
pendingCacheKey = null;
|
|
if (!slots.default) {
|
|
return current = null;
|
|
}
|
|
const children = slots.default();
|
|
const rawVNode = children[0];
|
|
if (children.length > 1) {
|
|
if (true) {
|
|
warn$1(`KeepAlive should contain exactly one component child.`);
|
|
}
|
|
current = null;
|
|
return children;
|
|
} else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {
|
|
current = null;
|
|
return rawVNode;
|
|
}
|
|
let vnode = getInnerChild(rawVNode);
|
|
if (vnode.type === Comment) {
|
|
current = null;
|
|
return vnode;
|
|
}
|
|
const comp = vnode.type;
|
|
const name = getComponentName(
|
|
isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp
|
|
);
|
|
const { include, exclude, max } = props;
|
|
if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {
|
|
vnode.shapeFlag &= -257;
|
|
current = vnode;
|
|
return rawVNode;
|
|
}
|
|
const key = vnode.key == null ? comp : vnode.key;
|
|
const cachedVNode = cache.get(key);
|
|
if (vnode.el) {
|
|
vnode = cloneVNode(vnode);
|
|
if (rawVNode.shapeFlag & 128) {
|
|
rawVNode.ssContent = vnode;
|
|
}
|
|
}
|
|
pendingCacheKey = key;
|
|
if (cachedVNode) {
|
|
vnode.el = cachedVNode.el;
|
|
vnode.component = cachedVNode.component;
|
|
if (vnode.transition) {
|
|
setTransitionHooks(vnode, vnode.transition);
|
|
}
|
|
vnode.shapeFlag |= 512;
|
|
keys.delete(key);
|
|
keys.add(key);
|
|
} else {
|
|
keys.add(key);
|
|
if (max && keys.size > parseInt(max, 10)) {
|
|
pruneCacheEntry(keys.values().next().value);
|
|
}
|
|
}
|
|
vnode.shapeFlag |= 256;
|
|
current = vnode;
|
|
return isSuspense(rawVNode.type) ? rawVNode : vnode;
|
|
};
|
|
}
|
|
};
|
|
const KeepAlive = KeepAliveImpl;
|
|
function matches(pattern, name) {
|
|
if (isArray(pattern)) {
|
|
return pattern.some((p) => matches(p, name));
|
|
} else if (isString(pattern)) {
|
|
return pattern.split(",").includes(name);
|
|
} else if (isRegExp(pattern)) {
|
|
pattern.lastIndex = 0;
|
|
return pattern.test(name);
|
|
}
|
|
return false;
|
|
}
|
|
function onActivated(hook, target) {
|
|
registerKeepAliveHook(hook, "a", target);
|
|
}
|
|
function onDeactivated(hook, target) {
|
|
registerKeepAliveHook(hook, "da", target);
|
|
}
|
|
function registerKeepAliveHook(hook, type, target = currentInstance) {
|
|
const wrappedHook = hook.__wdc || (hook.__wdc = () => {
|
|
let current = target;
|
|
while (current) {
|
|
if (current.isDeactivated) {
|
|
return;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
return hook();
|
|
});
|
|
injectHook(type, wrappedHook, target);
|
|
if (target) {
|
|
let current = target.parent;
|
|
while (current && current.parent) {
|
|
if (isKeepAlive(current.parent.vnode)) {
|
|
injectToKeepAliveRoot(wrappedHook, type, target, current);
|
|
}
|
|
current = current.parent;
|
|
}
|
|
}
|
|
}
|
|
function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
|
|
const injected = injectHook(
|
|
type,
|
|
hook,
|
|
keepAliveRoot,
|
|
true
|
|
/* prepend */
|
|
);
|
|
onUnmounted(() => {
|
|
remove(keepAliveRoot[type], injected);
|
|
}, target);
|
|
}
|
|
function resetShapeFlag(vnode) {
|
|
vnode.shapeFlag &= -257;
|
|
vnode.shapeFlag &= -513;
|
|
}
|
|
function getInnerChild(vnode) {
|
|
return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;
|
|
}
|
|
function injectHook(type, hook, target = currentInstance, prepend = false) {
|
|
if (target) {
|
|
const hooks = target[type] || (target[type] = []);
|
|
const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
|
|
pauseTracking();
|
|
const reset = setCurrentInstance(target);
|
|
const res = callWithAsyncErrorHandling(hook, target, type, args);
|
|
reset();
|
|
resetTracking();
|
|
return res;
|
|
});
|
|
if (prepend) {
|
|
hooks.unshift(wrappedHook);
|
|
} else {
|
|
hooks.push(wrappedHook);
|
|
}
|
|
return wrappedHook;
|
|
} else if (true) {
|
|
const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, ""));
|
|
warn$1(
|
|
`${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`
|
|
);
|
|
}
|
|
}
|
|
const createHook = (lifecycle) => (hook, target = currentInstance) => {
|
|
if (!isInSSRComponentSetup || lifecycle === "sp") {
|
|
injectHook(lifecycle, (...args) => hook(...args), target);
|
|
}
|
|
};
|
|
const onBeforeMount = createHook("bm");
|
|
const onMounted = createHook("m");
|
|
const onBeforeUpdate = createHook(
|
|
"bu"
|
|
);
|
|
const onUpdated = createHook("u");
|
|
const onBeforeUnmount = createHook(
|
|
"bum"
|
|
);
|
|
const onUnmounted = createHook("um");
|
|
const onServerPrefetch = createHook(
|
|
"sp"
|
|
);
|
|
const onRenderTriggered = createHook("rtg");
|
|
const onRenderTracked = createHook("rtc");
|
|
function onErrorCaptured(hook, target = currentInstance) {
|
|
injectHook("ec", hook, target);
|
|
}
|
|
const COMPONENTS = "components";
|
|
const DIRECTIVES = "directives";
|
|
function resolveComponent(name, maybeSelfReference) {
|
|
return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;
|
|
}
|
|
const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc");
|
|
function resolveDynamicComponent(component) {
|
|
if (isString(component)) {
|
|
return resolveAsset(COMPONENTS, component, false) || component;
|
|
} else {
|
|
return component || NULL_DYNAMIC_COMPONENT;
|
|
}
|
|
}
|
|
function resolveDirective(name) {
|
|
return resolveAsset(DIRECTIVES, name);
|
|
}
|
|
function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {
|
|
const instance = currentRenderingInstance || currentInstance;
|
|
if (instance) {
|
|
const Component = instance.type;
|
|
if (type === COMPONENTS) {
|
|
const selfName = getComponentName(
|
|
Component,
|
|
false
|
|
);
|
|
if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {
|
|
return Component;
|
|
}
|
|
}
|
|
const res = (
|
|
// local registration
|
|
// check instance[type] first which is resolved for options API
|
|
resolve(instance[type] || Component[type], name) || // global registration
|
|
resolve(instance.appContext[type], name)
|
|
);
|
|
if (!res && maybeSelfReference) {
|
|
return Component;
|
|
}
|
|
if (warnMissing && !res) {
|
|
const extra = type === COMPONENTS ? `
|
|
If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;
|
|
warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);
|
|
}
|
|
return res;
|
|
} else if (true) {
|
|
warn$1(
|
|
`resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`
|
|
);
|
|
}
|
|
}
|
|
function resolve(registry, name) {
|
|
return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);
|
|
}
|
|
function renderList(source, renderItem, cache, index) {
|
|
let ret;
|
|
const cached = cache && cache[index];
|
|
const sourceIsArray = isArray(source);
|
|
if (sourceIsArray || isString(source)) {
|
|
const sourceIsReactiveArray = sourceIsArray && isReactive(source);
|
|
let needsWrap = false;
|
|
let isReadonlySource = false;
|
|
if (sourceIsReactiveArray) {
|
|
needsWrap = !isShallow(source);
|
|
isReadonlySource = isReadonly(source);
|
|
source = shallowReadArray(source);
|
|
}
|
|
ret = new Array(source.length);
|
|
for (let i = 0, l = source.length; i < l; i++) {
|
|
ret[i] = renderItem(
|
|
needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],
|
|
i,
|
|
void 0,
|
|
cached && cached[i]
|
|
);
|
|
}
|
|
} else if (typeof source === "number") {
|
|
if (!Number.isInteger(source)) {
|
|
warn$1(`The v-for range expect an integer value but got ${source}.`);
|
|
}
|
|
ret = new Array(source);
|
|
for (let i = 0; i < source; i++) {
|
|
ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);
|
|
}
|
|
} else if (isObject(source)) {
|
|
if (source[Symbol.iterator]) {
|
|
ret = Array.from(
|
|
source,
|
|
(item, i) => renderItem(item, i, void 0, cached && cached[i])
|
|
);
|
|
} else {
|
|
const keys = Object.keys(source);
|
|
ret = new Array(keys.length);
|
|
for (let i = 0, l = keys.length; i < l; i++) {
|
|
const key = keys[i];
|
|
ret[i] = renderItem(source[key], key, i, cached && cached[i]);
|
|
}
|
|
}
|
|
} else {
|
|
ret = [];
|
|
}
|
|
if (cache) {
|
|
cache[index] = ret;
|
|
}
|
|
return ret;
|
|
}
|
|
function createSlots(slots, dynamicSlots) {
|
|
for (let i = 0; i < dynamicSlots.length; i++) {
|
|
const slot = dynamicSlots[i];
|
|
if (isArray(slot)) {
|
|
for (let j = 0; j < slot.length; j++) {
|
|
slots[slot[j].name] = slot[j].fn;
|
|
}
|
|
} else if (slot) {
|
|
slots[slot.name] = slot.key ? (...args) => {
|
|
const res = slot.fn(...args);
|
|
if (res) res.key = slot.key;
|
|
return res;
|
|
} : slot.fn;
|
|
}
|
|
}
|
|
return slots;
|
|
}
|
|
function renderSlot(slots, name, props = {}, fallback, noSlotted) {
|
|
if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {
|
|
if (name !== "default") props.name = name;
|
|
return openBlock(), createBlock(
|
|
Fragment,
|
|
null,
|
|
[createVNode("slot", props, fallback && fallback())],
|
|
64
|
|
);
|
|
}
|
|
let slot = slots[name];
|
|
if (slot && slot.length > 1) {
|
|
warn$1(
|
|
`SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`
|
|
);
|
|
slot = () => [];
|
|
}
|
|
if (slot && slot._c) {
|
|
slot._d = false;
|
|
}
|
|
openBlock();
|
|
const validSlotContent = slot && ensureValidVNode(slot(props));
|
|
const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch
|
|
// key attached in the `createSlots` helper, respect that
|
|
validSlotContent && validSlotContent.key;
|
|
const rendered = createBlock(
|
|
Fragment,
|
|
{
|
|
key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content
|
|
(!validSlotContent && fallback ? "_fb" : "")
|
|
},
|
|
validSlotContent || (fallback ? fallback() : []),
|
|
validSlotContent && slots._ === 1 ? 64 : -2
|
|
);
|
|
if (!noSlotted && rendered.scopeId) {
|
|
rendered.slotScopeIds = [rendered.scopeId + "-s"];
|
|
}
|
|
if (slot && slot._c) {
|
|
slot._d = true;
|
|
}
|
|
return rendered;
|
|
}
|
|
function ensureValidVNode(vnodes) {
|
|
return vnodes.some((child) => {
|
|
if (!isVNode(child)) return true;
|
|
if (child.type === Comment) return false;
|
|
if (child.type === Fragment && !ensureValidVNode(child.children))
|
|
return false;
|
|
return true;
|
|
}) ? vnodes : null;
|
|
}
|
|
function toHandlers(obj, preserveCaseIfNecessary) {
|
|
const ret = {};
|
|
if (!isObject(obj)) {
|
|
warn$1(`v-on with no argument expects an object value.`);
|
|
return ret;
|
|
}
|
|
for (const key in obj) {
|
|
ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];
|
|
}
|
|
return ret;
|
|
}
|
|
const getPublicInstance = (i) => {
|
|
if (!i) return null;
|
|
if (isStatefulComponent(i)) return getComponentPublicInstance(i);
|
|
return getPublicInstance(i.parent);
|
|
};
|
|
const publicPropertiesMap = (
|
|
// Move PURE marker to new line to workaround compiler discarding it
|
|
// due to type annotation
|
|
/* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {
|
|
$: (i) => i,
|
|
$el: (i) => i.vnode.el,
|
|
$data: (i) => i.data,
|
|
$props: (i) => true ? shallowReadonly(i.props) : i.props,
|
|
$attrs: (i) => true ? shallowReadonly(i.attrs) : i.attrs,
|
|
$slots: (i) => true ? shallowReadonly(i.slots) : i.slots,
|
|
$refs: (i) => true ? shallowReadonly(i.refs) : i.refs,
|
|
$parent: (i) => getPublicInstance(i.parent),
|
|
$root: (i) => getPublicInstance(i.root),
|
|
$host: (i) => i.ce,
|
|
$emit: (i) => i.emit,
|
|
$options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,
|
|
$forceUpdate: (i) => i.f || (i.f = () => {
|
|
queueJob(i.update);
|
|
}),
|
|
$nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
|
|
$watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP
|
|
})
|
|
);
|
|
const isReservedPrefix = (key) => key === "_" || key === "$";
|
|
const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
|
|
const PublicInstanceProxyHandlers = {
|
|
get({ _: instance }, key) {
|
|
if (key === "__v_skip") {
|
|
return true;
|
|
}
|
|
const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
|
|
if (key === "__isVue") {
|
|
return true;
|
|
}
|
|
let normalizedProps;
|
|
if (key[0] !== "$") {
|
|
const n = accessCache[key];
|
|
if (n !== void 0) {
|
|
switch (n) {
|
|
case 1:
|
|
return setupState[key];
|
|
case 2:
|
|
return data[key];
|
|
case 4:
|
|
return ctx[key];
|
|
case 3:
|
|
return props[key];
|
|
}
|
|
} else if (hasSetupBinding(setupState, key)) {
|
|
accessCache[key] = 1;
|
|
return setupState[key];
|
|
} else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
|
|
accessCache[key] = 2;
|
|
return data[key];
|
|
} else if (
|
|
// only cache other properties when instance has declared (thus stable)
|
|
// props
|
|
(normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)
|
|
) {
|
|
accessCache[key] = 3;
|
|
return props[key];
|
|
} else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
|
|
accessCache[key] = 4;
|
|
return ctx[key];
|
|
} else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {
|
|
accessCache[key] = 0;
|
|
}
|
|
}
|
|
const publicGetter = publicPropertiesMap[key];
|
|
let cssModule, globalProperties;
|
|
if (publicGetter) {
|
|
if (key === "$attrs") {
|
|
track(instance.attrs, "get", "");
|
|
markAttrsAccessed();
|
|
} else if (key === "$slots") {
|
|
track(instance, "get", key);
|
|
}
|
|
return publicGetter(instance);
|
|
} else if (
|
|
// css module (injected by vue-loader)
|
|
(cssModule = type.__cssModules) && (cssModule = cssModule[key])
|
|
) {
|
|
return cssModule;
|
|
} else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
|
|
accessCache[key] = 4;
|
|
return ctx[key];
|
|
} else if (
|
|
// global properties
|
|
globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)
|
|
) {
|
|
{
|
|
return globalProperties[key];
|
|
}
|
|
} else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading
|
|
// to infinite warning loop
|
|
key.indexOf("__v") !== 0)) {
|
|
if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {
|
|
warn$1(
|
|
`Property ${JSON.stringify(
|
|
key
|
|
)} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`
|
|
);
|
|
} else if (instance === currentRenderingInstance) {
|
|
warn$1(
|
|
`Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`
|
|
);
|
|
}
|
|
}
|
|
},
|
|
set({ _: instance }, key, value) {
|
|
const { data, setupState, ctx } = instance;
|
|
if (hasSetupBinding(setupState, key)) {
|
|
setupState[key] = value;
|
|
return true;
|
|
} else if (setupState.__isScriptSetup && hasOwn(setupState, key)) {
|
|
warn$1(`Cannot mutate <script setup> binding "${key}" from Options API.`);
|
|
return false;
|
|
} else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
|
|
data[key] = value;
|
|
return true;
|
|
} else if (hasOwn(instance.props, key)) {
|
|
warn$1(`Attempting to mutate prop "${key}". Props are readonly.`);
|
|
return false;
|
|
}
|
|
if (key[0] === "$" && key.slice(1) in instance) {
|
|
warn$1(
|
|
`Attempting to mutate public property "${key}". Properties starting with $ are reserved and readonly.`
|
|
);
|
|
return false;
|
|
} else {
|
|
if (key in instance.appContext.config.globalProperties) {
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
value
|
|
});
|
|
} else {
|
|
ctx[key] = value;
|
|
}
|
|
}
|
|
return true;
|
|
},
|
|
has({
|
|
_: { data, setupState, accessCache, ctx, appContext, propsOptions, type }
|
|
}, key) {
|
|
let normalizedProps, cssModules;
|
|
return !!(accessCache[key] || data !== EMPTY_OBJ && key[0] !== "$" && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key) || (cssModules = type.__cssModules) && cssModules[key]);
|
|
},
|
|
defineProperty(target, key, descriptor) {
|
|
if (descriptor.get != null) {
|
|
target._.accessCache[key] = 0;
|
|
} else if (hasOwn(descriptor, "value")) {
|
|
this.set(target, key, descriptor.value, null);
|
|
}
|
|
return Reflect.defineProperty(target, key, descriptor);
|
|
}
|
|
};
|
|
if (true) {
|
|
PublicInstanceProxyHandlers.ownKeys = (target) => {
|
|
warn$1(
|
|
`Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`
|
|
);
|
|
return Reflect.ownKeys(target);
|
|
};
|
|
}
|
|
const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend({}, PublicInstanceProxyHandlers, {
|
|
get(target, key) {
|
|
if (key === Symbol.unscopables) {
|
|
return;
|
|
}
|
|
return PublicInstanceProxyHandlers.get(target, key, target);
|
|
},
|
|
has(_, key) {
|
|
const has = key[0] !== "_" && !isGloballyAllowed(key);
|
|
if (!has && PublicInstanceProxyHandlers.has(_, key)) {
|
|
warn$1(
|
|
`Property ${JSON.stringify(
|
|
key
|
|
)} should not start with _ which is a reserved prefix for Vue internals.`
|
|
);
|
|
}
|
|
return has;
|
|
}
|
|
});
|
|
function createDevRenderContext(instance) {
|
|
const target = {};
|
|
Object.defineProperty(target, `_`, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
get: () => instance
|
|
});
|
|
Object.keys(publicPropertiesMap).forEach((key) => {
|
|
Object.defineProperty(target, key, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
get: () => publicPropertiesMap[key](instance),
|
|
// intercepted by the proxy so no need for implementation,
|
|
// but needed to prevent set errors
|
|
set: NOOP
|
|
});
|
|
});
|
|
return target;
|
|
}
|
|
function exposePropsOnRenderContext(instance) {
|
|
const {
|
|
ctx,
|
|
propsOptions: [propsOptions]
|
|
} = instance;
|
|
if (propsOptions) {
|
|
Object.keys(propsOptions).forEach((key) => {
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: () => instance.props[key],
|
|
set: NOOP
|
|
});
|
|
});
|
|
}
|
|
}
|
|
function exposeSetupStateOnRenderContext(instance) {
|
|
const { ctx, setupState } = instance;
|
|
Object.keys(toRaw(setupState)).forEach((key) => {
|
|
if (!setupState.__isScriptSetup) {
|
|
if (isReservedPrefix(key[0])) {
|
|
warn$1(
|
|
`setup() return property ${JSON.stringify(
|
|
key
|
|
)} should not start with "$" or "_" which are reserved prefixes for Vue internals.`
|
|
);
|
|
return;
|
|
}
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: () => setupState[key],
|
|
set: NOOP
|
|
});
|
|
}
|
|
});
|
|
}
|
|
const warnRuntimeUsage = (method) => warn$1(
|
|
`${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`
|
|
);
|
|
function defineProps() {
|
|
if (true) {
|
|
warnRuntimeUsage(`defineProps`);
|
|
}
|
|
return null;
|
|
}
|
|
function defineEmits() {
|
|
if (true) {
|
|
warnRuntimeUsage(`defineEmits`);
|
|
}
|
|
return null;
|
|
}
|
|
function defineExpose(exposed) {
|
|
if (true) {
|
|
warnRuntimeUsage(`defineExpose`);
|
|
}
|
|
}
|
|
function defineOptions(options) {
|
|
if (true) {
|
|
warnRuntimeUsage(`defineOptions`);
|
|
}
|
|
}
|
|
function defineSlots() {
|
|
if (true) {
|
|
warnRuntimeUsage(`defineSlots`);
|
|
}
|
|
return null;
|
|
}
|
|
function defineModel() {
|
|
if (true) {
|
|
warnRuntimeUsage("defineModel");
|
|
}
|
|
}
|
|
function withDefaults(props, defaults) {
|
|
if (true) {
|
|
warnRuntimeUsage(`withDefaults`);
|
|
}
|
|
return null;
|
|
}
|
|
function useSlots() {
|
|
return getContext("useSlots").slots;
|
|
}
|
|
function useAttrs() {
|
|
return getContext("useAttrs").attrs;
|
|
}
|
|
function getContext(calledFunctionName) {
|
|
const i = getCurrentInstance();
|
|
if (!i) {
|
|
warn$1(`${calledFunctionName}() called without active instance.`);
|
|
}
|
|
return i.setupContext || (i.setupContext = createSetupContext(i));
|
|
}
|
|
function normalizePropsOrEmits(props) {
|
|
return isArray(props) ? props.reduce(
|
|
(normalized, p) => (normalized[p] = null, normalized),
|
|
{}
|
|
) : props;
|
|
}
|
|
function mergeDefaults(raw, defaults) {
|
|
const props = normalizePropsOrEmits(raw);
|
|
for (const key in defaults) {
|
|
if (key.startsWith("__skip")) continue;
|
|
let opt = props[key];
|
|
if (opt) {
|
|
if (isArray(opt) || isFunction(opt)) {
|
|
opt = props[key] = { type: opt, default: defaults[key] };
|
|
} else {
|
|
opt.default = defaults[key];
|
|
}
|
|
} else if (opt === null) {
|
|
opt = props[key] = { default: defaults[key] };
|
|
} else if (true) {
|
|
warn$1(`props default key "${key}" has no corresponding declaration.`);
|
|
}
|
|
if (opt && defaults[`__skip_${key}`]) {
|
|
opt.skipFactory = true;
|
|
}
|
|
}
|
|
return props;
|
|
}
|
|
function mergeModels(a, b) {
|
|
if (!a || !b) return a || b;
|
|
if (isArray(a) && isArray(b)) return a.concat(b);
|
|
return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));
|
|
}
|
|
function createPropsRestProxy(props, excludedKeys) {
|
|
const ret = {};
|
|
for (const key in props) {
|
|
if (!excludedKeys.includes(key)) {
|
|
Object.defineProperty(ret, key, {
|
|
enumerable: true,
|
|
get: () => props[key]
|
|
});
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
function withAsyncContext(getAwaitable) {
|
|
const ctx = getCurrentInstance();
|
|
if (!ctx) {
|
|
warn$1(
|
|
`withAsyncContext called without active current instance. This is likely a bug.`
|
|
);
|
|
}
|
|
let awaitable = getAwaitable();
|
|
unsetCurrentInstance();
|
|
if (isPromise(awaitable)) {
|
|
awaitable = awaitable.catch((e) => {
|
|
setCurrentInstance(ctx);
|
|
throw e;
|
|
});
|
|
}
|
|
return [awaitable, () => setCurrentInstance(ctx)];
|
|
}
|
|
function createDuplicateChecker() {
|
|
const cache = /* @__PURE__ */ Object.create(null);
|
|
return (type, key) => {
|
|
if (cache[key]) {
|
|
warn$1(`${type} property "${key}" is already defined in ${cache[key]}.`);
|
|
} else {
|
|
cache[key] = type;
|
|
}
|
|
};
|
|
}
|
|
let shouldCacheAccess = true;
|
|
function applyOptions(instance) {
|
|
const options = resolveMergedOptions(instance);
|
|
const publicThis = instance.proxy;
|
|
const ctx = instance.ctx;
|
|
shouldCacheAccess = false;
|
|
if (options.beforeCreate) {
|
|
callHook(options.beforeCreate, instance, "bc");
|
|
}
|
|
const {
|
|
// state
|
|
data: dataOptions,
|
|
computed: computedOptions,
|
|
methods,
|
|
watch: watchOptions,
|
|
provide: provideOptions,
|
|
inject: injectOptions,
|
|
// lifecycle
|
|
created,
|
|
beforeMount,
|
|
mounted,
|
|
beforeUpdate,
|
|
updated,
|
|
activated,
|
|
deactivated,
|
|
beforeDestroy,
|
|
beforeUnmount,
|
|
destroyed,
|
|
unmounted,
|
|
render,
|
|
renderTracked,
|
|
renderTriggered,
|
|
errorCaptured,
|
|
serverPrefetch,
|
|
// public API
|
|
expose,
|
|
inheritAttrs,
|
|
// assets
|
|
components,
|
|
directives,
|
|
filters
|
|
} = options;
|
|
const checkDuplicateProperties = true ? createDuplicateChecker() : null;
|
|
if (true) {
|
|
const [propsOptions] = instance.propsOptions;
|
|
if (propsOptions) {
|
|
for (const key in propsOptions) {
|
|
checkDuplicateProperties("Props", key);
|
|
}
|
|
}
|
|
}
|
|
if (injectOptions) {
|
|
resolveInjections(injectOptions, ctx, checkDuplicateProperties);
|
|
}
|
|
if (methods) {
|
|
for (const key in methods) {
|
|
const methodHandler = methods[key];
|
|
if (isFunction(methodHandler)) {
|
|
if (true) {
|
|
Object.defineProperty(ctx, key, {
|
|
value: methodHandler.bind(publicThis),
|
|
configurable: true,
|
|
enumerable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
ctx[key] = methodHandler.bind(publicThis);
|
|
}
|
|
if (true) {
|
|
checkDuplicateProperties("Methods", key);
|
|
}
|
|
} else if (true) {
|
|
warn$1(
|
|
`Method "${key}" has type "${typeof methodHandler}" in the component definition. Did you reference the function correctly?`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
if (dataOptions) {
|
|
if (!isFunction(dataOptions)) {
|
|
warn$1(
|
|
`The data option must be a function. Plain object usage is no longer supported.`
|
|
);
|
|
}
|
|
const data = dataOptions.call(publicThis, publicThis);
|
|
if (isPromise(data)) {
|
|
warn$1(
|
|
`data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`
|
|
);
|
|
}
|
|
if (!isObject(data)) {
|
|
warn$1(`data() should return an object.`);
|
|
} else {
|
|
instance.data = reactive(data);
|
|
if (true) {
|
|
for (const key in data) {
|
|
checkDuplicateProperties("Data", key);
|
|
if (!isReservedPrefix(key[0])) {
|
|
Object.defineProperty(ctx, key, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
get: () => data[key],
|
|
set: NOOP
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
shouldCacheAccess = true;
|
|
if (computedOptions) {
|
|
for (const key in computedOptions) {
|
|
const opt = computedOptions[key];
|
|
const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;
|
|
if (get === NOOP) {
|
|
warn$1(`Computed property "${key}" has no getter.`);
|
|
}
|
|
const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : true ? () => {
|
|
warn$1(
|
|
`Write operation failed: computed property "${key}" is readonly.`
|
|
);
|
|
} : NOOP;
|
|
const c = computed({
|
|
get,
|
|
set
|
|
});
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: () => c.value,
|
|
set: (v) => c.value = v
|
|
});
|
|
if (true) {
|
|
checkDuplicateProperties("Computed", key);
|
|
}
|
|
}
|
|
}
|
|
if (watchOptions) {
|
|
for (const key in watchOptions) {
|
|
createWatcher(watchOptions[key], ctx, publicThis, key);
|
|
}
|
|
}
|
|
if (provideOptions) {
|
|
const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;
|
|
Reflect.ownKeys(provides).forEach((key) => {
|
|
provide(key, provides[key]);
|
|
});
|
|
}
|
|
if (created) {
|
|
callHook(created, instance, "c");
|
|
}
|
|
function registerLifecycleHook(register, hook) {
|
|
if (isArray(hook)) {
|
|
hook.forEach((_hook) => register(_hook.bind(publicThis)));
|
|
} else if (hook) {
|
|
register(hook.bind(publicThis));
|
|
}
|
|
}
|
|
registerLifecycleHook(onBeforeMount, beforeMount);
|
|
registerLifecycleHook(onMounted, mounted);
|
|
registerLifecycleHook(onBeforeUpdate, beforeUpdate);
|
|
registerLifecycleHook(onUpdated, updated);
|
|
registerLifecycleHook(onActivated, activated);
|
|
registerLifecycleHook(onDeactivated, deactivated);
|
|
registerLifecycleHook(onErrorCaptured, errorCaptured);
|
|
registerLifecycleHook(onRenderTracked, renderTracked);
|
|
registerLifecycleHook(onRenderTriggered, renderTriggered);
|
|
registerLifecycleHook(onBeforeUnmount, beforeUnmount);
|
|
registerLifecycleHook(onUnmounted, unmounted);
|
|
registerLifecycleHook(onServerPrefetch, serverPrefetch);
|
|
if (isArray(expose)) {
|
|
if (expose.length) {
|
|
const exposed = instance.exposed || (instance.exposed = {});
|
|
expose.forEach((key) => {
|
|
Object.defineProperty(exposed, key, {
|
|
get: () => publicThis[key],
|
|
set: (val) => publicThis[key] = val,
|
|
enumerable: true
|
|
});
|
|
});
|
|
} else if (!instance.exposed) {
|
|
instance.exposed = {};
|
|
}
|
|
}
|
|
if (render && instance.render === NOOP) {
|
|
instance.render = render;
|
|
}
|
|
if (inheritAttrs != null) {
|
|
instance.inheritAttrs = inheritAttrs;
|
|
}
|
|
if (components) instance.components = components;
|
|
if (directives) instance.directives = directives;
|
|
if (serverPrefetch) {
|
|
markAsyncBoundary(instance);
|
|
}
|
|
}
|
|
function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {
|
|
if (isArray(injectOptions)) {
|
|
injectOptions = normalizeInject(injectOptions);
|
|
}
|
|
for (const key in injectOptions) {
|
|
const opt = injectOptions[key];
|
|
let injected;
|
|
if (isObject(opt)) {
|
|
if ("default" in opt) {
|
|
injected = inject(
|
|
opt.from || key,
|
|
opt.default,
|
|
true
|
|
);
|
|
} else {
|
|
injected = inject(opt.from || key);
|
|
}
|
|
} else {
|
|
injected = inject(opt);
|
|
}
|
|
if (isRef(injected)) {
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: () => injected.value,
|
|
set: (v) => injected.value = v
|
|
});
|
|
} else {
|
|
ctx[key] = injected;
|
|
}
|
|
if (true) {
|
|
checkDuplicateProperties("Inject", key);
|
|
}
|
|
}
|
|
}
|
|
function callHook(hook, instance, type) {
|
|
callWithAsyncErrorHandling(
|
|
isArray(hook) ? hook.map((h2) => h2.bind(instance.proxy)) : hook.bind(instance.proxy),
|
|
instance,
|
|
type
|
|
);
|
|
}
|
|
function createWatcher(raw, ctx, publicThis, key) {
|
|
let getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key];
|
|
if (isString(raw)) {
|
|
const handler = ctx[raw];
|
|
if (isFunction(handler)) {
|
|
{
|
|
watch(getter, handler);
|
|
}
|
|
} else if (true) {
|
|
warn$1(`Invalid watch handler specified by key "${raw}"`, handler);
|
|
}
|
|
} else if (isFunction(raw)) {
|
|
{
|
|
watch(getter, raw.bind(publicThis));
|
|
}
|
|
} else if (isObject(raw)) {
|
|
if (isArray(raw)) {
|
|
raw.forEach((r) => createWatcher(r, ctx, publicThis, key));
|
|
} else {
|
|
const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];
|
|
if (isFunction(handler)) {
|
|
watch(getter, handler, raw);
|
|
} else if (true) {
|
|
warn$1(`Invalid watch handler specified by key "${raw.handler}"`, handler);
|
|
}
|
|
}
|
|
} else if (true) {
|
|
warn$1(`Invalid watch option: "${key}"`, raw);
|
|
}
|
|
}
|
|
function resolveMergedOptions(instance) {
|
|
const base = instance.type;
|
|
const { mixins, extends: extendsOptions } = base;
|
|
const {
|
|
mixins: globalMixins,
|
|
optionsCache: cache,
|
|
config: { optionMergeStrategies }
|
|
} = instance.appContext;
|
|
const cached = cache.get(base);
|
|
let resolved;
|
|
if (cached) {
|
|
resolved = cached;
|
|
} else if (!globalMixins.length && !mixins && !extendsOptions) {
|
|
{
|
|
resolved = base;
|
|
}
|
|
} else {
|
|
resolved = {};
|
|
if (globalMixins.length) {
|
|
globalMixins.forEach(
|
|
(m) => mergeOptions(resolved, m, optionMergeStrategies, true)
|
|
);
|
|
}
|
|
mergeOptions(resolved, base, optionMergeStrategies);
|
|
}
|
|
if (isObject(base)) {
|
|
cache.set(base, resolved);
|
|
}
|
|
return resolved;
|
|
}
|
|
function mergeOptions(to, from, strats, asMixin = false) {
|
|
const { mixins, extends: extendsOptions } = from;
|
|
if (extendsOptions) {
|
|
mergeOptions(to, extendsOptions, strats, true);
|
|
}
|
|
if (mixins) {
|
|
mixins.forEach(
|
|
(m) => mergeOptions(to, m, strats, true)
|
|
);
|
|
}
|
|
for (const key in from) {
|
|
if (asMixin && key === "expose") {
|
|
warn$1(
|
|
`"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`
|
|
);
|
|
} else {
|
|
const strat = internalOptionMergeStrats[key] || strats && strats[key];
|
|
to[key] = strat ? strat(to[key], from[key]) : from[key];
|
|
}
|
|
}
|
|
return to;
|
|
}
|
|
const internalOptionMergeStrats = {
|
|
data: mergeDataFn,
|
|
props: mergeEmitsOrPropsOptions,
|
|
emits: mergeEmitsOrPropsOptions,
|
|
// objects
|
|
methods: mergeObjectOptions,
|
|
computed: mergeObjectOptions,
|
|
// lifecycle
|
|
beforeCreate: mergeAsArray,
|
|
created: mergeAsArray,
|
|
beforeMount: mergeAsArray,
|
|
mounted: mergeAsArray,
|
|
beforeUpdate: mergeAsArray,
|
|
updated: mergeAsArray,
|
|
beforeDestroy: mergeAsArray,
|
|
beforeUnmount: mergeAsArray,
|
|
destroyed: mergeAsArray,
|
|
unmounted: mergeAsArray,
|
|
activated: mergeAsArray,
|
|
deactivated: mergeAsArray,
|
|
errorCaptured: mergeAsArray,
|
|
serverPrefetch: mergeAsArray,
|
|
// assets
|
|
components: mergeObjectOptions,
|
|
directives: mergeObjectOptions,
|
|
// watch
|
|
watch: mergeWatchOptions,
|
|
// provide / inject
|
|
provide: mergeDataFn,
|
|
inject: mergeInject
|
|
};
|
|
function mergeDataFn(to, from) {
|
|
if (!from) {
|
|
return to;
|
|
}
|
|
if (!to) {
|
|
return from;
|
|
}
|
|
return function mergedDataFn() {
|
|
return extend(
|
|
isFunction(to) ? to.call(this, this) : to,
|
|
isFunction(from) ? from.call(this, this) : from
|
|
);
|
|
};
|
|
}
|
|
function mergeInject(to, from) {
|
|
return mergeObjectOptions(normalizeInject(to), normalizeInject(from));
|
|
}
|
|
function normalizeInject(raw) {
|
|
if (isArray(raw)) {
|
|
const res = {};
|
|
for (let i = 0; i < raw.length; i++) {
|
|
res[raw[i]] = raw[i];
|
|
}
|
|
return res;
|
|
}
|
|
return raw;
|
|
}
|
|
function mergeAsArray(to, from) {
|
|
return to ? [...new Set([].concat(to, from))] : from;
|
|
}
|
|
function mergeObjectOptions(to, from) {
|
|
return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;
|
|
}
|
|
function mergeEmitsOrPropsOptions(to, from) {
|
|
if (to) {
|
|
if (isArray(to) && isArray(from)) {
|
|
return [.../* @__PURE__ */ new Set([...to, ...from])];
|
|
}
|
|
return extend(
|
|
/* @__PURE__ */ Object.create(null),
|
|
normalizePropsOrEmits(to),
|
|
normalizePropsOrEmits(from != null ? from : {})
|
|
);
|
|
} else {
|
|
return from;
|
|
}
|
|
}
|
|
function mergeWatchOptions(to, from) {
|
|
if (!to) return from;
|
|
if (!from) return to;
|
|
const merged = extend(/* @__PURE__ */ Object.create(null), to);
|
|
for (const key in from) {
|
|
merged[key] = mergeAsArray(to[key], from[key]);
|
|
}
|
|
return merged;
|
|
}
|
|
function createAppContext() {
|
|
return {
|
|
app: null,
|
|
config: {
|
|
isNativeTag: NO,
|
|
performance: false,
|
|
globalProperties: {},
|
|
optionMergeStrategies: {},
|
|
errorHandler: void 0,
|
|
warnHandler: void 0,
|
|
compilerOptions: {}
|
|
},
|
|
mixins: [],
|
|
components: {},
|
|
directives: {},
|
|
provides: /* @__PURE__ */ Object.create(null),
|
|
optionsCache: /* @__PURE__ */ new WeakMap(),
|
|
propsCache: /* @__PURE__ */ new WeakMap(),
|
|
emitsCache: /* @__PURE__ */ new WeakMap()
|
|
};
|
|
}
|
|
let uid$1 = 0;
|
|
function createAppAPI(render, hydrate) {
|
|
return function createApp(rootComponent, rootProps = null) {
|
|
if (!isFunction(rootComponent)) {
|
|
rootComponent = extend({}, rootComponent);
|
|
}
|
|
if (rootProps != null && !isObject(rootProps)) {
|
|
warn$1(`root props passed to app.mount() must be an object.`);
|
|
rootProps = null;
|
|
}
|
|
const context = createAppContext();
|
|
const installedPlugins = /* @__PURE__ */ new WeakSet();
|
|
const pluginCleanupFns = [];
|
|
let isMounted = false;
|
|
const app = context.app = {
|
|
_uid: uid$1++,
|
|
_component: rootComponent,
|
|
_props: rootProps,
|
|
_container: null,
|
|
_context: context,
|
|
_instance: null,
|
|
version,
|
|
get config() {
|
|
return context.config;
|
|
},
|
|
set config(v) {
|
|
if (true) {
|
|
warn$1(
|
|
`app.config cannot be replaced. Modify individual options instead.`
|
|
);
|
|
}
|
|
},
|
|
use(plugin, ...options) {
|
|
if (installedPlugins.has(plugin)) {
|
|
warn$1(`Plugin has already been applied to target app.`);
|
|
} else if (plugin && isFunction(plugin.install)) {
|
|
installedPlugins.add(plugin);
|
|
plugin.install(app, ...options);
|
|
} else if (isFunction(plugin)) {
|
|
installedPlugins.add(plugin);
|
|
plugin(app, ...options);
|
|
} else if (true) {
|
|
warn$1(
|
|
`A plugin must either be a function or an object with an "install" function.`
|
|
);
|
|
}
|
|
return app;
|
|
},
|
|
mixin(mixin) {
|
|
if (__VUE_OPTIONS_API__) {
|
|
if (!context.mixins.includes(mixin)) {
|
|
context.mixins.push(mixin);
|
|
} else if (true) {
|
|
warn$1(
|
|
"Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "")
|
|
);
|
|
}
|
|
} else if (true) {
|
|
warn$1("Mixins are only available in builds supporting Options API");
|
|
}
|
|
return app;
|
|
},
|
|
component(name, component) {
|
|
if (true) {
|
|
validateComponentName(name, context.config);
|
|
}
|
|
if (!component) {
|
|
return context.components[name];
|
|
}
|
|
if (context.components[name]) {
|
|
warn$1(`Component "${name}" has already been registered in target app.`);
|
|
}
|
|
context.components[name] = component;
|
|
return app;
|
|
},
|
|
directive(name, directive) {
|
|
if (true) {
|
|
validateDirectiveName(name);
|
|
}
|
|
if (!directive) {
|
|
return context.directives[name];
|
|
}
|
|
if (context.directives[name]) {
|
|
warn$1(`Directive "${name}" has already been registered in target app.`);
|
|
}
|
|
context.directives[name] = directive;
|
|
return app;
|
|
},
|
|
mount(rootContainer, isHydrate, namespace) {
|
|
if (!isMounted) {
|
|
if (rootContainer.__vue_app__) {
|
|
warn$1(
|
|
`There is already an app instance mounted on the host container.
|
|
If you want to mount another app on the same host container, you need to unmount the previous app by calling \`app.unmount()\` first.`
|
|
);
|
|
}
|
|
const vnode = app._ceVNode || createVNode(rootComponent, rootProps);
|
|
vnode.appContext = context;
|
|
if (namespace === true) {
|
|
namespace = "svg";
|
|
} else if (namespace === false) {
|
|
namespace = void 0;
|
|
}
|
|
if (true) {
|
|
context.reload = () => {
|
|
const cloned = cloneVNode(vnode);
|
|
cloned.el = null;
|
|
render(cloned, rootContainer, namespace);
|
|
};
|
|
}
|
|
if (isHydrate && hydrate) {
|
|
hydrate(vnode, rootContainer);
|
|
} else {
|
|
render(vnode, rootContainer, namespace);
|
|
}
|
|
isMounted = true;
|
|
app._container = rootContainer;
|
|
rootContainer.__vue_app__ = app;
|
|
if (true) {
|
|
app._instance = vnode.component;
|
|
devtoolsInitApp(app, version);
|
|
}
|
|
return getComponentPublicInstance(vnode.component);
|
|
} else if (true) {
|
|
warn$1(
|
|
`App has already been mounted.
|
|
If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \`const createMyApp = () => createApp(App)\``
|
|
);
|
|
}
|
|
},
|
|
onUnmount(cleanupFn) {
|
|
if (typeof cleanupFn !== "function") {
|
|
warn$1(
|
|
`Expected function as first argument to app.onUnmount(), but got ${typeof cleanupFn}`
|
|
);
|
|
}
|
|
pluginCleanupFns.push(cleanupFn);
|
|
},
|
|
unmount() {
|
|
if (isMounted) {
|
|
callWithAsyncErrorHandling(
|
|
pluginCleanupFns,
|
|
app._instance,
|
|
16
|
|
);
|
|
render(null, app._container);
|
|
if (true) {
|
|
app._instance = null;
|
|
devtoolsUnmountApp(app);
|
|
}
|
|
delete app._container.__vue_app__;
|
|
} else if (true) {
|
|
warn$1(`Cannot unmount an app that is not mounted.`);
|
|
}
|
|
},
|
|
provide(key, value) {
|
|
if (key in context.provides) {
|
|
if (hasOwn(context.provides, key)) {
|
|
warn$1(
|
|
`App already provides property with key "${String(key)}". It will be overwritten with the new value.`
|
|
);
|
|
} else {
|
|
warn$1(
|
|
`App already provides property with key "${String(key)}" inherited from its parent element. It will be overwritten with the new value.`
|
|
);
|
|
}
|
|
}
|
|
context.provides[key] = value;
|
|
return app;
|
|
},
|
|
runWithContext(fn) {
|
|
const lastApp = currentApp;
|
|
currentApp = app;
|
|
try {
|
|
return fn();
|
|
} finally {
|
|
currentApp = lastApp;
|
|
}
|
|
}
|
|
};
|
|
return app;
|
|
};
|
|
}
|
|
let currentApp = null;
|
|
function provide(key, value) {
|
|
if (!currentInstance) {
|
|
if (true) {
|
|
warn$1(`provide() can only be used inside setup().`);
|
|
}
|
|
} else {
|
|
let provides = currentInstance.provides;
|
|
const parentProvides = currentInstance.parent && currentInstance.parent.provides;
|
|
if (parentProvides === provides) {
|
|
provides = currentInstance.provides = Object.create(parentProvides);
|
|
}
|
|
provides[key] = value;
|
|
}
|
|
}
|
|
function inject(key, defaultValue, treatDefaultAsFactory = false) {
|
|
const instance = getCurrentInstance();
|
|
if (instance || currentApp) {
|
|
let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;
|
|
if (provides && key in provides) {
|
|
return provides[key];
|
|
} else if (arguments.length > 1) {
|
|
return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;
|
|
} else if (true) {
|
|
warn$1(`injection "${String(key)}" not found.`);
|
|
}
|
|
} else if (true) {
|
|
warn$1(`inject() can only be used inside setup() or functional components.`);
|
|
}
|
|
}
|
|
function hasInjectionContext() {
|
|
return !!(getCurrentInstance() || currentApp);
|
|
}
|
|
const internalObjectProto = {};
|
|
const createInternalObject = () => Object.create(internalObjectProto);
|
|
const isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;
|
|
function initProps(instance, rawProps, isStateful, isSSR = false) {
|
|
const props = {};
|
|
const attrs = createInternalObject();
|
|
instance.propsDefaults = /* @__PURE__ */ Object.create(null);
|
|
setFullProps(instance, rawProps, props, attrs);
|
|
for (const key in instance.propsOptions[0]) {
|
|
if (!(key in props)) {
|
|
props[key] = void 0;
|
|
}
|
|
}
|
|
if (true) {
|
|
validateProps(rawProps || {}, props, instance);
|
|
}
|
|
if (isStateful) {
|
|
instance.props = isSSR ? props : shallowReactive(props);
|
|
} else {
|
|
if (!instance.type.props) {
|
|
instance.props = attrs;
|
|
} else {
|
|
instance.props = props;
|
|
}
|
|
}
|
|
instance.attrs = attrs;
|
|
}
|
|
function isInHmrContext(instance) {
|
|
while (instance) {
|
|
if (instance.type.__hmrId) return true;
|
|
instance = instance.parent;
|
|
}
|
|
}
|
|
function updateProps(instance, rawProps, rawPrevProps, optimized) {
|
|
const {
|
|
props,
|
|
attrs,
|
|
vnode: { patchFlag }
|
|
} = instance;
|
|
const rawCurrentProps = toRaw(props);
|
|
const [options] = instance.propsOptions;
|
|
let hasAttrsChanged = false;
|
|
if (
|
|
// always force full diff in dev
|
|
// - #1942 if hmr is enabled with sfc component
|
|
// - vite#872 non-sfc component used by sfc component
|
|
!isInHmrContext(instance) && (optimized || patchFlag > 0) && !(patchFlag & 16)
|
|
) {
|
|
if (patchFlag & 8) {
|
|
const propsToUpdate = instance.vnode.dynamicProps;
|
|
for (let i = 0; i < propsToUpdate.length; i++) {
|
|
let key = propsToUpdate[i];
|
|
if (isEmitListener(instance.emitsOptions, key)) {
|
|
continue;
|
|
}
|
|
const value = rawProps[key];
|
|
if (options) {
|
|
if (hasOwn(attrs, key)) {
|
|
if (value !== attrs[key]) {
|
|
attrs[key] = value;
|
|
hasAttrsChanged = true;
|
|
}
|
|
} else {
|
|
const camelizedKey = camelize(key);
|
|
props[camelizedKey] = resolvePropValue(
|
|
options,
|
|
rawCurrentProps,
|
|
camelizedKey,
|
|
value,
|
|
instance,
|
|
false
|
|
);
|
|
}
|
|
} else {
|
|
if (value !== attrs[key]) {
|
|
attrs[key] = value;
|
|
hasAttrsChanged = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (setFullProps(instance, rawProps, props, attrs)) {
|
|
hasAttrsChanged = true;
|
|
}
|
|
let kebabKey;
|
|
for (const key in rawCurrentProps) {
|
|
if (!rawProps || // for camelCase
|
|
!hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case
|
|
// and converted to camelCase (#955)
|
|
((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {
|
|
if (options) {
|
|
if (rawPrevProps && // for camelCase
|
|
(rawPrevProps[key] !== void 0 || // for kebab-case
|
|
rawPrevProps[kebabKey] !== void 0)) {
|
|
props[key] = resolvePropValue(
|
|
options,
|
|
rawCurrentProps,
|
|
key,
|
|
void 0,
|
|
instance,
|
|
true
|
|
);
|
|
}
|
|
} else {
|
|
delete props[key];
|
|
}
|
|
}
|
|
}
|
|
if (attrs !== rawCurrentProps) {
|
|
for (const key in attrs) {
|
|
if (!rawProps || !hasOwn(rawProps, key) && true) {
|
|
delete attrs[key];
|
|
hasAttrsChanged = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (hasAttrsChanged) {
|
|
trigger(instance.attrs, "set", "");
|
|
}
|
|
if (true) {
|
|
validateProps(rawProps || {}, props, instance);
|
|
}
|
|
}
|
|
function setFullProps(instance, rawProps, props, attrs) {
|
|
const [options, needCastKeys] = instance.propsOptions;
|
|
let hasAttrsChanged = false;
|
|
let rawCastValues;
|
|
if (rawProps) {
|
|
for (let key in rawProps) {
|
|
if (isReservedProp(key)) {
|
|
continue;
|
|
}
|
|
const value = rawProps[key];
|
|
let camelKey;
|
|
if (options && hasOwn(options, camelKey = camelize(key))) {
|
|
if (!needCastKeys || !needCastKeys.includes(camelKey)) {
|
|
props[camelKey] = value;
|
|
} else {
|
|
(rawCastValues || (rawCastValues = {}))[camelKey] = value;
|
|
}
|
|
} else if (!isEmitListener(instance.emitsOptions, key)) {
|
|
if (!(key in attrs) || value !== attrs[key]) {
|
|
attrs[key] = value;
|
|
hasAttrsChanged = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (needCastKeys) {
|
|
const rawCurrentProps = toRaw(props);
|
|
const castValues = rawCastValues || EMPTY_OBJ;
|
|
for (let i = 0; i < needCastKeys.length; i++) {
|
|
const key = needCastKeys[i];
|
|
props[key] = resolvePropValue(
|
|
options,
|
|
rawCurrentProps,
|
|
key,
|
|
castValues[key],
|
|
instance,
|
|
!hasOwn(castValues, key)
|
|
);
|
|
}
|
|
}
|
|
return hasAttrsChanged;
|
|
}
|
|
function resolvePropValue(options, props, key, value, instance, isAbsent) {
|
|
const opt = options[key];
|
|
if (opt != null) {
|
|
const hasDefault = hasOwn(opt, "default");
|
|
if (hasDefault && value === void 0) {
|
|
const defaultValue = opt.default;
|
|
if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {
|
|
const { propsDefaults } = instance;
|
|
if (key in propsDefaults) {
|
|
value = propsDefaults[key];
|
|
} else {
|
|
const reset = setCurrentInstance(instance);
|
|
value = propsDefaults[key] = defaultValue.call(
|
|
null,
|
|
props
|
|
);
|
|
reset();
|
|
}
|
|
} else {
|
|
value = defaultValue;
|
|
}
|
|
if (instance.ce) {
|
|
instance.ce._setProp(key, value);
|
|
}
|
|
}
|
|
if (opt[
|
|
0
|
|
/* shouldCast */
|
|
]) {
|
|
if (isAbsent && !hasDefault) {
|
|
value = false;
|
|
} else if (opt[
|
|
1
|
|
/* shouldCastTrue */
|
|
] && (value === "" || value === hyphenate(key))) {
|
|
value = true;
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
const mixinPropsCache = /* @__PURE__ */ new WeakMap();
|
|
function normalizePropsOptions(comp, appContext, asMixin = false) {
|
|
const cache = __VUE_OPTIONS_API__ && asMixin ? mixinPropsCache : appContext.propsCache;
|
|
const cached = cache.get(comp);
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
const raw = comp.props;
|
|
const normalized = {};
|
|
const needCastKeys = [];
|
|
let hasExtends = false;
|
|
if (__VUE_OPTIONS_API__ && !isFunction(comp)) {
|
|
const extendProps = (raw2) => {
|
|
hasExtends = true;
|
|
const [props, keys] = normalizePropsOptions(raw2, appContext, true);
|
|
extend(normalized, props);
|
|
if (keys) needCastKeys.push(...keys);
|
|
};
|
|
if (!asMixin && appContext.mixins.length) {
|
|
appContext.mixins.forEach(extendProps);
|
|
}
|
|
if (comp.extends) {
|
|
extendProps(comp.extends);
|
|
}
|
|
if (comp.mixins) {
|
|
comp.mixins.forEach(extendProps);
|
|
}
|
|
}
|
|
if (!raw && !hasExtends) {
|
|
if (isObject(comp)) {
|
|
cache.set(comp, EMPTY_ARR);
|
|
}
|
|
return EMPTY_ARR;
|
|
}
|
|
if (isArray(raw)) {
|
|
for (let i = 0; i < raw.length; i++) {
|
|
if (!isString(raw[i])) {
|
|
warn$1(`props must be strings when using array syntax.`, raw[i]);
|
|
}
|
|
const normalizedKey = camelize(raw[i]);
|
|
if (validatePropName(normalizedKey)) {
|
|
normalized[normalizedKey] = EMPTY_OBJ;
|
|
}
|
|
}
|
|
} else if (raw) {
|
|
if (!isObject(raw)) {
|
|
warn$1(`invalid props options`, raw);
|
|
}
|
|
for (const key in raw) {
|
|
const normalizedKey = camelize(key);
|
|
if (validatePropName(normalizedKey)) {
|
|
const opt = raw[key];
|
|
const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);
|
|
const propType = prop.type;
|
|
let shouldCast = false;
|
|
let shouldCastTrue = true;
|
|
if (isArray(propType)) {
|
|
for (let index = 0; index < propType.length; ++index) {
|
|
const type = propType[index];
|
|
const typeName = isFunction(type) && type.name;
|
|
if (typeName === "Boolean") {
|
|
shouldCast = true;
|
|
break;
|
|
} else if (typeName === "String") {
|
|
shouldCastTrue = false;
|
|
}
|
|
}
|
|
} else {
|
|
shouldCast = isFunction(propType) && propType.name === "Boolean";
|
|
}
|
|
prop[
|
|
0
|
|
/* shouldCast */
|
|
] = shouldCast;
|
|
prop[
|
|
1
|
|
/* shouldCastTrue */
|
|
] = shouldCastTrue;
|
|
if (shouldCast || hasOwn(prop, "default")) {
|
|
needCastKeys.push(normalizedKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const res = [normalized, needCastKeys];
|
|
if (isObject(comp)) {
|
|
cache.set(comp, res);
|
|
}
|
|
return res;
|
|
}
|
|
function validatePropName(key) {
|
|
if (key[0] !== "$" && !isReservedProp(key)) {
|
|
return true;
|
|
} else if (true) {
|
|
warn$1(`Invalid prop name: "${key}" is a reserved property.`);
|
|
}
|
|
return false;
|
|
}
|
|
function getType(ctor) {
|
|
if (ctor === null) {
|
|
return "null";
|
|
}
|
|
if (typeof ctor === "function") {
|
|
return ctor.name || "";
|
|
} else if (typeof ctor === "object") {
|
|
const name = ctor.constructor && ctor.constructor.name;
|
|
return name || "";
|
|
}
|
|
return "";
|
|
}
|
|
function validateProps(rawProps, props, instance) {
|
|
const resolvedValues = toRaw(props);
|
|
const options = instance.propsOptions[0];
|
|
const camelizePropsKey = Object.keys(rawProps).map((key) => camelize(key));
|
|
for (const key in options) {
|
|
let opt = options[key];
|
|
if (opt == null) continue;
|
|
validateProp(
|
|
key,
|
|
resolvedValues[key],
|
|
opt,
|
|
true ? shallowReadonly(resolvedValues) : resolvedValues,
|
|
!camelizePropsKey.includes(key)
|
|
);
|
|
}
|
|
}
|
|
function validateProp(name, value, prop, props, isAbsent) {
|
|
const { type, required, validator, skipCheck } = prop;
|
|
if (required && isAbsent) {
|
|
warn$1('Missing required prop: "' + name + '"');
|
|
return;
|
|
}
|
|
if (value == null && !required) {
|
|
return;
|
|
}
|
|
if (type != null && type !== true && !skipCheck) {
|
|
let isValid = false;
|
|
const types = isArray(type) ? type : [type];
|
|
const expectedTypes = [];
|
|
for (let i = 0; i < types.length && !isValid; i++) {
|
|
const { valid, expectedType } = assertType(value, types[i]);
|
|
expectedTypes.push(expectedType || "");
|
|
isValid = valid;
|
|
}
|
|
if (!isValid) {
|
|
warn$1(getInvalidTypeMessage(name, value, expectedTypes));
|
|
return;
|
|
}
|
|
}
|
|
if (validator && !validator(value, props)) {
|
|
warn$1('Invalid prop: custom validator check failed for prop "' + name + '".');
|
|
}
|
|
}
|
|
const isSimpleType = /* @__PURE__ */ makeMap(
|
|
"String,Number,Boolean,Function,Symbol,BigInt"
|
|
);
|
|
function assertType(value, type) {
|
|
let valid;
|
|
const expectedType = getType(type);
|
|
if (expectedType === "null") {
|
|
valid = value === null;
|
|
} else if (isSimpleType(expectedType)) {
|
|
const t = typeof value;
|
|
valid = t === expectedType.toLowerCase();
|
|
if (!valid && t === "object") {
|
|
valid = value instanceof type;
|
|
}
|
|
} else if (expectedType === "Object") {
|
|
valid = isObject(value);
|
|
} else if (expectedType === "Array") {
|
|
valid = isArray(value);
|
|
} else {
|
|
valid = value instanceof type;
|
|
}
|
|
return {
|
|
valid,
|
|
expectedType
|
|
};
|
|
}
|
|
function getInvalidTypeMessage(name, value, expectedTypes) {
|
|
if (expectedTypes.length === 0) {
|
|
return `Prop type [] for prop "${name}" won't match anything. Did you mean to use type Array instead?`;
|
|
}
|
|
let message = `Invalid prop: type check failed for prop "${name}". Expected ${expectedTypes.map(capitalize).join(" | ")}`;
|
|
const expectedType = expectedTypes[0];
|
|
const receivedType = toRawType(value);
|
|
const expectedValue = styleValue(value, expectedType);
|
|
const receivedValue = styleValue(value, receivedType);
|
|
if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {
|
|
message += ` with value ${expectedValue}`;
|
|
}
|
|
message += `, got ${receivedType} `;
|
|
if (isExplicable(receivedType)) {
|
|
message += `with value ${receivedValue}.`;
|
|
}
|
|
return message;
|
|
}
|
|
function styleValue(value, type) {
|
|
if (type === "String") {
|
|
return `"${value}"`;
|
|
} else if (type === "Number") {
|
|
return `${Number(value)}`;
|
|
} else {
|
|
return `${value}`;
|
|
}
|
|
}
|
|
function isExplicable(type) {
|
|
const explicitTypes = ["string", "number", "boolean"];
|
|
return explicitTypes.some((elem) => type.toLowerCase() === elem);
|
|
}
|
|
function isBoolean(...args) {
|
|
return args.some((elem) => elem.toLowerCase() === "boolean");
|
|
}
|
|
const isInternalKey = (key) => key === "_" || key === "_ctx" || key === "$stable";
|
|
const normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];
|
|
const normalizeSlot = (key, rawSlot, ctx) => {
|
|
if (rawSlot._n) {
|
|
return rawSlot;
|
|
}
|
|
const normalized = withCtx((...args) => {
|
|
if (currentInstance && !(ctx === null && currentRenderingInstance) && !(ctx && ctx.root !== currentInstance.root)) {
|
|
warn$1(
|
|
`Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`
|
|
);
|
|
}
|
|
return normalizeSlotValue(rawSlot(...args));
|
|
}, ctx);
|
|
normalized._c = false;
|
|
return normalized;
|
|
};
|
|
const normalizeObjectSlots = (rawSlots, slots, instance) => {
|
|
const ctx = rawSlots._ctx;
|
|
for (const key in rawSlots) {
|
|
if (isInternalKey(key)) continue;
|
|
const value = rawSlots[key];
|
|
if (isFunction(value)) {
|
|
slots[key] = normalizeSlot(key, value, ctx);
|
|
} else if (value != null) {
|
|
if (true) {
|
|
warn$1(
|
|
`Non-function value encountered for slot "${key}". Prefer function slots for better performance.`
|
|
);
|
|
}
|
|
const normalized = normalizeSlotValue(value);
|
|
slots[key] = () => normalized;
|
|
}
|
|
}
|
|
};
|
|
const normalizeVNodeSlots = (instance, children) => {
|
|
if (!isKeepAlive(instance.vnode) && true) {
|
|
warn$1(
|
|
`Non-function value encountered for default slot. Prefer function slots for better performance.`
|
|
);
|
|
}
|
|
const normalized = normalizeSlotValue(children);
|
|
instance.slots.default = () => normalized;
|
|
};
|
|
const assignSlots = (slots, children, optimized) => {
|
|
for (const key in children) {
|
|
if (optimized || !isInternalKey(key)) {
|
|
slots[key] = children[key];
|
|
}
|
|
}
|
|
};
|
|
const initSlots = (instance, children, optimized) => {
|
|
const slots = instance.slots = createInternalObject();
|
|
if (instance.vnode.shapeFlag & 32) {
|
|
const type = children._;
|
|
if (type) {
|
|
assignSlots(slots, children, optimized);
|
|
if (optimized) {
|
|
def(slots, "_", type, true);
|
|
}
|
|
} else {
|
|
normalizeObjectSlots(children, slots);
|
|
}
|
|
} else if (children) {
|
|
normalizeVNodeSlots(instance, children);
|
|
}
|
|
};
|
|
const updateSlots = (instance, children, optimized) => {
|
|
const { vnode, slots } = instance;
|
|
let needDeletionCheck = true;
|
|
let deletionComparisonTarget = EMPTY_OBJ;
|
|
if (vnode.shapeFlag & 32) {
|
|
const type = children._;
|
|
if (type) {
|
|
if (isHmrUpdating) {
|
|
assignSlots(slots, children, optimized);
|
|
trigger(instance, "set", "$slots");
|
|
} else if (optimized && type === 1) {
|
|
needDeletionCheck = false;
|
|
} else {
|
|
assignSlots(slots, children, optimized);
|
|
}
|
|
} else {
|
|
needDeletionCheck = !children.$stable;
|
|
normalizeObjectSlots(children, slots);
|
|
}
|
|
deletionComparisonTarget = children;
|
|
} else if (children) {
|
|
normalizeVNodeSlots(instance, children);
|
|
deletionComparisonTarget = { default: 1 };
|
|
}
|
|
if (needDeletionCheck) {
|
|
for (const key in slots) {
|
|
if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {
|
|
delete slots[key];
|
|
}
|
|
}
|
|
}
|
|
};
|
|
let supported;
|
|
let perf;
|
|
function startMeasure(instance, type) {
|
|
if (instance.appContext.config.performance && isSupported()) {
|
|
perf.mark(`vue-${type}-${instance.uid}`);
|
|
}
|
|
if (true) {
|
|
devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());
|
|
}
|
|
}
|
|
function endMeasure(instance, type) {
|
|
if (instance.appContext.config.performance && isSupported()) {
|
|
const startTag = `vue-${type}-${instance.uid}`;
|
|
const endTag = startTag + `:end`;
|
|
const measureName = `<${formatComponentName(instance, instance.type)}> ${type}`;
|
|
perf.mark(endTag);
|
|
perf.measure(measureName, startTag, endTag);
|
|
perf.clearMeasures(measureName);
|
|
perf.clearMarks(startTag);
|
|
perf.clearMarks(endTag);
|
|
}
|
|
if (true) {
|
|
devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());
|
|
}
|
|
}
|
|
function isSupported() {
|
|
if (supported !== void 0) {
|
|
return supported;
|
|
}
|
|
if (typeof window !== "undefined" && window.performance) {
|
|
supported = true;
|
|
perf = window.performance;
|
|
} else {
|
|
supported = false;
|
|
}
|
|
return supported;
|
|
}
|
|
function initFeatureFlags() {
|
|
const needWarn = [];
|
|
if (typeof __VUE_OPTIONS_API__ !== "boolean") {
|
|
needWarn.push(`__VUE_OPTIONS_API__`);
|
|
getGlobalThis().__VUE_OPTIONS_API__ = true;
|
|
}
|
|
if (typeof __VUE_PROD_DEVTOOLS__ !== "boolean") {
|
|
needWarn.push(`__VUE_PROD_DEVTOOLS__`);
|
|
getGlobalThis().__VUE_PROD_DEVTOOLS__ = false;
|
|
}
|
|
if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== "boolean") {
|
|
needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`);
|
|
getGlobalThis().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false;
|
|
}
|
|
if (needWarn.length) {
|
|
const multi = needWarn.length > 1;
|
|
console.warn(
|
|
`Feature flag${multi ? `s` : ``} ${needWarn.join(", ")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle.
|
|
|
|
For more details, see https://link.vuejs.org/feature-flags.`
|
|
);
|
|
}
|
|
}
|
|
const queuePostRenderEffect = queueEffectWithSuspense;
|
|
function createRenderer(options) {
|
|
return baseCreateRenderer(options);
|
|
}
|
|
function createHydrationRenderer(options) {
|
|
return baseCreateRenderer(options, createHydrationFunctions);
|
|
}
|
|
function baseCreateRenderer(options, createHydrationFns) {
|
|
{
|
|
initFeatureFlags();
|
|
}
|
|
const target = getGlobalThis();
|
|
target.__VUE__ = true;
|
|
if (true) {
|
|
setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);
|
|
}
|
|
const {
|
|
insert: hostInsert,
|
|
remove: hostRemove,
|
|
patchProp: hostPatchProp,
|
|
createElement: hostCreateElement,
|
|
createText: hostCreateText,
|
|
createComment: hostCreateComment,
|
|
setText: hostSetText,
|
|
setElementText: hostSetElementText,
|
|
parentNode: hostParentNode,
|
|
nextSibling: hostNextSibling,
|
|
setScopeId: hostSetScopeId = NOOP,
|
|
insertStaticContent: hostInsertStaticContent
|
|
} = options;
|
|
const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = isHmrUpdating ? false : !!n2.dynamicChildren) => {
|
|
if (n1 === n2) {
|
|
return;
|
|
}
|
|
if (n1 && !isSameVNodeType(n1, n2)) {
|
|
anchor = getNextHostNode(n1);
|
|
unmount(n1, parentComponent, parentSuspense, true);
|
|
n1 = null;
|
|
}
|
|
if (n2.patchFlag === -2) {
|
|
optimized = false;
|
|
n2.dynamicChildren = null;
|
|
}
|
|
const { type, ref: ref3, shapeFlag } = n2;
|
|
switch (type) {
|
|
case Text:
|
|
processText(n1, n2, container, anchor);
|
|
break;
|
|
case Comment:
|
|
processCommentNode(n1, n2, container, anchor);
|
|
break;
|
|
case Static:
|
|
if (n1 == null) {
|
|
mountStaticNode(n2, container, anchor, namespace);
|
|
} else if (true) {
|
|
patchStaticNode(n1, n2, container, namespace);
|
|
}
|
|
break;
|
|
case Fragment:
|
|
processFragment(
|
|
n1,
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
break;
|
|
default:
|
|
if (shapeFlag & 1) {
|
|
processElement(
|
|
n1,
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else if (shapeFlag & 6) {
|
|
processComponent(
|
|
n1,
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else if (shapeFlag & 64) {
|
|
type.process(
|
|
n1,
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized,
|
|
internals
|
|
);
|
|
} else if (shapeFlag & 128) {
|
|
type.process(
|
|
n1,
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized,
|
|
internals
|
|
);
|
|
} else if (true) {
|
|
warn$1("Invalid VNode type:", type, `(${typeof type})`);
|
|
}
|
|
}
|
|
if (ref3 != null && parentComponent) {
|
|
setRef(ref3, n1 && n1.ref, parentSuspense, n2 || n1, !n2);
|
|
} else if (ref3 == null && n1 && n1.ref != null) {
|
|
setRef(n1.ref, null, parentSuspense, n1, true);
|
|
}
|
|
};
|
|
const processText = (n1, n2, container, anchor) => {
|
|
if (n1 == null) {
|
|
hostInsert(
|
|
n2.el = hostCreateText(n2.children),
|
|
container,
|
|
anchor
|
|
);
|
|
} else {
|
|
const el = n2.el = n1.el;
|
|
if (n2.children !== n1.children) {
|
|
hostSetText(el, n2.children);
|
|
}
|
|
}
|
|
};
|
|
const processCommentNode = (n1, n2, container, anchor) => {
|
|
if (n1 == null) {
|
|
hostInsert(
|
|
n2.el = hostCreateComment(n2.children || ""),
|
|
container,
|
|
anchor
|
|
);
|
|
} else {
|
|
n2.el = n1.el;
|
|
}
|
|
};
|
|
const mountStaticNode = (n2, container, anchor, namespace) => {
|
|
[n2.el, n2.anchor] = hostInsertStaticContent(
|
|
n2.children,
|
|
container,
|
|
anchor,
|
|
namespace,
|
|
n2.el,
|
|
n2.anchor
|
|
);
|
|
};
|
|
const patchStaticNode = (n1, n2, container, namespace) => {
|
|
if (n2.children !== n1.children) {
|
|
const anchor = hostNextSibling(n1.anchor);
|
|
removeStaticNode(n1);
|
|
[n2.el, n2.anchor] = hostInsertStaticContent(
|
|
n2.children,
|
|
container,
|
|
anchor,
|
|
namespace
|
|
);
|
|
} else {
|
|
n2.el = n1.el;
|
|
n2.anchor = n1.anchor;
|
|
}
|
|
};
|
|
const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
|
|
let next;
|
|
while (el && el !== anchor) {
|
|
next = hostNextSibling(el);
|
|
hostInsert(el, container, nextSibling);
|
|
el = next;
|
|
}
|
|
hostInsert(anchor, container, nextSibling);
|
|
};
|
|
const removeStaticNode = ({ el, anchor }) => {
|
|
let next;
|
|
while (el && el !== anchor) {
|
|
next = hostNextSibling(el);
|
|
hostRemove(el);
|
|
el = next;
|
|
}
|
|
hostRemove(anchor);
|
|
};
|
|
const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
|
|
if (n2.type === "svg") {
|
|
namespace = "svg";
|
|
} else if (n2.type === "math") {
|
|
namespace = "mathml";
|
|
}
|
|
if (n1 == null) {
|
|
mountElement(
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else {
|
|
patchElement(
|
|
n1,
|
|
n2,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
};
|
|
const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
|
|
let el;
|
|
let vnodeHook;
|
|
const { props, shapeFlag, transition, dirs } = vnode;
|
|
el = vnode.el = hostCreateElement(
|
|
vnode.type,
|
|
namespace,
|
|
props && props.is,
|
|
props
|
|
);
|
|
if (shapeFlag & 8) {
|
|
hostSetElementText(el, vnode.children);
|
|
} else if (shapeFlag & 16) {
|
|
mountChildren(
|
|
vnode.children,
|
|
el,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
resolveChildrenNamespace(vnode, namespace),
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
if (dirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, "created");
|
|
}
|
|
setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
|
|
if (props) {
|
|
for (const key in props) {
|
|
if (key !== "value" && !isReservedProp(key)) {
|
|
hostPatchProp(el, key, null, props[key], namespace, parentComponent);
|
|
}
|
|
}
|
|
if ("value" in props) {
|
|
hostPatchProp(el, "value", null, props.value, namespace);
|
|
}
|
|
if (vnodeHook = props.onVnodeBeforeMount) {
|
|
invokeVNodeHook(vnodeHook, parentComponent, vnode);
|
|
}
|
|
}
|
|
if (true) {
|
|
def(el, "__vnode", vnode, true);
|
|
def(el, "__vueParentComponent", parentComponent, true);
|
|
}
|
|
if (dirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
|
|
}
|
|
const needCallTransitionHooks = needTransition(parentSuspense, transition);
|
|
if (needCallTransitionHooks) {
|
|
transition.beforeEnter(el);
|
|
}
|
|
hostInsert(el, container, anchor);
|
|
if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {
|
|
queuePostRenderEffect(() => {
|
|
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
|
|
needCallTransitionHooks && transition.enter(el);
|
|
dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
|
|
}, parentSuspense);
|
|
}
|
|
};
|
|
const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {
|
|
if (scopeId) {
|
|
hostSetScopeId(el, scopeId);
|
|
}
|
|
if (slotScopeIds) {
|
|
for (let i = 0; i < slotScopeIds.length; i++) {
|
|
hostSetScopeId(el, slotScopeIds[i]);
|
|
}
|
|
}
|
|
if (parentComponent) {
|
|
let subTree = parentComponent.subTree;
|
|
if (subTree.patchFlag > 0 && subTree.patchFlag & 2048) {
|
|
subTree = filterSingleRoot(subTree.children) || subTree;
|
|
}
|
|
if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) {
|
|
const parentVNode = parentComponent.vnode;
|
|
setScopeId(
|
|
el,
|
|
parentVNode,
|
|
parentVNode.scopeId,
|
|
parentVNode.slotScopeIds,
|
|
parentComponent.parent
|
|
);
|
|
}
|
|
}
|
|
};
|
|
const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {
|
|
for (let i = start; i < children.length; i++) {
|
|
const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);
|
|
patch(
|
|
null,
|
|
child,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
};
|
|
const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
|
|
const el = n2.el = n1.el;
|
|
if (true) {
|
|
el.__vnode = n2;
|
|
}
|
|
let { patchFlag, dynamicChildren, dirs } = n2;
|
|
patchFlag |= n1.patchFlag & 16;
|
|
const oldProps = n1.props || EMPTY_OBJ;
|
|
const newProps = n2.props || EMPTY_OBJ;
|
|
let vnodeHook;
|
|
parentComponent && toggleRecurse(parentComponent, false);
|
|
if (vnodeHook = newProps.onVnodeBeforeUpdate) {
|
|
invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
|
|
}
|
|
if (dirs) {
|
|
invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate");
|
|
}
|
|
parentComponent && toggleRecurse(parentComponent, true);
|
|
if (isHmrUpdating) {
|
|
patchFlag = 0;
|
|
optimized = false;
|
|
dynamicChildren = null;
|
|
}
|
|
if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) {
|
|
hostSetElementText(el, "");
|
|
}
|
|
if (dynamicChildren) {
|
|
patchBlockChildren(
|
|
n1.dynamicChildren,
|
|
dynamicChildren,
|
|
el,
|
|
parentComponent,
|
|
parentSuspense,
|
|
resolveChildrenNamespace(n2, namespace),
|
|
slotScopeIds
|
|
);
|
|
if (true) {
|
|
traverseStaticChildren(n1, n2);
|
|
}
|
|
} else if (!optimized) {
|
|
patchChildren(
|
|
n1,
|
|
n2,
|
|
el,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
resolveChildrenNamespace(n2, namespace),
|
|
slotScopeIds,
|
|
false
|
|
);
|
|
}
|
|
if (patchFlag > 0) {
|
|
if (patchFlag & 16) {
|
|
patchProps(el, oldProps, newProps, parentComponent, namespace);
|
|
} else {
|
|
if (patchFlag & 2) {
|
|
if (oldProps.class !== newProps.class) {
|
|
hostPatchProp(el, "class", null, newProps.class, namespace);
|
|
}
|
|
}
|
|
if (patchFlag & 4) {
|
|
hostPatchProp(el, "style", oldProps.style, newProps.style, namespace);
|
|
}
|
|
if (patchFlag & 8) {
|
|
const propsToUpdate = n2.dynamicProps;
|
|
for (let i = 0; i < propsToUpdate.length; i++) {
|
|
const key = propsToUpdate[i];
|
|
const prev = oldProps[key];
|
|
const next = newProps[key];
|
|
if (next !== prev || key === "value") {
|
|
hostPatchProp(el, key, prev, next, namespace, parentComponent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (patchFlag & 1) {
|
|
if (n1.children !== n2.children) {
|
|
hostSetElementText(el, n2.children);
|
|
}
|
|
}
|
|
} else if (!optimized && dynamicChildren == null) {
|
|
patchProps(el, oldProps, newProps, parentComponent, namespace);
|
|
}
|
|
if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {
|
|
queuePostRenderEffect(() => {
|
|
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
|
|
dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated");
|
|
}, parentSuspense);
|
|
}
|
|
};
|
|
const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {
|
|
for (let i = 0; i < newChildren.length; i++) {
|
|
const oldVNode = oldChildren[i];
|
|
const newVNode = newChildren[i];
|
|
const container = (
|
|
// oldVNode may be an errored async setup() component inside Suspense
|
|
// which will not have a mounted element
|
|
oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent
|
|
// of the Fragment itself so it can move its children.
|
|
(oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement
|
|
// which also requires the correct parent container
|
|
!isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.
|
|
oldVNode.shapeFlag & (6 | 64 | 128)) ? hostParentNode(oldVNode.el) : (
|
|
// In other cases, the parent container is not actually used so we
|
|
// just pass the block element here to avoid a DOM parentNode call.
|
|
fallbackContainer
|
|
)
|
|
);
|
|
patch(
|
|
oldVNode,
|
|
newVNode,
|
|
container,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
true
|
|
);
|
|
}
|
|
};
|
|
const patchProps = (el, oldProps, newProps, parentComponent, namespace) => {
|
|
if (oldProps !== newProps) {
|
|
if (oldProps !== EMPTY_OBJ) {
|
|
for (const key in oldProps) {
|
|
if (!isReservedProp(key) && !(key in newProps)) {
|
|
hostPatchProp(
|
|
el,
|
|
key,
|
|
oldProps[key],
|
|
null,
|
|
namespace,
|
|
parentComponent
|
|
);
|
|
}
|
|
}
|
|
}
|
|
for (const key in newProps) {
|
|
if (isReservedProp(key)) continue;
|
|
const next = newProps[key];
|
|
const prev = oldProps[key];
|
|
if (next !== prev && key !== "value") {
|
|
hostPatchProp(el, key, prev, next, namespace, parentComponent);
|
|
}
|
|
}
|
|
if ("value" in newProps) {
|
|
hostPatchProp(el, "value", oldProps.value, newProps.value, namespace);
|
|
}
|
|
}
|
|
};
|
|
const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
|
|
const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText("");
|
|
const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText("");
|
|
let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;
|
|
if (
|
|
// #5523 dev root fragment may inherit directives
|
|
isHmrUpdating || patchFlag & 2048
|
|
) {
|
|
patchFlag = 0;
|
|
optimized = false;
|
|
dynamicChildren = null;
|
|
}
|
|
if (fragmentSlotScopeIds) {
|
|
slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
|
|
}
|
|
if (n1 == null) {
|
|
hostInsert(fragmentStartAnchor, container, anchor);
|
|
hostInsert(fragmentEndAnchor, container, anchor);
|
|
mountChildren(
|
|
// #10007
|
|
// such fragment like `<></>` will be compiled into
|
|
// a fragment which doesn't have a children.
|
|
// In this case fallback to an empty array
|
|
n2.children || [],
|
|
container,
|
|
fragmentEndAnchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else {
|
|
if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result
|
|
// of renderSlot() with no valid children
|
|
n1.dynamicChildren) {
|
|
patchBlockChildren(
|
|
n1.dynamicChildren,
|
|
dynamicChildren,
|
|
container,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds
|
|
);
|
|
if (true) {
|
|
traverseStaticChildren(n1, n2);
|
|
} else if (
|
|
// #2080 if the stable fragment has a key, it's a <template v-for> that may
|
|
// get moved around. Make sure all root level vnodes inherit el.
|
|
// #2134 or if it's a component root, it may also get moved around
|
|
// as the component is being moved.
|
|
n2.key != null || parentComponent && n2 === parentComponent.subTree
|
|
) {
|
|
traverseStaticChildren(
|
|
n1,
|
|
n2,
|
|
true
|
|
/* shallow */
|
|
);
|
|
}
|
|
} else {
|
|
patchChildren(
|
|
n1,
|
|
n2,
|
|
container,
|
|
fragmentEndAnchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
}
|
|
};
|
|
const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
|
|
n2.slotScopeIds = slotScopeIds;
|
|
if (n1 == null) {
|
|
if (n2.shapeFlag & 512) {
|
|
parentComponent.ctx.activate(
|
|
n2,
|
|
container,
|
|
anchor,
|
|
namespace,
|
|
optimized
|
|
);
|
|
} else {
|
|
mountComponent(
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
optimized
|
|
);
|
|
}
|
|
} else {
|
|
updateComponent(n1, n2, optimized);
|
|
}
|
|
};
|
|
const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {
|
|
const instance = initialVNode.component = createComponentInstance(
|
|
initialVNode,
|
|
parentComponent,
|
|
parentSuspense
|
|
);
|
|
if (instance.type.__hmrId) {
|
|
registerHMR(instance);
|
|
}
|
|
if (true) {
|
|
pushWarningContext(initialVNode);
|
|
startMeasure(instance, `mount`);
|
|
}
|
|
if (isKeepAlive(initialVNode)) {
|
|
instance.ctx.renderer = internals;
|
|
}
|
|
{
|
|
if (true) {
|
|
startMeasure(instance, `init`);
|
|
}
|
|
setupComponent(instance, false, optimized);
|
|
if (true) {
|
|
endMeasure(instance, `init`);
|
|
}
|
|
}
|
|
if (isHmrUpdating) initialVNode.el = null;
|
|
if (instance.asyncDep) {
|
|
parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized);
|
|
if (!initialVNode.el) {
|
|
const placeholder = instance.subTree = createVNode(Comment);
|
|
processCommentNode(null, placeholder, container, anchor);
|
|
initialVNode.placeholder = placeholder.el;
|
|
}
|
|
} else {
|
|
setupRenderEffect(
|
|
instance,
|
|
initialVNode,
|
|
container,
|
|
anchor,
|
|
parentSuspense,
|
|
namespace,
|
|
optimized
|
|
);
|
|
}
|
|
if (true) {
|
|
popWarningContext();
|
|
endMeasure(instance, `mount`);
|
|
}
|
|
};
|
|
const updateComponent = (n1, n2, optimized) => {
|
|
const instance = n2.component = n1.component;
|
|
if (shouldUpdateComponent(n1, n2, optimized)) {
|
|
if (instance.asyncDep && !instance.asyncResolved) {
|
|
if (true) {
|
|
pushWarningContext(n2);
|
|
}
|
|
updateComponentPreRender(instance, n2, optimized);
|
|
if (true) {
|
|
popWarningContext();
|
|
}
|
|
return;
|
|
} else {
|
|
instance.next = n2;
|
|
instance.update();
|
|
}
|
|
} else {
|
|
n2.el = n1.el;
|
|
instance.vnode = n2;
|
|
}
|
|
};
|
|
const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {
|
|
const componentUpdateFn = () => {
|
|
if (!instance.isMounted) {
|
|
let vnodeHook;
|
|
const { el, props } = initialVNode;
|
|
const { bm, m, parent, root, type } = instance;
|
|
const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);
|
|
toggleRecurse(instance, false);
|
|
if (bm) {
|
|
invokeArrayFns(bm);
|
|
}
|
|
if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {
|
|
invokeVNodeHook(vnodeHook, parent, initialVNode);
|
|
}
|
|
toggleRecurse(instance, true);
|
|
if (el && hydrateNode) {
|
|
const hydrateSubTree = () => {
|
|
if (true) {
|
|
startMeasure(instance, `render`);
|
|
}
|
|
instance.subTree = renderComponentRoot(instance);
|
|
if (true) {
|
|
endMeasure(instance, `render`);
|
|
}
|
|
if (true) {
|
|
startMeasure(instance, `hydrate`);
|
|
}
|
|
hydrateNode(
|
|
el,
|
|
instance.subTree,
|
|
instance,
|
|
parentSuspense,
|
|
null
|
|
);
|
|
if (true) {
|
|
endMeasure(instance, `hydrate`);
|
|
}
|
|
};
|
|
if (isAsyncWrapperVNode && type.__asyncHydrate) {
|
|
type.__asyncHydrate(
|
|
el,
|
|
instance,
|
|
hydrateSubTree
|
|
);
|
|
} else {
|
|
hydrateSubTree();
|
|
}
|
|
} else {
|
|
if (root.ce && // @ts-expect-error _def is private
|
|
root.ce._def.shadowRoot !== false) {
|
|
root.ce._injectChildStyle(type);
|
|
}
|
|
if (true) {
|
|
startMeasure(instance, `render`);
|
|
}
|
|
const subTree = instance.subTree = renderComponentRoot(instance);
|
|
if (true) {
|
|
endMeasure(instance, `render`);
|
|
}
|
|
if (true) {
|
|
startMeasure(instance, `patch`);
|
|
}
|
|
patch(
|
|
null,
|
|
subTree,
|
|
container,
|
|
anchor,
|
|
instance,
|
|
parentSuspense,
|
|
namespace
|
|
);
|
|
if (true) {
|
|
endMeasure(instance, `patch`);
|
|
}
|
|
initialVNode.el = subTree.el;
|
|
}
|
|
if (m) {
|
|
queuePostRenderEffect(m, parentSuspense);
|
|
}
|
|
if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {
|
|
const scopedInitialVNode = initialVNode;
|
|
queuePostRenderEffect(
|
|
() => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),
|
|
parentSuspense
|
|
);
|
|
}
|
|
if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {
|
|
instance.a && queuePostRenderEffect(instance.a, parentSuspense);
|
|
}
|
|
instance.isMounted = true;
|
|
if (true) {
|
|
devtoolsComponentAdded(instance);
|
|
}
|
|
initialVNode = container = anchor = null;
|
|
} else {
|
|
let { next, bu, u, parent, vnode } = instance;
|
|
{
|
|
const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);
|
|
if (nonHydratedAsyncRoot) {
|
|
if (next) {
|
|
next.el = vnode.el;
|
|
updateComponentPreRender(instance, next, optimized);
|
|
}
|
|
nonHydratedAsyncRoot.asyncDep.then(() => {
|
|
if (!instance.isUnmounted) {
|
|
componentUpdateFn();
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
let originNext = next;
|
|
let vnodeHook;
|
|
if (true) {
|
|
pushWarningContext(next || instance.vnode);
|
|
}
|
|
toggleRecurse(instance, false);
|
|
if (next) {
|
|
next.el = vnode.el;
|
|
updateComponentPreRender(instance, next, optimized);
|
|
} else {
|
|
next = vnode;
|
|
}
|
|
if (bu) {
|
|
invokeArrayFns(bu);
|
|
}
|
|
if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {
|
|
invokeVNodeHook(vnodeHook, parent, next, vnode);
|
|
}
|
|
toggleRecurse(instance, true);
|
|
if (true) {
|
|
startMeasure(instance, `render`);
|
|
}
|
|
const nextTree = renderComponentRoot(instance);
|
|
if (true) {
|
|
endMeasure(instance, `render`);
|
|
}
|
|
const prevTree = instance.subTree;
|
|
instance.subTree = nextTree;
|
|
if (true) {
|
|
startMeasure(instance, `patch`);
|
|
}
|
|
patch(
|
|
prevTree,
|
|
nextTree,
|
|
// parent may have changed if it's in a teleport
|
|
hostParentNode(prevTree.el),
|
|
// anchor may have changed if it's in a fragment
|
|
getNextHostNode(prevTree),
|
|
instance,
|
|
parentSuspense,
|
|
namespace
|
|
);
|
|
if (true) {
|
|
endMeasure(instance, `patch`);
|
|
}
|
|
next.el = nextTree.el;
|
|
if (originNext === null) {
|
|
updateHOCHostEl(instance, nextTree.el);
|
|
}
|
|
if (u) {
|
|
queuePostRenderEffect(u, parentSuspense);
|
|
}
|
|
if (vnodeHook = next.props && next.props.onVnodeUpdated) {
|
|
queuePostRenderEffect(
|
|
() => invokeVNodeHook(vnodeHook, parent, next, vnode),
|
|
parentSuspense
|
|
);
|
|
}
|
|
if (true) {
|
|
devtoolsComponentUpdated(instance);
|
|
}
|
|
if (true) {
|
|
popWarningContext();
|
|
}
|
|
}
|
|
};
|
|
instance.scope.on();
|
|
const effect2 = instance.effect = new ReactiveEffect(componentUpdateFn);
|
|
instance.scope.off();
|
|
const update = instance.update = effect2.run.bind(effect2);
|
|
const job = instance.job = effect2.runIfDirty.bind(effect2);
|
|
job.i = instance;
|
|
job.id = instance.uid;
|
|
effect2.scheduler = () => queueJob(job);
|
|
toggleRecurse(instance, true);
|
|
if (true) {
|
|
effect2.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;
|
|
effect2.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;
|
|
}
|
|
update();
|
|
};
|
|
const updateComponentPreRender = (instance, nextVNode, optimized) => {
|
|
nextVNode.component = instance;
|
|
const prevProps = instance.vnode.props;
|
|
instance.vnode = nextVNode;
|
|
instance.next = null;
|
|
updateProps(instance, nextVNode.props, prevProps, optimized);
|
|
updateSlots(instance, nextVNode.children, optimized);
|
|
pauseTracking();
|
|
flushPreFlushCbs(instance);
|
|
resetTracking();
|
|
};
|
|
const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {
|
|
const c1 = n1 && n1.children;
|
|
const prevShapeFlag = n1 ? n1.shapeFlag : 0;
|
|
const c2 = n2.children;
|
|
const { patchFlag, shapeFlag } = n2;
|
|
if (patchFlag > 0) {
|
|
if (patchFlag & 128) {
|
|
patchKeyedChildren(
|
|
c1,
|
|
c2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
return;
|
|
} else if (patchFlag & 256) {
|
|
patchUnkeyedChildren(
|
|
c1,
|
|
c2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
if (shapeFlag & 8) {
|
|
if (prevShapeFlag & 16) {
|
|
unmountChildren(c1, parentComponent, parentSuspense);
|
|
}
|
|
if (c2 !== c1) {
|
|
hostSetElementText(container, c2);
|
|
}
|
|
} else {
|
|
if (prevShapeFlag & 16) {
|
|
if (shapeFlag & 16) {
|
|
patchKeyedChildren(
|
|
c1,
|
|
c2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else {
|
|
unmountChildren(c1, parentComponent, parentSuspense, true);
|
|
}
|
|
} else {
|
|
if (prevShapeFlag & 8) {
|
|
hostSetElementText(container, "");
|
|
}
|
|
if (shapeFlag & 16) {
|
|
mountChildren(
|
|
c2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
|
|
c1 = c1 || EMPTY_ARR;
|
|
c2 = c2 || EMPTY_ARR;
|
|
const oldLength = c1.length;
|
|
const newLength = c2.length;
|
|
const commonLength = Math.min(oldLength, newLength);
|
|
let i;
|
|
for (i = 0; i < commonLength; i++) {
|
|
const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
|
|
patch(
|
|
c1[i],
|
|
nextChild,
|
|
container,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
}
|
|
if (oldLength > newLength) {
|
|
unmountChildren(
|
|
c1,
|
|
parentComponent,
|
|
parentSuspense,
|
|
true,
|
|
false,
|
|
commonLength
|
|
);
|
|
} else {
|
|
mountChildren(
|
|
c2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized,
|
|
commonLength
|
|
);
|
|
}
|
|
};
|
|
const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
|
|
let i = 0;
|
|
const l2 = c2.length;
|
|
let e1 = c1.length - 1;
|
|
let e2 = l2 - 1;
|
|
while (i <= e1 && i <= e2) {
|
|
const n1 = c1[i];
|
|
const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
|
|
if (isSameVNodeType(n1, n2)) {
|
|
patch(
|
|
n1,
|
|
n2,
|
|
container,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else {
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
while (i <= e1 && i <= e2) {
|
|
const n1 = c1[e1];
|
|
const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);
|
|
if (isSameVNodeType(n1, n2)) {
|
|
patch(
|
|
n1,
|
|
n2,
|
|
container,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else {
|
|
break;
|
|
}
|
|
e1--;
|
|
e2--;
|
|
}
|
|
if (i > e1) {
|
|
if (i <= e2) {
|
|
const nextPos = e2 + 1;
|
|
const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
|
|
while (i <= e2) {
|
|
patch(
|
|
null,
|
|
c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
i++;
|
|
}
|
|
}
|
|
} else if (i > e2) {
|
|
while (i <= e1) {
|
|
unmount(c1[i], parentComponent, parentSuspense, true);
|
|
i++;
|
|
}
|
|
} else {
|
|
const s1 = i;
|
|
const s2 = i;
|
|
const keyToNewIndexMap = /* @__PURE__ */ new Map();
|
|
for (i = s2; i <= e2; i++) {
|
|
const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
|
|
if (nextChild.key != null) {
|
|
if (keyToNewIndexMap.has(nextChild.key)) {
|
|
warn$1(
|
|
`Duplicate keys found during update:`,
|
|
JSON.stringify(nextChild.key),
|
|
`Make sure keys are unique.`
|
|
);
|
|
}
|
|
keyToNewIndexMap.set(nextChild.key, i);
|
|
}
|
|
}
|
|
let j;
|
|
let patched = 0;
|
|
const toBePatched = e2 - s2 + 1;
|
|
let moved = false;
|
|
let maxNewIndexSoFar = 0;
|
|
const newIndexToOldIndexMap = new Array(toBePatched);
|
|
for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0;
|
|
for (i = s1; i <= e1; i++) {
|
|
const prevChild = c1[i];
|
|
if (patched >= toBePatched) {
|
|
unmount(prevChild, parentComponent, parentSuspense, true);
|
|
continue;
|
|
}
|
|
let newIndex;
|
|
if (prevChild.key != null) {
|
|
newIndex = keyToNewIndexMap.get(prevChild.key);
|
|
} else {
|
|
for (j = s2; j <= e2; j++) {
|
|
if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {
|
|
newIndex = j;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (newIndex === void 0) {
|
|
unmount(prevChild, parentComponent, parentSuspense, true);
|
|
} else {
|
|
newIndexToOldIndexMap[newIndex - s2] = i + 1;
|
|
if (newIndex >= maxNewIndexSoFar) {
|
|
maxNewIndexSoFar = newIndex;
|
|
} else {
|
|
moved = true;
|
|
}
|
|
patch(
|
|
prevChild,
|
|
c2[newIndex],
|
|
container,
|
|
null,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
patched++;
|
|
}
|
|
}
|
|
const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;
|
|
j = increasingNewIndexSequence.length - 1;
|
|
for (i = toBePatched - 1; i >= 0; i--) {
|
|
const nextIndex = s2 + i;
|
|
const nextChild = c2[nextIndex];
|
|
const anchorVNode = c2[nextIndex + 1];
|
|
const anchor = nextIndex + 1 < l2 ? (
|
|
// #13559, fallback to el placeholder for unresolved async component
|
|
anchorVNode.el || anchorVNode.placeholder
|
|
) : parentAnchor;
|
|
if (newIndexToOldIndexMap[i] === 0) {
|
|
patch(
|
|
null,
|
|
nextChild,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
} else if (moved) {
|
|
if (j < 0 || i !== increasingNewIndexSequence[j]) {
|
|
move(nextChild, container, anchor, 2);
|
|
} else {
|
|
j--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
|
|
const { el, type, transition, children, shapeFlag } = vnode;
|
|
if (shapeFlag & 6) {
|
|
move(vnode.component.subTree, container, anchor, moveType);
|
|
return;
|
|
}
|
|
if (shapeFlag & 128) {
|
|
vnode.suspense.move(container, anchor, moveType);
|
|
return;
|
|
}
|
|
if (shapeFlag & 64) {
|
|
type.move(vnode, container, anchor, internals);
|
|
return;
|
|
}
|
|
if (type === Fragment) {
|
|
hostInsert(el, container, anchor);
|
|
for (let i = 0; i < children.length; i++) {
|
|
move(children[i], container, anchor, moveType);
|
|
}
|
|
hostInsert(vnode.anchor, container, anchor);
|
|
return;
|
|
}
|
|
if (type === Static) {
|
|
moveStaticNode(vnode, container, anchor);
|
|
return;
|
|
}
|
|
const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition;
|
|
if (needTransition2) {
|
|
if (moveType === 0) {
|
|
transition.beforeEnter(el);
|
|
hostInsert(el, container, anchor);
|
|
queuePostRenderEffect(() => transition.enter(el), parentSuspense);
|
|
} else {
|
|
const { leave, delayLeave, afterLeave } = transition;
|
|
const remove22 = () => {
|
|
if (vnode.ctx.isUnmounted) {
|
|
hostRemove(el);
|
|
} else {
|
|
hostInsert(el, container, anchor);
|
|
}
|
|
};
|
|
const performLeave = () => {
|
|
if (el._isLeaving) {
|
|
el[leaveCbKey](
|
|
true
|
|
/* cancelled */
|
|
);
|
|
}
|
|
leave(el, () => {
|
|
remove22();
|
|
afterLeave && afterLeave();
|
|
});
|
|
};
|
|
if (delayLeave) {
|
|
delayLeave(el, remove22, performLeave);
|
|
} else {
|
|
performLeave();
|
|
}
|
|
}
|
|
} else {
|
|
hostInsert(el, container, anchor);
|
|
}
|
|
};
|
|
const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
|
|
const {
|
|
type,
|
|
props,
|
|
ref: ref3,
|
|
children,
|
|
dynamicChildren,
|
|
shapeFlag,
|
|
patchFlag,
|
|
dirs,
|
|
cacheIndex
|
|
} = vnode;
|
|
if (patchFlag === -2) {
|
|
optimized = false;
|
|
}
|
|
if (ref3 != null) {
|
|
pauseTracking();
|
|
setRef(ref3, null, parentSuspense, vnode, true);
|
|
resetTracking();
|
|
}
|
|
if (cacheIndex != null) {
|
|
parentComponent.renderCache[cacheIndex] = void 0;
|
|
}
|
|
if (shapeFlag & 256) {
|
|
parentComponent.ctx.deactivate(vnode);
|
|
return;
|
|
}
|
|
const shouldInvokeDirs = shapeFlag & 1 && dirs;
|
|
const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);
|
|
let vnodeHook;
|
|
if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {
|
|
invokeVNodeHook(vnodeHook, parentComponent, vnode);
|
|
}
|
|
if (shapeFlag & 6) {
|
|
unmountComponent(vnode.component, parentSuspense, doRemove);
|
|
} else {
|
|
if (shapeFlag & 128) {
|
|
vnode.suspense.unmount(parentSuspense, doRemove);
|
|
return;
|
|
}
|
|
if (shouldInvokeDirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount");
|
|
}
|
|
if (shapeFlag & 64) {
|
|
vnode.type.remove(
|
|
vnode,
|
|
parentComponent,
|
|
parentSuspense,
|
|
internals,
|
|
doRemove
|
|
);
|
|
} else if (dynamicChildren && // #5154
|
|
// when v-once is used inside a block, setBlockTracking(-1) marks the
|
|
// parent block with hasOnce: true
|
|
// so that it doesn't take the fast path during unmount - otherwise
|
|
// components nested in v-once are never unmounted.
|
|
!dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments
|
|
(type !== Fragment || patchFlag > 0 && patchFlag & 64)) {
|
|
unmountChildren(
|
|
dynamicChildren,
|
|
parentComponent,
|
|
parentSuspense,
|
|
false,
|
|
true
|
|
);
|
|
} else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {
|
|
unmountChildren(children, parentComponent, parentSuspense);
|
|
}
|
|
if (doRemove) {
|
|
remove2(vnode);
|
|
}
|
|
}
|
|
if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {
|
|
queuePostRenderEffect(() => {
|
|
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
|
|
shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted");
|
|
}, parentSuspense);
|
|
}
|
|
};
|
|
const remove2 = (vnode) => {
|
|
const { type, el, anchor, transition } = vnode;
|
|
if (type === Fragment) {
|
|
if (vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {
|
|
vnode.children.forEach((child) => {
|
|
if (child.type === Comment) {
|
|
hostRemove(child.el);
|
|
} else {
|
|
remove2(child);
|
|
}
|
|
});
|
|
} else {
|
|
removeFragment(el, anchor);
|
|
}
|
|
return;
|
|
}
|
|
if (type === Static) {
|
|
removeStaticNode(vnode);
|
|
return;
|
|
}
|
|
const performRemove = () => {
|
|
hostRemove(el);
|
|
if (transition && !transition.persisted && transition.afterLeave) {
|
|
transition.afterLeave();
|
|
}
|
|
};
|
|
if (vnode.shapeFlag & 1 && transition && !transition.persisted) {
|
|
const { leave, delayLeave } = transition;
|
|
const performLeave = () => leave(el, performRemove);
|
|
if (delayLeave) {
|
|
delayLeave(vnode.el, performRemove, performLeave);
|
|
} else {
|
|
performLeave();
|
|
}
|
|
} else {
|
|
performRemove();
|
|
}
|
|
};
|
|
const removeFragment = (cur, end) => {
|
|
let next;
|
|
while (cur !== end) {
|
|
next = hostNextSibling(cur);
|
|
hostRemove(cur);
|
|
cur = next;
|
|
}
|
|
hostRemove(end);
|
|
};
|
|
const unmountComponent = (instance, parentSuspense, doRemove) => {
|
|
if (instance.type.__hmrId) {
|
|
unregisterHMR(instance);
|
|
}
|
|
const { bum, scope, job, subTree, um, m, a } = instance;
|
|
invalidateMount(m);
|
|
invalidateMount(a);
|
|
if (bum) {
|
|
invokeArrayFns(bum);
|
|
}
|
|
scope.stop();
|
|
if (job) {
|
|
job.flags |= 8;
|
|
unmount(subTree, instance, parentSuspense, doRemove);
|
|
}
|
|
if (um) {
|
|
queuePostRenderEffect(um, parentSuspense);
|
|
}
|
|
queuePostRenderEffect(() => {
|
|
instance.isUnmounted = true;
|
|
}, parentSuspense);
|
|
if (true) {
|
|
devtoolsComponentRemoved(instance);
|
|
}
|
|
};
|
|
const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
|
|
for (let i = start; i < children.length; i++) {
|
|
unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
|
|
}
|
|
};
|
|
const getNextHostNode = (vnode) => {
|
|
if (vnode.shapeFlag & 6) {
|
|
return getNextHostNode(vnode.component.subTree);
|
|
}
|
|
if (vnode.shapeFlag & 128) {
|
|
return vnode.suspense.next();
|
|
}
|
|
const el = hostNextSibling(vnode.anchor || vnode.el);
|
|
const teleportEnd = el && el[TeleportEndKey];
|
|
return teleportEnd ? hostNextSibling(teleportEnd) : el;
|
|
};
|
|
let isFlushing = false;
|
|
const render = (vnode, container, namespace) => {
|
|
if (vnode == null) {
|
|
if (container._vnode) {
|
|
unmount(container._vnode, null, null, true);
|
|
}
|
|
} else {
|
|
patch(
|
|
container._vnode || null,
|
|
vnode,
|
|
container,
|
|
null,
|
|
null,
|
|
null,
|
|
namespace
|
|
);
|
|
}
|
|
container._vnode = vnode;
|
|
if (!isFlushing) {
|
|
isFlushing = true;
|
|
flushPreFlushCbs();
|
|
flushPostFlushCbs();
|
|
isFlushing = false;
|
|
}
|
|
};
|
|
const internals = {
|
|
p: patch,
|
|
um: unmount,
|
|
m: move,
|
|
r: remove2,
|
|
mt: mountComponent,
|
|
mc: mountChildren,
|
|
pc: patchChildren,
|
|
pbc: patchBlockChildren,
|
|
n: getNextHostNode,
|
|
o: options
|
|
};
|
|
let hydrate;
|
|
let hydrateNode;
|
|
if (createHydrationFns) {
|
|
[hydrate, hydrateNode] = createHydrationFns(
|
|
internals
|
|
);
|
|
}
|
|
return {
|
|
render,
|
|
hydrate,
|
|
createApp: createAppAPI(render, hydrate)
|
|
};
|
|
}
|
|
function resolveChildrenNamespace({ type, props }, currentNamespace) {
|
|
return currentNamespace === "svg" && type === "foreignObject" || currentNamespace === "mathml" && type === "annotation-xml" && props && props.encoding && props.encoding.includes("html") ? void 0 : currentNamespace;
|
|
}
|
|
function toggleRecurse({ effect: effect2, job }, allowed) {
|
|
if (allowed) {
|
|
effect2.flags |= 32;
|
|
job.flags |= 4;
|
|
} else {
|
|
effect2.flags &= -33;
|
|
job.flags &= -5;
|
|
}
|
|
}
|
|
function needTransition(parentSuspense, transition) {
|
|
return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
|
|
}
|
|
function traverseStaticChildren(n1, n2, shallow = false) {
|
|
const ch1 = n1.children;
|
|
const ch2 = n2.children;
|
|
if (isArray(ch1) && isArray(ch2)) {
|
|
for (let i = 0; i < ch1.length; i++) {
|
|
const c1 = ch1[i];
|
|
let c2 = ch2[i];
|
|
if (c2.shapeFlag & 1 && !c2.dynamicChildren) {
|
|
if (c2.patchFlag <= 0 || c2.patchFlag === 32) {
|
|
c2 = ch2[i] = cloneIfMounted(ch2[i]);
|
|
c2.el = c1.el;
|
|
}
|
|
if (!shallow && c2.patchFlag !== -2)
|
|
traverseStaticChildren(c1, c2);
|
|
}
|
|
if (c2.type === Text && // avoid cached text nodes retaining detached dom nodes
|
|
c2.patchFlag !== -1) {
|
|
c2.el = c1.el;
|
|
}
|
|
if (c2.type === Comment && !c2.el) {
|
|
c2.el = c1.el;
|
|
}
|
|
if (true) {
|
|
c2.el && (c2.el.__vnode = c2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getSequence(arr) {
|
|
const p = arr.slice();
|
|
const result = [0];
|
|
let i, j, u, v, c;
|
|
const len = arr.length;
|
|
for (i = 0; i < len; i++) {
|
|
const arrI = arr[i];
|
|
if (arrI !== 0) {
|
|
j = result[result.length - 1];
|
|
if (arr[j] < arrI) {
|
|
p[i] = j;
|
|
result.push(i);
|
|
continue;
|
|
}
|
|
u = 0;
|
|
v = result.length - 1;
|
|
while (u < v) {
|
|
c = u + v >> 1;
|
|
if (arr[result[c]] < arrI) {
|
|
u = c + 1;
|
|
} else {
|
|
v = c;
|
|
}
|
|
}
|
|
if (arrI < arr[result[u]]) {
|
|
if (u > 0) {
|
|
p[i] = result[u - 1];
|
|
}
|
|
result[u] = i;
|
|
}
|
|
}
|
|
}
|
|
u = result.length;
|
|
v = result[u - 1];
|
|
while (u-- > 0) {
|
|
result[u] = v;
|
|
v = p[v];
|
|
}
|
|
return result;
|
|
}
|
|
function locateNonHydratedAsyncRoot(instance) {
|
|
const subComponent = instance.subTree.component;
|
|
if (subComponent) {
|
|
if (subComponent.asyncDep && !subComponent.asyncResolved) {
|
|
return subComponent;
|
|
} else {
|
|
return locateNonHydratedAsyncRoot(subComponent);
|
|
}
|
|
}
|
|
}
|
|
function invalidateMount(hooks) {
|
|
if (hooks) {
|
|
for (let i = 0; i < hooks.length; i++)
|
|
hooks[i].flags |= 8;
|
|
}
|
|
}
|
|
const ssrContextKey = Symbol.for("v-scx");
|
|
const useSSRContext = () => {
|
|
{
|
|
const ctx = inject(ssrContextKey);
|
|
if (!ctx) {
|
|
warn$1(
|
|
`Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`
|
|
);
|
|
}
|
|
return ctx;
|
|
}
|
|
};
|
|
function watchEffect(effect2, options) {
|
|
return doWatch(effect2, null, options);
|
|
}
|
|
function watchPostEffect(effect2, options) {
|
|
return doWatch(
|
|
effect2,
|
|
null,
|
|
true ? extend({}, options, { flush: "post" }) : { flush: "post" }
|
|
);
|
|
}
|
|
function watchSyncEffect(effect2, options) {
|
|
return doWatch(
|
|
effect2,
|
|
null,
|
|
true ? extend({}, options, { flush: "sync" }) : { flush: "sync" }
|
|
);
|
|
}
|
|
function watch(source, cb, options) {
|
|
if (!isFunction(cb)) {
|
|
warn$1(
|
|
`\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`
|
|
);
|
|
}
|
|
return doWatch(source, cb, options);
|
|
}
|
|
function doWatch(source, cb, options = EMPTY_OBJ) {
|
|
const { immediate, deep, flush, once } = options;
|
|
if (!cb) {
|
|
if (immediate !== void 0) {
|
|
warn$1(
|
|
`watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`
|
|
);
|
|
}
|
|
if (deep !== void 0) {
|
|
warn$1(
|
|
`watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
|
|
);
|
|
}
|
|
if (once !== void 0) {
|
|
warn$1(
|
|
`watch() "once" option is only respected when using the watch(source, callback, options?) signature.`
|
|
);
|
|
}
|
|
}
|
|
const baseWatchOptions = extend({}, options);
|
|
if (true) baseWatchOptions.onWarn = warn$1;
|
|
const runsImmediately = cb && immediate || !cb && flush !== "post";
|
|
let ssrCleanup;
|
|
if (isInSSRComponentSetup) {
|
|
if (flush === "sync") {
|
|
const ctx = useSSRContext();
|
|
ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);
|
|
} else if (!runsImmediately) {
|
|
const watchStopHandle = () => {
|
|
};
|
|
watchStopHandle.stop = NOOP;
|
|
watchStopHandle.resume = NOOP;
|
|
watchStopHandle.pause = NOOP;
|
|
return watchStopHandle;
|
|
}
|
|
}
|
|
const instance = currentInstance;
|
|
baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);
|
|
let isPre = false;
|
|
if (flush === "post") {
|
|
baseWatchOptions.scheduler = (job) => {
|
|
queuePostRenderEffect(job, instance && instance.suspense);
|
|
};
|
|
} else if (flush !== "sync") {
|
|
isPre = true;
|
|
baseWatchOptions.scheduler = (job, isFirstRun) => {
|
|
if (isFirstRun) {
|
|
job();
|
|
} else {
|
|
queueJob(job);
|
|
}
|
|
};
|
|
}
|
|
baseWatchOptions.augmentJob = (job) => {
|
|
if (cb) {
|
|
job.flags |= 4;
|
|
}
|
|
if (isPre) {
|
|
job.flags |= 2;
|
|
if (instance) {
|
|
job.id = instance.uid;
|
|
job.i = instance;
|
|
}
|
|
}
|
|
};
|
|
const watchHandle = watch$1(source, cb, baseWatchOptions);
|
|
if (isInSSRComponentSetup) {
|
|
if (ssrCleanup) {
|
|
ssrCleanup.push(watchHandle);
|
|
} else if (runsImmediately) {
|
|
watchHandle();
|
|
}
|
|
}
|
|
return watchHandle;
|
|
}
|
|
function instanceWatch(source, value, options) {
|
|
const publicThis = this.proxy;
|
|
const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
|
|
let cb;
|
|
if (isFunction(value)) {
|
|
cb = value;
|
|
} else {
|
|
cb = value.handler;
|
|
options = value;
|
|
}
|
|
const reset = setCurrentInstance(this);
|
|
const res = doWatch(getter, cb.bind(publicThis), options);
|
|
reset();
|
|
return res;
|
|
}
|
|
function createPathGetter(ctx, path) {
|
|
const segments = path.split(".");
|
|
return () => {
|
|
let cur = ctx;
|
|
for (let i = 0; i < segments.length && cur; i++) {
|
|
cur = cur[segments[i]];
|
|
}
|
|
return cur;
|
|
};
|
|
}
|
|
function useModel(props, name, options = EMPTY_OBJ) {
|
|
const i = getCurrentInstance();
|
|
if (!i) {
|
|
warn$1(`useModel() called without active instance.`);
|
|
return ref();
|
|
}
|
|
const camelizedName = camelize(name);
|
|
if (!i.propsOptions[0][camelizedName]) {
|
|
warn$1(`useModel() called with prop "${name}" which is not declared.`);
|
|
return ref();
|
|
}
|
|
const hyphenatedName = hyphenate(name);
|
|
const modifiers = getModelModifiers(props, camelizedName);
|
|
const res = customRef((track2, trigger2) => {
|
|
let localValue;
|
|
let prevSetValue = EMPTY_OBJ;
|
|
let prevEmittedValue;
|
|
watchSyncEffect(() => {
|
|
const propValue = props[camelizedName];
|
|
if (hasChanged(localValue, propValue)) {
|
|
localValue = propValue;
|
|
trigger2();
|
|
}
|
|
});
|
|
return {
|
|
get() {
|
|
track2();
|
|
return options.get ? options.get(localValue) : localValue;
|
|
},
|
|
set(value) {
|
|
const emittedValue = options.set ? options.set(value) : value;
|
|
if (!hasChanged(emittedValue, localValue) && !(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue))) {
|
|
return;
|
|
}
|
|
const rawProps = i.vnode.props;
|
|
if (!(rawProps && // check if parent has passed v-model
|
|
(name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps))) {
|
|
localValue = value;
|
|
trigger2();
|
|
}
|
|
i.emit(`update:${name}`, emittedValue);
|
|
if (hasChanged(value, emittedValue) && hasChanged(value, prevSetValue) && !hasChanged(emittedValue, prevEmittedValue)) {
|
|
trigger2();
|
|
}
|
|
prevSetValue = value;
|
|
prevEmittedValue = emittedValue;
|
|
}
|
|
};
|
|
});
|
|
res[Symbol.iterator] = () => {
|
|
let i2 = 0;
|
|
return {
|
|
next() {
|
|
if (i2 < 2) {
|
|
return { value: i2++ ? modifiers || EMPTY_OBJ : res, done: false };
|
|
} else {
|
|
return { done: true };
|
|
}
|
|
}
|
|
};
|
|
};
|
|
return res;
|
|
}
|
|
const getModelModifiers = (props, modelName) => {
|
|
return modelName === "modelValue" || modelName === "model-value" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`];
|
|
};
|
|
function emit(instance, event, ...rawArgs) {
|
|
if (instance.isUnmounted) return;
|
|
const props = instance.vnode.props || EMPTY_OBJ;
|
|
if (true) {
|
|
const {
|
|
emitsOptions,
|
|
propsOptions: [propsOptions]
|
|
} = instance;
|
|
if (emitsOptions) {
|
|
if (!(event in emitsOptions) && true) {
|
|
if (!propsOptions || !(toHandlerKey(camelize(event)) in propsOptions)) {
|
|
warn$1(
|
|
`Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(camelize(event))}" prop.`
|
|
);
|
|
}
|
|
} else {
|
|
const validator = emitsOptions[event];
|
|
if (isFunction(validator)) {
|
|
const isValid = validator(...rawArgs);
|
|
if (!isValid) {
|
|
warn$1(
|
|
`Invalid event arguments: event validation failed for event "${event}".`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
let args = rawArgs;
|
|
const isModelListener2 = event.startsWith("update:");
|
|
const modifiers = isModelListener2 && getModelModifiers(props, event.slice(7));
|
|
if (modifiers) {
|
|
if (modifiers.trim) {
|
|
args = rawArgs.map((a) => isString(a) ? a.trim() : a);
|
|
}
|
|
if (modifiers.number) {
|
|
args = rawArgs.map(looseToNumber);
|
|
}
|
|
}
|
|
if (true) {
|
|
devtoolsComponentEmit(instance, event, args);
|
|
}
|
|
if (true) {
|
|
const lowerCaseEvent = event.toLowerCase();
|
|
if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {
|
|
warn$1(
|
|
`Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(
|
|
instance,
|
|
instance.type
|
|
)} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(
|
|
event
|
|
)}" instead of "${event}".`
|
|
);
|
|
}
|
|
}
|
|
let handlerName;
|
|
let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)
|
|
props[handlerName = toHandlerKey(camelize(event))];
|
|
if (!handler && isModelListener2) {
|
|
handler = props[handlerName = toHandlerKey(hyphenate(event))];
|
|
}
|
|
if (handler) {
|
|
callWithAsyncErrorHandling(
|
|
handler,
|
|
instance,
|
|
6,
|
|
args
|
|
);
|
|
}
|
|
const onceHandler = props[handlerName + `Once`];
|
|
if (onceHandler) {
|
|
if (!instance.emitted) {
|
|
instance.emitted = {};
|
|
} else if (instance.emitted[handlerName]) {
|
|
return;
|
|
}
|
|
instance.emitted[handlerName] = true;
|
|
callWithAsyncErrorHandling(
|
|
onceHandler,
|
|
instance,
|
|
6,
|
|
args
|
|
);
|
|
}
|
|
}
|
|
function normalizeEmitsOptions(comp, appContext, asMixin = false) {
|
|
const cache = appContext.emitsCache;
|
|
const cached = cache.get(comp);
|
|
if (cached !== void 0) {
|
|
return cached;
|
|
}
|
|
const raw = comp.emits;
|
|
let normalized = {};
|
|
let hasExtends = false;
|
|
if (__VUE_OPTIONS_API__ && !isFunction(comp)) {
|
|
const extendEmits = (raw2) => {
|
|
const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
|
|
if (normalizedFromExtend) {
|
|
hasExtends = true;
|
|
extend(normalized, normalizedFromExtend);
|
|
}
|
|
};
|
|
if (!asMixin && appContext.mixins.length) {
|
|
appContext.mixins.forEach(extendEmits);
|
|
}
|
|
if (comp.extends) {
|
|
extendEmits(comp.extends);
|
|
}
|
|
if (comp.mixins) {
|
|
comp.mixins.forEach(extendEmits);
|
|
}
|
|
}
|
|
if (!raw && !hasExtends) {
|
|
if (isObject(comp)) {
|
|
cache.set(comp, null);
|
|
}
|
|
return null;
|
|
}
|
|
if (isArray(raw)) {
|
|
raw.forEach((key) => normalized[key] = null);
|
|
} else {
|
|
extend(normalized, raw);
|
|
}
|
|
if (isObject(comp)) {
|
|
cache.set(comp, normalized);
|
|
}
|
|
return normalized;
|
|
}
|
|
function isEmitListener(options, key) {
|
|
if (!options || !isOn(key)) {
|
|
return false;
|
|
}
|
|
key = key.slice(2).replace(/Once$/, "");
|
|
return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
|
|
}
|
|
let accessedAttrs = false;
|
|
function markAttrsAccessed() {
|
|
accessedAttrs = true;
|
|
}
|
|
function renderComponentRoot(instance) {
|
|
const {
|
|
type: Component,
|
|
vnode,
|
|
proxy,
|
|
withProxy,
|
|
propsOptions: [propsOptions],
|
|
slots,
|
|
attrs,
|
|
emit: emit2,
|
|
render,
|
|
renderCache,
|
|
props,
|
|
data,
|
|
setupState,
|
|
ctx,
|
|
inheritAttrs
|
|
} = instance;
|
|
const prev = setCurrentRenderingInstance(instance);
|
|
let result;
|
|
let fallthroughAttrs;
|
|
if (true) {
|
|
accessedAttrs = false;
|
|
}
|
|
try {
|
|
if (vnode.shapeFlag & 4) {
|
|
const proxyToUse = withProxy || proxy;
|
|
const thisProxy = setupState.__isScriptSetup ? new Proxy(proxyToUse, {
|
|
get(target, key, receiver) {
|
|
warn$1(
|
|
`Property '${String(
|
|
key
|
|
)}' was accessed via 'this'. Avoid using 'this' in templates.`
|
|
);
|
|
return Reflect.get(target, key, receiver);
|
|
}
|
|
}) : proxyToUse;
|
|
result = normalizeVNode(
|
|
render.call(
|
|
thisProxy,
|
|
proxyToUse,
|
|
renderCache,
|
|
true ? shallowReadonly(props) : props,
|
|
setupState,
|
|
data,
|
|
ctx
|
|
)
|
|
);
|
|
fallthroughAttrs = attrs;
|
|
} else {
|
|
const render2 = Component;
|
|
if (attrs === props) {
|
|
markAttrsAccessed();
|
|
}
|
|
result = normalizeVNode(
|
|
render2.length > 1 ? render2(
|
|
true ? shallowReadonly(props) : props,
|
|
true ? {
|
|
get attrs() {
|
|
markAttrsAccessed();
|
|
return shallowReadonly(attrs);
|
|
},
|
|
slots,
|
|
emit: emit2
|
|
} : { attrs, slots, emit: emit2 }
|
|
) : render2(
|
|
true ? shallowReadonly(props) : props,
|
|
null
|
|
)
|
|
);
|
|
fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);
|
|
}
|
|
} catch (err) {
|
|
blockStack.length = 0;
|
|
handleError(err, instance, 1);
|
|
result = createVNode(Comment);
|
|
}
|
|
let root = result;
|
|
let setRoot = void 0;
|
|
if (result.patchFlag > 0 && result.patchFlag & 2048) {
|
|
[root, setRoot] = getChildRoot(result);
|
|
}
|
|
if (fallthroughAttrs && inheritAttrs !== false) {
|
|
const keys = Object.keys(fallthroughAttrs);
|
|
const { shapeFlag } = root;
|
|
if (keys.length) {
|
|
if (shapeFlag & (1 | 6)) {
|
|
if (propsOptions && keys.some(isModelListener)) {
|
|
fallthroughAttrs = filterModelListeners(
|
|
fallthroughAttrs,
|
|
propsOptions
|
|
);
|
|
}
|
|
root = cloneVNode(root, fallthroughAttrs, false, true);
|
|
} else if (!accessedAttrs && root.type !== Comment) {
|
|
const allAttrs = Object.keys(attrs);
|
|
const eventAttrs = [];
|
|
const extraAttrs = [];
|
|
for (let i = 0, l = allAttrs.length; i < l; i++) {
|
|
const key = allAttrs[i];
|
|
if (isOn(key)) {
|
|
if (!isModelListener(key)) {
|
|
eventAttrs.push(key[2].toLowerCase() + key.slice(3));
|
|
}
|
|
} else {
|
|
extraAttrs.push(key);
|
|
}
|
|
}
|
|
if (extraAttrs.length) {
|
|
warn$1(
|
|
`Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text or teleport root nodes.`
|
|
);
|
|
}
|
|
if (eventAttrs.length) {
|
|
warn$1(
|
|
`Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (vnode.dirs) {
|
|
if (!isElementRoot(root)) {
|
|
warn$1(
|
|
`Runtime directive used on component with non-element root node. The directives will not function as intended.`
|
|
);
|
|
}
|
|
root = cloneVNode(root, null, false, true);
|
|
root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
|
|
}
|
|
if (vnode.transition) {
|
|
if (!isElementRoot(root)) {
|
|
warn$1(
|
|
`Component inside <Transition> renders non-element root node that cannot be animated.`
|
|
);
|
|
}
|
|
setTransitionHooks(root, vnode.transition);
|
|
}
|
|
if (setRoot) {
|
|
setRoot(root);
|
|
} else {
|
|
result = root;
|
|
}
|
|
setCurrentRenderingInstance(prev);
|
|
return result;
|
|
}
|
|
const getChildRoot = (vnode) => {
|
|
const rawChildren = vnode.children;
|
|
const dynamicChildren = vnode.dynamicChildren;
|
|
const childRoot = filterSingleRoot(rawChildren, false);
|
|
if (!childRoot) {
|
|
return [vnode, void 0];
|
|
} else if (childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) {
|
|
return getChildRoot(childRoot);
|
|
}
|
|
const index = rawChildren.indexOf(childRoot);
|
|
const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;
|
|
const setRoot = (updatedRoot) => {
|
|
rawChildren[index] = updatedRoot;
|
|
if (dynamicChildren) {
|
|
if (dynamicIndex > -1) {
|
|
dynamicChildren[dynamicIndex] = updatedRoot;
|
|
} else if (updatedRoot.patchFlag > 0) {
|
|
vnode.dynamicChildren = [...dynamicChildren, updatedRoot];
|
|
}
|
|
}
|
|
};
|
|
return [normalizeVNode(childRoot), setRoot];
|
|
};
|
|
function filterSingleRoot(children, recurse = true) {
|
|
let singleRoot;
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
if (isVNode(child)) {
|
|
if (child.type !== Comment || child.children === "v-if") {
|
|
if (singleRoot) {
|
|
return;
|
|
} else {
|
|
singleRoot = child;
|
|
if (recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) {
|
|
return filterSingleRoot(singleRoot.children);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
return singleRoot;
|
|
}
|
|
const getFunctionalFallthrough = (attrs) => {
|
|
let res;
|
|
for (const key in attrs) {
|
|
if (key === "class" || key === "style" || isOn(key)) {
|
|
(res || (res = {}))[key] = attrs[key];
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
const filterModelListeners = (attrs, props) => {
|
|
const res = {};
|
|
for (const key in attrs) {
|
|
if (!isModelListener(key) || !(key.slice(9) in props)) {
|
|
res[key] = attrs[key];
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
const isElementRoot = (vnode) => {
|
|
return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;
|
|
};
|
|
function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
|
|
const { props: prevProps, children: prevChildren, component } = prevVNode;
|
|
const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
|
|
const emits = component.emitsOptions;
|
|
if ((prevChildren || nextChildren) && isHmrUpdating) {
|
|
return true;
|
|
}
|
|
if (nextVNode.dirs || nextVNode.transition) {
|
|
return true;
|
|
}
|
|
if (optimized && patchFlag >= 0) {
|
|
if (patchFlag & 1024) {
|
|
return true;
|
|
}
|
|
if (patchFlag & 16) {
|
|
if (!prevProps) {
|
|
return !!nextProps;
|
|
}
|
|
return hasPropsChanged(prevProps, nextProps, emits);
|
|
} else if (patchFlag & 8) {
|
|
const dynamicProps = nextVNode.dynamicProps;
|
|
for (let i = 0; i < dynamicProps.length; i++) {
|
|
const key = dynamicProps[i];
|
|
if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (prevChildren || nextChildren) {
|
|
if (!nextChildren || !nextChildren.$stable) {
|
|
return true;
|
|
}
|
|
}
|
|
if (prevProps === nextProps) {
|
|
return false;
|
|
}
|
|
if (!prevProps) {
|
|
return !!nextProps;
|
|
}
|
|
if (!nextProps) {
|
|
return true;
|
|
}
|
|
return hasPropsChanged(prevProps, nextProps, emits);
|
|
}
|
|
return false;
|
|
}
|
|
function hasPropsChanged(prevProps, nextProps, emitsOptions) {
|
|
const nextKeys = Object.keys(nextProps);
|
|
if (nextKeys.length !== Object.keys(prevProps).length) {
|
|
return true;
|
|
}
|
|
for (let i = 0; i < nextKeys.length; i++) {
|
|
const key = nextKeys[i];
|
|
if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function updateHOCHostEl({ vnode, parent }, el) {
|
|
while (parent) {
|
|
const root = parent.subTree;
|
|
if (root.suspense && root.suspense.activeBranch === vnode) {
|
|
root.el = vnode.el;
|
|
}
|
|
if (root === vnode) {
|
|
(vnode = parent.vnode).el = el;
|
|
parent = parent.parent;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
const isSuspense = (type) => type.__isSuspense;
|
|
let suspenseId = 0;
|
|
const SuspenseImpl = {
|
|
name: "Suspense",
|
|
// In order to make Suspense tree-shakable, we need to avoid importing it
|
|
// directly in the renderer. The renderer checks for the __isSuspense flag
|
|
// on a vnode's type and calls the `process` method, passing in renderer
|
|
// internals.
|
|
__isSuspense: true,
|
|
process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {
|
|
if (n1 == null) {
|
|
mountSuspense(
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
parentSuspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized,
|
|
rendererInternals
|
|
);
|
|
} else {
|
|
if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) {
|
|
n2.suspense = n1.suspense;
|
|
n2.suspense.vnode = n2;
|
|
n2.el = n1.el;
|
|
return;
|
|
}
|
|
patchSuspense(
|
|
n1,
|
|
n2,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized,
|
|
rendererInternals
|
|
);
|
|
}
|
|
},
|
|
hydrate: hydrateSuspense,
|
|
normalize: normalizeSuspenseChildren
|
|
};
|
|
const Suspense = SuspenseImpl;
|
|
function triggerEvent(vnode, name) {
|
|
const eventListener = vnode.props && vnode.props[name];
|
|
if (isFunction(eventListener)) {
|
|
eventListener();
|
|
}
|
|
}
|
|
function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {
|
|
const {
|
|
p: patch,
|
|
o: { createElement }
|
|
} = rendererInternals;
|
|
const hiddenContainer = createElement("div");
|
|
const suspense = vnode.suspense = createSuspenseBoundary(
|
|
vnode,
|
|
parentSuspense,
|
|
parentComponent,
|
|
container,
|
|
hiddenContainer,
|
|
anchor,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized,
|
|
rendererInternals
|
|
);
|
|
patch(
|
|
null,
|
|
suspense.pendingBranch = vnode.ssContent,
|
|
hiddenContainer,
|
|
null,
|
|
parentComponent,
|
|
suspense,
|
|
namespace,
|
|
slotScopeIds
|
|
);
|
|
if (suspense.deps > 0) {
|
|
triggerEvent(vnode, "onPending");
|
|
triggerEvent(vnode, "onFallback");
|
|
patch(
|
|
null,
|
|
vnode.ssFallback,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
null,
|
|
// fallback tree will not have suspense context
|
|
namespace,
|
|
slotScopeIds
|
|
);
|
|
setActiveBranch(suspense, vnode.ssFallback);
|
|
} else {
|
|
suspense.resolve(false, true);
|
|
}
|
|
}
|
|
function patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {
|
|
const suspense = n2.suspense = n1.suspense;
|
|
suspense.vnode = n2;
|
|
n2.el = n1.el;
|
|
const newBranch = n2.ssContent;
|
|
const newFallback = n2.ssFallback;
|
|
const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;
|
|
if (pendingBranch) {
|
|
suspense.pendingBranch = newBranch;
|
|
if (isSameVNodeType(newBranch, pendingBranch)) {
|
|
patch(
|
|
pendingBranch,
|
|
newBranch,
|
|
suspense.hiddenContainer,
|
|
null,
|
|
parentComponent,
|
|
suspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
if (suspense.deps <= 0) {
|
|
suspense.resolve();
|
|
} else if (isInFallback) {
|
|
if (!isHydrating) {
|
|
patch(
|
|
activeBranch,
|
|
newFallback,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
null,
|
|
// fallback tree will not have suspense context
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
setActiveBranch(suspense, newFallback);
|
|
}
|
|
}
|
|
} else {
|
|
suspense.pendingId = suspenseId++;
|
|
if (isHydrating) {
|
|
suspense.isHydrating = false;
|
|
suspense.activeBranch = pendingBranch;
|
|
} else {
|
|
unmount(pendingBranch, parentComponent, suspense);
|
|
}
|
|
suspense.deps = 0;
|
|
suspense.effects.length = 0;
|
|
suspense.hiddenContainer = createElement("div");
|
|
if (isInFallback) {
|
|
patch(
|
|
null,
|
|
newBranch,
|
|
suspense.hiddenContainer,
|
|
null,
|
|
parentComponent,
|
|
suspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
if (suspense.deps <= 0) {
|
|
suspense.resolve();
|
|
} else {
|
|
patch(
|
|
activeBranch,
|
|
newFallback,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
null,
|
|
// fallback tree will not have suspense context
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
setActiveBranch(suspense, newFallback);
|
|
}
|
|
} else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
|
|
patch(
|
|
activeBranch,
|
|
newBranch,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
suspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
suspense.resolve(true);
|
|
} else {
|
|
patch(
|
|
null,
|
|
newBranch,
|
|
suspense.hiddenContainer,
|
|
null,
|
|
parentComponent,
|
|
suspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
if (suspense.deps <= 0) {
|
|
suspense.resolve();
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
|
|
patch(
|
|
activeBranch,
|
|
newBranch,
|
|
container,
|
|
anchor,
|
|
parentComponent,
|
|
suspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
setActiveBranch(suspense, newBranch);
|
|
} else {
|
|
triggerEvent(n2, "onPending");
|
|
suspense.pendingBranch = newBranch;
|
|
if (newBranch.shapeFlag & 512) {
|
|
suspense.pendingId = newBranch.component.suspenseId;
|
|
} else {
|
|
suspense.pendingId = suspenseId++;
|
|
}
|
|
patch(
|
|
null,
|
|
newBranch,
|
|
suspense.hiddenContainer,
|
|
null,
|
|
parentComponent,
|
|
suspense,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
if (suspense.deps <= 0) {
|
|
suspense.resolve();
|
|
} else {
|
|
const { timeout, pendingId } = suspense;
|
|
if (timeout > 0) {
|
|
setTimeout(() => {
|
|
if (suspense.pendingId === pendingId) {
|
|
suspense.fallback(newFallback);
|
|
}
|
|
}, timeout);
|
|
} else if (timeout === 0) {
|
|
suspense.fallback(newFallback);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
let hasWarned = false;
|
|
function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) {
|
|
if (!hasWarned) {
|
|
hasWarned = true;
|
|
console[console.info ? "info" : "log"](
|
|
`<Suspense> is an experimental feature and its API will likely change.`
|
|
);
|
|
}
|
|
const {
|
|
p: patch,
|
|
m: move,
|
|
um: unmount,
|
|
n: next,
|
|
o: { parentNode, remove: remove2 }
|
|
} = rendererInternals;
|
|
let parentSuspenseId;
|
|
const isSuspensible = isVNodeSuspensible(vnode);
|
|
if (isSuspensible) {
|
|
if (parentSuspense && parentSuspense.pendingBranch) {
|
|
parentSuspenseId = parentSuspense.pendingId;
|
|
parentSuspense.deps++;
|
|
}
|
|
}
|
|
const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;
|
|
if (true) {
|
|
assertNumber(timeout, `Suspense timeout`);
|
|
}
|
|
const initialAnchor = anchor;
|
|
const suspense = {
|
|
vnode,
|
|
parent: parentSuspense,
|
|
parentComponent,
|
|
namespace,
|
|
container,
|
|
hiddenContainer,
|
|
deps: 0,
|
|
pendingId: suspenseId++,
|
|
timeout: typeof timeout === "number" ? timeout : -1,
|
|
activeBranch: null,
|
|
pendingBranch: null,
|
|
isInFallback: !isHydrating,
|
|
isHydrating,
|
|
isUnmounted: false,
|
|
effects: [],
|
|
resolve(resume = false, sync = false) {
|
|
if (true) {
|
|
if (!resume && !suspense.pendingBranch) {
|
|
throw new Error(
|
|
`suspense.resolve() is called without a pending branch.`
|
|
);
|
|
}
|
|
if (suspense.isUnmounted) {
|
|
throw new Error(
|
|
`suspense.resolve() is called on an already unmounted suspense boundary.`
|
|
);
|
|
}
|
|
}
|
|
const {
|
|
vnode: vnode2,
|
|
activeBranch,
|
|
pendingBranch,
|
|
pendingId,
|
|
effects,
|
|
parentComponent: parentComponent2,
|
|
container: container2
|
|
} = suspense;
|
|
let delayEnter = false;
|
|
if (suspense.isHydrating) {
|
|
suspense.isHydrating = false;
|
|
} else if (!resume) {
|
|
delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in";
|
|
if (delayEnter) {
|
|
activeBranch.transition.afterLeave = () => {
|
|
if (pendingId === suspense.pendingId) {
|
|
move(
|
|
pendingBranch,
|
|
container2,
|
|
anchor === initialAnchor ? next(activeBranch) : anchor,
|
|
0
|
|
);
|
|
queuePostFlushCb(effects);
|
|
}
|
|
};
|
|
}
|
|
if (activeBranch) {
|
|
if (parentNode(activeBranch.el) === container2) {
|
|
anchor = next(activeBranch);
|
|
}
|
|
unmount(activeBranch, parentComponent2, suspense, true);
|
|
}
|
|
if (!delayEnter) {
|
|
move(pendingBranch, container2, anchor, 0);
|
|
}
|
|
}
|
|
setActiveBranch(suspense, pendingBranch);
|
|
suspense.pendingBranch = null;
|
|
suspense.isInFallback = false;
|
|
let parent = suspense.parent;
|
|
let hasUnresolvedAncestor = false;
|
|
while (parent) {
|
|
if (parent.pendingBranch) {
|
|
parent.effects.push(...effects);
|
|
hasUnresolvedAncestor = true;
|
|
break;
|
|
}
|
|
parent = parent.parent;
|
|
}
|
|
if (!hasUnresolvedAncestor && !delayEnter) {
|
|
queuePostFlushCb(effects);
|
|
}
|
|
suspense.effects = [];
|
|
if (isSuspensible) {
|
|
if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {
|
|
parentSuspense.deps--;
|
|
if (parentSuspense.deps === 0 && !sync) {
|
|
parentSuspense.resolve();
|
|
}
|
|
}
|
|
}
|
|
triggerEvent(vnode2, "onResolve");
|
|
},
|
|
fallback(fallbackVNode) {
|
|
if (!suspense.pendingBranch) {
|
|
return;
|
|
}
|
|
const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense;
|
|
triggerEvent(vnode2, "onFallback");
|
|
const anchor2 = next(activeBranch);
|
|
const mountFallback = () => {
|
|
if (!suspense.isInFallback) {
|
|
return;
|
|
}
|
|
patch(
|
|
null,
|
|
fallbackVNode,
|
|
container2,
|
|
anchor2,
|
|
parentComponent2,
|
|
null,
|
|
// fallback tree will not have suspense context
|
|
namespace2,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
setActiveBranch(suspense, fallbackVNode);
|
|
};
|
|
const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in";
|
|
if (delayEnter) {
|
|
activeBranch.transition.afterLeave = mountFallback;
|
|
}
|
|
suspense.isInFallback = true;
|
|
unmount(
|
|
activeBranch,
|
|
parentComponent2,
|
|
null,
|
|
// no suspense so unmount hooks fire now
|
|
true
|
|
// shouldRemove
|
|
);
|
|
if (!delayEnter) {
|
|
mountFallback();
|
|
}
|
|
},
|
|
move(container2, anchor2, type) {
|
|
suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);
|
|
suspense.container = container2;
|
|
},
|
|
next() {
|
|
return suspense.activeBranch && next(suspense.activeBranch);
|
|
},
|
|
registerDep(instance, setupRenderEffect, optimized2) {
|
|
const isInPendingSuspense = !!suspense.pendingBranch;
|
|
if (isInPendingSuspense) {
|
|
suspense.deps++;
|
|
}
|
|
const hydratedEl = instance.vnode.el;
|
|
instance.asyncDep.catch((err) => {
|
|
handleError(err, instance, 0);
|
|
}).then((asyncSetupResult) => {
|
|
if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {
|
|
return;
|
|
}
|
|
instance.asyncResolved = true;
|
|
const { vnode: vnode2 } = instance;
|
|
if (true) {
|
|
pushWarningContext(vnode2);
|
|
}
|
|
handleSetupResult(instance, asyncSetupResult, false);
|
|
if (hydratedEl) {
|
|
vnode2.el = hydratedEl;
|
|
}
|
|
const placeholder = !hydratedEl && instance.subTree.el;
|
|
setupRenderEffect(
|
|
instance,
|
|
vnode2,
|
|
// component may have been moved before resolve.
|
|
// if this is not a hydration, instance.subTree will be the comment
|
|
// placeholder.
|
|
parentNode(hydratedEl || instance.subTree.el),
|
|
// anchor will not be used if this is hydration, so only need to
|
|
// consider the comment placeholder case.
|
|
hydratedEl ? null : next(instance.subTree),
|
|
suspense,
|
|
namespace,
|
|
optimized2
|
|
);
|
|
if (placeholder) {
|
|
remove2(placeholder);
|
|
}
|
|
updateHOCHostEl(instance, vnode2.el);
|
|
if (true) {
|
|
popWarningContext();
|
|
}
|
|
if (isInPendingSuspense && --suspense.deps === 0) {
|
|
suspense.resolve();
|
|
}
|
|
});
|
|
},
|
|
unmount(parentSuspense2, doRemove) {
|
|
suspense.isUnmounted = true;
|
|
if (suspense.activeBranch) {
|
|
unmount(
|
|
suspense.activeBranch,
|
|
parentComponent,
|
|
parentSuspense2,
|
|
doRemove
|
|
);
|
|
}
|
|
if (suspense.pendingBranch) {
|
|
unmount(
|
|
suspense.pendingBranch,
|
|
parentComponent,
|
|
parentSuspense2,
|
|
doRemove
|
|
);
|
|
}
|
|
}
|
|
};
|
|
return suspense;
|
|
}
|
|
function hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) {
|
|
const suspense = vnode.suspense = createSuspenseBoundary(
|
|
vnode,
|
|
parentSuspense,
|
|
parentComponent,
|
|
node.parentNode,
|
|
// eslint-disable-next-line no-restricted-globals
|
|
document.createElement("div"),
|
|
null,
|
|
namespace,
|
|
slotScopeIds,
|
|
optimized,
|
|
rendererInternals,
|
|
true
|
|
);
|
|
const result = hydrateNode(
|
|
node,
|
|
suspense.pendingBranch = vnode.ssContent,
|
|
parentComponent,
|
|
suspense,
|
|
slotScopeIds,
|
|
optimized
|
|
);
|
|
if (suspense.deps === 0) {
|
|
suspense.resolve(false, true);
|
|
}
|
|
return result;
|
|
}
|
|
function normalizeSuspenseChildren(vnode) {
|
|
const { shapeFlag, children } = vnode;
|
|
const isSlotChildren = shapeFlag & 32;
|
|
vnode.ssContent = normalizeSuspenseSlot(
|
|
isSlotChildren ? children.default : children
|
|
);
|
|
vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);
|
|
}
|
|
function normalizeSuspenseSlot(s) {
|
|
let block;
|
|
if (isFunction(s)) {
|
|
const trackBlock = isBlockTreeEnabled && s._c;
|
|
if (trackBlock) {
|
|
s._d = false;
|
|
openBlock();
|
|
}
|
|
s = s();
|
|
if (trackBlock) {
|
|
s._d = true;
|
|
block = currentBlock;
|
|
closeBlock();
|
|
}
|
|
}
|
|
if (isArray(s)) {
|
|
const singleChild = filterSingleRoot(s);
|
|
if (!singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) {
|
|
warn$1(`<Suspense> slots expect a single root node.`);
|
|
}
|
|
s = singleChild;
|
|
}
|
|
s = normalizeVNode(s);
|
|
if (block && !s.dynamicChildren) {
|
|
s.dynamicChildren = block.filter((c) => c !== s);
|
|
}
|
|
return s;
|
|
}
|
|
function queueEffectWithSuspense(fn, suspense) {
|
|
if (suspense && suspense.pendingBranch) {
|
|
if (isArray(fn)) {
|
|
suspense.effects.push(...fn);
|
|
} else {
|
|
suspense.effects.push(fn);
|
|
}
|
|
} else {
|
|
queuePostFlushCb(fn);
|
|
}
|
|
}
|
|
function setActiveBranch(suspense, branch) {
|
|
suspense.activeBranch = branch;
|
|
const { vnode, parentComponent } = suspense;
|
|
let el = branch.el;
|
|
while (!el && branch.component) {
|
|
branch = branch.component.subTree;
|
|
el = branch.el;
|
|
}
|
|
vnode.el = el;
|
|
if (parentComponent && parentComponent.subTree === vnode) {
|
|
parentComponent.vnode.el = el;
|
|
updateHOCHostEl(parentComponent, el);
|
|
}
|
|
}
|
|
function isVNodeSuspensible(vnode) {
|
|
const suspensible = vnode.props && vnode.props.suspensible;
|
|
return suspensible != null && suspensible !== false;
|
|
}
|
|
const Fragment = Symbol.for("v-fgt");
|
|
const Text = Symbol.for("v-txt");
|
|
const Comment = Symbol.for("v-cmt");
|
|
const Static = Symbol.for("v-stc");
|
|
const blockStack = [];
|
|
let currentBlock = null;
|
|
function openBlock(disableTracking = false) {
|
|
blockStack.push(currentBlock = disableTracking ? null : []);
|
|
}
|
|
function closeBlock() {
|
|
blockStack.pop();
|
|
currentBlock = blockStack[blockStack.length - 1] || null;
|
|
}
|
|
let isBlockTreeEnabled = 1;
|
|
function setBlockTracking(value, inVOnce = false) {
|
|
isBlockTreeEnabled += value;
|
|
if (value < 0 && currentBlock && inVOnce) {
|
|
currentBlock.hasOnce = true;
|
|
}
|
|
}
|
|
function setupBlock(vnode) {
|
|
vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;
|
|
closeBlock();
|
|
if (isBlockTreeEnabled > 0 && currentBlock) {
|
|
currentBlock.push(vnode);
|
|
}
|
|
return vnode;
|
|
}
|
|
function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {
|
|
return setupBlock(
|
|
createBaseVNode(
|
|
type,
|
|
props,
|
|
children,
|
|
patchFlag,
|
|
dynamicProps,
|
|
shapeFlag,
|
|
true
|
|
)
|
|
);
|
|
}
|
|
function createBlock(type, props, children, patchFlag, dynamicProps) {
|
|
return setupBlock(
|
|
createVNode(
|
|
type,
|
|
props,
|
|
children,
|
|
patchFlag,
|
|
dynamicProps,
|
|
true
|
|
)
|
|
);
|
|
}
|
|
function isVNode(value) {
|
|
return value ? value.__v_isVNode === true : false;
|
|
}
|
|
function isSameVNodeType(n1, n2) {
|
|
if (n2.shapeFlag & 6 && n1.component) {
|
|
const dirtyInstances = hmrDirtyComponents.get(n2.type);
|
|
if (dirtyInstances && dirtyInstances.has(n1.component)) {
|
|
n1.shapeFlag &= -257;
|
|
n2.shapeFlag &= -513;
|
|
return false;
|
|
}
|
|
}
|
|
return n1.type === n2.type && n1.key === n2.key;
|
|
}
|
|
let vnodeArgsTransformer;
|
|
function transformVNodeArgs(transformer) {
|
|
vnodeArgsTransformer = transformer;
|
|
}
|
|
const createVNodeWithArgsTransform = (...args) => {
|
|
return _createVNode(
|
|
...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args
|
|
);
|
|
};
|
|
const normalizeKey = ({ key }) => key != null ? key : null;
|
|
const normalizeRef = ({
|
|
ref: ref3,
|
|
ref_key,
|
|
ref_for
|
|
}) => {
|
|
if (typeof ref3 === "number") {
|
|
ref3 = "" + ref3;
|
|
}
|
|
return ref3 != null ? isString(ref3) || isRef(ref3) || isFunction(ref3) ? { i: currentRenderingInstance, r: ref3, k: ref_key, f: !!ref_for } : ref3 : null;
|
|
};
|
|
function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {
|
|
const vnode = {
|
|
__v_isVNode: true,
|
|
__v_skip: true,
|
|
type,
|
|
props,
|
|
key: props && normalizeKey(props),
|
|
ref: props && normalizeRef(props),
|
|
scopeId: currentScopeId,
|
|
slotScopeIds: null,
|
|
children,
|
|
component: null,
|
|
suspense: null,
|
|
ssContent: null,
|
|
ssFallback: null,
|
|
dirs: null,
|
|
transition: null,
|
|
el: null,
|
|
anchor: null,
|
|
target: null,
|
|
targetStart: null,
|
|
targetAnchor: null,
|
|
staticCount: 0,
|
|
shapeFlag,
|
|
patchFlag,
|
|
dynamicProps,
|
|
dynamicChildren: null,
|
|
appContext: null,
|
|
ctx: currentRenderingInstance
|
|
};
|
|
if (needFullChildrenNormalization) {
|
|
normalizeChildren(vnode, children);
|
|
if (shapeFlag & 128) {
|
|
type.normalize(vnode);
|
|
}
|
|
} else if (children) {
|
|
vnode.shapeFlag |= isString(children) ? 8 : 16;
|
|
}
|
|
if (vnode.key !== vnode.key) {
|
|
warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type);
|
|
}
|
|
if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself
|
|
!isBlockNode && // has current parent block
|
|
currentBlock && // presence of a patch flag indicates this node needs patching on updates.
|
|
// component nodes also should always be patched, because even if the
|
|
// component doesn't need to update, it needs to persist the instance on to
|
|
// the next vnode so that it can be properly unmounted later.
|
|
(vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the
|
|
// vnode should not be considered dynamic due to handler caching.
|
|
vnode.patchFlag !== 32) {
|
|
currentBlock.push(vnode);
|
|
}
|
|
return vnode;
|
|
}
|
|
const createVNode = true ? createVNodeWithArgsTransform : _createVNode;
|
|
function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
|
|
if (!type || type === NULL_DYNAMIC_COMPONENT) {
|
|
if (!type) {
|
|
warn$1(`Invalid vnode type when creating vnode: ${type}.`);
|
|
}
|
|
type = Comment;
|
|
}
|
|
if (isVNode(type)) {
|
|
const cloned = cloneVNode(
|
|
type,
|
|
props,
|
|
true
|
|
/* mergeRef: true */
|
|
);
|
|
if (children) {
|
|
normalizeChildren(cloned, children);
|
|
}
|
|
if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {
|
|
if (cloned.shapeFlag & 6) {
|
|
currentBlock[currentBlock.indexOf(type)] = cloned;
|
|
} else {
|
|
currentBlock.push(cloned);
|
|
}
|
|
}
|
|
cloned.patchFlag = -2;
|
|
return cloned;
|
|
}
|
|
if (isClassComponent(type)) {
|
|
type = type.__vccOpts;
|
|
}
|
|
if (props) {
|
|
props = guardReactiveProps(props);
|
|
let { class: klass, style } = props;
|
|
if (klass && !isString(klass)) {
|
|
props.class = normalizeClass(klass);
|
|
}
|
|
if (isObject(style)) {
|
|
if (isProxy(style) && !isArray(style)) {
|
|
style = extend({}, style);
|
|
}
|
|
props.style = normalizeStyle(style);
|
|
}
|
|
}
|
|
const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;
|
|
if (shapeFlag & 4 && isProxy(type)) {
|
|
type = toRaw(type);
|
|
warn$1(
|
|
`Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \`markRaw\` or using \`shallowRef\` instead of \`ref\`.`,
|
|
`
|
|
Component that was made reactive: `,
|
|
type
|
|
);
|
|
}
|
|
return createBaseVNode(
|
|
type,
|
|
props,
|
|
children,
|
|
patchFlag,
|
|
dynamicProps,
|
|
shapeFlag,
|
|
isBlockNode,
|
|
true
|
|
);
|
|
}
|
|
function guardReactiveProps(props) {
|
|
if (!props) return null;
|
|
return isProxy(props) || isInternalObject(props) ? extend({}, props) : props;
|
|
}
|
|
function cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {
|
|
const { props, ref: ref3, patchFlag, children, transition } = vnode;
|
|
const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
|
|
const cloned = {
|
|
__v_isVNode: true,
|
|
__v_skip: true,
|
|
type: vnode.type,
|
|
props: mergedProps,
|
|
key: mergedProps && normalizeKey(mergedProps),
|
|
ref: extraProps && extraProps.ref ? (
|
|
// #2078 in the case of <component :is="vnode" ref="extra"/>
|
|
// if the vnode itself already has a ref, cloneVNode will need to merge
|
|
// the refs so the single vnode can be set on multiple refs
|
|
mergeRef && ref3 ? isArray(ref3) ? ref3.concat(normalizeRef(extraProps)) : [ref3, normalizeRef(extraProps)] : normalizeRef(extraProps)
|
|
) : ref3,
|
|
scopeId: vnode.scopeId,
|
|
slotScopeIds: vnode.slotScopeIds,
|
|
children: patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,
|
|
target: vnode.target,
|
|
targetStart: vnode.targetStart,
|
|
targetAnchor: vnode.targetAnchor,
|
|
staticCount: vnode.staticCount,
|
|
shapeFlag: vnode.shapeFlag,
|
|
// if the vnode is cloned with extra props, we can no longer assume its
|
|
// existing patch flag to be reliable and need to add the FULL_PROPS flag.
|
|
// note: preserve flag for fragments since they use the flag for children
|
|
// fast paths only.
|
|
patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,
|
|
dynamicProps: vnode.dynamicProps,
|
|
dynamicChildren: vnode.dynamicChildren,
|
|
appContext: vnode.appContext,
|
|
dirs: vnode.dirs,
|
|
transition,
|
|
// These should technically only be non-null on mounted VNodes. However,
|
|
// they *should* be copied for kept-alive vnodes. So we just always copy
|
|
// them since them being non-null during a mount doesn't affect the logic as
|
|
// they will simply be overwritten.
|
|
component: vnode.component,
|
|
suspense: vnode.suspense,
|
|
ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
|
|
ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
|
|
placeholder: vnode.placeholder,
|
|
el: vnode.el,
|
|
anchor: vnode.anchor,
|
|
ctx: vnode.ctx,
|
|
ce: vnode.ce
|
|
};
|
|
if (transition && cloneTransition) {
|
|
setTransitionHooks(
|
|
cloned,
|
|
transition.clone(cloned)
|
|
);
|
|
}
|
|
return cloned;
|
|
}
|
|
function deepCloneVNode(vnode) {
|
|
const cloned = cloneVNode(vnode);
|
|
if (isArray(vnode.children)) {
|
|
cloned.children = vnode.children.map(deepCloneVNode);
|
|
}
|
|
return cloned;
|
|
}
|
|
function createTextVNode(text = " ", flag = 0) {
|
|
return createVNode(Text, null, text, flag);
|
|
}
|
|
function createStaticVNode(content, numberOfNodes) {
|
|
const vnode = createVNode(Static, null, content);
|
|
vnode.staticCount = numberOfNodes;
|
|
return vnode;
|
|
}
|
|
function createCommentVNode(text = "", asBlock = false) {
|
|
return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);
|
|
}
|
|
function normalizeVNode(child) {
|
|
if (child == null || typeof child === "boolean") {
|
|
return createVNode(Comment);
|
|
} else if (isArray(child)) {
|
|
return createVNode(
|
|
Fragment,
|
|
null,
|
|
// #3666, avoid reference pollution when reusing vnode
|
|
child.slice()
|
|
);
|
|
} else if (isVNode(child)) {
|
|
return cloneIfMounted(child);
|
|
} else {
|
|
return createVNode(Text, null, String(child));
|
|
}
|
|
}
|
|
function cloneIfMounted(child) {
|
|
return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);
|
|
}
|
|
function normalizeChildren(vnode, children) {
|
|
let type = 0;
|
|
const { shapeFlag } = vnode;
|
|
if (children == null) {
|
|
children = null;
|
|
} else if (isArray(children)) {
|
|
type = 16;
|
|
} else if (typeof children === "object") {
|
|
if (shapeFlag & (1 | 64)) {
|
|
const slot = children.default;
|
|
if (slot) {
|
|
slot._c && (slot._d = false);
|
|
normalizeChildren(vnode, slot());
|
|
slot._c && (slot._d = true);
|
|
}
|
|
return;
|
|
} else {
|
|
type = 32;
|
|
const slotFlag = children._;
|
|
if (!slotFlag && !isInternalObject(children)) {
|
|
children._ctx = currentRenderingInstance;
|
|
} else if (slotFlag === 3 && currentRenderingInstance) {
|
|
if (currentRenderingInstance.slots._ === 1) {
|
|
children._ = 1;
|
|
} else {
|
|
children._ = 2;
|
|
vnode.patchFlag |= 1024;
|
|
}
|
|
}
|
|
}
|
|
} else if (isFunction(children)) {
|
|
children = { default: children, _ctx: currentRenderingInstance };
|
|
type = 32;
|
|
} else {
|
|
children = String(children);
|
|
if (shapeFlag & 64) {
|
|
type = 16;
|
|
children = [createTextVNode(children)];
|
|
} else {
|
|
type = 8;
|
|
}
|
|
}
|
|
vnode.children = children;
|
|
vnode.shapeFlag |= type;
|
|
}
|
|
function mergeProps(...args) {
|
|
const ret = {};
|
|
for (let i = 0; i < args.length; i++) {
|
|
const toMerge = args[i];
|
|
for (const key in toMerge) {
|
|
if (key === "class") {
|
|
if (ret.class !== toMerge.class) {
|
|
ret.class = normalizeClass([ret.class, toMerge.class]);
|
|
}
|
|
} else if (key === "style") {
|
|
ret.style = normalizeStyle([ret.style, toMerge.style]);
|
|
} else if (isOn(key)) {
|
|
const existing = ret[key];
|
|
const incoming = toMerge[key];
|
|
if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {
|
|
ret[key] = existing ? [].concat(existing, incoming) : incoming;
|
|
}
|
|
} else if (key !== "") {
|
|
ret[key] = toMerge[key];
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
|
|
callWithAsyncErrorHandling(hook, instance, 7, [
|
|
vnode,
|
|
prevVNode
|
|
]);
|
|
}
|
|
const emptyAppContext = createAppContext();
|
|
let uid = 0;
|
|
function createComponentInstance(vnode, parent, suspense) {
|
|
const type = vnode.type;
|
|
const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
|
|
const instance = {
|
|
uid: uid++,
|
|
vnode,
|
|
type,
|
|
parent,
|
|
appContext,
|
|
root: null,
|
|
// to be immediately set
|
|
next: null,
|
|
subTree: null,
|
|
// will be set synchronously right after creation
|
|
effect: null,
|
|
update: null,
|
|
// will be set synchronously right after creation
|
|
job: null,
|
|
scope: new EffectScope(
|
|
true
|
|
/* detached */
|
|
),
|
|
render: null,
|
|
proxy: null,
|
|
exposed: null,
|
|
exposeProxy: null,
|
|
withProxy: null,
|
|
provides: parent ? parent.provides : Object.create(appContext.provides),
|
|
ids: parent ? parent.ids : ["", 0, 0],
|
|
accessCache: null,
|
|
renderCache: [],
|
|
// local resolved assets
|
|
components: null,
|
|
directives: null,
|
|
// resolved props and emits options
|
|
propsOptions: normalizePropsOptions(type, appContext),
|
|
emitsOptions: normalizeEmitsOptions(type, appContext),
|
|
// emit
|
|
emit: null,
|
|
// to be set immediately
|
|
emitted: null,
|
|
// props default value
|
|
propsDefaults: EMPTY_OBJ,
|
|
// inheritAttrs
|
|
inheritAttrs: type.inheritAttrs,
|
|
// state
|
|
ctx: EMPTY_OBJ,
|
|
data: EMPTY_OBJ,
|
|
props: EMPTY_OBJ,
|
|
attrs: EMPTY_OBJ,
|
|
slots: EMPTY_OBJ,
|
|
refs: EMPTY_OBJ,
|
|
setupState: EMPTY_OBJ,
|
|
setupContext: null,
|
|
// suspense related
|
|
suspense,
|
|
suspenseId: suspense ? suspense.pendingId : 0,
|
|
asyncDep: null,
|
|
asyncResolved: false,
|
|
// lifecycle hooks
|
|
// not using enums here because it results in computed properties
|
|
isMounted: false,
|
|
isUnmounted: false,
|
|
isDeactivated: false,
|
|
bc: null,
|
|
c: null,
|
|
bm: null,
|
|
m: null,
|
|
bu: null,
|
|
u: null,
|
|
um: null,
|
|
bum: null,
|
|
da: null,
|
|
a: null,
|
|
rtg: null,
|
|
rtc: null,
|
|
ec: null,
|
|
sp: null
|
|
};
|
|
if (true) {
|
|
instance.ctx = createDevRenderContext(instance);
|
|
} else {
|
|
instance.ctx = { _: instance };
|
|
}
|
|
instance.root = parent ? parent.root : instance;
|
|
instance.emit = emit.bind(null, instance);
|
|
if (vnode.ce) {
|
|
vnode.ce(instance);
|
|
}
|
|
return instance;
|
|
}
|
|
let currentInstance = null;
|
|
const getCurrentInstance = () => currentInstance || currentRenderingInstance;
|
|
let internalSetCurrentInstance;
|
|
let setInSSRSetupState;
|
|
{
|
|
const g = getGlobalThis();
|
|
const registerGlobalSetter = (key, setter) => {
|
|
let setters;
|
|
if (!(setters = g[key])) setters = g[key] = [];
|
|
setters.push(setter);
|
|
return (v) => {
|
|
if (setters.length > 1) setters.forEach((set) => set(v));
|
|
else setters[0](v);
|
|
};
|
|
};
|
|
internalSetCurrentInstance = registerGlobalSetter(
|
|
`__VUE_INSTANCE_SETTERS__`,
|
|
(v) => currentInstance = v
|
|
);
|
|
setInSSRSetupState = registerGlobalSetter(
|
|
`__VUE_SSR_SETTERS__`,
|
|
(v) => isInSSRComponentSetup = v
|
|
);
|
|
}
|
|
const setCurrentInstance = (instance) => {
|
|
const prev = currentInstance;
|
|
internalSetCurrentInstance(instance);
|
|
instance.scope.on();
|
|
return () => {
|
|
instance.scope.off();
|
|
internalSetCurrentInstance(prev);
|
|
};
|
|
};
|
|
const unsetCurrentInstance = () => {
|
|
currentInstance && currentInstance.scope.off();
|
|
internalSetCurrentInstance(null);
|
|
};
|
|
const isBuiltInTag = /* @__PURE__ */ makeMap("slot,component");
|
|
function validateComponentName(name, { isNativeTag }) {
|
|
if (isBuiltInTag(name) || isNativeTag(name)) {
|
|
warn$1(
|
|
"Do not use built-in or reserved HTML elements as component id: " + name
|
|
);
|
|
}
|
|
}
|
|
function isStatefulComponent(instance) {
|
|
return instance.vnode.shapeFlag & 4;
|
|
}
|
|
let isInSSRComponentSetup = false;
|
|
function setupComponent(instance, isSSR = false, optimized = false) {
|
|
isSSR && setInSSRSetupState(isSSR);
|
|
const { props, children } = instance.vnode;
|
|
const isStateful = isStatefulComponent(instance);
|
|
initProps(instance, props, isStateful, isSSR);
|
|
initSlots(instance, children, optimized || isSSR);
|
|
const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;
|
|
isSSR && setInSSRSetupState(false);
|
|
return setupResult;
|
|
}
|
|
function setupStatefulComponent(instance, isSSR) {
|
|
var _a;
|
|
const Component = instance.type;
|
|
if (true) {
|
|
if (Component.name) {
|
|
validateComponentName(Component.name, instance.appContext.config);
|
|
}
|
|
if (Component.components) {
|
|
const names = Object.keys(Component.components);
|
|
for (let i = 0; i < names.length; i++) {
|
|
validateComponentName(names[i], instance.appContext.config);
|
|
}
|
|
}
|
|
if (Component.directives) {
|
|
const names = Object.keys(Component.directives);
|
|
for (let i = 0; i < names.length; i++) {
|
|
validateDirectiveName(names[i]);
|
|
}
|
|
}
|
|
if (Component.compilerOptions && isRuntimeOnly()) {
|
|
warn$1(
|
|
`"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`
|
|
);
|
|
}
|
|
}
|
|
instance.accessCache = /* @__PURE__ */ Object.create(null);
|
|
instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);
|
|
if (true) {
|
|
exposePropsOnRenderContext(instance);
|
|
}
|
|
const { setup } = Component;
|
|
if (setup) {
|
|
pauseTracking();
|
|
const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;
|
|
const reset = setCurrentInstance(instance);
|
|
const setupResult = callWithErrorHandling(
|
|
setup,
|
|
instance,
|
|
0,
|
|
[
|
|
true ? shallowReadonly(instance.props) : instance.props,
|
|
setupContext
|
|
]
|
|
);
|
|
const isAsyncSetup = isPromise(setupResult);
|
|
resetTracking();
|
|
reset();
|
|
if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) {
|
|
markAsyncBoundary(instance);
|
|
}
|
|
if (isAsyncSetup) {
|
|
setupResult.then(unsetCurrentInstance, unsetCurrentInstance);
|
|
if (isSSR) {
|
|
return setupResult.then((resolvedResult) => {
|
|
handleSetupResult(instance, resolvedResult, isSSR);
|
|
}).catch((e) => {
|
|
handleError(e, instance, 0);
|
|
});
|
|
} else {
|
|
instance.asyncDep = setupResult;
|
|
if (!instance.suspense) {
|
|
const name = (_a = Component.name) != null ? _a : "Anonymous";
|
|
warn$1(
|
|
`Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`
|
|
);
|
|
}
|
|
}
|
|
} else {
|
|
handleSetupResult(instance, setupResult, isSSR);
|
|
}
|
|
} else {
|
|
finishComponentSetup(instance, isSSR);
|
|
}
|
|
}
|
|
function handleSetupResult(instance, setupResult, isSSR) {
|
|
if (isFunction(setupResult)) {
|
|
if (instance.type.__ssrInlineRender) {
|
|
instance.ssrRender = setupResult;
|
|
} else {
|
|
instance.render = setupResult;
|
|
}
|
|
} else if (isObject(setupResult)) {
|
|
if (isVNode(setupResult)) {
|
|
warn$1(
|
|
`setup() should not return VNodes directly - return a render function instead.`
|
|
);
|
|
}
|
|
if (true) {
|
|
instance.devtoolsRawSetupState = setupResult;
|
|
}
|
|
instance.setupState = proxyRefs(setupResult);
|
|
if (true) {
|
|
exposeSetupStateOnRenderContext(instance);
|
|
}
|
|
} else if (setupResult !== void 0) {
|
|
warn$1(
|
|
`setup() should return an object. Received: ${setupResult === null ? "null" : typeof setupResult}`
|
|
);
|
|
}
|
|
finishComponentSetup(instance, isSSR);
|
|
}
|
|
let compile;
|
|
let installWithProxy;
|
|
function registerRuntimeCompiler(_compile) {
|
|
compile = _compile;
|
|
installWithProxy = (i) => {
|
|
if (i.render._rc) {
|
|
i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);
|
|
}
|
|
};
|
|
}
|
|
const isRuntimeOnly = () => !compile;
|
|
function finishComponentSetup(instance, isSSR, skipOptions) {
|
|
const Component = instance.type;
|
|
if (!instance.render) {
|
|
if (!isSSR && compile && !Component.render) {
|
|
const template = Component.template || __VUE_OPTIONS_API__ && resolveMergedOptions(instance).template;
|
|
if (template) {
|
|
if (true) {
|
|
startMeasure(instance, `compile`);
|
|
}
|
|
const { isCustomElement, compilerOptions } = instance.appContext.config;
|
|
const { delimiters, compilerOptions: componentCompilerOptions } = Component;
|
|
const finalCompilerOptions = extend(
|
|
extend(
|
|
{
|
|
isCustomElement,
|
|
delimiters
|
|
},
|
|
compilerOptions
|
|
),
|
|
componentCompilerOptions
|
|
);
|
|
Component.render = compile(template, finalCompilerOptions);
|
|
if (true) {
|
|
endMeasure(instance, `compile`);
|
|
}
|
|
}
|
|
}
|
|
instance.render = Component.render || NOOP;
|
|
if (installWithProxy) {
|
|
installWithProxy(instance);
|
|
}
|
|
}
|
|
if (__VUE_OPTIONS_API__ && true) {
|
|
const reset = setCurrentInstance(instance);
|
|
pauseTracking();
|
|
try {
|
|
applyOptions(instance);
|
|
} finally {
|
|
resetTracking();
|
|
reset();
|
|
}
|
|
}
|
|
if (!Component.render && instance.render === NOOP && !isSSR) {
|
|
if (!compile && Component.template) {
|
|
warn$1(
|
|
`Component provided template option but runtime compilation is not supported in this build of Vue. Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".`
|
|
);
|
|
} else {
|
|
warn$1(`Component is missing template or render function: `, Component);
|
|
}
|
|
}
|
|
}
|
|
const attrsProxyHandlers = true ? {
|
|
get(target, key) {
|
|
markAttrsAccessed();
|
|
track(target, "get", "");
|
|
return target[key];
|
|
},
|
|
set() {
|
|
warn$1(`setupContext.attrs is readonly.`);
|
|
return false;
|
|
},
|
|
deleteProperty() {
|
|
warn$1(`setupContext.attrs is readonly.`);
|
|
return false;
|
|
}
|
|
} : {
|
|
get(target, key) {
|
|
track(target, "get", "");
|
|
return target[key];
|
|
}
|
|
};
|
|
function getSlotsProxy(instance) {
|
|
return new Proxy(instance.slots, {
|
|
get(target, key) {
|
|
track(instance, "get", "$slots");
|
|
return target[key];
|
|
}
|
|
});
|
|
}
|
|
function createSetupContext(instance) {
|
|
const expose = (exposed) => {
|
|
if (true) {
|
|
if (instance.exposed) {
|
|
warn$1(`expose() should be called only once per setup().`);
|
|
}
|
|
if (exposed != null) {
|
|
let exposedType = typeof exposed;
|
|
if (exposedType === "object") {
|
|
if (isArray(exposed)) {
|
|
exposedType = "array";
|
|
} else if (isRef(exposed)) {
|
|
exposedType = "ref";
|
|
}
|
|
}
|
|
if (exposedType !== "object") {
|
|
warn$1(
|
|
`expose() should be passed a plain object, received ${exposedType}.`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
instance.exposed = exposed || {};
|
|
};
|
|
if (true) {
|
|
let attrsProxy;
|
|
let slotsProxy;
|
|
return Object.freeze({
|
|
get attrs() {
|
|
return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers));
|
|
},
|
|
get slots() {
|
|
return slotsProxy || (slotsProxy = getSlotsProxy(instance));
|
|
},
|
|
get emit() {
|
|
return (event, ...args) => instance.emit(event, ...args);
|
|
},
|
|
expose
|
|
});
|
|
} else {
|
|
return {
|
|
attrs: new Proxy(instance.attrs, attrsProxyHandlers),
|
|
slots: instance.slots,
|
|
emit: instance.emit,
|
|
expose
|
|
};
|
|
}
|
|
}
|
|
function getComponentPublicInstance(instance) {
|
|
if (instance.exposed) {
|
|
return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
|
|
get(target, key) {
|
|
if (key in target) {
|
|
return target[key];
|
|
} else if (key in publicPropertiesMap) {
|
|
return publicPropertiesMap[key](instance);
|
|
}
|
|
},
|
|
has(target, key) {
|
|
return key in target || key in publicPropertiesMap;
|
|
}
|
|
}));
|
|
} else {
|
|
return instance.proxy;
|
|
}
|
|
}
|
|
const classifyRE = /(?:^|[-_])(\w)/g;
|
|
const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, "");
|
|
function getComponentName(Component, includeInferred = true) {
|
|
return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;
|
|
}
|
|
function formatComponentName(instance, Component, isRoot = false) {
|
|
let name = getComponentName(Component);
|
|
if (!name && Component.__file) {
|
|
const match = Component.__file.match(/([^/\\]+)\.\w+$/);
|
|
if (match) {
|
|
name = match[1];
|
|
}
|
|
}
|
|
if (!name && instance && instance.parent) {
|
|
const inferFromRegistry = (registry) => {
|
|
for (const key in registry) {
|
|
if (registry[key] === Component) {
|
|
return key;
|
|
}
|
|
}
|
|
};
|
|
name = inferFromRegistry(
|
|
instance.components || instance.parent.type.components
|
|
) || inferFromRegistry(instance.appContext.components);
|
|
}
|
|
return name ? classify(name) : isRoot ? `App` : `Anonymous`;
|
|
}
|
|
function isClassComponent(value) {
|
|
return isFunction(value) && "__vccOpts" in value;
|
|
}
|
|
const computed = (getterOrOptions, debugOptions) => {
|
|
const c = computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);
|
|
if (true) {
|
|
const i = getCurrentInstance();
|
|
if (i && i.appContext.config.warnRecursiveComputed) {
|
|
c._warnRecursive = true;
|
|
}
|
|
}
|
|
return c;
|
|
};
|
|
function h(type, propsOrChildren, children) {
|
|
const l = arguments.length;
|
|
if (l === 2) {
|
|
if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
|
|
if (isVNode(propsOrChildren)) {
|
|
return createVNode(type, null, [propsOrChildren]);
|
|
}
|
|
return createVNode(type, propsOrChildren);
|
|
} else {
|
|
return createVNode(type, null, propsOrChildren);
|
|
}
|
|
} else {
|
|
if (l > 3) {
|
|
children = Array.prototype.slice.call(arguments, 2);
|
|
} else if (l === 3 && isVNode(children)) {
|
|
children = [children];
|
|
}
|
|
return createVNode(type, propsOrChildren, children);
|
|
}
|
|
}
|
|
function initCustomFormatter() {
|
|
if (typeof window === "undefined") {
|
|
return;
|
|
}
|
|
const vueStyle = { style: "color:#3ba776" };
|
|
const numberStyle = { style: "color:#1677ff" };
|
|
const stringStyle = { style: "color:#f5222d" };
|
|
const keywordStyle = { style: "color:#eb2f96" };
|
|
const formatter = {
|
|
__vue_custom_formatter: true,
|
|
header(obj) {
|
|
if (!isObject(obj)) {
|
|
return null;
|
|
}
|
|
if (obj.__isVue) {
|
|
return ["div", vueStyle, `VueInstance`];
|
|
} else if (isRef(obj)) {
|
|
pauseTracking();
|
|
const value = obj.value;
|
|
resetTracking();
|
|
return [
|
|
"div",
|
|
{},
|
|
["span", vueStyle, genRefFlag(obj)],
|
|
"<",
|
|
formatValue(value),
|
|
`>`
|
|
];
|
|
} else if (isReactive(obj)) {
|
|
return [
|
|
"div",
|
|
{},
|
|
["span", vueStyle, isShallow(obj) ? "ShallowReactive" : "Reactive"],
|
|
"<",
|
|
formatValue(obj),
|
|
`>${isReadonly(obj) ? ` (readonly)` : ``}`
|
|
];
|
|
} else if (isReadonly(obj)) {
|
|
return [
|
|
"div",
|
|
{},
|
|
["span", vueStyle, isShallow(obj) ? "ShallowReadonly" : "Readonly"],
|
|
"<",
|
|
formatValue(obj),
|
|
">"
|
|
];
|
|
}
|
|
return null;
|
|
},
|
|
hasBody(obj) {
|
|
return obj && obj.__isVue;
|
|
},
|
|
body(obj) {
|
|
if (obj && obj.__isVue) {
|
|
return [
|
|
"div",
|
|
{},
|
|
...formatInstance(obj.$)
|
|
];
|
|
}
|
|
}
|
|
};
|
|
function formatInstance(instance) {
|
|
const blocks = [];
|
|
if (instance.type.props && instance.props) {
|
|
blocks.push(createInstanceBlock("props", toRaw(instance.props)));
|
|
}
|
|
if (instance.setupState !== EMPTY_OBJ) {
|
|
blocks.push(createInstanceBlock("setup", instance.setupState));
|
|
}
|
|
if (instance.data !== EMPTY_OBJ) {
|
|
blocks.push(createInstanceBlock("data", toRaw(instance.data)));
|
|
}
|
|
const computed2 = extractKeys(instance, "computed");
|
|
if (computed2) {
|
|
blocks.push(createInstanceBlock("computed", computed2));
|
|
}
|
|
const injected = extractKeys(instance, "inject");
|
|
if (injected) {
|
|
blocks.push(createInstanceBlock("injected", injected));
|
|
}
|
|
blocks.push([
|
|
"div",
|
|
{},
|
|
[
|
|
"span",
|
|
{
|
|
style: keywordStyle.style + ";opacity:0.66"
|
|
},
|
|
"$ (internal): "
|
|
],
|
|
["object", { object: instance }]
|
|
]);
|
|
return blocks;
|
|
}
|
|
function createInstanceBlock(type, target) {
|
|
target = extend({}, target);
|
|
if (!Object.keys(target).length) {
|
|
return ["span", {}];
|
|
}
|
|
return [
|
|
"div",
|
|
{ style: "line-height:1.25em;margin-bottom:0.6em" },
|
|
[
|
|
"div",
|
|
{
|
|
style: "color:#476582"
|
|
},
|
|
type
|
|
],
|
|
[
|
|
"div",
|
|
{
|
|
style: "padding-left:1.25em"
|
|
},
|
|
...Object.keys(target).map((key) => {
|
|
return [
|
|
"div",
|
|
{},
|
|
["span", keywordStyle, key + ": "],
|
|
formatValue(target[key], false)
|
|
];
|
|
})
|
|
]
|
|
];
|
|
}
|
|
function formatValue(v, asRaw = true) {
|
|
if (typeof v === "number") {
|
|
return ["span", numberStyle, v];
|
|
} else if (typeof v === "string") {
|
|
return ["span", stringStyle, JSON.stringify(v)];
|
|
} else if (typeof v === "boolean") {
|
|
return ["span", keywordStyle, v];
|
|
} else if (isObject(v)) {
|
|
return ["object", { object: asRaw ? toRaw(v) : v }];
|
|
} else {
|
|
return ["span", stringStyle, String(v)];
|
|
}
|
|
}
|
|
function extractKeys(instance, type) {
|
|
const Comp = instance.type;
|
|
if (isFunction(Comp)) {
|
|
return;
|
|
}
|
|
const extracted = {};
|
|
for (const key in instance.ctx) {
|
|
if (isKeyOfType(Comp, key, type)) {
|
|
extracted[key] = instance.ctx[key];
|
|
}
|
|
}
|
|
return extracted;
|
|
}
|
|
function isKeyOfType(Comp, key, type) {
|
|
const opts = Comp[type];
|
|
if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {
|
|
return true;
|
|
}
|
|
if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {
|
|
return true;
|
|
}
|
|
if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {
|
|
return true;
|
|
}
|
|
}
|
|
function genRefFlag(v) {
|
|
if (isShallow(v)) {
|
|
return `ShallowRef`;
|
|
}
|
|
if (v.effect) {
|
|
return `ComputedRef`;
|
|
}
|
|
return `Ref`;
|
|
}
|
|
if (window.devtoolsFormatters) {
|
|
window.devtoolsFormatters.push(formatter);
|
|
} else {
|
|
window.devtoolsFormatters = [formatter];
|
|
}
|
|
}
|
|
function withMemo(memo, render, cache, index) {
|
|
const cached = cache[index];
|
|
if (cached && isMemoSame(cached, memo)) {
|
|
return cached;
|
|
}
|
|
const ret = render();
|
|
ret.memo = memo.slice();
|
|
ret.cacheIndex = index;
|
|
return cache[index] = ret;
|
|
}
|
|
function isMemoSame(cached, memo) {
|
|
const prev = cached.memo;
|
|
if (prev.length != memo.length) {
|
|
return false;
|
|
}
|
|
for (let i = 0; i < prev.length; i++) {
|
|
if (hasChanged(prev[i], memo[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
if (isBlockTreeEnabled > 0 && currentBlock) {
|
|
currentBlock.push(cached);
|
|
}
|
|
return true;
|
|
}
|
|
const version = "3.5.19";
|
|
const warn = true ? warn$1 : NOOP;
|
|
const ErrorTypeStrings = ErrorTypeStrings$1;
|
|
const devtools = true ? devtools$1 : void 0;
|
|
const setDevtoolsHook = true ? setDevtoolsHook$1 : NOOP;
|
|
const _ssrUtils = {
|
|
createComponentInstance,
|
|
setupComponent,
|
|
renderComponentRoot,
|
|
setCurrentRenderingInstance,
|
|
isVNode,
|
|
normalizeVNode,
|
|
getComponentPublicInstance,
|
|
ensureValidVNode,
|
|
pushWarningContext,
|
|
popWarningContext
|
|
};
|
|
const ssrUtils = _ssrUtils;
|
|
const resolveFilter = null;
|
|
const compatUtils = null;
|
|
const DeprecationTypes = null;
|
|
export { BaseTransition, BaseTransitionPropsValidators, Comment, DeprecationTypes, ErrorCodes, ErrorTypeStrings, Fragment, KeepAlive, Static, Suspense, Teleport, Text, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, cloneVNode, compatUtils, computed, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSlots, devtools, getCurrentInstance, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrateOnIdle, hydrateOnInteraction, hydrateOnMediaQuery, hydrateOnVisible, initCustomFormatter, inject, isMemoSame, isRuntimeOnly, isVNode, mergeDefaults, mergeModels, mergeProps, nextTick, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, pushScopeId, queuePostFlushCb, registerRuntimeCompiler, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, ssrContextKey, ssrUtils, toHandlers, transformVNodeArgs, useAttrs, useId, useModel, useSSRContext, useSlots, useTemplateRef, useTransitionState, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withMemo, withScopeId };
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bnRpbWUtY29yZS5lc20tYnVuZGxlci5qcz92PWU0ZjE4YzI5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuKiBAdnVlL3J1bnRpbWUtY29yZSB2My41LjE5XG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBwYXVzZVRyYWNraW5nLCByZXNldFRyYWNraW5nLCBpc1JlZiwgdG9SYXcsIHRyYXZlcnNlLCBzaGFsbG93UmVmLCByZWFkb25seSwgaXNSZWFjdGl2ZSwgcmVmLCBpc1NoYWxsb3csIGlzUmVhZG9ubHksIHNoYWxsb3dSZWFkQXJyYXksIHRvUmVhZG9ubHksIHRvUmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgdHJhY2ssIHJlYWN0aXZlLCBzaGFsbG93UmVhY3RpdmUsIHRyaWdnZXIsIFJlYWN0aXZlRWZmZWN0LCB3YXRjaCBhcyB3YXRjaCQxLCBjdXN0b21SZWYsIGlzUHJveHksIHByb3h5UmVmcywgbWFya1JhdywgRWZmZWN0U2NvcGUsIGNvbXB1dGVkIGFzIGNvbXB1dGVkJDEgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuZXhwb3J0IHsgRWZmZWN0U2NvcGUsIFJlYWN0aXZlRWZmZWN0LCBUcmFja09wVHlwZXMsIFRyaWdnZXJPcFR5cGVzLCBjdXN0b21SZWYsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGdldEN1cnJlbnRTY29wZSwgZ2V0Q3VycmVudFdhdGNoZXIsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBvbldhdGNoZXJDbGVhbnVwLCBwcm94eVJlZnMsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgc3RvcCwgdG9SYXcsIHRvUmVmLCB0b1JlZnMsIHRvVmFsdWUsIHRyaWdnZXJSZWYsIHVucmVmIH0gZnJvbSAnQHZ1ZS9yZWFjdGl2aXR5JztcbmltcG9ydCB7IGlzU3RyaW5nLCBpc0Z1bmN0aW9uLCBFTVBUWV9PQkosIGlzUHJvbWlzZSwgaXNBcnJheSwgTk9PUCwgZ2V0R2xvYmFsVGhpcywgZXh0ZW5kLCBpc0J1aWx0SW5EaXJlY3RpdmUsIE5PLCBoYXNPd24sIHJlbW92ZSwgZGVmLCBpc09uLCBpc1Jlc2VydmVkUHJvcCwgbm9ybWFsaXplQ2xhc3MsIHN0cmluZ2lmeVN0eWxlLCBub3JtYWxpemVTdHlsZSwgaXNLbm93blN2Z0F0dHIsIGlzQm9vbGVhbkF0dHIsIGlzS25vd25IdG1sQXR0ciwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpc1JlbmRlcmFibGVBdHRyVmFsdWUsIG5vcm1hbGl6ZUNzc1ZhclZhbHVlLCBnZXRFc2NhcGVkQ3NzVmFyTmFtZSwgaXNPYmplY3QsIGlzUmVnRXhwLCBpbnZva2VBcnJheUZucywgdG9IYW5kbGVyS2V5LCBjYW1lbGl6ZSwgY2FwaXRhbGl6ZSwgaXNTeW1ib2wsIGlzR2xvYmFsbHlBbGxvd2VkLCBFTVBUWV9BUlIsIGh5cGhlbmF0ZSwgbWFrZU1hcCwgdG9SYXdUeXBlLCBoYXNDaGFuZ2VkLCBsb29zZVRvTnVtYmVyLCBpc01vZGVsTGlzdGVuZXIsIHRvTnVtYmVyIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuZXhwb3J0IHsgY2FtZWxpemUsIGNhcGl0YWxpemUsIG5vcm1hbGl6ZUNsYXNzLCBub3JtYWxpemVQcm9wcywgbm9ybWFsaXplU3R5bGUsIHRvRGlzcGxheVN0cmluZywgdG9IYW5kbGVyS2V5IH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuXG5jb25zdCBzdGFjayA9IFtdO1xuZnVuY3Rpb24gcHVzaFdhcm5pbmdDb250ZXh0KHZub2RlKSB7XG4gIHN0YWNrLnB1c2godm5vZGUpO1xufVxuZnVuY3Rpb24gcG9wV2FybmluZ0NvbnRleHQoKSB7XG4gIHN0YWNrLnBvcCgpO1xufVxubGV0IGlzV2FybmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gd2FybiQxKG1zZywgLi4uYXJncykge1xuICBpZiAoaXNXYXJuaW5nKSByZXR1cm47XG4gIGlzV2FybmluZyA9IHRydWU7XG4gIHBhdXNlVHJhY2tpbmcoKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBzdGFjay5sZW5ndGggPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5jb21wb25lbnQgOiBudWxsO1xuICBjb25zdCBhcHBXYXJuSGFuZGxlciA9IGluc3RhbmNlICYmIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLndhcm5IYW5kbGVyO1xuICBjb25zdCB0cmFjZSA9IGdldENvbXBvbmVudFRyYWNlKCk7XG4gIGlmIChhcHBXYXJuSGFuZGxlcikge1xuICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgIGFwcFdhcm5IYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICAxMSxcbiAgICAgIFtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgIG1zZyArIGFyZ3MubWFwKChhKSA9PiB7XG4gICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gYS50b1N0cmluZykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwoYSkpICE9IG51bGwgPyBfYiA6IEpTT04uc3RyaW5naWZ5KGEpO1xuICAgICAgICB9KS5qb2luKFwiXCIpLFxuICAgICAgICBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSxcbiAgICAgICAgdHJhY2UubWFwKFxuICAgICAgICAgICh7IHZub2RlIH0pID0+IGBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCB2bm9kZS50eXBlKX0+YFxuICAgICAgICApLmpvaW4oXCJcXG5cIiksXG4gICAgICAgIHRyYWNlXG4gICAgICBdXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3YXJuQXJncyA9IFtgW1Z1ZSB3YXJuXTogJHttc2d9YCwgLi4uYXJnc107XG4gICAgaWYgKHRyYWNlLmxlbmd0aCAmJiAvLyBhdm9pZCBzcGFtbWluZyBjb25zb2xlIGR1cmluZyB0ZXN0c1xuICAgIHRydWUpIHtcbiAgICAgIHdhcm5BcmdzLnB1c2goYFxuYCwgLi4uZm9ybWF0VHJhY2UodHJhY2UpKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKC4uLndhcm5BcmdzKTtcbiAgfVxuICByZXNldFRyYWNraW5nKCk7XG4gIGlzV2FybmluZyA9IGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50VHJhY2UoKSB7XG4gIGxldCBjdXJyZW50Vk5vZGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKCFjdXJyZW50Vk5vZGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZFN0YWNrID0gW107XG4gIHdoaWxlIChjdXJyZW50Vk5vZGUpIHtcbiAgICBjb25zdCBsYXN0ID0gbm9ybWFsaXplZFN0YWNrWzBdO1xuICAgIGlmIChsYXN0ICYmIGxhc3Qudm5vZGUgPT09IGN1cnJlbnRWTm9kZSkge1xuICAgICAgbGFzdC5yZWN1cnNlQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbm9ybWFsaXplZFN0YWNrLnB1c2goe1xuICAgICAgICB2bm9kZTogY3VycmVudFZOb2RlLFxuICAgICAgICByZWN1cnNlQ291bnQ6IDBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRJbnN0YW5jZSA9IGN1cnJlbnRWTm9kZS5jb21wb25lbnQgJiYgY3VycmVudFZOb2RlLmNvbXBvbmVudC5wYXJlbnQ7XG4gICAgY3VycmVudFZOb2RlID0gcGFyZW50SW5zdGFuY2UgJiYgcGFyZW50SW5zdGFuY2Uudm5vZGU7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWRTdGFjaztcbn1cbmZ1bmN0aW9uIGZvcm1hdFRyYWNlKHRyYWNlKSB7XG4gIGNvbnN0IGxvZ3MgPSBbXTtcbiAgdHJhY2UuZm9yRWFjaCgoZW50cnksIGkpID0+IHtcbiAgICBsb2dzLnB1c2goLi4uaSA9PT0gMCA/IFtdIDogW2BcbmBdLCAuLi5mb3JtYXRUcmFjZUVudHJ5KGVudHJ5KSk7XG4gIH0pO1xuICByZXR1cm4gbG9ncztcbn1cbmZ1bmN0aW9uIGZvcm1hdFRyYWNlRW50cnkoeyB2bm9kZSwgcmVjdXJzZUNvdW50IH0pIHtcbiAgY29uc3QgcG9zdGZpeCA9IHJlY3Vyc2VDb3VudCA+IDAgPyBgLi4uICgke3JlY3Vyc2VDb3VudH0gcmVjdXJzaXZlIGNhbGxzKWAgOiBgYDtcbiAgY29uc3QgaXNSb290ID0gdm5vZGUuY29tcG9uZW50ID8gdm5vZGUuY29tcG9uZW50LnBhcmVudCA9PSBudWxsIDogZmFsc2U7XG4gIGNvbnN0IG9wZW4gPSBgIGF0IDwke2Zvcm1hdENvbXBvbmVudE5hbWUoXG4gICAgdm5vZGUuY29tcG9uZW50LFxuICAgIHZub2RlLnR5cGUsXG4gICAgaXNSb290XG4gICl9YDtcbiAgY29uc3QgY2xvc2UgPSBgPmAgKyBwb3N0Zml4O1xuICByZXR1cm4gdm5vZGUucHJvcHMgPyBbb3BlbiwgLi4uZm9ybWF0UHJvcHModm5vZGUucHJvcHMpLCBjbG9zZV0gOiBbb3BlbiArIGNsb3NlXTtcbn1cbmZ1bmN0aW9uIGZvcm1hdFByb3BzKHByb3BzKSB7XG4gIGNvbnN0IHJlcyA9IFtdO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpO1xuICBrZXlzLnNsaWNlKDAsIDMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHJlcy5wdXNoKC4uLmZvcm1hdFByb3Aoa2V5LCBwcm9wc1trZXldKSk7XG4gIH0pO1xuICBpZiAoa2V5cy5sZW5ndGggPiAzKSB7XG4gICAgcmVzLnB1c2goYCAuLi5gKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gZm9ybWF0UHJvcChrZXksIHZhbHVlLCByYXcpIHtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PSR7dmFsdWV9YF07XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PSR7dmFsdWV9YF07XG4gIH0gZWxzZSBpZiAoaXNSZWYodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBmb3JtYXRQcm9wKGtleSwgdG9SYXcodmFsdWUudmFsdWUpLCB0cnVlKTtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT1SZWY8YCwgdmFsdWUsIGA+YF07XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICByZXR1cm4gW2Ake2tleX09Zm4ke3ZhbHVlLm5hbWUgPyBgPCR7dmFsdWUubmFtZX0+YCA6IGBgfWBdO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PWAsIHZhbHVlXTtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0TnVtYmVyKHZhbCwgdHlwZSkge1xuICBpZiAoISEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHJldHVybjtcbiAgaWYgKHZhbCA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgIT09IFwibnVtYmVyXCIpIHtcbiAgICB3YXJuJDEoYCR7dHlwZX0gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsKX0uYCk7XG4gIH0gZWxzZSBpZiAoaXNOYU4odmFsKSkge1xuICAgIHdhcm4kMShgJHt0eXBlfSBpcyBOYU4gLSB0aGUgZHVyYXRpb24gZXhwcmVzc2lvbiBtaWdodCBiZSBpbmNvcnJlY3QuYCk7XG4gIH1cbn1cblxuY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgXCJTRVRVUF9GVU5DVElPTlwiOiAwLFxuICBcIjBcIjogXCJTRVRVUF9GVU5DVElPTlwiLFxuICBcIlJFTkRFUl9GVU5DVElPTlwiOiAxLFxuICBcIjFcIjogXCJSRU5ERVJfRlVOQ1RJT05cIixcbiAgXCJOQVRJVkVfRVZFTlRfSEFORExFUlwiOiA1LFxuICBcIjVcIjogXCJOQVRJVkVfRVZFTlRfSEFORExFUlwiLFxuICBcIkNPTVBPTkVOVF9FVkVOVF9IQU5ETEVSXCI6IDYsXG4gIFwiNlwiOiBcIkNPTVBPTkVOVF9FVkVOVF9IQU5ETEVSXCIsXG4gIFwiVk5PREVfSE9PS1wiOiA3LFxuICBcIjdcIjogXCJWTk9ERV9IT09LXCIsXG4gIFwiRElSRUNUSVZFX0hPT0tcIjogOCxcbiAgXCI4XCI6IFwiRElSRUNUSVZFX0hPT0tcIixcbiAgXCJUUkFOU0lUSU9OX0hPT0tcIjogOSxcbiAgXCI5XCI6IFwiVFJBTlNJVElPTl9IT09LXCIsXG4gIFwiQVBQX0VSUk9SX0hBTkRMRVJcIjogMTAsXG4gIFwiMTBcIjogXCJBUFBfRVJST1JfSEFORExFUlwiLFxuICBcIkFQUF9XQVJOX0hBTkRMRVJcIjogMTEsXG4gIFwiMTFcIjogXCJBUFBfV0FSTl9IQU5ETEVSXCIsXG4gIFwiRlVOQ1RJT05fUkVGXCI6IDEyLFxuICBcIjEyXCI6IFwiRlVOQ1RJT05fUkVGXCIsXG4gIFwiQVNZTkNfQ09NUE9ORU5UX0xPQURFUlwiOiAxMyxcbiAgXCIxM1wiOiBcIkFTWU5DX0NPTVBPTkVOVF9MT0FERVJcIixcbiAgXCJTQ0hFRFVMRVJcIjogMTQsXG4gIFwiMTRcIjogXCJTQ0hFRFVMRVJcIixcbiAgXCJDT01QT05FTlRfVVBEQVRFXCI6IDE1LFxuICBcIjE1XCI6IFwiQ09NUE9ORU5UX1VQREFURVwiLFxuICBcIkFQUF9VTk1PVU5UX0NMRUFOVVBcIjogMTYsXG4gIFwiMTZcIjogXCJBUFBfVU5NT1VOVF9DTEVBTlVQXCJcbn07XG5jb25zdCBFcnJvclR5cGVTdHJpbmdzJDEgPSB7XG4gIFtcInNwXCJdOiBcInNlcnZlclByZWZldGNoIGhvb2tcIixcbiAgW1wiYmNcIl06IFwiYmVmb3JlQ3JlYXRlIGhvb2tcIixcbiAgW1wiY1wiXTogXCJjcmVhdGVkIGhvb2tcIixcbiAgW1wiYm1cIl06IFwiYmVmb3JlTW91bnQgaG9va1wiLFxuICBbXCJtXCJdOiBcIm1vdW50ZWQgaG9va1wiLFxuICBbXCJidVwiXTogXCJiZWZvcmVVcGRhdGUgaG9va1wiLFxuICBbXCJ1XCJdOiBcInVwZGF0ZWRcIixcbiAgW1wiYnVtXCJdOiBcImJlZm9yZVVubW91bnQgaG9va1wiLFxuICBbXCJ1bVwiXTogXCJ1bm1vdW50ZWQgaG9va1wiLFxuICBbXCJhXCJdOiBcImFjdGl2YXRlZCBob29rXCIsXG4gIFtcImRhXCJdOiBcImRlYWN0aXZhdGVkIGhvb2tcIixcbiAgW1wiZWNcIl06IFwiZXJyb3JDYXB0dXJlZCBob29rXCIsXG4gIFtcInJ0Y1wiXTogXCJyZW5kZXJUcmFja2VkIGhvb2tcIixcbiAgW1wicnRnXCJdOiBcInJlbmRlclRyaWdnZXJlZCBob29rXCIsXG4gIFswXTogXCJzZXR1cCBmdW5jdGlvblwiLFxuICBbMV06IFwicmVuZGVyIGZ1bmN0aW9uXCIsXG4gIFsyXTogXCJ3YXRjaGVyIGdldHRlclwiLFxuICBbM106IFwid2F0Y2hlciBjYWxsYmFja1wiLFxuICBbNF06IFwid2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uXCIsXG4gIFs1XTogXCJuYXRpdmUgZXZlbnQgaGFuZGxlclwiLFxuICBbNl06IFwiY29tcG9uZW50IGV2ZW50IGhhbmRsZXJcIixcbiAgWzddOiBcInZub2RlIGhvb2tcIixcbiAgWzhdOiBcImRpcmVjdGl2ZSBob29rXCIsXG4gIFs5XTogXCJ0cmFuc2l0aW9uIGhvb2tcIixcbiAgWzEwXTogXCJhcHAgZXJyb3JIYW5kbGVyXCIsXG4gIFsxMV06IFwiYXBwIHdhcm5IYW5kbGVyXCIsXG4gIFsxMl06IFwicmVmIGZ1bmN0aW9uXCIsXG4gIFsxM106IFwiYXN5bmMgY29tcG9uZW50IGxvYWRlclwiLFxuICBbMTRdOiBcInNjaGVkdWxlciBmbHVzaFwiLFxuICBbMTVdOiBcImNvbXBvbmVudCB1cGRhdGVcIixcbiAgWzE2XTogXCJhcHAgdW5tb3VudCBjbGVhbnVwIGZ1bmN0aW9uXCJcbn07XG5mdW5jdGlvbiBjYWxsV2l0aEVycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCB0eXBlLCBhcmdzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGFyZ3MgPyBmbiguLi5hcmdzKSA6IGZuKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgY29uc3QgcmVzID0gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncyk7XG4gICAgaWYgKHJlcyAmJiBpc1Byb21pc2UocmVzKSkge1xuICAgICAgcmVzLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoaXNBcnJheShmbikpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXMucHVzaChjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbltpXSwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKFxuICAgICAgYEludmFsaWQgdmFsdWUgdHlwZSBwYXNzZWQgdG8gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoKTogJHt0eXBlb2YgZm59YFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUsIHRocm93SW5EZXYgPSB0cnVlKSB7XG4gIGNvbnN0IGNvbnRleHRWTm9kZSA9IGluc3RhbmNlID8gaW5zdGFuY2Uudm5vZGUgOiBudWxsO1xuICBjb25zdCB7IGVycm9ySGFuZGxlciwgdGhyb3dVbmhhbmRsZWRFcnJvckluUHJvZHVjdGlvbiB9ID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcgfHwgRU1QVFlfT0JKO1xuICBpZiAoaW5zdGFuY2UpIHtcbiAgICBsZXQgY3VyID0gaW5zdGFuY2UucGFyZW50O1xuICAgIGNvbnN0IGV4cG9zZWRJbnN0YW5jZSA9IGluc3RhbmNlLnByb3h5O1xuICAgIGNvbnN0IGVycm9ySW5mbyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBFcnJvclR5cGVTdHJpbmdzJDFbdHlwZV0gOiBgaHR0cHM6Ly92dWVqcy5vcmcvZXJyb3ItcmVmZXJlbmNlLyNydW50aW1lLSR7dHlwZX1gO1xuICAgIHdoaWxlIChjdXIpIHtcbiAgICAgIGNvbnN0IGVycm9yQ2FwdHVyZWRIb29rcyA9IGN1ci5lYztcbiAgICAgIGlmIChlcnJvckNhcHR1cmVkSG9va3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlcnJvckNhcHR1cmVkSG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZXJyb3JDYXB0dXJlZEhvb2tzW2ldKGVyciwgZXhwb3NlZEluc3RhbmNlLCBlcnJvckluZm8pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3VyID0gY3VyLnBhcmVudDtcbiAgICB9XG4gICAgaWYgKGVycm9ySGFuZGxlcikge1xuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKGVycm9ySGFuZGxlciwgbnVsbCwgMTAsIFtcbiAgICAgICAgZXJyLFxuICAgICAgICBleHBvc2VkSW5zdGFuY2UsXG4gICAgICAgIGVycm9ySW5mb1xuICAgICAgXSk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2LCB0aHJvd1VuaGFuZGxlZEVycm9ySW5Qcm9kdWN0aW9uKTtcbn1cbmZ1bmN0aW9uIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2ID0gdHJ1ZSwgdGhyb3dJblByb2QgPSBmYWxzZSkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGluZm8gPSBFcnJvclR5cGVTdHJpbmdzJDFbdHlwZV07XG4gICAgaWYgKGNvbnRleHRWTm9kZSkge1xuICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KGNvbnRleHRWTm9kZSk7XG4gICAgfVxuICAgIHdhcm4kMShgVW5oYW5kbGVkIGVycm9yJHtpbmZvID8gYCBkdXJpbmcgZXhlY3V0aW9uIG9mICR7aW5mb31gIDogYGB9YCk7XG4gICAgaWYgKGNvbnRleHRWTm9kZSkge1xuICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICB9XG4gICAgaWYgKHRocm93SW5EZXYpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0aHJvd0luUHJvZCkge1xuICAgIHRocm93IGVycjtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxuY29uc3QgcXVldWUgPSBbXTtcbmxldCBmbHVzaEluZGV4ID0gLTE7XG5jb25zdCBwZW5kaW5nUG9zdEZsdXNoQ2JzID0gW107XG5sZXQgYWN0aXZlUG9zdEZsdXNoQ2JzID0gbnVsbDtcbmxldCBwb3N0Rmx1c2hJbmRleCA9IDA7XG5jb25zdCByZXNvbHZlZFByb21pc2UgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgY3VycmVudEZsdXNoUHJvbWlzZSA9IG51bGw7XG5jb25zdCBSRUNVUlNJT05fTElNSVQgPSAxMDA7XG5mdW5jdGlvbiBuZXh0VGljayhmbikge1xuICBjb25zdCBwID0gY3VycmVudEZsdXNoUHJvbWlzZSB8fCByZXNvbHZlZFByb21pc2U7XG4gIHJldHVybiBmbiA/IHAudGhlbih0aGlzID8gZm4uYmluZCh0aGlzKSA6IGZuKSA6IHA7XG59XG5mdW5jdGlvbiBmaW5kSW5zZXJ0aW9uSW5kZXgoaWQpIHtcbiAgbGV0IHN0YXJ0ID0gZmx1c2hJbmRleCArIDE7XG4gIGxldCBlbmQgPSBxdWV1ZS5sZW5ndGg7XG4gIHdoaWxlIChzdGFydCA8IGVuZCkge1xuICAgIGNvbnN0IG1pZGRsZSA9IHN0YXJ0ICsgZW5kID4+PiAxO1xuICAgIGNvbnN0IG1pZGRsZUpvYiA9IHF1ZXVlW21pZGRsZV07XG4gICAgY29uc3QgbWlkZGxlSm9iSWQgPSBnZXRJZChtaWRkbGVKb2IpO1xuICAgIGlmIChtaWRkbGVKb2JJZCA8IGlkIHx8IG1pZGRsZUpvYklkID09PSBpZCAmJiBtaWRkbGVKb2IuZmxhZ3MgJiAyKSB7XG4gICAgICBzdGFydCA9IG1pZGRsZSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZCA9IG1pZGRsZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0YXJ0O1xufVxuZnVuY3Rpb24gcXVldWVKb2Ioam9iKSB7XG4gIGlmICghKGpvYi5mbGFncyAmIDEpKSB7XG4gICAgY29uc3Qgam9iSWQgPSBnZXRJZChqb2IpO1xuICAgIGNvbnN0IGxhc3RKb2IgPSBxdWV1ZVtxdWV1ZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWxhc3RKb2IgfHwgLy8gZmFzdCBwYXRoIHdoZW4gdGhlIGpvYiBpZCBpcyBsYXJnZXIgdGhhbiB0aGUgdGFpbFxuICAgICEoam9iLmZsYWdzICYgMikgJiYgam9iSWQgPj0gZ2V0SWQobGFzdEpvYikpIHtcbiAgICAgIHF1ZXVlLnB1c2goam9iKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVldWUuc3BsaWNlKGZpbmRJbnNlcnRpb25JbmRleChqb2JJZCksIDAsIGpvYik7XG4gICAgfVxuICAgIGpvYi5mbGFncyB8PSAxO1xuICAgIHF1ZXVlRmx1c2goKTtcbiAgfVxufVxuZnVuY3Rpb24gcXVldWVGbHVzaCgpIHtcbiAgaWYgKCFjdXJyZW50Rmx1c2hQcm9taXNlKSB7XG4gICAgY3VycmVudEZsdXNoUHJvbWlzZSA9IHJlc29sdmVkUHJvbWlzZS50aGVuKGZsdXNoSm9icyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHF1ZXVlUG9zdEZsdXNoQ2IoY2IpIHtcbiAgaWYgKCFpc0FycmF5KGNiKSkge1xuICAgIGlmIChhY3RpdmVQb3N0Rmx1c2hDYnMgJiYgY2IuaWQgPT09IC0xKSB7XG4gICAgICBhY3RpdmVQb3N0Rmx1c2hDYnMuc3BsaWNlKHBvc3RGbHVzaEluZGV4ICsgMSwgMCwgY2IpO1xuICAgIH0gZWxzZSBpZiAoIShjYi5mbGFncyAmIDEpKSB7XG4gICAgICBwZW5kaW5nUG9zdEZsdXNoQ2JzLnB1c2goY2IpO1xuICAgICAgY2IuZmxhZ3MgfD0gMTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKC4uLmNiKTtcbiAgfVxuICBxdWV1ZUZsdXNoKCk7XG59XG5mdW5jdGlvbiBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlLCBzZWVuLCBpID0gZmx1c2hJbmRleCArIDEpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjYiA9IHF1ZXVlW2ldO1xuICAgIGlmIChjYiAmJiBjYi5mbGFncyAmIDIpIHtcbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjYi5pZCAhPT0gaW5zdGFuY2UudWlkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGNiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnNwbGljZShpLCAxKTtcbiAgICAgIGktLTtcbiAgICAgIGlmIChjYi5mbGFncyAmIDQpIHtcbiAgICAgICAgY2IuZmxhZ3MgJj0gLTI7XG4gICAgICB9XG4gICAgICBjYigpO1xuICAgICAgaWYgKCEoY2IuZmxhZ3MgJiA0KSkge1xuICAgICAgICBjYi5mbGFncyAmPSAtMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgaWYgKHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGdldElkKGEpIC0gZ2V0SWQoYilcbiAgICApO1xuICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoID0gMDtcbiAgICBpZiAoYWN0aXZlUG9zdEZsdXNoQ2JzKSB7XG4gICAgICBhY3RpdmVQb3N0Rmx1c2hDYnMucHVzaCguLi5kZWR1cGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWN0aXZlUG9zdEZsdXNoQ2JzID0gZGVkdXBlZDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZm9yIChwb3N0Rmx1c2hJbmRleCA9IDA7IHBvc3RGbHVzaEluZGV4IDwgYWN0aXZlUG9zdEZsdXNoQ2JzLmxlbmd0aDsgcG9zdEZsdXNoSW5kZXgrKykge1xuICAgICAgY29uc3QgY2IgPSBhY3RpdmVQb3N0Rmx1c2hDYnNbcG9zdEZsdXNoSW5kZXhdO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGNiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjYi5mbGFncyAmIDQpIHtcbiAgICAgICAgY2IuZmxhZ3MgJj0gLTI7XG4gICAgICB9XG4gICAgICBpZiAoIShjYi5mbGFncyAmIDgpKSBjYigpO1xuICAgICAgY2IuZmxhZ3MgJj0gLTI7XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG4gICAgcG9zdEZsdXNoSW5kZXggPSAwO1xuICB9XG59XG5jb25zdCBnZXRJZCA9IChqb2IpID0+IGpvYi5pZCA9PSBudWxsID8gam9iLmZsYWdzICYgMiA/IC0xIDogSW5maW5pdHkgOiBqb2IuaWQ7XG5mdW5jdGlvbiBmbHVzaEpvYnMoc2Vlbikge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIH1cbiAgY29uc3QgY2hlY2sgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKGpvYikgPT4gY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGpvYikgOiBOT09QO1xuICB0cnkge1xuICAgIGZvciAoZmx1c2hJbmRleCA9IDA7IGZsdXNoSW5kZXggPCBxdWV1ZS5sZW5ndGg7IGZsdXNoSW5kZXgrKykge1xuICAgICAgY29uc3Qgam9iID0gcXVldWVbZmx1c2hJbmRleF07XG4gICAgICBpZiAoam9iICYmICEoam9iLmZsYWdzICYgOCkpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2soam9iKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqb2IuZmxhZ3MgJiA0KSB7XG4gICAgICAgICAgam9iLmZsYWdzICY9IH4xO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgICAgICBqb2IsXG4gICAgICAgICAgam9iLmksXG4gICAgICAgICAgam9iLmkgPyAxNSA6IDE0XG4gICAgICAgICk7XG4gICAgICAgIGlmICghKGpvYi5mbGFncyAmIDQpKSB7XG4gICAgICAgICAgam9iLmZsYWdzICY9IH4xO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGZvciAoOyBmbHVzaEluZGV4IDwgcXVldWUubGVuZ3RoOyBmbHVzaEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGpvYiA9IHF1ZXVlW2ZsdXNoSW5kZXhdO1xuICAgICAgaWYgKGpvYikge1xuICAgICAgICBqb2IuZmxhZ3MgJj0gLTI7XG4gICAgICB9XG4gICAgfVxuICAgIGZsdXNoSW5kZXggPSAtMTtcbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggfHwgcGVuZGluZ1Bvc3RGbHVzaENicy5sZW5ndGgpIHtcbiAgICAgIGZsdXNoSm9icyhzZWVuKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBmbikge1xuICBjb25zdCBjb3VudCA9IHNlZW4uZ2V0KGZuKSB8fCAwO1xuICBpZiAoY291bnQgPiBSRUNVUlNJT05fTElNSVQpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGZuLmk7XG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGluc3RhbmNlICYmIGdldENvbXBvbmVudE5hbWUoaW5zdGFuY2UudHlwZSk7XG4gICAgaGFuZGxlRXJyb3IoXG4gICAgICBgTWF4aW11bSByZWN1cnNpdmUgdXBkYXRlcyBleGNlZWRlZCR7Y29tcG9uZW50TmFtZSA/IGAgaW4gY29tcG9uZW50IDwke2NvbXBvbmVudE5hbWV9PmAgOiBgYH0uIFRoaXMgbWVhbnMgeW91IGhhdmUgYSByZWFjdGl2ZSBlZmZlY3QgdGhhdCBpcyBtdXRhdGluZyBpdHMgb3duIGRlcGVuZGVuY2llcyBhbmQgdGh1cyByZWN1cnNpdmVseSB0cmlnZ2VyaW5nIGl0c2VsZi4gUG9zc2libGUgc291cmNlcyBpbmNsdWRlIGNvbXBvbmVudCB0ZW1wbGF0ZSwgcmVuZGVyIGZ1bmN0aW9uLCB1cGRhdGVkIGhvb2sgb3Igd2F0Y2hlciBzb3VyY2UgZnVuY3Rpb24uYCxcbiAgICAgIG51bGwsXG4gICAgICAxMFxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2Vlbi5zZXQoZm4sIGNvdW50ICsgMSk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubGV0IGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbmNvbnN0IGhtckRpcnR5Q29tcG9uZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfSE1SX1JVTlRJTUVfXyA9IHtcbiAgICBjcmVhdGVSZWNvcmQ6IHRyeVdyYXAoY3JlYXRlUmVjb3JkKSxcbiAgICByZXJlbmRlcjogdHJ5V3JhcChyZXJlbmRlciksXG4gICAgcmVsb2FkOiB0cnlXcmFwKHJlbG9hZClcbiAgfTtcbn1cbmNvbnN0IG1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiByZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBjb25zdCBpZCA9IGluc3RhbmNlLnR5cGUuX19obXJJZDtcbiAgbGV0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZCkge1xuICAgIGNyZWF0ZVJlY29yZChpZCwgaW5zdGFuY2UudHlwZSk7XG4gICAgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIH1cbiAgcmVjb3JkLmluc3RhbmNlcy5hZGQoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gdW5yZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBtYXAuZ2V0KGluc3RhbmNlLnR5cGUuX19obXJJZCkuaW5zdGFuY2VzLmRlbGV0ZShpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWNvcmQoaWQsIGluaXRpYWxEZWYpIHtcbiAgaWYgKG1hcC5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1hcC5zZXQoaWQsIHtcbiAgICBpbml0aWFsRGVmOiBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbml0aWFsRGVmKSxcbiAgICBpbnN0YW5jZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KClcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuX192Y2NPcHRzIDogY29tcG9uZW50O1xufVxuZnVuY3Rpb24gcmVyZW5kZXIoaWQsIG5ld1JlbmRlcikge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVjb3JkLmluaXRpYWxEZWYucmVuZGVyID0gbmV3UmVuZGVyO1xuICBbLi4ucmVjb3JkLmluc3RhbmNlc10uZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICBpZiAobmV3UmVuZGVyKSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgICBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlckNhY2hlID0gW107XG4gICAgaXNIbXJVcGRhdGluZyA9IHRydWU7XG4gICAgaWYgKCEoaW5zdGFuY2Uuam9iLmZsYWdzICYgOCkpIHtcbiAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBpc0htclVwZGF0aW5nID0gZmFsc2U7XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVsb2FkKGlkLCBuZXdDb21wKSB7XG4gIGNvbnN0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZCkgcmV0dXJuO1xuICBuZXdDb21wID0gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQobmV3Q29tcCk7XG4gIHVwZGF0ZUNvbXBvbmVudERlZihyZWNvcmQuaW5pdGlhbERlZiwgbmV3Q29tcCk7XG4gIGNvbnN0IGluc3RhbmNlcyA9IFsuLi5yZWNvcmQuaW5zdGFuY2VzXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlc1tpXTtcbiAgICBjb25zdCBvbGRDb21wID0gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSk7XG4gICAgbGV0IGRpcnR5SW5zdGFuY2VzID0gaG1yRGlydHlDb21wb25lbnRzLmdldChvbGRDb21wKTtcbiAgICBpZiAoIWRpcnR5SW5zdGFuY2VzKSB7XG4gICAgICBpZiAob2xkQ29tcCAhPT0gcmVjb3JkLmluaXRpYWxEZWYpIHtcbiAgICAgICAgdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApO1xuICAgICAgfVxuICAgICAgaG1yRGlydHlDb21wb25lbnRzLnNldChvbGRDb21wLCBkaXJ0eUluc3RhbmNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpO1xuICAgIH1cbiAgICBkaXJ0eUluc3RhbmNlcy5hZGQoaW5zdGFuY2UpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQucHJvcHNDYWNoZS5kZWxldGUoaW5zdGFuY2UudHlwZSk7XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5lbWl0c0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0Lm9wdGlvbnNDYWNoZS5kZWxldGUoaW5zdGFuY2UudHlwZSk7XG4gICAgaWYgKGluc3RhbmNlLmNlUmVsb2FkKSB7XG4gICAgICBkaXJ0eUluc3RhbmNlcy5hZGQoaW5zdGFuY2UpO1xuICAgICAgaW5zdGFuY2UuY2VSZWxvYWQobmV3Q29tcC5zdHlsZXMpO1xuICAgICAgZGlydHlJbnN0YW5jZXMuZGVsZXRlKGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLnBhcmVudCkge1xuICAgICAgcXVldWVKb2IoKCkgPT4ge1xuICAgICAgICBpc0htclVwZGF0aW5nID0gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UucGFyZW50LnVwZGF0ZSgpO1xuICAgICAgICBpc0htclVwZGF0aW5nID0gZmFsc2U7XG4gICAgICAgIGRpcnR5SW5zdGFuY2VzLmRlbGV0ZShpbnN0YW5jZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLmFwcENvbnRleHQucmVsb2FkKSB7XG4gICAgICBpbnN0YW5jZS5hcHBDb250ZXh0LnJlbG9hZCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0hNUl0gUm9vdCBvciBtYW51YWxseSBtb3VudGVkIGluc3RhbmNlIG1vZGlmaWVkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLnJvb3QuY2UgJiYgaW5zdGFuY2UgIT09IGluc3RhbmNlLnJvb3QpIHtcbiAgICAgIGluc3RhbmNlLnJvb3QuY2UuX3JlbW92ZUNoaWxkU3R5bGUob2xkQ29tcCk7XG4gICAgfVxuICB9XG4gIHF1ZXVlUG9zdEZsdXNoQ2IoKCkgPT4ge1xuICAgIGhtckRpcnR5Q29tcG9uZW50cy5jbGVhcigpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudERlZihvbGRDb21wLCBuZXdDb21wKSB7XG4gIGV4dGVuZChvbGRDb21wLCBuZXdDb21wKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkQ29tcCkge1xuICAgIGlmIChrZXkgIT09IFwiX19maWxlXCIgJiYgIShrZXkgaW4gbmV3Q29tcCkpIHtcbiAgICAgIGRlbGV0ZSBvbGRDb21wW2tleV07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB0cnlXcmFwKGZuKSB7XG4gIHJldHVybiAoaWQsIGFyZykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oaWQsIGFyZyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtITVJdIFNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBWdWUgY29tcG9uZW50IGhvdC1yZWxvYWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLmBcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5sZXQgZGV2dG9vbHMkMTtcbmxldCBidWZmZXIgPSBbXTtcbmxldCBkZXZ0b29sc05vdEluc3RhbGxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZW1pdCQxKGV2ZW50LCAuLi5hcmdzKSB7XG4gIGlmIChkZXZ0b29scyQxKSB7XG4gICAgZGV2dG9vbHMkMS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfSBlbHNlIGlmICghZGV2dG9vbHNOb3RJbnN0YWxsZWQpIHtcbiAgICBidWZmZXIucHVzaCh7IGV2ZW50LCBhcmdzIH0pO1xuICB9XG59XG5mdW5jdGlvbiBzZXREZXZ0b29sc0hvb2skMShob29rLCB0YXJnZXQpIHtcbiAgdmFyIF9hLCBfYjtcbiAgZGV2dG9vbHMkMSA9IGhvb2s7XG4gIGlmIChkZXZ0b29scyQxKSB7XG4gICAgZGV2dG9vbHMkMS5lbmFibGVkID0gdHJ1ZTtcbiAgICBidWZmZXIuZm9yRWFjaCgoeyBldmVudCwgYXJncyB9KSA9PiBkZXZ0b29scyQxLmVtaXQoZXZlbnQsIC4uLmFyZ3MpKTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfSBlbHNlIGlmIChcbiAgICAvLyBoYW5kbGUgbGF0ZSBkZXZ0b29scyBpbmplY3Rpb24gLSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlIGluIGFuIGFjdHVhbFxuICAgIC8vIGJyb3dzZXIgZW52aXJvbm1lbnQgdG8gYXZvaWQgdGhlIHRpbWVyIGhhbmRsZSBzdGFsbGluZyB0ZXN0IHJ1bm5lciBleGl0XG4gICAgLy8gKCM0ODE1KVxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgLy8gc29tZSBlbnZzIG1vY2sgd2luZG93IGJ1dCBub3QgZnVsbHlcbiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgJiYgLy8gYWxzbyBleGNsdWRlIGpzZG9tXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgISgoX2IgPSAoX2EgPSB3aW5kb3cubmF2aWdhdG9yKSA9PSBudWxsID8gdm9pZCAwIDogX2EudXNlckFnZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoXCJqc2RvbVwiKSlcbiAgKSB7XG4gICAgY29uc3QgcmVwbGF5ID0gdGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX18gPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyB8fCBbXTtcbiAgICByZXBsYXkucHVzaCgobmV3SG9vaykgPT4ge1xuICAgICAgc2V0RGV2dG9vbHNIb29rJDEobmV3SG9vaywgdGFyZ2V0KTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZGV2dG9vbHMkMSkge1xuICAgICAgICB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IG51bGw7XG4gICAgICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgYnVmZmVyID0gW107XG4gICAgICB9XG4gICAgfSwgM2UzKTtcbiAgfSBlbHNlIHtcbiAgICBkZXZ0b29sc05vdEluc3RhbGxlZCA9IHRydWU7XG4gICAgYnVmZmVyID0gW107XG4gIH1cbn1cbmZ1bmN0aW9uIGRldnRvb2xzSW5pdEFwcChhcHAsIHZlcnNpb24pIHtcbiAgZW1pdCQxKFwiYXBwOmluaXRcIiAvKiBBUFBfSU5JVCAqLywgYXBwLCB2ZXJzaW9uLCB7XG4gICAgRnJhZ21lbnQsXG4gICAgVGV4dCxcbiAgICBDb21tZW50LFxuICAgIFN0YXRpY1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzVW5tb3VudEFwcChhcHApIHtcbiAgZW1pdCQxKFwiYXBwOnVubW91bnRcIiAvKiBBUFBfVU5NT1VOVCAqLywgYXBwKTtcbn1cbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50QWRkZWQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFwiY29tcG9uZW50OmFkZGVkXCIgLyogQ09NUE9ORU5UX0FEREVEICovKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXCJjb21wb25lbnQ6dXBkYXRlZFwiIC8qIENPTVBPTkVOVF9VUERBVEVEICovKTtcbmNvbnN0IF9kZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFxuICBcImNvbXBvbmVudDpyZW1vdmVkXCIgLyogQ09NUE9ORU5UX1JFTU9WRUQgKi9cbik7XG5jb25zdCBkZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQgPSAoY29tcG9uZW50KSA9PiB7XG4gIGlmIChkZXZ0b29scyQxICYmIHR5cGVvZiBkZXZ0b29scyQxLmNsZWFudXBCdWZmZXIgPT09IFwiZnVuY3Rpb25cIiAmJiAvLyByZW1vdmUgdGhlIGNvbXBvbmVudCBpZiBpdCB3YXNuJ3QgYnVmZmVyZWRcbiAgIWRldnRvb2xzJDEuY2xlYW51cEJ1ZmZlcihjb21wb25lbnQpKSB7XG4gICAgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZChjb21wb25lbnQpO1xuICB9XG59O1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQpID0+IHtcbiAgICBlbWl0JDEoXG4gICAgICBob29rLFxuICAgICAgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLFxuICAgICAgY29tcG9uZW50LnVpZCxcbiAgICAgIGNvbXBvbmVudC5wYXJlbnQgPyBjb21wb25lbnQucGFyZW50LnVpZCA6IHZvaWQgMCxcbiAgICAgIGNvbXBvbmVudFxuICAgICk7XG4gIH07XG59XG5jb25zdCBkZXZ0b29sc1BlcmZTdGFydCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcInBlcmY6c3RhcnRcIiAvKiBQRVJGT1JNQU5DRV9TVEFSVCAqLyk7XG5jb25zdCBkZXZ0b29sc1BlcmZFbmQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNQZXJmb3JtYW5jZUhvb2soXCJwZXJmOmVuZFwiIC8qIFBFUkZPUk1BTkNFX0VORCAqLyk7XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhob29rKSB7XG4gIHJldHVybiAoY29tcG9uZW50LCB0eXBlLCB0aW1lKSA9PiB7XG4gICAgZW1pdCQxKGhvb2ssIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCwgY29tcG9uZW50LnVpZCwgY29tcG9uZW50LCB0eXBlLCB0aW1lKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzQ29tcG9uZW50RW1pdChjb21wb25lbnQsIGV2ZW50LCBwYXJhbXMpIHtcbiAgZW1pdCQxKFxuICAgIFwiY29tcG9uZW50OmVtaXRcIiAvKiBDT01QT05FTlRfRU1JVCAqLyxcbiAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgY29tcG9uZW50LFxuICAgIGV2ZW50LFxuICAgIHBhcmFtc1xuICApO1xufVxuXG5sZXQgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbmxldCBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG5mdW5jdGlvbiBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gaW5zdGFuY2U7XG4gIGN1cnJlbnRTY29wZUlkID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UudHlwZS5fX3Njb3BlSWQgfHwgbnVsbDtcbiAgcmV0dXJuIHByZXY7XG59XG5mdW5jdGlvbiBwdXNoU2NvcGVJZChpZCkge1xuICBjdXJyZW50U2NvcGVJZCA9IGlkO1xufVxuZnVuY3Rpb24gcG9wU2NvcGVJZCgpIHtcbiAgY3VycmVudFNjb3BlSWQgPSBudWxsO1xufVxuY29uc3Qgd2l0aFNjb3BlSWQgPSAoX2lkKSA9PiB3aXRoQ3R4O1xuZnVuY3Rpb24gd2l0aEN0eChmbiwgY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCBpc05vblNjb3BlZFNsb3QpIHtcbiAgaWYgKCFjdHgpIHJldHVybiBmbjtcbiAgaWYgKGZuLl9uKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG4gIGNvbnN0IHJlbmRlckZuV2l0aENvbnRleHQgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmIChyZW5kZXJGbldpdGhDb250ZXh0Ll9kKSB7XG4gICAgICBzZXRCbG9ja1RyYWNraW5nKC0xKTtcbiAgICB9XG4gICAgY29uc3QgcHJldkluc3RhbmNlID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGN0eCk7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgcmVzID0gZm4oLi4uYXJncyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2SW5zdGFuY2UpO1xuICAgICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgICAgc2V0QmxvY2tUcmFja2luZygxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fbiA9IHRydWU7XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX2MgPSB0cnVlO1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9kID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlckZuV2l0aENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKSB7XG4gIGlmIChpc0J1aWx0SW5EaXJlY3RpdmUobmFtZSkpIHtcbiAgICB3YXJuJDEoXCJEbyBub3QgdXNlIGJ1aWx0LWluIGRpcmVjdGl2ZSBpZHMgYXMgY3VzdG9tIGRpcmVjdGl2ZSBpZDogXCIgKyBuYW1lKTtcbiAgfVxufVxuZnVuY3Rpb24gd2l0aERpcmVjdGl2ZXModm5vZGUsIGRpcmVjdGl2ZXMpIHtcbiAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGB3aXRoRGlyZWN0aXZlcyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSByZW5kZXIgZnVuY3Rpb25zLmApO1xuICAgIHJldHVybiB2bm9kZTtcbiAgfVxuICBjb25zdCBpbnN0YW5jZSA9IGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSk7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycyB8fCAodm5vZGUuZGlycyA9IFtdKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IFtkaXIsIHZhbHVlLCBhcmcsIG1vZGlmaWVycyA9IEVNUFRZX09CSl0gPSBkaXJlY3RpdmVzW2ldO1xuICAgIGlmIChkaXIpIHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGRpcikpIHtcbiAgICAgICAgZGlyID0ge1xuICAgICAgICAgIG1vdW50ZWQ6IGRpcixcbiAgICAgICAgICB1cGRhdGVkOiBkaXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXIuZGVlcCkge1xuICAgICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgZGlyLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9sZFZhbHVlOiB2b2lkIDAsXG4gICAgICAgIGFyZyxcbiAgICAgICAgbW9kaWZpZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgcHJldlZOb2RlLCBpbnN0YW5jZSwgbmFtZSkge1xuICBjb25zdCBiaW5kaW5ncyA9IHZub2RlLmRpcnM7XG4gIGNvbnN0IG9sZEJpbmRpbmdzID0gcHJldlZOb2RlICYmIHByZXZWTm9kZS5kaXJzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgIGlmIChvbGRCaW5kaW5ncykge1xuICAgICAgYmluZGluZy5vbGRWYWx1ZSA9IG9sZEJpbmRpbmdzW2ldLnZhbHVlO1xuICAgIH1cbiAgICBsZXQgaG9vayA9IGJpbmRpbmcuZGlyW25hbWVdO1xuICAgIGlmIChob29rKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgOCwgW1xuICAgICAgICB2bm9kZS5lbCxcbiAgICAgICAgYmluZGluZyxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIHByZXZWTm9kZVxuICAgICAgXSk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IFRlbGVwb3J0RW5kS2V5ID0gU3ltYm9sKFwiX3Z0ZVwiKTtcbmNvbnN0IGlzVGVsZXBvcnQgPSAodHlwZSkgPT4gdHlwZS5fX2lzVGVsZXBvcnQ7XG5jb25zdCBpc1RlbGVwb3J0RGlzYWJsZWQgPSAocHJvcHMpID0+IHByb3BzICYmIChwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5kaXNhYmxlZCA9PT0gXCJcIik7XG5jb25zdCBpc1RlbGVwb3J0RGVmZXJyZWQgPSAocHJvcHMpID0+IHByb3BzICYmIChwcm9wcy5kZWZlciB8fCBwcm9wcy5kZWZlciA9PT0gXCJcIik7XG5jb25zdCBpc1RhcmdldFNWRyA9ICh0YXJnZXQpID0+IHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG5jb25zdCBpc1RhcmdldE1hdGhNTCA9ICh0YXJnZXQpID0+IHR5cGVvZiBNYXRoTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGFyZ2V0IGluc3RhbmNlb2YgTWF0aE1MRWxlbWVudDtcbmNvbnN0IHJlc29sdmVUYXJnZXQgPSAocHJvcHMsIHNlbGVjdCkgPT4ge1xuICBjb25zdCB0YXJnZXRTZWxlY3RvciA9IHByb3BzICYmIHByb3BzLnRvO1xuICBpZiAoaXNTdHJpbmcodGFyZ2V0U2VsZWN0b3IpKSB7XG4gICAgaWYgKCFzZWxlY3QpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgQ3VycmVudCByZW5kZXJlciBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyB0YXJnZXQgZm9yIFRlbGVwb3J0cy4gKG1pc3NpbmcgcXVlcnlTZWxlY3RvciByZW5kZXJlciBvcHRpb24pYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBzZWxlY3QodGFyZ2V0U2VsZWN0b3IpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXRhcmdldCAmJiAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2NhdGUgVGVsZXBvcnQgdGFyZ2V0IHdpdGggc2VsZWN0b3IgXCIke3RhcmdldFNlbGVjdG9yfVwiLiBOb3RlIHRoZSB0YXJnZXQgZWxlbWVudCBtdXN0IGV4aXN0IGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQgLSBpLmUuIHRoZSB0YXJnZXQgY2Fubm90IGJlIHJlbmRlcmVkIGJ5IHRoZSBjb21wb25lbnQgaXRzZWxmLCBhbmQgaWRlYWxseSBzaG91bGQgYmUgb3V0c2lkZSBvZiB0aGUgZW50aXJlIFZ1ZSBjb21wb25lbnQgdHJlZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdGFyZ2V0U2VsZWN0b3IgJiYgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcykpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQ6ICR7dGFyZ2V0U2VsZWN0b3J9YCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRTZWxlY3RvcjtcbiAgfVxufTtcbmNvbnN0IFRlbGVwb3J0SW1wbCA9IHtcbiAgbmFtZTogXCJUZWxlcG9ydFwiLFxuICBfX2lzVGVsZXBvcnQ6IHRydWUsXG4gIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgaW50ZXJuYWxzKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWM6IG1vdW50Q2hpbGRyZW4sXG4gICAgICBwYzogcGF0Y2hDaGlsZHJlbixcbiAgICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgICAgbzogeyBpbnNlcnQsIHF1ZXJ5U2VsZWN0b3IsIGNyZWF0ZVRleHQsIGNyZWF0ZUNvbW1lbnQgfVxuICAgIH0gPSBpbnRlcm5hbHM7XG4gICAgY29uc3QgZGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQobjIucHJvcHMpO1xuICAgIGxldCB7IHNoYXBlRmxhZywgY2hpbGRyZW4sIGR5bmFtaWNDaGlsZHJlbiB9ID0gbjI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBuMi5lbCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVDb21tZW50KFwidGVsZXBvcnQgc3RhcnRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgY29uc3QgbWFpbkFuY2hvciA9IG4yLmFuY2hvciA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVDb21tZW50KFwidGVsZXBvcnQgZW5kXCIpIDogY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGluc2VydChwbGFjZWhvbGRlciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgaW5zZXJ0KG1haW5BbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGNvbnN0IG1vdW50ID0gKGNvbnRhaW5lcjIsIGFuY2hvcjIpID0+IHtcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgaWYgKHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnQuaXNDRSkge1xuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LmNlLl90ZWxlcG9ydFRhcmdldCA9IGNvbnRhaW5lcjI7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIGNvbnRhaW5lcjIsXG4gICAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgbW91bnRUb1RhcmdldCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbjIudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChuMi5wcm9wcywgcXVlcnlTZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IHRhcmdldEFuY2hvciA9IHByZXBhcmVBbmNob3IodGFyZ2V0LCBuMiwgY3JlYXRlVGV4dCwgaW5zZXJ0KTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT09IFwic3ZnXCIgJiYgaXNUYXJnZXRTVkcodGFyZ2V0KSkge1xuICAgICAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZSAhPT0gXCJtYXRobWxcIiAmJiBpc1RhcmdldE1hdGhNTCh0YXJnZXQpKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSBcIm1hdGhtbFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgICAgICBtb3VudCh0YXJnZXQsIHRhcmdldEFuY2hvcik7XG4gICAgICAgICAgICB1cGRhdGVDc3NWYXJzKG4yLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgXCJJbnZhbGlkIFRlbGVwb3J0IHRhcmdldCBvbiBtb3VudDpcIixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGAoJHt0eXBlb2YgdGFyZ2V0fSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBtb3VudChjb250YWluZXIsIG1haW5BbmNob3IpO1xuICAgICAgICB1cGRhdGVDc3NWYXJzKG4yLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1RlbGVwb3J0RGVmZXJyZWQobjIucHJvcHMpKSB7XG4gICAgICAgIG4yLmVsLl9faXNNb3VudGVkID0gZmFsc2U7XG4gICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgbW91bnRUb1RhcmdldCgpO1xuICAgICAgICAgIGRlbGV0ZSBuMi5lbC5fX2lzTW91bnRlZDtcbiAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW91bnRUb1RhcmdldCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNUZWxlcG9ydERlZmVycmVkKG4yLnByb3BzKSAmJiBuMS5lbC5fX2lzTW91bnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICBUZWxlcG9ydEltcGwucHJvY2VzcyhcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIGludGVybmFsc1xuICAgICAgICAgICk7XG4gICAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgIG4yLnRhcmdldFN0YXJ0ID0gbjEudGFyZ2V0U3RhcnQ7XG4gICAgICBjb25zdCBtYWluQW5jaG9yID0gbjIuYW5jaG9yID0gbjEuYW5jaG9yO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gbjIudGFyZ2V0ID0gbjEudGFyZ2V0O1xuICAgICAgY29uc3QgdGFyZ2V0QW5jaG9yID0gbjIudGFyZ2V0QW5jaG9yID0gbjEudGFyZ2V0QW5jaG9yO1xuICAgICAgY29uc3Qgd2FzRGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQobjEucHJvcHMpO1xuICAgICAgY29uc3QgY3VycmVudENvbnRhaW5lciA9IHdhc0Rpc2FibGVkID8gY29udGFpbmVyIDogdGFyZ2V0O1xuICAgICAgY29uc3QgY3VycmVudEFuY2hvciA9IHdhc0Rpc2FibGVkID8gbWFpbkFuY2hvciA6IHRhcmdldEFuY2hvcjtcbiAgICAgIGlmIChuYW1lc3BhY2UgPT09IFwic3ZnXCIgfHwgaXNUYXJnZXRTVkcodGFyZ2V0KSkge1xuICAgICAgICBuYW1lc3BhY2UgPSBcInN2Z1wiO1xuICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgfHwgaXNUYXJnZXRNYXRoTUwodGFyZ2V0KSkge1xuICAgICAgICBuYW1lc3BhY2UgPSBcIm1hdGhtbFwiO1xuICAgICAgfVxuICAgICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCAhISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSk7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLFxuICAgICAgICAgIGN1cnJlbnRBbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBpZiAoIXdhc0Rpc2FibGVkKSB7XG4gICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBtYWluQW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG4yLnByb3BzICYmIG4xLnByb3BzICYmIG4yLnByb3BzLnRvICE9PSBuMS5wcm9wcy50bykge1xuICAgICAgICAgICAgbjIucHJvcHMudG8gPSBuMS5wcm9wcy50bztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgobjIucHJvcHMgJiYgbjIucHJvcHMudG8pICE9PSAobjEucHJvcHMgJiYgbjEucHJvcHMudG8pKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFRhcmdldCA9IG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICBuMi5wcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChuZXh0VGFyZ2V0KSB7XG4gICAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgICBuZXh0VGFyZ2V0LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gdXBkYXRlOlwiLFxuICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgIGAoJHt0eXBlb2YgdGFyZ2V0fSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YXNEaXNhYmxlZCkge1xuICAgICAgICAgIG1vdmVUZWxlcG9ydChcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgdGFyZ2V0QW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHVwZGF0ZUNzc1ZhcnMobjIsIGRpc2FibGVkKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZSh2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgeyB1bTogdW5tb3VudCwgbzogeyByZW1vdmU6IGhvc3RSZW1vdmUgfSB9LCBkb1JlbW92ZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNoYXBlRmxhZyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgYW5jaG9yLFxuICAgICAgdGFyZ2V0U3RhcnQsXG4gICAgICB0YXJnZXRBbmNob3IsXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wc1xuICAgIH0gPSB2bm9kZTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBob3N0UmVtb3ZlKHRhcmdldFN0YXJ0KTtcbiAgICAgIGhvc3RSZW1vdmUodGFyZ2V0QW5jaG9yKTtcbiAgICB9XG4gICAgZG9SZW1vdmUgJiYgaG9zdFJlbW92ZShhbmNob3IpO1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlID0gZG9SZW1vdmUgfHwgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNob3VsZFJlbW92ZSxcbiAgICAgICAgICAhIWNoaWxkLmR5bmFtaWNDaGlsZHJlblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbW92ZTogbW92ZVRlbGVwb3J0LFxuICBoeWRyYXRlOiBoeWRyYXRlVGVsZXBvcnRcbn07XG5mdW5jdGlvbiBtb3ZlVGVsZXBvcnQodm5vZGUsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCB7IG86IHsgaW5zZXJ0IH0sIG06IG1vdmUgfSwgbW92ZVR5cGUgPSAyKSB7XG4gIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgIGluc2VydCh2bm9kZS50YXJnZXRBbmNob3IsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBjb25zdCB7IGVsLCBhbmNob3IsIHNoYXBlRmxhZywgY2hpbGRyZW4sIHByb3BzIH0gPSB2bm9kZTtcbiAgY29uc3QgaXNSZW9yZGVyID0gbW92ZVR5cGUgPT09IDI7XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoZWwsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBpZiAoIWlzUmVvcmRlciB8fCBpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoXG4gICAgICAgICAgY2hpbGRyZW5baV0sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudEFuY2hvcixcbiAgICAgICAgICAyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoYW5jaG9yLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZWxlcG9ydChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHtcbiAgbzogeyBuZXh0U2libGluZywgcGFyZW50Tm9kZSwgcXVlcnlTZWxlY3RvciwgaW5zZXJ0LCBjcmVhdGVUZXh0IH1cbn0sIGh5ZHJhdGVDaGlsZHJlbikge1xuICBjb25zdCB0YXJnZXQgPSB2bm9kZS50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgIHZub2RlLnByb3BzLFxuICAgIHF1ZXJ5U2VsZWN0b3JcbiAgKTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IGRpc2FibGVkID0gaXNUZWxlcG9ydERpc2FibGVkKHZub2RlLnByb3BzKTtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gdGFyZ2V0Ll9scGEgfHwgdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdm5vZGUuYW5jaG9yID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIG5leHRTaWJsaW5nKG5vZGUpLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudE5vZGUobm9kZSksXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgdm5vZGUudGFyZ2V0U3RhcnQgPSB0YXJnZXROb2RlO1xuICAgICAgICB2bm9kZS50YXJnZXRBbmNob3IgPSB0YXJnZXROb2RlICYmIG5leHRTaWJsaW5nKHRhcmdldE5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuYW5jaG9yID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIGxldCB0YXJnZXRBbmNob3IgPSB0YXJnZXROb2RlO1xuICAgICAgICB3aGlsZSAodGFyZ2V0QW5jaG9yKSB7XG4gICAgICAgICAgaWYgKHRhcmdldEFuY2hvciAmJiB0YXJnZXRBbmNob3Iubm9kZVR5cGUgPT09IDgpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXRBbmNob3IuZGF0YSA9PT0gXCJ0ZWxlcG9ydCBzdGFydCBhbmNob3JcIikge1xuICAgICAgICAgICAgICB2bm9kZS50YXJnZXRTdGFydCA9IHRhcmdldEFuY2hvcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0QW5jaG9yLmRhdGEgPT09IFwidGVsZXBvcnQgYW5jaG9yXCIpIHtcbiAgICAgICAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0QW5jaG9yO1xuICAgICAgICAgICAgICB0YXJnZXQuX2xwYSA9IHZub2RlLnRhcmdldEFuY2hvciAmJiBuZXh0U2libGluZyh2bm9kZS50YXJnZXRBbmNob3IpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGFyZ2V0QW5jaG9yID0gbmV4dFNpYmxpbmcodGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZub2RlLnRhcmdldEFuY2hvcikge1xuICAgICAgICAgIHByZXBhcmVBbmNob3IodGFyZ2V0LCB2bm9kZSwgY3JlYXRlVGV4dCwgaW5zZXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICAgICAgdGFyZ2V0Tm9kZSAmJiBuZXh0U2libGluZyh0YXJnZXROb2RlKSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQ3NzVmFycyh2bm9kZSwgZGlzYWJsZWQpO1xuICB9XG4gIHJldHVybiB2bm9kZS5hbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yKTtcbn1cbmNvbnN0IFRlbGVwb3J0ID0gVGVsZXBvcnRJbXBsO1xuZnVuY3Rpb24gdXBkYXRlQ3NzVmFycyh2bm9kZSwgaXNEaXNhYmxlZCkge1xuICBjb25zdCBjdHggPSB2bm9kZS5jdHg7XG4gIGlmIChjdHggJiYgY3R4LnV0KSB7XG4gICAgbGV0IG5vZGUsIGFuY2hvcjtcbiAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgbm9kZSA9IHZub2RlLmVsO1xuICAgICAgYW5jaG9yID0gdm5vZGUuYW5jaG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gdm5vZGUudGFyZ2V0U3RhcnQ7XG4gICAgICBhbmNob3IgPSB2bm9kZS50YXJnZXRBbmNob3I7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGFuY2hvcikge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIG5vZGUuc2V0QXR0cmlidXRlKFwiZGF0YS12LW93bmVyXCIsIGN0eC51aWQpO1xuICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuICAgIGN0eC51dCgpO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlQW5jaG9yKHRhcmdldCwgdm5vZGUsIGNyZWF0ZVRleHQsIGluc2VydCkge1xuICBjb25zdCB0YXJnZXRTdGFydCA9IHZub2RlLnRhcmdldFN0YXJ0ID0gY3JlYXRlVGV4dChcIlwiKTtcbiAgY29uc3QgdGFyZ2V0QW5jaG9yID0gdm5vZGUudGFyZ2V0QW5jaG9yID0gY3JlYXRlVGV4dChcIlwiKTtcbiAgdGFyZ2V0U3RhcnRbVGVsZXBvcnRFbmRLZXldID0gdGFyZ2V0QW5jaG9yO1xuICBpZiAodGFyZ2V0KSB7XG4gICAgaW5zZXJ0KHRhcmdldFN0YXJ0LCB0YXJnZXQpO1xuICAgIGluc2VydCh0YXJnZXRBbmNob3IsIHRhcmdldCk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldEFuY2hvcjtcbn1cblxuY29uc3QgbGVhdmVDYktleSA9IFN5bWJvbChcIl9sZWF2ZUNiXCIpO1xuY29uc3QgZW50ZXJDYktleSA9IFN5bWJvbChcIl9lbnRlckNiXCIpO1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvblN0YXRlKCkge1xuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIGlzTGVhdmluZzogZmFsc2UsXG4gICAgaXNVbm1vdW50aW5nOiBmYWxzZSxcbiAgICBsZWF2aW5nVk5vZGVzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG4gIH07XG4gIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgc3RhdGUuaXNNb3VudGVkID0gdHJ1ZTtcbiAgfSk7XG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgc3RhdGUuaXNVbm1vdW50aW5nID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmNvbnN0IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yID0gW0Z1bmN0aW9uLCBBcnJheV07XG5jb25zdCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IHtcbiAgbW9kZTogU3RyaW5nLFxuICBhcHBlYXI6IEJvb2xlYW4sXG4gIHBlcnNpc3RlZDogQm9vbGVhbixcbiAgLy8gZW50ZXJcbiAgb25CZWZvcmVFbnRlcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgLy8gbGVhdmVcbiAgb25CZWZvcmVMZWF2ZTogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgLy8gYXBwZWFyXG4gIG9uQmVmb3JlQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BcHBlYXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BcHBlYXJDYW5jZWxsZWQ6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yXG59O1xuY29uc3QgcmVjdXJzaXZlR2V0U3VidHJlZSA9IChpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBzdWJUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgcmV0dXJuIHN1YlRyZWUuY29tcG9uZW50ID8gcmVjdXJzaXZlR2V0U3VidHJlZShzdWJUcmVlLmNvbXBvbmVudCkgOiBzdWJUcmVlO1xufTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uSW1wbCA9IHtcbiAgbmFtZTogYEJhc2VUcmFuc2l0aW9uYCxcbiAgcHJvcHM6IEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgJiYgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hpbGQgPSBmaW5kTm9uQ29tbWVudENoaWxkKGNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgeyBtb2RlIH0gPSByYXdQcm9wcztcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG1vZGUgJiYgbW9kZSAhPT0gXCJpbi1vdXRcIiAmJiBtb2RlICE9PSBcIm91dC1pblwiICYmIG1vZGUgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIHdhcm4kMShgaW52YWxpZCA8dHJhbnNpdGlvbj4gbW9kZTogJHttb2RlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzTGVhdmluZykge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lckNoaWxkID0gZ2V0SW5uZXJDaGlsZCQxKGNoaWxkKTtcbiAgICAgIGlmICghaW5uZXJDaGlsZCkge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBsZXQgZW50ZXJIb29rcyA9IHJlc29sdmVUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgIGlubmVyQ2hpbGQsXG4gICAgICAgIHJhd1Byb3BzLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIC8vICMxMTA2MSwgZW5zdXJlIGVudGVySG9va3MgaXMgZnJlc2ggYWZ0ZXIgY2xvbmVcbiAgICAgICAgKGhvb2tzKSA9PiBlbnRlckhvb2tzID0gaG9va3NcbiAgICAgICk7XG4gICAgICBpZiAoaW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhpbm5lckNoaWxkLCBlbnRlckhvb2tzKTtcbiAgICAgIH1cbiAgICAgIGxldCBvbGRJbm5lckNoaWxkID0gaW5zdGFuY2Uuc3ViVHJlZSAmJiBnZXRJbm5lckNoaWxkJDEoaW5zdGFuY2Uuc3ViVHJlZSk7XG4gICAgICBpZiAob2xkSW5uZXJDaGlsZCAmJiBvbGRJbm5lckNoaWxkLnR5cGUgIT09IENvbW1lbnQgJiYgIWlzU2FtZVZOb2RlVHlwZShpbm5lckNoaWxkLCBvbGRJbm5lckNoaWxkKSAmJiByZWN1cnNpdmVHZXRTdWJ0cmVlKGluc3RhbmNlKS50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgIGxldCBsZWF2aW5nSG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgIG9sZElubmVyQ2hpbGQsXG4gICAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKG9sZElubmVyQ2hpbGQsIGxlYXZpbmdIb29rcyk7XG4gICAgICAgIGlmIChtb2RlID09PSBcIm91dC1pblwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IHRydWU7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmFmdGVyTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5pc0xlYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghKGluc3RhbmNlLmpvYi5mbGFncyAmIDgpKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIGxlYXZpbmdIb29rcy5hZnRlckxlYXZlO1xuICAgICAgICAgICAgb2xkSW5uZXJDaGlsZCA9IHZvaWQgMDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSBcImluLW91dFwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIGxlYXZpbmdIb29rcy5kZWxheUxlYXZlID0gKGVsLCBlYXJseVJlbW92ZSwgZGVsYXllZExlYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgb2xkSW5uZXJDaGlsZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtTdHJpbmcob2xkSW5uZXJDaGlsZC5rZXkpXSA9IG9sZElubmVyQ2hpbGQ7XG4gICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgZWFybHlSZW1vdmUoKTtcbiAgICAgICAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICAgICAgb2xkSW5uZXJDaGlsZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgZGVsYXllZExlYXZlKCk7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICAgICAgb2xkSW5uZXJDaGlsZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbGRJbm5lckNoaWxkID0gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9sZElubmVyQ2hpbGQpIHtcbiAgICAgICAgb2xkSW5uZXJDaGlsZCA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuICB9XG59O1xuZnVuY3Rpb24gZmluZE5vbkNvbW1lbnRDaGlsZChjaGlsZHJlbikge1xuICBsZXQgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICBsZXQgaGFzRm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaGFzRm91bmQpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBcIjx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQgb3IgY29tcG9uZW50LiBVc2UgPHRyYW5zaXRpb24tZ3JvdXA+IGZvciBsaXN0cy5cIlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGQgPSBjO1xuICAgICAgICBoYXNGb3VuZCA9IHRydWU7XG4gICAgICAgIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZDtcbn1cbmNvbnN0IEJhc2VUcmFuc2l0aW9uID0gQmFzZVRyYW5zaXRpb25JbXBsO1xuZnVuY3Rpb24gZ2V0TGVhdmluZ05vZGVzRm9yVHlwZShzdGF0ZSwgdm5vZGUpIHtcbiAgY29uc3QgeyBsZWF2aW5nVk5vZGVzIH0gPSBzdGF0ZTtcbiAgbGV0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGxlYXZpbmdWTm9kZXMuZ2V0KHZub2RlLnR5cGUpO1xuICBpZiAoIWxlYXZpbmdWTm9kZXNDYWNoZSkge1xuICAgIGxlYXZpbmdWTm9kZXNDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxlYXZpbmdWTm9kZXMuc2V0KHZub2RlLnR5cGUsIGxlYXZpbmdWTm9kZXNDYWNoZSk7XG4gIH1cbiAgcmV0dXJuIGxlYXZpbmdWTm9kZXNDYWNoZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uSG9va3Modm5vZGUsIHByb3BzLCBzdGF0ZSwgaW5zdGFuY2UsIHBvc3RDbG9uZSkge1xuICBjb25zdCB7XG4gICAgYXBwZWFyLFxuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gICAgb25CZWZvcmVFbnRlcixcbiAgICBvbkVudGVyLFxuICAgIG9uQWZ0ZXJFbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uQmVmb3JlTGVhdmUsXG4gICAgb25MZWF2ZSxcbiAgICBvbkFmdGVyTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhcixcbiAgICBvbkFwcGVhcixcbiAgICBvbkFmdGVyQXBwZWFyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qga2V5ID0gU3RyaW5nKHZub2RlLmtleSk7XG4gIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoc3RhdGUsIHZub2RlKTtcbiAgY29uc3QgY2FsbEhvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGhvb2sgJiYgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBob29rLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA5LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH07XG4gIGNvbnN0IGNhbGxBc3luY0hvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBhcmdzWzFdO1xuICAgIGNhbGxIb29rKGhvb2ssIGFyZ3MpO1xuICAgIGlmIChpc0FycmF5KGhvb2spKSB7XG4gICAgICBpZiAoaG9vay5ldmVyeSgoaG9vazIpID0+IGhvb2syLmxlbmd0aCA8PSAxKSkgZG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoaG9vay5sZW5ndGggPD0gMSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaG9va3MgPSB7XG4gICAgbW9kZSxcbiAgICBwZXJzaXN0ZWQsXG4gICAgYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25CZWZvcmVFbnRlcjtcbiAgICAgIGlmICghc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgICBob29rID0gb25CZWZvcmVBcHBlYXIgfHwgb25CZWZvcmVFbnRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBlbFtsZWF2ZUNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBsZWF2aW5nVk5vZGUgPSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChsZWF2aW5nVk5vZGUgJiYgaXNTYW1lVk5vZGVUeXBlKHZub2RlLCBsZWF2aW5nVk5vZGUpICYmIGxlYXZpbmdWTm9kZS5lbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0oKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKGhvb2ssIFtlbF0pO1xuICAgIH0sXG4gICAgZW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25FbnRlcjtcbiAgICAgIGxldCBhZnRlckhvb2sgPSBvbkFmdGVyRW50ZXI7XG4gICAgICBsZXQgY2FuY2VsSG9vayA9IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQXBwZWFyIHx8IG9uRW50ZXI7XG4gICAgICAgICAgYWZ0ZXJIb29rID0gb25BZnRlckFwcGVhciB8fCBvbkFmdGVyRW50ZXI7XG4gICAgICAgICAgY2FuY2VsSG9vayA9IG9uQXBwZWFyQ2FuY2VsbGVkIHx8IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBkb25lID0gZWxbZW50ZXJDYktleV0gPSAoY2FuY2VsbGVkKSA9PiB7XG4gICAgICAgIGlmIChjYWxsZWQpIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKGNhbmNlbEhvb2ssIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKGFmdGVySG9vaywgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvb2tzLmRlbGF5ZWRMZWF2ZSkge1xuICAgICAgICAgIGhvb2tzLmRlbGF5ZWRMZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsW2VudGVyQ2JLZXldID0gdm9pZCAwO1xuICAgICAgfTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2soaG9vaywgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsZWF2ZShlbCwgcmVtb3ZlKSB7XG4gICAgICBjb25zdCBrZXkyID0gU3RyaW5nKHZub2RlLmtleSk7XG4gICAgICBpZiAoZWxbZW50ZXJDYktleV0pIHtcbiAgICAgICAgZWxbZW50ZXJDYktleV0oXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzVW5tb3VudGluZykge1xuICAgICAgICByZXR1cm4gcmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUxlYXZlLCBbZWxdKTtcbiAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSBlbFtsZWF2ZUNiS2V5XSA9IChjYW5jZWxsZWQpID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKG9uTGVhdmVDYW5jZWxsZWQsIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKG9uQWZ0ZXJMZWF2ZSwgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgIGlmIChsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml0gPT09IHZub2RlKSB7XG4gICAgICAgICAgZGVsZXRlIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXSA9IHZub2RlO1xuICAgICAgaWYgKG9uTGVhdmUpIHtcbiAgICAgICAgY2FsbEFzeW5jSG9vayhvbkxlYXZlLCBbZWwsIGRvbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsb25lKHZub2RlMikge1xuICAgICAgY29uc3QgaG9va3MyID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgdm5vZGUyLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBwb3N0Q2xvbmVcbiAgICAgICk7XG4gICAgICBpZiAocG9zdENsb25lKSBwb3N0Q2xvbmUoaG9va3MyKTtcbiAgICAgIHJldHVybiBob29rczI7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBlbXB0eVBsYWNlaG9sZGVyKHZub2RlKSB7XG4gIGlmIChpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIHZub2RlLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldElubmVyQ2hpbGQkMSh2bm9kZSkge1xuICBpZiAoIWlzS2VlcEFsaXZlKHZub2RlKSkge1xuICAgIGlmIChpc1RlbGVwb3J0KHZub2RlLnR5cGUpICYmIHZub2RlLmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gZmluZE5vbkNvbW1lbnRDaGlsZCh2bm9kZS5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiB2bm9kZTtcbiAgfVxuICBpZiAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlO1xuICB9XG4gIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiB9ID0gdm5vZGU7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuWzBdO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgMzIgJiYgaXNGdW5jdGlvbihjaGlsZHJlbi5kZWZhdWx0KSkge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuLmRlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZSwgaG9va3MpIHtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDYgJiYgdm5vZGUuY29tcG9uZW50KSB7XG4gICAgdm5vZGUudHJhbnNpdGlvbiA9IGhvb2tzO1xuICAgIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgaG9va3MpO1xuICB9IGVsc2UgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgIHZub2RlLnNzQ29udGVudC50cmFuc2l0aW9uID0gaG9va3MuY2xvbmUodm5vZGUuc3NDb250ZW50KTtcbiAgICB2bm9kZS5zc0ZhbGxiYWNrLnRyYW5zaXRpb24gPSBob29rcy5jbG9uZSh2bm9kZS5zc0ZhbGxiYWNrKTtcbiAgfSBlbHNlIHtcbiAgICB2bm9kZS50cmFuc2l0aW9uID0gaG9va3M7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZHJlbiwga2VlcENvbW1lbnQgPSBmYWxzZSwgcGFyZW50S2V5KSB7XG4gIGxldCByZXQgPSBbXTtcbiAgbGV0IGtleWVkRnJhZ21lbnRDb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBjb25zdCBrZXkgPSBwYXJlbnRLZXkgPT0gbnVsbCA/IGNoaWxkLmtleSA6IFN0cmluZyhwYXJlbnRLZXkpICsgU3RyaW5nKGNoaWxkLmtleSAhPSBudWxsID8gY2hpbGQua2V5IDogaSk7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBpZiAoY2hpbGQucGF0Y2hGbGFnICYgMTI4KSBrZXllZEZyYWdtZW50Q291bnQrKztcbiAgICAgIHJldCA9IHJldC5jb25jYXQoXG4gICAgICAgIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwga2VlcENvbW1lbnQsIGtleSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChrZWVwQ29tbWVudCB8fCBjaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICByZXQucHVzaChrZXkgIT0gbnVsbCA/IGNsb25lVk5vZGUoY2hpbGQsIHsga2V5IH0pIDogY2hpbGQpO1xuICAgIH1cbiAgfVxuICBpZiAoa2V5ZWRGcmFnbWVudENvdW50ID4gMSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXRbaV0ucGF0Y2hGbGFnID0gLTI7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUNvbXBvbmVudChvcHRpb25zLCBleHRyYU9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob3B0aW9ucykgPyAoXG4gICAgLy8gIzgyMzY6IGV4dGVuZCBjYWxsIGFuZCBvcHRpb25zLm5hbWUgYWNjZXNzIGFyZSBjb25zaWRlcmVkIHNpZGUtZWZmZWN0c1xuICAgIC8vIGJ5IFJvbGx1cCwgc28gd2UgaGF2ZSB0byB3cmFwIGl0IGluIGEgcHVyZS1hbm5vdGF0ZWQgSUlGRS5cbiAgICAvKiBAX19QVVJFX18gKi8gKCgpID0+IGV4dGVuZCh7IG5hbWU6IG9wdGlvbnMubmFtZSB9LCBleHRyYU9wdGlvbnMsIHsgc2V0dXA6IG9wdGlvbnMgfSkpKClcbiAgKSA6IG9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpKSB7XG4gICAgcmV0dXJuIChpLmFwcENvbnRleHQuY29uZmlnLmlkUHJlZml4IHx8IFwidlwiKSArIFwiLVwiICsgaS5pZHNbMF0gKyBpLmlkc1sxXSsrO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgdXNlSWQoKSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cbmZ1bmN0aW9uIG1hcmtBc3luY0JvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLmlkcyA9IFtpbnN0YW5jZS5pZHNbMF0gKyBpbnN0YW5jZS5pZHNbMl0rKyArIFwiLVwiLCAwLCAwXTtcbn1cblxuY29uc3Qga25vd25UZW1wbGF0ZVJlZnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbmZ1bmN0aW9uIHVzZVRlbXBsYXRlUmVmKGtleSkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGNvbnN0IHIgPSBzaGFsbG93UmVmKG51bGwpO1xuICBpZiAoaSkge1xuICAgIGNvbnN0IHJlZnMgPSBpLnJlZnMgPT09IEVNUFRZX09CSiA/IGkucmVmcyA9IHt9IDogaS5yZWZzO1xuICAgIGxldCBkZXNjO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyZWZzLCBrZXkpKSAmJiAhZGVzYy5jb25maWd1cmFibGUpIHtcbiAgICAgIHdhcm4kMShgdXNlVGVtcGxhdGVSZWYoJyR7a2V5fScpIGFscmVhZHkgZXhpc3RzLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVmcywga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gci52YWx1ZSxcbiAgICAgICAgc2V0OiAodmFsKSA9PiByLnZhbHVlID0gdmFsXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGB1c2VUZW1wbGF0ZVJlZigpIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJldCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyByZWFkb25seShyKSA6IHI7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAga25vd25UZW1wbGF0ZVJlZnMuYWRkKHJldCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2V0UmVmKHJhd1JlZiwgb2xkUmF3UmVmLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUsIGlzVW5tb3VudCA9IGZhbHNlKSB7XG4gIGlmIChpc0FycmF5KHJhd1JlZikpIHtcbiAgICByYXdSZWYuZm9yRWFjaChcbiAgICAgIChyLCBpKSA9PiBzZXRSZWYoXG4gICAgICAgIHIsXG4gICAgICAgIG9sZFJhd1JlZiAmJiAoaXNBcnJheShvbGRSYXdSZWYpID8gb2xkUmF3UmVmW2ldIDogb2xkUmF3UmVmKSxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBpc1VubW91bnRcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpICYmICFpc1VubW91bnQpIHtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNTEyICYmIHZub2RlLnR5cGUuX19hc3luY1Jlc29sdmVkICYmIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlLmNvbXBvbmVudCkge1xuICAgICAgc2V0UmVmKHJhd1JlZiwgb2xkUmF3UmVmLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUuY29tcG9uZW50LnN1YlRyZWUpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVmVmFsdWUgPSB2bm9kZS5zaGFwZUZsYWcgJiA0ID8gZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2Uodm5vZGUuY29tcG9uZW50KSA6IHZub2RlLmVsO1xuICBjb25zdCB2YWx1ZSA9IGlzVW5tb3VudCA/IG51bGwgOiByZWZWYWx1ZTtcbiAgY29uc3QgeyBpOiBvd25lciwgcjogcmVmIH0gPSByYXdSZWY7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFvd25lcikge1xuICAgIHdhcm4kMShcbiAgICAgIGBNaXNzaW5nIHJlZiBvd25lciBjb250ZXh0LiByZWYgY2Fubm90IGJlIHVzZWQgb24gaG9pc3RlZCB2bm9kZXMuIEEgdm5vZGUgd2l0aCByZWYgbXVzdCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvbGRSZWYgPSBvbGRSYXdSZWYgJiYgb2xkUmF3UmVmLnI7XG4gIGNvbnN0IHJlZnMgPSBvd25lci5yZWZzID09PSBFTVBUWV9PQkogPyBvd25lci5yZWZzID0ge30gOiBvd25lci5yZWZzO1xuICBjb25zdCBzZXR1cFN0YXRlID0gb3duZXIuc2V0dXBTdGF0ZTtcbiAgY29uc3QgcmF3U2V0dXBTdGF0ZSA9IHRvUmF3KHNldHVwU3RhdGUpO1xuICBjb25zdCBjYW5TZXRTZXR1cFJlZiA9IHNldHVwU3RhdGUgPT09IEVNUFRZX09CSiA/IE5PIDogKGtleSkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoaGFzT3duKHJhd1NldHVwU3RhdGUsIGtleSkgJiYgIWlzUmVmKHJhd1NldHVwU3RhdGVba2V5XSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBUZW1wbGF0ZSByZWYgXCIke2tleX1cIiB1c2VkIG9uIGEgbm9uLXJlZiB2YWx1ZS4gSXQgd2lsbCBub3Qgd29yayBpbiB0aGUgcHJvZHVjdGlvbiBidWlsZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoa25vd25UZW1wbGF0ZVJlZnMuaGFzKHJhd1NldHVwU3RhdGVba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzT3duKHJhd1NldHVwU3RhdGUsIGtleSk7XG4gIH07XG4gIGNvbnN0IGNhblNldFJlZiA9IChyZWYyKSA9PiB7XG4gICAgcmV0dXJuICEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8ICFrbm93blRlbXBsYXRlUmVmcy5oYXMocmVmMik7XG4gIH07XG4gIGlmIChvbGRSZWYgIT0gbnVsbCAmJiBvbGRSZWYgIT09IHJlZikge1xuICAgIGlmIChpc1N0cmluZyhvbGRSZWYpKSB7XG4gICAgICByZWZzW29sZFJlZl0gPSBudWxsO1xuICAgICAgaWYgKGNhblNldFNldHVwUmVmKG9sZFJlZikpIHtcbiAgICAgICAgc2V0dXBTdGF0ZVtvbGRSZWZdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUmVmKG9sZFJlZikpIHtcbiAgICAgIGlmIChjYW5TZXRSZWYob2xkUmVmKSkge1xuICAgICAgICBvbGRSZWYudmFsdWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2xkUmF3UmVmQXRvbSA9IG9sZFJhd1JlZjtcbiAgICAgIGlmIChvbGRSYXdSZWZBdG9tLmspIHJlZnNbb2xkUmF3UmVmQXRvbS5rXSA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKHJlZikpIHtcbiAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcocmVmLCBvd25lciwgMTIsIFt2YWx1ZSwgcmVmc10pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IF9pc1N0cmluZyA9IGlzU3RyaW5nKHJlZik7XG4gICAgY29uc3QgX2lzUmVmID0gaXNSZWYocmVmKTtcbiAgICBpZiAoX2lzU3RyaW5nIHx8IF9pc1JlZikge1xuICAgICAgY29uc3QgZG9TZXQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChyYXdSZWYuZikge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2lzU3RyaW5nID8gY2FuU2V0U2V0dXBSZWYocmVmKSA/IHNldHVwU3RhdGVbcmVmXSA6IHJlZnNbcmVmXSA6IGNhblNldFJlZihyZWYpIHx8ICFyYXdSZWYuayA/IHJlZi52YWx1ZSA6IHJlZnNbcmF3UmVmLmtdO1xuICAgICAgICAgIGlmIChpc1VubW91bnQpIHtcbiAgICAgICAgICAgIGlzQXJyYXkoZXhpc3RpbmcpICYmIHJlbW92ZShleGlzdGluZywgcmVmVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgIGlmIChfaXNTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZWZzW3JlZl0gPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgIGlmIChjYW5TZXRTZXR1cFJlZihyZWYpKSB7XG4gICAgICAgICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSByZWZzW3JlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IFtyZWZWYWx1ZV07XG4gICAgICAgICAgICAgICAgaWYgKGNhblNldFJlZihyZWYpKSB7XG4gICAgICAgICAgICAgICAgICByZWYudmFsdWUgPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyYXdSZWYuaykgcmVmc1tyYXdSZWYua10gPSBuZXdWYWw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKHJlZlZhbHVlKSkge1xuICAgICAgICAgICAgICBleGlzdGluZy5wdXNoKHJlZlZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzU3RyaW5nKSB7XG4gICAgICAgICAgcmVmc1tyZWZdID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGNhblNldFNldHVwUmVmKHJlZikpIHtcbiAgICAgICAgICAgIHNldHVwU3RhdGVbcmVmXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfaXNSZWYpIHtcbiAgICAgICAgICBpZiAoY2FuU2V0UmVmKHJlZikpIHtcbiAgICAgICAgICAgIHJlZi52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmF3UmVmLmspIHJlZnNbcmF3UmVmLmtdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShcIkludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6XCIsIHJlZiwgYCgke3R5cGVvZiByZWZ9KWApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRvU2V0LmlkID0gLTE7XG4gICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChkb1NldCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9TZXQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShcIkludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6XCIsIHJlZiwgYCgke3R5cGVvZiByZWZ9KWApO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgaGFzTG9nZ2VkTWlzbWF0Y2hFcnJvciA9IGZhbHNlO1xuY29uc3QgbG9nTWlzbWF0Y2hFcnJvciA9ICgpID0+IHtcbiAgaWYgKGhhc0xvZ2dlZE1pc21hdGNoRXJyb3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5lcnJvcihcIkh5ZHJhdGlvbiBjb21wbGV0ZWQgYnV0IGNvbnRhaW5zIG1pc21hdGNoZXMuXCIpO1xuICBoYXNMb2dnZWRNaXNtYXRjaEVycm9yID0gdHJ1ZTtcbn07XG5jb25zdCBpc1NWR0NvbnRhaW5lciA9IChjb250YWluZXIpID0+IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoXCJzdmdcIikgJiYgY29udGFpbmVyLnRhZ05hbWUgIT09IFwiZm9yZWlnbk9iamVjdFwiO1xuY29uc3QgaXNNYXRoTUxDb250YWluZXIgPSAoY29udGFpbmVyKSA9PiBjb250YWluZXIubmFtZXNwYWNlVVJJLmluY2x1ZGVzKFwiTWF0aE1MXCIpO1xuY29uc3QgZ2V0Q29udGFpbmVyVHlwZSA9IChjb250YWluZXIpID0+IHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKGlzU1ZHQ29udGFpbmVyKGNvbnRhaW5lcikpIHJldHVybiBcInN2Z1wiO1xuICBpZiAoaXNNYXRoTUxDb250YWluZXIoY29udGFpbmVyKSkgcmV0dXJuIFwibWF0aG1sXCI7XG4gIHJldHVybiB2b2lkIDA7XG59O1xuY29uc3QgaXNDb21tZW50ID0gKG5vZGUpID0+IG5vZGUubm9kZVR5cGUgPT09IDg7XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25GdW5jdGlvbnMocmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgY29uc3Qge1xuICAgIG10OiBtb3VudENvbXBvbmVudCxcbiAgICBwOiBwYXRjaCxcbiAgICBvOiB7XG4gICAgICBwYXRjaFByb3AsXG4gICAgICBjcmVhdGVUZXh0LFxuICAgICAgbmV4dFNpYmxpbmcsXG4gICAgICBwYXJlbnROb2RlLFxuICAgICAgcmVtb3ZlLFxuICAgICAgaW5zZXJ0LFxuICAgICAgY3JlYXRlQ29tbWVudFxuICAgIH1cbiAgfSA9IHJlbmRlcmVySW50ZXJuYWxzO1xuICBjb25zdCBoeWRyYXRlID0gKHZub2RlLCBjb250YWluZXIpID0+IHtcbiAgICBpZiAoIWNvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICBgQXR0ZW1wdGluZyB0byBoeWRyYXRlIGV4aXN0aW5nIG1hcmt1cCBidXQgY29udGFpbmVyIGlzIGVtcHR5LiBQZXJmb3JtaW5nIGZ1bGwgbW91bnQgaW5zdGVhZC5gXG4gICAgICApO1xuICAgICAgcGF0Y2gobnVsbCwgdm5vZGUsIGNvbnRhaW5lcik7XG4gICAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoeWRyYXRlTm9kZShjb250YWluZXIuZmlyc3RDaGlsZCwgdm5vZGUsIG51bGwsIG51bGwsIG51bGwpO1xuICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICB9O1xuICBjb25zdCBoeWRyYXRlTm9kZSA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCBpc0ZyYWdtZW50U3RhcnQgPSBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcIltcIjtcbiAgICBjb25zdCBvbk1pc21hdGNoID0gKCkgPT4gaGFuZGxlTWlzbWF0Y2goXG4gICAgICBub2RlLFxuICAgICAgdm5vZGUsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgIGlzRnJhZ21lbnRTdGFydFxuICAgICk7XG4gICAgY29uc3QgeyB0eXBlLCByZWYsIHNoYXBlRmxhZywgcGF0Y2hGbGFnIH0gPSB2bm9kZTtcbiAgICBsZXQgZG9tVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgdm5vZGUuZWwgPSBub2RlO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZGVmKG5vZGUsIFwiX192bm9kZVwiLCB2bm9kZSwgdHJ1ZSk7XG4gICAgICBkZWYobm9kZSwgXCJfX3Z1ZVBhcmVudENvbXBvbmVudFwiLCBwYXJlbnRDb21wb25lbnQsIHRydWUpO1xuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnID09PSAtMikge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICB2bm9kZS5keW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBsZXQgbmV4dE5vZGUgPSBudWxsO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUZXh0OlxuICAgICAgICBpZiAoZG9tVHlwZSAhPT0gMykge1xuICAgICAgICAgIGlmICh2bm9kZS5jaGlsZHJlbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgaW5zZXJ0KHZub2RlLmVsID0gY3JlYXRlVGV4dChcIlwiKSwgcGFyZW50Tm9kZShub2RlKSwgbm9kZSk7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobm9kZS5kYXRhICE9PSB2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgICAgICAgIGBIeWRyYXRpb24gdGV4dCBtaXNtYXRjaCBpbmAsXG4gICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZSxcbiAgICAgICAgICAgICAgYFxuICAtIHJlbmRlcmVkIG9uIHNlcnZlcjogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBub2RlLmRhdGFcbiAgICAgICAgICAgICAgKX1cbiAgLSBleHBlY3RlZCBvbiBjbGllbnQ6ICR7SlNPTi5zdHJpbmdpZnkodm5vZGUuY2hpbGRyZW4pfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tbWVudDpcbiAgICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICByZXBsYWNlTm9kZShcbiAgICAgICAgICAgIHZub2RlLmVsID0gbm9kZS5jb250ZW50LmZpcnN0Q2hpbGQsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkb21UeXBlICE9PSA4IHx8IGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0YXRpYzpcbiAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICBkb21UeXBlID0gbm9kZS5ub2RlVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9tVHlwZSA9PT0gMSB8fCBkb21UeXBlID09PSAzKSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBub2RlO1xuICAgICAgICAgIGNvbnN0IG5lZWRUb0Fkb3B0Q29udGVudCA9ICF2bm9kZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2bm9kZS5zdGF0aWNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobmVlZFRvQWRvcHRDb250ZW50KVxuICAgICAgICAgICAgICB2bm9kZS5jaGlsZHJlbiArPSBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMSA/IG5leHROb2RlLm91dGVySFRNTCA6IG5leHROb2RlLmRhdGE7XG4gICAgICAgICAgICBpZiAoaSA9PT0gdm5vZGUuc3RhdGljQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIHZub2RlLmFuY2hvciA9IG5leHROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhuZXh0Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpc0ZyYWdtZW50U3RhcnQgPyBuZXh0U2libGluZyhuZXh0Tm9kZSkgOiBuZXh0Tm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbk1pc21hdGNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgICBpZiAoIWlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHROb2RlID0gaHlkcmF0ZUZyYWdtZW50KFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEpIHtcbiAgICAgICAgICBpZiAoKGRvbVR5cGUgIT09IDEgfHwgdm5vZGUudHlwZS50b0xvd2VyQ2FzZSgpICE9PSBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkgJiYgIWlzVGVtcGxhdGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBoeWRyYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICAgICAgdm5vZGUuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gXCJ0ZWxlcG9ydCBzdGFydFwiKSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSwgbm9kZS5kYXRhLCBcInRlbGVwb3J0IGVuZFwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbW91bnRDb21wb25lbnQoXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzQXN5bmNXcmFwcGVyKHZub2RlKSAmJiAhdm5vZGUudHlwZS5fX2FzeW5jUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIGxldCBzdWJUcmVlO1xuICAgICAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgICAgICBzdWJUcmVlID0gY3JlYXRlVk5vZGUoRnJhZ21lbnQpO1xuICAgICAgICAgICAgICBzdWJUcmVlLmFuY2hvciA9IG5leHROb2RlID8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nIDogY29udGFpbmVyLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN1YlRyZWUgPSBub2RlLm5vZGVUeXBlID09PSAzID8gY3JlYXRlVGV4dFZOb2RlKFwiXCIpIDogY3JlYXRlVk5vZGUoXCJkaXZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJUcmVlLmVsID0gbm9kZTtcbiAgICAgICAgICAgIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlID0gc3ViVHJlZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgICBpZiAoZG9tVHlwZSAhPT0gOCkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgICBoeWRyYXRlQ2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBnZXRDb250YWluZXJUeXBlKHBhcmVudE5vZGUobm9kZSkpLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgICAgICAgICBoeWRyYXRlTm9kZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIEhvc3RWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHROb2RlO1xuICB9O1xuICBjb25zdCBoeWRyYXRlRWxlbWVudCA9IChlbCwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IHsgdHlwZSwgcHJvcHMsIHBhdGNoRmxhZywgc2hhcGVGbGFnLCBkaXJzLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBjb25zdCBmb3JjZVBhdGNoID0gdHlwZSA9PT0gXCJpbnB1dFwiIHx8IHR5cGUgPT09IFwib3B0aW9uXCI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZm9yY2VQYXRjaCB8fCBwYXRjaEZsYWcgIT09IC0xKSB7XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiY3JlYXRlZFwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IGZhbHNlO1xuICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKGVsKSkge1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgLy8gbm8gbmVlZCBjaGVjayBwYXJlbnRTdXNwZW5zZSBpbiBoeWRyYXRpb25cbiAgICAgICAgICB0cmFuc2l0aW9uXG4gICAgICAgICkgJiYgcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC52bm9kZS5wcm9wcyAmJiBwYXJlbnRDb21wb25lbnQudm5vZGUucHJvcHMuYXBwZWFyO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZWwuY29udGVudC5maXJzdENoaWxkO1xuICAgICAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgICAgICBjb25zdCBjbHMgPSBjb250ZW50LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgICAgICAgIGlmIChjbHMpIGNvbnRlbnQuJGNscyA9IGNscztcbiAgICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlcGxhY2VOb2RlKGNvbnRlbnQsIGVsLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB2bm9kZS5lbCA9IGVsID0gY29udGVudDtcbiAgICAgIH1cbiAgICAgIGlmIChzaGFwZUZsYWcgJiAxNiAmJiAvLyBza2lwIGlmIGVsZW1lbnQgaGFzIGlubmVySFRNTCAvIHRleHRDb250ZW50XG4gICAgICAhKHByb3BzICYmIChwcm9wcy5pbm5lckhUTUwgfHwgcHJvcHMudGV4dENvbnRlbnQpKSkge1xuICAgICAgICBsZXQgbmV4dCA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICBlbC5maXJzdENoaWxkLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKG5leHQpIHtcbiAgICAgICAgICBpZiAoIWlzTWlzbWF0Y2hBbGxvd2VkKGVsLCAxIC8qIENISUxEUkVOICovKSkge1xuICAgICAgICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgICAgYEh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBvbmAsXG4gICAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgICAgYFxuU2VydmVyIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgbW9yZSBjaGlsZCBub2RlcyB0aGFuIGNsaWVudCB2ZG9tLmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY3VyID0gbmV4dDtcbiAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICByZW1vdmUoY3VyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgIGxldCBjbGllbnRUZXh0ID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIGlmIChjbGllbnRUZXh0WzBdID09PSBcIlxcblwiICYmIChlbC50YWdOYW1lID09PSBcIlBSRVwiIHx8IGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikpIHtcbiAgICAgICAgICBjbGllbnRUZXh0ID0gY2xpZW50VGV4dC5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWwudGV4dENvbnRlbnQgIT09IGNsaWVudFRleHQpIHtcbiAgICAgICAgICBpZiAoIWlzTWlzbWF0Y2hBbGxvd2VkKGVsLCAwIC8qIFRFWFQgKi8pKSB7XG4gICAgICAgICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgYFxuICAtIHJlbmRlcmVkIG9uIHNlcnZlcjogJHtlbC50ZXh0Q29udGVudH1cbiAgLSBleHBlY3RlZCBvbiBjbGllbnQ6ICR7dm5vZGUuY2hpbGRyZW59YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWwudGV4dENvbnRlbnQgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXyB8fCBmb3JjZVBhdGNoIHx8ICFvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnICYgKDE2IHwgMzIpKSB7XG4gICAgICAgICAgY29uc3QgaXNDdXN0b21FbGVtZW50ID0gZWwudGFnTmFtZS5pbmNsdWRlcyhcIi1cIik7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIC8vICMxMTE4OSBza2lwIGlmIHRoaXMgbm9kZSBoYXMgZGlyZWN0aXZlcyB0aGF0IGhhdmUgY3JlYXRlZCBob29rc1xuICAgICAgICAgICAgLy8gYXMgaXQgY291bGQgaGF2ZSBtdXRhdGVkIHRoZSBET00gaW4gYW55IHBvc3NpYmxlIHdheVxuICAgICAgICAgICAgIShkaXJzICYmIGRpcnMuc29tZSgoZCkgPT4gZC5kaXIuY3JlYXRlZCkpICYmIHByb3BIYXNNaXNtYXRjaChlbCwga2V5LCBwcm9wc1trZXldLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50KSkge1xuICAgICAgICAgICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm9yY2VQYXRjaCAmJiAoa2V5LmVuZHNXaXRoKFwidmFsdWVcIikgfHwga2V5ID09PSBcImluZGV0ZXJtaW5hdGVcIikgfHwgaXNPbihrZXkpICYmICFpc1Jlc2VydmVkUHJvcChrZXkpIHx8IC8vIGZvcmNlIGh5ZHJhdGUgdi1iaW5kIHdpdGggLnByb3AgbW9kaWZpZXJzXG4gICAgICAgICAgICBrZXlbMF0gPT09IFwiLlwiIHx8IGlzQ3VzdG9tRWxlbWVudCkge1xuICAgICAgICAgICAgICBwYXRjaFByb3AoZWwsIGtleSwgbnVsbCwgcHJvcHNba2V5XSwgdm9pZCAwLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgcGF0Y2hQcm9wKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcIm9uQ2xpY2tcIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwcm9wcy5vbkNsaWNrLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiA0ICYmIGlzUmVhY3RpdmUocHJvcHMuc3R5bGUpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMuc3R5bGUpIHByb3BzLnN0eWxlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCB2bm9kZUhvb2tzO1xuICAgICAgaWYgKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlQmVmb3JlTW91bnQpIHtcbiAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9va3MsIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgfVxuICAgICAgaWYgKGRpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZU1vdW50XCIpO1xuICAgICAgfVxuICAgICAgaWYgKCh2bm9kZUhvb2tzID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IGRpcnMgfHwgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgICAgcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UoKCkgPT4ge1xuICAgICAgICAgIHZub2RlSG9va3MgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9va3MsIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICAgIG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzICYmIHRyYW5zaXRpb24uZW50ZXIoZWwpO1xuICAgICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcIm1vdW50ZWRcIik7XG4gICAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsLm5leHRTaWJsaW5nO1xuICB9O1xuICBjb25zdCBoeWRyYXRlQ2hpbGRyZW4gPSAobm9kZSwgcGFyZW50Vk5vZGUsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBvcHRpbWl6ZWQgPSBvcHRpbWl6ZWQgfHwgISFwYXJlbnRWTm9kZS5keW5hbWljQ2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGRyZW4gPSBwYXJlbnRWTm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBsID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgY29uc3Qgdm5vZGUgPSBvcHRpbWl6ZWQgPyBjaGlsZHJlbltpXSA6IGNoaWxkcmVuW2ldID0gbm9ybWFsaXplVk5vZGUoY2hpbGRyZW5baV0pO1xuICAgICAgY29uc3QgaXNUZXh0ID0gdm5vZGUudHlwZSA9PT0gVGV4dDtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIGlmIChpc1RleHQgJiYgIW9wdGltaXplZCkge1xuICAgICAgICAgIGlmIChpICsgMSA8IGwgJiYgbm9ybWFsaXplVk5vZGUoY2hpbGRyZW5baSArIDFdKS50eXBlID09PSBUZXh0KSB7XG4gICAgICAgICAgICBpbnNlcnQoXG4gICAgICAgICAgICAgIGNyZWF0ZVRleHQoXG4gICAgICAgICAgICAgICAgbm9kZS5kYXRhLnNsaWNlKHZub2RlLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgICBuZXh0U2libGluZyhub2RlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5vZGUuZGF0YSA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBub2RlID0gaHlkcmF0ZU5vZGUoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpc1RleHQgJiYgIXZub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGluc2VydCh2bm9kZS5lbCA9IGNyZWF0ZVRleHQoXCJcIiksIGNvbnRhaW5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWlzTWlzbWF0Y2hBbGxvd2VkKGNvbnRhaW5lciwgMSAvKiBDSElMRFJFTiAqLykpIHtcbiAgICAgICAgICBpZiAoKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiAhaGFzV2FybmVkKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgIGBcblNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIGZld2VyIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBnZXRDb250YWluZXJUeXBlKGNvbnRhaW5lciksXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9O1xuICBjb25zdCBoeWRyYXRlRnJhZ21lbnQgPSAobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgeyBzbG90U2NvcGVJZHM6IGZyYWdtZW50U2xvdFNjb3BlSWRzIH0gPSB2bm9kZTtcbiAgICBpZiAoZnJhZ21lbnRTbG90U2NvcGVJZHMpIHtcbiAgICAgIHNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkcyA/IHNsb3RTY29wZUlkcy5jb25jYXQoZnJhZ21lbnRTbG90U2NvcGVJZHMpIDogZnJhZ21lbnRTbG90U2NvcGVJZHM7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgY29uc3QgbmV4dCA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgIG5leHRTaWJsaW5nKG5vZGUpLFxuICAgICAgdm5vZGUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgIG9wdGltaXplZFxuICAgICk7XG4gICAgaWYgKG5leHQgJiYgaXNDb21tZW50KG5leHQpICYmIG5leHQuZGF0YSA9PT0gXCJdXCIpIHtcbiAgICAgIHJldHVybiBuZXh0U2libGluZyh2bm9kZS5hbmNob3IgPSBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgaW5zZXJ0KHZub2RlLmFuY2hvciA9IGNyZWF0ZUNvbW1lbnQoYF1gKSwgY29udGFpbmVyLCBuZXh0KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaGFuZGxlTWlzbWF0Y2ggPSAobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgaXNGcmFnbWVudCkgPT4ge1xuICAgIGlmICghaXNNaXNtYXRjaEFsbG93ZWQobm9kZS5wYXJlbnRFbGVtZW50LCAxIC8qIENISUxEUkVOICovKSkge1xuICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgIGBIeWRyYXRpb24gbm9kZSBtaXNtYXRjaDpcbi0gcmVuZGVyZWQgb24gc2VydmVyOmAsXG4gICAgICAgIG5vZGUsXG4gICAgICAgIG5vZGUubm9kZVR5cGUgPT09IDMgPyBgKHRleHQpYCA6IGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiID8gYChzdGFydCBvZiBmcmFnbWVudClgIDogYGAsXG4gICAgICAgIGBcbi0gZXhwZWN0ZWQgb24gY2xpZW50OmAsXG4gICAgICAgIHZub2RlLnR5cGVcbiAgICAgICk7XG4gICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgfVxuICAgIHZub2RlLmVsID0gbnVsbDtcbiAgICBpZiAoaXNGcmFnbWVudCkge1xuICAgICAgY29uc3QgZW5kID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlKTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5leHQyID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIGlmIChuZXh0MiAmJiBuZXh0MiAhPT0gZW5kKSB7XG4gICAgICAgICAgcmVtb3ZlKG5leHQyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICByZW1vdmUobm9kZSk7XG4gICAgcGF0Y2goXG4gICAgICBudWxsLFxuICAgICAgdm5vZGUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBuZXh0LFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBnZXRDb250YWluZXJUeXBlKGNvbnRhaW5lciksXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIGlmIChwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgIHBhcmVudENvbXBvbmVudC52bm9kZS5lbCA9IHZub2RlLmVsO1xuICAgICAgdXBkYXRlSE9DSG9zdEVsKHBhcmVudENvbXBvbmVudCwgdm5vZGUuZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dDtcbiAgfTtcbiAgY29uc3QgbG9jYXRlQ2xvc2luZ0FuY2hvciA9IChub2RlLCBvcGVuID0gXCJbXCIsIGNsb3NlID0gXCJdXCIpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSAwO1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBub2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobm9kZSAmJiBpc0NvbW1lbnQobm9kZSkpIHtcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gb3BlbikgbWF0Y2grKztcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gY2xvc2UpIHtcbiAgICAgICAgICBpZiAobWF0Y2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2gtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IHJlcGxhY2VOb2RlID0gKG5ld05vZGUsIG9sZE5vZGUsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudE5vZGUyID0gb2xkTm9kZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlMikge1xuICAgICAgcGFyZW50Tm9kZTIucmVwbGFjZUNoaWxkKG5ld05vZGUsIG9sZE5vZGUpO1xuICAgIH1cbiAgICBsZXQgcGFyZW50ID0gcGFyZW50Q29tcG9uZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQudm5vZGUuZWwgPT09IG9sZE5vZGUpIHtcbiAgICAgICAgcGFyZW50LnZub2RlLmVsID0gcGFyZW50LnN1YlRyZWUuZWwgPSBuZXdOb2RlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGlzVGVtcGxhdGVOb2RlID0gKG5vZGUpID0+IHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUgPT09IFwiVEVNUExBVEVcIjtcbiAgfTtcbiAgcmV0dXJuIFtoeWRyYXRlLCBoeWRyYXRlTm9kZV07XG59XG5mdW5jdGlvbiBwcm9wSGFzTWlzbWF0Y2goZWwsIGtleSwgY2xpZW50VmFsdWUsIHZub2RlLCBpbnN0YW5jZSkge1xuICBsZXQgbWlzbWF0Y2hUeXBlO1xuICBsZXQgbWlzbWF0Y2hLZXk7XG4gIGxldCBhY3R1YWw7XG4gIGxldCBleHBlY3RlZDtcbiAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgaWYgKGVsLiRjbHMpIHtcbiAgICAgIGFjdHVhbCA9IGVsLiRjbHM7XG4gICAgICBkZWxldGUgZWwuJGNscztcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICAgIGV4cGVjdGVkID0gbm9ybWFsaXplQ2xhc3MoY2xpZW50VmFsdWUpO1xuICAgIGlmICghaXNTZXRFcXVhbCh0b0NsYXNzU2V0KGFjdHVhbCB8fCBcIlwiKSwgdG9DbGFzc1NldChleHBlY3RlZCkpKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSAyIC8qIENMQVNTICovO1xuICAgICAgbWlzbWF0Y2hLZXkgPSBgY2xhc3NgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgIGFjdHVhbCA9IGVsLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpIHx8IFwiXCI7XG4gICAgZXhwZWN0ZWQgPSBpc1N0cmluZyhjbGllbnRWYWx1ZSkgPyBjbGllbnRWYWx1ZSA6IHN0cmluZ2lmeVN0eWxlKG5vcm1hbGl6ZVN0eWxlKGNsaWVudFZhbHVlKSk7XG4gICAgY29uc3QgYWN0dWFsTWFwID0gdG9TdHlsZU1hcChhY3R1YWwpO1xuICAgIGNvbnN0IGV4cGVjdGVkTWFwID0gdG9TdHlsZU1hcChleHBlY3RlZCk7XG4gICAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICAgIGZvciAoY29uc3QgeyBkaXIsIHZhbHVlIH0gb2Ygdm5vZGUuZGlycykge1xuICAgICAgICBpZiAoZGlyLm5hbWUgPT09IFwic2hvd1wiICYmICF2YWx1ZSkge1xuICAgICAgICAgIGV4cGVjdGVkTWFwLnNldChcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgcmVzb2x2ZUNzc1ZhcnMoaW5zdGFuY2UsIHZub2RlLCBleHBlY3RlZE1hcCk7XG4gICAgfVxuICAgIGlmICghaXNNYXBFcXVhbChhY3R1YWxNYXAsIGV4cGVjdGVkTWFwKSkge1xuICAgICAgbWlzbWF0Y2hUeXBlID0gMyAvKiBTVFlMRSAqLztcbiAgICAgIG1pc21hdGNoS2V5ID0gXCJzdHlsZVwiO1xuICAgIH1cbiAgfSBlbHNlIGlmIChlbCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQgJiYgaXNLbm93blN2Z0F0dHIoa2V5KSB8fCBlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIChpc0Jvb2xlYW5BdHRyKGtleSkgfHwgaXNLbm93bkh0bWxBdHRyKGtleSkpKSB7XG4gICAgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkge1xuICAgICAgYWN0dWFsID0gZWwuaGFzQXR0cmlidXRlKGtleSk7XG4gICAgICBleHBlY3RlZCA9IGluY2x1ZGVCb29sZWFuQXR0cihjbGllbnRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChjbGllbnRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBhY3R1YWwgPSBlbC5oYXNBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIGV4cGVjdGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuICAgICAgICBhY3R1YWwgPSBlbC5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInZhbHVlXCIgJiYgZWwudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiKSB7XG4gICAgICAgIGFjdHVhbCA9IGVsLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0dWFsID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBleHBlY3RlZCA9IGlzUmVuZGVyYWJsZUF0dHJWYWx1ZShjbGllbnRWYWx1ZSkgPyBTdHJpbmcoY2xpZW50VmFsdWUpIDogZmFsc2U7XG4gICAgfVxuICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSA0IC8qIEFUVFJJQlVURSAqLztcbiAgICAgIG1pc21hdGNoS2V5ID0ga2V5O1xuICAgIH1cbiAgfVxuICBpZiAobWlzbWF0Y2hUeXBlICE9IG51bGwgJiYgIWlzTWlzbWF0Y2hBbGxvd2VkKGVsLCBtaXNtYXRjaFR5cGUpKSB7XG4gICAgY29uc3QgZm9ybWF0ID0gKHYpID0+IHYgPT09IGZhbHNlID8gYChub3QgcmVuZGVyZWQpYCA6IGAke21pc21hdGNoS2V5fT1cIiR7dn1cImA7XG4gICAgY29uc3QgcHJlU2VnbWVudCA9IGBIeWRyYXRpb24gJHtNaXNtYXRjaFR5cGVTdHJpbmdbbWlzbWF0Y2hUeXBlXX0gbWlzbWF0Y2ggb25gO1xuICAgIGNvbnN0IHBvc3RTZWdtZW50ID0gYFxuICAtIHJlbmRlcmVkIG9uIHNlcnZlcjogJHtmb3JtYXQoYWN0dWFsKX1cbiAgLSBleHBlY3RlZCBvbiBjbGllbnQ6ICR7Zm9ybWF0KGV4cGVjdGVkKX1cbiAgTm90ZTogdGhpcyBtaXNtYXRjaCBpcyBjaGVjay1vbmx5LiBUaGUgRE9NIHdpbGwgbm90IGJlIHJlY3RpZmllZCBpbiBwcm9kdWN0aW9uIGR1ZSB0byBwZXJmb3JtYW5jZSBvdmVyaGVhZC5cbiAgWW91IHNob3VsZCBmaXggdGhlIHNvdXJjZSBvZiB0aGUgbWlzbWF0Y2guYDtcbiAgICB7XG4gICAgICB3YXJuJDEocHJlU2VnbWVudCwgZWwsIHBvc3RTZWdtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdG9DbGFzc1NldChzdHIpIHtcbiAgcmV0dXJuIG5ldyBTZXQoc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy8pKTtcbn1cbmZ1bmN0aW9uIGlzU2V0RXF1YWwoYSwgYikge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBzIG9mIGEpIHtcbiAgICBpZiAoIWIuaGFzKHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gdG9TdHlsZU1hcChzdHIpIHtcbiAgY29uc3Qgc3R5bGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3RyLnNwbGl0KFwiO1wiKSkge1xuICAgIGxldCBba2V5LCB2YWx1ZV0gPSBpdGVtLnNwbGl0KFwiOlwiKTtcbiAgICBrZXkgPSBrZXkudHJpbSgpO1xuICAgIHZhbHVlID0gdmFsdWUgJiYgdmFsdWUudHJpbSgpO1xuICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcbiAgICAgIHN0eWxlTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0eWxlTWFwO1xufVxuZnVuY3Rpb24gaXNNYXBFcXVhbChhLCBiKSB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKHZhbHVlICE9PSBiLmdldChrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUNzc1ZhcnMoaW5zdGFuY2UsIHZub2RlLCBleHBlY3RlZE1hcCkge1xuICBjb25zdCByb290ID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgaWYgKGluc3RhbmNlLmdldENzc1ZhcnMgJiYgKHZub2RlID09PSByb290IHx8IHJvb3QgJiYgcm9vdC50eXBlID09PSBGcmFnbWVudCAmJiByb290LmNoaWxkcmVuLmluY2x1ZGVzKHZub2RlKSkpIHtcbiAgICBjb25zdCBjc3NWYXJzID0gaW5zdGFuY2UuZ2V0Q3NzVmFycygpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGNzc1ZhcnMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbm9ybWFsaXplQ3NzVmFyVmFsdWUoY3NzVmFyc1trZXldKTtcbiAgICAgIGV4cGVjdGVkTWFwLnNldChgLS0ke2dldEVzY2FwZWRDc3NWYXJOYW1lKGtleSwgZmFsc2UpfWAsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlID09PSByb290ICYmIGluc3RhbmNlLnBhcmVudCkge1xuICAgIHJlc29sdmVDc3NWYXJzKGluc3RhbmNlLnBhcmVudCwgaW5zdGFuY2Uudm5vZGUsIGV4cGVjdGVkTWFwKTtcbiAgfVxufVxuY29uc3QgYWxsb3dNaXNtYXRjaEF0dHIgPSBcImRhdGEtYWxsb3ctbWlzbWF0Y2hcIjtcbmNvbnN0IE1pc21hdGNoVHlwZVN0cmluZyA9IHtcbiAgWzAgLyogVEVYVCAqL106IFwidGV4dFwiLFxuICBbMSAvKiBDSElMRFJFTiAqL106IFwiY2hpbGRyZW5cIixcbiAgWzIgLyogQ0xBU1MgKi9dOiBcImNsYXNzXCIsXG4gIFszIC8qIFNUWUxFICovXTogXCJzdHlsZVwiLFxuICBbNCAvKiBBVFRSSUJVVEUgKi9dOiBcImF0dHJpYnV0ZVwiXG59O1xuZnVuY3Rpb24gaXNNaXNtYXRjaEFsbG93ZWQoZWwsIGFsbG93ZWRUeXBlKSB7XG4gIGlmIChhbGxvd2VkVHlwZSA9PT0gMCAvKiBURVhUICovIHx8IGFsbG93ZWRUeXBlID09PSAxIC8qIENISUxEUkVOICovKSB7XG4gICAgd2hpbGUgKGVsICYmICFlbC5oYXNBdHRyaWJ1dGUoYWxsb3dNaXNtYXRjaEF0dHIpKSB7XG4gICAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICB9XG4gIGNvbnN0IGFsbG93ZWRBdHRyID0gZWwgJiYgZWwuZ2V0QXR0cmlidXRlKGFsbG93TWlzbWF0Y2hBdHRyKTtcbiAgaWYgKGFsbG93ZWRBdHRyID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoYWxsb3dlZEF0dHIgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsaXN0ID0gYWxsb3dlZEF0dHIuc3BsaXQoXCIsXCIpO1xuICAgIGlmIChhbGxvd2VkVHlwZSA9PT0gMCAvKiBURVhUICovICYmIGxpc3QuaW5jbHVkZXMoXCJjaGlsZHJlblwiKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBsaXN0LmluY2x1ZGVzKE1pc21hdGNoVHlwZVN0cmluZ1thbGxvd2VkVHlwZV0pO1xuICB9XG59XG5cbmNvbnN0IHJlcXVlc3RJZGxlQ2FsbGJhY2sgPSBnZXRHbG9iYWxUaGlzKCkucmVxdWVzdElkbGVDYWxsYmFjayB8fCAoKGNiKSA9PiBzZXRUaW1lb3V0KGNiLCAxKSk7XG5jb25zdCBjYW5jZWxJZGxlQ2FsbGJhY2sgPSBnZXRHbG9iYWxUaGlzKCkuY2FuY2VsSWRsZUNhbGxiYWNrIHx8ICgoaWQpID0+IGNsZWFyVGltZW91dChpZCkpO1xuY29uc3QgaHlkcmF0ZU9uSWRsZSA9ICh0aW1lb3V0ID0gMWU0KSA9PiAoaHlkcmF0ZSkgPT4ge1xuICBjb25zdCBpZCA9IHJlcXVlc3RJZGxlQ2FsbGJhY2soaHlkcmF0ZSwgeyB0aW1lb3V0IH0pO1xuICByZXR1cm4gKCkgPT4gY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTtcbn07XG5mdW5jdGlvbiBlbGVtZW50SXNWaXNpYmxlSW5WaWV3cG9ydChlbCkge1xuICBjb25zdCB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCB9ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHsgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGggfSA9IHdpbmRvdztcbiAgcmV0dXJuICh0b3AgPiAwICYmIHRvcCA8IGlubmVySGVpZ2h0IHx8IGJvdHRvbSA+IDAgJiYgYm90dG9tIDwgaW5uZXJIZWlnaHQpICYmIChsZWZ0ID4gMCAmJiBsZWZ0IDwgaW5uZXJXaWR0aCB8fCByaWdodCA+IDAgJiYgcmlnaHQgPCBpbm5lcldpZHRoKTtcbn1cbmNvbnN0IGh5ZHJhdGVPblZpc2libGUgPSAob3B0cykgPT4gKGh5ZHJhdGUsIGZvckVhY2gpID0+IHtcbiAgY29uc3Qgb2IgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlLmlzSW50ZXJzZWN0aW5nKSBjb250aW51ZTtcbiAgICAgIG9iLmRpc2Nvbm5lY3QoKTtcbiAgICAgIGh5ZHJhdGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSwgb3B0cyk7XG4gIGZvckVhY2goKGVsKSA9PiB7XG4gICAgaWYgKCEoZWwgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xuICAgIGlmIChlbGVtZW50SXNWaXNpYmxlSW5WaWV3cG9ydChlbCkpIHtcbiAgICAgIGh5ZHJhdGUoKTtcbiAgICAgIG9iLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb2Iub2JzZXJ2ZShlbCk7XG4gIH0pO1xuICByZXR1cm4gKCkgPT4gb2IuZGlzY29ubmVjdCgpO1xufTtcbmNvbnN0IGh5ZHJhdGVPbk1lZGlhUXVlcnkgPSAocXVlcnkpID0+IChoeWRyYXRlKSA9PiB7XG4gIGlmIChxdWVyeSkge1xuICAgIGNvbnN0IG1xbCA9IG1hdGNoTWVkaWEocXVlcnkpO1xuICAgIGlmIChtcWwubWF0Y2hlcykge1xuICAgICAgaHlkcmF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtcWwuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBoeWRyYXRlLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gbXFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgaHlkcmF0ZSk7XG4gICAgfVxuICB9XG59O1xuY29uc3QgaHlkcmF0ZU9uSW50ZXJhY3Rpb24gPSAoaW50ZXJhY3Rpb25zID0gW10pID0+IChoeWRyYXRlLCBmb3JFYWNoKSA9PiB7XG4gIGlmIChpc1N0cmluZyhpbnRlcmFjdGlvbnMpKSBpbnRlcmFjdGlvbnMgPSBbaW50ZXJhY3Rpb25zXTtcbiAgbGV0IGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIGNvbnN0IGRvSHlkcmF0ZSA9IChlKSA9PiB7XG4gICAgaWYgKCFoYXNIeWRyYXRlZCkge1xuICAgICAgaGFzSHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgdGVhcmRvd24oKTtcbiAgICAgIGh5ZHJhdGUoKTtcbiAgICAgIGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IGUuY29uc3RydWN0b3IoZS50eXBlLCBlKSk7XG4gICAgfVxuICB9O1xuICBjb25zdCB0ZWFyZG93biA9ICgpID0+IHtcbiAgICBmb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBpIG9mIGludGVyYWN0aW9ucykge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGksIGRvSHlkcmF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGZvckVhY2goKGVsKSA9PiB7XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVyYWN0aW9ucykge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihpLCBkb0h5ZHJhdGUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGVhcmRvd247XG59O1xuZnVuY3Rpb24gZm9yRWFjaEVsZW1lbnQobm9kZSwgY2IpIHtcbiAgaWYgKGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiKSB7XG4gICAgbGV0IGRlcHRoID0gMTtcbiAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgd2hpbGUgKG5leHQpIHtcbiAgICAgIGlmIChuZXh0Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNiKG5leHQpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ29tbWVudChuZXh0KSkge1xuICAgICAgICBpZiAobmV4dC5kYXRhID09PSBcIl1cIikge1xuICAgICAgICAgIGlmICgtLWRlcHRoID09PSAwKSBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChuZXh0LmRhdGEgPT09IFwiW1wiKSB7XG4gICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dCA9IG5leHQubmV4dFNpYmxpbmc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNiKG5vZGUpO1xuICB9XG59XG5cbmNvbnN0IGlzQXN5bmNXcmFwcGVyID0gKGkpID0+ICEhaS50eXBlLl9fYXN5bmNMb2FkZXI7XG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVBc3luY0NvbXBvbmVudChzb3VyY2UpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIHNvdXJjZSA9IHsgbG9hZGVyOiBzb3VyY2UgfTtcbiAgfVxuICBjb25zdCB7XG4gICAgbG9hZGVyLFxuICAgIGxvYWRpbmdDb21wb25lbnQsXG4gICAgZXJyb3JDb21wb25lbnQsXG4gICAgZGVsYXkgPSAyMDAsXG4gICAgaHlkcmF0ZTogaHlkcmF0ZVN0cmF0ZWd5LFxuICAgIHRpbWVvdXQsXG4gICAgLy8gdW5kZWZpbmVkID0gbmV2ZXIgdGltZXMgb3V0XG4gICAgc3VzcGVuc2libGUgPSB0cnVlLFxuICAgIG9uRXJyb3I6IHVzZXJPbkVycm9yXG4gIH0gPSBzb3VyY2U7XG4gIGxldCBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gIGxldCByZXNvbHZlZENvbXA7XG4gIGxldCByZXRyaWVzID0gMDtcbiAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgcmV0cmllcysrO1xuICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICByZXR1cm4gbG9hZCgpO1xuICB9O1xuICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgIGxldCB0aGlzUmVxdWVzdDtcbiAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3QgfHwgKHRoaXNSZXF1ZXN0ID0gcGVuZGluZ1JlcXVlc3QgPSBsb2FkZXIoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSk7XG4gICAgICBpZiAodXNlck9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyUmV0cnkgPSAoKSA9PiByZXNvbHZlKHJldHJ5KCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJGYWlsID0gKCkgPT4gcmVqZWN0KGVycik7XG4gICAgICAgICAgdXNlck9uRXJyb3IoZXJyLCB1c2VyUmV0cnksIHVzZXJGYWlsLCByZXRyaWVzICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKGNvbXApID0+IHtcbiAgICAgIGlmICh0aGlzUmVxdWVzdCAhPT0gcGVuZGluZ1JlcXVlc3QgJiYgcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWNvbXApIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBBc3luYyBjb21wb25lbnQgbG9hZGVyIHJlc29sdmVkIHRvIHVuZGVmaW5lZC4gSWYgeW91IGFyZSB1c2luZyByZXRyeSgpLCBtYWtlIHN1cmUgdG8gcmV0dXJuIGl0cyByZXR1cm4gdmFsdWUuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXAgJiYgKGNvbXAuX19lc01vZHVsZSB8fCBjb21wW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09IFwiTW9kdWxlXCIpKSB7XG4gICAgICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb21wICYmICFpc09iamVjdChjb21wKSAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXN5bmMgY29tcG9uZW50IGxvYWQgcmVzdWx0OiAke2NvbXB9YCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlZENvbXAgPSBjb21wO1xuICAgICAgcmV0dXJuIGNvbXA7XG4gICAgfSkpO1xuICB9O1xuICByZXR1cm4gZGVmaW5lQ29tcG9uZW50KHtcbiAgICBuYW1lOiBcIkFzeW5jQ29tcG9uZW50V3JhcHBlclwiLFxuICAgIF9fYXN5bmNMb2FkZXI6IGxvYWQsXG4gICAgX19hc3luY0h5ZHJhdGUoZWwsIGluc3RhbmNlLCBoeWRyYXRlKSB7XG4gICAgICBsZXQgcGF0Y2hlZCA9IGZhbHNlO1xuICAgICAgKGluc3RhbmNlLmJ1IHx8IChpbnN0YW5jZS5idSA9IFtdKSkucHVzaCgoKSA9PiBwYXRjaGVkID0gdHJ1ZSk7XG4gICAgICBjb25zdCBwZXJmb3JtSHlkcmF0ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBhdGNoZWQpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgU2tpcHBpbmcgbGF6eSBoeWRyYXRpb24gZm9yIGNvbXBvbmVudCAnJHtnZXRDb21wb25lbnROYW1lKHJlc29sdmVkQ29tcCkgfHwgcmVzb2x2ZWRDb21wLl9fZmlsZX0nOiBpdCB3YXMgdXBkYXRlZCBiZWZvcmUgbGF6eSBoeWRyYXRpb24gcGVyZm9ybWVkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBoeWRyYXRlKCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZG9IeWRyYXRlID0gaHlkcmF0ZVN0cmF0ZWd5ID8gKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZWFyZG93biA9IGh5ZHJhdGVTdHJhdGVneShcbiAgICAgICAgICBwZXJmb3JtSHlkcmF0ZSxcbiAgICAgICAgICAoY2IpID0+IGZvckVhY2hFbGVtZW50KGVsLCBjYilcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRlYXJkb3duKSB7XG4gICAgICAgICAgKGluc3RhbmNlLmJ1bSB8fCAoaW5zdGFuY2UuYnVtID0gW10pKS5wdXNoKHRlYXJkb3duKTtcbiAgICAgICAgfVxuICAgICAgfSA6IHBlcmZvcm1IeWRyYXRlO1xuICAgICAgaWYgKHJlc29sdmVkQ29tcCkge1xuICAgICAgICBkb0h5ZHJhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWQoKS50aGVuKCgpID0+ICFpbnN0YW5jZS5pc1VubW91bnRlZCAmJiBkb0h5ZHJhdGUoKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXQgX19hc3luY1Jlc29sdmVkKCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkQ29tcDtcbiAgICB9LFxuICAgIHNldHVwKCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2U7XG4gICAgICBtYXJrQXN5bmNCb3VuZGFyeShpbnN0YW5jZSk7XG4gICAgICBpZiAocmVzb2x2ZWRDb21wKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAocmVzb2x2ZWRDb21wLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGhhbmRsZUVycm9yKFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAxMyxcbiAgICAgICAgICAhZXJyb3JDb21wb25lbnRcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBpZiAoc3VzcGVuc2libGUgJiYgaW5zdGFuY2Uuc3VzcGVuc2UgfHwgaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgICAgIHJldHVybiBsb2FkKCkudGhlbigoY29tcCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAoY29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgIHJldHVybiAoKSA9PiBlcnJvckNvbXBvbmVudCA/IGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgfSkgOiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvYWRlZCA9IHJlZihmYWxzZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHJlZigpO1xuICAgICAgY29uc3QgZGVsYXllZCA9IHJlZighIWRlbGF5KTtcbiAgICAgIGlmIChkZWxheSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkZWxheWVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb2FkZWQudmFsdWUgJiYgIWVycm9yLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgICAgZXJyb3IudmFsdWUgPSBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIGxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9hZGVkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGluc3RhbmNlLnBhcmVudCAmJiBpc0tlZXBBbGl2ZShpbnN0YW5jZS5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgICAgaW5zdGFuY2UucGFyZW50LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgZXJyb3IudmFsdWUgPSBlcnI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChsb2FkZWQudmFsdWUgJiYgcmVzb2x2ZWRDb21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUlubmVyQ29tcChyZXNvbHZlZENvbXAsIGluc3RhbmNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci52YWx1ZSAmJiBlcnJvckNvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShlcnJvckNvbXBvbmVudCwge1xuICAgICAgICAgICAgZXJyb3I6IGVycm9yLnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9hZGluZ0NvbXBvbmVudCAmJiAhZGVsYXllZC52YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShsb2FkaW5nQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5uZXJDb21wKGNvbXAsIHBhcmVudCkge1xuICBjb25zdCB7IHJlZjogcmVmMiwgcHJvcHMsIGNoaWxkcmVuLCBjZSB9ID0gcGFyZW50LnZub2RlO1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKGNvbXAsIHByb3BzLCBjaGlsZHJlbik7XG4gIHZub2RlLnJlZiA9IHJlZjI7XG4gIHZub2RlLmNlID0gY2U7XG4gIGRlbGV0ZSBwYXJlbnQudm5vZGUuY2U7XG4gIHJldHVybiB2bm9kZTtcbn1cblxuY29uc3QgaXNLZWVwQWxpdmUgPSAodm5vZGUpID0+IHZub2RlLnR5cGUuX19pc0tlZXBBbGl2ZTtcbmNvbnN0IEtlZXBBbGl2ZUltcGwgPSB7XG4gIG5hbWU6IGBLZWVwQWxpdmVgLFxuICAvLyBNYXJrZXIgZm9yIHNwZWNpYWwgaGFuZGxpbmcgaW5zaWRlIHRoZSByZW5kZXJlci4gV2UgYXJlIG5vdCB1c2luZyBhID09PVxuICAvLyBjaGVjayBkaXJlY3RseSBvbiBLZWVwQWxpdmUgaW4gdGhlIHJlbmRlcmVyLCBiZWNhdXNlIGltcG9ydGluZyBpdCBkaXJlY3RseVxuICAvLyB3b3VsZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgdHJlZS1zaGFrZW4uXG4gIF9faXNLZWVwQWxpdmU6IHRydWUsXG4gIHByb3BzOiB7XG4gICAgaW5jbHVkZTogW1N0cmluZywgUmVnRXhwLCBBcnJheV0sXG4gICAgZXhjbHVkZTogW1N0cmluZywgUmVnRXhwLCBBcnJheV0sXG4gICAgbWF4OiBbU3RyaW5nLCBOdW1iZXJdXG4gIH0sXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHNoYXJlZENvbnRleHQgPSBpbnN0YW5jZS5jdHg7XG4gICAgaWYgKCFzaGFyZWRDb250ZXh0LnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgJiYgc2xvdHMuZGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID09PSAxID8gY2hpbGRyZW5bMF0gOiBjaGlsZHJlbjtcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBjb25zdCBrZXlzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBsZXQgY3VycmVudCA9IG51bGw7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBpbnN0YW5jZS5fX3ZfY2FjaGUgPSBjYWNoZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50U3VzcGVuc2UgPSBpbnN0YW5jZS5zdXNwZW5zZTtcbiAgICBjb25zdCB7XG4gICAgICByZW5kZXJlcjoge1xuICAgICAgICBwOiBwYXRjaCxcbiAgICAgICAgbTogbW92ZSxcbiAgICAgICAgdW06IF91bm1vdW50LFxuICAgICAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICAgICAgfVxuICAgIH0gPSBzaGFyZWRDb250ZXh0O1xuICAgIGNvbnN0IHN0b3JhZ2VDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHNoYXJlZENvbnRleHQuYWN0aXZhdGUgPSAodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgbW92ZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIDAsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBpbnN0YW5jZTIudm5vZGUsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgaW5zdGFuY2UyLFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlMi5pc0RlYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChpbnN0YW5jZTIuYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5hKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2bm9kZUhvb2sgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5vblZub2RlTW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNoYXJlZENvbnRleHQuZGVhY3RpdmF0ZSA9ICh2bm9kZSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgaW52YWxpZGF0ZU1vdW50KGluc3RhbmNlMi5tKTtcbiAgICAgIGludmFsaWRhdGVNb3VudChpbnN0YW5jZTIuYSk7XG4gICAgICBtb3ZlKHZub2RlLCBzdG9yYWdlQ29udGFpbmVyLCBudWxsLCAxLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoaW5zdGFuY2UyLmRhKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UyLmRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2bm9kZUhvb2sgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO1xuICAgICAgICBpZiAodm5vZGVIb29rKSB7XG4gICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgaW5zdGFuY2UyLnBhcmVudCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlMi5pc0RlYWN0aXZhdGVkID0gdHJ1ZTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICBkZXZ0b29sc0NvbXBvbmVudEFkZGVkKGluc3RhbmNlMik7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gICAgICAgIGluc3RhbmNlMi5fX2tlZXBBbGl2ZVN0b3JhZ2VDb250YWluZXIgPSBzdG9yYWdlQ29udGFpbmVyO1xuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gdW5tb3VudCh2bm9kZSkge1xuICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgX3VubW91bnQodm5vZGUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGUoZmlsdGVyKSB7XG4gICAgICBjYWNoZS5mb3JFYWNoKCh2bm9kZSwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHZub2RlLnR5cGUpO1xuICAgICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7XG4gICAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcnVuZUNhY2hlRW50cnkoa2V5KSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICAgIGlmIChjYWNoZWQgJiYgKCFjdXJyZW50IHx8ICFpc1NhbWVWTm9kZVR5cGUoY2FjaGVkLCBjdXJyZW50KSkpIHtcbiAgICAgICAgdW5tb3VudChjYWNoZWQpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50KSB7XG4gICAgICAgIHJlc2V0U2hhcGVGbGFnKGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICB3YXRjaChcbiAgICAgICgpID0+IFtwcm9wcy5pbmNsdWRlLCBwcm9wcy5leGNsdWRlXSxcbiAgICAgIChbaW5jbHVkZSwgZXhjbHVkZV0pID0+IHtcbiAgICAgICAgaW5jbHVkZSAmJiBwcnVuZUNhY2hlKChuYW1lKSA9PiBtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKTtcbiAgICAgICAgZXhjbHVkZSAmJiBwcnVuZUNhY2hlKChuYW1lKSA9PiAhbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSk7XG4gICAgICB9LFxuICAgICAgLy8gcHJ1bmUgcG9zdC1yZW5kZXIgYWZ0ZXIgYGN1cnJlbnRgIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICAgIHsgZmx1c2g6IFwicG9zdFwiLCBkZWVwOiB0cnVlIH1cbiAgICApO1xuICAgIGxldCBwZW5kaW5nQ2FjaGVLZXkgPSBudWxsO1xuICAgIGNvbnN0IGNhY2hlU3VidHJlZSA9ICgpID0+IHtcbiAgICAgIGlmIChwZW5kaW5nQ2FjaGVLZXkgIT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNTdXNwZW5zZShpbnN0YW5jZS5zdWJUcmVlLnR5cGUpKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNhY2hlLnNldChwZW5kaW5nQ2FjaGVLZXksIGdldElubmVyQ2hpbGQoaW5zdGFuY2Uuc3ViVHJlZSkpO1xuICAgICAgICAgIH0sIGluc3RhbmNlLnN1YlRyZWUuc3VzcGVuc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhY2hlLnNldChwZW5kaW5nQ2FjaGVLZXksIGdldElubmVyQ2hpbGQoaW5zdGFuY2Uuc3ViVHJlZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBvbk1vdW50ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvblVwZGF0ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgY2FjaGUuZm9yRWFjaCgoY2FjaGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ViVHJlZSwgc3VzcGVuc2UgfSA9IGluc3RhbmNlO1xuICAgICAgICBjb25zdCB2bm9kZSA9IGdldElubmVyQ2hpbGQoc3ViVHJlZSk7XG4gICAgICAgIGlmIChjYWNoZWQudHlwZSA9PT0gdm5vZGUudHlwZSAmJiBjYWNoZWQua2V5ID09PSB2bm9kZS5rZXkpIHtcbiAgICAgICAgICByZXNldFNoYXBlRmxhZyh2bm9kZSk7XG4gICAgICAgICAgY29uc3QgZGEgPSB2bm9kZS5jb21wb25lbnQuZGE7XG4gICAgICAgICAgZGEgJiYgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRhLCBzdXNwZW5zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwZW5kaW5nQ2FjaGVLZXkgPSBudWxsO1xuICAgICAgaWYgKCFzbG90cy5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCgpO1xuICAgICAgY29uc3QgcmF3Vk5vZGUgPSBjaGlsZHJlblswXTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKGBLZWVwQWxpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgY29tcG9uZW50IGNoaWxkLmApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICB9IGVsc2UgaWYgKCFpc1ZOb2RlKHJhd1ZOb2RlKSB8fCAhKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDQpICYmICEocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSkge1xuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgbGV0IHZub2RlID0gZ2V0SW5uZXJDaGlsZChyYXdWTm9kZSk7XG4gICAgICBpZiAodm5vZGUudHlwZSA9PT0gQ29tbWVudCkge1xuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHZub2RlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29tcCA9IHZub2RlLnR5cGU7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgaXNBc3luY1dyYXBwZXIodm5vZGUpID8gdm5vZGUudHlwZS5fX2FzeW5jUmVzb2x2ZWQgfHwge30gOiBjb21wXG4gICAgICApO1xuICAgICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlLCBtYXggfSA9IHByb3BzO1xuICAgICAgaWYgKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSB8fCBleGNsdWRlICYmIG5hbWUgJiYgbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSkge1xuICAgICAgICB2bm9kZS5zaGFwZUZsYWcgJj0gLTI1NztcbiAgICAgICAgY3VycmVudCA9IHZub2RlO1xuICAgICAgICByZXR1cm4gcmF3Vk5vZGU7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB2bm9kZS5rZXkgPT0gbnVsbCA/IGNvbXAgOiB2bm9kZS5rZXk7XG4gICAgICBjb25zdCBjYWNoZWRWTm9kZSA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKHZub2RlLmVsKSB7XG4gICAgICAgIHZub2RlID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgICAgIGlmIChyYXdWTm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICByYXdWTm9kZS5zc0NvbnRlbnQgPSB2bm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVuZGluZ0NhY2hlS2V5ID0ga2V5O1xuICAgICAgaWYgKGNhY2hlZFZOb2RlKSB7XG4gICAgICAgIHZub2RlLmVsID0gY2FjaGVkVk5vZGUuZWw7XG4gICAgICAgIHZub2RlLmNvbXBvbmVudCA9IGNhY2hlZFZOb2RlLmNvbXBvbmVudDtcbiAgICAgICAgaWYgKHZub2RlLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUsIHZub2RlLnRyYW5zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHZub2RlLnNoYXBlRmxhZyB8PSA1MTI7XG4gICAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgICBpZiAobWF4ICYmIGtleXMuc2l6ZSA+IHBhcnNlSW50KG1heCwgMTApKSB7XG4gICAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGtleXMudmFsdWVzKCkubmV4dCgpLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm5vZGUuc2hhcGVGbGFnIHw9IDI1NjtcbiAgICAgIGN1cnJlbnQgPSB2bm9kZTtcbiAgICAgIHJldHVybiBpc1N1c3BlbnNlKHJhd1ZOb2RlLnR5cGUpID8gcmF3Vk5vZGUgOiB2bm9kZTtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgS2VlcEFsaXZlID0gS2VlcEFsaXZlSW1wbDtcbmZ1bmN0aW9uIG1hdGNoZXMocGF0dGVybiwgbmFtZSkge1xuICBpZiAoaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNvbWUoKHApID0+IG1hdGNoZXMocCwgbmFtZSkpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoXCIsXCIpLmluY2x1ZGVzKG5hbWUpO1xuICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgcGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobmFtZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gb25BY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImFcIiwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIG9uRGVhY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImRhXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgdHlwZSwgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSB7XG4gIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dkYyB8fCAoaG9vay5fX3dkYyA9ICgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRhcmdldDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGN1cnJlbnQuaXNEZWFjdGl2YXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBob29rKCk7XG4gIH0pO1xuICBpbmplY3RIb29rKHR5cGUsIHdyYXBwZWRIb29rLCB0YXJnZXQpO1xuICBpZiAodGFyZ2V0KSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQucGFyZW50O1xuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQucGFyZW50KSB7XG4gICAgICBpZiAoaXNLZWVwQWxpdmUoY3VycmVudC5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgIGluamVjdFRvS2VlcEFsaXZlUm9vdCh3cmFwcGVkSG9vaywgdHlwZSwgdGFyZ2V0LCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdFRvS2VlcEFsaXZlUm9vdChob29rLCB0eXBlLCB0YXJnZXQsIGtlZXBBbGl2ZVJvb3QpIHtcbiAgY29uc3QgaW5qZWN0ZWQgPSBpbmplY3RIb29rKFxuICAgIHR5cGUsXG4gICAgaG9vayxcbiAgICBrZWVwQWxpdmVSb290LFxuICAgIHRydWVcbiAgICAvKiBwcmVwZW5kICovXG4gICk7XG4gIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICByZW1vdmUoa2VlcEFsaXZlUm9vdFt0eXBlXSwgaW5qZWN0ZWQpO1xuICB9LCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gcmVzZXRTaGFwZUZsYWcodm5vZGUpIHtcbiAgdm5vZGUuc2hhcGVGbGFnICY9IC0yNTc7XG4gIHZub2RlLnNoYXBlRmxhZyAmPSAtNTEzO1xufVxuZnVuY3Rpb24gZ2V0SW5uZXJDaGlsZCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUuc2hhcGVGbGFnICYgMTI4ID8gdm5vZGUuc3NDb250ZW50IDogdm5vZGU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEhvb2sodHlwZSwgaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlLCBwcmVwZW5kID0gZmFsc2UpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IGhvb2tzID0gdGFyZ2V0W3R5cGVdIHx8ICh0YXJnZXRbdHlwZV0gPSBbXSk7XG4gICAgY29uc3Qgd3JhcHBlZEhvb2sgPSBob29rLl9fd2VoIHx8IChob29rLl9fd2VoID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKHRhcmdldCk7XG4gICAgICBjb25zdCByZXMgPSBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCB0YXJnZXQsIHR5cGUsIGFyZ3MpO1xuICAgICAgcmVzZXQoKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gICAgaWYgKHByZXBlbmQpIHtcbiAgICAgIGhvb2tzLnVuc2hpZnQod3JhcHBlZEhvb2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rcy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZWRIb29rO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBhcGlOYW1lID0gdG9IYW5kbGVyS2V5KEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXS5yZXBsYWNlKC8gaG9vayQvLCBcIlwiKSk7XG4gICAgd2FybiQxKFxuICAgICAgYCR7YXBpTmFtZX0gaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguIExpZmVjeWNsZSBpbmplY3Rpb24gQVBJcyBjYW4gb25seSBiZSB1c2VkIGR1cmluZyBleGVjdXRpb24gb2Ygc2V0dXAoKS5gICsgKGAgSWYgeW91IGFyZSB1c2luZyBhc3luYyBzZXR1cCgpLCBtYWtlIHN1cmUgdG8gcmVnaXN0ZXIgbGlmZWN5Y2xlIGhvb2tzIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQgc3RhdGVtZW50LmAgKVxuICAgICk7XG4gIH1cbn1cbmNvbnN0IGNyZWF0ZUhvb2sgPSAobGlmZWN5Y2xlKSA9PiAoaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSA9PiB7XG4gIGlmICghaXNJblNTUkNvbXBvbmVudFNldHVwIHx8IGxpZmVjeWNsZSA9PT0gXCJzcFwiKSB7XG4gICAgaW5qZWN0SG9vayhsaWZlY3ljbGUsICguLi5hcmdzKSA9PiBob29rKC4uLmFyZ3MpLCB0YXJnZXQpO1xuICB9XG59O1xuY29uc3Qgb25CZWZvcmVNb3VudCA9IGNyZWF0ZUhvb2soXCJibVwiKTtcbmNvbnN0IG9uTW91bnRlZCA9IGNyZWF0ZUhvb2soXCJtXCIpO1xuY29uc3Qgb25CZWZvcmVVcGRhdGUgPSBjcmVhdGVIb29rKFxuICBcImJ1XCJcbik7XG5jb25zdCBvblVwZGF0ZWQgPSBjcmVhdGVIb29rKFwidVwiKTtcbmNvbnN0IG9uQmVmb3JlVW5tb3VudCA9IGNyZWF0ZUhvb2soXG4gIFwiYnVtXCJcbik7XG5jb25zdCBvblVubW91bnRlZCA9IGNyZWF0ZUhvb2soXCJ1bVwiKTtcbmNvbnN0IG9uU2VydmVyUHJlZmV0Y2ggPSBjcmVhdGVIb29rKFxuICBcInNwXCJcbik7XG5jb25zdCBvblJlbmRlclRyaWdnZXJlZCA9IGNyZWF0ZUhvb2soXCJydGdcIik7XG5jb25zdCBvblJlbmRlclRyYWNrZWQgPSBjcmVhdGVIb29rKFwicnRjXCIpO1xuZnVuY3Rpb24gb25FcnJvckNhcHR1cmVkKGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkge1xuICBpbmplY3RIb29rKFwiZWNcIiwgaG9vaywgdGFyZ2V0KTtcbn1cblxuY29uc3QgQ09NUE9ORU5UUyA9IFwiY29tcG9uZW50c1wiO1xuY29uc3QgRElSRUNUSVZFUyA9IFwiZGlyZWN0aXZlc1wiO1xuZnVuY3Rpb24gcmVzb2x2ZUNvbXBvbmVudChuYW1lLCBtYXliZVNlbGZSZWZlcmVuY2UpIHtcbiAgcmV0dXJuIHJlc29sdmVBc3NldChDT01QT05FTlRTLCBuYW1lLCB0cnVlLCBtYXliZVNlbGZSZWZlcmVuY2UpIHx8IG5hbWU7XG59XG5jb25zdCBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UID0gU3ltYm9sLmZvcihcInYtbmRjXCIpO1xuZnVuY3Rpb24gcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIGlmIChpc1N0cmluZyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVBc3NldChDT01QT05FTlRTLCBjb21wb25lbnQsIGZhbHNlKSB8fCBjb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudCB8fCBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKG5hbWUpIHtcbiAgcmV0dXJuIHJlc29sdmVBc3NldChESVJFQ1RJVkVTLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVBc3NldCh0eXBlLCBuYW1lLCB3YXJuTWlzc2luZyA9IHRydWUsIG1heWJlU2VsZlJlZmVyZW5jZSA9IGZhbHNlKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlIHx8IGN1cnJlbnRJbnN0YW5jZTtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gaW5zdGFuY2UudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gQ09NUE9ORU5UUykge1xuICAgICAgY29uc3Qgc2VsZk5hbWUgPSBnZXRDb21wb25lbnROYW1lKFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgaWYgKHNlbGZOYW1lICYmIChzZWxmTmFtZSA9PT0gbmFtZSB8fCBzZWxmTmFtZSA9PT0gY2FtZWxpemUobmFtZSkgfHwgc2VsZk5hbWUgPT09IGNhcGl0YWxpemUoY2FtZWxpemUobmFtZSkpKSkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSAoXG4gICAgICAvLyBsb2NhbCByZWdpc3RyYXRpb25cbiAgICAgIC8vIGNoZWNrIGluc3RhbmNlW3R5cGVdIGZpcnN0IHdoaWNoIGlzIHJlc29sdmVkIGZvciBvcHRpb25zIEFQSVxuICAgICAgcmVzb2x2ZShpbnN0YW5jZVt0eXBlXSB8fCBDb21wb25lbnRbdHlwZV0sIG5hbWUpIHx8IC8vIGdsb2JhbCByZWdpc3RyYXRpb25cbiAgICAgIHJlc29sdmUoaW5zdGFuY2UuYXBwQ29udGV4dFt0eXBlXSwgbmFtZSlcbiAgICApO1xuICAgIGlmICghcmVzICYmIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykge1xuICAgICAgY29uc3QgZXh0cmEgPSB0eXBlID09PSBDT01QT05FTlRTID8gYFxuSWYgdGhpcyBpcyBhIG5hdGl2ZSBjdXN0b20gZWxlbWVudCwgbWFrZSBzdXJlIHRvIGV4Y2x1ZGUgaXQgZnJvbSBjb21wb25lbnQgcmVzb2x1dGlvbiB2aWEgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudC5gIDogYGA7XG4gICAgICB3YXJuJDEoYEZhaWxlZCB0byByZXNvbHZlICR7dHlwZS5zbGljZSgwLCAtMSl9OiAke25hbWV9JHtleHRyYX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKFxuICAgICAgYHJlc29sdmUke2NhcGl0YWxpemUodHlwZS5zbGljZSgwLCAtMSkpfSBjYW4gb25seSBiZSB1c2VkIGluIHJlbmRlcigpIG9yIHNldHVwKCkuYFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmUocmVnaXN0cnksIG5hbWUpIHtcbiAgcmV0dXJuIHJlZ2lzdHJ5ICYmIChyZWdpc3RyeVtuYW1lXSB8fCByZWdpc3RyeVtjYW1lbGl6ZShuYW1lKV0gfHwgcmVnaXN0cnlbY2FwaXRhbGl6ZShjYW1lbGl6ZShuYW1lKSldKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGlzdChzb3VyY2UsIHJlbmRlckl0ZW0sIGNhY2hlLCBpbmRleCkge1xuICBsZXQgcmV0O1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZSAmJiBjYWNoZVtpbmRleF07XG4gIGNvbnN0IHNvdXJjZUlzQXJyYXkgPSBpc0FycmF5KHNvdXJjZSk7XG4gIGlmIChzb3VyY2VJc0FycmF5IHx8IGlzU3RyaW5nKHNvdXJjZSkpIHtcbiAgICBjb25zdCBzb3VyY2VJc1JlYWN0aXZlQXJyYXkgPSBzb3VyY2VJc0FycmF5ICYmIGlzUmVhY3RpdmUoc291cmNlKTtcbiAgICBsZXQgbmVlZHNXcmFwID0gZmFsc2U7XG4gICAgbGV0IGlzUmVhZG9ubHlTb3VyY2UgPSBmYWxzZTtcbiAgICBpZiAoc291cmNlSXNSZWFjdGl2ZUFycmF5KSB7XG4gICAgICBuZWVkc1dyYXAgPSAhaXNTaGFsbG93KHNvdXJjZSk7XG4gICAgICBpc1JlYWRvbmx5U291cmNlID0gaXNSZWFkb25seShzb3VyY2UpO1xuICAgICAgc291cmNlID0gc2hhbGxvd1JlYWRBcnJheShzb3VyY2UpO1xuICAgIH1cbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKFxuICAgICAgICBuZWVkc1dyYXAgPyBpc1JlYWRvbmx5U291cmNlID8gdG9SZWFkb25seSh0b1JlYWN0aXZlKHNvdXJjZVtpXSkpIDogdG9SZWFjdGl2ZShzb3VyY2VbaV0pIDogc291cmNlW2ldLFxuICAgICAgICBpLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIGNhY2hlZCAmJiBjYWNoZWRbaV1cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihzb3VyY2UpKSB7XG4gICAgICB3YXJuJDEoYFRoZSB2LWZvciByYW5nZSBleHBlY3QgYW4gaW50ZWdlciB2YWx1ZSBidXQgZ290ICR7c291cmNlfS5gKTtcbiAgICB9XG4gICAgcmV0ID0gbmV3IEFycmF5KHNvdXJjZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2U7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShpICsgMSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGlmIChzb3VyY2VbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0ID0gQXJyYXkuZnJvbShcbiAgICAgICAgc291cmNlLFxuICAgICAgICAoaXRlbSwgaSkgPT4gcmVuZGVySXRlbShpdGVtLCBpLCB2b2lkIDAsIGNhY2hlZCAmJiBjYWNoZWRbaV0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgIHJldCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIHJldFtpXSA9IHJlbmRlckl0ZW0oc291cmNlW2tleV0sIGtleSwgaSwgY2FjaGVkICYmIGNhY2hlZFtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldCA9IFtdO1xuICB9XG4gIGlmIChjYWNoZSkge1xuICAgIGNhY2hlW2luZGV4XSA9IHJldDtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTbG90cyhzbG90cywgZHluYW1pY1Nsb3RzKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZHluYW1pY1Nsb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2xvdCA9IGR5bmFtaWNTbG90c1tpXTtcbiAgICBpZiAoaXNBcnJheShzbG90KSkge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzbG90Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHNsb3RzW3Nsb3Rbal0ubmFtZV0gPSBzbG90W2pdLmZuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2xvdCkge1xuICAgICAgc2xvdHNbc2xvdC5uYW1lXSA9IHNsb3Qua2V5ID8gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gc2xvdC5mbiguLi5hcmdzKTtcbiAgICAgICAgaWYgKHJlcykgcmVzLmtleSA9IHNsb3Qua2V5O1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSA6IHNsb3QuZm47XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90cztcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2xvdChzbG90cywgbmFtZSwgcHJvcHMgPSB7fSwgZmFsbGJhY2ssIG5vU2xvdHRlZCkge1xuICBpZiAoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudCkgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudC5jZSkge1xuICAgIGlmIChuYW1lICE9PSBcImRlZmF1bHRcIikgcHJvcHMubmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhcbiAgICAgIEZyYWdtZW50LFxuICAgICAgbnVsbCxcbiAgICAgIFtjcmVhdGVWTm9kZShcInNsb3RcIiwgcHJvcHMsIGZhbGxiYWNrICYmIGZhbGxiYWNrKCkpXSxcbiAgICAgIDY0XG4gICAgKTtcbiAgfVxuICBsZXQgc2xvdCA9IHNsb3RzW25hbWVdO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzbG90ICYmIHNsb3QubGVuZ3RoID4gMSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBTU1Itb3B0aW1pemVkIHNsb3QgZnVuY3Rpb24gZGV0ZWN0ZWQgaW4gYSBub24tU1NSLW9wdGltaXplZCByZW5kZXIgZnVuY3Rpb24uIFlvdSBuZWVkIHRvIG1hcmsgdGhpcyBjb21wb25lbnQgd2l0aCAkZHluYW1pYy1zbG90cyBpbiB0aGUgcGFyZW50IHRlbXBsYXRlLmBcbiAgICApO1xuICAgIHNsb3QgPSAoKSA9PiBbXTtcbiAgfVxuICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgc2xvdC5fZCA9IGZhbHNlO1xuICB9XG4gIG9wZW5CbG9jaygpO1xuICBjb25zdCB2YWxpZFNsb3RDb250ZW50ID0gc2xvdCAmJiBlbnN1cmVWYWxpZFZOb2RlKHNsb3QocHJvcHMpKTtcbiAgY29uc3Qgc2xvdEtleSA9IHByb3BzLmtleSB8fCAvLyBzbG90IGNvbnRlbnQgYXJyYXkgb2YgYSBkeW5hbWljIGNvbmRpdGlvbmFsIHNsb3QgbWF5IGhhdmUgYSBicmFuY2hcbiAgLy8ga2V5IGF0dGFjaGVkIGluIHRoZSBgY3JlYXRlU2xvdHNgIGhlbHBlciwgcmVzcGVjdCB0aGF0XG4gIHZhbGlkU2xvdENvbnRlbnQgJiYgdmFsaWRTbG90Q29udGVudC5rZXk7XG4gIGNvbnN0IHJlbmRlcmVkID0gY3JlYXRlQmxvY2soXG4gICAgRnJhZ21lbnQsXG4gICAge1xuICAgICAga2V5OiAoc2xvdEtleSAmJiAhaXNTeW1ib2woc2xvdEtleSkgPyBzbG90S2V5IDogYF8ke25hbWV9YCkgKyAvLyAjNzI1NiBmb3JjZSBkaWZmZXJlbnRpYXRlIGZhbGxiYWNrIGNvbnRlbnQgZnJvbSBhY3R1YWwgY29udGVudFxuICAgICAgKCF2YWxpZFNsb3RDb250ZW50ICYmIGZhbGxiYWNrID8gXCJfZmJcIiA6IFwiXCIpXG4gICAgfSxcbiAgICB2YWxpZFNsb3RDb250ZW50IHx8IChmYWxsYmFjayA/IGZhbGxiYWNrKCkgOiBbXSksXG4gICAgdmFsaWRTbG90Q29udGVudCAmJiBzbG90cy5fID09PSAxID8gNjQgOiAtMlxuICApO1xuICBpZiAoIW5vU2xvdHRlZCAmJiByZW5kZXJlZC5zY29wZUlkKSB7XG4gICAgcmVuZGVyZWQuc2xvdFNjb3BlSWRzID0gW3JlbmRlcmVkLnNjb3BlSWQgKyBcIi1zXCJdO1xuICB9XG4gIGlmIChzbG90ICYmIHNsb3QuX2MpIHtcbiAgICBzbG90Ll9kID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5mdW5jdGlvbiBlbnN1cmVWYWxpZFZOb2RlKHZub2Rlcykge1xuICByZXR1cm4gdm5vZGVzLnNvbWUoKGNoaWxkKSA9PiB7XG4gICAgaWYgKCFpc1ZOb2RlKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IENvbW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gRnJhZ21lbnQgJiYgIWVuc3VyZVZhbGlkVk5vZGUoY2hpbGQuY2hpbGRyZW4pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KSA/IHZub2RlcyA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHRvSGFuZGxlcnMob2JqLCBwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSkge1xuICBjb25zdCByZXQgPSB7fTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzT2JqZWN0KG9iaikpIHtcbiAgICB3YXJuJDEoYHYtb24gd2l0aCBubyBhcmd1bWVudCBleHBlY3RzIGFuIG9iamVjdCB2YWx1ZS5gKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIHJldFtwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSAmJiAvW0EtWl0vLnRlc3Qoa2V5KSA/IGBvbjoke2tleX1gIDogdG9IYW5kbGVyS2V5KGtleSldID0gb2JqW2tleV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuY29uc3QgZ2V0UHVibGljSW5zdGFuY2UgPSAoaSkgPT4ge1xuICBpZiAoIWkpIHJldHVybiBudWxsO1xuICBpZiAoaXNTdGF0ZWZ1bENvbXBvbmVudChpKSkgcmV0dXJuIGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKGkpO1xuICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoaS5wYXJlbnQpO1xufTtcbmNvbnN0IHB1YmxpY1Byb3BlcnRpZXNNYXAgPSAoXG4gIC8vIE1vdmUgUFVSRSBtYXJrZXIgdG8gbmV3IGxpbmUgdG8gd29ya2Fyb3VuZCBjb21waWxlciBkaXNjYXJkaW5nIGl0XG4gIC8vIGR1ZSB0byB0eXBlIGFubm90YXRpb25cbiAgLyogQF9fUFVSRV9fICovIGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwge1xuICAgICQ6IChpKSA9PiBpLFxuICAgICRlbDogKGkpID0+IGkudm5vZGUuZWwsXG4gICAgJGRhdGE6IChpKSA9PiBpLmRhdGEsXG4gICAgJHByb3BzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnByb3BzKSA6IGkucHJvcHMsXG4gICAgJGF0dHJzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLmF0dHJzKSA6IGkuYXR0cnMsXG4gICAgJHNsb3RzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnNsb3RzKSA6IGkuc2xvdHMsXG4gICAgJHJlZnM6IChpKSA9PiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGkucmVmcykgOiBpLnJlZnMsXG4gICAgJHBhcmVudDogKGkpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KSxcbiAgICAkcm9vdDogKGkpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucm9vdCksXG4gICAgJGhvc3Q6IChpKSA9PiBpLmNlLFxuICAgICRlbWl0OiAoaSkgPT4gaS5lbWl0LFxuICAgICRvcHRpb25zOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IHJlc29sdmVNZXJnZWRPcHRpb25zKGkpIDogaS50eXBlLFxuICAgICRmb3JjZVVwZGF0ZTogKGkpID0+IGkuZiB8fCAoaS5mID0gKCkgPT4ge1xuICAgICAgcXVldWVKb2IoaS51cGRhdGUpO1xuICAgIH0pLFxuICAgICRuZXh0VGljazogKGkpID0+IGkubiB8fCAoaS5uID0gbmV4dFRpY2suYmluZChpLnByb3h5KSksXG4gICAgJHdhdGNoOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IGluc3RhbmNlV2F0Y2guYmluZChpKSA6IE5PT1BcbiAgfSlcbik7XG5jb25zdCBpc1Jlc2VydmVkUHJlZml4ID0gKGtleSkgPT4ga2V5ID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJFwiO1xuY29uc3QgaGFzU2V0dXBCaW5kaW5nID0gKHN0YXRlLCBrZXkpID0+IHN0YXRlICE9PSBFTVBUWV9PQkogJiYgIXN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc3RhdGUsIGtleSk7XG5jb25zdCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSB7XG4gIGdldCh7IF86IGluc3RhbmNlIH0sIGtleSkge1xuICAgIGlmIChrZXkgPT09IFwiX192X3NraXBcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHsgY3R4LCBzZXR1cFN0YXRlLCBkYXRhLCBwcm9wcywgYWNjZXNzQ2FjaGUsIHR5cGUsIGFwcENvbnRleHQgfSA9IGluc3RhbmNlO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCJfX2lzVnVlXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgbm9ybWFsaXplZFByb3BzO1xuICAgIGlmIChrZXlbMF0gIT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBuID0gYWNjZXNzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChuICE9PSB2b2lkIDApIHtcbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAxIC8qIFNFVFVQICovOlxuICAgICAgICAgICAgcmV0dXJuIHNldHVwU3RhdGVba2V5XTtcbiAgICAgICAgICBjYXNlIDIgLyogREFUQSAqLzpcbiAgICAgICAgICAgIHJldHVybiBkYXRhW2tleV07XG4gICAgICAgICAgY2FzZSA0IC8qIENPTlRFWFQgKi86XG4gICAgICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICAgICAgY2FzZSAzIC8qIFBST1BTICovOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDEgLyogU0VUVVAgKi87XG4gICAgICAgIHJldHVybiBzZXR1cFN0YXRlW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMiAvKiBEQVRBICovO1xuICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8gb25seSBjYWNoZSBvdGhlciBwcm9wZXJ0aWVzIHdoZW4gaW5zdGFuY2UgaGFzIGRlY2xhcmVkICh0aHVzIHN0YWJsZSlcbiAgICAgICAgLy8gcHJvcHNcbiAgICAgICAgKG5vcm1hbGl6ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzT3B0aW9uc1swXSkgJiYgaGFzT3duKG5vcm1hbGl6ZWRQcm9wcywga2V5KVxuICAgICAgKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAzIC8qIFBST1BTICovO1xuICAgICAgICByZXR1cm4gcHJvcHNba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gNCAvKiBDT05URVhUICovO1xuICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICB9IGVsc2UgaWYgKCFfX1ZVRV9PUFRJT05TX0FQSV9fIHx8IHNob3VsZENhY2hlQWNjZXNzKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAwIC8qIE9USEVSICovO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwdWJsaWNHZXR0ZXIgPSBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV07XG4gICAgbGV0IGNzc01vZHVsZSwgZ2xvYmFsUHJvcGVydGllcztcbiAgICBpZiAocHVibGljR2V0dGVyKSB7XG4gICAgICBpZiAoa2V5ID09PSBcIiRhdHRyc1wiKSB7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLmF0dHJzLCBcImdldFwiLCBcIlwiKTtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCIkc2xvdHNcIikge1xuICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwga2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwdWJsaWNHZXR0ZXIoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBjc3MgbW9kdWxlIChpbmplY3RlZCBieSB2dWUtbG9hZGVyKVxuICAgICAgKGNzc01vZHVsZSA9IHR5cGUuX19jc3NNb2R1bGVzKSAmJiAoY3NzTW9kdWxlID0gY3NzTW9kdWxlW2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gY3NzTW9kdWxlO1xuICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDQgLyogQ09OVEVYVCAqLztcbiAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgIGdsb2JhbFByb3BlcnRpZXMgPSBhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBoYXNPd24oZ2xvYmFsUHJvcGVydGllcywga2V5KVxuICAgICkge1xuICAgICAge1xuICAgICAgICByZXR1cm4gZ2xvYmFsUHJvcGVydGllc1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgJiYgKCFpc1N0cmluZyhrZXkpIHx8IC8vICMxMDkxIGF2b2lkIGludGVybmFsIGlzUmVmL2lzVk5vZGUgY2hlY2tzIG9uIGNvbXBvbmVudCBpbnN0YW5jZSBsZWFkaW5nXG4gICAgLy8gdG8gaW5maW5pdGUgd2FybmluZyBsb29wXG4gICAga2V5LmluZGV4T2YoXCJfX3ZcIikgIT09IDApKSB7XG4gICAgICBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApfSBtdXN0IGJlIGFjY2Vzc2VkIHZpYSAkZGF0YSBiZWNhdXNlIGl0IHN0YXJ0cyB3aXRoIGEgcmVzZXJ2ZWQgY2hhcmFjdGVyIChcIiRcIiBvciBcIl9cIikgYW5kIGlzIG5vdCBwcm94aWVkIG9uIHRoZSByZW5kZXIgY29udGV4dC5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RhbmNlID09PSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KGtleSl9IHdhcyBhY2Nlc3NlZCBkdXJpbmcgcmVuZGVyIGJ1dCBpcyBub3QgZGVmaW5lZCBvbiBpbnN0YW5jZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBzZXQoeyBfOiBpbnN0YW5jZSB9LCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgeyBkYXRhLCBzZXR1cFN0YXRlLCBjdHggfSA9IGluc3RhbmNlO1xuICAgIGlmIChoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgc2V0dXBTdGF0ZVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXAgJiYgaGFzT3duKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgIHdhcm4kMShgQ2Fubm90IG11dGF0ZSA8c2NyaXB0IHNldHVwPiBiaW5kaW5nIFwiJHtrZXl9XCIgZnJvbSBPcHRpb25zIEFQSS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGhhc093bihpbnN0YW5jZS5wcm9wcywga2V5KSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYEF0dGVtcHRpbmcgdG8gbXV0YXRlIHByb3AgXCIke2tleX1cIi4gUHJvcHMgYXJlIHJlYWRvbmx5LmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoa2V5WzBdID09PSBcIiRcIiAmJiBrZXkuc2xpY2UoMSkgaW4gaW5zdGFuY2UpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgQXR0ZW1wdGluZyB0byBtdXRhdGUgcHVibGljIHByb3BlcnR5IFwiJHtrZXl9XCIuIFByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCAkIGFyZSByZXNlcnZlZCBhbmQgcmVhZG9ubHkuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5IGluIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHhba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgaGFzKHtcbiAgICBfOiB7IGRhdGEsIHNldHVwU3RhdGUsIGFjY2Vzc0NhY2hlLCBjdHgsIGFwcENvbnRleHQsIHByb3BzT3B0aW9ucywgdHlwZSB9XG4gIH0sIGtleSkge1xuICAgIGxldCBub3JtYWxpemVkUHJvcHMsIGNzc01vZHVsZXM7XG4gICAgcmV0dXJuICEhKGFjY2Vzc0NhY2hlW2tleV0gfHwgZGF0YSAhPT0gRU1QVFlfT0JKICYmIGtleVswXSAhPT0gXCIkXCIgJiYgaGFzT3duKGRhdGEsIGtleSkgfHwgaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkgfHwgKG5vcm1hbGl6ZWRQcm9wcyA9IHByb3BzT3B0aW9uc1swXSkgJiYgaGFzT3duKG5vcm1hbGl6ZWRQcm9wcywga2V5KSB8fCBoYXNPd24oY3R4LCBrZXkpIHx8IGhhc093bihwdWJsaWNQcm9wZXJ0aWVzTWFwLCBrZXkpIHx8IGhhc093bihhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBrZXkpIHx8IChjc3NNb2R1bGVzID0gdHlwZS5fX2Nzc01vZHVsZXMpICYmIGNzc01vZHVsZXNba2V5XSk7XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IuZ2V0ICE9IG51bGwpIHtcbiAgICAgIHRhcmdldC5fLmFjY2Vzc0NhY2hlW2tleV0gPSAwO1xuICAgIH0gZWxzZSBpZiAoaGFzT3duKGRlc2NyaXB0b3IsIFwidmFsdWVcIikpIHtcbiAgICAgIHRoaXMuc2V0KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yLnZhbHVlLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuICB9XG59O1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMub3duS2V5cyA9ICh0YXJnZXQpID0+IHtcbiAgICB3YXJuJDEoXG4gICAgICBgQXZvaWQgYXBwIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIGVudW1lcmF0aW5nIGtleXMgb24gYSBjb21wb25lbnQgaW5zdGFuY2UuIFRoZSBrZXlzIHdpbGwgYmUgZW1wdHkgaW4gcHJvZHVjdGlvbiBtb2RlIHRvIGF2b2lkIHBlcmZvcm1hbmNlIG92ZXJoZWFkLmBcbiAgICApO1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgfTtcbn1cbmNvbnN0IFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoe30sIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycywge1xuICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBTeW1ib2wudW5zY29wYWJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5nZXQodGFyZ2V0LCBrZXksIHRhcmdldCk7XG4gIH0sXG4gIGhhcyhfLCBrZXkpIHtcbiAgICBjb25zdCBoYXMgPSBrZXlbMF0gIT09IFwiX1wiICYmICFpc0dsb2JhbGx5QWxsb3dlZChrZXkpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFoYXMgJiYgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLmhhcyhfLCBrZXkpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGtleVxuICAgICAgICApfSBzaG91bGQgbm90IHN0YXJ0IHdpdGggXyB3aGljaCBpcyBhIHJlc2VydmVkIHByZWZpeCBmb3IgVnVlIGludGVybmFscy5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gaGFzO1xuICB9XG59KTtcbmZ1bmN0aW9uIGNyZWF0ZURldlJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgdGFyZ2V0ID0ge307XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGBfYCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6ICgpID0+IGluc3RhbmNlXG4gIH0pO1xuICBPYmplY3Qua2V5cyhwdWJsaWNQcm9wZXJ0aWVzTWFwKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiAoKSA9PiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpLFxuICAgICAgLy8gaW50ZXJjZXB0ZWQgYnkgdGhlIHByb3h5IHNvIG5vIG5lZWQgZm9yIGltcGxlbWVudGF0aW9uLFxuICAgICAgLy8gYnV0IG5lZWRlZCB0byBwcmV2ZW50IHNldCBlcnJvcnNcbiAgICAgIHNldDogTk9PUFxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGV4cG9zZVByb3BzT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IHtcbiAgICBjdHgsXG4gICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXVxuICB9ID0gaW5zdGFuY2U7XG4gIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICBPYmplY3Qua2V5cyhwcm9wc09wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbnN0YW5jZS5wcm9wc1trZXldLFxuICAgICAgICBzZXQ6IE5PT1BcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBleHBvc2VTZXR1cFN0YXRlT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IHsgY3R4LCBzZXR1cFN0YXRlIH0gPSBpbnN0YW5jZTtcbiAgT2JqZWN0LmtleXModG9SYXcoc2V0dXBTdGF0ZSkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmICghc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXApIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJlZml4KGtleVswXSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIFwiJFwiIG9yIFwiX1wiIHdoaWNoIGFyZSByZXNlcnZlZCBwcmVmaXhlcyBmb3IgVnVlIGludGVybmFscy5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gc2V0dXBTdGF0ZVtrZXldLFxuICAgICAgICBzZXQ6IE5PT1BcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IHdhcm5SdW50aW1lVXNhZ2UgPSAobWV0aG9kKSA9PiB3YXJuJDEoXG4gIGAke21ldGhvZH0oKSBpcyBhIGNvbXBpbGVyLWhpbnQgaGVscGVyIHRoYXQgaXMgb25seSB1c2FibGUgaW5zaWRlIDxzY3JpcHQgc2V0dXA+IG9mIGEgc2luZ2xlIGZpbGUgY29tcG9uZW50LiBJdHMgYXJndW1lbnRzIHNob3VsZCBiZSBjb21waWxlZCBhd2F5IGFuZCBwYXNzaW5nIGl0IGF0IHJ1bnRpbWUgaGFzIG5vIGVmZmVjdC5gXG4pO1xuZnVuY3Rpb24gZGVmaW5lUHJvcHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lUHJvcHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZUVtaXRzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZUVtaXRzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVFeHBvc2UoZXhwb3NlZCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZUV4cG9zZWApO1xuICB9XG59XG5mdW5jdGlvbiBkZWZpbmVPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVPcHRpb25zYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZmluZVNsb3RzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZVNsb3RzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVNb2RlbCgpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKFwiZGVmaW5lTW9kZWxcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhwcm9wcywgZGVmYXVsdHMpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGB3aXRoRGVmYXVsdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHVzZVNsb3RzKCkge1xuICByZXR1cm4gZ2V0Q29udGV4dChcInVzZVNsb3RzXCIpLnNsb3RzO1xufVxuZnVuY3Rpb24gdXNlQXR0cnMoKSB7XG4gIHJldHVybiBnZXRDb250ZXh0KFwidXNlQXR0cnNcIikuYXR0cnM7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KGNhbGxlZEZ1bmN0aW9uTmFtZSkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpKSB7XG4gICAgd2FybiQxKGAke2NhbGxlZEZ1bmN0aW9uTmFtZX0oKSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgaW5zdGFuY2UuYCk7XG4gIH1cbiAgcmV0dXJuIGkuc2V0dXBDb250ZXh0IHx8IChpLnNldHVwQ29udGV4dCA9IGNyZWF0ZVNldHVwQ29udGV4dChpKSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVQcm9wc09yRW1pdHMocHJvcHMpIHtcbiAgcmV0dXJuIGlzQXJyYXkocHJvcHMpID8gcHJvcHMucmVkdWNlKFxuICAgIChub3JtYWxpemVkLCBwKSA9PiAobm9ybWFsaXplZFtwXSA9IG51bGwsIG5vcm1hbGl6ZWQpLFxuICAgIHt9XG4gICkgOiBwcm9wcztcbn1cbmZ1bmN0aW9uIG1lcmdlRGVmYXVsdHMocmF3LCBkZWZhdWx0cykge1xuICBjb25zdCBwcm9wcyA9IG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhyYXcpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0cykge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChcIl9fc2tpcFwiKSkgY29udGludWU7XG4gICAgbGV0IG9wdCA9IHByb3BzW2tleV07XG4gICAgaWYgKG9wdCkge1xuICAgICAgaWYgKGlzQXJyYXkob3B0KSB8fCBpc0Z1bmN0aW9uKG9wdCkpIHtcbiAgICAgICAgb3B0ID0gcHJvcHNba2V5XSA9IHsgdHlwZTogb3B0LCBkZWZhdWx0OiBkZWZhdWx0c1trZXldIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHQuZGVmYXVsdCA9IGRlZmF1bHRzW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHQgPT09IG51bGwpIHtcbiAgICAgIG9wdCA9IHByb3BzW2tleV0gPSB7IGRlZmF1bHQ6IGRlZmF1bHRzW2tleV0gfTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgcHJvcHMgZGVmYXVsdCBrZXkgXCIke2tleX1cIiBoYXMgbm8gY29ycmVzcG9uZGluZyBkZWNsYXJhdGlvbi5gKTtcbiAgICB9XG4gICAgaWYgKG9wdCAmJiBkZWZhdWx0c1tgX19za2lwXyR7a2V5fWBdKSB7XG4gICAgICBvcHQuc2tpcEZhY3RvcnkgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJvcHM7XG59XG5mdW5jdGlvbiBtZXJnZU1vZGVscyhhLCBiKSB7XG4gIGlmICghYSB8fCAhYikgcmV0dXJuIGEgfHwgYjtcbiAgaWYgKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSkgcmV0dXJuIGEuY29uY2F0KGIpO1xuICByZXR1cm4gZXh0ZW5kKHt9LCBub3JtYWxpemVQcm9wc09yRW1pdHMoYSksIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhiKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVQcm9wc1Jlc3RQcm94eShwcm9wcywgZXhjbHVkZWRLZXlzKSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgIGlmICghZXhjbHVkZWRLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHByb3BzW2tleV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gd2l0aEFzeW5jQ29udGV4dChnZXRBd2FpdGFibGUpIHtcbiAgY29uc3QgY3R4ID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFjdHgpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgd2l0aEFzeW5jQ29udGV4dCBjYWxsZWQgd2l0aG91dCBhY3RpdmUgY3VycmVudCBpbnN0YW5jZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcuYFxuICAgICk7XG4gIH1cbiAgbGV0IGF3YWl0YWJsZSA9IGdldEF3YWl0YWJsZSgpO1xuICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoaXNQcm9taXNlKGF3YWl0YWJsZSkpIHtcbiAgICBhd2FpdGFibGUgPSBhd2FpdGFibGUuY2F0Y2goKGUpID0+IHtcbiAgICAgIHNldEN1cnJlbnRJbnN0YW5jZShjdHgpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gW2F3YWl0YWJsZSwgKCkgPT4gc2V0Q3VycmVudEluc3RhbmNlKGN0eCldO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkge1xuICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKHR5cGUsIGtleSkgPT4ge1xuICAgIGlmIChjYWNoZVtrZXldKSB7XG4gICAgICB3YXJuJDEoYCR7dHlwZX0gcHJvcGVydHkgXCIke2tleX1cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gJHtjYWNoZVtrZXldfS5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FjaGVba2V5XSA9IHR5cGU7XG4gICAgfVxuICB9O1xufVxubGV0IHNob3VsZENhY2hlQWNjZXNzID0gdHJ1ZTtcbmZ1bmN0aW9uIGFwcGx5T3B0aW9ucyhpbnN0YW5jZSkge1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpO1xuICBjb25zdCBwdWJsaWNUaGlzID0gaW5zdGFuY2UucHJveHk7XG4gIGNvbnN0IGN0eCA9IGluc3RhbmNlLmN0eDtcbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMuYmVmb3JlQ3JlYXRlKSB7XG4gICAgY2FsbEhvb2sob3B0aW9ucy5iZWZvcmVDcmVhdGUsIGluc3RhbmNlLCBcImJjXCIpO1xuICB9XG4gIGNvbnN0IHtcbiAgICAvLyBzdGF0ZVxuICAgIGRhdGE6IGRhdGFPcHRpb25zLFxuICAgIGNvbXB1dGVkOiBjb21wdXRlZE9wdGlvbnMsXG4gICAgbWV0aG9kcyxcbiAgICB3YXRjaDogd2F0Y2hPcHRpb25zLFxuICAgIHByb3ZpZGU6IHByb3ZpZGVPcHRpb25zLFxuICAgIGluamVjdDogaW5qZWN0T3B0aW9ucyxcbiAgICAvLyBsaWZlY3ljbGVcbiAgICBjcmVhdGVkLFxuICAgIGJlZm9yZU1vdW50LFxuICAgIG1vdW50ZWQsXG4gICAgYmVmb3JlVXBkYXRlLFxuICAgIHVwZGF0ZWQsXG4gICAgYWN0aXZhdGVkLFxuICAgIGRlYWN0aXZhdGVkLFxuICAgIGJlZm9yZURlc3Ryb3ksXG4gICAgYmVmb3JlVW5tb3VudCxcbiAgICBkZXN0cm95ZWQsXG4gICAgdW5tb3VudGVkLFxuICAgIHJlbmRlcixcbiAgICByZW5kZXJUcmFja2VkLFxuICAgIHJlbmRlclRyaWdnZXJlZCxcbiAgICBlcnJvckNhcHR1cmVkLFxuICAgIHNlcnZlclByZWZldGNoLFxuICAgIC8vIHB1YmxpYyBBUElcbiAgICBleHBvc2UsXG4gICAgaW5oZXJpdEF0dHJzLFxuICAgIC8vIGFzc2V0c1xuICAgIGNvbXBvbmVudHMsXG4gICAgZGlyZWN0aXZlcyxcbiAgICBmaWx0ZXJzXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gY3JlYXRlRHVwbGljYXRlQ2hlY2tlcigpIDogbnVsbDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBbcHJvcHNPcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgICBpZiAocHJvcHNPcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wc09wdGlvbnMpIHtcbiAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiUHJvcHNcIiAvKiBQUk9QUyAqLywga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluamVjdE9wdGlvbnMpIHtcbiAgICByZXNvbHZlSW5qZWN0aW9ucyhpbmplY3RPcHRpb25zLCBjdHgsIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyk7XG4gIH1cbiAgaWYgKG1ldGhvZHMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBjb25zdCBtZXRob2RIYW5kbGVyID0gbWV0aG9kc1trZXldO1xuICAgICAgaWYgKGlzRnVuY3Rpb24obWV0aG9kSGFuZGxlcikpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiBtZXRob2RIYW5kbGVyLmJpbmQocHVibGljVGhpcyksXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHhba2V5XSA9IG1ldGhvZEhhbmRsZXIuYmluZChwdWJsaWNUaGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIk1ldGhvZHNcIiAvKiBNRVRIT0RTICovLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBNZXRob2QgXCIke2tleX1cIiBoYXMgdHlwZSBcIiR7dHlwZW9mIG1ldGhvZEhhbmRsZXJ9XCIgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiBEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5P2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGRhdGFPcHRpb25zKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzRnVuY3Rpb24oZGF0YU9wdGlvbnMpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBUaGUgZGF0YSBvcHRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uLiBQbGFpbiBvYmplY3QgdXNhZ2UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gZGF0YU9wdGlvbnMuY2FsbChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc1Byb21pc2UoZGF0YSkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYGRhdGEoKSByZXR1cm5lZCBhIFByb21pc2UgLSBub3RlIGRhdGEoKSBjYW5ub3QgYmUgYXN5bmM7IElmIHlvdSBpbnRlbmQgdG8gcGVyZm9ybSBkYXRhIGZldGNoaW5nIGJlZm9yZSBjb21wb25lbnQgcmVuZGVycywgdXNlIGFzeW5jIHNldHVwKCkgKyA8U3VzcGVuc2U+LmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGBkYXRhKCkgc2hvdWxkIHJldHVybiBhbiBvYmplY3QuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLmRhdGEgPSByZWFjdGl2ZShkYXRhKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJEYXRhXCIgLyogREFUQSAqLywga2V5KTtcbiAgICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBkYXRhW2tleV0sXG4gICAgICAgICAgICAgIHNldDogTk9PUFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNob3VsZENhY2hlQWNjZXNzID0gdHJ1ZTtcbiAgaWYgKGNvbXB1dGVkT3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXB1dGVkT3B0aW9ucykge1xuICAgICAgY29uc3Qgb3B0ID0gY29tcHV0ZWRPcHRpb25zW2tleV07XG4gICAgICBjb25zdCBnZXQgPSBpc0Z1bmN0aW9uKG9wdCkgPyBvcHQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IGlzRnVuY3Rpb24ob3B0LmdldCkgPyBvcHQuZ2V0LmJpbmQocHVibGljVGhpcywgcHVibGljVGhpcykgOiBOT09QO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZ2V0ID09PSBOT09QKSB7XG4gICAgICAgIHdhcm4kMShgQ29tcHV0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBoYXMgbm8gZ2V0dGVyLmApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2V0ID0gIWlzRnVuY3Rpb24ob3B0KSAmJiBpc0Z1bmN0aW9uKG9wdC5zZXQpID8gb3B0LnNldC5iaW5kKHB1YmxpY1RoaXMpIDogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/ICgpID0+IHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBXcml0ZSBvcGVyYXRpb24gZmFpbGVkOiBjb21wdXRlZCBwcm9wZXJ0eSBcIiR7a2V5fVwiIGlzIHJlYWRvbmx5LmBcbiAgICAgICAgKTtcbiAgICAgIH0gOiBOT09QO1xuICAgICAgY29uc3QgYyA9IGNvbXB1dGVkKHtcbiAgICAgICAgZ2V0LFxuICAgICAgICBzZXRcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBjLnZhbHVlLFxuICAgICAgICBzZXQ6ICh2KSA9PiBjLnZhbHVlID0gdlxuICAgICAgfSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJDb21wdXRlZFwiIC8qIENPTVBVVEVEICovLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAod2F0Y2hPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gd2F0Y2hPcHRpb25zKSB7XG4gICAgICBjcmVhdGVXYXRjaGVyKHdhdGNoT3B0aW9uc1trZXldLCBjdHgsIHB1YmxpY1RoaXMsIGtleSk7XG4gICAgfVxuICB9XG4gIGlmIChwcm92aWRlT3B0aW9ucykge1xuICAgIGNvbnN0IHByb3ZpZGVzID0gaXNGdW5jdGlvbihwcm92aWRlT3B0aW9ucykgPyBwcm92aWRlT3B0aW9ucy5jYWxsKHB1YmxpY1RoaXMpIDogcHJvdmlkZU9wdGlvbnM7XG4gICAgUmVmbGVjdC5vd25LZXlzKHByb3ZpZGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHByb3ZpZGUoa2V5LCBwcm92aWRlc1trZXldKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoY3JlYXRlZCkge1xuICAgIGNhbGxIb29rKGNyZWF0ZWQsIGluc3RhbmNlLCBcImNcIik7XG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJMaWZlY3ljbGVIb29rKHJlZ2lzdGVyLCBob29rKSB7XG4gICAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICAgIGhvb2suZm9yRWFjaCgoX2hvb2spID0+IHJlZ2lzdGVyKF9ob29rLmJpbmQocHVibGljVGhpcykpKTtcbiAgICB9IGVsc2UgaWYgKGhvb2spIHtcbiAgICAgIHJlZ2lzdGVyKGhvb2suYmluZChwdWJsaWNUaGlzKSk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZU1vdW50LCBiZWZvcmVNb3VudCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbk1vdW50ZWQsIG1vdW50ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25CZWZvcmVVcGRhdGUsIGJlZm9yZVVwZGF0ZSk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblVwZGF0ZWQsIHVwZGF0ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25BY3RpdmF0ZWQsIGFjdGl2YXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkRlYWN0aXZhdGVkLCBkZWFjdGl2YXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkVycm9yQ2FwdHVyZWQsIGVycm9yQ2FwdHVyZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmFja2VkLCByZW5kZXJUcmFja2VkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uUmVuZGVyVHJpZ2dlcmVkLCByZW5kZXJUcmlnZ2VyZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25CZWZvcmVVbm1vdW50LCBiZWZvcmVVbm1vdW50KTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uVW5tb3VudGVkLCB1bm1vdW50ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25TZXJ2ZXJQcmVmZXRjaCwgc2VydmVyUHJlZmV0Y2gpO1xuICBpZiAoaXNBcnJheShleHBvc2UpKSB7XG4gICAgaWYgKGV4cG9zZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGV4cG9zZWQgPSBpbnN0YW5jZS5leHBvc2VkIHx8IChpbnN0YW5jZS5leHBvc2VkID0ge30pO1xuICAgICAgZXhwb3NlLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3NlZCwga2V5LCB7XG4gICAgICAgICAgZ2V0OiAoKSA9PiBwdWJsaWNUaGlzW2tleV0sXG4gICAgICAgICAgc2V0OiAodmFsKSA9PiBwdWJsaWNUaGlzW2tleV0gPSB2YWwsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgIGluc3RhbmNlLmV4cG9zZWQgPSB7fTtcbiAgICB9XG4gIH1cbiAgaWYgKHJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1ApIHtcbiAgICBpbnN0YW5jZS5yZW5kZXIgPSByZW5kZXI7XG4gIH1cbiAgaWYgKGluaGVyaXRBdHRycyAhPSBudWxsKSB7XG4gICAgaW5zdGFuY2UuaW5oZXJpdEF0dHJzID0gaW5oZXJpdEF0dHJzO1xuICB9XG4gIGlmIChjb21wb25lbnRzKSBpbnN0YW5jZS5jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgaWYgKGRpcmVjdGl2ZXMpIGluc3RhbmNlLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xuICBpZiAoc2VydmVyUHJlZmV0Y2gpIHtcbiAgICBtYXJrQXN5bmNCb3VuZGFyeShpbnN0YW5jZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzID0gTk9PUCkge1xuICBpZiAoaXNBcnJheShpbmplY3RPcHRpb25zKSkge1xuICAgIGluamVjdE9wdGlvbnMgPSBub3JtYWxpemVJbmplY3QoaW5qZWN0T3B0aW9ucyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gaW5qZWN0T3B0aW9ucykge1xuICAgIGNvbnN0IG9wdCA9IGluamVjdE9wdGlvbnNba2V5XTtcbiAgICBsZXQgaW5qZWN0ZWQ7XG4gICAgaWYgKGlzT2JqZWN0KG9wdCkpIHtcbiAgICAgIGlmIChcImRlZmF1bHRcIiBpbiBvcHQpIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3QoXG4gICAgICAgICAgb3B0LmZyb20gfHwga2V5LFxuICAgICAgICAgIG9wdC5kZWZhdWx0LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkID0gaW5qZWN0KG9wdC5mcm9tIHx8IGtleSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluamVjdGVkID0gaW5qZWN0KG9wdCk7XG4gICAgfVxuICAgIGlmIChpc1JlZihpbmplY3RlZCkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gaW5qZWN0ZWQudmFsdWUsXG4gICAgICAgIHNldDogKHYpID0+IGluamVjdGVkLnZhbHVlID0gdlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eFtrZXldID0gaW5qZWN0ZWQ7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJJbmplY3RcIiAvKiBJTkpFQ1QgKi8sIGtleSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjYWxsSG9vayhob29rLCBpbnN0YW5jZSwgdHlwZSkge1xuICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICBpc0FycmF5KGhvb2spID8gaG9vay5tYXAoKGgpID0+IGguYmluZChpbnN0YW5jZS5wcm94eSkpIDogaG9vay5iaW5kKGluc3RhbmNlLnByb3h5KSxcbiAgICBpbnN0YW5jZSxcbiAgICB0eXBlXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyKHJhdywgY3R4LCBwdWJsaWNUaGlzLCBrZXkpIHtcbiAgbGV0IGdldHRlciA9IGtleS5pbmNsdWRlcyhcIi5cIikgPyBjcmVhdGVQYXRoR2V0dGVyKHB1YmxpY1RoaXMsIGtleSkgOiAoKSA9PiBwdWJsaWNUaGlzW2tleV07XG4gIGlmIChpc1N0cmluZyhyYXcpKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IGN0eFtyYXddO1xuICAgIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgICB7XG4gICAgICAgIHdhdGNoKGdldHRlciwgaGFuZGxlcik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXd9XCJgLCBoYW5kbGVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihyYXcpKSB7XG4gICAge1xuICAgICAgd2F0Y2goZ2V0dGVyLCByYXcuYmluZChwdWJsaWNUaGlzKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHJhdykpIHtcbiAgICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgICByYXcuZm9yRWFjaCgocikgPT4gY3JlYXRlV2F0Y2hlcihyLCBjdHgsIHB1YmxpY1RoaXMsIGtleSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gaXNGdW5jdGlvbihyYXcuaGFuZGxlcikgPyByYXcuaGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpIDogY3R4W3Jhdy5oYW5kbGVyXTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgICAgIHdhdGNoKGdldHRlciwgaGFuZGxlciwgcmF3KTtcbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXcuaGFuZGxlcn1cImAsIGhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBJbnZhbGlkIHdhdGNoIG9wdGlvbjogXCIke2tleX1cImAsIHJhdyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVNZXJnZWRPcHRpb25zKGluc3RhbmNlKSB7XG4gIGNvbnN0IGJhc2UgPSBpbnN0YW5jZS50eXBlO1xuICBjb25zdCB7IG1peGlucywgZXh0ZW5kczogZXh0ZW5kc09wdGlvbnMgfSA9IGJhc2U7XG4gIGNvbnN0IHtcbiAgICBtaXhpbnM6IGdsb2JhbE1peGlucyxcbiAgICBvcHRpb25zQ2FjaGU6IGNhY2hlLFxuICAgIGNvbmZpZzogeyBvcHRpb25NZXJnZVN0cmF0ZWdpZXMgfVxuICB9ID0gaW5zdGFuY2UuYXBwQ29udGV4dDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGJhc2UpO1xuICBsZXQgcmVzb2x2ZWQ7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXNvbHZlZCA9IGNhY2hlZDtcbiAgfSBlbHNlIGlmICghZ2xvYmFsTWl4aW5zLmxlbmd0aCAmJiAhbWl4aW5zICYmICFleHRlbmRzT3B0aW9ucykge1xuICAgIHtcbiAgICAgIHJlc29sdmVkID0gYmFzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzb2x2ZWQgPSB7fTtcbiAgICBpZiAoZ2xvYmFsTWl4aW5zLmxlbmd0aCkge1xuICAgICAgZ2xvYmFsTWl4aW5zLmZvckVhY2goXG4gICAgICAgIChtKSA9PiBtZXJnZU9wdGlvbnMocmVzb2x2ZWQsIG0sIG9wdGlvbk1lcmdlU3RyYXRlZ2llcywgdHJ1ZSlcbiAgICAgICk7XG4gICAgfVxuICAgIG1lcmdlT3B0aW9ucyhyZXNvbHZlZCwgYmFzZSwgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzKTtcbiAgfVxuICBpZiAoaXNPYmplY3QoYmFzZSkpIHtcbiAgICBjYWNoZS5zZXQoYmFzZSwgcmVzb2x2ZWQpO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyh0bywgZnJvbSwgc3RyYXRzLCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgeyBtaXhpbnMsIGV4dGVuZHM6IGV4dGVuZHNPcHRpb25zIH0gPSBmcm9tO1xuICBpZiAoZXh0ZW5kc09wdGlvbnMpIHtcbiAgICBtZXJnZU9wdGlvbnModG8sIGV4dGVuZHNPcHRpb25zLCBzdHJhdHMsIHRydWUpO1xuICB9XG4gIGlmIChtaXhpbnMpIHtcbiAgICBtaXhpbnMuZm9yRWFjaChcbiAgICAgIChtKSA9PiBtZXJnZU9wdGlvbnModG8sIG0sIHN0cmF0cywgdHJ1ZSlcbiAgICApO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICBpZiAoYXNNaXhpbiAmJiBrZXkgPT09IFwiZXhwb3NlXCIpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgXCJleHBvc2VcIiBvcHRpb24gaXMgaWdub3JlZCB3aGVuIGRlY2xhcmVkIGluIG1peGlucyBvciBleHRlbmRzLiBJdCBzaG91bGQgb25seSBiZSBkZWNsYXJlZCBpbiB0aGUgYmFzZSBjb21wb25lbnQgaXRzZWxmLmBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0cmF0ID0gaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0c1trZXldIHx8IHN0cmF0cyAmJiBzdHJhdHNba2V5XTtcbiAgICAgIHRvW2tleV0gPSBzdHJhdCA/IHN0cmF0KHRvW2tleV0sIGZyb21ba2V5XSkgOiBmcm9tW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cbmNvbnN0IGludGVybmFsT3B0aW9uTWVyZ2VTdHJhdHMgPSB7XG4gIGRhdGE6IG1lcmdlRGF0YUZuLFxuICBwcm9wczogbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zLFxuICBlbWl0czogbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zLFxuICAvLyBvYmplY3RzXG4gIG1ldGhvZHM6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgY29tcHV0ZWQ6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgLy8gbGlmZWN5Y2xlXG4gIGJlZm9yZUNyZWF0ZTogbWVyZ2VBc0FycmF5LFxuICBjcmVhdGVkOiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZU1vdW50OiBtZXJnZUFzQXJyYXksXG4gIG1vdW50ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlVXBkYXRlOiBtZXJnZUFzQXJyYXksXG4gIHVwZGF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlRGVzdHJveTogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVVbm1vdW50OiBtZXJnZUFzQXJyYXksXG4gIGRlc3Ryb3llZDogbWVyZ2VBc0FycmF5LFxuICB1bm1vdW50ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYWN0aXZhdGVkOiBtZXJnZUFzQXJyYXksXG4gIGRlYWN0aXZhdGVkOiBtZXJnZUFzQXJyYXksXG4gIGVycm9yQ2FwdHVyZWQ6IG1lcmdlQXNBcnJheSxcbiAgc2VydmVyUHJlZmV0Y2g6IG1lcmdlQXNBcnJheSxcbiAgLy8gYXNzZXRzXG4gIGNvbXBvbmVudHM6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgZGlyZWN0aXZlczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAvLyB3YXRjaFxuICB3YXRjaDogbWVyZ2VXYXRjaE9wdGlvbnMsXG4gIC8vIHByb3ZpZGUgLyBpbmplY3RcbiAgcHJvdmlkZTogbWVyZ2VEYXRhRm4sXG4gIGluamVjdDogbWVyZ2VJbmplY3Rcbn07XG5mdW5jdGlvbiBtZXJnZURhdGFGbih0bywgZnJvbSkge1xuICBpZiAoIWZyb20pIHtcbiAgICByZXR1cm4gdG87XG4gIH1cbiAgaWYgKCF0bykge1xuICAgIHJldHVybiBmcm9tO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4oKSB7XG4gICAgcmV0dXJuIChleHRlbmQpKFxuICAgICAgaXNGdW5jdGlvbih0bykgPyB0by5jYWxsKHRoaXMsIHRoaXMpIDogdG8sXG4gICAgICBpc0Z1bmN0aW9uKGZyb20pID8gZnJvbS5jYWxsKHRoaXMsIHRoaXMpIDogZnJvbVxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiBtZXJnZUluamVjdCh0bywgZnJvbSkge1xuICByZXR1cm4gbWVyZ2VPYmplY3RPcHRpb25zKG5vcm1hbGl6ZUluamVjdCh0byksIG5vcm1hbGl6ZUluamVjdChmcm9tKSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVJbmplY3QocmF3KSB7XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW3Jhd1tpXV0gPSByYXdbaV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcmV0dXJuIHJhdztcbn1cbmZ1bmN0aW9uIG1lcmdlQXNBcnJheSh0bywgZnJvbSkge1xuICByZXR1cm4gdG8gPyBbLi4ubmV3IFNldChbXS5jb25jYXQodG8sIGZyb20pKV0gOiBmcm9tO1xufVxuZnVuY3Rpb24gbWVyZ2VPYmplY3RPcHRpb25zKHRvLCBmcm9tKSB7XG4gIHJldHVybiB0byA/IGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgdG8sIGZyb20pIDogZnJvbTtcbn1cbmZ1bmN0aW9uIG1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyh0bywgZnJvbSkge1xuICBpZiAodG8pIHtcbiAgICBpZiAoaXNBcnJheSh0bykgJiYgaXNBcnJheShmcm9tKSkge1xuICAgICAgcmV0dXJuIFsuLi4vKiBAX19QVVJFX18gKi8gbmV3IFNldChbLi4udG8sIC4uLmZyb21dKV07XG4gICAgfVxuICAgIHJldHVybiBleHRlbmQoXG4gICAgICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyh0byksXG4gICAgICBub3JtYWxpemVQcm9wc09yRW1pdHMoZnJvbSAhPSBudWxsID8gZnJvbSA6IHt9KVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZyb207XG4gIH1cbn1cbmZ1bmN0aW9uIG1lcmdlV2F0Y2hPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmICghdG8pIHJldHVybiBmcm9tO1xuICBpZiAoIWZyb20pIHJldHVybiB0bztcbiAgY29uc3QgbWVyZ2VkID0gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0byk7XG4gIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICBtZXJnZWRba2V5XSA9IG1lcmdlQXNBcnJheSh0b1trZXldLCBmcm9tW2tleV0pO1xuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFwcENvbnRleHQoKSB7XG4gIHJldHVybiB7XG4gICAgYXBwOiBudWxsLFxuICAgIGNvbmZpZzoge1xuICAgICAgaXNOYXRpdmVUYWc6IE5PLFxuICAgICAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuICAgICAgZ2xvYmFsUHJvcGVydGllczoge30sXG4gICAgICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IHt9LFxuICAgICAgZXJyb3JIYW5kbGVyOiB2b2lkIDAsXG4gICAgICB3YXJuSGFuZGxlcjogdm9pZCAwLFxuICAgICAgY29tcGlsZXJPcHRpb25zOiB7fVxuICAgIH0sXG4gICAgbWl4aW5zOiBbXSxcbiAgICBjb21wb25lbnRzOiB7fSxcbiAgICBkaXJlY3RpdmVzOiB7fSxcbiAgICBwcm92aWRlczogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgb3B0aW9uc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBwcm9wc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBlbWl0c0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKVxuICB9O1xufVxubGV0IHVpZCQxID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUFwcChyb290Q29tcG9uZW50LCByb290UHJvcHMgPSBudWxsKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKHJvb3RDb21wb25lbnQpKSB7XG4gICAgICByb290Q29tcG9uZW50ID0gZXh0ZW5kKHt9LCByb290Q29tcG9uZW50KTtcbiAgICB9XG4gICAgaWYgKHJvb3RQcm9wcyAhPSBudWxsICYmICFpc09iamVjdChyb290UHJvcHMpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgcm9vdCBwcm9wcyBwYXNzZWQgdG8gYXBwLm1vdW50KCkgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG4gICAgICByb290UHJvcHMgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlQXBwQ29udGV4dCgpO1xuICAgIGNvbnN0IGluc3RhbGxlZFBsdWdpbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICBjb25zdCBwbHVnaW5DbGVhbnVwRm5zID0gW107XG4gICAgbGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFwcCA9IGNvbnRleHQuYXBwID0ge1xuICAgICAgX3VpZDogdWlkJDErKyxcbiAgICAgIF9jb21wb25lbnQ6IHJvb3RDb21wb25lbnQsXG4gICAgICBfcHJvcHM6IHJvb3RQcm9wcyxcbiAgICAgIF9jb250YWluZXI6IG51bGwsXG4gICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgIF9pbnN0YW5jZTogbnVsbCxcbiAgICAgIHZlcnNpb24sXG4gICAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jb25maWc7XG4gICAgICB9LFxuICAgICAgc2V0IGNvbmZpZyh2KSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYGFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2UocGx1Z2luLCAuLi5vcHRpb25zKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmhhcyhwbHVnaW4pKSB7XG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYFBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfSBlbHNlIGlmIChwbHVnaW4gJiYgaXNGdW5jdGlvbihwbHVnaW4uaW5zdGFsbCkpIHtcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLmFkZChwbHVnaW4pO1xuICAgICAgICAgIHBsdWdpbi5pbnN0YWxsKGFwcCwgLi4ub3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihwbHVnaW4pKSB7XG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5hZGQocGx1Z2luKTtcbiAgICAgICAgICBwbHVnaW4oYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEEgcGx1Z2luIG11c3QgZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IHdpdGggYW4gXCJpbnN0YWxsXCIgZnVuY3Rpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBtaXhpbihtaXhpbikge1xuICAgICAgICBpZiAoX19WVUVfT1BUSU9OU19BUElfXykge1xuICAgICAgICAgIGlmICghY29udGV4dC5taXhpbnMuaW5jbHVkZXMobWl4aW4pKSB7XG4gICAgICAgICAgICBjb250ZXh0Lm1peGlucy5wdXNoKG1peGluKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgXCJNaXhpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcFwiICsgKG1peGluLm5hbWUgPyBgOiAke21peGluLm5hbWV9YCA6IFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiTWl4aW5zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBidWlsZHMgc3VwcG9ydGluZyBPcHRpb25zIEFQSVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudChuYW1lLCBjb21wb25lbnQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgY29udGV4dC5jb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuJDEoYENvbXBvbmVudCBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgZGlyZWN0aXZlKG5hbWUsIGRpcmVjdGl2ZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdKSB7XG4gICAgICAgICAgd2FybiQxKGBEaXJlY3RpdmUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdID0gZGlyZWN0aXZlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1vdW50KHJvb3RDb250YWluZXIsIGlzSHlkcmF0ZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIGlmICghaXNNb3VudGVkKSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcm9vdENvbnRhaW5lci5fX3Z1ZV9hcHBfXykge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgVGhlcmUgaXMgYWxyZWFkeSBhbiBhcHAgaW5zdGFuY2UgbW91bnRlZCBvbiB0aGUgaG9zdCBjb250YWluZXIuXG4gSWYgeW91IHdhbnQgdG8gbW91bnQgYW5vdGhlciBhcHAgb24gdGhlIHNhbWUgaG9zdCBjb250YWluZXIsIHlvdSBuZWVkIHRvIHVubW91bnQgdGhlIHByZXZpb3VzIGFwcCBieSBjYWxsaW5nIFxcYGFwcC51bm1vdW50KClcXGAgZmlyc3QuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm5vZGUgPSBhcHAuX2NlVk5vZGUgfHwgY3JlYXRlVk5vZGUocm9vdENvbXBvbmVudCwgcm9vdFByb3BzKTtcbiAgICAgICAgICB2bm9kZS5hcHBDb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICBpZiAobmFtZXNwYWNlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSBcInN2Z1wiO1xuICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgbmFtZXNwYWNlID0gdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgY29udGV4dC5yZWxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNsb25lZCA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgICAgICAgICAgICBjbG9uZWQuZWwgPSBudWxsO1xuICAgICAgICAgICAgICByZW5kZXIoY2xvbmVkLCByb290Q29udGFpbmVyLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzSHlkcmF0ZSAmJiBoeWRyYXRlKSB7XG4gICAgICAgICAgICBoeWRyYXRlKHZub2RlLCByb290Q29udGFpbmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyKHZub2RlLCByb290Q29udGFpbmVyLCBuYW1lc3BhY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpc01vdW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGFwcC5fY29udGFpbmVyID0gcm9vdENvbnRhaW5lcjtcbiAgICAgICAgICByb290Q29udGFpbmVyLl9fdnVlX2FwcF9fID0gYXBwO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgICAgYXBwLl9pbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgICAgICAgIGRldnRvb2xzSW5pdEFwcChhcHAsIHZlcnNpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2Uodm5vZGUuY29tcG9uZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEFwcCBoYXMgYWxyZWFkeSBiZWVuIG1vdW50ZWQuXG5JZiB5b3Ugd2FudCB0byByZW1vdW50IHRoZSBzYW1lIGFwcCwgbW92ZSB5b3VyIGFwcCBjcmVhdGlvbiBsb2dpYyBpbnRvIGEgZmFjdG9yeSBmdW5jdGlvbiBhbmQgY3JlYXRlIGZyZXNoIGFwcCBpbnN0YW5jZXMgZm9yIGVhY2ggbW91bnQgLSBlLmcuIFxcYGNvbnN0IGNyZWF0ZU15QXBwID0gKCkgPT4gY3JlYXRlQXBwKEFwcClcXGBgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uVW5tb3VudChjbGVhbnVwRm4pIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHlwZW9mIGNsZWFudXBGbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGZ1bmN0aW9uIGFzIGZpcnN0IGFyZ3VtZW50IHRvIGFwcC5vblVubW91bnQoKSwgYnV0IGdvdCAke3R5cGVvZiBjbGVhbnVwRm59YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcGx1Z2luQ2xlYW51cEZucy5wdXNoKGNsZWFudXBGbik7XG4gICAgICB9LFxuICAgICAgdW5tb3VudCgpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCkge1xuICAgICAgICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgICAgICAgcGx1Z2luQ2xlYW51cEZucyxcbiAgICAgICAgICAgIGFwcC5faW5zdGFuY2UsXG4gICAgICAgICAgICAxNlxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVuZGVyKG51bGwsIGFwcC5fY29udGFpbmVyKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICAgIGFwcC5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgZGV2dG9vbHNVbm1vdW50QXBwKGFwcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBhcHAuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXztcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKGBDYW5ub3QgdW5tb3VudCBhbiBhcHAgdGhhdCBpcyBub3QgbW91bnRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3ZpZGUoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgaW4gY29udGV4dC5wcm92aWRlcykge1xuICAgICAgICAgIGlmIChoYXNPd24oY29udGV4dC5wcm92aWRlcywga2V5KSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgQXBwIGFscmVhZHkgcHJvdmlkZXMgcHJvcGVydHkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiLiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBBcHAgYWxyZWFkeSBwcm92aWRlcyBwcm9wZXJ0eSB3aXRoIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBlbGVtZW50LiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBydW5XaXRoQ29udGV4dChmbikge1xuICAgICAgICBjb25zdCBsYXN0QXBwID0gY3VycmVudEFwcDtcbiAgICAgICAgY3VycmVudEFwcCA9IGFwcDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjdXJyZW50QXBwID0gbGFzdEFwcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwcDtcbiAgfTtcbn1cbmxldCBjdXJyZW50QXBwID0gbnVsbDtcblxuZnVuY3Rpb24gcHJvdmlkZShrZXksIHZhbHVlKSB7XG4gIGlmICghY3VycmVudEluc3RhbmNlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgcHJvdmlkZSgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkuYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcztcbiAgICBjb25zdCBwYXJlbnRQcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQgJiYgY3VycmVudEluc3RhbmNlLnBhcmVudC5wcm92aWRlcztcbiAgICBpZiAocGFyZW50UHJvdmlkZXMgPT09IHByb3ZpZGVzKSB7XG4gICAgICBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50UHJvdmlkZXMpO1xuICAgIH1cbiAgICBwcm92aWRlc1trZXldID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdChrZXksIGRlZmF1bHRWYWx1ZSwgdHJlYXREZWZhdWx0QXNGYWN0b3J5ID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKGluc3RhbmNlIHx8IGN1cnJlbnRBcHApIHtcbiAgICBsZXQgcHJvdmlkZXMgPSBjdXJyZW50QXBwID8gY3VycmVudEFwcC5fY29udGV4dC5wcm92aWRlcyA6IGluc3RhbmNlID8gaW5zdGFuY2UucGFyZW50ID09IG51bGwgfHwgaW5zdGFuY2UuY2UgPyBpbnN0YW5jZS52bm9kZS5hcHBDb250ZXh0ICYmIGluc3RhbmNlLnZub2RlLmFwcENvbnRleHQucHJvdmlkZXMgOiBpbnN0YW5jZS5wYXJlbnQucHJvdmlkZXMgOiB2b2lkIDA7XG4gICAgaWYgKHByb3ZpZGVzICYmIGtleSBpbiBwcm92aWRlcykge1xuICAgICAgcmV0dXJuIHByb3ZpZGVzW2tleV07XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkgPyBkZWZhdWx0VmFsdWUuY2FsbChpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYGluamVjdGlvbiBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kLmApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBpbmplY3QoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzZXR1cCgpIG9yIGZ1bmN0aW9uYWwgY29tcG9uZW50cy5gKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFzSW5qZWN0aW9uQ29udGV4dCgpIHtcbiAgcmV0dXJuICEhKGdldEN1cnJlbnRJbnN0YW5jZSgpIHx8IGN1cnJlbnRBcHApO1xufVxuXG5jb25zdCBpbnRlcm5hbE9iamVjdFByb3RvID0ge307XG5jb25zdCBjcmVhdGVJbnRlcm5hbE9iamVjdCA9ICgpID0+IE9iamVjdC5jcmVhdGUoaW50ZXJuYWxPYmplY3RQcm90byk7XG5jb25zdCBpc0ludGVybmFsT2JqZWN0ID0gKG9iaikgPT4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IGludGVybmFsT2JqZWN0UHJvdG87XG5cbmZ1bmN0aW9uIGluaXRQcm9wcyhpbnN0YW5jZSwgcmF3UHJvcHMsIGlzU3RhdGVmdWwsIGlzU1NSID0gZmFsc2UpIHtcbiAgY29uc3QgcHJvcHMgPSB7fTtcbiAgY29uc3QgYXR0cnMgPSBjcmVhdGVJbnRlcm5hbE9iamVjdCgpO1xuICBpbnN0YW5jZS5wcm9wc0RlZmF1bHRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHNldEZ1bGxQcm9wcyhpbnN0YW5jZSwgcmF3UHJvcHMsIHByb3BzLCBhdHRycyk7XG4gIGZvciAoY29uc3Qga2V5IGluIGluc3RhbmNlLnByb3BzT3B0aW9uc1swXSkge1xuICAgIGlmICghKGtleSBpbiBwcm9wcykpIHtcbiAgICAgIHByb3BzW2tleV0gPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgfVxuICBpZiAoaXNTdGF0ZWZ1bCkge1xuICAgIGluc3RhbmNlLnByb3BzID0gaXNTU1IgPyBwcm9wcyA6IHNoYWxsb3dSZWFjdGl2ZShwcm9wcyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnN0YW5jZS50eXBlLnByb3BzKSB7XG4gICAgICBpbnN0YW5jZS5wcm9wcyA9IGF0dHJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5wcm9wcyA9IHByb3BzO1xuICAgIH1cbiAgfVxuICBpbnN0YW5jZS5hdHRycyA9IGF0dHJzO1xufVxuZnVuY3Rpb24gaXNJbkhtckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgd2hpbGUgKGluc3RhbmNlKSB7XG4gICAgaWYgKGluc3RhbmNlLnR5cGUuX19obXJJZCkgcmV0dXJuIHRydWU7XG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5wYXJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcmF3UHJldlByb3BzLCBvcHRpbWl6ZWQpIHtcbiAgY29uc3Qge1xuICAgIHByb3BzLFxuICAgIGF0dHJzLFxuICAgIHZub2RlOiB7IHBhdGNoRmxhZyB9XG4gIH0gPSBpbnN0YW5jZTtcbiAgY29uc3QgcmF3Q3VycmVudFByb3BzID0gdG9SYXcocHJvcHMpO1xuICBjb25zdCBbb3B0aW9uc10gPSBpbnN0YW5jZS5wcm9wc09wdGlvbnM7XG4gIGxldCBoYXNBdHRyc0NoYW5nZWQgPSBmYWxzZTtcbiAgaWYgKFxuICAgIC8vIGFsd2F5cyBmb3JjZSBmdWxsIGRpZmYgaW4gZGV2XG4gICAgLy8gLSAjMTk0MiBpZiBobXIgaXMgZW5hYmxlZCB3aXRoIHNmYyBjb21wb25lbnRcbiAgICAvLyAtIHZpdGUjODcyIG5vbi1zZmMgY29tcG9uZW50IHVzZWQgYnkgc2ZjIGNvbXBvbmVudFxuICAgICEoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0luSG1yQ29udGV4dChpbnN0YW5jZSkpICYmIChvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnID4gMCkgJiYgIShwYXRjaEZsYWcgJiAxNilcbiAgKSB7XG4gICAgaWYgKHBhdGNoRmxhZyAmIDgpIHtcbiAgICAgIGNvbnN0IHByb3BzVG9VcGRhdGUgPSBpbnN0YW5jZS52bm9kZS5keW5hbWljUHJvcHM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGtleSA9IHByb3BzVG9VcGRhdGVbaV07XG4gICAgICAgIGlmIChpc0VtaXRMaXN0ZW5lcihpbnN0YW5jZS5lbWl0c09wdGlvbnMsIGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJhd1Byb3BzW2tleV07XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKGhhc093bihhdHRycywga2V5KSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2FtZWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgICAgICAgIHByb3BzW2NhbWVsaXplZEtleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgICAgICAgIGNhbWVsaXplZEtleSxcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgICBhdHRyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSkge1xuICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IGtlYmFiS2V5O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHJhd0N1cnJlbnRQcm9wcykge1xuICAgICAgaWYgKCFyYXdQcm9wcyB8fCAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmIC8vIGl0J3MgcG9zc2libGUgdGhlIG9yaWdpbmFsIHByb3BzIHdhcyBwYXNzZWQgaW4gYXMga2ViYWItY2FzZVxuICAgICAgLy8gYW5kIGNvbnZlcnRlZCB0byBjYW1lbENhc2UgKCM5NTUpXG4gICAgICAoKGtlYmFiS2V5ID0gaHlwaGVuYXRlKGtleSkpID09PSBrZXkgfHwgIWhhc093bihyYXdQcm9wcywga2ViYWJLZXkpKSkge1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgIGlmIChyYXdQcmV2UHJvcHMgJiYgLy8gZm9yIGNhbWVsQ2FzZVxuICAgICAgICAgIChyYXdQcmV2UHJvcHNba2V5XSAhPT0gdm9pZCAwIHx8IC8vIGZvciBrZWJhYi1jYXNlXG4gICAgICAgICAgcmF3UHJldlByb3BzW2tlYmFiS2V5XSAhPT0gdm9pZCAwKSkge1xuICAgICAgICAgICAgcHJvcHNba2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgcHJvcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXR0cnMgIT09IHJhd0N1cnJlbnRQcm9wcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgaWYgKCFyYXdQcm9wcyB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmIHRydWUpIHtcbiAgICAgICAgICBkZWxldGUgYXR0cnNba2V5XTtcbiAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChoYXNBdHRyc0NoYW5nZWQpIHtcbiAgICB0cmlnZ2VyKGluc3RhbmNlLmF0dHJzLCBcInNldFwiLCBcIlwiKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMgfHwge30sIHByb3BzLCBpbnN0YW5jZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEZ1bGxQcm9wcyhpbnN0YW5jZSwgcmF3UHJvcHMsIHByb3BzLCBhdHRycykge1xuICBjb25zdCBbb3B0aW9ucywgbmVlZENhc3RLZXlzXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBsZXQgcmF3Q2FzdFZhbHVlcztcbiAgaWYgKHJhd1Byb3BzKSB7XG4gICAgZm9yIChsZXQga2V5IGluIHJhd1Byb3BzKSB7XG4gICAgICBpZiAoaXNSZXNlcnZlZFByb3Aoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgIGxldCBjYW1lbEtleTtcbiAgICAgIGlmIChvcHRpb25zICYmIGhhc093bihvcHRpb25zLCBjYW1lbEtleSA9IGNhbWVsaXplKGtleSkpKSB7XG4gICAgICAgIGlmICghbmVlZENhc3RLZXlzIHx8ICFuZWVkQ2FzdEtleXMuaW5jbHVkZXMoY2FtZWxLZXkpKSB7XG4gICAgICAgICAgcHJvcHNbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKHJhd0Nhc3RWYWx1ZXMgfHwgKHJhd0Nhc3RWYWx1ZXMgPSB7fSkpW2NhbWVsS2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpc0VtaXRMaXN0ZW5lcihpbnN0YW5jZS5lbWl0c09wdGlvbnMsIGtleSkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIGF0dHJzKSB8fCB2YWx1ZSAhPT0gYXR0cnNba2V5XSkge1xuICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChuZWVkQ2FzdEtleXMpIHtcbiAgICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gICAgY29uc3QgY2FzdFZhbHVlcyA9IHJhd0Nhc3RWYWx1ZXMgfHwgRU1QVFlfT0JKO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmVlZENhc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBuZWVkQ2FzdEtleXNbaV07XG4gICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICBrZXksXG4gICAgICAgIGNhc3RWYWx1ZXNba2V5XSxcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICFoYXNPd24oY2FzdFZhbHVlcywga2V5KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc0F0dHJzQ2hhbmdlZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQcm9wVmFsdWUob3B0aW9ucywgcHJvcHMsIGtleSwgdmFsdWUsIGluc3RhbmNlLCBpc0Fic2VudCkge1xuICBjb25zdCBvcHQgPSBvcHRpb25zW2tleV07XG4gIGlmIChvcHQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGhhc0RlZmF1bHQgPSBoYXNPd24ob3B0LCBcImRlZmF1bHRcIik7XG4gICAgaWYgKGhhc0RlZmF1bHQgJiYgdmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gb3B0LmRlZmF1bHQ7XG4gICAgICBpZiAob3B0LnR5cGUgIT09IEZ1bmN0aW9uICYmICFvcHQuc2tpcEZhY3RvcnkgJiYgaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHsgcHJvcHNEZWZhdWx0cyB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGlmIChrZXkgaW4gcHJvcHNEZWZhdWx0cykge1xuICAgICAgICAgIHZhbHVlID0gcHJvcHNEZWZhdWx0c1trZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICB2YWx1ZSA9IHByb3BzRGVmYXVsdHNba2V5XSA9IGRlZmF1bHRWYWx1ZS5jYWxsKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnN0YW5jZS5jZSkge1xuICAgICAgICBpbnN0YW5jZS5jZS5fc2V0UHJvcChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdFswIC8qIHNob3VsZENhc3QgKi9dKSB7XG4gICAgICBpZiAoaXNBYnNlbnQgJiYgIWhhc0RlZmF1bHQpIHtcbiAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAob3B0WzEgLyogc2hvdWxkQ2FzdFRydWUgKi9dICYmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpKSB7XG4gICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgbWl4aW5Qcm9wc0NhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBub3JtYWxpemVQcm9wc09wdGlvbnMoY29tcCwgYXBwQ29udGV4dCwgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGNhY2hlID0gX19WVUVfT1BUSU9OU19BUElfXyAmJiBhc01peGluID8gbWl4aW5Qcm9wc0NhY2hlIDogYXBwQ29udGV4dC5wcm9wc0NhY2hlO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoY29tcCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJhdyA9IGNvbXAucHJvcHM7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fTtcbiAgY29uc3QgbmVlZENhc3RLZXlzID0gW107XG4gIGxldCBoYXNFeHRlbmRzID0gZmFsc2U7XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmICFpc0Z1bmN0aW9uKGNvbXApKSB7XG4gICAgY29uc3QgZXh0ZW5kUHJvcHMgPSAocmF3MikgPT4ge1xuICAgICAgaGFzRXh0ZW5kcyA9IHRydWU7XG4gICAgICBjb25zdCBbcHJvcHMsIGtleXNdID0gbm9ybWFsaXplUHJvcHNPcHRpb25zKHJhdzIsIGFwcENvbnRleHQsIHRydWUpO1xuICAgICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIHByb3BzKTtcbiAgICAgIGlmIChrZXlzKSBuZWVkQ2FzdEtleXMucHVzaCguLi5rZXlzKTtcbiAgICB9O1xuICAgIGlmICghYXNNaXhpbiAmJiBhcHBDb250ZXh0Lm1peGlucy5sZW5ndGgpIHtcbiAgICAgIGFwcENvbnRleHQubWl4aW5zLmZvckVhY2goZXh0ZW5kUHJvcHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5leHRlbmRzKSB7XG4gICAgICBleHRlbmRQcm9wcyhjb21wLmV4dGVuZHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5taXhpbnMpIHtcbiAgICAgIGNvbXAubWl4aW5zLmZvckVhY2goZXh0ZW5kUHJvcHMpO1xuICAgIH1cbiAgfVxuICBpZiAoIXJhdyAmJiAhaGFzRXh0ZW5kcykge1xuICAgIGlmIChpc09iamVjdChjb21wKSkge1xuICAgICAgY2FjaGUuc2V0KGNvbXAsIEVNUFRZX0FSUik7XG4gICAgfVxuICAgIHJldHVybiBFTVBUWV9BUlI7XG4gIH1cbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNTdHJpbmcocmF3W2ldKSkge1xuICAgICAgICB3YXJuJDEoYHByb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC5gLCByYXdbaV0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IGNhbWVsaXplKHJhd1tpXSk7XG4gICAgICBpZiAodmFsaWRhdGVQcm9wTmFtZShub3JtYWxpemVkS2V5KSkge1xuICAgICAgICBub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID0gRU1QVFlfT0JKO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChyYXcpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNPYmplY3QocmF3KSkge1xuICAgICAgd2FybiQxKGBpbnZhbGlkIHByb3BzIG9wdGlvbnNgLCByYXcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXcpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgaWYgKHZhbGlkYXRlUHJvcE5hbWUobm9ybWFsaXplZEtleSkpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gcmF3W2tleV07XG4gICAgICAgIGNvbnN0IHByb3AgPSBub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID0gaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSA/IHsgdHlwZTogb3B0IH0gOiBleHRlbmQoe30sIG9wdCk7XG4gICAgICAgIGNvbnN0IHByb3BUeXBlID0gcHJvcC50eXBlO1xuICAgICAgICBsZXQgc2hvdWxkQ2FzdCA9IGZhbHNlO1xuICAgICAgICBsZXQgc2hvdWxkQ2FzdFRydWUgPSB0cnVlO1xuICAgICAgICBpZiAoaXNBcnJheShwcm9wVHlwZSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJvcFR5cGUubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcHJvcFR5cGVbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBpc0Z1bmN0aW9uKHR5cGUpICYmIHR5cGUubmFtZTtcbiAgICAgICAgICAgIGlmICh0eXBlTmFtZSA9PT0gXCJCb29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgc2hvdWxkQ2FzdCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlTmFtZSA9PT0gXCJTdHJpbmdcIikge1xuICAgICAgICAgICAgICBzaG91bGRDYXN0VHJ1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG91bGRDYXN0ID0gaXNGdW5jdGlvbihwcm9wVHlwZSkgJiYgcHJvcFR5cGUubmFtZSA9PT0gXCJCb29sZWFuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcHJvcFswIC8qIHNob3VsZENhc3QgKi9dID0gc2hvdWxkQ2FzdDtcbiAgICAgICAgcHJvcFsxIC8qIHNob3VsZENhc3RUcnVlICovXSA9IHNob3VsZENhc3RUcnVlO1xuICAgICAgICBpZiAoc2hvdWxkQ2FzdCB8fCBoYXNPd24ocHJvcCwgXCJkZWZhdWx0XCIpKSB7XG4gICAgICAgICAgbmVlZENhc3RLZXlzLnB1c2gobm9ybWFsaXplZEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzID0gW25vcm1hbGl6ZWQsIG5lZWRDYXN0S2V5c107XG4gIGlmIChpc09iamVjdChjb21wKSkge1xuICAgIGNhY2hlLnNldChjb21wLCByZXMpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BOYW1lKGtleSkge1xuICBpZiAoa2V5WzBdICE9PSBcIiRcIiAmJiAhaXNSZXNlcnZlZFByb3Aoa2V5KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYEludmFsaWQgcHJvcCBuYW1lOiBcIiR7a2V5fVwiIGlzIGEgcmVzZXJ2ZWQgcHJvcGVydHkuYCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0VHlwZShjdG9yKSB7XG4gIGlmIChjdG9yID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFwibnVsbFwiO1xuICB9XG4gIGlmICh0eXBlb2YgY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGN0b3IubmFtZSB8fCBcIlwiO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjdG9yID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgbmFtZSA9IGN0b3IuY29uc3RydWN0b3IgJiYgY3Rvci5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHJldHVybiBuYW1lIHx8IFwiXCI7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzLCBwcm9wcywgaW5zdGFuY2UpIHtcbiAgY29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF07XG4gIGNvbnN0IGNhbWVsaXplUHJvcHNLZXkgPSBPYmplY3Qua2V5cyhyYXdQcm9wcykubWFwKChrZXkpID0+IGNhbWVsaXplKGtleSkpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgbGV0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgICBpZiAob3B0ID09IG51bGwpIGNvbnRpbnVlO1xuICAgIHZhbGlkYXRlUHJvcChcbiAgICAgIGtleSxcbiAgICAgIHJlc29sdmVkVmFsdWVzW2tleV0sXG4gICAgICBvcHQsXG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KHJlc29sdmVkVmFsdWVzKSA6IHJlc29sdmVkVmFsdWVzLFxuICAgICAgIWNhbWVsaXplUHJvcHNLZXkuaW5jbHVkZXMoa2V5KVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcChuYW1lLCB2YWx1ZSwgcHJvcCwgcHJvcHMsIGlzQWJzZW50KSB7XG4gIGNvbnN0IHsgdHlwZSwgcmVxdWlyZWQsIHZhbGlkYXRvciwgc2tpcENoZWNrIH0gPSBwcm9wO1xuICBpZiAocmVxdWlyZWQgJiYgaXNBYnNlbnQpIHtcbiAgICB3YXJuJDEoJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogXCInICsgbmFtZSArICdcIicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcmVxdWlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlICE9PSB0cnVlICYmICFza2lwQ2hlY2spIHtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGVzID0gaXNBcnJheSh0eXBlKSA/IHR5cGUgOiBbdHlwZV07XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmICFpc1ZhbGlkOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsaWQsIGV4cGVjdGVkVHlwZSB9ID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZXNbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGV4cGVjdGVkVHlwZSB8fCBcIlwiKTtcbiAgICAgIGlzVmFsaWQgPSB2YWxpZDtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB3YXJuJDEoZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmICh2YWxpZGF0b3IgJiYgIXZhbGlkYXRvcih2YWx1ZSwgcHJvcHMpKSB7XG4gICAgd2FybiQxKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJyArIG5hbWUgKyAnXCIuJyk7XG4gIH1cbn1cbmNvbnN0IGlzU2ltcGxlVHlwZSA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBcIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50XCJcbik7XG5mdW5jdGlvbiBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlKSB7XG4gIGxldCB2YWxpZDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTtcbiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJudWxsXCIpIHtcbiAgICB2YWxpZCA9IHZhbHVlID09PSBudWxsO1xuICB9IGVsc2UgaWYgKGlzU2ltcGxlVHlwZShleHBlY3RlZFR5cGUpKSB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICB2YWxpZCA9IHQgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdmFsaWQgJiYgdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJPYmplY3RcIikge1xuICAgIHZhbGlkID0gaXNPYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgdmFsaWQgPSBpc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkLFxuICAgIGV4cGVjdGVkVHlwZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSB7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBgUHJvcCB0eXBlIFtdIGZvciBwcm9wIFwiJHtuYW1lfVwiIHdvbid0IG1hdGNoIGFueXRoaW5nLiBEaWQgeW91IG1lYW4gdG8gdXNlIHR5cGUgQXJyYXkgaW5zdGVhZD9gO1xuICB9XG4gIGxldCBtZXNzYWdlID0gYEludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIke25hbWV9XCIuIEV4cGVjdGVkICR7ZXhwZWN0ZWRUeXBlcy5tYXAoY2FwaXRhbGl6ZSkuam9pbihcIiB8IFwiKX1gO1xuICBjb25zdCBleHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGVzWzBdO1xuICBjb25zdCByZWNlaXZlZFR5cGUgPSB0b1Jhd1R5cGUodmFsdWUpO1xuICBjb25zdCBleHBlY3RlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgZXhwZWN0ZWRUeXBlKTtcbiAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIHJlY2VpdmVkVHlwZSk7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMSAmJiBpc0V4cGxpY2FibGUoZXhwZWN0ZWRUeXBlKSAmJiAhaXNCb29sZWFuKGV4cGVjdGVkVHlwZSwgcmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gYCB3aXRoIHZhbHVlICR7ZXhwZWN0ZWRWYWx1ZX1gO1xuICB9XG4gIG1lc3NhZ2UgKz0gYCwgZ290ICR7cmVjZWl2ZWRUeXBlfSBgO1xuICBpZiAoaXNFeHBsaWNhYmxlKHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGB3aXRoIHZhbHVlICR7cmVjZWl2ZWRWYWx1ZX0uYDtcbiAgfVxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHN0eWxlVmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IFwiU3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJOdW1iZXJcIikge1xuICAgIHJldHVybiBgJHtOdW1iZXIodmFsdWUpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSh0eXBlKSB7XG4gIGNvbnN0IGV4cGxpY2l0VHlwZXMgPSBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKChlbGVtKSA9PiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09IGVsZW0pO1xufVxuZnVuY3Rpb24gaXNCb29sZWFuKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3Muc29tZSgoZWxlbSkgPT4gZWxlbS50b0xvd2VyQ2FzZSgpID09PSBcImJvb2xlYW5cIik7XG59XG5cbmNvbnN0IGlzSW50ZXJuYWxLZXkgPSAoa2V5KSA9PiBrZXkgPT09IFwiX1wiIHx8IGtleSA9PT0gXCJfY3R4XCIgfHwga2V5ID09PSBcIiRzdGFibGVcIjtcbmNvbnN0IG5vcm1hbGl6ZVNsb3RWYWx1ZSA9ICh2YWx1ZSkgPT4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAobm9ybWFsaXplVk5vZGUpIDogW25vcm1hbGl6ZVZOb2RlKHZhbHVlKV07XG5jb25zdCBub3JtYWxpemVTbG90ID0gKGtleSwgcmF3U2xvdCwgY3R4KSA9PiB7XG4gIGlmIChyYXdTbG90Ll9uKSB7XG4gICAgcmV0dXJuIHJhd1Nsb3Q7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHdpdGhDdHgoKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjdXJyZW50SW5zdGFuY2UgJiYgIShjdHggPT09IG51bGwgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSAmJiAhKGN0eCAmJiBjdHgucm9vdCAhPT0gY3VycmVudEluc3RhbmNlLnJvb3QpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBTbG90IFwiJHtrZXl9XCIgaW52b2tlZCBvdXRzaWRlIG9mIHRoZSByZW5kZXIgZnVuY3Rpb246IHRoaXMgd2lsbCBub3QgdHJhY2sgZGVwZW5kZW5jaWVzIHVzZWQgaW4gdGhlIHNsb3QuIEludm9rZSB0aGUgc2xvdCBmdW5jdGlvbiBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVTbG90VmFsdWUocmF3U2xvdCguLi5hcmdzKSk7XG4gIH0sIGN0eCk7XG4gIG5vcm1hbGl6ZWQuX2MgPSBmYWxzZTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59O1xuY29uc3Qgbm9ybWFsaXplT2JqZWN0U2xvdHMgPSAocmF3U2xvdHMsIHNsb3RzLCBpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBjdHggPSByYXdTbG90cy5fY3R4O1xuICBmb3IgKGNvbnN0IGtleSBpbiByYXdTbG90cykge1xuICAgIGlmIChpc0ludGVybmFsS2V5KGtleSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gcmF3U2xvdHNba2V5XTtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHNsb3RzW2tleV0gPSBub3JtYWxpemVTbG90KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBzbG90IFwiJHtrZXl9XCIuIFByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbG90VmFsdWUodmFsdWUpO1xuICAgICAgc2xvdHNba2V5XSA9ICgpID0+IG5vcm1hbGl6ZWQ7XG4gICAgfVxuICB9XG59O1xuY29uc3Qgbm9ybWFsaXplVk5vZGVTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4pID0+IHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzS2VlcEFsaXZlKGluc3RhbmNlLnZub2RlKSAmJiB0cnVlKSB7XG4gICAgd2FybiQxKFxuICAgICAgYE5vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3IgZGVmYXVsdCBzbG90LiBQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5gXG4gICAgKTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2xvdFZhbHVlKGNoaWxkcmVuKTtcbiAgaW5zdGFuY2Uuc2xvdHMuZGVmYXVsdCA9ICgpID0+IG5vcm1hbGl6ZWQ7XG59O1xuY29uc3QgYXNzaWduU2xvdHMgPSAoc2xvdHMsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpID0+IHtcbiAgZm9yIChjb25zdCBrZXkgaW4gY2hpbGRyZW4pIHtcbiAgICBpZiAob3B0aW1pemVkIHx8ICFpc0ludGVybmFsS2V5KGtleSkpIHtcbiAgICAgIHNsb3RzW2tleV0gPSBjaGlsZHJlbltrZXldO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IGluaXRTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBjb25zdCBzbG90cyA9IGluc3RhbmNlLnNsb3RzID0gY3JlYXRlSW50ZXJuYWxPYmplY3QoKTtcbiAgaWYgKGluc3RhbmNlLnZub2RlLnNoYXBlRmxhZyAmIDMyKSB7XG4gICAgY29uc3QgdHlwZSA9IGNoaWxkcmVuLl87XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGFzc2lnblNsb3RzKHNsb3RzLCBjaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICAgIGlmIChvcHRpbWl6ZWQpIHtcbiAgICAgICAgZGVmKHNsb3RzLCBcIl9cIiwgdHlwZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZU9iamVjdFNsb3RzKGNoaWxkcmVuLCBzbG90cyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICB9XG59O1xuY29uc3QgdXBkYXRlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpID0+IHtcbiAgY29uc3QgeyB2bm9kZSwgc2xvdHMgfSA9IGluc3RhbmNlO1xuICBsZXQgbmVlZERlbGV0aW9uQ2hlY2sgPSB0cnVlO1xuICBsZXQgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0gRU1QVFlfT0JKO1xuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMzIpIHtcbiAgICBjb25zdCB0eXBlID0gY2hpbGRyZW4uXztcbiAgICBpZiAodHlwZSkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgICBhc3NpZ25TbG90cyhzbG90cywgY2hpbGRyZW4sIG9wdGltaXplZCk7XG4gICAgICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIsIFwiJHNsb3RzXCIpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpbWl6ZWQgJiYgdHlwZSA9PT0gMSkge1xuICAgICAgICBuZWVkRGVsZXRpb25DaGVjayA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduU2xvdHMoc2xvdHMsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZWVkRGVsZXRpb25DaGVjayA9ICFjaGlsZHJlbi4kc3RhYmxlO1xuICAgICAgbm9ybWFsaXplT2JqZWN0U2xvdHMoY2hpbGRyZW4sIHNsb3RzKTtcbiAgICB9XG4gICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0geyBkZWZhdWx0OiAxIH07XG4gIH1cbiAgaWYgKG5lZWREZWxldGlvbkNoZWNrKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2xvdHMpIHtcbiAgICAgIGlmICghaXNJbnRlcm5hbEtleShrZXkpICYmIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldFtrZXldID09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIHNsb3RzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5sZXQgc3VwcG9ydGVkO1xubGV0IHBlcmY7XG5mdW5jdGlvbiBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIHR5cGUpIHtcbiAgaWYgKGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlICYmIGlzU3VwcG9ydGVkKCkpIHtcbiAgICBwZXJmLm1hcmsoYHZ1ZS0ke3R5cGV9LSR7aW5zdGFuY2UudWlkfWApO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZlN0YXJ0KGluc3RhbmNlLCB0eXBlLCBpc1N1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCkpO1xuICB9XG59XG5mdW5jdGlvbiBlbmRNZWFzdXJlKGluc3RhbmNlLCB0eXBlKSB7XG4gIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgY29uc3Qgc3RhcnRUYWcgPSBgdnVlLSR7dHlwZX0tJHtpbnN0YW5jZS51aWR9YDtcbiAgICBjb25zdCBlbmRUYWcgPSBzdGFydFRhZyArIGA6ZW5kYDtcbiAgICBjb25zdCBtZWFzdXJlTmFtZSA9IGA8JHtmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCBpbnN0YW5jZS50eXBlKX0+ICR7dHlwZX1gO1xuICAgIHBlcmYubWFyayhlbmRUYWcpO1xuICAgIHBlcmYubWVhc3VyZShtZWFzdXJlTmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7XG4gICAgcGVyZi5jbGVhck1lYXN1cmVzKG1lYXN1cmVOYW1lKTtcbiAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZkVuZChpbnN0YW5jZSwgdHlwZSwgaXNTdXBwb3J0ZWQoKSA/IHBlcmYubm93KCkgOiBEYXRlLm5vdygpKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdXBwb3J0ZWQoKSB7XG4gIGlmIChzdXBwb3J0ZWQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBzdXBwb3J0ZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnBlcmZvcm1hbmNlKSB7XG4gICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICBwZXJmID0gd2luZG93LnBlcmZvcm1hbmNlO1xuICB9IGVsc2Uge1xuICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBzdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIGluaXRGZWF0dXJlRmxhZ3MoKSB7XG4gIGNvbnN0IG5lZWRXYXJuID0gW107XG4gIGlmICh0eXBlb2YgX19WVUVfT1BUSU9OU19BUElfXyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX09QVElPTlNfQVBJX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfT1BUSU9OU19BUElfXyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0RFVlRPT0xTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0RFVlRPT0xTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9ERVZUT09MU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ubGVuZ3RoKSB7XG4gICAgY29uc3QgbXVsdGkgPSBuZWVkV2Fybi5sZW5ndGggPiAxO1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBGZWF0dXJlIGZsYWcke211bHRpID8gYHNgIDogYGB9ICR7bmVlZFdhcm4uam9pbihcIiwgXCIpfSAke211bHRpID8gYGFyZWAgOiBgaXNgfSBub3QgZXhwbGljaXRseSBkZWZpbmVkLiBZb3UgYXJlIHJ1bm5pbmcgdGhlIGVzbS1idW5kbGVyIGJ1aWxkIG9mIFZ1ZSwgd2hpY2ggZXhwZWN0cyB0aGVzZSBjb21waWxlLXRpbWUgZmVhdHVyZSBmbGFncyB0byBiZSBnbG9iYWxseSBpbmplY3RlZCB2aWEgdGhlIGJ1bmRsZXIgY29uZmlnIGluIG9yZGVyIHRvIGdldCBiZXR0ZXIgdHJlZS1zaGFraW5nIGluIHRoZSBwcm9kdWN0aW9uIGJ1bmRsZS5cblxuRm9yIG1vcmUgZGV0YWlscywgc2VlIGh0dHBzOi8vbGluay52dWVqcy5vcmcvZmVhdHVyZS1mbGFncy5gXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QgPSBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSA7XG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucyk7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucywgY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKTtcbn1cbmZ1bmN0aW9uIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAge1xuICAgIGluaXRGZWF0dXJlRmxhZ3MoKTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSBnZXRHbG9iYWxUaGlzKCk7XG4gIHRhcmdldC5fX1ZVRV9fID0gdHJ1ZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgc2V0RGV2dG9vbHNIb29rJDEodGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sIHRhcmdldCk7XG4gIH1cbiAgY29uc3Qge1xuICAgIGluc2VydDogaG9zdEluc2VydCxcbiAgICByZW1vdmU6IGhvc3RSZW1vdmUsXG4gICAgcGF0Y2hQcm9wOiBob3N0UGF0Y2hQcm9wLFxuICAgIGNyZWF0ZUVsZW1lbnQ6IGhvc3RDcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZVRleHQ6IGhvc3RDcmVhdGVUZXh0LFxuICAgIGNyZWF0ZUNvbW1lbnQ6IGhvc3RDcmVhdGVDb21tZW50LFxuICAgIHNldFRleHQ6IGhvc3RTZXRUZXh0LFxuICAgIHNldEVsZW1lbnRUZXh0OiBob3N0U2V0RWxlbWVudFRleHQsXG4gICAgcGFyZW50Tm9kZTogaG9zdFBhcmVudE5vZGUsXG4gICAgbmV4dFNpYmxpbmc6IGhvc3ROZXh0U2libGluZyxcbiAgICBzZXRTY29wZUlkOiBob3N0U2V0U2NvcGVJZCA9IE5PT1AsXG4gICAgaW5zZXJ0U3RhdGljQ29udGVudDogaG9zdEluc2VydFN0YXRpY0NvbnRlbnRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHBhdGNoID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IgPSBudWxsLCBwYXJlbnRDb21wb25lbnQgPSBudWxsLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwsIG5hbWVzcGFjZSA9IHZvaWQgMCwgc2xvdFNjb3BlSWRzID0gbnVsbCwgb3B0aW1pemVkID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nID8gZmFsc2UgOiAhIW4yLmR5bmFtaWNDaGlsZHJlbikgPT4ge1xuICAgIGlmIChuMSA9PT0gbjIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG4xICYmICFpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgYW5jaG9yID0gZ2V0TmV4dEhvc3ROb2RlKG4xKTtcbiAgICAgIHVubW91bnQobjEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgbjEgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobjIucGF0Y2hGbGFnID09PSAtMikge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBuMi5keW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHR5cGUsIHJlZiwgc2hhcGVGbGFnIH0gPSBuMjtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVGV4dDpcbiAgICAgICAgcHJvY2Vzc1RleHQobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICBwcm9jZXNzQ29tbWVudE5vZGUobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGF0aWM6XG4gICAgICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICAgICAgbW91bnRTdGF0aWNOb2RlKG4yLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcGF0Y2hTdGF0aWNOb2RlKG4xLCBuMiwgY29udGFpbmVyLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgcHJvY2Vzc0ZyYWdtZW50KFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEpIHtcbiAgICAgICAgICBwcm9jZXNzRWxlbWVudChcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgICAgIHByb2Nlc3NDb21wb25lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgaW50ZXJuYWxzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICB0eXBlLnByb2Nlc3MoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICBpbnRlcm5hbHNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIFZOb2RlIHR5cGU6XCIsIHR5cGUsIGAoJHt0eXBlb2YgdHlwZX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsICYmIHBhcmVudENvbXBvbmVudCkge1xuICAgICAgc2V0UmVmKHJlZiwgbjEgJiYgbjEucmVmLCBwYXJlbnRTdXNwZW5zZSwgbjIgfHwgbjEsICFuMik7XG4gICAgfSBlbHNlIGlmIChyZWYgPT0gbnVsbCAmJiBuMSAmJiBuMS5yZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKG4xLnJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIG4xLCB0cnVlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NUZXh0ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChcbiAgICAgICAgbjIuZWwgPSBob3N0Q3JlYXRlVGV4dChuMi5jaGlsZHJlbiksXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbCA9IG4yLmVsID0gbjEuZWw7XG4gICAgICBpZiAobjIuY2hpbGRyZW4gIT09IG4xLmNoaWxkcmVuKSB7XG4gICAgICAgIGhvc3RTZXRUZXh0KGVsLCBuMi5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzQ29tbWVudE5vZGUgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcikgPT4ge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBob3N0SW5zZXJ0KFxuICAgICAgICBuMi5lbCA9IGhvc3RDcmVhdGVDb21tZW50KG4yLmNoaWxkcmVuIHx8IFwiXCIpLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50U3RhdGljTm9kZSA9IChuMiwgY29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSkgPT4ge1xuICAgIFtuMi5lbCwgbjIuYW5jaG9yXSA9IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50KFxuICAgICAgbjIuY2hpbGRyZW4sXG4gICAgICBjb250YWluZXIsXG4gICAgICBhbmNob3IsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBuMi5lbCxcbiAgICAgIG4yLmFuY2hvclxuICAgICk7XG4gIH07XG4gIGNvbnN0IHBhdGNoU3RhdGljTm9kZSA9IChuMSwgbjIsIGNvbnRhaW5lciwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKG4yLmNoaWxkcmVuICE9PSBuMS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgYW5jaG9yID0gaG9zdE5leHRTaWJsaW5nKG4xLmFuY2hvcik7XG4gICAgICByZW1vdmVTdGF0aWNOb2RlKG4xKTtcbiAgICAgIFtuMi5lbCwgbjIuYW5jaG9yXSA9IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50KFxuICAgICAgICBuMi5jaGlsZHJlbixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIG5hbWVzcGFjZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgIG4yLmFuY2hvciA9IG4xLmFuY2hvcjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdmVTdGF0aWNOb2RlID0gKHsgZWwsIGFuY2hvciB9LCBjb250YWluZXIsIG5leHRTaWJsaW5nKSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGVsICYmIGVsICE9PSBhbmNob3IpIHtcbiAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoZWwpO1xuICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBuZXh0U2libGluZyk7XG4gICAgICBlbCA9IG5leHQ7XG4gICAgfVxuICAgIGhvc3RJbnNlcnQoYW5jaG9yLCBjb250YWluZXIsIG5leHRTaWJsaW5nKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU3RhdGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSkgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gYW5jaG9yKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGVsKTtcbiAgICAgIGhvc3RSZW1vdmUoZWwpO1xuICAgICAgZWwgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0UmVtb3ZlKGFuY2hvcik7XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NFbGVtZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBpZiAobjIudHlwZSA9PT0gXCJzdmdcIikge1xuICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICB9IGVsc2UgaWYgKG4yLnR5cGUgPT09IFwibWF0aFwiKSB7XG4gICAgICBuYW1lc3BhY2UgPSBcIm1hdGhtbFwiO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgbW91bnRFbGVtZW50KFxuICAgICAgICBuMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoRWxlbWVudChcbiAgICAgICAgbjEsXG4gICAgICAgIG4yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnRFbGVtZW50ID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGxldCBlbDtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIGNvbnN0IHsgcHJvcHMsIHNoYXBlRmxhZywgdHJhbnNpdGlvbiwgZGlycyB9ID0gdm5vZGU7XG4gICAgZWwgPSB2bm9kZS5lbCA9IGhvc3RDcmVhdGVFbGVtZW50KFxuICAgICAgdm5vZGUudHlwZSxcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIHByb3BzICYmIHByb3BzLmlzLFxuICAgICAgcHJvcHNcbiAgICApO1xuICAgIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICBob3N0U2V0RWxlbWVudFRleHQoZWwsIHZub2RlLmNoaWxkcmVuKTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgZWwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZSh2bm9kZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkaXJzKSB7XG4gICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiY3JlYXRlZFwiKTtcbiAgICB9XG4gICAgc2V0U2NvcGVJZChlbCwgdm5vZGUsIHZub2RlLnNjb3BlSWQsIHNsb3RTY29wZUlkcywgcGFyZW50Q29tcG9uZW50KTtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgIGlmIChrZXkgIT09IFwidmFsdWVcIiAmJiAhaXNSZXNlcnZlZFByb3Aoa2V5KSkge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgbnVsbCwgcHJvcHNba2V5XSwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIHByb3BzKSB7XG4gICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwidmFsdWVcIiwgbnVsbCwgcHJvcHMudmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgICBpZiAodm5vZGVIb29rID0gcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSB7XG4gICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGRlZihlbCwgXCJfX3Zub2RlXCIsIHZub2RlLCB0cnVlKTtcbiAgICAgIGRlZihlbCwgXCJfX3Z1ZVBhcmVudENvbXBvbmVudFwiLCBwYXJlbnRDb21wb25lbnQsIHRydWUpO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZU1vdW50XCIpO1xuICAgIH1cbiAgICBjb25zdCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKTtcbiAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgaWYgKCh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgfHwgZGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyAmJiB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldFNjb3BlSWQgPSAoZWwsIHZub2RlLCBzY29wZUlkLCBzbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGlmIChzY29wZUlkKSB7XG4gICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2NvcGVJZCk7XG4gICAgfVxuICAgIGlmIChzbG90U2NvcGVJZHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdFNjb3BlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhvc3RTZXRTY29wZUlkKGVsLCBzbG90U2NvcGVJZHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBsZXQgc3ViVHJlZSA9IHBhcmVudENvbXBvbmVudC5zdWJUcmVlO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc3ViVHJlZS5wYXRjaEZsYWcgPiAwICYmIHN1YlRyZWUucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgICAgICBzdWJUcmVlID0gZmlsdGVyU2luZ2xlUm9vdChzdWJUcmVlLmNoaWxkcmVuKSB8fCBzdWJUcmVlO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlID09PSBzdWJUcmVlIHx8IGlzU3VzcGVuc2Uoc3ViVHJlZS50eXBlKSAmJiAoc3ViVHJlZS5zc0NvbnRlbnQgPT09IHZub2RlIHx8IHN1YlRyZWUuc3NGYWxsYmFjayA9PT0gdm5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gcGFyZW50Q29tcG9uZW50LnZub2RlO1xuICAgICAgICBzZXRTY29wZUlkKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudFZOb2RlLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNjb3BlSWQsXG4gICAgICAgICAgcGFyZW50Vk5vZGUuc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBzdGFydCA9IDApID0+IHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGNoaWxkcmVuW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGNoaWxkcmVuW2ldKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBjaGlsZCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEVsZW1lbnQgPSAobjEsIG4yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuMi5lbCA9IG4xLmVsO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZWwuX192bm9kZSA9IG4yO1xuICAgIH1cbiAgICBsZXQgeyBwYXRjaEZsYWcsIGR5bmFtaWNDaGlsZHJlbiwgZGlycyB9ID0gbjI7XG4gICAgcGF0Y2hGbGFnIHw9IG4xLnBhdGNoRmxhZyAmIDE2O1xuICAgIGNvbnN0IG9sZFByb3BzID0gbjEucHJvcHMgfHwgRU1QVFlfT0JKO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gbjIucHJvcHMgfHwgRU1QVFlfT0JKO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgcGFyZW50Q29tcG9uZW50ICYmIHRvZ2dsZVJlY3Vyc2UocGFyZW50Q29tcG9uZW50LCBmYWxzZSk7XG4gICAgaWYgKHZub2RlSG9vayA9IG5ld1Byb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpIHtcbiAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgbjIsIG4xKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sobjIsIG4xLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlVXBkYXRlXCIpO1xuICAgIH1cbiAgICBwYXJlbnRDb21wb25lbnQgJiYgdG9nZ2xlUmVjdXJzZShwYXJlbnRDb21wb25lbnQsIHRydWUpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgIHBhdGNoRmxhZyA9IDA7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChvbGRQcm9wcy5pbm5lckhUTUwgJiYgbmV3UHJvcHMuaW5uZXJIVE1MID09IG51bGwgfHwgb2xkUHJvcHMudGV4dENvbnRlbnQgJiYgbmV3UHJvcHMudGV4dENvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCBcIlwiKTtcbiAgICB9XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgZWwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZShuMiwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICApO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW9wdGltaXplZCkge1xuICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgbjEsXG4gICAgICAgIG4yLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgcmVzb2x2ZUNoaWxkcmVuTmFtZXNwYWNlKG4yLCBuYW1lc3BhY2UpLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnID4gMCkge1xuICAgICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICAgIHBhdGNoUHJvcHMoZWwsIG9sZFByb3BzLCBuZXdQcm9wcywgcGFyZW50Q29tcG9uZW50LCBuYW1lc3BhY2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDIpIHtcbiAgICAgICAgICBpZiAob2xkUHJvcHMuY2xhc3MgIT09IG5ld1Byb3BzLmNsYXNzKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcImNsYXNzXCIsIG51bGwsIG5ld1Byb3BzLmNsYXNzLCBuYW1lc3BhY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgNCkge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwic3R5bGVcIiwgb2xkUHJvcHMuc3R5bGUsIG5ld1Byb3BzLnN0eWxlLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IG4yLmR5bmFtaWNQcm9wcztcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHByb3BzVG9VcGRhdGVbaV07XG4gICAgICAgICAgICBjb25zdCBwcmV2ID0gb2xkUHJvcHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICAgICAgaWYgKG5leHQgIT09IHByZXYgfHwga2V5ID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwga2V5LCBwcmV2LCBuZXh0LCBuYW1lc3BhY2UsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMSkge1xuICAgICAgICBpZiAobjEuY2hpbGRyZW4gIT09IG4yLmNoaWxkcmVuKSB7XG4gICAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCBuMi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQgJiYgZHluYW1pY0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHBhdGNoUHJvcHMoZWwsIG9sZFByb3BzLCBuZXdQcm9wcywgcGFyZW50Q29tcG9uZW50LCBuYW1lc3BhY2UpO1xuICAgIH1cbiAgICBpZiAoKHZub2RlSG9vayA9IG5ld1Byb3BzLm9uVm5vZGVVcGRhdGVkKSB8fCBkaXJzKSB7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICB2bm9kZUhvb2sgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgICAgICBkaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sobjIsIG4xLCBwYXJlbnRDb21wb25lbnQsIFwidXBkYXRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoQmxvY2tDaGlsZHJlbiA9IChvbGRDaGlsZHJlbiwgbmV3Q2hpbGRyZW4sIGZhbGxiYWNrQ29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5baV07XG4gICAgICBjb25zdCBuZXdWTm9kZSA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gKFxuICAgICAgICAvLyBvbGRWTm9kZSBtYXkgYmUgYW4gZXJyb3JlZCBhc3luYyBzZXR1cCgpIGNvbXBvbmVudCBpbnNpZGUgU3VzcGVuc2VcbiAgICAgICAgLy8gd2hpY2ggd2lsbCBub3QgaGF2ZSBhIG1vdW50ZWQgZWxlbWVudFxuICAgICAgICBvbGRWTm9kZS5lbCAmJiAvLyAtIEluIHRoZSBjYXNlIG9mIGEgRnJhZ21lbnQsIHdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgYWN0dWFsIHBhcmVudFxuICAgICAgICAvLyBvZiB0aGUgRnJhZ21lbnQgaXRzZWxmIHNvIGl0IGNhbiBtb3ZlIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgKG9sZFZOb2RlLnR5cGUgPT09IEZyYWdtZW50IHx8IC8vIC0gSW4gdGhlIGNhc2Ugb2YgZGlmZmVyZW50IG5vZGVzLCB0aGVyZSBpcyBnb2luZyB0byBiZSBhIHJlcGxhY2VtZW50XG4gICAgICAgIC8vIHdoaWNoIGFsc28gcmVxdWlyZXMgdGhlIGNvcnJlY3QgcGFyZW50IGNvbnRhaW5lclxuICAgICAgICAhaXNTYW1lVk5vZGVUeXBlKG9sZFZOb2RlLCBuZXdWTm9kZSkgfHwgLy8gLSBJbiB0aGUgY2FzZSBvZiBhIGNvbXBvbmVudCwgaXQgY291bGQgY29udGFpbiBhbnl0aGluZy5cbiAgICAgICAgb2xkVk5vZGUuc2hhcGVGbGFnICYgKDYgfCA2NCB8IDEyOCkpID8gaG9zdFBhcmVudE5vZGUob2xkVk5vZGUuZWwpIDogKFxuICAgICAgICAgIC8vIEluIG90aGVyIGNhc2VzLCB0aGUgcGFyZW50IGNvbnRhaW5lciBpcyBub3QgYWN0dWFsbHkgdXNlZCBzbyB3ZVxuICAgICAgICAgIC8vIGp1c3QgcGFzcyB0aGUgYmxvY2sgZWxlbWVudCBoZXJlIHRvIGF2b2lkIGEgRE9NIHBhcmVudE5vZGUgY2FsbC5cbiAgICAgICAgICBmYWxsYmFja0NvbnRhaW5lclxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcGF0Y2goXG4gICAgICAgIG9sZFZOb2RlLFxuICAgICAgICBuZXdWTm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoUHJvcHMgPSAoZWwsIG9sZFByb3BzLCBuZXdQcm9wcywgcGFyZW50Q29tcG9uZW50LCBuYW1lc3BhY2UpID0+IHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzKSB7XG4gICAgICBpZiAob2xkUHJvcHMgIT09IEVNUFRZX09CSikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRQcm9wcykge1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByb3Aoa2V5KSAmJiAhKGtleSBpbiBuZXdQcm9wcykpIHtcbiAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIG9sZFByb3BzW2tleV0sXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgaWYgKGlzUmVzZXJ2ZWRQcm9wKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBuZXh0ID0gbmV3UHJvcHNba2V5XTtcbiAgICAgICAgY29uc3QgcHJldiA9IG9sZFByb3BzW2tleV07XG4gICAgICAgIGlmIChuZXh0ICE9PSBwcmV2ICYmIGtleSAhPT0gXCJ2YWx1ZVwiKSB7XG4gICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwga2V5LCBwcmV2LCBuZXh0LCBuYW1lc3BhY2UsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcInZhbHVlXCIgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJ2YWx1ZVwiLCBvbGRQcm9wcy52YWx1ZSwgbmV3UHJvcHMudmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzRnJhZ21lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGZyYWdtZW50U3RhcnRBbmNob3IgPSBuMi5lbCA9IG4xID8gbjEuZWwgOiBob3N0Q3JlYXRlVGV4dChcIlwiKTtcbiAgICBjb25zdCBmcmFnbWVudEVuZEFuY2hvciA9IG4yLmFuY2hvciA9IG4xID8gbjEuYW5jaG9yIDogaG9zdENyZWF0ZVRleHQoXCJcIik7XG4gICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IG4yO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIC8vICM1NTIzIGRldiByb290IGZyYWdtZW50IG1heSBpbmhlcml0IGRpcmVjdGl2ZXNcbiAgICAoaXNIbXJVcGRhdGluZyB8fCBwYXRjaEZsYWcgJiAyMDQ4KSkge1xuICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZyYWdtZW50U2xvdFNjb3BlSWRzKSB7XG4gICAgICBzbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHMgPyBzbG90U2NvcGVJZHMuY29uY2F0KGZyYWdtZW50U2xvdFNjb3BlSWRzKSA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChmcmFnbWVudFN0YXJ0QW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBob3N0SW5zZXJ0KGZyYWdtZW50RW5kQW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAvLyAjMTAwMDdcbiAgICAgICAgLy8gc3VjaCBmcmFnbWVudCBsaWtlIGA8PjwvPmAgd2lsbCBiZSBjb21waWxlZCBpbnRvXG4gICAgICAgIC8vIGEgZnJhZ21lbnQgd2hpY2ggZG9lc24ndCBoYXZlIGEgY2hpbGRyZW4uXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSBmYWxsYmFjayB0byBhbiBlbXB0eSBhcnJheVxuICAgICAgICBuMi5jaGlsZHJlbiB8fCBbXSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBmcmFnbWVudEVuZEFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhdGNoRmxhZyA+IDAgJiYgcGF0Y2hGbGFnICYgNjQgJiYgZHluYW1pY0NoaWxkcmVuICYmIC8vICMyNzE1IHRoZSBwcmV2aW91cyBmcmFnbWVudCBjb3VsZCd2ZSBiZWVuIGEgQkFJTGVkIG9uZSBhcyBhIHJlc3VsdFxuICAgICAgLy8gb2YgcmVuZGVyU2xvdCgpIHdpdGggbm8gdmFsaWQgY2hpbGRyZW5cbiAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMik7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gIzIwODAgaWYgdGhlIHN0YWJsZSBmcmFnbWVudCBoYXMgYSBrZXksIGl0J3MgYSA8dGVtcGxhdGUgdi1mb3I+IHRoYXQgbWF5XG4gICAgICAgICAgLy8gIGdldCBtb3ZlZCBhcm91bmQuIE1ha2Ugc3VyZSBhbGwgcm9vdCBsZXZlbCB2bm9kZXMgaW5oZXJpdCBlbC5cbiAgICAgICAgICAvLyAjMjEzNCBvciBpZiBpdCdzIGEgY29tcG9uZW50IHJvb3QsIGl0IG1heSBhbHNvIGdldCBtb3ZlZCBhcm91bmRcbiAgICAgICAgICAvLyBhcyB0aGUgY29tcG9uZW50IGlzIGJlaW5nIG1vdmVkLlxuICAgICAgICAgIG4yLmtleSAhPSBudWxsIHx8IHBhcmVudENvbXBvbmVudCAmJiBuMiA9PT0gcGFyZW50Q29tcG9uZW50LnN1YlRyZWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAvKiBzaGFsbG93ICovXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgZnJhZ21lbnRFbmRBbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBuMi5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGlmIChuMi5zaGFwZUZsYWcgJiA1MTIpIHtcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5hY3RpdmF0ZShcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vdW50Q29tcG9uZW50KFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlQ29tcG9uZW50KG4xLCBuMiwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50Q29tcG9uZW50ID0gKGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSAoaW5pdGlhbFZOb2RlLmNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICAgICAgaW5pdGlhbFZOb2RlLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2VcbiAgICApKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpbnN0YW5jZS50eXBlLl9faG1ySWQpIHtcbiAgICAgIHJlZ2lzdGVySE1SKGluc3RhbmNlKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChpbml0aWFsVk5vZGUpO1xuICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgbW91bnRgKTtcbiAgICB9XG4gICAgaWYgKGlzS2VlcEFsaXZlKGluaXRpYWxWTm9kZSkpIHtcbiAgICAgIGluc3RhbmNlLmN0eC5yZW5kZXJlciA9IGludGVybmFscztcbiAgICB9XG4gICAge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgaW5pdGApO1xuICAgICAgfVxuICAgICAgc2V0dXBDb21wb25lbnQoaW5zdGFuY2UsIGZhbHNlLCBvcHRpbWl6ZWQpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykgaW5pdGlhbFZOb2RlLmVsID0gbnVsbDtcbiAgICBpZiAoaW5zdGFuY2UuYXN5bmNEZXApIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnJlZ2lzdGVyRGVwKGluc3RhbmNlLCBzZXR1cFJlbmRlckVmZmVjdCwgb3B0aW1pemVkKTtcbiAgICAgIGlmICghaW5pdGlhbFZOb2RlLmVsKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gaW5zdGFuY2Uuc3ViVHJlZSA9IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICAgICAgICBwcm9jZXNzQ29tbWVudE5vZGUobnVsbCwgcGxhY2Vob2xkZXIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgaW5pdGlhbFZOb2RlLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXIuZWw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldHVwUmVuZGVyRWZmZWN0KFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgaW5pdGlhbFZOb2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBtb3VudGApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdXBkYXRlQ29tcG9uZW50ID0gKG4xLCBuMiwgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuMi5jb21wb25lbnQgPSBuMS5jb21wb25lbnQ7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUNvbXBvbmVudChuMSwgbjIsIG9wdGltaXplZCkpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5hc3luY0RlcCAmJiAhaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuMik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuMiwgb3B0aW1pemVkKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLm5leHQgPSBuMjtcbiAgICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBpbnN0YW5jZS52bm9kZSA9IG4yO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0dXBSZW5kZXJFZmZlY3QgPSAoaW5zdGFuY2UsIGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFVwZGF0ZUZuID0gKCkgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZS5pc01vdW50ZWQpIHtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgY29uc3QgeyBlbCwgcHJvcHMgfSA9IGluaXRpYWxWTm9kZTtcbiAgICAgICAgY29uc3QgeyBibSwgbSwgcGFyZW50LCByb290LCB0eXBlIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgaXNBc3luY1dyYXBwZXJWTm9kZSA9IGlzQXN5bmNXcmFwcGVyKGluaXRpYWxWTm9kZSk7XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKGJtKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgaW5pdGlhbFZOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgaWYgKGVsICYmIGh5ZHJhdGVOb2RlKSB7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZVN1YlRyZWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh5ZHJhdGVOb2RlKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc0FzeW5jV3JhcHBlclZOb2RlICYmIHR5cGUuX19hc3luY0h5ZHJhdGUpIHtcbiAgICAgICAgICAgIHR5cGUuX19hc3luY0h5ZHJhdGUoXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgaHlkcmF0ZVN1YlRyZWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGh5ZHJhdGVTdWJUcmVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyb290LmNlICYmIC8vIEB0cy1leHBlY3QtZXJyb3IgX2RlZiBpcyBwcml2YXRlXG4gICAgICAgICAgcm9vdC5jZS5fZGVmLnNoYWRvd1Jvb3QgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICByb290LmNlLl9pbmplY3RDaGlsZFN0eWxlKHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHN1YlRyZWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRpYWxWTm9kZS5lbCA9IHN1YlRyZWUuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QobSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGVkSW5pdGlhbFZOb2RlID0gaW5pdGlhbFZOb2RlO1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgICAgICAgICgpID0+IGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgc2NvcGVkSW5pdGlhbFZOb2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdGlhbFZOb2RlLnNoYXBlRmxhZyAmIDI1NiB8fCBwYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIocGFyZW50LnZub2RlKSAmJiBwYXJlbnQudm5vZGUuc2hhcGVGbGFnICYgMjU2KSB7XG4gICAgICAgICAgaW5zdGFuY2UuYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoaW5zdGFuY2UuYSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxWTm9kZSA9IGNvbnRhaW5lciA9IGFuY2hvciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgeyBuZXh0LCBidSwgdSwgcGFyZW50LCB2bm9kZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBub25IeWRyYXRlZEFzeW5jUm9vdCA9IGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAobm9uSHlkcmF0ZWRBc3luY1Jvb3QpIHtcbiAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgIG5leHQuZWwgPSB2bm9kZS5lbDtcbiAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuZXh0LCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9uSHlkcmF0ZWRBc3luY1Jvb3QuYXN5bmNEZXAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRVcGRhdGVGbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9yaWdpbk5leHQgPSBuZXh0O1xuICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuZXh0IHx8IGluc3RhbmNlLnZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgbmV4dC5lbCA9IHZub2RlLmVsO1xuICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbmV4dCwgb3B0aW1pemVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1KSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYnUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgbmV4dCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSA9IG5leHRUcmVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgcHJldlRyZWUsXG4gICAgICAgICAgbmV4dFRyZWUsXG4gICAgICAgICAgLy8gcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgaWYgaXQncyBpbiBhIHRlbGVwb3J0XG4gICAgICAgICAgaG9zdFBhcmVudE5vZGUocHJldlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSBmcmFnbWVudFxuICAgICAgICAgIGdldE5leHRIb3N0Tm9kZShwcmV2VHJlZSksXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dC5lbCA9IG5leHRUcmVlLmVsO1xuICAgICAgICBpZiAob3JpZ2luTmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgbmV4dFRyZWUuZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHUsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVVcGRhdGVkKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSksXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGluc3RhbmNlLnNjb3BlLm9uKCk7XG4gICAgY29uc3QgZWZmZWN0ID0gaW5zdGFuY2UuZWZmZWN0ID0gbmV3IFJlYWN0aXZlRWZmZWN0KGNvbXBvbmVudFVwZGF0ZUZuKTtcbiAgICBpbnN0YW5jZS5zY29wZS5vZmYoKTtcbiAgICBjb25zdCB1cGRhdGUgPSBpbnN0YW5jZS51cGRhdGUgPSBlZmZlY3QucnVuLmJpbmQoZWZmZWN0KTtcbiAgICBjb25zdCBqb2IgPSBpbnN0YW5jZS5qb2IgPSBlZmZlY3QucnVuSWZEaXJ0eS5iaW5kKGVmZmVjdCk7XG4gICAgam9iLmkgPSBpbnN0YW5jZTtcbiAgICBqb2IuaWQgPSBpbnN0YW5jZS51aWQ7XG4gICAgZWZmZWN0LnNjaGVkdWxlciA9ICgpID0+IHF1ZXVlSm9iKGpvYik7XG4gICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGVmZmVjdC5vblRyYWNrID0gaW5zdGFuY2UucnRjID8gKGUpID0+IGludm9rZUFycmF5Rm5zKGluc3RhbmNlLnJ0YywgZSkgOiB2b2lkIDA7XG4gICAgICBlZmZlY3Qub25UcmlnZ2VyID0gaW5zdGFuY2UucnRnID8gKGUpID0+IGludm9rZUFycmF5Rm5zKGluc3RhbmNlLnJ0ZywgZSkgOiB2b2lkIDA7XG4gICAgfVxuICAgIHVwZGF0ZSgpO1xuICB9O1xuICBjb25zdCB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIgPSAoaW5zdGFuY2UsIG5leHRWTm9kZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgbmV4dFZOb2RlLmNvbXBvbmVudCA9IGluc3RhbmNlO1xuICAgIGNvbnN0IHByZXZQcm9wcyA9IGluc3RhbmNlLnZub2RlLnByb3BzO1xuICAgIGluc3RhbmNlLnZub2RlID0gbmV4dFZOb2RlO1xuICAgIGluc3RhbmNlLm5leHQgPSBudWxsO1xuICAgIHVwZGF0ZVByb3BzKGluc3RhbmNlLCBuZXh0Vk5vZGUucHJvcHMsIHByZXZQcm9wcywgb3B0aW1pemVkKTtcbiAgICB1cGRhdGVTbG90cyhpbnN0YW5jZSwgbmV4dFZOb2RlLmNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlKTtcbiAgICByZXNldFRyYWNraW5nKCk7XG4gIH07XG4gIGNvbnN0IHBhdGNoQ2hpbGRyZW4gPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgYzEgPSBuMSAmJiBuMS5jaGlsZHJlbjtcbiAgICBjb25zdCBwcmV2U2hhcGVGbGFnID0gbjEgPyBuMS5zaGFwZUZsYWcgOiAwO1xuICAgIGNvbnN0IGMyID0gbjIuY2hpbGRyZW47XG4gICAgY29uc3QgeyBwYXRjaEZsYWcsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxMjgpIHtcbiAgICAgICAgcGF0Y2hLZXllZENoaWxkcmVuKFxuICAgICAgICAgIGMxLFxuICAgICAgICAgIGMyLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocGF0Y2hGbGFnICYgMjU2KSB7XG4gICAgICAgIHBhdGNoVW5rZXllZENoaWxkcmVuKFxuICAgICAgICAgIGMxLFxuICAgICAgICAgIGMyLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgdW5tb3VudENoaWxkcmVuKGMxLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjMiAhPT0gYzEpIHtcbiAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGNvbnRhaW5lciwgYzIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIHBhdGNoS2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICAgIGMxLFxuICAgICAgICAgICAgYzIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5tb3VudENoaWxkcmVuKGMxLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGNvbnRhaW5lciwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgICAgIGMyLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaFVua2V5ZWRDaGlsZHJlbiA9IChjMSwgYzIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgYzEgPSBjMSB8fCBFTVBUWV9BUlI7XG4gICAgYzIgPSBjMiB8fCBFTVBUWV9BUlI7XG4gICAgY29uc3Qgb2xkTGVuZ3RoID0gYzEubGVuZ3RoO1xuICAgIGNvbnN0IG5ld0xlbmd0aCA9IGMyLmxlbmd0aDtcbiAgICBjb25zdCBjb21tb25MZW5ndGggPSBNYXRoLm1pbihvbGRMZW5ndGgsIG5ld0xlbmd0aCk7XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvbW1vbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBjMVtpXSxcbiAgICAgICAgbmV4dENoaWxkLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvbGRMZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgYzEsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjb21tb25MZW5ndGhcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgIGMyLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgY29tbW9uTGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hLZXllZENoaWxkcmVuID0gKGMxLCBjMiwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgY29uc3QgbDIgPSBjMi5sZW5ndGg7XG4gICAgbGV0IGUxID0gYzEubGVuZ3RoIC0gMTtcbiAgICBsZXQgZTIgPSBsMiAtIDE7XG4gICAgd2hpbGUgKGkgPD0gZTEgJiYgaSA8PSBlMikge1xuICAgICAgY29uc3QgbjEgPSBjMVtpXTtcbiAgICAgIGNvbnN0IG4yID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgd2hpbGUgKGkgPD0gZTEgJiYgaSA8PSBlMikge1xuICAgICAgY29uc3QgbjEgPSBjMVtlMV07XG4gICAgICBjb25zdCBuMiA9IGMyW2UyXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2UyXSkgOiBub3JtYWxpemVWTm9kZShjMltlMl0pO1xuICAgICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlMS0tO1xuICAgICAgZTItLTtcbiAgICB9XG4gICAgaWYgKGkgPiBlMSkge1xuICAgICAgaWYgKGkgPD0gZTIpIHtcbiAgICAgICAgY29uc3QgbmV4dFBvcyA9IGUyICsgMTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gbmV4dFBvcyA8IGwyID8gYzJbbmV4dFBvc10uZWwgOiBwYXJlbnRBbmNob3I7XG4gICAgICAgIHdoaWxlIChpIDw9IGUyKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSksXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpID4gZTIpIHtcbiAgICAgIHdoaWxlIChpIDw9IGUxKSB7XG4gICAgICAgIHVubW91bnQoYzFbaV0sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHMxID0gaTtcbiAgICAgIGNvbnN0IHMyID0gaTtcbiAgICAgIGNvbnN0IGtleVRvTmV3SW5kZXhNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgZm9yIChpID0gczI7IGkgPD0gZTI7IGkrKykge1xuICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgICAgaWYgKG5leHRDaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleVRvTmV3SW5kZXhNYXAuaGFzKG5leHRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBEdXBsaWNhdGUga2V5cyBmb3VuZCBkdXJpbmcgdXBkYXRlOmAsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5leHRDaGlsZC5rZXkpLFxuICAgICAgICAgICAgICBgTWFrZSBzdXJlIGtleXMgYXJlIHVuaXF1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlUb05ld0luZGV4TWFwLnNldChuZXh0Q2hpbGQua2V5LCBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGo7XG4gICAgICBsZXQgcGF0Y2hlZCA9IDA7XG4gICAgICBjb25zdCB0b0JlUGF0Y2hlZCA9IGUyIC0gczIgKyAxO1xuICAgICAgbGV0IG1vdmVkID0gZmFsc2U7XG4gICAgICBsZXQgbWF4TmV3SW5kZXhTb0ZhciA9IDA7XG4gICAgICBjb25zdCBuZXdJbmRleFRvT2xkSW5kZXhNYXAgPSBuZXcgQXJyYXkodG9CZVBhdGNoZWQpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRvQmVQYXRjaGVkOyBpKyspIG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9IDA7XG4gICAgICBmb3IgKGkgPSBzMTsgaSA8PSBlMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByZXZDaGlsZCA9IGMxW2ldO1xuICAgICAgICBpZiAocGF0Y2hlZCA+PSB0b0JlUGF0Y2hlZCkge1xuICAgICAgICAgIHVubW91bnQocHJldkNoaWxkLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3SW5kZXg7XG4gICAgICAgIGlmIChwcmV2Q2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IGtleVRvTmV3SW5kZXhNYXAuZ2V0KHByZXZDaGlsZC5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoaiA9IHMyOyBqIDw9IGUyOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChuZXdJbmRleFRvT2xkSW5kZXhNYXBbaiAtIHMyXSA9PT0gMCAmJiBpc1NhbWVWTm9kZVR5cGUocHJldkNoaWxkLCBjMltqXSkpIHtcbiAgICAgICAgICAgICAgbmV3SW5kZXggPSBqO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0luZGV4ID09PSB2b2lkIDApIHtcbiAgICAgICAgICB1bm1vdW50KHByZXZDaGlsZCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5kZXhUb09sZEluZGV4TWFwW25ld0luZGV4IC0gczJdID0gaSArIDE7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ID49IG1heE5ld0luZGV4U29GYXIpIHtcbiAgICAgICAgICAgIG1heE5ld0luZGV4U29GYXIgPSBuZXdJbmRleDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIHByZXZDaGlsZCxcbiAgICAgICAgICAgIGMyW25ld0luZGV4XSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGF0Y2hlZCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZSA9IG1vdmVkID8gZ2V0U2VxdWVuY2UobmV3SW5kZXhUb09sZEluZGV4TWFwKSA6IEVNUFRZX0FSUjtcbiAgICAgIGogPSBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZS5sZW5ndGggLSAxO1xuICAgICAgZm9yIChpID0gdG9CZVBhdGNoZWQgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBzMiArIGk7XG4gICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW25leHRJbmRleF07XG4gICAgICAgIGNvbnN0IGFuY2hvclZOb2RlID0gYzJbbmV4dEluZGV4ICsgMV07XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IG5leHRJbmRleCArIDEgPCBsMiA/IChcbiAgICAgICAgICAvLyAjMTM1NTksIGZhbGxiYWNrIHRvIGVsIHBsYWNlaG9sZGVyIGZvciB1bnJlc29sdmVkIGFzeW5jIGNvbXBvbmVudFxuICAgICAgICAgIGFuY2hvclZOb2RlLmVsIHx8IGFuY2hvclZOb2RlLnBsYWNlaG9sZGVyXG4gICAgICAgICkgOiBwYXJlbnRBbmNob3I7XG4gICAgICAgIGlmIChuZXdJbmRleFRvT2xkSW5kZXhNYXBbaV0gPT09IDApIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBuZXh0Q2hpbGQsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAobW92ZWQpIHtcbiAgICAgICAgICBpZiAoaiA8IDAgfHwgaSAhPT0gaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2Vbal0pIHtcbiAgICAgICAgICAgIG1vdmUobmV4dENoaWxkLCBjb250YWluZXIsIGFuY2hvciwgMik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdmUgPSAodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSwgcGFyZW50U3VzcGVuc2UgPSBudWxsKSA9PiB7XG4gICAgY29uc3QgeyBlbCwgdHlwZSwgdHJhbnNpdGlvbiwgY2hpbGRyZW4sIHNoYXBlRmxhZyB9ID0gdm5vZGU7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIG1vdmUodm5vZGUuY29tcG9uZW50LnN1YlRyZWUsIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgIHZub2RlLnN1c3BlbnNlLm1vdmUoY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICB0eXBlLm1vdmUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBpbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW92ZShjaGlsZHJlbltpXSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgIH1cbiAgICAgIGhvc3RJbnNlcnQodm5vZGUuYW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgIG1vdmVTdGF0aWNOb2RlKHZub2RlLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5lZWRUcmFuc2l0aW9uMiA9IG1vdmVUeXBlICE9PSAyICYmIHNoYXBlRmxhZyAmIDEgJiYgdHJhbnNpdGlvbjtcbiAgICBpZiAobmVlZFRyYW5zaXRpb24yKSB7XG4gICAgICBpZiAobW92ZVR5cGUgPT09IDApIHtcbiAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHRyYW5zaXRpb24uZW50ZXIoZWwpLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGxlYXZlLCBkZWxheUxlYXZlLCBhZnRlckxlYXZlIH0gPSB0cmFuc2l0aW9uO1xuICAgICAgICBjb25zdCByZW1vdmUyID0gKCkgPT4ge1xuICAgICAgICAgIGlmICh2bm9kZS5jdHguaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgIGhvc3RSZW1vdmUoZWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLl9pc0xlYXZpbmcpIHtcbiAgICAgICAgICAgIGVsW2xlYXZlQ2JLZXldKFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVhdmUoZWwsICgpID0+IHtcbiAgICAgICAgICAgIHJlbW92ZTIoKTtcbiAgICAgICAgICAgIGFmdGVyTGVhdmUgJiYgYWZ0ZXJMZWF2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgICAgICAgIGRlbGF5TGVhdmUoZWwsIHJlbW92ZTIsIHBlcmZvcm1MZWF2ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVyZm9ybUxlYXZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdW5tb3VudCA9ICh2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICByZWYsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgIHNoYXBlRmxhZyxcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIGRpcnMsXG4gICAgICBjYWNoZUluZGV4XG4gICAgfSA9IHZub2RlO1xuICAgIGlmIChwYXRjaEZsYWcgPT09IC0yKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBzZXRSZWYocmVmLCBudWxsLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUsIHRydWUpO1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgIH1cbiAgICBpZiAoY2FjaGVJbmRleCAhPSBudWxsKSB7XG4gICAgICBwYXJlbnRDb21wb25lbnQucmVuZGVyQ2FjaGVbY2FjaGVJbmRleF0gPSB2b2lkIDA7XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiAyNTYpIHtcbiAgICAgIHBhcmVudENvbXBvbmVudC5jdHguZGVhY3RpdmF0ZSh2bm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3VsZEludm9rZURpcnMgPSBzaGFwZUZsYWcgJiAxICYmIGRpcnM7XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlVm5vZGVIb29rID0gIWlzQXN5bmNXcmFwcGVyKHZub2RlKTtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVVbm1vdW50KSkge1xuICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICB1bm1vdW50Q29tcG9uZW50KHZub2RlLmNvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICB2bm9kZS5zdXNwZW5zZS51bm1vdW50KHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRJbnZva2VEaXJzKSB7XG4gICAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVVbm1vdW50XCIpO1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgIHZub2RlLnR5cGUucmVtb3ZlKFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY0NoaWxkcmVuICYmIC8vICM1MTU0XG4gICAgICAvLyB3aGVuIHYtb25jZSBpcyB1c2VkIGluc2lkZSBhIGJsb2NrLCBzZXRCbG9ja1RyYWNraW5nKC0xKSBtYXJrcyB0aGVcbiAgICAgIC8vIHBhcmVudCBibG9jayB3aXRoIGhhc09uY2U6IHRydWVcbiAgICAgIC8vIHNvIHRoYXQgaXQgZG9lc24ndCB0YWtlIHRoZSBmYXN0IHBhdGggZHVyaW5nIHVubW91bnQgLSBvdGhlcndpc2VcbiAgICAgIC8vIGNvbXBvbmVudHMgbmVzdGVkIGluIHYtb25jZSBhcmUgbmV2ZXIgdW5tb3VudGVkLlxuICAgICAgIWR5bmFtaWNDaGlsZHJlbi5oYXNPbmNlICYmIC8vICMxMTUzOiBmYXN0IHBhdGggc2hvdWxkIG5vdCBiZSB0YWtlbiBmb3Igbm9uLXN0YWJsZSAodi1mb3IpIGZyYWdtZW50c1xuICAgICAgKHR5cGUgIT09IEZyYWdtZW50IHx8IHBhdGNoRmxhZyA+IDAgJiYgcGF0Y2hGbGFnICYgNjQpKSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRnJhZ21lbnQgJiYgcGF0Y2hGbGFnICYgKDEyOCB8IDI1NikgfHwgIW9wdGltaXplZCAmJiBzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGRvUmVtb3ZlKSB7XG4gICAgICAgIHJlbW92ZSh2bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVVbm1vdW50ZWQpIHx8IHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgc2hvdWxkSW52b2tlRGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwidW5tb3VudGVkXCIpO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlID0gKHZub2RlKSA9PiB7XG4gICAgY29uc3QgeyB0eXBlLCBlbCwgYW5jaG9yLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBpZiAodHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLnBhdGNoRmxhZyA+IDAgJiYgdm5vZGUucGF0Y2hGbGFnICYgMjA0OCAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCkge1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSB7XG4gICAgICAgICAgICBob3N0UmVtb3ZlKGNoaWxkLmVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJhZ21lbnQoZWwsIGFuY2hvcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUodm5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwZXJmb3JtUmVtb3ZlID0gKCkgPT4ge1xuICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICBpZiAodHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQgJiYgdHJhbnNpdGlvbi5hZnRlckxlYXZlKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEgJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQpIHtcbiAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiBsZWF2ZShlbCwgcGVyZm9ybVJlbW92ZSk7XG4gICAgICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgICAgICBkZWxheUxlYXZlKHZub2RlLmVsLCBwZXJmb3JtUmVtb3ZlLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVyZm9ybUxlYXZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlcmZvcm1SZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlbW92ZUZyYWdtZW50ID0gKGN1ciwgZW5kKSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGN1ciAhPT0gZW5kKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGN1cik7XG4gICAgICBob3N0UmVtb3ZlKGN1cik7XG4gICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0UmVtb3ZlKGVuZCk7XG4gIH07XG4gIGNvbnN0IHVubW91bnRDb21wb25lbnQgPSAoaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGluc3RhbmNlLnR5cGUuX19obXJJZCkge1xuICAgICAgdW5yZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgYnVtLCBzY29wZSwgam9iLCBzdWJUcmVlLCB1bSwgbSwgYSB9ID0gaW5zdGFuY2U7XG4gICAgaW52YWxpZGF0ZU1vdW50KG0pO1xuICAgIGludmFsaWRhdGVNb3VudChhKTtcbiAgICBpZiAoYnVtKSB7XG4gICAgICBpbnZva2VBcnJheUZucyhidW0pO1xuICAgIH1cbiAgICBzY29wZS5zdG9wKCk7XG4gICAgaWYgKGpvYikge1xuICAgICAgam9iLmZsYWdzIHw9IDg7XG4gICAgICB1bm1vdW50KHN1YlRyZWUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH1cbiAgICBpZiAodW0pIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCh1bSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgaW5zdGFuY2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZChpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCB1bm1vdW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlID0gZmFsc2UsIG9wdGltaXplZCA9IGZhbHNlLCBzdGFydCA9IDApID0+IHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdW5tb3VudChjaGlsZHJlbltpXSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUsIG9wdGltaXplZCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBnZXROZXh0SG9zdE5vZGUgPSAodm5vZGUpID0+IHtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNikge1xuICAgICAgcmV0dXJuIGdldE5leHRIb3N0Tm9kZSh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSk7XG4gICAgfVxuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgIHJldHVybiB2bm9kZS5zdXNwZW5zZS5uZXh0KCk7XG4gICAgfVxuICAgIGNvbnN0IGVsID0gaG9zdE5leHRTaWJsaW5nKHZub2RlLmFuY2hvciB8fCB2bm9kZS5lbCk7XG4gICAgY29uc3QgdGVsZXBvcnRFbmQgPSBlbCAmJiBlbFtUZWxlcG9ydEVuZEtleV07XG4gICAgcmV0dXJuIHRlbGVwb3J0RW5kID8gaG9zdE5leHRTaWJsaW5nKHRlbGVwb3J0RW5kKSA6IGVsO1xuICB9O1xuICBsZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xuICBjb25zdCByZW5kZXIgPSAodm5vZGUsIGNvbnRhaW5lciwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKHZub2RlID09IG51bGwpIHtcbiAgICAgIGlmIChjb250YWluZXIuX3Zub2RlKSB7XG4gICAgICAgIHVubW91bnQoY29udGFpbmVyLl92bm9kZSwgbnVsbCwgbnVsbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBjb250YWluZXIuX3Zub2RlIHx8IG51bGwsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG5hbWVzcGFjZVxuICAgICAgKTtcbiAgICB9XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICAgIGlmICghaXNGbHVzaGluZykge1xuICAgICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgICBmbHVzaFByZUZsdXNoQ2JzKCk7XG4gICAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaW50ZXJuYWxzID0ge1xuICAgIHA6IHBhdGNoLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG06IG1vdmUsXG4gICAgcjogcmVtb3ZlLFxuICAgIG10OiBtb3VudENvbXBvbmVudCxcbiAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICBwYzogcGF0Y2hDaGlsZHJlbixcbiAgICBwYmM6IHBhdGNoQmxvY2tDaGlsZHJlbixcbiAgICBuOiBnZXROZXh0SG9zdE5vZGUsXG4gICAgbzogb3B0aW9uc1xuICB9O1xuICBsZXQgaHlkcmF0ZTtcbiAgbGV0IGh5ZHJhdGVOb2RlO1xuICBpZiAoY3JlYXRlSHlkcmF0aW9uRm5zKSB7XG4gICAgW2h5ZHJhdGUsIGh5ZHJhdGVOb2RlXSA9IGNyZWF0ZUh5ZHJhdGlvbkZucyhcbiAgICAgIGludGVybmFsc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW5kZXIsXG4gICAgaHlkcmF0ZSxcbiAgICBjcmVhdGVBcHA6IGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2UoeyB0eXBlLCBwcm9wcyB9LCBjdXJyZW50TmFtZXNwYWNlKSB7XG4gIHJldHVybiBjdXJyZW50TmFtZXNwYWNlID09PSBcInN2Z1wiICYmIHR5cGUgPT09IFwiZm9yZWlnbk9iamVjdFwiIHx8IGN1cnJlbnROYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgJiYgdHlwZSA9PT0gXCJhbm5vdGF0aW9uLXhtbFwiICYmIHByb3BzICYmIHByb3BzLmVuY29kaW5nICYmIHByb3BzLmVuY29kaW5nLmluY2x1ZGVzKFwiaHRtbFwiKSA/IHZvaWQgMCA6IGN1cnJlbnROYW1lc3BhY2U7XG59XG5mdW5jdGlvbiB0b2dnbGVSZWN1cnNlKHsgZWZmZWN0LCBqb2IgfSwgYWxsb3dlZCkge1xuICBpZiAoYWxsb3dlZCkge1xuICAgIGVmZmVjdC5mbGFncyB8PSAzMjtcbiAgICBqb2IuZmxhZ3MgfD0gNDtcbiAgfSBlbHNlIHtcbiAgICBlZmZlY3QuZmxhZ3MgJj0gLTMzO1xuICAgIGpvYi5mbGFncyAmPSAtNTtcbiAgfVxufVxuZnVuY3Rpb24gbmVlZFRyYW5zaXRpb24ocGFyZW50U3VzcGVuc2UsIHRyYW5zaXRpb24pIHtcbiAgcmV0dXJuICghcGFyZW50U3VzcGVuc2UgfHwgcGFyZW50U3VzcGVuc2UgJiYgIXBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpICYmIHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkO1xufVxuZnVuY3Rpb24gdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHNoYWxsb3cgPSBmYWxzZSkge1xuICBjb25zdCBjaDEgPSBuMS5jaGlsZHJlbjtcbiAgY29uc3QgY2gyID0gbjIuY2hpbGRyZW47XG4gIGlmIChpc0FycmF5KGNoMSkgJiYgaXNBcnJheShjaDIpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaDEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGMxID0gY2gxW2ldO1xuICAgICAgbGV0IGMyID0gY2gyW2ldO1xuICAgICAgaWYgKGMyLnNoYXBlRmxhZyAmIDEgJiYgIWMyLmR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBpZiAoYzIucGF0Y2hGbGFnIDw9IDAgfHwgYzIucGF0Y2hGbGFnID09PSAzMikge1xuICAgICAgICAgIGMyID0gY2gyW2ldID0gY2xvbmVJZk1vdW50ZWQoY2gyW2ldKTtcbiAgICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2hhbGxvdyAmJiBjMi5wYXRjaEZsYWcgIT09IC0yKVxuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oYzEsIGMyKTtcbiAgICAgIH1cbiAgICAgIGlmIChjMi50eXBlID09PSBUZXh0ICYmIC8vIGF2b2lkIGNhY2hlZCB0ZXh0IG5vZGVzIHJldGFpbmluZyBkZXRhY2hlZCBkb20gbm9kZXNcbiAgICAgIGMyLnBhdGNoRmxhZyAhPT0gLTEpIHtcbiAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgIH1cbiAgICAgIGlmIChjMi50eXBlID09PSBDb21tZW50ICYmICFjMi5lbCkge1xuICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgYzIuZWwgJiYgKGMyLmVsLl9fdm5vZGUgPSBjMik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRTZXF1ZW5jZShhcnIpIHtcbiAgY29uc3QgcCA9IGFyci5zbGljZSgpO1xuICBjb25zdCByZXN1bHQgPSBbMF07XG4gIGxldCBpLCBqLCB1LCB2LCBjO1xuICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBhcnJJID0gYXJyW2ldO1xuICAgIGlmIChhcnJJICE9PSAwKSB7XG4gICAgICBqID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChhcnJbal0gPCBhcnJJKSB7XG4gICAgICAgIHBbaV0gPSBqO1xuICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1ID0gMDtcbiAgICAgIHYgPSByZXN1bHQubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlICh1IDwgdikge1xuICAgICAgICBjID0gdSArIHYgPj4gMTtcbiAgICAgICAgaWYgKGFycltyZXN1bHRbY11dIDwgYXJySSkge1xuICAgICAgICAgIHUgPSBjICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFyckkgPCBhcnJbcmVzdWx0W3VdXSkge1xuICAgICAgICBpZiAodSA+IDApIHtcbiAgICAgICAgICBwW2ldID0gcmVzdWx0W3UgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbdV0gPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1ID0gcmVzdWx0Lmxlbmd0aDtcbiAgdiA9IHJlc3VsdFt1IC0gMV07XG4gIHdoaWxlICh1LS0gPiAwKSB7XG4gICAgcmVzdWx0W3VdID0gdjtcbiAgICB2ID0gcFt2XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbG9jYXRlTm9uSHlkcmF0ZWRBc3luY1Jvb3QoaW5zdGFuY2UpIHtcbiAgY29uc3Qgc3ViQ29tcG9uZW50ID0gaW5zdGFuY2Uuc3ViVHJlZS5jb21wb25lbnQ7XG4gIGlmIChzdWJDb21wb25lbnQpIHtcbiAgICBpZiAoc3ViQ29tcG9uZW50LmFzeW5jRGVwICYmICFzdWJDb21wb25lbnQuYXN5bmNSZXNvbHZlZCkge1xuICAgICAgcmV0dXJuIHN1YkNvbXBvbmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KHN1YkNvbXBvbmVudCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlTW91bnQoaG9va3MpIHtcbiAgaWYgKGhvb2tzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKylcbiAgICAgIGhvb2tzW2ldLmZsYWdzIHw9IDg7XG4gIH1cbn1cblxuY29uc3Qgc3NyQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoXCJ2LXNjeFwiKTtcbmNvbnN0IHVzZVNTUkNvbnRleHQgPSAoKSA9PiB7XG4gIHtcbiAgICBjb25zdCBjdHggPSBpbmplY3Qoc3NyQ29udGV4dEtleSk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgU2VydmVyIHJlbmRlcmluZyBjb250ZXh0IG5vdCBwcm92aWRlZC4gTWFrZSBzdXJlIHRvIG9ubHkgY2FsbCB1c2VTU1JDb250ZXh0KCkgY29uZGl0aW9uYWxseSBpbiB0aGUgc2VydmVyIGJ1aWxkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjdHg7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHdhdGNoRWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChlZmZlY3QsIG51bGwsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gd2F0Y2hQb3N0RWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChcbiAgICBlZmZlY3QsXG4gICAgbnVsbCxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gZXh0ZW5kKHt9LCBvcHRpb25zLCB7IGZsdXNoOiBcInBvc3RcIiB9KSA6IHsgZmx1c2g6IFwicG9zdFwiIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIHdhdGNoU3luY0VmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goXG4gICAgZWZmZWN0LFxuICAgIG51bGwsXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGV4dGVuZCh7fSwgb3B0aW9ucywgeyBmbHVzaDogXCJzeW5jXCIgfSkgOiB7IGZsdXNoOiBcInN5bmNcIiB9XG4gICk7XG59XG5mdW5jdGlvbiB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBcXGB3YXRjaChmbiwgb3B0aW9ucz8pXFxgIHNpZ25hdHVyZSBoYXMgYmVlbiBtb3ZlZCB0byBhIHNlcGFyYXRlIEFQSS4gVXNlIFxcYHdhdGNoRWZmZWN0KGZuLCBvcHRpb25zPylcXGAgaW5zdGVhZC4gXFxgd2F0Y2hcXGAgbm93IG9ubHkgc3VwcG9ydHMgXFxgd2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZG9XYXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGRvV2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucyA9IEVNUFRZX09CSikge1xuICBjb25zdCB7IGltbWVkaWF0ZSwgZGVlcCwgZmx1c2gsIG9uY2UgfSA9IG9wdGlvbnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFjYikge1xuICAgIGlmIChpbW1lZGlhdGUgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcImltbWVkaWF0ZVwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkZWVwICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJkZWVwXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9uY2UgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcIm9uY2VcIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb25zdCBiYXNlV2F0Y2hPcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIGJhc2VXYXRjaE9wdGlvbnMub25XYXJuID0gd2FybiQxO1xuICBjb25zdCBydW5zSW1tZWRpYXRlbHkgPSBjYiAmJiBpbW1lZGlhdGUgfHwgIWNiICYmIGZsdXNoICE9PSBcInBvc3RcIjtcbiAgbGV0IHNzckNsZWFudXA7XG4gIGlmIChpc0luU1NSQ29tcG9uZW50U2V0dXApIHtcbiAgICBpZiAoZmx1c2ggPT09IFwic3luY1wiKSB7XG4gICAgICBjb25zdCBjdHggPSB1c2VTU1JDb250ZXh0KCk7XG4gICAgICBzc3JDbGVhbnVwID0gY3R4Ll9fd2F0Y2hlckhhbmRsZXMgfHwgKGN0eC5fX3dhdGNoZXJIYW5kbGVzID0gW10pO1xuICAgIH0gZWxzZSBpZiAoIXJ1bnNJbW1lZGlhdGVseSkge1xuICAgICAgY29uc3Qgd2F0Y2hTdG9wSGFuZGxlID0gKCkgPT4ge1xuICAgICAgfTtcbiAgICAgIHdhdGNoU3RvcEhhbmRsZS5zdG9wID0gTk9PUDtcbiAgICAgIHdhdGNoU3RvcEhhbmRsZS5yZXN1bWUgPSBOT09QO1xuICAgICAgd2F0Y2hTdG9wSGFuZGxlLnBhdXNlID0gTk9PUDtcbiAgICAgIHJldHVybiB3YXRjaFN0b3BIYW5kbGU7XG4gICAgfVxuICB9XG4gIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlO1xuICBiYXNlV2F0Y2hPcHRpb25zLmNhbGwgPSAoZm4sIHR5cGUsIGFyZ3MpID0+IGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncyk7XG4gIGxldCBpc1ByZSA9IGZhbHNlO1xuICBpZiAoZmx1c2ggPT09IFwicG9zdFwiKSB7XG4gICAgYmFzZVdhdGNoT3B0aW9ucy5zY2hlZHVsZXIgPSAoam9iKSA9PiB7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3Qoam9iLCBpbnN0YW5jZSAmJiBpbnN0YW5jZS5zdXNwZW5zZSk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChmbHVzaCAhPT0gXCJzeW5jXCIpIHtcbiAgICBpc1ByZSA9IHRydWU7XG4gICAgYmFzZVdhdGNoT3B0aW9ucy5zY2hlZHVsZXIgPSAoam9iLCBpc0ZpcnN0UnVuKSA9PiB7XG4gICAgICBpZiAoaXNGaXJzdFJ1bikge1xuICAgICAgICBqb2IoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSm9iKGpvYik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBiYXNlV2F0Y2hPcHRpb25zLmF1Z21lbnRKb2IgPSAoam9iKSA9PiB7XG4gICAgaWYgKGNiKSB7XG4gICAgICBqb2IuZmxhZ3MgfD0gNDtcbiAgICB9XG4gICAgaWYgKGlzUHJlKSB7XG4gICAgICBqb2IuZmxhZ3MgfD0gMjtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBqb2IuaWQgPSBpbnN0YW5jZS51aWQ7XG4gICAgICAgIGpvYi5pID0gaW5zdGFuY2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCB3YXRjaEhhbmRsZSA9IHdhdGNoJDEoc291cmNlLCBjYiwgYmFzZVdhdGNoT3B0aW9ucyk7XG4gIGlmIChpc0luU1NSQ29tcG9uZW50U2V0dXApIHtcbiAgICBpZiAoc3NyQ2xlYW51cCkge1xuICAgICAgc3NyQ2xlYW51cC5wdXNoKHdhdGNoSGFuZGxlKTtcbiAgICB9IGVsc2UgaWYgKHJ1bnNJbW1lZGlhdGVseSkge1xuICAgICAgd2F0Y2hIYW5kbGUoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdhdGNoSGFuZGxlO1xufVxuZnVuY3Rpb24gaW5zdGFuY2VXYXRjaChzb3VyY2UsIHZhbHVlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSB0aGlzLnByb3h5O1xuICBjb25zdCBnZXR0ZXIgPSBpc1N0cmluZyhzb3VyY2UpID8gc291cmNlLmluY2x1ZGVzKFwiLlwiKSA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywgc291cmNlKSA6ICgpID0+IHB1YmxpY1RoaXNbc291cmNlXSA6IHNvdXJjZS5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICBsZXQgY2I7XG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIGNiID0gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY2IgPSB2YWx1ZS5oYW5kbGVyO1xuICAgIG9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZSh0aGlzKTtcbiAgY29uc3QgcmVzID0gZG9XYXRjaChnZXR0ZXIsIGNiLmJpbmQocHVibGljVGhpcyksIG9wdGlvbnMpO1xuICByZXNldCgpO1xuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY3JlYXRlUGF0aEdldHRlcihjdHgsIHBhdGgpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsZXQgY3VyID0gY3R4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoICYmIGN1cjsgaSsrKSB7XG4gICAgICBjdXIgPSBjdXJbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gY3VyO1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VNb2RlbChwcm9wcywgbmFtZSwgb3B0aW9ucyA9IEVNUFRZX09CSikge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpKSB7XG4gICAgd2FybiQxKGB1c2VNb2RlbCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS5gKTtcbiAgICByZXR1cm4gcmVmKCk7XG4gIH1cbiAgY29uc3QgY2FtZWxpemVkTmFtZSA9IGNhbWVsaXplKG5hbWUpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaS5wcm9wc09wdGlvbnNbMF1bY2FtZWxpemVkTmFtZV0pIHtcbiAgICB3YXJuJDEoYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGggcHJvcCBcIiR7bmFtZX1cIiB3aGljaCBpcyBub3QgZGVjbGFyZWQuYCk7XG4gICAgcmV0dXJuIHJlZigpO1xuICB9XG4gIGNvbnN0IGh5cGhlbmF0ZWROYW1lID0gaHlwaGVuYXRlKG5hbWUpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RlbE1vZGlmaWVycyhwcm9wcywgY2FtZWxpemVkTmFtZSk7XG4gIGNvbnN0IHJlcyA9IGN1c3RvbVJlZigodHJhY2ssIHRyaWdnZXIpID0+IHtcbiAgICBsZXQgbG9jYWxWYWx1ZTtcbiAgICBsZXQgcHJldlNldFZhbHVlID0gRU1QVFlfT0JKO1xuICAgIGxldCBwcmV2RW1pdHRlZFZhbHVlO1xuICAgIHdhdGNoU3luY0VmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1tjYW1lbGl6ZWROYW1lXTtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKGxvY2FsVmFsdWUsIHByb3BWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxWYWx1ZSA9IHByb3BWYWx1ZTtcbiAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHRyYWNrKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmdldCA/IG9wdGlvbnMuZ2V0KGxvY2FsVmFsdWUpIDogbG9jYWxWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZW1pdHRlZFZhbHVlID0gb3B0aW9ucy5zZXQgPyBvcHRpb25zLnNldCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgaWYgKCFoYXNDaGFuZ2VkKGVtaXR0ZWRWYWx1ZSwgbG9jYWxWYWx1ZSkgJiYgIShwcmV2U2V0VmFsdWUgIT09IEVNUFRZX09CSiAmJiBoYXNDaGFuZ2VkKHZhbHVlLCBwcmV2U2V0VmFsdWUpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYXdQcm9wcyA9IGkudm5vZGUucHJvcHM7XG4gICAgICAgIGlmICghKHJhd1Byb3BzICYmIC8vIGNoZWNrIGlmIHBhcmVudCBoYXMgcGFzc2VkIHYtbW9kZWxcbiAgICAgICAgKG5hbWUgaW4gcmF3UHJvcHMgfHwgY2FtZWxpemVkTmFtZSBpbiByYXdQcm9wcyB8fCBoeXBoZW5hdGVkTmFtZSBpbiByYXdQcm9wcykgJiYgKGBvblVwZGF0ZToke25hbWV9YCBpbiByYXdQcm9wcyB8fCBgb25VcGRhdGU6JHtjYW1lbGl6ZWROYW1lfWAgaW4gcmF3UHJvcHMgfHwgYG9uVXBkYXRlOiR7aHlwaGVuYXRlZE5hbWV9YCBpbiByYXdQcm9wcykpKSB7XG4gICAgICAgICAgbG9jYWxWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRyaWdnZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpLmVtaXQoYHVwZGF0ZToke25hbWV9YCwgZW1pdHRlZFZhbHVlKTtcbiAgICAgICAgaWYgKGhhc0NoYW5nZWQodmFsdWUsIGVtaXR0ZWRWYWx1ZSkgJiYgaGFzQ2hhbmdlZCh2YWx1ZSwgcHJldlNldFZhbHVlKSAmJiAhaGFzQ2hhbmdlZChlbWl0dGVkVmFsdWUsIHByZXZFbWl0dGVkVmFsdWUpKSB7XG4gICAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgICB9XG4gICAgICAgIHByZXZTZXRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBwcmV2RW1pdHRlZFZhbHVlID0gZW1pdHRlZFZhbHVlO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICByZXNbU3ltYm9sLml0ZXJhdG9yXSA9ICgpID0+IHtcbiAgICBsZXQgaTIgPSAwO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCkge1xuICAgICAgICBpZiAoaTIgPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGkyKysgPyBtb2RpZmllcnMgfHwgRU1QVFlfT0JKIDogcmVzLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG4gIHJldHVybiByZXM7XG59XG5jb25zdCBnZXRNb2RlbE1vZGlmaWVycyA9IChwcm9wcywgbW9kZWxOYW1lKSA9PiB7XG4gIHJldHVybiBtb2RlbE5hbWUgPT09IFwibW9kZWxWYWx1ZVwiIHx8IG1vZGVsTmFtZSA9PT0gXCJtb2RlbC12YWx1ZVwiID8gcHJvcHMubW9kZWxNb2RpZmllcnMgOiBwcm9wc1tgJHttb2RlbE5hbWV9TW9kaWZpZXJzYF0gfHwgcHJvcHNbYCR7Y2FtZWxpemUobW9kZWxOYW1lKX1Nb2RpZmllcnNgXSB8fCBwcm9wc1tgJHtoeXBoZW5hdGUobW9kZWxOYW1lKX1Nb2RpZmllcnNgXTtcbn07XG5cbmZ1bmN0aW9uIGVtaXQoaW5zdGFuY2UsIGV2ZW50LCAuLi5yYXdBcmdzKSB7XG4gIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZCkgcmV0dXJuO1xuICBjb25zdCBwcm9wcyA9IGluc3RhbmNlLnZub2RlLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCB7XG4gICAgICBlbWl0c09wdGlvbnMsXG4gICAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdXG4gICAgfSA9IGluc3RhbmNlO1xuICAgIGlmIChlbWl0c09wdGlvbnMpIHtcbiAgICAgIGlmICghKGV2ZW50IGluIGVtaXRzT3B0aW9ucykgJiYgdHJ1ZSkge1xuICAgICAgICBpZiAoIXByb3BzT3B0aW9ucyB8fCAhKHRvSGFuZGxlcktleShjYW1lbGl6ZShldmVudCkpIGluIHByb3BzT3B0aW9ucykpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQ29tcG9uZW50IGVtaXR0ZWQgZXZlbnQgXCIke2V2ZW50fVwiIGJ1dCBpdCBpcyBuZWl0aGVyIGRlY2xhcmVkIGluIHRoZSBlbWl0cyBvcHRpb24gbm9yIGFzIGFuIFwiJHt0b0hhbmRsZXJLZXkoY2FtZWxpemUoZXZlbnQpKX1cIiBwcm9wLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBlbWl0c09wdGlvbnNbZXZlbnRdO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWxpZGF0b3IpKSB7XG4gICAgICAgICAgY29uc3QgaXNWYWxpZCA9IHZhbGlkYXRvciguLi5yYXdBcmdzKTtcbiAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEludmFsaWQgZXZlbnQgYXJndW1lbnRzOiBldmVudCB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgZXZlbnQgXCIke2V2ZW50fVwiLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxldCBhcmdzID0gcmF3QXJncztcbiAgY29uc3QgaXNNb2RlbExpc3RlbmVyID0gZXZlbnQuc3RhcnRzV2l0aChcInVwZGF0ZTpcIik7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGlzTW9kZWxMaXN0ZW5lciAmJiBnZXRNb2RlbE1vZGlmaWVycyhwcm9wcywgZXZlbnQuc2xpY2UoNykpO1xuICBpZiAobW9kaWZpZXJzKSB7XG4gICAgaWYgKG1vZGlmaWVycy50cmltKSB7XG4gICAgICBhcmdzID0gcmF3QXJncy5tYXAoKGEpID0+IGlzU3RyaW5nKGEpID8gYS50cmltKCkgOiBhKTtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVycy5udW1iZXIpIHtcbiAgICAgIGFyZ3MgPSByYXdBcmdzLm1hcChsb29zZVRvTnVtYmVyKTtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgZGV2dG9vbHNDb21wb25lbnRFbWl0KGluc3RhbmNlLCBldmVudCwgYXJncyk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBsb3dlckNhc2VFdmVudCA9IGV2ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyQ2FzZUV2ZW50ICE9PSBldmVudCAmJiBwcm9wc1t0b0hhbmRsZXJLZXkobG93ZXJDYXNlRXZlbnQpXSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgRXZlbnQgXCIke2xvd2VyQ2FzZUV2ZW50fVwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBpbnN0YW5jZS50eXBlXG4gICAgICAgICl9IGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciBcIiR7ZXZlbnR9XCIuIE5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIHYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcIiR7aHlwaGVuYXRlKFxuICAgICAgICAgIGV2ZW50XG4gICAgICAgICl9XCIgaW5zdGVhZCBvZiBcIiR7ZXZlbnR9XCIuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbGV0IGhhbmRsZXJOYW1lO1xuICBsZXQgaGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGV2ZW50KV0gfHwgLy8gYWxzbyB0cnkgY2FtZWxDYXNlIGV2ZW50IGhhbmRsZXIgKCMyMjQ5KVxuICBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShjYW1lbGl6ZShldmVudCkpXTtcbiAgaWYgKCFoYW5kbGVyICYmIGlzTW9kZWxMaXN0ZW5lcikge1xuICAgIGhhbmRsZXIgPSBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShoeXBoZW5hdGUoZXZlbnQpKV07XG4gIH1cbiAgaWYgKGhhbmRsZXIpIHtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIGhhbmRsZXIsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDYsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgfVxuICBjb25zdCBvbmNlSGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lICsgYE9uY2VgXTtcbiAgaWYgKG9uY2VIYW5kbGVyKSB7XG4gICAgaWYgKCFpbnN0YW5jZS5lbWl0dGVkKSB7XG4gICAgICBpbnN0YW5jZS5lbWl0dGVkID0ge307XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSA9IHRydWU7XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBvbmNlSGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNixcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVFbWl0c09wdGlvbnMoY29tcCwgYXBwQ29udGV4dCwgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGNhY2hlID0gYXBwQ29udGV4dC5lbWl0c0NhY2hlO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoY29tcCk7XG4gIGlmIChjYWNoZWQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmF3ID0gY29tcC5lbWl0cztcbiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTtcbiAgbGV0IGhhc0V4dGVuZHMgPSBmYWxzZTtcbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICBjb25zdCBleHRlbmRFbWl0cyA9IChyYXcyKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRnJvbUV4dGVuZCA9IG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhyYXcyLCBhcHBDb250ZXh0LCB0cnVlKTtcbiAgICAgIGlmIChub3JtYWxpemVkRnJvbUV4dGVuZCkge1xuICAgICAgICBoYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICAgICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIG5vcm1hbGl6ZWRGcm9tRXh0ZW5kKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghYXNNaXhpbiAmJiBhcHBDb250ZXh0Lm1peGlucy5sZW5ndGgpIHtcbiAgICAgIGFwcENvbnRleHQubWl4aW5zLmZvckVhY2goZXh0ZW5kRW1pdHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5leHRlbmRzKSB7XG4gICAgICBleHRlbmRFbWl0cyhjb21wLmV4dGVuZHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5taXhpbnMpIHtcbiAgICAgIGNvbXAubWl4aW5zLmZvckVhY2goZXh0ZW5kRW1pdHMpO1xuICAgIH1cbiAgfVxuICBpZiAoIXJhdyAmJiAhaGFzRXh0ZW5kcykge1xuICAgIGlmIChpc09iamVjdChjb21wKSkge1xuICAgICAgY2FjaGUuc2V0KGNvbXAsIG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgcmF3LmZvckVhY2goKGtleSkgPT4gbm9ybWFsaXplZFtrZXldID0gbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIHJhdyk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgY2FjaGUuc2V0KGNvbXAsIG5vcm1hbGl6ZWQpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuZnVuY3Rpb24gaXNFbWl0TGlzdGVuZXIob3B0aW9ucywga2V5KSB7XG4gIGlmICghb3B0aW9ucyB8fCAhaXNPbihrZXkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGtleSA9IGtleS5zbGljZSgyKS5yZXBsYWNlKC9PbmNlJC8sIFwiXCIpO1xuICByZXR1cm4gaGFzT3duKG9wdGlvbnMsIGtleVswXS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDEpKSB8fCBoYXNPd24ob3B0aW9ucywgaHlwaGVuYXRlKGtleSkpIHx8IGhhc093bihvcHRpb25zLCBrZXkpO1xufVxuXG5sZXQgYWNjZXNzZWRBdHRycyA9IGZhbHNlO1xuZnVuY3Rpb24gbWFya0F0dHJzQWNjZXNzZWQoKSB7XG4gIGFjY2Vzc2VkQXR0cnMgPSB0cnVlO1xufVxuZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSkge1xuICBjb25zdCB7XG4gICAgdHlwZTogQ29tcG9uZW50LFxuICAgIHZub2RlLFxuICAgIHByb3h5LFxuICAgIHdpdGhQcm94eSxcbiAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdLFxuICAgIHNsb3RzLFxuICAgIGF0dHJzLFxuICAgIGVtaXQsXG4gICAgcmVuZGVyLFxuICAgIHJlbmRlckNhY2hlLFxuICAgIHByb3BzLFxuICAgIGRhdGEsXG4gICAgc2V0dXBTdGF0ZSxcbiAgICBjdHgsXG4gICAgaW5oZXJpdEF0dHJzXG4gIH0gPSBpbnN0YW5jZTtcbiAgY29uc3QgcHJldiA9IHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShpbnN0YW5jZSk7XG4gIGxldCByZXN1bHQ7XG4gIGxldCBmYWxsdGhyb3VnaEF0dHJzO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFjY2Vzc2VkQXR0cnMgPSBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA0KSB7XG4gICAgICBjb25zdCBwcm94eVRvVXNlID0gd2l0aFByb3h5IHx8IHByb3h5O1xuICAgICAgY29uc3QgdGhpc1Byb3h5ID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCA/IG5ldyBQcm94eShwcm94eVRvVXNlLCB7XG4gICAgICAgIGdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgUHJvcGVydHkgJyR7U3RyaW5nKFxuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICl9JyB3YXMgYWNjZXNzZWQgdmlhICd0aGlzJy4gQXZvaWQgdXNpbmcgJ3RoaXMnIGluIHRlbXBsYXRlcy5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKTtcbiAgICAgICAgfVxuICAgICAgfSkgOiBwcm94eVRvVXNlO1xuICAgICAgcmVzdWx0ID0gbm9ybWFsaXplVk5vZGUoXG4gICAgICAgIHJlbmRlci5jYWxsKFxuICAgICAgICAgIHRoaXNQcm94eSxcbiAgICAgICAgICBwcm94eVRvVXNlLFxuICAgICAgICAgIHJlbmRlckNhY2hlLFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocHJvcHMpIDogcHJvcHMsXG4gICAgICAgICAgc2V0dXBTdGF0ZSxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGN0eFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZmFsbHRocm91Z2hBdHRycyA9IGF0dHJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZW5kZXIyID0gQ29tcG9uZW50O1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgYXR0cnMgPT09IHByb3BzKSB7XG4gICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBub3JtYWxpemVWTm9kZShcbiAgICAgICAgcmVuZGVyMi5sZW5ndGggPiAxID8gcmVuZGVyMihcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KHByb3BzKSA6IHByb3BzLFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICAgICAgICAgIHJldHVybiBzaGFsbG93UmVhZG9ubHkoYXR0cnMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNsb3RzLFxuICAgICAgICAgICAgZW1pdFxuICAgICAgICAgIH0gOiB7IGF0dHJzLCBzbG90cywgZW1pdCB9XG4gICAgICAgICkgOiByZW5kZXIyKFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocHJvcHMpIDogcHJvcHMsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZmFsbHRocm91Z2hBdHRycyA9IENvbXBvbmVudC5wcm9wcyA/IGF0dHJzIDogZ2V0RnVuY3Rpb25hbEZhbGx0aHJvdWdoKGF0dHJzKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGJsb2NrU3RhY2subGVuZ3RoID0gMDtcbiAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCAxKTtcbiAgICByZXN1bHQgPSBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgfVxuICBsZXQgcm9vdCA9IHJlc3VsdDtcbiAgbGV0IHNldFJvb3QgPSB2b2lkIDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHJlc3VsdC5wYXRjaEZsYWcgPiAwICYmIHJlc3VsdC5wYXRjaEZsYWcgJiAyMDQ4KSB7XG4gICAgW3Jvb3QsIHNldFJvb3RdID0gZ2V0Q2hpbGRSb290KHJlc3VsdCk7XG4gIH1cbiAgaWYgKGZhbGx0aHJvdWdoQXR0cnMgJiYgaW5oZXJpdEF0dHJzICE9PSBmYWxzZSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmYWxsdGhyb3VnaEF0dHJzKTtcbiAgICBjb25zdCB7IHNoYXBlRmxhZyB9ID0gcm9vdDtcbiAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgIGlmIChzaGFwZUZsYWcgJiAoMSB8IDYpKSB7XG4gICAgICAgIGlmIChwcm9wc09wdGlvbnMgJiYga2V5cy5zb21lKGlzTW9kZWxMaXN0ZW5lcikpIHtcbiAgICAgICAgICBmYWxsdGhyb3VnaEF0dHJzID0gZmlsdGVyTW9kZWxMaXN0ZW5lcnMoXG4gICAgICAgICAgICBmYWxsdGhyb3VnaEF0dHJzLFxuICAgICAgICAgICAgcHJvcHNPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByb290ID0gY2xvbmVWTm9kZShyb290LCBmYWxsdGhyb3VnaEF0dHJzLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWFjY2Vzc2VkQXR0cnMgJiYgcm9vdC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgIGNvbnN0IGFsbEF0dHJzID0gT2JqZWN0LmtleXMoYXR0cnMpO1xuICAgICAgICBjb25zdCBldmVudEF0dHJzID0gW107XG4gICAgICAgIGNvbnN0IGV4dHJhQXR0cnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhbGxBdHRycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBhbGxBdHRyc1tpXTtcbiAgICAgICAgICBpZiAoaXNPbihrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpKSB7XG4gICAgICAgICAgICAgIGV2ZW50QXR0cnMucHVzaChrZXlbMl0udG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4dHJhQXR0cnMucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmFBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgRXh0cmFuZW91cyBub24tcHJvcHMgYXR0cmlidXRlcyAoJHtleHRyYUF0dHJzLmpvaW4oXCIsIFwiKX0pIHdlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCBvciB0ZWxlcG9ydCByb290IG5vZGVzLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudEF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBFeHRyYW5lb3VzIG5vbi1lbWl0cyBldmVudCBsaXN0ZW5lcnMgKCR7ZXZlbnRBdHRycy5qb2luKFwiLCBcIil9KSB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy4gSWYgdGhlIGxpc3RlbmVyIGlzIGludGVuZGVkIHRvIGJlIGEgY29tcG9uZW50IGN1c3RvbSBldmVudCBsaXN0ZW5lciBvbmx5LCBkZWNsYXJlIGl0IHVzaW5nIHRoZSBcImVtaXRzXCIgb3B0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh2bm9kZS5kaXJzKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzRWxlbWVudFJvb3Qocm9vdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFJ1bnRpbWUgZGlyZWN0aXZlIHVzZWQgb24gY29tcG9uZW50IHdpdGggbm9uLWVsZW1lbnQgcm9vdCBub2RlLiBUaGUgZGlyZWN0aXZlcyB3aWxsIG5vdCBmdW5jdGlvbiBhcyBpbnRlbmRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290ID0gY2xvbmVWTm9kZShyb290LCBudWxsLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcm9vdC5kaXJzID0gcm9vdC5kaXJzID8gcm9vdC5kaXJzLmNvbmNhdCh2bm9kZS5kaXJzKSA6IHZub2RlLmRpcnM7XG4gIH1cbiAgaWYgKHZub2RlLnRyYW5zaXRpb24pIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNFbGVtZW50Um9vdChyb290KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgQ29tcG9uZW50IGluc2lkZSA8VHJhbnNpdGlvbj4gcmVuZGVycyBub24tZWxlbWVudCByb290IG5vZGUgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgc2V0VHJhbnNpdGlvbkhvb2tzKHJvb3QsIHZub2RlLnRyYW5zaXRpb24pO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldFJvb3QpIHtcbiAgICBzZXRSb290KHJvb3QpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHJvb3Q7XG4gIH1cbiAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKHByZXYpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgZ2V0Q2hpbGRSb290ID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IHJhd0NoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gIGNvbnN0IGR5bmFtaWNDaGlsZHJlbiA9IHZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgY29uc3QgY2hpbGRSb290ID0gZmlsdGVyU2luZ2xlUm9vdChyYXdDaGlsZHJlbiwgZmFsc2UpO1xuICBpZiAoIWNoaWxkUm9vdCkge1xuICAgIHJldHVybiBbdm5vZGUsIHZvaWQgMF07XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGlsZFJvb3QucGF0Y2hGbGFnID4gMCAmJiBjaGlsZFJvb3QucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgIHJldHVybiBnZXRDaGlsZFJvb3QoY2hpbGRSb290KTtcbiAgfVxuICBjb25zdCBpbmRleCA9IHJhd0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KTtcbiAgY29uc3QgZHluYW1pY0luZGV4ID0gZHluYW1pY0NoaWxkcmVuID8gZHluYW1pY0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KSA6IC0xO1xuICBjb25zdCBzZXRSb290ID0gKHVwZGF0ZWRSb290KSA9PiB7XG4gICAgcmF3Q2hpbGRyZW5baW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgaWYgKGR5bmFtaWNJbmRleCA+IC0xKSB7XG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbltkeW5hbWljSW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRSb290LnBhdGNoRmxhZyA+IDApIHtcbiAgICAgICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gWy4uLmR5bmFtaWNDaGlsZHJlbiwgdXBkYXRlZFJvb3RdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIFtub3JtYWxpemVWTm9kZShjaGlsZFJvb3QpLCBzZXRSb290XTtcbn07XG5mdW5jdGlvbiBmaWx0ZXJTaW5nbGVSb290KGNoaWxkcmVuLCByZWN1cnNlID0gdHJ1ZSkge1xuICBsZXQgc2luZ2xlUm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAhPT0gQ29tbWVudCB8fCBjaGlsZC5jaGlsZHJlbiA9PT0gXCJ2LWlmXCIpIHtcbiAgICAgICAgaWYgKHNpbmdsZVJvb3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2luZ2xlUm9vdCA9IGNoaWxkO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHJlY3Vyc2UgJiYgc2luZ2xlUm9vdC5wYXRjaEZsYWcgPiAwICYmIHNpbmdsZVJvb3QucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclNpbmdsZVJvb3Qoc2luZ2xlUm9vdC5jaGlsZHJlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpbmdsZVJvb3Q7XG59XG5jb25zdCBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2ggPSAoYXR0cnMpID0+IHtcbiAgbGV0IHJlcztcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIgfHwga2V5ID09PSBcInN0eWxlXCIgfHwgaXNPbihrZXkpKSB7XG4gICAgICAocmVzIHx8IChyZXMgPSB7fSkpW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGZpbHRlck1vZGVsTGlzdGVuZXJzID0gKGF0dHJzLCBwcm9wcykgPT4ge1xuICBjb25zdCByZXMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpIHx8ICEoa2V5LnNsaWNlKDkpIGluIHByb3BzKSkge1xuICAgICAgcmVzW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGlzRWxlbWVudFJvb3QgPSAodm5vZGUpID0+IHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmICg2IHwgMSkgfHwgdm5vZGUudHlwZSA9PT0gQ29tbWVudDtcbn07XG5mdW5jdGlvbiBzaG91bGRVcGRhdGVDb21wb25lbnQocHJldlZOb2RlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkge1xuICBjb25zdCB7IHByb3BzOiBwcmV2UHJvcHMsIGNoaWxkcmVuOiBwcmV2Q2hpbGRyZW4sIGNvbXBvbmVudCB9ID0gcHJldlZOb2RlO1xuICBjb25zdCB7IHByb3BzOiBuZXh0UHJvcHMsIGNoaWxkcmVuOiBuZXh0Q2hpbGRyZW4sIHBhdGNoRmxhZyB9ID0gbmV4dFZOb2RlO1xuICBjb25zdCBlbWl0cyA9IGNvbXBvbmVudC5lbWl0c09wdGlvbnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG5leHRWTm9kZS5kaXJzIHx8IG5leHRWTm9kZS50cmFuc2l0aW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG9wdGltaXplZCAmJiBwYXRjaEZsYWcgPj0gMCkge1xuICAgIGlmIChwYXRjaEZsYWcgJiAxMDI0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0cyk7XG4gICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICBjb25zdCBkeW5hbWljUHJvcHMgPSBuZXh0Vk5vZGUuZHluYW1pY1Byb3BzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZHluYW1pY1Byb3BzW2ldO1xuICAgICAgICBpZiAobmV4dFByb3BzW2tleV0gIT09IHByZXZQcm9wc1trZXldICYmICFpc0VtaXRMaXN0ZW5lcihlbWl0cywga2V5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbiB8fCAhbmV4dENoaWxkcmVuLiRzdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV2UHJvcHMgPT09IG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgcmV0dXJuICEhbmV4dFByb3BzO1xuICAgIH1cbiAgICBpZiAoIW5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzT3B0aW9ucykge1xuICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gIGlmIChuZXh0S2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHByZXZQcm9wcykubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IG5leHRLZXlzW2ldO1xuICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhPQ0hvc3RFbCh7IHZub2RlLCBwYXJlbnQgfSwgZWwpIHtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGNvbnN0IHJvb3QgPSBwYXJlbnQuc3ViVHJlZTtcbiAgICBpZiAocm9vdC5zdXNwZW5zZSAmJiByb290LnN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9PT0gdm5vZGUpIHtcbiAgICAgIHJvb3QuZWwgPSB2bm9kZS5lbDtcbiAgICB9XG4gICAgaWYgKHJvb3QgPT09IHZub2RlKSB7XG4gICAgICAodm5vZGUgPSBwYXJlbnQudm5vZGUpLmVsID0gZWw7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgaXNTdXNwZW5zZSA9ICh0eXBlKSA9PiB0eXBlLl9faXNTdXNwZW5zZTtcbmxldCBzdXNwZW5zZUlkID0gMDtcbmNvbnN0IFN1c3BlbnNlSW1wbCA9IHtcbiAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAvLyBJbiBvcmRlciB0byBtYWtlIFN1c3BlbnNlIHRyZWUtc2hha2FibGUsIHdlIG5lZWQgdG8gYXZvaWQgaW1wb3J0aW5nIGl0XG4gIC8vIGRpcmVjdGx5IGluIHRoZSByZW5kZXJlci4gVGhlIHJlbmRlcmVyIGNoZWNrcyBmb3IgdGhlIF9faXNTdXNwZW5zZSBmbGFnXG4gIC8vIG9uIGEgdm5vZGUncyB0eXBlIGFuZCBjYWxscyB0aGUgYHByb2Nlc3NgIG1ldGhvZCwgcGFzc2luZyBpbiByZW5kZXJlclxuICAvLyBpbnRlcm5hbHMuXG4gIF9faXNTdXNwZW5zZTogdHJ1ZSxcbiAgcHJvY2VzcyhuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscykge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBtb3VudFN1c3BlbnNlKFxuICAgICAgICBuMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UuZGVwcyA+IDAgJiYgIW4xLnN1c3BlbnNlLmlzSW5GYWxsYmFjaykge1xuICAgICAgICBuMi5zdXNwZW5zZSA9IG4xLnN1c3BlbnNlO1xuICAgICAgICBuMi5zdXNwZW5zZS52bm9kZSA9IG4yO1xuICAgICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXRjaFN1c3BlbnNlKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAgaHlkcmF0ZTogaHlkcmF0ZVN1c3BlbnNlLFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW5cbn07XG5jb25zdCBTdXNwZW5zZSA9IFN1c3BlbnNlSW1wbCA7XG5mdW5jdGlvbiB0cmlnZ2VyRXZlbnQodm5vZGUsIG5hbWUpIHtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzW25hbWVdO1xuICBpZiAoaXNGdW5jdGlvbihldmVudExpc3RlbmVyKSkge1xuICAgIGV2ZW50TGlzdGVuZXIoKTtcbiAgfVxufVxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGFuY2hvcixcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZCxcbiAgICByZW5kZXJlckludGVybmFsc1xuICApO1xuICBwYXRjaChcbiAgICBudWxsLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIG51bGwsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHNcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPiAwKSB7XG4gICAgdHJpZ2dlckV2ZW50KHZub2RlLCBcIm9uUGVuZGluZ1wiKTtcbiAgICB0cmlnZ2VyRXZlbnQodm5vZGUsIFwib25GYWxsYmFja1wiKTtcbiAgICBwYXRjaChcbiAgICAgIG51bGwsXG4gICAgICB2bm9kZS5zc0ZhbGxiYWNrLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgdm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhdGNoU3VzcGVuc2UobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCB7IHA6IHBhdGNoLCB1bTogdW5tb3VudCwgbzogeyBjcmVhdGVFbGVtZW50IH0gfSkge1xuICBjb25zdCBzdXNwZW5zZSA9IG4yLnN1c3BlbnNlID0gbjEuc3VzcGVuc2U7XG4gIHN1c3BlbnNlLnZub2RlID0gbjI7XG4gIG4yLmVsID0gbjEuZWw7XG4gIGNvbnN0IG5ld0JyYW5jaCA9IG4yLnNzQ29udGVudDtcbiAgY29uc3QgbmV3RmFsbGJhY2sgPSBuMi5zc0ZhbGxiYWNrO1xuICBjb25zdCB7IGFjdGl2ZUJyYW5jaCwgcGVuZGluZ0JyYW5jaCwgaXNJbkZhbGxiYWNrLCBpc0h5ZHJhdGluZyB9ID0gc3VzcGVuc2U7XG4gIGlmIChwZW5kaW5nQnJhbmNoKSB7XG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG5ld0JyYW5jaDtcbiAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgcGVuZGluZ0JyYW5jaCkpIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBwZW5kaW5nQnJhbmNoLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmIChpc0luRmFsbGJhY2spIHtcbiAgICAgICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgICAgbmV3RmFsbGJhY2ssXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0lkID0gc3VzcGVuc2VJZCsrO1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9IHBlbmRpbmdCcmFuY2g7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bm1vdW50KHBlbmRpbmdCcmFuY2gsIHBhcmVudENvbXBvbmVudCwgc3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZGVwcyA9IDA7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLmxlbmd0aCA9IDA7XG4gICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgaWYgKGlzSW5GYWxsYmFjaykge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICAgIG5ld0ZhbGxiYWNrLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChhY3RpdmVCcmFuY2ggJiYgaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgYWN0aXZlQnJhbmNoKSkge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3QnJhbmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckV2ZW50KG4yLCBcIm9uUGVuZGluZ1wiKTtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBuZXdCcmFuY2g7XG4gICAgICBpZiAobmV3QnJhbmNoLnNoYXBlRmxhZyAmIDUxMikge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBuZXdCcmFuY2guY29tcG9uZW50LnN1c3BlbnNlSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBzdXNwZW5zZUlkKys7XG4gICAgICB9XG4gICAgICBwYXRjaChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgdGltZW91dCwgcGVuZGluZ0lkIH0gPSBzdXNwZW5zZTtcbiAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3VzcGVuc2UucGVuZGluZ0lkID09PSBwZW5kaW5nSWQpIHtcbiAgICAgICAgICAgICAgc3VzcGVuc2UuZmFsbGJhY2sobmV3RmFsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5mYWxsYmFjayhuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkodm5vZGUsIHBhcmVudFN1c3BlbnNlLCBwYXJlbnRDb21wb25lbnQsIGNvbnRhaW5lciwgaGlkZGVuQ29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBpc0h5ZHJhdGluZyA9IGZhbHNlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUgJiYgIWhhc1dhcm5lZCkge1xuICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgY29uc29sZVtjb25zb2xlLmluZm8gPyBcImluZm9cIiA6IFwibG9nXCJdKFxuICAgICAgYDxTdXNwZW5zZT4gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIGl0cyBBUEkgd2lsbCBsaWtlbHkgY2hhbmdlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBtOiBtb3ZlLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG46IG5leHQsXG4gICAgbzogeyBwYXJlbnROb2RlLCByZW1vdmUgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGxldCBwYXJlbnRTdXNwZW5zZUlkO1xuICBjb25zdCBpc1N1c3BlbnNpYmxlID0gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKTtcbiAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgcGFyZW50U3VzcGVuc2VJZCA9IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZDtcbiAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMrKztcbiAgICB9XG4gIH1cbiAgY29uc3QgdGltZW91dCA9IHZub2RlLnByb3BzID8gdG9OdW1iZXIodm5vZGUucHJvcHMudGltZW91dCkgOiB2b2lkIDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYXNzZXJ0TnVtYmVyKHRpbWVvdXQsIGBTdXNwZW5zZSB0aW1lb3V0YCk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbEFuY2hvciA9IGFuY2hvcjtcbiAgY29uc3Qgc3VzcGVuc2UgPSB7XG4gICAgdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgbmFtZXNwYWNlLFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgZGVwczogMCxcbiAgICBwZW5kaW5nSWQ6IHN1c3BlbnNlSWQrKyxcbiAgICB0aW1lb3V0OiB0eXBlb2YgdGltZW91dCA9PT0gXCJudW1iZXJcIiA/IHRpbWVvdXQgOiAtMSxcbiAgICBhY3RpdmVCcmFuY2g6IG51bGwsXG4gICAgcGVuZGluZ0JyYW5jaDogbnVsbCxcbiAgICBpc0luRmFsbGJhY2s6ICFpc0h5ZHJhdGluZyxcbiAgICBpc0h5ZHJhdGluZyxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgZWZmZWN0czogW10sXG4gICAgcmVzb2x2ZShyZXN1bWUgPSBmYWxzZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAoIXJlc3VtZSAmJiAhc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VzcGVuc2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB2bm9kZTogdm5vZGUyLFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdJZCxcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcjJcbiAgICAgIH0gPSBzdXNwZW5zZTtcbiAgICAgIGxldCBkZWxheUVudGVyID0gZmFsc2U7XG4gICAgICBpZiAoc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3VtZSkge1xuICAgICAgICBkZWxheUVudGVyID0gYWN0aXZlQnJhbmNoICYmIHBlbmRpbmdCcmFuY2gudHJhbnNpdGlvbiAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdJZCA9PT0gc3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIG1vdmUoXG4gICAgICAgICAgICAgICAgcGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgICAgIGFuY2hvciA9PT0gaW5pdGlhbEFuY2hvciA/IG5leHQoYWN0aXZlQnJhbmNoKSA6IGFuY2hvcixcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgaWYgKHBhcmVudE5vZGUoYWN0aXZlQnJhbmNoLmVsKSA9PT0gY29udGFpbmVyMikge1xuICAgICAgICAgICAgYW5jaG9yID0gbmV4dChhY3RpdmVCcmFuY2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1bm1vdW50KGFjdGl2ZUJyYW5jaCwgcGFyZW50Q29tcG9uZW50Miwgc3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVsYXlFbnRlcikge1xuICAgICAgICAgIG1vdmUocGVuZGluZ0JyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yLCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBwZW5kaW5nQnJhbmNoKTtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBudWxsO1xuICAgICAgc3VzcGVuc2UuaXNJbkZhbGxiYWNrID0gZmFsc2U7XG4gICAgICBsZXQgcGFyZW50ID0gc3VzcGVuc2UucGFyZW50O1xuICAgICAgbGV0IGhhc1VucmVzb2x2ZWRBbmNlc3RvciA9IGZhbHNlO1xuICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICBpZiAocGFyZW50LnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgICBwYXJlbnQuZWZmZWN0cy5wdXNoKC4uLmVmZmVjdHMpO1xuICAgICAgICAgIGhhc1VucmVzb2x2ZWRBbmNlc3RvciA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmICghaGFzVW5yZXNvbHZlZEFuY2VzdG9yICYmICFkZWxheUVudGVyKSB7XG4gICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzID0gW107XG4gICAgICBpZiAoaXNTdXNwZW5zaWJsZSkge1xuICAgICAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiBwYXJlbnRTdXNwZW5zZUlkID09PSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQpIHtcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlLmRlcHMgPT09IDAgJiYgIXN5bmMpIHtcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudCh2bm9kZTIsIFwib25SZXNvbHZlXCIpO1xuICAgIH0sXG4gICAgZmFsbGJhY2soZmFsbGJhY2tWTm9kZSkge1xuICAgICAgaWYgKCFzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdm5vZGU6IHZub2RlMiwgYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQ6IHBhcmVudENvbXBvbmVudDIsIGNvbnRhaW5lcjogY29udGFpbmVyMiwgbmFtZXNwYWNlOiBuYW1lc3BhY2UyIH0gPSBzdXNwZW5zZTtcbiAgICAgIHRyaWdnZXJFdmVudCh2bm9kZTIsIFwib25GYWxsYmFja1wiKTtcbiAgICAgIGNvbnN0IGFuY2hvcjIgPSBuZXh0KGFjdGl2ZUJyYW5jaCk7XG4gICAgICBjb25zdCBtb3VudEZhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXN1c3BlbnNlLmlzSW5GYWxsYmFjaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIGZhbGxiYWNrVk5vZGUsXG4gICAgICAgICAgY29udGFpbmVyMixcbiAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudDIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgIG5hbWVzcGFjZTIsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIGZhbGxiYWNrVk5vZGUpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlbGF5RW50ZXIgPSBmYWxsYmFja1ZOb2RlLnRyYW5zaXRpb24gJiYgZmFsbGJhY2tWTm9kZS50cmFuc2l0aW9uLm1vZGUgPT09IFwib3V0LWluXCI7XG4gICAgICBpZiAoZGVsYXlFbnRlcikge1xuICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gbW91bnRGYWxsYmFjaztcbiAgICAgIH1cbiAgICAgIHN1c3BlbnNlLmlzSW5GYWxsYmFjayA9IHRydWU7XG4gICAgICB1bm1vdW50KFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBhcmVudENvbXBvbmVudDIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIC8vIG5vIHN1c3BlbnNlIHNvIHVubW91bnQgaG9va3MgZmlyZSBub3dcbiAgICAgICAgdHJ1ZVxuICAgICAgICAvLyBzaG91bGRSZW1vdmVcbiAgICAgICk7XG4gICAgICBpZiAoIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgbW91bnRGYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbW92ZShjb250YWluZXIyLCBhbmNob3IyLCB0eXBlKSB7XG4gICAgICBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggJiYgbW92ZShzdXNwZW5zZS5hY3RpdmVCcmFuY2gsIGNvbnRhaW5lcjIsIGFuY2hvcjIsIHR5cGUpO1xuICAgICAgc3VzcGVuc2UuY29udGFpbmVyID0gY29udGFpbmVyMjtcbiAgICB9LFxuICAgIG5leHQoKSB7XG4gICAgICByZXR1cm4gc3VzcGVuc2UuYWN0aXZlQnJhbmNoICYmIG5leHQoc3VzcGVuc2UuYWN0aXZlQnJhbmNoKTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyRGVwKGluc3RhbmNlLCBzZXR1cFJlbmRlckVmZmVjdCwgb3B0aW1pemVkMikge1xuICAgICAgY29uc3QgaXNJblBlbmRpbmdTdXNwZW5zZSA9ICEhc3VzcGVuc2UucGVuZGluZ0JyYW5jaDtcbiAgICAgIGlmIChpc0luUGVuZGluZ1N1c3BlbnNlKSB7XG4gICAgICAgIHN1c3BlbnNlLmRlcHMrKztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGh5ZHJhdGVkRWwgPSBpbnN0YW5jZS52bm9kZS5lbDtcbiAgICAgIGluc3RhbmNlLmFzeW5jRGVwLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgMCk7XG4gICAgICB9KS50aGVuKChhc3luY1NldHVwUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZCB8fCBzdXNwZW5zZS5pc1VubW91bnRlZCB8fCBzdXNwZW5zZS5wZW5kaW5nSWQgIT09IGluc3RhbmNlLnN1c3BlbnNlSWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHsgdm5vZGU6IHZub2RlMiB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KHZub2RlMik7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIGFzeW5jU2V0dXBSZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgaWYgKGh5ZHJhdGVkRWwpIHtcbiAgICAgICAgICB2bm9kZTIuZWwgPSBoeWRyYXRlZEVsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gIWh5ZHJhdGVkRWwgJiYgaW5zdGFuY2Uuc3ViVHJlZS5lbDtcbiAgICAgICAgc2V0dXBSZW5kZXJFZmZlY3QoXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgdm5vZGUyLFxuICAgICAgICAgIC8vIGNvbXBvbmVudCBtYXkgaGF2ZSBiZWVuIG1vdmVkIGJlZm9yZSByZXNvbHZlLlxuICAgICAgICAgIC8vIGlmIHRoaXMgaXMgbm90IGEgaHlkcmF0aW9uLCBpbnN0YW5jZS5zdWJUcmVlIHdpbGwgYmUgdGhlIGNvbW1lbnRcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlci5cbiAgICAgICAgICBwYXJlbnROb2RlKGh5ZHJhdGVkRWwgfHwgaW5zdGFuY2Uuc3ViVHJlZS5lbCksXG4gICAgICAgICAgLy8gYW5jaG9yIHdpbGwgbm90IGJlIHVzZWQgaWYgdGhpcyBpcyBoeWRyYXRpb24sIHNvIG9ubHkgbmVlZCB0b1xuICAgICAgICAgIC8vIGNvbnNpZGVyIHRoZSBjb21tZW50IHBsYWNlaG9sZGVyIGNhc2UuXG4gICAgICAgICAgaHlkcmF0ZWRFbCA/IG51bGwgOiBuZXh0KGluc3RhbmNlLnN1YlRyZWUpLFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBvcHRpbWl6ZWQyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcikge1xuICAgICAgICAgIHJlbW92ZShwbGFjZWhvbGRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlSE9DSG9zdEVsKGluc3RhbmNlLCB2bm9kZTIuZWwpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5QZW5kaW5nU3VzcGVuc2UgJiYgLS1zdXNwZW5zZS5kZXBzID09PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHVubW91bnQocGFyZW50U3VzcGVuc2UyLCBkb1JlbW92ZSkge1xuICAgICAgc3VzcGVuc2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCkge1xuICAgICAgICB1bm1vdW50KFxuICAgICAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UyLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICB1bm1vdW50KFxuICAgICAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlMixcbiAgICAgICAgICBkb1JlbW92ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHN1c3BlbnNlO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVN1c3BlbnNlKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscywgaHlkcmF0ZU5vZGUpIHtcbiAgY29uc3Qgc3VzcGVuc2UgPSB2bm9kZS5zdXNwZW5zZSA9IGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkoXG4gICAgdm5vZGUsXG4gICAgcGFyZW50U3VzcGVuc2UsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIG5vZGUucGFyZW50Tm9kZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgICBudWxsLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHMsXG4gICAgb3B0aW1pemVkLFxuICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgIHRydWVcbiAgKTtcbiAgY29uc3QgcmVzdWx0ID0gaHlkcmF0ZU5vZGUoXG4gICAgbm9kZSxcbiAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gdm5vZGUuc3NDb250ZW50LFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBzdXNwZW5zZSxcbiAgICBzbG90U2NvcGVJZHMsXG4gICAgb3B0aW1pemVkXG4gICk7XG4gIGlmIChzdXNwZW5zZS5kZXBzID09PSAwKSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW4odm5vZGUpIHtcbiAgY29uc3QgeyBzaGFwZUZsYWcsIGNoaWxkcmVuIH0gPSB2bm9kZTtcbiAgY29uc3QgaXNTbG90Q2hpbGRyZW4gPSBzaGFwZUZsYWcgJiAzMjtcbiAgdm5vZGUuc3NDb250ZW50ID0gbm9ybWFsaXplU3VzcGVuc2VTbG90KFxuICAgIGlzU2xvdENoaWxkcmVuID8gY2hpbGRyZW4uZGVmYXVsdCA6IGNoaWxkcmVuXG4gICk7XG4gIHZub2RlLnNzRmFsbGJhY2sgPSBpc1Nsb3RDaGlsZHJlbiA/IG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChjaGlsZHJlbi5mYWxsYmFjaykgOiBjcmVhdGVWTm9kZShDb21tZW50KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChzKSB7XG4gIGxldCBibG9jaztcbiAgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICBjb25zdCB0cmFja0Jsb2NrID0gaXNCbG9ja1RyZWVFbmFibGVkICYmIHMuX2M7XG4gICAgaWYgKHRyYWNrQmxvY2spIHtcbiAgICAgIHMuX2QgPSBmYWxzZTtcbiAgICAgIG9wZW5CbG9jaygpO1xuICAgIH1cbiAgICBzID0gcygpO1xuICAgIGlmICh0cmFja0Jsb2NrKSB7XG4gICAgICBzLl9kID0gdHJ1ZTtcbiAgICAgIGJsb2NrID0gY3VycmVudEJsb2NrO1xuICAgICAgY2xvc2VCbG9jaygpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNBcnJheShzKSkge1xuICAgIGNvbnN0IHNpbmdsZUNoaWxkID0gZmlsdGVyU2luZ2xlUm9vdChzKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhc2luZ2xlQ2hpbGQgJiYgcy5maWx0ZXIoKGNoaWxkKSA9PiBjaGlsZCAhPT0gTlVMTF9EWU5BTUlDX0NPTVBPTkVOVCkubGVuZ3RoID4gMCkge1xuICAgICAgd2FybiQxKGA8U3VzcGVuc2U+IHNsb3RzIGV4cGVjdCBhIHNpbmdsZSByb290IG5vZGUuYCk7XG4gICAgfVxuICAgIHMgPSBzaW5nbGVDaGlsZDtcbiAgfVxuICBzID0gbm9ybWFsaXplVk5vZGUocyk7XG4gIGlmIChibG9jayAmJiAhcy5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICBzLmR5bmFtaWNDaGlsZHJlbiA9IGJsb2NrLmZpbHRlcigoYykgPT4gYyAhPT0gcyk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZShmbiwgc3VzcGVuc2UpIHtcbiAgaWYgKHN1c3BlbnNlICYmIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICBpZiAoaXNBcnJheShmbikpIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaCguLi5mbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaChmbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZm4pO1xuICB9XG59XG5mdW5jdGlvbiBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIGJyYW5jaCkge1xuICBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggPSBicmFuY2g7XG4gIGNvbnN0IHsgdm5vZGUsIHBhcmVudENvbXBvbmVudCB9ID0gc3VzcGVuc2U7XG4gIGxldCBlbCA9IGJyYW5jaC5lbDtcbiAgd2hpbGUgKCFlbCAmJiBicmFuY2guY29tcG9uZW50KSB7XG4gICAgYnJhbmNoID0gYnJhbmNoLmNvbXBvbmVudC5zdWJUcmVlO1xuICAgIGVsID0gYnJhbmNoLmVsO1xuICB9XG4gIHZub2RlLmVsID0gZWw7XG4gIGlmIChwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnN1YlRyZWUgPT09IHZub2RlKSB7XG4gICAgcGFyZW50Q29tcG9uZW50LnZub2RlLmVsID0gZWw7XG4gICAgdXBkYXRlSE9DSG9zdEVsKHBhcmVudENvbXBvbmVudCwgZWwpO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZOb2RlU3VzcGVuc2libGUodm5vZGUpIHtcbiAgY29uc3Qgc3VzcGVuc2libGUgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5zdXNwZW5zaWJsZTtcbiAgcmV0dXJuIHN1c3BlbnNpYmxlICE9IG51bGwgJiYgc3VzcGVuc2libGUgIT09IGZhbHNlO1xufVxuXG5jb25zdCBGcmFnbWVudCA9IFN5bWJvbC5mb3IoXCJ2LWZndFwiKTtcbmNvbnN0IFRleHQgPSBTeW1ib2wuZm9yKFwidi10eHRcIik7XG5jb25zdCBDb21tZW50ID0gU3ltYm9sLmZvcihcInYtY210XCIpO1xuY29uc3QgU3RhdGljID0gU3ltYm9sLmZvcihcInYtc3RjXCIpO1xuY29uc3QgYmxvY2tTdGFjayA9IFtdO1xubGV0IGN1cnJlbnRCbG9jayA9IG51bGw7XG5mdW5jdGlvbiBvcGVuQmxvY2soZGlzYWJsZVRyYWNraW5nID0gZmFsc2UpIHtcbiAgYmxvY2tTdGFjay5wdXNoKGN1cnJlbnRCbG9jayA9IGRpc2FibGVUcmFja2luZyA/IG51bGwgOiBbXSk7XG59XG5mdW5jdGlvbiBjbG9zZUJsb2NrKCkge1xuICBibG9ja1N0YWNrLnBvcCgpO1xuICBjdXJyZW50QmxvY2sgPSBibG9ja1N0YWNrW2Jsb2NrU3RhY2subGVuZ3RoIC0gMV0gfHwgbnVsbDtcbn1cbmxldCBpc0Jsb2NrVHJlZUVuYWJsZWQgPSAxO1xuZnVuY3Rpb24gc2V0QmxvY2tUcmFja2luZyh2YWx1ZSwgaW5WT25jZSA9IGZhbHNlKSB7XG4gIGlzQmxvY2tUcmVlRW5hYmxlZCArPSB2YWx1ZTtcbiAgaWYgKHZhbHVlIDwgMCAmJiBjdXJyZW50QmxvY2sgJiYgaW5WT25jZSkge1xuICAgIGN1cnJlbnRCbG9jay5oYXNPbmNlID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0dXBCbG9jayh2bm9kZSkge1xuICB2bm9kZS5keW5hbWljQ2hpbGRyZW4gPSBpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwID8gY3VycmVudEJsb2NrIHx8IEVNUFRZX0FSUiA6IG51bGw7XG4gIGNsb3NlQmxvY2soKTtcbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2godm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRCbG9jayh0eXBlLCBwcm9wcywgY2hpbGRyZW4sIHBhdGNoRmxhZywgZHluYW1pY1Byb3BzLCBzaGFwZUZsYWcpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlQmFzZVZOb2RlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICBkeW5hbWljUHJvcHMsXG4gICAgICBzaGFwZUZsYWcsXG4gICAgICB0cnVlXG4gICAgKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlQmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcykge1xuICByZXR1cm4gc2V0dXBCbG9jayhcbiAgICBjcmVhdGVWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVk5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuX192X2lzVk5vZGUgPT09IHRydWUgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbjIuc2hhcGVGbGFnICYgNiAmJiBuMS5jb21wb25lbnQpIHtcbiAgICBjb25zdCBkaXJ0eUluc3RhbmNlcyA9IGhtckRpcnR5Q29tcG9uZW50cy5nZXQobjIudHlwZSk7XG4gICAgaWYgKGRpcnR5SW5zdGFuY2VzICYmIGRpcnR5SW5zdGFuY2VzLmhhcyhuMS5jb21wb25lbnQpKSB7XG4gICAgICBuMS5zaGFwZUZsYWcgJj0gLTI1NztcbiAgICAgIG4yLnNoYXBlRmxhZyAmPSAtNTEzO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbjEudHlwZSA9PT0gbjIudHlwZSAmJiBuMS5rZXkgPT09IG4yLmtleTtcbn1cbmxldCB2bm9kZUFyZ3NUcmFuc2Zvcm1lcjtcbmZ1bmN0aW9uIHRyYW5zZm9ybVZOb2RlQXJncyh0cmFuc2Zvcm1lcikge1xuICB2bm9kZUFyZ3NUcmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyO1xufVxuY29uc3QgY3JlYXRlVk5vZGVXaXRoQXJnc1RyYW5zZm9ybSA9ICguLi5hcmdzKSA9PiB7XG4gIHJldHVybiBfY3JlYXRlVk5vZGUoXG4gICAgLi4udm5vZGVBcmdzVHJhbnNmb3JtZXIgPyB2bm9kZUFyZ3NUcmFuc2Zvcm1lcihhcmdzLCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIDogYXJnc1xuICApO1xufTtcbmNvbnN0IG5vcm1hbGl6ZUtleSA9ICh7IGtleSB9KSA9PiBrZXkgIT0gbnVsbCA/IGtleSA6IG51bGw7XG5jb25zdCBub3JtYWxpemVSZWYgPSAoe1xuICByZWYsXG4gIHJlZl9rZXksXG4gIHJlZl9mb3Jcbn0pID0+IHtcbiAgaWYgKHR5cGVvZiByZWYgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZWYgPSBcIlwiICsgcmVmO1xuICB9XG4gIHJldHVybiByZWYgIT0gbnVsbCA/IGlzU3RyaW5nKHJlZikgfHwgaXNSZWYocmVmKSB8fCBpc0Z1bmN0aW9uKHJlZikgPyB7IGk6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSwgcjogcmVmLCBrOiByZWZfa2V5LCBmOiAhIXJlZl9mb3IgfSA6IHJlZiA6IG51bGw7XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBzaGFwZUZsYWcgPSB0eXBlID09PSBGcmFnbWVudCA/IDAgOiAxLCBpc0Jsb2NrTm9kZSA9IGZhbHNlLCBuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHZub2RlID0ge1xuICAgIF9fdl9pc1ZOb2RlOiB0cnVlLFxuICAgIF9fdl9za2lwOiB0cnVlLFxuICAgIHR5cGUsXG4gICAgcHJvcHMsXG4gICAga2V5OiBwcm9wcyAmJiBub3JtYWxpemVLZXkocHJvcHMpLFxuICAgIHJlZjogcHJvcHMgJiYgbm9ybWFsaXplUmVmKHByb3BzKSxcbiAgICBzY29wZUlkOiBjdXJyZW50U2NvcGVJZCxcbiAgICBzbG90U2NvcGVJZHM6IG51bGwsXG4gICAgY2hpbGRyZW4sXG4gICAgY29tcG9uZW50OiBudWxsLFxuICAgIHN1c3BlbnNlOiBudWxsLFxuICAgIHNzQ29udGVudDogbnVsbCxcbiAgICBzc0ZhbGxiYWNrOiBudWxsLFxuICAgIGRpcnM6IG51bGwsXG4gICAgdHJhbnNpdGlvbjogbnVsbCxcbiAgICBlbDogbnVsbCxcbiAgICBhbmNob3I6IG51bGwsXG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIHRhcmdldFN0YXJ0OiBudWxsLFxuICAgIHRhcmdldEFuY2hvcjogbnVsbCxcbiAgICBzdGF0aWNDb3VudDogMCxcbiAgICBzaGFwZUZsYWcsXG4gICAgcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wcyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IG51bGwsXG4gICAgYXBwQ29udGV4dDogbnVsbCxcbiAgICBjdHg6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZVxuICB9O1xuICBpZiAobmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24pIHtcbiAgICBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4pO1xuICAgIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgIHR5cGUubm9ybWFsaXplKHZub2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICB2bm9kZS5zaGFwZUZsYWcgfD0gaXNTdHJpbmcoY2hpbGRyZW4pID8gOCA6IDE2O1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLmtleSAhPT0gdm5vZGUua2V5KSB7XG4gICAgd2FybiQxKGBWTm9kZSBjcmVhdGVkIHdpdGggaW52YWxpZCBrZXkgKE5hTikuIFZOb2RlIHR5cGU6YCwgdm5vZGUudHlwZSk7XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgLy8gYXZvaWQgYSBibG9jayBub2RlIGZyb20gdHJhY2tpbmcgaXRzZWxmXG4gICFpc0Jsb2NrTm9kZSAmJiAvLyBoYXMgY3VycmVudCBwYXJlbnQgYmxvY2tcbiAgY3VycmVudEJsb2NrICYmIC8vIHByZXNlbmNlIG9mIGEgcGF0Y2ggZmxhZyBpbmRpY2F0ZXMgdGhpcyBub2RlIG5lZWRzIHBhdGNoaW5nIG9uIHVwZGF0ZXMuXG4gIC8vIGNvbXBvbmVudCBub2RlcyBhbHNvIHNob3VsZCBhbHdheXMgYmUgcGF0Y2hlZCwgYmVjYXVzZSBldmVuIGlmIHRoZVxuICAvLyBjb21wb25lbnQgZG9lc24ndCBuZWVkIHRvIHVwZGF0ZSwgaXQgbmVlZHMgdG8gcGVyc2lzdCB0aGUgaW5zdGFuY2Ugb24gdG9cbiAgLy8gdGhlIG5leHQgdm5vZGUgc28gdGhhdCBpdCBjYW4gYmUgcHJvcGVybHkgdW5tb3VudGVkIGxhdGVyLlxuICAodm5vZGUucGF0Y2hGbGFnID4gMCB8fCBzaGFwZUZsYWcgJiA2KSAmJiAvLyB0aGUgRVZFTlRTIGZsYWcgaXMgb25seSBmb3IgaHlkcmF0aW9uIGFuZCBpZiBpdCBpcyB0aGUgb25seSBmbGFnLCB0aGVcbiAgLy8gdm5vZGUgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGR5bmFtaWMgZHVlIHRvIGhhbmRsZXIgY2FjaGluZy5cbiAgdm5vZGUucGF0Y2hGbGFnICE9PSAzMikge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5jb25zdCBjcmVhdGVWTm9kZSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIDogX2NyZWF0ZVZOb2RlO1xuZnVuY3Rpb24gX2NyZWF0ZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBpc0Jsb2NrTm9kZSA9IGZhbHNlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlID09PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXR5cGUpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCB2bm9kZSB0eXBlIHdoZW4gY3JlYXRpbmcgdm5vZGU6ICR7dHlwZX0uYCk7XG4gICAgfVxuICAgIHR5cGUgPSBDb21tZW50O1xuICB9XG4gIGlmIChpc1ZOb2RlKHR5cGUpKSB7XG4gICAgY29uc3QgY2xvbmVkID0gY2xvbmVWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIHRydWVcbiAgICAgIC8qIG1lcmdlUmVmOiB0cnVlICovXG4gICAgKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIG5vcm1hbGl6ZUNoaWxkcmVuKGNsb25lZCwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiAhaXNCbG9ja05vZGUgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgICBpZiAoY2xvbmVkLnNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgY3VycmVudEJsb2NrW2N1cnJlbnRCbG9jay5pbmRleE9mKHR5cGUpXSA9IGNsb25lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRCbG9jay5wdXNoKGNsb25lZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNsb25lZC5wYXRjaEZsYWcgPSAtMjtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIGlmIChpc0NsYXNzQ29tcG9uZW50KHR5cGUpKSB7XG4gICAgdHlwZSA9IHR5cGUuX192Y2NPcHRzO1xuICB9XG4gIGlmIChwcm9wcykge1xuICAgIHByb3BzID0gZ3VhcmRSZWFjdGl2ZVByb3BzKHByb3BzKTtcbiAgICBsZXQgeyBjbGFzczoga2xhc3MsIHN0eWxlIH0gPSBwcm9wcztcbiAgICBpZiAoa2xhc3MgJiYgIWlzU3RyaW5nKGtsYXNzKSkge1xuICAgICAgcHJvcHMuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhrbGFzcyk7XG4gICAgfVxuICAgIGlmIChpc09iamVjdChzdHlsZSkpIHtcbiAgICAgIGlmIChpc1Byb3h5KHN0eWxlKSAmJiAhaXNBcnJheShzdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBleHRlbmQoe30sIHN0eWxlKTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnN0eWxlID0gbm9ybWFsaXplU3R5bGUoc3R5bGUpO1xuICAgIH1cbiAgfVxuICBjb25zdCBzaGFwZUZsYWcgPSBpc1N0cmluZyh0eXBlKSA/IDEgOiBpc1N1c3BlbnNlKHR5cGUpID8gMTI4IDogaXNUZWxlcG9ydCh0eXBlKSA/IDY0IDogaXNPYmplY3QodHlwZSkgPyA0IDogaXNGdW5jdGlvbih0eXBlKSA/IDIgOiAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzaGFwZUZsYWcgJiA0ICYmIGlzUHJveHkodHlwZSkpIHtcbiAgICB0eXBlID0gdG9SYXcodHlwZSk7XG4gICAgd2FybiQxKFxuICAgICAgYFZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB0aGF0IHdhcyBtYWRlIGEgcmVhY3RpdmUgb2JqZWN0LiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIG92ZXJoZWFkIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBieSBtYXJraW5nIHRoZSBjb21wb25lbnQgd2l0aCBcXGBtYXJrUmF3XFxgIG9yIHVzaW5nIFxcYHNoYWxsb3dSZWZcXGAgaW5zdGVhZCBvZiBcXGByZWZcXGAuYCxcbiAgICAgIGBcbkNvbXBvbmVudCB0aGF0IHdhcyBtYWRlIHJlYWN0aXZlOiBgLFxuICAgICAgdHlwZVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJhc2VWTm9kZShcbiAgICB0eXBlLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgc2hhcGVGbGFnLFxuICAgIGlzQmxvY2tOb2RlLFxuICAgIHRydWVcbiAgKTtcbn1cbmZ1bmN0aW9uIGd1YXJkUmVhY3RpdmVQcm9wcyhwcm9wcykge1xuICBpZiAoIXByb3BzKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGlzUHJveHkocHJvcHMpIHx8IGlzSW50ZXJuYWxPYmplY3QocHJvcHMpID8gZXh0ZW5kKHt9LCBwcm9wcykgOiBwcm9wcztcbn1cbmZ1bmN0aW9uIGNsb25lVk5vZGUodm5vZGUsIGV4dHJhUHJvcHMsIG1lcmdlUmVmID0gZmFsc2UsIGNsb25lVHJhbnNpdGlvbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgcHJvcHMsIHJlZiwgcGF0Y2hGbGFnLCBjaGlsZHJlbiwgdHJhbnNpdGlvbiB9ID0gdm5vZGU7XG4gIGNvbnN0IG1lcmdlZFByb3BzID0gZXh0cmFQcm9wcyA/IG1lcmdlUHJvcHMocHJvcHMgfHwge30sIGV4dHJhUHJvcHMpIDogcHJvcHM7XG4gIGNvbnN0IGNsb25lZCA9IHtcbiAgICBfX3ZfaXNWTm9kZTogdHJ1ZSxcbiAgICBfX3Zfc2tpcDogdHJ1ZSxcbiAgICB0eXBlOiB2bm9kZS50eXBlLFxuICAgIHByb3BzOiBtZXJnZWRQcm9wcyxcbiAgICBrZXk6IG1lcmdlZFByb3BzICYmIG5vcm1hbGl6ZUtleShtZXJnZWRQcm9wcyksXG4gICAgcmVmOiBleHRyYVByb3BzICYmIGV4dHJhUHJvcHMucmVmID8gKFxuICAgICAgLy8gIzIwNzggaW4gdGhlIGNhc2Ugb2YgPGNvbXBvbmVudCA6aXM9XCJ2bm9kZVwiIHJlZj1cImV4dHJhXCIvPlxuICAgICAgLy8gaWYgdGhlIHZub2RlIGl0c2VsZiBhbHJlYWR5IGhhcyBhIHJlZiwgY2xvbmVWTm9kZSB3aWxsIG5lZWQgdG8gbWVyZ2VcbiAgICAgIC8vIHRoZSByZWZzIHNvIHRoZSBzaW5nbGUgdm5vZGUgY2FuIGJlIHNldCBvbiBtdWx0aXBsZSByZWZzXG4gICAgICBtZXJnZVJlZiAmJiByZWYgPyBpc0FycmF5KHJlZikgPyByZWYuY29uY2F0KG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKSkgOiBbcmVmLCBub3JtYWxpemVSZWYoZXh0cmFQcm9wcyldIDogbm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpXG4gICAgKSA6IHJlZixcbiAgICBzY29wZUlkOiB2bm9kZS5zY29wZUlkLFxuICAgIHNsb3RTY29wZUlkczogdm5vZGUuc2xvdFNjb3BlSWRzLFxuICAgIGNoaWxkcmVuOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHBhdGNoRmxhZyA9PT0gLTEgJiYgaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbi5tYXAoZGVlcENsb25lVk5vZGUpIDogY2hpbGRyZW4sXG4gICAgdGFyZ2V0OiB2bm9kZS50YXJnZXQsXG4gICAgdGFyZ2V0U3RhcnQ6IHZub2RlLnRhcmdldFN0YXJ0LFxuICAgIHRhcmdldEFuY2hvcjogdm5vZGUudGFyZ2V0QW5jaG9yLFxuICAgIHN0YXRpY0NvdW50OiB2bm9kZS5zdGF0aWNDb3VudCxcbiAgICBzaGFwZUZsYWc6IHZub2RlLnNoYXBlRmxhZyxcbiAgICAvLyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIHdpdGggZXh0cmEgcHJvcHMsIHdlIGNhbiBubyBsb25nZXIgYXNzdW1lIGl0c1xuICAgIC8vIGV4aXN0aW5nIHBhdGNoIGZsYWcgdG8gYmUgcmVsaWFibGUgYW5kIG5lZWQgdG8gYWRkIHRoZSBGVUxMX1BST1BTIGZsYWcuXG4gICAgLy8gbm90ZTogcHJlc2VydmUgZmxhZyBmb3IgZnJhZ21lbnRzIHNpbmNlIHRoZXkgdXNlIHRoZSBmbGFnIGZvciBjaGlsZHJlblxuICAgIC8vIGZhc3QgcGF0aHMgb25seS5cbiAgICBwYXRjaEZsYWc6IGV4dHJhUHJvcHMgJiYgdm5vZGUudHlwZSAhPT0gRnJhZ21lbnQgPyBwYXRjaEZsYWcgPT09IC0xID8gMTYgOiBwYXRjaEZsYWcgfCAxNiA6IHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHM6IHZub2RlLmR5bmFtaWNQcm9wcyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IHZub2RlLmR5bmFtaWNDaGlsZHJlbixcbiAgICBhcHBDb250ZXh0OiB2bm9kZS5hcHBDb250ZXh0LFxuICAgIGRpcnM6IHZub2RlLmRpcnMsXG4gICAgdHJhbnNpdGlvbixcbiAgICAvLyBUaGVzZSBzaG91bGQgdGVjaG5pY2FsbHkgb25seSBiZSBub24tbnVsbCBvbiBtb3VudGVkIFZOb2Rlcy4gSG93ZXZlcixcbiAgICAvLyB0aGV5ICpzaG91bGQqIGJlIGNvcGllZCBmb3Iga2VwdC1hbGl2ZSB2bm9kZXMuIFNvIHdlIGp1c3QgYWx3YXlzIGNvcHlcbiAgICAvLyB0aGVtIHNpbmNlIHRoZW0gYmVpbmcgbm9uLW51bGwgZHVyaW5nIGEgbW91bnQgZG9lc24ndCBhZmZlY3QgdGhlIGxvZ2ljIGFzXG4gICAgLy8gdGhleSB3aWxsIHNpbXBseSBiZSBvdmVyd3JpdHRlbi5cbiAgICBjb21wb25lbnQ6IHZub2RlLmNvbXBvbmVudCxcbiAgICBzdXNwZW5zZTogdm5vZGUuc3VzcGVuc2UsXG4gICAgc3NDb250ZW50OiB2bm9kZS5zc0NvbnRlbnQgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0NvbnRlbnQpLFxuICAgIHNzRmFsbGJhY2s6IHZub2RlLnNzRmFsbGJhY2sgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0ZhbGxiYWNrKSxcbiAgICBwbGFjZWhvbGRlcjogdm5vZGUucGxhY2Vob2xkZXIsXG4gICAgZWw6IHZub2RlLmVsLFxuICAgIGFuY2hvcjogdm5vZGUuYW5jaG9yLFxuICAgIGN0eDogdm5vZGUuY3R4LFxuICAgIGNlOiB2bm9kZS5jZVxuICB9O1xuICBpZiAodHJhbnNpdGlvbiAmJiBjbG9uZVRyYW5zaXRpb24pIHtcbiAgICBzZXRUcmFuc2l0aW9uSG9va3MoXG4gICAgICBjbG9uZWQsXG4gICAgICB0cmFuc2l0aW9uLmNsb25lKGNsb25lZClcbiAgICApO1xuICB9XG4gIHJldHVybiBjbG9uZWQ7XG59XG5mdW5jdGlvbiBkZWVwQ2xvbmVWTm9kZSh2bm9kZSkge1xuICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgaWYgKGlzQXJyYXkodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgY2xvbmVkLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKTtcbiAgfVxuICByZXR1cm4gY2xvbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dFZOb2RlKHRleHQgPSBcIiBcIiwgZmxhZyA9IDApIHtcbiAgcmV0dXJuIGNyZWF0ZVZOb2RlKFRleHQsIG51bGwsIHRleHQsIGZsYWcpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3RhdGljVk5vZGUoY29udGVudCwgbnVtYmVyT2ZOb2Rlcykge1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKFN0YXRpYywgbnVsbCwgY29udGVudCk7XG4gIHZub2RlLnN0YXRpY0NvdW50ID0gbnVtYmVyT2ZOb2RlcztcbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudFZOb2RlKHRleHQgPSBcIlwiLCBhc0Jsb2NrID0gZmFsc2UpIHtcbiAgcmV0dXJuIGFzQmxvY2sgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKENvbW1lbnQsIG51bGwsIHRleHQpKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQsIG51bGwsIHRleHQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVk5vZGUoY2hpbGQpIHtcbiAgaWYgKGNoaWxkID09IG51bGwgfHwgdHlwZW9mIGNoaWxkID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkKSkge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShcbiAgICAgIEZyYWdtZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vICMzNjY2LCBhdm9pZCByZWZlcmVuY2UgcG9sbHV0aW9uIHdoZW4gcmV1c2luZyB2bm9kZVxuICAgICAgY2hpbGQuc2xpY2UoKVxuICAgICk7XG4gIH0gZWxzZSBpZiAoaXNWTm9kZShjaGlsZCkpIHtcbiAgICByZXR1cm4gY2xvbmVJZk1vdW50ZWQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShUZXh0LCBudWxsLCBTdHJpbmcoY2hpbGQpKTtcbiAgfVxufVxuZnVuY3Rpb24gY2xvbmVJZk1vdW50ZWQoY2hpbGQpIHtcbiAgcmV0dXJuIGNoaWxkLmVsID09PSBudWxsICYmIGNoaWxkLnBhdGNoRmxhZyAhPT0gLTEgfHwgY2hpbGQubWVtbyA/IGNoaWxkIDogY2xvbmVWTm9kZShjaGlsZCk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4pIHtcbiAgbGV0IHR5cGUgPSAwO1xuICBjb25zdCB7IHNoYXBlRmxhZyB9ID0gdm5vZGU7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgdHlwZSA9IDE2O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChzaGFwZUZsYWcgJiAoMSB8IDY0KSkge1xuICAgICAgY29uc3Qgc2xvdCA9IGNoaWxkcmVuLmRlZmF1bHQ7XG4gICAgICBpZiAoc2xvdCkge1xuICAgICAgICBzbG90Ll9jICYmIChzbG90Ll9kID0gZmFsc2UpO1xuICAgICAgICBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgc2xvdCgpKTtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gMzI7XG4gICAgICBjb25zdCBzbG90RmxhZyA9IGNoaWxkcmVuLl87XG4gICAgICBpZiAoIXNsb3RGbGFnICYmICFpc0ludGVybmFsT2JqZWN0KGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5fY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICAgICAgfSBlbHNlIGlmIChzbG90RmxhZyA9PT0gMyAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5zbG90cy5fID09PSAxKSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDI7XG4gICAgICAgICAgdm5vZGUucGF0Y2hGbGFnIHw9IDEwMjQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjaGlsZHJlbikpIHtcbiAgICBjaGlsZHJlbiA9IHsgZGVmYXVsdDogY2hpbGRyZW4sIF9jdHg6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB9O1xuICAgIHR5cGUgPSAzMjtcbiAgfSBlbHNlIHtcbiAgICBjaGlsZHJlbiA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICB0eXBlID0gMTY7XG4gICAgICBjaGlsZHJlbiA9IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDg7XG4gICAgfVxuICB9XG4gIHZub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHZub2RlLnNoYXBlRmxhZyB8PSB0eXBlO1xufVxuZnVuY3Rpb24gbWVyZ2VQcm9wcyguLi5hcmdzKSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b01lcmdlID0gYXJnc1tpXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b01lcmdlKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIpIHtcbiAgICAgICAgaWYgKHJldC5jbGFzcyAhPT0gdG9NZXJnZS5jbGFzcykge1xuICAgICAgICAgIHJldC5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKFtyZXQuY2xhc3MsIHRvTWVyZ2UuY2xhc3NdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgICAgICByZXQuc3R5bGUgPSBub3JtYWxpemVTdHlsZShbcmV0LnN0eWxlLCB0b01lcmdlLnN0eWxlXSk7XG4gICAgICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJldFtrZXldO1xuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHRvTWVyZ2Vba2V5XTtcbiAgICAgICAgaWYgKGluY29taW5nICYmIGV4aXN0aW5nICE9PSBpbmNvbWluZyAmJiAhKGlzQXJyYXkoZXhpc3RpbmcpICYmIGV4aXN0aW5nLmluY2x1ZGVzKGluY29taW5nKSkpIHtcbiAgICAgICAgICByZXRba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBpbmNvbWluZykgOiBpbmNvbWluZztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFwiXCIpIHtcbiAgICAgICAgcmV0W2tleV0gPSB0b01lcmdlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBpbnZva2VWTm9kZUhvb2soaG9vaywgaW5zdGFuY2UsIHZub2RlLCBwcmV2Vk5vZGUgPSBudWxsKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIGluc3RhbmNlLCA3LCBbXG4gICAgdm5vZGUsXG4gICAgcHJldlZOb2RlXG4gIF0pO1xufVxuXG5jb25zdCBlbXB0eUFwcENvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG5sZXQgdWlkID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHZub2RlLCBwYXJlbnQsIHN1c3BlbnNlKSB7XG4gIGNvbnN0IHR5cGUgPSB2bm9kZS50eXBlO1xuICBjb25zdCBhcHBDb250ZXh0ID0gKHBhcmVudCA/IHBhcmVudC5hcHBDb250ZXh0IDogdm5vZGUuYXBwQ29udGV4dCkgfHwgZW1wdHlBcHBDb250ZXh0O1xuICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICB1aWQ6IHVpZCsrLFxuICAgIHZub2RlLFxuICAgIHR5cGUsXG4gICAgcGFyZW50LFxuICAgIGFwcENvbnRleHQsXG4gICAgcm9vdDogbnVsbCxcbiAgICAvLyB0byBiZSBpbW1lZGlhdGVseSBzZXRcbiAgICBuZXh0OiBudWxsLFxuICAgIHN1YlRyZWU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIGVmZmVjdDogbnVsbCxcbiAgICB1cGRhdGU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIGpvYjogbnVsbCxcbiAgICBzY29wZTogbmV3IEVmZmVjdFNjb3BlKFxuICAgICAgdHJ1ZVxuICAgICAgLyogZGV0YWNoZWQgKi9cbiAgICApLFxuICAgIHJlbmRlcjogbnVsbCxcbiAgICBwcm94eTogbnVsbCxcbiAgICBleHBvc2VkOiBudWxsLFxuICAgIGV4cG9zZVByb3h5OiBudWxsLFxuICAgIHdpdGhQcm94eTogbnVsbCxcbiAgICBwcm92aWRlczogcGFyZW50ID8gcGFyZW50LnByb3ZpZGVzIDogT2JqZWN0LmNyZWF0ZShhcHBDb250ZXh0LnByb3ZpZGVzKSxcbiAgICBpZHM6IHBhcmVudCA/IHBhcmVudC5pZHMgOiBbXCJcIiwgMCwgMF0sXG4gICAgYWNjZXNzQ2FjaGU6IG51bGwsXG4gICAgcmVuZGVyQ2FjaGU6IFtdLFxuICAgIC8vIGxvY2FsIHJlc29sdmVkIGFzc2V0c1xuICAgIGNvbXBvbmVudHM6IG51bGwsXG4gICAgZGlyZWN0aXZlczogbnVsbCxcbiAgICAvLyByZXNvbHZlZCBwcm9wcyBhbmQgZW1pdHMgb3B0aW9uc1xuICAgIHByb3BzT3B0aW9uczogbm9ybWFsaXplUHJvcHNPcHRpb25zKHR5cGUsIGFwcENvbnRleHQpLFxuICAgIGVtaXRzT3B0aW9uczogbm9ybWFsaXplRW1pdHNPcHRpb25zKHR5cGUsIGFwcENvbnRleHQpLFxuICAgIC8vIGVtaXRcbiAgICBlbWl0OiBudWxsLFxuICAgIC8vIHRvIGJlIHNldCBpbW1lZGlhdGVseVxuICAgIGVtaXR0ZWQ6IG51bGwsXG4gICAgLy8gcHJvcHMgZGVmYXVsdCB2YWx1ZVxuICAgIHByb3BzRGVmYXVsdHM6IEVNUFRZX09CSixcbiAgICAvLyBpbmhlcml0QXR0cnNcbiAgICBpbmhlcml0QXR0cnM6IHR5cGUuaW5oZXJpdEF0dHJzLFxuICAgIC8vIHN0YXRlXG4gICAgY3R4OiBFTVBUWV9PQkosXG4gICAgZGF0YTogRU1QVFlfT0JKLFxuICAgIHByb3BzOiBFTVBUWV9PQkosXG4gICAgYXR0cnM6IEVNUFRZX09CSixcbiAgICBzbG90czogRU1QVFlfT0JKLFxuICAgIHJlZnM6IEVNUFRZX09CSixcbiAgICBzZXR1cFN0YXRlOiBFTVBUWV9PQkosXG4gICAgc2V0dXBDb250ZXh0OiBudWxsLFxuICAgIC8vIHN1c3BlbnNlIHJlbGF0ZWRcbiAgICBzdXNwZW5zZSxcbiAgICBzdXNwZW5zZUlkOiBzdXNwZW5zZSA/IHN1c3BlbnNlLnBlbmRpbmdJZCA6IDAsXG4gICAgYXN5bmNEZXA6IG51bGwsXG4gICAgYXN5bmNSZXNvbHZlZDogZmFsc2UsXG4gICAgLy8gbGlmZWN5Y2xlIGhvb2tzXG4gICAgLy8gbm90IHVzaW5nIGVudW1zIGhlcmUgYmVjYXVzZSBpdCByZXN1bHRzIGluIGNvbXB1dGVkIHByb3BlcnRpZXNcbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIGlzVW5tb3VudGVkOiBmYWxzZSxcbiAgICBpc0RlYWN0aXZhdGVkOiBmYWxzZSxcbiAgICBiYzogbnVsbCxcbiAgICBjOiBudWxsLFxuICAgIGJtOiBudWxsLFxuICAgIG06IG51bGwsXG4gICAgYnU6IG51bGwsXG4gICAgdTogbnVsbCxcbiAgICB1bTogbnVsbCxcbiAgICBidW06IG51bGwsXG4gICAgZGE6IG51bGwsXG4gICAgYTogbnVsbCxcbiAgICBydGc6IG51bGwsXG4gICAgcnRjOiBudWxsLFxuICAgIGVjOiBudWxsLFxuICAgIHNwOiBudWxsXG4gIH07XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5zdGFuY2UuY3R4ID0gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY3R4ID0geyBfOiBpbnN0YW5jZSB9O1xuICB9XG4gIGluc3RhbmNlLnJvb3QgPSBwYXJlbnQgPyBwYXJlbnQucm9vdCA6IGluc3RhbmNlO1xuICBpbnN0YW5jZS5lbWl0ID0gZW1pdC5iaW5kKG51bGwsIGluc3RhbmNlKTtcbiAgaWYgKHZub2RlLmNlKSB7XG4gICAgdm5vZGUuY2UoaW5zdGFuY2UpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmxldCBjdXJyZW50SW5zdGFuY2UgPSBudWxsO1xuY29uc3QgZ2V0Q3VycmVudEluc3RhbmNlID0gKCkgPT4gY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbmxldCBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZTtcbmxldCBzZXRJblNTUlNldHVwU3RhdGU7XG57XG4gIGNvbnN0IGcgPSBnZXRHbG9iYWxUaGlzKCk7XG4gIGNvbnN0IHJlZ2lzdGVyR2xvYmFsU2V0dGVyID0gKGtleSwgc2V0dGVyKSA9PiB7XG4gICAgbGV0IHNldHRlcnM7XG4gICAgaWYgKCEoc2V0dGVycyA9IGdba2V5XSkpIHNldHRlcnMgPSBnW2tleV0gPSBbXTtcbiAgICBzZXR0ZXJzLnB1c2goc2V0dGVyKTtcbiAgICByZXR1cm4gKHYpID0+IHtcbiAgICAgIGlmIChzZXR0ZXJzLmxlbmd0aCA+IDEpIHNldHRlcnMuZm9yRWFjaCgoc2V0KSA9PiBzZXQodikpO1xuICAgICAgZWxzZSBzZXR0ZXJzWzBdKHYpO1xuICAgIH07XG4gIH07XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlID0gcmVnaXN0ZXJHbG9iYWxTZXR0ZXIoXG4gICAgYF9fVlVFX0lOU1RBTkNFX1NFVFRFUlNfX2AsXG4gICAgKHYpID0+IGN1cnJlbnRJbnN0YW5jZSA9IHZcbiAgKTtcbiAgc2V0SW5TU1JTZXR1cFN0YXRlID0gcmVnaXN0ZXJHbG9iYWxTZXR0ZXIoXG4gICAgYF9fVlVFX1NTUl9TRVRURVJTX19gLFxuICAgICh2KSA9PiBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSB2XG4gICk7XG59XG5jb25zdCBzZXRDdXJyZW50SW5zdGFuY2UgPSAoaW5zdGFuY2UpID0+IHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICBpbnN0YW5jZS5zY29wZS5vbigpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGluc3RhbmNlLnNjb3BlLm9mZigpO1xuICAgIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKHByZXYpO1xuICB9O1xufTtcbmNvbnN0IHVuc2V0Q3VycmVudEluc3RhbmNlID0gKCkgPT4ge1xuICBjdXJyZW50SW5zdGFuY2UgJiYgY3VycmVudEluc3RhbmNlLnNjb3BlLm9mZigpO1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShudWxsKTtcbn07XG5jb25zdCBpc0J1aWx0SW5UYWcgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcInNsb3QsY29tcG9uZW50XCIpO1xuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUsIHsgaXNOYXRpdmVUYWcgfSkge1xuICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGlzTmF0aXZlVGFnKG5hbWUpKSB7XG4gICAgd2FybiQxKFxuICAgICAgXCJEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50IGlkOiBcIiArIG5hbWVcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBpc1N0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS52bm9kZS5zaGFwZUZsYWcgJiA0O1xufVxubGV0IGlzSW5TU1JDb21wb25lbnRTZXR1cCA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0dXBDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSID0gZmFsc2UsIG9wdGltaXplZCA9IGZhbHNlKSB7XG4gIGlzU1NSICYmIHNldEluU1NSU2V0dXBTdGF0ZShpc1NTUik7XG4gIGNvbnN0IHsgcHJvcHMsIGNoaWxkcmVuIH0gPSBpbnN0YW5jZS52bm9kZTtcbiAgY29uc3QgaXNTdGF0ZWZ1bCA9IGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpO1xuICBpbml0UHJvcHMoaW5zdGFuY2UsIHByb3BzLCBpc1N0YXRlZnVsLCBpc1NTUik7XG4gIGluaXRTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCB8fCBpc1NTUik7XG4gIGNvbnN0IHNldHVwUmVzdWx0ID0gaXNTdGF0ZWZ1bCA/IHNldHVwU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSKSA6IHZvaWQgMDtcbiAgaXNTU1IgJiYgc2V0SW5TU1JTZXR1cFN0YXRlKGZhbHNlKTtcbiAgcmV0dXJuIHNldHVwUmVzdWx0O1xufVxuZnVuY3Rpb24gc2V0dXBTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IpIHtcbiAgdmFyIF9hO1xuICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGlmIChDb21wb25lbnQubmFtZSkge1xuICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKENvbXBvbmVudC5uYW1lLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuY29tcG9uZW50cykge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhDb21wb25lbnQuY29tcG9uZW50cyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lc1tpXSwgaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQ29tcG9uZW50LmRpcmVjdGl2ZXMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoQ29tcG9uZW50LmRpcmVjdGl2ZXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWxpZGF0ZURpcmVjdGl2ZU5hbWUobmFtZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQ29tcG9uZW50LmNvbXBpbGVyT3B0aW9ucyAmJiBpc1J1bnRpbWVPbmx5KCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFwiY29tcGlsZXJPcHRpb25zXCIgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBhIGJ1aWxkIG9mIFZ1ZSB0aGF0IGluY2x1ZGVzIHRoZSBydW50aW1lIGNvbXBpbGVyLiBTaW5jZSB5b3UgYXJlIHVzaW5nIGEgcnVudGltZS1vbmx5IGJ1aWxkLCB0aGUgb3B0aW9ucyBzaG91bGQgYmUgcGFzc2VkIHZpYSB5b3VyIGJ1aWxkIHRvb2wgY29uZmlnIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaW5zdGFuY2UuYWNjZXNzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgaW5zdGFuY2UucHJveHkgPSBuZXcgUHJveHkoaW5zdGFuY2UuY3R4LCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGV4cG9zZVByb3BzT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgfVxuICBjb25zdCB7IHNldHVwIH0gPSBDb21wb25lbnQ7XG4gIGlmIChzZXR1cCkge1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICBjb25zdCBzZXR1cENvbnRleHQgPSBpbnN0YW5jZS5zZXR1cENvbnRleHQgPSBzZXR1cC5sZW5ndGggPiAxID8gY3JlYXRlU2V0dXBDb250ZXh0KGluc3RhbmNlKSA6IG51bGw7XG4gICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIGNvbnN0IHNldHVwUmVzdWx0ID0gY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgc2V0dXAsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDAsXG4gICAgICBbXG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaW5zdGFuY2UucHJvcHMpIDogaW5zdGFuY2UucHJvcHMsXG4gICAgICAgIHNldHVwQ29udGV4dFxuICAgICAgXVxuICAgICk7XG4gICAgY29uc3QgaXNBc3luY1NldHVwID0gaXNQcm9taXNlKHNldHVwUmVzdWx0KTtcbiAgICByZXNldFRyYWNraW5nKCk7XG4gICAgcmVzZXQoKTtcbiAgICBpZiAoKGlzQXN5bmNTZXR1cCB8fCBpbnN0YW5jZS5zcCkgJiYgIWlzQXN5bmNXcmFwcGVyKGluc3RhbmNlKSkge1xuICAgICAgbWFya0FzeW5jQm91bmRhcnkoaW5zdGFuY2UpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY1NldHVwKSB7XG4gICAgICBzZXR1cFJlc3VsdC50aGVuKHVuc2V0Q3VycmVudEluc3RhbmNlLCB1bnNldEN1cnJlbnRJbnN0YW5jZSk7XG4gICAgICBpZiAoaXNTU1IpIHtcbiAgICAgICAgcmV0dXJuIHNldHVwUmVzdWx0LnRoZW4oKHJlc29sdmVkUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHJlc29sdmVkUmVzdWx0LCBpc1NTUik7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgaW5zdGFuY2UsIDApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLmFzeW5jRGVwID0gc2V0dXBSZXN1bHQ7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpbnN0YW5jZS5zdXNwZW5zZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSAoX2EgPSBDb21wb25lbnQubmFtZSkgIT0gbnVsbCA/IF9hIDogXCJBbm9ueW1vdXNcIjtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQ29tcG9uZW50IDwke25hbWV9Pjogc2V0dXAgZnVuY3Rpb24gcmV0dXJuZWQgYSBwcm9taXNlLCBidXQgbm8gPFN1c3BlbnNlPiBib3VuZGFyeSB3YXMgZm91bmQgaW4gdGhlIHBhcmVudCBjb21wb25lbnQgdHJlZS4gQSBjb21wb25lbnQgd2l0aCBhc3luYyBzZXR1cCgpIG11c3QgYmUgbmVzdGVkIGluIGEgPFN1c3BlbnNlPiBpbiBvcmRlciB0byBiZSByZW5kZXJlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgc2V0dXBSZXN1bHQsIGlzU1NSKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUikge1xuICBpZiAoaXNGdW5jdGlvbihzZXR1cFJlc3VsdCkpIHtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5fX3NzcklubGluZVJlbmRlcikge1xuICAgICAgaW5zdGFuY2Uuc3NyUmVuZGVyID0gc2V0dXBSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzZXR1cFJlc3VsdCkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc1ZOb2RlKHNldHVwUmVzdWx0KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgc2V0dXAoKSBzaG91bGQgbm90IHJldHVybiBWTm9kZXMgZGlyZWN0bHkgLSByZXR1cm4gYSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLmRldnRvb2xzUmF3U2V0dXBTdGF0ZSA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgICBpbnN0YW5jZS5zZXR1cFN0YXRlID0gcHJveHlSZWZzKHNldHVwUmVzdWx0KTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZXhwb3NlU2V0dXBTdGF0ZU9uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBSZXN1bHQgIT09IHZvaWQgMCkge1xuICAgIHdhcm4kMShcbiAgICAgIGBzZXR1cCgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LiBSZWNlaXZlZDogJHtzZXR1cFJlc3VsdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHNldHVwUmVzdWx0fWBcbiAgICApO1xuICB9XG4gIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG59XG5sZXQgY29tcGlsZTtcbmxldCBpbnN0YWxsV2l0aFByb3h5O1xuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIoX2NvbXBpbGUpIHtcbiAgY29tcGlsZSA9IF9jb21waWxlO1xuICBpbnN0YWxsV2l0aFByb3h5ID0gKGkpID0+IHtcbiAgICBpZiAoaS5yZW5kZXIuX3JjKSB7XG4gICAgICBpLndpdGhQcm94eSA9IG5ldyBQcm94eShpLmN0eCwgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzKTtcbiAgICB9XG4gIH07XG59XG5jb25zdCBpc1J1bnRpbWVPbmx5ID0gKCkgPT4gIWNvbXBpbGU7XG5mdW5jdGlvbiBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IsIHNraXBPcHRpb25zKSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghaW5zdGFuY2UucmVuZGVyKSB7XG4gICAgaWYgKCFpc1NTUiAmJiBjb21waWxlICYmICFDb21wb25lbnQucmVuZGVyKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IENvbXBvbmVudC50ZW1wbGF0ZSB8fCBfX1ZVRV9PUFRJT05TX0FQSV9fICYmIHJlc29sdmVNZXJnZWRPcHRpb25zKGluc3RhbmNlKS50ZW1wbGF0ZTtcbiAgICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGNvbXBpbGVgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGlzQ3VzdG9tRWxlbWVudCwgY29tcGlsZXJPcHRpb25zIH0gPSBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZztcbiAgICAgICAgY29uc3QgeyBkZWxpbWl0ZXJzLCBjb21waWxlck9wdGlvbnM6IGNvbXBvbmVudENvbXBpbGVyT3B0aW9ucyB9ID0gQ29tcG9uZW50O1xuICAgICAgICBjb25zdCBmaW5hbENvbXBpbGVyT3B0aW9ucyA9IGV4dGVuZChcbiAgICAgICAgICBleHRlbmQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzQ3VzdG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgZGVsaW1pdGVyc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9uc1xuICAgICAgICAgICksXG4gICAgICAgICAgY29tcG9uZW50Q29tcGlsZXJPcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIENvbXBvbmVudC5yZW5kZXIgPSBjb21waWxlKHRlbXBsYXRlLCBmaW5hbENvbXBpbGVyT3B0aW9ucyk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGNvbXBpbGVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpbnN0YW5jZS5yZW5kZXIgPSBDb21wb25lbnQucmVuZGVyIHx8IE5PT1A7XG4gICAgaWYgKGluc3RhbGxXaXRoUHJveHkpIHtcbiAgICAgIGluc3RhbGxXaXRoUHJveHkoaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiB0cnVlKSB7XG4gICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICB0cnkge1xuICAgICAgYXBwbHlPcHRpb25zKGluc3RhbmNlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgcmVzZXQoKTtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIUNvbXBvbmVudC5yZW5kZXIgJiYgaW5zdGFuY2UucmVuZGVyID09PSBOT09QICYmICFpc1NTUikge1xuICAgIGlmICghY29tcGlsZSAmJiBDb21wb25lbnQudGVtcGxhdGUpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYENvbXBvbmVudCBwcm92aWRlZCB0ZW1wbGF0ZSBvcHRpb24gYnV0IHJ1bnRpbWUgY29tcGlsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJ1aWxkIG9mIFZ1ZS5gICsgKGAgQ29uZmlndXJlIHlvdXIgYnVuZGxlciB0byBhbGlhcyBcInZ1ZVwiIHRvIFwidnVlL2Rpc3QvdnVlLmVzbS1idW5kbGVyLmpzXCIuYCApXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuJDEoYENvbXBvbmVudCBpcyBtaXNzaW5nIHRlbXBsYXRlIG9yIHJlbmRlciBmdW5jdGlvbjogYCwgQ29tcG9uZW50KTtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IGF0dHJzUHJveHlIYW5kbGVycyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gIGdldCh0YXJnZXQsIGtleSkge1xuICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBcIlwiKTtcbiAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gIH0sXG4gIHNldCgpIHtcbiAgICB3YXJuJDEoYHNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KCkge1xuICAgIHdhcm4kMShgc2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSA6IHtcbiAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBcIlwiKTtcbiAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gIH1cbn07XG5mdW5jdGlvbiBnZXRTbG90c1Byb3h5KGluc3RhbmNlKSB7XG4gIHJldHVybiBuZXcgUHJveHkoaW5zdGFuY2Uuc2xvdHMsIHtcbiAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBcIiRzbG90c1wiKTtcbiAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlU2V0dXBDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IGV4cG9zZSA9IChleHBvc2VkKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5leHBvc2VkKSB7XG4gICAgICAgIHdhcm4kMShgZXhwb3NlKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNldHVwKCkuYCk7XG4gICAgICB9XG4gICAgICBpZiAoZXhwb3NlZCAhPSBudWxsKSB7XG4gICAgICAgIGxldCBleHBvc2VkVHlwZSA9IHR5cGVvZiBleHBvc2VkO1xuICAgICAgICBpZiAoZXhwb3NlZFR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShleHBvc2VkKSkge1xuICAgICAgICAgICAgZXhwb3NlZFR5cGUgPSBcImFycmF5XCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1JlZihleHBvc2VkKSkge1xuICAgICAgICAgICAgZXhwb3NlZFR5cGUgPSBcInJlZlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwb3NlZFR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgZXhwb3NlKCkgc2hvdWxkIGJlIHBhc3NlZCBhIHBsYWluIG9iamVjdCwgcmVjZWl2ZWQgJHtleHBvc2VkVHlwZX0uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zdGFuY2UuZXhwb3NlZCA9IGV4cG9zZWQgfHwge307XG4gIH07XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgbGV0IGF0dHJzUHJveHk7XG4gICAgbGV0IHNsb3RzUHJveHk7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgZ2V0IGF0dHJzKCkge1xuICAgICAgICByZXR1cm4gYXR0cnNQcm94eSB8fCAoYXR0cnNQcm94eSA9IG5ldyBQcm94eShpbnN0YW5jZS5hdHRycywgYXR0cnNQcm94eUhhbmRsZXJzKSk7XG4gICAgICB9LFxuICAgICAgZ2V0IHNsb3RzKCkge1xuICAgICAgICByZXR1cm4gc2xvdHNQcm94eSB8fCAoc2xvdHNQcm94eSA9IGdldFNsb3RzUHJveHkoaW5zdGFuY2UpKTtcbiAgICAgIH0sXG4gICAgICBnZXQgZW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIChldmVudCwgLi4uYXJncykgPT4gaW5zdGFuY2UuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgICB9LFxuICAgICAgZXhwb3NlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJzOiBuZXcgUHJveHkoaW5zdGFuY2UuYXR0cnMsIGF0dHJzUHJveHlIYW5kbGVycyksXG4gICAgICBzbG90czogaW5zdGFuY2Uuc2xvdHMsXG4gICAgICBlbWl0OiBpbnN0YW5jZS5lbWl0LFxuICAgICAgZXhwb3NlXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuZXhwb3NlUHJveHkgfHwgKGluc3RhbmNlLmV4cG9zZVByb3h5ID0gbmV3IFByb3h5KHByb3h5UmVmcyhtYXJrUmF3KGluc3RhbmNlLmV4cG9zZWQpKSwge1xuICAgICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmIChrZXkgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSBpbiBwdWJsaWNQcm9wZXJ0aWVzTWFwKSB7XG4gICAgICAgICAgcmV0dXJuIHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XShpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYXModGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSBpbiB0YXJnZXQgfHwga2V5IGluIHB1YmxpY1Byb3BlcnRpZXNNYXA7XG4gICAgICB9XG4gICAgfSkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnN0YW5jZS5wcm94eTtcbiAgfVxufVxuY29uc3QgY2xhc3NpZnlSRSA9IC8oPzpefFstX10pKFxcdykvZztcbmNvbnN0IGNsYXNzaWZ5ID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoY2xhc3NpZnlSRSwgKGMpID0+IGMudG9VcHBlckNhc2UoKSkucmVwbGFjZSgvWy1fXS9nLCBcIlwiKTtcbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50LCBpbmNsdWRlSW5mZXJyZWQgPSB0cnVlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKENvbXBvbmVudCkgPyBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgOiBDb21wb25lbnQubmFtZSB8fCBpbmNsdWRlSW5mZXJyZWQgJiYgQ29tcG9uZW50Ll9fbmFtZTtcbn1cbmZ1bmN0aW9uIGZvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIENvbXBvbmVudCwgaXNSb290ID0gZmFsc2UpIHtcbiAgbGV0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCk7XG4gIGlmICghbmFtZSAmJiBDb21wb25lbnQuX19maWxlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBDb21wb25lbnQuX19maWxlLm1hdGNoKC8oW14vXFxcXF0rKVxcLlxcdyskLyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9XG4gIGlmICghbmFtZSAmJiBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wYXJlbnQpIHtcbiAgICBjb25zdCBpbmZlckZyb21SZWdpc3RyeSA9IChyZWdpc3RyeSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVnaXN0cnkpIHtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5W2tleV0gPT09IENvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIG5hbWUgPSBpbmZlckZyb21SZWdpc3RyeShcbiAgICAgIGluc3RhbmNlLmNvbXBvbmVudHMgfHwgaW5zdGFuY2UucGFyZW50LnR5cGUuY29tcG9uZW50c1xuICAgICkgfHwgaW5mZXJGcm9tUmVnaXN0cnkoaW5zdGFuY2UuYXBwQ29udGV4dC5jb21wb25lbnRzKTtcbiAgfVxuICByZXR1cm4gbmFtZSA/IGNsYXNzaWZ5KG5hbWUpIDogaXNSb290ID8gYEFwcGAgOiBgQW5vbnltb3VzYDtcbn1cbmZ1bmN0aW9uIGlzQ2xhc3NDb21wb25lbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpICYmIFwiX192Y2NPcHRzXCIgaW4gdmFsdWU7XG59XG5cbmNvbnN0IGNvbXB1dGVkID0gKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zKSA9PiB7XG4gIGNvbnN0IGMgPSBjb21wdXRlZCQxKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc0luU1NSQ29tcG9uZW50U2V0dXApO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoaSAmJiBpLmFwcENvbnRleHQuY29uZmlnLndhcm5SZWN1cnNpdmVDb21wdXRlZCkge1xuICAgICAgYy5fd2FyblJlY3Vyc2l2ZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjO1xufTtcblxuZnVuY3Rpb24gaCh0eXBlLCBwcm9wc09yQ2hpbGRyZW4sIGNoaWxkcmVuKSB7XG4gIGNvbnN0IGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuICBpZiAobCA9PT0gMikge1xuICAgIGlmIChpc09iamVjdChwcm9wc09yQ2hpbGRyZW4pICYmICFpc0FycmF5KHByb3BzT3JDaGlsZHJlbikpIHtcbiAgICAgIGlmIChpc1ZOb2RlKHByb3BzT3JDaGlsZHJlbikpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIG51bGwsIFtwcm9wc09yQ2hpbGRyZW5dKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wc09yQ2hpbGRyZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbnVsbCwgcHJvcHNPckNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGwgPiAzKSB7XG4gICAgICBjaGlsZHJlbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgfSBlbHNlIGlmIChsID09PSAzICYmIGlzVk5vZGUoY2hpbGRyZW4pKSB7XG4gICAgICBjaGlsZHJlbiA9IFtjaGlsZHJlbl07XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wc09yQ2hpbGRyZW4sIGNoaWxkcmVuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0Q3VzdG9tRm9ybWF0dGVyKCkge1xuICBpZiAoISEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB2dWVTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6IzNiYTc3NlwiIH07XG4gIGNvbnN0IG51bWJlclN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojMTY3N2ZmXCIgfTtcbiAgY29uc3Qgc3RyaW5nU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiNmNTIyMmRcIiB9O1xuICBjb25zdCBrZXl3b3JkU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiNlYjJmOTZcIiB9O1xuICBjb25zdCBmb3JtYXR0ZXIgPSB7XG4gICAgX192dWVfY3VzdG9tX2Zvcm1hdHRlcjogdHJ1ZSxcbiAgICBoZWFkZXIob2JqKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAob2JqLl9faXNWdWUpIHtcbiAgICAgICAgcmV0dXJuIFtcImRpdlwiLCB2dWVTdHlsZSwgYFZ1ZUluc3RhbmNlYF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVmKG9iaikpIHtcbiAgICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9iai52YWx1ZTtcbiAgICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgZ2VuUmVmRmxhZyhvYmopXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgYD5gXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgaXNTaGFsbG93KG9iaikgPyBcIlNoYWxsb3dSZWFjdGl2ZVwiIDogXCJSZWFjdGl2ZVwiXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZShvYmopLFxuICAgICAgICAgIGA+JHtpc1JlYWRvbmx5KG9iaikgPyBgIChyZWFkb25seSlgIDogYGB9YFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWRvbmx5KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGlzU2hhbGxvdyhvYmopID8gXCJTaGFsbG93UmVhZG9ubHlcIiA6IFwiUmVhZG9ubHlcIl0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqKSxcbiAgICAgICAgICBcIj5cIlxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBoYXNCb2R5KG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19pc1Z1ZTtcbiAgICB9LFxuICAgIGJvZHkob2JqKSB7XG4gICAgICBpZiAob2JqICYmIG9iai5fX2lzVnVlKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICAuLi5mb3JtYXRJbnN0YW5jZShvYmouJClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGZvcm1hdEluc3RhbmNlKGluc3RhbmNlKSB7XG4gICAgY29uc3QgYmxvY2tzID0gW107XG4gICAgaWYgKGluc3RhbmNlLnR5cGUucHJvcHMgJiYgaW5zdGFuY2UucHJvcHMpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJwcm9wc1wiLCB0b1JhdyhpbnN0YW5jZS5wcm9wcykpKTtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLnNldHVwU3RhdGUgIT09IEVNUFRZX09CSikge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcInNldHVwXCIsIGluc3RhbmNlLnNldHVwU3RhdGUpKTtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLmRhdGEgIT09IEVNUFRZX09CSikge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImRhdGFcIiwgdG9SYXcoaW5zdGFuY2UuZGF0YSkpKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWQgPSBleHRyYWN0S2V5cyhpbnN0YW5jZSwgXCJjb21wdXRlZFwiKTtcbiAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJjb21wdXRlZFwiLCBjb21wdXRlZCkpO1xuICAgIH1cbiAgICBjb25zdCBpbmplY3RlZCA9IGV4dHJhY3RLZXlzKGluc3RhbmNlLCBcImluamVjdFwiKTtcbiAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJpbmplY3RlZFwiLCBpbmplY3RlZCkpO1xuICAgIH1cbiAgICBibG9ja3MucHVzaChbXG4gICAgICBcImRpdlwiLFxuICAgICAge30sXG4gICAgICBbXG4gICAgICAgIFwic3BhblwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IGtleXdvcmRTdHlsZS5zdHlsZSArIFwiO29wYWNpdHk6MC42NlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiJCAoaW50ZXJuYWwpOiBcIlxuICAgICAgXSxcbiAgICAgIFtcIm9iamVjdFwiLCB7IG9iamVjdDogaW5zdGFuY2UgfV1cbiAgICBdKTtcbiAgICByZXR1cm4gYmxvY2tzO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQmxvY2sodHlwZSwgdGFyZ2V0KSB7XG4gICAgdGFyZ2V0ID0gZXh0ZW5kKHt9LCB0YXJnZXQpO1xuICAgIGlmICghT2JqZWN0LmtleXModGFyZ2V0KS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHt9XTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7IHN0eWxlOiBcImxpbmUtaGVpZ2h0OjEuMjVlbTttYXJnaW4tYm90dG9tOjAuNmVtXCIgfSxcbiAgICAgIFtcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBcImNvbG9yOiM0NzY1ODJcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IFwicGFkZGluZy1sZWZ0OjEuMjVlbVwiXG4gICAgICAgIH0sXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHRhcmdldCkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgW1wic3BhblwiLCBrZXl3b3JkU3R5bGUsIGtleSArIFwiOiBcIl0sXG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSh0YXJnZXRba2V5XSwgZmFsc2UpXG4gICAgICAgICAgXTtcbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICBdO1xuICB9XG4gIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHYsIGFzUmF3ID0gdHJ1ZSkge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgbnVtYmVyU3R5bGUsIHZdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHN0cmluZ1N0eWxlLCBKU09OLnN0cmluZ2lmeSh2KV07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIGtleXdvcmRTdHlsZSwgdl07XG4gICAgfSBlbHNlIGlmIChpc09iamVjdCh2KSkge1xuICAgICAgcmV0dXJuIFtcIm9iamVjdFwiLCB7IG9iamVjdDogYXNSYXcgPyB0b1Jhdyh2KSA6IHYgfV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHN0cmluZ1N0eWxlLCBTdHJpbmcodildO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBleHRyYWN0S2V5cyhpbnN0YW5jZSwgdHlwZSkge1xuICAgIGNvbnN0IENvbXAgPSBpbnN0YW5jZS50eXBlO1xuICAgIGlmIChpc0Z1bmN0aW9uKENvbXApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGluc3RhbmNlLmN0eCkge1xuICAgICAgaWYgKGlzS2V5T2ZUeXBlKENvbXAsIGtleSwgdHlwZSkpIHtcbiAgICAgICAgZXh0cmFjdGVkW2tleV0gPSBpbnN0YW5jZS5jdHhba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4dHJhY3RlZDtcbiAgfVxuICBmdW5jdGlvbiBpc0tleU9mVHlwZShDb21wLCBrZXksIHR5cGUpIHtcbiAgICBjb25zdCBvcHRzID0gQ29tcFt0eXBlXTtcbiAgICBpZiAoaXNBcnJheShvcHRzKSAmJiBvcHRzLmluY2x1ZGVzKGtleSkgfHwgaXNPYmplY3Qob3B0cykgJiYga2V5IGluIG9wdHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ29tcC5leHRlbmRzICYmIGlzS2V5T2ZUeXBlKENvbXAuZXh0ZW5kcywga2V5LCB0eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDb21wLm1peGlucyAmJiBDb21wLm1peGlucy5zb21lKChtKSA9PiBpc0tleU9mVHlwZShtLCBrZXksIHR5cGUpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlblJlZkZsYWcodikge1xuICAgIGlmIChpc1NoYWxsb3codikpIHtcbiAgICAgIHJldHVybiBgU2hhbGxvd1JlZmA7XG4gICAgfVxuICAgIGlmICh2LmVmZmVjdCkge1xuICAgICAgcmV0dXJuIGBDb21wdXRlZFJlZmA7XG4gICAgfVxuICAgIHJldHVybiBgUmVmYDtcbiAgfVxuICBpZiAod2luZG93LmRldnRvb2xzRm9ybWF0dGVycykge1xuICAgIHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMucHVzaChmb3JtYXR0ZXIpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMgPSBbZm9ybWF0dGVyXTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3aXRoTWVtbyhtZW1vLCByZW5kZXIsIGNhY2hlLCBpbmRleCkge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZVtpbmRleF07XG4gIGlmIChjYWNoZWQgJiYgaXNNZW1vU2FtZShjYWNoZWQsIG1lbW8pKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByZXQgPSByZW5kZXIoKTtcbiAgcmV0Lm1lbW8gPSBtZW1vLnNsaWNlKCk7XG4gIHJldC5jYWNoZUluZGV4ID0gaW5kZXg7XG4gIHJldHVybiBjYWNoZVtpbmRleF0gPSByZXQ7XG59XG5mdW5jdGlvbiBpc01lbW9TYW1lKGNhY2hlZCwgbWVtbykge1xuICBjb25zdCBwcmV2ID0gY2FjaGVkLm1lbW87XG4gIGlmIChwcmV2Lmxlbmd0aCAhPSBtZW1vLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2ldLCBtZW1vW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiBjdXJyZW50QmxvY2spIHtcbiAgICBjdXJyZW50QmxvY2sucHVzaChjYWNoZWQpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCB2ZXJzaW9uID0gXCIzLjUuMTlcIjtcbmNvbnN0IHdhcm4gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gd2FybiQxIDogTk9PUDtcbmNvbnN0IEVycm9yVHlwZVN0cmluZ3MgPSBFcnJvclR5cGVTdHJpbmdzJDEgO1xuY29uc3QgZGV2dG9vbHMgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IHRydWUgPyBkZXZ0b29scyQxIDogdm9pZCAwO1xuY29uc3Qgc2V0RGV2dG9vbHNIb29rID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0cnVlID8gc2V0RGV2dG9vbHNIb29rJDEgOiBOT09QO1xuY29uc3QgX3NzclV0aWxzID0ge1xuICBjcmVhdGVDb21wb25lbnRJbnN0YW5jZSxcbiAgc2V0dXBDb21wb25lbnQsXG4gIHJlbmRlckNvbXBvbmVudFJvb3QsXG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSxcbiAgaXNWTm9kZTogaXNWTm9kZSxcbiAgbm9ybWFsaXplVk5vZGUsXG4gIGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlLFxuICBlbnN1cmVWYWxpZFZOb2RlLFxuICBwdXNoV2FybmluZ0NvbnRleHQsXG4gIHBvcFdhcm5pbmdDb250ZXh0XG59O1xuY29uc3Qgc3NyVXRpbHMgPSBfc3NyVXRpbHMgO1xuY29uc3QgcmVzb2x2ZUZpbHRlciA9IG51bGw7XG5jb25zdCBjb21wYXRVdGlscyA9IG51bGw7XG5jb25zdCBEZXByZWNhdGlvblR5cGVzID0gbnVsbDtcblxuZXhwb3J0IHsgQmFzZVRyYW5zaXRpb24sIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCBDb21tZW50LCBEZXByZWNhdGlvblR5cGVzLCBFcnJvckNvZGVzLCBFcnJvclR5cGVTdHJpbmdzLCBGcmFnbWVudCwgS2VlcEFsaXZlLCBTdGF0aWMsIFN1c3BlbnNlLCBUZWxlcG9ydCwgVGV4dCwgYXNzZXJ0TnVtYmVyLCBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZywgY2FsbFdpdGhFcnJvckhhbmRsaW5nLCBjbG9uZVZOb2RlLCBjb21wYXRVdGlscywgY29tcHV0ZWQsIGNyZWF0ZUJsb2NrLCBjcmVhdGVDb21tZW50Vk5vZGUsIGNyZWF0ZUVsZW1lbnRCbG9jaywgY3JlYXRlQmFzZVZOb2RlIGFzIGNyZWF0ZUVsZW1lbnRWTm9kZSwgY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIsIGNyZWF0ZVByb3BzUmVzdFByb3h5LCBjcmVhdGVSZW5kZXJlciwgY3JlYXRlU2xvdHMsIGNyZWF0ZVN0YXRpY1ZOb2RlLCBjcmVhdGVUZXh0Vk5vZGUsIGNyZWF0ZVZOb2RlLCBkZWZpbmVBc3luY0NvbXBvbmVudCwgZGVmaW5lQ29tcG9uZW50LCBkZWZpbmVFbWl0cywgZGVmaW5lRXhwb3NlLCBkZWZpbmVNb2RlbCwgZGVmaW5lT3B0aW9ucywgZGVmaW5lUHJvcHMsIGRlZmluZVNsb3RzLCBkZXZ0b29scywgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4sIGd1YXJkUmVhY3RpdmVQcm9wcywgaCwgaGFuZGxlRXJyb3IsIGhhc0luamVjdGlvbkNvbnRleHQsIGh5ZHJhdGVPbklkbGUsIGh5ZHJhdGVPbkludGVyYWN0aW9uLCBoeWRyYXRlT25NZWRpYVF1ZXJ5LCBoeWRyYXRlT25WaXNpYmxlLCBpbml0Q3VzdG9tRm9ybWF0dGVyLCBpbmplY3QsIGlzTWVtb1NhbWUsIGlzUnVudGltZU9ubHksIGlzVk5vZGUsIG1lcmdlRGVmYXVsdHMsIG1lcmdlTW9kZWxzLCBtZXJnZVByb3BzLCBuZXh0VGljaywgb25BY3RpdmF0ZWQsIG9uQmVmb3JlTW91bnQsIG9uQmVmb3JlVW5tb3VudCwgb25CZWZvcmVVcGRhdGUsIG9uRGVhY3RpdmF0ZWQsIG9uRXJyb3JDYXB0dXJlZCwgb25Nb3VudGVkLCBvblJlbmRlclRyYWNrZWQsIG9uUmVuZGVyVHJpZ2dlcmVkLCBvblNlcnZlclByZWZldGNoLCBvblVubW91bnRlZCwgb25VcGRhdGVkLCBvcGVuQmxvY2ssIHBvcFNjb3BlSWQsIHByb3ZpZGUsIHB1c2hTY29wZUlkLCBxdWV1ZVBvc3RGbHVzaENiLCByZWdpc3RlclJ1bnRpbWVDb21waWxlciwgcmVuZGVyTGlzdCwgcmVuZGVyU2xvdCwgcmVzb2x2ZUNvbXBvbmVudCwgcmVzb2x2ZURpcmVjdGl2ZSwgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHJlc29sdmVGaWx0ZXIsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIHNldEJsb2NrVHJhY2tpbmcsIHNldERldnRvb2xzSG9vaywgc2V0VHJhbnNpdGlvbkhvb2tzLCBzc3JDb250ZXh0S2V5LCBzc3JVdGlscywgdG9IYW5kbGVycywgdHJhbnNmb3JtVk5vZGVBcmdzLCB1c2VBdHRycywgdXNlSWQsIHVzZU1vZGVsLCB1c2VTU1JDb250ZXh0LCB1c2VTbG90cywgdXNlVGVtcGxhdGVSZWYsIHVzZVRyYW5zaXRpb25TdGF0ZSwgdmVyc2lvbiwgd2Fybiwgd2F0Y2gsIHdhdGNoRWZmZWN0LCB3YXRjaFBvc3RFZmZlY3QsIHdhdGNoU3luY0VmZmVjdCwgd2l0aEFzeW5jQ29udGV4dCwgd2l0aEN0eCwgd2l0aERlZmF1bHRzLCB3aXRoRGlyZWN0aXZlcywgd2l0aE1lbW8sIHdpdGhTY29wZUlkIH07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQSxTQUFTLGVBQWUsZUFBZSxPQUFPLE9BQU8sVUFBVSxZQUFZLFVBQVUsWUFBWSxLQUFLLFdBQVcsWUFBWSxrQkFBa0IsWUFBWSxZQUFZLGlCQUFpQixPQUFPLFVBQVUsaUJBQWlCLFNBQVMsZ0JBQWdCLFNBQVMsU0FBUyxXQUFXLFNBQVMsV0FBVyxTQUFTLGFBQWEsWUFBWSxrQkFBa0I7QUFDeFYsU0FBUyxhQUFhLGdCQUFnQixjQUFjLGdCQUFnQixXQUFXLFFBQVEsYUFBYSxpQkFBaUIsbUJBQW1CLFNBQVMsWUFBWSxZQUFZLE9BQU8sV0FBVyxTQUFTLGdCQUFnQixrQkFB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QUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUNwQyxRQUFJLFdBQVcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRztBQUNoQyxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDQSxNQUFJLHFCQUFxQixLQUFLLGNBQWM7QUFDMUMsaUJBQWEsS0FBSyxNQUFNO0FBQUEsRUFDMUI7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxNQUFNLFVBQVU7QUFDaEIsTUFBTSxPQUFPLE9BQTRDLFNBQVM7QUFDbEUsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxXQUFXLE9BQW9ELGFBQWE7QUFDbEYsTUFBTSxrQkFBa0IsT0FBb0Qsb0JBQW9CO0FBQ2hHLE1BQU0sWUFBWTtBQUFBLEVBQ2hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFDQSxNQUFNLFdBQVc7QUFDakIsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sbUJBQW1CO0FBRXpCLFNBQVMsZ0JBQWdCLCtCQUErQixTQUFTLGtCQUFrQixZQUFZLGtCQUFrQixVQUFVLFdBQVcsUUFBUSxVQUFVLFVBQVUsTUFBTSxjQUFjLDRCQUE0Qix1QkFBdUIsWUFBWSxhQUFhLFVBQVUsYUFBYSxvQkFBb0Isb0JBQW9CLG1CQUFtQixvQkFBb0IseUJBQXlCLHNCQUFzQixnQkFBZ0IsYUFBYSxtQkFBbUIsaUJBQWlCLGFBQWEsc0JBQXNCLGlCQUFpQixhQUFhLGNBQWMsYUFBYSxlQUFlLGFBQWEsYUFBYSxVQUFVLG9CQUFvQiwwQkFBMEIsb0JBQW9CLEdBQUcsYUFBYSxxQkFBcUIsZUFBZSxzQkFBc0IscUJBQXFCLGtCQUFrQixxQkFBcUIsUUFBUSxZQUFZLGVBQWUsU0FBUyxlQUFlLGFBQWEsWUFBWSxVQUFVLGFBQWEsZUFBZSxpQkFBaUIsZ0JBQWdCLGVBQWUsaUJBQWlCLFdBQVcsaUJBQWlCLG1CQUFtQixrQkFBa0IsYUFBYSxXQUFXLFdBQVcsWUFBWSxTQUFTLGFBQWEsa0JBQWtCLHlCQUF5QixZQUFZLFlBQVksa0JBQWtCLGtCQUFrQix5QkFBeUIsZUFBZSx3QkFBd0Isa0JBQWtCLGlCQUFpQixvQkFBb0IsZUFBZSxVQUFVLFlBQVksb0JBQW9CLFVBQVUsT0FBTyxVQUFVLGVBQWUsVUFBVSxnQkFBZ0Isb0JBQW9CLFNBQVMsTUFBTSxPQUFPLGFBQWEsaUJBQWlCLGlCQUFpQixrQkFBa0IsU0FBUyxjQUFjLGdCQUFnQixVQUFVOyIsIm5hbWVzIjpbInZlcnNpb24iLCJjYWxsSG9vayIsInJlbW92ZSIsInJlZiIsInJlZjIiLCJoYXNXYXJuZWQiLCJyZXNvbHZlIiwiaCIsImVmZmVjdCIsInJlbW92ZTIiLCJ0cmFjayIsInRyaWdnZXIiLCJpc01vZGVsTGlzdGVuZXIiLCJlbWl0IiwiY29tcHV0ZWQiXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdfQ== |