910 lines
129 KiB
JavaScript
910 lines
129 KiB
JavaScript
import { createUnplugin } from 'unplugin';
|
|
import { createFilter } from '@rollup/pluginutils';
|
|
import MagicString from 'magic-string';
|
|
import { shouldTransform as shouldTransform$1, transformAST, transform as transform$1 } from '@vue/reactivity-transform';
|
|
import { partition, notNullish, uniq } from '@antfu/utils';
|
|
import { baseParse } from '@vue/compiler-core';
|
|
import { parserOptions } from '@vue/compiler-dom';
|
|
import { capitalize, camelize } from '@vue/shared';
|
|
import * as babel from '@babel/core';
|
|
import { parse, parseExpression } from '@babel/parser';
|
|
import g from '@babel/generator';
|
|
import * as babel_traverse from '@babel/traverse';
|
|
|
|
var _a, _b, _c;
|
|
const t = (babel.default || babel).types;
|
|
const generate = g.default || g;
|
|
const traverse = (_c = (_b = (_a = babel_traverse == null ? void 0 : babel_traverse.default) == null ? void 0 : _a.default) != null ? _b : babel_traverse == null ? void 0 : babel_traverse.default) != null ? _c : babel_traverse;
|
|
|
|
function getIdentifierDeclarations(nodes) {
|
|
let result;
|
|
let programScopeUid;
|
|
traverse(t.file(t.program(nodes)), {
|
|
Program(path) {
|
|
result = new Set(Object.keys(path.scope.bindings));
|
|
programScopeUid = path.scope.uid;
|
|
},
|
|
// FIXME: babel bug, temporary add TSEnumDeclaration and TSModuleDeclaration logic
|
|
TSEnumDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid)
|
|
result.add(path.node.id.name);
|
|
},
|
|
TSModuleDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid) {
|
|
const id = path.node.id;
|
|
if (id.type === "Identifier")
|
|
result.add(id.name);
|
|
}
|
|
}
|
|
});
|
|
return Array.from(result);
|
|
}
|
|
function getFileGlobals(result) {
|
|
let globals;
|
|
let programScopeUid;
|
|
traverse(result, {
|
|
Program(path) {
|
|
globals = new Set(Object.keys(path.scope.globals));
|
|
programScopeUid = path.scope.uid;
|
|
},
|
|
// FIXME: babel bug, temporary add TSEnumDeclaration and TSModuleDeclaration logic
|
|
TSEnumDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid)
|
|
globals.delete(path.node.id.name);
|
|
},
|
|
TSModuleDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid) {
|
|
const id = path.node.id;
|
|
if (id.type === "Identifier")
|
|
globals.delete(id.name);
|
|
}
|
|
}
|
|
});
|
|
return Array.from(globals);
|
|
}
|
|
|
|
const pascalize = (str) => capitalize(camelize(str));
|
|
function exhaustiveCheckReturnUndefined(_param) {
|
|
return void 0;
|
|
}
|
|
|
|
var NodeTypes;
|
|
((NodeTypes2) => {
|
|
NodeTypes2.ROOT = 0;
|
|
NodeTypes2.ELEMENT = 1;
|
|
NodeTypes2.TEXT = 2;
|
|
NodeTypes2.COMMENT = 3;
|
|
NodeTypes2.SIMPLE_EXPRESSION = 4;
|
|
NodeTypes2.INTERPOLATION = 5;
|
|
NodeTypes2.ATTRIBUTE = 6;
|
|
NodeTypes2.DIRECTIVE = 7;
|
|
NodeTypes2.COMPOUND_EXPRESSION = 8;
|
|
NodeTypes2.IF = 9;
|
|
NodeTypes2.IF_BRANCH = 10;
|
|
NodeTypes2.FOR = 11;
|
|
NodeTypes2.TEXT_CALL = 12;
|
|
NodeTypes2.VNODE_CALL = 13;
|
|
NodeTypes2.JS_CALL_EXPRESSION = 14;
|
|
NodeTypes2.JS_OBJECT_EXPRESSION = 15;
|
|
NodeTypes2.JS_PROPERTY = 16;
|
|
NodeTypes2.JS_ARRAY_EXPRESSION = 17;
|
|
NodeTypes2.JS_FUNCTION_EXPRESSION = 18;
|
|
NodeTypes2.JS_CONDITIONAL_EXPRESSION = 19;
|
|
NodeTypes2.JS_CACHE_EXPRESSION = 20;
|
|
NodeTypes2.JS_BLOCK_STATEMENT = 21;
|
|
NodeTypes2.JS_TEMPLATE_LITERAL = 22;
|
|
NodeTypes2.JS_IF_STATEMENT = 23;
|
|
NodeTypes2.JS_ASSIGNMENT_EXPRESSION = 24;
|
|
NodeTypes2.JS_SEQUENCE_EXPRESSION = 25;
|
|
NodeTypes2.JS_RETURN_STATEMENT = 26;
|
|
})(NodeTypes || (NodeTypes = {}));
|
|
var ElementTypes;
|
|
((ElementTypes2) => {
|
|
ElementTypes2.ELEMENT = 0;
|
|
ElementTypes2.COMPONENT = 1;
|
|
ElementTypes2.SLOT = 2;
|
|
ElementTypes2.TEMPLATE = 3;
|
|
})(ElementTypes || (ElementTypes = {}));
|
|
const BUILD_IN_DIRECTIVES = /* @__PURE__ */ new Set([
|
|
"if",
|
|
"else",
|
|
"else-if",
|
|
"for",
|
|
"once",
|
|
"model",
|
|
"on",
|
|
"bind",
|
|
"slot",
|
|
"slot-scope",
|
|
"key",
|
|
"ref",
|
|
"text",
|
|
"html",
|
|
"show",
|
|
"pre",
|
|
"cloak"
|
|
// 'el',
|
|
// 'ref',
|
|
]);
|
|
function getComponents(node) {
|
|
var _a;
|
|
const current = node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.COMPONENT ? [node.tag] : node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.ELEMENT ? [node.tag] : [];
|
|
const children = node.type === NodeTypes.IF ? node.branches : node.type === NodeTypes.ELEMENT || node.type === NodeTypes.IF_BRANCH || node.type === NodeTypes.FOR ? node.children : node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.COMPOUND_EXPRESSION || node.type === NodeTypes.TEXT_CALL || node.type === NodeTypes.INTERPOLATION ? [] : (_a = exhaustiveCheckReturnUndefined()) != null ? _a : [];
|
|
return [...current, ...children.flatMap(getComponents)];
|
|
}
|
|
function getDirectiveNames(node) {
|
|
if (node.type === NodeTypes.ELEMENT) {
|
|
const directives = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.DIRECTIVE ? [x.name] : []
|
|
);
|
|
return [...directives, ...node.children.flatMap(getDirectiveNames)];
|
|
} else if (node.type === NodeTypes.IF) {
|
|
return node.branches.flatMap(getDirectiveNames);
|
|
} else if (node.type === NodeTypes.IF_BRANCH || node.type === NodeTypes.FOR) {
|
|
return node.children.flatMap(getDirectiveNames);
|
|
} else if (node.type === NodeTypes.INTERPOLATION || node.type === NodeTypes.COMPOUND_EXPRESSION || node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.TEXT_CALL) {
|
|
return [];
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
function getFreeVariablesForText(input) {
|
|
const inputWithPrefix = input.trimStart()[0] === "{" ? `(${input})` : input;
|
|
return getFileGlobals(parse(inputWithPrefix));
|
|
}
|
|
function getFreeVariablesForPropsNode(node) {
|
|
if (node.type === NodeTypes.DIRECTIVE) {
|
|
const arg = node.arg === void 0 ? [] : getFreeVariablesForNode(node.arg);
|
|
const exp = node.exp === void 0 ? [] : getFreeVariablesForNode(node.exp);
|
|
return [...arg, ...exp];
|
|
}
|
|
return [];
|
|
}
|
|
function getFreeVariablesForNode(node) {
|
|
var _a, _b, _c;
|
|
if (node.type === NodeTypes.SIMPLE_EXPRESSION) {
|
|
return node.isStatic ? [] : getFreeVariablesForText(node.content);
|
|
} else if (node.type === NodeTypes.COMPOUND_EXPRESSION) {
|
|
return node.children.flatMap(
|
|
(x) => typeof x !== "object" ? [] : getFreeVariablesForNode(x)
|
|
);
|
|
} else if (node.type === NodeTypes.INTERPOLATION) {
|
|
return getFreeVariablesForNode(node.content);
|
|
} else if (node.type === NodeTypes.ELEMENT) {
|
|
const children = node.children.flatMap(getFreeVariablesForNode);
|
|
const directiveProps = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.DIRECTIVE ? [x] : []
|
|
);
|
|
const attributeProps = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.ATTRIBUTE ? [x] : []
|
|
);
|
|
const refNode = attributeProps.find(
|
|
(node2) => node2.name === "ref" && node2.value !== void 0
|
|
);
|
|
const refIdentifier = (_a = refNode == null ? void 0 : refNode.value) == null ? void 0 : _a.content;
|
|
const vSlotNode = directiveProps.find((node2) => node2.name === "slot");
|
|
const vSlotArgIdentifiers = (vSlotNode == null ? void 0 : vSlotNode.arg) === void 0 ? [] : getFreeVariablesForNode(vSlotNode.arg);
|
|
const vSlotExpVariableShadowingIdentifiers = [];
|
|
const vForNode = directiveProps.find((node2) => node2.name === "for");
|
|
const vForIdentifiers = ((_b = vForNode == null ? void 0 : vForNode.exp) == null ? void 0 : _b.type) === NodeTypes.SIMPLE_EXPRESSION ? getFreeVariablesForText(
|
|
vForNode.exp.content.replace(/^.*\s(?:in|of)\s/, "")
|
|
) : [];
|
|
const vForExpVariableShadowingIdentifiers = [];
|
|
const props = directiveProps.filter(({ name }) => name !== "slot" && name !== "for").flatMap(getFreeVariablesForPropsNode);
|
|
const shadowingIdentifiers = /* @__PURE__ */ new Set([
|
|
...vSlotExpVariableShadowingIdentifiers,
|
|
...vForExpVariableShadowingIdentifiers
|
|
]);
|
|
return [
|
|
...vSlotArgIdentifiers,
|
|
refIdentifier,
|
|
...vForIdentifiers,
|
|
...[...children, ...props].filter((x) => !shadowingIdentifiers.has(x))
|
|
].filter(notNullish);
|
|
} else if (node.type === NodeTypes.FOR) {
|
|
return [node.source, ...node.children].flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.IF) {
|
|
return ((_c = node.branches) != null ? _c : []).flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.IF_BRANCH) {
|
|
return [node.condition, ...node.children].filter(notNullish).flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.TEXT_CALL) {
|
|
return [];
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
function findReferencesForSFC(templateNode) {
|
|
var _a, _b, _c;
|
|
const components = (_a = templateNode == null ? void 0 : templateNode.children.flatMap(getComponents)) != null ? _a : [];
|
|
const directives = (_b = templateNode == null ? void 0 : templateNode.children.flatMap(getDirectiveNames)) != null ? _b : [];
|
|
const identifiers = (_c = templateNode == null ? void 0 : templateNode.children.flatMap(getFreeVariablesForNode)) != null ? _c : [];
|
|
return {
|
|
components,
|
|
directives,
|
|
identifiers
|
|
};
|
|
}
|
|
function getBabelParserOptions(lang) {
|
|
lang = lang || "js";
|
|
const pluginsDict = {
|
|
js: [],
|
|
ts: ["typescript"],
|
|
jsx: ["jsx"],
|
|
tsx: ["jsx", "typescript"]
|
|
};
|
|
const plugins = pluginsDict[lang];
|
|
if (plugins === void 0)
|
|
throw new SyntaxError(`Unsupported script language: ${lang}`);
|
|
return {
|
|
sourceType: "module",
|
|
plugins
|
|
};
|
|
}
|
|
async function parseSFC(code, id, options) {
|
|
var _a, _b, _c;
|
|
const elementChildren = baseParse(code, parserOptions).children.flatMap(
|
|
(x) => x.type === NodeTypes.ELEMENT && x.tagType === ElementTypes.ELEMENT ? [x] : []
|
|
);
|
|
const templateNode = elementChildren.find((x) => x.tag === "template");
|
|
const [scriptSetupChildNodes, scriptChildNodes] = partition(
|
|
elementChildren.filter((x) => x.tag === "script"),
|
|
(x) => x.props.some((p) => p.type === NodeTypes.ATTRIBUTE && p.name === "setup")
|
|
);
|
|
const getScriptTagMeta = (n, astTransforms = (x) => x) => {
|
|
var _a2, _b2, _c2, _d, _e, _f;
|
|
if (n === void 0) {
|
|
const content2 = "";
|
|
const ast2 = parse(content2, {
|
|
sourceType: "module",
|
|
plugins: []
|
|
}).program;
|
|
return {
|
|
start: 0,
|
|
end: 0,
|
|
contentStart: 0,
|
|
contentEnd: 0,
|
|
content: content2,
|
|
attrs: {},
|
|
found: false,
|
|
ast: ast2
|
|
};
|
|
}
|
|
const attrs = Object.fromEntries(
|
|
n.props.flatMap(
|
|
(x) => {
|
|
var _a3;
|
|
return !(x.type === NodeTypes.ATTRIBUTE && typeof ((_a3 = x.value) == null ? void 0 : _a3.content) === "string") ? [] : [[x.name, x.value.content]];
|
|
}
|
|
)
|
|
);
|
|
const content = (_b2 = (_a2 = n.children[0]) == null ? void 0 : _a2.loc.source) != null ? _b2 : "";
|
|
const contentStart = (_d = (_c2 = n.children[0]) == null ? void 0 : _c2.loc.start.offset) != null ? _d : 0;
|
|
const contentEnd = (_f = (_e = n.children[0]) == null ? void 0 : _e.loc.end.offset) != null ? _f : 0;
|
|
const ast = astTransforms(
|
|
parse(content, getBabelParserOptions(attrs.lang)).program
|
|
);
|
|
return {
|
|
start: n.loc.start.offset,
|
|
end: n.loc.end.offset,
|
|
contentStart,
|
|
contentEnd,
|
|
content,
|
|
attrs,
|
|
found: true,
|
|
ast
|
|
};
|
|
};
|
|
const scriptSetup = getScriptTagMeta(
|
|
scriptSetupChildNodes[0],
|
|
(_a = options == null ? void 0 : options.astTransforms) == null ? void 0 : _a.scriptSetup
|
|
);
|
|
const script = getScriptTagMeta(
|
|
scriptChildNodes[0],
|
|
(_b = options == null ? void 0 : options.astTransforms) == null ? void 0 : _b.script
|
|
);
|
|
if (script.found && scriptSetup.found && scriptSetup.attrs.lang !== script.attrs.lang) {
|
|
throw new SyntaxError(
|
|
"<script setup> language must be the same as <script>"
|
|
);
|
|
}
|
|
const codeOfTemplate = templateNode == null ? void 0 : templateNode.props.some(
|
|
(p) => {
|
|
var _a2;
|
|
return p.type === NodeTypes.ATTRIBUTE && p.name === "lang" && ((_a2 = p.value) == null ? void 0 : _a2.type) === NodeTypes.TEXT && p.value.content === "pug";
|
|
}
|
|
) ? baseParse(
|
|
(await import('pug')).compile(
|
|
templateNode.children.map((x) => x.loc.source).join(""),
|
|
{
|
|
filename: id
|
|
}
|
|
)(),
|
|
parserOptions
|
|
) : templateNode;
|
|
const result = codeOfTemplate ? findReferencesForSFC(codeOfTemplate) : void 0;
|
|
return {
|
|
id,
|
|
template: {
|
|
components: new Set(result == null ? void 0 : result.components.map(pascalize)),
|
|
directives: new Set(
|
|
result == null ? void 0 : result.directives.filter((x) => !BUILD_IN_DIRECTIVES.has(x)).map(camelize)
|
|
),
|
|
identifiers: new Set(result == null ? void 0 : result.identifiers)
|
|
},
|
|
scriptSetup,
|
|
script,
|
|
parserOptions: getBabelParserOptions(
|
|
(_c = script.attrs.lang) != null ? _c : scriptSetup.attrs.lang
|
|
),
|
|
extraDeclarations: []
|
|
};
|
|
}
|
|
|
|
const DEFINE_PROPS = "defineProps";
|
|
const DEFINE_EMITS = "defineEmits";
|
|
const DEFINE_EXPOSE = "defineExpose";
|
|
const WITH_DEFAULTS = "withDefaults";
|
|
function applyMacros(nodes) {
|
|
let hasDefinePropsCall = false;
|
|
let hasDefineEmitCall = false;
|
|
let propsRuntimeDecl;
|
|
let propsRuntimeDefaults;
|
|
let propsTypeDecl;
|
|
let propsTypeDeclRaw;
|
|
let emitsRuntimeDecl;
|
|
let emitsTypeDecl;
|
|
let emitsTypeDeclRaw;
|
|
let exposeDecl;
|
|
const typeDeclaredProps = {};
|
|
const declaredTypes = {};
|
|
function error(msg, _node) {
|
|
throw new Error(msg);
|
|
}
|
|
function processDefineProps(node) {
|
|
if (!isCallOf(node, DEFINE_PROPS))
|
|
return false;
|
|
if (hasDefinePropsCall)
|
|
error(`duplicate ${DEFINE_PROPS}() call`);
|
|
hasDefinePropsCall = true;
|
|
propsRuntimeDecl = node.arguments[0];
|
|
if (node.typeParameters) {
|
|
if (propsRuntimeDecl) {
|
|
error(
|
|
`${DEFINE_PROPS}() cannot accept both type and non-type arguments at the same time. Use one or the other.`);
|
|
}
|
|
propsTypeDeclRaw = node.typeParameters.params[0];
|
|
propsTypeDecl = resolveQualifiedType(
|
|
propsTypeDeclRaw,
|
|
(node2) => node2.type === "TSTypeLiteral"
|
|
);
|
|
if (!propsTypeDecl) {
|
|
error(
|
|
`type argument passed to ${DEFINE_PROPS}() must be a literal type, or a reference to an interface or literal type.`);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function processWithDefaults(node) {
|
|
if (!isCallOf(node, WITH_DEFAULTS))
|
|
return false;
|
|
if (processDefineProps(node.arguments[0])) {
|
|
if (propsRuntimeDecl) {
|
|
error(
|
|
`${WITH_DEFAULTS} can only be used with type-based ${DEFINE_PROPS} declaration.`);
|
|
}
|
|
propsRuntimeDefaults = node.arguments[1];
|
|
} else {
|
|
error(
|
|
`${WITH_DEFAULTS}' first argument must be a ${DEFINE_PROPS} call.`,
|
|
node.arguments[0] || node
|
|
);
|
|
}
|
|
return true;
|
|
}
|
|
function processDefineEmits(node) {
|
|
if (!isCallOf(node, DEFINE_EMITS))
|
|
return false;
|
|
if (hasDefineEmitCall)
|
|
error(`duplicate ${DEFINE_EMITS}() call`);
|
|
hasDefineEmitCall = true;
|
|
emitsRuntimeDecl = node.arguments[0];
|
|
if (node.typeParameters) {
|
|
if (emitsRuntimeDecl) {
|
|
error(
|
|
`${DEFINE_EMITS}() cannot accept both type and non-type arguments at the same time. Use one or the other.`);
|
|
}
|
|
emitsTypeDeclRaw = node.typeParameters.params[0];
|
|
emitsTypeDecl = resolveQualifiedType(
|
|
emitsTypeDeclRaw,
|
|
(node2) => node2.type === "TSFunctionType" || node2.type === "TSTypeLiteral"
|
|
);
|
|
if (!emitsTypeDecl) {
|
|
error(
|
|
`type argument passed to ${DEFINE_EMITS}() must be a function type, a literal type with call signatures, or a reference to the above types.`);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function resolveQualifiedType(node, qualifier) {
|
|
if (qualifier(node))
|
|
return node;
|
|
if (node.type === "TSTypeReference" && node.typeName.type === "Identifier") {
|
|
const refName = node.typeName.name;
|
|
const isQualifiedType = (node2) => {
|
|
if (node2.type === "TSInterfaceDeclaration" && node2.id.name === refName)
|
|
return node2.body;
|
|
else if (node2.type === "TSTypeAliasDeclaration" && node2.id.name === refName && qualifier(node2.typeAnnotation))
|
|
return node2.typeAnnotation;
|
|
else if (node2.type === "ExportNamedDeclaration" && node2.declaration)
|
|
return isQualifiedType(node2.declaration);
|
|
};
|
|
for (const node2 of nodes) {
|
|
const qualified = isQualifiedType(node2);
|
|
if (qualified)
|
|
return qualified;
|
|
}
|
|
}
|
|
}
|
|
function processDefineExpose(node) {
|
|
if (!isCallOf(node, DEFINE_EXPOSE))
|
|
return false;
|
|
if (exposeDecl)
|
|
error(`duplicate ${DEFINE_EXPOSE}() call`);
|
|
if (node.arguments.length !== 1)
|
|
error(`${DEFINE_EXPOSE}() requires one argument`);
|
|
exposeDecl = node.arguments[0];
|
|
return true;
|
|
}
|
|
function genRuntimeProps(props) {
|
|
const keys = Object.keys(props);
|
|
if (!keys.length)
|
|
return void 0;
|
|
const hasStaticDefaults = propsRuntimeDefaults && propsRuntimeDefaults.type === "ObjectExpression" && propsRuntimeDefaults.properties.every(
|
|
(node) => node.type === "ObjectProperty" && !node.computed
|
|
);
|
|
return t.objectExpression(
|
|
Object.entries(props).map(([key, value]) => {
|
|
const prop = hasStaticDefaults ? propsRuntimeDefaults.properties.find((node) => node.key.name === key) : void 0;
|
|
if (prop)
|
|
value.required = false;
|
|
const entries = Object.entries(value).map(
|
|
([key2, value2]) => key2 === "type" ? t.objectProperty(t.identifier(key2), typeof value2 === "string" ? t.identifier(value2) : t.arrayExpression(value2.map((i) => t.identifier(i)))) : t.objectProperty(t.identifier(key2), parseExpression(JSON.stringify(value2)))
|
|
);
|
|
if (prop)
|
|
entries.push(t.objectProperty(t.identifier("default"), prop.value));
|
|
return t.objectProperty(
|
|
t.identifier(key),
|
|
t.objectExpression(entries)
|
|
);
|
|
})
|
|
);
|
|
}
|
|
function getProps() {
|
|
if (propsRuntimeDecl)
|
|
return propsRuntimeDecl;
|
|
if (propsTypeDecl) {
|
|
extractRuntimeProps(propsTypeDecl, typeDeclaredProps, declaredTypes);
|
|
return genRuntimeProps(typeDeclaredProps);
|
|
}
|
|
}
|
|
function throwIfAwait(node) {
|
|
if (node.type === "AwaitExpression")
|
|
error("top-level await is not supported in Vue 2");
|
|
}
|
|
nodes = nodes.map((raw) => {
|
|
let node = raw;
|
|
if (raw.type === "ExpressionStatement")
|
|
node = raw.expression;
|
|
if (node.type === "VariableDeclaration" && !node.declare) {
|
|
const total = node.declarations.length;
|
|
for (let i = 0; i < total; i++) {
|
|
const decl = node.declarations[i];
|
|
if (decl.init) {
|
|
if (processDefineEmits(decl.init))
|
|
decl.init = t.memberExpression(t.identifier("__ctx"), t.identifier("emit"));
|
|
else if (processDefineProps(decl.init) || processWithDefaults(decl.init))
|
|
decl.init = t.identifier("__props");
|
|
else
|
|
throwIfAwait(decl.init);
|
|
}
|
|
}
|
|
}
|
|
if (processWithDefaults(node) || processDefineEmits(node) || processDefineProps(node) || processDefineExpose(node))
|
|
return null;
|
|
throwIfAwait(node);
|
|
return raw;
|
|
}).filter(Boolean);
|
|
return {
|
|
nodes,
|
|
props: getProps(),
|
|
expose: exposeDecl
|
|
};
|
|
}
|
|
function isCallOf(node, test) {
|
|
return !!(node && node.type === "CallExpression" && node.callee.type === "Identifier" && (typeof test === "string" ? node.callee.name === test : test(node.callee.name)));
|
|
}
|
|
function extractRuntimeProps(node, props, declaredTypes) {
|
|
const members = node.type === "TSTypeLiteral" ? node.members : node.body;
|
|
for (const m of members) {
|
|
if ((m.type === "TSPropertySignature" || m.type === "TSMethodSignature") && m.key.type === "Identifier") {
|
|
let type;
|
|
if (m.type === "TSMethodSignature") {
|
|
type = ["Function"];
|
|
} else if (m.typeAnnotation) {
|
|
type = inferRuntimeType(
|
|
m.typeAnnotation.typeAnnotation,
|
|
declaredTypes
|
|
);
|
|
}
|
|
props[m.key.name] = {
|
|
key: m.key.name,
|
|
required: !m.optional,
|
|
type: (type == null ? void 0 : type.length) === 1 ? type[0] : type || "null"
|
|
};
|
|
}
|
|
}
|
|
}
|
|
function inferRuntimeType(node, declaredTypes) {
|
|
switch (node.type) {
|
|
case "TSStringKeyword":
|
|
return ["String"];
|
|
case "TSNumberKeyword":
|
|
return ["Number"];
|
|
case "TSBooleanKeyword":
|
|
return ["Boolean"];
|
|
case "TSObjectKeyword":
|
|
return ["Object"];
|
|
case "TSTypeLiteral":
|
|
return ["Object"];
|
|
case "TSFunctionType":
|
|
return ["Function"];
|
|
case "TSArrayType":
|
|
case "TSTupleType":
|
|
return ["Array"];
|
|
case "TSLiteralType":
|
|
switch (node.literal.type) {
|
|
case "StringLiteral":
|
|
return ["String"];
|
|
case "BooleanLiteral":
|
|
return ["Boolean"];
|
|
case "NumericLiteral":
|
|
case "BigIntLiteral":
|
|
return ["Number"];
|
|
default:
|
|
return ["null"];
|
|
}
|
|
case "TSTypeReference":
|
|
if (node.typeName.type === "Identifier") {
|
|
if (declaredTypes[node.typeName.name])
|
|
return declaredTypes[node.typeName.name];
|
|
switch (node.typeName.name) {
|
|
case "Array":
|
|
case "Function":
|
|
case "Object":
|
|
case "Set":
|
|
case "Map":
|
|
case "WeakSet":
|
|
case "WeakMap":
|
|
return [node.typeName.name];
|
|
case "Record":
|
|
case "Partial":
|
|
case "Readonly":
|
|
case "Pick":
|
|
case "Omit":
|
|
case "Exclude":
|
|
case "Extract":
|
|
case "Required":
|
|
case "InstanceType":
|
|
return ["Object"];
|
|
}
|
|
}
|
|
return ["null"];
|
|
case "TSParenthesizedType":
|
|
return inferRuntimeType(node.typeAnnotation, declaredTypes);
|
|
case "TSUnionType":
|
|
return [
|
|
...new Set(
|
|
[].concat(
|
|
...node.types.map((t2) => inferRuntimeType(t2, declaredTypes))
|
|
)
|
|
)
|
|
];
|
|
case "TSIntersectionType":
|
|
return ["Object"];
|
|
default:
|
|
return ["null"];
|
|
}
|
|
}
|
|
|
|
function isAsyncImport(node) {
|
|
if (t.isVariableDeclaration(node)) {
|
|
const declaration = node.declarations[0];
|
|
return declaration !== void 0 && t.isCallExpression(declaration.init) && t.isIdentifier(declaration.init.callee) && declaration.init.callee.name === "defineAsyncComponent";
|
|
}
|
|
return false;
|
|
}
|
|
function transformScriptSetup(sfc, options) {
|
|
var _a, _b;
|
|
const { scriptSetup, script, template } = sfc;
|
|
const { nodes: body, props, expose } = applyMacros(scriptSetup.ast.body);
|
|
const [hoisted, setupBody] = partition(
|
|
body,
|
|
(n) => isAsyncImport(n) || t.isImportDeclaration(n) || t.isExportNamedDeclaration(n) || n.type.startsWith("TS")
|
|
);
|
|
const declarationArray = uniq([
|
|
...getIdentifierDeclarations(hoisted),
|
|
...getIdentifierDeclarations(setupBody),
|
|
...getIdentifierDeclarations(script.ast.body)
|
|
]).filter(notNullish);
|
|
const returns = declarationArray.filter((i) => template.identifiers.has(i)).map((i) => {
|
|
const id = t.identifier(i);
|
|
return t.objectProperty(id, id, false, true);
|
|
});
|
|
const components = Array.from(template.components).map(
|
|
(component) => {
|
|
var _a2;
|
|
return (_a2 = declarationArray.find((declare) => declare === component)) != null ? _a2 : declarationArray.find((declare) => pascalize(declare) === component);
|
|
}
|
|
).filter(notNullish);
|
|
const directiveDeclaration = Array.from(template.directives).map((directive) => {
|
|
const identifier = declarationArray.find(
|
|
(declaration) => declaration === `v${capitalize(directive)}`
|
|
);
|
|
if (identifier === void 0)
|
|
return void 0;
|
|
return { identifier, directive };
|
|
}).filter(notNullish);
|
|
const __sfc = t.identifier("__sfc_main");
|
|
let hasBody = false;
|
|
const bodyNodes = script.ast.body.map((node) => {
|
|
if (node.type === "ExportDefaultDeclaration") {
|
|
hasBody = true;
|
|
return t.variableDeclaration("const", [
|
|
t.variableDeclarator(__sfc, node.declaration)
|
|
]);
|
|
}
|
|
return node;
|
|
});
|
|
let ast = t.program([
|
|
...sfc.extraDeclarations,
|
|
...hoisted,
|
|
...bodyNodes
|
|
]);
|
|
if (!hasBody) {
|
|
ast.body.push(
|
|
t.variableDeclaration("const", [
|
|
t.variableDeclarator(__sfc, t.objectExpression([]))
|
|
])
|
|
);
|
|
}
|
|
if (props) {
|
|
hasBody = true;
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("props")),
|
|
props
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (body.length) {
|
|
hasBody = true;
|
|
const returnExpr = expose ? t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[t.objectExpression(returns), expose]
|
|
) : t.objectExpression(returns);
|
|
const returnStatement = t.returnStatement(returnExpr);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("setup")),
|
|
t.arrowFunctionExpression(
|
|
[t.identifier("__props"), t.identifier("__ctx")],
|
|
t.blockStatement([...setupBody, returnStatement])
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (components.length) {
|
|
hasBody = true;
|
|
const componentsObject = t.objectExpression(
|
|
components.map((i) => {
|
|
const id = t.identifier(i);
|
|
return t.objectProperty(id, id, false, true);
|
|
})
|
|
);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("components")),
|
|
t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[
|
|
componentsObject,
|
|
t.memberExpression(__sfc, t.identifier("components"))
|
|
]
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (directiveDeclaration.length) {
|
|
hasBody = true;
|
|
const directivesObject = t.objectExpression(
|
|
directiveDeclaration.map(
|
|
({ directive, identifier }) => t.objectProperty(
|
|
t.identifier(directive),
|
|
t.identifier(identifier),
|
|
false,
|
|
false
|
|
)
|
|
)
|
|
);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("directives")),
|
|
t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[
|
|
directivesObject,
|
|
t.memberExpression(__sfc, t.identifier("directives"))
|
|
]
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (!hasBody && !(options == null ? void 0 : options.astTransforms)) {
|
|
return {
|
|
ast: null,
|
|
code: ""
|
|
};
|
|
}
|
|
ast.body.push(t.exportDefaultDeclaration(__sfc));
|
|
ast = ((_b = (_a = options == null ? void 0 : options.astTransforms) == null ? void 0 : _a.post) == null ? void 0 : _b.call(_a, ast, sfc)) || ast;
|
|
return {
|
|
ast,
|
|
code: generate(ast).code
|
|
};
|
|
}
|
|
|
|
function transformSfcRefSugar(sfc, options) {
|
|
const importedHelpers = /* @__PURE__ */ new Set();
|
|
for (const script of [sfc.script, sfc.scriptSetup]) {
|
|
if (shouldTransform$1(script.content)) {
|
|
const s = new MagicString(script.content);
|
|
const { importedHelpers: imports } = transformAST(script.ast, s);
|
|
Array.from(imports).forEach((helper) => importedHelpers.add(helper));
|
|
script.content = s.toString();
|
|
script.ast = parse(script.content, sfc.parserOptions).program;
|
|
}
|
|
}
|
|
if (importedHelpers.size) {
|
|
sfc.extraDeclarations = [
|
|
t.importDeclaration(
|
|
Array.from(importedHelpers).map((i) => t.importSpecifier(t.identifier(`_${i}`), t.identifier(i))),
|
|
t.stringLiteral(options.importHelpersFrom)
|
|
)
|
|
];
|
|
}
|
|
}
|
|
|
|
function resolveOptions(options = {}) {
|
|
return Object.assign(
|
|
{},
|
|
{
|
|
sourceMap: true,
|
|
reactivityTransform: false,
|
|
importHelpersFrom: "@vue/composition-api",
|
|
astTransforms: {}
|
|
},
|
|
options
|
|
);
|
|
}
|
|
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
var __spreadValues = (a, b) => {
|
|
for (var prop in b || (b = {}))
|
|
if (__hasOwnProp.call(b, prop))
|
|
__defNormalProp(a, prop, b[prop]);
|
|
if (__getOwnPropSymbols)
|
|
for (var prop of __getOwnPropSymbols(b)) {
|
|
if (__propIsEnum.call(b, prop))
|
|
__defNormalProp(a, prop, b[prop]);
|
|
}
|
|
return a;
|
|
};
|
|
const scriptSetupRE = /<script\s(.*\s)?setup(\s.*)?>/;
|
|
function shouldTransform(code, id, options) {
|
|
if (code.includes("export default __sfc_main"))
|
|
return false;
|
|
return (options == null ? void 0 : options.reactivityTransform) && shouldTransform$1(code) || scriptSetupRE.test(code);
|
|
}
|
|
async function transform(input, id, options) {
|
|
if (!shouldTransform(input, id, options))
|
|
return null;
|
|
const resolved = resolveOptions(options);
|
|
if (id.endsWith(".vue") || id.includes(".vue?vue"))
|
|
return await transformVue(input, id, resolved);
|
|
else
|
|
return transformNonVue(input, id, resolved);
|
|
}
|
|
function transformNonVue(input, id, options) {
|
|
if (options.reactivityTransform && shouldTransform$1(input)) {
|
|
return transform$1(input, {
|
|
filename: id,
|
|
sourceMap: options.sourceMap,
|
|
importHelpersFrom: options.importHelpersFrom
|
|
});
|
|
}
|
|
return null;
|
|
}
|
|
async function transformVue(input, id, options) {
|
|
const s = new MagicString(input);
|
|
const sfc = await parseSFC(input, id);
|
|
if (options.reactivityTransform)
|
|
transformSfcRefSugar(sfc, options);
|
|
const { code } = transformScriptSetup(sfc, options);
|
|
const attributes = __spreadValues(__spreadValues({}, sfc.script.attrs), sfc.scriptSetup.attrs);
|
|
delete attributes.setup;
|
|
const attr = Object.entries(attributes).map(([key, value]) => value ? `${key}="${value}"` : key).join(" ");
|
|
if (code) {
|
|
const block = `<script ${attr}>
|
|
${code}
|
|
<\/script>`;
|
|
s.remove(sfc.script.start, sfc.script.end);
|
|
if (sfc.scriptSetup.start !== sfc.scriptSetup.end) {
|
|
s.overwrite(
|
|
sfc.scriptSetup.start,
|
|
sfc.scriptSetup.end,
|
|
block
|
|
);
|
|
} else {
|
|
s.prependLeft(0, `${block}
|
|
`);
|
|
}
|
|
}
|
|
return {
|
|
code: s.toString(),
|
|
map: options.sourceMap ? s.generateMap({
|
|
source: id,
|
|
includeContent: true
|
|
}) : null
|
|
};
|
|
}
|
|
|
|
const unplugin = createUnplugin((options = {}) => {
|
|
const filter = createFilter(
|
|
options.include || (options.reactivityTransform ? [/\.vue$/, /\.vue\?vue/, /\.[jt]sx?$/] : [/\.vue$/, /\.vue\?vue/]),
|
|
options.exclude || [/node_modules/, /\.git/, /\.nuxt/]
|
|
);
|
|
return {
|
|
name: "unplugin-vue2-script-setup",
|
|
enforce: "pre",
|
|
transformInclude(id) {
|
|
return filter(id);
|
|
},
|
|
async transform(code, id) {
|
|
try {
|
|
return await transform(code, id, options);
|
|
} catch (e) {
|
|
this.error(e);
|
|
}
|
|
}
|
|
};
|
|
});
|
|
|
|
export { unplugin as default, shouldTransform, transform, transformScriptSetup, unplugin };
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlcyI6WyIuLi9zcmMvY29yZS9iYWJlbC50cyIsIi4uL3NyYy9jb3JlL2lkZW50aWZpZXJzLnRzIiwiLi4vc3JjL2NvcmUvdXRpbHMudHMiLCIuLi9zcmMvY29yZS9wYXJzZVNGQy50cyIsIi4uL3NyYy9jb3JlL21hY3Jvcy50cyIsIi4uL3NyYy9jb3JlL3RyYW5zZm9ybVNjcmlwdFNldHVwLnRzIiwiLi4vc3JjL2NvcmUvdHJhbnNmb3JtU2ZjUmVmU3VnYXIudHMiLCIuLi9zcmMvY29yZS9vcHRpb25zLnRzIiwiLi4vc3JjL2NvcmUvdHJhbnNmb3JtLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJhYmVsIGZyb20gJ0BiYWJlbC9jb3JlJ1xuaW1wb3J0IHsgcGFyc2UsIHBhcnNlRXhwcmVzc2lvbiB9IGZyb20gJ0BiYWJlbC9wYXJzZXInXG5pbXBvcnQgZyBmcm9tICdAYmFiZWwvZ2VuZXJhdG9yJ1xuaW1wb3J0ICogYXMgYmFiZWxfdHJhdmVyc2UgZnJvbSAnQGJhYmVsL3RyYXZlcnNlJ1xuXG5leHBvcnQgY29uc3QgdDogdHlwZW9mIGJhYmVsWyd0eXBlcyddID0gKChiYWJlbCBhcyBhbnkpLmRlZmF1bHQgfHwgYmFiZWwpLnR5cGVzXG5leHBvcnQgY29uc3QgZ2VuZXJhdGU6IHR5cGVvZiBnID0gKChnIGFzIGFueSkuZGVmYXVsdCB8fCBnKVxuZXhwb3J0IGNvbnN0IHRyYXZlcnNlID0gKChiYWJlbF90cmF2ZXJzZSBhcyBhbnkpPy5kZWZhdWx0Py5kZWZhdWx0IGFzIG51bGwpID8/IGJhYmVsX3RyYXZlcnNlPy5kZWZhdWx0ID8/IGJhYmVsX3RyYXZlcnNlXG5leHBvcnQgeyBwYXJzZUV4cHJlc3Npb24sIHBhcnNlIH1cbiIsImltcG9ydCB0eXBlIHtcbiAgRXhwcmVzc2lvbixcbiAgRmlsZSxcbiAgUHJpdmF0ZU5hbWUsXG4gIFNwcmVhZEVsZW1lbnQsXG4gIFN0YXRlbWVudCxcbiAgVFNUeXBlLFxufSBmcm9tICdAYmFiZWwvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBhcnNlUmVzdWx0IH0gZnJvbSAnQGJhYmVsL3BhcnNlcidcbmltcG9ydCB7IHQsIHRyYXZlcnNlIH0gZnJvbSAnLi9iYWJlbCdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldElkZW50aWZpZXJEZWNsYXJhdGlvbnMobm9kZXM6IFN0YXRlbWVudFtdKSB7XG4gIGxldCByZXN1bHQhOiBTZXQ8c3RyaW5nPlxuICBsZXQgcHJvZ3JhbVNjb3BlVWlkOiBudW1iZXJcbiAgdHJhdmVyc2UodC5maWxlKHQucHJvZ3JhbShub2RlcykpLCB7XG4gICAgUHJvZ3JhbShwYXRoKSB7XG4gICAgICByZXN1bHQgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHBhdGguc2NvcGUuYmluZGluZ3MpKVxuICAgICAgcHJvZ3JhbVNjb3BlVWlkID0gKHBhdGguc2NvcGUgYXMgYW55KS51aWRcbiAgICB9LFxuICAgIC8vIEZJWE1FOiBiYWJlbCBidWcsIHRlbXBvcmFyeSBhZGQgVFNFbnVtRGVjbGFyYXRpb24gYW5kIFRTTW9kdWxlRGVjbGFyYXRpb24gbG9naWNcbiAgICBUU0VudW1EZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICBpZiAoKHBhdGguc2NvcGUgYXMgYW55KS51aWQgPT09IHByb2dyYW1TY29wZVVpZClcbiAgICAgICAgcmVzdWx0LmFkZChwYXRoLm5vZGUuaWQubmFtZSlcbiAgICB9LFxuICAgIFRTTW9kdWxlRGVjbGFyYXRpb24ocGF0aCkge1xuICAgICAgaWYgKChwYXRoLnNjb3BlIGFzIGFueSkudWlkID09PSBwcm9ncmFtU2NvcGVVaWQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBwYXRoLm5vZGUuaWRcbiAgICAgICAgaWYgKGlkLnR5cGUgPT09ICdJZGVudGlmaWVyJylcbiAgICAgICAgICByZXN1bHQuYWRkKGlkLm5hbWUpXG4gICAgICB9XG4gICAgfSxcbiAgfSlcbiAgcmV0dXJuIEFycmF5LmZyb20ocmVzdWx0KVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgZ2V0RmlsZUdsb2JhbHNgIGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElkZW50aWZpZXJVc2FnZXMobm9kZT86IEV4cHJlc3Npb24gfCBUU1R5cGUgfCBTcHJlYWRFbGVtZW50IHwgUHJpdmF0ZU5hbWUgfCBTdGF0ZW1lbnQgfCBudWxsLCBpZGVudGlmaWVycyA9IG5ldyBTZXQ8c3RyaW5nPigpKSB7XG4gIGlmICghbm9kZSlcbiAgICByZXR1cm4gaWRlbnRpZmllcnNcblxuICBpZiAobm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnKSB7XG4gICAgbm9kZS5ib2R5LmZvckVhY2goY2hpbGQgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhjaGlsZCwgaWRlbnRpZmllcnMpKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmV4cHJlc3Npb24sIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgaWRlbnRpZmllcnMuYWRkKG5vZGUubmFtZSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdPcHRpb25hbE1lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLm9iamVjdCwgaWRlbnRpZmllcnMpXG4gICAgaWYgKG5vZGUuY29tcHV0ZWQpXG4gICAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUucHJvcGVydHksIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdPcHRpb25hbENhbGxFeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5jYWxsZWUgYXMgRXhwcmVzc2lvbiwgaWRlbnRpZmllcnMpXG4gICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaChhcmcgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhhcmcgYXMgRXhwcmVzc2lvbiwgaWRlbnRpZmllcnMpKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0JpbmFyeUV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ0xvZ2ljYWxFeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5sZWZ0LCBpZGVudGlmaWVycylcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUucmlnaHQsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ1VuYXJ5RXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuYXJndW1lbnQsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdGb3JJblN0YXRlbWVudCcpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUucmlnaHQsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUudGVzdCwgaWRlbnRpZmllcnMpXG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmNvbnNlcXVlbnQsIGlkZW50aWZpZXJzKVxuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5hbHRlcm5hdGUsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nKSB7XG4gICAgbm9kZS5wcm9wZXJ0aWVzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGlmIChwcm9wLnR5cGUgPT09ICdPYmplY3RQcm9wZXJ0eScpIHtcbiAgICAgICAgaWYgKHByb3AuY29tcHV0ZWQpXG4gICAgICAgICAgZ2V0SWRlbnRpZmllclVzYWdlcyhwcm9wLmtleSwgaWRlbnRpZmllcnMpXG4gICAgICAgIGdldElkZW50aWZpZXJVc2FnZXMocHJvcC52YWx1ZSBhcyBFeHByZXNzaW9uLCBpZGVudGlmaWVycylcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHByb3AudHlwZSA9PT0gJ1NwcmVhZEVsZW1lbnQnKSB7XG4gICAgICAgIGdldElkZW50aWZpZXJVc2FnZXMocHJvcCwgaWRlbnRpZmllcnMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdBcnJheUV4cHJlc3Npb24nKSB7XG4gICAgbm9kZS5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhlbGVtZW50LCBpZGVudGlmaWVycykpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnU3ByZWFkRWxlbWVudCcgfHwgbm9kZS50eXBlID09PSAnUmV0dXJuU3RhdGVtZW50Jykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5hcmd1bWVudCwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnTmV3RXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuY2FsbGVlIGFzIEV4cHJlc3Npb24sIGlkZW50aWZpZXJzKVxuICAgIG5vZGUuYXJndW1lbnRzLmZvckVhY2goYXJnID0+IGdldElkZW50aWZpZXJVc2FnZXMoYXJnIGFzIEV4cHJlc3Npb24sIGlkZW50aWZpZXJzKSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbicgfHwgbm9kZS50eXBlID09PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5ib2R5LCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdUZW1wbGF0ZUxpdGVyYWwnKSB7XG4gICAgbm9kZS5leHByZXNzaW9ucy5mb3JFYWNoKGV4cHIgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhleHByLCBpZGVudGlmaWVycykpXG4gIH1cbiAgLy8gZWxzZSB7XG4gIC8vICAgY29uc29sZS5sb2cobm9kZSlcbiAgLy8gfVxuICByZXR1cm4gaWRlbnRpZmllcnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVHbG9iYWxzKHJlc3VsdDogUGFyc2VSZXN1bHQ8RmlsZT4pIHtcbiAgbGV0IGdsb2JhbHMhOiBTZXQ8c3RyaW5nPlxuICBsZXQgcHJvZ3JhbVNjb3BlVWlkOiBudW1iZXJcbiAgdHJhdmVyc2UocmVzdWx0LCB7XG4gICAgUHJvZ3JhbShwYXRoKSB7XG4gICAgICBnbG9iYWxzID0gbmV3IFNldChPYmplY3Qua2V5cygocGF0aC5zY29wZSBhcyBhbnkpLmdsb2JhbHMpKVxuICAgICAgcHJvZ3JhbVNjb3BlVWlkID0gKHBhdGguc2NvcGUgYXMgYW55KS51aWRcbiAgICB9LFxuICAgIC8vIEZJWE1FOiBiYWJlbCBidWcsIHRlbXBvcmFyeSBhZGQgVFNFbnVtRGVjbGFyYXRpb24gYW5kIFRTTW9kdWxlRGVjbGFyYXRpb24gbG9naWNcbiAgICBUU0VudW1EZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICBpZiAoKHBhdGguc2NvcGUgYXMgYW55KS51aWQgPT09IHByb2dyYW1TY29wZVVpZClcbiAgICAgICAgZ2xvYmFscy5kZWxldGUocGF0aC5ub2RlLmlkLm5hbWUpXG4gICAgfSxcbiAgICBUU01vZHVsZURlY2xhcmF0aW9uKHBhdGgpIHtcbiAgICAgIGlmICgocGF0aC5zY29wZSBhcyBhbnkpLnVpZCA9PT0gcHJvZ3JhbVNjb3BlVWlkKSB7XG4gICAgICAgIGNvbnN0IGlkID0gcGF0aC5ub2RlLmlkXG4gICAgICAgIGlmIChpZC50eXBlID09PSAnSWRlbnRpZmllcicpXG4gICAgICAgICAgZ2xvYmFscy5kZWxldGUoaWQubmFtZSlcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuICByZXR1cm4gQXJyYXkuZnJvbShnbG9iYWxzKVxufVxuIiwiaW1wb3J0IHsgY2FtZWxpemUsIGNhcGl0YWxpemUgfSBmcm9tICdAdnVlL3NoYXJlZCdcblxuZXhwb3J0IGNvbnN0IHBhc2NhbGl6ZSA9IChzdHI6IHN0cmluZykgPT4gY2FwaXRhbGl6ZShjYW1lbGl6ZShzdHIpKVxuXG5leHBvcnQgY29uc3QgaXNOb3ROaWwgPSA8VD4odmFsdWU6IFQpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiA9PiB2YWx1ZSAhPSBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBleGhhdXN0aXZlQ2hlY2tSZXR1cm5VbmRlZmluZWQoX3BhcmFtOiBuZXZlcikge1xuICByZXR1cm4gdW5kZWZpbmVkIGFzIG5ldmVyXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBvbmUtdmFyICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlICovXG5pbXBvcnQgeyBub3ROdWxsaXNoLCBwYXJ0aXRpb24gfSBmcm9tICdAYW50ZnUvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IFByb2dyYW0gfSBmcm9tICdAYmFiZWwvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBhcnNlclBsdWdpbiB9IGZyb20gJ0BiYWJlbC9wYXJzZXInXG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZU5vZGUsXG4gIERpcmVjdGl2ZU5vZGUsXG4gIEV4cHJlc3Npb25Ob2RlLFxuICBQbGFpbkVsZW1lbnROb2RlLFxuICBSb290Tm9kZSxcbiAgVGVtcGxhdGVDaGlsZE5vZGUsXG59IGZyb20gJ0B2dWUvY29tcGlsZXItY29yZSdcbmltcG9ydCB7IGJhc2VQYXJzZSB9IGZyb20gJ0B2dWUvY29tcGlsZXItY29yZSdcbmltcG9ydCB7IHBhcnNlck9wdGlvbnMgfSBmcm9tICdAdnVlL2NvbXBpbGVyLWRvbSdcbmltcG9ydCB7IGNhbWVsaXplIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnXG5pbXBvcnQgdHlwZSB7XG4gIFBhcnNlZFNGQyxcbiAgU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zLFxuICBTY3JpcHRUYWdNZXRhLFxufSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IGdldEZpbGVHbG9iYWxzIH0gZnJvbSAnLi9pZGVudGlmaWVycydcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnLi9iYWJlbCdcbmltcG9ydCB7IGV4aGF1c3RpdmVDaGVja1JldHVyblVuZGVmaW5lZCwgcGFzY2FsaXplIH0gZnJvbSAnLi91dGlscydcblxubmFtZXNwYWNlIE5vZGVUeXBlcyB7XG4gIGV4cG9ydCBjb25zdCBST09UID0gMCxcbiAgICBFTEVNRU5UID0gMSxcbiAgICBURVhUID0gMixcbiAgICBDT01NRU5UID0gMyxcbiAgICBTSU1QTEVfRVhQUkVTU0lPTiA9IDQsXG4gICAgSU5URVJQT0xBVElPTiA9IDUsXG4gICAgQVRUUklCVVRFID0gNixcbiAgICBESVJFQ1RJVkUgPSA3LFxuICAgIENPTVBPVU5EX0VYUFJFU1NJT04gPSA4LFxuICAgIElGID0gOSxcbiAgICBJRl9CUkFOQ0ggPSAxMCxcbiAgICBGT1IgPSAxMSxcbiAgICBURVhUX0NBTEwgPSAxMixcbiAgICBWTk9ERV9DQUxMID0gMTMsXG4gICAgSlNfQ0FMTF9FWFBSRVNTSU9OID0gMTQsXG4gICAgSlNfT0JKRUNUX0VYUFJFU1NJT04gPSAxNSxcbiAgICBKU19QUk9QRVJUWSA9IDE2LFxuICAgIEpTX0FSUkFZX0VYUFJFU1NJT04gPSAxNyxcbiAgICBKU19GVU5DVElPTl9FWFBSRVNTSU9OID0gMTgsXG4gICAgSlNfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9IDE5LFxuICAgIEpTX0NBQ0hFX0VYUFJFU1NJT04gPSAyMCxcbiAgICBKU19CTE9DS19TVEFURU1FTlQgPSAyMSxcbiAgICBKU19URU1QTEFURV9MSVRFUkFMID0gMjIsXG4gICAgSlNfSUZfU1RBVEVNRU5UID0gMjMsXG4gICAgSlNfQVNTSUdOTUVOVF9FWFBSRVNTSU9OID0gMjQsXG4gICAgSlNfU0VRVUVOQ0VfRVhQUkVTU0lPTiA9IDI1LFxuICAgIEpTX1JFVFVSTl9TVEFURU1FTlQgPSAyNlxufVxuXG5uYW1lc3BhY2UgRWxlbWVudFR5cGVzIHtcbiAgZXhwb3J0IGNvbnN0IEVMRU1FTlQgPSAwLFxuICAgIENPTVBPTkVOVCA9IDEsXG4gICAgU0xPVCA9IDIsXG4gICAgVEVNUExBVEUgPSAzXG59XG5cbmNvbnN0IEJVSUxEX0lOX0RJUkVDVElWRVMgPSBuZXcgU2V0KFtcbiAgJ2lmJyxcbiAgJ2Vsc2UnLFxuICAnZWxzZS1pZicsXG4gICdmb3InLFxuICAnb25jZScsXG4gICdtb2RlbCcsXG4gICdvbicsXG4gICdiaW5kJyxcbiAgJ3Nsb3QnLFxuICAnc2xvdC1zY29wZScsXG4gICdrZXknLFxuICAncmVmJyxcbiAgJ3RleHQnLFxuICAnaHRtbCcsXG4gICdzaG93JyxcbiAgJ3ByZScsXG4gICdjbG9haycsXG4gIC8vICdlbCcsXG4gIC8vICdyZWYnLFxuXSlcblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50cyhub2RlOiBUZW1wbGF0ZUNoaWxkTm9kZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY3VycmVudFxuICAgID0gbm9kZS50eXBlID09PSBOb2RlVHlwZXMuRUxFTUVOVCAmJiBub2RlLnRhZ1R5cGUgPT09IEVsZW1lbnRUeXBlcy5DT01QT05FTlRcbiAgICAgID8gW25vZGUudGFnXVxuICAgICAgOiBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UICYmIG5vZGUudGFnVHlwZSA9PT0gRWxlbWVudFR5cGVzLkVMRU1FTlRcbiAgICAgICAgPyBbbm9kZS50YWddXG4gICAgICAgIDogW11cblxuICBjb25zdCBjaGlsZHJlblxuICAgID0gbm9kZS50eXBlID09PSBOb2RlVHlwZXMuSUZcbiAgICAgID8gbm9kZS5icmFuY2hlc1xuICAgICAgOiBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklGX0JSQU5DSFxuICAgICAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5GT1JcbiAgICAgICAgPyBub2RlLmNoaWxkcmVuXG4gICAgICAgIDogbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVFxuICAgICAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01NRU5UXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkNPTVBPVU5EX0VYUFJFU1NJT05cbiAgICAgICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVF9DQUxMXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklOVEVSUE9MQVRJT05cbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBleGhhdXN0aXZlQ2hlY2tSZXR1cm5VbmRlZmluZWQobm9kZSkgPz8gW11cblxuICByZXR1cm4gWy4uLmN1cnJlbnQsIC4uLmNoaWxkcmVuLmZsYXRNYXAoZ2V0Q29tcG9uZW50cyldXG59XG5cbmZ1bmN0aW9uIGdldERpcmVjdGl2ZU5hbWVzKG5vZGU6IFRlbXBsYXRlQ2hpbGROb2RlKTogc3RyaW5nW10ge1xuICBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuRUxFTUVOVCkge1xuICAgIGNvbnN0IGRpcmVjdGl2ZXMgPSBub2RlLnByb3BzLmZsYXRNYXAoeCA9PlxuICAgICAgeC50eXBlID09PSBOb2RlVHlwZXMuRElSRUNUSVZFID8gW3gubmFtZV0gOiBbXSxcbiAgICApXG4gICAgcmV0dXJuIFsuLi5kaXJlY3RpdmVzLCAuLi5ub2RlLmNoaWxkcmVuLmZsYXRNYXAoZ2V0RGlyZWN0aXZlTmFtZXMpXVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklGKSB7XG4gICAgcmV0dXJuIG5vZGUuYnJhbmNoZXMuZmxhdE1hcChnZXREaXJlY3RpdmVOYW1lcylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRl9CUkFOQ0ggfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuRk9SKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uZmxhdE1hcChnZXREaXJlY3RpdmVOYW1lcylcbiAgfVxuICBlbHNlIGlmIChcbiAgICBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JTlRFUlBPTEFUSU9OXG4gICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTlxuICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlRFWFRcbiAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01NRU5UXG4gICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVF9DQUxMXG4gICkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGVsc2Uge1xuICAgIGV4aGF1c3RpdmVDaGVja1JldHVyblVuZGVmaW5lZChub2RlKVxuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEZyZWVWYXJpYWJsZXNGb3JUZXh0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlucHV0V2l0aFByZWZpeCA9IGlucHV0LnRyaW1TdGFydCgpWzBdID09PSAneycgPyBgKCR7aW5wdXR9KWAgOiBpbnB1dFxuICByZXR1cm4gZ2V0RmlsZUdsb2JhbHMocGFyc2UoaW5wdXRXaXRoUHJlZml4KSlcbn1cblxuZnVuY3Rpb24gZ2V0RnJlZVZhcmlhYmxlc0ZvclByb3BzTm9kZShcbiAgbm9kZTogQXR0cmlidXRlTm9kZSB8IERpcmVjdGl2ZU5vZGUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5ESVJFQ1RJVkUpIHtcbiAgICBjb25zdCBhcmcgPSBub2RlLmFyZyA9PT0gdW5kZWZpbmVkID8gW10gOiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZShub2RlLmFyZylcbiAgICBjb25zdCBleHAgPSBub2RlLmV4cCA9PT0gdW5kZWZpbmVkID8gW10gOiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZShub2RlLmV4cClcbiAgICByZXR1cm4gWy4uLmFyZywgLi4uZXhwXVxuICB9XG4gIHJldHVybiBbXVxufVxuXG5mdW5jdGlvbiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZShcbiAgbm9kZTogVGVtcGxhdGVDaGlsZE5vZGUgfCBFeHByZXNzaW9uTm9kZSxcbik6IHN0cmluZ1tdIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OKSB7XG4gICAgcmV0dXJuIG5vZGUuaXNTdGF0aWMgPyBbXSA6IGdldEZyZWVWYXJpYWJsZXNGb3JUZXh0KG5vZGUuY29udGVudClcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01QT1VORF9FWFBSRVNTSU9OKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uZmxhdE1hcCh4ID0+XG4gICAgICB0eXBlb2YgeCAhPT0gJ29iamVjdCcgPyBbXSA6IGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKHgpLFxuICAgIClcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JTlRFUlBPTEFUSU9OKSB7XG4gICAgcmV0dXJuIGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKG5vZGUuY29udGVudClcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUpXG5cbiAgICBjb25zdCBkaXJlY3RpdmVQcm9wcyA9IG5vZGUucHJvcHMuZmxhdE1hcCh4ID0+XG4gICAgICB4LnR5cGUgPT09IE5vZGVUeXBlcy5ESVJFQ1RJVkUgPyBbeF0gOiBbXSxcbiAgICApXG4gICAgY29uc3QgYXR0cmlidXRlUHJvcHMgPSBub2RlLnByb3BzLmZsYXRNYXAoeCA9PlxuICAgICAgeC50eXBlID09PSBOb2RlVHlwZXMuQVRUUklCVVRFID8gW3hdIDogW10sXG4gICAgKVxuXG4gICAgY29uc3QgcmVmTm9kZSA9IGF0dHJpYnV0ZVByb3BzLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubmFtZSA9PT0gJ3JlZicgJiYgbm9kZS52YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgIClcbiAgICBjb25zdCByZWZJZGVudGlmaWVyID0gcmVmTm9kZT8udmFsdWU/LmNvbnRlbnRcblxuICAgIGNvbnN0IHZTbG90Tm9kZSA9IGRpcmVjdGl2ZVByb3BzLmZpbmQobm9kZSA9PiBub2RlLm5hbWUgPT09ICdzbG90JylcbiAgICBjb25zdCB2U2xvdEFyZ0lkZW50aWZpZXJzXG4gICAgICA9IHZTbG90Tm9kZT8uYXJnID09PSB1bmRlZmluZWQgPyBbXSA6IGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKHZTbG90Tm9kZS5hcmcpXG4gICAgLy8gVE9ETzogVmFyaWFibGUgc2hhZG93aW5nXG4gICAgY29uc3QgdlNsb3RFeHBWYXJpYWJsZVNoYWRvd2luZ0lkZW50aWZpZXJzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBjb25zdCB2Rm9yTm9kZSA9IGRpcmVjdGl2ZVByb3BzLmZpbmQobm9kZSA9PiBub2RlLm5hbWUgPT09ICdmb3InKVxuICAgIGNvbnN0IHZGb3JJZGVudGlmaWVyc1xuICAgICAgPSB2Rm9yTm9kZT8uZXhwPy50eXBlID09PSBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT05cbiAgICAgICAgPyBnZXRGcmVlVmFyaWFibGVzRm9yVGV4dChcbiAgICAgICAgICB2Rm9yTm9kZS5leHAuY29udGVudC5yZXBsYWNlKC9eLipcXHMoPzppbnxvZilcXHMvLCAnJyksXG4gICAgICAgIClcbiAgICAgICAgOiBbXVxuICAgIC8vIFRPRE86IFZhcmlhYmxlIHNoYWRvd2luZ1xuICAgIGNvbnN0IHZGb3JFeHBWYXJpYWJsZVNoYWRvd2luZ0lkZW50aWZpZXJzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBjb25zdCBwcm9wcyA9IGRpcmVjdGl2ZVByb3BzXG4gICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT4gbmFtZSAhPT0gJ3Nsb3QnICYmIG5hbWUgIT09ICdmb3InKVxuICAgICAgLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0ZvclByb3BzTm9kZSlcblxuICAgIGNvbnN0IHNoYWRvd2luZ0lkZW50aWZpZXJzID0gbmV3IFNldChbXG4gICAgICAuLi52U2xvdEV4cFZhcmlhYmxlU2hhZG93aW5nSWRlbnRpZmllcnMsXG4gICAgICAuLi52Rm9yRXhwVmFyaWFibGVTaGFkb3dpbmdJZGVudGlmaWVycyxcbiAgICBdKVxuICAgIHJldHVybiBbXG4gICAgICAuLi52U2xvdEFyZ0lkZW50aWZpZXJzLFxuICAgICAgcmVmSWRlbnRpZmllcixcbiAgICAgIC4uLnZGb3JJZGVudGlmaWVycyxcbiAgICAgIC4uLlsuLi5jaGlsZHJlbiwgLi4ucHJvcHNdLmZpbHRlcih4ID0+ICFzaGFkb3dpbmdJZGVudGlmaWVycy5oYXMoeCkpLFxuICAgIF0uZmlsdGVyKG5vdE51bGxpc2gpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuRk9SKSB7XG4gICAgLy8gSWYgd2UgdXNlIGBiYXNlQ29tcGlsZXJgLCB3ZSBuZWVkIGFkZCB2YXJpYWJsZSBzaGFkb3dpbmcgaGVyZVxuICAgIC8vIEJ1dCB3ZSB1c2UgYGJhc2VQYXJzZWAgbm93LiBTbyB0aGlzIGJyYW5jaCB3aWxsIG5ldmVyIGJlIHJlYWNoZWQuXG4gICAgLy8gYE5vZGVUeXBlcy5JRmAgYW5kIGBOb2RlVHlwZXMuSUZfQlJBTkNIYCB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsIGFsc28uXG5cbiAgICAvLyBjb25zdCB7IGtleUFsaWFzLCB2YWx1ZUFsaWFzIH0gPSBub2RlXG4gICAgcmV0dXJuIFtub2RlLnNvdXJjZSwgLi4ubm9kZS5jaGlsZHJlbl0uZmxhdE1hcChnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRikge1xuICAgIHJldHVybiAobm9kZS5icmFuY2hlcyA/PyBbXSkuZmxhdE1hcChnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRl9CUkFOQ0gpIHtcbiAgICByZXR1cm4gW25vZGUuY29uZGl0aW9uLCAuLi5ub2RlLmNoaWxkcmVuXVxuICAgICAgLmZpbHRlcihub3ROdWxsaXNoKVxuICAgICAgLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUpXG4gIH1cbiAgZWxzZSBpZiAoXG4gICAgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVFxuICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkNPTU1FTlRcbiAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5URVhUX0NBTExcbiAgKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgZWxzZSB7XG4gICAgZXhoYXVzdGl2ZUNoZWNrUmV0dXJuVW5kZWZpbmVkKG5vZGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSZWZlcmVuY2VzRm9yU0ZDKFxuICB0ZW1wbGF0ZU5vZGU6IFJvb3ROb2RlIHwgUGxhaW5FbGVtZW50Tm9kZSB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBjb21wb25lbnRzID0gdGVtcGxhdGVOb2RlPy5jaGlsZHJlbi5mbGF0TWFwKGdldENvbXBvbmVudHMpID8/IFtdXG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSB0ZW1wbGF0ZU5vZGU/LmNoaWxkcmVuLmZsYXRNYXAoZ2V0RGlyZWN0aXZlTmFtZXMpID8/IFtdXG4gIGNvbnN0IGlkZW50aWZpZXJzXG4gICAgPSB0ZW1wbGF0ZU5vZGU/LmNoaWxkcmVuLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUpID8/IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBjb21wb25lbnRzLFxuICAgIGRpcmVjdGl2ZXMsXG4gICAgaWRlbnRpZmllcnMsXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmFiZWxQYXJzZXJPcHRpb25zKGxhbmc6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgbGFuZyA9IGxhbmcgfHwgJ2pzJ1xuICBjb25zdCBwbHVnaW5zRGljdDogUmVjb3JkPHN0cmluZywgQXJyYXk8UGFyc2VyUGx1Z2luPj4gPSB7XG4gICAganM6IFtdLFxuICAgIHRzOiBbJ3R5cGVzY3JpcHQnXSxcbiAgICBqc3g6IFsnanN4J10sXG4gICAgdHN4OiBbJ2pzeCcsICd0eXBlc2NyaXB0J10sXG4gIH1cbiAgY29uc3QgcGx1Z2lucyA9IHBsdWdpbnNEaWN0W2xhbmddXG4gIGlmIChwbHVnaW5zID09PSB1bmRlZmluZWQpXG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbnN1cHBvcnRlZCBzY3JpcHQgbGFuZ3VhZ2U6ICR7bGFuZ31gKVxuICByZXR1cm4ge1xuICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnIGFzIGNvbnN0LFxuICAgIHBsdWdpbnMsXG4gIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVNGQyhcbiAgY29kZTogc3RyaW5nLFxuICBpZD86IHN0cmluZyxcbiAgb3B0aW9ucz86IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyxcbik6IFByb21pc2U8UGFyc2VkU0ZDPiB7XG4gIGNvbnN0IGVsZW1lbnRDaGlsZHJlbiA9IGJhc2VQYXJzZShjb2RlLCBwYXJzZXJPcHRpb25zKS5jaGlsZHJlbi5mbGF0TWFwKHggPT5cbiAgICB4LnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UICYmIHgudGFnVHlwZSA9PT0gRWxlbWVudFR5cGVzLkVMRU1FTlRcbiAgICAgID8gW3hdXG4gICAgICA6IFtdLFxuICApXG4gIGNvbnN0IHRlbXBsYXRlTm9kZSA9IGVsZW1lbnRDaGlsZHJlbi5maW5kKHggPT4geC50YWcgPT09ICd0ZW1wbGF0ZScpXG5cbiAgY29uc3QgW3NjcmlwdFNldHVwQ2hpbGROb2Rlcywgc2NyaXB0Q2hpbGROb2Rlc10gPSBwYXJ0aXRpb24oXG4gICAgZWxlbWVudENoaWxkcmVuLmZpbHRlcih4ID0+IHgudGFnID09PSAnc2NyaXB0JyksXG4gICAgeCA9PiB4LnByb3BzLnNvbWUocCA9PiBwLnR5cGUgPT09IE5vZGVUeXBlcy5BVFRSSUJVVEUgJiYgcC5uYW1lID09PSAnc2V0dXAnKSxcbiAgKVxuXG4gIGNvbnN0IGdldFNjcmlwdFRhZ01ldGEgPSAoXG4gICAgbjogUGxhaW5FbGVtZW50Tm9kZSB8IHVuZGVmaW5lZCxcbiAgICBhc3RUcmFuc2Zvcm1zOiAoYXN0OiBQcm9ncmFtKSA9PiBQcm9ncmFtID0geCA9PiB4LFxuICApOiBTY3JpcHRUYWdNZXRhID0+IHtcbiAgICBpZiAobiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gJydcbiAgICAgIGNvbnN0IGFzdCA9IHBhcnNlKGNvbnRlbnQsIHtcbiAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgfSkucHJvZ3JhbVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgIGVuZDogMCxcbiAgICAgICAgY29udGVudFN0YXJ0OiAwLFxuICAgICAgICBjb250ZW50RW5kOiAwLFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBhdHRyczoge30sXG4gICAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgICAgYXN0LFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhdHRycyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIG4ucHJvcHMuZmxhdE1hcCh4ID0+XG4gICAgICAgICEoXG4gICAgICAgICAgeC50eXBlID09PSBOb2RlVHlwZXMuQVRUUklCVVRFICYmIHR5cGVvZiB4LnZhbHVlPy5jb250ZW50ID09PSAnc3RyaW5nJ1xuICAgICAgICApXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogW1t4Lm5hbWUsIHgudmFsdWUuY29udGVudF1dLFxuICAgICAgKSxcbiAgICApXG4gICAgY29uc3QgY29udGVudCA9IG4uY2hpbGRyZW5bMF0/LmxvYy5zb3VyY2UgPz8gJydcbiAgICBjb25zdCBjb250ZW50U3RhcnQgPSBuLmNoaWxkcmVuWzBdPy5sb2Muc3RhcnQub2Zmc2V0ID8/IDBcbiAgICBjb25zdCBjb250ZW50RW5kID0gbi5jaGlsZHJlblswXT8ubG9jLmVuZC5vZmZzZXQgPz8gMFxuICAgIGNvbnN0IGFzdCA9IGFzdFRyYW5zZm9ybXMoXG4gICAgICBwYXJzZShjb250ZW50LCBnZXRCYWJlbFBhcnNlck9wdGlvbnMoYXR0cnMubGFuZykpLnByb2dyYW0sXG4gICAgKVxuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbi5sb2Muc3RhcnQub2Zmc2V0LFxuICAgICAgZW5kOiBuLmxvYy5lbmQub2Zmc2V0LFxuICAgICAgY29udGVudFN0YXJ0LFxuICAgICAgY29udGVudEVuZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBhdHRycyxcbiAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgYXN0LFxuICAgIH1cbiAgfVxuICBjb25zdCBzY3JpcHRTZXR1cCA9IGdldFNjcmlwdFRhZ01ldGEoXG4gICAgc2NyaXB0U2V0dXBDaGlsZE5vZGVzWzBdLFxuICAgIG9wdGlvbnM/LmFzdFRyYW5zZm9ybXM/LnNjcmlwdFNldHVwLFxuICApXG4gIGNvbnN0IHNjcmlwdCA9IGdldFNjcmlwdFRhZ01ldGEoXG4gICAgc2NyaXB0Q2hpbGROb2Rlc1swXSxcbiAgICBvcHRpb25zPy5hc3RUcmFuc2Zvcm1zPy5zY3JpcHQsXG4gIClcblxuICBpZiAoXG4gICAgc2NyaXB0LmZvdW5kXG4gICAgJiYgc2NyaXB0U2V0dXAuZm91bmRcbiAgICAmJiBzY3JpcHRTZXR1cC5hdHRycy5sYW5nICE9PSBzY3JpcHQuYXR0cnMubGFuZ1xuICApIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICAnPHNjcmlwdCBzZXR1cD4gbGFuZ3VhZ2UgbXVzdCBiZSB0aGUgc2FtZSBhcyA8c2NyaXB0PicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgY29kZU9mVGVtcGxhdGVcbiAgICA9IHRlbXBsYXRlTm9kZSA9PSBudWxsXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0ZW1wbGF0ZU5vZGUucHJvcHMuc29tZShcbiAgICAgICAgcCA9PlxuICAgICAgICAgIHAudHlwZSA9PT0gTm9kZVR5cGVzLkFUVFJJQlVURVxuICAgICAgICAgICAgJiYgcC5uYW1lID09PSAnbGFuZydcbiAgICAgICAgICAgICYmIHAudmFsdWU/LnR5cGUgPT09IE5vZGVUeXBlcy5URVhUXG4gICAgICAgICAgICAmJiBwLnZhbHVlLmNvbnRlbnQgPT09ICdwdWcnLFxuICAgICAgKVxuICAgICAgICA/IGJhc2VQYXJzZShcbiAgICAgICAgICAoYXdhaXQgaW1wb3J0KCdwdWcnKSkuY29tcGlsZShcbiAgICAgICAgICAgIHRlbXBsYXRlTm9kZS5jaGlsZHJlbi5tYXAoeCA9PiB4LmxvYy5zb3VyY2UpLmpvaW4oJycpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWxlbmFtZTogaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICkoKSxcbiAgICAgICAgICBwYXJzZXJPcHRpb25zLFxuICAgICAgICApXG4gICAgICAgIDogdGVtcGxhdGVOb2RlXG5cbiAgY29uc3QgcmVzdWx0ID0gY29kZU9mVGVtcGxhdGVcbiAgICA/IGZpbmRSZWZlcmVuY2VzRm9yU0ZDKGNvZGVPZlRlbXBsYXRlKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgY29tcG9uZW50czogbmV3IFNldChyZXN1bHQ/LmNvbXBvbmVudHMubWFwKHBhc2NhbGl6ZSkpLFxuICAgICAgZGlyZWN0aXZlczogbmV3IFNldChcbiAgICAgICAgcmVzdWx0Py5kaXJlY3RpdmVzXG4gICAgICAgICAgLmZpbHRlcih4ID0+ICFCVUlMRF9JTl9ESVJFQ1RJVkVTLmhhcyh4KSlcbiAgICAgICAgICAubWFwKGNhbWVsaXplKSxcbiAgICAgICksXG4gICAgICBpZGVudGlmaWVyczogbmV3IFNldChyZXN1bHQ/LmlkZW50aWZpZXJzKSxcbiAgICB9LFxuICAgIHNjcmlwdFNldHVwLFxuICAgIHNjcmlwdCxcbiAgICBwYXJzZXJPcHRpb25zOiBnZXRCYWJlbFBhcnNlck9wdGlvbnMoXG4gICAgICBzY3JpcHQuYXR0cnMubGFuZyA/PyBzY3JpcHRTZXR1cC5hdHRycy5sYW5nLFxuICAgICksXG4gICAgZXh0cmFEZWNsYXJhdGlvbnM6IFtdLFxuICB9XG59XG4iLCIvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtbmV4dC9ibG9iL21haW4vcGFja2FnZXMvY29tcGlsZXItc2ZjL3NyYy9jb21waWxlU2NyaXB0LnRzXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2FsbEV4cHJlc3Npb24sXG4gIE5vZGUsXG4gIE9iamVjdEV4cHJlc3Npb24sXG4gIE9iamVjdFByb3BlcnR5LFxuICBTdGF0ZW1lbnQsXG4gIFRTRnVuY3Rpb25UeXBlLFxuICBUU0ludGVyZmFjZUJvZHksXG4gIFRTVHlwZSxcbiAgVFNUeXBlTGl0ZXJhbCxcbn0gZnJvbSAnQGJhYmVsL3R5cGVzJ1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uLCB0IH0gZnJvbSAnLi9iYWJlbCdcblxuLy8gU3BlY2lhbCBjb21waWxlciBtYWNyb3NcbmNvbnN0IERFRklORV9QUk9QUyA9ICdkZWZpbmVQcm9wcydcbmNvbnN0IERFRklORV9FTUlUUyA9ICdkZWZpbmVFbWl0cydcbmNvbnN0IERFRklORV9FWFBPU0UgPSAnZGVmaW5lRXhwb3NlJ1xuY29uc3QgV0lUSF9ERUZBVUxUUyA9ICd3aXRoRGVmYXVsdHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcFR5cGVEYXRhIHtcbiAga2V5OiBzdHJpbmdcbiAgdHlwZTogc3RyaW5nW10gfCBzdHJpbmdcbiAgcmVxdWlyZWQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWFjcm9zKG5vZGVzOiBTdGF0ZW1lbnRbXSkge1xuICBsZXQgaGFzRGVmaW5lUHJvcHNDYWxsID0gZmFsc2VcbiAgbGV0IGhhc0RlZmluZUVtaXRDYWxsID0gZmFsc2VcbiAgbGV0IHByb3BzUnVudGltZURlY2w6IE5vZGUgfCB1bmRlZmluZWRcbiAgbGV0IHByb3BzUnVudGltZURlZmF1bHRzOiBOb2RlIHwgdW5kZWZpbmVkXG4gIGxldCBwcm9wc1R5cGVEZWNsOiBUU1R5cGVMaXRlcmFsIHwgVFNJbnRlcmZhY2VCb2R5IHwgdW5kZWZpbmVkXG4gIGxldCBwcm9wc1R5cGVEZWNsUmF3OiBOb2RlIHwgdW5kZWZpbmVkXG4gIGxldCBlbWl0c1J1bnRpbWVEZWNsOiBOb2RlIHwgdW5kZWZpbmVkXG4gIGxldCBlbWl0c1R5cGVEZWNsOlxuICB8IFRTRnVuY3Rpb25UeXBlXG4gIHwgVFNUeXBlTGl0ZXJhbFxuICB8IFRTSW50ZXJmYWNlQm9keVxuICB8IHVuZGVmaW5lZFxuICBsZXQgZW1pdHNUeXBlRGVjbFJhdzogTm9kZSB8IHVuZGVmaW5lZFxuICBsZXQgZXhwb3NlRGVjbDogQ2FsbEV4cHJlc3Npb25bJ2FyZ3VtZW50cyddW251bWJlcl0gfCB1bmRlZmluZWRcblxuICAvLyBwcm9wcy9lbWl0cyBkZWNsYXJlZCB2aWEgdHlwZXNcbiAgY29uc3QgdHlwZURlY2xhcmVkUHJvcHM6IFJlY29yZDxzdHJpbmcsIFByb3BUeXBlRGF0YT4gPSB7fVxuICAvLyByZWNvcmQgZGVjbGFyZWQgdHlwZXMgZm9yIHJ1bnRpbWUgcHJvcHMgdHlwZSBnZW5lcmF0aW9uXG4gIGNvbnN0IGRlY2xhcmVkVHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9XG5cbiAgZnVuY3Rpb24gZXJyb3IoXG4gICAgbXNnOiBzdHJpbmcsXG5cbiAgICBfbm9kZTogTm9kZSxcbiAgKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpXG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzRGVmaW5lUHJvcHMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNDYWxsT2Yobm9kZSwgREVGSU5FX1BST1BTKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKGhhc0RlZmluZVByb3BzQ2FsbClcbiAgICAgIGVycm9yKGBkdXBsaWNhdGUgJHtERUZJTkVfUFJPUFN9KCkgY2FsbGAsIG5vZGUpXG5cbiAgICBoYXNEZWZpbmVQcm9wc0NhbGwgPSB0cnVlXG5cbiAgICBwcm9wc1J1bnRpbWVEZWNsID0gbm9kZS5hcmd1bWVudHNbMF1cblxuICAgIC8vIGNhbGwgaGFzIHR5cGUgcGFyYW1ldGVycyAtIGluZmVyIHJ1bnRpbWUgdHlwZXMgZnJvbSBpdFxuICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAocHJvcHNSdW50aW1lRGVjbCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgJHtERUZJTkVfUFJPUFN9KCkgY2Fubm90IGFjY2VwdCBib3RoIHR5cGUgYW5kIG5vbi10eXBlIGFyZ3VtZW50cyBgXG4gICAgICAgICAgICArICdhdCB0aGUgc2FtZSB0aW1lLiBVc2Ugb25lIG9yIHRoZSBvdGhlci4nLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcHJvcHNUeXBlRGVjbFJhdyA9IG5vZGUudHlwZVBhcmFtZXRlcnMucGFyYW1zWzBdXG4gICAgICBwcm9wc1R5cGVEZWNsID0gcmVzb2x2ZVF1YWxpZmllZFR5cGUoXG4gICAgICAgIHByb3BzVHlwZURlY2xSYXcsXG4gICAgICAgIG5vZGUgPT4gbm9kZS50eXBlID09PSAnVFNUeXBlTGl0ZXJhbCcsXG4gICAgICApIGFzIFRTVHlwZUxpdGVyYWwgfCBUU0ludGVyZmFjZUJvZHkgfCB1bmRlZmluZWRcblxuICAgICAgaWYgKCFwcm9wc1R5cGVEZWNsKSB7XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIGB0eXBlIGFyZ3VtZW50IHBhc3NlZCB0byAke0RFRklORV9QUk9QU30oKSBtdXN0IGJlIGEgbGl0ZXJhbCB0eXBlLCBgXG4gICAgICAgICAgICArICdvciBhIHJlZmVyZW5jZSB0byBhbiBpbnRlcmZhY2Ugb3IgbGl0ZXJhbCB0eXBlLicsXG4gICAgICAgICAgcHJvcHNUeXBlRGVjbFJhdyxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzV2l0aERlZmF1bHRzKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzQ2FsbE9mKG5vZGUsIFdJVEhfREVGQVVMVFMpKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAocHJvY2Vzc0RlZmluZVByb3BzKG5vZGUuYXJndW1lbnRzWzBdKSkge1xuICAgICAgaWYgKHByb3BzUnVudGltZURlY2wpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYCR7V0lUSF9ERUZBVUxUU30gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHR5cGUtYmFzZWQgYFxuICAgICAgICAgICAgKyBgJHtERUZJTkVfUFJPUFN9IGRlY2xhcmF0aW9uLmAsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcHJvcHNSdW50aW1lRGVmYXVsdHMgPSBub2RlLmFyZ3VtZW50c1sxXVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGVycm9yKFxuICAgICAgICBgJHtXSVRIX0RFRkFVTFRTfScgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhICR7REVGSU5FX1BST1BTfSBjYWxsLmAsXG4gICAgICAgIG5vZGUuYXJndW1lbnRzWzBdIHx8IG5vZGUsXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzRGVmaW5lRW1pdHMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNDYWxsT2Yobm9kZSwgREVGSU5FX0VNSVRTKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKGhhc0RlZmluZUVtaXRDYWxsKVxuICAgICAgZXJyb3IoYGR1cGxpY2F0ZSAke0RFRklORV9FTUlUU30oKSBjYWxsYCwgbm9kZSlcblxuICAgIGhhc0RlZmluZUVtaXRDYWxsID0gdHJ1ZVxuICAgIGVtaXRzUnVudGltZURlY2wgPSBub2RlLmFyZ3VtZW50c1swXVxuICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoZW1pdHNSdW50aW1lRGVjbCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgJHtERUZJTkVfRU1JVFN9KCkgY2Fubm90IGFjY2VwdCBib3RoIHR5cGUgYW5kIG5vbi10eXBlIGFyZ3VtZW50cyBgXG4gICAgICAgICAgICArICdhdCB0aGUgc2FtZSB0aW1lLiBVc2Ugb25lIG9yIHRoZSBvdGhlci4nLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgZW1pdHNUeXBlRGVjbFJhdyA9IG5vZGUudHlwZVBhcmFtZXRlcnMucGFyYW1zWzBdXG4gICAgICBlbWl0c1R5cGVEZWNsID0gcmVzb2x2ZVF1YWxpZmllZFR5cGUoXG4gICAgICAgIGVtaXRzVHlwZURlY2xSYXcsXG4gICAgICAgIG5vZGUgPT4gbm9kZS50eXBlID09PSAnVFNGdW5jdGlvblR5cGUnIHx8IG5vZGUudHlwZSA9PT0gJ1RTVHlwZUxpdGVyYWwnLFxuICAgICAgKSBhcyBUU0Z1bmN0aW9uVHlwZSB8IFRTVHlwZUxpdGVyYWwgfCBUU0ludGVyZmFjZUJvZHkgfCB1bmRlZmluZWRcblxuICAgICAgaWYgKCFlbWl0c1R5cGVEZWNsKSB7XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIGB0eXBlIGFyZ3VtZW50IHBhc3NlZCB0byAke0RFRklORV9FTUlUU30oKSBtdXN0IGJlIGEgZnVuY3Rpb24gdHlwZSwgYFxuICAgICAgICAgICAgKyAnYSBsaXRlcmFsIHR5cGUgd2l0aCBjYWxsIHNpZ25hdHVyZXMsIG9yIGEgcmVmZXJlbmNlIHRvIHRoZSBhYm92ZSB0eXBlcy4nLFxuICAgICAgICAgIGVtaXRzVHlwZURlY2xSYXcsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVRdWFsaWZpZWRUeXBlKFxuICAgIG5vZGU6IE5vZGUsXG4gICAgcXVhbGlmaWVyOiAobm9kZTogTm9kZSkgPT4gYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKHF1YWxpZmllcihub2RlKSlcbiAgICAgIHJldHVybiBub2RlXG5cbiAgICBpZiAoXG4gICAgICBub2RlLnR5cGUgPT09ICdUU1R5cGVSZWZlcmVuY2UnXG4gICAgICAmJiBub2RlLnR5cGVOYW1lLnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgICkge1xuICAgICAgY29uc3QgcmVmTmFtZSA9IG5vZGUudHlwZU5hbWUubmFtZVxuICAgICAgY29uc3QgaXNRdWFsaWZpZWRUeXBlID0gKG5vZGU6IE5vZGUpOiBOb2RlIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nXG4gICAgICAgICAgJiYgbm9kZS5pZC5uYW1lID09PSByZWZOYW1lXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gbm9kZS5ib2R5XG5cbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgbm9kZS50eXBlID09PSAnVFNUeXBlQWxpYXNEZWNsYXJhdGlvbidcbiAgICAgICAgICAmJiBub2RlLmlkLm5hbWUgPT09IHJlZk5hbWVcbiAgICAgICAgICAmJiBxdWFsaWZpZXIobm9kZS50eXBlQW5ub3RhdGlvbilcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBub2RlLnR5cGVBbm5vdGF0aW9uXG5cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicgJiYgbm9kZS5kZWNsYXJhdGlvbilcbiAgICAgICAgICByZXR1cm4gaXNRdWFsaWZpZWRUeXBlKG5vZGUuZGVjbGFyYXRpb24pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICBjb25zdCBxdWFsaWZpZWQgPSBpc1F1YWxpZmllZFR5cGUobm9kZSlcbiAgICAgICAgaWYgKHF1YWxpZmllZClcbiAgICAgICAgICByZXR1cm4gcXVhbGlmaWVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0RlZmluZUV4cG9zZShub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpc0NhbGxPZihub2RlLCBERUZJTkVfRVhQT1NFKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKGV4cG9zZURlY2wpXG4gICAgICBlcnJvcihgZHVwbGljYXRlICR7REVGSU5FX0VYUE9TRX0oKSBjYWxsYCwgbm9kZSlcblxuICAgIGlmIChub2RlLmFyZ3VtZW50cy5sZW5ndGggIT09IDEpXG4gICAgICBlcnJvcihgJHtERUZJTkVfRVhQT1NFfSgpIHJlcXVpcmVzIG9uZSBhcmd1bWVudGAsIG5vZGUpXG5cbiAgICBleHBvc2VEZWNsID0gbm9kZS5hcmd1bWVudHNbMF1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBnZW5SdW50aW1lUHJvcHMocHJvcHM6IFJlY29yZDxzdHJpbmcsIFByb3BUeXBlRGF0YT4pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpXG4gICAgaWYgKCFrZXlzLmxlbmd0aClcbiAgICAgIHJldHVybiB1bmRlZmluZWRcblxuICAgIC8vIGNoZWNrIGRlZmF1bHRzLiBJZiB0aGUgZGVmYXVsdCBvYmplY3QgaXMgYW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBvbmx5XG4gICAgLy8gc3RhdGljIHByb3BlcnRpZXMsIHdlIGNhbiBkaXJlY3RseSBnZW5lcmF0ZSBtb3JlIG9wdGltemllZCBkZWZhdWx0XG4gICAgLy8gZGVjYWxyYXRpb25zLiBPdGhlcndpc2Ugd2Ugd2lsbCBoYXZlIHRvIGZhbGxiYWNrIHRvIHJ1bnRpbWUgbWVyZ2luZy5cbiAgICBjb25zdCBoYXNTdGF0aWNEZWZhdWx0cyA9IHByb3BzUnVudGltZURlZmF1bHRzXG4gICAgICAmJiBwcm9wc1J1bnRpbWVEZWZhdWx0cy50eXBlID09PSAnT2JqZWN0RXhwcmVzc2lvbidcbiAgICAgICYmIHByb3BzUnVudGltZURlZmF1bHRzLnByb3BlcnRpZXMuZXZlcnkoXG4gICAgICAgIG5vZGUgPT4gbm9kZS50eXBlID09PSAnT2JqZWN0UHJvcGVydHknICYmICFub2RlLmNvbXB1dGVkLFxuICAgICAgKVxuXG4gICAgcmV0dXJuIHQub2JqZWN0RXhwcmVzc2lvbihcbiAgICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wID0gaGFzU3RhdGljRGVmYXVsdHNcbiAgICAgICAgICA/IChwcm9wc1J1bnRpbWVEZWZhdWx0cyBhcyBPYmplY3RFeHByZXNzaW9uKS5wcm9wZXJ0aWVzLmZpbmQoKG5vZGU6IGFueSkgPT4gbm9kZS5rZXkubmFtZSA9PT0ga2V5KSBhcyBPYmplY3RQcm9wZXJ0eVxuICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKHByb3ApXG4gICAgICAgICAgdmFsdWUucmVxdWlyZWQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSkubWFwKChba2V5LCB2YWx1ZV0pID0+IGtleSA9PT0gJ3R5cGUnXG4gICAgICAgICAgPyB0Lm9iamVjdFByb3BlcnR5KHQuaWRlbnRpZmllcihrZXkpLCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdC5pZGVudGlmaWVyKHZhbHVlKSA6IHQuYXJyYXlFeHByZXNzaW9uKHZhbHVlLm1hcCgoaTogYW55KSA9PiB0LmlkZW50aWZpZXIoaSkpKSBhcyBhbnkpXG4gICAgICAgICAgOiB0Lm9iamVjdFByb3BlcnR5KHQuaWRlbnRpZmllcihrZXkpLCBwYXJzZUV4cHJlc3Npb24oSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBhcyBhbnkpLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKHByb3ApXG4gICAgICAgICAgZW50cmllcy5wdXNoKHQub2JqZWN0UHJvcGVydHkodC5pZGVudGlmaWVyKCdkZWZhdWx0JyksIHByb3AudmFsdWUgYXMgYW55KSlcblxuICAgICAgICByZXR1cm4gdC5vYmplY3RQcm9wZXJ0eShcbiAgICAgICAgICB0LmlkZW50aWZpZXIoa2V5KSxcbiAgICAgICAgICB0Lm9iamVjdEV4cHJlc3Npb24oZW50cmllcyksXG4gICAgICAgIClcbiAgICAgIH0pLFxuICAgIClcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByb3BzKCkge1xuICAgIGlmIChwcm9wc1J1bnRpbWVEZWNsKVxuICAgICAgcmV0dXJuIHByb3BzUnVudGltZURlY2xcblxuICAgIGlmIChwcm9wc1R5cGVEZWNsKSB7XG4gICAgICBleHRyYWN0UnVudGltZVByb3BzKHByb3BzVHlwZURlY2wsIHR5cGVEZWNsYXJlZFByb3BzLCBkZWNsYXJlZFR5cGVzKVxuICAgICAgcmV0dXJuIGdlblJ1bnRpbWVQcm9wcyh0eXBlRGVjbGFyZWRQcm9wcylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0aHJvd0lmQXdhaXQobm9kZTogTm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdBd2FpdEV4cHJlc3Npb24nKVxuICAgICAgZXJyb3IoJ3RvcC1sZXZlbCBhd2FpdCBpcyBub3Qgc3VwcG9ydGVkIGluIFZ1ZSAyJywgbm9kZSlcbiAgfVxuXG4gIG5vZGVzID0gbm9kZXNcbiAgICAubWFwKChyYXc6IE5vZGUpID0+IHtcbiAgICAgIGxldCBub2RlID0gcmF3XG4gICAgICBpZiAocmF3LnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50JylcbiAgICAgICAgbm9kZSA9IHJhdy5leHByZXNzaW9uXG5cbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJiAhbm9kZS5kZWNsYXJlKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gbm9kZS5kZWNsYXJhdGlvbnMubGVuZ3RoXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRlY2wgPSBub2RlLmRlY2xhcmF0aW9uc1tpXVxuICAgICAgICAgIGlmIChkZWNsLmluaXQpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzRGVmaW5lRW1pdHMoZGVjbC5pbml0KSlcbiAgICAgICAgICAgICAgZGVjbC5pbml0ID0gdC5tZW1iZXJFeHByZXNzaW9uKHQuaWRlbnRpZmllcignX19jdHgnKSwgdC5pZGVudGlmaWVyKCdlbWl0JykpIGFzIGFueVxuICAgICAgICAgICAgZWxzZSBpZiAocHJvY2Vzc0RlZmluZVByb3BzKGRlY2wuaW5pdCkgfHwgcHJvY2Vzc1dpdGhEZWZhdWx0cyhkZWNsLmluaXQpKVxuICAgICAgICAgICAgICBkZWNsLmluaXQgPSB0LmlkZW50aWZpZXIoJ19fcHJvcHMnKSBhcyBhbnlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhyb3dJZkF3YWl0KGRlY2wuaW5pdClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3NXaXRoRGVmYXVsdHMobm9kZSkgfHwgcHJvY2Vzc0RlZmluZUVtaXRzKG5vZGUpIHx8IHByb2Nlc3NEZWZpbmVQcm9wcyhub2RlKSB8fCBwcm9jZXNzRGVmaW5lRXhwb3NlKG5vZGUpKVxuICAgICAgICByZXR1cm4gbnVsbFxuXG4gICAgICB0aHJvd0lmQXdhaXQobm9kZSlcblxuICAgICAgcmV0dXJuIHJhd1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKSBhcyBTdGF0ZW1lbnRbXVxuXG4gIHJldHVybiB7XG4gICAgbm9kZXMsXG4gICAgcHJvcHM6IGdldFByb3BzKCksXG4gICAgZXhwb3NlOiBleHBvc2VEZWNsLFxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbE9mKFxuICBub2RlOiBOb2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdGVzdDogc3RyaW5nIHwgKChpZDogc3RyaW5nKSA9PiBib29sZWFuKSxcbik6IG5vZGUgaXMgQ2FsbEV4cHJlc3Npb24ge1xuICByZXR1cm4gISEoXG4gICAgbm9kZVxuICAgICYmIG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJ1xuICAgICYmIG5vZGUuY2FsbGVlLnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgICYmICh0eXBlb2YgdGVzdCA9PT0gJ3N0cmluZydcbiAgICAgID8gbm9kZS5jYWxsZWUubmFtZSA9PT0gdGVzdFxuICAgICAgOiB0ZXN0KG5vZGUuY2FsbGVlLm5hbWUpKVxuICApXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RSdW50aW1lUHJvcHMoXG4gIG5vZGU6IFRTVHlwZUxpdGVyYWwgfCBUU0ludGVyZmFjZUJvZHksXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wVHlwZURhdGE+LFxuICBkZWNsYXJlZFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4sXG4pIHtcbiAgY29uc3QgbWVtYmVycyA9IG5vZGUudHlwZSA9PT0gJ1RTVHlwZUxpdGVyYWwnID8gbm9kZS5tZW1iZXJzIDogbm9kZS5ib2R5XG4gIGZvciAoY29uc3QgbSBvZiBtZW1iZXJzKSB7XG4gICAgaWYgKFxuICAgICAgKG0udHlwZSA9PT0gJ1RTUHJvcGVydHlTaWduYXR1cmUnIHx8IG0udHlwZSA9PT0gJ1RTTWV0aG9kU2lnbmF0dXJlJylcbiAgICAgICYmIG0ua2V5LnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgICkge1xuICAgICAgbGV0IHR5cGU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG4gICAgICBpZiAobS50eXBlID09PSAnVFNNZXRob2RTaWduYXR1cmUnKSB7XG4gICAgICAgIHR5cGUgPSBbJ0Z1bmN0aW9uJ11cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG0udHlwZUFubm90YXRpb24pIHtcbiAgICAgICAgdHlwZSA9IGluZmVyUnVudGltZVR5cGUoXG4gICAgICAgICAgbS50eXBlQW5ub3RhdGlvbi50eXBlQW5ub3RhdGlvbixcbiAgICAgICAgICBkZWNsYXJlZFR5cGVzLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBwcm9wc1ttLmtleS5uYW1lXSA9IHtcbiAgICAgICAga2V5OiBtLmtleS5uYW1lLFxuICAgICAgICByZXF1aXJlZDogIW0ub3B0aW9uYWwsXG4gICAgICAgIHR5cGU6IHR5cGU/Lmxlbmd0aCA9PT0gMSA/IHR5cGVbMF0gOiB0eXBlIHx8ICdudWxsJyxcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5mZXJSdW50aW1lVHlwZShcbiAgbm9kZTogVFNUeXBlLFxuICBkZWNsYXJlZFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4sXG4pOiBzdHJpbmdbXSB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSAnVFNTdHJpbmdLZXl3b3JkJzpcbiAgICAgIHJldHVybiBbJ1N0cmluZyddXG4gICAgY2FzZSAnVFNOdW1iZXJLZXl3b3JkJzpcbiAgICAgIHJldHVybiBbJ051bWJlciddXG4gICAgY2FzZSAnVFNCb29sZWFuS2V5d29yZCc6XG4gICAgICByZXR1cm4gWydCb29sZWFuJ11cbiAgICBjYXNlICdUU09iamVjdEtleXdvcmQnOlxuICAgICAgcmV0dXJuIFsnT2JqZWN0J11cbiAgICBjYXNlICdUU1R5cGVMaXRlcmFsJzpcbiAgICAgIC8vIFRPRE8gKG5pY2UgdG8gaGF2ZSkgZ2VuZXJhdGUgcnVudGltZSBwcm9wZXJ0eSB2YWxpZGF0aW9uXG4gICAgICByZXR1cm4gWydPYmplY3QnXVxuICAgIGNhc2UgJ1RTRnVuY3Rpb25UeXBlJzpcbiAgICAgIHJldHVybiBbJ0Z1bmN0aW9uJ11cbiAgICBjYXNlICdUU0FycmF5VHlwZSc6XG4gICAgY2FzZSAnVFNUdXBsZVR5cGUnOlxuICAgICAgLy8gVE9ETyAobmljZSB0byBoYXZlKSBnZW5lcmF0ZSBydW50aW1lIGVsZW1lbnQgdHlwZS9sZW5ndGggY2hlY2tzXG4gICAgICByZXR1cm4gWydBcnJheSddXG5cbiAgICBjYXNlICdUU0xpdGVyYWxUeXBlJzpcbiAgICAgIHN3aXRjaCAobm9kZS5saXRlcmFsLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nTGl0ZXJhbCc6XG4gICAgICAgICAgcmV0dXJuIFsnU3RyaW5nJ11cbiAgICAgICAgY2FzZSAnQm9vbGVhbkxpdGVyYWwnOlxuICAgICAgICAgIHJldHVybiBbJ0Jvb2xlYW4nXVxuICAgICAgICBjYXNlICdOdW1lcmljTGl0ZXJhbCc6XG4gICAgICAgIGNhc2UgJ0JpZ0ludExpdGVyYWwnOlxuICAgICAgICAgIHJldHVybiBbJ051bWJlciddXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIFsnbnVsbCddXG4gICAgICB9XG5cbiAgICBjYXNlICdUU1R5cGVSZWZlcmVuY2UnOlxuICAgICAgaWYgKG5vZGUudHlwZU5hbWUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgIGlmIChkZWNsYXJlZFR5cGVzW25vZGUudHlwZU5hbWUubmFtZV0pXG4gICAgICAgICAgcmV0dXJuIGRlY2xhcmVkVHlwZXNbbm9kZS50eXBlTmFtZS5uYW1lXVxuXG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlTmFtZS5uYW1lKSB7XG4gICAgICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgICAgICBjYXNlICdPYmplY3QnOlxuICAgICAgICAgIGNhc2UgJ1NldCc6XG4gICAgICAgICAgY2FzZSAnTWFwJzpcbiAgICAgICAgICBjYXNlICdXZWFrU2V0JzpcbiAgICAgICAgICBjYXNlICdXZWFrTWFwJzpcbiAgICAgICAgICAgIHJldHVybiBbbm9kZS50eXBlTmFtZS5uYW1lXVxuICAgICAgICAgIGNhc2UgJ1JlY29yZCc6XG4gICAgICAgICAgY2FzZSAnUGFydGlhbCc6XG4gICAgICAgICAgY2FzZSAnUmVhZG9ubHknOlxuICAgICAgICAgIGNhc2UgJ1BpY2snOlxuICAgICAgICAgIGNhc2UgJ09taXQnOlxuICAgICAgICAgIGNhc2UgJ0V4Y2x1ZGUnOlxuICAgICAgICAgIGNhc2UgJ0V4dHJhY3QnOlxuICAgICAgICAgIGNhc2UgJ1JlcXVpcmVkJzpcbiAgICAgICAgICBjYXNlICdJbnN0YW5jZVR5cGUnOlxuICAgICAgICAgICAgcmV0dXJuIFsnT2JqZWN0J11cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFsnbnVsbCddXG5cbiAgICBjYXNlICdUU1BhcmVudGhlc2l6ZWRUeXBlJzpcbiAgICAgIHJldHVybiBpbmZlclJ1bnRpbWVUeXBlKG5vZGUudHlwZUFubm90YXRpb24sIGRlY2xhcmVkVHlwZXMpXG4gICAgY2FzZSAnVFNVbmlvblR5cGUnOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgICBbXS5jb25jYXQoXG4gICAgICAgICAgICAuLi4obm9kZS50eXBlcy5tYXAodCA9PiBpbmZlclJ1bnRpbWVUeXBlKHQsIGRlY2xhcmVkVHlwZXMpKSBhcyBhbnkpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICBdXG4gICAgY2FzZSAnVFNJbnRlcnNlY3Rpb25UeXBlJzpcbiAgICAgIHJldHVybiBbJ09iamVjdCddXG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFsnbnVsbCddIC8vIG5vIHJ1bnRpbWUgY2hlY2tcbiAgfVxufVxuIiwiaW1wb3J0IHsgY2FwaXRhbGl6ZSB9IGZyb20gJ0B2dWUvc2hhcmVkJ1xuaW1wb3J0IHR5cGUgeyBOb2RlLCBPYmplY3RFeHByZXNzaW9uLCBTdGF0ZW1lbnQgfSBmcm9tICdAYmFiZWwvdHlwZXMnXG5pbXBvcnQgeyBub3ROdWxsaXNoLCBwYXJ0aXRpb24sIHVuaXEgfSBmcm9tICdAYW50ZnUvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IFBhcnNlZFNGQywgU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBhcHBseU1hY3JvcyB9IGZyb20gJy4vbWFjcm9zJ1xuaW1wb3J0IHsgZ2V0SWRlbnRpZmllckRlY2xhcmF0aW9ucyB9IGZyb20gJy4vaWRlbnRpZmllcnMnXG5pbXBvcnQgeyBnZW5lcmF0ZSwgdCB9IGZyb20gJy4vYmFiZWwnXG5pbXBvcnQgeyBwYXNjYWxpemUgfSBmcm9tICcuL3V0aWxzJ1xuXG5mdW5jdGlvbiBpc0FzeW5jSW1wb3J0KG5vZGU6IFN0YXRlbWVudCkge1xuICBpZiAodC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IG5vZGUuZGVjbGFyYXRpb25zWzBdXG5cbiAgICByZXR1cm4gKFxuICAgICAgZGVjbGFyYXRpb24gIT09IHVuZGVmaW5lZFxuICAgICAgJiYgdC5pc0NhbGxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXQpXG4gICAgICAmJiB0LmlzSWRlbnRpZmllcihkZWNsYXJhdGlvbi5pbml0LmNhbGxlZSlcbiAgICAgICYmIGRlY2xhcmF0aW9uLmluaXQuY2FsbGVlLm5hbWUgPT09ICdkZWZpbmVBc3luY0NvbXBvbmVudCdcbiAgICApXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVNjcmlwdFNldHVwKFxuICBzZmM6IFBhcnNlZFNGQyxcbiAgb3B0aW9ucz86IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyxcbikge1xuICBjb25zdCB7IHNjcmlwdFNldHVwLCBzY3JpcHQsIHRlbXBsYXRlIH0gPSBzZmNcblxuICBjb25zdCB7IG5vZGVzOiBib2R5LCBwcm9wcywgZXhwb3NlIH0gPSBhcHBseU1hY3JvcyhzY3JpcHRTZXR1cC5hc3QuYm9keSlcblxuICBjb25zdCBbaG9pc3RlZCwgc2V0dXBCb2R5XSA9IHBhcnRpdGlvbihcbiAgICBib2R5LFxuICAgIG4gPT5cbiAgICAgIGlzQXN5bmNJbXBvcnQobilcbiAgICAgIHx8IHQuaXNJbXBvcnREZWNsYXJhdGlvbihuKVxuICAgICAgfHwgdC5pc0V4cG9ydE5hbWVkRGVjbGFyYXRpb24obilcbiAgICAgIHx8IG4udHlwZS5zdGFydHNXaXRoKCdUUycpLFxuICApXG5cbiAgLy8gZ2V0IGFsbCBpZGVudGlmaWVycyBpbiBgPHNjcmlwdCBzZXR1cD5gIGFuZCBgPHNjcmlwdD5gXG4gIGNvbnN0IGRlY2xhcmF0aW9uQXJyYXkgPSB1bmlxKFtcbiAgICAuLi5nZXRJZGVudGlmaWVyRGVjbGFyYXRpb25zKGhvaXN0ZWQpLFxuICAgIC4uLmdldElkZW50aWZpZXJEZWNsYXJhdGlvbnMoc2V0dXBCb2R5KSxcbiAgICAuLi5nZXRJZGVudGlmaWVyRGVjbGFyYXRpb25zKHNjcmlwdC5hc3QuYm9keSksXG4gIF0pLmZpbHRlcihub3ROdWxsaXNoKVxuXG4gIC8vIGZpbHRlciBvdXQgaWRlbnRpZmllcnMgdGhhdCBhcmUgdXNlZCBpbiBgPHRlbXBsYXRlPmBcbiAgY29uc3QgcmV0dXJuczogT2JqZWN0RXhwcmVzc2lvblsncHJvcGVydGllcyddID0gZGVjbGFyYXRpb25BcnJheVxuICAgIC5maWx0ZXIoaSA9PiB0ZW1wbGF0ZS5pZGVudGlmaWVycy5oYXMoaSkpXG4gICAgLm1hcCgoaSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB0LmlkZW50aWZpZXIoaSlcbiAgICAgIHJldHVybiB0Lm9iamVjdFByb3BlcnR5KGlkLCBpZCwgZmFsc2UsIHRydWUpXG4gICAgfSlcblxuICBjb25zdCBjb21wb25lbnRzID0gQXJyYXkuZnJvbSh0ZW1wbGF0ZS5jb21wb25lbnRzKVxuICAgIC5tYXAoXG4gICAgICBjb21wb25lbnQgPT5cbiAgICAgICAgZGVjbGFyYXRpb25BcnJheS5maW5kKGRlY2xhcmUgPT4gZGVjbGFyZSA9PT0gY29tcG9uZW50KVxuICAgICAgICA/PyBkZWNsYXJhdGlvbkFycmF5LmZpbmQoZGVjbGFyZSA9PiBwYXNjYWxpemUoZGVjbGFyZSkgPT09IGNvbXBvbmVudCksXG4gICAgKVxuICAgIC5maWx0ZXIobm90TnVsbGlzaClcblxuICBjb25zdCBkaXJlY3RpdmVEZWNsYXJhdGlvbiA9IEFycmF5LmZyb20odGVtcGxhdGUuZGlyZWN0aXZlcylcbiAgICAubWFwKChkaXJlY3RpdmUpID0+IHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBkZWNsYXJhdGlvbkFycmF5LmZpbmQoXG4gICAgICAgIGRlY2xhcmF0aW9uID0+IGRlY2xhcmF0aW9uID09PSBgdiR7Y2FwaXRhbGl6ZShkaXJlY3RpdmUpfWAsXG4gICAgICApXG4gICAgICBpZiAoaWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiB7IGlkZW50aWZpZXIsIGRpcmVjdGl2ZSB9XG4gICAgfSlcbiAgICAuZmlsdGVyKG5vdE51bGxpc2gpXG5cbiAgLy8gYXBwZW5kIGA8c2NyaXB0IHNldHVwPmAgaW1wb3J0cyB0byBgPHNjcmlwdD5gXG5cbiAgY29uc3QgX19zZmMgPSB0LmlkZW50aWZpZXIoJ19fc2ZjX21haW4nKVxuXG4gIGxldCBoYXNCb2R5ID0gZmFsc2VcblxuICBjb25zdCBib2R5Tm9kZXMgPSBzY3JpcHQuYXN0LmJvZHkubWFwKChub2RlOiBOb2RlKSA9PiB7XG4gICAgLy8gcmVwbGFjZSBgZXhwb3J0IGRlZmF1bHRgIHdpdGggYSB0ZW1wcm9yYXkgdmFyaWFibGVcbiAgICAvLyBgY29uc3QgX19zZmNfbWFpbiA9IHsgLi4uIH1gXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbicpIHtcbiAgICAgIGhhc0JvZHkgPSB0cnVlXG4gICAgICByZXR1cm4gdC52YXJpYWJsZURlY2xhcmF0aW9uKCdjb25zdCcsIFtcbiAgICAgICAgdC52YXJpYWJsZURlY2xhcmF0b3IoX19zZmMsIG5vZGUuZGVjbGFyYXRpb24gYXMgYW55KSxcbiAgICAgIF0pXG4gICAgfVxuICAgIHJldHVybiBub2RlXG4gIH0pXG5cbiAgbGV0IGFzdCA9IHQucHJvZ3JhbShbXG4gICAgLi4uc2ZjLmV4dHJhRGVjbGFyYXRpb25zLFxuICAgIC4uLmhvaXN0ZWQsXG4gICAgLi4uYm9keU5vZGVzLFxuICBdIGFzIFN0YXRlbWVudFtdKVxuXG4gIC8vIGluamVjdCBgY29uc3QgX19zZmNfbWFpbiA9IHt9YCBpZiBgPHNjcmlwdD5gIGhhcyBkZWZhdWx0IGV4cG9ydFxuICBpZiAoIWhhc0JvZHkpIHtcbiAgICBhc3QuYm9keS5wdXNoKFxuICAgICAgdC52YXJpYWJsZURlY2xhcmF0aW9uKCdjb25zdCcsIFtcbiAgICAgICAgdC52YXJpYWJsZURlY2xhcmF0b3IoX19zZmMsIHQub2JqZWN0RXhwcmVzc2lvbihbXSkpLFxuICAgICAgXSksXG4gICAgKVxuICB9XG5cbiAgLy8gaW5qZWN0IHByb3BzIGZ1bmN0aW9uXG4gIC8vIGBfX3NmY19tYWluLnByb3BzID0geyAuLi4gfWBcbiAgaWYgKHByb3BzKSB7XG4gICAgaGFzQm9keSA9IHRydWVcbiAgICBhc3QuYm9keS5wdXNoKFxuICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICB0LmFzc2lnbm1lbnRFeHByZXNzaW9uKFxuICAgICAgICAgICc9JyxcbiAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24oX19zZmMsIHQuaWRlbnRpZmllcigncHJvcHMnKSksXG4gICAgICAgICAgcHJvcHMgYXMgYW55LFxuICAgICAgICApLFxuICAgICAgKSBhcyBhbnksXG4gICAgKVxuICB9XG5cbiAgLy8gaW5qZWN0IHNldHVwIGZ1bmN0aW9uXG4gIC8vIGBfX3NmY19tYWluLnNldHVwID0gKCkgPT4ge31gXG4gIGlmIChib2R5Lmxlbmd0aCkge1xuICAgIGhhc0JvZHkgPSB0cnVlXG4gICAgY29uc3QgcmV0dXJuRXhwciA9IGV4cG9zZVxuICAgICAgPyB0LmNhbGxFeHByZXNzaW9uKFxuICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24odC5pZGVudGlmaWVyKCdPYmplY3QnKSwgdC5pZGVudGlmaWVyKCdhc3NpZ24nKSksXG4gICAgICAgIFt0Lm9iamVjdEV4cHJlc3Npb24ocmV0dXJucyksIGV4cG9zZV0sXG4gICAgICApXG4gICAgICA6IHQub2JqZWN0RXhwcmVzc2lvbihyZXR1cm5zKVxuICAgIGNvbnN0IHJldHVyblN0YXRlbWVudCA9IHQucmV0dXJuU3RhdGVtZW50KHJldHVybkV4cHIpXG5cbiAgICBhc3QuYm9keS5wdXNoKFxuICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICB0LmFzc2lnbm1lbnRFeHByZXNzaW9uKFxuICAgICAgICAgICc9JyxcbiAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24oX19zZmMsIHQuaWRlbnRpZmllcignc2V0dXAnKSksXG4gICAgICAgICAgdC5hcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgIFt0LmlkZW50aWZpZXIoJ19fcHJvcHMnKSwgdC5pZGVudGlmaWVyKCdfX2N0eCcpXSxcbiAgICAgICAgICAgIHQuYmxvY2tTdGF0ZW1lbnQoWy4uLnNldHVwQm9keSwgcmV0dXJuU3RhdGVtZW50IGFzIGFueV0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApIGFzIGFueSxcbiAgICApXG4gIH1cblxuICAvLyBpbmplY3QgY29tcG9uZW50c1xuICAvLyBgX19zZmNfbWFpbi5jb21wb25lbnRzID0gT2JqZWN0LmFzc2lnbih7IC4uLiB9LCBfX3NmY19tYWluLmNvbXBvbmVudHMpYFxuICBpZiAoY29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICBoYXNCb2R5ID0gdHJ1ZVxuICAgIGNvbnN0IGNvbXBvbmVudHNPYmplY3QgPSB0Lm9iamVjdEV4cHJlc3Npb24oXG4gICAgICBjb21wb25lbnRzLm1hcCgoaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHQuaWRlbnRpZmllcihpKVxuICAgICAgICByZXR1cm4gdC5vYmplY3RQcm9wZXJ0eShpZCwgaWQsIGZhbHNlLCB0cnVlKVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgYXN0LmJvZHkucHVzaChcbiAgICAgIHQuZXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgdC5hc3NpZ25tZW50RXhwcmVzc2lvbihcbiAgICAgICAgICAnPScsXG4gICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ2NvbXBvbmVudHMnKSksXG4gICAgICAgICAgdC5jYWxsRXhwcmVzc2lvbihcbiAgICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbih0LmlkZW50aWZpZXIoJ09iamVjdCcpLCB0LmlkZW50aWZpZXIoJ2Fzc2lnbicpKSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgY29tcG9uZW50c09iamVjdCxcbiAgICAgICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ2NvbXBvbmVudHMnKSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApIGFzIGFueSxcbiAgICApXG4gIH1cblxuICAvLyBpbmplY3QgZGlyZWN0aXZlc1xuICAvLyBgX19zZmNfbWFpbi5kaXJlY3RpdmVzID0gT2JqZWN0LmFzc2lnbih7IC4uLiB9LCBfX3NmY19tYWluLmRpcmVjdGl2ZXMpYFxuICBpZiAoZGlyZWN0aXZlRGVjbGFyYXRpb24ubGVuZ3RoKSB7XG4gICAgaGFzQm9keSA9IHRydWVcbiAgICBjb25zdCBkaXJlY3RpdmVzT2JqZWN0ID0gdC5vYmplY3RFeHByZXNzaW9uKFxuICAgICAgZGlyZWN0aXZlRGVjbGFyYXRpb24ubWFwKCh7IGRpcmVjdGl2ZSwgaWRlbnRpZmllciB9KSA9PlxuICAgICAgICB0Lm9iamVjdFByb3BlcnR5KFxuICAgICAgICAgIHQuaWRlbnRpZmllcihkaXJlY3RpdmUpLFxuICAgICAgICAgIHQuaWRlbnRpZmllcihpZGVudGlmaWVyKSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuXG4gICAgYXN0LmJvZHkucHVzaChcbiAgICAgIHQuZXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgdC5hc3NpZ25tZW50RXhwcmVzc2lvbihcbiAgICAgICAgICAnPScsXG4gICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ2RpcmVjdGl2ZXMnKSksXG4gICAgICAgICAgdC5jYWxsRXhwcmVzc2lvbihcbiAgICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbih0LmlkZW50aWZpZXIoJ09iamVjdCcpLCB0LmlkZW50aWZpZXIoJ2Fzc2lnbicpKSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlc09iamVjdCxcbiAgICAgICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ2RpcmVjdGl2ZXMnKSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApIGFzIGFueSxcbiAgICApXG4gIH1cblxuICBpZiAoIWhhc0JvZHkgJiYgIW9wdGlvbnM/LmFzdFRyYW5zZm9ybXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXN0OiBudWxsLFxuICAgICAgY29kZTogJycsXG4gICAgfVxuICB9XG5cbiAgLy8gcmUtZXhwb3J0XG4gIC8vIGBleHBvcnQgZGVmYXVsdCBfX3NmY19tYWluYFxuICBhc3QuYm9keS5wdXNoKHQuZXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKF9fc2ZjKSBhcyBhbnkpXG5cbiAgYXN0ID0gb3B0aW9ucz8uYXN0VHJhbnNmb3Jtcz8ucG9zdD8uKGFzdCwgc2ZjKSB8fCBhc3RcblxuICByZXR1cm4ge1xuICAgIGFzdCxcbiAgICBjb2RlOiBnZW5lcmF0ZShhc3QpLmNvZGUsXG4gIH1cbn1cbiIsImltcG9ydCB7IHNob3VsZFRyYW5zZm9ybSwgdHJhbnNmb3JtQVNUIH0gZnJvbSAnQHZ1ZS9yZWFjdGl2aXR5LXRyYW5zZm9ybSdcbmltcG9ydCBNYWdpY1N0cmluZyBmcm9tICdtYWdpYy1zdHJpbmcnXG5pbXBvcnQgdHlwZSB7IFBhcnNlZFNGQywgUmVzb2x2ZWRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBwYXJzZSwgdCB9IGZyb20gJy4vYmFiZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1TZmNSZWZTdWdhcihzZmM6IFBhcnNlZFNGQywgb3B0aW9uczogUmVzb2x2ZWRPcHRpb25zKSB7XG4gIGNvbnN0IGltcG9ydGVkSGVscGVycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgZm9yIChjb25zdCBzY3JpcHQgb2YgW3NmYy5zY3JpcHQsIHNmYy5zY3JpcHRTZXR1cF0pIHtcbiAgICBpZiAoc2hvdWxkVHJhbnNmb3JtKHNjcmlwdC5jb250ZW50KSkge1xuICAgICAgY29uc3QgcyA9IG5ldyBNYWdpY1N0cmluZyhzY3JpcHQuY29udGVudClcbiAgICAgIGNvbnN0IHsgaW1wb3J0ZWRIZWxwZXJzOiBpbXBvcnRzIH0gPSB0cmFuc2Zvcm1BU1Qoc2NyaXB0LmFzdCwgcylcbiAgICAgIEFycmF5LmZyb20oaW1wb3J0cykuZm9yRWFjaChoZWxwZXIgPT4gaW1wb3J0ZWRIZWxwZXJzLmFkZChoZWxwZXIpKVxuICAgICAgc2NyaXB0LmNvbnRlbnQgPSBzLnRvU3RyaW5nKClcbiAgICAgIHNjcmlwdC5hc3QgPSBwYXJzZShzY3JpcHQuY29udGVudCwgc2ZjLnBhcnNlck9wdGlvbnMpLnByb2dyYW1cbiAgICB9XG4gIH1cblxuICBpZiAoaW1wb3J0ZWRIZWxwZXJzLnNpemUpIHtcbiAgICBzZmMuZXh0cmFEZWNsYXJhdGlvbnMgPSBbXG4gICAgICB0LmltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgICBBcnJheS5mcm9tKGltcG9ydGVkSGVscGVycykubWFwKGkgPT4gdC5pbXBvcnRTcGVjaWZpZXIodC5pZGVudGlmaWVyKGBfJHtpfWApLCB0LmlkZW50aWZpZXIoaSkpKSxcbiAgICAgICAgdC5zdHJpbmdMaXRlcmFsKG9wdGlvbnMuaW1wb3J0SGVscGVyc0Zyb20pLFxuICAgICAgKSxcbiAgICBdXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUmVzb2x2ZWRPcHRpb25zLCBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMgfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcHRpb25zKG9wdGlvbnM6IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyA9IHt9KTogUmVzb2x2ZWRPcHRpb25zIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAge30sXG4gICAge1xuICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgcmVhY3Rpdml0eVRyYW5zZm9ybTogZmFsc2UsXG4gICAgICBpbXBvcnRIZWxwZXJzRnJvbTogJ0B2dWUvY29tcG9zaXRpb24tYXBpJyxcbiAgICAgIGFzdFRyYW5zZm9ybXM6IHt9LFxuICAgIH0sXG4gICAgb3B0aW9ucyxcbiAgKVxufVxuIiwiaW1wb3J0IE1hZ2ljU3RyaW5nIGZyb20gJ21hZ2ljLXN0cmluZydcbmltcG9ydCB7IHNob3VsZFRyYW5zZm9ybSBhcyBzaG91bGRUcmFuc2Zvcm1SZWZTdWdhciwgdHJhbnNmb3JtIGFzIHRyYW5zZm9ybVJlZiB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eS10cmFuc2Zvcm0nXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkT3B0aW9ucywgU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zLCBUcmFuc2Zvcm1SZXN1bHQgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IHBhcnNlU0ZDIH0gZnJvbSAnLi9wYXJzZVNGQydcbmltcG9ydCB7IHRyYW5zZm9ybVNjcmlwdFNldHVwIH0gZnJvbSAnLi90cmFuc2Zvcm1TY3JpcHRTZXR1cCdcbmltcG9ydCB7IHRyYW5zZm9ybVNmY1JlZlN1Z2FyIH0gZnJvbSAnLi90cmFuc2Zvcm1TZmNSZWZTdWdhcidcbmltcG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJ1xuXG5jb25zdCBzY3JpcHRTZXR1cFJFID0gLzxzY3JpcHRcXHMoLipcXHMpP3NldHVwKFxccy4qKT8+L1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVHJhbnNmb3JtKGNvZGU6IHN0cmluZywgaWQ6IHN0cmluZywgb3B0aW9ucz86IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAvLyBhdm9pZCB0cmFuc2Zvcm1pbmcgdHdpY2VcbiAgaWYgKGNvZGUuaW5jbHVkZXMoJ2V4cG9ydCBkZWZhdWx0IF9fc2ZjX21haW4nKSlcbiAgICByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIChvcHRpb25zPy5yZWFjdGl2aXR5VHJhbnNmb3JtICYmIHNob3VsZFRyYW5zZm9ybVJlZlN1Z2FyKGNvZGUpKSB8fCBzY3JpcHRTZXR1cFJFLnRlc3QoY29kZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybShpbnB1dDogc3RyaW5nLCBpZDogc3RyaW5nLCBvcHRpb25zPzogU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zKTogUHJvbWlzZTxUcmFuc2Zvcm1SZXN1bHQ+IHtcbiAgaWYgKCFzaG91bGRUcmFuc2Zvcm0oaW5wdXQsIGlkLCBvcHRpb25zKSlcbiAgICByZXR1cm4gbnVsbFxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVPcHRpb25zKG9wdGlvbnMpXG4gIGlmIChpZC5lbmRzV2l0aCgnLnZ1ZScpIHx8IGlkLmluY2x1ZGVzKCcudnVlP3Z1ZScpKVxuICAgIHJldHVybiBhd2FpdCB0cmFuc2Zvcm1WdWUoaW5wdXQsIGlkLCByZXNvbHZlZClcbiAgZWxzZVxuICAgIHJldHVybiB0cmFuc2Zvcm1Ob25WdWUoaW5wdXQsIGlkLCByZXNvbHZlZClcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtTm9uVnVlKGlucHV0OiBzdHJpbmcsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJlc29sdmVkT3B0aW9ucyk6IFRyYW5zZm9ybVJlc3VsdCB7XG4gIGlmIChvcHRpb25zLnJlYWN0aXZpdHlUcmFuc2Zvcm0gJiYgc2hvdWxkVHJhbnNmb3JtUmVmU3VnYXIoaW5wdXQpKSB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVJlZihpbnB1dCwge1xuICAgICAgZmlsZW5hbWU6IGlkLFxuICAgICAgc291cmNlTWFwOiBvcHRpb25zLnNvdXJjZU1hcCxcbiAgICAgIGltcG9ydEhlbHBlcnNGcm9tOiBvcHRpb25zLmltcG9ydEhlbHBlcnNGcm9tLFxuICAgIH0pIGFzIGFueVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybVZ1ZShpbnB1dDogc3RyaW5nLCBpZDogc3RyaW5nLCBvcHRpb25zOiBSZXNvbHZlZE9wdGlvbnMpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3VsdD4ge1xuICBjb25zdCBzID0gbmV3IE1hZ2ljU3RyaW5nKGlucHV0KVxuXG4gIGNvbnN0IHNmYyA9IGF3YWl0IHBhcnNlU0ZDKGlucHV0LCBpZClcblxuICBpZiAob3B0aW9ucy5yZWFjdGl2aXR5VHJhbnNmb3JtKVxuICAgIHRyYW5zZm9ybVNmY1JlZlN1Z2FyKHNmYywgb3B0aW9ucylcblxuICBjb25zdCB7IGNvZGUgfSA9IHRyYW5zZm9ybVNjcmlwdFNldHVwKHNmYywgb3B0aW9ucylcblxuICBjb25zdCBhdHRyaWJ1dGVzID0ge1xuICAgIC4uLnNmYy5zY3JpcHQuYXR0cnMsXG4gICAgLi4uc2ZjLnNjcmlwdFNldHVwLmF0dHJzLFxuICB9XG4gIGRlbGV0ZSBhdHRyaWJ1dGVzLnNldHVwXG4gIGNvbnN0IGF0dHIgPSBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKVxuICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUgPyBgJHtrZXl9PVwiJHt2YWx1ZX1cImAgOiBrZXkpXG4gICAgLmpvaW4oJyAnKVxuXG4gIGlmIChjb2RlKSB7XG4gICAgY29uc3QgYmxvY2sgPSBgPHNjcmlwdCAke2F0dHJ9PlxcbiR7Y29kZX1cXG48L3NjcmlwdD5gXG5cbiAgICBzLnJlbW92ZShzZmMuc2NyaXB0LnN0YXJ0LCBzZmMuc2NyaXB0LmVuZClcbiAgICBpZiAoc2ZjLnNjcmlwdFNldHVwLnN0YXJ0ICE9PSBzZmMuc2NyaXB0U2V0dXAuZW5kKSB7XG4gICAgICBzLm92ZXJ3cml0ZShcbiAgICAgICAgc2ZjLnNjcmlwdFNldHVwLnN0YXJ0LFxuICAgICAgICBzZmMuc2NyaXB0U2V0dXAuZW5kLFxuICAgICAgICBibG9jayxcbiAgICAgIClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnByZXBlbmRMZWZ0KDAsIGAke2Jsb2NrfVxcbmApXG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY29kZTogcy50b1N0cmluZygpLFxuICAgIG1hcDogb3B0aW9ucy5zb3VyY2VNYXBcbiAgICAgID8gcy5nZW5lcmF0ZU1hcCh7XG4gICAgICAgIHNvdXJjZTogaWQsXG4gICAgICAgIGluY2x1ZGVDb250ZW50OiB0cnVlLFxuICAgICAgfSkgYXMgYW55XG4gICAgICA6IG51bGwsXG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVVucGx1Z2luIH0gZnJvbSAndW5wbHVnaW4nXG5pbXBvcnQgeyBjcmVhdGVGaWx0ZXIgfSBmcm9tICdAcm9sbHVwL3BsdWdpbnV0aWxzJ1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IHRyYW5zZm9ybSB9IGZyb20gJy4vY29yZSdcblxuZXhwb3J0ICogZnJvbSAnLi9jb3JlJ1xuXG5leHBvcnQgY29uc3QgdW5wbHVnaW4gPSBjcmVhdGVVbnBsdWdpbjxQbHVnaW5PcHRpb25zPigob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IGZpbHRlciA9IGNyZWF0ZUZpbHRlcihcbiAgICBvcHRpb25zLmluY2x1ZGUgfHwgKG9wdGlvbnMucmVhY3Rpdml0eVRyYW5zZm9ybSA/IFsvXFwudnVlJC8sIC9cXC52dWVcXD92dWUvLCAvXFwuW2p0XXN4PyQvXSA6IFsvXFwudnVlJC8sIC9cXC52dWVcXD92dWUvXSksXG4gICAgb3B0aW9ucy5leGNsdWRlIHx8IFsvbm9kZV9tb2R1bGVzLywgL1xcLmdpdC8sIC9cXC5udXh0L10sXG4gIClcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd1bnBsdWdpbi12dWUyLXNjcmlwdC1zZXR1cCcsXG4gICAgZW5mb3JjZTogJ3ByZScsXG4gICAgdHJhbnNmb3JtSW5jbHVkZShpZCkge1xuICAgICAgcmV0dXJuIGZpbHRlcihpZClcbiAgICB9LFxuICAgIGFzeW5jIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRyYW5zZm9ybShjb2RlLCBpZCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5lcnJvcihlKVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IHVucGx1Z2luXG4iXSwibmFtZXMiOlsiTm9kZVR5cGVzIiwiRWxlbWVudFR5cGVzIiwibm9kZSIsIl9hIiwiX2IiLCJfYyIsImNvbnRlbnQiLCJhc3QiLCJrZXkiLCJ2YWx1ZSIsInQiLCJzaG91bGRUcmFuc2Zvcm0iLCJzaG91bGRUcmFuc2Zvcm1SZWZTdWdhciIsInRyYW5zZm9ybVJlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLElBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLENBQUE7QUFLYSxNQUFBLENBQUEsR0FBQSxDQUE2QixLQUFjLENBQUEsT0FBQSxJQUFXLEtBQU8sRUFBQSxLQUFBLENBQUE7QUFDN0QsTUFBQSxRQUFBLEdBQXVCLEVBQVUsT0FBVyxJQUFBLENBQUEsQ0FBQTtBQUM1QyxNQUFBLFFBQUEsR0FBQSxDQUFhLGtFQUF3QixPQUF4QixLQUFBLElBQUEsR0FBQSxLQUFBLENBQUEsR0FBQSxFQUFBLENBQWlDLFlBQWpDLElBQXFELEdBQUEsRUFBQSxHQUFBLGNBQUEsSUFBQSxJQUFBLEdBQUEsS0FBQSxDQUFBLEdBQUEsY0FBQSxDQUFnQixZQUFy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
|