@tricoteuses/senat 1.3.1 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/lib/config.d.ts +1 -0
  2. package/lib/config.js +14 -45
  3. package/lib/databases.js +86 -143
  4. package/lib/datasets.js +78 -83
  5. package/lib/index.d.ts +12 -4
  6. package/lib/index.js +42 -419
  7. package/lib/loaders.js +149 -654
  8. package/lib/model/ameli.js +83 -21
  9. package/lib/model/debats.js +0 -1
  10. package/lib/model/dosleg.d.ts +1 -1
  11. package/lib/model/dosleg.js +179 -73
  12. package/lib/model/index.d.ts +3 -3
  13. package/lib/model/index.js +12 -46
  14. package/lib/model/questions.js +68 -39
  15. package/lib/model/sens.d.ts +1 -1
  16. package/lib/model/sens.js +383 -113
  17. package/lib/model/texte.js +220 -290
  18. package/lib/model/util.js +9 -26
  19. package/lib/raw_types/ameli.js +5 -6
  20. package/lib/raw_types/debats.js +5 -6
  21. package/lib/raw_types/dosleg.js +5 -6
  22. package/lib/raw_types/questions.js +5 -6
  23. package/lib/raw_types/sens.js +5 -6
  24. package/lib/raw_types_schemats/ameli.js +1 -43
  25. package/lib/raw_types_schemats/debats.js +1 -22
  26. package/lib/raw_types_schemats/dosleg.js +1 -96
  27. package/lib/raw_types_schemats/questions.js +1 -22
  28. package/lib/raw_types_schemats/sens.js +1 -112
  29. package/lib/scripts/convert_data.js +181 -631
  30. package/lib/scripts/datautil.js +17 -60
  31. package/lib/scripts/parse_textes.js +46 -129
  32. package/lib/scripts/retrieve_documents.js +247 -513
  33. package/lib/scripts/retrieve_open_data.js +211 -368
  34. package/lib/scripts/retrieve_senateurs_photos.js +144 -239
  35. package/lib/scripts/shared/cli_helpers.js +30 -30
  36. package/lib/scripts/shared/util.js +28 -94
  37. package/lib/strings.js +20 -45
  38. package/lib/types/ameli.d.ts +1 -1
  39. package/lib/types/ameli.js +14 -25
  40. package/lib/types/debats.d.ts +1 -1
  41. package/lib/types/debats.js +3 -21
  42. package/lib/types/dosleg.d.ts +1 -1
  43. package/lib/types/dosleg.js +152 -119
  44. package/lib/types/questions.d.ts +1 -1
  45. package/lib/types/questions.js +1 -13
  46. package/lib/types/sens.d.ts +1 -1
  47. package/lib/types/sens.js +1 -13
  48. package/lib/types/sessions.js +44 -49
  49. package/lib/types/texte.js +17 -22
  50. package/lib/validators/config.js +47 -111
  51. package/lib/validators/senat.js +1 -5
  52. package/package.json +18 -40
  53. package/lib/aggregates.d.ts +0 -52
  54. package/lib/aggregates.mjs +0 -930
  55. package/lib/aggregates.ts +0 -833
  56. package/lib/config.mjs +0 -16
  57. package/lib/config.ts +0 -26
  58. package/lib/data/legislatures.json +0 -38
  59. package/lib/databases.mjs +0 -57
  60. package/lib/databases.ts +0 -71
  61. package/lib/datasets.mjs +0 -78
  62. package/lib/datasets.ts +0 -118
  63. package/lib/fields.d.ts +0 -10
  64. package/lib/fields.mjs +0 -68
  65. package/lib/fields.ts +0 -29
  66. package/lib/index.mjs +0 -4
  67. package/lib/index.ts +0 -42
  68. package/lib/inserters.d.ts +0 -98
  69. package/lib/inserters.mjs +0 -500
  70. package/lib/inserters.ts +0 -521
  71. package/lib/loaders.mjs +0 -158
  72. package/lib/loaders.ts +0 -271
  73. package/lib/model/ameli.mjs +0 -84
  74. package/lib/model/ameli.ts +0 -100
  75. package/lib/model/debats.mjs +0 -1
  76. package/lib/model/debats.ts +0 -0
  77. package/lib/model/dosleg.mjs +0 -196
  78. package/lib/model/dosleg.ts +0 -240
  79. package/lib/model/index.mjs +0 -4
  80. package/lib/model/index.ts +0 -14
  81. package/lib/model/questions.mjs +0 -71
  82. package/lib/model/questions.ts +0 -93
  83. package/lib/model/sens.mjs +0 -415
  84. package/lib/model/sens.ts +0 -516
  85. package/lib/model/texte.mjs +0 -208
  86. package/lib/model/texte.ts +0 -229
  87. package/lib/model/util.mjs +0 -19
  88. package/lib/model/util.ts +0 -32
  89. package/lib/raw_types/ameli.mjs +0 -5
  90. package/lib/raw_types/ameli.ts +0 -951
  91. package/lib/raw_types/debats.mjs +0 -5
  92. package/lib/raw_types/debats.ts +0 -222
  93. package/lib/raw_types/dosleg.mjs +0 -5
  94. package/lib/raw_types/dosleg.ts +0 -3625
  95. package/lib/raw_types/questions.mjs +0 -5
  96. package/lib/raw_types/questions.ts +0 -427
  97. package/lib/raw_types/sens.mjs +0 -5
  98. package/lib/raw_types/sens.ts +0 -4499
  99. package/lib/raw_types_kysely/ameli.d.ts +0 -6
  100. package/lib/raw_types_kysely/ameli.mjs +0 -7
  101. package/lib/raw_types_kysely/ameli.ts +0 -6
  102. package/lib/raw_types_kysely/debats.d.ts +0 -6
  103. package/lib/raw_types_kysely/debats.mjs +0 -7
  104. package/lib/raw_types_kysely/debats.ts +0 -6
  105. package/lib/raw_types_kysely/dosleg.d.ts +0 -6
  106. package/lib/raw_types_kysely/dosleg.mjs +0 -7
  107. package/lib/raw_types_kysely/dosleg.ts +0 -6
  108. package/lib/raw_types_kysely/questions.d.ts +0 -6
  109. package/lib/raw_types_kysely/questions.mjs +0 -7
  110. package/lib/raw_types_kysely/questions.ts +0 -6
  111. package/lib/raw_types_kysely/sens.d.ts +0 -6
  112. package/lib/raw_types_kysely/sens.mjs +0 -7
  113. package/lib/raw_types_kysely/sens.ts +0 -6
  114. package/lib/raw_types_kysely/texte.d.ts +0 -45
  115. package/lib/raw_types_kysely/texte.mjs +0 -7
  116. package/lib/raw_types_kysely/texte.ts +0 -53
  117. package/lib/raw_types_schemats/ameli.mjs +0 -2
  118. package/lib/raw_types_schemats/ameli.ts +0 -601
  119. package/lib/raw_types_schemats/debats.mjs +0 -2
  120. package/lib/raw_types_schemats/debats.ts +0 -145
  121. package/lib/raw_types_schemats/dosleg.mjs +0 -2
  122. package/lib/raw_types_schemats/dosleg.ts +0 -2195
  123. package/lib/raw_types_schemats/questions.mjs +0 -2
  124. package/lib/raw_types_schemats/questions.ts +0 -251
  125. package/lib/raw_types_schemats/sens.mjs +0 -2
  126. package/lib/raw_types_schemats/sens.ts +0 -2907
  127. package/lib/scripts/convert_data.mjs +0 -181
  128. package/lib/scripts/convert_data.ts +0 -243
  129. package/lib/scripts/datautil.mjs +0 -16
  130. package/lib/scripts/datautil.ts +0 -19
  131. package/lib/scripts/images/transparent_150x192.jpg +0 -0
  132. package/lib/scripts/images/transparent_155x225.jpg +0 -0
  133. package/lib/scripts/parse_textes.mjs +0 -46
  134. package/lib/scripts/parse_textes.ts +0 -65
  135. package/lib/scripts/retrieve_documents.mjs +0 -249
  136. package/lib/scripts/retrieve_documents.ts +0 -298
  137. package/lib/scripts/retrieve_open_data.mjs +0 -217
  138. package/lib/scripts/retrieve_open_data.ts +0 -274
  139. package/lib/scripts/retrieve_senateurs_photos.mjs +0 -147
  140. package/lib/scripts/retrieve_senateurs_photos.ts +0 -177
  141. package/lib/scripts/retrieve_textes.d.ts +0 -1
  142. package/lib/scripts/retrieve_textes.mjs +0 -328
  143. package/lib/scripts/retrieve_textes.ts +0 -143
  144. package/lib/scripts/shared/cli_helpers.ts +0 -36
  145. package/lib/scripts/shared/util.ts +0 -33
  146. package/lib/src/aggregates.d.ts +0 -52
  147. package/lib/src/aggregates.mjs +0 -726
  148. package/lib/src/config.d.ts +0 -2
  149. package/lib/src/config.mjs +0 -16
  150. package/lib/src/databases.d.ts +0 -18
  151. package/lib/src/databases.mjs +0 -55
  152. package/lib/src/datasets.d.ts +0 -28
  153. package/lib/src/datasets.mjs +0 -78
  154. package/lib/src/fields.d.ts +0 -10
  155. package/lib/src/fields.mjs +0 -22
  156. package/lib/src/index.d.ts +0 -8
  157. package/lib/src/index.mjs +0 -7
  158. package/lib/src/inserters.d.ts +0 -98
  159. package/lib/src/inserters.mjs +0 -360
  160. package/lib/src/loaders.d.ts +0 -36
  161. package/lib/src/loaders.mjs +0 -107
  162. package/lib/src/model/ameli.d.ts +0 -4
  163. package/lib/src/model/ameli.js +0 -57
  164. package/lib/src/model/debats.d.ts +0 -4
  165. package/lib/src/model/debats.js +0 -43
  166. package/lib/src/model/dosleg.d.ts +0 -197
  167. package/lib/src/model/dosleg.js +0 -169
  168. package/lib/src/model/index.d.ts +0 -4
  169. package/lib/src/model/index.js +0 -4
  170. package/lib/src/model/questions.d.ts +0 -89
  171. package/lib/src/model/questions.js +0 -76
  172. package/lib/src/model/sens.d.ts +0 -390
  173. package/lib/src/model/sens.js +0 -339
  174. package/lib/src/model/texte.d.ts +0 -7
  175. package/lib/src/model/texte.js +0 -183
  176. package/lib/src/raw_types_kysely/ameli.d.ts +0 -915
  177. package/lib/src/raw_types_kysely/ameli.js +0 -5
  178. package/lib/src/raw_types_kysely/debats.d.ts +0 -207
  179. package/lib/src/raw_types_kysely/debats.js +0 -5
  180. package/lib/src/raw_types_kysely/dosleg.d.ts +0 -3532
  181. package/lib/src/raw_types_kysely/dosleg.js +0 -5
  182. package/lib/src/raw_types_kysely/questions.d.ts +0 -414
  183. package/lib/src/raw_types_kysely/questions.js +0 -5
  184. package/lib/src/raw_types_kysely/sens.d.ts +0 -4394
  185. package/lib/src/raw_types_kysely/sens.js +0 -5
  186. package/lib/src/raw_types_schemats/ameli.d.ts +0 -541
  187. package/lib/src/raw_types_schemats/ameli.js +0 -2
  188. package/lib/src/raw_types_schemats/debats.d.ts +0 -127
  189. package/lib/src/raw_types_schemats/debats.js +0 -2
  190. package/lib/src/raw_types_schemats/dosleg.d.ts +0 -2027
  191. package/lib/src/raw_types_schemats/dosleg.js +0 -2
  192. package/lib/src/raw_types_schemats/questions.d.ts +0 -231
  193. package/lib/src/raw_types_schemats/questions.js +0 -2
  194. package/lib/src/raw_types_schemats/sens.d.ts +0 -2709
  195. package/lib/src/raw_types_schemats/sens.js +0 -2
  196. package/lib/src/scripts/convert_data.d.ts +0 -1
  197. package/lib/src/scripts/convert_data.js +0 -95
  198. package/lib/src/scripts/datautil.d.ts +0 -5
  199. package/lib/src/scripts/datautil.js +0 -16
  200. package/lib/src/scripts/parse_textes.d.ts +0 -1
  201. package/lib/src/scripts/parse_textes.js +0 -47
  202. package/lib/src/scripts/retrieve_documents.d.ts +0 -1
  203. package/lib/src/scripts/retrieve_documents.js +0 -258
  204. package/lib/src/scripts/retrieve_open_data.d.ts +0 -1
  205. package/lib/src/scripts/retrieve_open_data.js +0 -214
  206. package/lib/src/scripts/retrieve_senateurs_photos.d.ts +0 -1
  207. package/lib/src/scripts/retrieve_senateurs_photos.js +0 -147
  208. package/lib/src/scripts/shared/cli_helpers.d.ts +0 -44
  209. package/lib/src/scripts/shared/cli_helpers.js +0 -32
  210. package/lib/src/scripts/shared/util.d.ts +0 -3
  211. package/lib/src/scripts/shared/util.js +0 -28
  212. package/lib/src/strings.d.ts +0 -1
  213. package/lib/src/strings.mjs +0 -18
  214. package/lib/src/types/ameli.d.ts +0 -10
  215. package/lib/src/types/ameli.js +0 -13
  216. package/lib/src/types/debats.d.ts +0 -4
  217. package/lib/src/types/debats.js +0 -2
  218. package/lib/src/types/dosleg.d.ts +0 -98
  219. package/lib/src/types/dosleg.js +0 -151
  220. package/lib/src/types/questions.d.ts +0 -2
  221. package/lib/src/types/questions.js +0 -1
  222. package/lib/src/types/sens.d.ts +0 -10
  223. package/lib/src/types/sens.js +0 -1
  224. package/lib/src/types/sessions.d.ts +0 -42
  225. package/lib/src/types/sessions.js +0 -43
  226. package/lib/src/types/texte.d.ts +0 -61
  227. package/lib/src/types/texte.js +0 -16
  228. package/lib/src/validators/config.d.ts +0 -1
  229. package/lib/src/validators/config.js +0 -54
  230. package/lib/src/validators/senat.d.ts +0 -0
  231. package/lib/src/validators/senat.js +0 -24
  232. package/lib/strings.mjs +0 -18
  233. package/lib/strings.ts +0 -26
  234. package/lib/types/ameli.mjs +0 -13
  235. package/lib/types/ameli.ts +0 -21
  236. package/lib/types/debats.mjs +0 -2
  237. package/lib/types/debats.ts +0 -6
  238. package/lib/types/dosleg.mjs +0 -151
  239. package/lib/types/dosleg.ts +0 -284
  240. package/lib/types/questions.mjs +0 -1
  241. package/lib/types/questions.ts +0 -3
  242. package/lib/types/sens.mjs +0 -1
  243. package/lib/types/sens.ts +0 -12
  244. package/lib/types/sessions.mjs +0 -43
  245. package/lib/types/sessions.ts +0 -42
  246. package/lib/types/texte.mjs +0 -16
  247. package/lib/types/texte.ts +0 -76
  248. package/lib/typings/windows-1252.d.js +0 -2
  249. package/lib/typings/windows-1252.d.mjs +0 -2
  250. package/lib/typings/windows-1252.d.ts +0 -11
  251. package/lib/validators/config.mjs +0 -54
  252. package/lib/validators/config.ts +0 -79
  253. package/lib/validators/senat.mjs +0 -24
  254. package/lib/validators/senat.ts +0 -26
@@ -1,521 +1,255 @@
1
1
  "use strict";
2
-
3
- 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); }
4
- require("core-js/modules/es.symbol.js");
5
- require("core-js/modules/es.symbol.description.js");
6
- require("core-js/modules/es.symbol.iterator.js");
7
- require("core-js/modules/es.array.for-each.js");
8
- require("core-js/modules/es.array.from.js");
9
- require("core-js/modules/es.array.is-array.js");
10
- require("core-js/modules/es.array.iterator.js");
11
- require("core-js/modules/es.array.slice.js");
12
- require("core-js/modules/es.object.create.js");
13
- require("core-js/modules/es.object.define-property.js");
14
- require("core-js/modules/es.object.get-prototype-of.js");
15
- require("core-js/modules/es.object.set-prototype-of.js");
16
- require("core-js/modules/es.promise.js");
17
- require("core-js/modules/es.regexp.exec.js");
18
- require("core-js/modules/es.string.iterator.js");
19
- require("core-js/modules/web.dom-collections.for-each.js");
20
- require("core-js/modules/web.dom-collections.iterator.js");
21
- require("core-js/modules/es.array.concat.js");
22
- require("core-js/modules/es.array.join.js");
23
- require("core-js/modules/es.date.to-string.js");
24
- require("core-js/modules/es.function.name.js");
25
- require("core-js/modules/es.object.to-string.js");
26
- require("core-js/modules/es.regexp.to-string.js");
27
- var _assert = _interopRequireDefault(require("assert"));
28
- var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
29
- var _fsExtra = _interopRequireDefault(require("fs-extra"));
30
- var _path = _interopRequireDefault(require("path"));
31
- var _loaders = require("../loaders");
32
- var _texte = require("../model/texte");
33
- var _datautil = require("./datautil");
34
- var _cli_helpers = require("./shared/cli_helpers");
35
- var _util = require("./shared/util");
36
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
37
- 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; } } }; }
38
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return r; }; var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof Symbol ? Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; function c(t, r, e, n) { Object.defineProperty(t, r, { value: e, enumerable: !n, configurable: !n, writable: !n }); } try { c({}, ""); } catch (t) { c = function c(t, r, e) { return t[r] = e; }; } function h(r, e, n, o) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype); return c(a, "_invoke", function (r, e, n) { var o = 1; return function (i, a) { if (3 === o) throw Error("Generator is already running"); if (4 === o) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var u = n.delegate; if (u) { var c = d(u, n); if (c) { if (c === f) continue; return c; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (1 === o) throw o = 4, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = 3; var h = s(r, e, n); if ("normal" === h.type) { if (o = n.done ? 4 : 2, h.arg === f) continue; return { value: h.arg, done: n.done }; } "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); } }; }(r, n, new Context(o || [])), !0), a; } function s(t, r, e) { try { return { type: "normal", arg: t.call(r, e) }; } catch (t) { return { type: "throw", arg: t }; } } r.wrap = h; var f = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var l = {}; c(l, i, function () { return this; }); var p = Object.getPrototypeOf, y = p && p(p(x([]))); y && y !== e && n.call(y, i) && (l = y); var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l); function g(t) { ["next", "throw", "return"].forEach(function (r) { c(t, r, function (t) { return this._invoke(r, t); }); }); } function AsyncIterator(t, r) { function e(o, i, a, u) { var c = s(t[o], t, i); if ("throw" !== c.type) { var h = c.arg, f = h.value; return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { e("next", t, a, u); }, function (t) { e("throw", t, a, u); }) : r.resolve(f).then(function (t) { h.value = t, a(h); }, function (t) { return e("throw", t, a, u); }); } u(c.arg); } var o; c(this, "_invoke", function (t, n) { function i() { return new r(function (r, o) { e(t, n, r, o); }); } return o = o ? o.then(i, i) : i(); }, !0); } function d(r, e) { var n = e.method, o = r.i[n]; if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; var i = s(o, r.i, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; var a = i.arg; return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); } function w(t) { this.tryEntries.push(t); } function m(r) { var e = r[4] || {}; e.type = "normal", e.arg = t, r[4] = e; } function Context(t) { this.tryEntries = [[-1]], t.forEach(w, this), this.reset(!0); } function x(r) { if (null != r) { var e = r[i]; if (e) return e.call(r); if ("function" == typeof r.next) return r; if (!isNaN(r.length)) { var o = -1, a = function e() { for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; return e.value = t, e.done = !0, e; }; return a.next = a; } } throw new TypeError(_typeof(r) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), c(GeneratorFunctionPrototype, u, GeneratorFunction.displayName = "GeneratorFunction"), r.isGeneratorFunction = function (t) { var r = "function" == typeof t && t.constructor; return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); }, r.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = Object.create(v), t; }, r.awrap = function (t) { return { __await: t }; }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { return this; }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(h(t, e, n, o), i); return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, g(v), c(v, u, "Generator"), c(v, i, function () { return this; }), c(v, "toString", function () { return "[object Generator]"; }), r.keys = function (t) { var r = Object(t), e = []; for (var n in r) e.unshift(n); return function t() { for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; return t.done = !0, t; }; }, r.values = x, Context.prototype = { constructor: Context, reset: function reset(r) { if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0][4]; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(r) { if (this.done) throw r; var e = this; function n(t) { a.type = "throw", a.arg = r, e.next = t; } for (var o = e.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i[4], u = this.prev, c = i[1], h = i[2]; if (-1 === i[0]) return n("end"), !1; if (!c && !h) throw Error("try statement without catch or finally"); if (null != i[0] && i[0] <= u) { if (u < c) return this.method = "next", this.arg = t, n(c), !0; if (u < h) return n(h), !1; } } }, abrupt: function abrupt(t, r) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var n = this.tryEntries[e]; if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { var o = n; break; } } o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); var i = o ? o[4] : {}; return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); }, complete: function complete(t, r) { 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 && r && (this.next = r), f; }, finish: function finish(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; } }, "catch": function _catch(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[0] === t) { var n = e[4]; if ("throw" === n.type) { var o = n.arg; m(e); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(r, e, n) { return this.delegate = { i: x(r), r: e, n: n }, "next" === this.method && (this.arg = t), f; } }, r; }
39
- 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); }
40
- 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); }); }; }
41
- function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
42
- 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."); }
43
- 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; } }
44
- function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
45
- function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
46
- 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; }
47
- var optionsDefinitions = [].concat(_toConsumableArray(_cli_helpers.commonOptions), [{
48
- help: "sessions of textes to retrieve; leave empty for all",
49
- multiple: true,
50
- name: "sessions",
51
- type: String
52
- }, {
53
- help: "parse and convert documents into JSON (textes only for now, requires format xml)",
54
- name: "parseDocuments",
55
- type: Boolean
56
- }, {
57
- alias: "F",
58
- help: "formats of documents to retrieve (xml/html/pdf for textes, html/pdf for rapports); leave empty for all",
59
- multiple: true,
60
- name: "formats",
61
- type: String
62
- }, {
63
- help: "types of documents to retrieve (textes/rapports); leave empty for all",
64
- multiple: true,
65
- name: "types",
66
- type: String
67
- }, {
68
- help: "force retrieve all documents, even already retrieved ones",
69
- name: "force",
70
- type: Boolean
71
- }]);
72
- var options = (0, _commandLineArgs["default"])(optionsDefinitions);
73
- var textDecoder = new TextDecoder("utf8");
74
- function retrieveDocument(_x) {
75
- return _retrieveDocument.apply(this, arguments);
76
- }
77
- function _retrieveDocument() {
78
- _retrieveDocument = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(documentUrl) {
79
- var response;
80
- return _regeneratorRuntime().wrap(function _callee$(_context) {
81
- while (1) switch (_context.prev = _context.next) {
82
- case 0:
83
- if (!options.silent) {
84
- console.log("Retrieving document ".concat(documentUrl, "\u2026"));
85
- }
86
- _context.prev = 1;
87
- _context.next = 4;
88
- return (0, _util.fetchWithRetry)(documentUrl);
89
- case 4:
90
- response = _context.sent;
91
- if (response.ok) {
92
- _context.next = 8;
93
- break;
94
- }
95
- if (response.status === 404) {
96
- console.warn("Texte ".concat(documentUrl, " not found"));
97
- } else {
98
- console.error("An error occurred while retrieving texte ".concat(documentUrl, ": ").concat(response.status));
99
- }
100
- return _context.abrupt("return", null);
101
- case 8:
102
- return _context.abrupt("return", response.arrayBuffer());
103
- case 11:
104
- _context.prev = 11;
105
- _context.t0 = _context["catch"](1);
106
- console.error(_context.t0.message);
107
- return _context.abrupt("return", null);
108
- case 15:
109
- case "end":
110
- return _context.stop();
111
- }
112
- }, _callee, null, [[1, 11]]);
113
- }));
114
- return _retrieveDocument.apply(this, arguments);
115
- }
116
- function retrieveTextes(_x2) {
117
- return _retrieveTextes.apply(this, arguments);
118
- }
119
- function _retrieveTextes() {
120
- _retrieveTextes = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(dataDir) {
121
- var textesDir, originalTextesDir, transformedTextesDir, retrievedTextesCount, texteUrlsNotFoundOrError, texteUrlsParseError, _iterator, _step, session, _iterator2, _step2, _texteMetadata$sessio, texteMetadata, texteDir, exposeDesMotifsContent, exposeDesMotifsPath, textePath, texteBuffer, _texteMetadata$sessio2, parsedTexte, texteXml, exposeDesMotifsHtml, transformedTexteDir, _textePath, _texteBuffer, _textePath2, _texteBuffer2;
122
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
123
- while (1) switch (_context2.prev = _context2.next) {
124
- case 0:
125
- textesDir = _path["default"].join(dataDir, _loaders.TEXTE_FOLDER);
126
- _fsExtra["default"].ensureDirSync(textesDir);
127
- originalTextesDir = _path["default"].join(textesDir, _loaders.TEXTE_ORIGINAL_FOLDER);
128
- transformedTextesDir = _path["default"].join(textesDir, _loaders.TEXTE_TRANSFORMED_FOLDER);
129
- if (options.parseDocuments) {
130
- (0, _util.ensureAndClearDir)(transformedTextesDir);
131
- }
132
- retrievedTextesCount = 0;
133
- texteUrlsNotFoundOrError = [];
134
- texteUrlsParseError = [];
135
- _iterator = _createForOfIteratorHelper(options.sessions);
136
- _context2.prev = 9;
137
- _iterator.s();
138
- case 11:
139
- if ((_step = _iterator.n()).done) {
140
- _context2.next = 103;
141
- break;
142
- }
143
- session = _step.value;
144
- _iterator2 = _createForOfIteratorHelper((0, _loaders.iterLoadSenatDossiersLegislatifsTexteUrls)(dataDir, session));
145
- _context2.prev = 14;
146
- _iterator2.s();
147
- case 16:
148
- if ((_step2 = _iterator2.n()).done) {
149
- _context2.next = 93;
150
- break;
151
- }
152
- texteMetadata = _step2.value.item;
153
- texteDir = _path["default"].join(originalTextesDir, "".concat((_texteMetadata$sessio = texteMetadata.session) !== null && _texteMetadata$sessio !== void 0 ? _texteMetadata$sessio : _datautil.UNDEFINED_SESSION), texteMetadata.name);
154
- _fsExtra["default"].ensureDirSync(texteDir);
155
- exposeDesMotifsContent = null;
156
- if (!texteMetadata.url_expose_des_motifs) {
157
- _context2.next = 30;
158
- break;
159
- }
160
- if (!options.silent) {
161
- console.log("Retrieving exposé des motifs…");
162
- }
163
- exposeDesMotifsPath = _path["default"].join(texteDir, "".concat(texteMetadata.name, "-expose.html"));
164
- _context2.next = 26;
165
- return retrieveDocument(texteMetadata.url_expose_des_motifs.toString());
166
- case 26:
167
- exposeDesMotifsContent = _context2.sent;
168
- if (exposeDesMotifsContent) {
169
- _context2.next = 29;
170
- break;
171
- }
172
- return _context2.abrupt("continue", 91);
173
- case 29:
174
- _fsExtra["default"].writeFileSync(exposeDesMotifsPath, Buffer.from(exposeDesMotifsContent));
175
- case 30:
176
- if (!(0, _util.isOptionEmptyOrHasValue)(options.formats, "xml")) {
177
- _context2.next = 63;
178
- break;
179
- }
180
- textePath = _path["default"].join(texteDir, "".concat(texteMetadata.name, ".xml"));
181
- texteBuffer = null;
182
- if (!(!options.force && _fsExtra["default"].existsSync(textePath))) {
183
- _context2.next = 37;
184
- break;
185
- }
186
- if (!options.silent) {
187
- console.info("Already retrieved texte ".concat(textePath, "\u2026"));
188
- }
189
- _context2.next = 45;
190
- break;
191
- case 37:
192
- _context2.next = 39;
193
- return retrieveDocument(texteMetadata.url_xml.toString());
194
- case 39:
195
- texteBuffer = _context2.sent;
196
- if (texteBuffer) {
197
- _context2.next = 43;
198
- break;
199
- }
200
- texteUrlsNotFoundOrError.push(texteMetadata.url_xml);
201
- return _context2.abrupt("continue", 91);
202
- case 43:
203
- _fsExtra["default"].writeFileSync(textePath, Buffer.from(texteBuffer));
204
- retrievedTextesCount++;
205
- case 45:
206
- if (!options.parseDocuments) {
207
- _context2.next = 63;
208
- break;
209
- }
210
- if (!options.silent) {
211
- console.log("Parsing texte ".concat(texteMetadata.name, ".xml\u2026"));
212
- }
213
- parsedTexte = null;
214
- if (!texteBuffer) {
215
- _context2.next = 53;
216
- break;
217
- }
218
- texteXml = textDecoder.decode(texteBuffer);
219
- parsedTexte = (0, _texte.parseTexte)(texteXml);
220
- _context2.next = 56;
221
- break;
222
- case 53:
223
- _context2.next = 55;
224
- return (0, _texte.parseTexteFromFile)(textePath);
225
- case 55:
226
- parsedTexte = _context2.sent;
227
- case 56:
228
- if (parsedTexte) {
229
- _context2.next = 59;
230
- break;
231
- }
232
- texteUrlsParseError.push(texteMetadata.url_xml);
233
- return _context2.abrupt("continue", 91);
234
- case 59:
235
- if (exposeDesMotifsContent) {
236
- if (!options.silent) {
237
- console.log("Parsing exposé des motifs…");
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const command_line_args_1 = __importDefault(require("command-line-args"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const loaders_1 = require("../loaders");
11
+ const texte_1 = require("../model/texte");
12
+ const datautil_1 = require("./datautil");
13
+ const cli_helpers_1 = require("./shared/cli_helpers");
14
+ const util_1 = require("./shared/util");
15
+ const optionsDefinitions = [
16
+ ...cli_helpers_1.commonOptions,
17
+ {
18
+ help: "sessions of textes to retrieve; leave empty for all",
19
+ multiple: true,
20
+ name: "sessions",
21
+ type: String,
22
+ },
23
+ {
24
+ help: "parse and convert documents into JSON (textes only for now, requires format xml)",
25
+ name: "parseDocuments",
26
+ type: Boolean,
27
+ },
28
+ {
29
+ alias: "F",
30
+ help: "formats of documents to retrieve (xml/html/pdf for textes, html/pdf for rapports); leave empty for all",
31
+ multiple: true,
32
+ name: "formats",
33
+ type: String,
34
+ },
35
+ {
36
+ help: "types of documents to retrieve (textes/rapports); leave empty for all",
37
+ multiple: true,
38
+ name: "types",
39
+ type: String,
40
+ },
41
+ {
42
+ help: "force retrieve all documents, even already retrieved ones",
43
+ name: "force",
44
+ type: Boolean,
45
+ },
46
+ ];
47
+ const options = (0, command_line_args_1.default)(optionsDefinitions);
48
+ const textDecoder = new TextDecoder("utf8");
49
+ async function retrieveDocument(documentUrl) {
50
+ if (!options["silent"]) {
51
+ console.log(`Retrieving document ${documentUrl}…`);
52
+ }
53
+ try {
54
+ const response = await (0, util_1.fetchWithRetry)(documentUrl);
55
+ if (!response.ok) {
56
+ if (response.status === 404) {
57
+ console.warn(`Texte ${documentUrl} not found`);
238
58
  }
239
- exposeDesMotifsHtml = textDecoder.decode(exposeDesMotifsContent);
240
- parsedTexte.exposeDesMotifs = (0, _texte.parseExposeDesMotifs)(exposeDesMotifsHtml);
241
- }
242
- transformedTexteDir = _path["default"].join(transformedTextesDir, "".concat((_texteMetadata$sessio2 = texteMetadata.session) !== null && _texteMetadata$sessio2 !== void 0 ? _texteMetadata$sessio2 : _datautil.UNDEFINED_SESSION), texteMetadata.name);
243
- _fsExtra["default"].ensureDirSync(transformedTexteDir);
244
- _fsExtra["default"].writeJSONSync(_path["default"].join(transformedTexteDir, "".concat(texteMetadata.name, ".json")), parsedTexte, {
245
- spaces: 2
246
- });
247
- case 63:
248
- if (!(0, _util.isOptionEmptyOrHasValue)(options.formats, "html")) {
249
- _context2.next = 77;
250
- break;
251
- }
252
- _textePath = _path["default"].join(texteDir, "".concat(texteMetadata.name, ".html"));
253
- if (!(!options.force && _fsExtra["default"].existsSync(_textePath))) {
254
- _context2.next = 69;
255
- break;
256
- }
257
- if (!options.silent) {
258
- console.info("Already retrieved texte ".concat(_textePath, "\u2026"));
259
- }
260
- _context2.next = 77;
261
- break;
262
- case 69:
263
- _context2.next = 71;
264
- return retrieveDocument(texteMetadata.url_html.toString());
265
- case 71:
266
- _texteBuffer = _context2.sent;
267
- if (_texteBuffer) {
268
- _context2.next = 75;
269
- break;
270
- }
271
- texteUrlsNotFoundOrError.push(texteMetadata.url_html);
272
- return _context2.abrupt("continue", 91);
273
- case 75:
274
- _fsExtra["default"].writeFileSync(_textePath, Buffer.from(_texteBuffer));
275
- retrievedTextesCount++;
276
- case 77:
277
- if (!(0, _util.isOptionEmptyOrHasValue)(options.formats, "pdf")) {
278
- _context2.next = 91;
279
- break;
280
- }
281
- _textePath2 = _path["default"].join(texteDir, "".concat(texteMetadata.name, ".pdf"));
282
- if (!(!options.force && _fsExtra["default"].existsSync(_textePath2))) {
283
- _context2.next = 83;
284
- break;
285
- }
286
- if (!options.silent) {
287
- console.info("Already retrieved texte ".concat(_textePath2, "\u2026"));
288
- }
289
- _context2.next = 91;
290
- break;
291
- case 83:
292
- _context2.next = 85;
293
- return retrieveDocument(texteMetadata.url_pdf.toString());
294
- case 85:
295
- _texteBuffer2 = _context2.sent;
296
- if (_texteBuffer2) {
297
- _context2.next = 89;
298
- break;
299
- }
300
- texteUrlsNotFoundOrError.push(texteMetadata.url_pdf);
301
- return _context2.abrupt("continue", 91);
302
- case 89:
303
- _fsExtra["default"].writeFileSync(_textePath2, Buffer.from(_texteBuffer2));
304
- retrievedTextesCount++;
305
- case 91:
306
- _context2.next = 16;
307
- break;
308
- case 93:
309
- _context2.next = 98;
310
- break;
311
- case 95:
312
- _context2.prev = 95;
313
- _context2.t0 = _context2["catch"](14);
314
- _iterator2.e(_context2.t0);
315
- case 98:
316
- _context2.prev = 98;
317
- _iterator2.f();
318
- return _context2.finish(98);
319
- case 101:
320
- _context2.next = 11;
321
- break;
322
- case 103:
323
- _context2.next = 108;
324
- break;
325
- case 105:
326
- _context2.prev = 105;
327
- _context2.t1 = _context2["catch"](9);
328
- _iterator.e(_context2.t1);
329
- case 108:
330
- _context2.prev = 108;
331
- _iterator.f();
332
- return _context2.finish(108);
333
- case 111:
334
- if (options.verbose) {
335
- console.log("".concat(retrievedTextesCount, " textes retrieved"));
336
- console.log("".concat(texteUrlsNotFoundOrError.length, " textes failed to be retrieved with URLs ").concat(texteUrlsNotFoundOrError.join(", ")));
337
- if (options.parseDocuments) {
338
- console.log("".concat(texteUrlsParseError.length, " textes failed to be parsed with URLs ").concat(texteUrlsParseError.join(", ")));
59
+ else {
60
+ console.error(`An error occurred while retrieving texte ${documentUrl}: ${response.status}`);
339
61
  }
340
- }
341
- case 112:
342
- case "end":
343
- return _context2.stop();
344
- }
345
- }, _callee2, null, [[9, 105, 108, 111], [14, 95, 98, 101]]);
346
- }));
347
- return _retrieveTextes.apply(this, arguments);
62
+ return null;
63
+ }
64
+ return response.arrayBuffer();
65
+ }
66
+ catch (error) {
67
+ console.error(error.message);
68
+ return null;
69
+ }
348
70
  }
349
- function retrieveRapports(_x3) {
350
- return _retrieveRapports.apply(this, arguments);
351
- }
352
- function _retrieveRapports() {
353
- _retrieveRapports = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(dataDir) {
354
- var rapportsDir, retrievedRapportsCount, rapportUrlsNotFoundOrError, _iterator3, _step3, session, _iterator4, _step4, _rapportMetadata$sess, rapportMetadata, rapportDir, rapportPath, rapportBuffer, _rapportPath, _rapportBuffer;
355
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
356
- while (1) switch (_context3.prev = _context3.next) {
357
- case 0:
358
- rapportsDir = _path["default"].join(dataDir, _loaders.RAPPORT_FOLDER);
359
- _fsExtra["default"].ensureDirSync(rapportsDir);
360
- retrievedRapportsCount = 0;
361
- rapportUrlsNotFoundOrError = [];
362
- _iterator3 = _createForOfIteratorHelper(options.sessions);
363
- _context3.prev = 5;
364
- _iterator3.s();
365
- case 7:
366
- if ((_step3 = _iterator3.n()).done) {
367
- _context3.next = 54;
368
- break;
369
- }
370
- session = _step3.value;
371
- _iterator4 = _createForOfIteratorHelper((0, _loaders.iterLoadSenatDossiersLegislatifsRapportUrls)(dataDir, session));
372
- _context3.prev = 10;
373
- _iterator4.s();
374
- case 12:
375
- if ((_step4 = _iterator4.n()).done) {
376
- _context3.next = 44;
377
- break;
378
- }
379
- rapportMetadata = _step4.value.item;
380
- rapportDir = _path["default"].join(rapportsDir, "".concat((_rapportMetadata$sess = rapportMetadata.session) !== null && _rapportMetadata$sess !== void 0 ? _rapportMetadata$sess : _datautil.UNDEFINED_SESSION), rapportMetadata.name);
381
- _fsExtra["default"].ensureDirSync(rapportDir);
382
- if (!(0, _util.isOptionEmptyOrHasValue)(options.formats, "html")) {
383
- _context3.next = 29;
384
- break;
385
- }
386
- rapportPath = _path["default"].join(rapportDir, "".concat(rapportMetadata.name, ".html"));
387
- if (!(!options.force && _fsExtra["default"].existsSync(rapportPath))) {
388
- _context3.next = 21;
389
- break;
390
- }
391
- if (!options.silent) {
392
- console.info("Already retrieved rapport ".concat(rapportPath, "\u2026"));
393
- }
394
- return _context3.abrupt("continue", 42);
395
- case 21:
396
- _context3.next = 23;
397
- return retrieveDocument(rapportMetadata.url_html.toString());
398
- case 23:
399
- rapportBuffer = _context3.sent;
400
- if (rapportBuffer) {
401
- _context3.next = 27;
402
- break;
403
- }
404
- rapportUrlsNotFoundOrError.push(rapportMetadata.url_html);
405
- return _context3.abrupt("continue", 42);
406
- case 27:
407
- _fsExtra["default"].writeFileSync(rapportPath, Buffer.from(rapportBuffer));
408
- retrievedRapportsCount++;
409
- case 29:
410
- if (!(0, _util.isOptionEmptyOrHasValue)(options.formats, "pdf")) {
411
- _context3.next = 42;
412
- break;
413
- }
414
- _rapportPath = _path["default"].join(rapportDir, "".concat(rapportMetadata.name, ".pdf"));
415
- if (!(!options.force && _fsExtra["default"].existsSync(_rapportPath))) {
416
- _context3.next = 34;
417
- break;
418
- }
419
- if (!options.silent) {
420
- console.info("Already retrieved rapport ".concat(_rapportPath, "\u2026"));
421
- }
422
- return _context3.abrupt("continue", 42);
423
- case 34:
424
- _context3.next = 36;
425
- return retrieveDocument(rapportMetadata.url_pdf.toString());
426
- case 36:
427
- _rapportBuffer = _context3.sent;
428
- if (_rapportBuffer) {
429
- _context3.next = 40;
430
- break;
431
- }
432
- rapportUrlsNotFoundOrError.push(rapportMetadata.url_pdf);
433
- return _context3.abrupt("continue", 42);
434
- case 40:
435
- _fsExtra["default"].writeFileSync(_rapportPath, Buffer.from(_rapportBuffer));
436
- retrievedRapportsCount++;
437
- case 42:
438
- _context3.next = 12;
439
- break;
440
- case 44:
441
- _context3.next = 49;
442
- break;
443
- case 46:
444
- _context3.prev = 46;
445
- _context3.t0 = _context3["catch"](10);
446
- _iterator4.e(_context3.t0);
447
- case 49:
448
- _context3.prev = 49;
449
- _iterator4.f();
450
- return _context3.finish(49);
451
- case 52:
452
- _context3.next = 7;
453
- break;
454
- case 54:
455
- _context3.next = 59;
456
- break;
457
- case 56:
458
- _context3.prev = 56;
459
- _context3.t1 = _context3["catch"](5);
460
- _iterator3.e(_context3.t1);
461
- case 59:
462
- _context3.prev = 59;
463
- _iterator3.f();
464
- return _context3.finish(59);
465
- case 62:
466
- if (options.verbose) {
467
- console.log("".concat(retrievedRapportsCount, " rapports retrieved"));
468
- console.log("".concat(rapportUrlsNotFoundOrError.length, " rapports failed with URLs ").concat(rapportUrlsNotFoundOrError.join(", ")));
469
- }
470
- case 63:
471
- case "end":
472
- return _context3.stop();
473
- }
474
- }, _callee3, null, [[5, 56, 59, 62], [10, 46, 49, 52]]);
475
- }));
476
- return _retrieveRapports.apply(this, arguments);
71
+ async function retrieveTextes(dataDir) {
72
+ const textesDir = path_1.default.join(dataDir, loaders_1.TEXTE_FOLDER);
73
+ fs_extra_1.default.ensureDirSync(textesDir);
74
+ const originalTextesDir = path_1.default.join(textesDir, loaders_1.TEXTE_ORIGINAL_FOLDER);
75
+ const transformedTextesDir = path_1.default.join(textesDir, loaders_1.TEXTE_TRANSFORMED_FOLDER);
76
+ if (options["parseDocuments"]) {
77
+ (0, util_1.ensureAndClearDir)(transformedTextesDir);
78
+ }
79
+ let retrievedTextesCount = 0;
80
+ const texteUrlsNotFoundOrError = [];
81
+ const texteUrlsParseError = [];
82
+ for (const session of options["sessions"]) {
83
+ for (const { item: texteMetadata, } of (0, loaders_1.iterLoadSenatDossiersLegislatifsTexteUrls)(dataDir, session)) {
84
+ const texteDir = path_1.default.join(originalTextesDir, `${texteMetadata.session ?? datautil_1.UNDEFINED_SESSION}`, texteMetadata.name);
85
+ fs_extra_1.default.ensureDirSync(texteDir);
86
+ let exposeDesMotifsContent = null;
87
+ if (texteMetadata.url_expose_des_motifs) {
88
+ if (!options["silent"]) {
89
+ console.log("Retrieving exposé des motifs…");
90
+ }
91
+ const exposeDesMotifsPath = path_1.default.join(texteDir, `${texteMetadata.name}-expose.html`);
92
+ exposeDesMotifsContent = await retrieveDocument(texteMetadata.url_expose_des_motifs.toString());
93
+ if (!exposeDesMotifsContent) {
94
+ continue;
95
+ }
96
+ fs_extra_1.default.writeFileSync(exposeDesMotifsPath, Buffer.from(exposeDesMotifsContent));
97
+ }
98
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "xml")) {
99
+ const textePath = path_1.default.join(texteDir, `${texteMetadata.name}.xml`);
100
+ let texteBuffer = null;
101
+ if (!options["force"] && fs_extra_1.default.existsSync(textePath)) {
102
+ if (!options["silent"]) {
103
+ console.info(`Already retrieved texte ${textePath}…`);
104
+ }
105
+ }
106
+ else {
107
+ texteBuffer = await retrieveDocument(texteMetadata.url_xml.toString());
108
+ if (!texteBuffer) {
109
+ texteUrlsNotFoundOrError.push(texteMetadata.url_xml);
110
+ continue;
111
+ }
112
+ fs_extra_1.default.writeFileSync(textePath, Buffer.from(texteBuffer));
113
+ retrievedTextesCount++;
114
+ }
115
+ if (options["parseDocuments"]) {
116
+ if (!options["silent"]) {
117
+ console.log(`Parsing texte ${texteMetadata.name}.xml…`);
118
+ }
119
+ let parsedTexte = null;
120
+ if (texteBuffer) {
121
+ const texteXml = textDecoder.decode(texteBuffer);
122
+ parsedTexte = (0, texte_1.parseTexte)(texteXml);
123
+ }
124
+ else {
125
+ parsedTexte = await (0, texte_1.parseTexteFromFile)(textePath);
126
+ }
127
+ if (!parsedTexte) {
128
+ texteUrlsParseError.push(texteMetadata.url_xml);
129
+ continue;
130
+ }
131
+ if (exposeDesMotifsContent) {
132
+ if (!options["silent"]) {
133
+ console.log("Parsing exposé des motifs…");
134
+ }
135
+ const exposeDesMotifsHtml = textDecoder.decode(exposeDesMotifsContent);
136
+ parsedTexte.exposeDesMotifs =
137
+ (0, texte_1.parseExposeDesMotifs)(exposeDesMotifsHtml);
138
+ }
139
+ const transformedTexteDir = path_1.default.join(transformedTextesDir, `${texteMetadata.session ?? datautil_1.UNDEFINED_SESSION}`, texteMetadata.name);
140
+ fs_extra_1.default.ensureDirSync(transformedTexteDir);
141
+ fs_extra_1.default.writeJSONSync(path_1.default.join(transformedTexteDir, `${texteMetadata.name}.json`), parsedTexte, { spaces: 2 });
142
+ }
143
+ }
144
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "html")) {
145
+ const textePath = path_1.default.join(texteDir, `${texteMetadata.name}.html`);
146
+ if (!options["force"] && fs_extra_1.default.existsSync(textePath)) {
147
+ if (!options["silent"]) {
148
+ console.info(`Already retrieved texte ${textePath}…`);
149
+ }
150
+ }
151
+ else {
152
+ const texteBuffer = await retrieveDocument(texteMetadata.url_html.toString());
153
+ if (!texteBuffer) {
154
+ texteUrlsNotFoundOrError.push(texteMetadata.url_html);
155
+ continue;
156
+ }
157
+ fs_extra_1.default.writeFileSync(textePath, Buffer.from(texteBuffer));
158
+ retrievedTextesCount++;
159
+ }
160
+ }
161
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "pdf")) {
162
+ const textePath = path_1.default.join(texteDir, `${texteMetadata.name}.pdf`);
163
+ if (!options["force"] && fs_extra_1.default.existsSync(textePath)) {
164
+ if (!options["silent"]) {
165
+ console.info(`Already retrieved texte ${textePath}…`);
166
+ }
167
+ }
168
+ else {
169
+ const texteBuffer = await retrieveDocument(texteMetadata.url_pdf.toString());
170
+ if (!texteBuffer) {
171
+ texteUrlsNotFoundOrError.push(texteMetadata.url_pdf);
172
+ continue;
173
+ }
174
+ fs_extra_1.default.writeFileSync(textePath, Buffer.from(texteBuffer));
175
+ retrievedTextesCount++;
176
+ }
177
+ }
178
+ }
179
+ }
180
+ if (options["verbose"]) {
181
+ console.log(`${retrievedTextesCount} textes retrieved`);
182
+ console.log(`${texteUrlsNotFoundOrError.length} textes failed to be retrieved with URLs ${texteUrlsNotFoundOrError.join(", ")}`);
183
+ if (options["parseDocuments"]) {
184
+ console.log(`${texteUrlsParseError.length} textes failed to be parsed with URLs ${texteUrlsParseError.join(", ")}`);
185
+ }
186
+ }
477
187
  }
478
- function main() {
479
- return _main.apply(this, arguments);
188
+ async function retrieveRapports(dataDir) {
189
+ const rapportsDir = path_1.default.join(dataDir, loaders_1.RAPPORT_FOLDER);
190
+ fs_extra_1.default.ensureDirSync(rapportsDir);
191
+ let retrievedRapportsCount = 0;
192
+ const rapportUrlsNotFoundOrError = [];
193
+ for (const session of options["sessions"]) {
194
+ for (const { item: rapportMetadata, } of (0, loaders_1.iterLoadSenatDossiersLegislatifsRapportUrls)(dataDir, session)) {
195
+ const rapportDir = path_1.default.join(rapportsDir, `${rapportMetadata.session ?? datautil_1.UNDEFINED_SESSION}`, rapportMetadata.name);
196
+ fs_extra_1.default.ensureDirSync(rapportDir);
197
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "html")) {
198
+ const rapportPath = path_1.default.join(rapportDir, `${rapportMetadata.name}.html`);
199
+ if (!options["force"] && fs_extra_1.default.existsSync(rapportPath)) {
200
+ if (!options["silent"]) {
201
+ console.info(`Already retrieved rapport ${rapportPath}…`);
202
+ }
203
+ continue;
204
+ }
205
+ const rapportBuffer = await retrieveDocument(rapportMetadata.url_html.toString());
206
+ if (!rapportBuffer) {
207
+ rapportUrlsNotFoundOrError.push(rapportMetadata.url_html);
208
+ continue;
209
+ }
210
+ fs_extra_1.default.writeFileSync(rapportPath, Buffer.from(rapportBuffer));
211
+ retrievedRapportsCount++;
212
+ }
213
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "pdf")) {
214
+ const rapportPath = path_1.default.join(rapportDir, `${rapportMetadata.name}.pdf`);
215
+ if (!options["force"] && fs_extra_1.default.existsSync(rapportPath)) {
216
+ if (!options["silent"]) {
217
+ console.info(`Already retrieved rapport ${rapportPath}…`);
218
+ }
219
+ continue;
220
+ }
221
+ const rapportBuffer = await retrieveDocument(rapportMetadata.url_pdf.toString());
222
+ if (!rapportBuffer) {
223
+ rapportUrlsNotFoundOrError.push(rapportMetadata.url_pdf);
224
+ continue;
225
+ }
226
+ fs_extra_1.default.writeFileSync(rapportPath, Buffer.from(rapportBuffer));
227
+ retrievedRapportsCount++;
228
+ }
229
+ }
230
+ }
231
+ if (options["verbose"]) {
232
+ console.log(`${retrievedRapportsCount} rapports retrieved`);
233
+ console.log(`${rapportUrlsNotFoundOrError.length} rapports failed with URLs ${rapportUrlsNotFoundOrError.join(", ")}`);
234
+ }
480
235
  }
481
- function _main() {
482
- _main = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
483
- var dataDir;
484
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
485
- while (1) switch (_context4.prev = _context4.next) {
486
- case 0:
487
- dataDir = options.dataDir;
488
- (0, _assert["default"])(dataDir, "Missing argument: data directory");
489
- console.time("documents processing time");
490
- if (!(0, _util.isOptionEmptyOrHasValue)(options.types, "textes")) {
491
- _context4.next = 6;
492
- break;
493
- }
494
- _context4.next = 6;
495
- return retrieveTextes(dataDir);
496
- case 6:
497
- if (!(0, _util.isOptionEmptyOrHasValue)(options.types, "rapports")) {
498
- _context4.next = 9;
499
- break;
500
- }
501
- _context4.next = 9;
502
- return retrieveRapports(dataDir);
503
- case 9:
504
- if (!options.silent) {
505
- console.timeEnd("documents processing time");
506
- }
507
- case 10:
508
- case "end":
509
- return _context4.stop();
510
- }
511
- }, _callee4);
512
- }));
513
- return _main.apply(this, arguments);
236
+ async function main() {
237
+ const dataDir = options["dataDir"];
238
+ (0, assert_1.default)(dataDir, "Missing argument: data directory");
239
+ console.time("documents processing time");
240
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["types"], "textes")) {
241
+ await retrieveTextes(dataDir);
242
+ }
243
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["types"], "rapports")) {
244
+ await retrieveRapports(dataDir);
245
+ }
246
+ if (!options["silent"]) {
247
+ console.timeEnd("documents processing time");
248
+ }
514
249
  }
515
- main().then(function () {
516
- return process.exit(0);
517
- })["catch"](function (error) {
518
- console.log(error);
519
- process.exit(1);
250
+ main()
251
+ .then(() => process.exit(0))
252
+ .catch((error) => {
253
+ console.log(error);
254
+ process.exit(1);
520
255
  });
521
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29tbWFuZExpbmVBcmdzIiwiX2ZzRXh0cmEiLCJfcGF0aCIsIl9sb2FkZXJzIiwiX3RleHRlIiwiX2RhdGF1dGlsIiwiX2NsaV9oZWxwZXJzIiwiX3V0aWwiLCJlIiwiX19lc01vZHVsZSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiaSIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZyIsImMiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImgiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJFcnJvciIsIm1ldGhvZCIsImFyZyIsImRlbGVnYXRlIiwiZCIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwidHlwZSIsIkNvbnRleHQiLCJ3cmFwIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImwiLCJwIiwiZ2V0UHJvdG90eXBlT2YiLCJ5IiwieCIsInYiLCJnIiwiZm9yRWFjaCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiX3R5cGVvZiIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsInciLCJ0cnlFbnRyaWVzIiwicHVzaCIsIm0iLCJyZXNldCIsImlzTmFOIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJrZXlzIiwidW5zaGlmdCIsInBvcCIsInZhbHVlcyIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJydmFsIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJmcm9tIiwidGVzdCIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImNvbmNhdCIsImNvbW1vbk9wdGlvbnMiLCJoZWxwIiwibXVsdGlwbGUiLCJTdHJpbmciLCJCb29sZWFuIiwiYWxpYXMiLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwidGV4dERlY29kZXIiLCJUZXh0RGVjb2RlciIsInJldHJpZXZlRG9jdW1lbnQiLCJfeCIsIl9yZXRyaWV2ZURvY3VtZW50IiwiX2NhbGxlZSIsImRvY3VtZW50VXJsIiwicmVzcG9uc2UiLCJfY2FsbGVlJCIsIl9jb250ZXh0Iiwic2lsZW50IiwiY29uc29sZSIsImxvZyIsImZldGNoV2l0aFJldHJ5Iiwib2siLCJzdGF0dXMiLCJ3YXJuIiwiZXJyb3IiLCJhcnJheUJ1ZmZlciIsInQwIiwibWVzc2FnZSIsInJldHJpZXZlVGV4dGVzIiwiX3gyIiwiX3JldHJpZXZlVGV4dGVzIiwiX2NhbGxlZTIiLCJkYXRhRGlyIiwidGV4dGVzRGlyIiwib3JpZ2luYWxUZXh0ZXNEaXIiLCJ0cmFuc2Zvcm1lZFRleHRlc0RpciIsInJldHJpZXZlZFRleHRlc0NvdW50IiwidGV4dGVVcmxzTm90Rm91bmRPckVycm9yIiwidGV4dGVVcmxzUGFyc2VFcnJvciIsIl9pdGVyYXRvciIsIl9zdGVwIiwic2Vzc2lvbiIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfdGV4dGVNZXRhZGF0YSRzZXNzaW8iLCJ0ZXh0ZU1ldGFkYXRhIiwidGV4dGVEaXIiLCJleHBvc2VEZXNNb3RpZnNDb250ZW50IiwiZXhwb3NlRGVzTW90aWZzUGF0aCIsInRleHRlUGF0aCIsInRleHRlQnVmZmVyIiwiX3RleHRlTWV0YWRhdGEkc2Vzc2lvMiIsInBhcnNlZFRleHRlIiwidGV4dGVYbWwiLCJleHBvc2VEZXNNb3RpZnNIdG1sIiwidHJhbnNmb3JtZWRUZXh0ZURpciIsIl90ZXh0ZVBhdGgiLCJfdGV4dGVCdWZmZXIiLCJfdGV4dGVQYXRoMiIsIl90ZXh0ZUJ1ZmZlcjIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJwYXRoIiwiam9pbiIsIlRFWFRFX0ZPTERFUiIsImZzIiwiZW5zdXJlRGlyU3luYyIsIlRFWFRFX09SSUdJTkFMX0ZPTERFUiIsIlRFWFRFX1RSQU5TRk9STUVEX0ZPTERFUiIsInBhcnNlRG9jdW1lbnRzIiwiZW5zdXJlQW5kQ2xlYXJEaXIiLCJzZXNzaW9ucyIsIml0ZXJMb2FkU2VuYXREb3NzaWVyc0xlZ2lzbGF0aWZzVGV4dGVVcmxzIiwiaXRlbSIsIlVOREVGSU5FRF9TRVNTSU9OIiwidXJsX2V4cG9zZV9kZXNfbW90aWZzIiwid3JpdGVGaWxlU3luYyIsIkJ1ZmZlciIsImlzT3B0aW9uRW1wdHlPckhhc1ZhbHVlIiwiZm9ybWF0cyIsImZvcmNlIiwiZXhpc3RzU3luYyIsImluZm8iLCJ1cmxfeG1sIiwiZGVjb2RlIiwicGFyc2VUZXh0ZSIsInBhcnNlVGV4dGVGcm9tRmlsZSIsImV4cG9zZURlc01vdGlmcyIsInBhcnNlRXhwb3NlRGVzTW90aWZzIiwid3JpdGVKU09OU3luYyIsInNwYWNlcyIsInVybF9odG1sIiwidXJsX3BkZiIsInQxIiwidmVyYm9zZSIsInJldHJpZXZlUmFwcG9ydHMiLCJfeDMiLCJfcmV0cmlldmVSYXBwb3J0cyIsIl9jYWxsZWUzIiwicmFwcG9ydHNEaXIiLCJyZXRyaWV2ZWRSYXBwb3J0c0NvdW50IiwicmFwcG9ydFVybHNOb3RGb3VuZE9yRXJyb3IiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiX2l0ZXJhdG9yNCIsIl9zdGVwNCIsIl9yYXBwb3J0TWV0YWRhdGEkc2VzcyIsInJhcHBvcnRNZXRhZGF0YSIsInJhcHBvcnREaXIiLCJyYXBwb3J0UGF0aCIsInJhcHBvcnRCdWZmZXIiLCJfcmFwcG9ydFBhdGgiLCJfcmFwcG9ydEJ1ZmZlciIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsIlJBUFBPUlRfRk9MREVSIiwiaXRlckxvYWRTZW5hdERvc3NpZXJzTGVnaXNsYXRpZnNSYXBwb3J0VXJscyIsIm1haW4iLCJfbWFpbiIsIl9jYWxsZWU0IiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ0IiwiYXNzZXJ0IiwidGltZSIsInR5cGVzIiwidGltZUVuZCIsInByb2Nlc3MiLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmV0cmlldmVfZG9jdW1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHtcbiAgaXRlckxvYWRTZW5hdERvc3NpZXJzTGVnaXNsYXRpZnNSYXBwb3J0VXJscyxcbiAgaXRlckxvYWRTZW5hdERvc3NpZXJzTGVnaXNsYXRpZnNUZXh0ZVVybHMsXG4gIFJBUFBPUlRfRk9MREVSLFxuICBURVhURV9GT0xERVIsXG4gIFRFWFRFX09SSUdJTkFMX0ZPTERFUixcbiAgVEVYVEVfVFJBTlNGT1JNRURfRk9MREVSLFxufSBmcm9tIFwiLi4vbG9hZGVyc1wiXG5pbXBvcnQgeyBwYXJzZUV4cG9zZURlc01vdGlmcywgcGFyc2VUZXh0ZSwgcGFyc2VUZXh0ZUZyb21GaWxlIH0gZnJvbSBcIi4uL21vZGVsL3RleHRlXCJcbmltcG9ydCB7IFVOREVGSU5FRF9TRVNTSU9OIH0gZnJvbSBcIi4vZGF0YXV0aWxcIlxuaW1wb3J0IHsgY29tbW9uT3B0aW9ucyB9IGZyb20gXCIuL3NoYXJlZC9jbGlfaGVscGVyc1wiXG5pbXBvcnQgeyBlbnN1cmVBbmRDbGVhckRpciwgZmV0Y2hXaXRoUmV0cnksIGlzT3B0aW9uRW1wdHlPckhhc1ZhbHVlIH0gZnJvbSBcIi4vc2hhcmVkL3V0aWxcIlxuXG5jb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gIC4uLmNvbW1vbk9wdGlvbnMsXG4gIHtcbiAgICBoZWxwOiBcInNlc3Npb25zIG9mIHRleHRlcyB0byByZXRyaWV2ZTsgbGVhdmUgZW1wdHkgZm9yIGFsbFwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwic2Vzc2lvbnNcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBoZWxwOiBcInBhcnNlIGFuZCBjb252ZXJ0IGRvY3VtZW50cyBpbnRvIEpTT04gKHRleHRlcyBvbmx5IGZvciBub3csIHJlcXVpcmVzIGZvcm1hdCB4bWwpXCIsXG4gICAgbmFtZTogXCJwYXJzZURvY3VtZW50c1wiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJGXCIsXG4gICAgaGVscDogXCJmb3JtYXRzIG9mIGRvY3VtZW50cyB0byByZXRyaWV2ZSAoeG1sL2h0bWwvcGRmIGZvciB0ZXh0ZXMsIGh0bWwvcGRmIGZvciByYXBwb3J0cyk7IGxlYXZlIGVtcHR5IGZvciBhbGxcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcImZvcm1hdHNcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBoZWxwOiBcInR5cGVzIG9mIGRvY3VtZW50cyB0byByZXRyaWV2ZSAodGV4dGVzL3JhcHBvcnRzKTsgbGVhdmUgZW1wdHkgZm9yIGFsbFwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwidHlwZXNcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBoZWxwOiBcImZvcmNlIHJldHJpZXZlIGFsbCBkb2N1bWVudHMsIGV2ZW4gYWxyZWFkeSByZXRyaWV2ZWQgb25lc1wiLFxuICAgIG5hbWU6IFwiZm9yY2VcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5cbmNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZURvY3VtZW50IChkb2N1bWVudFVybDogc3RyaW5nKTogUHJvbWlzZTxBcnJheUJ1ZmZlciB8IG51bGw+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKGBSZXRyaWV2aW5nIGRvY3VtZW50ICR7ZG9jdW1lbnRVcmx94oCmYClcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeShkb2N1bWVudFVybClcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBUZXh0ZSAke2RvY3VtZW50VXJsfSBub3QgZm91bmRgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmV0cmlldmluZyB0ZXh0ZSAke2RvY3VtZW50VXJsfTogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpXG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZVRleHRlcyAoZGF0YURpcjogc3RyaW5nKSB7XG4gIGNvbnN0IHRleHRlc0RpciA9IHBhdGguam9pbihkYXRhRGlyLCBURVhURV9GT0xERVIpXG4gIGZzLmVuc3VyZURpclN5bmModGV4dGVzRGlyKVxuXG4gIGNvbnN0IG9yaWdpbmFsVGV4dGVzRGlyID0gcGF0aC5qb2luKHRleHRlc0RpciwgVEVYVEVfT1JJR0lOQUxfRk9MREVSKVxuICBjb25zdCB0cmFuc2Zvcm1lZFRleHRlc0RpciA9IHBhdGguam9pbih0ZXh0ZXNEaXIsIFRFWFRFX1RSQU5TRk9STUVEX0ZPTERFUilcbiAgaWYgKG9wdGlvbnMucGFyc2VEb2N1bWVudHMpIHtcbiAgICBlbnN1cmVBbmRDbGVhckRpcih0cmFuc2Zvcm1lZFRleHRlc0RpcilcbiAgfVxuXG4gIGxldCByZXRyaWV2ZWRUZXh0ZXNDb3VudCA9IDBcbiAgY29uc3QgdGV4dGVVcmxzTm90Rm91bmRPckVycm9yID0gW11cbiAgY29uc3QgdGV4dGVVcmxzUGFyc2VFcnJvciA9IFtdXG5cbiAgZm9yIChjb25zdCBzZXNzaW9uIG9mIG9wdGlvbnMuc2Vzc2lvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHsgaXRlbTogdGV4dGVNZXRhZGF0YSB9IG9mIGl0ZXJMb2FkU2VuYXREb3NzaWVyc0xlZ2lzbGF0aWZzVGV4dGVVcmxzKGRhdGFEaXIsIHNlc3Npb24pKSB7XG4gICAgICBjb25zdCB0ZXh0ZURpciA9IHBhdGguam9pbihvcmlnaW5hbFRleHRlc0RpciwgYCR7dGV4dGVNZXRhZGF0YS5zZXNzaW9uID8/IFVOREVGSU5FRF9TRVNTSU9OfWAsIHRleHRlTWV0YWRhdGEubmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmModGV4dGVEaXIpXG5cbiAgICAgIGxldCBleHBvc2VEZXNNb3RpZnNDb250ZW50ID0gbnVsbFxuICAgICAgaWYgKHRleHRlTWV0YWRhdGEudXJsX2V4cG9zZV9kZXNfbW90aWZzKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJldHJpZXZpbmcgZXhwb3PDqSBkZXMgbW90aWZz4oCmXCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHBvc2VEZXNNb3RpZnNQYXRoID0gcGF0aC5qb2luKHRleHRlRGlyLCBgJHt0ZXh0ZU1ldGFkYXRhLm5hbWV9LWV4cG9zZS5odG1sYClcblxuICAgICAgICBleHBvc2VEZXNNb3RpZnNDb250ZW50ID0gYXdhaXQgcmV0cmlldmVEb2N1bWVudCh0ZXh0ZU1ldGFkYXRhLnVybF9leHBvc2VfZGVzX21vdGlmcy50b1N0cmluZygpKVxuICAgICAgICBpZiAoIWV4cG9zZURlc01vdGlmc0NvbnRlbnQpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZXhwb3NlRGVzTW90aWZzUGF0aCwgQnVmZmVyLmZyb20oZXhwb3NlRGVzTW90aWZzQ29udGVudCkpXG4gICAgICB9XG5cbiAgICAgIGlmIChpc09wdGlvbkVtcHR5T3JIYXNWYWx1ZShvcHRpb25zLmZvcm1hdHMsIFwieG1sXCIpKSB7XG4gICAgICAgIGNvbnN0IHRleHRlUGF0aCA9IHBhdGguam9pbih0ZXh0ZURpciwgYCR7dGV4dGVNZXRhZGF0YS5uYW1lfS54bWxgKVxuICAgICAgICBsZXQgdGV4dGVCdWZmZXIgPSBudWxsXG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmZvcmNlICYmIGZzLmV4aXN0c1N5bmModGV4dGVQYXRoKSkge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgQWxyZWFkeSByZXRyaWV2ZWQgdGV4dGUgJHt0ZXh0ZVBhdGh94oCmYClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dGVCdWZmZXIgPSBhd2FpdCByZXRyaWV2ZURvY3VtZW50KHRleHRlTWV0YWRhdGEudXJsX3htbC50b1N0cmluZygpKVxuICAgICAgICAgIGlmICghdGV4dGVCdWZmZXIpIHtcbiAgICAgICAgICAgIHRleHRlVXJsc05vdEZvdW5kT3JFcnJvci5wdXNoKHRleHRlTWV0YWRhdGEudXJsX3htbClcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModGV4dGVQYXRoLCBCdWZmZXIuZnJvbSh0ZXh0ZUJ1ZmZlcikpXG4gICAgICAgICAgcmV0cmlldmVkVGV4dGVzQ291bnQrK1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGFyc2VEb2N1bWVudHMpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUGFyc2luZyB0ZXh0ZSAke3RleHRlTWV0YWRhdGEubmFtZX0ueG1s4oCmYClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcGFyc2VkVGV4dGUgPSBudWxsXG4gICAgICAgICAgaWYgKHRleHRlQnVmZmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ZVhtbCA9IHRleHREZWNvZGVyLmRlY29kZSh0ZXh0ZUJ1ZmZlcilcbiAgICAgICAgICAgIHBhcnNlZFRleHRlID0gcGFyc2VUZXh0ZSh0ZXh0ZVhtbClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VkVGV4dGUgPSBhd2FpdCBwYXJzZVRleHRlRnJvbUZpbGUodGV4dGVQYXRoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghcGFyc2VkVGV4dGUpIHtcbiAgICAgICAgICAgIHRleHRlVXJsc1BhcnNlRXJyb3IucHVzaCh0ZXh0ZU1ldGFkYXRhLnVybF94bWwpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChleHBvc2VEZXNNb3RpZnNDb250ZW50KSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGFyc2luZyBleHBvc8OpIGRlcyBtb3RpZnPigKZcIilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZXhwb3NlRGVzTW90aWZzSHRtbCA9IHRleHREZWNvZGVyLmRlY29kZShleHBvc2VEZXNNb3RpZnNDb250ZW50KVxuICAgICAgICAgICAgcGFyc2VkVGV4dGUuZXhwb3NlRGVzTW90aWZzID0gcGFyc2VFeHBvc2VEZXNNb3RpZnMoZXhwb3NlRGVzTW90aWZzSHRtbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFRleHRlRGlyXG4gICAgICAgICAgICA9IHBhdGguam9pbih0cmFuc2Zvcm1lZFRleHRlc0RpciwgYCR7dGV4dGVNZXRhZGF0YS5zZXNzaW9uID8/IFVOREVGSU5FRF9TRVNTSU9OfWAsIHRleHRlTWV0YWRhdGEubmFtZSlcbiAgICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHRyYW5zZm9ybWVkVGV4dGVEaXIpXG5cbiAgICAgICAgICBmcy53cml0ZUpTT05TeW5jKHBhdGguam9pbih0cmFuc2Zvcm1lZFRleHRlRGlyLCBgJHt0ZXh0ZU1ldGFkYXRhLm5hbWV9Lmpzb25gKSwgcGFyc2VkVGV4dGUsIHsgc3BhY2VzOiAyIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzT3B0aW9uRW1wdHlPckhhc1ZhbHVlKG9wdGlvbnMuZm9ybWF0cywgXCJodG1sXCIpKSB7XG4gICAgICAgIGNvbnN0IHRleHRlUGF0aCA9IHBhdGguam9pbih0ZXh0ZURpciwgYCR7dGV4dGVNZXRhZGF0YS5uYW1lfS5odG1sYClcblxuICAgICAgICBpZiAoIW9wdGlvbnMuZm9yY2UgJiYgZnMuZXhpc3RzU3luYyh0ZXh0ZVBhdGgpKSB7XG4gICAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGBBbHJlYWR5IHJldHJpZXZlZCB0ZXh0ZSAke3RleHRlUGF0aH3igKZgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIGNvbnN0IHRleHRlQnVmZmVyID0gYXdhaXQgcmV0cmlldmVEb2N1bWVudCh0ZXh0ZU1ldGFkYXRhLnVybF9odG1sLnRvU3RyaW5nKCkpXG4gICAgICAgICAgaWYgKCF0ZXh0ZUJ1ZmZlcikge1xuICAgICAgICAgICAgdGV4dGVVcmxzTm90Rm91bmRPckVycm9yLnB1c2godGV4dGVNZXRhZGF0YS51cmxfaHRtbClcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModGV4dGVQYXRoLCBCdWZmZXIuZnJvbSh0ZXh0ZUJ1ZmZlcikpXG4gICAgICAgICAgcmV0cmlldmVkVGV4dGVzQ291bnQrK1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc09wdGlvbkVtcHR5T3JIYXNWYWx1ZShvcHRpb25zLmZvcm1hdHMsIFwicGRmXCIpKSB7XG4gICAgICAgIGNvbnN0IHRleHRlUGF0aCA9IHBhdGguam9pbih0ZXh0ZURpciwgYCR7dGV4dGVNZXRhZGF0YS5uYW1lfS5wZGZgKVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5mb3JjZSAmJiBmcy5leGlzdHNTeW5jKHRleHRlUGF0aCkpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYEFscmVhZHkgcmV0cmlldmVkIHRleHRlICR7dGV4dGVQYXRofeKApmApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgY29uc3QgdGV4dGVCdWZmZXIgPSBhd2FpdCByZXRyaWV2ZURvY3VtZW50KHRleHRlTWV0YWRhdGEudXJsX3BkZi50b1N0cmluZygpKVxuICAgICAgICAgIGlmICghdGV4dGVCdWZmZXIpIHtcbiAgICAgICAgICAgIHRleHRlVXJsc05vdEZvdW5kT3JFcnJvci5wdXNoKHRleHRlTWV0YWRhdGEudXJsX3BkZilcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModGV4dGVQYXRoLCBCdWZmZXIuZnJvbSh0ZXh0ZUJ1ZmZlcikpXG4gICAgICAgICAgcmV0cmlldmVkVGV4dGVzQ291bnQrK1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgIGNvbnNvbGUubG9nKGAke3JldHJpZXZlZFRleHRlc0NvdW50fSB0ZXh0ZXMgcmV0cmlldmVkYClcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAke3RleHRlVXJsc05vdEZvdW5kT3JFcnJvci5sZW5ndGh9IHRleHRlcyBmYWlsZWQgdG8gYmUgcmV0cmlldmVkIHdpdGggVVJMcyAke3RleHRlVXJsc05vdEZvdW5kT3JFcnJvci5qb2luKFwiLCBcIil9YFxuICAgIClcbiAgICBpZiAob3B0aW9ucy5wYXJzZURvY3VtZW50cykge1xuICAgICAgY29uc29sZS5sb2coYCR7dGV4dGVVcmxzUGFyc2VFcnJvci5sZW5ndGh9IHRleHRlcyBmYWlsZWQgdG8gYmUgcGFyc2VkIHdpdGggVVJMcyAke3RleHRlVXJsc1BhcnNlRXJyb3Iuam9pbihcIiwgXCIpfWApXG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlUmFwcG9ydHMgKGRhdGFEaXI6IHN0cmluZykge1xuICBjb25zdCByYXBwb3J0c0RpciA9IHBhdGguam9pbihkYXRhRGlyLCBSQVBQT1JUX0ZPTERFUilcbiAgZnMuZW5zdXJlRGlyU3luYyhyYXBwb3J0c0RpcilcblxuICBsZXQgcmV0cmlldmVkUmFwcG9ydHNDb3VudCA9IDBcbiAgY29uc3QgcmFwcG9ydFVybHNOb3RGb3VuZE9yRXJyb3IgPSBbXVxuXG4gIGZvciAoY29uc3Qgc2Vzc2lvbiBvZiBvcHRpb25zLnNlc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCB7IGl0ZW06IHJhcHBvcnRNZXRhZGF0YSB9IG9mIGl0ZXJMb2FkU2VuYXREb3NzaWVyc0xlZ2lzbGF0aWZzUmFwcG9ydFVybHMoZGF0YURpciwgc2Vzc2lvbikpIHtcbiAgICAgIGNvbnN0IHJhcHBvcnREaXIgPSBwYXRoLmpvaW4ocmFwcG9ydHNEaXIsIGAke3JhcHBvcnRNZXRhZGF0YS5zZXNzaW9uID8/IFVOREVGSU5FRF9TRVNTSU9OfWAsIHJhcHBvcnRNZXRhZGF0YS5uYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhyYXBwb3J0RGlyKVxuXG4gICAgICBpZiAoaXNPcHRpb25FbXB0eU9ySGFzVmFsdWUob3B0aW9ucy5mb3JtYXRzLCBcImh0bWxcIikpIHtcbiAgICAgICAgY29uc3QgcmFwcG9ydFBhdGggPSBwYXRoLmpvaW4ocmFwcG9ydERpciwgYCR7cmFwcG9ydE1ldGFkYXRhLm5hbWV9Lmh0bWxgKVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5mb3JjZSAmJiBmcy5leGlzdHNTeW5jKHJhcHBvcnRQYXRoKSkge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgQWxyZWFkeSByZXRyaWV2ZWQgcmFwcG9ydCAke3JhcHBvcnRQYXRofeKApmApXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXBwb3J0QnVmZmVyID0gYXdhaXQgcmV0cmlldmVEb2N1bWVudChyYXBwb3J0TWV0YWRhdGEudXJsX2h0bWwudG9TdHJpbmcoKSlcbiAgICAgICAgaWYgKCFyYXBwb3J0QnVmZmVyKSB7XG4gICAgICAgICAgcmFwcG9ydFVybHNOb3RGb3VuZE9yRXJyb3IucHVzaChyYXBwb3J0TWV0YWRhdGEudXJsX2h0bWwpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJhcHBvcnRQYXRoLCBCdWZmZXIuZnJvbShyYXBwb3J0QnVmZmVyKSlcbiAgICAgICAgcmV0cmlldmVkUmFwcG9ydHNDb3VudCsrXG4gICAgICB9XG5cbiAgICAgIGlmIChpc09wdGlvbkVtcHR5T3JIYXNWYWx1ZShvcHRpb25zLmZvcm1hdHMsIFwicGRmXCIpKSB7XG4gICAgICAgIGNvbnN0IHJhcHBvcnRQYXRoID0gcGF0aC5qb2luKHJhcHBvcnREaXIsIGAke3JhcHBvcnRNZXRhZGF0YS5uYW1lfS5wZGZgKVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5mb3JjZSAmJiBmcy5leGlzdHNTeW5jKHJhcHBvcnRQYXRoKSkge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgQWxyZWFkeSByZXRyaWV2ZWQgcmFwcG9ydCAke3JhcHBvcnRQYXRofeKApmApXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXBwb3J0QnVmZmVyID0gYXdhaXQgcmV0cmlldmVEb2N1bWVudChyYXBwb3J0TWV0YWRhdGEudXJsX3BkZi50b1N0cmluZygpKVxuICAgICAgICBpZiAoIXJhcHBvcnRCdWZmZXIpIHtcbiAgICAgICAgICByYXBwb3J0VXJsc05vdEZvdW5kT3JFcnJvci5wdXNoKHJhcHBvcnRNZXRhZGF0YS51cmxfcGRmKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyYXBwb3J0UGF0aCwgQnVmZmVyLmZyb20ocmFwcG9ydEJ1ZmZlcikpXG4gICAgICAgIHJldHJpZXZlZFJhcHBvcnRzQ291bnQrK1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXRyaWV2ZWRSYXBwb3J0c0NvdW50fSByYXBwb3J0cyByZXRyaWV2ZWRgKVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCR7cmFwcG9ydFVybHNOb3RGb3VuZE9yRXJyb3IubGVuZ3RofSByYXBwb3J0cyBmYWlsZWQgd2l0aCBVUkxzICR7cmFwcG9ydFVybHNOb3RGb3VuZE9yRXJyb3Iuam9pbihcIiwgXCIpfWBcbiAgICApXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBhc3NlcnQoZGF0YURpciwgXCJNaXNzaW5nIGFyZ3VtZW50OiBkYXRhIGRpcmVjdG9yeVwiKVxuXG4gIGNvbnNvbGUudGltZShcImRvY3VtZW50cyBwcm9jZXNzaW5nIHRpbWVcIilcblxuICBpZiAoaXNPcHRpb25FbXB0eU9ySGFzVmFsdWUob3B0aW9ucy50eXBlcywgXCJ0ZXh0ZXNcIikpIHtcbiAgICBhd2FpdCByZXRyaWV2ZVRleHRlcyhkYXRhRGlyKVxuICB9XG4gIGlmIChpc09wdGlvbkVtcHR5T3JIYXNWYWx1ZShvcHRpb25zLnR5cGVzLCBcInJhcHBvcnRzXCIpKSB7XG4gICAgYXdhaXQgcmV0cmlldmVSYXBwb3J0cyhkYXRhRGlyKVxuICB9XG5cbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS50aW1lRW5kKFwiZG9jdW1lbnRzIHByb2Nlc3NpbmcgdGltZVwiKVxuICB9XG59XG5cbm1haW4oKVxuICAudGhlbigoKSA9PiBwcm9jZXNzLmV4aXQoMCkpXG4gIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxnQkFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsS0FBQSxHQUFBSixzQkFBQSxDQUFBQyxP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