@tricoteuses/assemblee 1.0.6 → 1.1.0

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 (135) hide show
  1. package/lib/api.js +3 -9
  2. package/lib/api.mjs +4 -5
  3. package/lib/bugs/acteur-00010/plugin.test.js +3 -50
  4. package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
  5. package/lib/bugs/acteur-00010.js +2 -57
  6. package/lib/bugs/acteur-00010.mjs +1 -6
  7. package/lib/bugs/agenda-00002/plugin.test.js +3 -53
  8. package/lib/bugs/agenda-00002/plugin.test.mjs +1 -3
  9. package/lib/bugs/agenda-00002.js +3 -148
  10. package/lib/bugs/agenda-00002.mjs +1 -28
  11. package/lib/bugs/agenda-00008/plugin.test.js +3 -52
  12. package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
  13. package/lib/bugs/agenda-00008.js +2 -61
  14. package/lib/bugs/agenda-00008.mjs +1 -5
  15. package/lib/bugs/agenda-00011/plugin.test.js +5 -99
  16. package/lib/bugs/agenda-00011/plugin.test.mjs +3 -3
  17. package/lib/bugs/agenda-00011.js +4 -105
  18. package/lib/bugs/agenda-00011.mjs +3 -29
  19. package/lib/bugs.js +3 -164
  20. package/lib/bugs.mjs +1 -26
  21. package/lib/cleaners/actes_legislatifs.js +11 -115
  22. package/lib/cleaners/actes_legislatifs.mjs +7 -82
  23. package/lib/cleaners/acteurs.js +12 -92
  24. package/lib/cleaners/acteurs.mjs +7 -38
  25. package/lib/cleaners/amendements.js +10 -103
  26. package/lib/cleaners/amendements.mjs +4 -58
  27. package/lib/cleaners/documents.js +5 -67
  28. package/lib/cleaners/documents.mjs +1 -37
  29. package/lib/cleaners/dossiers_legislatifs.js +5 -61
  30. package/lib/cleaners/dossiers_legislatifs.mjs +1 -29
  31. package/lib/cleaners/index.js +1 -9
  32. package/lib/cleaners/index.mjs +1 -1
  33. package/lib/cleaners/organes.js +1 -33
  34. package/lib/cleaners/organes.mjs +1 -17
  35. package/lib/cleaners/reunions.js +4 -119
  36. package/lib/cleaners/reunions.mjs +1 -64
  37. package/lib/cleaners/scrutins.js +10 -102
  38. package/lib/cleaners/scrutins.mjs +1 -48
  39. package/lib/cleaners/xml.js +8 -42
  40. package/lib/cleaners/xml.mjs +6 -8
  41. package/lib/datasets.js +14 -113
  42. package/lib/datasets.mjs +6 -46
  43. package/lib/dates.js +7 -37
  44. package/lib/dates.mjs +9 -14
  45. package/lib/dossiers_legislatifs.js +6 -68
  46. package/lib/dossiers_legislatifs.mjs +5 -36
  47. package/lib/file_systems.js +56 -139
  48. package/lib/file_systems.mjs +1 -9
  49. package/lib/git.js +4 -53
  50. package/lib/git.mjs +1 -12
  51. package/lib/index.js +1 -15
  52. package/lib/index.mjs +1 -1
  53. package/lib/inserters.js +23 -146
  54. package/lib/inserters.mjs +6 -87
  55. package/lib/loaders.js +44 -316
  56. package/lib/loaders.mjs +12 -135
  57. package/lib/organes.js +1 -7
  58. package/lib/organes.mjs +1 -4
  59. package/lib/parsers/documents.js +22 -151
  60. package/lib/parsers/documents.mjs +19 -81
  61. package/lib/parsers/index.js +1 -4
  62. package/lib/parsers/index.mjs +1 -1
  63. package/lib/parsers/recherche_amendements.js +302 -527
  64. package/lib/parsers/recherche_amendements.mjs +8 -31
  65. package/lib/raw_types/acteurs_et_organes.d.ts +1 -30
  66. package/lib/raw_types/acteurs_et_organes.js +5 -124
  67. package/lib/raw_types/acteurs_et_organes.mjs +5 -105
  68. package/lib/raw_types/agendas.js +6 -89
  69. package/lib/raw_types/agendas.mjs +9 -65
  70. package/lib/raw_types/amendements.d.ts +2 -0
  71. package/lib/raw_types/amendements.js +10 -90
  72. package/lib/raw_types/amendements.mjs +11 -69
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +16 -115
  74. package/lib/raw_types/dossiers_legislatifs.js +26 -435
  75. package/lib/raw_types/dossiers_legislatifs.mjs +26 -412
  76. package/lib/raw_types/scrutins.js +6 -81
  77. package/lib/raw_types/scrutins.mjs +9 -57
  78. package/lib/scripts/bugs_helper.js +2 -181
  79. package/lib/scripts/bugs_helper.mjs +2 -39
  80. package/lib/scripts/clean_data.js +27 -143
  81. package/lib/scripts/clean_data.mjs +15 -34
  82. package/lib/scripts/clean_reorganized_data.js +76 -240
  83. package/lib/scripts/clean_reorganized_data.mjs +36 -99
  84. package/lib/scripts/diff_amendements.js +19 -79
  85. package/lib/scripts/diff_amendements.mjs +17 -35
  86. package/lib/scripts/document_dossiers_legislatifs.js +17 -142
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +6 -90
  88. package/lib/scripts/get_today_reunions.js +4 -22
  89. package/lib/scripts/get_today_reunions.mjs +1 -7
  90. package/lib/scripts/merge_scrutins.js +3 -47
  91. package/lib/scripts/merge_scrutins.mjs +1 -9
  92. package/lib/scripts/parse_textes_lois.js +15 -44
  93. package/lib/scripts/parse_textes_lois.mjs +18 -19
  94. package/lib/scripts/raw_types_from_amendements.js +3 -95
  95. package/lib/scripts/raw_types_from_amendements.mjs +1 -16
  96. package/lib/scripts/reorganize_data.js +74 -294
  97. package/lib/scripts/reorganize_data.mjs +22 -133
  98. package/lib/scripts/retrieve_deputes_photos.js +6 -119
  99. package/lib/scripts/retrieve_deputes_photos.mjs +7 -33
  100. package/lib/scripts/retrieve_documents.js +4 -192
  101. package/lib/scripts/retrieve_documents.mjs +2 -50
  102. package/lib/scripts/retrieve_open_data.js +44 -116
  103. package/lib/scripts/retrieve_open_data.mjs +14 -19
  104. package/lib/scripts/retrieve_pending_amendments.js +4 -98
  105. package/lib/scripts/retrieve_pending_amendments.mjs +1 -14
  106. package/lib/scripts/retrieve_senateurs_photos.js +18 -114
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +20 -48
  108. package/lib/scripts/retrieve_textes_lois.js +3 -122
  109. package/lib/scripts/retrieve_textes_lois.mjs +3 -21
  110. package/lib/scripts/test_load.js +2 -10
  111. package/lib/scripts/test_load.mjs +2 -1
  112. package/lib/scripts/test_load_big_files.js +2 -10
  113. package/lib/scripts/test_load_big_files.mjs +2 -1
  114. package/lib/scripts/validate_json.js +4 -119
  115. package/lib/scripts/validate_json.mjs +2 -36
  116. package/lib/shared_types/codes_actes.js +1 -24
  117. package/lib/shared_types/codes_actes.mjs +3 -10
  118. package/lib/strings.js +1 -5
  119. package/lib/strings.mjs +1 -1
  120. package/lib/types/acteurs_et_organes.js +9 -84
  121. package/lib/types/acteurs_et_organes.mjs +10 -63
  122. package/lib/types/agendas.js +8 -90
  123. package/lib/types/agendas.mjs +11 -66
  124. package/lib/types/amendements.d.ts +2 -0
  125. package/lib/types/amendements.js +12 -92
  126. package/lib/types/amendements.mjs +15 -70
  127. package/lib/types/dossiers_legislatifs.js +8 -96
  128. package/lib/types/dossiers_legislatifs.mjs +10 -72
  129. package/lib/types/legislatures.js +1 -3
  130. package/lib/types/legislatures.mjs +1 -2
  131. package/lib/types/scrutins.js +8 -82
  132. package/lib/types/scrutins.mjs +11 -58
  133. package/lib/urls.js +3 -27
  134. package/lib/urls.mjs +3 -21
  135. package/package.json +1 -1
@@ -1,105 +1,65 @@
1
1
  "use strict";
2
2
 
3
3
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
-
5
- require("core-js/modules/es.array.slice.js");
6
-
7
- require("core-js/modules/es.function.name.js");
8
-
9
- require("core-js/modules/es.array.from.js");
10
-
11
- require("core-js/modules/es.string.iterator.js");
12
-
4
+ require("core-js/modules/es.array.is-array.js");
13
5
  require("core-js/modules/es.symbol.js");
14
-
15
6
  require("core-js/modules/es.symbol.description.js");
16
-
17
7
  require("core-js/modules/es.symbol.iterator.js");
18
-
19
8
  require("core-js/modules/es.array.iterator.js");
20
-
9
+ require("core-js/modules/es.string.iterator.js");
21
10
  require("core-js/modules/web.dom-collections.iterator.js");
22
-
23
- require("core-js/modules/es.array.is-array.js");
24
-
11
+ require("core-js/modules/es.array.slice.js");
12
+ require("core-js/modules/es.function.name.js");
13
+ require("core-js/modules/es.array.from.js");
25
14
  require("core-js/modules/es.weak-map.js");
26
-
27
15
  require("core-js/modules/es.object.define-property.js");
28
-
29
16
  require("core-js/modules/es.object.get-own-property-descriptor.js");
30
-
17
+ require("core-js/modules/es.number.constructor.js");
31
18
  require("core-js/modules/es.date.to-json.js");
32
-
33
19
  require("core-js/modules/es.date.to-string.js");
34
-
35
20
  require("core-js/modules/es.regexp.exec.js");
36
-
37
21
  require("core-js/modules/es.string.replace.js");
38
-
39
22
  require("core-js/modules/es.string.trim.js");
40
-
41
23
  require("core-js/modules/es.array.map.js");
42
-
43
24
  require("core-js/modules/es.array.reduce.js");
44
-
45
25
  require("core-js/modules/es.object.to-string.js");
46
-
26
+ require("core-js/modules/es.regexp.to-string.js");
27
+ require("core-js/modules/es.object.entries.js");
28
+ require("core-js/modules/es.array.filter.js");
29
+ require("core-js/modules/es.array.includes.js");
30
+ require("core-js/modules/es.string.includes.js");
47
31
  require("core-js/modules/es.array.concat.js");
48
-
49
32
  require("core-js/modules/es.array.join.js");
50
-
51
33
  require("core-js/modules/es.string.ends-with.js");
52
-
53
34
  var _assert = _interopRequireDefault(require("assert"));
54
-
55
35
  var _child_process = require("child_process");
56
-
57
36
  var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
58
-
59
37
  var _fsExtra = _interopRequireDefault(require("fs-extra"));
60
-
61
38
  var _path = _interopRequireDefault(require("path"));
62
-
63
39
  var _cleaners = require("../cleaners");
64
-
65
40
  var _datasets = require("../datasets");
66
-
67
41
  var _dates = require("../dates");
68
-
69
42
  var _file_systems = require("../file_systems");
70
-
71
43
  var git = _interopRequireWildcard(require("../git"));
72
-
73
44
  var _acteurs_et_organes = require("../types/acteurs_et_organes");
74
-
75
45
  var _agendas = require("../types/agendas");
76
-
77
46
  var _amendements = require("../types/amendements");
78
-
79
47
  var _dossiers_legislatifs = require("../types/dossiers_legislatifs");
80
-
81
48
  var _scrutins = require("../types/scrutins");
82
-
83
49
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
84
-
85
50
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
86
-
87
51
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
88
-
89
52
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
90
-
91
53
  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."); }
92
-
93
54
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
94
-
95
55
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
96
-
97
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
98
-
56
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
57
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
58
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
99
59
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
100
-
101
60
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
102
-
61
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
62
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
103
63
  function parseArgs(argv) {
104
64
  var optionsDefinitions = [{
105
65
  alias: "C",
@@ -123,6 +83,12 @@ function parseArgs(argv) {
123
83
  multiple: true,
124
84
  name: "categories",
125
85
  type: String
86
+ }, {
87
+ alias: "l",
88
+ help: "legislatures of categories of datasets to retrieve",
89
+ multiple: true,
90
+ name: "legislature",
91
+ type: Number
126
92
  }, {
127
93
  alias: "r",
128
94
  help: "push commit to given remote",
@@ -154,7 +120,6 @@ function parseArgs(argv) {
154
120
  });
155
121
  return options;
156
122
  }
157
-
158
123
  function cleanReorganizedData(options) {
159
124
  var dataDir = options.dataDir;
160
125
  Date.prototype.toJSON = _dates.patchedDateToJson;
@@ -166,21 +131,32 @@ function cleanReorganizedData(options) {
166
131
  var enabledDatasets = options.categories.reduce(function (enabledDatasets, datasetName) {
167
132
  return enabledDatasets | _datasets.EnabledDatasets[datasetName];
168
133
  }, _datasets.EnabledDatasets.None);
169
-
134
+ var choosenDatasets = _datasets.datasets;
135
+ if (options.legislature) {
136
+ (function () {
137
+ var enabledLegislatures = options.legislature.map(function (legislature) {
138
+ return legislature.toString();
139
+ });
140
+ for (var _i = 0, _Object$entries = Object.entries(choosenDatasets); _i < _Object$entries.length; _i++) {
141
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
142
+ key = _Object$entries$_i[0],
143
+ value = _Object$entries$_i[1];
144
+ choosenDatasets[key] = value.filter(function (dataset) {
145
+ return enabledLegislatures.includes(dataset.legislature);
146
+ });
147
+ }
148
+ })();
149
+ }
170
150
  if (enabledDatasets & _datasets.EnabledDatasets.ActeursEtOrganes) {
171
- var _iterator = _createForOfIteratorHelper(_datasets.datasets.acteursEtOrganes),
172
- _step;
173
-
151
+ var _iterator = _createForOfIteratorHelper(choosenDatasets.acteursEtOrganes),
152
+ _step;
174
153
  try {
175
154
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
176
155
  var dataset = _step.value;
177
-
178
156
  var datasetName = _path["default"].basename(dataset.filename, ".json");
179
-
180
157
  if (options.dataset && datasetName !== options.dataset) {
181
158
  continue;
182
159
  }
183
-
184
160
  if (gitGroupUrl !== undefined) {
185
161
  (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(datasetName, "_nettoye.git"), {
186
162
  cwd: dataDir,
@@ -189,47 +165,34 @@ function cleanReorganizedData(options) {
189
165
  stdio: ["ignore", "ignore", "pipe"]
190
166
  });
191
167
  }
192
-
193
168
  analyzeAndRemove(datasetName, options);
194
-
195
169
  var datasetRawDir = _path["default"].join(dataDir, datasetName);
196
-
197
170
  var datasetCleanDir = datasetRawDir + "_nettoye";
198
-
199
171
  var _iterator2 = _createForOfIteratorHelper((0, _file_systems.walkDir)(datasetRawDir, ["acteurs"])),
200
- _step2;
201
-
172
+ _step2;
202
173
  try {
203
174
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
204
175
  var acteurSplitPath = _step2.value;
205
176
  var acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
206
-
207
177
  if (!acteurFilename.endsWith(".json")) {
208
178
  continue;
209
179
  }
210
-
211
180
  var acteurRawFilePath = _path["default"].join.apply(_path["default"], [datasetRawDir].concat(_toConsumableArray(acteurSplitPath)));
212
-
213
181
  if (options.verbose) {
214
182
  console.log(" Cleaning file: ".concat(acteurRawFilePath, "\u2026"));
215
183
  }
216
-
217
184
  var acteurRawJson = _fsExtra["default"].readFileSync(acteurRawFilePath, {
218
185
  encoding: "utf8"
219
186
  });
220
-
221
187
  var acteur = JSON.parse(acteurRawJson);
222
188
  (0, _cleaners.cleanActeur)(acteur);
223
- var acteurJson = JSON.stringify(acteur, null, 2); // Validate generated JSON.
189
+ var acteurJson = JSON.stringify(acteur, null, 2);
224
190
 
191
+ // Validate generated JSON.
225
192
  var acteurClean = _acteurs_et_organes.Convert.toActeur(acteurJson);
226
-
227
193
  var acteurCleanJson = _acteurs_et_organes.Convert.acteurToJson(acteurClean);
228
-
229
194
  var acteurCleanFilePath = _path["default"].join.apply(_path["default"], [datasetCleanDir].concat(_toConsumableArray(acteurSplitPath)));
230
-
231
195
  _fsExtra["default"].ensureDirSync(_path["default"].dirname(acteurCleanFilePath));
232
-
233
196
  _fsExtra["default"].writeFileSync(acteurCleanFilePath, acteurCleanJson, {
234
197
  encoding: "utf8"
235
198
  });
@@ -239,41 +202,31 @@ function cleanReorganizedData(options) {
239
202
  } finally {
240
203
  _iterator2.f();
241
204
  }
242
-
243
205
  var _iterator3 = _createForOfIteratorHelper((0, _file_systems.walkDir)(datasetRawDir, ["organes"])),
244
- _step3;
245
-
206
+ _step3;
246
207
  try {
247
208
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
248
209
  var organeSplitPath = _step3.value;
249
210
  var organeFilename = organeSplitPath[organeSplitPath.length - 1];
250
-
251
211
  if (!organeFilename.endsWith(".json")) {
252
212
  continue;
253
213
  }
254
-
255
214
  var organeRawFilePath = _path["default"].join.apply(_path["default"], [datasetRawDir].concat(_toConsumableArray(organeSplitPath)));
256
-
257
215
  if (options.verbose) {
258
216
  console.log(" Cleaning file: ".concat(organeRawFilePath, "\u2026"));
259
217
  }
260
-
261
218
  var organeRawJson = _fsExtra["default"].readFileSync(organeRawFilePath, {
262
219
  encoding: "utf8"
263
220
  });
264
-
265
221
  var organe = JSON.parse(organeRawJson);
266
222
  (0, _cleaners.cleanOrgane)(organe);
267
- var organeJson = JSON.stringify(organe, null, 2); // Validate generated JSON.
223
+ var organeJson = JSON.stringify(organe, null, 2);
268
224
 
225
+ // Validate generated JSON.
269
226
  var organeClean = _acteurs_et_organes.Convert.toOrgane(organeJson);
270
-
271
227
  var organeCleanJson = _acteurs_et_organes.Convert.organeToJson(organeClean);
272
-
273
228
  var organeCleanFilePath = _path["default"].join.apply(_path["default"], [datasetCleanDir].concat(_toConsumableArray(organeSplitPath)));
274
-
275
229
  _fsExtra["default"].ensureDirSync(_path["default"].dirname(organeCleanFilePath));
276
-
277
230
  _fsExtra["default"].writeFileSync(organeCleanFilePath, organeCleanJson, {
278
231
  encoding: "utf8"
279
232
  });
@@ -283,11 +236,9 @@ function cleanReorganizedData(options) {
283
236
  } finally {
284
237
  _iterator3.f();
285
238
  }
286
-
287
239
  if (commitAndPush(datasetCleanDir, options, options.remote)) {
288
240
  error = true;
289
241
  }
290
-
291
242
  if (commitAndPushUid(datasetCleanDir, options, ["acteurs", "organes"])) {
292
243
  error = true;
293
244
  }
@@ -298,21 +249,16 @@ function cleanReorganizedData(options) {
298
249
  _iterator.f();
299
250
  }
300
251
  }
301
-
302
252
  if (enabledDatasets & _datasets.EnabledDatasets.Agendas) {
303
- var _iterator4 = _createForOfIteratorHelper(_datasets.datasets.agendas),
304
- _step4;
305
-
253
+ var _iterator4 = _createForOfIteratorHelper(choosenDatasets.agendas),
254
+ _step4;
306
255
  try {
307
256
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
308
257
  var _dataset = _step4.value;
309
-
310
258
  var _datasetName = _path["default"].basename(_dataset.filename, ".json");
311
-
312
259
  if (options.dataset && _datasetName !== options.dataset) {
313
260
  continue;
314
261
  }
315
-
316
262
  if (gitGroupUrl !== undefined) {
317
263
  (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName, "_nettoye.git"), {
318
264
  cwd: dataDir,
@@ -321,47 +267,34 @@ function cleanReorganizedData(options) {
321
267
  stdio: ["ignore", "ignore", "pipe"]
322
268
  });
323
269
  }
324
-
325
270
  analyzeAndRemove(_datasetName, options);
326
-
327
271
  var _datasetRawDir = _path["default"].join(dataDir, _datasetName);
328
-
329
272
  var _datasetCleanDir = _datasetRawDir + "_nettoye";
330
-
331
273
  var _iterator5 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir)),
332
- _step5;
333
-
274
+ _step5;
334
275
  try {
335
276
  for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
336
277
  var reunionSplitPath = _step5.value;
337
278
  var reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
338
-
339
279
  if (!reunionFilename.endsWith(".json")) {
340
280
  continue;
341
281
  }
342
-
343
282
  var reunionRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir].concat(_toConsumableArray(reunionSplitPath)));
344
-
345
283
  if (options.verbose) {
346
284
  console.log(" Cleaning file: ".concat(reunionRawFilePath, "\u2026"));
347
285
  }
348
-
349
286
  var reunionRawJson = _fsExtra["default"].readFileSync(reunionRawFilePath, {
350
287
  encoding: "utf8"
351
288
  });
352
-
353
289
  var reunion = JSON.parse(reunionRawJson);
354
290
  (0, _cleaners.cleanReunion)(reunion);
355
- var reunionJson = JSON.stringify(reunion, null, 2); // Validate generated JSON.
291
+ var reunionJson = JSON.stringify(reunion, null, 2);
356
292
 
293
+ // Validate generated JSON.
357
294
  var reunionClean = _agendas.Convert.toReunion(reunionJson);
358
-
359
295
  var reunionCleanJson = _agendas.Convert.reunionToJson(reunionClean);
360
-
361
296
  var reunionCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir].concat(_toConsumableArray(reunionSplitPath)));
362
-
363
297
  _fsExtra["default"].ensureDirSync(_path["default"].dirname(reunionCleanFilePath));
364
-
365
298
  _fsExtra["default"].writeFileSync(reunionCleanFilePath, reunionCleanJson, {
366
299
  encoding: "utf8"
367
300
  });
@@ -371,11 +304,9 @@ function cleanReorganizedData(options) {
371
304
  } finally {
372
305
  _iterator5.f();
373
306
  }
374
-
375
307
  if (commitAndPush(_datasetCleanDir, options, options.remote)) {
376
308
  error = true;
377
309
  }
378
-
379
310
  if (commitAndPushUid(_datasetCleanDir, options, ["."])) {
380
311
  error = true;
381
312
  }
@@ -386,21 +317,16 @@ function cleanReorganizedData(options) {
386
317
  _iterator4.f();
387
318
  }
388
319
  }
389
-
390
320
  if (enabledDatasets & _datasets.EnabledDatasets.Amendements) {
391
- var _iterator6 = _createForOfIteratorHelper(_datasets.datasets.amendements),
392
- _step6;
393
-
321
+ var _iterator6 = _createForOfIteratorHelper(choosenDatasets.amendements),
322
+ _step6;
394
323
  try {
395
324
  for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
396
325
  var _dataset2 = _step6.value;
397
-
398
326
  var _datasetName2 = _path["default"].basename(_dataset2.filename, ".json");
399
-
400
327
  if (options.dataset && _datasetName2 !== options.dataset) {
401
328
  continue;
402
329
  }
403
-
404
330
  if (gitGroupUrl !== undefined) {
405
331
  (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName2, "_nettoye.git"), {
406
332
  cwd: dataDir,
@@ -409,47 +335,34 @@ function cleanReorganizedData(options) {
409
335
  stdio: ["ignore", "ignore", "pipe"]
410
336
  });
411
337
  }
412
-
413
338
  analyzeAndRemove(_datasetName2, options);
414
-
415
339
  var _datasetRawDir2 = _path["default"].join(dataDir, _datasetName2);
416
-
417
340
  var _datasetCleanDir2 = _datasetRawDir2 + "_nettoye";
418
-
419
341
  var _iterator7 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir2)),
420
- _step7;
421
-
342
+ _step7;
422
343
  try {
423
344
  for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
424
345
  var amendementSplitPath = _step7.value;
425
346
  var amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
426
-
427
347
  if (!amendementFilename.endsWith(".json")) {
428
348
  continue;
429
349
  }
430
-
431
350
  var amendementRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir2].concat(_toConsumableArray(amendementSplitPath)));
432
-
433
351
  if (options.verbose) {
434
352
  console.log(" Cleaning file: ".concat(amendementRawFilePath, "\u2026"));
435
353
  }
436
-
437
354
  var amendementRawJson = _fsExtra["default"].readFileSync(amendementRawFilePath, {
438
355
  encoding: "utf8"
439
356
  });
440
-
441
357
  var amendement = JSON.parse(amendementRawJson);
442
358
  (0, _cleaners.cleanAmendement)(amendement);
443
- var amendementJson = JSON.stringify(amendement, null, 2); // Validate generated JSON.
359
+ var amendementJson = JSON.stringify(amendement, null, 2);
444
360
 
361
+ // Validate generated JSON.
445
362
  var amendementClean = _amendements.Convert.toAmendement(amendementJson);
446
-
447
363
  var amendementCleanJson = _amendements.Convert.amendementToJson(amendementClean);
448
-
449
364
  var amendementCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir2].concat(_toConsumableArray(amendementSplitPath)));
450
-
451
365
  _fsExtra["default"].ensureDirSync(_path["default"].dirname(amendementCleanFilePath));
452
-
453
366
  _fsExtra["default"].writeFileSync(amendementCleanFilePath, amendementCleanJson, {
454
367
  encoding: "utf8"
455
368
  });
@@ -459,11 +372,9 @@ function cleanReorganizedData(options) {
459
372
  } finally {
460
373
  _iterator7.f();
461
374
  }
462
-
463
375
  if (commitAndPush(_datasetCleanDir2, options, options.remote)) {
464
376
  error = true;
465
377
  }
466
-
467
378
  if (commitAndPushUid(_datasetCleanDir2, options, ["."])) {
468
379
  error = true;
469
380
  }
@@ -474,21 +385,16 @@ function cleanReorganizedData(options) {
474
385
  _iterator6.f();
475
386
  }
476
387
  }
477
-
478
388
  if (enabledDatasets & _datasets.EnabledDatasets.DossiersLegislatifs) {
479
- var _iterator8 = _createForOfIteratorHelper(_datasets.datasets.dossiersLegislatifs),
480
- _step8;
481
-
389
+ var _iterator8 = _createForOfIteratorHelper(choosenDatasets.dossiersLegislatifs),
390
+ _step8;
482
391
  try {
483
392
  for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
484
393
  var _dataset3 = _step8.value;
485
-
486
394
  var _datasetName3 = _path["default"].basename(_dataset3.filename, ".json");
487
-
488
395
  if (options.dataset && _datasetName3 !== options.dataset) {
489
396
  continue;
490
397
  }
491
-
492
398
  if (gitGroupUrl !== undefined) {
493
399
  (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName3, "_nettoye.git"), {
494
400
  cwd: dataDir,
@@ -497,47 +403,34 @@ function cleanReorganizedData(options) {
497
403
  stdio: ["ignore", "ignore", "pipe"]
498
404
  });
499
405
  }
500
-
501
406
  analyzeAndRemove(_datasetName3, options);
502
-
503
407
  var _datasetRawDir3 = _path["default"].join(dataDir, _datasetName3);
504
-
505
408
  var _datasetCleanDir3 = _datasetRawDir3 + "_nettoye";
506
-
507
409
  var _iterator9 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir3, ["documents"])),
508
- _step9;
509
-
410
+ _step9;
510
411
  try {
511
412
  for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
512
413
  var documentSplitPath = _step9.value;
513
414
  var documentFilename = documentSplitPath[documentSplitPath.length - 1];
514
-
515
415
  if (!documentFilename.endsWith(".json")) {
516
416
  continue;
517
417
  }
518
-
519
418
  var documentRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir3].concat(_toConsumableArray(documentSplitPath)));
520
-
521
419
  if (options.verbose) {
522
420
  console.log(" Cleaning file: ".concat(documentRawFilePath, "\u2026"));
523
421
  }
524
-
525
422
  var documentRawJson = _fsExtra["default"].readFileSync(documentRawFilePath, {
526
423
  encoding: "utf8"
527
424
  });
528
-
529
425
  var document = JSON.parse(documentRawJson);
530
426
  (0, _cleaners.cleanDocumentOrDivision)(document);
531
- var documentJson = JSON.stringify(document, null, 2); // Validate generated JSON.
427
+ var documentJson = JSON.stringify(document, null, 2);
532
428
 
429
+ // Validate generated JSON.
533
430
  var documentClean = _dossiers_legislatifs.Convert.toDocument(documentJson);
534
-
535
431
  var documentCleanJson = _dossiers_legislatifs.Convert.documentToJson(documentClean);
536
-
537
432
  var documentCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir3].concat(_toConsumableArray(documentSplitPath)));
538
-
539
433
  _fsExtra["default"].ensureDirSync(_path["default"].dirname(documentCleanFilePath));
540
-
541
434
  _fsExtra["default"].writeFileSync(documentCleanFilePath, documentCleanJson, {
542
435
  encoding: "utf8"
543
436
  });
@@ -547,41 +440,31 @@ function cleanReorganizedData(options) {
547
440
  } finally {
548
441
  _iterator9.f();
549
442
  }
550
-
551
443
  var _iterator10 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir3, ["dossiers"])),
552
- _step10;
553
-
444
+ _step10;
554
445
  try {
555
446
  for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
556
447
  var dossierSplitPath = _step10.value;
557
448
  var dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
558
-
559
449
  if (!dossierFilename.endsWith(".json")) {
560
450
  continue;
561
451
  }
562
-
563
452
  var dossierRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir3].concat(_toConsumableArray(dossierSplitPath)));
564
-
565
453
  if (options.verbose) {
566
454
  console.log(" Cleaning file: ".concat(dossierRawFilePath, "\u2026"));
567
455
  }
568
-
569
456
  var dossierRawJson = _fsExtra["default"].readFileSync(dossierRawFilePath, {
570
457
  encoding: "utf8"
571
458
  });
572
-
573
459
  var dossier = JSON.parse(dossierRawJson);
574
460
  (0, _cleaners.cleanDossierParlementaire)(dossier);
575
- var dossierJson = JSON.stringify(dossier, null, 2); // Validate generated JSON.
461
+ var dossierJson = JSON.stringify(dossier, null, 2);
576
462
 
463
+ // Validate generated JSON.
577
464
  var dossierClean = _dossiers_legislatifs.Convert.toDossierParlementaire(dossierJson);
578
-
579
465
  var dossierCleanJson = _dossiers_legislatifs.Convert.dossierParlementaireToJson(dossierClean);
580
-
581
466
  var dossierCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir3].concat(_toConsumableArray(dossierSplitPath)));
582
-
583
467
  _fsExtra["default"].ensureDirSync(_path["default"].dirname(dossierCleanFilePath));
584
-
585
468
  _fsExtra["default"].writeFileSync(dossierCleanFilePath, dossierCleanJson, {
586
469
  encoding: "utf8"
587
470
  });
@@ -591,11 +474,9 @@ function cleanReorganizedData(options) {
591
474
  } finally {
592
475
  _iterator10.f();
593
476
  }
594
-
595
477
  if (commitAndPush(_datasetCleanDir3, options, options.remote)) {
596
478
  error = true;
597
479
  }
598
-
599
480
  if (commitAndPushUid(_datasetCleanDir3, options, ["documents", "dossiers"])) {
600
481
  error = true;
601
482
  }
@@ -606,21 +487,16 @@ function cleanReorganizedData(options) {
606
487
  _iterator8.f();
607
488
  }
608
489
  }
609
-
610
490
  if (enabledDatasets & _datasets.EnabledDatasets.Scrutins) {
611
- var _iterator11 = _createForOfIteratorHelper(_datasets.datasets.scrutins),
612
- _step11;
613
-
491
+ var _iterator11 = _createForOfIteratorHelper(choosenDatasets.scrutins),
492
+ _step11;
614
493
  try {
615
494
  for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
616
495
  var _dataset4 = _step11.value;
617
-
618
496
  var _datasetName4 = _path["default"].basename(_dataset4.filename, ".json");
619
-
620
497
  if (options.dataset && _datasetName4 !== options.dataset) {
621
498
  continue;
622
499
  }
623
-
624
500
  if (gitGroupUrl !== undefined) {
625
501
  (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName4, "_nettoye.git"), {
626
502
  cwd: dataDir,
@@ -629,47 +505,34 @@ function cleanReorganizedData(options) {
629
505
  stdio: ["ignore", "ignore", "pipe"]
630
506
  });
631
507
  }
632
-
633
508
  analyzeAndRemove(_datasetName4, options);
634
-
635
509
  var _datasetRawDir4 = _path["default"].join(dataDir, _datasetName4);
636
-
637
510
  var _datasetCleanDir4 = _datasetRawDir4 + "_nettoye";
638
-
639
511
  var _iterator12 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir4)),
640
- _step12;
641
-
512
+ _step12;
642
513
  try {
643
514
  for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
644
515
  var scrutinSplitPath = _step12.value;
645
516
  var scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
646
-
647
517
  if (!scrutinFilename.endsWith(".json")) {
648
518
  continue;
649
519
  }
650
-
651
520
  var scrutinRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir4].concat(_toConsumableArray(scrutinSplitPath)));
652
-
653
521
  if (options.verbose) {
654
522
  console.log(" Cleaning file: ".concat(scrutinRawFilePath, "\u2026"));
655
523
  }
656
-
657
524
  var scrutinRawJson = _fsExtra["default"].readFileSync(scrutinRawFilePath, {
658
525
  encoding: "utf8"
659
526
  });
660
-
661
527
  var scrutin = JSON.parse(scrutinRawJson);
662
528
  (0, _cleaners.cleanScrutin)(scrutin);
663
- var scrutinJson = JSON.stringify(scrutin, null, 2); // Validate generated JSON.
529
+ var scrutinJson = JSON.stringify(scrutin, null, 2);
664
530
 
531
+ // Validate generated JSON.
665
532
  var scrutinClean = _scrutins.Convert.toScrutin(scrutinJson);
666
-
667
533
  var scrutinCleanJson = _scrutins.Convert.scrutinToJson(scrutinClean);
668
-
669
534
  var scrutinCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir4].concat(_toConsumableArray(scrutinSplitPath)));
670
-
671
535
  _fsExtra["default"].ensureDirSync(_path["default"].dirname(scrutinCleanFilePath));
672
-
673
536
  _fsExtra["default"].writeFileSync(scrutinCleanFilePath, scrutinCleanJson, {
674
537
  encoding: "utf8"
675
538
  });
@@ -679,11 +542,9 @@ function cleanReorganizedData(options) {
679
542
  } finally {
680
543
  _iterator12.f();
681
544
  }
682
-
683
545
  if (commitAndPush(_datasetCleanDir4, options, options.remote)) {
684
546
  error = true;
685
547
  }
686
-
687
548
  if (commitAndPushUid(_datasetCleanDir4, options, ["."])) {
688
549
  error = true;
689
550
  }
@@ -693,39 +554,29 @@ function cleanReorganizedData(options) {
693
554
  } finally {
694
555
  _iterator11.f();
695
556
  }
696
- } // Restore standard conversion of dates to JSON.
697
-
557
+ }
698
558
 
559
+ // Restore standard conversion of dates to JSON.
699
560
  Date.prototype.toJSON = _dates.existingDateToJson;
700
561
  return error;
701
562
  }
702
-
703
563
  function analyzeAndRemove(datasetName, options) {
704
564
  var dataDir = options.dataDir;
705
-
706
565
  var datasetRawDir = _path["default"].join(dataDir, datasetName);
707
-
708
566
  var datasetCleanDir = datasetRawDir + "_nettoye";
709
-
710
567
  if (!options.silent) {
711
568
  console.log("Cleaning directory: ".concat(datasetCleanDir, "\u2026"));
712
569
  }
713
-
714
570
  _fsExtra["default"].ensureDirSync(datasetCleanDir);
715
-
716
571
  var _iterator13 = _createForOfIteratorHelper(_fsExtra["default"].readdirSync(datasetCleanDir)),
717
- _step13;
718
-
572
+ _step13;
719
573
  try {
720
574
  for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
721
575
  var filename = _step13.value;
722
-
723
576
  if (filename[0] === ".") {
724
577
  continue;
725
578
  }
726
-
727
579
  var pathname = _path["default"].join(datasetCleanDir, filename);
728
-
729
580
  _fsExtra["default"].removeSync(pathname);
730
581
  }
731
582
  } catch (err) {
@@ -734,20 +585,15 @@ function analyzeAndRemove(datasetName, options) {
734
585
  _iterator13.f();
735
586
  }
736
587
  }
737
-
738
588
  function commitAndPush(repositoryDir, options, remotes) {
739
589
  var error = false;
740
-
741
590
  if (options.commit) {
742
591
  git.commit(repositoryDir, "Nouvelle moisson");
743
-
744
592
  var _iterator14 = _createForOfIteratorHelper(remotes || []),
745
- _step14;
746
-
593
+ _step14;
747
594
  try {
748
595
  for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
749
596
  var remote = _step14.value;
750
-
751
597
  try {
752
598
  (0, _child_process.execSync)("git push ".concat(remote, " master"), {
753
599
  cwd: repositoryDir,
@@ -767,23 +613,17 @@ function commitAndPush(repositoryDir, options, remotes) {
767
613
  _iterator14.f();
768
614
  }
769
615
  }
770
-
771
616
  return error;
772
617
  }
773
-
774
618
  function commitAndPushUid(repositoryDir, options, subdirectories) {
775
619
  var error = false;
776
-
777
620
  if (options.commit) {
778
621
  git.uidBranchUpdate(repositoryDir, subdirectories, options["no-reset-after-commit"]);
779
-
780
622
  var _iterator15 = _createForOfIteratorHelper(options.remote || []),
781
- _step15;
782
-
623
+ _step15;
783
624
  try {
784
625
  for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
785
626
  var remote = _step15.value;
786
-
787
627
  try {
788
628
  git.run(repositoryDir, "push --quiet ".concat(remote, " uid:uid"));
789
629
  } catch (childProcess) {
@@ -796,21 +636,17 @@ function commitAndPushUid(repositoryDir, options, subdirectories) {
796
636
  _iterator15.f();
797
637
  }
798
638
  }
799
-
800
639
  return error;
801
640
  }
802
-
803
641
  function main(argv) {
804
642
  var options = parseArgs(argv);
805
-
806
643
  if (cleanReorganizedData(options)) {
807
644
  return 1;
808
645
  } else {
809
646
  return 0;
810
647
  }
811
648
  }
812
- /* istanbul ignore if */
813
-
814
649
 
650
+ /* istanbul ignore if */
815
651
  if (process.argv[1].endsWith("clean_reorganized_data.ts")) process.exit(main(process.argv));
816
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNvbW1hbmRMaW5lQXJncyIsImNsZWFuUmVvcmdhbml6ZWREYXRhIiwiZGF0YURpciIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJwYXRjaGVkRGF0ZVRvSnNvbiIsImVycm9yIiwiZ2l0R3JvdXBVcmwiLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwidW5kZWZpbmVkIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwiYXNzZXJ0Iiwibm90U3RyaWN0RXF1YWwiLCJFbmFibGVkRGF0YXNldHMiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXRzIiwiYWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJwYXRoIiwiYmFzZW5hbWUiLCJmaWxlbmFtZSIsImV4ZWNTeW5jIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJhbmFseXplQW5kUmVtb3ZlIiwiZGF0YXNldFJhd0RpciIsImpvaW4iLCJkYXRhc2V0Q2xlYW5EaXIiLCJ3YWxrRGlyIiwiYWN0ZXVyU3BsaXRQYXRoIiwiYWN0ZXVyRmlsZW5hbWUiLCJsZW5ndGgiLCJlbmRzV2l0aCIsImFjdGV1clJhd0ZpbGVQYXRoIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJhY3RldXJSYXdKc29uIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJhY3RldXIiLCJKU09OIiwicGFyc2UiLCJjbGVhbkFjdGV1ciIsImFjdGV1ckpzb24iLCJzdHJpbmdpZnkiLCJhY3RldXJDbGVhbiIsIkFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0IiwidG9BY3RldXIiLCJhY3RldXJDbGVhbkpzb24iLCJhY3RldXJUb0pzb24iLCJhY3RldXJDbGVhbkZpbGVQYXRoIiwiZW5zdXJlRGlyU3luYyIsImRpcm5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwib3JnYW5lU3BsaXRQYXRoIiwib3JnYW5lRmlsZW5hbWUiLCJvcmdhbmVSYXdGaWxlUGF0aCIsIm9yZ2FuZVJhd0pzb24iLCJvcmdhbmUiLCJjbGVhbk9yZ2FuZSIsIm9yZ2FuZUpzb24iLCJvcmdhbmVDbGVhbiIsInRvT3JnYW5lIiwib3JnYW5lQ2xlYW5Kc29uIiwib3JnYW5lVG9Kc29uIiwib3JnYW5lQ2xlYW5GaWxlUGF0aCIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJjb21taXRBbmRQdXNoVWlkIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJyZXVuaW9uU3BsaXRQYXRoIiwicmV1bmlvbkZpbGVuYW1lIiwicmV1bmlvblJhd0ZpbGVQYXRoIiwicmV1bmlvblJhd0pzb24iLCJyZXVuaW9uIiwiY2xlYW5SZXVuaW9uIiwicmV1bmlvbkpzb24iLCJyZXVuaW9uQ2xlYW4iLCJBZ2VuZGFzQ29udmVydCIsInRvUmV1bmlvbiIsInJldW5pb25DbGVhbkpzb24iLCJyZXVuaW9uVG9Kc29uIiwicmV1bmlvbkNsZWFuRmlsZVBhdGgiLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsImFtZW5kZW1lbnRGaWxlbmFtZSIsImFtZW5kZW1lbnRSYXdGaWxlUGF0aCIsImFtZW5kZW1lbnRSYXdKc29uIiwiYW1lbmRlbWVudCIsImNsZWFuQW1lbmRlbWVudCIsImFtZW5kZW1lbnRKc29uIiwiYW1lbmRlbWVudENsZWFuIiwiQW1lbmRlbWVudHNDb252ZXJ0IiwidG9BbWVuZGVtZW50IiwiYW1lbmRlbWVudENsZWFuSnNvbiIsImFtZW5kZW1lbnRUb0pzb24iLCJhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnRTcGxpdFBhdGgiLCJkb2N1bWVudEZpbGVuYW1lIiwiZG9jdW1lbnRSYXdGaWxlUGF0aCIsImRvY3VtZW50UmF3SnNvbiIsImRvY3VtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJkb2N1bWVudEpzb24iLCJkb2N1bWVudENsZWFuIiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJ0b0RvY3VtZW50IiwiZG9jdW1lbnRDbGVhbkpzb24iLCJkb2N1bWVudFRvSnNvbiIsImRvY3VtZW50Q2xlYW5GaWxlUGF0aCIsImRvc3NpZXJTcGxpdFBhdGgiLCJkb3NzaWVyRmlsZW5hbWUiLCJkb3NzaWVyUmF3RmlsZVBhdGgiLCJkb3NzaWVyUmF3SnNvbiIsImRvc3NpZXIiLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llckpzb24iLCJkb3NzaWVyQ2xlYW4iLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llckNsZWFuSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uIiwiZG9zc2llckNsZWFuRmlsZVBhdGgiLCJTY3J1dGlucyIsInNjcnV0aW5zIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5SYXdGaWxlUGF0aCIsInNjcnV0aW5SYXdKc29uIiwic2NydXRpbiIsImNsZWFuU2NydXRpbiIsInNjcnV0aW5Kc29uIiwic2NydXRpbkNsZWFuIiwiU2NydXRpbnNDb252ZXJ0IiwidG9TY3J1dGluIiwic2NydXRpbkNsZWFuSnNvbiIsInNjcnV0aW5Ub0pzb24iLCJzY3J1dGluQ2xlYW5GaWxlUGF0aCIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInNpbGVudCIsInJlYWRkaXJTeW5jIiwicGF0aG5hbWUiLCJyZW1vdmVTeW5jIiwicmVwb3NpdG9yeURpciIsInJlbW90ZXMiLCJjb21taXQiLCJnaXQiLCJjaGlsZFByb2Nlc3MiLCJvdXRwdXQiLCJzdWJkaXJlY3RvcmllcyIsInVpZEJyYW5jaFVwZGF0ZSIsInJ1biIsIm1haW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHtcbiAgY2xlYW5BY3RldXIsXG4gIGNsZWFuQW1lbmRlbWVudCxcbiAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24sXG4gIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUsXG4gIGNsZWFuT3JnYW5lLFxuICBjbGVhblJldW5pb24sXG4gIGNsZWFuU2NydXRpbixcbn0gZnJvbSBcIi4uL2NsZWFuZXJzXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBFbmFibGVkRGF0YXNldHMgfSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgZXhpc3RpbmdEYXRlVG9Kc29uLCBwYXRjaGVkRGF0ZVRvSnNvbiB9IGZyb20gXCIuLi9kYXRlc1wiXG5pbXBvcnQgeyB3YWxrRGlyIH0gZnJvbSBcIi4uL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQgKiBhcyBnaXQgZnJvbSBcIi4uL2dpdFwiXG5pbXBvcnQge1xuICBBY3RldXIsXG4gIENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQsXG4gIE9yZ2FuZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNDb252ZXJ0LCBSZXVuaW9uIH0gZnJvbSBcIi4uL3R5cGVzL2FnZW5kYXNcIlxuaW1wb3J0IHsgQW1lbmRlbWVudCwgQ29udmVydCBhcyBBbWVuZGVtZW50c0NvbnZlcnQgfSBmcm9tIFwiLi4vdHlwZXMvYW1lbmRlbWVudHNcIlxuaW1wb3J0IHtcbiAgQ29udmVydCBhcyBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydCxcbiAgRG9jdW1lbnQsXG4gIERvc3NpZXJQYXJsZW1lbnRhaXJlLFxufSBmcm9tIFwiLi4vdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBTY3J1dGluc0NvbnZlcnQsIFNjcnV0aW4gfSBmcm9tIFwiLi4vdHlwZXMvc2NydXRpbnNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAge1xuICAgICAgYWxpYXM6IFwiQ1wiLFxuICAgICAgaGVscDogXCJjbG9uZSByZXBvc2l0b3JpZXMgZnJvbSBnaXZlbiBncm91cCAob3Igb3JnYW5pemF0aW9uKSBnaXQgVVJMXCIsXG4gICAgICBuYW1lOiBcImNsb25lXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJjXCIsXG4gICAgICBoZWxwOiBcImNvbW1pdCBjbGVhbiBmaWxlc1wiLFxuICAgICAgbmFtZTogXCJjb21taXRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJkXCIsXG4gICAgICBoZWxwOiBcInNpbmdsZSBkYXRhc2V0IHRvIHJlb3JnYW5pemVcIixcbiAgICAgIG5hbWU6IFwiZGF0YXNldFwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwia1wiLFxuICAgICAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gICAgICBoZWxwOiBcImNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmVvcmdhbml6ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcImNhdGVnb3JpZXNcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInJcIixcbiAgICAgIGhlbHA6IFwicHVzaCBjb21taXQgdG8gZ2l2ZW4gcmVtb3RlXCIsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJzXCIsXG4gICAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwOiBcImRvIG5vdCByZXNldCAtLWhhcmQgYWZ0ZXIgY29tbWl0IHRvIHNhdmUgSS9PIGlmIHRoZSB3b3JraW5nIHRyZWUgaXMgdG8gYmUgZGlzY2FyZGVkXCIsXG4gICAgICBuYW1lOiBcIm5vLXJlc2V0LWFmdGVyLWNvbW1pdFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInZcIixcbiAgICAgIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gICAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBBc3NlbWJsw6llIG9wZW4gZGF0YSBmaWxlc1wiLFxuICAgICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgXVxuICBjb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucywge1xuICAgIGFyZ3Y6IGFyZ3YsXG4gIH0pXG4gIHJldHVybiBvcHRpb25zXG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVvcmdhbml6ZWREYXRhKG9wdGlvbnM6IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCBkYXRhRGlyOiBzdHJpbmcgPSBvcHRpb25zLmRhdGFEaXJcblxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBwYXRjaGVkRGF0ZVRvSnNvblxuXG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZVxuICAgID8gb3B0aW9ucy5jbG9uZS50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgb3B0aW9ucy5jYXRlZ29yaWVzLm1hcCgoZGF0YXNldE5hbWU6IHN0cmluZykgPT5cbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYFVua25vd24gbmFtZSBvZiBkYXRhc2V0OiAke2RhdGFzZXROYW1lfWAsXG4gICAgKSxcbiAgKVxuICBjb25zdCBlbmFibGVkRGF0YXNldHMgPSBvcHRpb25zLmNhdGVnb3JpZXMucmVkdWNlKFxuICAgIChlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cywgZGF0YXNldE5hbWU6IHN0cmluZyk6IEVuYWJsZWREYXRhc2V0cyA9PlxuICAgICAgZW5hYmxlZERhdGFzZXRzIHxcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgRW5hYmxlZERhdGFzZXRzLk5vbmUsXG4gIClcblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGFjdGV1clNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcImFjdGV1cnNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGFjdGV1ckZpbGVuYW1lID0gYWN0ZXVyU3BsaXRQYXRoW2FjdGV1clNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFjdGV1ckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGV1clJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmFjdGV1clNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7YWN0ZXVyUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoYWN0ZXVyUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGFjdGV1ciA9IEpTT04ucGFyc2UoYWN0ZXVyUmF3SnNvbilcbiAgICAgICAgY2xlYW5BY3RldXIoYWN0ZXVyKVxuICAgICAgICBjb25zdCBhY3RldXJKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhY3RldXIsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuOiBBY3RldXIgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cihhY3RldXJKc29uKVxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQuYWN0ZXVyVG9Kc29uKGFjdGV1ckNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uYWN0ZXVyU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGFjdGV1ckNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGFjdGV1ckNsZWFuRmlsZVBhdGgsIGFjdGV1ckNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJvcmdhbmVzXCJdKSkge1xuICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5vcmdhbmVTcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke29yZ2FuZVJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKG9yZ2FuZVJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBvcmdhbmUgPSBKU09OLnBhcnNlKG9yZ2FuZVJhd0pzb24pXG4gICAgICAgIGNsZWFuT3JnYW5lKG9yZ2FuZSlcbiAgICAgICAgY29uc3Qgb3JnYW5lSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbjogT3JnYW5lID0gQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9PcmdhbmUob3JnYW5lSnNvbilcbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0Lm9yZ2FuZVRvSnNvbihvcmdhbmVDbGVhbilcblxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLm9yZ2FuZVNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShvcmdhbmVDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhvcmdhbmVDbGVhbkZpbGVQYXRoLCBvcmdhbmVDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCJhY3RldXJzXCIsIFwib3JnYW5lc1wiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCByZXVuaW9uU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVuYW1lID0gcmV1bmlvblNwbGl0UGF0aFtyZXVuaW9uU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghcmV1bmlvbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldW5pb25SYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5yZXVuaW9uU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtyZXVuaW9uUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXVuaW9uUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHJldW5pb25SYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgcmV1bmlvbiA9IEpTT04ucGFyc2UocmV1bmlvblJhd0pzb24pXG4gICAgICAgIGNsZWFuUmV1bmlvbihyZXVuaW9uKVxuICAgICAgICBjb25zdCByZXVuaW9uSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmV1bmlvbiwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgcmV1bmlvbkNsZWFuOiBSZXVuaW9uID0gQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25Kc29uKVxuICAgICAgICBjb25zdCByZXVuaW9uQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFnZW5kYXNDb252ZXJ0LnJldW5pb25Ub0pzb24ocmV1bmlvbkNsZWFuKVxuXG4gICAgICAgIGNvbnN0IHJldW5pb25DbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLnJldW5pb25TcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUocmV1bmlvbkNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJldW5pb25DbGVhbkZpbGVQYXRoLCByZXVuaW9uQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyKSkge1xuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZW5hbWUgPVxuICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGhbYW1lbmRlbWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFtZW5kZW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50UmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5hbWVuZGVtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2FtZW5kZW1lbnRSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgYW1lbmRlbWVudFJhd0ZpbGVQYXRoLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBKU09OLnBhcnNlKGFtZW5kZW1lbnRSYXdKc29uKVxuICAgICAgICBjbGVhbkFtZW5kZW1lbnQoYW1lbmRlbWVudClcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGFtZW5kZW1lbnQsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbjogQW1lbmRlbWVudCA9XG4gICAgICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudChhbWVuZGVtZW50SnNvbilcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudENsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBbWVuZGVtZW50c0NvbnZlcnQuYW1lbmRlbWVudFRvSnNvbihhbWVuZGVtZW50Q2xlYW4pXG5cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudENsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYW1lbmRlbWVudENsZWFuRmlsZVBhdGgsIGFtZW5kZW1lbnRDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCIuXCJdKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wiZG9jdW1lbnRzXCJdKSkge1xuICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID0gZG9jdW1lbnRTcGxpdFBhdGhbZG9jdW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFkb2N1bWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50UmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtkb2N1bWVudFJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9jdW1lbnRSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBKU09OLnBhcnNlKGRvY3VtZW50UmF3SnNvbilcbiAgICAgICAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24oZG9jdW1lbnQpXG4gICAgICAgIGNvbnN0IGRvY3VtZW50SnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnQsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Q2xlYW46IERvY3VtZW50ID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0RvY3VtZW50KGRvY3VtZW50SnNvbilcbiAgICAgICAgY29uc3QgZG9jdW1lbnRDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9jdW1lbnRUb0pzb24oZG9jdW1lbnRDbGVhbilcblxuICAgICAgICBjb25zdCBkb2N1bWVudENsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZG9jdW1lbnRDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkb2N1bWVudENsZWFuRmlsZVBhdGgsIGRvY3VtZW50Q2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRvc3NpZXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJkb3NzaWVyc1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9zc2llckZpbGVuYW1lID0gZG9zc2llclNwbGl0UGF0aFtkb3NzaWVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9zc2llckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5kb3NzaWVyU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtkb3NzaWVyUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVyUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvc3NpZXJSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9zc2llciA9IEpTT04ucGFyc2UoZG9zc2llclJhd0pzb24pXG4gICAgICAgIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llcilcbiAgICAgICAgY29uc3QgZG9zc2llckpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRvc3NpZXIsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbjogRG9zc2llclBhcmxlbWVudGFpcmUgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llckpzb24pXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9zc2llclBhcmxlbWVudGFpcmVUb0pzb24oZG9zc2llckNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmRvc3NpZXJTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZG9zc2llckNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRvc3NpZXJDbGVhbkZpbGVQYXRoLCBkb3NzaWVyQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcImRvY3VtZW50c1wiLCBcImRvc3NpZXJzXCJdKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBzY3J1dGluU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID0gc2NydXRpblNwbGl0UGF0aFtzY3J1dGluU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghc2NydXRpbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcnV0aW5SYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5zY3J1dGluU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtzY3J1dGluUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNjcnV0aW5SYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgc2NydXRpbiA9IEpTT04ucGFyc2Uoc2NydXRpblJhd0pzb24pXG4gICAgICAgIGNsZWFuU2NydXRpbihzY3J1dGluKVxuICAgICAgICBjb25zdCBzY3J1dGluSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoc2NydXRpbiwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuOiBTY3J1dGluID0gU2NydXRpbnNDb252ZXJ0LnRvU2NydXRpbihzY3J1dGluSnNvbilcbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBTY3J1dGluc0NvbnZlcnQuc2NydXRpblRvSnNvbihzY3J1dGluQ2xlYW4pXG5cbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uc2NydXRpblNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShzY3J1dGluQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2NydXRpbkNsZWFuRmlsZVBhdGgsIHNjcnV0aW5DbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCIuXCJdKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXN0b3JlIHN0YW5kYXJkIGNvbnZlcnNpb24gb2YgZGF0ZXMgdG8gSlNPTi5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZXhpc3RpbmdEYXRlVG9Kc29uXG5cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWU6IHN0cmluZywgb3B0aW9uczogYW55KTogYW55IHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgY29uc29sZS5sb2coYENsZWFuaW5nIGRpcmVjdG9yeTogJHtkYXRhc2V0Q2xlYW5EaXJ94oCmYClcbiAgfVxuICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRDbGVhbkRpcilcbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpKSB7XG4gICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgcGF0aG5hbWUgPSBwYXRoLmpvaW4oZGF0YXNldENsZWFuRGlyLCBmaWxlbmFtZSlcbiAgICBmcy5yZW1vdmVTeW5jKHBhdGhuYW1lKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2goXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgb3B0aW9uczogYW55LFxuICByZW1vdGVzPzogc3RyaW5nW10sXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgZ2l0LmNvbW1pdChyZXBvc2l0b3J5RGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIilcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiByZW1vdGVzIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IHB1c2ggJHtyZW1vdGV9IG1hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIC8vIERvbid0IHN0b3Agd2hlbiBwdXNoIGZhaWxzLlxuICAgICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaFVpZChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgZ2l0LnVpZEJyYW5jaFVwZGF0ZShcbiAgICAgIHJlcG9zaXRvcnlEaXIsXG4gICAgICBzdWJkaXJlY3RvcmllcyxcbiAgICAgIG9wdGlvbnNbXCJuby1yZXNldC1hZnRlci1jb21taXRcIl0sXG4gICAgKVxuICAgIGZvciAoY29uc3QgcmVtb3RlIG9mIG9wdGlvbnMucmVtb3RlIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBnaXQucnVuKHJlcG9zaXRvcnlEaXIsIGBwdXNoIC0tcXVpZXQgJHtyZW1vdGV9IHVpZDp1aWRgKVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gbWFpbihhcmd2OiBhbnkpOiBudW1iZXIge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGFyZ3YpXG4gIGlmIChjbGVhblJlb3JnYW5pemVkRGF0YShvcHRpb25zKSkge1xuICAgIHJldHVybiAxXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDBcbiAgfVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChwcm9jZXNzLmFyZ3ZbMV0uZW5kc1dpdGgoXCJjbGVhbl9yZW9yZ2FuaXplZF9kYXRhLnRzXCIpKVxuICBwcm9jZXNzLmV4aXQobWFpbihwcm9jZXNzLmFyZ3YpKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBU0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxTQUFTQSxTQUFULENBQW1CQyxJQUFuQixFQUF3QztFQUN0QyxJQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtJQUNFQyxLQUFLLEVBQUUsR0FEVDtJQUVFQyxJQUFJLEVBQUUsK0RBRlI7SUFHRUMsSUFBSSxFQUFFLE9BSFI7SUFJRUMsSUFBSSxFQUFFQztFQUpSLENBRHlCLEVBT3pCO0lBQ0VKLEtBQUssRUFBRSxHQURUO0lBRUVDLElBQUksRUFBRSxvQkFGUjtJQUdFQyxJQUFJLEVBQUUsUUFIUjtJQUlFQyxJQUFJLEVBQUVFO0VBSlIsQ0FQeUIsRUFhekI7SUFDRUws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
652
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJOdW1iZXIiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNvbW1hbmRMaW5lQXJncyIsImNsZWFuUmVvcmdhbml6ZWREYXRhIiwiZGF0YURpciIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJwYXRjaGVkRGF0ZVRvSnNvbiIsImVycm9yIiwiZ2l0R3JvdXBVcmwiLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwidW5kZWZpbmVkIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwiYXNzZXJ0Iiwibm90U3RyaWN0RXF1YWwiLCJFbmFibGVkRGF0YXNldHMiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiY2hvb3NlbkRhdGFzZXRzIiwiZGF0YXNldHMiLCJsZWdpc2xhdHVyZSIsImVuYWJsZWRMZWdpc2xhdHVyZXMiLCJ0b1N0cmluZyIsIk9iamVjdCIsImVudHJpZXMiLCJrZXkiLCJ2YWx1ZSIsImZpbHRlciIsImRhdGFzZXQiLCJpbmNsdWRlcyIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJhY3RldXJzRXRPcmdhbmVzIiwicGF0aCIsImJhc2VuYW1lIiwiZmlsZW5hbWUiLCJleGVjU3luYyIsImN3ZCIsImVudiIsInByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiYW5hbHl6ZUFuZFJlbW92ZSIsImRhdGFzZXRSYXdEaXIiLCJqb2luIiwiZGF0YXNldENsZWFuRGlyIiwid2Fsa0RpciIsImFjdGV1clNwbGl0UGF0aCIsImFjdGV1ckZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJhY3RldXJSYXdGaWxlUGF0aCIsInZlcmJvc2UiLCJjb25zb2xlIiwibG9nIiwiYWN0ZXVyUmF3SnNvbiIsImZzIiwicmVhZEZpbGVTeW5jIiwiYWN0ZXVyIiwiSlNPTiIsInBhcnNlIiwiY2xlYW5BY3RldXIiLCJhY3RldXJKc29uIiwic3RyaW5naWZ5IiwiYWN0ZXVyQ2xlYW4iLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsInRvQWN0ZXVyIiwiYWN0ZXVyQ2xlYW5Kc29uIiwiYWN0ZXVyVG9Kc29uIiwiYWN0ZXVyQ2xlYW5GaWxlUGF0aCIsImVuc3VyZURpclN5bmMiLCJkaXJuYW1lIiwid3JpdGVGaWxlU3luYyIsIm9yZ2FuZVNwbGl0UGF0aCIsIm9yZ2FuZUZpbGVuYW1lIiwib3JnYW5lUmF3RmlsZVBhdGgiLCJvcmdhbmVSYXdKc29uIiwib3JnYW5lIiwiY2xlYW5PcmdhbmUiLCJvcmdhbmVKc29uIiwib3JnYW5lQ2xlYW4iLCJ0b09yZ2FuZSIsIm9yZ2FuZUNsZWFuSnNvbiIsIm9yZ2FuZVRvSnNvbiIsIm9yZ2FuZUNsZWFuRmlsZVBhdGgiLCJjb21taXRBbmRQdXNoIiwicmVtb3RlIiwiY29tbWl0QW5kUHVzaFVpZCIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwicmV1bmlvblNwbGl0UGF0aCIsInJldW5pb25GaWxlbmFtZSIsInJldW5pb25SYXdGaWxlUGF0aCIsInJldW5pb25SYXdKc29uIiwicmV1bmlvbiIsImNsZWFuUmV1bmlvbiIsInJldW5pb25Kc29uIiwicmV1bmlvbkNsZWFuIiwiQWdlbmRhc0NvbnZlcnQiLCJ0b1JldW5pb24iLCJyZXVuaW9uQ2xlYW5Kc29uIiwicmV1bmlvblRvSnNvbiIsInJldW5pb25DbGVhbkZpbGVQYXRoIiwiQW1lbmRlbWVudHMiLCJhbWVuZGVtZW50cyIsImFtZW5kZW1lbnRTcGxpdFBhdGgiLCJhbWVuZGVtZW50RmlsZW5hbWUiLCJhbWVuZGVtZW50UmF3RmlsZVBhdGgiLCJhbWVuZGVtZW50UmF3SnNvbiIsImFtZW5kZW1lbnQiLCJjbGVhbkFtZW5kZW1lbnQiLCJhbWVuZGVtZW50SnNvbiIsImFtZW5kZW1lbnRDbGVhbiIsIkFtZW5kZW1lbnRzQ29udmVydCIsInRvQW1lbmRlbWVudCIsImFtZW5kZW1lbnRDbGVhbkpzb24iLCJhbWVuZGVtZW50VG9Kc29uIiwiYW1lbmRlbWVudENsZWFuRmlsZVBhdGgiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50UmF3RmlsZVBhdGgiLCJkb2N1bWVudFJhd0pzb24iLCJkb2N1bWVudCIsImNsZWFuRG9jdW1lbnRPckRpdmlzaW9uIiwiZG9jdW1lbnRKc29uIiwiZG9jdW1lbnRDbGVhbiIsIkRvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0IiwidG9Eb2N1bWVudCIsImRvY3VtZW50Q2xlYW5Kc29uIiwiZG9jdW1lbnRUb0pzb24iLCJkb2N1bWVudENsZWFuRmlsZVBhdGgiLCJkb3NzaWVyU3BsaXRQYXRoIiwiZG9zc2llckZpbGVuYW1lIiwiZG9zc2llclJhd0ZpbGVQYXRoIiwiZG9zc2llclJhd0pzb24iLCJkb3NzaWVyIiwiY2xlYW5Eb3NzaWVyUGFybGVtZW50YWlyZSIsImRvc3NpZXJKc29uIiwiZG9zc2llckNsZWFuIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsImRvc3NpZXJDbGVhbkpzb24iLCJkb3NzaWVyUGFybGVtZW50YWlyZVRvSnNvbiIsImRvc3NpZXJDbGVhbkZpbGVQYXRoIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInNjcnV0aW5TcGxpdFBhdGgiLCJzY3J1dGluRmlsZW5hbWUiLCJzY3J1dGluUmF3RmlsZVBhdGgiLCJzY3J1dGluUmF3SnNvbiIsInNjcnV0aW4iLCJjbGVhblNjcnV0aW4iLCJzY3J1dGluSnNvbiIsInNjcnV0aW5DbGVhbiIsIlNjcnV0aW5zQ29udmVydCIsInRvU2NydXRpbiIsInNjcnV0aW5DbGVhbkpzb24iLCJzY3J1dGluVG9Kc29uIiwic2NydXRpbkNsZWFuRmlsZVBhdGgiLCJleGlzdGluZ0RhdGVUb0pzb24iLCJzaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhdGhuYW1lIiwicmVtb3ZlU3luYyIsInJlcG9zaXRvcnlEaXIiLCJyZW1vdGVzIiwiY29tbWl0IiwiZ2l0IiwiY2hpbGRQcm9jZXNzIiwib3V0cHV0Iiwic3ViZGlyZWN0b3JpZXMiLCJ1aWRCcmFuY2hVcGRhdGUiLCJydW4iLCJtYWluIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL2NsZWFuX3Jlb3JnYW5pemVkX2RhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmltcG9ydCB7XG4gIGNsZWFuQWN0ZXVyLFxuICBjbGVhbkFtZW5kZW1lbnQsXG4gIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uLFxuICBjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICBjbGVhbk9yZ2FuZSxcbiAgY2xlYW5SZXVuaW9uLFxuICBjbGVhblNjcnV0aW4sXG59IGZyb20gXCIuLi9jbGVhbmVyc1wiXG5pbXBvcnQgeyBkYXRhc2V0cywgRW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuLi90eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQsIENvbnZlcnQgYXMgQW1lbmRlbWVudHNDb252ZXJ0IH0gZnJvbSBcIi4uL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4uL3R5cGVzL3NjcnV0aW5zXCJcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKTogYW55IHtcbiAgY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICAgIHtcbiAgICAgIGFsaWFzOiBcIkNcIixcbiAgICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgICAgbmFtZTogXCJjbG9uZVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiY1wiLFxuICAgICAgaGVscDogXCJjb21taXQgY2xlYW4gZmlsZXNcIixcbiAgICAgIG5hbWU6IFwiY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiZFwiLFxuICAgICAgaGVscDogXCJzaW5nbGUgZGF0YXNldCB0byByZW9yZ2FuaXplXCIsXG4gICAgICBuYW1lOiBcImRhdGFzZXRcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImtcIixcbiAgICAgIGRlZmF1bHRWYWx1ZTogW1wiQWxsXCJdLFxuICAgICAgaGVscDogXCJjYXRlZ29yaWVzIG9mIGRhdGFzZXRzIHRvIHJlb3JnYW5pemVcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJjYXRlZ29yaWVzXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJsXCIsXG4gICAgICBoZWxwOiBcImxlZ2lzbGF0dXJlcyBvZiBjYXRlZ29yaWVzIG9mIGRhdGFzZXRzIHRvIHJldHJpZXZlXCIsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG5hbWU6IFwibGVnaXNsYXR1cmVcIixcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInJcIixcbiAgICAgIGhlbHA6IFwicHVzaCBjb21taXQgdG8gZ2l2ZW4gcmVtb3RlXCIsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJzXCIsXG4gICAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwOiBcImRvIG5vdCByZXNldCAtLWhhcmQgYWZ0ZXIgY29tbWl0IHRvIHNhdmUgSS9PIGlmIHRoZSB3b3JraW5nIHRyZWUgaXMgdG8gYmUgZGlzY2FyZGVkXCIsXG4gICAgICBuYW1lOiBcIm5vLXJlc2V0LWFmdGVyLWNvbW1pdFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInZcIixcbiAgICAgIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gICAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBBc3NlbWJsw6llIG9wZW4gZGF0YSBmaWxlc1wiLFxuICAgICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgXVxuICBjb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucywge1xuICAgIGFyZ3Y6IGFyZ3YsXG4gIH0pXG4gIHJldHVybiBvcHRpb25zXG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVvcmdhbml6ZWREYXRhKG9wdGlvbnM6IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCBkYXRhRGlyOiBzdHJpbmcgPSBvcHRpb25zLmRhdGFEaXJcblxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBwYXRjaGVkRGF0ZVRvSnNvblxuXG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZVxuICAgID8gb3B0aW9ucy5jbG9uZS50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgb3B0aW9ucy5jYXRlZ29yaWVzLm1hcCgoZGF0YXNldE5hbWU6IHN0cmluZykgPT5cbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYFVua25vd24gbmFtZSBvZiBkYXRhc2V0OiAke2RhdGFzZXROYW1lfWAsXG4gICAgKSxcbiAgKVxuICBjb25zdCBlbmFibGVkRGF0YXNldHMgPSBvcHRpb25zLmNhdGVnb3JpZXMucmVkdWNlKFxuICAgIChlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cywgZGF0YXNldE5hbWU6IHN0cmluZyk6IEVuYWJsZWREYXRhc2V0cyA9PlxuICAgICAgZW5hYmxlZERhdGFzZXRzIHxcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgRW5hYmxlZERhdGFzZXRzLk5vbmUsXG4gIClcblxuICBsZXQgY2hvb3NlbkRhdGFzZXRzID0gZGF0YXNldHNcbiAgaWYob3B0aW9ucy5sZWdpc2xhdHVyZSkge1xuICAgIGNvbnN0IGVuYWJsZWRMZWdpc2xhdHVyZXMgPSBvcHRpb25zLmxlZ2lzbGF0dXJlLm1hcCgobGVnaXNsYXR1cmU6IG51bWJlcikgPT4gbGVnaXNsYXR1cmUudG9TdHJpbmcoKSlcbiAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY2hvb3NlbkRhdGFzZXRzKSkge1xuICAgICAgY2hvb3NlbkRhdGFzZXRzW2tleSBhcyBrZXlvZiB0eXBlb2YgY2hvb3NlbkRhdGFzZXRzXSA9IHZhbHVlLmZpbHRlcigoZGF0YXNldDogeyBsZWdpc2xhdHVyZTogYW55IH0pID0+IGVuYWJsZWRMZWdpc2xhdHVyZXMuaW5jbHVkZXMoZGF0YXNldC5sZWdpc2xhdHVyZSkpXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob29zZW5EYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgYWN0ZXVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wiYWN0ZXVyc1wiXSkpIHtcbiAgICAgICAgY29uc3QgYWN0ZXVyRmlsZW5hbWUgPSBhY3RldXJTcGxpdFBhdGhbYWN0ZXVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghYWN0ZXVyRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0ZXVyUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4uYWN0ZXVyU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHthY3RldXJSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGV1clJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhhY3RldXJSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgYWN0ZXVyID0gSlNPTi5wYXJzZShhY3RldXJSYXdKc29uKVxuICAgICAgICBjbGVhbkFjdGV1cihhY3RldXIpXG4gICAgICAgIGNvbnN0IGFjdGV1ckpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGFjdGV1ciwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgYWN0ZXVyQ2xlYW46IEFjdGV1ciA9IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvQWN0ZXVyKGFjdGV1ckpzb24pXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBY3RldXJzRXRPcmdhbmVzQ29udmVydC5hY3RldXJUb0pzb24oYWN0ZXVyQ2xlYW4pXG5cbiAgICAgICAgY29uc3QgYWN0ZXVyQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5hY3RldXJTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoYWN0ZXVyQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYWN0ZXVyQ2xlYW5GaWxlUGF0aCwgYWN0ZXVyQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG9yZ2FuZVNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcIm9yZ2FuZXNcIl0pKSB7XG4gICAgICAgIGNvbnN0IG9yZ2FuZUZpbGVuYW1lID0gb3JnYW5lU3BsaXRQYXRoW29yZ2FuZVNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIW9yZ2FuZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yZ2FuZVJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLm9yZ2FuZVNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7b3JnYW5lUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMob3JnYW5lUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IG9yZ2FuZSA9IEpTT04ucGFyc2Uob3JnYW5lUmF3SnNvbilcbiAgICAgICAgY2xlYW5PcmdhbmUob3JnYW5lKVxuICAgICAgICBjb25zdCBvcmdhbmVKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvcmdhbmUsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IG9yZ2FuZUNsZWFuOiBPcmdhbmUgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b09yZ2FuZShvcmdhbmVKc29uKVxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQub3JnYW5lVG9Kc29uKG9yZ2FuZUNsZWFuKVxuXG4gICAgICAgIGNvbnN0IG9yZ2FuZUNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4ub3JnYW5lU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKG9yZ2FuZUNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG9yZ2FuZUNsZWFuRmlsZVBhdGgsIG9yZ2FuZUNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2goZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcImFjdGV1cnNcIiwgXCJvcmdhbmVzXCJdKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFnZW5kYXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvb3NlbkRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCByZXVuaW9uU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVuYW1lID0gcmV1bmlvblNwbGl0UGF0aFtyZXVuaW9uU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghcmV1bmlvbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldW5pb25SYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5yZXVuaW9uU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtyZXVuaW9uUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXVuaW9uUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHJldW5pb25SYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgcmV1bmlvbiA9IEpTT04ucGFyc2UocmV1bmlvblJhd0pzb24pXG4gICAgICAgIGNsZWFuUmV1bmlvbihyZXVuaW9uKVxuICAgICAgICBjb25zdCByZXVuaW9uSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmV1bmlvbiwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgcmV1bmlvbkNsZWFuOiBSZXVuaW9uID0gQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25Kc29uKVxuICAgICAgICBjb25zdCByZXVuaW9uQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFnZW5kYXNDb252ZXJ0LnJldW5pb25Ub0pzb24ocmV1bmlvbkNsZWFuKVxuXG4gICAgICAgIGNvbnN0IHJldW5pb25DbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLnJldW5pb25TcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUocmV1bmlvbkNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJldW5pb25DbGVhbkZpbGVQYXRoLCByZXVuaW9uQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9vc2VuRGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEZpbGVuYW1lID1cbiAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoW2FtZW5kZW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhbWVuZGVtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudFJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHthbWVuZGVtZW50UmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50UmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgIGFtZW5kZW1lbnRSYXdGaWxlUGF0aCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50ID0gSlNPTi5wYXJzZShhbWVuZGVtZW50UmF3SnNvbilcbiAgICAgICAgY2xlYW5BbWVuZGVtZW50KGFtZW5kZW1lbnQpXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhbWVuZGVtZW50LCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBhbWVuZGVtZW50Q2xlYW46IEFtZW5kZW1lbnQgPVxuICAgICAgICAgIEFtZW5kZW1lbnRzQ29udmVydC50b0FtZW5kZW1lbnQoYW1lbmRlbWVudEpzb24pXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LmFtZW5kZW1lbnRUb0pzb24oYW1lbmRlbWVudENsZWFuKVxuXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmFtZW5kZW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoYW1lbmRlbWVudENsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoLCBhbWVuZGVtZW50Q2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob29zZW5EYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgZG9jdW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJkb2N1bWVudHNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50RmlsZW5hbWUgPSBkb2N1bWVudFNwbGl0UGF0aFtkb2N1bWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWRvY3VtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRSYXdGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICAgIC4uLmRvY3VtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2RvY3VtZW50UmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudFJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhkb2N1bWVudFJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkb2N1bWVudCA9IEpTT04ucGFyc2UoZG9jdW1lbnRSYXdKc29uKVxuICAgICAgICBjbGVhbkRvY3VtZW50T3JEaXZpc2lvbihkb2N1bWVudClcbiAgICAgICAgY29uc3QgZG9jdW1lbnRKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkb2N1bWVudCwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgZG9jdW1lbnRDbGVhbjogRG9jdW1lbnQgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9jdW1lbnQoZG9jdW1lbnRKc29uKVxuICAgICAgICBjb25zdCBkb2N1bWVudENsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC5kb2N1bWVudFRvSnNvbihkb2N1bWVudENsZWFuKVxuXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Q2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShkb2N1bWVudENsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRvY3VtZW50Q2xlYW5GaWxlUGF0aCwgZG9jdW1lbnRDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZG9zc2llclNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcImRvc3NpZXJzXCJdKSkge1xuICAgICAgICBjb25zdCBkb3NzaWVyRmlsZW5hbWUgPSBkb3NzaWVyU3BsaXRQYXRoW2Rvc3NpZXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFkb3NzaWVyRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9zc2llclJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmRvc3NpZXJTcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2Rvc3NpZXJSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9zc2llclJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkb3NzaWVyID0gSlNPTi5wYXJzZShkb3NzaWVyUmF3SnNvbilcbiAgICAgICAgY2xlYW5Eb3NzaWVyUGFybGVtZW50YWlyZShkb3NzaWVyKVxuICAgICAgICBjb25zdCBkb3NzaWVySnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZG9zc2llciwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgZG9zc2llckNsZWFuOiBEb3NzaWVyUGFybGVtZW50YWlyZSA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShkb3NzaWVySnNvbilcbiAgICAgICAgY29uc3QgZG9zc2llckNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC5kb3NzaWVyUGFybGVtZW50YWlyZVRvSnNvbihkb3NzaWVyQ2xlYW4pXG5cbiAgICAgICAgY29uc3QgZG9zc2llckNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uZG9zc2llclNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShkb3NzaWVyQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZG9zc2llckNsZWFuRmlsZVBhdGgsIGRvc3NpZXJDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiZG9jdW1lbnRzXCIsIFwiZG9zc2llcnNcIl0pXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9vc2VuRGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBzY3J1dGluU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID0gc2NydXRpblNwbGl0UGF0aFtzY3J1dGluU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghc2NydXRpbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcnV0aW5SYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5zY3J1dGluU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtzY3J1dGluUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNjcnV0aW5SYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgc2NydXRpbiA9IEpTT04ucGFyc2Uoc2NydXRpblJhd0pzb24pXG4gICAgICAgIGNsZWFuU2NydXRpbihzY3J1dGluKVxuICAgICAgICBjb25zdCBzY3J1dGluSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoc2NydXRpbiwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuOiBTY3J1dGluID0gU2NydXRpbnNDb252ZXJ0LnRvU2NydXRpbihzY3J1dGluSnNvbilcbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBTY3J1dGluc0NvbnZlcnQuc2NydXRpblRvSnNvbihzY3J1dGluQ2xlYW4pXG5cbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uc2NydXRpblNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShzY3J1dGluQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2NydXRpbkNsZWFuRmlsZVBhdGgsIHNjcnV0aW5DbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCIuXCJdKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXN0b3JlIHN0YW5kYXJkIGNvbnZlcnNpb24gb2YgZGF0ZXMgdG8gSlNPTi5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZXhpc3RpbmdEYXRlVG9Kc29uXG5cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWU6IHN0cmluZywgb3B0aW9uczogYW55KTogYW55IHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgY29uc29sZS5sb2coYENsZWFuaW5nIGRpcmVjdG9yeTogJHtkYXRhc2V0Q2xlYW5EaXJ94oCmYClcbiAgfVxuICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRDbGVhbkRpcilcbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpKSB7XG4gICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgcGF0aG5hbWUgPSBwYXRoLmpvaW4oZGF0YXNldENsZWFuRGlyLCBmaWxlbmFtZSlcbiAgICBmcy5yZW1vdmVTeW5jKHBhdGhuYW1lKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2goXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgb3B0aW9uczogYW55LFxuICByZW1vdGVzPzogc3RyaW5nW10sXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgZ2l0LmNvbW1pdChyZXBvc2l0b3J5RGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIilcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiByZW1vdGVzIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IHB1c2ggJHtyZW1vdGV9IG1hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIC8vIERvbid0IHN0b3Agd2hlbiBwdXNoIGZhaWxzLlxuICAgICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaFVpZChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgZ2l0LnVpZEJyYW5jaFVwZGF0ZShcbiAgICAgIHJlcG9zaXRvcnlEaXIsXG4gICAgICBzdWJkaXJlY3RvcmllcyxcbiAgICAgIG9wdGlvbnNbXCJuby1yZXNldC1hZnRlci1jb21taXRcIl0sXG4gICAgKVxuICAgIGZvciAoY29uc3QgcmVtb3RlIG9mIG9wdGlvbnMucmVtb3RlIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBnaXQucnVuKHJlcG9zaXRvcnlEaXIsIGBwdXNoIC0tcXVpZXQgJHtyZW1vdGV9IHVpZDp1aWRgKVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gbWFpbihhcmd2OiBhbnkpOiBudW1iZXIge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGFyZ3YpXG4gIGlmIChjbGVhblJlb3JnYW5pemVkRGF0YShvcHRpb25zKSkge1xuICAgIHJldHVybiAxXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDBcbiAgfVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChwcm9jZXNzLmFyZ3ZbMV0uZW5kc1dpdGgoXCJjbGVhbl9yZW9yZ2FuaXplZF9kYXRhLnRzXCIpKVxuICBwcm9jZXNzLmV4aXQobWFpbihwcm9jZXNzLmFyZ3YpKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBS0E7QUFBdUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUV2RSxTQUFTQSxTQUFTLENBQUNDLElBQWMsRUFBTztFQUN0QyxJQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtJQUNFQyxLQUFLLEVBQUUsR0FBRztJQUNWQyxJQUFJLEVBQUUsK0RBQStEO0lBQ3JFQyxJQUFJLEVBQUUsT0FBTztJQUNiQyxJQUFJLEVBQUVDO0VBQ1IsQ0FBQyxFQUNEO0lBQ0VKLEtBQUssRUFBRSxHQUFHO0lBQ1ZDLElBQUksRUFBRSxvQkFBb0I7SUFDMUJDLElBQUksRUFBRSxRQUFRO0lBQ2RDLElBQUksRUFBRUU7RUFDUixDQUFDLEVBQ0Q7SUFDRUwsS0FBSyxFQUFFLEdBQUc7SUFDVkMsSUFBSSxFQUFFLDhCQUE4QjtJQUNwQ0MsSUFBSSxFQUFFLFNBQVM7SUFDZkMsSUFBSSxFQUFFQztFQUNSLENBQUMsRUFDRDtJQUNFSixLQUFLLEVBQUUsR0FBRztJQUNWTSxZQUFZLEVBQUUsQ0FBQyxL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