appium 2.0.0-beta.24 → 2.0.0-beta.27

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 (124) hide show
  1. package/build/lib/appium-config.schema.json +278 -0
  2. package/build/lib/appium.js +45 -66
  3. package/build/lib/cli/args.js +19 -39
  4. package/build/lib/cli/driver-command.js +5 -9
  5. package/build/lib/cli/extension-command.js +73 -64
  6. package/build/lib/cli/extension.js +10 -23
  7. package/build/lib/cli/parser.js +9 -19
  8. package/build/lib/cli/plugin-command.js +5 -9
  9. package/build/lib/cli/utils.js +2 -4
  10. package/build/lib/config-file.js +5 -10
  11. package/build/lib/config.js +50 -20
  12. package/build/lib/constants.js +60 -0
  13. package/build/lib/extension/driver-config.js +190 -0
  14. package/build/lib/extension/extension-config.js +297 -0
  15. package/build/lib/extension/index.js +77 -0
  16. package/build/lib/extension/manifest.js +246 -0
  17. package/build/lib/extension/package-changed.js +68 -0
  18. package/build/lib/extension/plugin-config.js +87 -0
  19. package/build/lib/grid-register.js +2 -4
  20. package/build/lib/logger.js +2 -4
  21. package/build/lib/logsink.js +2 -4
  22. package/build/lib/main.js +42 -71
  23. package/build/lib/schema/appium-config-schema.js +2 -4
  24. package/build/lib/schema/arg-spec.js +11 -14
  25. package/build/lib/schema/cli-args.js +2 -4
  26. package/build/lib/schema/cli-transformers.js +2 -4
  27. package/build/lib/schema/index.js +2 -4
  28. package/build/lib/schema/keywords.js +2 -4
  29. package/build/lib/schema/schema.js +61 -37
  30. package/build/lib/utils.js +1 -32
  31. package/lib/appium.js +50 -68
  32. package/lib/cli/args.js +19 -23
  33. package/lib/cli/driver-command.js +10 -2
  34. package/lib/cli/extension-command.js +216 -135
  35. package/lib/cli/extension.js +7 -15
  36. package/lib/cli/parser.js +6 -14
  37. package/lib/cli/plugin-command.js +1 -2
  38. package/lib/config-file.js +12 -15
  39. package/lib/config.js +55 -24
  40. package/lib/constants.js +79 -0
  41. package/lib/extension/driver-config.js +230 -0
  42. package/lib/extension/extension-config.js +459 -0
  43. package/lib/extension/index.js +103 -0
  44. package/lib/extension/manifest.js +590 -0
  45. package/lib/extension/package-changed.js +64 -0
  46. package/lib/extension/plugin-config.js +111 -0
  47. package/lib/grid-register.js +4 -4
  48. package/lib/main.js +57 -93
  49. package/lib/schema/arg-spec.js +3 -3
  50. package/lib/schema/cli-args.js +1 -0
  51. package/lib/schema/keywords.js +1 -1
  52. package/lib/schema/schema.js +67 -29
  53. package/lib/utils.js +2 -32
  54. package/package.json +29 -21
  55. package/{postinstall.js → scripts/postinstall.js} +1 -1
  56. package/types/types.d.ts +70 -31
  57. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  58. package/build/check-npm-pack-files.js +0 -23
  59. package/build/commands-yml/parse.js +0 -319
  60. package/build/commands-yml/validator.js +0 -130
  61. package/build/index.js +0 -19
  62. package/build/lib/cli/npm.js +0 -220
  63. package/build/lib/driver-config.js +0 -100
  64. package/build/lib/drivers.js +0 -100
  65. package/build/lib/ext-config-io.js +0 -165
  66. package/build/lib/extension-config.js +0 -320
  67. package/build/lib/plugin-config.js +0 -69
  68. package/build/lib/plugins.js +0 -18
  69. package/build/postinstall.js +0 -90
  70. package/build/test/cli/cli-e2e-specs.js +0 -221
  71. package/build/test/cli/cli-helpers.js +0 -86
  72. package/build/test/cli/cli-specs.js +0 -71
  73. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  74. package/build/test/cli/schema-args-specs.js +0 -48
  75. package/build/test/cli/schema-e2e-specs.js +0 -47
  76. package/build/test/config-e2e-specs.js +0 -112
  77. package/build/test/config-file-e2e-specs.js +0 -209
  78. package/build/test/config-file-specs.js +0 -281
  79. package/build/test/config-specs.js +0 -246
  80. package/build/test/driver-e2e-specs.js +0 -435
  81. package/build/test/driver-specs.js +0 -386
  82. package/build/test/ext-config-io-specs.js +0 -181
  83. package/build/test/extension-config-specs.js +0 -365
  84. package/build/test/fixtures/allow-feat.txt +0 -5
  85. package/build/test/fixtures/caps.json +0 -3
  86. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  87. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  88. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  89. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  90. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  91. package/build/test/fixtures/config/appium.config.good.js +0 -40
  92. package/build/test/fixtures/config/appium.config.good.json +0 -33
  93. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  94. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  95. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  96. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  97. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  98. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  99. package/build/test/fixtures/config/nodeconfig.json +0 -3
  100. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  101. package/build/test/fixtures/default-args.js +0 -35
  102. package/build/test/fixtures/deny-feat.txt +0 -5
  103. package/build/test/fixtures/driver.schema.js +0 -20
  104. package/build/test/fixtures/extensions.yaml +0 -27
  105. package/build/test/fixtures/flattened-schema.js +0 -532
  106. package/build/test/fixtures/plugin.schema.js +0 -20
  107. package/build/test/fixtures/schema-with-extensions.js +0 -28
  108. package/build/test/grid-register-specs.js +0 -74
  109. package/build/test/helpers.js +0 -75
  110. package/build/test/logger-specs.js +0 -76
  111. package/build/test/npm-specs.js +0 -20
  112. package/build/test/parser-specs.js +0 -319
  113. package/build/test/plugin-e2e-specs.js +0 -316
  114. package/build/test/schema/arg-spec-specs.js +0 -70
  115. package/build/test/schema/cli-args-specs.js +0 -408
  116. package/build/test/schema/schema-specs.js +0 -407
  117. package/build/test/utils-specs.js +0 -288
  118. package/lib/cli/npm.js +0 -251
  119. package/lib/driver-config.js +0 -101
  120. package/lib/drivers.js +0 -84
  121. package/lib/ext-config-io.js +0 -287
  122. package/lib/extension-config.js +0 -366
  123. package/lib/plugin-config.js +0 -63
  124. package/lib/plugins.js +0 -13
@@ -7,18 +7,12 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.NoDriverProxyCommandError = exports.AppiumDriver = void 0;
9
9
 
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
10
  require("source-map-support/register");
13
11
 
14
12
  var _lodash = _interopRequireDefault(require("lodash"));
15
13
 
16
- var _logger = _interopRequireDefault(require("./logger"));
17
-
18
14
  var _config = require("./config");
19
15
 
20
- var _drivers = require("./drivers");
21
-
22
16
  var _baseDriver = require("@appium/base-driver");
23
17
 
24
18
  var _asyncLock = _interopRequireDefault(require("async-lock"));
@@ -49,8 +43,6 @@ class AppiumDriver extends _baseDriver.BaseDriver {
49
43
  }
50
44
 
51
45
  super(args);
52
- (0, _defineProperty2.default)(this, "driverConfig", void 0);
53
- (0, _defineProperty2.default)(this, "server", void 0);
54
46
  this.desiredCapConstraints = desiredCapabilityConstraints;
55
47
  this.newCommandTimeoutMs = 0;
56
48
  this.args = { ...args
@@ -63,6 +55,18 @@ class AppiumDriver extends _baseDriver.BaseDriver {
63
55
  (0, _config.updateBuildInfo)();
64
56
  }
65
57
 
58
+ get log() {
59
+ if (!this._log) {
60
+ const instanceName = `${this.constructor.name}@${_support.node.getObjectId(this).substring(0, 4)}`;
61
+ this._log = _support.logger.getLogger(instanceName);
62
+ }
63
+
64
+ return this._log;
65
+ }
66
+
67
+ driverConfig;
68
+ server;
69
+
66
70
  get isCommandsQueueEnabled() {
67
71
  return false;
68
72
  }
@@ -91,17 +95,10 @@ class AppiumDriver extends _baseDriver.BaseDriver {
91
95
  }
92
96
 
93
97
  printNewSessionAnnouncement(driverName, driverVersion, driverBaseVersion) {
94
- _logger.default.info(driverVersion ? `Appium v${_config.APPIUM_VER} creating new ${driverName} (v${driverVersion}) session` : `Appium v${_config.APPIUM_VER} creating new ${driverName} session`);
95
-
96
- _logger.default.info(`Checking BaseDriver versions for Appium and ${driverName}`);
97
-
98
- _logger.default.info(AppiumDriver.baseVersion ? `Appium's BaseDriver version is ${AppiumDriver.baseVersion}` : `Could not determine Appium's BaseDriver version`);
99
-
100
- _logger.default.info(driverBaseVersion ? `${driverName}'s BaseDriver version is ${driverBaseVersion}` : `Could not determine ${driverName}'s BaseDriver version`);
101
- }
102
-
103
- _findMatchingDriver(...args) {
104
- return (0, _drivers.findMatchingDriver)(...args);
98
+ this.log.info(driverVersion ? `Appium v${_config.APPIUM_VER} creating new ${driverName} (v${driverVersion}) session` : `Appium v${_config.APPIUM_VER} creating new ${driverName} session`);
99
+ this.log.info(`Checking BaseDriver versions for Appium and ${driverName}`);
100
+ this.log.info(AppiumDriver.baseVersion ? `Appium's BaseDriver version is ${AppiumDriver.baseVersion}` : `Could not determine Appium's BaseDriver version`);
101
+ this.log.info(driverBaseVersion ? `${driverName}'s BaseDriver version is ${driverBaseVersion}` : `Could not determine ${driverName}'s BaseDriver version`);
105
102
  }
106
103
 
107
104
  assignCliArgsToExtension(extType, extName, extInstance) {
@@ -154,8 +151,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
154
151
  driver: InnerDriver,
155
152
  version: driverVersion,
156
153
  driverName
157
- } = this._findMatchingDriver(this.driverConfig, desiredCaps);
158
-
154
+ } = this.driverConfig.findMatchingDriver(desiredCaps);
159
155
  this.printNewSessionAnnouncement(InnerDriver.name, driverVersion, InnerDriver.baseVersion);
160
156
 
161
157
  if (this.args.sessionOverride) {
@@ -166,22 +162,19 @@ class AppiumDriver extends _baseDriver.BaseDriver {
166
162
  const driverInstance = new InnerDriver(this.args, true);
167
163
 
168
164
  if (this.args.relaxedSecurityEnabled) {
169
- _logger.default.info(`Applying relaxed security to '${InnerDriver.name}' as per ` + `server command line argument. All insecure features will be ` + `enabled unless explicitly disabled by --deny-insecure`);
170
-
165
+ this.log.info(`Applying relaxed security to '${InnerDriver.name}' as per ` + `server command line argument. All insecure features will be ` + `enabled unless explicitly disabled by --deny-insecure`);
171
166
  driverInstance.relaxedSecurityEnabled = true;
172
167
  }
173
168
 
174
169
  if (!_lodash.default.isEmpty(this.args.denyInsecure)) {
175
- _logger.default.info('Explicitly preventing use of insecure features:');
176
-
177
- this.args.denyInsecure.map(a => _logger.default.info(` ${a}`));
170
+ this.log.info('Explicitly preventing use of insecure features:');
171
+ this.args.denyInsecure.map(a => this.log.info(` ${a}`));
178
172
  driverInstance.denyInsecure = this.args.denyInsecure;
179
173
  }
180
174
 
181
175
  if (!_lodash.default.isEmpty(this.args.allowInsecure)) {
182
- _logger.default.info('Explicitly enabling use of insecure features:');
183
-
184
- this.args.allowInsecure.map(a => _logger.default.info(` ${a}`));
176
+ this.log.info('Explicitly enabling use of insecure features:');
177
+ this.args.allowInsecure.map(a => this.log.info(` ${a}`));
185
178
  driverInstance.allowInsecure = this.args.allowInsecure;
186
179
  }
187
180
 
@@ -216,18 +209,14 @@ class AppiumDriver extends _baseDriver.BaseDriver {
216
209
  }
217
210
 
218
211
  this.attachUnexpectedShutdownHandler(driverInstance, innerSessionId);
219
-
220
- _logger.default.info(`New ${InnerDriver.name} session created successfully, session ` + `${innerSessionId} added to master session list`);
221
-
212
+ this.log.info(`New ${InnerDriver.name} session created successfully, session ` + `${innerSessionId} added to master session list`);
222
213
  driverInstance.startNewCommandTimeout();
223
214
 
224
215
  if (driverInstance.isW3CProtocol() && !_lodash.default.isEmpty(w3cSettings)) {
225
- _logger.default.info(`Applying the initial values to Appium settings parsed from W3C caps: ` + JSON.stringify(w3cSettings));
226
-
216
+ this.log.info(`Applying the initial values to Appium settings parsed from W3C caps: ` + JSON.stringify(w3cSettings));
227
217
  await driverInstance.updateSettings(w3cSettings);
228
218
  } else if (driverInstance.isMjsonwpProtocol() && !_lodash.default.isEmpty(jwpSettings)) {
229
- _logger.default.info(`Applying the initial values to Appium settings parsed from MJSONWP caps: ` + JSON.stringify(jwpSettings));
230
-
219
+ this.log.info(`Applying the initial values to Appium settings parsed from MJSONWP caps: ` + JSON.stringify(jwpSettings));
231
220
  await driverInstance.updateSettings(jwpSettings);
232
221
  }
233
222
  } catch (error) {
@@ -245,26 +234,25 @@ class AppiumDriver extends _baseDriver.BaseDriver {
245
234
 
246
235
  attachUnexpectedShutdownHandler(driver, innerSessionId) {
247
236
  const onShutdown = (cause = new Error('Unknown error')) => {
248
- _logger.default.warn(`Ending session, cause was '${cause.message}'`);
237
+ this.log.warn(`Ending session, cause was '${cause.message}'`);
249
238
 
250
239
  if (this.sessionPlugins[innerSessionId]) {
251
240
  for (const plugin of this.sessionPlugins[innerSessionId]) {
252
241
  if (_lodash.default.isFunction(plugin.onUnexpectedShutdown)) {
253
- _logger.default.debug(`Plugin ${plugin.name} defines an unexpected shutdown handler; calling it now`);
242
+ this.log.debug(`Plugin ${plugin.name} defines an unexpected shutdown handler; calling it now`);
254
243
 
255
244
  try {
256
245
  plugin.onUnexpectedShutdown(driver, cause);
257
246
  } catch (e) {
258
- _logger.default.warn(`Got an error when running plugin ${plugin.name} shutdown handler: ${e}`);
247
+ this.log.warn(`Got an error when running plugin ${plugin.name} shutdown handler: ${e}`);
259
248
  }
260
249
  } else {
261
- _logger.default.debug(`Plugin ${plugin.name} does not define an unexpected shutdown handler`);
250
+ this.log.debug(`Plugin ${plugin.name} does not define an unexpected shutdown handler`);
262
251
  }
263
252
  }
264
253
  }
265
254
 
266
- _logger.default.info(`Removing session '${innerSessionId}' from our master session list`);
267
-
255
+ this.log.info(`Removing session '${innerSessionId}' from our master session list`);
268
256
  delete this.sessions[innerSessionId];
269
257
  delete this.sessionPlugins[innerSessionId];
270
258
  };
@@ -272,7 +260,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
272
260
  if (_lodash.default.isFunction(driver.onUnexpectedShutdown)) {
273
261
  driver.onUnexpectedShutdown(onShutdown);
274
262
  } else {
275
- _logger.default.warn(`Failed to attach the unexpected shutdown listener. ` + `Is 'onUnexpectedShutdown' method available for '${driver.constructor.name}'?`);
263
+ this.log.warn(`Failed to attach the unexpected shutdown listener. ` + `Is 'onUnexpectedShutdown' method available for '${driver.constructor.name}'?`);
276
264
  }
277
265
  }
278
266
 
@@ -305,9 +293,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
305
293
  otherSessionsData = _lodash.default.toPairs(this.sessions).filter(([key, value]) => value.constructor.name === curConstructorName && key !== sessionId).map(([, value]) => value.driverData);
306
294
  dstSession = this.sessions[sessionId];
307
295
  protocol = dstSession.protocol;
308
-
309
- _logger.default.info(`Removing session ${sessionId} from our master session list`);
310
-
296
+ this.log.info(`Removing session ${sessionId} from our master session list`);
311
297
  delete this.sessions[sessionId];
312
298
  delete this.sessionPlugins[sessionId];
313
299
  });
@@ -316,8 +302,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
316
302
  value: await dstSession.deleteSession(sessionId, otherSessionsData)
317
303
  };
318
304
  } catch (e) {
319
- _logger.default.error(`Had trouble ending session ${sessionId}: ${e.message}`);
320
-
305
+ this.log.error(`Had trouble ending session ${sessionId}: ${e.message}`);
321
306
  return {
322
307
  protocol,
323
308
  error: e
@@ -329,8 +314,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
329
314
  const sessionsCount = _lodash.default.size(this.sessions);
330
315
 
331
316
  if (0 === sessionsCount) {
332
- _logger.default.debug('There are no active sessions for cleanup');
333
-
317
+ this.log.debug('There are no active sessions for cleanup');
334
318
  return;
335
319
  }
336
320
 
@@ -338,16 +322,14 @@ class AppiumDriver extends _baseDriver.BaseDriver {
338
322
  force = false,
339
323
  reason
340
324
  } = opts;
341
-
342
- _logger.default.debug(`Cleaning up ${_support.util.pluralize('active session', sessionsCount, true)}`);
343
-
325
+ this.log.debug(`Cleaning up ${_support.util.pluralize('active session', sessionsCount, true)}`);
344
326
  const cleanupPromises = force ? _lodash.default.values(this.sessions).map(drv => drv.startUnexpectedShutdown(reason && new Error(reason))) : _lodash.default.keys(this.sessions).map(id => this.deleteSession(id));
345
327
 
346
328
  for (const cleanupPromise of cleanupPromises) {
347
329
  try {
348
330
  await cleanupPromise;
349
331
  } catch (e) {
350
- _logger.default.debug(e);
332
+ this.log.debug(e);
351
333
  }
352
334
  }
353
335
  }
@@ -420,7 +402,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
420
402
  };
421
403
 
422
404
  const defaultBehavior = async () => {
423
- plugins.length && _logger.default.info(`Executing default handling behavior for command '${cmd}'`);
405
+ plugins.length && this.log.info(`Executing default handling behavior for command '${cmd}'`);
424
406
  cmdHandledBy.default = true;
425
407
 
426
408
  if (reqForProxy) {
@@ -462,8 +444,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
462
444
  if (cmd === _baseDriver.CREATE_SESSION_COMMAND && this.sessionlessPlugins.length && !res.error) {
463
445
  const sessionId = _lodash.default.first(res.value);
464
446
 
465
- _logger.default.info(`Promoting ${this.sessionlessPlugins.length} sessionless plugins to be attached ` + `to session ID ${sessionId}`);
466
-
447
+ this.log.info(`Promoting ${this.sessionlessPlugins.length} sessionless plugins to be attached ` + `to session ID ${sessionId}`);
467
448
  this.sessionPlugins[sessionId] = this.sessionlessPlugins;
468
449
  this.sessionlessPlugins = [];
469
450
  }
@@ -479,14 +460,13 @@ class AppiumDriver extends _baseDriver.BaseDriver {
479
460
  cmdHandledBy,
480
461
  plugins
481
462
  }) {
482
- plugins.length && _logger.default.info(`Plugins which can handle cmd '${cmd}': ${plugins.map(p => p.name)}`);
463
+ plugins.length && this.log.info(`Plugins which can handle cmd '${cmd}': ${plugins.map(p => p.name)}`);
483
464
 
484
465
  for (const plugin of plugins) {
485
466
  cmdHandledBy[plugin.name] = false;
486
467
 
487
468
  next = (_next => async () => {
488
- _logger.default.info(`Plugin ${plugin.name} is now handling cmd '${cmd}'`);
489
-
469
+ this.log.info(`Plugin ${plugin.name} is now handling cmd '${cmd}'`);
490
470
  cmdHandledBy[plugin.name] = true;
491
471
 
492
472
  if (plugin[cmd]) {
@@ -512,7 +492,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
512
492
  const didntHandle = Object.keys(cmdHandledBy).filter(k => !cmdHandledBy[k]);
513
493
 
514
494
  if (didntHandle.length > 0) {
515
- _logger.default.info(`Command '${cmd}' was *not* handled by the following behaviours or plugins, even ` + `though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` + `command *was* handled by these: ${JSON.stringify(didHandle)}.`);
495
+ this.log.info(`Command '${cmd}' was *not* handled by the following behaviours or plugins, even ` + `though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` + `command *was* handled by these: ${JSON.stringify(didHandle)}.`);
516
496
  }
517
497
  }
518
498
 
@@ -565,14 +545,13 @@ function isAppiumDriverCommand(cmd) {
565
545
  }
566
546
 
567
547
  class NoDriverProxyCommandError extends Error {
548
+ code = 'APPIUMERR_NO_DRIVER_PROXYCOMMAND';
549
+
568
550
  constructor() {
569
551
  super(`The default behavior for this command was to proxy, but the driver ` + `did not have the 'proxyCommand' method defined. To fully support ` + `plugins, drivers should have 'proxyCommand' set to a jwpProxy object's ` + `'command()' method, in addition to the normal 'proxyReqRes'`);
570
- (0, _defineProperty2.default)(this, "code", 'APPIUMERR_NO_DRIVER_PROXYCOMMAND');
571
552
  }
572
553
 
573
554
  }
574
555
 
575
- exports.NoDriverProxyCommandError = NoDriverProxyCommandError;require('source-map-support').install();
576
-
577
-
578
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJ0bXBEaXIiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1RNUF9ESVIiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwic2Vzc2lvbnMiLCJwZW5kaW5nRHJpdmVycyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJzZXNzaW9uRXhpc3RzIiwic2Vzc2lvbklkIiwiZHN0U2Vzc2lvbiIsImRyaXZlckZvclNlc3Npb24iLCJnZXRTdGF0dXMiLCJidWlsZCIsIl8iLCJjbG9uZSIsImdldFNlc3Npb25zIiwiYWNxdWlyZSIsIm5hbWUiLCJ0b1BhaXJzIiwibWFwIiwiaWQiLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJjYXBzIiwicHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IiwiZHJpdmVyTmFtZSIsImRyaXZlclZlcnNpb24iLCJkcml2ZXJCYXNlVmVyc2lvbiIsImxvZyIsImluZm8iLCJBUFBJVU1fVkVSIiwiYmFzZVZlcnNpb24iLCJfZmluZE1hdGNoaW5nRHJpdmVyIiwiYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJleHRJbnN0YW5jZSIsImFsbENsaUFyZ3NGb3JFeHQiLCJpc0VtcHR5IiwiZGVmYXVsdHMiLCJjbGlBcmdzIiwib21pdEJ5IiwidmFsdWUiLCJrZXkiLCJpc0VxdWFsIiwiY3JlYXRlU2Vzc2lvbiIsImpzb253cENhcHMiLCJyZXFDYXBzIiwidzNjQ2FwYWJpbGl0aWVzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImNsb25lRGVlcCIsImRlZmF1bHRTZXR0aW5ncyIsImp3cFNldHRpbmdzIiwiT2JqZWN0IiwiYXNzaWduIiwidzNjU2V0dGluZ3MiLCJhbHdheXNNYXRjaCIsImZpcnN0TWF0Y2hFbnRyeSIsImZpcnN0TWF0Y2giLCJwcm90b2NvbCIsImlubmVyU2Vzc2lvbklkIiwiZENhcHMiLCJwYXJzZWRDYXBzIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJlcnJvciIsIklubmVyRHJpdmVyIiwidmVyc2lvbiIsImRyaXZlckNvbmZpZyIsInNlc3Npb25PdmVycmlkZSIsImRlbGV0ZUFsbFNlc3Npb25zIiwicnVubmluZ0RyaXZlcnNEYXRhIiwib3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEiLCJkcml2ZXJJbnN0YW5jZSIsInJlbGF4ZWRTZWN1cml0eUVuYWJsZWQiLCJkZW55SW5zZWN1cmUiLCJhIiwiYWxsb3dJbnNlY3VyZSIsInNlcnZlciIsInNlcnZlckhvc3QiLCJhZGRyZXNzIiwic2VydmVyUG9ydCIsInBvcnQiLCJzZXJ2ZXJQYXRoIiwiYmFzZVBhdGgiLCJjdXJTZXNzaW9uRGF0YUZvckRyaXZlciIsImUiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwibWVzc2FnZSIsImRydiIsImRyaXZlckRhdGEiLCJwdXNoIiwicHVsbCIsImF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiaXNXM0NQcm90b2NvbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1cGRhdGVTZXR0aW5ncyIsImlzTWpzb253cFByb3RvY29sIiwib25TaHV0ZG93biIsImNhdXNlIiwiRXJyb3IiLCJ3YXJuIiwicGx1Z2luIiwiaXNGdW5jdGlvbiIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZGVidWciLCJkYXRhIiwidmFsdWVzIiwiZmlsdGVyIiwicyIsImRhdHVtIiwiZGVsZXRlU2Vzc2lvbiIsIm90aGVyU2Vzc2lvbnNEYXRhIiwiY3VyQ29uc3RydWN0b3JOYW1lIiwib3B0cyIsInNlc3Npb25zQ291bnQiLCJzaXplIiwiZm9yY2UiLCJyZWFzb24iLCJ1dGlsIiwicGx1cmFsaXplIiwiY2xlYW51cFByb21pc2VzIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwiY2xlYW51cFByb21pc2UiLCJwbHVnaW5zRm9yU2Vzc2lvbiIsImNyZWF0ZVBsdWdpbkluc3RhbmNlcyIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImNtZCIsInAiLCJoYW5kbGUiLCJQbHVnaW5DbGFzcyIsInBsdWdpbk5hbWUiLCJleGVjdXRlQ29tbWFuZCIsImlzR2V0U3RhdHVzIiwiR0VUX1NUQVRVU19DT01NQU5EIiwiaXNEZWxldGVTZXNzaW9uIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImlzVW1icmVsbGFDbWQiLCJpc0FwcGl1bURyaXZlckNvbW1hbmQiLCJpc1Nlc3Npb25DbWQiLCJyZXFGb3JQcm94eSIsImxhc3QiLCJwb3AiLCJwbHVnaW5zIiwiY21kSGFuZGxlZEJ5IiwiZGVmYXVsdCIsImRlZmF1bHRCZWhhdmlvciIsImxlbmd0aCIsInByb3h5Q29tbWFuZCIsIk5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IiLCJvcmlnaW5hbFVybCIsIm1ldGhvZCIsImJvZHkiLCJ3cmFwcGVkQ21kIiwid3JhcENvbW1hbmRXaXRoUGx1Z2lucyIsIm5leHQiLCJyZXMiLCJleGVjdXRlV3JhcHBlZENvbW1hbmQiLCJsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IiwiQ1JFQVRFX1NFU1NJT05fQ09NTUFORCIsImZpcnN0IiwiX25leHQiLCJkaWRIYW5kbGUiLCJrIiwiZGlkbnRIYW5kbGUiLCJjbWRSZXMiLCJjbWRFcnIiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwicHJveHlBY3RpdmUi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QUN0RyxRQUFKLEdBQWVBLFFBQWY7QUFDRDs7QUFDRCxXQUFPc0csR0FBUDtBQUNEOztBQUVEYSxFQUFBQSxXQUFXLENBQUV0SyxTQUFGLEVBQWE7QUFDdEIsVUFBTUMsVUFBVSxHQUFHLEtBQUtSLFFBQUwsQ0FBY08sU0FBZCxDQUFuQjtBQUNBLFdBQU9DLFVBQVUsSUFBSUksZ0JBQUU4RixVQUFGLENBQWFsRyxVQUFVLENBQUNxSyxXQUF4QixDQUFkLElBQXNEckssVUFBVSxDQUFDcUssV0FBWCxDQUF1QnRLLFNBQXZCLENBQTdEO0FBQ0Q7O0FBRUR1SyxFQUFBQSxpQkFBaUIsQ0FBRXZLLFNBQUYsRUFBYTtBQUM1QixVQUFNQyxVQUFVLEdBQUcsS0FBS1IsUUFBTCxDQUFjTyxTQUFkLENBQW5CO0FBQ0EsV0FBT0MsVUFBVSxHQUFHQSxVQUFVLENBQUNzSyxpQkFBWCxFQUFILEdBQW9DLEVBQXJEO0FBQ0Q7O0FBRURDLEVBQUFBLFFBQVEsQ0FBRXhLLFNBQUYsRUFBYTtBQUNuQixVQUFNQyxVQUFVLEdBQUcsS0FBS1IsUUFBTCxDQUFjTyxTQUFkLENBQW5CO0FBQ0EsV0FBT0MsVUFBVSxJQUFJQSxVQUFVLENBQUN1SyxRQUFYLENBQW9CeEssU0FBcEIsQ0FBckI7QUFDRDs7QUE5bUJtQzs7OztBQW1uQnRDLFNBQVN1SSxxQkFBVCxDQUFnQ1gsR0FBaEMsRUFBcUM7QUFDbkMsU0FBTyxDQUFDLGtDQUFpQkEsR0FBakIsQ0FBRCxJQUEwQkEsR0FBRyxLQUFLLGVBQXpDO0FBQ0Q7O0FBTU0sTUFBTXNCLHlCQUFOLFNBQXdDbEQsS0FBeEMsQ0FBOEM7QUFNbkQvRyxFQUFBQSxXQUFXLEdBQUk7QUFDYixVQUFPLHFFQUFELEdBQ0MsbUVBREQsR0FFQyx5RUFGRCxHQUdDLDZEQUhQO0FBRGEsZ0RBRlIsa0NBRVE7QUFLZDs7QUFYa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXRCdWlsZEluZm8sIHVwZGF0ZUJ1aWxkSW5mbywgQVBQSVVNX1ZFUiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGZpbmRNYXRjaGluZ0RyaXZlciB9IGZyb20gJy4vZHJpdmVycyc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzU2Vzc2lvbkNvbW1hbmQsXG4gICAgICAgICBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELCBERUxFVEVfU0VTU0lPTl9DT01NQU5ELCBHRVRfU1RBVFVTX0NPTU1BTkRcbn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIHB1bGxTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbiB9IGZyb20gJy4vc2NoZW1hJztcblxuY29uc3QgZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyA9IHtcbiAgYXV0b21hdGlvbk5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbiAgcGxhdGZvcm1OYW1lOiB7XG4gICAgcHJlc2VuY2U6IHRydWUsXG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG59O1xuXG5jb25zdCBzZXNzaW9uc0xpc3RHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IHBlbmRpbmdEcml2ZXJzR3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5cbmNsYXNzIEFwcGl1bURyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncykge1xuICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgYC0tdG1wYCBoZXJlIHNpbmNlIGl0IHNob3VsZCBiZSBzZXQgdG9cbiAgICAvLyBwcm9jZXNzLmVudi5BUFBJVU1fVE1QX0RJUiBvbmNlIGF0IGFuIGluaXRpYWwgcG9pbnQgaW4gdGhlIEFwcGl1bSBsaWZlY3ljbGUuXG4gICAgLy8gVGhlIHByb2Nlc3MgYXJndW1lbnQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IEJhc2VEcml2ZXIuXG4gICAgLy8gUGxlYXNlIGNhbGwgQGFwcGl1bS9zdXBwb3J0LnRlbXBEaXIgbW9kdWxlIHRvIGFwcGx5IHRoaXMgYmVuZWZpdC5cbiAgICBpZiAoYXJncy50bXBEaXIpIHtcbiAgICAgIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSID0gYXJncy50bXBEaXI7XG4gICAgfVxuXG4gICAgc3VwZXIoYXJncyk7XG5cbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHM7XG5cbiAgICAvLyB0aGUgbWFpbiBBcHBpdW0gRHJpdmVyIGhhcyBubyBuZXcgY29tbWFuZCB0aW1lb3V0XG4gICAgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zID0gMDtcblxuICAgIHRoaXMuYXJncyA9IHsuLi5hcmdzfTtcblxuICAgIC8vIEFjY2VzcyB0byBzZXNzaW9ucyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAgLy8gaXQgbWlnaHQgYmUgY2hhbmdlZCBieSBvdGhlciBhc3luYyBjYWxscyBhdCBhbnkgdGltZVxuICAgIC8vIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSBkaXJlY3RseSBmcm9tIHRoZSBvdXRzaWRlXG4gICAgdGhpcy5zZXNzaW9ucyA9IHt9O1xuXG4gICAgLy8gQWNjZXNzIHRvIHBlbmRpbmcgZHJpdmVycyBsaXN0IG11c3QgYmUgZ3VhcmRlZCB3aXRoIGEgU2VtYXBob3JlLCBiZWNhdXNlXG4gICAgLy8gaXQgbWlnaHQgYmUgY2hhbmdlZCBieSBvdGhlciBhc3luYyBjYWxscyBhdCBhbnkgdGltZVxuICAgIC8vIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSBkaXJlY3RseSBmcm9tIHRoZSBvdXRzaWRlXG4gICAgdGhpcy5wZW5kaW5nRHJpdmVycyA9IHt9O1xuXG4gICAgLyoqIEB0eXBlIHtQbHVnaW5FeHRlbnNpb25DbGFzc1tdfSAqL1xuICAgIHRoaXMucGx1Z2luQ2xhc3NlcyA9IFtdOyAvLyBsaXN0IG9mIHdoaWNoIHBsdWdpbnMgYXJlIGFjdGl2ZVxuICAgIHRoaXMuc2Vzc2lvblBsdWdpbnMgPSB7fTsgLy8gbWFwIG9mIHNlc3Npb25zIHRvIGFjdHVhbCBwbHVnaW4gaW5zdGFuY2VzIHBlciBzZXNzaW9uXG4gICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSBbXTsgLy8gc29tZSBjb21tYW5kcyBhcmUgc2Vzc2lvbmxlc3MsIHNvIHdlIG5lZWQgYSBzZXQgb2YgcGx1Z2lucyBmb3IgdGhlbVxuXG4gICAgLy8gYWxsb3cgdGhpcyB0byBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vIGBhd2FpdGBcbiAgICB1cGRhdGVCdWlsZEluZm8oKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCcuL2RyaXZlci1jb25maWcnKS5kZWZhdWx0fHVuZGVmaW5lZH0gKi9cbiAgZHJpdmVyQ29uZmlnO1xuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdleHByZXNzJykuRXhwcmVzc3x1bmRlZmluZWR9ICovXG4gIHNlcnZlcjtcblxuICAvKipcbiAgICogQ2FuY2VsIGNvbW1hbmRzIHF1ZXVlaW5nIGZvciB0aGUgdW1icmVsbGEgQXBwaXVtIGRyaXZlclxuICAgKi9cbiAgZ2V0IGlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbnMgKCkge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgcmV0dXJuIF8udG9QYWlycyhzZXNzaW9ucylcbiAgICAgIC5tYXAoKFtpZCwgZHJpdmVyXSkgPT4gKHtpZCwgY2FwYWJpbGl0aWVzOiBkcml2ZXIuY2Fwc30pKTtcbiAgfVxuXG4gIHByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCAoZHJpdmVyTmFtZSwgZHJpdmVyVmVyc2lvbiwgZHJpdmVyQmFzZVZlcnNpb24pIHtcbiAgICBsb2cuaW5mbyhkcml2ZXJWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gKHYke2RyaXZlclZlcnNpb259KSBzZXNzaW9uYFxuICAgICAgOiBgQXBwaXVtIHYke0FQUElVTV9WRVJ9IGNyZWF0aW5nIG5ldyAke2RyaXZlck5hbWV9IHNlc3Npb25gXG4gICAgKTtcbiAgICBsb2cuaW5mbyhgQ2hlY2tpbmcgQmFzZURyaXZlciB2ZXJzaW9ucyBmb3IgQXBwaXVtIGFuZCAke2RyaXZlck5hbWV9YCk7XG4gICAgbG9nLmluZm8oQXBwaXVtRHJpdmVyLmJhc2VWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb24gaXMgJHtBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgICBsb2cuaW5mbyhkcml2ZXJCYXNlVmVyc2lvblxuICAgICAgPyBgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke2RyaXZlckJhc2VWZXJzaW9ufWBcbiAgICAgIDogYENvdWxkIG5vdCBkZXRlcm1pbmUgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMganVzdCBhbiBhbGlhcyBmb3IgZHJpdmVyLmpzJ3MgbWV0aG9kLCB3aGljaCBpcyBuZWNlc3NhcnkgZm9yXG4gICAqIG1vY2tpbmcgaW4gdGhlIHRlc3Qgc3VpdGVcbiAgICovXG4gIF9maW5kTWF0Y2hpbmdEcml2ZXIgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZmluZE1hdGNoaW5nRHJpdmVyKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCBhc3NpZ24gQ0xJIGFyZ3MgZm9yIGEgZHJpdmVyIG9yIHBsdWdpblxuICAgKlxuICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBwcm92aWRlZCBhIHNjaGVtYSwgdmFsaWRhdGlvbiBoYXMgYWxyZWFkeSBoYXBwZW5lZC5cbiAgICpcbiAgICogQW55IGFyZyB3aGljaCBpcyBlcXVhbCB0byBpdHMgZGVmYXVsdCB2YWx1ZSB3aWxsIG5vdCBiZSBhc3NpZ25lZCB0byB0aGUgZXh0ZW5zaW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi9leHQtY29uZmlnLWlvJykuRXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAnZHJpdmVyJyBvciAncGx1Z2luJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRJbnN0YW5jZSB0aGUgZHJpdmVyIG9yIHBsdWdpbiBpbnN0YW5jZVxuICAgKi9cbiAgYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIChleHRUeXBlLCBleHROYW1lLCBleHRJbnN0YW5jZSkge1xuICAgIGNvbnN0IGFsbENsaUFyZ3NGb3JFeHQgPSB0aGlzLmFyZ3NbZXh0VHlwZV0/LltleHROYW1lXTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxDbGlBcmdzRm9yRXh0KSkge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgIGNvbnN0IGNsaUFyZ3MgPSBfLmlzRW1wdHkoZGVmYXVsdHMpXG4gICAgICAgID8gYWxsQ2xpQXJnc0ZvckV4dFxuICAgICAgICA6IF8ub21pdEJ5KGFsbENsaUFyZ3NGb3JFeHQsICh2YWx1ZSwga2V5KSA9PiBfLmlzRXF1YWwoZGVmYXVsdHNba2V5XSwgdmFsdWUpKTtcbiAgICAgIGlmICghXy5pc0VtcHR5KGNsaUFyZ3MpKSB7XG4gICAgICAgIGV4dEluc3RhbmNlLmNsaUFyZ3MgPSBjbGlBcmdzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgZm9ybWF0dGVkIGRlc2lyZWQgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXFDYXBzIFJlcXVpcmVkIGNhcGFiaWxpdGllcyAoSlNPTldQIHN0YW5kYXJkKVxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwYWJpbGl0aWVzIFczQyBjYXBhYmlsaXRpZXNcbiAgICogQHJldHVybiB7QXJyYXl9IFVuaXF1ZSBzZXNzaW9uIElEIGFuZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGpzb253cENhcHMsIHJlcUNhcHMsIHczY0NhcGFiaWxpdGllcykge1xuICAgIGNvbnN0IGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh0aGlzLmFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZGVmYXVsdFNldHRpbmdzID0gcHVsbFNldHRpbmdzKGRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGpzb253cENhcHMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBzKTtcbiAgICBjb25zdCBqd3BTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgcHVsbFNldHRpbmdzKGpzb253cENhcHMpKTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgandwU2V0dGluZ3MpO1xuICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncygodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5hbHdheXNNYXRjaCB8fCB7fSkpO1xuICAgIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mICgodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih3M2NTZXR0aW5ncywgcHVsbFNldHRpbmdzKGZpcnN0TWF0Y2hFbnRyeSkpO1xuICAgIH1cblxuICAgIGxldCBwcm90b2NvbDtcbiAgICBsZXQgaW5uZXJTZXNzaW9uSWQsIGRDYXBzO1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSB0aGUgY2FwcyBpbnRvIGEgZm9ybWF0IHRoYXQgdGhlIElubmVyRHJpdmVyIHdpbGwgYWNjZXB0XG4gICAgICBjb25zdCBwYXJzZWRDYXBzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gICAgICAgIGpzb253cENhcHMsXG4gICAgICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICAgICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIGVycm9yfSA9IHBhcnNlZENhcHM7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIHRoZSBwYXJzaW5nIG9mIHRoZSBjYXBzIHByb2R1Y2VkIGFuIGVycm9yLCB0aHJvdyBpdCBpbiBoZXJlXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJpdmVyOiBJbm5lckRyaXZlcixcbiAgICAgICAgdmVyc2lvbjogZHJpdmVyVmVyc2lvbixcbiAgICAgICAgZHJpdmVyTmFtZVxuICAgICAgfSA9IHRoaXMuX2ZpbmRNYXRjaGluZ0RyaXZlcih0aGlzLmRyaXZlckNvbmZpZywgZGVzaXJlZENhcHMpO1xuICAgICAgdGhpcy5wcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQoSW5uZXJEcml2ZXIubmFtZSwgZHJpdmVyVmVyc2lvbiwgSW5uZXJEcml2ZXIuYmFzZVZlcnNpb24pO1xuXG4gICAgICBpZiAodGhpcy5hcmdzLnNlc3Npb25PdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBydW5uaW5nRHJpdmVyc0RhdGEsIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhO1xuXG4gICAgICBjb25zdCBkcml2ZXJJbnN0YW5jZSA9IG5ldyBJbm5lckRyaXZlcih0aGlzLmFyZ3MsIHRydWUpO1xuXG4gICAgICAvLyBXZSB3YW50IHRvIGFzc2lnbiBzZWN1cml0eSB2YWx1ZXMgZGlyZWN0bHkgb24gdGhlIGRyaXZlci4gVGhlIGRyaXZlclxuICAgICAgLy8gc2hvdWxkIG5vdCByZWFkIHNlY3VyaXR5IHZhbHVlcyBmcm9tIGB0aGlzLm9wdHNgIGJlY2F1c2UgdGhvc2UgdmFsdWVzXG4gICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gc2V0IGJ5IGEgbWFsaWNpb3VzIHVzZXIgdmlhIGNhcGFiaWxpdGllcywgd2hlcmVhcyB3ZVxuICAgICAgLy8gd2FudCBhIGd1YXJhbnRlZSB0aGUgdmFsdWVzIHdlcmUgc2V0IGJ5IHRoZSBhcHBpdW0gc2VydmVyIGFkbWluXG4gICAgICBpZiAodGhpcy5hcmdzLnJlbGF4ZWRTZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHJlbGF4ZWQgc2VjdXJpdHkgdG8gJyR7SW5uZXJEcml2ZXIubmFtZX0nIGFzIHBlciBgICtcbiAgICAgICAgICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICBgZW5hYmxlZCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBieSAtLWRlbnktaW5zZWN1cmVgKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuYXJncy5kZW55SW5zZWN1cmUpKSB7XG4gICAgICAgIGxvZy5pbmZvKCdFeHBsaWNpdGx5IHByZXZlbnRpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuZGVueUluc2VjdXJlLm1hcCgoYSkgPT4gbG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5kZW55SW5zZWN1cmUgPSB0aGlzLmFyZ3MuZGVueUluc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZSkpIHtcbiAgICAgICAgbG9nLmluZm8oJ0V4cGxpY2l0bHkgZW5hYmxpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZS5tYXAoKGEpID0+IGxvZy5pbmZvKGAgICAgJHthfWApKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UuYWxsb3dJbnNlY3VyZSA9IHRoaXMuYXJncy5hbGxvd0luc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICAvLyBMaWtld2lzZSwgYW55IGRyaXZlci1zcGVjaWZpYyBDTEkgYXJncyB0aGF0IHdlcmUgcGFzc2VkIGluIHNob3VsZCBiZSBhc3NpZ25lZCBkaXJlY3RseSB0b1xuICAgICAgLy8gdGhlIGRyaXZlciBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIG1pbWlja2VkIGJ5IGEgbWFsaWNpb3VzIHVzZXIgc2VuZGluZyBpbiBjYXBhYmlsaXRpZXNcbiAgICAgIHRoaXMuYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uKCdkcml2ZXInLCBkcml2ZXJOYW1lLCBkcml2ZXJJbnN0YW5jZSk7XG5cblxuICAgICAgLy8gVGhpcyBhc3NpZ25tZW50IGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IHdlYiBzb2NrZXRzIGZ1bmN0aW9uYWxpdHkgaW5zaWRlIHRoZSBkcml2ZXJcbiAgICAgIGRyaXZlckluc3RhbmNlLnNlcnZlciA9IHRoaXMuc2VydmVyO1xuXG4gICAgICAvLyBEcml2ZXJzL3BsdWdpbnMgbWlnaHQgYWxzbyB3YW50IHRvIGtub3cgd2hlcmUgdGhleSBhcmUgaG9zdGVkXG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJIb3N0ID0gdGhpcy5hcmdzLmFkZHJlc3M7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJQb3J0ID0gdGhpcy5hcmdzLnBvcnQ7XG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXJQYXRoID0gdGhpcy5hcmdzLmJhc2VQYXRoO1xuXG4gICAgICB0cnkge1xuICAgICAgICBydW5uaW5nRHJpdmVyc0RhdGEgPSBhd2FpdCB0aGlzLmN1clNlc3Npb25EYXRhRm9yRHJpdmVyKElubmVyRHJpdmVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKGUubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSA9IHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0gfHwgW107XG4gICAgICAgIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhID0gdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5tYXAoKGRydikgPT4gZHJ2LmRyaXZlckRhdGEpO1xuICAgICAgICB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLnB1c2goZHJpdmVySW5zdGFuY2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIFtpbm5lclNlc3Npb25JZCwgZENhcHNdID0gYXdhaXQgZHJpdmVySW5zdGFuY2UuY3JlYXRlU2Vzc2lvbihcbiAgICAgICAgICBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcmVxQ2FwcyxcbiAgICAgICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgWy4uLnJ1bm5pbmdEcml2ZXJzRGF0YSwgLi4ub3RoZXJQZW5kaW5nRHJpdmVyc0RhdGFdXG4gICAgICAgICk7XG4gICAgICAgIHByb3RvY29sID0gZHJpdmVySW5zdGFuY2UucHJvdG9jb2w7XG4gICAgICAgIGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25zW2lubmVyU2Vzc2lvbklkXSA9IGRyaXZlckluc3RhbmNlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICAgIF8ucHVsbCh0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLCBkcml2ZXJJbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIoZHJpdmVySW5zdGFuY2UsIGlubmVyU2Vzc2lvbklkKTtcblxuICAgICAgbG9nLmluZm8oYE5ldyAke0lubmVyRHJpdmVyLm5hbWV9IHNlc3Npb24gY3JlYXRlZCBzdWNjZXNzZnVsbHksIHNlc3Npb24gYCArXG4gICAgICAgICAgICAgIGAke2lubmVyU2Vzc2lvbklkfSBhZGRlZCB0byBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG5cbiAgICAgIC8vIHNldCB0aGUgTmV3IENvbW1hbmQgVGltZW91dCBmb3IgdGhlIGlubmVyIGRyaXZlclxuICAgICAgZHJpdmVySW5zdGFuY2Uuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgICAvLyBhcHBseSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgKGlmIHByb3ZpZGVkKVxuICAgICAgaWYgKGRyaXZlckluc3RhbmNlLmlzVzNDUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KHczY1NldHRpbmdzKSkge1xuICAgICAgICBsb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBXM0MgY2FwczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodzNjU2V0dGluZ3MpKTtcbiAgICAgICAgYXdhaXQgZHJpdmVySW5zdGFuY2UudXBkYXRlU2V0dGluZ3ModzNjU2V0dGluZ3MpO1xuICAgICAgfSBlbHNlIGlmIChkcml2ZXJJbnN0YW5jZS5pc01qc29ud3BQcm90b2NvbCgpICYmICFfLmlzRW1wdHkoandwU2V0dGluZ3MpKSB7XG4gICAgICAgIGxvZy5pbmZvKGBBcHBseWluZyB0aGUgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIHBhcnNlZCBmcm9tIE1KU09OV1AgY2FwczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoandwU2V0dGluZ3MpKTtcbiAgICAgICAgYXdhaXQgZHJpdmVySW5zdGFuY2UudXBkYXRlU2V0dGluZ3MoandwU2V0dGluZ3MpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwcm90b2NvbCxcbiAgICAgIHZhbHVlOiBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzLCBwcm90b2NvbF1cbiAgICB9O1xuICB9XG5cbiAgYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlciAoZHJpdmVyLCBpbm5lclNlc3Npb25JZCkge1xuICAgIGNvbnN0IG9uU2h1dGRvd24gPSAoY2F1c2UgPSBuZXcgRXJyb3IoJ1Vua25vd24gZXJyb3InKSkgPT4ge1xuICAgICAgbG9nLndhcm4oYEVuZGluZyBzZXNzaW9uLCBjYXVzZSB3YXMgJyR7Y2F1c2UubWVzc2FnZX0nYCk7XG5cbiAgICAgIGlmICh0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24ocGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBQbHVnaW4gJHtwbHVnaW4ubmFtZX0gZGVmaW5lcyBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXI7IGNhbGxpbmcgaXQgbm93YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBwbHVnaW4ub25VbmV4cGVjdGVkU2h1dGRvd24oZHJpdmVyLCBjYXVzZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGxvZy53YXJuKGBHb3QgYW4gZXJyb3Igd2hlbiBydW5uaW5nIHBsdWdpbiAke3BsdWdpbi5uYW1lfSBzaHV0ZG93biBoYW5kbGVyOiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGRvZXMgbm90IGRlZmluZSBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJyR7aW5uZXJTZXNzaW9uSWR9JyBmcm9tIG91ciBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG4gICAgICBkZWxldGUgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF07XG4gICAgICBkZWxldGUgdGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF07XG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24oZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKG9uU2h1dGRvd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybihgRmFpbGVkIHRvIGF0dGFjaCB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biBsaXN0ZW5lci4gYCArXG4gICAgICAgIGBJcyAnb25VbmV4cGVjdGVkU2h1dGRvd24nIG1ldGhvZCBhdmFpbGFibGUgZm9yICcke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSc/YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIgKElubmVyRHJpdmVyKSB7XG4gICAgY29uc3Qgc2Vzc2lvbnMgPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB0aGlzLnNlc3Npb25zKTtcbiAgICBjb25zdCBkYXRhID0gXy52YWx1ZXMoc2Vzc2lvbnMpXG4gICAgICAgICAgICAgICAgICAgLmZpbHRlcigocykgPT4gcy5jb25zdHJ1Y3Rvci5uYW1lID09PSBJbm5lckRyaXZlci5uYW1lKVxuICAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMuZHJpdmVyRGF0YSk7XG4gICAgZm9yIChsZXQgZGF0dW0gb2YgZGF0YSkge1xuICAgICAgaWYgKCFkYXR1bSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2JsZW0gZ2V0dGluZyBzZXNzaW9uIGRhdGEgZm9yIGRyaXZlciB0eXBlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7SW5uZXJEcml2ZXIubmFtZX07IGRvZXMgaXQgaW1wbGVtZW50ICdnZXQgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZHJpdmVyRGF0YSc/YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoc2Vzc2lvbklkKSB7XG4gICAgbGV0IHByb3RvY29sO1xuICAgIHRyeSB7XG4gICAgICBsZXQgb3RoZXJTZXNzaW9uc0RhdGEgPSBudWxsO1xuICAgICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgICAgYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJDb25zdHJ1Y3Rvck5hbWUgPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0uY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgb3RoZXJTZXNzaW9uc0RhdGEgPSBfLnRvUGFpcnModGhpcy5zZXNzaW9ucylcbiAgICAgICAgICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lID09PSBjdXJDb25zdHJ1Y3Rvck5hbWUgJiYga2V5ICE9PSBzZXNzaW9uSWQpXG4gICAgICAgICAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUuZHJpdmVyRGF0YSk7XG4gICAgICAgIGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgICAgbG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJHtzZXNzaW9uSWR9IGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkZWxldGVTZXNzaW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgb3Igbm90XG4gICAgICAgIC8vIG1ha2UgdGhlIHNlc3Npb24gdW5hdmFpbGFibGUsIGJlY2F1c2Ugd2hvIGtub3dzIHdoYXQgc3RhdGUgaXQgbWlnaHRcbiAgICAgICAgLy8gYmUgaW4gb3RoZXJ3aXNlXG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICB2YWx1ZTogYXdhaXQgZHN0U2Vzc2lvbi5kZWxldGVTZXNzaW9uKHNlc3Npb25JZCwgb3RoZXJTZXNzaW9uc0RhdGEpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3IoYEhhZCB0cm91YmxlIGVuZGluZyBzZXNzaW9uICR7c2Vzc2lvbklkfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3I6IGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbFNlc3Npb25zIChvcHRzID0ge30pIHtcbiAgICBjb25zdCBzZXNzaW9uc0NvdW50ID0gXy5zaXplKHRoaXMuc2Vzc2lvbnMpO1xuICAgIGlmICgwID09PSBzZXNzaW9uc0NvdW50KSB7XG4gICAgICBsb2cuZGVidWcoJ1RoZXJlIGFyZSBubyBhY3RpdmUgc2Vzc2lvbnMgZm9yIGNsZWFudXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBmb3JjZSA9IGZhbHNlLFxuICAgICAgcmVhc29uLFxuICAgIH0gPSBvcHRzO1xuICAgIGxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnYWN0aXZlIHNlc3Npb24nLCBzZXNzaW9uc0NvdW50LCB0cnVlKX1gKTtcbiAgICBjb25zdCBjbGVhbnVwUHJvbWlzZXMgPSBmb3JjZVxuICAgICAgPyBfLnZhbHVlcyh0aGlzLnNlc3Npb25zKS5tYXAoKGRydikgPT4gZHJ2LnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKHJlYXNvbiAmJiBuZXcgRXJyb3IocmVhc29uKSkpXG4gICAgICA6IF8ua2V5cyh0aGlzLnNlc3Npb25zKS5tYXAoKGlkKSA9PiB0aGlzLmRlbGV0ZVNlc3Npb24oaWQpKTtcbiAgICBmb3IgKGNvbnN0IGNsZWFudXBQcm9taXNlIG9mIGNsZWFudXBQcm9taXNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xlYW51cFByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHByb3ByaWF0ZSBwbHVnaW5zIGZvciBhIHNlc3Npb24gKG9yIHNlc3Npb25sZXNzIHBsdWdpbnMpXG4gICAqXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHNlc3Npb25JZCAob3IgbnVsbCkgdG8gdXNlIHRvIGZpbmQgcGx1Z2luc1xuICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gYXJyYXkgb2YgcGx1Z2luIGluc3RhbmNlc1xuICAgKi9cbiAgcGx1Z2luc0ZvclNlc3Npb24gKHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICBpZiAoIXRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0gPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zKSkge1xuICAgICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSB0aGlzLmNyZWF0ZVBsdWdpbkluc3RhbmNlcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHBsdWdpbnMgZm9yIGEgY29tbWFuZCwgd2UgZWl0aGVyIGdldCB0aGUgcGx1Z2luIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIHBhcnRpY3VsYXIgY29tbWFuZCdzIHNlc3Npb24sIG9yIGluIHRoZSBjYXNlIG9mIHNlc3Npb25sZXNzIHBsdWdpbnMsIHB1bGwgZnJvbSB0aGUgc2V0IG9mXG4gICAqIHBsdWdpbiBpbnN0YW5jZXMgcmVzZXJ2ZWQgZm9yIHNlc3Npb25sZXNzIGNvbW1hbmRzIChhbmQgd2UgbGF6aWx5IGNyZWF0ZSBwbHVnaW4gaW5zdGFuY2VzIG9uXG4gICAqIGZpcnN0IHVzZSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtZCAtIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIGZpbmQgYSBwbHVnaW4gdG8gaGFuZGxlXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHBhcnRpY3VsYXIgc2Vzc2lvbiBmb3Igd2hpY2ggdG8gZmluZCBhIHBsdWdpbiwgb3IgbnVsbCBpZlxuICAgKiBzZXNzaW9ubGVzc1xuICAgKi9cbiAgcGx1Z2luc1RvSGFuZGxlQ21kIChjbWQsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICAvLyB0byBoYW5kbGUgYSBnaXZlbiBjb21tYW5kLCBhIHBsdWdpbiBzaG91bGQgZWl0aGVyIGltcGxlbWVudCB0aGF0IGNvbW1hbmQgYXMgYSBwbHVnaW5cbiAgICAvLyBpbnN0YW5jZSBtZXRob2Qgb3IgaXQgc2hvdWxkIGltcGxlbWVudCBhIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgcmV0dXJuIHRoaXMucGx1Z2luc0ZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgICAgLmZpbHRlcigocCkgPT4gXy5pc0Z1bmN0aW9uKHBbY21kXSkgfHwgXy5pc0Z1bmN0aW9uKHAuaGFuZGxlKSk7XG4gIH1cblxuICBjcmVhdGVQbHVnaW5JbnN0YW5jZXMgKCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbkNsYXNzZXMubWFwKChQbHVnaW5DbGFzcykgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IFBsdWdpbkNsYXNzLnBsdWdpbk5hbWU7XG4gICAgICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luQ2xhc3MobmFtZSk7XG4gICAgICB0aGlzLmFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbigncGx1Z2luJywgbmFtZSwgcGx1Z2luKTtcbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBleGVjdXRlQ29tbWFuZCAoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gV2UgaGF2ZSBiYXNpY2FsbHkgdGhyZWUgY2FzZXMgZm9yIGhvdyB0byBoYW5kbGUgY29tbWFuZHM6XG4gICAgLy8gMS4gaGFuZGxlIGdldFN0YXR1cyAod2UgZG8gdGhpcyBhcyBhIHNwZWNpYWwgb3V0IG9mIGJhbmQgY2FzZSBzbyBpdCBkb2Vzbid0IGdldCBhZGRlZCB0byBhblxuICAgIC8vICAgIGV4ZWN1dGlvbiBxdWV1ZSwgYW5kIGNhbiBiZSBjYWxsZWQgd2hpbGUgZS5nLiBjcmVhdGVTZXNzaW9uIGlzIGluIHByb2dyZXNzKVxuICAgIC8vIDIuIGhhbmRsZSBjb21tYW5kcyB0aGF0IHRoaXMgdW1icmVsbGEgZHJpdmVyIHNob3VsZCBoYW5kbGUsIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgc2Vzc2lvblxuICAgIC8vICAgIGRyaXZlciAoZm9yIGV4YW1wbGUsIGRlbGV0ZVNlc3Npb24sIG9yIG90aGVyIG5vbi1zZXNzaW9uIGNvbW1hbmRzKVxuICAgIC8vIDMuIGhhbmRsZSBzZXNzaW9uIGRyaXZlciBjb21tYW5kcy5cbiAgICAvLyBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCBiZWNhdXNlIHdlIHN1cHBvcnQgY29tbWFuZCBwbHVnaW5zLCB3ZSBuZWVkIHRvIHdyYXAgYW55IG9mIHRoZXNlXG4gICAgLy8gY2FzZXMgd2l0aCBwbHVnaW4gaGFuZGxpbmcuXG5cbiAgICBjb25zdCBpc0dldFN0YXR1cyA9IGNtZCA9PT0gR0VUX1NUQVRVU19DT01NQU5EO1xuICAgIGNvbnN0IGlzRGVsZXRlU2Vzc2lvbiA9IGNtZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORDtcbiAgICBjb25zdCBpc1VtYnJlbGxhQ21kID0gIWlzR2V0U3RhdHVzICYmIGlzQXBwaXVtRHJpdmVyQ29tbWFuZChjbWQpO1xuICAgIGNvbnN0IGlzU2Vzc2lvbkNtZCA9ICFpc1VtYnJlbGxhQ21kIHx8IGlzRGVsZXRlU2Vzc2lvbjtcblxuICAgIC8vIGlmIGEgcGx1Z2luIG92ZXJyaWRlIHByb3h5aW5nIGZvciB0aGlzIGNvbW1hbmQgYW5kIHRoYXQgaXMgd2h5IHdlIGFyZSBoZXJlIGluc3RlYWQgb2YganVzdFxuICAgIC8vIGxldHRpbmcgdGhlIHByb3RvY29sIHByb3h5IHRoZSBjb21tYW5kIGVudGlyZWx5LCBkZXRlcm1pbmUgdGhhdCwgZ2V0IHRoZSByZXF1ZXN0IG9iamVjdCBmb3JcbiAgICAvLyB1c2UgbGF0ZXIgb24sIHRoZW4gY2xlYW4gdXAgdGhlIGFyZ3NcbiAgICBjb25zdCByZXFGb3JQcm94eSA9IF8ubGFzdChhcmdzKT8ucmVxRm9yUHJveHk7XG4gICAgaWYgKHJlcUZvclByb3h5KSB7XG4gICAgICBhcmdzLnBvcCgpO1xuICAgIH1cblxuXG4gICAgLy8gZmlyc3QgZG8gc29tZSBlcnJvciBjaGVja2luZy4gSWYgd2UncmUgcmVxdWVzdGluZyBhIHNlc3Npb24gY29tbWFuZCBleGVjdXRpb24sIHRoZW4gbWFrZVxuICAgIC8vIHN1cmUgdGhhdCBzZXNzaW9uIGFjdHVhbGx5IGV4aXN0cyBvbiB0aGUgc2Vzc2lvbiBkcml2ZXIsIGFuZCBzZXQgdGhlIHNlc3Npb24gZHJpdmVyIGl0c2VsZlxuICAgIGxldCBzZXNzaW9uSWQgPSBudWxsO1xuICAgIGxldCBkc3RTZXNzaW9uID0gbnVsbDtcbiAgICBsZXQgcHJvdG9jb2wgPSBudWxsO1xuICAgIGxldCBkcml2ZXIgPSB0aGlzO1xuICAgIGlmIChpc1Nlc3Npb25DbWQpIHtcbiAgICAgIHNlc3Npb25JZCA9IF8ubGFzdChhcmdzKTtcbiAgICAgIGRzdFNlc3Npb24gPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0pO1xuICAgICAgaWYgKCFkc3RTZXNzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNlc3Npb24gd2l0aCBpZCAnJHtzZXNzaW9uSWR9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgLy8gbm93IHNhdmUgdGhlIHJlc3BvbnNlIHByb3RvY29sIGdpdmVuIHRoYXQgdGhlIHNlc3Npb24gZHJpdmVyJ3MgcHJvdG9jb2wgbWlnaHQgZGlmZmVyXG4gICAgICBwcm90b2NvbCA9IGRzdFNlc3Npb24ucHJvdG9jb2w7XG4gICAgICBpZiAoIWlzVW1icmVsbGFDbWQpIHtcbiAgICAgICAgZHJpdmVyID0gZHN0U2Vzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgYW55IHBsdWdpbnMgd2hpY2ggYXJlIHJlZ2lzdGVyZWQgYXMgaGFuZGxpbmcgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgcGx1Z2lucyA9IHRoaXMucGx1Z2luc1RvSGFuZGxlQ21kKGNtZCwgc2Vzc2lvbklkKTtcblxuICAgIC8vIG5vdyB3ZSBkZWZpbmUgYSAnY21kSGFuZGxlZEJ5JyBvYmplY3Qgd2hpY2ggd2lsbCBrZWVwIHRyYWNrIG9mIHdoaWNoIHBsdWdpbnMgaGF2ZSBoYW5kbGVkIHRoaXNcbiAgICAvLyBjb21tYW5kLiB3ZSBjYXJlIGFib3V0IHRoaXMgYmVjYXVzZSAoYSkgbXVsdGlwbGUgcGx1Z2lucyBjYW4gaGFuZGxlIHRoZSBzYW1lIGNvbW1hbmQsIGFuZFxuICAgIC8vIChiKSB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IGEgcGx1Z2luIHdpbGwgYWN0dWFsbHkgY2FsbCB0aGUgbmV4dCgpIG1ldGhvZCB3aGljaCBydW5zIHRoZVxuICAgIC8vIG9yaWdpbmFsIGNvbW1hbmQgZXhlY3V0aW9uLiBUaGlzIHJlc3VsdHMgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGNvbW1hbmQgbWlnaHQgYmUgaGFuZGxlZFxuICAgIC8vIGJ5IHNvbWUgYnV0IG5vdCBhbGwgcGx1Z2lucywgb3IgYnkgcGx1Z2luKHMpIGJ1dCBub3QgYnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFNvIHN0YXJ0IG91dFxuICAgIC8vIHRoaXMgb2JqZWN0IGRlY2xhcmluZyB0aGF0IHRoZSBkZWZhdWx0IGhhbmRsZXIgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLlxuICAgIGNvbnN0IGNtZEhhbmRsZWRCeSA9IHtkZWZhdWx0OiBmYWxzZX07XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHBsdWdpbnMsIGFuZCBzdWNjZXNzaXZlbHkgd3JhcHBlZFxuICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGx1Z2luIHRoYXQgY2FuIGhhbmRsZSB0aGUgY29tbWFuZC4gVG8gc3RhcnQgb2ZmIHdpdGgsIHRoZSBhc3luY1xuICAgIC8vIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgY2FsbGluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaS5lLiwgd2hpY2hldmVyIG9mIHRoZSAzIGNhc2VzIGFib3ZlIGlzXG4gICAgLy8gdGhlIGFwcHJvcHJpYXRlIG9uZVxuICAgIGNvbnN0IGRlZmF1bHRCZWhhdmlvciA9IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGlmIHdlJ3JlIHJ1bm5pbmcgd2l0aCBwbHVnaW5zLCBtYWtlIHN1cmUgd2UgbG9nIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgYWN0dWFsbHlcbiAgICAgIC8vIGhhcHBlbmluZyBzbyB3ZSBjYW4gdGVsbCB3aGVuIHRoZSBwbHVnaW4gY2FsbCBjaGFpbiBpcyB1bndyYXBwaW5nIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAvLyBpZiB0aGF0J3Mgd2hhdCBoYXBwZW5zXG4gICAgICBwbHVnaW5zLmxlbmd0aCAmJiBsb2cuaW5mbyhgRXhlY3V0aW5nIGRlZmF1bHQgaGFuZGxpbmcgYmVoYXZpb3IgZm9yIGNvbW1hbmQgJyR7Y21kfSdgKTtcblxuICAgICAgLy8gaWYgd2UgbWFrZSBpdCBoZXJlLCB3ZSBrbm93IHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgaGFuZGxlZFxuICAgICAgY21kSGFuZGxlZEJ5LmRlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBpZiAocmVxRm9yUHJveHkpIHtcbiAgICAgICAgLy8gd2Ugd291bGQgaGF2ZSBwcm94aWVkIHRoaXMgY29tbWFuZCBoYWQgYSBwbHVnaW4gbm90IGhhbmRsZWQgaXQsIHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAgIC8vIGlzIHRvIGRvIHRoZSBwcm94eSBhbmQgcmV0cmlldmUgdGhlIHJlc3VsdCBpbnRlcm5hbGx5IHNvIGl0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHBsdWdpblxuICAgICAgICAvLyBpbiBjYXNlIGl0IGNhbGxzICdhd2FpdCBuZXh0KCknLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRyaXZlciBoYXZlIGRlZmluZWRcbiAgICAgICAgLy8gJ3Byb3h5Q29tbWFuZCcgYW5kIG5vdCBqdXN0ICdwcm94eVJlcVJlcycuXG4gICAgICAgIGlmICghZHN0U2Vzc2lvbi5wcm94eUNvbW1hbmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkc3RTZXNzaW9uLnByb3h5Q29tbWFuZChyZXFGb3JQcm94eS5vcmlnaW5hbFVybCwgcmVxRm9yUHJveHkubWV0aG9kLFxuICAgICAgICAgIHJlcUZvclByb3h5LmJvZHkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNHZXRTdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1VtYnJlbGxhQ21kKSB7XG4gICAgICAgIC8vIHNvbWUgY29tbWFuZHMsIGxpa2UgZGVsZXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gaGFuZGxlIG9uICp0aGlzKiBkcml2ZXIsXG4gICAgICAgIC8vIG5vdCB0aGUgcGxhdGZvcm0gZHJpdmVyXG4gICAgICAgIHJldHVybiBhd2FpdCBzdXBlci5leGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBoZXJlIHdlIGtub3cgdGhhdCB3ZSBhcmUgZXhlY3V0aW5nIGEgc2Vzc2lvbiBjb21tYW5kLCBhbmQgaGF2ZSBhIHZhbGlkIHNlc3Npb24gZHJpdmVyXG4gICAgICByZXR1cm4gYXdhaXQgZHN0U2Vzc2lvbi5leGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBub3cgdGFrZSBvdXIgZGVmYXVsdCBiZWhhdmlvciwgd3JhcCBpdCB3aXRoIGFueSBudW1iZXIgb2YgcGx1Z2luIGJlaGF2aW9ycywgYW5kIHJ1biBpdFxuICAgIGNvbnN0IHdyYXBwZWRDbWQgPSB0aGlzLndyYXBDb21tYW5kV2l0aFBsdWdpbnMoe1xuICAgICAgZHJpdmVyLCBjbWQsIGFyZ3MsIHBsdWdpbnMsIGNtZEhhbmRsZWRCeSwgbmV4dDogZGVmYXVsdEJlaGF2aW9yXG4gICAgfSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5leGVjdXRlV3JhcHBlZENvbW1hbmQoe3dyYXBwZWRDbWQsIHByb3RvY29sfSk7XG5cbiAgICAvLyBpZiB3ZSBoYWQgcGx1Z2lucywgbWFrZSBzdXJlIHRvIGxvZyBvdXQgdGhlIGhlbHBmdWwgcmVwb3J0IGFib3V0IHdoaWNoIHBsdWdpbnMgZW5kZWQgdXBcbiAgICAvLyBoYW5kbGluZyB0aGUgY29tbWFuZCBhbmQgd2hpY2ggZGlkbid0XG4gICAgdGhpcy5sb2dQbHVnaW5IYW5kbGVyUmVwb3J0KHBsdWdpbnMsIHtjbWQsIGNtZEhhbmRsZWRCeX0pO1xuXG4gICAgLy8gQW5kIGZpbmFsbHksIGlmIHRoZSBjb21tYW5kIHdhcyBjcmVhdGVTZXNzaW9uLCB3ZSB3YW50IHRvIG1pZ3JhdGUgYW55IHBsdWdpbnMgd2hpY2ggd2VyZVxuICAgIC8vIHByZXZpb3VzbHkgc2Vzc2lvbmxlc3MgdG8gdXNlIHRoZSBuZXcgc2Vzc2lvbklkLCBzbyB0aGF0IHBsdWdpbnMgY2FuIHNoYXJlIHN0YXRlIGJldHdlZW5cbiAgICAvLyB0aGVpciBjcmVhdGVTZXNzaW9uIG1ldGhvZCBhbmQgb3RoZXIgaW5zdGFuY2UgbWV0aG9kc1xuICAgIGlmIChjbWQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQgJiYgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMubGVuZ3RoICYmICFyZXMuZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IF8uZmlyc3QocmVzLnZhbHVlKTtcbiAgICAgIGxvZy5pbmZvKGBQcm9tb3RpbmcgJHt0aGlzLnNlc3Npb25sZXNzUGx1Z2lucy5sZW5ndGh9IHNlc3Npb25sZXNzIHBsdWdpbnMgdG8gYmUgYXR0YWNoZWQgYCArXG4gICAgICAgICAgICAgICBgdG8gc2Vzc2lvbiBJRCAke3Nlc3Npb25JZH1gKTtcbiAgICAgIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSA9IHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zO1xuICAgICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgd3JhcENvbW1hbmRXaXRoUGx1Z2lucyAoe2RyaXZlciwgY21kLCBhcmdzLCBuZXh0LCBjbWRIYW5kbGVkQnksIHBsdWdpbnN9KSB7XG4gICAgcGx1Z2lucy5sZW5ndGggJiYgbG9nLmluZm8oYFBsdWdpbnMgd2hpY2ggY2FuIGhhbmRsZSBjbWQgJyR7Y21kfSc6ICR7cGx1Z2lucy5tYXAoKHApID0+IHAubmFtZSl9YCk7XG5cbiAgICAvLyBub3cgd2UgY2FuIGdvIHRocm91Z2ggZWFjaCBwbHVnaW4gYW5kIHdyYXAgYG5leHRgIGFyb3VuZCBpdHMgb3duIGhhbmRsZXIsIHBhc3NpbmcgdGhlICpvbGQqXG4gICAgLy8gbmV4dCBpbiBzbyB0aGF0IGl0IGNhbiBjYWxsIGl0IGlmIGl0IHdhbnRzIHRvXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgLy8gbmVlZCBhbiBJSUZFIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoZSB2YWx1ZSBvZiBuZXh0IHRoYXQncyBwYXNzZWQgdG8gcGx1Z2luLmhhbmRsZSB0byBiZVxuICAgICAgLy8gZXhhY3RseSB0aGUgdmFsdWUgb2YgbmV4dCBoZXJlIGJlZm9yZSByZWFzc2lnbm1lbnQ7IHdlIGRvbid0IHdhbnQgaXQgdG8gYmUgbGF6aWx5XG4gICAgICAvLyBldmFsdWF0ZWQsIG90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24gb2YgdGhlIGxhc3QgYG5leHRgIHRvIGJlIGRlZmluZWQuXG4gICAgICBjbWRIYW5kbGVkQnlbcGx1Z2luLm5hbWVdID0gZmFsc2U7IC8vIHdlIHNlZSBhIG5ldyBwbHVnaW4sIHNvIGFkZCBpdCB0byB0aGUgJ2NtZEhhbmRsZWRCeScgb2JqZWN0XG4gICAgICBuZXh0ID0gKChfbmV4dCkgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICBsb2cuaW5mbyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGlzIG5vdyBoYW5kbGluZyBjbWQgJyR7Y21kfSdgKTtcbiAgICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IHRydWU7IC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgdGhpcyBwbHVnaW4gaGFzIGF0dGVtcHRlZCB0byBoYW5kbGUgY21kXG4gICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBjb21tYW5kIHZpYSBhIGNvbW1hbmQtc3BlY2lmaWMgaGFuZGxlciBvbiB0aGUgcGx1Z2luXG4gICAgICAgIGlmIChwbHVnaW5bY21kXSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW5bY21kXShfbmV4dCwgZHJpdmVyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UsIGNhbGwgdGhlIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW4uaGFuZGxlKF9uZXh0LCBkcml2ZXIsIGNtZCwgLi4uYXJncyk7XG4gICAgICB9KShuZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIGxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQgKHBsdWdpbnMsIHtjbWQsIGNtZEhhbmRsZWRCeX0pIHtcbiAgICBpZiAoIXBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZGF5LCB3ZSBoYXZlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgd2hpY2ggcGx1Z2lucyBlbmRlZCB1cCBnZXR0aW5nXG4gICAgLy8gdGhlaXIgY29kZSBydW4gYXMgcGFydCBvZiBoYW5kbGluZyB0aGlzIGNvbW1hbmQuIEJlY2F1c2UgcGx1Z2lucyBjYW4gY2hvb3NlICpub3QqIHRvXG4gICAgLy8gcGFzcyBjb250cm9sIHRvIG90aGVyIHBsdWdpbnMgb3IgdG8gdGhlIGRlZmF1bHQgZHJpdmVyIGJlaGF2aW9yLCB0aGlzIGlzIGluZm9ybWF0aW9uXG4gICAgLy8gd2hpY2ggaXMgcHJvYmFibHkgdXNlZnVsIHRvIHRoZSB1c2VyIChlc3BlY2lhbGx5IGluIHNpdHVhdGlvbnMgd2hlcmUgcGx1Z2lucyBtaWdodCBub3RcbiAgICAvLyBpbnRlcmFjdCB3ZWxsIHRvZ2V0aGVyLCBhbmQgaXQgd291bGQgYmUgaGFyZCB0byBkZWJ1ZyBvdGhlcndpc2Ugd2l0aG91dCB0aGlzIGtpbmQgb2ZcbiAgICAvLyBtZXNzYWdlKS5cbiAgICBjb25zdCBkaWRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBjb25zdCBkaWRudEhhbmRsZSA9IE9iamVjdC5rZXlzKGNtZEhhbmRsZWRCeSkuZmlsdGVyKChrKSA9PiAhY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBpZiAoZGlkbnRIYW5kbGUubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLmluZm8oYENvbW1hbmQgJyR7Y21kfScgd2FzICpub3QqIGhhbmRsZWQgYnkgdGhlIGZvbGxvd2luZyBiZWhhdmlvdXJzIG9yIHBsdWdpbnMsIGV2ZW4gYCArXG4gICAgICAgICAgICAgICBgdGhvdWdoIHRoZXkgd2VyZSByZWdpc3RlcmVkIHRvIGhhbmRsZSBpdDogJHtKU09OLnN0cmluZ2lmeShkaWRudEhhbmRsZSl9LiBUaGUgYCArXG4gICAgICAgICAgICAgICBgY29tbWFuZCAqd2FzKiBoYW5kbGVkIGJ5IHRoZXNlOiAke0pTT04uc3RyaW5naWZ5KGRpZEhhbmRsZSl9LmApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXcmFwcGVkQ29tbWFuZCAoe3dyYXBwZWRDbWQsIHByb3RvY29sfSkge1xuICAgIGxldCBjbWRSZXMsIGNtZEVyciwgcmVzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGB3cmFwcGVkQ21kYCBkZWZpbmVzIGEgd2hvbGUgc2VxdWVuY2Ugb2YgcGx1Z2luIGhhbmRsZXJzLCBjdWxtaW5hdGluZyBpblxuICAgICAgLy8gb3VyIGRlZmF1bHQgaGFuZGxlci4gV2hhdGV2ZXIgaXQgcmV0dXJucyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICAgICAgLy8gdXNlci5cbiAgICAgIGNtZFJlcyA9IGF3YWl0IHdyYXBwZWRDbWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbWRFcnIgPSBlO1xuICAgIH1cblxuICAgIC8vIFNhZGx5LCB3ZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCBraW5kIG9mIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLiBJdCB3aWxsIGVpdGhlciBiZSBhIGJhcmVcbiAgICAvLyBvYmplY3QsIG9yIGEgcHJvdG9jb2wtYXdhcmUgb2JqZWN0IHdpdGggcHJvdG9jb2wgYW5kIGVycm9yL3ZhbHVlIGtleXMuIFNvIHdlIG5lZWQgdG8gc25pZmZcbiAgICAvLyBpdCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGRvdWJsZS13cmFwIGl0IGlmIGl0J3MgdGhlIGxhdHRlciBraW5kLlxuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY21kUmVzKSAmJiBfLmhhcyhjbWRSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICByZXMgPSBjbWRSZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy52YWx1ZSA9IGNtZFJlcztcbiAgICAgIHJlcy5lcnJvciA9IGNtZEVycjtcbiAgICAgIHJlcy5wcm90b2NvbCA9IHByb3RvY29sO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgXy5pc0Z1bmN0aW9uKGRzdFNlc3Npb24ucHJveHlBY3RpdmUpICYmIGRzdFNlc3Npb24ucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uID8gZHN0U2Vzc2lvbi5nZXRQcm94eUF2b2lkTGlzdCgpIDogW107XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBkc3RTZXNzaW9uLmNhblByb3h5KHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8gaGVscCBkZWNpZGUgd2hpY2ggY29tbWFuZHMgc2hvdWxkIGJlIHByb3hpZWQgdG8gc3ViLWRyaXZlcnMgYW5kIHdoaWNoXG4vLyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzLCBvdXIgdW1icmVsbGEgZHJpdmVyXG5mdW5jdGlvbiBpc0FwcGl1bURyaXZlckNvbW1hbmQgKGNtZCkge1xuICByZXR1cm4gIWlzU2Vzc2lvbkNvbW1hbmQoY21kKSB8fCBjbWQgPT09ICdkZWxldGVTZXNzaW9uJztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBBcHBpdW0gdHJpZWQgdG8gcHJveHkgYSBjb21tYW5kIHVzaW5nIGEgZHJpdmVyJ3MgYHByb3h5Q29tbWFuZGAgbWV0aG9kIGJ1dCB0aGVcbiAqIG1ldGhvZCBkaWQgbm90IGV4aXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9OT19EUklWRVJfUFJPWFlDT01NQU5EJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoYFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIGNvbW1hbmQgd2FzIHRvIHByb3h5LCBidXQgdGhlIGRyaXZlciBgICtcbiAgICAgICAgICBgZGlkIG5vdCBoYXZlIHRoZSAncHJveHlDb21tYW5kJyBtZXRob2QgZGVmaW5lZC4gVG8gZnVsbHkgc3VwcG9ydCBgICtcbiAgICAgICAgICBgcGx1Z2lucywgZHJpdmVycyBzaG91bGQgaGF2ZSAncHJveHlDb21tYW5kJyBzZXQgdG8gYSBqd3BQcm94eSBvYmplY3QncyBgICtcbiAgICAgICAgICBgJ2NvbW1hbmQoKScgbWV0aG9kLCBpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsICdwcm94eVJlcVJlcydgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBcHBpdW1Ecml2ZXIgfTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXRpY0V4dE1lbWJlcnNcbiAqIEBwcm9wZXJ0eSB7KGFwcDogaW1wb3J0KCdleHByZXNzJykuRXhwcmVzcywgaHR0cFNlcnZlcjogaW1wb3J0KCdodHRwJykuU2VydmVyKSA9PiBpbXBvcnQoJ3R5cGUtZmVzdCcpLlByb21pc2FibGU8dm9pZD59IFt1cGRhdGVTZXJ2ZXJdXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnQGFwcGl1bS9iYXNlLWRyaXZlcicpLk1ldGhvZE1hcH0gW25ld01ldGhvZE1hcF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXRpY1BsdWdpbk1lbWJlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbHVnaW5OYW1lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd0eXBlLWZlc3QnKS5DbGFzczx1bmtub3duPiAmIFN0YXRpY1BsdWdpbk1lbWJlcnMgJiBTdGF0aWNFeHRNZW1iZXJzfSBQbHVnaW5FeHRlbnNpb25DbGFzc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgndHlwZS1mZXN0JykuQ2xhc3M8dW5rbm93bj4gJiBTdGF0aWNFeHRNZW1iZXJzfSBEcml2ZXJFeHRlbnNpb25DbGFzc1xuICovXG4iXSwiZmlsZSI6ImxpYi9hcHBpdW0uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
556
+ exports.NoDriverProxyCommandError = NoDriverProxyCommandError;
557
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJ0bXBEaXIiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1RNUF9ESVIiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwic2Vzc2lvbnMiLCJwZW5kaW5nRHJpdmVycyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImxvZyIsIl9sb2ciLCJpbnN0YW5jZU5hbWUiLCJuYW1lIiwibm9kZSIsImdldE9iamVjdElkIiwic3Vic3RyaW5nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiZHJpdmVyQ29uZmlnIiwic2VydmVyIiwiaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCIsInNlc3Npb25FeGlzdHMiLCJzZXNzaW9uSWQiLCJkc3RTZXNzaW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsImdldFN0YXR1cyIsImJ1aWxkIiwiXyIsImNsb25lIiwiZ2V0U2Vzc2lvbnMiLCJhY3F1aXJlIiwidG9QYWlycyIsIm1hcCIsImlkIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwiY2FwcyIsInByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCIsImRyaXZlck5hbWUiLCJkcml2ZXJWZXJzaW9uIiwiZHJpdmVyQmFzZVZlcnNpb24iLCJpbmZvIiwiQVBQSVVNX1ZFUiIsImJhc2VWZXJzaW9uIiwiYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJleHRJbnN0YW5jZSIsImFsbENsaUFyZ3NGb3JFeHQiLCJpc0VtcHR5IiwiZGVmYXVsdHMiLCJjbGlBcmdzIiwib21pdEJ5IiwidmFsdWUiLCJrZXkiLCJpc0VxdWFsIiwiY3JlYXRlU2Vzc2lvbiIsImpzb253cENhcHMiLCJyZXFDYXBzIiwidzNjQ2FwYWJpbGl0aWVzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImNsb25lRGVlcCIsImRlZmF1bHRTZXR0aW5ncyIsImp3cFNldHRpbmdzIiwiT2JqZWN0IiwiYXNzaWduIiwidzNjU2V0dGluZ3MiLCJhbHdheXNNYXRjaCIsImZpcnN0TWF0Y2hFbnRyeSIsImZpcnN0TWF0Y2giLCJwcm90b2NvbCIsImlubmVyU2Vzc2lvbklkIiwiZENhcHMiLCJwYXJzZWRDYXBzIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJlcnJvciIsIklubmVyRHJpdmVyIiwidmVyc2lvbiIsImZpbmRNYXRjaGluZ0RyaXZlciIsInNlc3Npb25PdmVycmlkZSIsImRlbGV0ZUFsbFNlc3Npb25zIiwicnVubmluZ0RyaXZlcnNEYXRhIiwib3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEiLCJkcml2ZXJJbnN0YW5jZSIsInJlbGF4ZWRTZWN1cml0eUVuYWJsZWQiLCJkZW55SW5zZWN1cmUiLCJhIiwiYWxsb3dJbnNlY3VyZSIsInNlcnZlckhvc3QiLCJhZGRyZXNzIiwic2VydmVyUG9ydCIsInBvcnQiLCJzZXJ2ZXJQYXRoIiwiYmFzZVBhdGgiLCJjdXJTZXNzaW9uRGF0YUZvckRyaXZlciIsImUiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwibWVzc2FnZSIsImRydiIsImRyaXZlckRhdGEiLCJwdXNoIiwicHVsbCIsImF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiaXNXM0NQcm90b2NvbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1cGRhdGVTZXR0aW5ncyIsImlzTWpzb253cFByb3RvY29sIiwib25TaHV0ZG93biIsImNhdXNlIiwiRXJyb3IiLCJ3YXJuIiwicGx1Z2luIiwiaXNGdW5jdGlvbiIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZGVidWciLCJkYXRhIiwidmFsdWVzIiwiZmlsdGVyIiwicyIsImRhdHVtIiwiZGVsZXRlU2Vzc2lvbiIsIm90aGVyU2Vzc2lvbnNEYXRhIiwiY3VyQ29uc3RydWN0b3JOYW1lIiwib3B0cyIsInNlc3Npb25zQ291bnQiLCJzaXplIiwiZm9yY2UiLCJyZWFzb24iLCJ1dGlsIiwicGx1cmFsaXplIiwiY2xlYW51cFByb21pc2VzIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwiY2xlYW51cFByb21pc2UiLCJwbHVnaW5zRm9yU2Vzc2lvbiIsImNyZWF0ZVBsdWdpbkluc3RhbmNlcyIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImNtZCIsInAiLCJoYW5kbGUiLCJQbHVnaW5DbGFzcyIsInBsdWdpbk5hbWUiLCJleGVjdXRlQ29tbWFuZCIsImlzR2V0U3RhdHVzIiwiR0VUX1NUQVRVU19DT01NQU5EIiwiaXNEZWxldGVTZXNzaW9uIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImlzVW1icmVsbGFDbWQiLCJpc0FwcGl1bURyaXZlckNvbW1hbmQiLCJpc1Nlc3Npb25DbWQiLCJyZXFGb3JQcm94eSIsImxhc3QiLCJwb3AiLCJwbHVnaW5zIiwiY21kSGFuZGxlZEJ5IiwiZGVmYXVsdCIsImRlZmF1bHRCZWhhdmlvciIsImxlbmd0aCIsInByb3h5Q29tbWFuZCIsIk5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IiLCJvcmlnaW5hbFVybCIsIm1ldGhvZCIsImJvZHkiLCJ3cmFwcGVkQ21kIiwid3JhcENvbW1hbmRXaXRoUGx1Z2lucyIsIm5leHQiLCJyZXMiLCJleGVjdXRlV3JhcHBlZENvbW1hbmQiLCJsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IiwiQ1JFQVRFX1NFU1NJT05fQ09NTUFORCIsImZpcnN0IiwiX25leHQiLCJkaWRIYW5kbGUiLCJrIiwiZGlkbnRIYW5kbGUiLCJjbWRSZXMiLCJjbWRFcnIiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwicHJveHlBY3RpdmUiLCJnZXRQcm94eUF2b2lkTGlzdCIsImNhblByb3h5IiwiY29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSw0QkFBNEIsR0FBRztBQUNuQ0MsRUFBQUEsY0FBYyxFQUFFO0FBQ2RDLElBQUFBLFFBQVEsRUFBRSxJQURJO0FBRWRDLElBQUFBLFFBQVEsRUFBRTtBQUZJLEdBRG1CO0FBS25DQyxFQUFBQSxZQUFZLEVBQUU7QUFDWkYsSUFBQUEsUUFBUSxFQUFFLElBREU7QUFFWkMsSUFBQUEsUUFBUSxFQUFFO0FBRkU7QUFMcUIsQ0FBckM7QUFXQSxNQUFNRSxpQkFBaUIsR0FBRyxJQUFJQyxrQkFBSixFQUExQjtBQUNBLE1BQU1DLG1CQUFtQixHQUFHLElBQUlELGtCQUFKLEVBQTVCOztBQUVBLE1BQU1FLFlBQU4sU0FBMkJDLHNCQUEzQixDQUFzQztBQUNwQ0MsRUFBQUEsV0FBVyxDQUFFQyxJQUFGLEVBQVE7QUFLakIsUUFBSUEsSUFBSSxDQUFDQyxNQUFULEVBQWlCO0FBQ2ZDLE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxjQUFaLEdBQTZCSixJQUFJLENBQUNDLE1BQWxDO0FBQ0Q7O0FBRUQsVUFBTUQsSUFBTjtBQUVBLFNBQUtLLHFCQUFMLEdBQTZCaEIsNEJBQTdCO0FBR0EsU0FBS2lCLG1CQUFMLEdBQTJCLENBQTNCO0FBRUEsU0FBS04sSUFBTCxHQUFZLEVBQUMsR0FBR0E7QUFBSixLQUFaO0FBS0EsU0FBS08sUUFBTCxHQUFnQixFQUFoQjtBQUtBLFNBQUtDLGNBQUwsR0FBc0IsRUFBdEI7QUFHQSxTQUFLQyxhQUFMLEdBQXFCLEVBQXJCO0FBQ0EsU0FBS0MsY0FBTCxHQUFzQixFQUF0QjtBQUNBLFNBQUtDLGtCQUFMLEdBQTBCLEVBQTFCO0FB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V0FBT0MsVUFBVSxHQUFHQSxVQUFVLENBQUNrSyxpQkFBWCxFQUFILEdBQW9DLEVBQXJEO0FBQ0Q7O0FBRURDLEVBQUFBLFFBQVEsQ0FBRXBLLFNBQUYsRUFBYTtBQUNuQixVQUFNQyxVQUFVLEdBQUcsS0FBS25CLFFBQUwsQ0FBY2tCLFNBQWQsQ0FBbkI7QUFDQSxXQUFPQyxVQUFVLElBQUlBLFVBQVUsQ0FBQ21LLFFBQVgsQ0FBb0JwSyxTQUFwQixDQUFyQjtBQUNEOztBQWxuQm1DOzs7O0FBdW5CdEMsU0FBU21JLHFCQUFULENBQWdDWCxHQUFoQyxFQUFxQztBQUNuQyxTQUFPLENBQUMsa0NBQWlCQSxHQUFqQixDQUFELElBQTBCQSxHQUFHLEtBQUssZUFBekM7QUFDRDs7QUFNTSxNQUFNc0IseUJBQU4sU0FBd0NsRCxLQUF4QyxDQUE4QztBQUluRHlFLEVBQUFBLElBQUksR0FBRyxrQ0FBSDs7QUFFSi9MLEVBQUFBLFdBQVcsR0FBSTtBQUNiLFVBQU8scUVBQUQsR0FDQyxtRUFERCxHQUVDLHlFQUZELEdBR0MsNkRBSFA7QUFJRDs7QUFYa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZ2V0QnVpbGRJbmZvLCB1cGRhdGVCdWlsZEluZm8sIEFQUElVTV9WRVIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzU2Vzc2lvbkNvbW1hbmQsXG4gICAgICAgICBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELCBERUxFVEVfU0VTU0lPTl9DT01NQU5ELCBHRVRfU1RBVFVTX0NPTU1BTkRcbn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIHB1bGxTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdXRpbCwgbm9kZSwgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5jb25zdCBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzID0ge1xuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBwbGF0Zm9ybU5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbn07XG5cbmNvbnN0IHNlc3Npb25zTGlzdEd1YXJkID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgcGVuZGluZ0RyaXZlcnNHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChhcmdzKSB7XG4gICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIHNldCBgLS10bXBgIGhlcmUgc2luY2UgaXQgc2hvdWxkIGJlIHNldCB0b1xuICAgIC8vIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSIG9uY2UgYXQgYW4gaW5pdGlhbCBwb2ludCBpbiB0aGUgQXBwaXVtIGxpZmVjeWNsZS5cbiAgICAvLyBUaGUgcHJvY2VzcyBhcmd1bWVudCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgQmFzZURyaXZlci5cbiAgICAvLyBQbGVhc2UgY2FsbCBAYXBwaXVtL3N1cHBvcnQudGVtcERpciBtb2R1bGUgdG8gYXBwbHkgdGhpcyBiZW5lZml0LlxuICAgIGlmIChhcmdzLnRtcERpcikge1xuICAgICAgcHJvY2Vzcy5lbnYuQVBQSVVNX1RNUF9ESVIgPSBhcmdzLnRtcERpcjtcbiAgICB9XG5cbiAgICBzdXBlcihhcmdzKTtcblxuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cztcblxuICAgIC8vIHRoZSBtYWluIEFwcGl1bSBEcml2ZXIgaGFzIG5vIG5ldyBjb21tYW5kIHRpbWVvdXRcbiAgICB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSAwO1xuXG4gICAgdGhpcy5hcmdzID0gey4uLmFyZ3N9O1xuXG4gICAgLy8gQWNjZXNzIHRvIHNlc3Npb25zIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICAvLyBpdCBtaWdodCBiZSBjaGFuZ2VkIGJ5IG90aGVyIGFzeW5jIGNhbGxzIGF0IGFueSB0aW1lXG4gICAgLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICB0aGlzLnNlc3Npb25zID0ge307XG5cbiAgICAvLyBBY2Nlc3MgdG8gcGVuZGluZyBkcml2ZXJzIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICAvLyBpdCBtaWdodCBiZSBjaGFuZ2VkIGJ5IG90aGVyIGFzeW5jIGNhbGxzIGF0IGFueSB0aW1lXG4gICAgLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICB0aGlzLnBlbmRpbmdEcml2ZXJzID0ge307XG5cbiAgICAvKiogQHR5cGUge1BsdWdpbkV4dGVuc2lvbkNsYXNzW119ICovXG4gICAgdGhpcy5wbHVnaW5DbGFzc2VzID0gW107IC8vIGxpc3Qgb2Ygd2hpY2ggcGx1Z2lucyBhcmUgYWN0aXZlXG4gICAgdGhpcy5zZXNzaW9uUGx1Z2lucyA9IHt9OyAvLyBtYXAgb2Ygc2Vzc2lvbnMgdG8gYWN0dWFsIHBsdWdpbiBpbnN0YW5jZXMgcGVyIHNlc3Npb25cbiAgICB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucyA9IFtdOyAvLyBzb21lIGNvbW1hbmRzIGFyZSBzZXNzaW9ubGVzcywgc28gd2UgbmVlZCBhIHNldCBvZiBwbHVnaW5zIGZvciB0aGVtXG5cbiAgICAvLyBhbGxvdyB0aGlzIHRvIGhhcHBlbiBpbiB0aGUgYmFja2dyb3VuZCwgc28gbm8gYGF3YWl0YFxuICAgIHVwZGF0ZUJ1aWxkSW5mbygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IHVtYnJlbGxhIGRyaXZlciBpbnN0YW5jZVxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGdldCBsb2cgKCkge1xuICAgIGlmICghdGhpcy5fbG9nKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9QCR7bm9kZS5nZXRPYmplY3RJZCh0aGlzKS5zdWJzdHJpbmcoMCwgNCl9YDtcbiAgICAgIHRoaXMuX2xvZyA9IGxvZ2dlci5nZXRMb2dnZXIoaW5zdGFuY2VOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvZztcbiAgfVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCcuL2V4dGVuc2lvbi9kcml2ZXItY29uZmlnJykuRHJpdmVyQ29uZmlnfHVuZGVmaW5lZH0gKi9cbiAgZHJpdmVyQ29uZmlnO1xuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdleHByZXNzJykuRXhwcmVzc3x1bmRlZmluZWR9ICovXG4gIHNlcnZlcjtcblxuICAvKipcbiAgICogQ2FuY2VsIGNvbW1hbmRzIHF1ZXVlaW5nIGZvciB0aGUgdW1icmVsbGEgQXBwaXVtIGRyaXZlclxuICAgKi9cbiAgZ2V0IGlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbnMgKCkge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgcmV0dXJuIF8udG9QYWlycyhzZXNzaW9ucylcbiAgICAgIC5tYXAoKFtpZCwgZHJpdmVyXSkgPT4gKHtpZCwgY2FwYWJpbGl0aWVzOiBkcml2ZXIuY2Fwc30pKTtcbiAgfVxuXG4gIHByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCAoZHJpdmVyTmFtZSwgZHJpdmVyVmVyc2lvbiwgZHJpdmVyQmFzZVZlcnNpb24pIHtcbiAgICB0aGlzLmxvZy5pbmZvKGRyaXZlclZlcnNpb25cbiAgICAgID8gYEFwcGl1bSB2JHtBUFBJVU1fVkVSfSBjcmVhdGluZyBuZXcgJHtkcml2ZXJOYW1lfSAodiR7ZHJpdmVyVmVyc2lvbn0pIHNlc3Npb25gXG4gICAgICA6IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gc2Vzc2lvbmBcbiAgICApO1xuICAgIHRoaXMubG9nLmluZm8oYENoZWNraW5nIEJhc2VEcml2ZXIgdmVyc2lvbnMgZm9yIEFwcGl1bSBhbmQgJHtkcml2ZXJOYW1lfWApO1xuICAgIHRoaXMubG9nLmluZm8oQXBwaXVtRHJpdmVyLmJhc2VWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb24gaXMgJHtBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgICB0aGlzLmxvZy5pbmZvKGRyaXZlckJhc2VWZXJzaW9uXG4gICAgICA/IGAke2RyaXZlck5hbWV9J3MgQmFzZURyaXZlciB2ZXJzaW9uIGlzICR7ZHJpdmVyQmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSAke2RyaXZlck5hbWV9J3MgQmFzZURyaXZlciB2ZXJzaW9uYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIGFzc2lnbiBDTEkgYXJncyBmb3IgYSBkcml2ZXIgb3IgcGx1Z2luXG4gICAqXG4gICAqIElmIHRoZSBleHRlbnNpb24gaGFzIHByb3ZpZGVkIGEgc2NoZW1hLCB2YWxpZGF0aW9uIGhhcyBhbHJlYWR5IGhhcHBlbmVkLlxuICAgKlxuICAgKiBBbnkgYXJnIHdoaWNoIGlzIGVxdWFsIHRvIGl0cyBkZWZhdWx0IHZhbHVlIHdpbGwgbm90IGJlIGFzc2lnbmVkIHRvIHRoZSBleHRlbnNpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuL21hbmlmZXN0JykuRXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAnZHJpdmVyJyBvciAncGx1Z2luJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRJbnN0YW5jZSB0aGUgZHJpdmVyIG9yIHBsdWdpbiBpbnN0YW5jZVxuICAgKi9cbiAgYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIChleHRUeXBlLCBleHROYW1lLCBleHRJbnN0YW5jZSkge1xuICAgIGNvbnN0IGFsbENsaUFyZ3NGb3JFeHQgPSB0aGlzLmFyZ3NbZXh0VHlwZV0/LltleHROYW1lXTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxDbGlBcmdzRm9yRXh0KSkge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgIGNvbnN0IGNsaUFyZ3MgPSBfLmlzRW1wdHkoZGVmYXVsdHMpXG4gICAgICAgID8gYWxsQ2xpQXJnc0ZvckV4dFxuICAgICAgICA6IF8ub21pdEJ5KGFsbENsaUFyZ3NGb3JFeHQsICh2YWx1ZSwga2V5KSA9PiBfLmlzRXF1YWwoZGVmYXVsdHNba2V5XSwgdmFsdWUpKTtcbiAgICAgIGlmICghXy5pc0VtcHR5KGNsaUFyZ3MpKSB7XG4gICAgICAgIGV4dEluc3RhbmNlLmNsaUFyZ3MgPSBjbGlBcmdzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgZm9ybWF0dGVkIGRlc2lyZWQgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXFDYXBzIFJlcXVpcmVkIGNhcGFiaWxpdGllcyAoSlNPTldQIHN0YW5kYXJkKVxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwYWJpbGl0aWVzIFczQyBjYXBhYmlsaXRpZXNcbiAgICogQHJldHVybiB7QXJyYXl9IFVuaXF1ZSBzZXNzaW9uIElEIGFuZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGpzb253cENhcHMsIHJlcUNhcHMsIHczY0NhcGFiaWxpdGllcykge1xuICAgIGNvbnN0IGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh0aGlzLmFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZGVmYXVsdFNldHRpbmdzID0gcHVsbFNldHRpbmdzKGRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGpzb253cENhcHMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBzKTtcbiAgICBjb25zdCBqd3BTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgcHVsbFNldHRpbmdzKGpzb253cENhcHMpKTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgandwU2V0dGluZ3MpO1xuICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncygodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5hbHdheXNNYXRjaCB8fCB7fSkpO1xuICAgIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mICgodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih3M2NTZXR0aW5ncywgcHVsbFNldHRpbmdzKGZpcnN0TWF0Y2hFbnRyeSkpO1xuICAgIH1cblxuICAgIGxldCBwcm90b2NvbDtcbiAgICBsZXQgaW5uZXJTZXNzaW9uSWQsIGRDYXBzO1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSB0aGUgY2FwcyBpbnRvIGEgZm9ybWF0IHRoYXQgdGhlIElubmVyRHJpdmVyIHdpbGwgYWNjZXB0XG4gICAgICBjb25zdCBwYXJzZWRDYXBzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gICAgICAgIGpzb253cENhcHMsXG4gICAgICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICAgICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIGVycm9yfSA9IHBhcnNlZENhcHM7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIHRoZSBwYXJzaW5nIG9mIHRoZSBjYXBzIHByb2R1Y2VkIGFuIGVycm9yLCB0aHJvdyBpdCBpbiBoZXJlXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJpdmVyOiBJbm5lckRyaXZlcixcbiAgICAgICAgdmVyc2lvbjogZHJpdmVyVmVyc2lvbixcbiAgICAgICAgZHJpdmVyTmFtZVxuICAgICAgfSA9IHRoaXMuZHJpdmVyQ29uZmlnLmZpbmRNYXRjaGluZ0RyaXZlcihkZXNpcmVkQ2Fwcyk7XG4gICAgICB0aGlzLnByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudChJbm5lckRyaXZlci5uYW1lLCBkcml2ZXJWZXJzaW9uLCBJbm5lckRyaXZlci5iYXNlVmVyc2lvbik7XG5cbiAgICAgIGlmICh0aGlzLmFyZ3Muc2Vzc2lvbk92ZXJyaWRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQWxsU2Vzc2lvbnMoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJ1bm5pbmdEcml2ZXJzRGF0YSwgb3RoZXJQZW5kaW5nRHJpdmVyc0RhdGE7XG5cbiAgICAgIGNvbnN0IGRyaXZlckluc3RhbmNlID0gbmV3IElubmVyRHJpdmVyKHRoaXMuYXJncywgdHJ1ZSk7XG5cbiAgICAgIC8vIFdlIHdhbnQgdG8gYXNzaWduIHNlY3VyaXR5IHZhbHVlcyBkaXJlY3RseSBvbiB0aGUgZHJpdmVyLiBUaGUgZHJpdmVyXG4gICAgICAvLyBzaG91bGQgbm90IHJlYWQgc2VjdXJpdHkgdmFsdWVzIGZyb20gYHRoaXMub3B0c2AgYmVjYXVzZSB0aG9zZSB2YWx1ZXNcbiAgICAgIC8vIGNvdWxkIGhhdmUgYmVlbiBzZXQgYnkgYSBtYWxpY2lvdXMgdXNlciB2aWEgY2FwYWJpbGl0aWVzLCB3aGVyZWFzIHdlXG4gICAgICAvLyB3YW50IGEgZ3VhcmFudGVlIHRoZSB2YWx1ZXMgd2VyZSBzZXQgYnkgdGhlIGFwcGl1bSBzZXJ2ZXIgYWRtaW5cbiAgICAgIGlmICh0aGlzLmFyZ3MucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHBseWluZyByZWxheGVkIHNlY3VyaXR5IHRvICcke0lubmVyRHJpdmVyLm5hbWV9JyBhcyBwZXIgYCArXG4gICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgIGBlbmFibGVkIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkIGJ5IC0tZGVueS1pbnNlY3VyZWApO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5yZWxheGVkU2VjdXJpdHlFbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5hcmdzLmRlbnlJbnNlY3VyZSkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRXhwbGljaXRseSBwcmV2ZW50aW5nIHVzZSBvZiBpbnNlY3VyZSBmZWF0dXJlczonKTtcbiAgICAgICAgdGhpcy5hcmdzLmRlbnlJbnNlY3VyZS5tYXAoKGEpID0+IHRoaXMubG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5kZW55SW5zZWN1cmUgPSB0aGlzLmFyZ3MuZGVueUluc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZSkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRXhwbGljaXRseSBlbmFibGluZyB1c2Ugb2YgaW5zZWN1cmUgZmVhdHVyZXM6Jyk7XG4gICAgICAgIHRoaXMuYXJncy5hbGxvd0luc2VjdXJlLm1hcCgoYSkgPT4gdGhpcy5sb2cuaW5mbyhgICAgICR7YX1gKSk7XG4gICAgICAgIGRyaXZlckluc3RhbmNlLmFsbG93SW5zZWN1cmUgPSB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZTtcbiAgICAgIH1cblxuICAgICAgLy8gTGlrZXdpc2UsIGFueSBkcml2ZXItc3BlY2lmaWMgQ0xJIGFyZ3MgdGhhdCB3ZXJlIHBhc3NlZCBpbiBzaG91bGQgYmUgYXNzaWduZWQgZGlyZWN0bHkgdG9cbiAgICAgIC8vIHRoZSBkcml2ZXIgc28gdGhhdCB0aGV5IGNhbm5vdCBiZSBtaW1pY2tlZCBieSBhIG1hbGljaW91cyB1c2VyIHNlbmRpbmcgaW4gY2FwYWJpbGl0aWVzXG4gICAgICB0aGlzLmFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbignZHJpdmVyJywgZHJpdmVyTmFtZSwgZHJpdmVySW5zdGFuY2UpO1xuXG5cbiAgICAgIC8vIFRoaXMgYXNzaWdubWVudCBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCB3ZWIgc29ja2V0cyBmdW5jdGlvbmFsaXR5IGluc2lkZSB0aGUgZHJpdmVyXG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXIgPSB0aGlzLnNlcnZlcjtcblxuICAgICAgLy8gRHJpdmVycy9wbHVnaW5zIG1pZ2h0IGFsc28gd2FudCB0byBrbm93IHdoZXJlIHRoZXkgYXJlIGhvc3RlZFxuICAgICAgZHJpdmVySW5zdGFuY2Uuc2VydmVySG9zdCA9IHRoaXMuYXJncy5hZGRyZXNzO1xuICAgICAgZHJpdmVySW5zdGFuY2Uuc2VydmVyUG9ydCA9IHRoaXMuYXJncy5wb3J0O1xuICAgICAgZHJpdmVySW5zdGFuY2Uuc2VydmVyUGF0aCA9IHRoaXMuYXJncy5iYXNlUGF0aDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcnVubmluZ0RyaXZlcnNEYXRhID0gYXdhaXQgdGhpcy5jdXJTZXNzaW9uRGF0YUZvckRyaXZlcihJbm5lckRyaXZlcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcGVuZGluZ0RyaXZlcnNHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0gPSB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdIHx8IFtdO1xuICAgICAgICBvdGhlclBlbmRpbmdEcml2ZXJzRGF0YSA9IHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0ubWFwKChkcnYpID0+IGRydi5kcml2ZXJEYXRhKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5wdXNoKGRyaXZlckluc3RhbmNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzXSA9IGF3YWl0IGRyaXZlckluc3RhbmNlLmNyZWF0ZVNlc3Npb24oXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHJlcUNhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIFsuLi5ydW5uaW5nRHJpdmVyc0RhdGEsIC4uLm90aGVyUGVuZGluZ0RyaXZlcnNEYXRhXVxuICAgICAgICApO1xuICAgICAgICBwcm90b2NvbCA9IGRyaXZlckluc3RhbmNlLnByb3RvY29sO1xuICAgICAgICBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF0gPSBkcml2ZXJJbnN0YW5jZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgICBfLnB1bGwodGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSwgZHJpdmVySW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyKGRyaXZlckluc3RhbmNlLCBpbm5lclNlc3Npb25JZCk7XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYE5ldyAke0lubmVyRHJpdmVyLm5hbWV9IHNlc3Npb24gY3JlYXRlZCBzdWNjZXNzZnVsbHksIHNlc3Npb24gYCArXG4gICAgICAgIGAke2lubmVyU2Vzc2lvbklkfSBhZGRlZCB0byBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG5cbiAgICAgIC8vIHNldCB0aGUgTmV3IENvbW1hbmQgVGltZW91dCBmb3IgdGhlIGlubmVyIGRyaXZlclxuICAgICAgZHJpdmVySW5zdGFuY2Uuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgICAvLyBhcHBseSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgKGlmIHByb3ZpZGVkKVxuICAgICAgaWYgKGRyaXZlckluc3RhbmNlLmlzVzNDUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KHczY1NldHRpbmdzKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHBseWluZyB0aGUgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIHBhcnNlZCBmcm9tIFczQyBjYXBzOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh3M2NTZXR0aW5ncykpO1xuICAgICAgICBhd2FpdCBkcml2ZXJJbnN0YW5jZS51cGRhdGVTZXR0aW5ncyh3M2NTZXR0aW5ncyk7XG4gICAgICB9IGVsc2UgaWYgKGRyaXZlckluc3RhbmNlLmlzTWpzb253cFByb3RvY29sKCkgJiYgIV8uaXNFbXB0eShqd3BTZXR0aW5ncykpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBNSlNPTldQIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGp3cFNldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGRyaXZlckluc3RhbmNlLnVwZGF0ZVNldHRpbmdzKGp3cFNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGVycm9yLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2wsXG4gICAgICB2YWx1ZTogW2lubmVyU2Vzc2lvbklkLCBkQ2FwcywgcHJvdG9jb2xdXG4gICAgfTtcbiAgfVxuXG4gIGF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIgKGRyaXZlciwgaW5uZXJTZXNzaW9uSWQpIHtcbiAgICBjb25zdCBvblNodXRkb3duID0gKGNhdXNlID0gbmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEVuZGluZyBzZXNzaW9uLCBjYXVzZSB3YXMgJyR7Y2F1c2UubWVzc2FnZX0nYCk7XG5cbiAgICAgIGlmICh0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXSkge1xuICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24ocGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBkZWZpbmVzIGFuIHVuZXhwZWN0ZWQgc2h1dGRvd24gaGFuZGxlcjsgY2FsbGluZyBpdCBub3dgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHBsdWdpbi5vblVuZXhwZWN0ZWRTaHV0ZG93bihkcml2ZXIsIGNhdXNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cud2FybihgR290IGFuIGVycm9yIHdoZW4gcnVubmluZyBwbHVnaW4gJHtwbHVnaW4ubmFtZX0gc2h1dGRvd24gaGFuZGxlcjogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGRvZXMgbm90IGRlZmluZSBhbiB1bmV4cGVjdGVkIHNodXRkb3duIGhhbmRsZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuaW5mbyhgUmVtb3Zpbmcgc2Vzc2lvbiAnJHtpbm5lclNlc3Npb25JZH0nIGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW2lubmVyU2Vzc2lvbklkXTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25QbHVnaW5zW2lubmVyU2Vzc2lvbklkXTtcbiAgICB9O1xuXG4gICAgaWYgKF8uaXNGdW5jdGlvbihkcml2ZXIub25VbmV4cGVjdGVkU2h1dGRvd24pKSB7XG4gICAgICBkcml2ZXIub25VbmV4cGVjdGVkU2h1dGRvd24ob25TaHV0ZG93bik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEZhaWxlZCB0byBhdHRhY2ggdGhlIHVuZXhwZWN0ZWQgc2h1dGRvd24gbGlzdGVuZXIuIGAgK1xuICAgICAgICBgSXMgJ29uVW5leHBlY3RlZFNodXRkb3duJyBtZXRob2QgYXZhaWxhYmxlIGZvciAnJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0nP2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGN1clNlc3Npb25EYXRhRm9yRHJpdmVyIChJbm5lckRyaXZlcikge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgY29uc3QgZGF0YSA9IF8udmFsdWVzKHNlc3Npb25zKVxuICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMuY29uc3RydWN0b3IubmFtZSA9PT0gSW5uZXJEcml2ZXIubmFtZSlcbiAgICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBzLmRyaXZlckRhdGEpO1xuICAgIGZvciAobGV0IGRhdHVtIG9mIGRhdGEpIHtcbiAgICAgIGlmICghZGF0dW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ibGVtIGdldHRpbmcgc2Vzc2lvbiBkYXRhIGZvciBkcml2ZXIgdHlwZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke0lubmVyRHJpdmVyLm5hbWV9OyBkb2VzIGl0IGltcGxlbWVudCAnZ2V0IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGRyaXZlckRhdGEnP2ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKHNlc3Npb25JZCkge1xuICAgIGxldCBwcm90b2NvbDtcbiAgICB0cnkge1xuICAgICAgbGV0IG90aGVyU2Vzc2lvbnNEYXRhID0gbnVsbDtcbiAgICAgIGxldCBkc3RTZXNzaW9uID0gbnVsbDtcbiAgICAgIGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VyQ29uc3RydWN0b3JOYW1lID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIG90aGVyU2Vzc2lvbnNEYXRhID0gXy50b1BhaXJzKHRoaXMuc2Vzc2lvbnMpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUuY29uc3RydWN0b3IubmFtZSA9PT0gY3VyQ29uc3RydWN0b3JOYW1lICYmIGtleSAhPT0gc2Vzc2lvbklkKVxuICAgICAgICAgICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlLmRyaXZlckRhdGEpO1xuICAgICAgICBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgICAgICBwcm90b2NvbCA9IGRzdFNlc3Npb24ucHJvdG9jb2w7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJHtzZXNzaW9uSWR9IGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkZWxldGVTZXNzaW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgb3Igbm90XG4gICAgICAgIC8vIG1ha2UgdGhlIHNlc3Npb24gdW5hdmFpbGFibGUsIGJlY2F1c2Ugd2hvIGtub3dzIHdoYXQgc3RhdGUgaXQgbWlnaHRcbiAgICAgICAgLy8gYmUgaW4gb3RoZXJ3aXNlXG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICB2YWx1ZTogYXdhaXQgZHN0U2Vzc2lvbi5kZWxldGVTZXNzaW9uKHNlc3Npb25JZCwgb3RoZXJTZXNzaW9uc0RhdGEpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgSGFkIHRyb3VibGUgZW5kaW5nIHNlc3Npb24gJHtzZXNzaW9uSWR9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcjogZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsU2Vzc2lvbnMgKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHNlc3Npb25zQ291bnQgPSBfLnNpemUodGhpcy5zZXNzaW9ucyk7XG4gICAgaWYgKDAgPT09IHNlc3Npb25zQ291bnQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdUaGVyZSBhcmUgbm8gYWN0aXZlIHNlc3Npb25zIGZvciBjbGVhbnVwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZm9yY2UgPSBmYWxzZSxcbiAgICAgIHJlYXNvbixcbiAgICB9ID0gb3B0cztcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnYWN0aXZlIHNlc3Npb24nLCBzZXNzaW9uc0NvdW50LCB0cnVlKX1gKTtcbiAgICBjb25zdCBjbGVhbnVwUHJvbWlzZXMgPSBmb3JjZVxuICAgICAgPyBfLnZhbHVlcyh0aGlzLnNlc3Npb25zKS5tYXAoKGRydikgPT4gZHJ2LnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKHJlYXNvbiAmJiBuZXcgRXJyb3IocmVhc29uKSkpXG4gICAgICA6IF8ua2V5cyh0aGlzLnNlc3Npb25zKS5tYXAoKGlkKSA9PiB0aGlzLmRlbGV0ZVNlc3Npb24oaWQpKTtcbiAgICBmb3IgKGNvbnN0IGNsZWFudXBQcm9taXNlIG9mIGNsZWFudXBQcm9taXNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xlYW51cFByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIHBsdWdpbnMgZm9yIGEgc2Vzc2lvbiAob3Igc2Vzc2lvbmxlc3MgcGx1Z2lucylcbiAgICpcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBzZXNzaW9uSWQgLSB0aGUgc2Vzc2lvbklkIChvciBudWxsKSB0byB1c2UgdG8gZmluZCBwbHVnaW5zXG4gICAqIEByZXR1cm5zIHtBcnJheX0gLSBhcnJheSBvZiBwbHVnaW4gaW5zdGFuY2VzXG4gICAqL1xuICBwbHVnaW5zRm9yU2Vzc2lvbiAoc2Vzc2lvbklkID0gbnVsbCkge1xuICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgIGlmICghdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXSA9IHRoaXMuY3JlYXRlUGx1Z2luSW5zdGFuY2VzKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdO1xuICAgIH1cblxuICAgIGlmIChfLmlzRW1wdHkodGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMpKSB7XG4gICAgICB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucyA9IHRoaXMuY3JlYXRlUGx1Z2luSW5zdGFuY2VzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucztcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBnZXQgcGx1Z2lucyBmb3IgYSBjb21tYW5kLCB3ZSBlaXRoZXIgZ2V0IHRoZSBwbHVnaW4gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogcGFydGljdWxhciBjb21tYW5kJ3Mgc2Vzc2lvbiwgb3IgaW4gdGhlIGNhc2Ugb2Ygc2Vzc2lvbmxlc3MgcGx1Z2lucywgcHVsbCBmcm9tIHRoZSBzZXQgb2ZcbiAgICogcGx1Z2luIGluc3RhbmNlcyByZXNlcnZlZCBmb3Igc2Vzc2lvbmxlc3MgY29tbWFuZHMgKGFuZCB3ZSBsYXppbHkgY3JlYXRlIHBsdWdpbiBpbnN0YW5jZXMgb25cbiAgICogZmlyc3QgdXNlKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kIC0gdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdG8gZmluZCBhIHBsdWdpbiB0byBoYW5kbGVcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBzZXNzaW9uSWQgLSB0aGUgcGFydGljdWxhciBzZXNzaW9uIGZvciB3aGljaCB0byBmaW5kIGEgcGx1Z2luLCBvciBudWxsIGlmXG4gICAqIHNlc3Npb25sZXNzXG4gICAqL1xuICBwbHVnaW5zVG9IYW5kbGVDbWQgKGNtZCwgc2Vzc2lvbklkID0gbnVsbCkge1xuICAgIC8vIHRvIGhhbmRsZSBhIGdpdmVuIGNvbW1hbmQsIGEgcGx1Z2luIHNob3VsZCBlaXRoZXIgaW1wbGVtZW50IHRoYXQgY29tbWFuZCBhcyBhIHBsdWdpblxuICAgIC8vIGluc3RhbmNlIG1ldGhvZCBvciBpdCBzaG91bGQgaW1wbGVtZW50IGEgZ2VuZXJpYyAnaGFuZGxlJyBtZXRob2RcbiAgICByZXR1cm4gdGhpcy5wbHVnaW5zRm9yU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgICAuZmlsdGVyKChwKSA9PiBfLmlzRnVuY3Rpb24ocFtjbWRdKSB8fCBfLmlzRnVuY3Rpb24ocC5oYW5kbGUpKTtcbiAgfVxuXG4gIGNyZWF0ZVBsdWdpbkluc3RhbmNlcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luQ2xhc3Nlcy5tYXAoKFBsdWdpbkNsYXNzKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gUGx1Z2luQ2xhc3MucGx1Z2luTmFtZTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IG5ldyBQbHVnaW5DbGFzcyhuYW1lKTtcbiAgICAgIHRoaXMuYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uKCdwbHVnaW4nLCBuYW1lLCBwbHVnaW4pO1xuICAgICAgcmV0dXJuIHBsdWdpbjtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kIChjbWQsIC4uLmFyZ3MpIHtcbiAgICAvLyBXZSBoYXZlIGJhc2ljYWxseSB0aHJlZSBjYXNlcyBmb3IgaG93IHRvIGhhbmRsZSBjb21tYW5kczpcbiAgICAvLyAxLiBoYW5kbGUgZ2V0U3RhdHVzICh3ZSBkbyB0aGlzIGFzIGEgc3BlY2lhbCBvdXQgb2YgYmFuZCBjYXNlIHNvIGl0IGRvZXNuJ3QgZ2V0IGFkZGVkIHRvIGFuXG4gICAgLy8gICAgZXhlY3V0aW9uIHF1ZXVlLCBhbmQgY2FuIGJlIGNhbGxlZCB3aGlsZSBlLmcuIGNyZWF0ZVNlc3Npb24gaXMgaW4gcHJvZ3Jlc3MpXG4gICAgLy8gMi4gaGFuZGxlIGNvbW1hbmRzIHRoYXQgdGhpcyB1bWJyZWxsYSBkcml2ZXIgc2hvdWxkIGhhbmRsZSwgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCBzZXNzaW9uXG4gICAgLy8gICAgZHJpdmVyIChmb3IgZXhhbXBsZSwgZGVsZXRlU2Vzc2lvbiwgb3Igb3RoZXIgbm9uLXNlc3Npb24gY29tbWFuZHMpXG4gICAgLy8gMy4gaGFuZGxlIHNlc3Npb24gZHJpdmVyIGNvbW1hbmRzLlxuICAgIC8vIFRoZSB0cmlja3kgcGFydCBpcyB0aGF0IGJlY2F1c2Ugd2Ugc3VwcG9ydCBjb21tYW5kIHBsdWdpbnMsIHdlIG5lZWQgdG8gd3JhcCBhbnkgb2YgdGhlc2VcbiAgICAvLyBjYXNlcyB3aXRoIHBsdWdpbiBoYW5kbGluZy5cblxuICAgIGNvbnN0IGlzR2V0U3RhdHVzID0gY21kID09PSBHRVRfU1RBVFVTX0NPTU1BTkQ7XG4gICAgY29uc3QgaXNEZWxldGVTZXNzaW9uID0gY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EO1xuICAgIGNvbnN0IGlzVW1icmVsbGFDbWQgPSAhaXNHZXRTdGF0dXMgJiYgaXNBcHBpdW1Ecml2ZXJDb21tYW5kKGNtZCk7XG4gICAgY29uc3QgaXNTZXNzaW9uQ21kID0gIWlzVW1icmVsbGFDbWQgfHwgaXNEZWxldGVTZXNzaW9uO1xuXG4gICAgLy8gaWYgYSBwbHVnaW4gb3ZlcnJpZGUgcHJveHlpbmcgZm9yIHRoaXMgY29tbWFuZCBhbmQgdGhhdCBpcyB3aHkgd2UgYXJlIGhlcmUgaW5zdGVhZCBvZiBqdXN0XG4gICAgLy8gbGV0dGluZyB0aGUgcHJvdG9jb2wgcHJveHkgdGhlIGNvbW1hbmQgZW50aXJlbHksIGRldGVybWluZSB0aGF0LCBnZXQgdGhlIHJlcXVlc3Qgb2JqZWN0IGZvclxuICAgIC8vIHVzZSBsYXRlciBvbiwgdGhlbiBjbGVhbiB1cCB0aGUgYXJnc1xuICAgIGNvbnN0IHJlcUZvclByb3h5ID0gXy5sYXN0KGFyZ3MpPy5yZXFGb3JQcm94eTtcbiAgICBpZiAocmVxRm9yUHJveHkpIHtcbiAgICAgIGFyZ3MucG9wKCk7XG4gICAgfVxuXG5cbiAgICAvLyBmaXJzdCBkbyBzb21lIGVycm9yIGNoZWNraW5nLiBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBjb21tYW5kIGV4ZWN1dGlvbiwgdGhlbiBtYWtlXG4gICAgLy8gc3VyZSB0aGF0IHNlc3Npb24gYWN0dWFsbHkgZXhpc3RzIG9uIHRoZSBzZXNzaW9uIGRyaXZlciwgYW5kIHNldCB0aGUgc2Vzc2lvbiBkcml2ZXIgaXRzZWxmXG4gICAgbGV0IHNlc3Npb25JZCA9IG51bGw7XG4gICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgIGxldCBwcm90b2NvbCA9IG51bGw7XG4gICAgbGV0IGRyaXZlciA9IHRoaXM7XG4gICAgaWYgKGlzU2Vzc2lvbkNtZCkge1xuICAgICAgc2Vzc2lvbklkID0gXy5sYXN0KGFyZ3MpO1xuICAgICAgZHN0U2Vzc2lvbiA9IGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSk7XG4gICAgICBpZiAoIWRzdFNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2Vzc2lvbiB3aXRoIGlkICcke3Nlc3Npb25JZH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICAvLyBub3cgc2F2ZSB0aGUgcmVzcG9uc2UgcHJvdG9jb2wgZ2l2ZW4gdGhhdCB0aGUgc2Vzc2lvbiBkcml2ZXIncyBwcm90b2NvbCBtaWdodCBkaWZmZXJcbiAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgIGlmICghaXNVbWJyZWxsYUNtZCkge1xuICAgICAgICBkcml2ZXIgPSBkc3RTZXNzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBhbnkgcGx1Z2lucyB3aGljaCBhcmUgcmVnaXN0ZXJlZCBhcyBoYW5kbGluZyB0aGlzIGNvbW1hbmRcbiAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5wbHVnaW5zVG9IYW5kbGVDbWQoY21kLCBzZXNzaW9uSWQpO1xuXG4gICAgLy8gbm93IHdlIGRlZmluZSBhICdjbWRIYW5kbGVkQnknIG9iamVjdCB3aGljaCB3aWxsIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcGx1Z2lucyBoYXZlIGhhbmRsZWQgdGhpc1xuICAgIC8vIGNvbW1hbmQuIHdlIGNhcmUgYWJvdXQgdGhpcyBiZWNhdXNlIChhKSBtdWx0aXBsZSBwbHVnaW5zIGNhbiBoYW5kbGUgdGhlIHNhbWUgY29tbWFuZCwgYW5kXG4gICAgLy8gKGIpIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYSBwbHVnaW4gd2lsbCBhY3R1YWxseSBjYWxsIHRoZSBuZXh0KCkgbWV0aG9kIHdoaWNoIHJ1bnMgdGhlXG4gICAgLy8gb3JpZ2luYWwgY29tbWFuZCBleGVjdXRpb24uIFRoaXMgcmVzdWx0cyBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgY29tbWFuZCBtaWdodCBiZSBoYW5kbGVkXG4gICAgLy8gYnkgc29tZSBidXQgbm90IGFsbCBwbHVnaW5zLCBvciBieSBwbHVnaW4ocykgYnV0IG5vdCBieSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gU28gc3RhcnQgb3V0XG4gICAgLy8gdGhpcyBvYmplY3QgZGVjbGFyaW5nIHRoYXQgdGhlIGRlZmF1bHQgaGFuZGxlciBoYXMgbm90IGJlZW4gZXhlY3V0ZWQuXG4gICAgY29uc3QgY21kSGFuZGxlZEJ5ID0ge2RlZmF1bHQ6IGZhbHNlfTtcblxuICAgIC8vIG5vdyB3ZSBkZWZpbmUgYW4gYXN5bmMgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gcGx1Z2lucywgYW5kIHN1Y2Nlc3NpdmVseSB3cmFwcGVkXG4gICAgLy8gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwbHVnaW4gdGhhdCBjYW4gaGFuZGxlIHRoZSBjb21tYW5kLiBUbyBzdGFydCBvZmYgd2l0aCwgdGhlIGFzeW5jXG4gICAgLy8gZnVuY3Rpb24gaXMgZGVmaW5lZCBhcyBjYWxsaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBpLmUuLCB3aGljaGV2ZXIgb2YgdGhlIDMgY2FzZXMgYWJvdmUgaXNcbiAgICAvLyB0aGUgYXBwcm9wcmlhdGUgb25lXG4gICAgY29uc3QgZGVmYXVsdEJlaGF2aW9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gaWYgd2UncmUgcnVubmluZyB3aXRoIHBsdWdpbnMsIG1ha2Ugc3VyZSB3ZSBsb2cgdGhhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBhY3R1YWxseVxuICAgICAgLy8gaGFwcGVuaW5nIHNvIHdlIGNhbiB0ZWxsIHdoZW4gdGhlIHBsdWdpbiBjYWxsIGNoYWluIGlzIHVud3JhcHBpbmcgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgIC8vIGlmIHRoYXQncyB3aGF0IGhhcHBlbnNcbiAgICAgIHBsdWdpbnMubGVuZ3RoICYmIHRoaXMubG9nLmluZm8oYEV4ZWN1dGluZyBkZWZhdWx0IGhhbmRsaW5nIGJlaGF2aW9yIGZvciBjb21tYW5kICcke2NtZH0nYCk7XG5cbiAgICAgIC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgd2Uga25vdyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGhhbmRsZWRcbiAgICAgIGNtZEhhbmRsZWRCeS5kZWZhdWx0ID0gdHJ1ZTtcblxuICAgICAgaWYgKHJlcUZvclByb3h5KSB7XG4gICAgICAgIC8vIHdlIHdvdWxkIGhhdmUgcHJveGllZCB0aGlzIGNvbW1hbmQgaGFkIGEgcGx1Z2luIG5vdCBoYW5kbGVkIGl0LCBzbyB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAvLyBpcyB0byBkbyB0aGUgcHJveHkgYW5kIHJldHJpZXZlIHRoZSByZXN1bHQgaW50ZXJuYWxseSBzbyBpdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgLy8gaW4gY2FzZSBpdCBjYWxscyAnYXdhaXQgbmV4dCgpJy4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBkcml2ZXIgaGF2ZSBkZWZpbmVkXG4gICAgICAgIC8vICdwcm94eUNvbW1hbmQnIGFuZCBub3QganVzdCAncHJveHlSZXFSZXMnLlxuICAgICAgICBpZiAoIWRzdFNlc3Npb24ucHJveHlDb21tYW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZHN0U2Vzc2lvbi5wcm94eUNvbW1hbmQocmVxRm9yUHJveHkub3JpZ2luYWxVcmwsIHJlcUZvclByb3h5Lm1ldGhvZCxcbiAgICAgICAgICByZXFGb3JQcm94eS5ib2R5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzR2V0U3RhdHVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbWJyZWxsYUNtZCkge1xuICAgICAgICAvLyBzb21lIGNvbW1hbmRzLCBsaWtlIGRlbGV0ZVNlc3Npb24sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRvIGhhbmRsZSBvbiAqdGhpcyogZHJpdmVyLFxuICAgICAgICAvLyBub3QgdGhlIHBsYXRmb3JtIGRyaXZlclxuICAgICAgICByZXR1cm4gYXdhaXQgc3VwZXIuZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVyZSB3ZSBrbm93IHRoYXQgd2UgYXJlIGV4ZWN1dGluZyBhIHNlc3Npb24gY29tbWFuZCwgYW5kIGhhdmUgYSB2YWxpZCBzZXNzaW9uIGRyaXZlclxuICAgICAgcmV0dXJuIGF3YWl0IGRzdFNlc3Npb24uZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRha2Ugb3VyIGRlZmF1bHQgYmVoYXZpb3IsIHdyYXAgaXQgd2l0aCBhbnkgbnVtYmVyIG9mIHBsdWdpbiBiZWhhdmlvcnMsIGFuZCBydW4gaXRcbiAgICBjb25zdCB3cmFwcGVkQ21kID0gdGhpcy53cmFwQ29tbWFuZFdpdGhQbHVnaW5zKHtcbiAgICAgIGRyaXZlciwgY21kLCBhcmdzLCBwbHVnaW5zLCBjbWRIYW5kbGVkQnksIG5leHQ6IGRlZmF1bHRCZWhhdmlvclxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlY3V0ZVdyYXBwZWRDb21tYW5kKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pO1xuXG4gICAgLy8gaWYgd2UgaGFkIHBsdWdpbnMsIG1ha2Ugc3VyZSB0byBsb2cgb3V0IHRoZSBoZWxwZnVsIHJlcG9ydCBhYm91dCB3aGljaCBwbHVnaW5zIGVuZGVkIHVwXG4gICAgLy8gaGFuZGxpbmcgdGhlIGNvbW1hbmQgYW5kIHdoaWNoIGRpZG4ndFxuICAgIHRoaXMubG9nUGx1Z2luSGFuZGxlclJlcG9ydChwbHVnaW5zLCB7Y21kLCBjbWRIYW5kbGVkQnl9KTtcblxuICAgIC8vIEFuZCBmaW5hbGx5LCBpZiB0aGUgY29tbWFuZCB3YXMgY3JlYXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtaWdyYXRlIGFueSBwbHVnaW5zIHdoaWNoIHdlcmVcbiAgICAvLyBwcmV2aW91c2x5IHNlc3Npb25sZXNzIHRvIHVzZSB0aGUgbmV3IHNlc3Npb25JZCwgc28gdGhhdCBwbHVnaW5zIGNhbiBzaGFyZSBzdGF0ZSBiZXR3ZWVuXG4gICAgLy8gdGhlaXIgY3JlYXRlU2Vzc2lvbiBtZXRob2QgYW5kIG90aGVyIGluc3RhbmNlIG1ldGhvZHNcbiAgICBpZiAoY21kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EICYmIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zLmxlbmd0aCAmJiAhcmVzLmVycm9yKSB7XG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBfLmZpcnN0KHJlcy52YWx1ZSk7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBQcm9tb3RpbmcgJHt0aGlzLnNlc3Npb25sZXNzUGx1Z2lucy5sZW5ndGh9IHNlc3Npb25sZXNzIHBsdWdpbnMgdG8gYmUgYXR0YWNoZWQgYCArXG4gICAgICAgIGB0byBzZXNzaW9uIElEICR7c2Vzc2lvbklkfWApO1xuICAgICAgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdID0gdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnM7XG4gICAgICB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICB3cmFwQ29tbWFuZFdpdGhQbHVnaW5zICh7ZHJpdmVyLCBjbWQsIGFyZ3MsIG5leHQsIGNtZEhhbmRsZWRCeSwgcGx1Z2luc30pIHtcbiAgICBwbHVnaW5zLmxlbmd0aCAmJiB0aGlzLmxvZy5pbmZvKGBQbHVnaW5zIHdoaWNoIGNhbiBoYW5kbGUgY21kICcke2NtZH0nOiAke3BsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpfWApO1xuXG4gICAgLy8gbm93IHdlIGNhbiBnbyB0aHJvdWdoIGVhY2ggcGx1Z2luIGFuZCB3cmFwIGBuZXh0YCBhcm91bmQgaXRzIG93biBoYW5kbGVyLCBwYXNzaW5nIHRoZSAqb2xkKlxuICAgIC8vIG5leHQgaW4gc28gdGhhdCBpdCBjYW4gY2FsbCBpdCBpZiBpdCB3YW50cyB0b1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgIC8vIG5lZWQgYW4gSUlGRSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgb2YgbmV4dCB0aGF0J3MgcGFzc2VkIHRvIHBsdWdpbi5oYW5kbGUgdG8gYmVcbiAgICAgIC8vIGV4YWN0bHkgdGhlIHZhbHVlIG9mIG5leHQgaGVyZSBiZWZvcmUgcmVhc3NpZ25tZW50OyB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGxhemlseVxuICAgICAgLy8gZXZhbHVhdGVkLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBsYXN0IGBuZXh0YCB0byBiZSBkZWZpbmVkLlxuICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IGZhbHNlOyAvLyB3ZSBzZWUgYSBuZXcgcGx1Z2luLCBzbyBhZGQgaXQgdG8gdGhlICdjbWRIYW5kbGVkQnknIG9iamVjdFxuICAgICAgbmV4dCA9ICgoX25leHQpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGlzIG5vdyBoYW5kbGluZyBjbWQgJyR7Y21kfSdgKTtcbiAgICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IHRydWU7IC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgdGhpcyBwbHVnaW4gaGFzIGF0dGVtcHRlZCB0byBoYW5kbGUgY21kXG4gICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBjb21tYW5kIHZpYSBhIGNvbW1hbmQtc3BlY2lmaWMgaGFuZGxlciBvbiB0aGUgcGx1Z2luXG4gICAgICAgIGlmIChwbHVnaW5bY21kXSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW5bY21kXShfbmV4dCwgZHJpdmVyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UsIGNhbGwgdGhlIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgICAgIHJldHVybiBhd2FpdCBwbHVnaW4uaGFuZGxlKF9uZXh0LCBkcml2ZXIsIGNtZCwgLi4uYXJncyk7XG4gICAgICB9KShuZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIGxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQgKHBsdWdpbnMsIHtjbWQsIGNtZEhhbmRsZWRCeX0pIHtcbiAgICBpZiAoIXBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZGF5LCB3ZSBoYXZlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgd2hpY2ggcGx1Z2lucyBlbmRlZCB1cCBnZXR0aW5nXG4gICAgLy8gdGhlaXIgY29kZSBydW4gYXMgcGFydCBvZiBoYW5kbGluZyB0aGlzIGNvbW1hbmQuIEJlY2F1c2UgcGx1Z2lucyBjYW4gY2hvb3NlICpub3QqIHRvXG4gICAgLy8gcGFzcyBjb250cm9sIHRvIG90aGVyIHBsdWdpbnMgb3IgdG8gdGhlIGRlZmF1bHQgZHJpdmVyIGJlaGF2aW9yLCB0aGlzIGlzIGluZm9ybWF0aW9uXG4gICAgLy8gd2hpY2ggaXMgcHJvYmFibHkgdXNlZnVsIHRvIHRoZSB1c2VyIChlc3BlY2lhbGx5IGluIHNpdHVhdGlvbnMgd2hlcmUgcGx1Z2lucyBtaWdodCBub3RcbiAgICAvLyBpbnRlcmFjdCB3ZWxsIHRvZ2V0aGVyLCBhbmQgaXQgd291bGQgYmUgaGFyZCB0byBkZWJ1ZyBvdGhlcndpc2Ugd2l0aG91dCB0aGlzIGtpbmQgb2ZcbiAgICAvLyBtZXNzYWdlKS5cbiAgICBjb25zdCBkaWRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBjb25zdCBkaWRudEhhbmRsZSA9IE9iamVjdC5rZXlzKGNtZEhhbmRsZWRCeSkuZmlsdGVyKChrKSA9PiAhY21kSGFuZGxlZEJ5W2tdKTtcbiAgICBpZiAoZGlkbnRIYW5kbGUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ29tbWFuZCAnJHtjbWR9JyB3YXMgKm5vdCogaGFuZGxlZCBieSB0aGUgZm9sbG93aW5nIGJlaGF2aW91cnMgb3IgcGx1Z2lucywgZXZlbiBgICtcbiAgICAgICAgYHRob3VnaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCB0byBoYW5kbGUgaXQ6ICR7SlNPTi5zdHJpbmdpZnkoZGlkbnRIYW5kbGUpfS4gVGhlIGAgK1xuICAgICAgICBgY29tbWFuZCAqd2FzKiBoYW5kbGVkIGJ5IHRoZXNlOiAke0pTT04uc3RyaW5naWZ5KGRpZEhhbmRsZSl9LmApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXcmFwcGVkQ29tbWFuZCAoe3dyYXBwZWRDbWQsIHByb3RvY29sfSkge1xuICAgIGxldCBjbWRSZXMsIGNtZEVyciwgcmVzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGB3cmFwcGVkQ21kYCBkZWZpbmVzIGEgd2hvbGUgc2VxdWVuY2Ugb2YgcGx1Z2luIGhhbmRsZXJzLCBjdWxtaW5hdGluZyBpblxuICAgICAgLy8gb3VyIGRlZmF1bHQgaGFuZGxlci4gV2hhdGV2ZXIgaXQgcmV0dXJucyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICAgICAgLy8gdXNlci5cbiAgICAgIGNtZFJlcyA9IGF3YWl0IHdyYXBwZWRDbWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbWRFcnIgPSBlO1xuICAgIH1cblxuICAgIC8vIFNhZGx5LCB3ZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCBraW5kIG9mIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLiBJdCB3aWxsIGVpdGhlciBiZSBhIGJhcmVcbiAgICAvLyBvYmplY3QsIG9yIGEgcHJvdG9jb2wtYXdhcmUgb2JqZWN0IHdpdGggcHJvdG9jb2wgYW5kIGVycm9yL3ZhbHVlIGtleXMuIFNvIHdlIG5lZWQgdG8gc25pZmZcbiAgICAvLyBpdCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGRvdWJsZS13cmFwIGl0IGlmIGl0J3MgdGhlIGxhdHRlciBraW5kLlxuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY21kUmVzKSAmJiBfLmhhcyhjbWRSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICByZXMgPSBjbWRSZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy52YWx1ZSA9IGNtZFJlcztcbiAgICAgIHJlcy5lcnJvciA9IGNtZEVycjtcbiAgICAgIHJlcy5wcm90b2NvbCA9IHByb3RvY29sO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgXy5pc0Z1bmN0aW9uKGRzdFNlc3Npb24ucHJveHlBY3RpdmUpICYmIGRzdFNlc3Npb24ucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uID8gZHN0U2Vzc2lvbi5nZXRQcm94eUF2b2lkTGlzdCgpIDogW107XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBkc3RTZXNzaW9uLmNhblByb3h5KHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8gaGVscCBkZWNpZGUgd2hpY2ggY29tbWFuZHMgc2hvdWxkIGJlIHByb3hpZWQgdG8gc3ViLWRyaXZlcnMgYW5kIHdoaWNoXG4vLyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzLCBvdXIgdW1icmVsbGEgZHJpdmVyXG5mdW5jdGlvbiBpc0FwcGl1bURyaXZlckNvbW1hbmQgKGNtZCkge1xuICByZXR1cm4gIWlzU2Vzc2lvbkNvbW1hbmQoY21kKSB8fCBjbWQgPT09ICdkZWxldGVTZXNzaW9uJztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBBcHBpdW0gdHJpZWQgdG8gcHJveHkgYSBjb21tYW5kIHVzaW5nIGEgZHJpdmVyJ3MgYHByb3h5Q29tbWFuZGAgbWV0aG9kIGJ1dCB0aGVcbiAqIG1ldGhvZCBkaWQgbm90IGV4aXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBOb0RyaXZlclByb3h5Q29tbWFuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9OT19EUklWRVJfUFJPWFlDT01NQU5EJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoYFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIGNvbW1hbmQgd2FzIHRvIHByb3h5LCBidXQgdGhlIGRyaXZlciBgICtcbiAgICAgICAgICBgZGlkIG5vdCBoYXZlIHRoZSAncHJveHlDb21tYW5kJyBtZXRob2QgZGVmaW5lZC4gVG8gZnVsbHkgc3VwcG9ydCBgICtcbiAgICAgICAgICBgcGx1Z2lucywgZHJpdmVycyBzaG91bGQgaGF2ZSAncHJveHlDb21tYW5kJyBzZXQgdG8gYSBqd3BQcm94eSBvYmplY3QncyBgICtcbiAgICAgICAgICBgJ2NvbW1hbmQoKScgbWV0aG9kLCBpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsICdwcm94eVJlcVJlcydgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBcHBpdW1Ecml2ZXIgfTtcbiJdfQ==