@tricoteuses/arbre-de-la-loi
Version:
Generate ASTs from the French bills & laws; manipulate & export them to Markdown, etc.
370 lines (289 loc) • 35.6 kB
JavaScript
;
require("core-js/modules/es.array.slice.js");
require("core-js/modules/es.function.name.js");
require("core-js/modules/es.array.from.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/es.symbol.js");
require("core-js/modules/es.symbol.description.js");
require("core-js/modules/es.symbol.iterator.js");
require("core-js/modules/es.array.is-array.js");
require("core-js/modules/es.object.define-property.js");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.parseTexteMarkdown = parseTexteMarkdown;
exports.restructureTexteMarkdown = restructureTexteMarkdown;
exports.stringifyTree = stringifyTree;
exports.NodeType = void 0;
require("core-js/modules/es.string.replace.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.string.split.js");
require("core-js/modules/es.string.trim.js");
require("core-js/modules/es.array.includes.js");
require("core-js/modules/es.string.includes.js");
require("core-js/modules/es.string.match.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/web.dom-collections.iterator.js");
require("core-js/modules/es.array.join.js");
require("core-js/modules/es.array.map.js");
require("core-js/modules/es.array.filter.js");
require("core-js/modules/es.string.trim-end.js");
require("core-js/modules/es.array.concat.js");
require("core-js/modules/es.string.repeat.js");
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
var NodeType;
exports.NodeType = NodeType;
(function (NodeType) {
NodeType[NodeType["TEXTE"] = 0] = "TEXTE";
NodeType[NodeType["TOME"] = 1] = "TOME";
NodeType[NodeType["PARTIE"] = 2] = "PARTIE";
NodeType[NodeType["LIVRE"] = 3] = "LIVRE";
NodeType[NodeType["TITRE"] = 4] = "TITRE";
NodeType[NodeType["SOUS_TITRE"] = 5] = "SOUS_TITRE";
NodeType[NodeType["CHAPITRE"] = 6] = "CHAPITRE";
NodeType[NodeType["SECTION"] = 7] = "SECTION";
NodeType[NodeType["SOUS_SECTION"] = 8] = "SOUS_SECTION";
NodeType[NodeType["ARTICLE"] = 9] = "ARTICLE";
NodeType[NodeType["ANNEXE"] = 10] = "ANNEXE";
NodeType[NodeType["ETAT"] = 11] = "ETAT";
NodeType[NodeType["EXPOSE_DES_MOTIFS"] = 12] = "EXPOSE_DES_MOTIFS";
NodeType[NodeType["AUTRE"] = 13] = "AUTRE";
})(NodeType || (exports.NodeType = NodeType = {}));
function headerFromLine(line) {
var header = line // Remove bold (generated by Turndown) from header.
.replace(/^\*\*(.+)\*\*$/, "$1");
return header;
}
function parseTexteMarkdown(markdown, texteHeaders) {
var rootNodes = [{
headers: ["Autre"],
type: NodeType.AUTRE
}];
var breadcrumb = [rootNodes[0]];
var _iterator = _createForOfIteratorHelper(markdown.split("\n")),
_step;
try {
linesLoop: for (_iterator.s(); !(_step = _iterator.n()).done;) {
var line = _step.value;
var currentRootNode = rootNodes[rootNodes.length - 1];
var lineSimplified = line.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\*\*/g, "") // Remove Markdown bold (added by Turndown).
.replace(/\(nouveau\)/, "").replace(/\(Pour coordination\)/, "").replace(/\(Supprimés?\)/, "").replace(/ /g, " ").replace(/[\-,.…]/g, "").trim().replace(/ {1,}/g, "_").toUpperCase();
var _iterator2 = _createForOfIteratorHelper([// "Exposé des motifs" without content:
// * http://www.assemblee-nationale.fr/15/textes/0702.asp
// "Exposé des motifs" with content:
// * http://www.assemblee-nationale.fr/15/textes/1326.asp
// * http://www.assemblee-nationale.fr/15/textes/1610.asp
[/^EXPOSE_DES_MOTIFS$/, NodeType.EXPOSE_DES_MOTIFS], // "Projet de loi" ou "Proposition de loi":
// * http://www.assemblee-nationale.fr/15/textes/0232.asp
// * http://www.assemblee-nationale.fr/15/textes/0626.asp
// * http://www.assemblee-nationale.fr/15/textes/0676.asp
[/^(PROJET|PROPOSITION)_DE_LOI(_|$)/, NodeType.TEXTE], [/^TEXTE_(DE_LA_PROPOSITION|DU_PROJET)_DE_LOI(_|$)/, NodeType.TEXTE]]),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var _step2$value = _slicedToArray(_step2.value, 2),
_regExp2 = _step2$value[0],
_headingType2 = _step2$value[1];
if (lineSimplified.match(_regExp2) !== null) {
currentRootNode = {
headers: [headerFromLine(line)],
type: _headingType2
};
rootNodes.push(currentRootNode);
breadcrumb[0] = currentRootNode;
breadcrumb.length = 1;
continue linesLoop;
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
if ([NodeType.AUTRE, NodeType.TEXTE].includes(currentRootNode.type)) {
var _iterator3 = _createForOfIteratorHelper([[/^ARTICLES?_/, NodeType.ARTICLE], [/^CHAPITRE_/, NodeType.CHAPITRE], [/^LIVRE_/, NodeType.LIVRE], [/^PARTIE_/, NodeType.PARTIE], [/^(PREMIERE|SECONDE|DEUXIEME|TROISIEME|QUATRIEME)_PARTIE(_|$)/, NodeType.PARTIE], [/^SECTION_/, NodeType.SECTION], [/^SOUSSECTION_/, NodeType.SOUS_SECTION], [/^SOUSTITRE_/, NodeType.SOUS_TITRE], [/^TITRE_/, NodeType.TITRE], [/^TOME_/, NodeType.TOME]]),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var _step3$value = _slicedToArray(_step3.value, 2),
_regExp = _step3$value[0],
_headingType = _step3$value[1];
if (lineSimplified.match(_regExp) !== null) {
var _node3 = {
headers: [headerFromLine(line)],
type: _headingType
};
if (currentRootNode.type !== NodeType.TEXTE) {
currentRootNode = {
headers: texteHeaders,
type: NodeType.TEXTE
};
rootNodes.push(currentRootNode);
breadcrumb[0] = currentRootNode;
breadcrumb.length = 1;
} // Try to retrieve a node of the same type in breadcrumb and
// append new node to it.
var _iterator5 = _createForOfIteratorHelper(breadcrumb.entries()),
_step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
var _step5$value = _slicedToArray(_step5.value, 2),
depth = _step5$value[0],
breadcrumbNode = _step5$value[1];
if (breadcrumbNode.type === _headingType) {
breadcrumb[depth - 1].children.push(_node3);
breadcrumb[depth] = _node3;
breadcrumb.length = depth + 1;
continue linesLoop;
}
} // Create a new level in breadcrumb for the new node
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
var parentNode = breadcrumb[breadcrumb.length - 1];
console.assert(parentNode.children === undefined);
parentNode.children = [_node3];
breadcrumb.push(_node3);
continue linesLoop;
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
if (currentRootNode.type === NodeType.TEXTE) {
var _iterator4 = _createForOfIteratorHelper([[/^ETAT_/, NodeType.ETAT], [/^(RAPPORT_)?ANNEXE(_|$)/, NodeType.ANNEXE]]),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var _step4$value = _slicedToArray(_step4.value, 2),
regExp = _step4$value[0],
headingType = _step4$value[1];
if (lineSimplified.match(regExp) !== null) {
var _node2 = {
headers: [headerFromLine(line)],
type: headingType
};
if (currentRootNode.children === undefined) {
currentRootNode.children = [_node2];
console.assert(breadcrumb.length === 1);
breadcrumb.push(_node2);
} else {
currentRootNode.children.push(_node2);
console.assert(breadcrumb.length >= 2);
breadcrumb[1] = _node2;
breadcrumb.length = 2;
}
continue linesLoop;
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
var _node = breadcrumb[breadcrumb.length - 1];
if (_node.alineas === undefined && _node.headers.length === 1 && ![NodeType.ARTICLE, NodeType.EXPOSE_DES_MOTIFS].includes(_node.type)) {
if (line.trim()) {
// Second title of node
_node.headers.push(headerFromLine(line));
}
continue linesLoop;
}
if (_node.alineas === undefined) {
_node.alineas = [];
} // Remove (optional) "pastille" (aka alinea number) from alinea.
var alinea = line.replace(/^\(\d+\)\s*/, "");
_node.alineas.push(alinea);
continue linesLoop;
}
} // The currentRootNode is not of type TEXTE.
var node = breadcrumb[breadcrumb.length - 1];
if (node.alineas === undefined) {
node.alineas = [];
}
node.alineas.push(line);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
} // console.log(JSON.stringify(rootNodes, null, 2))
return rootNodes;
}
function restructureTexteMarkdown(markdown, texteHeaders) {
markdown = markdown // Replace non-breaking Hyphen with normal hyphen.
.replace(/\u2011/g, "-");
markdown = parseTexteMarkdown(markdown, texteHeaders).filter(function (node) {
return node.type === NodeType.TEXTE;
}).map(function (node) {
return stringifyTree(node);
}).join("\n\n") // Replace multiple spaces with a single space.
.replace(/ {2,}/g, " ") // Replace sequences of more than 2 \n with exactly 2 \n.
.replace(/\n{3,}/g, "\n\n") // Remove leading line breaks.
.replace(/^\n+/, "") // Remove trailing line breaks.
.replace(/\n{2,}$/, "");
return markdown;
}
function stringifyNodeToLines(node, depth, lines) {
var _iterator6 = _createForOfIteratorHelper(node.headers),
_step6;
try {
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
var header = _step6.value;
if (lines.length > 0 && lines[lines.length - 1] !== "") {
lines.push("");
}
lines.push("".concat("#".repeat(depth + 1), " ").concat(header.trim()));
lines.push("");
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
if (node.alineas !== undefined) {
var _iterator7 = _createForOfIteratorHelper(node.alineas),
_step7;
try {
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
var alinea = _step7.value;
lines.push(alinea.trimRight());
}
} catch (err) {
_iterator7.e(err);
} finally {
_iterator7.f();
}
}
if (node.children !== undefined) {
var _iterator8 = _createForOfIteratorHelper(node.children),
_step8;
try {
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
var child = _step8.value;
stringifyNodeToLines(child, depth + 1, lines);
}
} catch (err) {
_iterator8.e(err);
} finally {
_iterator8.f();
}
}
}
function stringifyTree(node) {
var lines = [];
stringifyNodeToLines(node, 0, lines);
return lines.join("\n");
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXh0ZXMudHMiXSwibmFtZXMiOlsiTm9kZVR5cGUiLCJoZWFkZXJGcm9tTGluZSIsImxpbmUiLCJoZWFkZXIiLCJyZXBsYWNlIiwicGFyc2VUZXh0ZU1hcmtkb3duIiwibWFya2Rvd24iLCJ0ZXh0ZUhlYWRlcnMiLCJyb290Tm9kZXMiLCJoZWFkZXJzIiwidHlwZSIsIkFVVFJFIiwiYnJlYWRjcnVtYiIsInNwbGl0IiwibGluZXNMb29wIiwiY3VycmVudFJvb3ROb2RlIiwibGVuZ3RoIiwibGluZVNpbXBsaWZpZWQiLCJub3JtYWxpemUiLCJ0cmltIiwidG9VcHBlckNhc2UiLCJFWFBPU0VfREVTX01PVElGUyIsIlRFWFRFIiwicmVnRXhwIiwiaGVhZGluZ1R5cGUiLCJtYXRjaCIsInB1c2giLCJpbmNsdWRlcyIsIkFSVElDTEUiLCJDSEFQSVRSRSIsIkxJVlJFIiwiUEFSVElFIiwiU0VDVElPTiIsIlNPVVNfU0VDVElPTiIsIlNPVVNfVElUUkUiLCJUSVRSRSIsIlRPTUUiLCJub2RlIiwiZW50cmllcyIsImRlcHRoIiwiYnJlYWRjcnVtYk5vZGUiLCJjaGlsZHJlbiIsInBhcmVudE5vZGUiLCJjb25zb2xlIiwiYXNzZXJ0IiwidW5kZWZpbmVkIiwiRVRBVCIsIkFOTkVYRSIsImFsaW5lYXMiLCJhbGluZWEiLCJyZXN0cnVjdHVyZVRleHRlTWFya2Rvd24iLCJmaWx0ZXIiLCJtYXAiLCJzdHJpbmdpZnlUcmVlIiwiam9pbiIsInN0cmluZ2lmeU5vZGVUb0xpbmVzIiwibGluZXMiLCJyZXBlYXQiLCJ0cmltUmlnaHQiLCJjaGlsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFPWUEsUTs7O1dBQUFBLFE7QUFBQUEsRUFBQUEsUSxDQUFBQSxRO0FBQUFBLEVBQUFBLFEsQ0FBQUEsUTtBQUFBQSxFQUFBQSxRLENBQUFBLFE7QUFB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YWNlIE5vZGUge1xuICBhbGluZWFzPzogc3RyaW5nW11cbiAgY2hpbGRyZW4/OiBOb2RlW11cbiAgaGVhZGVyczogc3RyaW5nW11cbiAgdHlwZTogTm9kZVR5cGVcbn1cblxuZXhwb3J0IGVudW0gTm9kZVR5cGUge1xuICBURVhURSxcbiAgVE9NRSxcbiAgUEFSVElFLFxuICBMSVZSRSxcbiAgVElUUkUsXG4gIFNPVVNfVElUUkUsXG4gIENIQVBJVFJFLFxuICBTRUNUSU9OLFxuICBTT1VTX1NFQ1RJT04sXG4gIEFSVElDTEUsXG4gIC8vIE5vZGVzIHRoYXQgYXJlIGFsd2F5cyBkaXJlY3QgY2hpbGRyZW4gb2YgXCJURVhURVwiOlxuICBBTk5FWEUsXG4gIEVUQVQsXG4gIC8vIE5vZGVzIHRoYXQgYXJlIGFsd2F5cyByb290IG5vZGVzOlxuICBFWFBPU0VfREVTX01PVElGUyxcbiAgQVVUUkUsXG59XG5cbmZ1bmN0aW9uIGhlYWRlckZyb21MaW5lKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhlYWRlciA9IGxpbmVcbiAgICAvLyBSZW1vdmUgYm9sZCAoZ2VuZXJhdGVkIGJ5IFR1cm5kb3duKSBmcm9tIGhlYWRlci5cbiAgICAucmVwbGFjZSgvXlxcKlxcKiguKylcXCpcXCokLywgXCIkMVwiKVxuICByZXR1cm4gaGVhZGVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRleHRlTWFya2Rvd24obWFya2Rvd246IHN0cmluZywgdGV4dGVIZWFkZXJzOiBzdHJpbmdbXSk6IE5vZGVbXSB7XG4gIGNvbnN0IHJvb3ROb2RlczogTm9kZVtdID0gW1xuICAgIHtcbiAgICAgIGhlYWRlcnM6IFtcIkF1dHJlXCJdLFxuICAgICAgdHlwZTogTm9kZVR5cGUuQVVUUkUsXG4gICAgfSxcbiAgXVxuICBjb25zdCBicmVhZGNydW1iOiBOb2RlW10gPSBbcm9vdE5vZGVzWzBdXVxuICBsaW5lc0xvb3A6IGZvciAoY29uc3QgbGluZSBvZiBtYXJrZG93bi5zcGxpdChcIlxcblwiKSkge1xuICAgIGxldCBjdXJyZW50Um9vdE5vZGUgPSByb290Tm9kZXNbcm9vdE5vZGVzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgbGluZVNpbXBsaWZpZWQgPSBsaW5lXG4gICAgICAubm9ybWFsaXplKFwiTkZEXCIpXG4gICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9cXCpcXCovZywgXCJcIikgLy8gUmVtb3ZlIE1hcmtkb3duIGJvbGQgKGFkZGVkIGJ5IFR1cm5kb3duKS5cbiAgICAgIC5yZXBsYWNlKC9cXChub3V2ZWF1XFwpLywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9cXChQb3VyIGNvb3JkaW5hdGlvblxcKS8sIFwiXCIpXG4gICAgICAucmVwbGFjZSgvXFwoU3VwcHJpbcOpcz9cXCkvLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL8KgL2csIFwiIFwiKVxuICAgICAgLnJlcGxhY2UoL1tcXC0sLuKApl0vZywgXCJcIilcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC8gezEsfS9nLCBcIl9cIilcbiAgICAgIC50b1VwcGVyQ2FzZSgpXG5cbiAgICBmb3IgKGNvbnN0IFtyZWdFeHAsIGhlYWRpbmdUeXBlXSBvZiBbXG4gICAgICAvLyBcIkV4cG9zw6kgZGVzIG1vdGlmc1wiIHdpdGhvdXQgY29udGVudDpcbiAgICAgIC8vICogaHR0cDovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLzE1L3RleHRlcy8wNzAyLmFzcFxuICAgICAgLy8gXCJFeHBvc8OpIGRlcyBtb3RpZnNcIiB3aXRoIGNvbnRlbnQ6XG4gICAgICAvLyAqIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMTMyNi5hc3BcbiAgICAgIC8vICogaHR0cDovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLzE1L3RleHRlcy8xNjEwLmFzcFxuICAgICAgWy9eRVhQT1NFX0RFU19NT1RJRlMkLywgTm9kZVR5cGUuRVhQT1NFX0RFU19NT1RJRlNdLFxuICAgICAgLy8gXCJQcm9qZXQgZGUgbG9pXCIgb3UgXCJQcm9wb3NpdGlvbiBkZSBsb2lcIjpcbiAgICAgIC8vICogaHR0cDovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLzE1L3RleHRlcy8wMjMyLmFzcFxuICAgICAgLy8gKiBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvMTUvdGV4dGVzLzA2MjYuYXNwXG4gICAgICAvLyAqIGh0dHA6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci8xNS90ZXh0ZXMvMDY3Ni5hc3BcbiAgICAgIFsvXihQUk9KRVR8UFJPUE9TSVRJT04pX0RFX0xPSShffCQpLywgTm9kZVR5cGUuVEVYVEVdLFxuICAgICAgWy9eVEVYVEVfKERFX0xBX1BST1BPU0lUSU9OfERVX1BST0pFVClfREVfTE9JKF98JCkvLCBOb2RlVHlwZS5URVhURV0sXG4gICAgXSBhcyBbUmVnRXhwLCBOb2RlVHlwZV1bXSkge1xuICAgICAgaWYgKGxpbmVTaW1wbGlmaWVkLm1hdGNoKHJlZ0V4cCkgIT09IG51bGwpIHtcbiAgICAgICAgY3VycmVudFJvb3ROb2RlID0ge1xuICAgICAgICAgIGhlYWRlcnM6IFtoZWFkZXJGcm9tTGluZShsaW5lKV0sXG4gICAgICAgICAgdHlwZTogaGVhZGluZ1R5cGUsXG4gICAgICAgIH1cbiAgICAgICAgcm9vdE5vZGVzLnB1c2goY3VycmVudFJvb3ROb2RlKVxuICAgICAgICBicmVhZGNydW1iWzBdID0gY3VycmVudFJvb3ROb2RlXG4gICAgICAgIGJyZWFkY3J1bWIubGVuZ3RoID0gMVxuICAgICAgICBjb250aW51ZSBsaW5lc0xvb3BcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoW05vZGVUeXBlLkFVVFJFLCBOb2RlVHlwZS5URVhURV0uaW5jbHVkZXMoY3VycmVudFJvb3ROb2RlLnR5cGUpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtyZWdFeHAsIGhlYWRpbmdUeXBlXSBvZiBbXG4gICAgICAgIFsvXkFSVElDTEVTP18vLCBOb2RlVHlwZS5BUlRJQ0xFXSxcbiAgICAgICAgWy9eQ0hBUElUUkVfLywgTm9kZVR5cGUuQ0hBUElUUkVdLFxuICAgICAgICBbL15MSVZSRV8vLCBOb2RlVHlwZS5MSVZSRV0sXG4gICAgICAgIFsvXlBBUlRJRV8vLCBOb2RlVHlwZS5QQVJUSUVdLFxuICAgICAgICBbL14oUFJFTUlFUkV8U0VDT05ERXxERVVYSUVNRXxUUk9JU0lFTUV8UVVBVFJJRU1FKV9QQVJUSUUoX3wkKS8sIE5vZGVUeXBlLlBBUlRJRV0sXG4gICAgICAgIFsvXlNFQ1RJT05fLywgTm9kZVR5cGUuU0VDVElPTl0sXG4gICAgICAgIFsvXlNPVVNTRUNUSU9OXy8sIE5vZGVUeXBlLlNPVVNfU0VDVElPTl0sXG4gICAgICAgIFsvXlNPVVNUSVRSRV8vLCBOb2RlVHlwZS5TT1VTX1RJVFJFXSxcbiAgICAgICAgWy9eVElUUkVfLywgTm9kZVR5cGUuVElUUkVdLFxuICAgICAgICBbL15UT01FXy8sIE5vZGVUeXBlLlRPTUVdLFxuICAgICAgXSBhcyBbUmVnRXhwLCBOb2RlVHlwZV1bXSkge1xuICAgICAgICBpZiAobGluZVNpbXBsaWZpZWQubWF0Y2gocmVnRXhwKSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSB7XG4gICAgICAgICAgICBoZWFkZXJzOiBbaGVhZGVyRnJvbUxpbmUobGluZSldLFxuICAgICAgICAgICAgdHlwZTogaGVhZGluZ1R5cGUsXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50Um9vdE5vZGUudHlwZSAhPT0gTm9kZVR5cGUuVEVYVEUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSb290Tm9kZSA9IHtcbiAgICAgICAgICAgICAgaGVhZGVyczogdGV4dGVIZWFkZXJzLFxuICAgICAgICAgICAgICB0eXBlOiBOb2RlVHlwZS5URVhURSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvb3ROb2Rlcy5wdXNoKGN1cnJlbnRSb290Tm9kZSlcbiAgICAgICAgICAgIGJyZWFkY3J1bWJbMF0gPSBjdXJyZW50Um9vdE5vZGVcbiAgICAgICAgICAgIGJyZWFkY3J1bWIubGVuZ3RoID0gMVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRyeSB0byByZXRyaWV2ZSBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSBpbiBicmVhZGNydW1iIGFuZFxuICAgICAgICAgIC8vIGFwcGVuZCBuZXcgbm9kZSB0byBpdC5cbiAgICAgICAgICBmb3IgKGNvbnN0IFtkZXB0aCwgYnJlYWRjcnVtYk5vZGVdIG9mIGJyZWFkY3J1bWIuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoYnJlYWRjcnVtYk5vZGUudHlwZSA9PT0gaGVhZGluZ1R5cGUpIHtcbiAgICAgICAgICAgICAgYnJlYWRjcnVtYltkZXB0aCAtIDFdLmNoaWxkcmVuIS5wdXNoKG5vZGUpXG4gICAgICAgICAgICAgIGJyZWFkY3J1bWJbZGVwdGhdID0gbm9kZVxuICAgICAgICAgICAgICBicmVhZGNydW1iLmxlbmd0aCA9IGRlcHRoICsgMVxuICAgICAgICAgICAgICBjb250aW51ZSBsaW5lc0xvb3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGxldmVsIGluIGJyZWFkY3J1bWIgZm9yIHRoZSBuZXcgbm9kZVxuICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBicmVhZGNydW1iW2JyZWFkY3J1bWIubGVuZ3RoIC0gMV1cbiAgICAgICAgICBjb25zb2xlLmFzc2VydChwYXJlbnROb2RlLmNoaWxkcmVuID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbiA9IFtub2RlXVxuICAgICAgICAgIGJyZWFkY3J1bWIucHVzaChub2RlKVxuICAgICAgICAgIGNvbnRpbnVlIGxpbmVzTG9vcFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50Um9vdE5vZGUudHlwZSA9PT0gTm9kZVR5cGUuVEVYVEUpIHtcbiAgICAgICAgZm9yIChjb25zdCBbcmVnRXhwLCBoZWFkaW5nVHlwZV0gb2YgW1xuICAgICAgICAgIFsvXkVUQVRfLywgTm9kZVR5cGUuRVRBVF0sXG4gICAgICAgICAgWy9eKFJBUFBPUlRfKT9BTk5FWEUoX3wkKS8sIE5vZGVUeXBlLkFOTkVYRV0sXG4gICAgICAgIF0gYXMgW1JlZ0V4cCwgTm9kZVR5cGVdW10pIHtcbiAgICAgICAgICBpZiAobGluZVNpbXBsaWZpZWQubWF0Y2gocmVnRXhwKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHtcbiAgICAgICAgICAgICAgaGVhZGVyczogW2hlYWRlckZyb21MaW5lKGxpbmUpXSxcbiAgICAgICAgICAgICAgdHlwZTogaGVhZGluZ1R5cGUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudFJvb3ROb2RlLmNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY3VycmVudFJvb3ROb2RlLmNoaWxkcmVuID0gW25vZGVdXG4gICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGJyZWFkY3J1bWIubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgICBicmVhZGNydW1iLnB1c2gobm9kZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRSb290Tm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpXG4gICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGJyZWFkY3J1bWIubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgIGJyZWFkY3J1bWJbMV0gPSBub2RlXG4gICAgICAgICAgICAgIGJyZWFkY3J1bWIubGVuZ3RoID0gMlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWUgbGluZXNMb29wXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IGJyZWFkY3J1bWJbYnJlYWRjcnVtYi5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9kZS5hbGluZWFzID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBub2RlLmhlYWRlcnMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgIVtOb2RlVHlwZS5BUlRJQ0xFLCBOb2RlVHlwZS5FWFBPU0VfREVTX01PVElGU10uaW5jbHVkZXMobm9kZS50eXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIC8vIFNlY29uZCB0aXRsZSBvZiBub2RlXG4gICAgICAgICAgICBub2RlLmhlYWRlcnMucHVzaChoZWFkZXJGcm9tTGluZShsaW5lKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWUgbGluZXNMb29wXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5hbGluZWFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBub2RlLmFsaW5lYXMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSAob3B0aW9uYWwpIFwicGFzdGlsbGVcIiAoYWthIGFsaW5lYSBudW1iZXIpIGZyb20gYWxpbmVhLlxuICAgICAgICBjb25zdCBhbGluZWEgPSBsaW5lLnJlcGxhY2UoL15cXChcXGQrXFwpXFxzKi8sIFwiXCIpXG4gICAgICAgIG5vZGUuYWxpbmVhcy5wdXNoKGFsaW5lYSlcblxuICAgICAgICBjb250aW51ZSBsaW5lc0xvb3BcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY3VycmVudFJvb3ROb2RlIGlzIG5vdCBvZiB0eXBlIFRFWFRFLlxuICAgIGNvbnN0IG5vZGUgPSBicmVhZGNydW1iW2JyZWFkY3J1bWIubGVuZ3RoIC0gMV1cbiAgICBpZiAobm9kZS5hbGluZWFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5vZGUuYWxpbmVhcyA9IFtdXG4gICAgfVxuICAgIG5vZGUuYWxpbmVhcy5wdXNoKGxpbmUpXG4gIH1cblxuICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyb290Tm9kZXMsIG51bGwsIDIpKVxuICByZXR1cm4gcm9vdE5vZGVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN0cnVjdHVyZVRleHRlTWFya2Rvd24oXG4gIG1hcmtkb3duOiBzdHJpbmcsXG4gIHRleHRlSGVhZGVyczogc3RyaW5nW10sXG4pOiBzdHJpbmcge1xuICBtYXJrZG93biA9IG1hcmtkb3duXG4gICAgLy8gUmVwbGFjZSBub24tYnJlYWtpbmcgSHlwaGVuIHdpdGggbm9ybWFsIGh5cGhlbi5cbiAgICAucmVwbGFjZSgvXFx1ezIwMTF9L2d1LCBcIi1cIilcbiAgbWFya2Rvd24gPSBwYXJzZVRleHRlTWFya2Rvd24obWFya2Rvd24sIHRleHRlSGVhZGVycylcbiAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBOb2RlVHlwZS5URVhURSlcbiAgICAubWFwKG5vZGUgPT4gc3RyaW5naWZ5VHJlZShub2RlKSlcbiAgICAuam9pbihcIlxcblxcblwiKVxuICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2UuXG4gICAgLnJlcGxhY2UoLyB7Mix9L2csIFwiIFwiKVxuICAgIC8vIFJlcGxhY2Ugc2VxdWVuY2VzIG9mIG1vcmUgdGhhbiAyIFxcbiB3aXRoIGV4YWN0bHkgMiBcXG4uXG4gICAgLnJlcGxhY2UoL1xcbnszLH0vZywgXCJcXG5cXG5cIilcbiAgICAvLyBSZW1vdmUgbGVhZGluZyBsaW5lIGJyZWFrcy5cbiAgICAucmVwbGFjZSgvXlxcbisvLCBcIlwiKVxuICAgIC8vIFJlbW92ZSB0cmFpbGluZyBsaW5lIGJyZWFrcy5cbiAgICAucmVwbGFjZSgvXFxuezIsfSQvLCBcIlwiKVxuICByZXR1cm4gbWFya2Rvd25cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5Tm9kZVRvTGluZXMobm9kZTogTm9kZSwgZGVwdGg6IG51bWJlciwgbGluZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaGVhZGVyIG9mIG5vZGUuaGVhZGVycykge1xuICAgIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdICE9PSBcIlwiKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiXCIpXG4gICAgfVxuICAgIGxpbmVzLnB1c2goYCR7XCIjXCIucmVwZWF0KGRlcHRoICsgMSl9ICR7aGVhZGVyLnRyaW0oKX1gKVxuICAgIGxpbmVzLnB1c2goXCJcIilcbiAgfVxuICBpZiAobm9kZS5hbGluZWFzICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IGFsaW5lYSBvZiBub2RlLmFsaW5lYXMpIHtcbiAgICAgIGxpbmVzLnB1c2goYWxpbmVhLnRyaW1SaWdodCgpKVxuICAgIH1cbiAgfVxuICBpZiAobm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBzdHJpbmdpZnlOb2RlVG9MaW5lcyhjaGlsZCwgZGVwdGggKyAxLCBsaW5lcylcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVRyZWUobm9kZTogTm9kZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG4gIHN0cmluZ2lmeU5vZGVUb0xpbmVzKG5vZGUsIDAsIGxpbmVzKVxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuIl19