UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

310 lines (307 loc) 69.8 kB
"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.async-iterator.js"); require("core-js/modules/es.symbol.iterator.js"); require("core-js/modules/es.symbol.to-string-tag.js"); require("core-js/modules/es.array.from.js"); require("core-js/modules/es.array.is-array.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/es.array.reverse.js"); require("core-js/modules/es.function.name.js"); require("core-js/modules/es.json.to-string-tag.js"); require("core-js/modules/es.math.to-string-tag.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-own-property-descriptor.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.string.iterator.js"); require("core-js/modules/es.weak-map.js"); require("core-js/modules/web.dom-collections.for-each.js"); require("core-js/modules/web.dom-collections.iterator.js"); Object.defineProperty(exports, "__esModule", { value: true }); exports.cloneAndUpdateGitRepository = cloneAndUpdateGitRepository; exports.createMosaic = createMosaic; exports.downloadPhoto = downloadPhoto; exports.resizePhoto = resizePhoto; require("core-js/modules/es.array.concat.js"); require("core-js/modules/es.array.find.js"); require("core-js/modules/es.array.for-each.js"); require("core-js/modules/es.array.join.js"); require("core-js/modules/es.array.map.js"); require("core-js/modules/es.array.slice.js"); require("core-js/modules/es.date.to-json.js"); require("core-js/modules/es.date.to-string.js"); require("core-js/modules/es.number.constructor.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/es.promise.js"); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/es.regexp.to-string.js"); require("core-js/modules/es.string.replace.js"); require("core-js/modules/es.string.trim.js"); var _child_process = require("child_process"); var _commandLineArgs = _interopRequireDefault(require("command-line-args")); var _fsExtra = _interopRequireDefault(require("fs-extra")); var _path = _interopRequireDefault(require("path")); var _stream = _interopRequireDefault(require("stream")); var _util = _interopRequireDefault(require("util")); var git = _interopRequireWildcard(require("../git")); var _loaders = require("../loaders"); var _acteurs_et_organes = require("../types/acteurs_et_organes"); var _cli_helpers = require("./shared/cli_helpers"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } 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 _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } var optionsDefinitions = [_cli_helpers.cloneOption, _cli_helpers.commitOption, _cli_helpers.remoteOption, _cli_helpers.silentOption, _cli_helpers.dataDirDefaultOption, _cli_helpers.pullOption, _cli_helpers.fetchOption, _cli_helpers.legislatureOption, { alias: "S", defaultValue: false, name: "square", type: Boolean }, { alias: "w", defaultValue: 150, name: "width", type: Number }, { alias: "h", defaultValue: 192, name: "height", type: Number }]; var options = (0, _commandLineArgs["default"])(optionsDefinitions); function cloneAndUpdateGitRepository(photosDirName, options) { var gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined; var photosDir = _path["default"].join(options.dataDir, photosDirName); git.clone(gitGroupUrl, photosDirName, options.dataDir); if (options.pull) { git.resetAndPull(photosDir); } } function resizePhoto(acteur, width, height, photosDir, photoFilename, options) { var ident = acteur.etatCivil.ident; if (!options.silent) { console.log("Resizing photo ".concat(photoFilename, " for ").concat(ident.prenom, " ").concat(ident.nom, "\u2026")); } (0, _child_process.execSync)("gm convert -resize ".concat(width, "x").concat(height, "! ").concat(photoFilename, ".jpg ").concat(photoFilename, "_").concat(width, "x").concat(height, ".jpg"), { cwd: photosDir }); } function downloadPhoto(_x, _x2, _x3, _x4) { return _downloadPhoto.apply(this, arguments); } function _downloadPhoto() { _downloadPhoto = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(urlPhoto, photoTempFilePath, photoFilePath, missingPhotoFilePath) { var retries, pipeline, attempt, response, _args = arguments; return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: retries = _args.length > 4 && _args[4] !== undefined ? _args[4] : 3; pipeline = _util["default"].promisify(_stream["default"].pipeline); attempt = 1; case 3: if (!(attempt <= retries)) { _context.next = 23; break; } _context.prev = 4; _context.next = 7; return fetch(urlPhoto); case 7: response = _context.sent; if (!response.ok) { _context.next = 13; break; } _context.next = 11; return pipeline(response.body, _fsExtra["default"].createWriteStream(photoTempFilePath)); case 11: _fsExtra["default"].renameSync(photoTempFilePath, photoFilePath); return _context.abrupt("return"); case 13: console.warn("Fetch failed: ".concat(urlPhoto, " (Attempt ").concat(attempt, ") - Status: ").concat(response.status, " ").concat(response.statusText)); _context.next = 20; break; case 16: _context.prev = 16; _context.t0 = _context["catch"](4); console.log(_context.t0); console.warn("Attempt ".concat(attempt, " failed for ").concat(urlPhoto), _context.t0); case 20: attempt++; _context.next = 3; break; case 23: if (_fsExtra["default"].existsSync(photoFilePath)) { console.warn("Reusing existing image: ".concat(photoFilePath)); } else { console.warn("Using blank image: ".concat(missingPhotoFilePath)); _fsExtra["default"].copyFileSync(missingPhotoFilePath, photoFilePath); } case 24: case "end": return _context.stop(); } }, _callee, null, [[4, 16]]); })); return _downloadPhoto.apply(this, arguments); } function createMosaic(acteurUids, photosDir, photosWidth, photosHeight, mosaicFilename) { var photoByIdActeur = {}; var rowsFilenames = []; if (acteurUids.length === 0) return; var _loop = function _loop(rowIndex) { var row = acteurUids.slice(acteurIndex, acteurIndex + 25); var photosFilenames = row.map(function (acteurUid, columnIndex) { var photoFilename = "".concat(acteurUid, "_").concat(photosWidth, "x").concat(photosHeight, ".jpg"); photoByIdActeur[acteurUid] = { chemin: "".concat(photosDir, "/").concat(photoFilename), cheminMosaique: "".concat(photosDir, "/").concat(mosaicFilename, ".jpg"), largeur: photosWidth, hauteur: photosHeight, xMosaique: columnIndex * photosWidth, yMosaique: rowIndex * photosHeight }; return photoFilename; }); var rowFilename = "row-".concat(rowIndex, ".jpg"); (0, _child_process.execSync)("gm convert ".concat(photosFilenames.join(" "), " +append ").concat(rowFilename), { cwd: photosDir }); rowsFilenames.push(rowFilename); }; for (var acteurIndex = 0, rowIndex = 0; acteurIndex < acteurUids.length; acteurIndex += 25, rowIndex++) { _loop(rowIndex); } // Combine all rows into one image (0, _child_process.execSync)("gm convert ".concat(rowsFilenames.join(" "), " -append ").concat(mosaicFilename, ".jpg"), { cwd: photosDir }); // Cleanup individual row images rowsFilenames.forEach(function (rowFilename) { _fsExtra["default"].unlinkSync(_path["default"].join(photosDir, rowFilename)); }); var jsonFilePath = _path["default"].join(photosDir, "".concat(mosaicFilename, ".json")); _fsExtra["default"].writeFileSync(jsonFilePath, JSON.stringify(photoByIdActeur, null, 2)); } function retrievePhotosDeputes() { return _retrievePhotosDeputes.apply(this, arguments); } function _retrievePhotosDeputes() { _retrievePhotosDeputes = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { var dataDir, photosPrefix, photosDirName, photosDir, photosWidth, photosHeight, missingPhotoFilePath, acteurUids, _iterator, _step, acteur, mandats, mandatDepute, numeroDepute, ident, photoFilename, photoFilePath, photoTempFilename, photoTempFilePath, urlPhoto; return _regeneratorRuntime().wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: dataDir = options.dataDir; photosPrefix = "photos_deputes"; photosDirName = "".concat(photosPrefix, "_").concat(options.legislature); photosDir = _path["default"].join(dataDir, photosDirName); photosWidth = options.width; photosHeight = options.height; missingPhotoFilePath = "images/transparent_".concat(photosWidth, "x").concat(photosHeight, ".jpg"); cloneAndUpdateGitRepository(photosDirName, options); _fsExtra["default"].ensureDirSync(photosDir); acteurUids = []; _iterator = _createForOfIteratorHelper((0, _loaders.iterLoadAssembleeActeurs)(dataDir, options.legislature, { noValidation: true })); _context2.prev = 11; _iterator.s(); case 13: if ((_step = _iterator.n()).done) { _context2.next = 37; break; } acteur = _step.value.acteur; mandats = acteur.mandats; if (mandats) { _context2.next = 18; break; } return _context2.abrupt("continue", 35); case 18: mandatDepute = mandats.find(function (mandat) { var _options$legislature; return mandat.xsiType === _acteurs_et_organes.TypeMandat.MandatParlementaireType && mandat.legislature === ((_options$legislature = options.legislature) === null || _options$legislature === void 0 ? void 0 : _options$legislature.toString()) && mandat.typeOrgane === _acteurs_et_organes.CodeTypeOrgane.Assemblee; }); if (mandatDepute) { _context2.next = 21; break; } return _context2.abrupt("continue", 35); case 21: numeroDepute = acteur.uid.substring(2); // Download photos. if (!options.fetch) { _context2.next = 34; break; } ident = acteur.etatCivil.ident; photoFilename = "".concat(numeroDepute, ".jpg"); photoFilePath = _path["default"].join(photosDir, photoFilename); photoTempFilename = "".concat(numeroDepute, "_temp.jpg"); photoTempFilePath = _path["default"].join(photosDir, photoTempFilename); urlPhoto = "http://www2.assemblee-nationale.fr/static/tribun/".concat(options.legislature, "/photos/").concat(photoFilename); if (options.square) { urlPhoto = "https://www2.assemblee-nationale.fr/static/tribun/".concat(options.legislature, "/photos/carre/").concat(photoFilename); } if (!options.silent) { console.log("Loading photo ".concat(urlPhoto, " for ").concat(ident.prenom, " ").concat(ident.nom, "\u2026")); } _context2.next = 33; return downloadPhoto(urlPhoto, photoTempFilePath, photoFilePath, missingPhotoFilePath); case 33: resizePhoto(acteur, photosWidth, photosHeight, photosDir, numeroDepute, options); case 34: acteurUids.push(numeroDepute); case 35: _context2.next = 13; break; case 37: _context2.next = 42; break; case 39: _context2.prev = 39; _context2.t0 = _context2["catch"](11); _iterator.e(_context2.t0); case 42: _context2.prev = 42; _iterator.f(); return _context2.finish(42); case 45: createMosaic(acteurUids, photosDir, photosWidth, photosHeight, "deputes"); if (!options.commit) { _context2.next = 48; break; } return _context2.abrupt("return", git.commitAndPush(photosDir, "Nouvelle moisson", options.remote)); case 48: return _context2.abrupt("return", 0); case 49: case "end": return _context2.stop(); } }, _callee2, null, [[11, 39, 42, 45]]); })); return _retrievePhotosDeputes.apply(this, arguments); } retrievePhotosDeputes().then(function (exitCode) { return process.exit(exitCode); })["catch"](function (error) { console.log(error); process.exit(1); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2hpbGRfcHJvY2VzcyIsInJlcXVpcmUiLCJfY29tbWFuZExpbmVBcmdzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9mc0V4dHJhIiwiX3BhdGgiLCJfc3RyZWFtIiwiX3V0aWwiLCJnaXQiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9sb2FkZXJzIiwiX2FjdGV1cnNfZXRfb3JnYW5lcyIsIl9jbGlfaGVscGVycyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwicHJvdG90eXBlIiwiYyIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIndyYXAiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwidHlwZSIsImFyZyIsImgiLCJsIiwieSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJwIiwiZCIsImdldFByb3RvdHlwZU9mIiwidiIsInZhbHVlcyIsImciLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJpbnZva2UiLCJyZXNvbHZlIiwiX19hd2FpdCIsInRoZW4iLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsIkVycm9yIiwibWV0aG9kIiwiZGVsZWdhdGUiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJyZXN1bHROYW1lIiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXNOYU4iLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsImtleXMiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInN0b3AiLCJydmFsIiwiaGFuZGxlIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiY2xvbmVPcHRpb24iLCJjb21taXRPcHRpb24iLCJyZW1vdGVPcHRpb24iLCJzaWxlbnRPcHRpb24iLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsInB1bGxPcHRpb24iLCJmZXRjaE9wdGlvbiIsImxlZ2lzbGF0dXJlT3B0aW9uIiwiYWxpYXMiLCJkZWZhdWx0VmFsdWUiLCJCb29sZWFuIiwiTnVtYmVyIiwib3B0aW9ucyIsImNvbW1hbmRMaW5lQXJncyIsImNsb25lQW5kVXBkYXRlR2l0UmVwb3NpdG9yeSIsInBob3Rvc0Rpck5hbWUiLCJnaXRHcm91cFVybCIsImNsb25lIiwidHJpbSIsInJlcGxhY2UiLCJ1bmRlZmluZWQiLCJwaG90b3NEaXIiLCJwYXRoIiwiam9pbiIsImRhdGFEaXIiLCJwdWxsIiwicmVzZXRBbmRQdWxsIiwicmVzaXplUGhvdG8iLCJhY3RldXIiLCJ3aWR0aCIsImhlaWdodCIsInBob3RvRmlsZW5hbWUiLCJpZGVudCIsImV0YXRDaXZpbCIsInNpbGVudCIsImNvbnNvbGUiLCJsb2ciLCJjb25jYXQiLCJwcmVub20iLCJub20iLCJleGVjU3luYyIsImN3ZCIsImRvd25sb2FkUGhvdG8iLCJfeCIsIl94MiIsIl94MyIsIl94NCIsIl9kb3dubG9hZFBob3RvIiwiX2NhbGxlZSIsInVybFBob3RvIiwicGhvdG9UZW1wRmlsZVBhdGgiLCJwaG90b0ZpbGVQYXRoIiwibWlzc2luZ1Bob3RvRmlsZVBhdGgiLCJyZXRyaWVzIiwicGlwZWxpbmUiLCJhdHRlbXB0IiwicmVzcG9uc2UiLCJfYXJncyIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJ1dGlsIiwicHJvbWlzaWZ5Iiwic3RyZWFtIiwiZmV0Y2giLCJvayIsImJvZHkiLCJmcyIsImNyZWF0ZVdyaXRlU3RyZWFtIiwicmVuYW1lU3luYyIsIndhcm4iLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwidDAiLCJleGlzdHNTeW5jIiwiY29weUZpbGVTeW5jIiwiY3JlYXRlTW9zYWljIiwiYWN0ZXVyVWlkcyIsInBob3Rvc1dpZHRoIiwicGhvdG9zSGVpZ2h0IiwibW9zYWljRmlsZW5hbWUiLCJwaG90b0J5SWRBY3RldXIiLCJyb3dzRmlsZW5hbWVzIiwiX2xvb3AiLCJyb3dJbmRleCIsInJvdyIsImFjdGV1ckluZGV4IiwicGhvdG9zRmlsZW5hbWVzIiwibWFwIiwiYWN0ZXVyVWlkIiwiY29sdW1uSW5kZXgiLCJjaGVtaW4iLCJjaGVtaW5Nb3NhaXF1ZSIsImxhcmdldXIiLCJoYXV0ZXVyIiwieE1vc2FpcXVlIiwieU1vc2FpcXVlIiwicm93RmlsZW5hbWUiLCJ1bmxpbmtTeW5jIiwianNvbkZpbGVQYXRoIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXRyaWV2ZVBob3Rvc0RlcHV0ZXMiLCJfcmV0cmlldmVQaG90b3NEZXB1dGVzIiwiX2NhbGxlZTIiLCJwaG90b3NQcmVmaXgiLCJfaXRlcmF0b3IiLCJfc3RlcCIsIm1hbmRhdHMiLCJtYW5kYXREZXB1dGUiLCJudW1lcm9EZXB1dGUiLCJwaG90b1RlbXBGaWxlbmFtZSIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImxlZ2lzbGF0dXJlIiwiZW5zdXJlRGlyU3luYyIsIml0ZXJMb2FkQXNzZW1ibGVlQWN0ZXVycyIsIm5vVmFsaWRhdGlvbiIsImZpbmQiLCJtYW5kYXQiLCJfb3B0aW9ucyRsZWdpc2xhdHVyZSIsInhzaVR5cGUiLCJUeXBlTWFuZGF0IiwiTWFuZGF0UGFybGVtZW50YWlyZVR5cGUiLCJ0eXBlT3JnYW5lIiwiQ29kZVR5cGVPcmdhbmUiLCJBc3NlbWJsZWUiLCJ1aWQiLCJzdWJzdHJpbmciLCJzcXVhcmUiLCJjb21taXQiLCJjb21taXRBbmRQdXNoIiwicmVtb3RlIiwiZXhpdENvZGUiLCJwcm9jZXNzIiwiZXhpdCIsImVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmV0cmlldmVfZGVwdXRlc19waG90b3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBzdHJlYW0gZnJvbSBcInN0cmVhbVwiXG5pbXBvcnQgdXRpbCBmcm9tIFwidXRpbFwiXG5pbXBvcnQgKiBhcyBnaXQgZnJvbSBcIi4uL2dpdFwiXG5cbmltcG9ydCB7IGl0ZXJMb2FkQXNzZW1ibGVlQWN0ZXVycyB9IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7XG4gIEFjdGV1cixcbiAgQ29kZVR5cGVPcmdhbmUsXG4gIE1hbmRhdCxcbiAgUGhvdG8sXG4gIFR5cGVNYW5kYXQsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHtcbiAgY2xvbmVPcHRpb24sXG4gIGNvbW1pdE9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICBwdWxsT3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgZmV0Y2hPcHRpb24sXG59IGZyb20gXCIuL3NoYXJlZC9jbGlfaGVscGVyc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgY2xvbmVPcHRpb24sXG4gIGNvbW1pdE9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICBwdWxsT3B0aW9uLFxuICBmZXRjaE9wdGlvbixcbiAgbGVnaXNsYXR1cmVPcHRpb24sXG4gIHtcbiAgICBhbGlhczogXCJTXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICBuYW1lOiBcInNxdWFyZVwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ3XCIsXG4gICAgZGVmYXVsdFZhbHVlOiAxNTAsXG4gICAgbmFtZTogXCJ3aWR0aFwiLFxuICAgIHR5cGU6IE51bWJlcixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcImhcIixcbiAgICBkZWZhdWx0VmFsdWU6IDE5MixcbiAgICBuYW1lOiBcImhlaWdodFwiLFxuICAgIHR5cGU6IE51bWJlcixcbiAgfSxcbl1cbmNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVBbmRVcGRhdGVHaXRSZXBvc2l0b3J5KFxuICBwaG90b3NEaXJOYW1lOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbik6IHZvaWQge1xuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmVcbiAgICA/IG9wdGlvbnMuY2xvbmUudHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCBwaG90b3NEaXIgPSBwYXRoLmpvaW4ob3B0aW9ucy5kYXRhRGlyLCBwaG90b3NEaXJOYW1lKVxuICBnaXQuY2xvbmUoZ2l0R3JvdXBVcmwsIHBob3Rvc0Rpck5hbWUsIG9wdGlvbnMuZGF0YURpcilcblxuICBpZiAob3B0aW9ucy5wdWxsKSB7XG4gICAgZ2l0LnJlc2V0QW5kUHVsbChwaG90b3NEaXIpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZVBob3RvKFxuICBhY3RldXI6IEFjdGV1cixcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIHBob3Rvc0Rpcjogc3RyaW5nLFxuICBwaG90b0ZpbGVuYW1lOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbik6IHZvaWQge1xuICBjb25zdCBpZGVudCA9IGFjdGV1ci5ldGF0Q2l2aWwuaWRlbnRcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFJlc2l6aW5nIHBob3RvICR7cGhvdG9GaWxlbmFtZX0gZm9yICR7aWRlbnQucHJlbm9tfSAke2lkZW50Lm5vbX3igKZgLFxuICAgIClcbiAgfVxuICBleGVjU3luYyhcbiAgICBgZ20gY29udmVydCAtcmVzaXplICR7d2lkdGh9eCR7aGVpZ2h0fSEgJHtwaG90b0ZpbGVuYW1lfS5qcGcgJHtwaG90b0ZpbGVuYW1lfV8ke3dpZHRofXgke2hlaWdodH0uanBnYCxcbiAgICB7XG4gICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICB9LFxuICApXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3dubG9hZFBob3RvKFxuICB1cmxQaG90bzogc3RyaW5nLFxuICBwaG90b1RlbXBGaWxlUGF0aDogc3RyaW5nLFxuICBwaG90b0ZpbGVQYXRoOiBzdHJpbmcsXG4gIG1pc3NpbmdQaG90b0ZpbGVQYXRoOiBzdHJpbmcsXG4gIHJldHJpZXM6IG51bWJlciA9IDMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlwZWxpbmUgPSB1dGlsLnByb21pc2lmeShzdHJlYW0ucGlwZWxpbmUpXG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsUGhvdG8pXG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBhd2FpdCBwaXBlbGluZShcbiAgICAgICAgICByZXNwb25zZS5ib2R5IGFzIHVua25vd24gYXMgTm9kZUpTLlJlYWRhYmxlU3RyZWFtLFxuICAgICAgICAgIGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHBob3RvVGVtcEZpbGVQYXRoKSxcbiAgICAgICAgKVxuICAgICAgICBmcy5yZW5hbWVTeW5jKHBob3RvVGVtcEZpbGVQYXRoLCBwaG90b0ZpbGVQYXRoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgRmV0Y2ggZmFpbGVkOiAke3VybFBob3RvfSAoQXR0ZW1wdCAke2F0dGVtcHR9KSAtIFN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gLFxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgIGNvbnNvbGUud2FybihgQXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZCBmb3IgJHt1cmxQaG90b31gLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBpZiAoZnMuZXhpc3RzU3luYyhwaG90b0ZpbGVQYXRoKSkge1xuICAgIGNvbnNvbGUud2FybihgUmV1c2luZyBleGlzdGluZyBpbWFnZTogJHtwaG90b0ZpbGVQYXRofWApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKGBVc2luZyBibGFuayBpbWFnZTogJHttaXNzaW5nUGhvdG9GaWxlUGF0aH1gKVxuICAgIGZzLmNvcHlGaWxlU3luYyhtaXNzaW5nUGhvdG9GaWxlUGF0aCwgcGhvdG9GaWxlUGF0aClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9zYWljKFxuICBhY3RldXJVaWRzOiBzdHJpbmdbXSxcbiAgcGhvdG9zRGlyOiBzdHJpbmcsXG4gIHBob3Rvc1dpZHRoOiBudW1iZXIsXG4gIHBob3Rvc0hlaWdodDogbnVtYmVyLFxuICBtb3NhaWNGaWxlbmFtZTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbnN0IHBob3RvQnlJZEFjdGV1cjogeyBbdWlkOiBzdHJpbmddOiBQaG90byB9ID0ge31cbiAgY29uc3Qgcm93c0ZpbGVuYW1lczogc3RyaW5nW10gPSBbXVxuXG4gIGlmIChhY3RldXJVaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgZm9yIChcbiAgICBsZXQgYWN0ZXVySW5kZXggPSAwLCByb3dJbmRleCA9IDA7XG4gICAgYWN0ZXVySW5kZXggPCBhY3RldXJVaWRzLmxlbmd0aDtcbiAgICBhY3RldXJJbmRleCArPSAyNSwgcm93SW5kZXgrK1xuICApIHtcbiAgICBjb25zdCByb3cgPSBhY3RldXJVaWRzLnNsaWNlKGFjdGV1ckluZGV4LCBhY3RldXJJbmRleCArIDI1KVxuICAgIGNvbnN0IHBob3Rvc0ZpbGVuYW1lczogc3RyaW5nW10gPSByb3cubWFwKChhY3RldXJVaWQsIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwaG90b0ZpbGVuYW1lID0gYCR7YWN0ZXVyVWlkfV8ke3Bob3Rvc1dpZHRofXgke3Bob3Rvc0hlaWdodH0uanBnYFxuICAgICAgcGhvdG9CeUlkQWN0ZXVyW2FjdGV1clVpZF0gPSB7XG4gICAgICAgIGNoZW1pbjogYCR7cGhvdG9zRGlyfS8ke3Bob3RvRmlsZW5hbWV9YCxcbiAgICAgICAgY2hlbWluTW9zYWlxdWU6IGAke3Bob3Rvc0Rpcn0vJHttb3NhaWNGaWxlbmFtZX0uanBnYCxcbiAgICAgICAgbGFyZ2V1cjogcGhvdG9zV2lkdGgsXG4gICAgICAgIGhhdXRldXI6IHBob3Rvc0hlaWdodCxcbiAgICAgICAgeE1vc2FpcXVlOiBjb2x1bW5JbmRleCAqIHBob3Rvc1dpZHRoLFxuICAgICAgICB5TW9zYWlxdWU6IHJvd0luZGV4ICogcGhvdG9zSGVpZ2h0LFxuICAgICAgfVxuICAgICAgcmV0dXJuIHBob3RvRmlsZW5hbWVcbiAgICB9KVxuXG4gICAgY29uc3Qgcm93RmlsZW5hbWUgPSBgcm93LSR7cm93SW5kZXh9LmpwZ2BcbiAgICBleGVjU3luYyhgZ20gY29udmVydCAke3Bob3Rvc0ZpbGVuYW1lcy5qb2luKFwiIFwiKX0gK2FwcGVuZCAke3Jvd0ZpbGVuYW1lfWAsIHtcbiAgICAgIGN3ZDogcGhvdG9zRGlyLFxuICAgIH0pXG4gICAgcm93c0ZpbGVuYW1lcy5wdXNoKHJvd0ZpbGVuYW1lKVxuICB9XG5cbiAgLy8gQ29tYmluZSBhbGwgcm93cyBpbnRvIG9uZSBpbWFnZVxuICBleGVjU3luYyhcbiAgICBgZ20gY29udmVydCAke3Jvd3NGaWxlbmFtZXMuam9pbihcIiBcIil9IC1hcHBlbmQgJHttb3NhaWNGaWxlbmFtZX0uanBnYCxcbiAgICB7IGN3ZDogcGhvdG9zRGlyIH0sXG4gIClcblxuICAvLyBDbGVhbnVwIGluZGl2aWR1YWwgcm93IGltYWdlc1xuICByb3dzRmlsZW5hbWVzLmZvckVhY2goKHJvd0ZpbGVuYW1lKSA9PiB7XG4gICAgZnMudW5saW5rU3luYyhwYXRoLmpvaW4ocGhvdG9zRGlyLCByb3dGaWxlbmFtZSkpXG4gIH0pXG5cbiAgY29uc3QganNvbkZpbGVQYXRoID0gcGF0aC5qb2luKHBob3Rvc0RpciwgYCR7bW9zYWljRmlsZW5hbWV9Lmpzb25gKVxuICBmcy53cml0ZUZpbGVTeW5jKGpzb25GaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkocGhvdG9CeUlkQWN0ZXVyLCBudWxsLCAyKSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVQaG90b3NEZXB1dGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgcGhvdG9zUHJlZml4ID0gXCJwaG90b3NfZGVwdXRlc1wiXG4gIGNvbnN0IHBob3Rvc0Rpck5hbWUgPSBgJHtwaG90b3NQcmVmaXh9XyR7b3B0aW9ucy5sZWdpc2xhdHVyZX1gXG4gIGNvbnN0IHBob3Rvc0RpciA9IHBhdGguam9pbihkYXRhRGlyLCBwaG90b3NEaXJOYW1lKVxuICBjb25zdCBwaG90b3NXaWR0aCA9IG9wdGlvbnMud2lkdGhcbiAgY29uc3QgcGhvdG9zSGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHRcbiAgY29uc3QgbWlzc2luZ1Bob3RvRmlsZVBhdGggPSBgaW1hZ2VzL3RyYW5zcGFyZW50XyR7cGhvdG9zV2lkdGh9eCR7cGhvdG9zSGVpZ2h0fS5qcGdgXG5cbiAgY2xvbmVBbmRVcGRhdGVHaXRSZXBvc2l0b3J5KHBob3Rvc0Rpck5hbWUsIG9wdGlvbnMpXG4gIGZzLmVuc3VyZURpclN5bmMocGhvdG9zRGlyKVxuXG4gIGNvbnN0IGFjdGV1clVpZHMgPSBbXVxuICBmb3IgKGNvbnN0IHsgYWN0ZXVyIH0gb2YgaXRlckxvYWRBc3NlbWJsZWVBY3RldXJzKFxuICAgIGRhdGFEaXIsXG4gICAgb3B0aW9ucy5sZWdpc2xhdHVyZSxcbiAgICB7IG5vVmFsaWRhdGlvbjogdHJ1ZSB9LFxuICApKSB7XG4gICAgY29uc3QgeyBtYW5kYXRzIH0gPSBhY3RldXJcbiAgICBpZiAoIW1hbmRhdHMpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBtYW5kYXREZXB1dGUgPSBtYW5kYXRzLmZpbmQoXG4gICAgICAobWFuZGF0OiBNYW5kYXQpID0+XG4gICAgICAgIG1hbmRhdC54c2lUeXBlID09PSBUeXBlTWFuZGF0Lk1hbmRhdFBhcmxlbWVudGFpcmVUeXBlICYmXG4gICAgICAgIG1hbmRhdC5sZWdpc2xhdHVyZSA9PT0gb3B0aW9ucy5sZWdpc2xhdHVyZT8udG9TdHJpbmcoKSAmJlxuICAgICAgICBtYW5kYXQudHlwZU9yZ2FuZSA9PT0gQ29kZVR5cGVPcmdhbmUuQXNzZW1ibGVlLFxuICAgIClcbiAgICBpZiAoIW1hbmRhdERlcHV0ZSkgY29udGludWVcblxuICAgIGNvbnN0IG51bWVyb0RlcHV0ZSA9IGFjdGV1ci51aWQuc3Vic3RyaW5nKDIpXG5cbiAgICAvLyBEb3dubG9hZCBwaG90b3MuXG4gICAgaWYgKG9wdGlvbnMuZmV0Y2gpIHtcbiAgICAgIGNvbnN0IGlkZW50ID0gYWN0ZXVyLmV0YXRDaXZpbC5pZGVudFxuICAgICAgY29uc3QgcGhvdG9GaWxlbmFtZSA9IGAke251bWVyb0RlcHV0ZX0uanBnYFxuICAgICAgY29uc3QgcGhvdG9GaWxlUGF0aCA9IHBhdGguam9pbihwaG90b3NEaXIsIHBob3RvRmlsZW5hbWUpXG4gICAgICBjb25zdCBwaG90b1RlbXBGaWxlbmFtZSA9IGAke251bWVyb0RlcHV0ZX1fdGVtcC5qcGdgXG4gICAgICBjb25zdCBwaG90b1RlbXBGaWxlUGF0aCA9IHBhdGguam9pbihwaG90b3NEaXIsIHBob3RvVGVtcEZpbGVuYW1lKVxuICAgICAgbGV0IHVybFBob3RvID0gYGh0dHA6Ly93d3cyLmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvc3RhdGljL3RyaWJ1bi8ke29wdGlvbnMubGVnaXNsYXR1cmV9L3Bob3Rvcy8ke3Bob3RvRmlsZW5hbWV9YFxuICAgICAgaWYgKG9wdGlvbnMuc3F1YXJlKSB7XG4gICAgICAgIHVybFBob3RvID0gYGh0dHBzOi8vd3d3Mi5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyL3N0YXRpYy90cmlidW4vJHtvcHRpb25zLmxlZ2lzbGF0dXJlfS9waG90b3MvY2FycmUvJHtwaG90b0ZpbGVuYW1lfWBcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgTG9hZGluZyBwaG90byAke3VybFBob3RvfSBmb3IgJHtpZGVudC5wcmVub219ICR7aWRlbnQubm9tfeKApmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZG93bmxvYWRQaG90byhcbiAgICAgICAgdXJsUGhvdG8sXG4gICAgICAgIHBob3RvVGVtcEZpbGVQYXRoLFxuICAgICAgICBwaG90b0ZpbGVQYXRoLFxuICAgICAgICBtaXNzaW5nUGhvdG9GaWxlUGF0aCxcbiAgICAgIClcbiAgICAgIHJlc2l6ZVBob3RvKFxuICAgICAgICBhY3RldXIsXG4gICAgICAgIHBob3Rvc1dpZHRoLFxuICAgICAgICBwaG90b3NIZWlnaHQsXG4gICAgICAgIHBob3Rvc0RpcixcbiAgICAgICAgbnVtZXJvRGVwdXRlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuICAgIH1cblxuICAgIGFjdGV1clVpZHMucHVzaChudW1lcm9EZXB1dGUpXG4gIH1cblxuICBjcmVhdGVNb3NhaWMoYWN0ZXVyVWlkcywgcGhvdG9zRGlyLCBwaG90b3NXaWR0aCwgcGhvdG9zSGVpZ2h0LCBcImRlcHV0ZXNcIilcblxuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICByZXR1cm4gZ2l0LmNvbW1pdEFuZFB1c2gocGhvdG9zRGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIiwgb3B0aW9ucy5yZW1vdGUpXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxucmV0cmlldmVQaG90b3NEZXB1dGVzKClcbiAgLnRoZW4oKGV4aXRDb2RlKSA9PiBwcm9jZXNzLmV4aXQoZXhpdENvZGUpKVxuICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH0pXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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