@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
655 lines (651 loc) • 94.8 kB
JavaScript
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
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.symbol.to-primitive.js");
require("core-js/modules/es.array.is-array.js");
require("core-js/modules/es.array.slice.js");
require("core-js/modules/es.date.to-primitive.js");
require("core-js/modules/es.date.to-string.js");
require("core-js/modules/es.function.bind.js");
require("core-js/modules/es.number.constructor.js");
require("core-js/modules/es.object.create.js");
require("core-js/modules/es.object.define-property.js");
require("core-js/modules/es.object.get-prototype-of.js");
require("core-js/modules/es.object.set-prototype-of.js");
require("core-js/modules/es.reflect.construct.js");
require("core-js/modules/es.array.concat.js");
require("core-js/modules/es.array.from.js");
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/es.array.join.js");
require("core-js/modules/es.array.map.js");
require("core-js/modules/es.function.name.js");
require("core-js/modules/es.map.js");
require("core-js/modules/es.object.assign.js");
require("core-js/modules/es.object.entries.js");
require("core-js/modules/es.object.keys.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.regexp.constructor.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.regexp.to-string.js");
require("core-js/modules/es.set.js");
require("core-js/modules/es.string.ends-with.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/es.string.match.js");
require("core-js/modules/es.string.replace.js");
require("core-js/modules/es.string.starts-with.js");
require("core-js/modules/web.dom-collections.iterator.js");
var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
var _commandLineUsage = _interopRequireDefault(require("command-line-usage"));
var _assert = _interopRequireDefault(require("assert"));
var _file_systems = require("../file_systems");
var _LectureMapping;
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function parseArgs(argv) {
var optionsDefinitions = [{
description: "pathname to a JSON file or a glob pattern to JSON files",
defaultOption: true,
multiple: true,
name: "data",
type: String
}, {
name: "no-sanity-checks",
type: Boolean,
description: "Do not perform sanity checks."
}, {
name: "verbose",
type: Boolean,
description: "increase verbosity"
}, {
name: "help",
description: "Print this usage guide."
}];
var sections = [{
header: "Aide à la documentation du dossier législatif",
content: "Génère une hiérarchie des actes législatifs"
}, {
header: "Options",
optionList: optionsDefinitions
}];
var options = (0, _commandLineArgs["default"])(optionsDefinitions, {
argv: argv
});
if (!("help" in options) && !("data" in options)) {
console.error("--data is mandatory");
options.help = true;
}
if ("help" in options) {
var usage = (0, _commandLineUsage["default"])(sections);
console.warn(usage);
return null;
}
return options;
}
function eqSet(as, bs) {
if (as.size !== bs.size) return false;
var _iterator = _createForOfIteratorHelper(as),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var a = _step.value;
if (!bs.has(a)) return false;
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return true;
}
var Code2Pattern = /*#__PURE__*/_createClass(function Code2Pattern(pattern, children) {
_classCallCheck(this, Code2Pattern);
_defineProperty(this, "_pattern_", void 0);
_defineProperty(this, "_match_count_", void 0);
this._pattern_ = pattern;
this._match_count_ = 0;
Object.assign(this, children);
});
var Code2PatternComFond = /*#__PURE__*/function (_Code2Pattern2) {
function Code2PatternComFond() {
_classCallCheck(this, Code2PatternComFond);
return _callSuper(this, Code2PatternComFond, ["^/SAISIE/(/NOMIN/)*(/REUNION/)*(/RAPPORT/)*$", {}]);
}
_inherits(Code2PatternComFond, _Code2Pattern2);
return _createClass(Code2PatternComFond);
}(Code2Pattern);
var LectureMapping = /*#__PURE__*/function () {
function LectureMapping() {
_classCallCheck(this, LectureMapping);
_defineProperty(this, "libelle", {});
_defineProperty(this, "codes", new Set());
}
return _createClass(LectureMapping, [{
key: "add",
value: function add(acte) {
this.codes.add(acte.codeActe);
var type = LectureMapping.getType(acte);
if (!(acte.libelleActe.nomCanonique in this.libelle)) this.libelle[acte.libelleActe.nomCanonique] = new Set();
this.libelle[acte.libelleActe.nomCanonique].add(type);
}
}, {
key: "remap",
value: function remap(acte, codeActe) {
acte.codeActe = codeActe;
var types = this.libelle[acte.libelleActe.nomCanonique];
if (!(types.has("SN") && types.has("AN"))) {
if (types.has("SN")) acte.libelleActe.nomCanonique += " (Sénat)";else if (types.has("AN")) acte.libelleActe.nomCanonique += " (Assemblée Nationale)";
}
}
}, {
key: "mergeCodes",
value: function mergeCodes(codes) {
for (var _i = 0, _Array$from = Array.from(this.codes); _i < _Array$from.length; _i++) {
var c = _Array$from[_i];
codes.add(c);
}
}
}, {
key: "printAnchors",
value: function printAnchors() {
for (var _i2 = 0, _Array$from2 = Array.from(this.codes); _i2 < _Array$from2.length; _i2++) {
var code = _Array$from2[_i2];
console.log(".. _".concat(code, ":"));
}
}
}, {
key: "getCodes",
value: function getCodes() {
return Array.from(this.codes).join(",");
}
}], [{
key: "isLecture",
value: function isLecture(acte) {
return acte.codeActe.match(LectureMapping.codes_lecture_regexp);
}
}, {
key: "getType",
value: function getType(acte) {
if (acte.codeActe.match(/^AN/)) return "AN";else if (acte.codeActe.match(/^SN/)) return "SN";else throw Error("".concat(acte.codeActe, " does not start with AN or SN"));
}
}, {
key: "map",
value: function map(codeActe) {
return codeActe.replace(LectureMapping.codes_lecture_regexp, "lecture$1");
}
}, {
key: "getCodeActe",
value: function getCodeActe(acte) {
if (!LectureMapping.isLecture(acte)) return;
return LectureMapping.map(acte.codeActe);
}
}]);
}();
_LectureMapping = LectureMapping;
_defineProperty(LectureMapping, "codes_lecture", ["AN1", "SN1", "ANNLEC", "SNNLEC", "ANLDEF", "AN2", "SN2", "SN3"]);
_defineProperty(LectureMapping, "codes_lecture_regexp", new RegExp("^(?:" + _LectureMapping.codes_lecture.join("|") + ")(-.*)?$"));
var LectureMapper = /*#__PURE__*/function () {
function LectureMapper() {
_classCallCheck(this, LectureMapper);
_defineProperty(this, "mapping", {});
}
return _createClass(LectureMapper, [{
key: "has",
value: function has(codeActe) {
return codeActe in this.mapping;
}
}, {
key: "collect",
value: function collect(acte) {
var codeActe = LectureMapping.getCodeActe(acte);
if (codeActe != undefined) {
var lectures = this.mapping;
if (!(codeActe in lectures)) lectures[codeActe] = new LectureMapping();
lectures[codeActe].add(acte);
}
}
}, {
key: "remap",
value: function remap(acte) {
var codeActe = LectureMapping.getCodeActe(acte);
if (codeActe != undefined) this.mapping[codeActe].remap(acte, codeActe);
}
}, {
key: "mergeCodes",
value: function mergeCodes(codes, codeActe) {
this.mapping[codeActe].mergeCodes(codes);
}
}, {
key: "printAnchors",
value: function printAnchors(codeActe) {
this.mapping[codeActe].printAnchors();
}
}, {
key: "getCodes",
value: function getCodes(codeActe) {
return this.mapping[codeActe].getCodes();
}
}]);
}();
var ActesDocumentation = /*#__PURE__*/function () {
function ActesDocumentation(sanityChecks) {
var verbose = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
_classCallCheck(this, ActesDocumentation);
_defineProperty(this, "verbose", void 0);
_defineProperty(this, "sanityChecks", void 0);
_defineProperty(this, "lectureMapper", new LectureMapper());
_defineProperty(this, "remappedProcedures", {});
_defineProperty(this, "anchorsPrinted", {});
_defineProperty(this, "anchors", new Set());
_defineProperty(this, "codes", {});
_defineProperty(this, "procedures", null);
_defineProperty(this, "code2pattern", new Code2Pattern(null, {
"Procédure législative": new Code2Pattern("^(((/lecture/)+)|((/lecture/)+/CMP/(/lecture/)*))(/CC/)?(/PROM/)?(/AN-APPLI/)?$", {
lecture: new Code2Pattern("^(/DEPOT/)?(/DPTLETTRECT/)?(/ETI/)?(/AVCE/)?(/DGVT/)?(/ACIN/)?(/MOTION/)*(/PROCACC/)?(/COM/)?((/DEBATS/)+)?(/RTRINI/)?$", {
"lecture-COM": new Code2Pattern("^(/FOND/|/AVIS/)+$", {
"lecture-COM-FOND": new Code2PatternComFond(),
"lecture-COM-AVIS": new Code2PatternComFond()
}),
"lecture-DEBATS": new Code2Pattern("^(/SEANCE/)*((/MOTION/)?(/MOTION-VOTE/)+)?(/DEC/)?$", {})
}),
CMP: new Code2Pattern("^(/DEPOT/|/SAISIE/){1,2}(/COM/)?(/DEC/)?(/DEBATS-AN//DEBATS-SN/)?", {
"CMP-COM": new Code2Pattern("^(/NOMIN/)?(/RAPPORT-AN/|/RAPPORT-SN/){2}$", {}),
"CMP-DEBATS-AN": new Code2Pattern("^(/SEANCE/)*(/DEC/)?$", {}),
"CMP-DEBATS-SN": new Code2Pattern("^(/SEANCE/)*(/DEC/)?$", {})
}),
CC: new Code2Pattern("^(/SAISIE/)+(/CONCLUSION/)?$", {}),
PROM: new Code2Pattern("^(/PUB/)?$", {}),
"AN-APPLI": new Code2Pattern("^(/RAPPORT/)?$", {})
}),
"Allocution du Président de l'Assemblée nationale": new Code2Pattern("^/AN21/$", {
AN21: new Code2Pattern("^(/APAN/)?$", {})
}),
"Résolution Article 34-1": new Code2Pattern("^(/ANLUNI/)?$", {
ANLUNI: new Code2Pattern("^(/DEPOT/)?(/DEBATS/)?(/RTRINI/)?$", {
"ANLUNI-DEBATS": new Code2Pattern("^(/SEANCE/)+(/DEC/)?$", {})
})
}),
Résolution: new Code2Pattern("^(/ANLUNI/)?(/CC/)?$", {
ANLUNI: new Code2Pattern("^(/DEPOT/)?(/COM/)?(/DEBATS/|/RTRINI/)?$", {
"ANLUNI-COM": new Code2Pattern("^(/CAE/)?(/FOND/)?$", {
"ANLUNI-COM-FOND": new Code2PatternComFond(),
"ANLUNI-COM-CAE": new Code2Pattern("^(/SAISIE/)?(/NOMIN/)?(/REUNION/)?(/RAPPORT/)?(/DEC/)?$", {})
}),
"ANLUNI-DEBATS": new Code2Pattern("^(/SEANCE/)*(/DEC/)?$", {})
}),
CC: new Code2Pattern("^(/SAISIE/)?(/CONCLUSION/)?$", {})
}),
"Rapport d'information sans mission": new Code2Pattern("^(/AN20/)?(/EU/)?$", {
AN20: new Code2Pattern("^(/RAPPORT/)?$", {}),
EU: new Code2Pattern("^(/DEC/)+$", {})
}),
"Mission d'information": new Code2Pattern("^(/AN20/)?$", {
AN20: new Code2Pattern("^(/MISINF/)?$", {
"AN20-MISINF": new Code2Pattern("^(/CREA/)?(/NOMIN/)?(/RAPPORT/)?$", {})
})
}),
"Commission d'enquête": new Code2Pattern("^(/AN20/)?$", {
AN20: new Code2Pattern("^(/COMENQ/)?$", {
"AN20-COMENQ": new Code2Pattern("^(/CREA/)?(/NOMIN/)?(/RAPPORT/)?$", {})
})
}),
"Engagement de la responsabilité gouvernementale": new Code2Pattern("^/AN21/$", {
AN21: new Code2Pattern("^(((/MOTION/)*/DEBATS/)|(/DGVT/)){1,2}$", {
"AN21-DEBATS": new Code2Pattern("^(/SEANCE/)*(/MOTION-VOTE/)*$", {})
})
}),
"Motion référendaire": new Code2Pattern("^(/lecture/)+$", {
lecture: new Code2Pattern("^(/DEPOT/)?(/COM/)?(/DEBATS/)?$", {
"lecture-COM": new Code2Pattern("^(/FOND/)?$", {
"lecture-COM-FOND": new Code2Pattern("^(/SAISIE/)?(/NOMIN/)*(/RAPPORT/)*$", {})
}),
"lecture-DEBATS": new Code2Pattern("^(/DEC/)?$", {})
})
}),
Immunité: new Code2Pattern("^(/ANLUNI/)+$", {
ANLUNI: new Code2Pattern("^(/DEPOT/)?(/COM/)?(/DEBATS/)?(/RTRINI/)?$", {
"ANLUNI-COM": new Code2Pattern("^(/FOND/)?$", {
"ANLUNI-COM-FOND": new Code2Pattern("^(/SAISIE/)?(/NOMIN/)*(/RAPPORT/)*$", {})
}),
"ANLUNI-DEBATS": new Code2Pattern("^(/SEANCE/)?(/DEC/)$", {})
})
}),
"Responsabilité pénale du président de la république": new Code2Pattern("^/lecture/$", {
lecture: new Code2Pattern("^(/DEPOT/)?(/RECBUREAU/)?$", {})
}),
"Proposition de loi présentée en application de l'article 11 de la Constitution": new Code2Pattern("^/lecture/$", {
lecture: new Code2Pattern("^(/DEPOT/)?$", {})
})
}));
this.verbose = verbose;
this.sanityChecks = sanityChecks;
this.procedures = {};
this.code2pattern._match_count_++;
}
return _createClass(ActesDocumentation, [{
key: "walkFiles",
value: function walkFiles(data, action) {
var _iterator2 = _createForOfIteratorHelper((0, _file_systems.getFiles)(data)),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var file = _step2.value;
var dossier = (0, _file_systems.load)(file);
var procedure = this.remapProcedure(dossier.procedureParlementaire.libelle);
if (!(procedure in this.procedures)) this.procedures[procedure] = {};
action(this.procedures[procedure], dossier.actesLegislatifs, this.code2pattern[procedure], null);
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
}, {
key: "collectFiles",
value: function collectFiles(data) {
var _this = this;
this.walkFiles(data, function (_actes, actesLegislatifs, _c2p, _parent) {
_this.collect(actesLegislatifs);
});
}
}, {
key: "processFiles",
value: function processFiles(data) {
var _this2 = this;
this.walkFiles(data, function (actes, actesLegislatifs, c2p, parent) {
_this2.merge(actes, actesLegislatifs, c2p, parent);
});
if (this.sanityChecks) this.validate();
}
}, {
key: "remapActes",
value: function remapActes(actes) {
var results = [];
var _iterator3 = _createForOfIteratorHelper(actes),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var acte = _step3.value;
this.lectureMapper.remap(acte);
// CC-SAISIE- suffix does not imply a hierarchy
acte.codeActe = acte.codeActe.replace(/^CC-SAISIE.*/, "CC-SAISIE");
results.push(acte);
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
return results;
}
}, {
key: "collectActes",
value: function collectActes(actes) {
var results = [];
var _iterator4 = _createForOfIteratorHelper(actes),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var acte = _step4.value;
this.lectureMapper.collect(acte);
results.push(acte);
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
return results;
}
}, {
key: "remapProcedure",
value: function remapProcedure(procedure) {
var merge_procedures = new Map([["Proposition de loi ordinaire", "Procédure législative"], ["Projet de loi ordinaire", "Procédure législative"], ["Projet de ratification des traités et conventions", "Procédure législative"], ["Projet ou proposition de loi organique", "Procédure législative"], ["Projet ou proposition de loi constitutionnelle", "Procédure législative"], ["Projet de loi de finances de l'année", "Procédure législative"], ["Projet de loi de finances rectificative", "Procédure législative"], ["Projet de loi de financement de la sécurité sociale", "Procédure législative"]]);
if (merge_procedures.has(procedure)) {
this.remappedProcedures[procedure] = null;
return merge_procedures.get(procedure);
} else {
return procedure;
}
}
// return the codeActes in the same order they appear in the regexp
}, {
key: "orderedCodes",
value: function orderedCodes(codes, c2p, parent) {
codes = new Set(codes);
if (!this.sanityChecks) return codes;
var ordered = c2p["_pattern_"].match(new RegExp("/.*?/", "g"));
ordered = ordered.map(function (x) {
return x.replace(new RegExp("/(.*)/"), "$1");
});
if (parent != null) ordered = ordered.map(function (x) {
return "".concat(parent, "-").concat(x);
});
ordered = new Set(ordered);
(0, _assert["default"])(eqSet(ordered, codes), "".concat(_toConsumableArray(ordered), " != ").concat(_toConsumableArray(codes)));
return ordered;
}
}, {
key: "validateChronology",
value: function validateChronology(actesLegislatifs, c2p, parent) {
var pattern = c2p["_pattern_"];
var sequence = actesLegislatifs.map(function (x) {
return "/".concat(x.codeActe, "/").replace("/".concat(parent, "-"), "/");
}).join("");
(0, _assert["default"])(sequence.match(new RegExp(pattern)), "".concat(pattern, " does not match ").concat(sequence));
c2p._match_count_++;
}
}, {
key: "mergeActe",
value: function mergeActe(actes, acte, c2p, parent) {
var code = acte.codeActe;
var shortCode = code.replace(new RegExp("^".concat(parent, "-")), "");
shortCode = shortCode.replace(/-(AN|SN)$/, "");
this.codes[shortCode] = null;
var name = acte.libelleActe.nomCanonique;
if (!(code in actes)) {
actes[code] = {
type: acte.xsiType,
name: new Set([name]),
shortCode: shortCode,
actes: {}
};
} else {
actes[code].name.add(name);
}
if ("actesLegislatifs" in acte) this.merge(actes[code].actes, acte.actesLegislatifs, c2p[code], code);
}
}, {
key: "merge",
value: function merge(actes, actesLegislatifs, c2p, parent) {
var l = this.remapActes(actesLegislatifs);
this.validateChronology(l, c2p, parent);
var _iterator5 = _createForOfIteratorHelper(l),
_step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
var acte = _step5.value;
this.mergeActe(actes, acte, c2p, parent);
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
}
}, {
key: "collect",
value: function collect(actesLegislatifs) {
var _iterator6 = _createForOfIteratorHelper(this.collectActes(actesLegislatifs)),
_step6;
try {
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
var acte = _step6.value;
if ("actesLegislatifs" in acte) this.collect(acte.actesLegislatifs);
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
}
}, {
key: "validateLevel",
value: function validateLevel(c2p, path) {
(0, _assert["default"])(c2p._match_count_ > 0, "".concat(path, " is never used"));
for (var _i3 = 0, _arr = Object.entries(c2p); _i3 < _arr.length; _i3++) {
var _arr$_i = _slicedToArray(_arr[_i3], 2),
key = _arr$_i[0],
value = _arr$_i[1];
if (value != null && value.constructor.name == "Code2Pattern") this.validateLevel(value, path.concat([key]));
}
}
}, {
key: "validate",
value: function validate() {
this.validateLevel(this.code2pattern, []);
}
}, {
key: "printEntry",
value: function printEntry(sections, entry, codes) {
var title = "`".concat(entry, "`__");
console.log(title);
var underline = new Array(title.length + 1).join(sections[0]);
console.log(underline);
console.log(codes);
}
}, {
key: "addAnchors",
value: function addAnchors(key) {
if (key in this.anchorsPrinted) return;
if (this.lectureMapper.has(key)) this.lectureMapper.mergeCodes(this.anchors, key);else this.anchors.add(key);
}
}, {
key: "printAnchors",
value: function printAnchors(key) {
if (key in this.anchorsPrinted) return;
this.anchorsPrinted[key] = null;
if (this.lectureMapper.has(key)) this.lectureMapper.printAnchors(key);else console.log(".. _".concat(key, ":"));
}
}, {
key: "getCodes",
value: function getCodes(key, shortCode) {
if (key in this.anchorsPrinted) return "cf \\*".concat(shortCode, "\\*");
if (this.lectureMapper.has(key)) return this.lectureMapper.getCodes(key);else return key;
}
}, {
key: "renameCMP",
value: function renameCMP(key, name) {
if (key.startsWith("CMP")) {
if (key.endsWith("-SN")) return "".concat(name, " (S\xE9nat)");else if (key.endsWith("-AN")) return "".concat(name, " (Assembl\xE9e Nationale)");else return name;
} else return name;
}
}, {
key: "printLevel",
value: function printLevel(actes, sections, c2p, parent) {
var keys = this.orderedCodes(Object.keys(actes), c2p, parent);
var _iterator7 = _createForOfIteratorHelper(keys),
_step7;
try {
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
var key = _step7.value;
var value = actes[key];
var name = Array.from(value.name).join(", ");
name = this.renameCMP(key, name);
var codes = this.getCodes(key, value.shortCode);
this.addAnchors(key);
this.printAnchors(key);
console.log("");
this.printEntry(sections, "".concat(name, " <").concat(value.shortCode, "TOC_>"), codes);
console.log("");
if (Object.keys(value.actes).length > 0) this.printLevel(value.actes, sections.substring(1), c2p[key], key);
}
} catch (err) {
_iterator7.e(err);
} finally {
_iterator7.f();
}
}
}, {
key: "printCodes",
value: function printCodes() {
for (var _i4 = 0, _Object$keys = Object.keys(this.codes); _i4 < _Object$keys.length; _i4++) {
var key = _Object$keys[_i4];
console.log(".. _".concat(key, "TOC: http://"));
}
}
}, {
key: "printAnchorsIndex",
value: function printAnchorsIndex() {
for (var _i5 = 0, _Array$from3 = Array.from(this.anchors); _i5 < _Array$from3.length; _i5++) {
var code = _Array$from3[_i5];
console.log("* :ref:`".concat(code, " <").concat(code, ">`"));
}
}
}, {
key: "getAggregated",
value: function getAggregated(procedure) {
if (procedure == "Procédure législative") {
var remapped = Object.keys(this.remappedProcedures).join(", ");
return " (agr\xE9gation de ".concat(remapped, ")");
} else return "";
}
}, {
key: "print",
value: function print() {
this.anchorsPrinted = {};
for (var _i6 = 0, _arr2 = Object.entries(this.procedures); _i6 < _arr2.length; _i6++) {
var _arr2$_i = _slicedToArray(_arr2[_i6], 2),
key = _arr2$_i[0],
actes = _arr2$_i[1];
var code = key.replace(/ +/g, "_");
this.codes[code] = null;
var aggregated = this.getAggregated(key);
var title = "`".concat(key, " <").concat(code, "TOC_>`__").concat(aggregated);
console.log(title);
var underline = new Array(title.length + 1).join("=");
console.log(underline);
this.printLevel(actes, "-~.'", this.code2pattern[key], null);
}
this.printCodes();
this.printAnchorsIndex();
}
}]);
}();
function main(argv) {
var options = parseArgs(argv);
if (options === null) return 1;
var doc = new ActesDocumentation(!options["no-sanity-checks"], options.verbose);
doc.collectFiles(options.data);
doc.processFiles(options.data);
doc.print();
return 0;
}
/* istanbul ignore if */
if (process.argv[1].endsWith("document_dossiers_legislatifs.ts")) process.exit(main(process.argv));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbWFuZExpbmVBcmdzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29tbWFuZExpbmVVc2FnZSIsIl9hc3NlcnQiLCJfZmlsZV9zeXN0ZW1zIiwiX0xlY3R1cmVNYXBwaW5nIiwiZSIsIl9fZXNNb2R1bGUiLCJfc2xpY2VkVG9BcnJheSIsInIiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiVHlwZUVycm9yIiwibCIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIm4iLCJpIiwidSIsImEiLCJmIiwibyIsImNhbGwiLCJuZXh0IiwiT2JqZWN0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJmcm9tIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJfdHlwZW9mIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIlJlZmVyZW5jZUVycm9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJzZXRQcm90b3R5cGVPZiIsImdldFByb3RvdHlwZU9mIiwiYmluZCIsIl9fcHJvdG9fXyIsIl9pbmhlcml0cyIsImNyZWF0ZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiZGVmaW5lUHJvcGVydHkiLCJfc2V0UHJvdG90eXBlT2YiLCJfZGVmaW5lUHJvcGVydGllcyIsImVudW1lcmFibGUiLCJfdG9Qcm9wZXJ0eUtleSIsImtleSIsIl9jcmVhdGVDbGFzcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0eSIsIl90b1ByaW1pdGl2ZSIsInRvUHJpbWl0aXZlIiwiU3RyaW5nIiwiTnVtYmVyIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfbiIsIkYiLCJzIiwidG9TdHJpbmciLCJzbGljZSIsIm5hbWUiLCJ0ZXN0IiwicGFyc2VBcmdzIiwiYXJndiIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImRlc2NyaXB0aW9uIiwiZGVmYXVsdE9wdGlvbiIsIm11bHRpcGxlIiwidHlwZSIsInNlY3Rpb25zIiwiaGVhZGVyIiwiY29udGVudCIsIm9wdGlvbkxpc3QiLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwiY29uc29sZSIsImVycm9yIiwiaGVscCIsInVzYWdlIiwiY29tbWFuZExpbmVVc2FnZSIsIndhcm4iLCJlcVNldCIsImFzIiwiYnMiLCJzaXplIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJoYXMiLCJlcnIiLCJDb2RlMlBhdHRlcm4iLCJwYXR0ZXJuIiwiY2hpbGRyZW4iLCJfcGF0dGVybl8iLCJfbWF0Y2hfY291bnRfIiwiYXNzaWduIiwiQ29kZTJQYXR0ZXJuQ29tRm9uZCIsIl9Db2RlMlBhdHRlcm4yIiwiTGVjdHVyZU1hcHBpbmciLCJTZXQiLCJhZGQiLCJhY3RlIiwiY29kZXMiLCJjb2RlQWN0ZSIsImdldFR5cGUiLCJsaWJlbGxlQWN0ZSIsIm5vbUNhbm9uaXF1ZSIsImxpYmVsbGUiLCJyZW1hcCIsInR5cGVzIiwibWVyZ2VDb2RlcyIsIl9pIiwiX0FycmF5JGZyb20iLCJjIiwicHJpbnRBbmNob3JzIiwiX2kyIiwiX0FycmF5JGZyb20yIiwiY29kZSIsImxvZyIsImNvbmNhdCIsImdldENvZGVzIiwiam9pbiIsImlzTGVjdHVyZSIsIm1hdGNoIiwiY29kZXNfbGVjdHVyZV9yZWdleHAiLCJFcnJvciIsIm1hcCIsInJlcGxhY2UiLCJnZXRDb2RlQWN0ZSIsIlJlZ0V4cCIsImNvZGVzX2xlY3R1cmUiLCJMZWN0dXJlTWFwcGVyIiwibWFwcGluZyIsImNvbGxlY3QiLCJ1bmRlZmluZWQiLCJsZWN0dXJlcyIsIkFjdGVzRG9jdW1lbnRhdGlvbiIsInNhbml0eUNoZWNrcyIsInZlcmJvc2UiLCJhcmd1bWVudHMiLCJsZWN0dXJlIiwiQ01QIiwiQ0MiLCJQUk9NIiwiQU4yMSIsIkFOTFVOSSIsIlLDqXNvbHV0aW9uIiwiQU4yMCIsIkVVIiwiSW1tdW5pdMOpIiwicHJvY2VkdXJlcyIsImNvZGUycGF0dGVybiIsIndhbGtGaWxlcyIsImRhdGEiLCJhY3Rpb24iLCJfaXRlcmF0b3IyIiwiZ2V0RmlsZXMiLCJfc3RlcDIiLCJmaWxlIiwiZG9zc2llciIsImxvYWQiLCJwcm9jZWR1cmUiLCJyZW1hcFByb2NlZHVyZSIsInByb2NlZHVyZVBhcmxlbWVudGFpcmUiLCJhY3Rlc0xlZ2lzbGF0aWZzIiwiY29sbGVjdEZpbGVzIiwiX3RoaXMiLCJfYWN0ZXMiLCJfYzJwIiwiX3BhcmVudCIsInByb2Nlc3NGaWxlcyIsIl90aGlzMiIsImFjdGVzIiwiYzJwIiwicGFyZW50IiwibWVyZ2UiLCJ2YWxpZGF0ZSIsInJlbWFwQWN0ZXMiLCJyZXN1bHRzIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsImxlY3R1cmVNYXBwZXIiLCJjb2xsZWN0QWN0ZXMiLCJfaXRlcmF0b3I0IiwiX3N0ZXA0IiwibWVyZ2VfcHJvY2VkdXJlcyIsIk1hcCIsInJlbWFwcGVkUHJvY2VkdXJlcyIsImdldCIsIm9yZGVyZWRDb2RlcyIsIm9yZGVyZWQiLCJ4IiwiYXNzZXJ0IiwidmFsaWRhdGVDaHJvbm9sb2d5Iiwic2VxdWVuY2UiLCJtZXJnZUFjdGUiLCJzaG9ydENvZGUiLCJ4c2lUeXBlIiwiX2l0ZXJhdG9yNSIsIl9zdGVwNSIsIl9pdGVyYXRvcjYiLCJfc3RlcDYiLCJ2YWxpZGF0ZUxldmVsIiwicGF0aCIsIl9pMyIsIl9hcnIiLCJlbnRyaWVzIiwiX2FyciRfaSIsInByaW50RW50cnkiLCJlbnRyeSIsInRpdGxlIiwidW5kZXJsaW5lIiwiYWRkQW5jaG9ycyIsImFuY2hvcnNQcmludGVkIiwiYW5jaG9ycyIsInJlbmFtZUNNUCIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsInByaW50TGV2ZWwiLCJrZXlzIiwiX2l0ZXJhdG9yNyIsIl9zdGVwNyIsInN1YnN0cmluZyIsInByaW50Q29kZXMiLCJfaTQiLCJfT2JqZWN0JGtleXMiLCJwcmludEFuY2hvcnNJbmRleCIsIl9pNSIsIl9BcnJheSRmcm9tMyIsImdldEFnZ3JlZ2F0ZWQiLCJyZW1hcHBlZCIsInByaW50IiwiX2k2IiwiX2FycjIiLCJfYXJyMiRfaSIsImFnZ3JlZ2F0ZWQiLCJtYWluIiwiZG9jIiwicHJvY2VzcyIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9kb2N1bWVudF9kb3NzaWVyc19sZWdpc2xhdGlmcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgY29tbWFuZExpbmVVc2FnZSBmcm9tIFwiY29tbWFuZC1saW5lLXVzYWdlXCJcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBsb2FkLCBnZXRGaWxlcyB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246IFwicGF0aG5hbWUgdG8gYSBKU09OIGZpbGUgb3IgYSBnbG9iIHBhdHRlcm4gdG8gSlNPTiBmaWxlc1wiLFxuICAgICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm5vLXNhbml0eS1jaGVja3NcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZXNjcmlwdGlvbjogXCJEbyBub3QgcGVyZm9ybSBzYW5pdHkgY2hlY2tzLlwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVzY3JpcHRpb246IFwiaW5jcmVhc2UgdmVyYm9zaXR5XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImhlbHBcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlByaW50IHRoaXMgdXNhZ2UgZ3VpZGUuXCIsXG4gICAgfSxcbiAgXVxuICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICB7XG4gICAgICBoZWFkZXI6IFwiQWlkZSDDoCBsYSBkb2N1bWVudGF0aW9uIGR1IGRvc3NpZXIgbMOpZ2lzbGF0aWZcIixcbiAgICAgIGNvbnRlbnQ6IFwiR8OpbsOocmUgdW5lIGhpw6lyYXJjaGllIGRlcyBhY3RlcyBsw6lnaXNsYXRpZnNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlYWRlcjogXCJPcHRpb25zXCIsXG4gICAgICBvcHRpb25MaXN0OiBvcHRpb25zRGVmaW5pdGlvbnMsXG4gICAgfSxcbiAgXVxuICBjb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucywge1xuICAgIGFyZ3Y6IGFyZ3YsXG4gIH0pXG4gIGlmICghKFwiaGVscFwiIGluIG9wdGlvbnMpICYmICEoXCJkYXRhXCIgaW4gb3B0aW9ucykpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiLS1kYXRhIGlzIG1hbmRhdG9yeVwiKVxuICAgIG9wdGlvbnMuaGVscCA9IHRydWVcbiAgfVxuICBpZiAoXCJoZWxwXCIgaW4gb3B0aW9ucykge1xuICAgIGNvbnN0IHVzYWdlID0gY29tbWFuZExpbmVVc2FnZShzZWN0aW9ucylcbiAgICBjb25zb2xlLndhcm4odXNhZ2UpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBlcVNldChhczogU2V0PHN0cmluZz4sIGJzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAoYXMuc2l6ZSAhPT0gYnMuc2l6ZSkgcmV0dXJuIGZhbHNlXG4gIGZvciAodmFyIGEgb2YgYXMpIGlmICghYnMuaGFzKGEpKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHRydWVcbn1cblxuY2xhc3MgQ29kZTJQYXR0ZXJuIHtcbiAgX3BhdHRlcm5fOiBhbnlcbiAgX21hdGNoX2NvdW50XzogbnVtYmVyXG4gIGNvbnN0cnVjdG9yKHBhdHRlcm46IGFueSwgY2hpbGRyZW46IGFueSkge1xuICAgIHRoaXMuX3BhdHRlcm5fID0gcGF0dGVyblxuICAgIHRoaXMuX21hdGNoX2NvdW50XyA9IDBcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNoaWxkcmVuKVxuICB9XG59XG5cbmNsYXNzIENvZGUyUGF0dGVybkNvbUZvbmQgZXh0ZW5kcyBDb2RlMlBhdHRlcm4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIl4vU0FJU0lFLygvTk9NSU4vKSooL1JFVU5JT04vKSooL1JBUFBPUlQvKSokXCIsIHt9KVxuICB9XG59XG5cbmNsYXNzIExlY3R1cmVNYXBwaW5nIHtcbiAgbGliZWxsZTogYW55ID0ge31cbiAgY29kZXM6IGFueSA9IG5ldyBTZXQoKVxuXG4gIHN0YXRpYyBjb2Rlc19sZWN0dXJlOiBzdHJpbmdbXSA9IFtcbiAgICBcIkFOMVwiLFxuICAgIFwiU04xXCIsXG4gICAgXCJBTk5MRUNcIixcbiAgICBcIlNOTkxFQ1wiLFxuICAgIFwiQU5MREVGXCIsXG4gICAgXCJBTjJcIixcbiAgICBcIlNOMlwiLFxuICAgIFwiU04zXCIsXG4gIF1cbiAgc3RhdGljIGNvZGVzX2xlY3R1cmVfcmVnZXhwOiBhbnkgPSBuZXcgUmVnRXhwKFxuICAgIFwiXig/OlwiICsgTGVjdHVyZU1hcHBpbmcuY29kZXNfbGVjdHVyZS5qb2luKFwifFwiKSArIFwiKSgtLiopPyRcIixcbiAgKVxuXG4gIHN0YXRpYyBpc0xlY3R1cmUoYWN0ZTogYW55KSB7XG4gICAgcmV0dXJuIGFjdGUuY29kZUFjdGUubWF0Y2goTGVjdHVyZU1hcHBpbmcuY29kZXNfbGVjdHVyZV9yZWdleHApXG4gIH1cblxuICBzdGF0aWMgZ2V0VHlwZShhY3RlOiBhbnkpIHtcbiAgICBpZiAoYWN0ZS5jb2RlQWN0ZS5tYXRjaCgvXkFOLykpIHJldHVybiBcIkFOXCJcbiAgICBlbHNlIGlmIChhY3RlLmNvZGVBY3RlLm1hdGNoKC9eU04vKSkgcmV0dXJuIFwiU05cIlxuICAgIGVsc2UgdGhyb3cgRXJyb3IoYCR7YWN0ZS5jb2RlQWN0ZX0gZG9lcyBub3Qgc3RhcnQgd2l0aCBBTiBvciBTTmApXG4gIH1cblxuICBzdGF0aWMgbWFwKGNvZGVBY3RlOiBhbnkpIHtcbiAgICByZXR1cm4gY29kZUFjdGUucmVwbGFjZShMZWN0dXJlTWFwcGluZy5jb2Rlc19sZWN0dXJlX3JlZ2V4cCwgYGxlY3R1cmUkMWApXG4gIH1cblxuICBzdGF0aWMgZ2V0Q29kZUFjdGUoYWN0ZTogYW55KSB7XG4gICAgaWYgKCFMZWN0dXJlTWFwcGluZy5pc0xlY3R1cmUoYWN0ZSkpIHJldHVyblxuXG4gICAgcmV0dXJuIExlY3R1cmVNYXBwaW5nLm1hcChhY3RlLmNvZGVBY3RlKVxuICB9XG5cbiAgYWRkKGFjdGU6IGFueSkge1xuICAgIHRoaXMuY29kZXMuYWRkKGFjdGUuY29kZUFjdGUpXG5cbiAgICBjb25zdCB0eXBlID0gTGVjdHVyZU1hcHBpbmcuZ2V0VHlwZShhY3RlKVxuXG4gICAgaWYgKCEoYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWUgaW4gdGhpcy5saWJlbGxlKSlcbiAgICAgIHRoaXMubGliZWxsZVthY3RlLmxpYmVsbGVBY3RlLm5vbUNhbm9uaXF1ZV0gPSBuZXcgU2V0KClcbiAgICB0aGlzLmxpYmVsbGVbYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWVdLmFkZCh0eXBlKVxuICB9XG5cbiAgcmVtYXAoYWN0ZTogYW55LCBjb2RlQWN0ZTogc3RyaW5nKSB7XG4gICAgYWN0ZS5jb2RlQWN0ZSA9IGNvZGVBY3RlXG5cbiAgICBsZXQgdHlwZXMgPSB0aGlzLmxpYmVsbGVbYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWVdXG4gICAgaWYgKCEodHlwZXMuaGFzKFwiU05cIikgJiYgdHlwZXMuaGFzKFwiQU5cIikpKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKFwiU05cIikpIGFjdGUubGliZWxsZUFjdGUubm9tQ2Fub25pcXVlICs9IFwiIChTw6luYXQpXCJcbiAgICAgIGVsc2UgaWYgKHR5cGVzLmhhcyhcIkFOXCIpKVxuICAgICAgICBhY3RlLmxpYmVsbGVBY3RlLm5vbUNhbm9uaXF1ZSArPSBcIiAoQXNzZW1ibMOpZSBOYXRpb25hbGUpXCJcbiAgICB9XG4gIH1cblxuICBtZXJnZUNvZGVzKGNvZGVzOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgQXJyYXkuZnJvbSh0aGlzLmNvZGVzKSkgY29kZXMuYWRkKGMpXG4gIH1cblxuICBwcmludEFuY2hvcnMoKSB7XG4gICAgZm9yIChjb25zdCBjb2RlIG9mIEFycmF5LmZyb20odGhpcy5jb2RlcykpIGNvbnNvbGUubG9nKGAuLiBfJHtjb2RlfTpgKVxuICB9XG5cbiAgZ2V0Q29kZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb2Rlcykuam9pbihcIixcIilcbiAgfVxufVxuXG5jbGFzcyBMZWN0dXJlTWFwcGVyIHtcbiAgbWFwcGluZzogYW55ID0ge31cblxuICBoYXMoY29kZUFjdGU6IHN0cmluZykge1xuICAgIHJldHVybiBjb2RlQWN0ZSBpbiB0aGlzLm1hcHBpbmdcbiAgfVxuXG4gIGNvbGxlY3QoYWN0ZTogYW55KSB7XG4gICAgY29uc3QgY29kZUFjdGUgPSBMZWN0dXJlTWFwcGluZy5nZXRDb2RlQWN0ZShhY3RlKVxuICAgIGlmIChjb2RlQWN0ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBsZWN0dXJlcyA9IHRoaXMubWFwcGluZ1xuICAgICAgaWYgKCEoY29kZUFjdGUgaW4gbGVjdHVyZXMpKSBsZWN0dXJlc1tjb2RlQWN0ZV0gPSBuZXcgTGVjdHVyZU1hcHBpbmcoKVxuICAgICAgbGVjdHVyZXNbY29kZUFjdGVdLmFkZChhY3RlKVxuICAgIH1cbiAgfVxuXG4gIHJlbWFwKGFjdGU6IGFueSkge1xuICAgIGNvbnN0IGNvZGVBY3RlID0gTGVjdHVyZU1hcHBpbmcuZ2V0Q29kZUFjdGUoYWN0ZSlcbiAgICBpZiAoY29kZUFjdGUgIT0gdW5kZWZpbmVkKSB0aGlzLm1hcHBpbmdbY29kZUFjdGVdLnJlbWFwKGFjdGUsIGNvZGVBY3RlKVxuICB9XG5cbiAgbWVyZ2VDb2Rlcyhjb2RlczogYW55LCBjb2RlQWN0ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5tYXBwaW5nW2NvZGVBY3RlXS5tZXJnZUNvZGVzKGNvZGVzKVxuICB9XG5cbiAgcHJpbnRBbmNob3JzKGNvZGVBY3RlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1hcHBpbmdbY29kZUFjdGVdLnByaW50QW5jaG9ycygpXG4gIH1cblxuICBnZXRDb2Rlcyhjb2RlQWN0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwcGluZ1tjb2RlQWN0ZV0uZ2V0Q29kZXMoKVxuICB9XG59XG5cbmNsYXNzIEFjdGVzRG9jdW1lbnRhdGlvbiB7XG4gIHZlcmJvc2U6IGJvb2xlYW5cbiAgc2FuaXR5Q2hlY2tzOiBib29sZWFuXG4gIGxlY3R1cmVNYXBwZXI6IGFueSA9IG5ldyBMZWN0dXJlTWFwcGVyKClcbiAgcmVtYXBwZWRQcm9jZWR1cmVzOiBhbnkgPSB7fVxuICBhbmNob3JzUHJpbnRlZDogYW55ID0ge31cbiAgYW5jaG9yczogYW55ID0gbmV3IFNldCgpXG4gIGNvZGVzOiBhbnkgPSB7fVxuICBwcm9jZWR1cmVzOiBhbnkgPSBudWxsXG4gIGNvZGUycGF0dGVybjogYW55ID0gbmV3IENvZGUyUGF0dGVybihudWxsLCB7XG4gICAgXCJQcm9jw6lkdXJlIGzDqWdpc2xhdGl2ZVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgXCJeKCgoL2xlY3R1cmUvKSspfCgoL2xlY3R1cmUvKSsvQ01QLygvbGVjdHVyZS8pKikpKC9DQy8pPygvUFJPTS8pPygvQU4tQVBQTEkvKT8kXCIsXG4gICAgICB7XG4gICAgICAgIGxlY3R1cmU6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICAgICAgXCJeKC9ERVBPVC8pPygvRFBUTEVUVFJFQ1QvKT8oL0VUSS8pPygvQVZDRS8pPygvREdWVC8pPygvQUNJTi8pPygvTU9USU9OLykqKC9QUk9DQUNDLyk/KC9DT00vKT8oKC9ERUJBVFMvKSspPygvUlRSSU5JLyk/JFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGVjdHVyZS1DT01cIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0ZPTkQvfC9BVklTLykrJFwiLCB7XG4gICAgICAgICAgICAgIFwibGVjdHVyZS1DT00tRk9ORFwiOiBuZXcgQ29kZTJQYXR0ZXJuQ29tRm9uZCgpLFxuICAgICAgICAgICAgICBcImxlY3R1cmUtQ09NLUFWSVNcIjogbmV3IENvZGUyUGF0dGVybkNvbUZvbmQoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXCJsZWN0dXJlLURFQkFUU1wiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgICAgICBcIl4oL1NFQU5DRS8pKigoL01PVElPTi8pPygvTU9USU9OLVZPVEUvKSspPygvREVDLyk/JFwiLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgQ01QOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgIFwiXigvREVQT1QvfC9TQUlTSUUvKXsxLDJ9KC9DT00vKT8oL0RFQy8pPygvREVCQVRTLUFOLy9ERUJBVFMtU04vKT9cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIkNNUC1DT01cIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgICAgXCJeKC9OT01JTi8pPygvUkFQUE9SVC1BTi98L1JBUFBPUlQtU04vKXsyfSRcIixcbiAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgXCJDTVAtREVCQVRTLUFOXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TRUFOQ0UvKSooL0RFQy8pPyRcIiwge30pLFxuICAgICAgICAgICAgXCJDTVAtREVCQVRTLVNOXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TRUFOQ0UvKSooL0RFQy8pPyRcIiwge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICAgIENDOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0FJU0lFLykrKC9DT05DTFVTSU9OLyk/JFwiLCB7fSksXG4gICAgICAgIFBST006IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9QVUIvKT8kXCIsIHt9KSxcbiAgICAgICAgXCJBTi1BUFBMSVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvUkFQUE9SVC8pPyRcIiwge30pLFxuICAgICAgfSxcbiAgICApLFxuICAgIFwiQWxsb2N1dGlvbiBkdSBQcsOpc2lkZW50IGRlIGwnQXNzZW1ibMOpZSBuYXRpb25hbGVcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgIFwiXi9BTjIxLyRcIixcbiAgICAgIHtcbiAgICAgICAgQU4yMTogbmV3IENvZGUyUGF0dGVybihcIl4oL0FQQU4vKT8kXCIsIHt9KSxcbiAgICAgIH0sXG4gICAgKSxcbiAgICBcIlLDqXNvbHV0aW9uIEFydGljbGUgMzQtMVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQU5MVU5JLyk/JFwiLCB7XG4gICAgICBBTkxVTkk6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvREVCQVRTLyk/KC9SVFJJTkkvKT8kXCIsIHtcbiAgICAgICAgXCJBTkxVTkktREVCQVRTXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TRUFOQ0UvKSsoL0RFQy8pPyRcIiwge30pLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgUsOpc29sdXRpb246IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9BTkxVTkkvKT8oL0NDLyk/JFwiLCB7XG4gICAgICBBTkxVTkk6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvQ09NLyk/KC9ERUJBVFMvfC9SVFJJTkkvKT8kXCIsIHtcbiAgICAgICAgXCJBTkxVTkktQ09NXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9DQUUvKT8oL0ZPTkQvKT8kXCIsIHtcbiAgICAgICAgICBcIkFOTFVOSS1DT00tRk9ORFwiOiBuZXcgQ29kZTJQYXR0ZXJuQ29tRm9uZCgpLFxuICAgICAgICAgIFwiQU5MVU5JLUNPTS1DQUVcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgIFwiXigvU0FJU0lFLyk/KC9OT01JTi8pPygvUkVVTklPTi8pPygvUkFQUE9SVC8pPygvREVDLyk/JFwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgKSxcbiAgICAgICAgfSksXG4gICAgICAgIFwiQU5MVU5JLURFQkFUU1wiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLykqKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgIH0pLFxuICAgICAgQ0M6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TQUlTSUUvKT8oL0NPTkNMVVNJT04vKT8kXCIsIHt9KSxcbiAgICB9KSxcbiAgICBcIlJhcHBvcnQgZCdpbmZvcm1hdGlvbiBzYW5zIG1pc3Npb25cIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgIFwiXigvQU4yMC8pPygvRVUvKT8kXCIsXG4gICAgICB7XG4gICAgICAgIEFOMjA6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9SQVBQT1JULyk/JFwiLCB7fSksXG4gICAgICAgIEVVOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVDLykrJFwiLCB7fSksXG4gICAgICB9LFxuICAgICksXG4gICAgXCJNaXNzaW9uIGQnaW5mb3JtYXRpb25cIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0FOMjAvKT8kXCIsIHtcbiAgICAgIEFOMjA6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9NSVNJTkYvKT8kXCIsIHtcbiAgICAgICAgXCJBTjIwLU1JU0lORlwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgIFwiXigvQ1JFQS8pPygvTk9NSU4vKT8oL1JBUFBPUlQvKT8kXCIsXG4gICAgICAgICAge30sXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgICBcIkNvbW1pc3Npb24gZCdlbnF1w6p0ZVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQU4yMC8pPyRcIiwge1xuICAgICAgQU4yMDogbmV3IENvZGUyUGF0dGVybihcIl4oL0NPTUVOUS8pPyRcIiwge1xuICAgICAgICBcIkFOMjAtQ09NRU5RXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICAgICAgXCJeKC9DUkVBLyk/KC9OT01JTi8pPygvUkFQUE9SVC8pPyRcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIFwiRW5nYWdlbWVudCBkZSBsYSByZXNwb25zYWJpbGl0w6kgZ291dmVybmVtZW50YWxlXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICBcIl4vQU4yMS8kXCIsXG4gICAgICB7XG4gICAgICAgIEFOMjE6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKCgoL01PVElPTi8pKi9ERUJBVFMvKXwoL0RHVlQvKSl7MSwyfSRcIiwge1xuICAgICAgICAgIFwiQU4yMS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL1NFQU5DRS8pKigvTU9USU9OLVZPVEUvKSokXCIsIHt9KSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICksXG4gICAgXCJNb3Rpb24gcsOpZsOpcmVuZGFpcmVcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL2xlY3R1cmUvKSskXCIsIHtcbiAgICAgIGxlY3R1cmU6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvQ09NLyk/KC9ERUJBVFMvKT8kXCIsIHtcbiAgICAgICAgXCJsZWN0dXJlLUNPTVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvRk9ORC8pPyRcIiwge1xuICAgICAgICAgIFwibGVjdHVyZS1DT00tRk9ORFwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgICAgXCJeKC9TQUlTSUUvKT8oL05PTUlOLykqKC9SQVBQT1JULykqJFwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgKSxcbiAgICAgICAgfSksXG4gICAgICAgIFwibGVjdHVyZS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0RFQy8pPyRcIiwge30pLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgSW1tdW5pdMOpOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQU5MVU5JLykrJFwiLCB7XG4gICAgICBBTkxVTkk6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvQ09NLyk/KC9ERUJBVFMvKT8oL1JUUklOSS8pPyRcIiwge1xuICAgICAgICBcIkFOTFVOSS1DT01cIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0ZPTkQvKT8kXCIsIHtcbiAgICAgICAgICBcIkFOTFVOSS1DT00tRk9ORFwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgICAgXCJeKC9TQUlTSUUvKT8oL05PTUlOLykqKC9SQVBQT1JULykqJFwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgKSxcbiAgICAgICAgfSksXG4gICAgICAgIFwiQU5MVU5JLURFQkFUU1wiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLyk/KC9ERUMvKSRcIiwge30pLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgXCJSZXNwb25zYWJpbGl0w6kgcMOpbmFsZSBkdSBwcsOpc2lkZW50IGRlIGxhIHLDqXB1YmxpcXVlXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICBcIl4vbGVjdHVyZS8kXCIsXG4gICAgICB7XG4gICAgICAgIGxlY3R1cmU6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPygvUkVDQlVSRUFVLyk/JFwiLCB7fSksXG4gICAgICB9LFxuICAgICksXG4gICAgXCJQcm9wb3NpdGlvbiBkZSBsb2kgcHLDqXNlbnTDqWUgZW4gYXBwbGljYXRpb24gZGUgbCdhcnRpY2xlIDExIGRlIGxhIENvbnN0aXR1dGlvblwiOlxuICAgICAgbmV3IENvZGUyUGF0dGVybihcIl4vbGVjdHVyZS8kXCIsIHtcbiAgICAgICAgbGVjdHVyZTogbmV3IENvZGUyUGF0dGVybihcIl4oL0RFUE9ULyk/JFwiLCB7fSksXG4gICAgICB9KSxcbiAgfSlcblxuICBjb25zdHJ1Y3RvcihzYW5pdHlDaGVja3M6IGJvb2xlYW4sIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2VcbiAgICB0aGlzLnNhbml0eUNoZWNrcyA9IHNhbml0eUNoZWNrc1xuICAgIHRoaXMucHJvY2VkdXJlcyA9IHt9XG4gICAgdGhpcy5jb2RlMnBhdHRlcm4uX21hdGNoX2NvdW50XysrXG4gIH1cblxuICB3YWxrRmlsZXMoZGF0YTogc3RyaW5nW10sIGFjdGlvbjogYW55KSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGdldEZpbGVzKGRhdGEpKSB7XG4gICAgICBjb25zdCBkb3NzaWVyID0gbG9hZChmaWxlKVxuICAgICAgbGV0IHByb2NlZHVyZTogc3RyaW5nID0gdGhpcy5yZW1hcFByb2NlZHVyZShcbiAgICAgICAgZG9zc2llci5wcm9jZWR1cmVQYXJsZW1lbnRhaXJlLmxpYmVsbGUsXG4gICAgICApXG4gICAgICBpZiAoIShwcm9jZWR1cmUgaW4gdGhpcy5wcm9jZWR1cmVzKSkgdGhpcy5wcm9jZWR1cmVzW3Byb2NlZHVyZV0gPSB7fVxuICAgICAgYWN0aW9uKFxuICAgICAgICB0aGlzLnByb2NlZHVyZXNbcHJvY2VkdXJlXSxcbiAgICAgICAgZG9zc2llci5hY3Rlc0xlZ2lzbGF0aWZzLFxuICAgICAgICB0aGlzLmNvZGUycGF0dGVybltwcm9jZWR1cmVdLFxuICAgICAgICBudWxsLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbGxlY3RGaWxlcyhkYXRhOiBzdHJpbmdbXSkge1xuICAgIHRoaXMud2Fsa0ZpbGVzKFxuICAgICAgZGF0YSxcbiAgICAgIChfYWN0ZXM6IGFueSwgYWN0ZXNMZWdpc2xhdGlmczogYW55LCBfYzJwOiBhbnksIF9wYXJlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmNvbGxlY3QoYWN0ZXNMZWdpc2xhdGlmcylcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgcHJvY2Vzc0ZpbGVzKGRhdGE6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy53YWxrRmlsZXMoXG4gICAgICBkYXRhLFxuICAgICAgKGFjdGVzOiBhbnksIGFjdGVzTGVnaXNsYXRpZnM6IGFueSwgYzJwOiBhbnksIHBhcmVudDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWVyZ2UoYWN0ZXMsIGFjdGVzTGVnaXNsYXRpZnMsIGMycCwgcGFyZW50KVxuICAgICAgfSxcbiAgICApXG4gICAgaWYgKHRoaXMuc2FuaXR5Q2hlY2tzKSB0aGlzLnZhbGlkYXRlKClcbiAgfVxuXG4gIHJlbWFwQWN0ZXMoYWN0ZXM6IGFueSk6IGFueSB7XG4gICAgbGV0IHJlc3VsdHMgPSBbXVxuICAgIGZvciAoY29uc3QgYWN0ZSBvZiBhY3Rlcykge1xuICAgICAgdGhpcy5sZWN0dXJlTWFwcGVyLnJlbWFwKGFjdGUpXG5cbiAgICAgIC8vIENDLVNBSVNJRS0gc3VmZml4IGRvZXMgbm90IGltcGx5IGEgaGllcmFyY2h5XG4gICAgICBhY3RlLmNvZGVBY3RlID0gYWN0ZS5jb2RlQWN0ZS5yZXBsYWNlKC9eQ0MtU0FJU0lFLiovLCBcIkNDLVNBSVNJRVwiKVxuXG4gICAgICByZXN1bHRzLnB1c2goYWN0ZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIGNvbGxlY3RBY3RlcyhhY3RlczogYW55KTogYW55IHtcbiAgICBsZXQgcmVzdWx0cyA9IFtdXG4gICAgZm9yIChjb25zdCBhY3RlIG9mIGFjdGVzKSB7XG4gICAgICB0aGlzLmxlY3R1cmVNYXBwZXIuY29sbGVjdChhY3RlKVxuXG4gICAgICByZXN1bHRzLnB1c2goYWN0ZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIHJlbWFwUHJvY2VkdXJlKHByb2NlZHVyZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXJnZV9wcm9jZWR1cmVzOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcChbXG4gICAgICBbXCJQcm9wb3NpdGlvbiBkZSBsb2kgb3JkaW5haXJlXCIsIFwiUHJvY8OpZHVyZSBsw6lnaXNsYXRpdmVcIl0sXG4gICAgICBbXCJQcm9qZXQgZGUgbG9pIG9yZGluYWlyZVwiLCBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCJdLFxuICAgICAgW1xuICAgICAgICBcIlByb2pldCBkZSByYXRpZmljYXRpb24gZGVzIHRyYWl0w6lzIGV0IGNvbnZlbnRpb25zXCIsXG4gICAgICAg