@appium/base-driver 8.1.1 → 8.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/build/lib/basedriver/capabilities.js +6 -6
  2. package/build/lib/basedriver/commands/find.js +1 -1
  3. package/build/lib/basedriver/commands/index.js +2 -4
  4. package/build/lib/basedriver/commands/log.js +1 -1
  5. package/build/lib/basedriver/commands/session.js +1 -1
  6. package/build/lib/basedriver/commands/timeout.js +1 -1
  7. package/build/lib/basedriver/desired-caps.js +1 -1
  8. package/build/lib/basedriver/device-settings.js +1 -1
  9. package/build/lib/basedriver/driver.js +5 -7
  10. package/build/lib/basedriver/helpers.js +5 -3
  11. package/build/lib/constants.js +1 -1
  12. package/build/lib/express/crash.js +1 -1
  13. package/build/lib/express/middleware.js +3 -3
  14. package/build/lib/express/server.js +1 -1
  15. package/build/lib/express/static.js +2 -2
  16. package/build/lib/express/websocket.js +3 -3
  17. package/build/lib/index.js +124 -0
  18. package/build/lib/jsonwp-status/status.js +1 -1
  19. package/build/lib/protocol/errors.js +6 -5
  20. package/build/lib/protocol/helpers.js +3 -3
  21. package/build/lib/protocol/index.js +31 -19
  22. package/build/lib/protocol/protocol.js +22 -11
  23. package/build/lib/protocol/routes.js +6 -12
  24. package/build/test/basedriver/capability-specs.js +10 -10
  25. package/build/test/basedriver/commands/event-specs.js +10 -10
  26. package/build/test/basedriver/driver-e2e-specs.js +3 -3
  27. package/build/test/basedriver/driver-e2e-tests.js +53 -256
  28. package/build/test/basedriver/driver-specs.js +3 -3
  29. package/build/test/basedriver/driver-tests.js +6 -6
  30. package/build/test/basedriver/helpers-e2e-specs.js +10 -4
  31. package/build/test/basedriver/index.js +4 -4
  32. package/build/test/basedriver/timeout-specs.js +7 -7
  33. package/build/test/basedriver/websockets-e2e-specs.js +11 -11
  34. package/build/test/express/server-e2e-specs.js +156 -0
  35. package/build/test/express/server-specs.js +151 -0
  36. package/build/test/express/static-specs.js +23 -0
  37. package/build/test/helpers.js +57 -0
  38. package/build/test/jsonwp-proxy/mock-request.js +93 -0
  39. package/build/test/jsonwp-proxy/protocol-converter-specs.js +173 -0
  40. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +62 -0
  41. package/build/test/jsonwp-proxy/proxy-specs.js +299 -0
  42. package/build/test/jsonwp-proxy/url-specs.js +167 -0
  43. package/build/test/jsonwp-status/status-specs.js +36 -0
  44. package/build/test/protocol/errors-specs.js +388 -0
  45. package/build/test/protocol/fake-driver.js +168 -0
  46. package/build/test/protocol/helpers.js +27 -0
  47. package/build/test/protocol/protocol-e2e-specs.js +1242 -0
  48. package/build/test/protocol/routes-specs.js +82 -0
  49. package/build/test/protocol/validator-specs.js +151 -0
  50. package/index.d.ts +309 -44
  51. package/index.js +1 -62
  52. package/lib/basedriver/commands/index.js +0 -2
  53. package/lib/basedriver/driver.js +2 -22
  54. package/lib/basedriver/helpers.js +5 -4
  55. package/lib/index.js +62 -0
  56. package/lib/protocol/index.js +3 -1
  57. package/lib/protocol/protocol.js +18 -7
  58. package/lib/protocol/routes.js +1 -4
  59. package/package.json +8 -16
  60. package/test/basedriver/capability-specs.js +1 -1
  61. package/test/basedriver/commands/event-specs.js +1 -1
  62. package/test/basedriver/driver-e2e-specs.js +1 -1
  63. package/test/basedriver/driver-e2e-tests.js +66 -213
  64. package/test/basedriver/driver-specs.js +1 -1
  65. package/test/basedriver/driver-tests.js +3 -3
  66. package/test/basedriver/helpers-e2e-specs.js +9 -4
  67. package/test/basedriver/timeout-specs.js +1 -1
  68. package/test/basedriver/websockets-e2e-specs.js +7 -7
  69. package/build/index.js +0 -118
  70. package/build/lib/basedriver/commands/execute-child.js +0 -137
  71. package/build/lib/basedriver/commands/execute.js +0 -119
  72. package/build/test/basedriver/fixtures/custom-element-finder-bad.js +0 -12
  73. package/build/test/basedriver/fixtures/custom-element-finder.js +0 -36
  74. package/lib/basedriver/commands/execute-child.js +0 -132
  75. package/lib/basedriver/commands/execute.js +0 -126
@@ -11,30 +11,36 @@ require("source-map-support/register");
11
11
 
12
12
  var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
- var _2 = require("../..");
15
-
16
- var _constants = require("../../lib/constants");
14
+ var _lib = require("../../lib");
17
15
 
18
16
  var _axios = _interopRequireDefault(require("axios"));
19
17
 
20
18
  var _bluebird = _interopRequireDefault(require("bluebird"));
21
19
 
22
- var _getPort = _interopRequireDefault(require("get-port"));
20
+ var _helpers = require("../helpers");
23
21
 
24
22
  var _capabilities = require("../../lib/basedriver/capabilities");
25
23
 
24
+ const {
25
+ POST,
26
+ DELETE
27
+ } = _helpers.METHODS;
28
+
26
29
  function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
27
30
  var _defaultCaps$appiumA;
28
31
 
29
- let address = (_defaultCaps$appiumA = defaultCaps['appium:address']) !== null && _defaultCaps$appiumA !== void 0 ? _defaultCaps$appiumA : '127.0.0.1';
32
+ let address = (_defaultCaps$appiumA = defaultCaps['appium:address']) !== null && _defaultCaps$appiumA !== void 0 ? _defaultCaps$appiumA : _helpers.TEST_HOST;
30
33
  let port = defaultCaps['appium:port'];
31
34
  const className = DriverClass.name || '(unknown driver)';
32
35
  describe(`BaseDriver E2E (as ${className})`, function () {
33
36
  let baseServer, d;
37
+ let newSessionURL;
38
+ let createAppiumTestURL;
39
+ let createSessionURL;
34
40
  before(async function () {
35
41
  var _port;
36
42
 
37
- port = (_port = port) !== null && _port !== void 0 ? _port : await (0, _getPort.default)();
43
+ port = (_port = port) !== null && _port !== void 0 ? _port : await (0, _helpers.getTestPort)();
38
44
  defaultCaps = { ...defaultCaps,
39
45
  'appium:port': port
40
46
  };
@@ -42,10 +48,14 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
42
48
  port,
43
49
  address
44
50
  });
45
- baseServer = await (0, _2.server)({
46
- routeConfiguringFunction: (0, _2.routeConfiguringFunction)(d),
47
- port
51
+ baseServer = await (0, _lib.server)({
52
+ routeConfiguringFunction: (0, _lib.routeConfiguringFunction)(d),
53
+ port,
54
+ hostname: _helpers.TEST_HOST
48
55
  });
56
+ createAppiumTestURL = (0, _helpers.createAppiumURL)(address, port);
57
+ newSessionURL = createAppiumTestURL('', 'session');
58
+ createSessionURL = createAppiumTestURL(_lodash.default, '');
49
59
  });
50
60
  after(async function () {
51
61
  await baseServer.close();
@@ -53,8 +63,8 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
53
63
 
54
64
  async function startSession(caps) {
55
65
  return (await (0, _axios.default)({
56
- url: `http://${address}:${port}/session`,
57
- method: 'POST',
66
+ url: newSessionURL,
67
+ method: POST,
58
68
  data: {
59
69
  capabilities: {
60
70
  alwaysMatch: caps,
@@ -66,15 +76,15 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
66
76
 
67
77
  async function endSession(id) {
68
78
  return (await (0, _axios.default)({
69
- url: `http://${address}:${port}/session/${id}`,
70
- method: 'DELETE',
79
+ url: createSessionURL(id),
80
+ method: DELETE,
71
81
  validateStatus: null
72
82
  })).data.value;
73
83
  }
74
84
 
75
85
  async function getSession(id) {
76
86
  return (await (0, _axios.default)({
77
- url: `http://${address}:${port}/session/${id}`
87
+ url: createSessionURL(id)
78
88
  })).data.value;
79
89
  }
80
90
 
@@ -87,11 +97,11 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
87
97
  const {
88
98
  sessionId
89
99
  } = (await (0, _axios.default)({
90
- url: `http://${address}:${port}/session`,
100
+ url: newSessionURL,
91
101
  headers: {
92
102
  'X-Idempotency-Key': '123456'
93
103
  },
94
- method: 'POST',
104
+ method: POST,
95
105
  data: {
96
106
  capabilities: {
97
107
  alwaysMatch: defaultCaps,
@@ -111,8 +121,8 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
111
121
  status,
112
122
  data
113
123
  } = await (0, _axios.default)({
114
- url: `http://${address}:${port}/session/${sessionIds[0]}`,
115
- method: 'DELETE'
124
+ url: createSessionURL(sessionIds[0]),
125
+ method: DELETE
116
126
  });
117
127
  status.should.equal(200);
118
128
  should.equal(data.value, null);
@@ -123,11 +133,11 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
123
133
 
124
134
  do {
125
135
  reqs.push((0, _axios.default)({
126
- url: `http://${address}:${port}/session`,
136
+ url: newSessionURL,
127
137
  headers: {
128
138
  'X-Idempotency-Key': '12345'
129
139
  },
130
- method: 'POST',
140
+ method: POST,
131
141
  data: {
132
142
  capabilities: {
133
143
  alwaysMatch: defaultCaps,
@@ -146,8 +156,8 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
146
156
  status,
147
157
  data
148
158
  } = await (0, _axios.default)({
149
- url: `http://${address}:${port}/session/${sessionIds[0]}`,
150
- method: 'DELETE'
159
+ url: createSessionURL(sessionIds[0]),
160
+ method: DELETE
151
161
  });
152
162
  status.should.equal(200);
153
163
  should.equal(data.value, null);
@@ -157,8 +167,8 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
157
167
  status,
158
168
  data
159
169
  } = await (0, _axios.default)({
160
- url: `http://${address}:${port}/session`,
161
- method: 'POST',
170
+ url: newSessionURL,
171
+ method: POST,
162
172
  data: {
163
173
  capabilities: {
164
174
  alwaysMatch: defaultCaps,
@@ -174,8 +184,8 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
174
184
  status,
175
185
  data
176
186
  } = await (0, _axios.default)({
177
- url: `http://${address}:${port}/session/${d.sessionId}`,
178
- method: 'DELETE'
187
+ url: createSessionURL(d.sessionId),
188
+ method: DELETE
179
189
  }));
180
190
  status.should.equal(200);
181
191
  should.equal(data.value, null);
@@ -218,9 +228,10 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
218
228
  });
219
229
  it('should timeout on commands using commandTimeout cap', async function () {
220
230
  let newSession = await startTimeoutSession(0.25);
231
+ let sessionURL = createSessionURL(d.sessionId);
221
232
  await (0, _axios.default)({
222
- url: `http://${address}:${port}/session/${d.sessionId}/element`,
223
- method: 'POST',
233
+ url: createAppiumTestURL(d.sessionId, 'element'),
234
+ method: POST,
224
235
  data: {
225
236
  using: 'name',
226
237
  value: 'foo'
@@ -230,7 +241,7 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
230
241
  const {
231
242
  data
232
243
  } = await (0, _axios.default)({
233
- url: `http://${address}:${port}/session/${d.sessionId}`,
244
+ url: sessionURL,
234
245
  validateStatus: null
235
246
  });
236
247
  should.equal(data.value.error, 'invalid session id');
@@ -244,8 +255,8 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
244
255
  const {
245
256
  value
246
257
  } = (await (0, _axios.default)({
247
- url: `http://${address}:${port}/session/${d.sessionId}/elements`,
248
- method: 'POST',
258
+ url: createAppiumTestURL(d.sessionId, 'elements'),
259
+ method: POST,
249
260
  data: {
250
261
  using: 'name',
251
262
  value: 'foo'
@@ -259,8 +270,8 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
259
270
  d.newCommandTimeoutMs = 2;
260
271
  let newSession = await startTimeoutSession(0);
261
272
  await (0, _axios.default)({
262
- url: `http://${address}:${port}/session/${d.sessionId}/element`,
263
- method: 'POST',
273
+ url: createAppiumTestURL(d.sessionId, 'element'),
274
+ method: POST,
264
275
  data: {
265
276
  using: 'name',
266
277
  value: 'foo'
@@ -270,7 +281,7 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
270
281
  const {
271
282
  value
272
283
  } = (await (0, _axios.default)({
273
- url: `http://${address}:${port}/session/${d.sessionId}`
284
+ url: createSessionURL(d.sessionId)
274
285
  })).data;
275
286
  value.platformName.should.equal(defaultCaps.platformName);
276
287
  const resp = await endSession(newSession.sessionId);
@@ -279,9 +290,10 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
279
290
  });
280
291
  it('should not timeout if its just the command taking awhile', async function () {
281
292
  let newSession = await startTimeoutSession(0.25);
293
+ let sessionURL = createSessionURL(d.sessionId);
282
294
  await (0, _axios.default)({
283
- url: `http://${address}:${port}/session/${d.sessionId}/element`,
284
- method: 'POST',
295
+ url: createAppiumTestURL(d.sessionId, 'element'),
296
+ method: POST,
285
297
  data: {
286
298
  using: 'name',
287
299
  value: 'foo'
@@ -291,7 +303,7 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
291
303
  const {
292
304
  value
293
305
  } = (await (0, _axios.default)({
294
- url: `http://${address}:${port}/session/${d.sessionId}`,
306
+ url: sessionURL,
295
307
  validateStatus: null
296
308
  })).data;
297
309
  value.error.should.equal('invalid session id');
@@ -310,7 +322,7 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
310
322
  });
311
323
  describe('settings api', function () {
312
324
  before(function () {
313
- d.settings = new _2.DeviceSettings({
325
+ d.settings = new _lib.DeviceSettings({
314
326
  ignoreUnimportantViews: false
315
327
  });
316
328
  });
@@ -336,7 +348,7 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
336
348
  }.bind(d);
337
349
 
338
350
  const reqPromise = (0, _axios.default)({
339
- url: `http://${address}:${port}/status`,
351
+ url: createAppiumTestURL('', 'status'),
340
352
  validateStatus: null
341
353
  });
342
354
  await _bluebird.default.delay(100);
@@ -376,223 +388,8 @@ function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
376
388
  await endSession(session.sessionId);
377
389
  });
378
390
  });
379
- describe('execute driver script', function () {
380
- let originalFindElement, sessionId;
381
- before(function () {
382
- d.allowInsecure = ['execute_driver_script'];
383
- originalFindElement = d.findElement;
384
-
385
- d.findElement = function (strategy, selector) {
386
- if (strategy === 'accessibility id' && selector === 'amazing') {
387
- return {
388
- [_constants.W3C_ELEMENT_KEY]: 'element-id-1'
389
- };
390
- }
391
-
392
- throw new _2.errors.NoSuchElementError('not found');
393
- }.bind(d);
394
- });
395
- beforeEach(async function () {
396
- ({
397
- sessionId
398
- } = await startSession(defaultCaps));
399
- });
400
- after(function () {
401
- d.findElement = originalFindElement;
402
- });
403
- afterEach(async function () {
404
- await endSession(sessionId);
405
- });
406
- it('should not work unless the allowInsecure feature flag is set', async function () {
407
- d._allowInsecure = d.allowInsecure;
408
-
409
- try {
410
- d.allowInsecure = [];
411
- const script = `return 'foo'`;
412
- await (0, _axios.default)({
413
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
414
- method: 'POST',
415
- data: {
416
- script,
417
- type: 'wd'
418
- }
419
- }).should.eventually.be.rejected;
420
- await endSession(sessionId);
421
- } finally {
422
- d.allowInsecure = d._allowInsecure;
423
- }
424
- });
425
- it('should execute a webdriverio script in the context of session', async function () {
426
- const script = `
427
- const timeouts = await driver.getTimeouts();
428
- const status = await driver.status();
429
- return [timeouts, status];
430
- `;
431
- const {
432
- value
433
- } = (await (0, _axios.default)({
434
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
435
- method: 'POST',
436
- data: {
437
- script,
438
- type: 'webdriverio'
439
- }
440
- })).data;
441
- const expectedTimeouts = {
442
- command: 250,
443
- implicit: 0
444
- };
445
- const expectedStatus = {};
446
- value.result.should.eql([expectedTimeouts, expectedStatus]);
447
- });
448
- it('should fail with any script type other than webdriverio currently', async function () {
449
- const script = `return 'foo'`;
450
- await (0, _axios.default)({
451
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
452
- method: 'POST',
453
- data: {
454
- script,
455
- type: 'wd'
456
- }
457
- }).should.eventually.be.rejected;
458
- });
459
- it('should execute a webdriverio script that returns elements correctly', async function () {
460
- const script = `
461
- return await driver.$("~amazing");
462
- `;
463
- const {
464
- value
465
- } = (await (0, _axios.default)({
466
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
467
- method: 'POST',
468
- data: {
469
- script
470
- }
471
- })).data;
472
- value.result.should.eql({
473
- [_constants.W3C_ELEMENT_KEY]: 'element-id-1',
474
- [_constants.MJSONWP_ELEMENT_KEY]: 'element-id-1'
475
- });
476
- });
477
- it('should execute a webdriverio script that returns elements in deep structure', async function () {
478
- const script = `
479
- const el = await driver.$("~amazing");
480
- return {element: el, elements: [el, el]};
481
- `;
482
- const {
483
- value
484
- } = (await (0, _axios.default)({
485
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
486
- method: 'POST',
487
- data: {
488
- script
489
- }
490
- })).data;
491
- const elObj = {
492
- [_constants.W3C_ELEMENT_KEY]: 'element-id-1',
493
- [_constants.MJSONWP_ELEMENT_KEY]: 'element-id-1'
494
- };
495
- value.result.should.eql({
496
- element: elObj,
497
- elements: [elObj, elObj]
498
- });
499
- });
500
- it('should store and return logs to the user', async function () {
501
- const script = `
502
- console.log("foo");
503
- console.log("foo2");
504
- console.warn("bar");
505
- console.error("baz");
506
- return null;
507
- `;
508
- const {
509
- value
510
- } = (await (0, _axios.default)({
511
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
512
- method: 'POST',
513
- data: {
514
- script
515
- }
516
- })).data;
517
- value.logs.should.eql({
518
- log: ['foo', 'foo2'],
519
- warn: ['bar'],
520
- error: ['baz']
521
- });
522
- });
523
- it('should have appium specific commands available', async function () {
524
- const script = `
525
- return typeof driver.lock;
526
- `;
527
- const {
528
- value
529
- } = (await (0, _axios.default)({
530
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
531
- method: 'POST',
532
- data: {
533
- script
534
- }
535
- })).data;
536
- value.result.should.eql('function');
537
- });
538
- it('should correctly handle errors that happen in a webdriverio script', async function () {
539
- const script = `
540
- return await driver.$("~notfound");
541
- `;
542
- const {
543
- data
544
- } = await (0, _axios.default)({
545
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
546
- method: 'POST',
547
- validateStatus: null,
548
- data: {
549
- script
550
- }
551
- });
552
- data.value.result.error.error.should.equal('no such element');
553
- data.value.result.error.message.should.equal('not found');
554
- data.value.result.error.stacktrace.should.includes('NoSuchElementError:');
555
- data.value.result.selector.should.equal('~notfound');
556
- data.value.result.sessionId.should.equal(sessionId);
557
- });
558
- it('should correctly handle errors that happen when a script cannot be compiled', async function () {
559
- const script = `
560
- return {;
561
- `;
562
- const {
563
- data
564
- } = await (0, _axios.default)({
565
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
566
- method: 'POST',
567
- validateStatus: null,
568
- data: {
569
- script
570
- }
571
- });
572
- data.value.should.have.property('message');
573
- data.value.message.should.match(/An unknown server-side error occurred while processing the command. Original error: Could not execute driver script. Original error was: Error: Unexpected token '?;'?/);
574
- });
575
- it('should be able to set a timeout on a driver script', async function () {
576
- const script = `
577
- await Promise.delay(1000);
578
- return true;
579
- `;
580
- const {
581
- value
582
- } = (await (0, _axios.default)({
583
- url: `http://${address}:${port}/session/${sessionId}/appium/execute_driver`,
584
- method: 'POST',
585
- validateStatus: null,
586
- data: {
587
- script,
588
- timeout: 50
589
- }
590
- })).data;
591
- value.message.should.match(/.+50.+timeout.+/);
592
- });
593
- });
594
391
 
595
- if (DriverClass === _2.BaseDriver) {
392
+ if (DriverClass === _lib.BaseDriver) {
596
393
  describe('special appium:options capability', function () {
597
394
  it('should be able to start a session with caps held in appium:options', async function () {
598
395
  const ret = await startSession({
@@ -615,4 +412,4 @@ var _default = baseDriverE2ETests;
615
412
  exports.default = _default;require('source-map-support').install();
616
413
 
617
414
 
618
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9kcml2ZXItZTJlLXRlc3RzLmpzIl0sIm5hbWVzIjpbImJhc2VEcml2ZXJFMkVUZXN0cyIsIkRyaXZlckNsYXNzIiwiZGVmYXVsdENhcHMiLCJhZGRyZXNzIiwicG9ydCIsImNsYXNzTmFtZSIsIm5hbWUiLCJkZXNjcmliZSIsImJhc2VTZXJ2ZXIiLCJkIiwiYmVmb3JlIiwicm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIiwiYWZ0ZXIiLCJjbG9zZSIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJ1cmwiLCJtZXRob2QiLCJkYXRhIiwiY2FwYWJpbGl0aWVzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoIiwidmFsdWUiLCJlbmRTZXNzaW9uIiwiaWQiLCJ2YWxpZGF0ZVN0YXR1cyIsImdldFNlc3Npb24iLCJpdCIsInNlc3Npb25JZHMiLCJ0aW1lcyIsInNlc3Npb25JZCIsImhlYWRlcnMiLCJzaW1wbGUiLCJyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSIsInB1c2giLCJfIiwidW5pcSIsImxlbmd0aCIsInNob3VsZCIsImVxdWFsIiwic3RhdHVzIiwicmVxcyIsIkIiLCJhbGwiLCJtYXAiLCJ4IiwiZXhpc3QiLCJwbGF0Zm9ybU5hbWUiLCJkZXZpY2VOYW1lIiwic2tpcCIsIm9yaWdpbmFsRmluZEVsZW1lbnQiLCJvcmlnaW5hbEZpbmRFbGVtZW50cyIsInN0YXJ0VGltZW91dFNlc3Npb24iLCJ0aW1lb3V0IiwiY2xvbmVEZWVwIiwiZmluZEVsZW1lbnQiLCJiaW5kIiwiZmluZEVsZW1lbnRzIiwiZGVsYXkiLCJuZXdTZXNzaW9uIiwibmV3Q29tbWFuZFRpbWVvdXRNcyIsImJlIiwiYWJvdmUiLCJ1c2luZyIsImVycm9yIiwicmVzcCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsImVxbCIsIm5vdCIsIm5vQ29tbWFuZFRpbWVyIiwic2V0dGluZ3MiLCJEZXZpY2VTZXR0aW5ncyIsImlnbm9yZVVuaW1wb3J0YW50Vmlld3MiLCJnZXRTZXR0aW5ncyIsImZhbHNlIiwidXBkYXRlIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsIl9vbGRHZXRTdGF0dXMiLCJnZXRTdGF0dXMiLCJyZXFQcm9taXNlIiwic2h1dGRvd25FdmVudFByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCIsIkVycm9yIiwib25VbmV4cGVjdGVkU2h1dGRvd24iLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsIm1lc3NhZ2UiLCJjb250YWluIiwic2Vzc2lvbiIsInJlcyIsImV2ZW50cyIsIk9iamVjdCIsImFzc2lnbiIsIm5ld1Nlc3Npb25SZXF1ZXN0ZWQiLCJuZXdTZXNzaW9uU3RhcnRlZCIsImEiLCJhbGxvd0luc2VjdXJlIiwic3RyYXRlZ3kiLCJzZWxlY3RvciIsIlczQ19FTEVNRU5UX0tFWSIsImVycm9ycyIsIk5vU3VjaEVsZW1lbnRFcnJvciIsImJlZm9yZUVhY2giLCJhZnRlckVhY2giLCJfYWxsb3dJbnNlY3VyZSIsInNjcmlwdCIsInR5cGUiLCJyZWplY3RlZCIsImV4cGVjdGVkVGltZW91dHMiLCJjb21tYW5kIiwiaW1wbGljaXQiLCJleHBlY3RlZFN0YXR1cyIsInJlc3VsdCIsIk1KU09OV1BfRUxFTUVOVF9LRVkiLCJlbE9iaiIsImVsZW1lbnQiLCJlbGVtZW50cyIsImxvZ3MiLCJsb2ciLCJ3YXJuIiwic3RhY2t0cmFjZSIsImluY2x1ZGVzIiwiaGF2ZSIsInByb3BlcnR5IiwibWF0Y2giLCJCYXNlRHJpdmVyIiwicmV0IiwiUFJFRklYRURfQVBQSVVNX09QVFNfQ0FQIiwicGxhdGZvcm1WZXJzaW9uIiwib3B0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxTQUFTQSxrQkFBVCxDQUE2QkMsV0FBN0IsRUFBMENDLFdBQVcsR0FBRyxFQUF4RCxFQUE0RDtBQUFBOztBQUMxRCxNQUFJQyxPQUFPLDJCQUFHRCxXQUFXLENBQUMsZ0JBQUQsQ0FB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ImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBzZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgRGV2aWNlU2V0dGluZ3MsIGVycm9ycyB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7XG4gIE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWVxufSBmcm9tICcuLi8uLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgZ2V0UG9ydCBmcm9tICdnZXQtcG9ydCc7XG5pbXBvcnQgeyBQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAgfSBmcm9tICcuLi8uLi9saWIvYmFzZWRyaXZlci9jYXBhYmlsaXRpZXMnO1xuXG5mdW5jdGlvbiBiYXNlRHJpdmVyRTJFVGVzdHMgKERyaXZlckNsYXNzLCBkZWZhdWx0Q2FwcyA9IHt9KSB7XG4gIGxldCBhZGRyZXNzID0gZGVmYXVsdENhcHNbJ2FwcGl1bTphZGRyZXNzJ10gPz8gJzEyNy4wLjAuMSc7XG4gIGxldCBwb3J0ID0gZGVmYXVsdENhcHNbJ2FwcGl1bTpwb3J0J107XG4gIGNvbnN0IGNsYXNzTmFtZSA9IERyaXZlckNsYXNzLm5hbWUgfHwgJyh1bmtub3duIGRyaXZlciknO1xuXG4gIGRlc2NyaWJlKGBCYXNlRHJpdmVyIEUyRSAoYXMgJHtjbGFzc05hbWV9KWAsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgYmFzZVNlcnZlciwgZDtcbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgcG9ydCA9IHBvcnQgPz8gYXdhaXQgZ2V0UG9ydCgpO1xuICAgICAgZGVmYXVsdENhcHMgPSB7Li4uZGVmYXVsdENhcHMsICdhcHBpdW06cG9ydCc6IHBvcnR9O1xuICAgICAgZCA9IG5ldyBEcml2ZXJDbGFzcyh7cG9ydCwgYWRkcmVzc30pO1xuICAgICAgYmFzZVNlcnZlciA9IGF3YWl0IHNlcnZlcih7XG4gICAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uKGQpLFxuICAgICAgICBwb3J0XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBiYXNlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICAgIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb25gLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgZGF0YToge2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiBjYXBzLCBmaXJzdE1hdGNoOiBbe31dfX0sXG4gICAgICB9KSkuZGF0YS52YWx1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBlbmRTZXNzaW9uIChpZCkge1xuICAgICAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke2lkfWAsXG4gICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIHZhbGlkYXRlU3RhdHVzOiBudWxsLFxuICAgICAgfSkpLmRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0U2Vzc2lvbiAoaWQpIHtcbiAgICAgIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb24vJHtpZH1gLFxuICAgICAgfSkpLmRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgZGVzY3JpYmUoJ3Nlc3Npb24gaGFuZGxpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBpZGVtcG90ZW5jeSB3aGlsZSBjcmVhdGluZyBzZXNzaW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkcyA9IFtdO1xuICAgICAgICBsZXQgdGltZXMgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgY29uc3Qge3Nlc3Npb25JZH0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICAgICAgdXJsOiBgaHR0cDovLyR7YWRkcmVzc306JHtwb3J0fS9zZXNzaW9uYCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtSWRlbXBvdGVuY3ktS2V5JzogJzEyMzQ1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBkYXRhOiB7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGRlZmF1bHRDYXBzLCBmaXJzdE1hdGNoOiBbe31dfX0sXG4gICAgICAgICAgICBzaW1wbGU6IGZhbHNlLFxuICAgICAgICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcbiAgICAgICAgICB9KSkuZGF0YS52YWx1ZTtcblxuICAgICAgICAgIHNlc3Npb25JZHMucHVzaChzZXNzaW9uSWQpO1xuICAgICAgICAgIHRpbWVzKys7XG4gICAgICAgIH0gd2hpbGUgKHRpbWVzIDwgMik7XG4gICAgICAgIF8udW5pcShzZXNzaW9uSWRzKS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuXG4gICAgICAgIGNvbnN0IHtzdGF0dXMsIGRhdGF9ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke3Nlc3Npb25JZHNbMF19YCxcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhdHVzLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwoZGF0YS52YWx1ZSwgbnVsbCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgaWRlbXBvdGVuY3kgd2hpbGUgY3JlYXRpbmcgcGFyYWxsZWwgc2Vzc2lvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlcXMgPSBbXTtcbiAgICAgICAgbGV0IHRpbWVzID0gMDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHJlcXMucHVzaChheGlvcyh7XG4gICAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb25gLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1JZGVtcG90ZW5jeS1LZXknOiAnMTIzNDUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YToge2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiBkZWZhdWx0Q2FwcywgZmlyc3RNYXRjaDogW3t9XX19LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0aW1lcysrO1xuICAgICAgICB9IHdoaWxlICh0aW1lcyA8IDIpO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWRzID0gKGF3YWl0IEIuYWxsKHJlcXMpKS5tYXAoKHgpID0+IHguZGF0YS52YWx1ZS5zZXNzaW9uSWQpO1xuICAgICAgICBfLnVuaXEoc2Vzc2lvbklkcykubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgICBjb25zdCB7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb24vJHtzZXNzaW9uSWRzWzBdfWAsXG4gICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXR1cy5zaG91bGQuZXF1YWwoMjAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGRhdGEudmFsdWUsIG51bGwpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgY3JlYXRlIHNlc3Npb24gYW5kIHJldHJpZXZlIGEgc2Vzc2lvbiBpZCwgdGhlbiBkZWxldGUgaXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCB7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb25gLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGRhdGE6IHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogZGVmYXVsdENhcHMsIGZpcnN0TWF0Y2g6IFt7fV19fSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhdHVzLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgICBzaG91bGQuZXhpc3QoZGF0YS52YWx1ZS5zZXNzaW9uSWQpO1xuICAgICAgICBkYXRhLnZhbHVlLmNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWUuc2hvdWxkLmVxdWFsKGRlZmF1bHRDYXBzLnBsYXRmb3JtTmFtZSk7XG4gICAgICAgIGRhdGEudmFsdWUuY2FwYWJpbGl0aWVzLmRldmljZU5hbWUuc2hvdWxkLmVxdWFsKGRlZmF1bHRDYXBzWydhcHBpdW06ZGV2aWNlTmFtZSddKTtcblxuICAgICAgICAoe3N0YXR1cywgZGF0YX0gPSBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsOiBgaHR0cDovLyR7YWRkcmVzc306JHtwb3J0fS9zZXNzaW9uLyR7ZC5zZXNzaW9uSWR9YCxcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgc3RhdHVzLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwoZGF0YS52YWx1ZSwgbnVsbCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0LnNraXAoJ3Nob3VsZCB0aHJvdyBOWUkgZm9yIGNvbW1hbmRzIG5vdCBpbXBsZW1lbnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjb21tYW5kIHRpbWVvdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG9yaWdpbmFsRmluZEVsZW1lbnQsIG9yaWdpbmFsRmluZEVsZW1lbnRzO1xuICAgICAgYXN5bmMgZnVuY3Rpb24gc3RhcnRUaW1lb3V0U2Vzc2lvbiAodGltZW91dCkge1xuICAgICAgICBjb25zdCBjYXBzID0gXy5jbG9uZURlZXAoZGVmYXVsdENhcHMpO1xuICAgICAgICBjYXBzWydhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXQnXSA9IHRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBhd2FpdCBzdGFydFNlc3Npb24oY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9yaWdpbmFsRmluZEVsZW1lbnQgPSBkLmZpbmRFbGVtZW50O1xuICAgICAgICBkLmZpbmRFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiAnZm9vJztcbiAgICAgICAgfS5iaW5kKGQpO1xuXG4gICAgICAgIG9yaWdpbmFsRmluZEVsZW1lbnRzID0gZC5maW5kRWxlbWVudHM7XG4gICAgICAgIGQuZmluZEVsZW1lbnRzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IEIuZGVsYXkoMjAwKTtcbiAgICAgICAgICByZXR1cm4gWydmb28nXTtcbiAgICAgICAgfS5iaW5kKGQpO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5maW5kRWxlbWVudCA9IG9yaWdpbmFsRmluZEVsZW1lbnQ7XG4gICAgICAgIGQuZmluZEVsZW1lbnRzID0gb3JpZ2luYWxGaW5kRWxlbWVudHM7XG4gICAgICB9KTtcblxuXG4gICAgICBpdCgnc2hvdWxkIHNldCBhIGRlZmF1bHQgY29tbWFuZFRpbWVvdXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigpO1xuICAgICAgICBkLm5ld0NvbW1hbmRUaW1lb3V0TXMuc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRpbWVvdXQgb24gY29tbWFuZHMgdXNpbmcgY29tbWFuZFRpbWVvdXQgY2FwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbmV3U2Vzc2lvbiA9IGF3YWl0IHN0YXJ0VGltZW91dFNlc3Npb24oMC4yNSk7XG5cbiAgICAgICAgYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke2Quc2Vzc2lvbklkfS9lbGVtZW50YCxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBkYXRhOiB7dXNpbmc6ICduYW1lJywgdmFsdWU6ICdmb28nfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNDAwKTtcbiAgICAgICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke2Quc2Vzc2lvbklkfWAsXG4gICAgICAgICAgdmFsaWRhdGVTdGF0dXM6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICBzaG91bGQuZXF1YWwoZGF0YS52YWx1ZS5lcnJvciwgJ2ludmFsaWQgc2Vzc2lvbiBpZCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwoZC5zZXNzaW9uSWQsIG51bGwpO1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyZXNwLmVycm9yLCAnaW52YWxpZCBzZXNzaW9uIGlkJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3QgdGltZW91dCB3aXRoIGNvbW1hbmRUaW1lb3V0IG9mIGZhbHNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbmV3U2Vzc2lvbiA9IGF3YWl0IHN0YXJ0VGltZW91dFNlc3Npb24oMC4xKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsOiBgaHR0cDovLyR7YWRkcmVzc306JHtwb3J0fS9zZXNzaW9uLyR7ZC5zZXNzaW9uSWR9L2VsZW1lbnRzYCxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBkYXRhOiB7dXNpbmc6ICduYW1lJywgdmFsdWU6ICdmb28nfSxcbiAgICAgICAgfSkpLmRhdGE7XG4gICAgICAgIChEYXRlLm5vdygpIC0gc3RhcnQpLnNob3VsZC5iZS5hYm92ZSgxNTApO1xuICAgICAgICB2YWx1ZS5zaG91bGQuZXFsKFsnZm9vJ10pO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IHdpdGggY29tbWFuZFRpbWVvdXQgb2YgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5uZXdDb21tYW5kVGltZW91dE1zID0gMjtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDApO1xuXG4gICAgICAgIGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb24vJHtkLnNlc3Npb25JZH0vZWxlbWVudGAsXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgZGF0YToge3VzaW5nOiAnbmFtZScsIHZhbHVlOiAnZm9vJ30sXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDQwMCk7XG4gICAgICAgIGNvbnN0IHt2YWx1ZX0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke2Quc2Vzc2lvbklkfWAsXG4gICAgICAgIH0pKS5kYXRhO1xuICAgICAgICB2YWx1ZS5wbGF0Zm9ybU5hbWUuc2hvdWxkLmVxdWFsKGRlZmF1bHRDYXBzLnBsYXRmb3JtTmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlc3AsIG51bGwpO1xuXG4gICAgICAgIGQubmV3Q29tbWFuZFRpbWVvdXRNcyA9IDYwICogMTAwMDtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IGlmIGl0cyBqdXN0IHRoZSBjb21tYW5kIHRha2luZyBhd2hpbGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjI1KTtcbiAgICAgICAgYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke2Quc2Vzc2lvbklkfS9lbGVtZW50YCxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBkYXRhOiB7dXNpbmc6ICduYW1lJywgdmFsdWU6ICdmb28nfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNDAwKTtcbiAgICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsOiBgaHR0cDovLyR7YWRkcmVzc306JHtwb3J0fS9zZXNzaW9uLyR7ZC5zZXNzaW9uSWR9YCxcbiAgICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgICAgfSkpLmRhdGE7XG4gICAgICAgIHZhbHVlLmVycm9yLnNob3VsZC5lcXVhbCgnaW52YWxpZCBzZXNzaW9uIGlkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgcmVzcC5lcnJvci5zaG91bGQuZXF1YWwoJ2ludmFsaWQgc2Vzc2lvbiBpZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IGhhdmUgYSB0aW1lciBydW5uaW5nIGJlZm9yZSBvciBhZnRlciBhIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3VsZC5ub3QuZXhpc3QoZC5ub0NvbW1hbmRUaW1lcik7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjI1KTtcbiAgICAgICAgbmV3U2Vzc2lvbi5zZXNzaW9uSWQuc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGQubm9Db21tYW5kVGltZXIpO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2V0dGluZ3MgYXBpJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2V9KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIGdldCBzZXR0aW5ncyBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKS5pZ25vcmVVbmltcG9ydGFudFZpZXdzLnNob3VsZC5iZS5mYWxzZTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHVwZGF0ZVNldHRpbmdzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IHRydWV9KS5zaG91bGQuZXZlbnR1YWxseVxuICAgICAgICAgICAgICAgIC5iZS5yZWplY3RlZFdpdGgoJ29uU2V0dGluZ3NVcGRhdGUnKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCB1cGRhdGUgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSgnaW52YWxpZCBqc29uJykuc2hvdWxkLmV2ZW50dWFsbHlcbiAgICAgICAgICAgICAgICAuYmUucmVqZWN0ZWRXaXRoKCdKU09OJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd1bmV4cGVjdGVkIGV4aXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgYSBjdXJyZW50IGNvbW1hbmQgd2hlbiB0aGUgZHJpdmVyIGNyYXNoZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQuX29sZEdldFN0YXR1cyA9IGQuZ2V0U3RhdHVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGQuZ2V0U3RhdHVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXdhaXQgQi5kZWxheSg1MDAwKTtcbiAgICAgICAgICB9LmJpbmQoZCk7XG4gICAgICAgICAgY29uc3QgcmVxUHJvbWlzZSA9IGF4aW9zKHtcbiAgICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc3RhdHVzYCxcbiAgICAgICAgICAgIHZhbGlkYXRlU3RhdHVzOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IGdldHMgdG8gdGhlIHNlcnZlciBiZWZvcmUgb3VyIHNodXRkb3duXG4gICAgICAgICAgYXdhaXQgQi5kZWxheSgxMDApO1xuICAgICAgICAgIGNvbnN0IHNodXRkb3duRXZlbnRQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdvblVuZXhwZWN0ZWRTaHV0ZG93biBldmVudCBpcyBleHBlY3RlZCB0byBiZSBmaXJlZCB3aXRoaW4gNSBzZWNvbmRzIHRpbWVvdXQnKSksIDUwMDApO1xuICAgICAgICAgICAgZC5vblVuZXhwZWN0ZWRTaHV0ZG93bihyZXNvbHZlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKG5ldyBFcnJvcignQ3Jhc2h5dGltZXMnKSk7XG4gICAgICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCByZXFQcm9taXNlKS5kYXRhO1xuICAgICAgICAgIHZhbHVlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ0NyYXNoeXRpbWVzJyk7XG4gICAgICAgICAgYXdhaXQgc2h1dGRvd25FdmVudFByb21pc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZC5nZXRTdGF0dXMgPSBkLl9vbGRHZXRTdGF0dXM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2V2ZW50IHRpbWluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBhZGQgdGltaW5ncyBpZiBub3QgdXNpbmcgb3B0LWluIGNhcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0U2Vzc2lvbihkZWZhdWx0Q2Fwcyk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdldFNlc3Npb24oc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICBzaG91bGQubm90LmV4aXN0KHJlcy5ldmVudHMpO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKHNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBhZGQgc3RhcnQgc2Vzc2lvbiB0aW1pbmdzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjYXBzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENhcHMsIHsnYXBwaXVtOmV2ZW50VGltaW5ncyc6IHRydWV9KTtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0U2Vzc2lvbihjYXBzKTtcbiAgICAgICAgY29uc3QgcmVzID0gKGF3YWl0IGdldFNlc3Npb24oc2Vzc2lvbi5zZXNzaW9uSWQpKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHJlcy5ldmVudHMpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVzLmV2ZW50cy5uZXdTZXNzaW9uUmVxdWVzdGVkKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHJlcy5ldmVudHMubmV3U2Vzc2lvblN0YXJ0ZWQpO1xuICAgICAgICByZXMuZXZlbnRzLm5ld1Nlc3Npb25SZXF1ZXN0ZWRbMF0uc2hvdWxkLmJlLmEoJ251bWJlcicpO1xuICAgICAgICByZXMuZXZlbnRzLm5ld1Nlc3Npb25TdGFydGVkWzBdLnNob3VsZC5iZS5hKCdudW1iZXInKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdleGVjdXRlIGRyaXZlciBzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBtb2NrIHNvbWUgbWV0aG9kcyBvbiBCYXNlRHJpdmVyIHRoYXQgYXJlbid0IG5vcm1hbGx5IHRoZXJlIGV4Y2VwdCBpblxuICAgICAgLy8gYSBmdWxseSBibG93biBkcml2ZXJcbiAgICAgIGxldCBvcmlnaW5hbEZpbmRFbGVtZW50LCBzZXNzaW9uSWQ7XG4gICAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgICBkLmFsbG93SW5zZWN1cmUgPSBbJ2V4ZWN1dGVfZHJpdmVyX3NjcmlwdCddO1xuICAgICAgICBvcmlnaW5hbEZpbmRFbGVtZW50ID0gZC5maW5kRWxlbWVudDtcbiAgICAgICAgZC5maW5kRWxlbWVudCA9IChmdW5jdGlvbiAoc3RyYXRlZ3ksIHNlbGVjdG9yKSB7XG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSAnYWNjZXNzaWJpbGl0eSBpZCcgJiYgc2VsZWN0b3IgPT09ICdhbWF6aW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHtbVzNDX0VMRU1FTlRfS0VZXTogJ2VsZW1lbnQtaWQtMSd9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCdub3QgZm91bmQnKTtcbiAgICAgICAgfSkuYmluZChkKTtcbiAgICAgIH0pO1xuXG4gICAgICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKHtzZXNzaW9uSWR9ID0gYXdhaXQgc3RhcnRTZXNzaW9uKGRlZmF1bHRDYXBzKSk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBkLmZpbmRFbGVtZW50ID0gb3JpZ2luYWxGaW5kRWxlbWVudDtcbiAgICAgIH0pO1xuXG4gICAgICBhZnRlckVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKHNlc3Npb25JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3Qgd29yayB1bmxlc3MgdGhlIGFsbG93SW5zZWN1cmUgZmVhdHVyZSBmbGFnIGlzIHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5fYWxsb3dJbnNlY3VyZSA9IGQuYWxsb3dJbnNlY3VyZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkLmFsbG93SW5zZWN1cmUgPSBbXTtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBgcmV0dXJuICdmb28nYDtcbiAgICAgICAgICBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9leGVjdXRlX2RyaXZlcmAsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGRhdGE6IHtzY3JpcHQsIHR5cGU6ICd3ZCd9LFxuICAgICAgICAgIH0pLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkO1xuICAgICAgICAgIGF3YWl0IGVuZFNlc3Npb24oc2Vzc2lvbklkKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBkLmFsbG93SW5zZWN1cmUgPSBkLl9hbGxvd0luc2VjdXJlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBleGVjdXRlIGEgd2ViZHJpdmVyaW8gc2NyaXB0IGluIHRoZSBjb250ZXh0IG9mIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGBcbiAgICAgICAgICBjb25zdCB0aW1lb3V0cyA9IGF3YWl0IGRyaXZlci5nZXRUaW1lb3V0cygpO1xuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGRyaXZlci5zdGF0dXMoKTtcbiAgICAgICAgICByZXR1cm4gW3RpbWVvdXRzLCBzdGF0dXNdO1xuICAgICAgICBgO1xuICAgICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9leGVjdXRlX2RyaXZlcmAsXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgZGF0YToge3NjcmlwdCwgdHlwZTogJ3dlYmRyaXZlcmlvJ30sXG4gICAgICAgIH0pKS5kYXRhO1xuICAgICAgICBjb25zdCBleHBlY3RlZFRpbWVvdXRzID0ge2NvbW1hbmQ6IDI1MCwgaW1wbGljaXQ6IDB9O1xuICAgICAgICBjb25zdCBleHBlY3RlZFN0YXR1cyA9IHt9O1xuICAgICAgICB2YWx1ZS5yZXN1bHQuc2hvdWxkLmVxbChbZXhwZWN0ZWRUaW1lb3V0cywgZXhwZWN0ZWRTdGF0dXNdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBhbnkgc2NyaXB0IHR5cGUgb3RoZXIgdGhhbiB3ZWJkcml2ZXJpbyBjdXJyZW50bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGByZXR1cm4gJ2ZvbydgO1xuICAgICAgICBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsOiBgaHR0cDovLyR7YWRkcmVzc306JHtwb3J0fS9zZXNzaW9uLyR7c2Vzc2lvbklkfS9hcHBpdW0vZXhlY3V0ZV9kcml2ZXJgLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGRhdGE6IHtzY3JpcHQsIHR5cGU6ICd3ZCd9LFxuICAgICAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZDtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgYSB3ZWJkcml2ZXJpbyBzY3JpcHQgdGhhdCByZXR1cm5zIGVsZW1lbnRzIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gYFxuICAgICAgICAgIHJldHVybiBhd2FpdCBkcml2ZXIuJChcIn5hbWF6aW5nXCIpO1xuICAgICAgICBgO1xuICAgICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9leGVjdXRlX2RyaXZlcmAsXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgZGF0YToge3NjcmlwdH0sXG4gICAgICAgIH0pKS5kYXRhO1xuICAgICAgICB2YWx1ZS5yZXN1bHQuc2hvdWxkLmVxbCh7XG4gICAgICAgICAgW1czQ19FTEVNRU5UX0tFWV06ICdlbGVtZW50LWlkLTEnLFxuICAgICAgICAgIFtNSlNPTldQX0VMRU1FTlRfS0VZXTogJ2VsZW1lbnQtaWQtMSdcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBleGVjdXRlIGEgd2ViZHJpdmVyaW8gc2NyaXB0IHRoYXQgcmV0dXJucyBlbGVtZW50cyBpbiBkZWVwIHN0cnVjdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gYFxuICAgICAgICAgIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLiQoXCJ+YW1hemluZ1wiKTtcbiAgICAgICAgICByZXR1cm4ge2VsZW1lbnQ6IGVsLCBlbGVtZW50czogW2VsLCBlbF19O1xuICAgICAgICBgO1xuICAgICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9leGVjdXRlX2RyaXZlcmAsXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgZGF0YToge3NjcmlwdH0sXG4gICAgICAgIH0pKS5kYXRhO1xuICAgICAgICBjb25zdCBlbE9iaiA9IHtcbiAgICAgICAgICBbVzNDX0VMRU1FTlRfS0VZXTogJ2VsZW1lbnQtaWQtMScsXG4gICAgICAgICAgW01KU09OV1BfRUxFTUVOVF9LRVldOiAnZWxlbWVudC1pZC0xJ1xuICAgICAgICB9O1xuICAgICAgICB2YWx1ZS5yZXN1bHQuc2hvdWxkLmVxbCh7ZWxlbWVudDogZWxPYmosIGVsZW1lbnRzOiBbZWxPYmosIGVsT2JqXX0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3RvcmUgYW5kIHJldHVybiBsb2dzIHRvIHRoZSB1c2VyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzY3JpcHQgPSBgXG4gICAgICAgICAgY29uc29sZS5sb2coXCJmb29cIik7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJmb28yXCIpO1xuICAgICAgICAgIGNvbnNvbGUud2FybihcImJhclwiKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiYmF6XCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBgO1xuICAgICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9leGVjdXRlX2RyaXZlcmAsXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgZGF0YToge3NjcmlwdH0sXG4gICAgICAgIH0pKS5kYXRhO1xuICAgICAgICB2YWx1ZS5sb2dzLnNob3VsZC5lcWwoe2xvZzogWydmb28nLCAnZm9vMiddLCB3YXJuOiBbJ2JhciddLCBlcnJvcjogWydiYXonXX0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBhcHBpdW0gc3BlY2lmaWMgY29tbWFuZHMgYXZhaWxhYmxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzY3JpcHQgPSBgXG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBkcml2ZXIubG9jaztcbiAgICAgICAgYDtcbiAgICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsOiBgaHR0cDovLyR7YWRkcmVzc306JHtwb3J0fS9zZXNzaW9uLyR7c2Vzc2lvbklkfS9hcHBpdW0vZXhlY3V0ZV9kcml2ZXJgLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGRhdGE6IHtzY3JpcHR9LFxuICAgICAgICB9KSkuZGF0YTtcbiAgICAgICAgdmFsdWUucmVzdWx0LnNob3VsZC5lcWwoJ2Z1bmN0aW9uJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaGFuZGxlIGVycm9ycyB0aGF0IGhhcHBlbiBpbiBhIHdlYmRyaXZlcmlvIHNjcmlwdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gYFxuICAgICAgICAgIHJldHVybiBhd2FpdCBkcml2ZXIuJChcIn5ub3Rmb3VuZFwiKTtcbiAgICAgICAgYDtcbiAgICAgICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke3Nlc3Npb25JZH0vYXBwaXVtL2V4ZWN1dGVfZHJpdmVyYCxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgICAgICBkYXRhOiB7c2NyaXB0fSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGEudmFsdWUucmVzdWx0LmVycm9yLmVycm9yLnNob3VsZC5lcXVhbCgnbm8gc3VjaCBlbGVtZW50Jyk7XG4gICAgICAgIGRhdGEudmFsdWUucmVzdWx0LmVycm9yLm1lc3NhZ2Uuc2hvdWxkLmVxdWFsKCdub3QgZm91bmQnKTtcbiAgICAgICAgZGF0YS52YWx1ZS5yZXN1bHQuZXJyb3Iuc3RhY2t0cmFjZS5zaG91bGQuaW5jbHVkZXMoJ05vU3VjaEVsZW1lbnRFcnJvcjonKTtcbiAgICAgICAgZGF0YS52YWx1ZS5yZXN1bHQuc2VsZWN0b3Iuc2hvdWxkLmVxdWFsKCd+bm90Zm91bmQnKTtcbiAgICAgICAgZGF0YS52YWx1ZS5yZXN1bHQuc2Vzc2lvbklkLnNob3VsZC5lcXVhbChzZXNzaW9uSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGhhbmRsZSBlcnJvcnMgdGhhdCBoYXBwZW4gd2hlbiBhIHNjcmlwdCBjYW5ub3QgYmUgY29tcGlsZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGBcbiAgICAgICAgICByZXR1cm4geztcbiAgICAgICAgYDtcbiAgICAgICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke3Nlc3Npb25JZH0vYXBwaXVtL2V4ZWN1dGVfZHJpdmVyYCxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgICAgICBkYXRhOiB7c2NyaXB0fSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGEudmFsdWUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21lc3NhZ2UnKTtcbiAgICAgICAgZGF0YS52YWx1ZS5tZXNzYWdlLnNob3VsZC5tYXRjaCgvQW4gdW5rbm93biBzZXJ2ZXItc2lkZSBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBjb21tYW5kLiBPcmlnaW5hbCBlcnJvcjogQ291bGQgbm90IGV4ZWN1dGUgZHJpdmVyIHNjcmlwdC4gT3JpZ2luYWwgZXJyb3Igd2FzOiBFcnJvcjogVW5leHBlY3RlZCB0b2tlbiAnPzsnPy8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYmUgYWJsZSB0byBzZXQgYSB0aW1lb3V0IG9uIGEgZHJpdmVyIHNjcmlwdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gYFxuICAgICAgICAgIGF3YWl0IFByb21pc2UuZGVsYXkoMTAwMCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGA7XG4gICAgICAgIGNvbnN0IHt2YWx1ZX0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0vc2Vzc2lvbi8ke3Nlc3Npb25JZH0vYXBwaXVtL2V4ZWN1dGVfZHJpdmVyYCxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgICAgICBkYXRhOiB7c2NyaXB0LCB0aW1lb3V0OiA1MH0sXG4gICAgICAgIH0pKS5kYXRhO1xuICAgICAgICB2YWx1ZS5tZXNzYWdlLnNob3VsZC5tYXRjaCgvLis1MC4rdGltZW91dC4rLyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChEcml2ZXJDbGFzcyA9PT0gQmFzZURyaXZlcikge1xuICAgICAgLy8gb25seSBydW4gdGhpcyB0ZXN0IG9uIGJhc2Vkcml2ZXIsIG5vdCBvdGhlciBkcml2ZXJzIHdoaWNoIGFsc28gdXNlIHRoZXNlIHRlc3RzLCBzaW5jZSB3ZVxuICAgICAgLy8gZG9uJ3Qgd2FudCB0aGVtIHRvIHRyeSBhbmQgc3RhcnQgc2Vzc2lvbnMgd2l0aCB0aGVzZSByYW5kb20gY2FwYWJpbGl0aWVzIHRoYXQgYXJlXG4gICAgICAvLyBuZWNlc3NhcnkgdG8gdGVzdCB0aGUgYXBwaXVtIG9wdGlvbnMgbG9naWNcbiAgICAgIGRlc2NyaWJlKCdzcGVjaWFsIGFwcGl1bTpvcHRpb25zIGNhcGFiaWxpdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgYmUgYWJsZSB0byBzdGFydCBhIHNlc3Npb24gd2l0aCBjYXBzIGhlbGQgaW4gYXBwaXVtOm9wdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgc3RhcnRTZXNzaW9uKHtcbiAgICAgICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICAgICBbUFJFRklYRURfQVBQSVVNX09QVFNfQ0FQXToge1xuICAgICAgICAgICAgICBwbGF0Zm9ybVZlcnNpb246ICcxMS40JyxcbiAgICAgICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ2lQaG9uZSAxMScsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZC5vcHRzLnBsYXRmb3JtVmVyc2lvbi5zaG91bGQuZXFsKCcxMS40Jyk7XG4gICAgICAgICAgZC5vcHRzLmRldmljZU5hbWUuc2hvdWxkLmVxbCgnaVBob25lIDExJyk7XG4gICAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihyZXQuc2Vzc2lvbklkKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRHJpdmVyRTJFVGVzdHM7XG4iXSwiZmlsZSI6InRlc3QvYmFzZWRyaXZlci9kcml2ZXItZTJlLXRlc3RzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
415
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9kcml2ZXItZTJlLXRlc3RzLmpzIl0sIm5hbWVzIjpbIlBPU1QiLCJERUxFVEUiLCJNRVRIT0RTIiwiYmFzZURyaXZlckUyRVRlc3RzIiwiRHJpdmVyQ2xhc3MiLCJkZWZhdWx0Q2FwcyIsImFkZHJlc3MiLCJURVNUX0hPU1QiLCJwb3J0IiwiY2xhc3NOYW1lIiwibmFtZSIsImRlc2NyaWJlIiwiYmFzZVNlcnZlciIsImQiLCJuZXdTZXNzaW9uVVJMIiwiY3JlYXRlQXBwaXVtVGVzdFVSTCIsImNyZWF0ZVNlc3Npb25VUkwiLCJiZWZvcmUiLCJyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24iLCJob3N0bmFtZSIsIl8iLCJhZnRlciIsImNsb3NlIiwic3RhcnRTZXNzaW9uIiwiY2FwcyIsInVybCIsIm1ldGhvZCIsImRhdGEiLCJjYXBhYmlsaXRpZXMiLCJhbHdheXNNYXRjaCIsImZpcnN0TWF0Y2giLCJ2YWx1ZSIsImVuZFNlc3Npb24iLCJpZCIsInZhbGlkYXRlU3RhdHVzIiwiZ2V0U2Vzc2lvbiIsIml0Iiwic2Vzc2lvbklkcyIsInRpbWVzIiwic2Vzc2lvbklkIiwiaGVhZGVycyIsInNpbXBsZSIsInJlc29sdmVXaXRoRnVsbFJlc3BvbnNlIiwicHVzaCIsInVuaXEiLCJsZW5ndGgiLCJzaG91bGQiLCJlcXVhbCIsInN0YXR1cyIsInJlcXMiLCJCIiwiYWxsIiwibWFwIiwieCIsImV4aXN0IiwicGxhdGZvcm1OYW1lIiwiZGV2aWNlTmFtZSIsInNraXAiLCJvcmlnaW5hbEZpbmRFbGVtZW50Iiwib3JpZ2luYWxGaW5kRWxlbWVudHMiLCJzdGFydFRpbWVvdXRTZXNzaW9uIiwidGltZW91dCIsImNsb25lRGVlcCIsImZpbmRFbGVtZW50IiwiYmluZCIsImZpbmRFbGVtZW50cyIsImRlbGF5IiwibmV3U2Vzc2lvbiIsIm5ld0NvbW1hbmRUaW1lb3V0TXMiLCJiZSIsImFib3ZlIiwic2Vzc2lvblVSTCIsInVzaW5nIiwiZXJyb3IiLCJyZXNwIiwic3RhcnQiLCJEYXRlIiwibm93IiwiZXFsIiwibm90Iiwibm9Db21tYW5kVGltZXIiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImdldFNldHRpbmdzIiwiZmFsc2UiLCJ1cGRhdGUiLCJldmVudHVhbGx5IiwicmVqZWN0ZWRXaXRoIiwiX29sZEdldFN0YXR1cyIsImdldFN0YXR1cyIsInJlcVByb21pc2UiLCJzaHV0ZG93bkV2ZW50UHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0IiwiRXJyb3IiLCJvblVuZXhwZWN0ZWRTaHV0ZG93biIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwibWVzc2FnZSIsImNvbnRhaW4iLCJzZXNzaW9uIiwicmVzIiwiZXZlbnRzIiwiT2JqZWN0IiwiYXNzaWduIiwibmV3U2Vzc2lvblJlcXVlc3RlZCIsIm5ld1Nlc3Npb25TdGFydGVkIiwiYSIsIkJhc2VEcml2ZXIiLCJyZXQiLCJQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAiLCJwbGF0Zm9ybVZlcnNpb24iLCJvcHRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBLE1BQU07QUFBQ0EsRUFBQUEsSUFBRDtBQUFPQyxFQUFBQTtBQUFQLElBQWlCQyxnQkFBdkI7O0FBRUEsU0FBU0Msa0JBQVQsQ0FBNkJDLFdBQTdCLEVBQTBDQyxXQUFXLEdBQUcsRUFBeEQsRUFBNEQ7QUFBQTs7QUFDMUQsTUFBSUMsT0FBTywyQkFBR0QsV0FBVyxDQUFDLGdCQUFELENBQWQsdUVBQW9DRSxrQkFBL0M7QUFDQSxNQUFJQyxJQUFJLEdBQUdILFdBQVcsQ0FBQyxhQUFELENBQXRCO0FBQ0EsUUFBTUksU0FBUyxHQUFHTCxXQUFXLENBQUNNLElBQVosSUFBb0Isa0JBQXRDO0FBRUFDLEVBQUFBLFFBQVEsQ0FBRSxzQkFBcUJGLFNBQVUsR0FBakMsRUFBcUMsWUFBWTtBQUN2RCxR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dUUsa0JBQWtCO0FBQ3pGLGdCQUFNMEUsR0FBRyxHQUFHLE1BQU12RixZQUFZLENBQUM7QUFDN0JnQyxZQUFBQSxZQUFZLEVBQUUsS0FEZTtBQUU3QixhQUFDd0Qsc0NBQUQsR0FBNEI7QUFDMUJDLGNBQUFBLGVBQWUsRUFBRSxNQURTO0FBRTFCLG1DQUFxQjtBQUZLO0FBRkMsV0FBRCxDQUE5QjtBQU9BbkcsVUFBQUEsQ0FBQyxDQUFDb0csSUFBRixDQUFPRCxlQUFQLENBQXVCbEUsTUFBdkIsQ0FBOEJnQyxHQUE5QixDQUFrQyxNQUFsQztBQUNBakUsVUFBQUEsQ0FBQyxDQUFDb0csSUFBRixDQUFPekQsVUFBUCxDQUFrQlYsTUFBbEIsQ0FBeUJnQyxHQUF6QixDQUE2QixXQUE3QjtBQUNBLGdCQUFNOUMsVUFBVSxDQUFDOEUsR0FBRyxDQUFDdkUsU0FBTCxDQUFoQjtBQUNELFNBWEMsQ0FBRjtBQVlELE9BYk8sQ0FBUjtBQWNEO0FBQ0YsR0F4Vk8sQ0FBUjtBQXlWRDs7ZUFFY3BDLGtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIHNlcnZlciwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBEZXZpY2VTZXR0aW5ncyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtURVNUX0hPU1QsIGdldFRlc3RQb3J0LCBjcmVhdGVBcHBpdW1VUkwsIE1FVEhPRFN9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgUFJFRklYRURfQVBQSVVNX09QVFNfQ0FQIH0gZnJvbSAnLi4vLi4vbGliL2Jhc2Vkcml2ZXIvY2FwYWJpbGl0aWVzJztcbmNvbnN0IHtQT1NULCBERUxFVEV9ID0gTUVUSE9EUztcblxuZnVuY3Rpb24gYmFzZURyaXZlckUyRVRlc3RzIChEcml2ZXJDbGFzcywgZGVmYXVsdENhcHMgPSB7fSkge1xuICBsZXQgYWRkcmVzcyA9IGRlZmF1bHRDYXBzWydhcHBpdW06YWRkcmVzcyddID8/IFRFU1RfSE9TVDtcbiAgbGV0IHBvcnQgPSBkZWZhdWx0Q2Fwc1snYXBwaXVtOnBvcnQnXTtcbiAgY29uc3QgY2xhc3NOYW1lID0gRHJpdmVyQ2xhc3MubmFtZSB8fCAnKHVua25vd24gZHJpdmVyKSc7XG5cbiAgZGVzY3JpYmUoYEJhc2VEcml2ZXIgRTJFIChhcyAke2NsYXNzTmFtZX0pYCwgZnVuY3Rpb24gKCkge1xuICAgIGxldCBiYXNlU2VydmVyLCBkO1xuICAgIC8qKlxuICAgICAgICogVGhpcyBVUkwgY3JlYXRlcyBhIG5ldyBzZXNzaW9uXG4gICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICoqL1xuICAgIGxldCBuZXdTZXNzaW9uVVJMO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFVSTCB3aXRoIGJhc2UgaG9zdC9wb3J0LiBTdXBwbHkgYHNlc3Npb25gIGFuZCBgcGF0aG5hbWVgXG4gICAgICogQHR5cGUge18uQ3VycmllZEZ1bmN0aW9uMjxzdHJpbmcsc3RyaW5nLHN0cmluZz59XG4gICAgICovXG4gICAgbGV0IGNyZWF0ZUFwcGl1bVRlc3RVUkw7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgVVJMIHdpdGggdGhlIGdpdmVuIHNlc3Npb24gSUQgYW5kIGEgYmxhbmsgcGF0aG5hbWU7XG4gICAgICogZS5nLiwgYGh0dHA6Ly9mb28uYmFyOjEyMy9zZXNzaW9uLzxzZXNzaW9uLWlkPmBcbiAgICAgKiAgQHR5cGUge18uQ3VycmllZEZ1bmN0aW9uMTxzdHJpbmcsc3RyaW5nPn1cbiAgICAgKi9cbiAgICBsZXQgY3JlYXRlU2Vzc2lvblVSTDtcblxuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBwb3J0ID0gcG9ydCA/PyBhd2FpdCBnZXRUZXN0UG9ydCgpO1xuICAgICAgZGVmYXVsdENhcHMgPSB7Li4uZGVmYXVsdENhcHMsICdhcHBpdW06cG9ydCc6IHBvcnR9O1xuICAgICAgZCA9IG5ldyBEcml2ZXJDbGFzcyh7cG9ydCwgYWRkcmVzc30pO1xuICAgICAgYmFzZVNlcnZlciA9IGF3YWl0IHNlcnZlcih7XG4gICAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uKGQpLFxuICAgICAgICBwb3J0LFxuICAgICAgICBob3N0bmFtZTogVEVTVF9IT1NUXG4gICAgICB9KTtcbiAgICAgIGNyZWF0ZUFwcGl1bVRlc3RVUkwgPSBjcmVhdGVBcHBpdW1VUkwoYWRkcmVzcywgcG9ydCk7XG4gICAgICBuZXdTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVGVzdFVSTCgnJywgJ3Nlc3Npb24nKTtcbiAgICAgIGNyZWF0ZVNlc3Npb25VUkwgPSBjcmVhdGVBcHBpdW1UZXN0VVJMKF8sICcnKTtcbiAgICB9KTtcblxuICAgIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2VTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0U2Vzc2lvbiAoY2Fwcykge1xuICAgICAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogbmV3U2Vzc2lvblVSTCxcbiAgICAgICAgbWV0aG9kOiBQT1NULFxuICAgICAgICBkYXRhOiB7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGNhcHMsIGZpcnN0TWF0Y2g6IFt7fV19fSxcbiAgICAgIH0pKS5kYXRhLnZhbHVlO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGVuZFNlc3Npb24gKGlkKSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBjcmVhdGVTZXNzaW9uVVJMKGlkKSxcbiAgICAgICAgbWV0aG9kOiBERUxFVEUsXG4gICAgICAgIHZhbGlkYXRlU3RhdHVzOiBudWxsLFxuICAgICAgfSkpLmRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0U2Vzc2lvbiAoaWQpIHtcbiAgICAgIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGNyZWF0ZVNlc3Npb25VUkwoaWQpLFxuICAgICAgfSkpLmRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgZGVzY3JpYmUoJ3Nlc3Npb24gaGFuZGxpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBpZGVtcG90ZW5jeSB3aGlsZSBjcmVhdGluZyBzZXNzaW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkcyA9IFtdO1xuICAgICAgICBsZXQgdGltZXMgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgY29uc3Qge3Nlc3Npb25JZH0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICAgICAgdXJsOiBuZXdTZXNzaW9uVVJMLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1JZGVtcG90ZW5jeS1LZXknOiAnMTIzNDU2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2Q6IFBPU1QsXG4gICAgICAgICAgICBkYXRhOiB7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGRlZmF1bHRDYXBzLCBmaXJzdE1hdGNoOiBbe31dfX0sXG4gICAgICAgICAgICBzaW1wbGU6IGZhbHNlLFxuICAgICAgICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcbiAgICAgICAgICB9KSkuZGF0YS52YWx1ZTtcblxuICAgICAgICAgIHNlc3Npb25JZHMucHVzaChzZXNzaW9uSWQpO1xuICAgICAgICAgIHRpbWVzKys7XG4gICAgICAgIH0gd2hpbGUgKHRpbWVzIDwgMik7XG4gICAgICAgIF8udW5pcShzZXNzaW9uSWRzKS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuXG4gICAgICAgIGNvbnN0IHtzdGF0dXMsIGRhdGF9ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogY3JlYXRlU2Vzc2lvblVSTChzZXNzaW9uSWRzWzBdKSxcbiAgICAgICAgICBtZXRob2Q6IERFTEVURSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXR1cy5zaG91bGQuZXF1YWwoMjAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGRhdGEudmFsdWUsIG51bGwpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGlkZW1wb3RlbmN5IHdoaWxlIGNyZWF0aW5nIHBhcmFsbGVsIHNlc3Npb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXFzID0gW107XG4gICAgICAgIGxldCB0aW1lcyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICByZXFzLnB1c2goYXhpb3Moe1xuICAgICAgICAgICAgdXJsOiBuZXdTZXNzaW9uVVJMLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1JZGVtcG90ZW5jeS1LZXknOiAnMTIzNDUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZDogUE9TVCxcbiAgICAgICAgICAgIGRhdGE6IHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogZGVmYXVsdENhcHMsIGZpcnN0TWF0Y2g6IFt7fV19fSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdGltZXMrKztcbiAgICAgICAgfSB3aGlsZSAodGltZXMgPCAyKTtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkcyA9IChhd2FpdCBCLmFsbChyZXFzKSkubWFwKCh4KSA9PiB4LmRhdGEudmFsdWUuc2Vzc2lvbklkKTtcbiAgICAgICAgXy51bmlxKHNlc3Npb25JZHMpLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG5cbiAgICAgICAgY29uc3Qge3N0YXR1cywgZGF0YX0gPSBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsOiBjcmVhdGVTZXNzaW9uVVJMKHNlc3Npb25JZHNbMF0pLFxuICAgICAgICAgIG1ldGhvZDogREVMRVRFLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhdHVzLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwoZGF0YS52YWx1ZSwgbnVsbCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgc2Vzc2lvbiBhbmQgcmV0cmlldmUgYSBzZXNzaW9uIGlkLCB0aGVuIGRlbGV0ZSBpdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHtzdGF0dXMsIGRhdGF9ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogbmV3U2Vzc2lvblVSTCxcbiAgICAgICAgICBtZXRob2Q6IFBPU1QsXG4gICAgICAgICAgZGF0YToge2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiBkZWZhdWx0Q2FwcywgZmlyc3RNYXRjaDogW3t9XX19LFxuICAgICAgICB9KTtcblxuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5leGlzdChkYXRhLnZhbHVlLnNlc3Npb25JZCk7XG4gICAgICAgIGRhdGEudmFsdWUuY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZS5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHMucGxhdGZvcm1OYW1lKTtcbiAgICAgICAgZGF0YS52YWx1ZS5jYXBhYmlsaXRpZXMuZGV2aWNlTmFtZS5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHNbJ2FwcGl1bTpkZXZpY2VOYW1lJ10pO1xuXG4gICAgICAgICh7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGNyZWF0ZVNlc3Npb25VUkwoZC5zZXNzaW9uSWQpLFxuICAgICAgICAgIG1ldGhvZDogREVMRVRFLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgc3RhdHVzLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwoZGF0YS52YWx1ZSwgbnVsbCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0LnNraXAoJ3Nob3VsZCB0aHJvdyBOWUkgZm9yIGNvbW1hbmRzIG5vdCBpbXBsZW1lbnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjb21tYW5kIHRpbWVvdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG9yaWdpbmFsRmluZEVsZW1lbnQsIG9yaWdpbmFsRmluZEVsZW1lbnRzO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBzdGFydFRpbWVvdXRTZXNzaW9uICh0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IGNhcHMgPSBfLmNsb25lRGVlcChkZWZhdWx0Q2Fwcyk7XG4gICAgICAgIGNhcHNbJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCddID0gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHN0YXJ0U2Vzc2lvbihjYXBzKTtcbiAgICAgIH1cblxuICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb3JpZ2luYWxGaW5kRWxlbWVudCA9IGQuZmluZEVsZW1lbnQ7XG4gICAgICAgIGQuZmluZEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuICdmb28nO1xuICAgICAgICB9LmJpbmQoZCk7XG5cbiAgICAgICAgb3JpZ2luYWxGaW5kRWxlbWVudHMgPSBkLmZpbmRFbGVtZW50cztcbiAgICAgICAgZC5maW5kRWxlbWVudHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgQi5kZWxheSgyMDApO1xuICAgICAgICAgIHJldHVybiBbJ2ZvbyddO1xuICAgICAgICB9LmJpbmQoZCk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBkLmZpbmRFbGVtZW50ID0gb3JpZ2luYWxGaW5kRWxlbWVudDtcbiAgICAgICAgZC5maW5kRWxlbWVudHMgPSBvcmlnaW5hbEZpbmRFbGVtZW50cztcbiAgICAgIH0pO1xuXG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IGEgZGVmYXVsdCBjb21tYW5kVGltZW91dCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKCk7XG4gICAgICAgIGQubmV3Q29tbWFuZFRpbWVvdXRNcy5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICAgIGF3YWl0IGVuZFNlc3Npb24obmV3U2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGltZW91dCBvbiBjb21tYW5kcyB1c2luZyBjb21tYW5kVGltZW91dCBjYXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjI1KTtcbiAgICAgICAgLy8gWFhYOiByYWNlIGNvbmRpdGlvbjogd2UgbXVzdCBidWlsZCB0aGlzIFVSTCBiZWZvcmUgLi4uc29tZXRoaW5nIGhhcHBlbnMuLi5cbiAgICAgICAgLy8gd2hpY2ggY2F1c2VzIGBkLnNlc3Npb25JZGAgdG8gYmUgbWlzc2luZ1xuICAgICAgICBsZXQgc2Vzc2lvblVSTCA9IGNyZWF0ZVNlc3Npb25VUkwoZC5zZXNzaW9uSWQpO1xuICAgICAgICBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsOiBjcmVhdGVBcHBpdW1UZXN0VVJMKGQuc2Vzc2lvbklkLCAnZWxlbWVudCcpLFxuICAgICAgICAgIG1ldGhvZDogUE9TVCxcbiAgICAgICAgICBkYXRhOiB7dXNpbmc6ICduYW1lJywgdmFsdWU6ICdmb28nfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNDAwKTtcbiAgICAgICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogc2Vzc2lvblVSTCxcbiAgICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkYXRhLnZhbHVlLmVycm9yLCAnaW52YWxpZCBzZXNzaW9uIGlkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlc3AuZXJyb3IsICdpbnZhbGlkIHNlc3Npb24gaWQnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IHdpdGggY29tbWFuZFRpbWVvdXQgb2YgZmFsc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjEpO1xuICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGNyZWF0ZUFwcGl1bVRlc3RVUkwoZC5zZXNzaW9uSWQsICdlbGVtZW50cycpLFxuICAgICAgICAgIG1ldGhvZDogUE9TVCxcbiAgICAgICAgICBkYXRhOiB7dXNpbmc6ICduYW1lJywgdmFsdWU6ICdmb28nfSxcbiAgICAgICAgfSkpLmRhdGE7XG4gICAgICAgIChEYXRlLm5vdygpIC0gc3RhcnQpLnNob3VsZC5iZS5hYm92ZSgxNTApO1xuICAgICAgICB2YWx1ZS5zaG91bGQuZXFsKFsnZm9vJ10pO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IHdpdGggY29tbWFuZFRpbWVvdXQgb2YgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5uZXdDb21tYW5kVGltZW91dE1zID0gMjtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDApO1xuXG4gICAgICAgIGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGNyZWF0ZUFwcGl1bVRlc3RVUkwoZC5zZXNzaW9uSWQsICdlbGVtZW50JyksXG4gICAgICAgICAgbWV0aG9kOiBQT1NULFxuICAgICAgICAgIGRhdGE6IHt1c2luZzogJ25hbWUnLCB2YWx1ZTogJ2Zvbyd9LFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg0MDApO1xuICAgICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmw6IGNyZWF0ZVNlc3Npb25VUkwoZC5zZXNzaW9uSWQpLFxuICAgICAgICB9KSkuZGF0YTtcbiAgICAgICAgdmFsdWUucGxhdGZvcm1OYW1lLnNob3VsZC5lcXVhbChkZWZhdWx0Q2Fwcy5wbGF0Zm9ybU5hbWUpO1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyZXNwLCBudWxsKTtcblxuICAgICAgICBkLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSA2MCAqIDEwMDA7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3QgdGltZW91dCBpZiBpdHMganVzdCB0aGUgY29tbWFuZCB0YWtpbmcgYXdoaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbmV3U2Vzc2lvbiA9IGF3YWl0IHN0YXJ0VGltZW91dFNlc3Npb24oMC4yNSk7XG4gICAgICAgIC8vIFhYWDogcmFjZSBjb25kaXRpb246IHdlIG11c3QgYnVpbGQgdGhpcyBVUkwgYmVmb3JlIC4uLnNvbWV0aGluZyBoYXBwZW5zLi4uXG4gICAgICAgIC8vIHdoaWNoIGNhdXNlcyBgZC5zZXNzaW9uSWRgIHRvIGJlIG1pc3NpbmdcbiAgICAgICAgbGV0IHNlc3Npb25VUkwgPSBjcmVhdGVTZXNzaW9uVVJMKGQuc2Vzc2lvbklkKTtcbiAgICAgICAgYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogY3JlYXRlQXBwaXVtVGVzdFVSTChkLnNlc3Npb25JZCwgJ2VsZW1lbnQnKSxcbiAgICAgICAgICBtZXRob2Q6IFBPU1QsXG4gICAgICAgICAgZGF0YToge3VzaW5nOiAnbmFtZScsIHZhbHVlOiAnZm9vJ30sXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDQwMCk7XG4gICAgICAgIGNvbnN0IHt2YWx1ZX0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICAgIHVybDogc2Vzc2lvblVSTCxcbiAgICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgICAgfSkpLmRhdGE7XG4gICAgICAgIHZhbHVlLmVycm9yLnNob3VsZC5lcXVhbCgnaW52YWxpZCBzZXNzaW9uIGlkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgcmVzcC5lcnJvci5zaG91bGQuZXF1YWwoJ2ludmFsaWQgc2Vzc2lvbiBpZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IGhhdmUgYSB0aW1lciBydW5uaW5nIGJlZm9yZSBvciBhZnRlciBhIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3VsZC5ub3QuZXhpc3QoZC5ub0NvbW1hbmRUaW1lcik7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjI1KTtcbiAgICAgICAgbmV3U2Vzc2lvbi5zZXNzaW9uSWQuc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGQubm9Db21tYW5kVGltZXIpO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2V0dGluZ3MgYXBpJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2V9KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIGdldCBzZXR0aW5ncyBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKS5pZ25vcmVVbmltcG9ydGFudFZpZXdzLnNob3VsZC5iZS5mYWxzZTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHVwZGF0ZVNldHRpbmdzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IHRydWV9KS5zaG91bGQuZXZlbnR1YWxseVxuICAgICAgICAgICAgICAgIC5iZS5yZWplY3RlZFdpdGgoJ29uU2V0dGluZ3NVcGRhdGUnKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCB1cGRhdGUgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSgnaW52YWxpZCBqc29uJykuc2hvdWxkLmV2ZW50dWFsbHlcbiAgICAgICAgICAgICAgICAuYmUucmVqZWN0ZWRXaXRoKCdKU09OJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd1bmV4cGVjdGVkIGV4aXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgYSBjdXJyZW50IGNvbW1hbmQgd2hlbiB0aGUgZHJpdmVyIGNyYXNoZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQuX29sZEdldFN0YXR1cyA9IGQuZ2V0U3RhdHVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGQuZ2V0U3RhdHVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXdhaXQgQi5kZWxheSg1MDAwKTtcbiAgICAgICAgICB9LmJpbmQoZCk7XG4gICAgICAgICAgY29uc3QgcmVxUHJvbWlzZSA9IGF4aW9zKHtcbiAgICAgICAgICAgIHVybDogY3JlYXRlQXBwaXVtVGVzdFVSTCgnJywgJ3N0YXR1cycpLFxuICAgICAgICAgICAgdmFsaWRhdGVTdGF0dXM6IG51bGwsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3QgZ2V0cyB0byB0aGUgc2VydmVyIGJlZm9yZSBvdXIgc2h1dGRvd25cbiAgICAgICAgICBhd2FpdCBCLmRlbGF5KDEwMCk7XG4gICAgICAgICAgY29uc3Qgc2h1dGRvd25FdmVudFByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ29uVW5leHBlY3RlZFNodXRkb3duIGV2ZW50IGlzIGV4cGVjdGVkIHRvIGJlIGZpcmVkIHdpdGhpbiA1IHNlY29uZHMgdGltZW91dCcpKSwgNTAwMCk7XG4gICAgICAgICAgICBkLm9uVW5leHBlY3RlZFNodXRkb3duKHJlc29sdmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGQuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24obmV3IEVycm9yKCdDcmFzaHl0aW1lcycpKTtcbiAgICAgICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IHJlcVByb21pc2UpLmRhdGE7XG4gICAgICAgICAgdmFsdWUubWVzc2FnZS5zaG91bGQuY29udGFpbignQ3Jhc2h5dGltZXMnKTtcbiAgICAgICAgICBhd2FpdCBzaHV0ZG93bkV2ZW50UHJvbWlzZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBkLmdldFN0YXR1cyA9IGQuX29sZEdldFN0YXR1cztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZXZlbnQgdGltaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgbm90IGFkZCB0aW1pbmdzIGlmIG5vdCB1c2luZyBvcHQtaW4gY2FwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRTZXNzaW9uKGRlZmF1bHRDYXBzKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2V0U2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgIHNob3VsZC5ub3QuZXhpc3QocmVzLmV2ZW50cyk7XG4gICAgICAgIGF3YWl0IGVuZFNlc3Npb24oc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGFkZCBzdGFydCBzZXNzaW9uIHRpbWluZ3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNhcHMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q2FwcywgeydhcHBpdW06ZXZlbnRUaW1pbmdzJzogdHJ1ZX0pO1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRTZXNzaW9uKGNhcHMpO1xuICAgICAgICBjb25zdCByZXMgPSAoYXdhaXQgZ2V0U2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCkpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVzLmV2ZW50cyk7XG4gICAgICAgIHNob3VsZC5leGlzdChyZXMuZXZlbnRzLm5ld1Nlc3Npb25SZXF1ZXN0ZWQpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVzLmV2ZW50cy5uZXdTZXNzaW9uU3RhcnRlZCk7XG4gICAgICAgIHJlcy5ldmVudHMubmV3U2Vzc2lvblJlcXVlc3RlZFswXS5zaG91bGQuYmUuYSgnbnVtYmVyJyk7XG4gICAgICAgIHJlcy5ldmVudHMubmV3U2Vzc2lvblN0YXJ0ZWRbMF0uc2hvdWxkLmJlLmEoJ251bWJlcicpO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKHNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKERyaXZlckNsYXNzID09PSBCYXNlRHJpdmVyKSB7XG4gICAgICAvLyBvbmx5IHJ1biB0aGlzIHRlc3Qgb24gYmFzZWRyaXZlciwgbm90IG90aGVyIGRyaXZlcnMgd2hpY2ggYWxzbyB1c2UgdGhlc2UgdGVzdHMsIHNpbmNlIHdlXG4gICAgICAvLyBkb24ndCB3YW50IHRoZW0gdG8gdHJ5IGFuZCBzdGFydCBzZXNzaW9ucyB3aXRoIHRoZXNlIHJhbmRvbSBjYXBhYmlsaXRpZXMgdGhhdCBhcmVcbiAgICAgIC8vIG5lY2Vzc2FyeSB0byB0ZXN0IHRoZSBhcHBpdW0gb3B0aW9ucyBsb2dpY1xuICAgICAgZGVzY3JpYmUoJ3NwZWNpYWwgYXBwaXVtOm9wdGlvbnMgY2FwYWJpbGl0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHN0YXJ0IGEgc2Vzc2lvbiB3aXRoIGNhcHMgaGVsZCBpbiBhcHBpdW06b3B0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBzdGFydFNlc3Npb24oe1xuICAgICAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgICAgIFtQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVBdOiB7XG4gICAgICAgICAgICAgIHBsYXRmb3JtVmVyc2lvbjogJzExLjQnLFxuICAgICAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnaVBob25lIDExJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkLm9wdHMucGxhdGZvcm1WZXJzaW9uLnNob3VsZC5lcWwoJzExLjQnKTtcbiAgICAgICAgICBkLm9wdHMuZGV2aWNlTmFtZS5zaG91bGQuZXFsKCdpUGhvbmUgMTEnKTtcbiAgICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKHJldC5zZXNzaW9uSWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VEcml2ZXJFMkVUZXN0cztcbiJdLCJmaWxlIjoidGVzdC9iYXNlZHJpdmVyL2RyaXZlci1lMmUtdGVzdHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==