oxygen-cli 1.37.8 → 1.38.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.
@@ -29,6 +29,8 @@ var _reporterPdf = _interopRequireDefault(require("../ox_reporters/reporter-pdf"
29
29
 
30
30
  var _reporterXml = _interopRequireDefault(require("../ox_reporters/reporter-xml"));
31
31
 
32
+ var _reporterRp = _interopRequireDefault(require("../ox_reporters/reporter-rp"));
33
+
32
34
  var _helper = _interopRequireDefault(require("../errors/helper"));
33
35
 
34
36
  var _status = _interopRequireDefault(require("../model/status"));
@@ -41,7 +43,8 @@ const Reporters = {
41
43
  html: _reporterHtml.default,
42
44
  excel: _reporterExcel.default,
43
45
  pdf: _reporterPdf.default,
44
- xml: _reporterXml.default
46
+ xml: _reporterXml.default,
47
+ rp: _reporterRp.default
45
48
  };
46
49
  const DEFAULT_TEST_NAME = 'Oxygen Test';
47
50
  const DEFAULT_REPORTERS = [];
@@ -81,10 +84,20 @@ class ReportAggregator extends _events.EventEmitter {
81
84
  }
82
85
 
83
86
  const reporterName = typeof reporter === 'string' ? reporter : reporter.name;
84
- const reporterOpts = typeof reporter === 'object' ? reporter : generalReportingOpts;
87
+ const reporterOpts = typeof reporter === 'object' ? reporter : undefined;
85
88
 
86
89
  if (Object.prototype.hasOwnProperty.call(Reporters, reporterName)) {
87
- this.reporters.push(new Reporters[reporterName](this.options, reporterOpts));
90
+ if (reporterOpts && typeof reporterOpts.enabled === 'boolean' && !reporterOpts.enabled) {
91
+ continue;
92
+ }
93
+
94
+ const reporter = new Reporters[reporterName](this.options, reporterOpts, this);
95
+
96
+ if (reporter.init) {
97
+ reporter.init().then(() => this.reporters.push(reporter)).catch(err => console.log(`Failed to initialize "${reporterName}" reporter: ${err.message}`));
98
+ } else {
99
+ this.reporters.push(reporter);
100
+ }
88
101
  }
89
102
  }
90
103
  }
@@ -93,7 +106,7 @@ class ReportAggregator extends _events.EventEmitter {
93
106
  return this.results;
94
107
  }
95
108
 
96
- generateReports() {
109
+ async generateReports() {
97
110
  if (!Array.isArray(this.reporters) || this.reporters.length == 0) {
98
111
  return false;
99
112
  }
@@ -101,8 +114,15 @@ class ReportAggregator extends _events.EventEmitter {
101
114
  const groupedResults = this.groupResults();
102
115
 
103
116
  for (let reporter of this.reporters) {
104
- const reportPath = reporter.generate(groupedResults);
105
- console.log(`Your report is ready: ${reportPath}`);
117
+ try {
118
+ const reportPath = await reporter.generate(groupedResults);
119
+
120
+ if (reportPath) {
121
+ console.log(`Your report is ready: ${reportPath}`);
122
+ }
123
+ } catch (e) {
124
+ console.error(`Report generation failed: ${e.message}`);
125
+ }
106
126
  }
107
127
 
108
128
  return true;
@@ -122,7 +142,7 @@ class ReportAggregator extends _events.EventEmitter {
122
142
  }
123
143
  }
124
144
 
125
- onRunnerStart(rid, opts, caps) {
145
+ async onRunnerStart(rid, opts, caps) {
126
146
  if (!rid) {
127
147
  throw new Error('"rid" cannot be empty.');
128
148
  }
@@ -137,14 +157,16 @@ class ReportAggregator extends _events.EventEmitter {
137
157
  this.results.push(testResult);
138
158
  this.runnerEndPromises[rid] = (0, _when.defer)();
139
159
  console.log(`Test ${rid} has started...`);
140
- this.emit('runner:start', {
160
+ const eventArgs = {
141
161
  rid,
142
162
  opts,
143
163
  caps
144
- });
164
+ };
165
+ this.emit('runner:start', eventArgs);
166
+ await this._invokeReportersHook('onRunnerStart', eventArgs);
145
167
  }
146
168
 
147
- onRunnerEnd(rid, finalResult, fatalError) {
169
+ async onRunnerEnd(rid, finalResult, fatalError) {
148
170
  const testResult = this.results.find(x => x.rid === rid);
149
171
 
150
172
  if (testResult) {
@@ -177,10 +199,12 @@ class ReportAggregator extends _events.EventEmitter {
177
199
  console.log(`Test ${rid} has finished with status: ${testResult.status.toUpperCase()}.`);
178
200
  }
179
201
 
180
- this.emit('runner:end', {
202
+ const eventArgs = {
181
203
  rid,
182
204
  result: testResult
183
- });
205
+ };
206
+ this.emit('runner:end', eventArgs);
207
+ await this._invokeReportersHook('onRunnerEnd', eventArgs);
184
208
 
185
209
  if (this.runnerEndPromises[rid]) {
186
210
  process.nextTick(() => {
@@ -215,32 +239,36 @@ class ReportAggregator extends _events.EventEmitter {
215
239
  return _status.default.PASSED;
216
240
  }
217
241
 
218
- onIterationStart(rid, iteration, start) {
242
+ async onIterationStart(rid, iteration, start) {
219
243
  if (iteration) {
220
244
  const msg = `${start} Iteration #${iteration} started...`;
221
245
  console.log(msg);
222
- this.onLogEntry(null, 'INFO', msg, 'user');
246
+ await this.onLogEntry(null, 'INFO', msg, 'user');
223
247
  }
224
248
  }
225
249
 
226
- onIterationEnd(rid, result, start) {
227
- if (result && result.iterationNum && result.status && result.status.toUpperCase) {
250
+ async onIterationEnd(rid, result, start) {
251
+ var _result$status;
252
+
253
+ if (result !== null && result !== void 0 && result.iterationNum && (_result$status = result.status) !== null && _result$status !== void 0 && _result$status.toUpperCase) {
228
254
  const msg = `${start} Iteration #${result.iterationNum} ended with status: ${result.status.toUpperCase()}.`;
229
255
  console.log(msg);
230
- this.onLogEntry(null, 'INFO', msg, 'user');
256
+ await this.onLogEntry(null, 'INFO', msg, 'user');
231
257
  }
232
258
  }
233
259
 
234
- onSuiteStart(rid, suiteId, suite) {
260
+ async onSuiteStart(rid, suiteId, suite) {
235
261
  console.log(`Suite "${suite.name}" has started...`);
236
- this.emit('suite:start', {
262
+ let eventArgs = {
237
263
  rid,
238
264
  suiteId: suiteId,
239
265
  suite: suite
240
- });
266
+ };
267
+ this.emit('suite:start', eventArgs);
268
+ await this._invokeReportersHook('onSuiteStart', eventArgs);
241
269
  }
242
270
 
243
- onSuiteEnd(rid, suiteId, suiteResult) {
271
+ async onSuiteEnd(rid, suiteId, suiteResult) {
244
272
  const testResult = this.results.find(x => x.rid === rid);
245
273
 
246
274
  if (!testResult) {
@@ -249,66 +277,89 @@ class ReportAggregator extends _events.EventEmitter {
249
277
 
250
278
  testResult.suites.push(suiteResult);
251
279
  console.log(`Suite "${suiteResult.name}" has ended with status: ${suiteResult.status.toUpperCase()}.`);
252
- this.emit('suite:end', {
280
+ const eventArgs = {
253
281
  rid,
254
282
  suiteId,
255
283
  result: suiteResult
256
- });
284
+ };
285
+ this.emit('suite:end', eventArgs);
286
+ await this._invokeReportersHook('onSuiteEnd', eventArgs);
257
287
  }
258
288
 
259
- onCaseStart(rid, suiteId, caseId, caseDef) {
289
+ async onCaseStart(rid, suiteId, caseId, caseDef) {
260
290
  console.log(`- Case "${caseDef.name}" has started...`);
261
- this.emit('case:start', {
291
+ const eventArgs = {
262
292
  rid,
263
293
  suiteId,
264
294
  caseId,
265
295
  case: caseDef
266
- });
296
+ };
297
+ this.emit('case:start', eventArgs);
298
+ await this._invokeReportersHook('onCaseStart', eventArgs);
267
299
  }
268
300
 
269
301
  async onCaseEnd(rid, suiteId, caseId, caseResult) {
270
302
  console.log(`- Case "${caseResult.name}" has ended with status: ${caseResult.status.toUpperCase()}.`);
271
303
  await this._saveTestCaseVideoAttachment(caseResult);
272
- this.emit('case:end', {
304
+ const eventArgs = {
273
305
  rid,
274
306
  suiteId,
275
307
  caseId,
276
308
  result: caseResult
277
- });
309
+ };
310
+ this.emit('case:end', eventArgs);
311
+ await this._invokeReportersHook('onCaseEnd', eventArgs);
278
312
  }
279
313
 
280
- onStepStart(rid, step) {
281
- console.log(` - Step "${step.name}" has started...`);
282
-
314
+ async onStepStart(rid, suiteId, caseId, step) {
283
315
  if (this.options && this.options.rootPath && this.options.framework && this.options.framework === 'cucumber') {
284
316
  const fullPath = _path.default.resolve(this.options.rootPath, step.location);
285
317
 
286
318
  step.location = fullPath + ':1';
287
319
  }
288
320
 
289
- this.emit('step:start', {
321
+ const eventArgs = {
290
322
  rid,
323
+ suiteId,
324
+ caseId,
291
325
  step: step
292
- });
326
+ };
327
+ this.emit('step:start', eventArgs);
328
+ await this._invokeReportersHook('onStepStart', eventArgs);
293
329
  }
294
330
 
295
- onStepEnd(rid, stepResult) {
296
- const status = stepResult.status.toUpperCase();
297
- const duration = stepResult.duration ? (stepResult.duration / 1000).toFixed(2) : 0;
298
- console.log(` - Step "${stepResult.name}" has ended in ${duration}s with status: ${status}.`);
299
- this.emit('step:end', {
331
+ async onStepEnd(rid, suiteId, caseId, stepResult) {
332
+ const eventArgs = {
300
333
  rid,
334
+ suiteId,
335
+ caseId,
301
336
  step: stepResult
302
- });
337
+ };
338
+ this.emit('step:end', eventArgs);
339
+ await this._invokeReportersHook('onStepEnd', eventArgs);
303
340
  }
304
341
 
305
- onLogEntry(time, level, msg, src = null) {
306
- this.emit('log', {
342
+ async onLogEntry(time, level, msg, src = null, {
343
+ suiteId,
344
+ caseId,
345
+ stepId
346
+ } = {}) {
347
+ const eventArgs = {
348
+ suiteId,
349
+ caseId,
350
+ stepId,
307
351
  level,
308
352
  msg,
309
353
  time,
310
354
  src
311
- });
355
+ };
356
+ this.emit('log', eventArgs);
357
+
358
+ if (!time) {
359
+ eventArgs.time = Date.now();
360
+ }
361
+
362
+ await this._invokeReportersHook('onLog', eventArgs);
312
363
  }
313
364
 
314
365
  _getFirstFailure(testResult) {
@@ -467,6 +518,22 @@ class ReportAggregator extends _events.EventEmitter {
467
518
  });
468
519
  }
469
520
 
521
+ async _invokeReportersHook(hookName, eventArgs) {
522
+ if (!Array.isArray(this.reporters) || this.reporters.length == 0) {
523
+ return false;
524
+ }
525
+
526
+ for (let reporter of this.reporters) {
527
+ if (reporter[hookName]) {
528
+ try {
529
+ await reporter[hookName](eventArgs);
530
+ } catch (e) {
531
+ console.warn(`Failed to invoke reporter hook "${hookName}": ${e.message}`);
532
+ }
533
+ }
534
+ }
535
+ }
536
+
470
537
  async _saveTestCaseVideoAttachment(caseResult) {
471
538
  if (!caseResult || !caseResult.attachments || !caseResult.attachments.length) {
472
539
  return;
@@ -508,4 +575,4 @@ class ReportAggregator extends _events.EventEmitter {
508
575
  }
509
576
 
510
577
  exports.default = ReportAggregator;
511
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRBZ2dyZWdhdG9yLmpzIl0sIm5hbWVzIjpbIlJlcG9ydGVycyIsImpzb24iLCJKc29uUmVwb3J0ZXIiLCJqdW5pdCIsIkpVbml0UmVwb3J0ZXIiLCJodG1sIiwiSHRtbFJlcG9ydGVyIiwiZXhjZWwiLCJFeGNlbFJlcG9ydGVyIiwicGRmIiwiUGRmUmVwb3J0ZXIiLCJ4bWwiLCJYbWxSZXBvcnRlciIsIkRFRkFVTFRfVEVTVF9OQU1FIiwiREVGQVVMVF9SRVBPUlRFUlMiLCJSZXBvcnRBZ2dyZWdhdG9yIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVzdWx0cyIsInJ1bm5lckVuZFByb21pc2VzIiwiaW5zdGFudGlhdGVSZXBvcnRlcnMiLCJnZXRFeGl0Q29kZSIsImV4aXRDb2RlIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwidGVzdEZhaWxkZWQiLCJmaW5kIiwiaXRlbSIsInN0YXR1cyIsInJlcG9ydGVycyIsImdlbmVyYWxSZXBvcnRpbmdPcHRzIiwicmVwb3J0aW5nIiwicmVwb3J0ZXIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJyZXBvcnRlck5hbWUiLCJuYW1lIiwicmVwb3J0ZXJPcHRzIiwicHVzaCIsImdldFJlc3VsdHMiLCJnZW5lcmF0ZVJlcG9ydHMiLCJncm91cGVkUmVzdWx0cyIsImdyb3VwUmVzdWx0cyIsInJlcG9ydFBhdGgiLCJnZW5lcmF0ZSIsImNvbnNvbGUiLCJsb2ciLCJ3YWl0Rm9yUmVzdWx0IiwicmlkIiwid2FpdEZvclJlc3VsdHMiLCJQcm9taXNlIiwiYWxsIiwib25SdW5uZXJTdGFydCIsIm9wdHMiLCJjYXBzIiwiRXJyb3IiLCJ0ZXN0UmVzdWx0IiwiVGVzdFJlc3VsdCIsInN0YXJ0VGltZSIsIm94dXRpbCIsImdldFRpbWVTdGFtcCIsImNhcGFiaWxpdGllcyIsImVudmlyb25tZW50IiwiZW52VmFycyIsImVtaXQiLCJvblJ1bm5lckVuZCIsImZpbmFsUmVzdWx0IiwiZmF0YWxFcnJvciIsIngiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJfZGV0ZXJtaW5lVGVzdFN0YXR1c0J5U3VpdGVzIiwiU3RhdHVzIiwiRkFJTEVEIiwiZmFpbHVyZSIsImVycm9ySGVscGVyIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIl9nZXRGaXJzdEZhaWx1cmUiLCJ0eXBlIiwibG9jYXRpb24iLCJ0b1VwcGVyQ2FzZSIsInJlc3VsdCIsInByb2Nlc3MiLCJuZXh0VGljayIsInJlc29sdmUiLCJoYXNGYWlsZWRTdWl0ZXMiLCJzdWl0ZXMiLCJzb21lIiwiaGFzV2FybmluZ1N1aXRlcyIsIldBUk5JTkciLCJhbGxTdWl0ZXNTa2lwcGVkIiwiZXZlcnkiLCJTS0lQUEVEIiwiUEFTU0VEIiwib25JdGVyYXRpb25TdGFydCIsIml0ZXJhdGlvbiIsInN0YXJ0IiwibXNnIiwib25Mb2dFbnRyeSIsIm9uSXRlcmF0aW9uRW5kIiwiaXRlcmF0aW9uTnVtIiwib25TdWl0ZVN0YXJ0Iiwic3VpdGVJZCIsInN1aXRlIiwib25TdWl0ZUVuZCIsInN1aXRlUmVzdWx0Iiwib25DYXNlU3RhcnQiLCJjYXNlSWQiLCJjYXNlRGVmIiwiY2FzZSIsIm9uQ2FzZUVuZCIsImNhc2VSZXN1bHQiLCJfc2F2ZVRlc3RDYXNlVmlkZW9BdHRhY2htZW50Iiwib25TdGVwU3RhcnQiLCJzdGVwIiwicm9vdFBhdGgiLCJmcmFtZXdvcmsiLCJmdWxsUGF0aCIsInBhdGgiLCJvblN0ZXBFbmQiLCJzdGVwUmVzdWx0IiwidG9GaXhlZCIsInRpbWUiLCJsZXZlbCIsInNyYyIsImNhc2VzIiwic3RlcHMiLCJ1bmdyb3VwZWRSZXN1bHRzIiwiX2dyb3VwUmVzdWx0IiwicmVzdWx0S2V5Iiwic3VpdGVLZXkiLCJncm91cGVkUmVzdWx0IiwiTWF0aCIsIm1pbiIsIm1heCIsImN1cnJlbnRTdWl0ZVJlc3VsdCIsImdyb3VwS2V5IiwiZ3JvdXBlZFN1aXRlUmVzdWx0IiwiX3N1aXRlc0hhc2giLCJjIiwiZ3JvdXBlZFJlc3VsdHNMaXN0Iiwia2V5cyIsIm1hcCIsInN1aXRlR3JvdXBLZXkiLCJmaXJzdEZhaWxlZFN1aXRlIiwicyIsImZpcnN0U3VpdGVXaXRoV2FybmluZyIsInJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzIiwidmFsaWRhdGVSZXN1bHQiLCJmYWlsZWQiLCJ1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMiLCJpbmNsdWRlcyIsIndhcm4iLCJhdHRhY2htZW50cyIsImF0dGFjaG1lbnRzVG9SZW1vdmUiLCJpIiwiYXR0YWNobWVudCIsIl91cmwiLCJ2aWRlb0ZpbGVQYXRoIiwiZG93bmxvYWRWaWRlbyIsImZpbGVOYW1lIiwiZmlsZVBhdGgiLCJlIiwibWVzc2FnZSIsImVsbUluZGV4VG9SZW1vdmUiLCJpbmRleE9mIiwic3BsaWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFNBQVMsR0FBRztBQUNkQyxFQUFBQSxJQUFJLEVBQUVDLHFCQURRO0FBRWRDLEVBQUFBLEtBQUssRUFBRUMsc0JBRk87QUFHZEMsRUFBQUEsSUFBSSxFQUFFQyxxQkFIUTtBQUlkQyxFQUFBQSxLQUFLLEVBQUVDLHNCQUpPO0FBS2RDLEVBQUFBLEdBQUcsRUFBRUMsb0JBTFM7QUFNZEMsRUFBQUEsR0FBRyxFQUFFQztBQU5TLENBQWxCO0FBU0EsTUFBTUMsaUJBQWlCLEdBQUcsYUFBMUI7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxFQUExQjs7QUFFZSxNQUFNQyxnQkFBTixTQUErQkMsb0JBQS9CLENBQTRDO0FBQ3ZEQyxFQUFBQSxXQUFXLENBQUNDLE9BQUQsRUFBVTtBQUNqQjtBQUVBLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBRUEsU0FBS0MsaUJBQUwsR0FBeUIsRUFBekI7QUFDQSxTQUFLRixPQUFMLEdBQWVBLE9BQWY7QUFDQSxTQUFLRyxvQkFBTDtBQUNIOztBQUVEQyxFQUFBQSxXQUFXLEdBQUc7QUFDVixRQUFJQyxRQUFRLEdBQUcsQ0FBZjs7QUFFQSxRQUNJLEtBQUtKLE9BQUwsSUFDQUssS0FBSyxDQUFDQyxPQUFOLENBQWMsS0FBS04sT0FBbkIsQ0FEQSxJQUVBLEtBQUtBLE9BQUwsQ0FBYU8sTUFBYixHQUFzQixDQUgxQixFQUlFO0FBQ0UsWUFBTUMsV0FBVyxHQUFHLEtBQUtSLE9BQUwsQ0FBYVMsSUFBYixDQUFtQkMsSUFBRCxJQUFVQSxJQUFJLENBQUNDLE1BQUwsS0FBZ0IsUUFBNUMsQ0FBcEI7O0FBRUEsVUFBSUgsV0FBSixFQUFpQjtBQUNiSixRQUFBQSxRQUFRLEdBQUcsQ0FBQyxDQUFaO0FBQ0g7QUFDSixLQVZELE1BVU87QUFFSEEsTUFBQUEsUUFBUSxHQUFHLENBQUMsQ0FBWjtBQUNIOztBQUVELFdBQU9BLFFBQVA7QUFDSDs7QUFFREYsRUFBQUEsb0JBQW9CLEdBQUc7QUFDbkIsU0FBS1UsU0FBTCxHQUFpQixFQUFqQjtBQUNBLFVBQU1DLG9CQUFvQixHQUFHLEtBQUtkLE9BQUwsQ0FBYWUsU0FBYixJQUEwQixFQUF2RDs7QUFDQSxTQUFLLElBQUlDLFFBQVQsSUFBcUJGLG9CQUFvQixDQUFDRCxTQUFyQixJQUFrQ2pCLGlCQUF2RCxFQUEwRTtBQUN0RSxVQUFJLE9BQU9vQixRQUFQLEtBQW9CLFFBQXBCLElBQWdDLENBQUNDLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDSixRQUFyQyxFQUErQyxNQUEvQyxDQUFyQyxFQUE2RjtBQUV6RjtBQUNIOztBQUVELFlBQU1LLFlBQVksR0FBRyxPQUFPTCxRQUFQLEtBQW9CLFFBQXBCLEdBQStCQSxRQUEvQixHQUEwQ0EsUUFBUSxDQUFDTSxJQUF4RTtBQUNBLFlBQU1DLFlBQVksR0FBRyxPQUFPUCxRQUFQLEtBQW9CLFFBQXBCLEdBQStCQSxRQUEvQixHQUEwQ0Ysb0JBQS9EOztBQUVBLFVBQUlHLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDdEMsU0FBckMsRUFBZ0R1QyxZQUFoRCxDQUFKLEVBQW1FO0FBQy9ELGFBQUtSLFNBQUwsQ0FBZVcsSUFBZixDQUFvQixJQUFJMUMsU0FBUyxDQUFDdUMsWUFBRCxDQUFiLENBQTRCLEtBQUtyQixPQUFqQyxFQUEwQ3VCLFlBQTFDLENBQXBCO0FBQ0g7QUFDSjtBQUNKOztBQUVERSxFQUFBQSxVQUFVLEdBQUc7QUFDVCxXQUFPLEtBQUt4QixPQUFaO0FBQ0g7O0FBRUR5QixFQUFBQSxlQUFlLEdBQUc7QUFDZCxRQUFJLENBQUNwQixLQUFLLENBQUNDLE9BQU4sQ0FBYyxLQUFLTSxTQUFuQixDQUFELElBQWtDLEtBQUtBLFNBQUwsQ0FBZUwsTUFBZixJQUF5QixDQUEvRCxFQUFrRTtBQUM5RCxhQUFPLEtBQVA7QUFDSDs7QUFDRCxVQUFNbUIsY0FBYyxHQUFHLEtBQUtDLFlBQUwsRUFBdkI7O0FBQ0EsU0FBSyxJQUFJWixRQUFULElBQXFCLEtBQUtILFNBQTFCLEVBQXFDO0FBQ2pDLFlBQU1nQixVQUFVLEdBQUdiLFFBQVEsQ0FBQ2MsUUFBVCxDQUFrQkgsY0FBbEIsQ0FBbkI7QUFDQUksTUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEseUJBQXdCSCxVQUFXLEVBQWhEO0FBQ0g7O0FBQ0QsV0FBTyxJQUFQO0FBQ0g7O0FBRWtCLFFBQWJJLGFBQWEsQ0FBQ0MsR0FBRCxFQUFNO0FBQ3JCLFFBQUksQ0FBQ0EsR0FBRCxJQUFRLENBQUMsS0FBS2hDLGlCQUFMLENBQXVCZ0MsR0FBdkIsQ0FBYixFQUEwQztBQUN0QyxhQUFPLElBQVA7QUFDSDs7QUFDRCxXQUFPLEtBQUtoQyxpQkFBTCxDQUF1QmdDLEdBQXZCLENBQVA7QUFDSDs7QUFFbUIsUUFBZEMsY0FBYyxHQUFHO0FBQ25CLFFBQUksS0FBS2pDLGlCQUFMLElBQTBCLEtBQUtBLGlCQUFMLENBQXVCTSxNQUFyRCxFQUE2RDtBQUN6RCxhQUFPNEIsT0FBTyxDQUFDQyxHQUFSLENBQVksS0FBS25DLGlCQUFqQixDQUFQO0FBQ0g7QUFDSjs7QUFFRG9DLEVBQUFBLGFBQWEsQ0FBQ0osR0FBRCxFQUFNSyxJQUFOLEVBQVlDLElBQVosRUFBa0I7QUFDM0IsUUFBSSxDQUFDTixHQUFMLEVBQVU7QUFDTixZQUFNLElBQUlPLEtBQUosQ0FBVSx3QkFBVixDQUFOO0FBQ0g7O0FBQ0QsVUFBTUMsVUFBVSxHQUFHLElBQUlDLG1CQUFKLEVBQW5CO0FBQ0FELElBQUFBLFVBQVUsQ0FBQ1IsR0FBWCxHQUFpQkEsR0FBakI7QUFDQVEsSUFBQUEsVUFBVSxDQUFDcEIsSUFBWCxHQUFrQmlCLElBQUksQ0FBQ2pCLElBQUwsSUFBYTNCLGlCQUEvQjtBQUNBK0MsSUFBQUEsVUFBVSxDQUFDRSxTQUFYLEdBQXVCQyxjQUFPQyxZQUFQLEVBQXZCO0FBQ0FKLElBQUFBLFVBQVUsQ0FBQ0ssWUFBWCxHQUEwQlAsSUFBMUI7QUFDQUUsSUFBQUEsVUFBVSxDQUFDTSxXQUFYLEdBQXlCVCxJQUFJLENBQUNVLE9BQUwsSUFBZ0IsRUFBekM7QUFDQVAsSUFBQUEsVUFBVSxDQUFDMUMsT0FBWCxHQUFxQnVDLElBQXJCO0FBQ0EsU0FBS3RDLE9BQUwsQ0FBYXVCLElBQWIsQ0FBa0JrQixVQUFsQjtBQUVBLFNBQUt4QyxpQkFBTCxDQUF1QmdDLEdBQXZCLElBQThCLGtCQUE5QjtBQUNBSCxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxRQUFPRSxHQUFJLGlCQUF4QjtBQUNBLFNBQUtnQixJQUFMLENBQVUsY0FBVixFQUEwQjtBQUN0QmhCLE1BQUFBLEdBRHNCO0FBRXRCSyxNQUFBQSxJQUZzQjtBQUd0QkMsTUFBQUE7QUFIc0IsS0FBMUI7QUFLSDs7QUFFRFcsRUFBQUEsV0FBVyxDQUFDakIsR0FBRCxFQUFNa0IsV0FBTixFQUFtQkMsVUFBbkIsRUFBK0I7QUFDdEMsVUFBTVgsVUFBVSxHQUFHLEtBQUt6QyxPQUFMLENBQWFTLElBQWIsQ0FBa0I0QyxDQUFDLElBQUlBLENBQUMsQ0FBQ3BCLEdBQUYsS0FBVUEsR0FBakMsQ0FBbkI7O0FBQ0EsUUFBSVEsVUFBSixFQUFnQjtBQUNaQSxNQUFBQSxVQUFVLENBQUNhLE9BQVgsR0FBcUJWLGNBQU9DLFlBQVAsRUFBckI7QUFDQUosTUFBQUEsVUFBVSxDQUFDYyxRQUFYLEdBQXNCZCxVQUFVLENBQUNhLE9BQVgsR0FBcUJiLFVBQVUsQ0FBQ0UsU0FBdEQ7QUFFQUYsTUFBQUEsVUFBVSxDQUFDOUIsTUFBWCxHQUFvQixLQUFLNkMsNEJBQUwsQ0FBa0NmLFVBQWxDLEVBQThDVyxVQUE5QyxDQUFwQjs7QUFFQSxVQUFJWCxVQUFVLENBQUM5QixNQUFYLEtBQXNCOEMsZ0JBQU9DLE1BQWpDLEVBQXlDO0FBQ3JDLFlBQUlOLFVBQUosRUFBZ0I7QUFFWlgsVUFBQUEsVUFBVSxDQUFDa0IsT0FBWCxHQUFxQlAsVUFBVSxZQUFZWixLQUF0QixHQUE4Qm9CLGdCQUFZQyxtQkFBWixDQUFnQ1QsVUFBaEMsQ0FBOUIsR0FBNEVBLFVBQWpHO0FBQ0gsU0FIRCxNQUlLO0FBQ0RYLFVBQUFBLFVBQVUsQ0FBQ2tCLE9BQVgsR0FBcUIsS0FBS0csZ0JBQUwsQ0FBc0JyQixVQUF0QixDQUFyQjtBQUNIO0FBQ0o7O0FBQ0QsVUFBSVUsV0FBVyxJQUFJQSxXQUFXLENBQUNMLFlBQS9CLEVBQTZDO0FBQ3pDTCxRQUFBQSxVQUFVLENBQUNLLFlBQVgsR0FBMEJLLFdBQVcsQ0FBQ0wsWUFBdEM7QUFDSDs7QUFDRCxVQUFJTCxVQUFVLENBQUNrQixPQUFmLEVBQXdCO0FBQ3BCLFlBQUlsQixVQUFVLENBQUNrQixPQUFYLENBQW1CSSxJQUFuQixJQUEyQnRCLFVBQVUsQ0FBQ2tCLE9BQVgsQ0FBbUJLLFFBQWxELEVBQTREO0FBQ3hEbEMsVUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsVUFBU1UsVUFBVSxDQUFDa0IsT0FBWCxDQUFtQkksSUFBSyxPQUFNdEIsVUFBVSxDQUFDa0IsT0FBWCxDQUFtQkssUUFBUyxHQUFoRjtBQUNILFNBRkQsTUFFTyxJQUFJdkIsVUFBVSxDQUFDa0IsT0FBWCxDQUFtQkksSUFBdkIsRUFBNkI7QUFDaENqQyxVQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxVQUFTVSxVQUFVLENBQUNrQixPQUFYLENBQW1CSSxJQUFLLEVBQTlDO0FBQ0gsU0FGTSxNQUVBLElBQUksT0FBT3RCLFVBQVUsQ0FBQ2tCLE9BQWxCLEtBQThCLFFBQWxDLEVBQTRDO0FBQy9DN0IsVUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsVUFBU1UsVUFBVSxDQUFDa0IsT0FBUSxFQUF6QztBQUNIO0FBQ0o7O0FBQ0Q3QixNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxRQUFPRSxHQUFJLDhCQUE2QlEsVUFBVSxDQUFDOUIsTUFBWCxDQUFrQnNELFdBQWxCLEVBQWdDLEdBQXJGO0FBQ0g7O0FBQ0QsU0FBS2hCLElBQUwsQ0FBVSxZQUFWLEVBQXdCO0FBQ3BCaEIsTUFBQUEsR0FEb0I7QUFFcEJpQyxNQUFBQSxNQUFNLEVBQUV6QjtBQUZZLEtBQXhCOztBQUlBLFFBQUksS0FBS3hDLGlCQUFMLENBQXVCZ0MsR0FBdkIsQ0FBSixFQUFpQztBQUU3QmtDLE1BQUFBLE9BQU8sQ0FBQ0MsUUFBUixDQUFpQixNQUFNO0FBQ25CLGFBQUtuRSxpQkFBTCxDQUF1QmdDLEdBQXZCLEVBQTRCb0MsT0FBNUIsQ0FBb0M1QixVQUFwQztBQUNILE9BRkQ7QUFHSDtBQUNKOztBQUVEZSxFQUFBQSw0QkFBNEIsQ0FBQ2YsVUFBRCxFQUFhVyxVQUFiLEVBQXlCO0FBQ2pELFFBQUlBLFVBQUosRUFBZ0I7QUFDWixhQUFPSyxnQkFBT0MsTUFBZDtBQUNIOztBQUNELFVBQU1ZLGVBQWUsR0FBRzdCLFVBQVUsQ0FBQzhCLE1BQVgsQ0FBa0JDLElBQWxCLENBQXVCbkIsQ0FBQyxJQUFJQSxDQUFDLENBQUMxQyxNQUFGLEtBQWE4QyxnQkFBT0MsTUFBaEQsQ0FBeEI7O0FBQ0EsUUFBSVksZUFBSixFQUFxQjtBQUNqQixhQUFPYixnQkFBT0MsTUFBZDtBQUNIOztBQUNELFVBQU1lLGdCQUFnQixHQUFHaEMsVUFBVSxDQUFDOEIsTUFBWCxDQUFrQkMsSUFBbEIsQ0FBdUJuQixDQUFDLElBQUlBLENBQUMsQ0FBQzFDLE1BQUYsS0FBYThDLGdCQUFPaUIsT0FBaEQsQ0FBekI7O0FBQ0EsUUFBSUQsZ0JBQUosRUFBc0I7QUFDbEIsYUFBT2hCLGdCQUFPaUIsT0FBZDtBQUNIOztBQUNELFVBQU1DLGdCQUFnQixHQUFHbEMsVUFBVSxDQUFDOEIsTUFBWCxDQUFrQkssS0FBbEIsQ0FBd0J2QixDQUFDLElBQUlBLENBQUMsQ0FBQzFDLE1BQUYsS0FBYThDLGdCQUFPb0IsT0FBakQsQ0FBekI7O0FBQ0EsUUFBSUYsZ0JBQUosRUFBc0I7QUFDbEIsYUFBT2xCLGdCQUFPb0IsT0FBZDtBQUNIOztBQUNELFdBQU9wQixnQkFBT3FCLE1BQWQ7QUFDSDs7QUFFREMsRUFBQUEsZ0JBQWdCLENBQUM5QyxHQUFELEVBQU0rQyxTQUFOLEVBQWlCQyxLQUFqQixFQUF3QjtBQUNwQyxRQUFJRCxTQUFKLEVBQWU7QUFDWCxZQUFNRSxHQUFHLEdBQUksR0FBRUQsS0FBTSxlQUFjRCxTQUFVLGFBQTdDO0FBQ0FsRCxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWW1ELEdBQVo7QUFDQSxXQUFLQyxVQUFMLENBQWdCLElBQWhCLEVBQXNCLE1BQXRCLEVBQThCRCxHQUE5QixFQUFtQyxNQUFuQztBQUNIO0FBQ0o7O0FBRURFLEVBQUFBLGNBQWMsQ0FBQ25ELEdBQUQsRUFBTWlDLE1BQU4sRUFBY2UsS0FBZCxFQUFxQjtBQUMvQixRQUFJZixNQUFNLElBQUlBLE1BQU0sQ0FBQ21CLFlBQWpCLElBQWlDbkIsTUFBTSxDQUFDdkQsTUFBeEMsSUFBa0R1RCxNQUFNLENBQUN2RCxNQUFQLENBQWNzRCxXQUFwRSxFQUFpRjtBQUM3RSxZQUFNaUIsR0FBRyxHQUFJLEdBQUVELEtBQU0sZUFBY2YsTUFBTSxDQUFDbUIsWUFBYSx1QkFBc0JuQixNQUFNLENBQUN2RCxNQUFQLENBQWNzRCxXQUFkLEVBQTRCLEdBQXpHO0FBQ0FuQyxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWW1ELEdBQVo7QUFDQSxXQUFLQyxVQUFMLENBQWdCLElBQWhCLEVBQXNCLE1BQXRCLEVBQThCRCxHQUE5QixFQUFtQyxNQUFuQztBQUNIO0FBQ0o7O0FBRURJLEVBQUFBLFlBQVksQ0FBQ3JELEdBQUQsRUFBTXNELE9BQU4sRUFBZUMsS0FBZixFQUFzQjtBQUM5QjFELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLFVBQVN5RCxLQUFLLENBQUNuRSxJQUFLLGtCQUFqQztBQUNBLFNBQUs0QixJQUFMLENBQVUsYUFBVixFQUF5QjtBQUNyQmhCLE1BQUFBLEdBRHFCO0FBRXJCc0QsTUFBQUEsT0FBTyxFQUFFQSxPQUZZO0FBR3JCQyxNQUFBQSxLQUFLLEVBQUVBO0FBSGMsS0FBekI7QUFLSDs7QUFFREMsRUFBQUEsVUFBVSxDQUFDeEQsR0FBRCxFQUFNc0QsT0FBTixFQUFlRyxXQUFmLEVBQTRCO0FBQ2xDLFVBQU1qRCxVQUFVLEdBQUcsS0FBS3pDLE9BQUwsQ0FBYVMsSUFBYixDQUFrQjRDLENBQUMsSUFBSUEsQ0FBQyxDQUFDcEIsR0FBRixLQUFVQSxHQUFqQyxDQUFuQjs7QUFDQSxRQUFJLENBQUNRLFVBQUwsRUFBaUI7QUFDYjtBQUNIOztBQUNEQSxJQUFBQSxVQUFVLENBQUM4QixNQUFYLENBQWtCaEQsSUFBbEIsQ0FBdUJtRSxXQUF2QjtBQUNBNUQsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsVUFBUzJELFdBQVcsQ0FBQ3JFLElBQUssNEJBQTJCcUUsV0FBVyxDQUFDL0UsTUFBWixDQUFtQnNELFdBQW5CLEVBQWlDLEdBQW5HO0FBQ0EsU0FBS2hCLElBQUwsQ0FBVSxXQUFWLEVBQXVCO0FBQ25CaEIsTUFBQUEsR0FEbUI7QUFFbkJzRCxNQUFBQSxPQUZtQjtBQUduQnJCLE1BQUFBLE1BQU0sRUFBRXdCO0FBSFcsS0FBdkI7QUFLSDs7QUFFREMsRUFBQUEsV0FBVyxDQUFDMUQsR0FBRCxFQUFNc0QsT0FBTixFQUFlSyxNQUFmLEVBQXVCQyxPQUF2QixFQUFnQztBQUN2Qy9ELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLFdBQVU4RCxPQUFPLENBQUN4RSxJQUFLLGtCQUFwQztBQUNBLFNBQUs0QixJQUFMLENBQVUsWUFBVixFQUF3QjtBQUNwQmhCLE1BQUFBLEdBRG9CO0FBRXBCc0QsTUFBQUEsT0FGb0I7QUFHcEJLLE1BQUFBLE1BSG9CO0FBSXBCRSxNQUFBQSxJQUFJLEVBQUVEO0FBSmMsS0FBeEI7QUFNSDs7QUFFYyxRQUFURSxTQUFTLENBQUM5RCxHQUFELEVBQU1zRCxPQUFOLEVBQWVLLE1BQWYsRUFBdUJJLFVBQXZCLEVBQW1DO0FBQzlDbEUsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsV0FBVWlFLFVBQVUsQ0FBQzNFLElBQUssNEJBQTJCMkUsVUFBVSxDQUFDckYsTUFBWCxDQUFrQnNELFdBQWxCLEVBQWdDLEdBQWxHO0FBQ0EsVUFBTSxLQUFLZ0MsNEJBQUwsQ0FBa0NELFVBQWxDLENBQU47QUFDQSxTQUFLL0MsSUFBTCxDQUFVLFVBQVYsRUFBc0I7QUFDbEJoQixNQUFBQSxHQURrQjtBQUVsQnNELE1BQUFBLE9BRmtCO0FBR2xCSyxNQUFBQSxNQUhrQjtBQUlsQjFCLE1BQUFBLE1BQU0sRUFBRThCO0FBSlUsS0FBdEI7QUFNSDs7QUFFREUsRUFBQUEsV0FBVyxDQUFDakUsR0FBRCxFQUFNa0UsSUFBTixFQUFZO0FBQ25CckUsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsYUFBWW9FLElBQUksQ0FBQzlFLElBQUssa0JBQW5DOztBQUVBLFFBQUksS0FBS3RCLE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhcUcsUUFBN0IsSUFBeUMsS0FBS3JHLE9BQUwsQ0FBYXNHLFNBQXRELElBQW1FLEtBQUt0RyxPQUFMLENBQWFzRyxTQUFiLEtBQTJCLFVBQWxHLEVBQThHO0FBQzFHLFlBQU1DLFFBQVEsR0FBR0MsY0FBS2xDLE9BQUwsQ0FBYSxLQUFLdEUsT0FBTCxDQUFhcUcsUUFBMUIsRUFBb0NELElBQUksQ0FBQ25DLFFBQXpDLENBQWpCOztBQUNBbUMsTUFBQUEsSUFBSSxDQUFDbkMsUUFBTCxHQUFnQnNDLFFBQVEsR0FBQyxJQUF6QjtBQUNIOztBQUVELFNBQUtyRCxJQUFMLENBQVUsWUFBVixFQUF3QjtBQUNwQmhCLE1BQUFBLEdBRG9CO0FBRXBCa0UsTUFBQUEsSUFBSSxFQUFFQTtBQUZjLEtBQXhCO0FBSUg7O0FBRURLLEVBQUFBLFNBQVMsQ0FBQ3ZFLEdBQUQsRUFBTXdFLFVBQU4sRUFBa0I7QUFDdkIsVUFBTTlGLE1BQU0sR0FBRzhGLFVBQVUsQ0FBQzlGLE1BQVgsQ0FBa0JzRCxXQUFsQixFQUFmO0FBQ0EsVUFBTVYsUUFBUSxHQUFHa0QsVUFBVSxDQUFDbEQsUUFBWCxHQUFzQixDQUFDa0QsVUFBVSxDQUFDbEQsUUFBWCxHQUFzQixJQUF2QixFQUE2Qm1ELE9BQTdCLENBQXFDLENBQXJDLENBQXRCLEdBQWdFLENBQWpGO0FBQ0E1RSxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxhQUFZMEUsVUFBVSxDQUFDcEYsSUFBSyxrQkFBaUJrQyxRQUFTLGtCQUFpQjVDLE1BQU8sR0FBM0Y7QUFDQSxTQUFLc0MsSUFBTCxDQUFVLFVBQVYsRUFBc0I7QUFDbEJoQixNQUFBQSxHQURrQjtBQUVsQmtFLE1BQUFBLElBQUksRUFBRU07QUFGWSxLQUF0QjtBQUlIOztBQUVEdEIsRUFBQUEsVUFBVSxDQUFDd0IsSUFBRCxFQUFPQyxLQUFQLEVBQWMxQixHQUFkLEVBQW1CMkIsR0FBRyxHQUFHLElBQXpCLEVBQStCO0FBQ3JDLFNBQUs1RCxJQUFMLENBQVUsS0FBVixFQUFpQjtBQUNiMkQsTUFBQUEsS0FEYTtBQUNOMUIsTUFBQUEsR0FETTtBQUNEeUIsTUFBQUEsSUFEQztBQUNLRSxNQUFBQTtBQURMLEtBQWpCO0FBR0g7O0FBTUQvQyxFQUFBQSxnQkFBZ0IsQ0FBQ3JCLFVBQUQsRUFBYTtBQUN6QixRQUFJQSxVQUFVLENBQUM5QixNQUFYLEtBQXNCOEMsZ0JBQU9DLE1BQWpDLEVBQXlDO0FBQ3JDLFVBQUlqQixVQUFVLENBQUNrQixPQUFmLEVBQXdCO0FBQ3BCLGVBQU9sQixVQUFVLENBQUNrQixPQUFsQjtBQUNIOztBQUNELFdBQUssSUFBSStCLFdBQVQsSUFBd0JqRCxVQUFVLENBQUM4QixNQUFuQyxFQUEyQztBQUN2QyxZQUFJbUIsV0FBVyxDQUFDL0UsTUFBWixLQUF1QjhDLGdCQUFPQyxNQUFsQyxFQUEwQztBQUN0QztBQUNIOztBQUNELFlBQUlnQyxXQUFXLENBQUMvQixPQUFoQixFQUF5QjtBQUNyQixpQkFBTytCLFdBQVcsQ0FBQy9CLE9BQW5CO0FBQ0g7O0FBQ0QsYUFBSyxJQUFJcUMsVUFBVCxJQUF1Qk4sV0FBVyxDQUFDb0IsS0FBbkMsRUFBMEM7QUFDdEMsY0FBSXBCLFdBQVcsQ0FBQy9FLE1BQVosS0FBdUI4QyxnQkFBT0MsTUFBbEMsRUFBMEM7QUFDdEM7QUFDSDs7QUFDRCxjQUFJc0MsVUFBVSxDQUFDckMsT0FBZixFQUF3QjtBQUNwQixtQkFBT3FDLFVBQVUsQ0FBQ3JDLE9BQWxCO0FBQ0g7O0FBQ0QsZUFBSyxJQUFJOEMsVUFBVCxJQUF1QlQsVUFBVSxDQUFDZSxLQUFsQyxFQUF5QztBQUNyQyxnQkFBSU4sVUFBVSxDQUFDOUYsTUFBWCxLQUFzQjhDLGdCQUFPQyxNQUFqQyxFQUF5QztBQUNyQztBQUNIOztBQUNELG1CQUFPK0MsVUFBVSxDQUFDOUMsT0FBWCxJQUFzQixJQUE3QjtBQUNIO0FBQ0o7QUFDSjtBQUNKOztBQUNELFdBQU8sSUFBUDtBQUNIOztBQUVEaEMsRUFBQUEsWUFBWSxHQUFHO0FBQ1gsVUFBTUQsY0FBYyxHQUFHLEVBQXZCO0FBQ0EsVUFBTXNGLGdCQUFnQixHQUFHLEVBQXpCOztBQUNBLFFBQUksQ0FBQzNHLEtBQUssQ0FBQ0MsT0FBTixDQUFjLEtBQUtOLE9BQW5CLENBQUQsSUFBZ0MsS0FBS0EsT0FBTCxDQUFhTyxNQUFiLElBQXVCLENBQTNELEVBQThEO0FBQzFELGFBQU8sS0FBUDtBQUNIOztBQUNELFNBQUssSUFBSTJELE1BQVQsSUFBbUIsS0FBS2xFLE9BQXhCLEVBQWlDO0FBQzdCLFVBQUksQ0FBQ2tFLE1BQU0sQ0FBQ25FLE9BQVAsQ0FBZWtILFlBQWhCLElBQWdDLENBQUMvQyxNQUFNLENBQUNuRSxPQUFQLENBQWVrSCxZQUFmLENBQTRCQyxTQUFqRSxFQUE0RTtBQUN4RUYsUUFBQUEsZ0JBQWdCLENBQUN6RixJQUFqQixDQUFzQjJDLE1BQXRCO0FBQ0E7QUFDSDs7QUFDRCxZQUFNZ0QsU0FBUyxHQUFHaEQsTUFBTSxDQUFDbkUsT0FBUCxDQUFla0gsWUFBZixDQUE0QkMsU0FBOUM7QUFDQSxZQUFNQyxRQUFRLEdBQUdqRCxNQUFNLENBQUNuRSxPQUFQLENBQWVrSCxZQUFmLENBQTRCRSxRQUE3QztBQUNBLFVBQUlDLGFBQWEsR0FBRzFGLGNBQWMsQ0FBQ3dGLFNBQUQsQ0FBbEM7O0FBQ0EsVUFBSSxDQUFDRSxhQUFMLEVBQW9CO0FBQ2hCQSxRQUFBQSxhQUFhLEdBQUcxRixjQUFjLENBQUN3RixTQUFELENBQWQsR0FBNEIsRUFDeEMsR0FBR2hELE1BRHFDO0FBRXhDSyxVQUFBQSxNQUFNLEVBQUU7QUFGZ0MsU0FBNUM7O0FBSUEsWUFBSTRDLFFBQUosRUFBYztBQUNWQyxVQUFBQSxhQUFhLENBQUMsYUFBRCxDQUFiLEdBQStCLEVBQS9CO0FBQ0g7QUFDSixPQVJELE1BU0s7QUFDREEsUUFBQUEsYUFBYSxDQUFDekUsU0FBZCxHQUEwQjBFLElBQUksQ0FBQ0MsR0FBTCxDQUFTRixhQUFhLENBQUN6RSxTQUF2QixFQUFrQ3VCLE1BQU0sQ0FBQ3ZCLFNBQXpDLENBQTFCO0FBQ0F5RSxRQUFBQSxhQUFhLENBQUM5RCxPQUFkLEdBQXdCK0QsSUFBSSxDQUFDRSxHQUFMLENBQVNILGFBQWEsQ0FBQzlELE9BQXZCLEVBQWdDWSxNQUFNLENBQUNaLE9BQXZDLENBQXhCO0FBQ0E4RCxRQUFBQSxhQUFhLENBQUM3RCxRQUFkLEdBQXlCNkQsYUFBYSxDQUFDOUQsT0FBZCxHQUF3QjhELGFBQWEsQ0FBQ3pFLFNBQS9EO0FBQ0g7O0FBRUQsVUFBSSxDQUFDd0UsUUFBTCxFQUFlO0FBQ1hDLFFBQUFBLGFBQWEsQ0FBQzdDLE1BQWQsR0FBdUIsQ0FDbkIsR0FBRzZDLGFBQWEsQ0FBQzdDLE1BREUsRUFFbkIsR0FBR0wsTUFBTSxDQUFDSyxNQUZTLENBQXZCO0FBSUgsT0FMRCxNQU1LO0FBQ0QsYUFBSyxNQUFNaUQsa0JBQVgsSUFBaUN0RCxNQUFNLENBQUNLLE1BQXhDLEVBQWdEO0FBQzVDLGdCQUFNa0QsUUFBUSxHQUFJLEdBQUVOLFFBQVMsSUFBR0ssa0JBQWtCLENBQUNuQyxZQUFhLEVBQWhFO0FBQ0EsZ0JBQU1xQyxrQkFBa0IsR0FBR04sYUFBYSxDQUFDTyxXQUFkLENBQTBCRixRQUExQixDQUEzQjs7QUFDQSxjQUFJLENBQUNDLGtCQUFMLEVBQXlCO0FBQ3JCTixZQUFBQSxhQUFhLENBQUNPLFdBQWQsQ0FBMEJGLFFBQTFCLElBQXNDLEVBQUUsR0FBR0Q7QUFBTCxhQUF0QztBQUNILFdBRkQsTUFHSztBQUNERSxZQUFBQSxrQkFBa0IsQ0FBQy9FLFNBQW5CLEdBQStCMEUsSUFBSSxDQUFDQyxHQUFMLENBQVNJLGtCQUFrQixDQUFDL0UsU0FBNUIsRUFBdUM2RSxrQkFBa0IsQ0FBQzdFLFNBQTFELENBQS9CO0FBQ0ErRSxZQUFBQSxrQkFBa0IsQ0FBQ3BFLE9BQW5CLEdBQTZCK0QsSUFBSSxDQUFDRSxHQUFMLENBQVNHLGtCQUFrQixDQUFDcEUsT0FBNUIsRUFBcUNrRSxrQkFBa0IsQ0FBQ2xFLE9BQXhELENBQTdCO0FBQ0FvRSxZQUFBQSxrQkFBa0IsQ0FBQ25FLFFBQW5CLEdBQThCbUUsa0JBQWtCLENBQUNwRSxPQUFuQixHQUE2Qm9FLGtCQUFrQixDQUFDL0UsU0FBOUU7QUFDQStFLFlBQUFBLGtCQUFrQixDQUFDWixLQUFuQixHQUEyQixDQUN2QixHQUFHWSxrQkFBa0IsQ0FBQ1osS0FEQyxFQUV2QixHQUFHVSxrQkFBa0IsQ0FBQ1YsS0FGQyxDQUEzQjs7QUFJQSxnQkFBSVUsa0JBQWtCLENBQUNWLEtBQW5CLENBQXlCdEMsSUFBekIsQ0FBOEJvRCxDQUFDLElBQUlBLENBQUMsQ0FBQ2pILE1BQUYsS0FBYThDLGdCQUFPQyxNQUF2RCxDQUFKLEVBQW9FO0FBQ2hFZ0UsY0FBQUEsa0JBQWtCLENBQUMvRyxNQUFuQixHQUE0QjhDLGdCQUFPQyxNQUFuQztBQUNILGFBRkQsTUFHSyxJQUFJOEQsa0JBQWtCLENBQUNWLEtBQW5CLENBQXlCdEMsSUFBekIsQ0FBOEJvRCxDQUFDLElBQUlBLENBQUMsQ0FBQ2pILE1BQUYsS0FBYThDLGdCQUFPaUIsT0FBdkQsQ0FBSixFQUFxRTtBQUN0RWdELGNBQUFBLGtCQUFrQixDQUFDL0csTUFBbkIsR0FBNEI4QyxnQkFBT2lCLE9BQW5DO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7QUFDSjs7QUFFRCxVQUFNbUQsa0JBQWtCLEdBQUc3RyxNQUFNLENBQUM4RyxJQUFQLENBQVlwRyxjQUFaLEVBQTRCcUcsR0FBNUIsQ0FDdkJOLFFBQVEsSUFBSTtBQUNSLFlBQU1MLGFBQWEsR0FBRzFGLGNBQWMsQ0FBQytGLFFBQUQsQ0FBcEM7O0FBQ0EsVUFBSSxDQUFDTCxhQUFhLENBQUNPLFdBQW5CLEVBQWdDO0FBQzVCLGVBQU9QLGFBQVA7QUFDSDs7QUFDREEsTUFBQUEsYUFBYSxDQUFDN0MsTUFBZCxHQUF1QixDQUNuQixHQUFHNkMsYUFBYSxDQUFDN0MsTUFERSxFQUVuQixHQUFHdkQsTUFBTSxDQUFDOEcsSUFBUCxDQUFZVixhQUFhLENBQUNPLFdBQTFCLEVBQXVDSSxHQUF2QyxDQUEyQ0MsYUFBYSxJQUFJWixhQUFhLENBQUNPLFdBQWQsQ0FBMEJLLGFBQTFCLENBQTVELENBRmdCLENBQXZCO0FBSUEsWUFBTUMsZ0JBQWdCLEdBQUdiLGFBQWEsQ0FBQzdDLE1BQWQsQ0FBcUI5RCxJQUFyQixDQUEwQnlILENBQUMsSUFBSUEsQ0FBQyxDQUFDdkgsTUFBRixLQUFhOEMsZ0JBQU9DLE1BQW5ELENBQXpCOztBQUNBLFVBQUl1RSxnQkFBSixFQUFzQjtBQUNsQmIsUUFBQUEsYUFBYSxDQUFDekcsTUFBZCxHQUF1QjhDLGdCQUFPQyxNQUE5QjtBQUNBMEQsUUFBQUEsYUFBYSxDQUFDekQsT0FBZCxHQUF3QnNFLGdCQUFnQixDQUFDdEUsT0FBakIsSUFBNEJ5RCxhQUFhLENBQUN6RCxPQUFsRTtBQUNILE9BSEQsTUFJSztBQUNELGNBQU13RSxxQkFBcUIsR0FBR2YsYUFBYSxDQUFDN0MsTUFBZCxDQUFxQjlELElBQXJCLENBQTBCeUgsQ0FBQyxJQUFJQSxDQUFDLENBQUN2SCxNQUFGLEtBQWE4QyxnQkFBT2lCLE9BQW5ELENBQTlCOztBQUNBLFlBQUl5RCxxQkFBSixFQUEyQjtBQUN2QmYsVUFBQUEsYUFBYSxDQUFDekcsTUFBZCxHQUF1QjhDLGdCQUFPaUIsT0FBOUI7QUFDQTBDLFVBQUFBLGFBQWEsQ0FBQ3pELE9BQWQsR0FBd0J3RSxxQkFBcUIsQ0FBQ3hFLE9BQXRCLElBQWlDeUQsYUFBYSxDQUFDekQsT0FBdkU7QUFDSDtBQUNKOztBQUNELGFBQU95RCxhQUFhLENBQUMsYUFBRCxDQUFwQjtBQUNBLGFBQU9BLGFBQVA7QUFDSCxLQXhCc0IsQ0FBM0I7QUEwQkEsUUFBSXBILE9BQU8sR0FBRyxDQUFDLEdBQUc2SCxrQkFBSixFQUF3QixHQUFHYixnQkFBM0IsQ0FBZDtBQUVBaEgsSUFBQUEsT0FBTyxHQUFHLEtBQUtvSSwwQkFBTCxDQUFnQ3BJLE9BQWhDLENBQVY7QUFFQSxTQUFLcUksY0FBTCxDQUFvQnJJLE9BQXBCO0FBQ0EsV0FBT0EsT0FBUDtBQUNIOztBQUVEb0ksRUFBQUEsMEJBQTBCLENBQUNwSSxPQUFELEVBQVU7QUFDaEMsV0FBT0EsT0FBTyxDQUFDK0gsR0FBUixDQUFhN0QsTUFBRCxJQUFZO0FBQzNCLFVBQ0lBLE1BQU0sSUFDTkEsTUFBTSxDQUFDSyxNQURQLElBRUFsRSxLQUFLLENBQUNDLE9BQU4sQ0FBYzRELE1BQU0sQ0FBQ0ssTUFBckIsQ0FGQSxJQUdBTCxNQUFNLENBQUNLLE1BQVAsQ0FBY2hFLE1BQWQsR0FBdUIsQ0FKM0IsRUFLRTtBQUNFLGNBQU0rSCxNQUFNLEdBQUdwRSxNQUFNLENBQUNLLE1BQVAsQ0FBYzlELElBQWQsQ0FBb0IrRSxLQUFELElBQVdBLEtBQUssQ0FBQzdFLE1BQU4sS0FBaUI4QyxnQkFBT0MsTUFBdEQsQ0FBZjs7QUFDQSxZQUFJNEUsTUFBSixFQUFZO0FBQ1JwRSxVQUFBQSxNQUFNLENBQUN2RCxNQUFQLEdBQWdCOEMsZ0JBQU9DLE1BQXZCO0FBQ0gsU0FGRCxNQUdLLElBQUlRLE1BQU0sQ0FBQ0ssTUFBUCxDQUFjOUQsSUFBZCxDQUFvQitFLEtBQUQsSUFBV0EsS0FBSyxDQUFDN0UsTUFBTixLQUFpQjhDLGdCQUFPaUIsT0FBdEQsQ0FBSixFQUFvRTtBQUNyRVIsVUFBQUEsTUFBTSxDQUFDdkQsTUFBUCxHQUFnQjhDLGdCQUFPaUIsT0FBdkI7QUFDSDtBQUNKOztBQUVELGFBQU9SLE1BQVA7QUFDSCxLQWpCTSxDQUFQO0FBa0JIOztBQUVEbUUsRUFBQUEsY0FBYyxDQUFDckksT0FBRCxFQUFVO0FBQ3BCLFVBQU11SSx3QkFBd0IsR0FBRyxFQUFqQztBQUVBdkksSUFBQUEsT0FBTyxDQUFDK0gsR0FBUixDQUFhN0QsTUFBRCxJQUFZO0FBQ3BCQSxNQUFBQSxNQUFNLENBQUNLLE1BQVAsQ0FBY3dELEdBQWQsQ0FBbUJ2QyxLQUFELElBQVc7QUFDekIsWUFBSStDLHdCQUF3QixDQUFDQyxRQUF6QixDQUFrQ2hELEtBQUssQ0FBQ0gsWUFBeEMsQ0FBSixFQUEyRDtBQUN2RHZELFVBQUFBLE9BQU8sQ0FBQzJHLElBQVIsQ0FBYSxvQkFBYixFQUFtQ2pELEtBQUssQ0FBQ0gsWUFBekMsRUFBdUQsYUFBdkQ7QUFDSCxTQUZELE1BRU87QUFDSGtELFVBQUFBLHdCQUF3QixDQUFDaEgsSUFBekIsQ0FBOEJpRSxLQUFLLENBQUNILFlBQXBDO0FBQ0g7QUFDSixPQU5EO0FBT0gsS0FSRDtBQVNIOztBQUVpQyxRQUE1QlksNEJBQTRCLENBQUNELFVBQUQsRUFBYTtBQUMzQyxRQUFJLENBQUNBLFVBQUQsSUFBZSxDQUFDQSxVQUFVLENBQUMwQyxXQUEzQixJQUEwQyxDQUFDMUMsVUFBVSxDQUFDMEMsV0FBWCxDQUF1Qm5JLE1BQXRFLEVBQThFO0FBQzFFO0FBQ0g7O0FBQ0QsVUFBTW9JLG1CQUFtQixHQUFHLEVBQTVCOztBQUNBLFNBQUssSUFBSUMsQ0FBQyxHQUFDLENBQVgsRUFBY0EsQ0FBQyxHQUFFNUMsVUFBVSxDQUFDMEMsV0FBWCxDQUF1Qm5JLE1BQXhDLEVBQWdEcUksQ0FBQyxFQUFqRCxFQUFxRDtBQUNqRCxZQUFNQyxVQUFVLEdBQUc3QyxVQUFVLENBQUMwQyxXQUFYLENBQXVCRSxDQUF2QixDQUFuQjs7QUFDQSxVQUFJLENBQUNDLFVBQVUsQ0FBQ0MsSUFBaEIsRUFBc0I7QUFDbEI7QUFDSDs7QUFDRCxVQUFJO0FBQ0EsY0FBTUMsYUFBYSxHQUNmLE1BQU1uRyxjQUFPb0csYUFBUCxDQUFxQkgsVUFBVSxDQUFDSSxRQUFoQyxFQUEwQ0osVUFBVSxDQUFDQyxJQUFyRCxFQUEyRCxLQUFLL0ksT0FBaEUsQ0FEVjs7QUFFQSxZQUFJLENBQUNnSixhQUFMLEVBQW9CO0FBQ2hCSixVQUFBQSxtQkFBbUIsQ0FBQ3BILElBQXBCLENBQXlCc0gsVUFBekI7QUFDSCxTQUZELE1BR0s7QUFDREEsVUFBQUEsVUFBVSxDQUFDSyxRQUFYLEdBQXNCSCxhQUF0QjtBQUNBLGlCQUFPRixVQUFVLENBQUMsTUFBRCxDQUFqQjtBQUNIO0FBQ0osT0FWRCxDQVdBLE9BQU9NLENBQVAsRUFBVTtBQUNOckgsUUFBQUEsT0FBTyxDQUFDMkcsSUFBUixDQUFhLGlDQUFiLEVBQWdEVSxDQUFDLENBQUNDLE9BQWxEO0FBQ0FULFFBQUFBLG1CQUFtQixDQUFDcEgsSUFBcEIsQ0FBeUJzSCxVQUF6QjtBQUNIO0FBQ0o7O0FBRUQsU0FBSyxJQUFJRCxDQUFDLEdBQUMsQ0FBWCxFQUFjQSxDQUFDLEdBQUVELG1CQUFtQixDQUFDcEksTUFBckMsRUFBNkNxSSxDQUFDLEVBQTlDLEVBQWtEO0FBQzlDLFlBQU1TLGdCQUFnQixHQUFHckQsVUFBVSxDQUFDMEMsV0FBWCxDQUF1QlksT0FBdkIsQ0FBK0JYLG1CQUFtQixDQUFDQyxDQUFELENBQWxELENBQXpCOztBQUNBLFVBQUksQ0FBQ1MsZ0JBQUQsR0FBb0IsQ0FBQyxDQUF6QixFQUE0QjtBQUN4QnJELFFBQUFBLFVBQVUsQ0FBQzBDLFdBQVgsQ0FBdUJhLE1BQXZCLENBQThCRixnQkFBOUIsRUFBZ0QsQ0FBaEQ7QUFDSDtBQUNKO0FBQ0o7O0FBbmNzRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogUmVwb3J0IGFnZ3JlZ2F0b3JcclxuICovXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgVGVzdFJlc3VsdCBmcm9tICcuLi9tb2RlbC90ZXN0LXJlc3VsdCc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gaW1wb3J0IGFsbCBidWlsdC1pbiByZXBvcnRlcnNcclxuaW1wb3J0IEpzb25SZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItanNvbic7XHJcbmltcG9ydCBKVW5pdFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1qdW5pdCc7XHJcbmltcG9ydCBIdG1sUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLWh0bWwnO1xyXG5pbXBvcnQgRXhjZWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItZXhjZWwnO1xyXG5pbXBvcnQgUGRmUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLXBkZic7XHJcbmltcG9ydCBYbWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgU3RhdHVzIGZyb20gJy4uL21vZGVsL3N0YXR1cyc7XHJcblxyXG5jb25zdCBSZXBvcnRlcnMgPSB7XHJcbiAgICBqc29uOiBKc29uUmVwb3J0ZXIsXHJcbiAgICBqdW5pdDogSlVuaXRSZXBvcnRlcixcclxuICAgIGh0bWw6IEh0bWxSZXBvcnRlcixcclxuICAgIGV4Y2VsOiBFeGNlbFJlcG9ydGVyLFxyXG4gICAgcGRmOiBQZGZSZXBvcnRlcixcclxuICAgIHhtbDogWG1sUmVwb3J0ZXJcclxufTtcclxuXHJcbmNvbnN0IERFRkFVTFRfVEVTVF9OQU1FID0gJ094eWdlbiBUZXN0JztcclxuY29uc3QgREVGQVVMVF9SRVBPUlRFUlMgPSBbXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydEFnZ3JlZ2F0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgLy8gcmVzdWx0cyBoYXNoIHRhYmxlIGJhc2VkIG9uIHJ1bm5lciBpZCBrZXlcclxuICAgICAgICB0aGlzLnJlc3VsdHMgPSBbXTtcclxuICAgICAgICAvLyBhIGhhc2ggbGlzdCBvZiBydW5uZXJFbmQgZXZlbnQgcHJvbWlzZXMsIGtleWVkIGJ5IHJ1bm5lciBpZFxyXG4gICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXMgPSB7fTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGVSZXBvcnRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRFeGl0Q29kZSgpIHtcclxuICAgICAgICBsZXQgZXhpdENvZGUgPSAwO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cyAmJlxyXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMucmVzdWx0cykgJiZcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgdGVzdEZhaWxkZWQgPSB0aGlzLnJlc3VsdHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZXN0RmFpbGRlZCkge1xyXG4gICAgICAgICAgICAgICAgZXhpdENvZGUgPSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBicm9rZW4gP1xyXG4gICAgICAgICAgICBleGl0Q29kZSA9IC0xO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGluc3RhbnRpYXRlUmVwb3J0ZXJzKCkge1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZXJzID0gW107XHJcbiAgICAgICAgY29uc3QgZ2VuZXJhbFJlcG9ydGluZ09wdHMgPSB0aGlzLm9wdGlvbnMucmVwb3J0aW5nIHx8IHt9O1xyXG4gICAgICAgIGZvciAobGV0IHJlcG9ydGVyIG9mIGdlbmVyYWxSZXBvcnRpbmdPcHRzLnJlcG9ydGVycyB8fCBERUZBVUxUX1JFUE9SVEVSUykge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcG9ydGVyICE9PSAnc3RyaW5nJyAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlcG9ydGVyLCAnbmFtZScpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgcmVwb3J0ZXJzIHRoYXQgZG8gbm90IGhhdmUgJ25hbWUnIHByb3BlcnR5IGFzIGl0J3MgZXNzZW50aWFsIHRvIGxvYWQgdGhlIGNvcnJlc3BvbmRpbmcgUmVwb3J0ZXIgY2xhc3NcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXBvcnRlck5hbWUgPSB0eXBlb2YgcmVwb3J0ZXIgPT09ICdzdHJpbmcnID8gcmVwb3J0ZXIgOiByZXBvcnRlci5uYW1lO1xyXG4gICAgICAgICAgICBjb25zdCByZXBvcnRlck9wdHMgPSB0eXBlb2YgcmVwb3J0ZXIgPT09ICdvYmplY3QnID8gcmVwb3J0ZXIgOiBnZW5lcmFsUmVwb3J0aW5nT3B0cztcclxuXHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUmVwb3J0ZXJzLCByZXBvcnRlck5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydGVycy5wdXNoKG5ldyBSZXBvcnRlcnNbcmVwb3J0ZXJOYW1lXSh0aGlzLm9wdGlvbnMsIHJlcG9ydGVyT3B0cykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFJlc3VsdHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZVJlcG9ydHMoKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMucmVwb3J0ZXJzKSB8fCB0aGlzLnJlcG9ydGVycy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGdyb3VwZWRSZXN1bHRzID0gdGhpcy5ncm91cFJlc3VsdHMoKTtcclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiB0aGlzLnJlcG9ydGVycykge1xyXG4gICAgICAgICAgICBjb25zdCByZXBvcnRQYXRoID0gcmVwb3J0ZXIuZ2VuZXJhdGUoZ3JvdXBlZFJlc3VsdHMpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgWW91ciByZXBvcnQgaXMgcmVhZHk6ICR7cmVwb3J0UGF0aH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgd2FpdEZvclJlc3VsdChyaWQpIHtcclxuICAgICAgICBpZiAoIXJpZCB8fCAhdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHdhaXRGb3JSZXN1bHRzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckVuZFByb21pc2VzICYmIHRoaXMucnVubmVyRW5kUHJvbWlzZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzLnJ1bm5lckVuZFByb21pc2VzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25SdW5uZXJTdGFydChyaWQsIG9wdHMsIGNhcHMpIHtcclxuICAgICAgICBpZiAoIXJpZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wicmlkXCIgY2Fubm90IGJlIGVtcHR5LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTtcclxuICAgICAgICB0ZXN0UmVzdWx0LnJpZCA9IHJpZDtcclxuICAgICAgICB0ZXN0UmVzdWx0Lm5hbWUgPSBvcHRzLm5hbWUgfHwgREVGQVVMVF9URVNUX05BTUU7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5jYXBhYmlsaXRpZXMgPSBjYXBzO1xyXG4gICAgICAgIHRlc3RSZXN1bHQuZW52aXJvbm1lbnQgPSBvcHRzLmVudlZhcnMgfHwge307XHJcbiAgICAgICAgdGVzdFJlc3VsdC5vcHRpb25zID0gb3B0cztcclxuICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh0ZXN0UmVzdWx0KTtcclxuICAgICAgICAvLyBjcmVhdGUgYSBuZXcgcHJvbWlzZSBmb3IgbGF0ZXIgdG8gYmUgcmVzb2x2ZWQgb24gcnVubmVyOmVuZCBldmVudFxyXG4gICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFRlc3QgJHtyaWR9IGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdydW5uZXI6c3RhcnQnLCB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgb3B0cyxcclxuICAgICAgICAgICAgY2Fwc1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUnVubmVyRW5kKHJpZCwgZmluYWxSZXN1bHQsIGZhdGFsRXJyb3IpIHtcclxuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gdGhpcy5yZXN1bHRzLmZpbmQoeCA9PiB4LnJpZCA9PT0gcmlkKTtcclxuICAgICAgICBpZiAodGVzdFJlc3VsdCkge1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIHRlc3RSZXN1bHQuZHVyYXRpb24gPSB0ZXN0UmVzdWx0LmVuZFRpbWUgLSB0ZXN0UmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRlc3Qgc3RhdHVzIGJhc2VkIG9uIHN1aXRlcyBzdGF0dXNlc1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LnN0YXR1cyA9IHRoaXMuX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyh0ZXN0UmVzdWx0LCBmYXRhbEVycm9yKTtcclxuICAgICAgICAgICAgLy8gdGVzdFJlc3VsdC5zdGF0dXMgPSBmYXRhbEVycm9yID8gU3RhdHVzLkZBSUxFRCA6ICh0ZXN0UmVzdWx0LnN1aXRlcy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpKSA/IFN0YXR1cy5GQUlMRUQgOiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRoYXQgaWYgZmF0YWxFcnJvciBpcyBub3QgaW5oZXJpdGVkIGZyb20gRXJyb3IgY2xhc3MgdGhlbiB3ZSBhbHJlYWR5IGdvdCBPeHlnZW4gRmFpbHVyZSBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmZhaWx1cmUgPSBmYXRhbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGZhdGFsRXJyb3IpIDogZmF0YWxFcnJvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQuZmFpbHVyZSA9IHRoaXMuX2dldEZpcnN0RmFpbHVyZSh0ZXN0UmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgJiYgZmluYWxSZXN1bHQuY2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmNhcGFiaWxpdGllcyA9IGZpbmFsUmVzdWx0LmNhcGFiaWxpdGllcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlLnR5cGUgJiYgdGVzdFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke3Rlc3RSZXN1bHQuZmFpbHVyZS50eXBlfSBhdCAke3Rlc3RSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbn0uYCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke3Rlc3RSZXN1bHQuZmFpbHVyZS50eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGVzdFJlc3VsdC5mYWlsdXJlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmV9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFRlc3QgJHtyaWR9IGhhcyBmaW5pc2hlZCB3aXRoIHN0YXR1czogJHt0ZXN0UmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdydW5uZXI6ZW5kJywge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogdGVzdFJlc3VsdCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdKSB7XHJcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgbmV4dFRpY2soKSB3aWxsIGhlbHAgdXMgdG8gaW5zdXJlIHRoYXQgd2UgcmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciBlbWl0KCdydW5uZXI6ZW5kJykgaGFzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXS5yZXNvbHZlKHRlc3RSZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyh0ZXN0UmVzdWx0LCBmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgaWYgKGZhdGFsRXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlcyA9IHRlc3RSZXN1bHQuc3VpdGVzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZFN1aXRlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaGFzV2FybmluZ1N1aXRlcyA9IHRlc3RSZXN1bHQuc3VpdGVzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpO1xyXG4gICAgICAgIGlmIChoYXNXYXJuaW5nU3VpdGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuV0FSTklORztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsU3VpdGVzU2tpcHBlZCA9IHRlc3RSZXN1bHQuc3VpdGVzLmV2ZXJ5KHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5TS0lQUEVEKTtcclxuICAgICAgICBpZiAoYWxsU3VpdGVzU2tpcHBlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLlNLSVBQRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSXRlcmF0aW9uU3RhcnQocmlkLCBpdGVyYXRpb24sIHN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKGl0ZXJhdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtzdGFydH0gSXRlcmF0aW9uICMke2l0ZXJhdGlvbn0gc3RhcnRlZC4uLmA7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIHRoaXMub25Mb2dFbnRyeShudWxsLCAnSU5GTycsIG1zZywgJ3VzZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25JdGVyYXRpb25FbmQocmlkLCByZXN1bHQsIHN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuaXRlcmF0aW9uTnVtICYmIHJlc3VsdC5zdGF0dXMgJiYgcmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSkge1xyXG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtzdGFydH0gSXRlcmF0aW9uICMke3Jlc3VsdC5pdGVyYXRpb25OdW19IGVuZGVkIHdpdGggc3RhdHVzOiAke3Jlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICAgICAgICAgICAgdGhpcy5vbkxvZ0VudHJ5KG51bGwsICdJTkZPJywgbXNnLCAndXNlcicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblN1aXRlU3RhcnQocmlkLCBzdWl0ZUlkLCBzdWl0ZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWl0ZSBcIiR7c3VpdGUubmFtZX1cIiBoYXMgc3RhcnRlZC4uLmApO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc3VpdGU6c3RhcnQnLCB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZDogc3VpdGVJZCxcclxuICAgICAgICAgICAgc3VpdGU6IHN1aXRlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU3VpdGVFbmQocmlkLCBzdWl0ZUlkLCBzdWl0ZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSB0aGlzLnJlc3VsdHMuZmluZCh4ID0+IHgucmlkID09PSByaWQpO1xyXG4gICAgICAgIGlmICghdGVzdFJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRlc3RSZXN1bHQuc3VpdGVzLnB1c2goc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWl0ZSBcIiR7c3VpdGVSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgd2l0aCBzdGF0dXM6ICR7c3VpdGVSZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCl9LmApO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc3VpdGU6ZW5kJywge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogc3VpdGVSZXN1bHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DYXNlU3RhcnQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIGNhc2VEZWYpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgLSBDYXNlIFwiJHtjYXNlRGVmLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Nhc2U6c3RhcnQnLCB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBjYXNlOiBjYXNlRGVmLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2FzZUVuZChyaWQsIHN1aXRlSWQsIGNhc2VJZCwgY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAtIENhc2UgXCIke2Nhc2VSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgd2l0aCBzdGF0dXM6ICR7Y2FzZVJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVRlc3RDYXNlVmlkZW9BdHRhY2htZW50KGNhc2VSZXN1bHQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY2FzZTplbmQnLCB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGNhc2VSZXN1bHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TdGVwU3RhcnQocmlkLCBzdGVwKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCAgLSBTdGVwIFwiJHtzdGVwLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucm9vdFBhdGggJiYgdGhpcy5vcHRpb25zLmZyYW1ld29yayAmJiB0aGlzLm9wdGlvbnMuZnJhbWV3b3JrID09PSAnY3VjdW1iZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy5yb290UGF0aCwgc3RlcC5sb2NhdGlvbik7XHJcbiAgICAgICAgICAgIHN0ZXAubG9jYXRpb24gPSBmdWxsUGF0aCsnOjEnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOnN0YXJ0Jywge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN0ZXA6IHN0ZXAsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TdGVwRW5kKHJpZCwgc3RlcFJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHN0ZXBSZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBzdGVwUmVzdWx0LmR1cmF0aW9uID8gKHN0ZXBSZXN1bHQuZHVyYXRpb24gLyAxMDAwKS50b0ZpeGVkKDIpIDogMDtcclxuICAgICAgICBjb25zb2xlLmxvZyhgICAtIFN0ZXAgXCIke3N0ZXBSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgaW4gJHtkdXJhdGlvbn1zIHdpdGggc3RhdHVzOiAke3N0YXR1c30uYCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOmVuZCcsIHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdGVwOiBzdGVwUmVzdWx0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTG9nRW50cnkodGltZSwgbGV2ZWwsIG1zZywgc3JjID0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnbG9nJywge1xyXG4gICAgICAgICAgICBsZXZlbCwgbXNnLCB0aW1lLCBzcmNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGZhaWx1cmUgb2JqZWN0IGluIG9uZSBvZiB0ZXN0IHJlc3VsdCdzIGVudGl0aWVzLiBcclxuICAgICAqIEBwYXJhbSB7VGVzdFJlc3VsdH0gdGVzdFJlc3VsdCBcclxuICAgICAqL1xyXG4gICAgX2dldEZpcnN0RmFpbHVyZSh0ZXN0UmVzdWx0KSB7XHJcbiAgICAgICAgaWYgKHRlc3RSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZXN0UmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0UmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgc3VpdGVSZXN1bHQgb2YgdGVzdFJlc3VsdC5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYXNlUmVzdWx0IG9mIHN1aXRlUmVzdWx0LmNhc2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1aXRlUmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FzZVJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdGVwUmVzdWx0IG9mIGNhc2VSZXN1bHQuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcFJlc3VsdC5mYWlsdXJlIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwUmVzdWx0cygpIHtcclxuICAgICAgICBjb25zdCBncm91cGVkUmVzdWx0cyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHVuZ3JvdXBlZFJlc3VsdHMgPSBbXTtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSB8fCB0aGlzLnJlc3VsdHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXN1bHQgb2YgdGhpcy5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0IHx8ICFyZXN1bHQub3B0aW9ucy5fZ3JvdXBSZXN1bHQucmVzdWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICB1bmdyb3VwZWRSZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEtleSA9IHJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdC5yZXN1bHRLZXk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1aXRlS2V5ID0gcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0LnN1aXRlS2V5O1xyXG4gICAgICAgICAgICBsZXQgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW3Jlc3VsdEtleV07XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXBlZFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW3Jlc3VsdEtleV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlczogW10sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1aXRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdFsnX3N1aXRlc0hhc2gnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWUgPSBNYXRoLm1pbihncm91cGVkUmVzdWx0LnN0YXJ0VGltZSwgcmVzdWx0LnN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmVuZFRpbWUgPSBNYXRoLm1heChncm91cGVkUmVzdWx0LmVuZFRpbWUsIHJlc3VsdC5lbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZHVyYXRpb24gPSBncm91cGVkUmVzdWx0LmVuZFRpbWUgLSBncm91cGVkUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBncm91cGluZyBpcyBieSByZXN1bHQgb25seSwgdGhlbiBqdXN0IGFwcGVuZCBjdXJyZW50IHJlc3VsdCdzIHN1aXRlcyB0byB0aGUgZ3JvdXAncyBzdWl0ZXNcclxuICAgICAgICAgICAgaWYgKCFzdWl0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdWl0ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFJlc3VsdC5zdWl0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LnN1aXRlc1xyXG4gICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudFN1aXRlUmVzdWx0IG9mIHJlc3VsdC5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cEtleSA9IGAke3N1aXRlS2V5fS0ke2N1cnJlbnRTdWl0ZVJlc3VsdC5pdGVyYXRpb25OdW19YDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cGVkU3VpdGVSZXN1bHQgPSBncm91cGVkUmVzdWx0Ll9zdWl0ZXNIYXNoW2dyb3VwS2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyb3VwZWRTdWl0ZVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0Ll9zdWl0ZXNIYXNoW2dyb3VwS2V5XSA9IHsgLi4uY3VycmVudFN1aXRlUmVzdWx0IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhcnRUaW1lID0gTWF0aC5taW4oZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZSwgY3VycmVudFN1aXRlUmVzdWx0LnN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lID0gTWF0aC5tYXgoZ3JvdXBlZFN1aXRlUmVzdWx0LmVuZFRpbWUsIGN1cnJlbnRTdWl0ZVJlc3VsdC5lbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LmR1cmF0aW9uID0gZ3JvdXBlZFN1aXRlUmVzdWx0LmVuZFRpbWUgLSBncm91cGVkU3VpdGVSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuY2FzZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5ncm91cGVkU3VpdGVSZXN1bHQuY2FzZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3VpdGVSZXN1bHQuY2FzZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWl0ZVJlc3VsdC5jYXNlcy5zb21lKGMgPT4gYy5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U3VpdGVSZXN1bHQuY2FzZXMuc29tZShjID0+IGMuc3RhdHVzID09PSBTdGF0dXMuV0FSTklORykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb252ZXJ0IGdyb3VwZWQgcmVzdWx0cyBoYXNoIHRvIGFuIGFycmF5XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHNMaXN0ID0gT2JqZWN0LmtleXMoZ3JvdXBlZFJlc3VsdHMpLm1hcChcclxuICAgICAgICAgICAgZ3JvdXBLZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW2dyb3VwS2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICghZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdWl0ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFJlc3VsdC5zdWl0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaCkubWFwKHN1aXRlR3JvdXBLZXkgPT4gZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtzdWl0ZUdyb3VwS2V5XSlcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZhaWxlZFN1aXRlID0gZ3JvdXBlZFJlc3VsdC5zdWl0ZXMuZmluZChzID0+IHMuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdEZhaWxlZFN1aXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZmFpbHVyZSA9IGZpcnN0RmFpbGVkU3VpdGUuZmFpbHVyZSB8fCBncm91cGVkUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN1aXRlV2l0aFdhcm5pbmcgPSBncm91cGVkUmVzdWx0LnN1aXRlcy5maW5kKHMgPT4gcy5zdGF0dXMgPT09IFN0YXR1cy5XQVJOSU5HKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RTdWl0ZVdpdGhXYXJuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhdHVzID0gU3RhdHVzLldBUk5JTkc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZmFpbHVyZSA9IGZpcnN0U3VpdGVXaXRoV2FybmluZy5mYWlsdXJlIHx8IGdyb3VwZWRSZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgZ3JvdXBlZFJlc3VsdFsnX3N1aXRlc0hhc2gnXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgcmVzdWx0cyA9IFsuLi5ncm91cGVkUmVzdWx0c0xpc3QsIC4uLnVuZ3JvdXBlZFJlc3VsdHNdO1xyXG4gICAgICAgIC8vIGNoYW5nZSByZXN1bHRzIHN0YXR1cyB0byBmYWlkZWQgaWYgZmFpbGVkIHN1aXRlcyBhcmUgZmluZGVkXHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMucmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMocmVzdWx0cyk7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhdGVSZXN1bHQocmVzdWx0cyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMocmVzdWx0cykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHJlc3VsdCAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcyAmJlxyXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQuc3VpdGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkID0gcmVzdWx0LnN1aXRlcy5maW5kKChzdWl0ZSkgPT4gc3VpdGUuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdWl0ZXMuZmluZCgoc3VpdGUpID0+IHN1aXRlLnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXRlUmVzdWx0KHJlc3VsdHMpIHtcclxuICAgICAgICBjb25zdCB1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMgPSBbXTtcclxuXHJcbiAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMuaW5jbHVkZXMoc3VpdGUuaXRlcmF0aW9uTnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybignc3VpdGUuaXRlcmF0aW9uTnVtJywgc3VpdGUuaXRlcmF0aW9uTnVtLCAnIG5vdCB1bmlxdWUnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzLnB1c2goc3VpdGUuaXRlcmF0aW9uTnVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NhdmVUZXN0Q2FzZVZpZGVvQXR0YWNobWVudChjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgaWYgKCFjYXNlUmVzdWx0IHx8ICFjYXNlUmVzdWx0LmF0dGFjaG1lbnRzIHx8ICFjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzVG9SZW1vdmUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpPTA7IGk8IGNhc2VSZXN1bHQuYXR0YWNobWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGNhc2VSZXN1bHQuYXR0YWNobWVudHNbaV07XHJcbiAgICAgICAgICAgIGlmICghYXR0YWNobWVudC5fdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmlkZW9GaWxlUGF0aCA9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb3h1dGlsLmRvd25sb2FkVmlkZW8oYXR0YWNobWVudC5maWxlTmFtZSwgYXR0YWNobWVudC5fdXJsLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2aWRlb0ZpbGVQYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHNUb1JlbW92ZS5wdXNoKGF0dGFjaG1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5maWxlUGF0aCA9IHZpZGVvRmlsZVBhdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF0dGFjaG1lbnRbJ191cmwnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZG93bmxvYWQgdmlkZW8gZmlsZTogJywgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzVG9SZW1vdmUucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZW1vdmUgdmlkZW8gYXR0YWNobWVudHMgdGhhdCBjb3VsZG4ndCBiZSBkb3dubG9hZGVkXHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPCBhdHRhY2htZW50c1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsbUluZGV4VG9SZW1vdmUgPSBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmluZGV4T2YoYXR0YWNobWVudHNUb1JlbW92ZVtpXSk7XHJcbiAgICAgICAgICAgIGlmICghZWxtSW5kZXhUb1JlbW92ZSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLnNwbGljZShlbG1JbmRleFRvUmVtb3ZlLCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==
578
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRBZ2dyZWdhdG9yLmpzIl0sIm5hbWVzIjpbIlJlcG9ydGVycyIsImpzb24iLCJKc29uUmVwb3J0ZXIiLCJqdW5pdCIsIkpVbml0UmVwb3J0ZXIiLCJodG1sIiwiSHRtbFJlcG9ydGVyIiwiZXhjZWwiLCJFeGNlbFJlcG9ydGVyIiwicGRmIiwiUGRmUmVwb3J0ZXIiLCJ4bWwiLCJYbWxSZXBvcnRlciIsInJwIiwiUmVwb3J0UG9ydGFsUmVwb3J0ZXIiLCJERUZBVUxUX1RFU1RfTkFNRSIsIkRFRkFVTFRfUkVQT1JURVJTIiwiUmVwb3J0QWdncmVnYXRvciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInJlc3VsdHMiLCJydW5uZXJFbmRQcm9taXNlcyIsImluc3RhbnRpYXRlUmVwb3J0ZXJzIiwiZ2V0RXhpdENvZGUiLCJleGl0Q29kZSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInRlc3RGYWlsZGVkIiwiZmluZCIsIml0ZW0iLCJzdGF0dXMiLCJyZXBvcnRlcnMiLCJnZW5lcmFsUmVwb3J0aW5nT3B0cyIsInJlcG9ydGluZyIsInJlcG9ydGVyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVwb3J0ZXJOYW1lIiwibmFtZSIsInJlcG9ydGVyT3B0cyIsInVuZGVmaW5lZCIsImVuYWJsZWQiLCJpbml0IiwidGhlbiIsInB1c2giLCJjYXRjaCIsImVyciIsImNvbnNvbGUiLCJsb2ciLCJtZXNzYWdlIiwiZ2V0UmVzdWx0cyIsImdlbmVyYXRlUmVwb3J0cyIsImdyb3VwZWRSZXN1bHRzIiwiZ3JvdXBSZXN1bHRzIiwicmVwb3J0UGF0aCIsImdlbmVyYXRlIiwiZSIsImVycm9yIiwid2FpdEZvclJlc3VsdCIsInJpZCIsIndhaXRGb3JSZXN1bHRzIiwiUHJvbWlzZSIsImFsbCIsIm9uUnVubmVyU3RhcnQiLCJvcHRzIiwiY2FwcyIsIkVycm9yIiwidGVzdFJlc3VsdCIsIlRlc3RSZXN1bHQiLCJzdGFydFRpbWUiLCJveHV0aWwiLCJnZXRUaW1lU3RhbXAiLCJjYXBhYmlsaXRpZXMiLCJlbnZpcm9ubWVudCIsImVudlZhcnMiLCJldmVudEFyZ3MiLCJlbWl0IiwiX2ludm9rZVJlcG9ydGVyc0hvb2siLCJvblJ1bm5lckVuZCIsImZpbmFsUmVzdWx0IiwiZmF0YWxFcnJvciIsIngiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJfZGV0ZXJtaW5lVGVzdFN0YXR1c0J5U3VpdGVzIiwiU3RhdHVzIiwiRkFJTEVEIiwiZmFpbHVyZSIsImVycm9ySGVscGVyIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIl9nZXRGaXJzdEZhaWx1cmUiLCJ0eXBlIiwibG9jYXRpb24iLCJ0b1VwcGVyQ2FzZSIsInJlc3VsdCIsInByb2Nlc3MiLCJuZXh0VGljayIsInJlc29sdmUiLCJoYXNGYWlsZWRTdWl0ZXMiLCJzdWl0ZXMiLCJzb21lIiwiaGFzV2FybmluZ1N1aXRlcyIsIldBUk5JTkciLCJhbGxTdWl0ZXNTa2lwcGVkIiwiZXZlcnkiLCJTS0lQUEVEIiwiUEFTU0VEIiwib25JdGVyYXRpb25TdGFydCIsIml0ZXJhdGlvbiIsInN0YXJ0IiwibXNnIiwib25Mb2dFbnRyeSIsIm9uSXRlcmF0aW9uRW5kIiwiaXRlcmF0aW9uTnVtIiwib25TdWl0ZVN0YXJ0Iiwic3VpdGVJZCIsInN1aXRlIiwib25TdWl0ZUVuZCIsInN1aXRlUmVzdWx0Iiwib25DYXNlU3RhcnQiLCJjYXNlSWQiLCJjYXNlRGVmIiwiY2FzZSIsIm9uQ2FzZUVuZCIsImNhc2VSZXN1bHQiLCJfc2F2ZVRlc3RDYXNlVmlkZW9BdHRhY2htZW50Iiwib25TdGVwU3RhcnQiLCJzdGVwIiwicm9vdFBhdGgiLCJmcmFtZXdvcmsiLCJmdWxsUGF0aCIsInBhdGgiLCJvblN0ZXBFbmQiLCJzdGVwUmVzdWx0IiwidGltZSIsImxldmVsIiwic3JjIiwic3RlcElkIiwiRGF0ZSIsIm5vdyIsImNhc2VzIiwic3RlcHMiLCJ1bmdyb3VwZWRSZXN1bHRzIiwiX2dyb3VwUmVzdWx0IiwicmVzdWx0S2V5Iiwic3VpdGVLZXkiLCJncm91cGVkUmVzdWx0IiwiTWF0aCIsIm1pbiIsIm1heCIsImN1cnJlbnRTdWl0ZVJlc3VsdCIsImdyb3VwS2V5IiwiZ3JvdXBlZFN1aXRlUmVzdWx0IiwiX3N1aXRlc0hhc2giLCJjIiwiZ3JvdXBlZFJlc3VsdHNMaXN0Iiwia2V5cyIsIm1hcCIsInN1aXRlR3JvdXBLZXkiLCJmaXJzdEZhaWxlZFN1aXRlIiwicyIsImZpcnN0U3VpdGVXaXRoV2FybmluZyIsInJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzIiwidmFsaWRhdGVSZXN1bHQiLCJmYWlsZWQiLCJ1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMiLCJpbmNsdWRlcyIsIndhcm4iLCJob29rTmFtZSIsImF0dGFjaG1lbnRzIiwiYXR0YWNobWVudHNUb1JlbW92ZSIsImkiLCJhdHRhY2htZW50IiwiX3VybCIsInZpZGVvRmlsZVBhdGgiLCJkb3dubG9hZFZpZGVvIiwiZmlsZU5hbWUiLCJmaWxlUGF0aCIsImVsbUluZGV4VG9SZW1vdmUiLCJpbmRleE9mIiwic3BsaWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFNBQVMsR0FBRztBQUNkQyxFQUFBQSxJQUFJLEVBQUVDLHFCQURRO0FBRWRDLEVBQUFBLEtBQUssRUFBRUMsc0JBRk87QUFHZEMsRUFBQUEsSUFBSSxFQUFFQyxxQkFIUTtBQUlkQyxFQUFBQSxLQUFLLEVBQUVDLHNCQUpPO0FBS2RDLEVBQUFBLEdBQUcsRUFBRUMsb0JBTFM7QUFNZEMsRUFBQUEsR0FBRyxFQUFFQyxvQkFOUztBQU9kQyxFQUFBQSxFQUFFLEVBQUVDO0FBUFUsQ0FBbEI7QUFVQSxNQUFNQyxpQkFBaUIsR0FBRyxhQUExQjtBQUNBLE1BQU1DLGlC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QXVCVSxPQUF2QixDQUErQlQsbUJBQW1CLENBQUNDLENBQUQsQ0FBbEQsQ0FBekI7O0FBQ0EsVUFBSSxDQUFDTyxnQkFBRCxHQUFvQixDQUFDLENBQXpCLEVBQTRCO0FBQ3hCdEQsUUFBQUEsVUFBVSxDQUFDNkMsV0FBWCxDQUF1QlcsTUFBdkIsQ0FBOEJGLGdCQUE5QixFQUFnRCxDQUFoRDtBQUNIO0FBQ0o7QUFDSjs7QUF0Z0JzRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogUmVwb3J0IGFnZ3JlZ2F0b3JcclxuICovXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgVGVzdFJlc3VsdCBmcm9tICcuLi9tb2RlbC90ZXN0LXJlc3VsdCc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gaW1wb3J0IGFsbCBidWlsdC1pbiByZXBvcnRlcnNcclxuaW1wb3J0IEpzb25SZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItanNvbic7XHJcbmltcG9ydCBKVW5pdFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1qdW5pdCc7XHJcbmltcG9ydCBIdG1sUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLWh0bWwnO1xyXG5pbXBvcnQgRXhjZWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItZXhjZWwnO1xyXG5pbXBvcnQgUGRmUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLXBkZic7XHJcbmltcG9ydCBYbWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sJztcclxuaW1wb3J0IFJlcG9ydFBvcnRhbFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1ycCc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi9tb2RlbC9zdGF0dXMnO1xyXG5cclxuY29uc3QgUmVwb3J0ZXJzID0ge1xyXG4gICAganNvbjogSnNvblJlcG9ydGVyLFxyXG4gICAganVuaXQ6IEpVbml0UmVwb3J0ZXIsXHJcbiAgICBodG1sOiBIdG1sUmVwb3J0ZXIsXHJcbiAgICBleGNlbDogRXhjZWxSZXBvcnRlcixcclxuICAgIHBkZjogUGRmUmVwb3J0ZXIsXHJcbiAgICB4bWw6IFhtbFJlcG9ydGVyLFxyXG4gICAgcnA6IFJlcG9ydFBvcnRhbFJlcG9ydGVyLFxyXG59O1xyXG5cclxuY29uc3QgREVGQVVMVF9URVNUX05BTUUgPSAnT3h5Z2VuIFRlc3QnO1xyXG5jb25zdCBERUZBVUxUX1JFUE9SVEVSUyA9IFtdO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0QWdncmVnYXRvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICAvLyByZXN1bHRzIGhhc2ggdGFibGUgYmFzZWQgb24gcnVubmVyIGlkIGtleVxyXG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xyXG4gICAgICAgIC8vIGEgaGFzaCBsaXN0IG9mIHJ1bm5lckVuZCBldmVudCBwcm9taXNlcywga2V5ZWQgYnkgcnVubmVyIGlkXHJcbiAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5pbnN0YW50aWF0ZVJlcG9ydGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEV4aXRDb2RlKCkge1xyXG4gICAgICAgIGxldCBleGl0Q29kZSA9IDA7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzICYmXHJcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSAmJlxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RmFpbGRlZCA9IHRoaXMucmVzdWx0cy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlc3RGYWlsZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBleGl0Q29kZSA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJyb2tlbiA/XHJcbiAgICAgICAgICAgIGV4aXRDb2RlID0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgaW5zdGFudGlhdGVSZXBvcnRlcnMoKSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlcnMgPSBbXTtcclxuICAgICAgICBjb25zdCBnZW5lcmFsUmVwb3J0aW5nT3B0cyA9IHRoaXMub3B0aW9ucy5yZXBvcnRpbmcgfHwge307XHJcbiAgICAgICAgZm9yIChsZXQgcmVwb3J0ZXIgb2YgZ2VuZXJhbFJlcG9ydGluZ09wdHMucmVwb3J0ZXJzIHx8IERFRkFVTFRfUkVQT1JURVJTKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwb3J0ZXIgIT09ICdzdHJpbmcnICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVwb3J0ZXIsICduYW1lJykpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSByZXBvcnRlcnMgdGhhdCBkbyBub3QgaGF2ZSAnbmFtZScgcHJvcGVydHkgYXMgaXQncyBlc3NlbnRpYWwgdG8gbG9hZCB0aGUgY29ycmVzcG9uZGluZyBSZXBvcnRlciBjbGFzc1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydGVyTmFtZSA9IHR5cGVvZiByZXBvcnRlciA9PT0gJ3N0cmluZycgPyByZXBvcnRlciA6IHJlcG9ydGVyLm5hbWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydGVyT3B0cyA9IHR5cGVvZiByZXBvcnRlciA9PT0gJ29iamVjdCcgPyByZXBvcnRlciA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUmVwb3J0ZXJzLCByZXBvcnRlck5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiByZXBvcnRlciBcImVuYWJsZWRcIiBwcm9wZXJ0eSBpcyBcImZhbHNlXCIgdGhlbiBza2lwIHRoZSByZXBvcnRlclxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydGVyT3B0cyAmJiB0eXBlb2YgcmVwb3J0ZXJPcHRzLmVuYWJsZWQgPT09ICdib29sZWFuJyAmJiAhcmVwb3J0ZXJPcHRzLmVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9ydGVyID0gbmV3IFJlcG9ydGVyc1tyZXBvcnRlck5hbWVdKHRoaXMub3B0aW9ucywgcmVwb3J0ZXJPcHRzLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXBvcnRlciBoYXMgXCJpbml0XCIgZnVuY3Rpb24sIHVzZSBpdCB0byBpbml0aWFsaXplIHRoZSByZXBvcnRlclxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydGVyLmluaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXBvcnRlci5pbml0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCk9PiB0aGlzLnJlcG9ydGVycy5wdXNoKHJlcG9ydGVyKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpPT4gY29uc29sZS5sb2coYEZhaWxlZCB0byBpbml0aWFsaXplIFwiJHtyZXBvcnRlck5hbWV9XCIgcmVwb3J0ZXI6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRlcnMucHVzaChyZXBvcnRlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVzdWx0cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdlbmVyYXRlUmVwb3J0cygpIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5yZXBvcnRlcnMpIHx8IHRoaXMucmVwb3J0ZXJzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHMgPSB0aGlzLmdyb3VwUmVzdWx0cygpO1xyXG4gICAgICAgIGZvciAobGV0IHJlcG9ydGVyIG9mIHRoaXMucmVwb3J0ZXJzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXBvcnRQYXRoID0gYXdhaXQgcmVwb3J0ZXIuZ2VuZXJhdGUoZ3JvdXBlZFJlc3VsdHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFBhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgWW91ciByZXBvcnQgaXMgcmVhZHk6ICR7cmVwb3J0UGF0aH1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVwb3J0IGdlbmVyYXRpb24gZmFpbGVkOiAke2UubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3YWl0Rm9yUmVzdWx0KHJpZCkge1xyXG4gICAgICAgIGlmICghcmlkIHx8ICF0aGlzLnJ1bm5lckVuZFByb21pc2VzW3JpZF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJ1bm5lckVuZFByb21pc2VzW3JpZF07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgd2FpdEZvclJlc3VsdHMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucnVubmVyRW5kUHJvbWlzZXMgJiYgdGhpcy5ydW5uZXJFbmRQcm9taXNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMucnVubmVyRW5kUHJvbWlzZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblJ1bm5lclN0YXJ0KHJpZCwgb3B0cywgY2Fwcykge1xyXG4gICAgICAgIGlmICghcmlkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCJyaWRcIiBjYW5ub3QgYmUgZW1wdHkuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpO1xyXG4gICAgICAgIHRlc3RSZXN1bHQucmlkID0gcmlkO1xyXG4gICAgICAgIHRlc3RSZXN1bHQubmFtZSA9IG9wdHMubmFtZSB8fCBERUZBVUxUX1RFU1RfTkFNRTtcclxuICAgICAgICB0ZXN0UmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICB0ZXN0UmVzdWx0LmNhcGFiaWxpdGllcyA9IGNhcHM7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5lbnZpcm9ubWVudCA9IG9wdHMuZW52VmFycyB8fCB7fTtcclxuICAgICAgICB0ZXN0UmVzdWx0Lm9wdGlvbnMgPSBvcHRzO1xyXG4gICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHRlc3RSZXN1bHQpO1xyXG4gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBwcm9taXNlIGZvciBsYXRlciB0byBiZSByZXNvbHZlZCBvbiBydW5uZXI6ZW5kIGV2ZW50XHJcbiAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdID0gZGVmZXIoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgVGVzdCAke3JpZH0gaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgb3B0cyxcclxuICAgICAgICAgICAgY2Fwc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdydW5uZXI6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uUnVubmVyU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uUnVubmVyRW5kKHJpZCwgZmluYWxSZXN1bHQsIGZhdGFsRXJyb3IpIHtcclxuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gdGhpcy5yZXN1bHRzLmZpbmQoeCA9PiB4LnJpZCA9PT0gcmlkKTtcclxuICAgICAgICBpZiAodGVzdFJlc3VsdCkge1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIHRlc3RSZXN1bHQuZHVyYXRpb24gPSB0ZXN0UmVzdWx0LmVuZFRpbWUgLSB0ZXN0UmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRlc3Qgc3RhdHVzIGJhc2VkIG9uIHN1aXRlcyBzdGF0dXNlc1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LnN0YXR1cyA9IHRoaXMuX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyh0ZXN0UmVzdWx0LCBmYXRhbEVycm9yKTtcclxuICAgICAgICAgICAgLy8gdGVzdFJlc3VsdC5zdGF0dXMgPSBmYXRhbEVycm9yID8gU3RhdHVzLkZBSUxFRCA6ICh0ZXN0UmVzdWx0LnN1aXRlcy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpKSA/IFN0YXR1cy5GQUlMRUQgOiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRoYXQgaWYgZmF0YWxFcnJvciBpcyBub3QgaW5oZXJpdGVkIGZyb20gRXJyb3IgY2xhc3MgdGhlbiB3ZSBhbHJlYWR5IGdvdCBPeHlnZW4gRmFpbHVyZSBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmZhaWx1cmUgPSBmYXRhbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGZhdGFsRXJyb3IpIDogZmF0YWxFcnJvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQuZmFpbHVyZSA9IHRoaXMuX2dldEZpcnN0RmFpbHVyZSh0ZXN0UmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgJiYgZmluYWxSZXN1bHQuY2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmNhcGFiaWxpdGllcyA9IGZpbmFsUmVzdWx0LmNhcGFiaWxpdGllcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlLnR5cGUgJiYgdGVzdFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke3Rlc3RSZXN1bHQuZmFpbHVyZS50eXBlfSBhdCAke3Rlc3RSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbn0uYCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke3Rlc3RSZXN1bHQuZmFpbHVyZS50eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGVzdFJlc3VsdC5mYWlsdXJlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmV9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFRlc3QgJHtyaWR9IGhhcyBmaW5pc2hlZCB3aXRoIHN0YXR1czogJHt0ZXN0UmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogdGVzdFJlc3VsdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgncnVubmVyOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25SdW5uZXJFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckVuZFByb21pc2VzW3JpZF0pIHtcclxuICAgICAgICAgICAgLy8gY2FsbGluZyBuZXh0VGljaygpIHdpbGwgaGVscCB1cyB0byBpbnN1cmUgdGhhdCB3ZSByZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIGVtaXQoJ3J1bm5lcjplbmQnKSBoYXMgY29tcGxldGVkXHJcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdLnJlc29sdmUodGVzdFJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfZGV0ZXJtaW5lVGVzdFN0YXR1c0J5U3VpdGVzKHRlc3RSZXN1bHQsIGZhdGFsRXJyb3IpIHtcclxuICAgICAgICBpZiAoZmF0YWxFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGVzID0gdGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICBpZiAoaGFzRmFpbGVkU3VpdGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBoYXNXYXJuaW5nU3VpdGVzID0gdGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuV0FSTklORyk7XHJcbiAgICAgICAgaWYgKGhhc1dhcm5pbmdTdWl0ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhbGxTdWl0ZXNTa2lwcGVkID0gdGVzdFJlc3VsdC5zdWl0ZXMuZXZlcnkoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLlNLSVBQRUQpO1xyXG4gICAgICAgIGlmIChhbGxTdWl0ZXNTa2lwcGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuU0tJUFBFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFN0YXR1cy5QQVNTRUQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25JdGVyYXRpb25TdGFydChyaWQsIGl0ZXJhdGlvbiwgc3RhcnQpIHtcclxuICAgICAgICBpZiAoaXRlcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3N0YXJ0fSBJdGVyYXRpb24gIyR7aXRlcmF0aW9ufSBzdGFydGVkLi4uYDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkxvZ0VudHJ5KG51bGwsICdJTkZPJywgbXNnLCAndXNlcicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkl0ZXJhdGlvbkVuZChyaWQsIHJlc3VsdCwgc3RhcnQpIHtcclxuICAgICAgICBpZiAocmVzdWx0Py5pdGVyYXRpb25OdW0gJiYgcmVzdWx0LnN0YXR1cz8udG9VcHBlckNhc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7c3RhcnR9IEl0ZXJhdGlvbiAjJHtyZXN1bHQuaXRlcmF0aW9uTnVtfSBlbmRlZCB3aXRoIHN0YXR1czogJHtyZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCl9LmA7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25Mb2dFbnRyeShudWxsLCAnSU5GTycsIG1zZywgJ3VzZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWl0ZVN0YXJ0KHJpZCwgc3VpdGVJZCwgc3VpdGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgU3VpdGUgXCIke3N1aXRlLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBsZXQgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQ6IHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHN1aXRlOiBzdWl0ZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc3VpdGU6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3VpdGVTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWl0ZUVuZChyaWQsIHN1aXRlSWQsIHN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IHRoaXMucmVzdWx0cy5maW5kKHggPT4geC5yaWQgPT09IHJpZCk7XHJcbiAgICAgICAgaWYgKCF0ZXN0UmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGVzdFJlc3VsdC5zdWl0ZXMucHVzaChzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFN1aXRlIFwiJHtzdWl0ZVJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCB3aXRoIHN0YXR1czogJHtzdWl0ZVJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogc3VpdGVSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N1aXRlOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25TdWl0ZUVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DYXNlU3RhcnQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIGNhc2VEZWYpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgLSBDYXNlIFwiJHtjYXNlRGVmLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBjYXNlOiBjYXNlRGVmLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjYXNlOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkNhc2VTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DYXNlRW5kKHJpZCwgc3VpdGVJZCwgY2FzZUlkLCBjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYC0gQ2FzZSBcIiR7Y2FzZVJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCB3aXRoIHN0YXR1czogJHtjYXNlUmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQoY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgcmVzdWx0OiBjYXNlUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjYXNlOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25DYXNlRW5kJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN0ZXBTdGFydChyaWQsIHN1aXRlSWQsIGNhc2VJZCwgc3RlcCkge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coYCAgLSBTdGVwIFwiJHtzdGVwLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5yb290UGF0aCAmJiB0aGlzLm9wdGlvbnMuZnJhbWV3b3JrICYmIHRoaXMub3B0aW9ucy5mcmFtZXdvcmsgPT09ICdjdWN1bWJlcicpIHtcclxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLnJvb3RQYXRoLCBzdGVwLmxvY2F0aW9uKTtcclxuICAgICAgICAgICAgc3RlcC5sb2NhdGlvbiA9IGZ1bGxQYXRoKyc6MSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXA6IHN0ZXAsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0ZXA6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3RlcFN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN0ZXBFbmQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBSZXN1bHQpIHtcclxuICAgICAgICAvL2NvbnN0IHN0YXR1cyA9IHN0ZXBSZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgLy9jb25zdCBkdXJhdGlvbiA9IHN0ZXBSZXN1bHQuZHVyYXRpb24gPyAoc3RlcFJlc3VsdC5kdXJhdGlvbiAvIDEwMDApLnRvRml4ZWQoMikgOiAwO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coYCAgLSBTdGVwIFwiJHtzdGVwUmVzdWx0Lm5hbWV9XCIgaGFzIGVuZGVkIGluICR7ZHVyYXRpb259cyB3aXRoIHN0YXR1czogJHtzdGF0dXN9LmApO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXA6IHN0ZXBSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0ZXA6ZW5kJywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN0ZXBFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uTG9nRW50cnkodGltZSwgbGV2ZWwsIG1zZywgc3JjID0gbnVsbCwgeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCB9ID0ge30pIHtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgc3RlcElkLFxyXG4gICAgICAgICAgICBsZXZlbCxcclxuICAgICAgICAgICAgbXNnLFxyXG4gICAgICAgICAgICB0aW1lLFxyXG4gICAgICAgICAgICBzcmNcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnbG9nJywgZXZlbnRBcmdzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aW1lKSB7XHJcbiAgICAgICAgICAgIGV2ZW50QXJncy50aW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uTG9nJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGZhaWx1cmUgb2JqZWN0IGluIG9uZSBvZiB0ZXN0IHJlc3VsdCdzIGVudGl0aWVzLiBcclxuICAgICAqIEBwYXJhbSB7VGVzdFJlc3VsdH0gdGVzdFJlc3VsdCBcclxuICAgICAqL1xyXG4gICAgX2dldEZpcnN0RmFpbHVyZSh0ZXN0UmVzdWx0KSB7XHJcbiAgICAgICAgaWYgKHRlc3RSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZXN0UmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0UmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgc3VpdGVSZXN1bHQgb2YgdGVzdFJlc3VsdC5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYXNlUmVzdWx0IG9mIHN1aXRlUmVzdWx0LmNhc2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1aXRlUmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FzZVJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdGVwUmVzdWx0IG9mIGNhc2VSZXN1bHQuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcFJlc3VsdC5mYWlsdXJlIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwUmVzdWx0cygpIHtcclxuICAgICAgICBjb25zdCBncm91cGVkUmVzdWx0cyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHVuZ3JvdXBlZFJlc3VsdHMgPSBbXTtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSB8fCB0aGlzLnJlc3VsdHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXN1bHQgb2YgdGhpcy5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0IHx8ICFyZXN1bHQub3B0aW9ucy5fZ3JvdXBSZXN1bHQucmVzdWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICB1bmdyb3VwZWRSZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEtleSA9IHJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdC5yZXN1bHRLZXk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1aXRlS2V5ID0gcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0LnN1aXRlS2V5O1xyXG4gICAgICAgICAgICBsZXQgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW3Jlc3VsdEtleV07XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXBlZFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW3Jlc3VsdEtleV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlczogW10sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1aXRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdFsnX3N1aXRlc0hhc2gnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWUgPSBNYXRoLm1pbihncm91cGVkUmVzdWx0LnN0YXJ0VGltZSwgcmVzdWx0LnN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmVuZFRpbWUgPSBNYXRoLm1heChncm91cGVkUmVzdWx0LmVuZFRpbWUsIHJlc3VsdC5lbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZHVyYXRpb24gPSBncm91cGVkUmVzdWx0LmVuZFRpbWUgLSBncm91cGVkUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBncm91cGluZyBpcyBieSByZXN1bHQgb25seSwgdGhlbiBqdXN0IGFwcGVuZCBjdXJyZW50IHJlc3VsdCdzIHN1aXRlcyB0byB0aGUgZ3JvdXAncyBzdWl0ZXNcclxuICAgICAgICAgICAgaWYgKCFzdWl0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdWl0ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFJlc3VsdC5zdWl0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LnN1aXRlc1xyXG4gICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudFN1aXRlUmVzdWx0IG9mIHJlc3VsdC5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cEtleSA9IGAke3N1aXRlS2V5fS0ke2N1cnJlbnRTdWl0ZVJlc3VsdC5pdGVyYXRpb25OdW19YDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cGVkU3VpdGVSZXN1bHQgPSBncm91cGVkUmVzdWx0Ll9zdWl0ZXNIYXNoW2dyb3VwS2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyb3VwZWRTdWl0ZVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0Ll9zdWl0ZXNIYXNoW2dyb3VwS2V5XSA9IHsgLi4uY3VycmVudFN1aXRlUmVzdWx0IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhcnRUaW1lID0gTWF0aC5taW4oZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZSwgY3VycmVudFN1aXRlUmVzdWx0LnN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lID0gTWF0aC5tYXgoZ3JvdXBlZFN1aXRlUmVzdWx0LmVuZFRpbWUsIGN1cnJlbnRTdWl0ZVJlc3VsdC5lbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LmR1cmF0aW9uID0gZ3JvdXBlZFN1aXRlUmVzdWx0LmVuZFRpbWUgLSBncm91cGVkU3VpdGVSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuY2FzZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5ncm91cGVkU3VpdGVSZXN1bHQuY2FzZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3VpdGVSZXN1bHQuY2FzZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWl0ZVJlc3VsdC5jYXNlcy5zb21lKGMgPT4gYy5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U3VpdGVSZXN1bHQuY2FzZXMuc29tZShjID0+IGMuc3RhdHVzID09PSBTdGF0dXMuV0FSTklORykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb252ZXJ0IGdyb3VwZWQgcmVzdWx0cyBoYXNoIHRvIGFuIGFycmF5XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHNMaXN0ID0gT2JqZWN0LmtleXMoZ3JvdXBlZFJlc3VsdHMpLm1hcChcclxuICAgICAgICAgICAgZ3JvdXBLZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW2dyb3VwS2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICghZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdWl0ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFJlc3VsdC5zdWl0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaCkubWFwKHN1aXRlR3JvdXBLZXkgPT4gZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtzdWl0ZUdyb3VwS2V5XSlcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZhaWxlZFN1aXRlID0gZ3JvdXBlZFJlc3VsdC5zdWl0ZXMuZmluZChzID0+IHMuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdEZhaWxlZFN1aXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZmFpbHVyZSA9IGZpcnN0RmFpbGVkU3VpdGUuZmFpbHVyZSB8fCBncm91cGVkUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN1aXRlV2l0aFdhcm5pbmcgPSBncm91cGVkUmVzdWx0LnN1aXRlcy5maW5kKHMgPT4gcy5zdGF0dXMgPT09IFN0YXR1cy5XQVJOSU5HKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RTdWl0ZVdpdGhXYXJuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhdHVzID0gU3RhdHVzLldBUk5JTkc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZmFpbHVyZSA9IGZpcnN0U3VpdGVXaXRoV2FybmluZy5mYWlsdXJlIHx8IGdyb3VwZWRSZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgZ3JvdXBlZFJlc3VsdFsnX3N1aXRlc0hhc2gnXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgcmVzdWx0cyA9IFsuLi5ncm91cGVkUmVzdWx0c0xpc3QsIC4uLnVuZ3JvdXBlZFJlc3VsdHNdO1xyXG4gICAgICAgIC8vIGNoYW5nZSByZXN1bHRzIHN0YXR1cyB0byBmYWlkZWQgaWYgZmFpbGVkIHN1aXRlcyBhcmUgZmluZGVkXHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMucmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMocmVzdWx0cyk7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhdGVSZXN1bHQocmVzdWx0cyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMocmVzdWx0cykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHJlc3VsdCAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcyAmJlxyXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQuc3VpdGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkID0gcmVzdWx0LnN1aXRlcy5maW5kKChzdWl0ZSkgPT4gc3VpdGUuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdWl0ZXMuZmluZCgoc3VpdGUpID0+IHN1aXRlLnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXRlUmVzdWx0KHJlc3VsdHMpIHtcclxuICAgICAgICBjb25zdCB1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMgPSBbXTtcclxuXHJcbiAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMuaW5jbHVkZXMoc3VpdGUuaXRlcmF0aW9uTnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybignc3VpdGUuaXRlcmF0aW9uTnVtJywgc3VpdGUuaXRlcmF0aW9uTnVtLCAnIG5vdCB1bmlxdWUnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzLnB1c2goc3VpdGUuaXRlcmF0aW9uTnVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2ludm9rZVJlcG9ydGVyc0hvb2soaG9va05hbWUsIGV2ZW50QXJncykge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnJlcG9ydGVycykgfHwgdGhpcy5yZXBvcnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiB0aGlzLnJlcG9ydGVycykge1xyXG4gICAgICAgICAgICBpZiAocmVwb3J0ZXJbaG9va05hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcG9ydGVyW2hvb2tOYW1lXShldmVudEFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBpbnZva2UgcmVwb3J0ZXIgaG9vayBcIiR7aG9va05hbWV9XCI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQoY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGlmICghY2FzZVJlc3VsdCB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cyB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50c1RvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPCBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIWF0dGFjaG1lbnQuX3VybCkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRmlsZVBhdGggPVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG94dXRpbC5kb3dubG9hZFZpZGVvKGF0dGFjaG1lbnQuZmlsZU5hbWUsIGF0dGFjaG1lbnQuX3VybCwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmlkZW9GaWxlUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzVG9SZW1vdmUucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZmlsZVBhdGggPSB2aWRlb0ZpbGVQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHRhY2htZW50WydfdXJsJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGRvd25sb2FkIHZpZGVvIGZpbGU6ICcsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50c1RvUmVtb3ZlLnB1c2goYXR0YWNobWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVtb3ZlIHZpZGVvIGF0dGFjaG1lbnRzIHRoYXQgY291bGRuJ3QgYmUgZG93bmxvYWRlZFxyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTwgYXR0YWNobWVudHNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbG1JbmRleFRvUmVtb3ZlID0gY2FzZVJlc3VsdC5hdHRhY2htZW50cy5pbmRleE9mKGF0dGFjaG1lbnRzVG9SZW1vdmVbaV0pO1xyXG4gICAgICAgICAgICBpZiAoIWVsbUluZGV4VG9SZW1vdmUgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5hdHRhY2htZW50cy5zcGxpY2UoZWxtSW5kZXhUb1JlbW92ZSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
@@ -8,7 +8,7 @@ exports.default = void 0;
8
8
  require("source-map-support/register");
9
9
 
10
10
  class ReporterBase {
11
- constructor(options) {
11
+ constructor(options, aggregator) {
12
12
  this.options = options;
13
13
  }
14
14
 
@@ -19,4 +19,4 @@ class ReporterBase {
19
19
  }
20
20
 
21
21
  exports.default = ReporterBase;
22
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRlckJhc2UuanMiXSwibmFtZXMiOlsiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiZ2VuZXJhdGUiLCJyZXN1bHRzIiwiRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVllLE1BQU1BLFlBQU4sQ0FBbUI7QUFDOUJDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVO0FBQ2pCLFNBQUtBLE9BQUwsR0FBZUEsT0FBZjtBQUNIOztBQUNEQyxFQUFBQSxRQUFRLENBQUNDLE9BQUQsRUFBVTtBQUNkLFVBQU0sSUFBSUMsS0FBSixDQUFVLHdDQUFWLENBQU47QUFDSDs7QUFONkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIE94eWdlbiBSZXBvcnRlciBhYnN0cmFjdCBjbGFzc1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0ZXJCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgfVxyXG4gICAgZ2VuZXJhdGUocmVzdWx0cykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgY2xhc3MsIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxufVxyXG4iXX0=
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRlckJhc2UuanMiXSwibmFtZXMiOlsiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiYWdncmVnYXRvciIsImdlbmVyYXRlIiwicmVzdWx0cyIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZZSxNQUFNQSxZQUFOLENBQW1CO0FBQzlCQyxFQUFBQSxXQUFXLENBQUNDLE9BQUQsRUFBVUMsVUFBVixFQUFzQjtBQUM3QixTQUFLRCxPQUFMLEdBQWVBLE9BQWY7QUFDSDs7QUFDREUsRUFBQUEsUUFBUSxDQUFDQyxPQUFELEVBQVU7QUFDZCxVQUFNLElBQUlDLEtBQUosQ0FBVSx3Q0FBVixDQUFOO0FBQ0g7O0FBTjZCIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKlxyXG4gKiBPeHlnZW4gUmVwb3J0ZXIgYWJzdHJhY3QgY2xhc3NcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydGVyQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBhZ2dyZWdhdG9yKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIH1cclxuICAgIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fic3RyYWN0IGNsYXNzLCBtZXRob2Qgbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbn1cclxuIl19