mirror of
https://github.com/nunocoracao/blowfish.git
synced 2025-02-02 11:32:30 -06:00
249 lines
No EOL
35 KiB
JavaScript
249 lines
No EOL
35 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.printers = exports.parsers = exports.languages = exports.options = void 0;
|
|
const prettier_1 = require("prettier");
|
|
const doc_1 = require("prettier/doc");
|
|
const parser_html_1 = require("prettier/parser-html");
|
|
const parse_1 = require("./parse");
|
|
const htmlParser = parser_html_1.parsers.html;
|
|
const PLUGIN_KEY = "go-template";
|
|
exports.options = {
|
|
goTemplateBracketSpacing: {
|
|
type: "boolean",
|
|
category: "Global",
|
|
description: "Specifies whether the brackets should have spacing around the statement.",
|
|
default: true,
|
|
},
|
|
};
|
|
exports.languages = [
|
|
{
|
|
name: "GoTemplate",
|
|
parsers: [PLUGIN_KEY],
|
|
extensions: [
|
|
".go.html",
|
|
".gohtml",
|
|
".gotmpl",
|
|
".go.tmpl",
|
|
".tmpl",
|
|
".tpl",
|
|
".html.tmpl",
|
|
".html.tpl",
|
|
],
|
|
vscodeLanguageIds: ["gotemplate", "gohtml", "GoTemplate", "GoHTML"],
|
|
},
|
|
];
|
|
exports.parsers = {
|
|
[PLUGIN_KEY]: {
|
|
astFormat: PLUGIN_KEY,
|
|
preprocess: (text) => text.endsWith("\n") ? text.slice(0, text.length - 1) : text,
|
|
parse: parse_1.parseGoTemplate,
|
|
locStart: (node) => node.index,
|
|
locEnd: (node) => node.index + node.length,
|
|
},
|
|
};
|
|
exports.printers = {
|
|
[PLUGIN_KEY]: {
|
|
print: (path, options, print) => {
|
|
const node = path.getNode();
|
|
switch (node === null || node === void 0 ? void 0 : node.type) {
|
|
case "inline":
|
|
return printInline(node, path, options, print);
|
|
case "double-block":
|
|
return printMultiBlock(node, path, print);
|
|
case "unformattable":
|
|
return printUnformattable(node, options);
|
|
}
|
|
throw new Error(`An error occured during printing. Found invalid node ${node === null || node === void 0 ? void 0 : node.type}.`);
|
|
},
|
|
embed: (path, print, textToDoc, options) => {
|
|
try {
|
|
return embed(path, print, textToDoc, options);
|
|
}
|
|
catch (e) {
|
|
console.error("Formatting failed.", e);
|
|
throw e;
|
|
}
|
|
},
|
|
},
|
|
};
|
|
const embed = (path, print, textToDoc, options) => {
|
|
const node = path.getNode();
|
|
if (!node) {
|
|
return null;
|
|
}
|
|
if (hasPrettierIgnoreLine(node)) {
|
|
return options.originalText.substring(options.locStart(node), options.locEnd(node));
|
|
}
|
|
if (node.type !== "block" && node.type !== "root") {
|
|
return null;
|
|
}
|
|
const html = textToDoc(node.aliasedContent, Object.assign(Object.assign({}, options), { parser: "html", parentParser: "go-template" }));
|
|
const mapped = doc_1.utils.stripTrailingHardline(doc_1.utils.mapDoc(html, (currentDoc) => {
|
|
if (typeof currentDoc !== "string") {
|
|
return currentDoc;
|
|
}
|
|
let result = currentDoc;
|
|
Object.keys(node.children).forEach((key) => (result = prettier_1.doc.utils.mapDoc(result, (docNode) => typeof docNode !== "string" || !docNode.includes(key)
|
|
? docNode
|
|
: doc_1.builders.concat([
|
|
docNode.substring(0, docNode.indexOf(key)),
|
|
path.call(print, "children", key),
|
|
docNode.substring(docNode.indexOf(key) + key.length),
|
|
]))));
|
|
return result;
|
|
}));
|
|
if ((0, parse_1.isRoot)(node)) {
|
|
return doc_1.builders.concat([mapped, doc_1.builders.hardline]);
|
|
}
|
|
const startStatement = path.call(print, "start");
|
|
const endStatement = node.end ? path.call(print, "end") : "";
|
|
if (isPrettierIgnoreBlock(node)) {
|
|
return doc_1.builders.concat([
|
|
doc_1.utils.removeLines(path.call(print, "start")),
|
|
printPlainBlock(node.content),
|
|
endStatement,
|
|
]);
|
|
}
|
|
const content = node.aliasedContent.trim()
|
|
? doc_1.builders.indent(doc_1.builders.concat([doc_1.builders.softline, mapped]))
|
|
: "";
|
|
const result = doc_1.builders.concat([
|
|
startStatement,
|
|
content,
|
|
doc_1.builders.softline,
|
|
endStatement,
|
|
]);
|
|
const emptyLine = !!node.end && isFollowedByEmptyLine(node.end, options.originalText)
|
|
? doc_1.builders.softline
|
|
: "";
|
|
if ((0, parse_1.isMultiBlock)(node.parent)) {
|
|
return doc_1.builders.concat([result, emptyLine]);
|
|
}
|
|
return doc_1.builders.group(doc_1.builders.concat([doc_1.builders.group(result), emptyLine]), {
|
|
shouldBreak: !!node.end && hasNodeLinebreak(node.end, options.originalText),
|
|
});
|
|
};
|
|
function printMultiBlock(node, path, print) {
|
|
return doc_1.builders.concat([...path.map(print, "blocks")]);
|
|
}
|
|
function isFollowedByNode(node) {
|
|
const parent = getFirstBlockParent(node).parent;
|
|
const start = parent.aliasedContent.indexOf(node.id) + node.id.length;
|
|
let nextNodeIndex = -1;
|
|
Object.keys(parent.children).forEach((key) => {
|
|
const index = parent.aliasedContent.indexOf(key, start);
|
|
if (nextNodeIndex == -1 || index < nextNodeIndex) {
|
|
nextNodeIndex = index;
|
|
}
|
|
});
|
|
return !!parent.aliasedContent
|
|
.substring(start, nextNodeIndex)
|
|
.match(/^\s+$/m);
|
|
}
|
|
function printInline(node, path, options, print) {
|
|
const isBlockNode = isBlockEnd(node) || isBlockStart(node);
|
|
const emptyLine = isFollowedByEmptyLine(node, options.originalText) && isFollowedByNode(node)
|
|
? doc_1.builders.softline
|
|
: "";
|
|
const result = [
|
|
printStatement(node.statement, options.goTemplateBracketSpacing, {
|
|
start: node.startDelimiter,
|
|
end: node.endDelimiter,
|
|
}),
|
|
];
|
|
return doc_1.builders.group(doc_1.builders.concat([...result, emptyLine]), {
|
|
shouldBreak: hasNodeLinebreak(node, options.originalText) && !isBlockNode,
|
|
});
|
|
}
|
|
function isBlockEnd(node) {
|
|
const { parent } = getFirstBlockParent(node);
|
|
return (0, parse_1.isBlock)(parent) && parent.end === node;
|
|
}
|
|
function isBlockStart(node) {
|
|
const { parent } = getFirstBlockParent(node);
|
|
return (0, parse_1.isBlock)(parent) && parent.start === node;
|
|
}
|
|
function printStatement(statement, addSpaces, delimiter = {
|
|
start: "",
|
|
end: "",
|
|
}) {
|
|
const space = addSpaces ? " " : "";
|
|
const shouldBreak = statement.includes("\n");
|
|
const content = shouldBreak
|
|
? statement
|
|
.trim()
|
|
.split("\n")
|
|
.map((line, _, array) => array.indexOf(line) === array.length - 1
|
|
? doc_1.builders.concat([line.trim(), doc_1.builders.softline])
|
|
: doc_1.builders.indent(doc_1.builders.concat([line.trim(), doc_1.builders.softline])))
|
|
: [statement.trim()];
|
|
return doc_1.builders.group(doc_1.builders.concat([
|
|
"{{",
|
|
delimiter.start,
|
|
space,
|
|
...content,
|
|
shouldBreak ? "" : space,
|
|
delimiter.end,
|
|
"}}",
|
|
]), { shouldBreak });
|
|
}
|
|
function hasPrettierIgnoreLine(node) {
|
|
if ((0, parse_1.isRoot)(node)) {
|
|
return false;
|
|
}
|
|
const { parent, child } = getFirstBlockParent(node);
|
|
const regex = new RegExp(`(?:<!--|{{).*?prettier-ignore.*?(?:-->|}})\n.*${child.id}`);
|
|
return !!parent.aliasedContent.match(regex);
|
|
}
|
|
function isPrettierIgnoreBlock(node) {
|
|
return (0, parse_1.isBlock)(node) && node.keyword === "prettier-ignore-start";
|
|
}
|
|
function hasNodeLinebreak(node, source) {
|
|
const start = node.index + node.length;
|
|
const end = source.indexOf("\n", start);
|
|
const suffix = source.substring(start, end);
|
|
return !suffix;
|
|
}
|
|
function isFollowedByEmptyLine(node, source) {
|
|
const start = node.index + node.length;
|
|
const firstLineBreak = source.indexOf("\n", start);
|
|
const secondLineBreak = source.indexOf("\n", firstLineBreak + 1);
|
|
const emptyLine = source
|
|
.substring(firstLineBreak + 1, secondLineBreak)
|
|
.trim();
|
|
const isLastNode = !!source.substring(start).match(/^\s*$/);
|
|
return (firstLineBreak !== -1 && secondLineBreak !== -1 && !emptyLine && !isLastNode);
|
|
}
|
|
function getFirstBlockParent(node) {
|
|
let previous = node;
|
|
let current = node.parent;
|
|
while (!(0, parse_1.isBlock)(current) && !(0, parse_1.isRoot)(current)) {
|
|
previous = current;
|
|
current = current.parent;
|
|
}
|
|
return {
|
|
child: previous,
|
|
parent: current,
|
|
};
|
|
}
|
|
function printUnformattable(node, options) {
|
|
var _a, _b;
|
|
const start = options.originalText.lastIndexOf("\n", node.index - 1);
|
|
const line = options.originalText.substring(start, node.index + node.length);
|
|
const lineWithoutAdditionalContent = (_b = (_a = line.replace(node.content, "").match(/\s*$/)) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : "";
|
|
return printPlainBlock(lineWithoutAdditionalContent + node.content, false);
|
|
}
|
|
function printPlainBlock(text, hardlines = true) {
|
|
const isTextEmpty = (input) => !!input.match(/^\s*$/);
|
|
const lines = text.split("\n");
|
|
const segments = lines.filter((value, i) => !(i == 0 || i == lines.length - 1) || !isTextEmpty(value));
|
|
return doc_1.builders.concat([
|
|
...segments.map((content, i) => doc_1.builders.concat([
|
|
hardlines || i ? doc_1.builders.hardline : "",
|
|
doc_1.builders.trim,
|
|
content,
|
|
])),
|
|
hardlines ? doc_1.builders.hardline : "",
|
|
]);
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBT2tCO0FBQ2xCLHNDQUErQztBQUMvQyxzREFBOEQ7QUFDOUQsbUNBYWlCO0FBRWpCLE1BQU0sVUFBVSxHQUFHLHFCQUFXLENBQUMsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQztBQVNwQixRQUFBLE9BQU8sR0FFaEI7SUFDRix3QkFBd0IsRUFBRTtRQUN4QixJQUFJLEVBQUUsU0FBUztRQUNmLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFdBQVcsRUFDVCwwRUFBMEU7UUFDNUUsT0FBTyxFQUFFLElBQUk7S0FDZDtDQUNGLENBQUM7QUFFVyxRQUFBLFNBQVMsR0FBc0I7SUFDMUM7UUFDRSxJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDckIsVUFBVSxFQUFFO1lBQ1YsVUFBVTtZQUNWLFNBQVM7WUFDVCxTQUFTO1lBQ1QsVUFBVTtZQUNWLE9BQU87WUFDUCxNQUFNO1lBQ04sWUFBWTtZQUNaLFdBQVc7U0FDWjtRQUNELGlCQUFpQixFQUFFLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDO0tBQ3BFO0NBQ0YsQ0FBQztBQUNXLFFBQUEsT0FBTyxHQUFHO0lBQ3JCLENBQUMsVUFBVSxDQUFDLEVBQWtCO1FBQzVCLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBRW5CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDN0QsS0FBSyxFQUFFLHVCQUFlO1FBQ3RCLFFBQVEsRUFBRSxDQUFD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QUFJLEVBQUUsQ0FBQztJQUUxRCxPQUFPLGVBQWUsQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxJQUFZLEVBQUUsU0FBUyxHQUFHLElBQUk7SUFDckQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFL0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FDeEUsQ0FBQztJQUVGLE9BQU8sY0FBUSxDQUFDLE1BQU0sQ0FBQztRQUNyQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDN0IsY0FBUSxDQUFDLE1BQU0sQ0FBQztZQUNkLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkMsY0FBUSxDQUFDLElBQUk7WUFDYixPQUFPO1NBQ1IsQ0FBQyxDQUNIO1FBQ0QsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQ25DLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBkb2MsXG4gIEZhc3RQYXRoLFxuICBQYXJzZXIsXG4gIFBhcnNlck9wdGlvbnMsXG4gIFByaW50ZXIsXG4gIFN1cHBvcnRMYW5ndWFnZSxcbn0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBidWlsZGVycywgdXRpbHMgfSBmcm9tIFwicHJldHRpZXIvZG9jXCI7XG5pbXBvcnQgeyBwYXJzZXJzIGFzIGh0bWxQYXJzZXJzIH0gZnJvbSBcInByZXR0aWVyL3BhcnNlci1odG1sXCI7XG5pbXBvcnQge1xuICBHb0Jsb2NrLFxuICBHb0lubGluZSxcbiAgR29JbmxpbmVFbmREZWxpbWl0ZXIsXG4gIEdvSW5saW5lU3RhcnREZWxpbWl0ZXIsXG4gIEdvTXVsdGlCbG9jayxcbiAgR29Ob2RlLFxuICBHb1Jvb3QsXG4gIEdvVW5mb3JtYXR0YWJsZSxcbiAgaXNCbG9jayxcbiAgaXNNdWx0aUJsb2NrLFxuICBpc1Jvb3QsXG4gIHBhcnNlR29UZW1wbGF0ZSxcbn0gZnJvbSBcIi4vcGFyc2VcIjtcblxuY29uc3QgaHRtbFBhcnNlciA9IGh0bWxQYXJzZXJzLmh0bWw7XG5jb25zdCBQTFVHSU5fS0VZID0gXCJnby10ZW1wbGF0ZVwiO1xuXG50eXBlIEV4dGVuZGVkUGFyc2VyT3B0aW9ucyA9IFBhcnNlck9wdGlvbnM8R29Ob2RlPiAmXG4gIFByZXR0aWVyUGx1Z2luR29UZW1wbGF0ZVBhcnNlck9wdGlvbnM7XG5cbmV4cG9ydCB0eXBlIFByZXR0aWVyUGx1Z2luR29UZW1wbGF0ZVBhcnNlck9wdGlvbnMgPSB7XG4gIGdvVGVtcGxhdGVCcmFja2V0U3BhY2luZzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zOiB7XG4gIFtLIGluIGtleW9mIFByZXR0aWVyUGx1Z2luR29UZW1wbGF0ZVBhcnNlck9wdGlvbnNdOiBhbnk7XG59ID0ge1xuICBnb1RlbXBsYXRlQnJhY2tldFNwYWNpbmc6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBjYXRlZ29yeTogXCJHbG9iYWxcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJyYWNrZXRzIHNob3VsZCBoYXZlIHNwYWNpbmcgYXJvdW5kIHRoZSBzdGF0ZW1lbnQuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBsYW5ndWFnZXM6IFN1cHBvcnRMYW5ndWFnZVtdID0gW1xuICB7XG4gICAgbmFtZTogXCJHb1RlbXBsYXRlXCIsXG4gICAgcGFyc2VyczogW1BMVUdJTl9LRVldLFxuICAgIGV4dGVuc2lvbnM6IFtcbiAgICAgIFwiLmdvLmh0bWxcIixcbiAgICAgIFwiLmdvaHRtbFwiLFxuICAgICAgXCIuZ290bXBsXCIsXG4gICAgICBcIi5nby50bXBsXCIsXG4gICAgICBcIi50bXBsXCIsXG4gICAgICBcIi50cGxcIixcbiAgICAgIFwiLmh0bWwudG1wbFwiLFxuICAgICAgXCIuaHRtbC50cGxcIixcbiAgICBdLFxuICAgIHZzY29kZUxhbmd1YWdlSWRzOiBbXCJnb3RlbXBsYXRlXCIsIFwiZ29odG1sXCIsIFwiR29UZW1wbGF0ZVwiLCBcIkdvSFRNTFwiXSxcbiAgfSxcbl07XG5leHBvcnQgY29uc3QgcGFyc2VycyA9IHtcbiAgW1BMVUdJTl9LRVldOiA8UGFyc2VyPEdvTm9kZT4+e1xuICAgIGFzdEZvcm1hdDogUExVR0lOX0tFWSxcbiAgICBwcmVwcm9jZXNzOiAodGV4dCkgPT5cbiAgICAgIC8vIEN1dCBhd2F5IHRyYWlsaW5nIG5ld2xpbmUgdG8gbm9ybWFsaXplIGZvcm1hdHRpbmcuXG4gICAgICB0ZXh0LmVuZHNXaXRoKFwiXFxuXCIpID8gdGV4dC5zbGljZSgwLCB0ZXh0Lmxlbmd0aCAtIDEpIDogdGV4dCxcbiAgICBwYXJzZTogcGFyc2VHb1RlbXBsYXRlLFxuICAgIGxvY1N0YXJ0OiAobm9kZSkgPT4gbm9kZS5pbmRleCxcbiAgICBsb2NFbmQ6IChub2RlKSA9PiBub2RlLmluZGV4ICsgbm9kZS5sZW5ndGgsXG4gIH0sXG59O1xuZXhwb3J0IGNvbnN0IHByaW50ZXJzID0ge1xuICBbUExVR0lOX0tFWV06IDxQcmludGVyPEdvTm9kZT4+e1xuICAgIHByaW50OiAocGF0aCwgb3B0aW9uczogRXh0ZW5kZWRQYXJzZXJPcHRpb25zLCBwcmludCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IHBhdGguZ2V0Tm9kZSgpO1xuXG4gICAgICBzd2l0Y2ggKG5vZGU/LnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImlubGluZVwiOlxuICAgICAgICAgIHJldHVybiBwcmludElubGluZShub2RlLCBwYXRoLCBvcHRpb25zLCBwcmludCk7XG4gICAgICAgIGNhc2UgXCJkb3VibGUtYmxvY2tcIjpcbiAgICAgICAgICByZXR1cm4gcHJpbnRNdWx0aUJsb2NrKG5vZGUsIHBhdGgsIHByaW50KTtcbiAgICAgICAgY2FzZSBcInVuZm9ybWF0dGFibGVcIjpcbiAgICAgICAgICByZXR1cm4gcHJpbnRVbmZvcm1hdHRhYmxlKG5vZGUsIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBbiBlcnJvciBvY2N1cmVkIGR1cmluZyBwcmludGluZy4gRm91bmQgaW52YWxpZCBub2RlICR7bm9kZT8udHlwZX0uYFxuICAgICAgKTtcbiAgICB9LFxuICAgIGVtYmVkOiAocGF0aCwgcHJpbnQsIHRleHRUb0RvYywgb3B0aW9ucykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGVtYmVkKHBhdGgsIHByaW50LCB0ZXh0VG9Eb2MsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRm9ybWF0dGluZyBmYWlsZWQuXCIsIGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBlbWJlZDogRXhjbHVkZTxQcmludGVyPEdvTm9kZT5bXCJlbWJlZFwiXSwgdW5kZWZpbmVkPiA9IChcbiAgcGF0aCxcbiAgcHJpbnQsXG4gIHRleHRUb0RvYyxcbiAgb3B0aW9uc1xuKSA9PiB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoLmdldE5vZGUoKTtcblxuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChoYXNQcmV0dGllcklnbm9yZUxpbmUobm9kZSkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5vcmlnaW5hbFRleHQuc3Vic3RyaW5nKFxuICAgICAgb3B0aW9ucy5sb2NTdGFydChub2RlKSxcbiAgICAgIG9wdGlvbnMubG9jRW5kKG5vZGUpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiYmxvY2tcIiAmJiBub2RlLnR5cGUgIT09IFwicm9vdFwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBodG1sID0gdGV4dFRvRG9jKG5vZGUuYWxpYXNlZENvbnRlbnQsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHBhcnNlcjogXCJodG1sXCIsXG4gICAgcGFyZW50UGFyc2VyOiBcImdvLXRlbXBsYXRlXCIsXG4gIH0pO1xuXG4gIGNvbnN0IG1hcHBlZCA9IHV0aWxzLnN0cmlwVHJhaWxpbmdIYXJkbGluZShcbiAgICB1dGlscy5tYXBEb2MoaHRtbCwgKGN1cnJlbnREb2MpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudERvYyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gY3VycmVudERvYztcbiAgICAgIH1cblxuICAgICAgbGV0IHJlc3VsdDogYnVpbGRlcnMuRG9jID0gY3VycmVudERvYztcblxuICAgICAgT2JqZWN0LmtleXMobm9kZS5jaGlsZHJlbikuZm9yRWFjaChcbiAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICAocmVzdWx0ID0gZG9jLnV0aWxzLm1hcERvYyhyZXN1bHQsIChkb2NOb2RlKSA9PlxuICAgICAgICAgICAgdHlwZW9mIGRvY05vZGUgIT09IFwic3RyaW5nXCIgfHwgIWRvY05vZGUuaW5jbHVkZXMoa2V5KVxuICAgICAgICAgICAgICA/IGRvY05vZGVcbiAgICAgICAgICAgICAgOiBidWlsZGVycy5jb25jYXQoW1xuICAgICAgICAgICAgICAgICAgZG9jTm9kZS5zdWJzdHJpbmcoMCwgZG9jTm9kZS5pbmRleE9mKGtleSkpLFxuICAgICAgICAgICAgICAgICAgcGF0aC5jYWxsKHByaW50LCBcImNoaWxkcmVuXCIsIGtleSksXG4gICAgICAgICAgICAgICAgICBkb2NOb2RlLnN1YnN0cmluZyhkb2NOb2RlLmluZGV4T2Yoa2V5KSArIGtleS5sZW5ndGgpLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgKSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSlcbiAgKTtcblxuICBpZiAoaXNSb290KG5vZGUpKSB7XG4gICAgcmV0dXJuIGJ1aWxkZXJzLmNvbmNhdChbbWFwcGVkLCBidWlsZGVycy5oYXJkbGluZV0pO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRTdGF0ZW1lbnQgPSBwYXRoLmNhbGwocHJpbnQsIFwic3RhcnRcIik7XG4gIGNvbnN0IGVuZFN0YXRlbWVudCA9IG5vZGUuZW5kID8gcGF0aC5jYWxsKHByaW50LCBcImVuZFwiKSA6IFwiXCI7XG5cbiAgaWYgKGlzUHJldHRpZXJJZ25vcmVCbG9jayhub2RlKSkge1xuICAgIHJldHVybiBidWlsZGVycy5jb25jYXQoW1xuICAgICAgdXRpbHMucmVtb3ZlTGluZXMocGF0aC5jYWxsKHByaW50LCBcInN0YXJ0XCIpKSxcbiAgICAgIHByaW50UGxhaW5CbG9jayhub2RlLmNvbnRlbnQpLFxuICAgICAgZW5kU3RhdGVtZW50LFxuICAgIF0pO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IG5vZGUuYWxpYXNlZENvbnRlbnQudHJpbSgpXG4gICAgPyBidWlsZGVycy5pbmRlbnQoYnVpbGRlcnMuY29uY2F0KFtidWlsZGVycy5zb2Z0bGluZSwgbWFwcGVkXSkpXG4gICAgOiBcIlwiO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXJzLmNvbmNhdChbXG4gICAgc3RhcnRTdGF0ZW1lbnQsXG4gICAgY29udGVudCxcbiAgICBidWlsZGVycy5zb2Z0bGluZSxcbiAgICBlbmRTdGF0ZW1lbnQsXG4gIF0pO1xuXG4gIGNvbnN0IGVtcHR5TGluZSA9XG4gICAgISFub2RlLmVuZCAmJiBpc0ZvbGxvd2VkQnlFbXB0eUxpbmUobm9kZS5lbmQsIG9wdGlvbnMub3JpZ2luYWxUZXh0KVxuICAgICAgPyBidWlsZGVycy5zb2Z0bGluZVxuICAgICAgOiBcIlwiO1xuXG4gIGlmIChpc011bHRpQmxvY2sobm9kZS5wYXJlbnQpKSB7XG4gICAgcmV0dXJuIGJ1aWxkZXJzLmNvbmNhdChbcmVzdWx0LCBlbXB0eUxpbmVdKTtcbiAgfVxuXG4gIHJldHVybiBidWlsZGVycy5ncm91cChidWlsZGVycy5jb25jYXQoW2J1aWxkZXJzLmdyb3VwKHJlc3VsdCksIGVtcHR5TGluZV0pLCB7XG4gICAgc2hvdWxkQnJlYWs6ICEhbm9kZS5lbmQgJiYgaGFzTm9kZUxpbmVicmVhayhub2RlLmVuZCwgb3B0aW9ucy5vcmlnaW5hbFRleHQpLFxuICB9KTtcbn07XG5cbnR5cGUgUHJpbnRGbiA9IChwYXRoOiBGYXN0UGF0aDxHb05vZGU+KSA9PiBidWlsZGVycy5Eb2M7XG5cbmZ1bmN0aW9uIHByaW50TXVsdGlCbG9jayhcbiAgbm9kZTogR29NdWx0aUJsb2NrLFxuICBwYXRoOiBGYXN0UGF0aDxHb05vZGU+LFxuICBwcmludDogUHJpbnRGblxuKTogYnVpbGRlcnMuRG9jIHtcbiAgcmV0dXJuIGJ1aWxkZXJzLmNvbmNhdChbLi4ucGF0aC5tYXAocHJpbnQsIFwiYmxvY2tzXCIpXSk7XG59XG5cbmZ1bmN0aW9uIGlzRm9sbG93ZWRCeU5vZGUobm9kZTogR29JbmxpbmUpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50ID0gZ2V0Rmlyc3RCbG9ja1BhcmVudChub2RlKS5wYXJlbnQ7XG4gIGNvbnN0IHN0YXJ0ID0gcGFyZW50LmFsaWFzZWRDb250ZW50LmluZGV4T2Yobm9kZS5pZCkgKyBub2RlLmlkLmxlbmd0aDtcblxuICBsZXQgbmV4dE5vZGVJbmRleCA9IC0xO1xuICBPYmplY3Qua2V5cyhwYXJlbnQuY2hpbGRyZW4pLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmFsaWFzZWRDb250ZW50LmluZGV4T2Yoa2V5LCBzdGFydCk7XG4gICAgaWYgKG5leHROb2RlSW5kZXggPT0gLTEgfHwgaW5kZXggPCBuZXh0Tm9kZUluZGV4KSB7XG4gICAgICBuZXh0Tm9kZUluZGV4ID0gaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gISFwYXJlbnQuYWxpYXNlZENvbnRlbnRcbiAgICAuc3Vic3RyaW5nKHN0YXJ0LCBuZXh0Tm9kZUluZGV4KVxuICAgIC5tYXRjaCgvXlxccyskL20pO1xufVxuXG5mdW5jdGlvbiBwcmludElubGluZShcbiAgbm9kZTogR29JbmxpbmUsXG4gIHBhdGg6IEZhc3RQYXRoPEdvTm9kZT4sXG4gIG9wdGlvbnM6IEV4dGVuZGVkUGFyc2VyT3B0aW9ucyxcbiAgcHJpbnQ6IFByaW50Rm5cbik6IGJ1aWxkZXJzLkRvYyB7XG4gIGNvbnN0IGlzQmxvY2tOb2RlID0gaXNCbG9ja0VuZChub2RlKSB8fCBpc0Jsb2NrU3RhcnQobm9kZSk7XG4gIGNvbnN0IGVtcHR5TGluZSA9XG4gICAgaXNGb2xsb3dlZEJ5RW1wdHlMaW5lKG5vZGUsIG9wdGlvbnMub3JpZ2luYWxUZXh0KSAmJiBpc0ZvbGxvd2VkQnlOb2RlKG5vZGUpXG4gICAgICA/IGJ1aWxkZXJzLnNvZnRsaW5lXG4gICAgICA6IFwiXCI7XG5cbiAgY29uc3QgcmVzdWx0OiBidWlsZGVycy5Eb2NbXSA9IFtcbiAgICBwcmludFN0YXRlbWVudChub2RlLnN0YXRlbWVudCwgb3B0aW9ucy5nb1RlbXBsYXRlQnJhY2tldFNwYWNpbmcsIHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0RGVsaW1pdGVyLFxuICAgICAgZW5kOiBub2RlLmVuZERlbGltaXRlcixcbiAgICB9KSxcbiAgXTtcblxuICByZXR1cm4gYnVpbGRlcnMuZ3JvdXAoYnVpbGRlcnMuY29uY2F0KFsuLi5yZXN1bHQsIGVtcHR5TGluZV0pLCB7XG4gICAgc2hvdWxkQnJlYWs6IGhhc05vZGVMaW5lYnJlYWsobm9kZSwgb3B0aW9ucy5vcmlnaW5hbFRleHQpICYmICFpc0Jsb2NrTm9kZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzQmxvY2tFbmQobm9kZTogR29JbmxpbmUpIHtcbiAgY29uc3QgeyBwYXJlbnQgfSA9IGdldEZpcnN0QmxvY2tQYXJlbnQobm9kZSk7XG4gIHJldHVybiBpc0Jsb2NrKHBhcmVudCkgJiYgcGFyZW50LmVuZCA9PT0gbm9kZTtcbn1cblxuZnVuY3Rpb24gaXNCbG9ja1N0YXJ0KG5vZGU6IEdvSW5saW5lKSB7XG4gIGNvbnN0IHsgcGFyZW50IH0gPSBnZXRGaXJzdEJsb2NrUGFyZW50KG5vZGUpO1xuICByZXR1cm4gaXNCbG9jayhwYXJlbnQpICYmIHBhcmVudC5zdGFydCA9PT0gbm9kZTtcbn1cblxuZnVuY3Rpb24gcHJpbnRTdGF0ZW1lbnQoXG4gIHN0YXRlbWVudDogc3RyaW5nLFxuICBhZGRTcGFjZXM6IGJvb2xlYW4sXG4gIGRlbGltaXRlcjogeyBzdGFydDogR29JbmxpbmVTdGFydERlbGltaXRlcjsgZW5kOiBHb0lubGluZUVuZERlbGltaXRlciB9ID0ge1xuICAgIHN0YXJ0OiBcIlwiLFxuICAgIGVuZDogXCJcIixcbiAgfVxuKSB7XG4gIGNvbnN0IHNwYWNlID0gYWRkU3BhY2VzID8gXCIgXCIgOiBcIlwiO1xuICBjb25zdCBzaG91bGRCcmVhayA9IHN0YXRlbWVudC5pbmNsdWRlcyhcIlxcblwiKTtcblxuICBjb25zdCBjb250ZW50ID0gc2hvdWxkQnJlYWtcbiAgICA/IHN0YXRlbWVudFxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAubWFwKChsaW5lLCBfLCBhcnJheSkgPT5cbiAgICAgICAgICBhcnJheS5pbmRleE9mKGxpbmUpID09PSBhcnJheS5sZW5ndGggLSAxXG4gICAgICAgICAgICA/IGJ1aWxkZXJzLmNvbmNhdChbbGluZS50cmltKCksIGJ1aWxkZXJzLnNvZnRsaW5lXSlcbiAgICAgICAgICAgIDogYnVpbGRlcnMuaW5kZW50KGJ1aWxkZXJzLmNvbmNhdChbbGluZS50cmltKCksIGJ1aWxkZXJzLnNvZnRsaW5lXSkpXG4gICAgICAgIClcbiAgICA6IFtzdGF0ZW1lbnQudHJpbSgpXTtcblxuICByZXR1cm4gYnVpbGRlcnMuZ3JvdXAoXG4gICAgYnVpbGRlcnMuY29uY2F0KFtcbiAgICAgIFwie3tcIixcbiAgICAgIGRlbGltaXRlci5zdGFydCxcbiAgICAgIHNwYWNlLFxuICAgICAgLi4uY29udGVudCxcbiAgICAgIHNob3VsZEJyZWFrID8gXCJcIiA6IHNwYWNlLFxuICAgICAgZGVsaW1pdGVyLmVuZCxcbiAgICAgIFwifX1cIixcbiAgICBdKSxcbiAgICB7IHNob3VsZEJyZWFrIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzUHJldHRpZXJJZ25vcmVMaW5lKG5vZGU6IEdvTm9kZSkge1xuICBpZiAoaXNSb290KG5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgeyBwYXJlbnQsIGNoaWxkIH0gPSBnZXRGaXJzdEJsb2NrUGFyZW50KG5vZGUpO1xuXG4gIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBgKD86PCEtLXx7eykuKj9wcmV0dGllci1pZ25vcmUuKj8oPzotLT58fX0pXFxuLioke2NoaWxkLmlkfWBcbiAgKTtcblxuICByZXR1cm4gISFwYXJlbnQuYWxpYXNlZENvbnRlbnQubWF0Y2gocmVnZXgpO1xufVxuXG5mdW5jdGlvbiBpc1ByZXR0aWVySWdub3JlQmxvY2sobm9kZTogR29Ob2RlKSB7XG4gIHJldHVybiBpc0Jsb2NrKG5vZGUpICYmIG5vZGUua2V5d29yZCA9PT0gXCJwcmV0dGllci1pZ25vcmUtc3RhcnRcIjtcbn1cblxuZnVuY3Rpb24gaGFzTm9kZUxpbmVicmVhayhub2RlOiBHb0lubGluZSwgc291cmNlOiBzdHJpbmcpIHtcbiAgY29uc3Qgc3RhcnQgPSBub2RlLmluZGV4ICsgbm9kZS5sZW5ndGg7XG4gIGNvbnN0IGVuZCA9IHNvdXJjZS5pbmRleE9mKFwiXFxuXCIsIHN0YXJ0KTtcbiAgY29uc3Qgc3VmZml4ID0gc291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kKTtcblxuICByZXR1cm4gIXN1ZmZpeDtcbn1cblxuZnVuY3Rpb24gaXNGb2xsb3dlZEJ5RW1wdHlMaW5lKG5vZGU6IEdvSW5saW5lLCBzb3VyY2U6IHN0cmluZykge1xuICBjb25zdCBzdGFydCA9IG5vZGUuaW5kZXggKyBub2RlLmxlbmd0aDtcbiAgY29uc3QgZmlyc3RMaW5lQnJlYWsgPSBzb3VyY2UuaW5kZXhPZihcIlxcblwiLCBzdGFydCk7XG4gIGNvbnN0IHNlY29uZExpbmVCcmVhayA9IHNvdXJjZS5pbmRleE9mKFwiXFxuXCIsIGZpcnN0TGluZUJyZWFrICsgMSk7XG4gIGNvbnN0IGVtcHR5TGluZSA9IHNvdXJjZVxuICAgIC5zdWJzdHJpbmcoZmlyc3RMaW5lQnJlYWsgKyAxLCBzZWNvbmRMaW5lQnJlYWspXG4gICAgLnRyaW0oKTtcbiAgY29uc3QgaXNMYXN0Tm9kZSA9ICEhc291cmNlLnN1YnN0cmluZyhzdGFydCkubWF0Y2goL15cXHMqJC8pO1xuXG4gIHJldHVybiAoXG4gICAgZmlyc3RMaW5lQnJlYWsgIT09IC0xICYmIHNlY29uZExpbmVCcmVhayAhPT0gLTEgJiYgIWVtcHR5TGluZSAmJiAhaXNMYXN0Tm9kZVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRGaXJzdEJsb2NrUGFyZW50KG5vZGU6IEV4Y2x1ZGU8R29Ob2RlLCBHb1Jvb3Q+KToge1xuICBwYXJlbnQ6IEdvQmxvY2sgfCBHb1Jvb3Q7XG4gIGNoaWxkOiB0eXBlb2Ygbm9kZTtcbn0ge1xuICBsZXQgcHJldmlvdXMgPSBub2RlO1xuICBsZXQgY3VycmVudCA9IG5vZGUucGFyZW50O1xuXG4gIHdoaWxlICghaXNCbG9jayhjdXJyZW50KSAmJiAhaXNSb290KGN1cnJlbnQpKSB7XG4gICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2hpbGQ6IHByZXZpb3VzLFxuICAgIHBhcmVudDogY3VycmVudCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJpbnRVbmZvcm1hdHRhYmxlKFxuICBub2RlOiBHb1VuZm9ybWF0dGFibGUsXG4gIG9wdGlvbnM6IEV4dGVuZGVkUGFyc2VyT3B0aW9uc1xuKSB7XG4gIGNvbnN0IHN0YXJ0ID0gb3B0aW9ucy5vcmlnaW5hbFRleHQubGFzdEluZGV4T2YoXCJcXG5cIiwgbm9kZS5pbmRleCAtIDEpO1xuICBjb25zdCBsaW5lID0gb3B0aW9ucy5vcmlnaW5hbFRleHQuc3Vic3RyaW5nKHN0YXJ0LCBub2RlLmluZGV4ICsgbm9kZS5sZW5ndGgpO1xuICBjb25zdCBsaW5lV2l0aG91dEFkZGl0aW9uYWxDb250ZW50ID1cbiAgICBsaW5lLnJlcGxhY2Uobm9kZS5jb250ZW50LCBcIlwiKS5tYXRjaCgvXFxzKiQvKT8uWzBdID8/IFwiXCI7XG5cbiAgcmV0dXJuIHByaW50UGxhaW5CbG9jayhsaW5lV2l0aG91dEFkZGl0aW9uYWxDb250ZW50ICsgbm9kZS5jb250ZW50LCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHByaW50UGxhaW5CbG9jayh0ZXh0OiBzdHJpbmcsIGhhcmRsaW5lcyA9IHRydWUpOiBidWlsZGVycy5Eb2Mge1xuICBjb25zdCBpc1RleHRFbXB0eSA9IChpbnB1dDogc3RyaW5nKSA9PiAhIWlucHV0Lm1hdGNoKC9eXFxzKiQvKTtcblxuICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG5cbiAgY29uc3Qgc2VnbWVudHMgPSBsaW5lcy5maWx0ZXIoXG4gICAgKHZhbHVlLCBpKSA9PiAhKGkgPT0gMCB8fCBpID09IGxpbmVzLmxlbmd0aCAtIDEpIHx8ICFpc1RleHRFbXB0eSh2YWx1ZSlcbiAgKTtcblxuICByZXR1cm4gYnVpbGRlcnMuY29uY2F0KFtcbiAgICAuLi5zZWdtZW50cy5tYXAoKGNvbnRlbnQsIGkpID0+XG4gICAgICBidWlsZGVycy5jb25jYXQoW1xuICAgICAgICBoYXJkbGluZXMgfHwgaSA/IGJ1aWxkZXJzLmhhcmRsaW5lIDogXCJcIixcbiAgICAgICAgYnVpbGRlcnMudHJpbSxcbiAgICAgICAgY29udGVudCxcbiAgICAgIF0pXG4gICAgKSxcbiAgICBoYXJkbGluZXMgPyBidWlsZGVycy5oYXJkbGluZSA6IFwiXCIsXG4gIF0pO1xufVxuIl19
|