938 lines
130 KiB
JavaScript
938 lines
130 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
var unplugin$1 = require('unplugin');
|
|
var pluginutils = require('@rollup/pluginutils');
|
|
var MagicString = require('magic-string');
|
|
var reactivityTransform = require('@vue/reactivity-transform');
|
|
var utils = require('@antfu/utils');
|
|
var compilerCore = require('@vue/compiler-core');
|
|
var compilerDom = require('@vue/compiler-dom');
|
|
var shared = require('@vue/shared');
|
|
var babel = require('@babel/core');
|
|
var parser = require('@babel/parser');
|
|
var g = require('@babel/generator');
|
|
var babel_traverse = require('@babel/traverse');
|
|
|
|
function _interopNamespaceDefault(e) {
|
|
var n = Object.create(null);
|
|
if (e) {
|
|
Object.keys(e).forEach(function (k) {
|
|
if (k !== 'default') {
|
|
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
Object.defineProperty(n, k, d.get ? d : {
|
|
enumerable: true,
|
|
get: function () { return e[k]; }
|
|
});
|
|
}
|
|
});
|
|
}
|
|
n.default = e;
|
|
return Object.freeze(n);
|
|
}
|
|
|
|
var babel__namespace = /*#__PURE__*/_interopNamespaceDefault(babel);
|
|
var babel_traverse__namespace = /*#__PURE__*/_interopNamespaceDefault(babel_traverse);
|
|
|
|
var _a, _b, _c;
|
|
const t = (babel__namespace.default || babel__namespace).types;
|
|
const generate = g.default || g;
|
|
const traverse = (_c = (_b = (_a = babel_traverse__namespace == null ? void 0 : babel_traverse__namespace.default) == null ? void 0 : _a.default) != null ? _b : babel_traverse__namespace == null ? void 0 : babel_traverse__namespace.default) != null ? _c : babel_traverse__namespace;
|
|
|
|
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) => shared.capitalize(shared.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(parser.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(utils.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(utils.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 = compilerCore.baseParse(code, compilerDom.parserOptions).children.flatMap(
|
|
(x) => x.type === NodeTypes.ELEMENT && x.tagType === ElementTypes.ELEMENT ? [x] : []
|
|
);
|
|
const templateNode = elementChildren.find((x) => x.tag === "template");
|
|
const [scriptSetupChildNodes, scriptChildNodes] = utils.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 = parser.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(
|
|
parser.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";
|
|
}
|
|
) ? compilerCore.baseParse(
|
|
(await import('pug')).compile(
|
|
templateNode.children.map((x) => x.loc.source).join(""),
|
|
{
|
|
filename: id
|
|
}
|
|
)(),
|
|
compilerDom.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(shared.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), parser.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] = utils.partition(
|
|
body,
|
|
(n) => isAsyncImport(n) || t.isImportDeclaration(n) || t.isExportNamedDeclaration(n) || n.type.startsWith("TS")
|
|
);
|
|
const declarationArray = utils.uniq([
|
|
...getIdentifierDeclarations(hoisted),
|
|
...getIdentifierDeclarations(setupBody),
|
|
...getIdentifierDeclarations(script.ast.body)
|
|
]).filter(utils.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(utils.notNullish);
|
|
const directiveDeclaration = Array.from(template.directives).map((directive) => {
|
|
const identifier = declarationArray.find(
|
|
(declaration) => declaration === `v${shared.capitalize(directive)}`
|
|
);
|
|
if (identifier === void 0)
|
|
return void 0;
|
|
return { identifier, directive };
|
|
}).filter(utils.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 (reactivityTransform.shouldTransform(script.content)) {
|
|
const s = new MagicString(script.content);
|
|
const { importedHelpers: imports } = reactivityTransform.transformAST(script.ast, s);
|
|
Array.from(imports).forEach((helper) => importedHelpers.add(helper));
|
|
script.content = s.toString();
|
|
script.ast = parser.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) && reactivityTransform.shouldTransform(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 && reactivityTransform.shouldTransform(input)) {
|
|
return reactivityTransform.transform(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 = unplugin$1.createUnplugin((options = {}) => {
|
|
const filter = pluginutils.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);
|
|
}
|
|
}
|
|
};
|
|
});
|
|
|
|
exports.default = unplugin;
|
|
exports.shouldTransform = shouldTransform;
|
|
exports.transform = transform;
|
|
exports.transformScriptSetup = transformScriptSetup;
|
|
exports.unplugin = unplugin;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlL2JhYmVsLnRzIiwiLi4vc3JjL2NvcmUvaWRlbnRpZmllcnMudHMiLCIuLi9zcmMvY29yZS91dGlscy50cyIsIi4uL3NyYy9jb3JlL3BhcnNlU0ZDLnRzIiwiLi4vc3JjL2NvcmUvbWFjcm9zLnRzIiwiLi4vc3JjL2NvcmUvdHJhbnNmb3JtU2NyaXB0U2V0dXAudHMiLCIuLi9zcmMvY29yZS90cmFuc2Zvcm1TZmNSZWZTdWdhci50cyIsIi4uL3NyYy9jb3JlL29wdGlvbnMudHMiLCIuLi9zcmMvY29yZS90cmFuc2Zvcm0udHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYmFiZWwgZnJvbSAnQGJhYmVsL2NvcmUnXG5pbXBvcnQgeyBwYXJzZSwgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnQGJhYmVsL3BhcnNlcidcbmltcG9ydCBnIGZyb20gJ0BiYWJlbC9nZW5lcmF0b3InXG5pbXBvcnQgKiBhcyBiYWJlbF90cmF2ZXJzZSBmcm9tICdAYmFiZWwvdHJhdmVyc2UnXG5cbmV4cG9ydCBjb25zdCB0OiB0eXBlb2YgYmFiZWxbJ3R5cGVzJ10gPSAoKGJhYmVsIGFzIGFueSkuZGVmYXVsdCB8fCBiYWJlbCkudHlwZXNcbmV4cG9ydCBjb25zdCBnZW5lcmF0ZTogdHlwZW9mIGcgPSAoKGcgYXMgYW55KS5kZWZhdWx0IHx8IGcpXG5leHBvcnQgY29uc3QgdHJhdmVyc2UgPSAoKGJhYmVsX3RyYXZlcnNlIGFzIGFueSk/LmRlZmF1bHQ/LmRlZmF1bHQgYXMgbnVsbCkgPz8gYmFiZWxfdHJhdmVyc2U/LmRlZmF1bHQgPz8gYmFiZWxfdHJhdmVyc2VcbmV4cG9ydCB7IHBhcnNlRXhwcmVzc2lvbiwgcGFyc2UgfVxuIiwiaW1wb3J0IHR5cGUge1xuICBFeHByZXNzaW9uLFxuICBGaWxlLFxuICBQcml2YXRlTmFtZSxcbiAgU3ByZWFkRWxlbWVudCxcbiAgU3RhdGVtZW50LFxuICBUU1R5cGUsXG59IGZyb20gJ0BiYWJlbC90eXBlcydcbmltcG9ydCB0eXBlIHsgUGFyc2VSZXN1bHQgfSBmcm9tICdAYmFiZWwvcGFyc2VyJ1xuaW1wb3J0IHsgdCwgdHJhdmVyc2UgfSBmcm9tICcuL2JhYmVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWRlbnRpZmllckRlY2xhcmF0aW9ucyhub2RlczogU3RhdGVtZW50W10pIHtcbiAgbGV0IHJlc3VsdCE6IFNldDxzdHJpbmc+XG4gIGxldCBwcm9ncmFtU2NvcGVVaWQ6IG51bWJlclxuICB0cmF2ZXJzZSh0LmZpbGUodC5wcm9ncmFtKG5vZGVzKSksIHtcbiAgICBQcm9ncmFtKHBhdGgpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBTZXQoT2JqZWN0LmtleXMocGF0aC5zY29wZS5iaW5kaW5ncykpXG4gICAgICBwcm9ncmFtU2NvcGVVaWQgPSAocGF0aC5zY29wZSBhcyBhbnkpLnVpZFxuICAgIH0sXG4gICAgLy8gRklYTUU6IGJhYmVsIGJ1ZywgdGVtcG9yYXJ5IGFkZCBUU0VudW1EZWNsYXJhdGlvbiBhbmQgVFNNb2R1bGVEZWNsYXJhdGlvbiBsb2dpY1xuICAgIFRTRW51bURlY2xhcmF0aW9uKHBhdGgpIHtcbiAgICAgIGlmICgocGF0aC5zY29wZSBhcyBhbnkpLnVpZCA9PT0gcHJvZ3JhbVNjb3BlVWlkKVxuICAgICAgICByZXN1bHQuYWRkKHBhdGgubm9kZS5pZC5uYW1lKVxuICAgIH0sXG4gICAgVFNNb2R1bGVEZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICBpZiAoKHBhdGguc2NvcGUgYXMgYW55KS51aWQgPT09IHByb2dyYW1TY29wZVVpZCkge1xuICAgICAgICBjb25zdCBpZCA9IHBhdGgubm9kZS5pZFxuICAgICAgICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKVxuICAgICAgICAgIHJlc3VsdC5hZGQoaWQubmFtZSlcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuICByZXR1cm4gQXJyYXkuZnJvbShyZXN1bHQpXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGBnZXRGaWxlR2xvYmFsc2AgaW5zdGVhZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlPzogRXhwcmVzc2lvbiB8IFRTVHlwZSB8IFNwcmVhZEVsZW1lbnQgfCBQcml2YXRlTmFtZSB8IFN0YXRlbWVudCB8IG51bGwsIGlkZW50aWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCkpIHtcbiAgaWYgKCFub2RlKVxuICAgIHJldHVybiBpZGVudGlmaWVyc1xuXG4gIGlmIChub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpIHtcbiAgICBub2RlLmJvZHkuZm9yRWFjaChjaGlsZCA9PiBnZXRJZGVudGlmaWVyVXNhZ2VzKGNoaWxkLCBpZGVudGlmaWVycykpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuZXhwcmVzc2lvbiwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICBpZGVudGlmaWVycy5hZGQobm9kZS5uYW1lKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ09wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUub2JqZWN0LCBpZGVudGlmaWVycylcbiAgICBpZiAobm9kZS5jb21wdXRlZClcbiAgICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5wcm9wZXJ0eSwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ09wdGlvbmFsQ2FsbEV4cHJlc3Npb24nKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmNhbGxlZSBhcyBFeHByZXNzaW9uLCBpZGVudGlmaWVycylcbiAgICBub2RlLmFyZ3VtZW50cy5mb3JFYWNoKGFyZyA9PiBnZXRJZGVudGlmaWVyVXNhZ2VzKGFyZyBhcyBFeHByZXNzaW9uLCBpZGVudGlmaWVycykpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQmluYXJ5RXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnTG9naWNhbEV4cHJlc3Npb24nKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmxlZnQsIGlkZW50aWZpZXJzKVxuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5yaWdodCwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnVW5hcnlFeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5hcmd1bWVudCwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnRm9yT2ZTdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0ZvckluU3RhdGVtZW50Jykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5yaWdodCwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS50ZXN0LCBpZGVudGlmaWVycylcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuY29uc2VxdWVudCwgaWRlbnRpZmllcnMpXG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmFsdGVybmF0ZSwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnT2JqZWN0RXhwcmVzc2lvbicpIHtcbiAgICBub2RlLnByb3BlcnRpZXMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgaWYgKHByb3AudHlwZSA9PT0gJ09iamVjdFByb3BlcnR5Jykge1xuICAgICAgICBpZiAocHJvcC5jb21wdXRlZClcbiAgICAgICAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKHByb3Aua2V5LCBpZGVudGlmaWVycylcbiAgICAgICAgZ2V0SWRlbnRpZmllclVzYWdlcyhwcm9wLnZhbHVlIGFzIEV4cHJlc3Npb24sIGlkZW50aWZpZXJzKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAocHJvcC50eXBlID09PSAnU3ByZWFkRWxlbWVudCcpIHtcbiAgICAgICAgZ2V0SWRlbnRpZmllclVzYWdlcyhwcm9wLCBpZGVudGlmaWVycylcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0FycmF5RXhwcmVzc2lvbicpIHtcbiAgICBub2RlLmVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiBnZXRJZGVudGlmaWVyVXNhZ2VzKGVsZW1lbnQsIGlkZW50aWZpZXJzKSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdTcHJlYWRFbGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdSZXR1cm5TdGF0ZW1lbnQnKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmFyZ3VtZW50LCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdOZXdFeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5jYWxsZWUgYXMgRXhwcmVzc2lvbiwgaWRlbnRpZmllcnMpXG4gICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaChhcmcgPT4gZ2V0SWRlbnRpZmllclVzYWdlcyhhcmcgYXMgRXhwcmVzc2lvbiwgaWRlbnRpZmllcnMpKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyB8fCBub2RlLnR5cGUgPT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmJvZHksIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ1RlbXBsYXRlTGl0ZXJhbCcpIHtcbiAgICBub2RlLmV4cHJlc3Npb25zLmZvckVhY2goZXhwciA9PiBnZXRJZGVudGlmaWVyVXNhZ2VzKGV4cHIsIGlkZW50aWZpZXJzKSlcbiAgfVxuICAvLyBlbHNlIHtcbiAgLy8gICBjb25zb2xlLmxvZyhub2RlKVxuICAvLyB9XG4gIHJldHVybiBpZGVudGlmaWVyc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZUdsb2JhbHMocmVzdWx0OiBQYXJzZVJlc3VsdDxGaWxlPikge1xuICBsZXQgZ2xvYmFscyE6IFNldDxzdHJpbmc+XG4gIGxldCBwcm9ncmFtU2NvcGVVaWQ6IG51bWJlclxuICB0cmF2ZXJzZShyZXN1bHQsIHtcbiAgICBQcm9ncmFtKHBhdGgpIHtcbiAgICAgIGdsb2JhbHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKChwYXRoLnNjb3BlIGFzIGFueSkuZ2xvYmFscykpXG4gICAgICBwcm9ncmFtU2NvcGVVaWQgPSAocGF0aC5zY29wZSBhcyBhbnkpLnVpZFxuICAgIH0sXG4gICAgLy8gRklYTUU6IGJhYmVsIGJ1ZywgdGVtcG9yYXJ5IGFkZCBUU0VudW1EZWNsYXJhdGlvbiBhbmQgVFNNb2R1bGVEZWNsYXJhdGlvbiBsb2dpY1xuICAgIFRTRW51bURlY2xhcmF0aW9uKHBhdGgpIHtcbiAgICAgIGlmICgocGF0aC5zY29wZSBhcyBhbnkpLnVpZCA9PT0gcHJvZ3JhbVNjb3BlVWlkKVxuICAgICAgICBnbG9iYWxzLmRlbGV0ZShwYXRoLm5vZGUuaWQubmFtZSlcbiAgICB9LFxuICAgIFRTTW9kdWxlRGVjbGFyYXRpb24ocGF0aCkge1xuICAgICAgaWYgKChwYXRoLnNjb3BlIGFzIGFueSkudWlkID09PSBwcm9ncmFtU2NvcGVVaWQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBwYXRoLm5vZGUuaWRcbiAgICAgICAgaWYgKGlkLnR5cGUgPT09ICdJZGVudGlmaWVyJylcbiAgICAgICAgICBnbG9iYWxzLmRlbGV0ZShpZC5uYW1lKVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG4gIHJldHVybiBBcnJheS5mcm9tKGdsb2JhbHMpXG59XG4iLCJpbXBvcnQgeyBjYW1lbGl6ZSwgY2FwaXRhbGl6ZSB9IGZyb20gJ0B2dWUvc2hhcmVkJ1xuXG5leHBvcnQgY29uc3QgcGFzY2FsaXplID0gKHN0cjogc3RyaW5nKSA9PiBjYXBpdGFsaXplKGNhbWVsaXplKHN0cikpXG5cbmV4cG9ydCBjb25zdCBpc05vdE5pbCA9IDxUPih2YWx1ZTogVCk6IHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+ID0+IHZhbHVlICE9IG51bGxcblxuZXhwb3J0IGZ1bmN0aW9uIGV4aGF1c3RpdmVDaGVja1JldHVyblVuZGVmaW5lZChfcGFyYW06IG5ldmVyKSB7XG4gIHJldHVybiB1bmRlZmluZWQgYXMgbmV2ZXJcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG9uZS12YXIgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2UgKi9cbmltcG9ydCB7IG5vdE51bGxpc2gsIHBhcnRpdGlvbiB9IGZyb20gJ0BhbnRmdS91dGlscydcbmltcG9ydCB0eXBlIHsgUHJvZ3JhbSB9IGZyb20gJ0BiYWJlbC90eXBlcydcbmltcG9ydCB0eXBlIHsgUGFyc2VyUGx1Z2luIH0gZnJvbSAnQGJhYmVsL3BhcnNlcidcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlTm9kZSxcbiAgRGlyZWN0aXZlTm9kZSxcbiAgRXhwcmVzc2lvbk5vZGUsXG4gIFBsYWluRWxlbWVudE5vZGUsXG4gIFJvb3ROb2RlLFxuICBUZW1wbGF0ZUNoaWxkTm9kZSxcbn0gZnJvbSAnQHZ1ZS9jb21waWxlci1jb3JlJ1xuaW1wb3J0IHsgYmFzZVBhcnNlIH0gZnJvbSAnQHZ1ZS9jb21waWxlci1jb3JlJ1xuaW1wb3J0IHsgcGFyc2VyT3B0aW9ucyB9IGZyb20gJ0B2dWUvY29tcGlsZXItZG9tJ1xuaW1wb3J0IHsgY2FtZWxpemUgfSBmcm9tICdAdnVlL3NoYXJlZCdcbmltcG9ydCB0eXBlIHtcbiAgUGFyc2VkU0ZDLFxuICBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMsXG4gIFNjcmlwdFRhZ01ldGEsXG59IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgZ2V0RmlsZUdsb2JhbHMgfSBmcm9tICcuL2lkZW50aWZpZXJzJ1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICcuL2JhYmVsJ1xuaW1wb3J0IHsgZXhoYXVzdGl2ZUNoZWNrUmV0dXJuVW5kZWZpbmVkLCBwYXNjYWxpemUgfSBmcm9tICcuL3V0aWxzJ1xuXG5uYW1lc3BhY2UgTm9kZVR5cGVzIHtcbiAgZXhwb3J0IGNvbnN0IFJPT1QgPSAwLFxuICAgIEVMRU1FTlQgPSAxLFxuICAgIFRFWFQgPSAyLFxuICAgIENPTU1FTlQgPSAzLFxuICAgIFNJTVBMRV9FWFBSRVNTSU9OID0gNCxcbiAgICBJTlRFUlBPTEFUSU9OID0gNSxcbiAgICBBVFRSSUJVVEUgPSA2LFxuICAgIERJUkVDVElWRSA9IDcsXG4gICAgQ09NUE9VTkRfRVhQUkVTU0lPTiA9IDgsXG4gICAgSUYgPSA5LFxuICAgIElGX0JSQU5DSCA9IDEwLFxuICAgIEZPUiA9IDExLFxuICAgIFRFWFRfQ0FMTCA9IDEyLFxuICAgIFZOT0RFX0NBTEwgPSAxMyxcbiAgICBKU19DQUxMX0VYUFJFU1NJT04gPSAxNCxcbiAgICBKU19PQkpFQ1RfRVhQUkVTU0lPTiA9IDE1LFxuICAgIEpTX1BST1BFUlRZID0gMTYsXG4gICAgSlNfQVJSQVlfRVhQUkVTU0lPTiA9IDE3LFxuICAgIEpTX0ZVTkNUSU9OX0VYUFJFU1NJT04gPSAxOCxcbiAgICBKU19DT05ESVRJT05BTF9FWFBSRVNTSU9OID0gMTksXG4gICAgSlNfQ0FDSEVfRVhQUkVTU0lPTiA9IDIwLFxuICAgIEpTX0JMT0NLX1NUQVRFTUVOVCA9IDIxLFxuICAgIEpTX1RFTVBMQVRFX0xJVEVSQUwgPSAyMixcbiAgICBKU19JRl9TVEFURU1FTlQgPSAyMyxcbiAgICBKU19BU1NJR05NRU5UX0VYUFJFU1NJT04gPSAyNCxcbiAgICBKU19TRVFVRU5DRV9FWFBSRVNTSU9OID0gMjUsXG4gICAgSlNfUkVUVVJOX1NUQVRFTUVOVCA9IDI2XG59XG5cbm5hbWVzcGFjZSBFbGVtZW50VHlwZXMge1xuICBleHBvcnQgY29uc3QgRUxFTUVOVCA9IDAsXG4gICAgQ09NUE9ORU5UID0gMSxcbiAgICBTTE9UID0gMixcbiAgICBURU1QTEFURSA9IDNcbn1cblxuY29uc3QgQlVJTERfSU5fRElSRUNUSVZFUyA9IG5ldyBTZXQoW1xuICAnaWYnLFxuICAnZWxzZScsXG4gICdlbHNlLWlmJyxcbiAgJ2ZvcicsXG4gICdvbmNlJyxcbiAgJ21vZGVsJyxcbiAgJ29uJyxcbiAgJ2JpbmQnLFxuICAnc2xvdCcsXG4gICdzbG90LXNjb3BlJyxcbiAgJ2tleScsXG4gICdyZWYnLFxuICAndGV4dCcsXG4gICdodG1sJyxcbiAgJ3Nob3cnLFxuICAncHJlJyxcbiAgJ2Nsb2FrJyxcbiAgLy8gJ2VsJyxcbiAgLy8gJ3JlZicsXG5dKVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRzKG5vZGU6IFRlbXBsYXRlQ2hpbGROb2RlKTogc3RyaW5nW10ge1xuICBjb25zdCBjdXJyZW50XG4gICAgPSBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UICYmIG5vZGUudGFnVHlwZSA9PT0gRWxlbWVudFR5cGVzLkNPTVBPTkVOVFxuICAgICAgPyBbbm9kZS50YWddXG4gICAgICA6IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkVMRU1FTlQgJiYgbm9kZS50YWdUeXBlID09PSBFbGVtZW50VHlwZXMuRUxFTUVOVFxuICAgICAgICA/IFtub2RlLnRhZ11cbiAgICAgICAgOiBbXVxuXG4gIGNvbnN0IGNoaWxkcmVuXG4gICAgPSBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRlxuICAgICAgPyBub2RlLmJyYW5jaGVzXG4gICAgICA6IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkVMRU1FTlRcbiAgICAgICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuSUZfQlJBTkNIXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkZPUlxuICAgICAgICA/IG5vZGUuY2hpbGRyZW5cbiAgICAgICAgOiBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5URVhUXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkNPTU1FTlRcbiAgICAgICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTlxuICAgICAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5URVhUX0NBTExcbiAgICAgICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuSU5URVJQT0xBVElPTlxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IGV4aGF1c3RpdmVDaGVja1JldHVyblVuZGVmaW5lZChub2RlKSA/PyBbXVxuXG4gIHJldHVybiBbLi4uY3VycmVudCwgLi4uY2hpbGRyZW4uZmxhdE1hcChnZXRDb21wb25lbnRzKV1cbn1cblxuZnVuY3Rpb24gZ2V0RGlyZWN0aXZlTmFtZXMobm9kZTogVGVtcGxhdGVDaGlsZE5vZGUpOiBzdHJpbmdbXSB7XG4gIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5FTEVNRU5UKSB7XG4gICAgY29uc3QgZGlyZWN0aXZlcyA9IG5vZGUucHJvcHMuZmxhdE1hcCh4ID0+XG4gICAgICB4LnR5cGUgPT09IE5vZGVUeXBlcy5ESVJFQ1RJVkUgPyBbeC5uYW1lXSA6IFtdLFxuICAgIClcbiAgICByZXR1cm4gWy4uLmRpcmVjdGl2ZXMsIC4uLm5vZGUuY2hpbGRyZW4uZmxhdE1hcChnZXREaXJlY3RpdmVOYW1lcyldXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuSUYpIHtcbiAgICByZXR1cm4gbm9kZS5icmFuY2hlcy5mbGF0TWFwKGdldERpcmVjdGl2ZU5hbWVzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklGX0JSQU5DSCB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5GT1IpIHtcbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5mbGF0TWFwKGdldERpcmVjdGl2ZU5hbWVzKVxuICB9XG4gIGVsc2UgaWYgKFxuICAgIG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklOVEVSUE9MQVRJT05cbiAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01QT1VORF9FWFBSRVNTSU9OXG4gICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVFxuICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkNPTU1FTlRcbiAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5URVhUX0NBTExcbiAgKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgZWxzZSB7XG4gICAgZXhoYXVzdGl2ZUNoZWNrUmV0dXJuVW5kZWZpbmVkKG5vZGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RnJlZVZhcmlhYmxlc0ZvclRleHQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaW5wdXRXaXRoUHJlZml4ID0gaW5wdXQudHJpbVN0YXJ0KClbMF0gPT09ICd7JyA/IGAoJHtpbnB1dH0pYCA6IGlucHV0XG4gIHJldHVybiBnZXRGaWxlR2xvYmFscyhwYXJzZShpbnB1dFdpdGhQcmVmaXgpKVxufVxuXG5mdW5jdGlvbiBnZXRGcmVlVmFyaWFibGVzRm9yUHJvcHNOb2RlKFxuICBub2RlOiBBdHRyaWJ1dGVOb2RlIHwgRGlyZWN0aXZlTm9kZSxcbik6IHN0cmluZ1tdIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkRJUkVDVElWRSkge1xuICAgIGNvbnN0IGFyZyA9IG5vZGUuYXJnID09PSB1bmRlZmluZWQgPyBbXSA6IGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKG5vZGUuYXJnKVxuICAgIGNvbnN0IGV4cCA9IG5vZGUuZXhwID09PSB1bmRlZmluZWQgPyBbXSA6IGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKG5vZGUuZXhwKVxuICAgIHJldHVybiBbLi4uYXJnLCAuLi5leHBdXG4gIH1cbiAgcmV0dXJuIFtdXG59XG5cbmZ1bmN0aW9uIGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKFxuICBub2RlOiBUZW1wbGF0ZUNoaWxkTm9kZSB8IEV4cHJlc3Npb25Ob2RlLFxuKTogc3RyaW5nW10ge1xuICBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04pIHtcbiAgICByZXR1cm4gbm9kZS5pc1N0YXRpYyA/IFtdIDogZ2V0RnJlZVZhcmlhYmxlc0ZvclRleHQobm9kZS5jb250ZW50KVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkNPTVBPVU5EX0VYUFJFU1NJT04pIHtcbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5mbGF0TWFwKHggPT5cbiAgICAgIHR5cGVvZiB4ICE9PSAnb2JqZWN0JyA/IFtdIDogZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUoeCksXG4gICAgKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklOVEVSUE9MQVRJT04pIHtcbiAgICByZXR1cm4gZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUobm9kZS5jb250ZW50KVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkVMRU1FTlQpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4uZmxhdE1hcChnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSlcblxuICAgIGNvbnN0IGRpcmVjdGl2ZVByb3BzID0gbm9kZS5wcm9wcy5mbGF0TWFwKHggPT5cbiAgICAgIHgudHlwZSA9PT0gTm9kZVR5cGVzLkRJUkVDVElWRSA/IFt4XSA6IFtdLFxuICAgIClcbiAgICBjb25zdCBhdHRyaWJ1dGVQcm9wcyA9IG5vZGUucHJvcHMuZmxhdE1hcCh4ID0+XG4gICAgICB4LnR5cGUgPT09IE5vZGVUeXBlcy5BVFRSSUJVVEUgPyBbeF0gOiBbXSxcbiAgICApXG5cbiAgICBjb25zdCByZWZOb2RlID0gYXR0cmlidXRlUHJvcHMuZmluZChcbiAgICAgIG5vZGUgPT4gbm9kZS5uYW1lID09PSAncmVmJyAmJiBub2RlLnZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgKVxuICAgIGNvbnN0IHJlZklkZW50aWZpZXIgPSByZWZOb2RlPy52YWx1ZT8uY29udGVudFxuXG4gICAgY29uc3QgdlNsb3ROb2RlID0gZGlyZWN0aXZlUHJvcHMuZmluZChub2RlID0+IG5vZGUubmFtZSA9PT0gJ3Nsb3QnKVxuICAgIGNvbnN0IHZTbG90QXJnSWRlbnRpZmllcnNcbiAgICAgID0gdlNsb3ROb2RlPy5hcmcgPT09IHVuZGVmaW5lZCA/IFtdIDogZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUodlNsb3ROb2RlLmFyZylcbiAgICAvLyBUT0RPOiBWYXJpYWJsZSBzaGFkb3dpbmdcbiAgICBjb25zdCB2U2xvdEV4cFZhcmlhYmxlU2hhZG93aW5nSWRlbnRpZmllcnM6IHN0cmluZ1tdID0gW11cblxuICAgIGNvbnN0IHZGb3JOb2RlID0gZGlyZWN0aXZlUHJvcHMuZmluZChub2RlID0+IG5vZGUubmFtZSA9PT0gJ2ZvcicpXG4gICAgY29uc3QgdkZvcklkZW50aWZpZXJzXG4gICAgICA9IHZGb3JOb2RlPy5leHA/LnR5cGUgPT09IE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTlxuICAgICAgICA/IGdldEZyZWVWYXJpYWJsZXNGb3JUZXh0KFxuICAgICAgICAgIHZGb3JOb2RlLmV4cC5jb250ZW50LnJlcGxhY2UoL14uKlxccyg/OmlufG9mKVxccy8sICcnKSxcbiAgICAgICAgKVxuICAgICAgICA6IFtdXG4gICAgLy8gVE9ETzogVmFyaWFibGUgc2hhZG93aW5nXG4gICAgY29uc3QgdkZvckV4cFZhcmlhYmxlU2hhZG93aW5nSWRlbnRpZmllcnM6IHN0cmluZ1tdID0gW11cblxuICAgIGNvbnN0IHByb3BzID0gZGlyZWN0aXZlUHJvcHNcbiAgICAgIC5maWx0ZXIoKHsgbmFtZSB9KSA9PiBuYW1lICE9PSAnc2xvdCcgJiYgbmFtZSAhPT0gJ2ZvcicpXG4gICAgICAuZmxhdE1hcChnZXRGcmVlVmFyaWFibGVzRm9yUHJvcHNOb2RlKVxuXG4gICAgY29uc3Qgc2hhZG93aW5nSWRlbnRpZmllcnMgPSBuZXcgU2V0KFtcbiAgICAgIC4uLnZTbG90RXhwVmFyaWFibGVTaGFkb3dpbmdJZGVudGlmaWVycyxcbiAgICAgIC4uLnZGb3JFeHBWYXJpYWJsZVNoYWRvd2luZ0lkZW50aWZpZXJzLFxuICAgIF0pXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnZTbG90QXJnSWRlbnRpZmllcnMsXG4gICAgICByZWZJZGVudGlmaWVyLFxuICAgICAgLi4udkZvcklkZW50aWZpZXJzLFxuICAgICAgLi4uWy4uLmNoaWxkcmVuLCAuLi5wcm9wc10uZmlsdGVyKHggPT4gIXNoYWRvd2luZ0lkZW50aWZpZXJzLmhhcyh4KSksXG4gICAgXS5maWx0ZXIobm90TnVsbGlzaClcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5GT1IpIHtcbiAgICAvLyBJZiB3ZSB1c2UgYGJhc2VDb21waWxlcmAsIHdlIG5lZWQgYWRkIHZhcmlhYmxlIHNoYWRvd2luZyBoZXJlXG4gICAgLy8gQnV0IHdlIHVzZSBgYmFzZVBhcnNlYCBub3cuIFNvIHRoaXMgYnJhbmNoIHdpbGwgbmV2ZXIgYmUgcmVhY2hlZC5cbiAgICAvLyBgTm9kZVR5cGVzLklGYCBhbmQgYE5vZGVUeXBlcy5JRl9CUkFOQ0hgIHdpbGwgbmV2ZXIgYmUgcmVhY2hlZCwgYWxzby5cblxuICAgIC8vIGNvbnN0IHsga2V5QWxpYXMsIHZhbHVlQWxpYXMgfSA9IG5vZGVcbiAgICByZXR1cm4gW25vZGUuc291cmNlLCAuLi5ub2RlLmNoaWxkcmVuXS5mbGF0TWFwKGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklGKSB7XG4gICAgcmV0dXJuIChub2RlLmJyYW5jaGVzID8/IFtdKS5mbGF0TWFwKGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklGX0JSQU5DSCkge1xuICAgIHJldHVybiBbbm9kZS5jb25kaXRpb24sIC4uLm5vZGUuY2hpbGRyZW5dXG4gICAgICAuZmlsdGVyKG5vdE51bGxpc2gpXG4gICAgICAuZmxhdE1hcChnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSlcbiAgfVxuICBlbHNlIGlmIChcbiAgICBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5URVhUXG4gICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuQ09NTUVOVFxuICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlRFWFRfQ0FMTFxuICApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBlbHNlIHtcbiAgICBleGhhdXN0aXZlQ2hlY2tSZXR1cm5VbmRlZmluZWQobm9kZSlcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJlZmVyZW5jZXNGb3JTRkMoXG4gIHRlbXBsYXRlTm9kZTogUm9vdE5vZGUgfCBQbGFpbkVsZW1lbnROb2RlIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IGNvbXBvbmVudHMgPSB0ZW1wbGF0ZU5vZGU/LmNoaWxkcmVuLmZsYXRNYXAoZ2V0Q29tcG9uZW50cykgPz8gW11cbiAgY29uc3QgZGlyZWN0aXZlcyA9IHRlbXBsYXRlTm9kZT8uY2hpbGRyZW4uZmxhdE1hcChnZXREaXJlY3RpdmVOYW1lcykgPz8gW11cbiAgY29uc3QgaWRlbnRpZmllcnNcbiAgICA9IHRlbXBsYXRlTm9kZT8uY2hpbGRyZW4uZmxhdE1hcChnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSkgPz8gW11cblxuICByZXR1cm4ge1xuICAgIGNvbXBvbmVudHMsXG4gICAgZGlyZWN0aXZlcyxcbiAgICBpZGVudGlmaWVycyxcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCYWJlbFBhcnNlck9wdGlvbnMobGFuZzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICBsYW5nID0gbGFuZyB8fCAnanMnXG4gIGNvbnN0IHBsdWdpbnNEaWN0OiBSZWNvcmQ8c3RyaW5nLCBBcnJheTxQYXJzZXJQbHVnaW4+PiA9IHtcbiAgICBqczogW10sXG4gICAgdHM6IFsndHlwZXNjcmlwdCddLFxuICAgIGpzeDogWydqc3gnXSxcbiAgICB0c3g6IFsnanN4JywgJ3R5cGVzY3JpcHQnXSxcbiAgfVxuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luc0RpY3RbbGFuZ11cbiAgaWYgKHBsdWdpbnMgPT09IHVuZGVmaW5lZClcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuc3VwcG9ydGVkIHNjcmlwdCBsYW5ndWFnZTogJHtsYW5nfWApXG4gIHJldHVybiB7XG4gICAgc291cmNlVHlwZTogJ21vZHVsZScgYXMgY29uc3QsXG4gICAgcGx1Z2lucyxcbiAgfVxufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlU0ZDKFxuICBjb2RlOiBzdHJpbmcsXG4gIGlkPzogc3RyaW5nLFxuICBvcHRpb25zPzogU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zLFxuKTogUHJvbWlzZTxQYXJzZWRTRkM+IHtcbiAgY29uc3QgZWxlbWVudENoaWxkcmVuID0gYmFzZVBhcnNlKGNvZGUsIHBhcnNlck9wdGlvbnMpLmNoaWxkcmVuLmZsYXRNYXAoeCA9PlxuICAgIHgudHlwZSA9PT0gTm9kZVR5cGVzLkVMRU1FTlQgJiYgeC50YWdUeXBlID09PSBFbGVtZW50VHlwZXMuRUxFTUVOVFxuICAgICAgPyBbeF1cbiAgICAgIDogW10sXG4gIClcbiAgY29uc3QgdGVtcGxhdGVOb2RlID0gZWxlbWVudENoaWxkcmVuLmZpbmQoeCA9PiB4LnRhZyA9PT0gJ3RlbXBsYXRlJylcblxuICBjb25zdCBbc2NyaXB0U2V0dXBDaGlsZE5vZGVzLCBzY3JpcHRDaGlsZE5vZGVzXSA9IHBhcnRpdGlvbihcbiAgICBlbGVtZW50Q2hpbGRyZW4uZmlsdGVyKHggPT4geC50YWcgPT09ICdzY3JpcHQnKSxcbiAgICB4ID0+IHgucHJvcHMuc29tZShwID0+IHAudHlwZSA9PT0gTm9kZVR5cGVzLkFUVFJJQlVURSAmJiBwLm5hbWUgPT09ICdzZXR1cCcpLFxuICApXG5cbiAgY29uc3QgZ2V0U2NyaXB0VGFnTWV0YSA9IChcbiAgICBuOiBQbGFpbkVsZW1lbnROb2RlIHwgdW5kZWZpbmVkLFxuICAgIGFzdFRyYW5zZm9ybXM6IChhc3Q6IFByb2dyYW0pID0+IFByb2dyYW0gPSB4ID0+IHgsXG4gICk6IFNjcmlwdFRhZ01ldGEgPT4ge1xuICAgIGlmIChuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAnJ1xuICAgICAgY29uc3QgYXN0ID0gcGFyc2UoY29udGVudCwge1xuICAgICAgICBzb3VyY2VUeXBlOiAnbW9kdWxlJyxcbiAgICAgICAgcGx1Z2luczogW10sXG4gICAgICB9KS5wcm9ncmFtXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogMCxcbiAgICAgICAgZW5kOiAwLFxuICAgICAgICBjb250ZW50U3RhcnQ6IDAsXG4gICAgICAgIGNvbnRlbnRFbmQ6IDAsXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGF0dHJzOiB7fSxcbiAgICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgICBhc3QsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgbi5wcm9wcy5mbGF0TWFwKHggPT5cbiAgICAgICAgIShcbiAgICAgICAgICB4LnR5cGUgPT09IE5vZGVUeXBlcy5BVFRSSUJVVEUgJiYgdHlwZW9mIHgudmFsdWU/LmNvbnRlbnQgPT09ICdzdHJpbmcnXG4gICAgICAgIClcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBbW3gubmFtZSwgeC52YWx1ZS5jb250ZW50XV0sXG4gICAgICApLFxuICAgIClcbiAgICBjb25zdCBjb250ZW50ID0gbi5jaGlsZHJlblswXT8ubG9jLnNvdXJjZSA/PyAnJ1xuICAgIGNvbnN0IGNvbnRlbnRTdGFydCA9IG4uY2hpbGRyZW5bMF0/LmxvYy5zdGFydC5vZmZzZXQgPz8gMFxuICAgIGNvbnN0IGNvbnRlbnRFbmQgPSBuLmNoaWxkcmVuWzBdPy5sb2MuZW5kLm9mZnNldCA/PyAwXG4gICAgY29uc3QgYXN0ID0gYXN0VHJhbnNmb3JtcyhcbiAgICAgIHBhcnNlKGNvbnRlbnQsIGdldEJhYmVsUGFyc2VyT3B0aW9ucyhhdHRycy5sYW5nKSkucHJvZ3JhbSxcbiAgICApXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBuLmxvYy5zdGFydC5vZmZzZXQsXG4gICAgICBlbmQ6IG4ubG9jLmVuZC5vZmZzZXQsXG4gICAgICBjb250ZW50U3RhcnQsXG4gICAgICBjb250ZW50RW5kLFxuICAgICAgY29udGVudCxcbiAgICAgIGF0dHJzLFxuICAgICAgZm91bmQ6IHRydWUsXG4gICAgICBhc3QsXG4gICAgfVxuICB9XG4gIGNvbnN0IHNjcmlwdFNldHVwID0gZ2V0U2NyaXB0VGFnTWV0YShcbiAgICBzY3JpcHRTZXR1cENoaWxkTm9kZXNbMF0sXG4gICAgb3B0aW9ucz8uYXN0VHJhbnNmb3Jtcz8uc2NyaXB0U2V0dXAsXG4gIClcbiAgY29uc3Qgc2NyaXB0ID0gZ2V0U2NyaXB0VGFnTWV0YShcbiAgICBzY3JpcHRDaGlsZE5vZGVzWzBdLFxuICAgIG9wdGlvbnM/LmFzdFRyYW5zZm9ybXM/LnNjcmlwdCxcbiAgKVxuXG4gIGlmIChcbiAgICBzY3JpcHQuZm91bmRcbiAgICAmJiBzY3JpcHRTZXR1cC5mb3VuZFxuICAgICYmIHNjcmlwdFNldHVwLmF0dHJzLmxhbmcgIT09IHNjcmlwdC5hdHRycy5sYW5nXG4gICkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICc8c2NyaXB0IHNldHVwPiBsYW5ndWFnZSBtdXN0IGJlIHRoZSBzYW1lIGFzIDxzY3JpcHQ+JyxcbiAgICApXG4gIH1cblxuICBjb25zdCBjb2RlT2ZUZW1wbGF0ZVxuICAgID0gdGVtcGxhdGVOb2RlID09IG51bGxcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRlbXBsYXRlTm9kZS5wcm9wcy5zb21lKFxuICAgICAgICBwID0+XG4gICAgICAgICAgcC50eXBlID09PSBOb2RlVHlwZXMuQVRUUklCVVRFXG4gICAgICAgICAgICAmJiBwLm5hbWUgPT09ICdsYW5nJ1xuICAgICAgICAgICAgJiYgcC52YWx1ZT8udHlwZSA9PT0gTm9kZVR5cGVzLlRFWFRcbiAgICAgICAgICAgICYmIHAudmFsdWUuY29udGVudCA9PT0gJ3B1ZycsXG4gICAgICApXG4gICAgICAgID8gYmFzZVBhcnNlKFxuICAgICAgICAgIChhd2FpdCBpbXBvcnQoJ3B1ZycpKS5jb21waWxlKFxuICAgICAgICAgICAgdGVtcGxhdGVOb2RlLmNoaWxkcmVuLm1hcCh4ID0+IHgubG9jLnNvdXJjZSkuam9pbignJyksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpbGVuYW1lOiBpZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKSgpLFxuICAgICAgICAgIHBhcnNlck9wdGlvbnMsXG4gICAgICAgIClcbiAgICAgICAgOiB0ZW1wbGF0ZU5vZGVcblxuICBjb25zdCByZXN1bHQgPSBjb2RlT2ZUZW1wbGF0ZVxuICAgID8gZmluZFJlZmVyZW5jZXNGb3JTRkMoY29kZU9mVGVtcGxhdGUpXG4gICAgOiB1bmRlZmluZWRcblxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICBjb21wb25lbnRzOiBuZXcgU2V0KHJlc3VsdD8uY29tcG9uZW50cy5tYXAocGFzY2FsaXplKSksXG4gICAgICBkaXJlY3RpdmVzOiBuZXcgU2V0KFxuICAgICAgICByZXN1bHQ/LmRpcmVjdGl2ZXNcbiAgICAgICAgICAuZmlsdGVyKHggPT4gIUJVSUxEX0lOX0RJUkVDVElWRVMuaGFzKHgpKVxuICAgICAgICAgIC5tYXAoY2FtZWxpemUpLFxuICAgICAgKSxcbiAgICAgIGlkZW50aWZpZXJzOiBuZXcgU2V0KHJlc3VsdD8uaWRlbnRpZmllcnMpLFxuICAgIH0sXG4gICAgc2NyaXB0U2V0dXAsXG4gICAgc2NyaXB0LFxuICAgIHBhcnNlck9wdGlvbnM6IGdldEJhYmVsUGFyc2VyT3B0aW9ucyhcbiAgICAgIHNjcmlwdC5hdHRycy5sYW5nID8/IHNjcmlwdFNldHVwLmF0dHJzLmxhbmcsXG4gICAgKSxcbiAgICBleHRyYURlY2xhcmF0aW9uczogW10sXG4gIH1cbn1cbiIsIi8vIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1uZXh0L2Jsb2IvbWFpbi9wYWNrYWdlcy9jb21waWxlci1zZmMvc3JjL2NvbXBpbGVTY3JpcHQudHNcblxuaW1wb3J0IHR5cGUge1xuICBDYWxsRXhwcmVzc2lvbixcbiAgTm9kZSxcbiAgT2JqZWN0RXhwcmVzc2lvbixcbiAgT2JqZWN0UHJvcGVydHksXG4gIFN0YXRlbWVudCxcbiAgVFNGdW5jdGlvblR5cGUsXG4gIFRTSW50ZXJmYWNlQm9keSxcbiAgVFNUeXBlLFxuICBUU1R5cGVMaXRlcmFsLFxufSBmcm9tICdAYmFiZWwvdHlwZXMnXG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24sIHQgfSBmcm9tICcuL2JhYmVsJ1xuXG4vLyBTcGVjaWFsIGNvbXBpbGVyIG1hY3Jvc1xuY29uc3QgREVGSU5FX1BST1BTID0gJ2RlZmluZVByb3BzJ1xuY29uc3QgREVGSU5FX0VNSVRTID0gJ2RlZmluZUVtaXRzJ1xuY29uc3QgREVGSU5FX0VYUE9TRSA9ICdkZWZpbmVFeHBvc2UnXG5jb25zdCBXSVRIX0RFRkFVTFRTID0gJ3dpdGhEZWZhdWx0cydcblxuZXhwb3J0IGludGVyZmFjZSBQcm9wVHlwZURhdGEge1xuICBrZXk6IHN0cmluZ1xuICB0eXBlOiBzdHJpbmdbXSB8IHN0cmluZ1xuICByZXF1aXJlZDogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNYWNyb3Mobm9kZXM6IFN0YXRlbWVudFtdKSB7XG4gIGxldCBoYXNEZWZpbmVQcm9wc0NhbGwgPSBmYWxzZVxuICBsZXQgaGFzRGVmaW5lRW1pdENhbGwgPSBmYWxzZVxuICBsZXQgcHJvcHNSdW50aW1lRGVjbDogTm9kZSB8IHVuZGVmaW5lZFxuICBsZXQgcHJvcHNSdW50aW1lRGVmYXVsdHM6IE5vZGUgfCB1bmRlZmluZWRcbiAgbGV0IHByb3BzVHlwZURlY2w6IFRTVHlwZUxpdGVyYWwgfCBUU0ludGVyZmFjZUJvZHkgfCB1bmRlZmluZWRcbiAgbGV0IHByb3BzVHlwZURlY2xSYXc6IE5vZGUgfCB1bmRlZmluZWRcbiAgbGV0IGVtaXRzUnVudGltZURlY2w6IE5vZGUgfCB1bmRlZmluZWRcbiAgbGV0IGVtaXRzVHlwZURlY2w6XG4gIHwgVFNGdW5jdGlvblR5cGVcbiAgfCBUU1R5cGVMaXRlcmFsXG4gIHwgVFNJbnRlcmZhY2VCb2R5XG4gIHwgdW5kZWZpbmVkXG4gIGxldCBlbWl0c1R5cGVEZWNsUmF3OiBOb2RlIHwgdW5kZWZpbmVkXG4gIGxldCBleHBvc2VEZWNsOiBDYWxsRXhwcmVzc2lvblsnYXJndW1lbnRzJ11bbnVtYmVyXSB8IHVuZGVmaW5lZFxuXG4gIC8vIHByb3BzL2VtaXRzIGRlY2xhcmVkIHZpYSB0eXBlc1xuICBjb25zdCB0eXBlRGVjbGFyZWRQcm9wczogUmVjb3JkPHN0cmluZywgUHJvcFR5cGVEYXRhPiA9IHt9XG4gIC8vIHJlY29yZCBkZWNsYXJlZCB0eXBlcyBmb3IgcnVudGltZSBwcm9wcyB0eXBlIGdlbmVyYXRpb25cbiAgY29uc3QgZGVjbGFyZWRUeXBlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge31cblxuICBmdW5jdGlvbiBlcnJvcihcbiAgICBtc2c6IHN0cmluZyxcblxuICAgIF9ub2RlOiBOb2RlLFxuICApOiBuZXZlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZylcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NEZWZpbmVQcm9wcyhub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpc0NhbGxPZihub2RlLCBERUZJTkVfUFJPUFMpKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAoaGFzRGVmaW5lUHJvcHNDYWxsKVxuICAgICAgZXJyb3IoYGR1cGxpY2F0ZSAke0RFRklORV9QUk9QU30oKSBjYWxsYCwgbm9kZSlcblxuICAgIGhhc0RlZmluZVByb3BzQ2FsbCA9IHRydWVcblxuICAgIHByb3BzUnVudGltZURlY2wgPSBub2RlLmFyZ3VtZW50c1swXVxuXG4gICAgLy8gY2FsbCBoYXMgdHlwZSBwYXJhbWV0ZXJzIC0gaW5mZXIgcnVudGltZSB0eXBlcyBmcm9tIGl0XG4gICAgaWYgKG5vZGUudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgIGlmIChwcm9wc1J1bnRpbWVEZWNsKSB7XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIGAke0RFRklORV9QUk9QU30oKSBjYW5ub3QgYWNjZXB0IGJvdGggdHlwZSBhbmQgbm9uLXR5cGUgYXJndW1lbnRzIGBcbiAgICAgICAgICAgICsgJ2F0IHRoZSBzYW1lIHRpbWUuIFVzZSBvbmUgb3IgdGhlIG90aGVyLicsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBwcm9wc1R5cGVEZWNsUmF3ID0gbm9kZS50eXBlUGFyYW1ldGVycy5wYXJhbXNbMF1cbiAgICAgIHByb3BzVHlwZURlY2wgPSByZXNvbHZlUXVhbGlmaWVkVHlwZShcbiAgICAgICAgcHJvcHNUeXBlRGVjbFJhdyxcbiAgICAgICAgbm9kZSA9PiBub2RlLnR5cGUgPT09ICdUU1R5cGVMaXRlcmFsJyxcbiAgICAgICkgYXMgVFNUeXBlTGl0ZXJhbCB8IFRTSW50ZXJmYWNlQm9keSB8IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoIXByb3BzVHlwZURlY2wpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYHR5cGUgYXJndW1lbnQgcGFzc2VkIHRvICR7REVGSU5FX1BST1BTfSgpIG11c3QgYmUgYSBsaXRlcmFsIHR5cGUsIGBcbiAgICAgICAgICAgICsgJ29yIGEgcmVmZXJlbmNlIHRvIGFuIGludGVyZmFjZSBvciBsaXRlcmFsIHR5cGUuJyxcbiAgICAgICAgICBwcm9wc1R5cGVEZWNsUmF3LFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NXaXRoRGVmYXVsdHMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNDYWxsT2Yobm9kZSwgV0lUSF9ERUZBVUxUUykpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIGlmIChwcm9jZXNzRGVmaW5lUHJvcHMobm9kZS5hcmd1bWVudHNbMF0pKSB7XG4gICAgICBpZiAocHJvcHNSdW50aW1lRGVjbCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgJHtXSVRIX0RFRkFVTFRTfSBjYW4gb25seSBiZSB1c2VkIHdpdGggdHlwZS1iYXNlZCBgXG4gICAgICAgICAgICArIGAke0RFRklORV9QUk9QU30gZGVjbGFyYXRpb24uYCxcbiAgICAgICAgICBub2RlLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBwcm9wc1J1bnRpbWVEZWZhdWx0cyA9IG5vZGUuYXJndW1lbnRzWzFdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZXJyb3IoXG4gICAgICAgIGAke1dJVEhfREVGQVVMVFN9JyBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgJHtERUZJTkVfUFJPUFN9IGNhbGwuYCxcbiAgICAgICAgbm9kZS5hcmd1bWVudHNbMF0gfHwgbm9kZSxcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NEZWZpbmVFbWl0cyhub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpc0NhbGxPZihub2RlLCBERUZJTkVfRU1JVFMpKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAoaGFzRGVmaW5lRW1pdENhbGwpXG4gICAgICBlcnJvcihgZHVwbGljYXRlICR7REVGSU5FX0VNSVRTfSgpIGNhbGxgLCBub2RlKVxuXG4gICAgaGFzRGVmaW5lRW1pdENhbGwgPSB0cnVlXG4gICAgZW1pdHNSdW50aW1lRGVjbCA9IG5vZGUuYXJndW1lbnRzWzBdXG4gICAgaWYgKG5vZGUudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgIGlmIChlbWl0c1J1bnRpbWVEZWNsKSB7XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIGAke0RFRklORV9FTUlUU30oKSBjYW5ub3QgYWNjZXB0IGJvdGggdHlwZSBhbmQgbm9uLXR5cGUgYXJndW1lbnRzIGBcbiAgICAgICAgICAgICsgJ2F0IHRoZSBzYW1lIHRpbWUuIFVzZSBvbmUgb3IgdGhlIG90aGVyLicsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBlbWl0c1R5cGVEZWNsUmF3ID0gbm9kZS50eXBlUGFyYW1ldGVycy5wYXJhbXNbMF1cbiAgICAgIGVtaXRzVHlwZURlY2wgPSByZXNvbHZlUXVhbGlmaWVkVHlwZShcbiAgICAgICAgZW1pdHNUeXBlRGVjbFJhdyxcbiAgICAgICAgbm9kZSA9PiBub2RlLnR5cGUgPT09ICdUU0Z1bmN0aW9uVHlwZScgfHwgbm9kZS50eXBlID09PSAnVFNUeXBlTGl0ZXJhbCcsXG4gICAgICApIGFzIFRTRnVuY3Rpb25UeXBlIHwgVFNUeXBlTGl0ZXJhbCB8IFRTSW50ZXJmYWNlQm9keSB8IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoIWVtaXRzVHlwZURlY2wpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYHR5cGUgYXJndW1lbnQgcGFzc2VkIHRvICR7REVGSU5FX0VNSVRTfSgpIG11c3QgYmUgYSBmdW5jdGlvbiB0eXBlLCBgXG4gICAgICAgICAgICArICdhIGxpdGVyYWwgdHlwZSB3aXRoIGNhbGwgc2lnbmF0dXJlcywgb3IgYSByZWZlcmVuY2UgdG8gdGhlIGFib3ZlIHR5cGVzLicsXG4gICAgICAgICAgZW1pdHNUeXBlRGVjbFJhdyxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZVF1YWxpZmllZFR5cGUoXG4gICAgbm9kZTogTm9kZSxcbiAgICBxdWFsaWZpZXI6IChub2RlOiBOb2RlKSA9PiBib29sZWFuLFxuICApIHtcbiAgICBpZiAocXVhbGlmaWVyKG5vZGUpKVxuICAgICAgcmV0dXJuIG5vZGVcblxuICAgIGlmIChcbiAgICAgIG5vZGUudHlwZSA9PT0gJ1RTVHlwZVJlZmVyZW5jZSdcbiAgICAgICYmIG5vZGUudHlwZU5hbWUudHlwZSA9PT0gJ0lkZW50aWZpZXInXG4gICAgKSB7XG4gICAgICBjb25zdCByZWZOYW1lID0gbm9kZS50eXBlTmFtZS5uYW1lXG4gICAgICBjb25zdCBpc1F1YWxpZmllZFR5cGUgPSAobm9kZTogTm9kZSk6IE5vZGUgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9kZS50eXBlID09PSAnVFNJbnRlcmZhY2VEZWNsYXJhdGlvbidcbiAgICAgICAgICAmJiBub2RlLmlkLm5hbWUgPT09IHJlZk5hbWVcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBub2RlLmJvZHlcblxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICBub2RlLnR5cGUgPT09ICdUU1R5cGVBbGlhc0RlY2xhcmF0aW9uJ1xuICAgICAgICAgICYmIG5vZGUuaWQubmFtZSA9PT0gcmVmTmFtZVxuICAgICAgICAgICYmIHF1YWxpZmllcihub2RlLnR5cGVBbm5vdGF0aW9uKVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG5vZGUudHlwZUFubm90YXRpb25cblxuICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyAmJiBub2RlLmRlY2xhcmF0aW9uKVxuICAgICAgICAgIHJldHVybiBpc1F1YWxpZmllZFR5cGUobm9kZS5kZWNsYXJhdGlvbilcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGNvbnN0IHF1YWxpZmllZCA9IGlzUXVhbGlmaWVkVHlwZShub2RlKVxuICAgICAgICBpZiAocXVhbGlmaWVkKVxuICAgICAgICAgIHJldHVybiBxdWFsaWZpZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzRGVmaW5lRXhwb3NlKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzQ2FsbE9mKG5vZGUsIERFRklORV9FWFBPU0UpKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAoZXhwb3NlRGVjbClcbiAgICAgIGVycm9yKGBkdXBsaWNhdGUgJHtERUZJTkVfRVhQT1NFfSgpIGNhbGxgLCBub2RlKVxuXG4gICAgaWYgKG5vZGUuYXJndW1lbnRzLmxlbmd0aCAhPT0gMSlcbiAgICAgIGVycm9yKGAke0RFRklORV9FWFBPU0V9KCkgcmVxdWlyZXMgb25lIGFyZ3VtZW50YCwgbm9kZSlcblxuICAgIGV4cG9zZURlY2wgPSBub2RlLmFyZ3VtZW50c1swXVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlblJ1bnRpbWVQcm9wcyhwcm9wczogUmVjb3JkPHN0cmluZywgUHJvcFR5cGVEYXRhPikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcylcbiAgICBpZiAoIWtleXMubGVuZ3RoKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgLy8gY2hlY2sgZGVmYXVsdHMuIElmIHRoZSBkZWZhdWx0IG9iamVjdCBpcyBhbiBvYmplY3QgbGl0ZXJhbCB3aXRoIG9ubHlcbiAgICAvLyBzdGF0aWMgcHJvcGVydGllcywgd2UgY2FuIGRpcmVjdGx5IGdlbmVyYXRlIG1vcmUgb3B0aW16aWVkIGRlZmF1bHRcbiAgICAvLyBkZWNhbHJhdGlvbnMuIE90aGVyd2lzZSB3ZSB3aWxsIGhhdmUgdG8gZmFsbGJhY2sgdG8gcnVudGltZSBtZXJnaW5nLlxuICAgIGNvbnN0IGhhc1N0YXRpY0RlZmF1bHRzID0gcHJvcHNSdW50aW1lRGVmYXVsdHNcbiAgICAgICYmIHByb3BzUnVudGltZURlZmF1bHRzLnR5cGUgPT09ICdPYmplY3RFeHByZXNzaW9uJ1xuICAgICAgJiYgcHJvcHNSdW50aW1lRGVmYXVsdHMucHJvcGVydGllcy5ldmVyeShcbiAgICAgICAgbm9kZSA9PiBub2RlLnR5cGUgPT09ICdPYmplY3RQcm9wZXJ0eScgJiYgIW5vZGUuY29tcHV0ZWQsXG4gICAgICApXG5cbiAgICByZXR1cm4gdC5vYmplY3RFeHByZXNzaW9uKFxuICAgICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBoYXNTdGF0aWNEZWZhdWx0c1xuICAgICAgICAgID8gKHByb3BzUnVudGltZURlZmF1bHRzIGFzIE9iamVjdEV4cHJlc3Npb24pLnByb3BlcnRpZXMuZmluZCgobm9kZTogYW55KSA9PiBub2RlLmtleS5uYW1lID09PSBrZXkpIGFzIE9iamVjdFByb3BlcnR5XG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICBpZiAocHJvcClcbiAgICAgICAgICB2YWx1ZS5yZXF1aXJlZCA9IGZhbHNlXG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ga2V5ID09PSAndHlwZSdcbiAgICAgICAgICA/IHQub2JqZWN0UHJvcGVydHkodC5pZGVudGlmaWVyKGtleSksIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB0LmlkZW50aWZpZXIodmFsdWUpIDogdC5hcnJheUV4cHJlc3Npb24odmFsdWUubWFwKChpOiBhbnkpID0+IHQuaWRlbnRpZmllcihpKSkpIGFzIGFueSlcbiAgICAgICAgICA6IHQub2JqZWN0UHJvcGVydHkodC5pZGVudGlmaWVyKGtleSksIHBhcnNlRXhwcmVzc2lvbihKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIGFzIGFueSksXG4gICAgICAgIClcblxuICAgICAgICBpZiAocHJvcClcbiAgICAgICAgICBlbnRyaWVzLnB1c2godC5vYmplY3RQcm9wZXJ0eSh0LmlkZW50aWZpZXIoJ2RlZmF1bHQnKSwgcHJvcC52YWx1ZSBhcyBhbnkpKVxuXG4gICAgICAgIHJldHVybiB0Lm9iamVjdFByb3BlcnR5KFxuICAgICAgICAgIHQuaWRlbnRpZmllcihrZXkpLFxuICAgICAgICAgIHQub2JqZWN0RXhwcmVzc2lvbihlbnRyaWVzKSxcbiAgICAgICAgKVxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UHJvcHMoKSB7XG4gICAgaWYgKHByb3BzUnVudGltZURlY2wpXG4gICAgICByZXR1cm4gcHJvcHNSdW50aW1lRGVjbFxuXG4gICAgaWYgKHByb3BzVHlwZURlY2wpIHtcbiAgICAgIGV4dHJhY3RSdW50aW1lUHJvcHMocHJvcHNUeXBlRGVjbCwgdHlwZURlY2xhcmVkUHJvcHMsIGRlY2xhcmVkVHlwZXMpXG4gICAgICByZXR1cm4gZ2VuUnVudGltZVByb3BzKHR5cGVEZWNsYXJlZFByb3BzKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRocm93SWZBd2FpdChub2RlOiBOb2RlKSB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ0F3YWl0RXhwcmVzc2lvbicpXG4gICAgICBlcnJvcigndG9wLWxldmVsIGF3YWl0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gVnVlIDInLCBub2RlKVxuICB9XG5cbiAgbm9kZXMgPSBub2Rlc1xuICAgIC5tYXAoKHJhdzogTm9kZSkgPT4ge1xuICAgICAgbGV0IG5vZGUgPSByYXdcbiAgICAgIGlmIChyYXcudHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKVxuICAgICAgICBub2RlID0gcmF3LmV4cHJlc3Npb25cblxuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nICYmICFub2RlLmRlY2xhcmUpIHtcbiAgICAgICAgY29uc3QgdG90YWwgPSBub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGhcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGVjbCA9IG5vZGUuZGVjbGFyYXRpb25zW2ldXG4gICAgICAgICAgaWYgKGRlY2wuaW5pdCkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3NEZWZpbmVFbWl0cyhkZWNsLmluaXQpKVxuICAgICAgICAgICAgICBkZWNsLmluaXQgPSB0Lm1lbWJlckV4cHJlc3Npb24odC5pZGVudGlmaWVyKCdfX2N0eCcpLCB0LmlkZW50aWZpZXIoJ2VtaXQnKSkgYXMgYW55XG4gICAgICAgICAgICBlbHNlIGlmIChwcm9jZXNzRGVmaW5lUHJvcHMoZGVjbC5pbml0KSB8fCBwcm9jZXNzV2l0aERlZmF1bHRzKGRlY2wuaW5pdCkpXG4gICAgICAgICAgICAgIGRlY2wuaW5pdCA9IHQuaWRlbnRpZmllcignX19wcm9wcycpIGFzIGFueVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICB0aHJvd0lmQXdhaXQoZGVjbC5pbml0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzc1dpdGhEZWZhdWx0cyhub2RlKSB8fCBwcm9jZXNzRGVmaW5lRW1pdHMobm9kZSkgfHwgcHJvY2Vzc0RlZmluZVByb3BzKG5vZGUpIHx8IHByb2Nlc3NEZWZpbmVFeHBvc2Uobm9kZSkpXG4gICAgICAgIHJldHVybiBudWxsXG5cbiAgICAgIHRocm93SWZBd2FpdChub2RlKVxuXG4gICAgICByZXR1cm4gcmF3XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFN0YXRlbWVudFtdXG5cbiAgcmV0dXJuIHtcbiAgICBub2RlcyxcbiAgICBwcm9wczogZ2V0UHJvcHMoKSxcbiAgICBleHBvc2U6IGV4cG9zZURlY2wsXG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDYWxsT2YoXG4gIG5vZGU6IE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICB0ZXN0OiBzdHJpbmcgfCAoKGlkOiBzdHJpbmcpID0+IGJvb2xlYW4pLFxuKTogbm9kZSBpcyBDYWxsRXhwcmVzc2lvbiB7XG4gIHJldHVybiAhIShcbiAgICBub2RlXG4gICAgJiYgbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nXG4gICAgJiYgbm9kZS5jYWxsZWUudHlwZSA9PT0gJ0lkZW50aWZpZXInXG4gICAgJiYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgPyBub2RlLmNhbGxlZS5uYW1lID09PSB0ZXN0XG4gICAgICA6IHRlc3Qobm9kZS5jYWxsZWUubmFtZSkpXG4gIClcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJ1bnRpbWVQcm9wcyhcbiAgbm9kZTogVFNUeXBlTGl0ZXJhbCB8IFRTSW50ZXJmYWNlQm9keSxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIFByb3BUeXBlRGF0YT4sXG4gIGRlY2xhcmVkVHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPixcbikge1xuICBjb25zdCBtZW1iZXJzID0gbm9kZS50eXBlID09PSAnVFNUeXBlTGl0ZXJhbCcgPyBub2RlLm1lbWJlcnMgOiBub2RlLmJvZHlcbiAgZm9yIChjb25zdCBtIG9mIG1lbWJlcnMpIHtcbiAgICBpZiAoXG4gICAgICAobS50eXBlID09PSAnVFNQcm9wZXJ0eVNpZ25hdHVyZScgfHwgbS50eXBlID09PSAnVFNNZXRob2RTaWduYXR1cmUnKVxuICAgICAgJiYgbS5rZXkudHlwZSA9PT0gJ0lkZW50aWZpZXInXG4gICAgKSB7XG4gICAgICBsZXQgdHlwZTogc3RyaW5nW10gfCB1bmRlZmluZWRcbiAgICAgIGlmIChtLnR5cGUgPT09ICdUU01ldGhvZFNpZ25hdHVyZScpIHtcbiAgICAgICAgdHlwZSA9IFsnRnVuY3Rpb24nXVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAobS50eXBlQW5ub3RhdGlvbikge1xuICAgICAgICB0eXBlID0gaW5mZXJSdW50aW1lVHlwZShcbiAgICAgICAgICBtLnR5cGVBbm5vdGF0aW9uLnR5cGVBbm5vdGF0aW9uLFxuICAgICAgICAgIGRlY2xhcmVkVHlwZXMsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHByb3BzW20ua2V5Lm5hbWVdID0ge1xuICAgICAgICBrZXk6IG0ua2V5Lm5hbWUsXG4gICAgICAgIHJlcXVpcmVkOiAhbS5vcHRpb25hbCxcbiAgICAgICAgdHlwZTogdHlwZT8ubGVuZ3RoID09PSAxID8gdHlwZVswXSA6IHR5cGUgfHwgJ251bGwnLFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbmZlclJ1bnRpbWVUeXBlKFxuICBub2RlOiBUU1R5cGUsXG4gIGRlY2xhcmVkVHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPixcbik6IHN0cmluZ1tdIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdUU1N0cmluZ0tleXdvcmQnOlxuICAgICAgcmV0dXJuIFsnU3RyaW5nJ11cbiAgICBjYXNlICdUU051bWJlcktleXdvcmQnOlxuICAgICAgcmV0dXJuIFsnTnVtYmVyJ11cbiAgICBjYXNlICdUU0Jvb2xlYW5LZXl3b3JkJzpcbiAgICAgIHJldHVybiBbJ0Jvb2xlYW4nXVxuICAgIGNhc2UgJ1RTT2JqZWN0S2V5d29yZCc6XG4gICAgICByZXR1cm4gWydPYmplY3QnXVxuICAgIGNhc2UgJ1RTVHlwZUxpdGVyYWwnOlxuICAgICAgLy8gVE9ETyAobmljZSB0byBoYXZlKSBnZW5lcmF0ZSBydW50aW1lIHByb3BlcnR5IHZhbGlkYXRpb25cbiAgICAgIHJldHVybiBbJ09iamVjdCddXG4gICAgY2FzZSAnVFNGdW5jdGlvblR5cGUnOlxuICAgICAgcmV0dXJuIFsnRnVuY3Rpb24nXVxuICAgIGNhc2UgJ1RTQXJyYXlUeXBlJzpcbiAgICBjYXNlICdUU1R1cGxlVHlwZSc6XG4gICAgICAvLyBUT0RPIChuaWNlIHRvIGhhdmUpIGdlbmVyYXRlIHJ1bnRpbWUgZWxlbWVudCB0eXBlL2xlbmd0aCBjaGVja3NcbiAgICAgIHJldHVybiBbJ0FycmF5J11cblxuICAgIGNhc2UgJ1RTTGl0ZXJhbFR5cGUnOlxuICAgICAgc3dpdGNoIChub2RlLmxpdGVyYWwudHlwZSkge1xuICAgICAgICBjYXNlICdTdHJpbmdMaXRlcmFsJzpcbiAgICAgICAgICByZXR1cm4gWydTdHJpbmcnXVxuICAgICAgICBjYXNlICdCb29sZWFuTGl0ZXJhbCc6XG4gICAgICAgICAgcmV0dXJuIFsnQm9vbGVhbiddXG4gICAgICAgIGNhc2UgJ051bWVyaWNMaXRlcmFsJzpcbiAgICAgICAgY2FzZSAnQmlnSW50TGl0ZXJhbCc6XG4gICAgICAgICAgcmV0dXJuIFsnTnVtYmVyJ11cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gWydudWxsJ11cbiAgICAgIH1cblxuICAgIGNhc2UgJ1RTVHlwZVJlZmVyZW5jZSc6XG4gICAgICBpZiAobm9kZS50eXBlTmFtZS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgaWYgKGRlY2xhcmVkVHlwZXNbbm9kZS50eXBlTmFtZS5uYW1lXSlcbiAgICAgICAgICByZXR1cm4gZGVjbGFyZWRUeXBlc1tub2RlLnR5cGVOYW1lLm5hbWVdXG5cbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGVOYW1lLm5hbWUpIHtcbiAgICAgICAgICBjYXNlICdBcnJheSc6XG4gICAgICAgICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgICAgICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICAgICAgY2FzZSAnU2V0JzpcbiAgICAgICAgICBjYXNlICdNYXAnOlxuICAgICAgICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgICAgICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgICAgICAgICAgcmV0dXJuIFtub2RlLnR5cGVOYW1lLm5hbWVdXG4gICAgICAgICAgY2FzZSAnUmVjb3JkJzpcbiAgICAgICAgICBjYXNlICdQYXJ0aWFsJzpcbiAgICAgICAgICBjYXNlICdSZWFkb25seSc6XG4gICAgICAgICAgY2FzZSAnUGljayc6XG4gICAgICAgICAgY2FzZSAnT21pdCc6XG4gICAgICAgICAgY2FzZSAnRXhjbHVkZSc6XG4gICAgICAgICAgY2FzZSAnRXh0cmFjdCc6XG4gICAgICAgICAgY2FzZSAnUmVxdWlyZWQnOlxuICAgICAgICAgIGNhc2UgJ0luc3RhbmNlVHlwZSc6XG4gICAgICAgICAgICByZXR1cm4gWydPYmplY3QnXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gWydudWxsJ11cblxuICAgIGNhc2UgJ1RTUGFyZW50aGVzaXplZFR5cGUnOlxuICAgICAgcmV0dXJuIGluZmVyUnVudGltZVR5cGUobm9kZS50eXBlQW5ub3RhdGlvbiwgZGVjbGFyZWRUeXBlcylcbiAgICBjYXNlICdUU1VuaW9uVHlwZSc6XG4gICAgICByZXR1cm4gW1xuICAgICAgICAuLi5uZXcgU2V0KFxuICAgICAgICAgIFtdLmNvbmNhdChcbiAgICAgICAgICAgIC4uLihub2RlLnR5cGVzLm1hcCh0ID0+IGluZmVyUnVudGltZVR5cGUodCwgZGVjbGFyZWRUeXBlcykpIGFzIGFueSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIF1cbiAgICBjYXNlICdUU0ludGVyc2VjdGlvblR5cGUnOlxuICAgICAgcmV0dXJuIFsnT2JqZWN0J11cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gWydudWxsJ10gLy8gbm8gcnVudGltZSBjaGVja1xuICB9XG59XG4iLCJpbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnXG5pbXBvcnQgdHlwZSB7IE5vZGUsIE9iamVjdEV4cHJlc3Npb24sIFN0YXRlbWVudCB9IGZyb20gJ0BiYWJlbC90eXBlcydcbmltcG9ydCB7IG5vdE51bGxpc2gsIHBhcnRpdGlvbiwgdW5pcSB9IGZyb20gJ0BhbnRmdS91dGlscydcbmltcG9ydCB0eXBlIHsgUGFyc2VkU0ZDLCBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IGFwcGx5TWFjcm9zIH0gZnJvbSAnLi9tYWNyb3MnXG5pbXBvcnQgeyBnZXRJZGVudGlmaWVyRGVjbGFyYXRpb25zIH0gZnJvbSAnLi9pZGVudGlmaWVycydcbmltcG9ydCB7IGdlbmVyYXRlLCB0IH0gZnJvbSAnLi9iYWJlbCdcbmltcG9ydCB7IHBhc2NhbGl6ZSB9IGZyb20gJy4vdXRpbHMnXG5cbmZ1bmN0aW9uIGlzQXN5bmNJbXBvcnQobm9kZTogU3RhdGVtZW50KSB7XG4gIGlmICh0LmlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gbm9kZS5kZWNsYXJhdGlvbnNbMF1cblxuICAgIHJldHVybiAoXG4gICAgICBkZWNsYXJhdGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgICAmJiB0LmlzQ2FsbEV4cHJlc3Npb24oZGVjbGFyYXRpb24uaW5pdClcbiAgICAgICYmIHQuaXNJZGVudGlmaWVyKGRlY2xhcmF0aW9uLmluaXQuY2FsbGVlKVxuICAgICAgJiYgZGVjbGFyYXRpb24uaW5pdC5jYWxsZWUubmFtZSA9PT0gJ2RlZmluZUFzeW5jQ29tcG9uZW50J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtU2NyaXB0U2V0dXAoXG4gIHNmYzogUGFyc2VkU0ZDLFxuICBvcHRpb25zPzogU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zLFxuKSB7XG4gIGNvbnN0IHsgc2NyaXB0U2V0dXAsIHNjcmlwdCwgdGVtcGxhdGUgfSA9IHNmY1xuXG4gIGNvbnN0IHsgbm9kZXM6IGJvZHksIHByb3BzLCBleHBvc2UgfSA9IGFwcGx5TWFjcm9zKHNjcmlwdFNldHVwLmFzdC5ib2R5KVxuXG4gIGNvbnN0IFtob2lzdGVkLCBzZXR1cEJvZHldID0gcGFydGl0aW9uKFxuICAgIGJvZHksXG4gICAgbiA9PlxuICAgICAgaXNBc3luY0ltcG9ydChuKVxuICAgICAgfHwgdC5pc0ltcG9ydERlY2xhcmF0aW9uKG4pXG4gICAgICB8fCB0LmlzRXhwb3J0TmFtZWREZWNsYXJhdGlvbihuKVxuICAgICAgfHwgbi50eXBlLnN0YXJ0c1dpdGgoJ1RTJyksXG4gIClcblxuICAvLyBnZXQgYWxsIGlkZW50aWZpZXJzIGluIGA8c2NyaXB0IHNldHVwPmAgYW5kIGA8c2NyaXB0PmBcbiAgY29uc3QgZGVjbGFyYXRpb25BcnJheSA9IHVuaXEoW1xuICAgIC4uLmdldElkZW50aWZpZXJEZWNsYXJhdGlvbnMoaG9pc3RlZCksXG4gICAgLi4uZ2V0SWRlbnRpZmllckRlY2xhcmF0aW9ucyhzZXR1cEJvZHkpLFxuICAgIC4uLmdldElkZW50aWZpZXJEZWNsYXJhdGlvbnMoc2NyaXB0LmFzdC5ib2R5KSxcbiAgXSkuZmlsdGVyKG5vdE51bGxpc2gpXG5cbiAgLy8gZmlsdGVyIG91dCBpZGVudGlmaWVycyB0aGF0IGFyZSB1c2VkIGluIGA8dGVtcGxhdGU+YFxuICBjb25zdCByZXR1cm5zOiBPYmplY3RFeHByZXNzaW9uWydwcm9wZXJ0aWVzJ10gPSBkZWNsYXJhdGlvbkFycmF5XG4gICAgLmZpbHRlcihpID0+IHRlbXBsYXRlLmlkZW50aWZpZXJzLmhhcyhpKSlcbiAgICAubWFwKChpKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHQuaWRlbnRpZmllcihpKVxuICAgICAgcmV0dXJuIHQub2JqZWN0UHJvcGVydHkoaWQsIGlkLCBmYWxzZSwgdHJ1ZSlcbiAgICB9KVxuXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBBcnJheS5mcm9tKHRlbXBsYXRlLmNvbXBvbmVudHMpXG4gICAgLm1hcChcbiAgICAgIGNvbXBvbmVudCA9PlxuICAgICAgICBkZWNsYXJhdGlvbkFycmF5LmZpbmQoZGVjbGFyZSA9PiBkZWNsYXJlID09PSBjb21wb25lbnQpXG4gICAgICAgID8/IGRlY2xhcmF0aW9uQXJyYXkuZmluZChkZWNsYXJlID0+IHBhc2NhbGl6ZShkZWNsYXJlKSA9PT0gY29tcG9uZW50KSxcbiAgICApXG4gICAgLmZpbHRlcihub3ROdWxsaXNoKVxuXG4gIGNvbnN0IGRpcmVjdGl2ZURlY2xhcmF0aW9uID0gQXJyYXkuZnJvbSh0ZW1wbGF0ZS5kaXJlY3RpdmVzKVxuICAgIC5tYXAoKGRpcmVjdGl2ZSkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGRlY2xhcmF0aW9uQXJyYXkuZmluZChcbiAgICAgICAgZGVjbGFyYXRpb24gPT4gZGVjbGFyYXRpb24gPT09IGB2JHtjYXBpdGFsaXplKGRpcmVjdGl2ZSl9YCxcbiAgICAgIClcbiAgICAgIGlmIChpZGVudGlmaWVyID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIHsgaWRlbnRpZmllciwgZGlyZWN0aXZlIH1cbiAgICB9KVxuICAgIC5maWx0ZXIobm90TnVsbGlzaClcblxuICAvLyBhcHBlbmQgYDxzY3JpcHQgc2V0dXA+YCBpbXBvcnRzIHRvIGA8c2NyaXB0PmBcblxuICBjb25zdCBfX3NmYyA9IHQuaWRlbnRpZmllcignX19zZmNfbWFpbicpXG5cbiAgbGV0IGhhc0JvZHkgPSBmYWxzZVxuXG4gIGNvbnN0IGJvZHlOb2RlcyA9IHNjcmlwdC5hc3QuYm9keS5tYXAoKG5vZGU6IE5vZGUpID0+IHtcbiAgICAvLyByZXBsYWNlIGBleHBvcnQgZGVmYXVsdGAgd2l0aCBhIHRlbXByb3JheSB2YXJpYWJsZVxuICAgIC8vIGBjb25zdCBfX3NmY19tYWluID0geyAuLi4gfWBcbiAgICBpZiAobm9kZS50eXBlID09PSAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJykge1xuICAgICAgaGFzQm9keSA9IHRydWVcbiAgICAgIHJldHVybiB0LnZhcmlhYmxlRGVjbGFyYXRpb24oJ2NvbnN0JywgW1xuICAgICAgICB0LnZhcmlhYmxlRGVjbGFyYXRvcihfX3NmYywgbm9kZS5kZWNsYXJhdGlvbiBhcyBhbnkpLFxuICAgICAgXSlcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVcbiAgfSlcblxuICBsZXQgYXN0ID0gdC5wcm9ncmFtKFtcbiAgICAuLi5zZmMuZXh0cmFEZWNsYXJhdGlvbnMsXG4gICAgLi4uaG9pc3RlZCxcbiAgICAuLi5ib2R5Tm9kZXMsXG4gIF0gYXMgU3RhdGVtZW50W10pXG5cbiAgLy8gaW5qZWN0IGBjb25zdCBfX3NmY19tYWluID0ge31gIGlmIGA8c2NyaXB0PmAgaGFzIGRlZmF1bHQgZXhwb3J0XG4gIGlmICghaGFzQm9keSkge1xuICAgIGFzdC5ib2R5LnB1c2goXG4gICAgICB0LnZhcmlhYmxlRGVjbGFyYXRpb24oJ2NvbnN0JywgW1xuICAgICAgICB0LnZhcmlhYmxlRGVjbGFyYXRvcihfX3NmYywgdC5vYmplY3RFeHByZXNzaW9uKFtdKSksXG4gICAgICBdKSxcbiAgICApXG4gIH1cblxuICAvLyBpbmplY3QgcHJvcHMgZnVuY3Rpb25cbiAgLy8gYF9fc2ZjX21haW4ucHJvcHMgPSB7IC4uLiB9YFxuICBpZiAocHJvcHMpIHtcbiAgICBoYXNCb2R5ID0gdHJ1ZVxuICAgIGFzdC5ib2R5LnB1c2goXG4gICAgICB0LmV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIHQuYXNzaWdubWVudEV4cHJlc3Npb24oXG4gICAgICAgICAgJz0nLFxuICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbihfX3NmYywgdC5pZGVudGlmaWVyKCdwcm9wcycpKSxcbiAgICAgICAgICBwcm9wcyBhcyBhbnksXG4gICAgICAgICksXG4gICAgICApIGFzIGFueSxcbiAgICApXG4gIH1cblxuICAvLyBpbmplY3Qgc2V0dXAgZnVuY3Rpb25cbiAgLy8gYF9fc2ZjX21haW4uc2V0dXAgPSAoKSA9PiB7fWBcbiAgaWYgKGJvZHkubGVuZ3RoKSB7XG4gICAgaGFzQm9keSA9IHRydWVcbiAgICBjb25zdCByZXR1cm5FeHByID0gZXhwb3NlXG4gICAgICA/IHQuY2FsbEV4cHJlc3Npb24oXG4gICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbih0LmlkZW50aWZpZXIoJ09iamVjdCcpLCB0LmlkZW50aWZpZXIoJ2Fzc2lnbicpKSxcbiAgICAgICAgW3Qub2JqZWN0RXhwcmVzc2lvbihyZXR1cm5zKSwgZXhwb3NlXSxcbiAgICAgIClcbiAgICAgIDogdC5vYmplY3RFeHByZXNzaW9uKHJldHVybnMpXG4gICAgY29uc3QgcmV0dXJuU3RhdGVtZW50ID0gdC5yZXR1cm5TdGF0ZW1lbnQocmV0dXJuRXhwcilcblxuICAgIGFzdC5ib2R5LnB1c2goXG4gICAgICB0LmV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIHQuYXNzaWdubWVudEV4cHJlc3Npb24oXG4gICAgICAgICAgJz0nLFxuICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbihfX3NmYywgdC5pZGVudGlmaWVyKCdzZXR1cCcpKSxcbiAgICAgICAgICB0LmFycm93RnVuY3Rpb25FeHByZXNzaW9uKFxuICAgICAgICAgICAgW3QuaWRlbnRpZmllcignX19wcm9wcycpLCB0LmlkZW50aWZpZXIoJ19fY3R4JyldLFxuICAgICAgICAgICAgdC5ibG9ja1N0YXRlbWVudChbLi4uc2V0dXBCb2R5LCByZXR1cm5TdGF0ZW1lbnQgYXMgYW55XSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICkgYXMgYW55LFxuICAgIClcbiAgfVxuXG4gIC8vIGluamVjdCBjb21wb25lbnRzXG4gIC8vIGBfX3NmY19tYWluLmNvbXBvbmVudHMgPSBPYmplY3QuYXNzaWduKHsgLi4uIH0sIF9fc2ZjX21haW4uY29tcG9uZW50cylgXG4gIGlmIChjb21wb25lbnRzLmxlbmd0aCkge1xuICAgIGhhc0JvZHkgPSB0cnVlXG4gICAgY29uc3QgY29tcG9uZW50c09iamVjdCA9IHQub2JqZWN0RXhwcmVzc2lvbihcbiAgICAgIGNvbXBvbmVudHMubWFwKChpKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gdC5pZGVudGlmaWVyKGkpXG4gICAgICAgIHJldHVybiB0Lm9iamVjdFByb3BlcnR5KGlkLCBpZCwgZmFsc2UsIHRydWUpXG4gICAgICB9KSxcbiAgICApXG5cbiAgICBhc3QuYm9keS5wdXNoKFxuICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICB0LmFzc2lnbm1lbnRFeHByZXNzaW9uKFxuICAgICAgICAgICc9JyxcbiAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24oX19zZmMsIHQuaWRlbnRpZmllcignY29tcG9uZW50cycpKSxcbiAgICAgICAgICB0LmNhbGxFeHByZXNzaW9uKFxuICAgICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKHQuaWRlbnRpZmllcignT2JqZWN0JyksIHQuaWRlbnRpZmllcignYXNzaWduJykpLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBjb21wb25lbnRzT2JqZWN0LFxuICAgICAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24oX19zZmMsIHQuaWRlbnRpZmllcignY29tcG9uZW50cycpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICkgYXMgYW55LFxuICAgIClcbiAgfVxuXG4gIC8vIGluamVjdCBkaXJlY3RpdmVzXG4gIC8vIGBfX3NmY19tYWluLmRpcmVjdGl2ZXMgPSBPYmplY3QuYXNzaWduKHsgLi4uIH0sIF9fc2ZjX21haW4uZGlyZWN0aXZlcylgXG4gIGlmIChkaXJlY3RpdmVEZWNsYXJhdGlvbi5sZW5ndGgpIHtcbiAgICBoYXNCb2R5ID0gdHJ1ZVxuICAgIGNvbnN0IGRpcmVjdGl2ZXNPYmplY3QgPSB0Lm9iamVjdEV4cHJlc3Npb24oXG4gICAgICBkaXJlY3RpdmVEZWNsYXJhdGlvbi5tYXAoKHsgZGlyZWN0aXZlLCBpZGVudGlmaWVyIH0pID0+XG4gICAgICAgIHQub2JqZWN0UHJvcGVydHkoXG4gICAgICAgICAgdC5pZGVudGlmaWVyKGRpcmVjdGl2ZSksXG4gICAgICAgICAgdC5pZGVudGlmaWVyKGlkZW50aWZpZXIpLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApXG5cbiAgICBhc3QuYm9keS5wdXNoKFxuICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICB0LmFzc2lnbm1lbnRFeHByZXNzaW9uKFxuICAgICAgICAgICc9JyxcbiAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24oX19zZmMsIHQuaWRlbnRpZmllcignZGlyZWN0aXZlcycpKSxcbiAgICAgICAgICB0LmNhbGxFeHByZXNzaW9uKFxuICAgICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKHQuaWRlbnRpZmllcignT2JqZWN0JyksIHQuaWRlbnRpZmllcignYXNzaWduJykpLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBkaXJlY3RpdmVzT2JqZWN0LFxuICAgICAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24oX19zZmMsIHQuaWRlbnRpZmllcignZGlyZWN0aXZlcycpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICkgYXMgYW55LFxuICAgIClcbiAgfVxuXG4gIGlmICghaGFzQm9keSAmJiAhb3B0aW9ucz8uYXN0VHJhbnNmb3Jtcykge1xuICAgIHJldHVybiB7XG4gICAgICBhc3Q6IG51bGwsXG4gICAgICBjb2RlOiAnJyxcbiAgICB9XG4gIH1cblxuICAvLyByZS1leHBvcnRcbiAgLy8gYGV4cG9ydCBkZWZhdWx0IF9fc2ZjX21haW5gXG4gIGFzdC5ib2R5LnB1c2godC5leHBvcnREZWZhdWx0RGVjbGFyYXRpb24oX19zZmMpIGFzIGFueSlcblxuICBhc3QgPSBvcHRpb25zPy5hc3RUcmFuc2Zvcm1zPy5wb3N0Py4oYXN0LCBzZmMpIHx8IGFzdFxuXG4gIHJldHVybiB7XG4gICAgYXN0LFxuICAgIGNvZGU6IGdlbmVyYXRlKGFzdCkuY29kZSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgc2hvdWxkVHJhbnNmb3JtLCB0cmFuc2Zvcm1BU1QgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHktdHJhbnNmb3JtJ1xuaW1wb3J0IE1hZ2ljU3RyaW5nIGZyb20gJ21hZ2ljLXN0cmluZydcbmltcG9ydCB0eXBlIHsgUGFyc2VkU0ZDLCBSZXNvbHZlZE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IHBhcnNlLCB0IH0gZnJvbSAnLi9iYWJlbCdcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVNmY1JlZlN1Z2FyKHNmYzogUGFyc2VkU0ZDLCBvcHRpb25zOiBSZXNvbHZlZE9wdGlvbnMpIHtcbiAgY29uc3QgaW1wb3J0ZWRIZWxwZXJzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBbc2ZjLnNjcmlwdCwgc2ZjLnNjcmlwdFNldHVwXSkge1xuICAgIGlmIChzaG91bGRUcmFuc2Zvcm0oc2NyaXB0LmNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBzID0gbmV3IE1hZ2ljU3RyaW5nKHNjcmlwdC5jb250ZW50KVxuICAgICAgY29uc3QgeyBpbXBvcnRlZEhlbHBlcnM6IGltcG9ydHMgfSA9IHRyYW5zZm9ybUFTVChzY3JpcHQuYXN0LCBzKVxuICAgICAgQXJyYXkuZnJvbShpbXBvcnRzKS5mb3JFYWNoKGhlbHBlciA9PiBpbXBvcnRlZEhlbHBlcnMuYWRkKGhlbHBlcikpXG4gICAgICBzY3JpcHQuY29udGVudCA9IHMudG9TdHJpbmcoKVxuICAgICAgc2NyaXB0LmFzdCA9IHBhcnNlKHNjcmlwdC5jb250ZW50LCBzZmMucGFyc2VyT3B0aW9ucykucHJvZ3JhbVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbXBvcnRlZEhlbHBlcnMuc2l6ZSkge1xuICAgIHNmYy5leHRyYURlY2xhcmF0aW9ucyA9IFtcbiAgICAgIHQuaW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICAgIEFycmF5LmZyb20oaW1wb3J0ZWRIZWxwZXJzKS5tYXAoaSA9PiB0LmltcG9ydFNwZWNpZmllcih0LmlkZW50aWZpZXIoYF8ke2l9YCksIHQuaWRlbnRpZmllcihpKSkpLFxuICAgICAgICB0LnN0cmluZ0xpdGVyYWwob3B0aW9ucy5pbXBvcnRIZWxwZXJzRnJvbSksXG4gICAgICApLFxuICAgIF1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBSZXNvbHZlZE9wdGlvbnMsIFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbnMob3B0aW9uczogU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zID0ge30pOiBSZXNvbHZlZE9wdGlvbnMge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICByZWFjdGl2aXR5VHJhbnNmb3JtOiBmYWxzZSxcbiAgICAgIGltcG9ydEhlbHBlcnNGcm9tOiAnQHZ1ZS9jb21wb3NpdGlvbi1hcGknLFxuICAgICAgYXN0VHJhbnNmb3Jtczoge30sXG4gICAgfSxcbiAgICBvcHRpb25zLFxuICApXG59XG4iLCJpbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJ1xuaW1wb3J0IHsgc2hvdWxkVHJhbnNmb3JtIGFzIHNob3VsZFRyYW5zZm9ybVJlZlN1Z2FyLCB0cmFuc2Zvcm0gYXMgdHJhbnNmb3JtUmVmIH0gZnJvbSAnQHZ1ZS9yZWFjdGl2aXR5LXRyYW5zZm9ybSdcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRPcHRpb25zLCBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMsIFRyYW5zZm9ybVJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgcGFyc2VTRkMgfSBmcm9tICcuL3BhcnNlU0ZDJ1xuaW1wb3J0IHsgdHJhbnNmb3JtU2NyaXB0U2V0dXAgfSBmcm9tICcuL3RyYW5zZm9ybVNjcmlwdFNldHVwJ1xuaW1wb3J0IHsgdHJhbnNmb3JtU2ZjUmVmU3VnYXIgfSBmcm9tICcuL3RyYW5zZm9ybVNmY1JlZlN1Z2FyJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnXG5cbmNvbnN0IHNjcmlwdFNldHVwUkUgPSAvPHNjcmlwdFxccyguKlxccyk/c2V0dXAoXFxzLiopPz4vXG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRUcmFuc2Zvcm0oY29kZTogc3RyaW5nLCBpZDogc3RyaW5nLCBvcHRpb25zPzogU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zKTogYm9vbGVhbiB7XG4gIC8vIGF2b2lkIHRyYW5zZm9ybWluZyB0d2ljZVxuICBpZiAoY29kZS5pbmNsdWRlcygnZXhwb3J0IGRlZmF1bHQgX19zZmNfbWFpbicpKVxuICAgIHJldHVybiBmYWxzZVxuICByZXR1cm4gKG9wdGlvbnM/LnJlYWN0aXZpdHlUcmFuc2Zvcm0gJiYgc2hvdWxkVHJhbnNmb3JtUmVmU3VnYXIoY29kZSkpIHx8IHNjcmlwdFNldHVwUkUudGVzdChjb2RlKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtKGlucHV0OiBzdHJpbmcsIGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3VsdD4ge1xuICBpZiAoIXNob3VsZFRyYW5zZm9ybShpbnB1dCwgaWQsIG9wdGlvbnMpKVxuICAgIHJldHVybiBudWxsXG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZU9wdGlvbnMob3B0aW9ucylcbiAgaWYgKGlkLmVuZHNXaXRoKCcudnVlJykgfHwgaWQuaW5jbHVkZXMoJy52dWU/dnVlJykpXG4gICAgcmV0dXJuIGF3YWl0IHRyYW5zZm9ybVZ1ZShpbnB1dCwgaWQsIHJlc29sdmVkKVxuICBlbHNlXG4gICAgcmV0dXJuIHRyYW5zZm9ybU5vblZ1ZShpbnB1dCwgaWQsIHJlc29sdmVkKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Ob25WdWUoaW5wdXQ6IHN0cmluZywgaWQ6IHN0cmluZywgb3B0aW9uczogUmVzb2x2ZWRPcHRpb25zKTogVHJhbnNmb3JtUmVzdWx0IHtcbiAgaWYgKG9wdGlvbnMucmVhY3Rpdml0eVRyYW5zZm9ybSAmJiBzaG91bGRUcmFuc2Zvcm1SZWZTdWdhcihpbnB1dCkpIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtUmVmKGlucHV0LCB7XG4gICAgICBmaWxlbmFtZTogaWQsXG4gICAgICBzb3VyY2VNYXA6IG9wdGlvbnMuc291cmNlTWFwLFxuICAgICAgaW1wb3J0SGVscGVyc0Zyb206IG9wdGlvbnMuaW1wb3J0SGVscGVyc0Zyb20sXG4gICAgfSkgYXMgYW55XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtVnVlKGlucHV0OiBzdHJpbmcsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJlc29sdmVkT3B0aW9ucyk6IFByb21pc2U8VHJhbnNmb3JtUmVzdWx0PiB7XG4gIGNvbnN0IHMgPSBuZXcgTWFnaWNTdHJpbmcoaW5wdXQpXG5cbiAgY29uc3Qgc2ZjID0gYXdhaXQgcGFyc2VTRkMoaW5wdXQsIGlkKVxuXG4gIGlmIChvcHRpb25zLnJlYWN0aXZpdHlUcmFuc2Zvcm0pXG4gICAgdHJhbnNmb3JtU2ZjUmVmU3VnYXIoc2ZjLCBvcHRpb25zKVxuXG4gIGNvbnN0IHsgY29kZSB9ID0gdHJhbnNmb3JtU2NyaXB0U2V0dXAoc2ZjLCBvcHRpb25zKVxuXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgLi4uc2ZjLnNjcmlwdC5hdHRycyxcbiAgICAuLi5zZmMuc2NyaXB0U2V0dXAuYXR0cnMsXG4gIH1cbiAgZGVsZXRlIGF0dHJpYnV0ZXMuc2V0dXBcbiAgY29uc3QgYXR0ciA9IE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpXG4gICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSA/IGAke2tleX09XCIke3ZhbHVlfVwiYCA6IGtleSlcbiAgICAuam9pbignICcpXG5cbiAgaWYgKGNvZGUpIHtcbiAgICBjb25zdCBibG9jayA9IGA8c2NyaXB0ICR7YXR0cn0+XFxuJHtjb2RlfVxcbjwvc2NyaXB0PmBcblxuICAgIHMucmVtb3ZlKHNmYy5zY3JpcHQuc3RhcnQsIHNmYy5zY3JpcHQuZW5kKVxuICAgIGlmIChzZmMuc2NyaXB0U2V0dXAuc3RhcnQgIT09IHNmYy5zY3JpcHRTZXR1cC5lbmQpIHtcbiAgICAgIHMub3ZlcndyaXRlKFxuICAgICAgICBzZmMuc2NyaXB0U2V0dXAuc3RhcnQsXG4gICAgICAgIHNmYy5zY3JpcHRTZXR1cC5lbmQsXG4gICAgICAgIGJsb2NrLFxuICAgICAgKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMucHJlcGVuZExlZnQoMCwgYCR7YmxvY2t9XFxuYClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBzLnRvU3RyaW5nKCksXG4gICAgbWFwOiBvcHRpb25zLnNvdXJjZU1hcFxuICAgICAgPyBzLmdlbmVyYXRlTWFwKHtcbiAgICAgICAgc291cmNlOiBpZCxcbiAgICAgICAgaW5jbHVkZUNvbnRlbnQ6IHRydWUsXG4gICAgICB9KSBhcyBhbnlcbiAgICAgIDogbnVsbCxcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlVW5wbHVnaW4gfSBmcm9tICd1bnBsdWdpbidcbmltcG9ydCB7IGNyZWF0ZUZpbHRlciB9IGZyb20gJ0Byb2xsdXAvcGx1Z2ludXRpbHMnXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdHJhbnNmb3JtIH0gZnJvbSAnLi9jb3JlJ1xuXG5leHBvcnQgKiBmcm9tICcuL2NvcmUnXG5cbmV4cG9ydCBjb25zdCB1bnBsdWdpbiA9IGNyZWF0ZVVucGx1Z2luPFBsdWdpbk9wdGlvbnM+KChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgZmlsdGVyID0gY3JlYXRlRmlsdGVyKFxuICAgIG9wdGlvbnMuaW5jbHVkZSB8fCAob3B0aW9ucy5yZWFjdGl2aXR5VHJhbnNmb3JtID8gWy9cXC52dWUkLywgL1xcLnZ1ZVxcP3Z1ZS8sIC9cXC5banRdc3g/JC9dIDogWy9cXC52dWUkLywgL1xcLnZ1ZVxcP3Z1ZS9dKSxcbiAgICBvcHRpb25zLmV4Y2x1ZGUgfHwgWy9ub2RlX21vZHVsZXMvLCAvXFwuZ2l0LywgL1xcLm51eHQvXSxcbiAgKVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3VucGx1Z2luLXZ1ZTItc2NyaXB0LXNldHVwJyxcbiAgICBlbmZvcmNlOiAncHJlJyxcbiAgICB0cmFuc2Zvcm1JbmNsdWRlKGlkKSB7XG4gICAgICByZXR1cm4gZmlsdGVyKGlkKVxuICAgIH0sXG4gICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdHJhbnNmb3JtKGNvZGUsIGlkLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICB0aGlzLmVycm9yKGUpXG4gICAgICB9XG4gICAgfSxcbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgdW5wbHVnaW5cbiJdLCJuYW1lcyI6WyJiYWJlbCIsImJhYmVsX3RyYXZlcnNlIiwiY2FwaXRhbGl6ZSIsImNhbWVsaXplIiwiTm9kZVR5cGVzIiwiRWxlbWVudFR5cGVzIiwicGFyc2UiLCJub2RlIiwibm90TnVsbGlzaCIsImJhc2VQYXJzZSIsInBhcnNlck9wdGlvbnMiLCJwYXJ0aXRpb24iLCJfYSIsIl9iIiwiX2MiLCJjb250ZW50IiwiYXN0Iiwia2V5IiwidmFsdWUiLCJwYXJzZUV4cHJlc3Npb24iLCJ0IiwidW5pcSIsInNob3VsZFRyYW5zZm9ybSIsInRyYW5zZm9ybUFTVCIsInNob3VsZFRyYW5zZm9ybVJlZlN1Z2FyIiwidHJhbnNmb3JtUmVmIiwiY3JlYXRlVW5wbHVnaW4iLCJjcmVhdGVGaWx0ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxDQUFBO0FBS2EsTUFBQSxDQUFBLEdBQUEsQ0FBNkJBLGdCQUFjLENBQUEsT0FBQSxJQUFXQSxnQkFBTyxFQUFBLEtBQUEs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
|