appium-chromedriver 4.28.0 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,11 +11,11 @@ require("source-map-support/register");
11
11
 
12
12
  var _events = _interopRequireDefault(require("events"));
13
13
 
14
- var _appiumBaseDriver = require("appium-base-driver");
14
+ var _baseDriver = require("@appium/base-driver");
15
15
 
16
16
  var _child_process = _interopRequireDefault(require("child_process"));
17
17
 
18
- var _appiumSupport = require("appium-support");
18
+ var _support = require("@appium/support");
19
19
 
20
20
  var _asyncbox = require("asyncbox");
21
21
 
@@ -37,7 +37,7 @@ var _storageClient = _interopRequireDefault(require("./storage-client"));
37
37
 
38
38
  var _protocolHelpers = require("./protocol-helpers");
39
39
 
40
- const log = _appiumSupport.logger.getLogger('Chromedriver');
40
+ const log = _support.logger.getLogger('Chromedriver');
41
41
 
42
42
  const NEW_CD_VERSION_FORMAT_MAJOR_VERSION = 73;
43
43
  const DEFAULT_HOST = '127.0.0.1';
@@ -81,7 +81,7 @@ class Chromedriver extends _events.default.EventEmitter {
81
81
  this.bundleId = bundleId;
82
82
  this.executableVerified = false;
83
83
  this.state = Chromedriver.STATE_STOPPED;
84
- this.jwproxy = new _appiumBaseDriver.JWProxy({
84
+ this.jwproxy = new _baseDriver.JWProxy({
85
85
  server: this.proxyHost,
86
86
  port: this.proxyPort
87
87
  });
@@ -93,7 +93,7 @@ class Chromedriver extends _events.default.EventEmitter {
93
93
  }) : null;
94
94
  this.details = details;
95
95
  this.capabilities = {};
96
- this.desiredProtocol = _appiumBaseDriver.PROTOCOLS.MJSONWP;
96
+ this.desiredProtocol = _baseDriver.PROTOCOLS.MJSONWP;
97
97
  }
98
98
 
99
99
  async getDriversMapping() {
@@ -102,12 +102,12 @@ class Chromedriver extends _events.default.EventEmitter {
102
102
  if (this.mappingPath) {
103
103
  log.debug(`Attempting to use Chromedriver->Chrome mapping from '${this.mappingPath}'`);
104
104
 
105
- if (!(await _appiumSupport.fs.exists(this.mappingPath))) {
105
+ if (!(await _support.fs.exists(this.mappingPath))) {
106
106
  log.warn(`No file found at '${this.mappingPath}'`);
107
107
  log.info('Defaulting to the static Chromedriver->Chrome mapping');
108
108
  } else {
109
109
  try {
110
- mapping = JSON.parse(await _appiumSupport.fs.readFile(this.mappingPath, 'utf8'));
110
+ mapping = JSON.parse(await _support.fs.readFile(this.mappingPath, 'utf8'));
111
111
  } catch (err) {
112
112
  log.warn(`Error parsing mapping from '${this.mappingPath}': ${err.message}`);
113
113
  log.info('Defaulting to the static Chromedriver->Chrome mapping');
@@ -131,8 +131,8 @@ class Chromedriver extends _events.default.EventEmitter {
131
131
  }
132
132
 
133
133
  async getChromedrivers(mapping) {
134
- const executables = await _appiumSupport.fs.glob(`${this.executableDir}/*`);
135
- log.debug(`Found ${_appiumSupport.util.pluralize('executable', executables.length, true)} ` + `in '${this.executableDir}'`);
134
+ const executables = await _support.fs.glob(`${this.executableDir}/*`);
135
+ log.debug(`Found ${_support.util.pluralize('executable', executables.length, true)} ` + `in '${this.executableDir}'`);
136
136
  const cds = (await (0, _asyncbox.asyncmap)(executables, async function mapChromedriver(executable) {
137
137
  const logError = ({
138
138
  message,
@@ -283,9 +283,9 @@ class Chromedriver extends _events.default.EventEmitter {
283
283
  async updateDriversMapping(newMapping) {
284
284
  let shouldUpdateStaticMapping = true;
285
285
 
286
- if (await _appiumSupport.fs.exists(this.mappingPath)) {
286
+ if (await _support.fs.exists(this.mappingPath)) {
287
287
  try {
288
- await _appiumSupport.fs.writeFile(this.mappingPath, JSON.stringify(newMapping, null, 2), 'utf8');
288
+ await _support.fs.writeFile(this.mappingPath, JSON.stringify(newMapping, null, 2), 'utf8');
289
289
  shouldUpdateStaticMapping = false;
290
290
  } catch (e) {
291
291
  log.warn(`Cannot store the updated chromedrivers mapping into '${this.mappingPath}'. ` + `This may reduce the performance of further executions. Original error: ${e.message}`);
@@ -357,7 +357,7 @@ class Chromedriver extends _events.default.EventEmitter {
357
357
  }
358
358
 
359
359
  if (!_lodash.default.isEmpty(missingVersions)) {
360
- log.info(`Found ${_appiumSupport.util.pluralize('Chromedriver', _lodash.default.size(missingVersions), true)}, ` + `which ${_lodash.default.size(missingVersions) === 1 ? 'is' : 'are'} missing in the list of known versions: ` + JSON.stringify(missingVersions));
360
+ log.info(`Found ${_support.util.pluralize('Chromedriver', _lodash.default.size(missingVersions), true)}, ` + `which ${_lodash.default.size(missingVersions) === 1 ? 'is' : 'are'} missing in the list of known versions: ` + JSON.stringify(missingVersions));
361
361
  await this.updateDriversMapping(Object.assign(mapping, missingVersions));
362
362
  }
363
363
 
@@ -420,7 +420,7 @@ class Chromedriver extends _events.default.EventEmitter {
420
420
  }
421
421
 
422
422
  const binPath = matchingDrivers[0].executable;
423
- log.debug(`Found ${_appiumSupport.util.pluralize('executable', matchingDrivers.length, true)} ` + `capable of automating Chrome '${chromeVersion}'.\nChoosing the most recent, '${binPath}'.`);
423
+ log.debug(`Found ${_support.util.pluralize('executable', matchingDrivers.length, true)} ` + `capable of automating Chrome '${chromeVersion}'.\nChoosing the most recent, '${binPath}'.`);
424
424
  log.debug('If a specific version is required, specify it with the `chromedriverExecutable`' + 'desired capability.');
425
425
  return binPath;
426
426
  } while (true);
@@ -433,7 +433,7 @@ class Chromedriver extends _events.default.EventEmitter {
433
433
  this.chromedriver = this.useSystemExecutable ? await (0, _utils.getChromedriverBinaryPath)() : await this.getCompatibleChromedriver();
434
434
  }
435
435
 
436
- if (!(await _appiumSupport.fs.exists(this.chromedriver))) {
436
+ if (!(await _support.fs.exists(this.chromedriver))) {
437
437
  throw new Error(`Trying to use a chromedriver binary at the path ` + `${this.chromedriver}, but it doesn't exist!`);
438
438
  }
439
439
 
@@ -445,18 +445,18 @@ class Chromedriver extends _events.default.EventEmitter {
445
445
  const coercedVersion = _semver.default.coerce(cdVersion);
446
446
 
447
447
  if (!coercedVersion || coercedVersion.major < MIN_CD_VERSION_WITH_W3C_SUPPORT) {
448
- log.debug(`Chromedriver v. ${cdVersion} does not fully support ${_appiumBaseDriver.PROTOCOLS.W3C} protocol. ` + `Defaulting to ${_appiumBaseDriver.PROTOCOLS.MJSONWP}`);
448
+ log.debug(`Chromedriver v. ${cdVersion} does not fully support ${_baseDriver.PROTOCOLS.W3C} protocol. ` + `Defaulting to ${_baseDriver.PROTOCOLS.MJSONWP}`);
449
449
  return;
450
450
  }
451
451
 
452
452
  const chromeOptions = (0, _protocolHelpers.getCapValue)(this.capabilities, 'chromeOptions', {});
453
453
 
454
454
  if (chromeOptions.w3c === false) {
455
- log.info(`Chromedriver v. ${cdVersion} supports ${_appiumBaseDriver.PROTOCOLS.W3C} protocol, ` + `but ${_appiumBaseDriver.PROTOCOLS.MJSONWP} one has been explicitly requested`);
455
+ log.info(`Chromedriver v. ${cdVersion} supports ${_baseDriver.PROTOCOLS.W3C} protocol, ` + `but ${_baseDriver.PROTOCOLS.MJSONWP} one has been explicitly requested`);
456
456
  return;
457
457
  }
458
458
 
459
- this.desiredProtocol = _appiumBaseDriver.PROTOCOLS.W3C;
459
+ this.desiredProtocol = _baseDriver.PROTOCOLS.W3C;
460
460
  this.capabilities = (0, _protocolHelpers.toW3cCapNames)(this.capabilities);
461
461
  }
462
462
 
@@ -472,7 +472,7 @@ class Chromedriver extends _events.default.EventEmitter {
472
472
  this.changeState(Chromedriver.STATE_STARTING);
473
473
  }
474
474
 
475
- const args = ['--url-base=wd/hub', `--port=${this.proxyPort}`];
475
+ const args = [`--port=${this.proxyPort}`];
476
476
 
477
477
  if (this.adb && this.adb.adbPort) {
478
478
  args.push(`--adb-port=${this.adb.adbPort}`);
@@ -617,7 +617,7 @@ class Chromedriver extends _events.default.EventEmitter {
617
617
  }
618
618
 
619
619
  async startSession() {
620
- const sessionCaps = this.desiredProtocol === _appiumBaseDriver.PROTOCOLS.W3C ? {
620
+ const sessionCaps = this.desiredProtocol === _baseDriver.PROTOCOLS.W3C ? {
621
621
  capabilities: {
622
622
  alwaysMatch: this.capabilities
623
623
  }
@@ -634,15 +634,20 @@ class Chromedriver extends _events.default.EventEmitter {
634
634
  this.changeState(Chromedriver.STATE_STOPPING);
635
635
  }
636
636
 
637
- try {
638
- await this.jwproxy.command('', 'DELETE');
639
- await this.proc.stop('SIGTERM', 20000);
640
-
641
- if (emitStates) {
642
- this.changeState(Chromedriver.STATE_STOPPED);
637
+ const runSafeStep = async f => {
638
+ try {
639
+ return await f();
640
+ } catch (e) {
641
+ log.warn(e.message);
642
+ log.debug(e.stack);
643
643
  }
644
- } catch (e) {
645
- log.error(e);
644
+ };
645
+
646
+ await runSafeStep(() => this.jwproxy.command('', 'DELETE'));
647
+ await runSafeStep(() => this.proc.stop('SIGTERM', 20000));
648
+
649
+ if (emitStates) {
650
+ this.changeState(Chromedriver.STATE_STOPPED);
646
651
  }
647
652
  }
648
653
 
@@ -663,7 +668,7 @@ class Chromedriver extends _events.default.EventEmitter {
663
668
  }
664
669
 
665
670
  async killAll() {
666
- let cmd = _appiumSupport.system.isWindows() ? `wmic process where "commandline like '%chromedriver.exe%--port=${this.proxyPort}%'" delete` : `pkill -15 -f "${this.chromedriver}.*--port=${this.proxyPort}"`;
671
+ let cmd = _support.system.isWindows() ? `wmic process where "commandline like '%chromedriver.exe%--port=${this.proxyPort}%'" delete` : `pkill -15 -f "${this.chromedriver}.*--port=${this.proxyPort}"`;
667
672
  log.debug(`Killing any old chromedrivers, running: ${cmd}`);
668
673
 
669
674
  try {
@@ -724,4 +729,4 @@ var _default = Chromedriver;
724
729
  exports.default = _default;require('source-map-support').install();
725
730
 
726
731
 
727
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jaHJvbWVkcml2ZXIuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT04iLCJERUZBVUxUX0hPU1QiLCJNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUIiwiREVGQVVMVF9QT1JUIiwiQ0hST01FX0JVTkRMRV9JRCIsIldFQlZJRVdfU0hFTExfQlVORExFX0lEIiwiV0VCVklFV19CVU5ETEVfSURTIiwiQ0hST01FRFJJVkVSX1RVVE9SSUFMIiwiVkVSU0lPTl9QQVRURVJOIiwiQ0RfVkVSU0lPTl9USU1FT1VUIiwiQ2hyb21lZHJpdmVyIiwiZXZlbnRzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJhcmdzIiwiaG9zdCIsInBvcnQiLCJ1c2VTeXN0ZW1FeGVjdXRhYmxlIiwiZXhlY3V0YWJsZSIsImV4ZWN1dGFibGVEaXIiLCJidW5kbGVJZCIsIm1hcHBpbmdQYXRoIiwiY21kQXJncyIsImFkYiIsInZlcmJvc2UiLCJsb2dQYXRoIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJkZXRhaWxzIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwicHJveHlIb3N0IiwicHJveHlQb3J0IiwicHJvYyIsImNocm9tZWRyaXZlciIsImV4ZWN1dGFibGVWZXJpZmllZCIsInN0YXRlIiwiU1RBVEVfU1RPUFBFRCIsImp3cHJveHkiLCJKV1Byb3h5Iiwic2VydmVyIiwic3RvcmFnZUNsaWVudCIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJjaHJvbWVkcml2ZXJEaXIiLCJjYXBhYmlsaXRpZXMiLCJkZXNpcmVkUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiZ2V0RHJpdmVyc01hcHBpbmciLCJtYXBwaW5nIiwiXyIsImNsb25lRGVlcCIsIkNIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyIsImRlYnVnIiwiZnMiLCJleGlzdHMiLCJ3YXJuIiwiaW5mbyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwiZXJyIiwibWVzc2FnZSIsImNkVmVyc2lvbiIsImNocm9tZVZlcnNpb24iLCJ0b1BhaXJzIiwiY29lcmNlZFZlcnNpb24iLCJzZW12ZXIiLCJjb2VyY2UiLCJ2ZXJzaW9uIiwiZ2V0Q2hyb21lZHJpdmVycyIsImV4ZWN1dGFibGVzIiwiZ2xvYiIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJjZHMiLCJtYXBDaHJvbWVkcml2ZXIiLCJsb2dFcnJvciIsInN0ZG91dCIsInN0ZGVyciIsImVyck1zZyIsInBhdGgiLCJiYXNlbmFtZSIsInRpbWVvdXQiLCJpbmNsdWRlcyIsIm1hdGNoIiwiZXhlYyIsIm1pbkNocm9tZVZlcnNpb24iLCJtYWpvciIsIm1pbm9yIiwiZmlsdGVyIiwiY2QiLCJzb3J0IiwiYSIsImIiLCJpc0VtcHR5IiwiZ2V0Q2hyb21lVmVyc2lvbiIsIkJyb3dzZXIiLCJ2ZXJzaW9uTWF0Y2giLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwidXBkYXRlRHJpdmVyc01hcHBpbmciLCJuZXdNYXBwaW5nIiwic2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZyIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsImUiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyIiwidmFsdWVzIiwiZGlkU3RvcmFnZVN5bmMiLCJzeW5jQ2hyb21lZHJpdmVycyIsInJldHJpZXZlZE1hcHBpbmciLCJyZXRyaWV2ZU1hcHBpbmciLCJkcml2ZXJLZXlzIiwic3luY0RyaXZlcnMiLCJtaW5Ccm93c2VyVmVyc2lvbiIsInN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nIiwicmVkdWNlIiwiYWNjIiwieCIsIm1pc3NpbmdWZXJzaW9ucyIsImNvZXJjZWRWZXIiLCJzaXplIiwiZXJyb3JBbmRUaHJvdyIsIm1hdGNoaW5nRHJpdmVycyIsIm1pbkNocm9tZVZlcnNpb25TIiwiZ3RlIiwiQ0RfQ0ROIiwic3RhY2siLCJhdXRvZG93bmxvYWRTdWdnZXN0aW9uIiwiRXJyb3IiLCJiaW5QYXRoIiwiaW5pdENocm9tZWRyaXZlclBhdGgiLCJzeW5jUHJvdG9jb2wiLCJXM0MiLCJjaHJvbWVPcHRpb25zIiwidzNjIiwic3RhcnQiLCJjYXBzIiwiZW1pdFN0YXJ0aW5nU3RhdGUiLCJsb2dnaW5nUHJlZnMiLCJicm93c2VyIiwiY2hhbmdlU3RhdGUiLCJTVEFURV9TVEFSVElORyIsImFkYlBvcnQiLCJwdXNoIiwiaXNBcnJheSIsInN0YXJ0RGV0ZWN0b3IiLCJzdGFydHNXaXRoIiwicHJvY2Vzc0lzQWxpdmUiLCJ3ZWJ2aWV3VmVyc2lvbiIsImtpbGxBbGwiLCJTdWJQcm9jZXNzIiwib24iLCJvdXQiLCJsaW5lIiwidHJpbSIsInNwbGl0IiwiZXJyb3IiLCJjb2RlIiwic2lnbmFsIiwiU1RBVEVfU1RPUFBJTkciLCJTVEFURV9SRVNUQVJUSU5HIiwibXNnIiwiam9pbiIsIndhaXRGb3JPbmxpbmUiLCJzdGFydFNlc3Npb24iLCJlbWl0IiwiRVZFTlRfRVJST1IiLCJzdG9wIiwidmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciIsInNlc3Npb25JZCIsIlNUQVRFX09OTElORSIsInJlc3RhcnQiLCJjaHJvbWVkcml2ZXJTdG9wcGVkIiwiZ2V0U3RhdHVzIiwiY29tbWFuZCIsInNlc3Npb25DYXBzIiwiYWx3YXlzTWF0Y2giLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwiZW1pdFN0YXRlcyIsIkVWRU5UX0NIQU5HRUQiLCJzZW5kQ29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJwcm94eVJlcSIsInJlcSIsInJlcyIsInByb3h5UmVxUmVzIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiQiIsInByb21pc2lmeSIsImNwIiwidWRpZEluZGV4IiwiZGVmYXVsdEFyZ3MiLCJmaW5kSW5kZXgiLCJpdGVtIiwidWRpZCIsImNvbm4iLCJnZXRGb3J3YXJkTGlzdCIsInBhcmFtcyIsInJlbW92ZVBvcnRGb3J3YXJkIiwicmVwbGFjZSIsImhhc1dvcmtpbmdX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TSxDQUFDLENBQUQsQ0FBTixDQUFVRSxPQUFWLENBQWtCLE9BQWxCLEVBQTJCLEVBQTNCLENBQTNCLENBQU47QUFDRDtBQUNGO0FBQ0YsT0FaRCxDQVlFLE9BQU9uSixHQUFQLEVBQVk7QUFDWjlELFFBQUFBLEdBQUcsQ0FBQ3lELElBQUosQ0FBVSw0Q0FBMkNLLEdBQUcsQ0FBQ0MsT0FBUSxnQkFBakU7QUFDRDtBQUNGO0FBQ0Y7O0FBRXNCLFFBQWpCbUosaUJBQWlCLEdBQUk7QUFHekIsUUFBSTtBQUNGLFlBQU0sS0FBSzNLLE9BQUwsQ0FBYTZJLE9BQWIsQ0FBcUIsTUFBckIsRUFBNkIsS0FBN0IsQ0FBTjtBQUNBLGFBQU8sSUFBUDtBQUNELEtBSEQsQ0FHRSxPQUFPeEUsQ0FBUCxFQUFVO0FBQ1YsYUFBTyxLQUFQO0FBQ0Q7QUFDRjs7QUE1bkI0Qzs7O0FBK25CL0MvRixZQUFZLENBQUMrSixXQUFiLEdBQTJCLG9CQUEzQjtBQUNBL0osWUFBWSxDQUFDNEssYUFBYixHQUE2QixjQUE3QjtBQUNBNUssWUFBWSxDQUFDeUIsYUFBYixHQUE2QixTQUE3QjtBQUNBekIsWUFBWSxDQUFDc0ksY0FBYixHQUE4QixVQUE5QjtBQUNBdEksWUFBWSxDQUFDbUssWUFBYixHQUE0QixRQUE1QjtBQUNBbkssWUFBWSxDQUFDd0osY0FBYixHQUE4QixVQUE5QjtBQUNBeEosWUFBWSxDQUFDeUosZ0JBQWIsR0FBZ0MsWUFBaEM7ZUFHZXpKLFkiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgZXZlbnRzIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBKV1Byb3h5LCBQUk9UT0NPTFMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IGNwIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgbG9nZ2VyLCB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCwgYXN5bmNtYXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzLCBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIGdldENocm9tZVZlcnNpb24sIGdldENocm9tZWRyaXZlckRpciwgQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HLFxuICBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoLCBDRF9DRE4sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNvbXBhcmVWZXJzaW9ucyBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHsgdG9XM2NDYXBOYW1lcywgZ2V0Q2FwVmFsdWUgfSBmcm9tICcuL3Byb3RvY29sLWhlbHBlcnMnO1xuXG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0Nocm9tZWRyaXZlcicpO1xuXG5jb25zdCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiA9IDczO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUID0gNzU7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA5NTE1O1xuY29uc3QgQ0hST01FX0JVTkRMRV9JRCA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgV0VCVklFV19TSEVMTF9CVU5ETEVfSUQgPSAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnO1xuY29uc3QgV0VCVklFV19CVU5ETEVfSURTID0gW1xuICAnY29tLmdvb2dsZS5hbmRyb2lkLndlYnZpZXcnLFxuICAnY29tLmFuZHJvaWQud2VidmlldycsXG5dO1xuY29uc3QgQ0hST01FRFJJVkVSX1RVVE9SSUFMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vd3JpdGluZy1ydW5uaW5nLWFwcGl1bS93ZWIvY2hyb21lZHJpdmVyLm1kJztcbmNvbnN0IFZFUlNJT05fUEFUVEVSTiA9IC8oW1xcZC5dKykvO1xuXG5jb25zdCBDRF9WRVJTSU9OX1RJTUVPVVQgPSA1MDAwO1xuXG5jbGFzcyBDaHJvbWVkcml2ZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgICAgcG9ydCA9IERFRkFVTFRfUE9SVCxcbiAgICAgIHVzZVN5c3RlbUV4ZWN1dGFibGUgPSBmYWxzZSxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBleGVjdXRhYmxlRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICBidW5kbGVJZCxcbiAgICAgIG1hcHBpbmdQYXRoLFxuICAgICAgY21kQXJncyxcbiAgICAgIGFkYixcbiAgICAgIHZlcmJvc2UsXG4gICAgICBsb2dQYXRoLFxuICAgICAgZGlzYWJsZUJ1aWxkQ2hlY2ssXG4gICAgICBkZXRhaWxzLFxuICAgICAgaXNBdXRvZG93bmxvYWRFbmFibGVkID0gZmFsc2UsXG4gICAgfSA9IGFyZ3M7XG5cbiAgICB0aGlzLnByb3h5SG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5wcm94eVBvcnQgPSBwb3J0O1xuICAgIHRoaXMuYWRiID0gYWRiO1xuICAgIHRoaXMuY21kQXJncyA9IGNtZEFyZ3M7XG4gICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICB0aGlzLnVzZVN5c3RlbUV4ZWN1dGFibGUgPSB1c2VTeXN0ZW1FeGVjdXRhYmxlO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gZXhlY3V0YWJsZTtcbiAgICB0aGlzLmV4ZWN1dGFibGVEaXIgPSBleGVjdXRhYmxlRGlyO1xuICAgIHRoaXMubWFwcGluZ1BhdGggPSBtYXBwaW5nUGF0aDtcbiAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgdGhpcy5leGVjdXRhYmxlVmVyaWZpZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlID0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQ7XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEpXUHJveHkoe3NlcnZlcjogdGhpcy5wcm94eUhvc3QsIHBvcnQ6IHRoaXMucHJveHlQb3J0fSk7XG4gICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTtcbiAgICB0aGlzLmxvZ1BhdGggPSBsb2dQYXRoO1xuICAgIHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2sgPSAhIWRpc2FibGVCdWlsZENoZWNrO1xuICAgIHRoaXMuc3RvcmFnZUNsaWVudCA9IGlzQXV0b2Rvd25sb2FkRW5hYmxlZFxuICAgICAgPyBuZXcgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCh7IGNocm9tZWRyaXZlckRpcjogdGhpcy5leGVjdXRhYmxlRGlyIH0pXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHt9O1xuICAgIHRoaXMuZGVzaXJlZFByb3RvY29sID0gUFJPVE9DT0xTLk1KU09OV1A7XG4gIH1cblxuICBhc3luYyBnZXREcml2ZXJzTWFwcGluZyAoKSB7XG4gICAgbGV0IG1hcHBpbmcgPSBfLmNsb25lRGVlcChDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcpO1xuICAgIGlmICh0aGlzLm1hcHBpbmdQYXRoKSB7XG4gICAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8gdXNlIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcgZnJvbSAnJHt0aGlzLm1hcHBpbmdQYXRofSdgKTtcbiAgICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMubWFwcGluZ1BhdGgpKSB7XG4gICAgICAgIGxvZy53YXJuKGBObyBmaWxlIGZvdW5kIGF0ICcke3RoaXMubWFwcGluZ1BhdGh9J2ApO1xuICAgICAgICBsb2cuaW5mbygnRGVmYXVsdGluZyB0byB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWFwcGluZyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUodGhpcy5tYXBwaW5nUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy53YXJuKGBFcnJvciBwYXJzaW5nIG1hcHBpbmcgZnJvbSAnJHt0aGlzLm1hcHBpbmdQYXRofSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgbG9nLmluZm8oJ0RlZmF1bHRpbmcgdG8gdGhlIHN0YXRpYyBDaHJvbWVkcml2ZXItPkNocm9tZSBtYXBwaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdVc2luZyB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGZvciBtaW5pbXVtIGNocm9tZSB2ZXJzaW9uIGFyZSBzZW12ZXIgY29tcGxpYW50XG4gICAgZm9yIChjb25zdCBbY2RWZXJzaW9uLCBjaHJvbWVWZXJzaW9uXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKTtcbiAgICAgIGlmIChjb2VyY2VkVmVyc2lvbikge1xuICAgICAgICBtYXBwaW5nW2NkVmVyc2lvbl0gPSBjb2VyY2VkVmVyc2lvbi52ZXJzaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmluZm8oYCcke2Nocm9tZVZlcnNpb259JyBpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIG51bWJlci4gU2tpcHBpbmcgaXRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcHBpbmc7XG4gIH1cblxuICBhc3luYyBnZXRDaHJvbWVkcml2ZXJzIChtYXBwaW5nKSB7XG4gICAgLy8gZ28gdGhyb3VnaCB0aGUgdmVyc2lvbnMgYXZhaWxhYmxlXG4gICAgY29uc3QgZXhlY3V0YWJsZXMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZXhlY3V0YWJsZURpcn0vKmApO1xuICAgIGxvZy5kZWJ1ZyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnZXhlY3V0YWJsZScsIGV4ZWN1dGFibGVzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgYGluICcke3RoaXMuZXhlY3V0YWJsZURpcn0nYCk7XG4gICAgY29uc3QgY2RzID0gKGF3YWl0IGFzeW5jbWFwKGV4ZWN1dGFibGVzLCBhc3luYyBmdW5jdGlvbiBtYXBDaHJvbWVkcml2ZXIgKGV4ZWN1dGFibGUpIHtcbiAgICAgIGNvbnN0IGxvZ0Vycm9yID0gKHttZXNzYWdlLCBzdGRvdXQgPSBudWxsLCBzdGRlcnIgPSBudWxsfSkgPT4ge1xuICAgICAgICBsZXQgZXJyTXNnID0gYENhbm5vdCByZXRyaWV2ZSB2ZXJzaW9uIG51bWJlciBmcm9tICcke3BhdGguYmFzZW5hbWUoZXhlY3V0YWJsZSl9JyBDaHJvbWVkcml2ZXIgYmluYXJ5LiBgICtcbiAgICAgICAgICBgTWFrZSBzdXJlIGl0IHJldHVybnMgYSB2YWxpZCB2ZXJzaW9uIHN0cmluZyBpbiByZXNwb25zZSB0byAnLS12ZXJzaW9uJyBjb21tYW5kIGxpbmUgYXJndW1lbnQuICR7bWVzc2FnZX1gO1xuICAgICAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICAgICAgZXJyTXNnICs9IGBcXG5TdGRvdXQ6ICR7c3Rkb3V0fWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIGVyck1zZyArPSBgXFxuU3RkZXJyOiAke3N0ZGVycn1gO1xuICAgICAgICB9XG4gICAgICAgIGxvZy53YXJuKGVyck1zZyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcblxuICAgICAgbGV0IHN0ZG91dDtcbiAgICAgIGxldCBzdGRlcnI7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWMoZXhlY3V0YWJsZSwgWyctLXZlcnNpb24nXSwge1xuICAgICAgICAgIHRpbWVvdXQ6IENEX1ZFUlNJT05fVElNRU9VVCxcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyci5tZXNzYWdlIHx8ICcnKS5pbmNsdWRlcygndGltZWQgb3V0JykgJiYgIShlcnIuc3Rkb3V0IHx8ICcnKS5pbmNsdWRlcygnU3RhcnRpbmcgQ2hyb21lRHJpdmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gbG9nRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoaXMgaGFzIHRpbWVkIG91dCwgaXQgaGFzIGFjdHVhbGx5IHN0YXJ0ZWQgQ2hyb21lZHJpdmVyLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHRoZXJlIHdpbGwgYWxzbyBiZSB0aGUgdmVyc2lvbiBzdHJpbmcgaW4gdGhlIG91dHB1dFxuICAgICAgICBzdGRvdXQgPSBlcnIuc3Rkb3V0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IC9DaHJvbWVEcml2ZXJcXHMrXFwoP3Y/KFtcXGQuXSspXFwpPy9pLmV4ZWMoc3Rkb3V0KTsgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci96cGo1d0EvMVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe21lc3NhZ2U6ICdDYW5ub3QgcGFyc2UgdGhlIHZlcnNpb24gc3RyaW5nJywgc3Rkb3V0LCBzdGRlcnJ9KTtcbiAgICAgIH1cbiAgICAgIGxldCB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICBsZXQgbWluQ2hyb21lVmVyc2lvbiA9IG1hcHBpbmdbdmVyc2lvbl07XG4gICAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UodmVyc2lvbik7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgLy8gYmVmb3JlIDIwMTktMDMtMDYgdmVyc2lvbnMgd2VyZSBvZiB0aGUgZm9ybSBtYWpvci5taW5vclxuICAgICAgICBpZiAoY29lcmNlZFZlcnNpb24ubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIHZlcnNpb24gPSBgJHtjb2VyY2VkVmVyc2lvbi5tYWpvcn0uJHtjb2VyY2VkVmVyc2lvbi5taW5vcn1gO1xuICAgICAgICAgIG1pbkNocm9tZVZlcnNpb24gPSBtYXBwaW5nW3ZlcnNpb25dO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWluQ2hyb21lVmVyc2lvbiAmJiBjb2VyY2VkVmVyc2lvbi5tYWpvciA+PSBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIC8vIEFzc3VtZSB0aGUgbWFqb3IgQ2hyb21lIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIG1ham9yIHZlcnNpb25cbiAgICAgICAgICBtaW5DaHJvbWVWZXJzaW9uID0gYCR7Y29lcmNlZFZlcnNpb24ubWFqb3J9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0YWJsZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgbWluQ2hyb21lVmVyc2lvbixcbiAgICAgIH07XG4gICAgfSkpXG4gICAgICAuZmlsdGVyKChjZCkgPT4gISFjZClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBjb21wYXJlVmVyc2lvbnMoYi52ZXJzaW9uLCBhLnZlcnNpb24pKTtcbiAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBDaHJvbWVkcml2ZXJzIHdlcmUgZm91bmQgaW4gJyR7dGhpcy5leGVjdXRhYmxlRGlyfSdgKTtcbiAgICAgIHJldHVybiBjZHM7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBDaHJvbWVkcml2ZXIgZXhlY3V0YWJsZXMgd2VyZSBmb3VuZDpgKTtcbiAgICBmb3IgKGNvbnN0IGNkIG9mIGNkcykge1xuICAgICAgbG9nLmRlYnVnKGAgICAgJyR7Y2QuZXhlY3V0YWJsZX0nICh2ZXJzaW9uICcke2NkLnZlcnNpb259JywgbWluaW11bSBDaHJvbWUgdmVyc2lvbiAnJHtjZC5taW5DaHJvbWVWZXJzaW9uID8gY2QubWluQ2hyb21lVmVyc2lvbiA6ICdVbmtub3duJ30nKWApO1xuICAgIH1cbiAgICByZXR1cm4gY2RzO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hyb21lVmVyc2lvbiAoKSB7XG4gICAgLy8gVHJ5IHRvIHJldHJpZXZlIHRoZSB2ZXJzaW9uIGZyb20gYGRldGFpbHNgIHByb3BlcnR5IGlmIGl0IGlzIHNldFxuICAgIC8vIFRoZSBgaW5mb2AgaXRlbSBtdXN0IGNvbnRhaW4gdGhlIG91dHB1dCBvZiAvanNvbi92ZXJzaW9uIENEUCBjb21tYW5kXG4gICAgLy8gd2hlcmUgYEJyb3dzZXJgIGZpZWxkIGxvb2tzIGxpa2UgYENocm9tZS83Mi4wLjM2MDEuMGBgXG4gICAgaWYgKHRoaXMuZGV0YWlscz8uaW5mbykge1xuICAgICAgbG9nLmRlYnVnKGBCcm93c2VyIHZlcnNpb24gaW4gdGhlIHN1cHBsaWVkIGRldGFpbHM6ICR7dGhpcy5kZXRhaWxzPy5pbmZvPy5Ccm93c2VyfWApO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBWRVJTSU9OX1BBVFRFUk4uZXhlYyh0aGlzLmRldGFpbHM/LmluZm8/LkJyb3dzZXIpO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uTWF0Y2hbMV0pO1xuICAgICAgaWYgKGNvZXJjZWRWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBjb2VyY2VkVmVyc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY2hyb21lVmVyc2lvbjtcblxuICAgIC8vIGluIGNhc2Ugb2YgV2ViVmlldyBCcm93c2VyIFRlc3Rlciwgc2ltcGx5IHRyeSB0byBmaW5kIHRoZSB1bmRlcmx5aW5nIHdlYnZpZXdcbiAgICBpZiAodGhpcy5idW5kbGVJZCA9PT0gV0VCVklFV19TSEVMTF9CVU5ETEVfSUQpIHtcbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgV0VCVklFV19CVU5ETEVfSURTKSB7XG4gICAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCBidW5kbGVJZCk7XG4gICAgICAgIGlmIChjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkO1xuICAgICAgICAgIHJldHVybiBzZW12ZXIuY29lcmNlKGNocm9tZVZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBvbiBBbmRyb2lkIDctOSB3ZWJ2aWV3cyBhcmUgYmFja2VkIGJ5IHRoZSBtYWluIENocm9tZSwgbm90IHRoZSBzeXN0ZW0gd2Vidmlld1xuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAgICAgaWYgKGFwaUxldmVsID49IDI0ICYmIGFwaUxldmVsIDw9IDI4ICYmXG4gICAgICAgICAgW1dFQlZJRVdfU0hFTExfQlVORExFX0lELCAuLi5XRUJWSUVXX0JVTkRMRV9JRFNdLmluY2x1ZGVzKHRoaXMuYnVuZGxlSWQpKSB7XG4gICAgICAgIHRoaXMuYnVuZGxlSWQgPSBDSFJPTUVfQlVORExFX0lEO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRyeSBvdXQgd2Vidmlld3Mgd2hlbiBubyBidW5kbGUgaWQgaXMgc2VudCBpblxuICAgIGlmICghdGhpcy5idW5kbGVJZCkge1xuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZ2VuZXJpYyBDaHJvbWUgYnVuZGxlXG4gICAgICB0aGlzLmJ1bmRsZUlkID0gQ0hST01FX0JVTkRMRV9JRDtcblxuICAgICAgLy8gd2UgaGF2ZSBhIHdlYnZpZXcgb2Ygc29tZSBzb3J0LCBzbyB0cnkgdG8gZmluZCB0aGUgYnVuZGxlIHZlcnNpb25cbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgV0VCVklFV19CVU5ETEVfSURTKSB7XG4gICAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCBidW5kbGVJZCk7XG4gICAgICAgIGlmIChjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZG8gbm90IGhhdmUgYSBjaHJvbWUgdmVyc2lvbiwgaXQgbXVzdCBub3QgYmUgYSB3ZWJ2aWV3XG4gICAgaWYgKCFjaHJvbWVWZXJzaW9uKSB7XG4gICAgICBjaHJvbWVWZXJzaW9uID0gYXdhaXQgZ2V0Q2hyb21lVmVyc2lvbih0aGlzLmFkYiwgdGhpcy5idW5kbGVJZCk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIGl0IGlzIHNlbXZlciwgc28gbGF0ZXIgY2hlY2tzIHdvbid0IGZhaWxcbiAgICByZXR1cm4gY2hyb21lVmVyc2lvbiA/IHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbikgOiBudWxsO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRHJpdmVyc01hcHBpbmcgKG5ld01hcHBpbmcpIHtcbiAgICBsZXQgc2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZyA9IHRydWU7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyh0aGlzLm1hcHBpbmdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRoaXMubWFwcGluZ1BhdGgsIEpTT04uc3RyaW5naWZ5KG5ld01hcHBpbmcsIG51bGwsIDIpLCAndXRmOCcpO1xuICAgICAgICBzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3Qgc3RvcmUgdGhlIHVwZGF0ZWQgY2hyb21lZHJpdmVycyBtYXBwaW5nIGludG8gJyR7dGhpcy5tYXBwaW5nUGF0aH0nLiBgICtcbiAgICAgICAgICBgVGhpcyBtYXkgcmVkdWNlIHRoZSBwZXJmb3JtYW5jZSBvZiBmdXJ0aGVyIGV4ZWN1dGlvbnMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFVwZGF0ZVN0YXRpY01hcHBpbmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HLCBuZXdNYXBwaW5nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyICgpIHtcbiAgICBpZiAoIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcHBpbmcgPSBhd2FpdCB0aGlzLmdldERyaXZlcnNNYXBwaW5nKCk7XG4gICAgaWYgKCFfLmlzRW1wdHkobWFwcGluZykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIG1vc3QgcmVjZW50IGtub3duIENocm9tZSB2ZXJzaW9uOiAke18udmFsdWVzKG1hcHBpbmcpWzBdfWApO1xuICAgIH1cblxuICAgIGxldCBkaWRTdG9yYWdlU3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHN5bmNDaHJvbWVkcml2ZXJzID0gYXN5bmMgKGNocm9tZVZlcnNpb24pID0+IHtcbiAgICAgIGRpZFN0b3JhZ2VTeW5jID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJldHJpZXZlZE1hcHBpbmcgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQucmV0cmlldmVNYXBwaW5nKCk7XG4gICAgICBsb2cuZGVidWcoJ0dvdCBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgZnJvbSB0aGUgc3RvcmFnZTogJyArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHJldHJpZXZlZE1hcHBpbmcsIG51bGwsIDIpKTtcbiAgICAgIGNvbnN0IGRyaXZlcktleXMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQuc3luY0RyaXZlcnMoe1xuICAgICAgICBtaW5Ccm93c2VyVmVyc2lvbjogY2hyb21lVmVyc2lvbi5tYWpvcixcbiAgICAgIH0pO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJLZXlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzeW5jaHJvbml6ZWREcml2ZXJzTWFwcGluZyA9IGRyaXZlcktleXMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgY29uc3Qge3ZlcnNpb24sIG1pbkJyb3dzZXJWZXJzaW9ufSA9IHJldHJpZXZlZE1hcHBpbmdbeF07XG4gICAgICAgIGFjY1t2ZXJzaW9uXSA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pO1xuICAgICAgT2JqZWN0LmFzc2lnbihtYXBwaW5nLCBzeW5jaHJvbml6ZWREcml2ZXJzTWFwcGluZyk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZURyaXZlcnNNYXBwaW5nKG1hcHBpbmcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGNkcyA9IGF3YWl0IHRoaXMuZ2V0Q2hyb21lZHJpdmVycyhtYXBwaW5nKTtcblxuICAgICAgY29uc3QgbWlzc2luZ1ZlcnNpb25zID0ge307XG4gICAgICBmb3IgKGNvbnN0IHt2ZXJzaW9uLCBtaW5DaHJvbWVWZXJzaW9ufSBvZiBjZHMpIHtcbiAgICAgICAgaWYgKCFtaW5DaHJvbWVWZXJzaW9uIHx8IG1hcHBpbmdbdmVyc2lvbl0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2VyY2VkVmVyID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uKTtcbiAgICAgICAgaWYgKCFjb2VyY2VkVmVyIHx8IGNvZXJjZWRWZXIubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWlzc2luZ1ZlcnNpb25zW3ZlcnNpb25dID0gbWluQ2hyb21lVmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc0VtcHR5KG1pc3NpbmdWZXJzaW9ucykpIHtcbiAgICAgICAgbG9nLmluZm8oYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ0Nocm9tZWRyaXZlcicsIF8uc2l6ZShtaXNzaW5nVmVyc2lvbnMpLCB0cnVlKX0sIGAgK1xuICAgICAgICAgIGB3aGljaCAke18uc2l6ZShtaXNzaW5nVmVyc2lvbnMpID09PSAxID8gJ2lzJyA6ICdhcmUnfSBtaXNzaW5nIGluIHRoZSBsaXN0IG9mIGtub3duIHZlcnNpb25zOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShtaXNzaW5nVmVyc2lvbnMpKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVEcml2ZXJzTWFwcGluZyhPYmplY3QuYXNzaWduKG1hcHBpbmcsIG1pc3NpbmdWZXJzaW9ucykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlQnVpbGRDaGVjaykge1xuICAgICAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IGlzIHNldCB0byAndHJ1ZSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIGxvZy53YXJuKGBDaHJvbWUgYnVpbGQgY2hlY2sgZGlzYWJsZWQuIFVzaW5nIG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uICgke3ZlcnNpb259LCBhdCAnJHtleGVjdXRhYmxlfScpYCk7XG4gICAgICAgIGxvZy53YXJuKGBJZiB0aGlzIGlzIHdyb25nLCBzZXQgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IHRvICdmYWxzZSdgKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNocm9tZVZlcnNpb24gPSBhd2FpdCB0aGlzLmdldENocm9tZVZlcnNpb24oKTtcbiAgICAgIGlmICghY2hyb21lVmVyc2lvbikge1xuICAgICAgICAvLyB1bmFibGUgdG8gZ2V0IHRoZSBjaHJvbWUgdmVyc2lvblxuICAgICAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgdGhlIGN1cnJlbnQgQ2hyb21lIHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gZGlzY292ZXIgQ2hyb21lIHZlcnNpb24uIFVzaW5nIENocm9tZWRyaXZlciAke3ZlcnNpb259IGF0ICcke2V4ZWN1dGFibGV9J2ApO1xuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgQ2hyb21lIGJ1bmRsZSAnJHt0aGlzLmJ1bmRsZUlkfScgdmVyc2lvbiAnJHtjaHJvbWVWZXJzaW9ufSdgKTtcblxuICAgICAgY29uc3QgbWF0Y2hpbmdEcml2ZXJzID0gY2RzLmZpbHRlcigoe21pbkNocm9tZVZlcnNpb259KSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbkNocm9tZVZlcnNpb25TID0gbWluQ2hyb21lVmVyc2lvbiAmJiBzZW12ZXIuY29lcmNlKG1pbkNocm9tZVZlcnNpb24pO1xuICAgICAgICBpZiAoIW1pbkNocm9tZVZlcnNpb25TKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNocm9tZVZlcnNpb24ubWFqb3IgPiBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTlxuICAgICAgICAgID8gbWluQ2hyb21lVmVyc2lvblMubWFqb3IgPT09IGNocm9tZVZlcnNpb24ubWFqb3JcbiAgICAgICAgICA6IHNlbXZlci5ndGUoY2hyb21lVmVyc2lvbiwgbWluQ2hyb21lVmVyc2lvblMpO1xuICAgICAgfSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KG1hdGNoaW5nRHJpdmVycykpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmFnZUNsaWVudCAmJiAhZGlkU3RvcmFnZVN5bmMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHN5bmNDaHJvbWVkcml2ZXJzKGNocm9tZVZlcnNpb24pKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZy53YXJuKGBDYW5ub3Qgc3luY2hyb25pemUgbG9jYWwgY2hyb21lZHJpdmVycyB3aXRoIHRoZSByZW1vdGUgc3RvcmFnZSBhdCAke0NEX0NETn06IGAgK1xuICAgICAgICAgICAgICBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdXRvZG93bmxvYWRTdWdnZXN0aW9uID1cbiAgICAgICAgICAnWW91IGNvdWxkIGFsc28gdHJ5IHRvIGVuYWJsZSBhdXRvbWF0ZWQgY2hyb21lZHJpdmVycyBkb3dubG9hZCBzZXJ2ZXIgZmVhdHVyZSc7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuIGAgK1xuICAgICAgICAgICghdGhpcy5zdG9yYWdlQ2xpZW50ID8gYCR7YXV0b2Rvd25sb2FkU3VnZ2VzdGlvbn0uIGAgOiAnJykgK1xuICAgICAgICAgIGBTZWUgJHtDSFJPTUVEUklWRVJfVFVUT1JJQUx9IGZvciBtb3JlIGRldGFpbHNgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmluUGF0aCA9IG1hdGNoaW5nRHJpdmVyc1swXS5leGVjdXRhYmxlO1xuICAgICAgbG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgbWF0Y2hpbmdEcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgICBgY2FwYWJsZSBvZiBhdXRvbWF0aW5nIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuXFxuQ2hvb3NpbmcgdGhlIG1vc3QgcmVjZW50LCAnJHtiaW5QYXRofScuYCk7XG4gICAgICBsb2cuZGVidWcoJ0lmIGEgc3BlY2lmaWMgdmVyc2lvbiBpcyByZXF1aXJlZCwgc3BlY2lmeSBpdCB3aXRoIHRoZSBgY2hyb21lZHJpdmVyRXhlY3V0YWJsZWAnICtcbiAgICAgICAgJ2Rlc2lyZWQgY2FwYWJpbGl0eS4nKTtcbiAgICAgIHJldHVybiBiaW5QYXRoO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICB9IHdoaWxlICh0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRDaHJvbWVkcml2ZXJQYXRoICgpIHtcbiAgICBpZiAodGhpcy5leGVjdXRhYmxlVmVyaWZpZWQpIHJldHVybjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyB0aGUgZXhlY3V0YWJsZSBtaWdodCBiZSBzZXQgKGlmIHBhc3NlZCBpbilcbiAgICAvLyBvciB3ZSBtaWdodCB3YW50IHRvIHVzZSB0aGUgYmFzaWMgb25lIGluc3RhbGxlZCB3aXRoIHRoaXMgZHJpdmVyXG4gICAgLy8gb3Igd2Ugd2FudCB0byBmaWd1cmUgb3V0IHRoZSBiZXN0IG9uZVxuICAgIGlmICghdGhpcy5jaHJvbWVkcml2ZXIpIHtcbiAgICAgIHRoaXMuY2hyb21lZHJpdmVyID0gdGhpcy51c2VTeXN0ZW1FeGVjdXRhYmxlXG4gICAgICAgID8gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCgpXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHModGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byB1c2UgYSBjaHJvbWVkcml2ZXIgYmluYXJ5IGF0IHRoZSBwYXRoIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY2hyb21lZHJpdmVyfSwgYnV0IGl0IGRvZXNuJ3QgZXhpc3QhYCk7XG4gICAgfVxuICAgIHRoaXMuZXhlY3V0YWJsZVZlcmlmaWVkID0gdHJ1ZTtcbiAgICBsb2cuaW5mbyhgU2V0IGNocm9tZWRyaXZlciBiaW5hcnkgYXM6ICR7dGhpcy5jaHJvbWVkcml2ZXJ9YCk7XG4gIH1cblxuICBzeW5jUHJvdG9jb2wgKGNkVmVyc2lvbiA9IG51bGwpIHtcbiAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UoY2RWZXJzaW9uKTtcbiAgICBpZiAoIWNvZXJjZWRWZXJzaW9uIHx8IGNvZXJjZWRWZXJzaW9uLm1ham9yIDwgTUlOX0NEX1ZFUlNJT05fV0lUSF9XM0NfU1VQUE9SVCkge1xuICAgICAgbG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdi4gJHtjZFZlcnNpb259IGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbC4gYCArXG4gICAgICAgIGBEZWZhdWx0aW5nIHRvICR7UFJPVE9DT0xTLk1KU09OV1B9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBnZXRDYXBWYWx1ZSh0aGlzLmNhcGFiaWxpdGllcywgJ2Nocm9tZU9wdGlvbnMnLCB7fSk7XG4gICAgaWYgKGNocm9tZU9wdGlvbnMudzNjID09PSBmYWxzZSkge1xuICAgICAgbG9nLmluZm8oYENocm9tZWRyaXZlciB2LiAke2NkVmVyc2lvbn0gc3VwcG9ydHMgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbCwgYCArXG4gICAgICAgIGBidXQgJHtQUk9UT0NPTFMuTUpTT05XUH0gb25lIGhhcyBiZWVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGVzaXJlZFByb3RvY29sID0gUFJPVE9DT0xTLlczQztcbiAgICAvLyBnaXZlbiBjYXBzIG1pZ2h0IG5vdCBiZSBwcm9wZXJseSBwcmVmaXhlZFxuICAgIC8vIHNvIHdlIHRyeSB0byBmaXggdGhlbSBpbiBvcmRlciB0byBwcm9wZXJseSBpbml0XG4gICAgLy8gdGhlIG5ldyBXM0Mgc2Vzc2lvblxuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gdG9XM2NDYXBOYW1lcyh0aGlzLmNhcGFiaWxpdGllcyk7XG4gIH1cblxuICBhc3luYyBzdGFydCAoY2FwcywgZW1pdFN0YXJ0aW5nU3RhdGUgPSB0cnVlKSB7XG4gICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChjYXBzKTtcblxuICAgIC8vIHNldCB0aGUgbG9nZ2luZyBwcmVmZXJlbmNlcyB0byBBTEwgdGhlIGNvbnNvbGUgbG9nc1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzLmxvZ2dpbmdQcmVmcyA9IF8uY2xvbmVEZWVwKGdldENhcFZhbHVlKGNhcHMsICdsb2dnaW5nUHJlZnMnLCB7fSkpO1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5jYXBhYmlsaXRpZXMubG9nZ2luZ1ByZWZzLmJyb3dzZXIpKSB7XG4gICAgICB0aGlzLmNhcGFiaWxpdGllcy5sb2dnaW5nUHJlZnMuYnJvd3NlciA9ICdBTEwnO1xuICAgIH1cblxuICAgIGlmIChlbWl0U3RhcnRpbmdTdGF0ZSkge1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RBUlRJTkcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3MgPSBbJy0tdXJsLWJhc2U9d2QvaHViJywgYC0tcG9ydD0ke3RoaXMucHJveHlQb3J0fWBdO1xuICAgIGlmICh0aGlzLmFkYiAmJiB0aGlzLmFkYi5hZGJQb3J0KSB7XG4gICAgICBhcmdzLnB1c2goYC0tYWRiLXBvcnQ9JHt0aGlzLmFkYi5hZGJQb3J0fWApO1xuICAgIH1cbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuY21kQXJncykpIHtcbiAgICAgIGFyZ3MucHVzaCguLi50aGlzLmNtZEFyZ3MpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dQYXRoKSB7XG4gICAgICBhcmdzLnB1c2goYC0tbG9nLXBhdGg9JHt0aGlzLmxvZ1BhdGh9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc2FibGVCdWlsZENoZWNrKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZGlzYWJsZS1idWlsZC1jaGVjaycpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tdmVyYm9zZScpO1xuICAgIC8vIHdoYXQgYXJlIHRoZSBwcm9jZXNzIHN0ZG91dC9zdGRlcnIgY29uZGl0aW9ucyB3aGVyZWluIHdlIGtub3cgdGhhdFxuICAgIC8vIHRoZSBwcm9jZXNzIGhhcyBzdGFydGVkIHRvIG91ciBzYXRpc2ZhY3Rpb24/XG4gICAgY29uc3Qgc3RhcnREZXRlY3RvciA9IChzdGRvdXQpID0+IHN0ZG91dC5zdGFydHNXaXRoKCdTdGFydGluZyAnKTtcblxuICAgIGxldCBwcm9jZXNzSXNBbGl2ZSA9IGZhbHNlO1xuICAgIGxldCB3ZWJ2aWV3VmVyc2lvbjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0Q2hyb21lZHJpdmVyUGF0aCgpO1xuICAgICAgYXdhaXQgdGhpcy5raWxsQWxsKCk7XG5cbiAgICAgIC8vIHNldCB1cCBvdXIgc3VicHJvY2VzcyBvYmplY3RcbiAgICAgIHRoaXMucHJvYyA9IG5ldyBTdWJQcm9jZXNzKHRoaXMuY2hyb21lZHJpdmVyLCBhcmdzKTtcbiAgICAgIHByb2Nlc3NJc0FsaXZlID0gdHJ1ZTtcblxuICAgICAgLy8gaGFuZGxlIGxvZyBvdXRwdXRcbiAgICAgIHRoaXMucHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIC8vIGlmIHRoZSBjZCBvdXRwdXQgaXMgbm90IHByaW50ZWQsIGZpbmQgdGhlIGNocm9tZSB2ZXJzaW9uIGFuZCBwcmludFxuICAgICAgICAvLyB3aWxsIGdldCBhIHJlc3BvbnNlIGxpa2VcbiAgICAgICAgLy8gICBEZXZUb29scyByZXNwb25zZToge1xuICAgICAgICAvLyAgICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNhbXBsZWFwcFwiLFxuICAgICAgICAvLyAgICAgIFwiQnJvd3NlclwiOiBcIkNocm9tZS81NS4wLjI4ODMuOTFcIixcbiAgICAgICAgLy8gICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjJcIixcbiAgICAgICAgLy8gICAgICBcIlVzZXItQWdlbnRcIjogXCIuLi5cIixcbiAgICAgICAgLy8gICAgICBcIldlYktpdC1WZXJzaW9uXCI6IFwiNTM3LjM2XCJcbiAgICAgICAgLy8gICB9XG4gICAgICAgIGNvbnN0IG91dCA9IHN0ZG91dCArIHN0ZGVycjtcbiAgICAgICAgbGV0IG1hdGNoID0gL1wiQnJvd3NlclwiOiBcIiguKilcIi8uZXhlYyhvdXQpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB3ZWJ2aWV3VmVyc2lvbiA9IG1hdGNoWzFdO1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgV2VidmlldyB2ZXJzaW9uOiAnJHt3ZWJ2aWV3VmVyc2lvbn0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbHNvIHByaW50IGNocm9tZWRyaXZlciB2ZXJzaW9uIHRvIGxvZ3NcbiAgICAgICAgLy8gd2lsbCBvdXRwdXQgc29tZXRoaW5nIGxpa2VcbiAgICAgICAgLy8gIFN0YXJ0aW5nIENocm9tZURyaXZlciAyLjMzLjUwNjEwNiAoOGEwNmMzOWM0NTgyZmJmYmFiNjk2NmRiYjFjMzhhOTE3M2JmYjFhMikgb24gcG9ydCA5NTE1XG4gICAgICAgIG1hdGNoID0gL1N0YXJ0aW5nIENocm9tZURyaXZlciAoWy5cXGRdKykvLmV4ZWMob3V0KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdmVyc2lvbjogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgICAgIHRoaXMuc3luY1Byb3RvY29sKG1hdGNoWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmUgdGhlIG91dHB1dCBpZiBpdCBpcyByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgKHN0ZG91dCB8fCAnJykudHJpbSgpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5sZW5ndGgpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgICBsb2cuZGVidWcoYFtTVERPVVRdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsZXQgbGluZSBvZiAoc3RkZXJyIHx8ICcnKS50cmltKCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpLmxlbmd0aCkgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICAgICAgICAgIGxvZy5lcnJvcihgW1NUREVSUl0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGhhbmRsZSBvdXQtb2YtYm91bmQgZXhpdCBieSBzaW1wbHkgZW1pdHRpbmcgYSBzdG9wcGVkIHN0YXRlXG4gICAgICB0aGlzLnByb2Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3NJc0FsaXZlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORykge1xuICAgICAgICAgIGxldCBtc2cgPSBgQ2hyb21lZHJpdmVyIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX0sIGAgK1xuICAgICAgICAgICAgICAgICAgICBgc2lnbmFsICR7c2lnbmFsfWA7XG4gICAgICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nLmluZm8oYFNwYXduaW5nIGNocm9tZWRyaXZlciB3aXRoOiAke3RoaXMuY2hyb21lZHJpdmVyfSBgICtcbiAgICAgICAgICAgICAgIGAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgLy8gc3RhcnQgc3VicHJvYyBhbmQgd2FpdCBmb3Igc3RhcnREZXRlY3RvclxuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0YXJ0KHN0YXJ0RGV0ZWN0b3IpO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yT25saW5lKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0U2Vzc2lvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgIHRoaXMuZW1pdChDaHJvbWVkcml2ZXIuRVZFTlRfRVJST1IsIGUpO1xuICAgICAgLy8ganVzdCBiZWNhdXNlIHdlIGhhZCBhbiBlcnJvciBkb2Vzbid0IG1lYW4gdGhlIGNocm9tZWRyaXZlciBwcm9jZXNzXG4gICAgICAvLyBmaW5pc2hlZDsgd2Ugc2hvdWxkIGNsZWFuIHVwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHByb2Nlc3NJc0FsaXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICAvLyBvZnRlbiB0aGUgdXNlcidzIENocm9tZSB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgQ2hyb21lZHJpdmVyXG4gICAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKCdDaHJvbWUgdmVyc2lvbiBtdXN0IGJlJykpIHtcbiAgICAgICAgbWVzc2FnZSArPSAnVW5hYmxlIHRvIGF1dG9tYXRlIENocm9tZSB2ZXJzaW9uIGJlY2F1c2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YgQ2hyb21lZHJpdmVyLlxcbic7XG4gICAgICAgIGlmICh3ZWJ2aWV3VmVyc2lvbikge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYENocm9tZSB2ZXJzaW9uIG9uIHRoZSBkZXZpY2U6ICR7d2Vidmlld1ZlcnNpb259XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyID0gL0Nocm9tZSB2ZXJzaW9uIG11c3QgYmUgKC4rKS8uZXhlYyhlLm1lc3NhZ2UpPy5bMV0gfHwgJyc7XG4gICAgICAgIGlmICh2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgQ2hyb21lZHJpdmVyIHN1cHBvcnRzIENocm9tZSB2ZXJzaW9uKHMpOiAke3ZlcnNpb25zU3VwcG9ydGVkQnlEcml2ZXJ9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlICs9IGBWaXNpdCAnJHtDSFJPTUVEUklWRVJfVFVUT1JJQUx9JyB0byB0cm91Ymxlc2hvb3QgdGhlIHByb2JsZW0uXFxuYDtcbiAgICAgIH1cblxuICAgICAgbWVzc2FnZSArPSBlLm1lc3NhZ2U7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBzZXNzaW9uSWQgKCkge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3Byb3h5LnNlc3Npb25JZDtcbiAgfVxuXG4gIGFzeW5jIHJlc3RhcnQgKCkge1xuICAgIGxvZy5pbmZvKCdSZXN0YXJ0aW5nIGNocm9tZWRyaXZlcicpO1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXN0YXJ0IHdoZW4gd2UncmUgbm90IG9ubGluZVwiKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORyk7XG4gICAgYXdhaXQgdGhpcy5zdG9wKGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KHRoaXMuY2FwYWJpbGl0aWVzLCBmYWxzZSk7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yT25saW5lICgpIHtcbiAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IENEIGhhc24ndCBjcmFzaGVkXG4gICAgbGV0IGNocm9tZWRyaXZlclN0b3BwZWQgPSBmYWxzZTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKDIwLCAyMDAsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICAvLyB3ZSBhcmUgZWl0aGVyIHN0b3BwZWQgb3Igc3RvcHBpbmcsIHNvIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICAgIGNocm9tZWRyaXZlclN0b3BwZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH0pO1xuICAgIGlmIChjaHJvbWVkcml2ZXJTdG9wcGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nocm9tZURyaXZlciBjcmFzaGVkIGR1cmluZyBzdGFydHVwLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uICgpIHtcbiAgICBjb25zdCBzZXNzaW9uQ2FwcyA9IHRoaXMuZGVzaXJlZFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDXG4gICAgICA/IHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogdGhpcy5jYXBhYmlsaXRpZXN9fVxuICAgICAgOiB7ZGVzaXJlZENhcGFiaWxpdGllczogdGhpcy5jYXBhYmlsaXRpZXN9O1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyAke3RoaXMuZGVzaXJlZFByb3RvY29sfSBDaHJvbWVkcml2ZXIgc2Vzc2lvbiB3aXRoIGNhcGFiaWxpdGllczogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShzZXNzaW9uQ2FwcywgbnVsbCwgMikpO1xuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywgc2Vzc2lvbkNhcHMpO1xuICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX09OTElORSk7XG4gIH1cblxuICBhc3luYyBzdG9wIChlbWl0U3RhdGVzID0gdHJ1ZSkge1xuICAgIGlmIChlbWl0U3RhdGVzKSB7XG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVE9QUElORyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnJywgJ0RFTEVURScpO1xuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoJ1NJR1RFUk0nLCAyMDAwMCk7XG4gICAgICBpZiAoZW1pdFN0YXRlcykge1xuICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU3RhdGUgKHN0YXRlKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIGxvZy5kZWJ1ZyhgQ2hhbmdlZCBzdGF0ZSB0byAnJHtzdGF0ZX0nYCk7XG4gICAgdGhpcy5lbWl0KENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCB7c3RhdGV9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCh1cmwsIG1ldGhvZCwgYm9keSk7XG4gIH1cblxuICBhc3luYyBwcm94eVJlcSAocmVxLCByZXMpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzKHJlcSwgcmVzKTtcbiAgfVxuXG4gIGFzeW5jIGtpbGxBbGwgKCkge1xuICAgIGxldCBjbWQgPSBzeXN0ZW0uaXNXaW5kb3dzKClcbiAgICAgID8gYHdtaWMgcHJvY2VzcyB3aGVyZSBcImNvbW1hbmRsaW5lIGxpa2UgJyVjaHJvbWVkcml2ZXIuZXhlJS0tcG9ydD0ke3RoaXMucHJveHlQb3J0fSUnXCIgZGVsZXRlYFxuICAgICAgOiBgcGtpbGwgLTE1IC1mIFwiJHt0aGlzLmNocm9tZWRyaXZlcn0uKi0tcG9ydD0ke3RoaXMucHJveHlQb3J0fVwiYDtcbiAgICBsb2cuZGVidWcoYEtpbGxpbmcgYW55IG9sZCBjaHJvbWVkcml2ZXJzLCBydW5uaW5nOiAke2NtZH1gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgKEIucHJvbWlzaWZ5KGNwLmV4ZWMpKShjbWQpO1xuICAgICAgbG9nLmRlYnVnKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCB1cCBvbGQgY2hyb21lZHJpdmVycycpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oJ05vIG9sZCBjaHJvbWVkcml2ZXJzIHNlZW0gdG8gZXhpc3QnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hZGIpIHtcbiAgICAgIGNvbnN0IHVkaWRJbmRleCA9IHRoaXMuYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSAnLXMnKTtcbiAgICAgIGNvbnN0IHVkaWQgPSB1ZGlkSW5kZXggPiAtMSA/IHRoaXMuYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NbdWRpZEluZGV4ICsgMV0gOiBudWxsO1xuXG4gICAgICBpZiAodWRpZCkge1xuICAgICAgICBsb2cuZGVidWcoYENsZWFuaW5nIHRoaXMgZGV2aWNlJ3MgYWRiIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uczogJHt1ZGlkfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKGBDbGVhbmluZyBhbnkgb2xkIGFkYiBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbnNgKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChsZXQgY29ubiBvZiBhd2FpdCB0aGlzLmFkYi5nZXRGb3J3YXJkTGlzdCgpKSB7XG4gICAgICAgICAgLy8gY2hyb21lZHJpdmVyIHdpbGwgYXNrIEFEQiB0byBmb3J3YXJkIGEgcG9ydCBsaWtlIFwiZGV2aWNlSWQgdGNwOnBvcnQgbG9jYWxhYnN0cmFjdDp3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV9wb3J0XCJcbiAgICAgICAgICBpZiAoIShjb25uLmluY2x1ZGVzKCd3ZWJ2aWV3X2RldnRvb2xzJykgJiYgKCF1ZGlkIHx8IGNvbm4uaW5jbHVkZXModWRpZCkpKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHBhcmFtcyA9IGNvbm4uc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHBhcmFtc1sxXS5yZXBsYWNlKC9bXFxEXSovLCAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gY2xlYW4gZm9yd2FyZGVkIHBvcnRzLiBFcnJvcjogJyR7ZXJyLm1lc3NhZ2V9Jy4gQ29udGludWluZy5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBoYXNXb3JraW5nV2VidmlldyAoKSB7XG4gICAgLy8gc29tZXRpbWVzIGNocm9tZWRyaXZlciBzdG9wcyBhdXRvbWF0aW5nIHdlYnZpZXdzLiB0aGlzIG1ldGhvZCBydW5zIGFcbiAgICAvLyBzaW1wbGUgY29tbWFuZCB0byBkZXRlcm1pbmUgb3VyIHN0YXRlLCBhbmQgcmVzcG9uZHMgYWNjb3JkaW5nbHlcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy91cmwnLCAnR0VUJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbkNocm9tZWRyaXZlci5FVkVOVF9FUlJPUiA9ICdjaHJvbWVkcml2ZXJfZXJyb3InO1xuQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQgPSAnc3RhdGVDaGFuZ2VkJztcbkNocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEID0gJ3N0b3BwZWQnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUQVJUSU5HID0gJ3N0YXJ0aW5nJztcbkNocm9tZWRyaXZlci5TVEFURV9PTkxJTkUgPSAnb25saW5lJztcbkNocm9tZWRyaXZlci5TVEFURV9TVE9QUElORyA9ICdzdG9wcGluZyc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORyA9ICdyZXN0YXJ0aW5nJztcblxuZXhwb3J0IHsgQ2hyb21lZHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBDaHJvbWVkcml2ZXI7XG4iXSwiZmlsZSI6ImxpYi9jaHJvbWVkcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
732
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jaHJvbWVkcml2ZXIuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT04iLCJERUZBVUxUX0hPU1QiLCJNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUIiwiREVGQVVMVF9QT1JUIiwiQ0hST01FX0JVTkRMRV9JRCIsIldFQlZJRVdfU0hFTExfQlVORExFX0lEIiwiV0VCVklFV19CVU5ETEVfSURTIiwiQ0hST01FRFJJVkVSX1RVVE9SSUFMIiwiVkVSU0lPTl9QQVRURVJOIiwiQ0RfVkVSU0lPTl9USU1FT1VUIiwiQ2hyb21lZHJpdmVyIiwiZXZlbnRzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJhcmdzIiwiaG9zdCIsInBvcnQiLCJ1c2VTeXN0ZW1FeGVjdXRhYmxlIiwiZXhlY3V0YWJsZSIsImV4ZWN1dGFibGVEaXIiLCJidW5kbGVJZCIsIm1hcHBpbmdQYXRoIiwiY21kQXJncyIsImFkYiIsInZlcmJvc2UiLCJsb2dQYXRoIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJkZXRhaWxzIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwicHJveHlIb3N0IiwicHJveHlQb3J0IiwicHJvYyIsImNocm9tZWRyaXZlciIsImV4ZWN1dGFibGVWZXJpZmllZCIsInN0YXRlIiwiU1RBVEVfU1RPUFBFRCIsImp3cHJveHkiLCJKV1Byb3h5Iiwic2VydmVyIiwic3RvcmFnZUNsaWVudCIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJjaHJvbWVkcml2ZXJEaXIiLCJjYXBhYmlsaXRpZXMiLCJkZXNpcmVkUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiZ2V0RHJpdmVyc01hcHBpbmciLCJtYXBwaW5nIiwiXyIsImNsb25lRGVlcCIsIkNIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyIsImRlYnVnIiwiZnMiLCJleGlzdHMiLCJ3YXJuIiwiaW5mbyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwiZXJyIiwibWVzc2FnZSIsImNkVmVyc2lvbiIsImNocm9tZVZlcnNpb24iLCJ0b1BhaXJzIiwiY29lcmNlZFZlcnNpb24iLCJzZW12ZXIiLCJjb2VyY2UiLCJ2ZXJzaW9uIiwiZ2V0Q2hyb21lZHJpdmVycyIsImV4ZWN1dGFibGVzIiwiZ2xvYiIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJjZHMiLCJtYXBDaHJvbWVkcml2ZXIiLCJsb2dFcnJvciIsInN0ZG91dCIsInN0ZGVyciIsImVyck1zZyIsInBhdGgiLCJiYXNlbmFtZSIsInRpbWVvdXQiLCJpbmNsdWRlcyIsIm1hdGNoIiwiZXhlYyIsIm1pbkNocm9tZVZlcnNpb24iLCJtYWpvciIsIm1pbm9yIiwiZmlsdGVyIiwiY2QiLCJzb3J0IiwiYSIsImIiLCJpc0VtcHR5IiwiZ2V0Q2hyb21lVmVyc2lvbiIsIkJyb3dzZXIiLCJ2ZXJzaW9uTWF0Y2giLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwidXBkYXRlRHJpdmVyc01hcHBpbmciLCJuZXdNYXBwaW5nIiwic2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZyIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsImUiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyIiwidmFsdWVzIiwiZGlkU3RvcmFnZVN5bmMiLCJzeW5jQ2hyb21lZHJpdmVycyIsInJldHJpZXZlZE1hcHBpbmciLCJyZXRyaWV2ZU1hcHBpbmciLCJkcml2ZXJLZXlzIiwic3luY0RyaXZlcnMiLCJtaW5Ccm93c2VyVmVyc2lvbiIsInN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nIiwicmVkdWNlIiwiYWNjIiwieCIsIm1pc3NpbmdWZXJzaW9ucyIsImNvZXJjZWRWZXIiLCJzaXplIiwiZXJyb3JBbmRUaHJvdyIsIm1hdGNoaW5nRHJpdmVycyIsIm1pbkNocm9tZVZlcnNpb25TIiwiZ3RlIiwiQ0RfQ0ROIiwic3RhY2siLCJhdXRvZG93bmxvYWRTdWdnZXN0aW9uIiwiRXJyb3IiLCJiaW5QYXRoIiwiaW5pdENocm9tZWRyaXZlclBhdGgiLCJzeW5jUHJvdG9jb2wiLCJXM0MiLCJjaHJvbWVPcHRpb25zIiwidzNjIiwic3RhcnQiLCJjYXBzIiwiZW1pdFN0YXJ0aW5nU3RhdGUiLCJsb2dnaW5nUHJlZnMiLCJicm93c2VyIiwiY2hhbmdlU3RhdGUiLCJTVEFURV9TVEFSVElORyIsImFkYlBvcnQiLCJwdXNoIiwiaXNBcnJheSIsInN0YXJ0RGV0ZWN0b3IiLCJzdGFydHNXaXRoIiwicHJvY2Vzc0lzQWxpdmUiLCJ3ZWJ2aWV3VmVyc2lvbiIsImtpbGxBbGwiLCJTdWJQcm9jZXNzIiwib24iLCJvdXQiLCJsaW5lIiwidHJpbSIsInNwbGl0IiwiZXJyb3IiLCJjb2RlIiwic2lnbmFsIiwiU1RBVEVfU1RPUFBJTkciLCJTVEFURV9SRVNUQVJUSU5HIiwibXNnIiwiam9pbiIsIndhaXRGb3JPbmxpbmUiLCJzdGFydFNlc3Npb24iLCJlbWl0IiwiRVZFTlRfRVJST1IiLCJzdG9wIiwidmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciIsInNlc3Npb25JZCIsIlNUQVRFX09OTElORSIsInJlc3RhcnQiLCJjaHJvbWVkcml2ZXJTdG9wcGVkIiwiZ2V0U3RhdHVzIiwiY29tbWFuZCIsInNlc3Npb25DYXBzIiwiYWx3YXlzTWF0Y2giLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwiZW1pdFN0YXRlcyIsInJ1blNhZmVTdGVwIiwiZiIsIkVWRU5UX0NIQU5HRUQiLCJzZW5kQ29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJwcm94eVJlcSIsInJlcSIsInJlcyIsInByb3h5UmVxUmVzIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiQiIsInByb21pc2lmeSIsImNwIiwidWRpZEluZGV4IiwiZGVmYXVsdEFyZ3MiLCJmaW5kSW5kZXgiLCJpdGVtIiwidWRpZCIsImNvbm4iLCJnZXRGb3J3YXJkTGlzdCIsInBhcmFtcyIsInJlbW92ZVBvcnRGb3J3YXJkIiwicmVw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LENBQS9DLENBQUYsQ0FBSixFQUE0RTtBQUMxRTtBQUNEOztBQUVELGNBQUlHLE1BQU0sR0FBR0YsSUFBSSxDQUFDOUMsS0FBTCxDQUFXLEtBQVgsQ0FBYjs7QUFDQSxjQUFJZ0QsTUFBTSxDQUFDckksTUFBUCxHQUFnQixDQUFwQixFQUF1QjtBQUNyQixrQkFBTSxLQUFLbEQsR0FBTCxDQUFTd0wsaUJBQVQsQ0FBMkJELE1BQU0sQ0FBQyxDQUFELENBQU4sQ0FBVUUsT0FBVixDQUFrQixPQUFsQixFQUEyQixFQUEzQixDQUEzQixDQUFOO0FBQ0Q7QUFDRjtBQUNGLE9BWkQsQ0FZRSxPQUFPckosR0FBUCxFQUFZO0FBQ1o5RCxRQUFBQSxHQUFHLENBQUN5RCxJQUFKLENBQVUsNENBQTJDSyxHQUFHLENBQUNDLE9BQVEsZ0JBQWpFO0FBQ0Q7QUFDRjtBQUNGOztBQUVzQixRQUFqQnFKLGlCQUFpQixHQUFJO0FBR3pCLFFBQUk7QUFDRixZQUFNLEtBQUs3SyxPQUFMLENBQWE2SSxPQUFiLENBQXFCLE1BQXJCLEVBQTZCLEtBQTdCLENBQU47QUFDQSxhQUFPLElBQVA7QUFDRCxLQUhELENBR0UsT0FBT3hFLENBQVAsRUFBVTtBQUNWLGFBQU8sS0FBUDtBQUNEO0FBQ0Y7O0FBbm9CNEM7OztBQXNvQi9DL0YsWUFBWSxDQUFDK0osV0FBYixHQUEyQixvQkFBM0I7QUFDQS9KLFlBQVksQ0FBQzhLLGFBQWIsR0FBNkIsY0FBN0I7QUFDQTlLLFlBQVksQ0FBQ3lCLGFBQWIsR0FBNkIsU0FBN0I7QUFDQXpCLFlBQVksQ0FBQ3NJLGNBQWIsR0FBOEIsVUFBOUI7QUFDQXRJLFlBQVksQ0FBQ21LLFlBQWIsR0FBNEIsUUFBNUI7QUFDQW5LLFlBQVksQ0FBQ3dKLGNBQWIsR0FBOEIsVUFBOUI7QUFDQXhKLFlBQVksQ0FBQ3lKLGdCQUFiLEdBQWdDLFlBQWhDO2VBR2V6SixZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgSldQcm94eSwgUFJPVE9DT0xTIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCwgYXN5bmNtYXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzLCBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIGdldENocm9tZVZlcnNpb24sIGdldENocm9tZWRyaXZlckRpciwgQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HLFxuICBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoLCBDRF9DRE4sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNvbXBhcmVWZXJzaW9ucyBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHsgdG9XM2NDYXBOYW1lcywgZ2V0Q2FwVmFsdWUgfSBmcm9tICcuL3Byb3RvY29sLWhlbHBlcnMnO1xuXG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0Nocm9tZWRyaXZlcicpO1xuXG5jb25zdCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiA9IDczO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUID0gNzU7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA5NTE1O1xuY29uc3QgQ0hST01FX0JVTkRMRV9JRCA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgV0VCVklFV19TSEVMTF9CVU5ETEVfSUQgPSAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnO1xuY29uc3QgV0VCVklFV19CVU5ETEVfSURTID0gW1xuICAnY29tLmdvb2dsZS5hbmRyb2lkLndlYnZpZXcnLFxuICAnY29tLmFuZHJvaWQud2VidmlldycsXG5dO1xuY29uc3QgQ0hST01FRFJJVkVSX1RVVE9SSUFMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vd3JpdGluZy1ydW5uaW5nLWFwcGl1bS93ZWIvY2hyb21lZHJpdmVyLm1kJztcbmNvbnN0IFZFUlNJT05fUEFUVEVSTiA9IC8oW1xcZC5dKykvO1xuXG5jb25zdCBDRF9WRVJTSU9OX1RJTUVPVVQgPSA1MDAwO1xuXG5jbGFzcyBDaHJvbWVkcml2ZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgICAgcG9ydCA9IERFRkFVTFRfUE9SVCxcbiAgICAgIHVzZVN5c3RlbUV4ZWN1dGFibGUgPSBmYWxzZSxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBleGVjdXRhYmxlRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICBidW5kbGVJZCxcbiAgICAgIG1hcHBpbmdQYXRoLFxuICAgICAgY21kQXJncyxcbiAgICAgIGFkYixcbiAgICAgIHZlcmJvc2UsXG4gICAgICBsb2dQYXRoLFxuICAgICAgZGlzYWJsZUJ1aWxkQ2hlY2ssXG4gICAgICBkZXRhaWxzLFxuICAgICAgaXNBdXRvZG93bmxvYWRFbmFibGVkID0gZmFsc2UsXG4gICAgfSA9IGFyZ3M7XG5cbiAgICB0aGlzLnByb3h5SG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5wcm94eVBvcnQgPSBwb3J0O1xuICAgIHRoaXMuYWRiID0gYWRiO1xuICAgIHRoaXMuY21kQXJncyA9IGNtZEFyZ3M7XG4gICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICB0aGlzLnVzZVN5c3RlbUV4ZWN1dGFibGUgPSB1c2VTeXN0ZW1FeGVjdXRhYmxlO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gZXhlY3V0YWJsZTtcbiAgICB0aGlzLmV4ZWN1dGFibGVEaXIgPSBleGVjdXRhYmxlRGlyO1xuICAgIHRoaXMubWFwcGluZ1BhdGggPSBtYXBwaW5nUGF0aDtcbiAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgdGhpcy5leGVjdXRhYmxlVmVyaWZpZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlID0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQ7XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEpXUHJveHkoe1xuICAgICAgc2VydmVyOiB0aGlzLnByb3h5SG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMucHJveHlQb3J0XG4gICAgfSk7XG4gICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTtcbiAgICB0aGlzLmxvZ1BhdGggPSBsb2dQYXRoO1xuICAgIHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2sgPSAhIWRpc2FibGVCdWlsZENoZWNrO1xuICAgIHRoaXMuc3RvcmFnZUNsaWVudCA9IGlzQXV0b2Rvd25sb2FkRW5hYmxlZFxuICAgICAgPyBuZXcgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCh7IGNocm9tZWRyaXZlckRpcjogdGhpcy5leGVjdXRhYmxlRGlyIH0pXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHt9O1xuICAgIHRoaXMuZGVzaXJlZFByb3RvY29sID0gUFJPVE9DT0xTLk1KU09OV1A7XG4gIH1cblxuICBhc3luYyBnZXREcml2ZXJzTWFwcGluZyAoKSB7XG4gICAgbGV0IG1hcHBpbmcgPSBfLmNsb25lRGVlcChDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcpO1xuICAgIGlmICh0aGlzLm1hcHBpbmdQYXRoKSB7XG4gICAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8gdXNlIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcgZnJvbSAnJHt0aGlzLm1hcHBpbmdQYXRofSdgKTtcbiAgICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMubWFwcGluZ1BhdGgpKSB7XG4gICAgICAgIGxvZy53YXJuKGBObyBmaWxlIGZvdW5kIGF0ICcke3RoaXMubWFwcGluZ1BhdGh9J2ApO1xuICAgICAgICBsb2cuaW5mbygnRGVmYXVsdGluZyB0byB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWFwcGluZyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUodGhpcy5tYXBwaW5nUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy53YXJuKGBFcnJvciBwYXJzaW5nIG1hcHBpbmcgZnJvbSAnJHt0aGlzLm1hcHBpbmdQYXRofSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgbG9nLmluZm8oJ0RlZmF1bHRpbmcgdG8gdGhlIHN0YXRpYyBDaHJvbWVkcml2ZXItPkNocm9tZSBtYXBwaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdVc2luZyB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGZvciBtaW5pbXVtIGNocm9tZSB2ZXJzaW9uIGFyZSBzZW12ZXIgY29tcGxpYW50XG4gICAgZm9yIChjb25zdCBbY2RWZXJzaW9uLCBjaHJvbWVWZXJzaW9uXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKTtcbiAgICAgIGlmIChjb2VyY2VkVmVyc2lvbikge1xuICAgICAgICBtYXBwaW5nW2NkVmVyc2lvbl0gPSBjb2VyY2VkVmVyc2lvbi52ZXJzaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmluZm8oYCcke2Nocm9tZVZlcnNpb259JyBpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIG51bWJlci4gU2tpcHBpbmcgaXRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcHBpbmc7XG4gIH1cblxuICBhc3luYyBnZXRDaHJvbWVkcml2ZXJzIChtYXBwaW5nKSB7XG4gICAgLy8gZ28gdGhyb3VnaCB0aGUgdmVyc2lvbnMgYXZhaWxhYmxlXG4gICAgY29uc3QgZXhlY3V0YWJsZXMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZXhlY3V0YWJsZURpcn0vKmApO1xuICAgIGxvZy5kZWJ1ZyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnZXhlY3V0YWJsZScsIGV4ZWN1dGFibGVzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgYGluICcke3RoaXMuZXhlY3V0YWJsZURpcn0nYCk7XG4gICAgY29uc3QgY2RzID0gKGF3YWl0IGFzeW5jbWFwKGV4ZWN1dGFibGVzLCBhc3luYyBmdW5jdGlvbiBtYXBDaHJvbWVkcml2ZXIgKGV4ZWN1dGFibGUpIHtcbiAgICAgIGNvbnN0IGxvZ0Vycm9yID0gKHttZXNzYWdlLCBzdGRvdXQgPSBudWxsLCBzdGRlcnIgPSBudWxsfSkgPT4ge1xuICAgICAgICBsZXQgZXJyTXNnID0gYENhbm5vdCByZXRyaWV2ZSB2ZXJzaW9uIG51bWJlciBmcm9tICcke3BhdGguYmFzZW5hbWUoZXhlY3V0YWJsZSl9JyBDaHJvbWVkcml2ZXIgYmluYXJ5LiBgICtcbiAgICAgICAgICBgTWFrZSBzdXJlIGl0IHJldHVybnMgYSB2YWxpZCB2ZXJzaW9uIHN0cmluZyBpbiByZXNwb25zZSB0byAnLS12ZXJzaW9uJyBjb21tYW5kIGxpbmUgYXJndW1lbnQuICR7bWVzc2FnZX1gO1xuICAgICAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICAgICAgZXJyTXNnICs9IGBcXG5TdGRvdXQ6ICR7c3Rkb3V0fWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIGVyck1zZyArPSBgXFxuU3RkZXJyOiAke3N0ZGVycn1gO1xuICAgICAgICB9XG4gICAgICAgIGxvZy53YXJuKGVyck1zZyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcblxuICAgICAgbGV0IHN0ZG91dDtcbiAgICAgIGxldCBzdGRlcnI7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWMoZXhlY3V0YWJsZSwgWyctLXZlcnNpb24nXSwge1xuICAgICAgICAgIHRpbWVvdXQ6IENEX1ZFUlNJT05fVElNRU9VVCxcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyci5tZXNzYWdlIHx8ICcnKS5pbmNsdWRlcygndGltZWQgb3V0JykgJiYgIShlcnIuc3Rkb3V0IHx8ICcnKS5pbmNsdWRlcygnU3RhcnRpbmcgQ2hyb21lRHJpdmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gbG9nRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoaXMgaGFzIHRpbWVkIG91dCwgaXQgaGFzIGFjdHVhbGx5IHN0YXJ0ZWQgQ2hyb21lZHJpdmVyLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHRoZXJlIHdpbGwgYWxzbyBiZSB0aGUgdmVyc2lvbiBzdHJpbmcgaW4gdGhlIG91dHB1dFxuICAgICAgICBzdGRvdXQgPSBlcnIuc3Rkb3V0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IC9DaHJvbWVEcml2ZXJcXHMrXFwoP3Y/KFtcXGQuXSspXFwpPy9pLmV4ZWMoc3Rkb3V0KTsgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci96cGo1d0EvMVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe21lc3NhZ2U6ICdDYW5ub3QgcGFyc2UgdGhlIHZlcnNpb24gc3RyaW5nJywgc3Rkb3V0LCBzdGRlcnJ9KTtcbiAgICAgIH1cbiAgICAgIGxldCB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICBsZXQgbWluQ2hyb21lVmVyc2lvbiA9IG1hcHBpbmdbdmVyc2lvbl07XG4gICAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UodmVyc2lvbik7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgLy8gYmVmb3JlIDIwMTktMDMtMDYgdmVyc2lvbnMgd2VyZSBvZiB0aGUgZm9ybSBtYWpvci5taW5vclxuICAgICAgICBpZiAoY29lcmNlZFZlcnNpb24ubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIHZlcnNpb24gPSBgJHtjb2VyY2VkVmVyc2lvbi5tYWpvcn0uJHtjb2VyY2VkVmVyc2lvbi5taW5vcn1gO1xuICAgICAgICAgIG1pbkNocm9tZVZlcnNpb24gPSBtYXBwaW5nW3ZlcnNpb25dO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWluQ2hyb21lVmVyc2lvbiAmJiBjb2VyY2VkVmVyc2lvbi5tYWpvciA+PSBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIC8vIEFzc3VtZSB0aGUgbWFqb3IgQ2hyb21lIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIG1ham9yIHZlcnNpb25cbiAgICAgICAgICBtaW5DaHJvbWVWZXJzaW9uID0gYCR7Y29lcmNlZFZlcnNpb24ubWFqb3J9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0YWJsZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgbWluQ2hyb21lVmVyc2lvbixcbiAgICAgIH07XG4gICAgfSkpXG4gICAgICAuZmlsdGVyKChjZCkgPT4gISFjZClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBjb21wYXJlVmVyc2lvbnMoYi52ZXJzaW9uLCBhLnZlcnNpb24pKTtcbiAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBDaHJvbWVkcml2ZXJzIHdlcmUgZm91bmQgaW4gJyR7dGhpcy5leGVjdXRhYmxlRGlyfSdgKTtcbiAgICAgIHJldHVybiBjZHM7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBDaHJvbWVkcml2ZXIgZXhlY3V0YWJsZXMgd2VyZSBmb3VuZDpgKTtcbiAgICBmb3IgKGNvbnN0IGNkIG9mIGNkcykge1xuICAgICAgbG9nLmRlYnVnKGAgICAgJyR7Y2QuZXhlY3V0YWJsZX0nICh2ZXJzaW9uICcke2NkLnZlcnNpb259JywgbWluaW11bSBDaHJvbWUgdmVyc2lvbiAnJHtjZC5taW5DaHJvbWVWZXJzaW9uID8gY2QubWluQ2hyb21lVmVyc2lvbiA6ICdVbmtub3duJ30nKWApO1xuICAgIH1cbiAgICByZXR1cm4gY2RzO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hyb21lVmVyc2lvbiAoKSB7XG4gICAgLy8gVHJ5IHRvIHJldHJpZXZlIHRoZSB2ZXJzaW9uIGZyb20gYGRldGFpbHNgIHByb3BlcnR5IGlmIGl0IGlzIHNldFxuICAgIC8vIFRoZSBgaW5mb2AgaXRlbSBtdXN0IGNvbnRhaW4gdGhlIG91dHB1dCBvZiAvanNvbi92ZXJzaW9uIENEUCBjb21tYW5kXG4gICAgLy8gd2hlcmUgYEJyb3dzZXJgIGZpZWxkIGxvb2tzIGxpa2UgYENocm9tZS83Mi4wLjM2MDEuMGBgXG4gICAgaWYgKHRoaXMuZGV0YWlscz8uaW5mbykge1xuICAgICAgbG9nLmRlYnVnKGBCcm93c2VyIHZlcnNpb24gaW4gdGhlIHN1cHBsaWVkIGRldGFpbHM6ICR7dGhpcy5kZXRhaWxzPy5pbmZvPy5Ccm93c2VyfWApO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBWRVJTSU9OX1BBVFRFUk4uZXhlYyh0aGlzLmRldGFpbHM/LmluZm8/LkJyb3dzZXIpO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uTWF0Y2hbMV0pO1xuICAgICAgaWYgKGNvZXJjZWRWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBjb2VyY2VkVmVyc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY2hyb21lVmVyc2lvbjtcblxuICAgIC8vIGluIGNhc2Ugb2YgV2ViVmlldyBCcm93c2VyIFRlc3Rlciwgc2ltcGx5IHRyeSB0byBmaW5kIHRoZSB1bmRlcmx5aW5nIHdlYnZpZXdcbiAgICBpZiAodGhpcy5idW5kbGVJZCA9PT0gV0VCVklFV19TSEVMTF9CVU5ETEVfSUQpIHtcbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgV0VCVklFV19CVU5ETEVfSURTKSB7XG4gICAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCBidW5kbGVJZCk7XG4gICAgICAgIGlmIChjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkO1xuICAgICAgICAgIHJldHVybiBzZW12ZXIuY29lcmNlKGNocm9tZVZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBvbiBBbmRyb2lkIDctOSB3ZWJ2aWV3cyBhcmUgYmFja2VkIGJ5IHRoZSBtYWluIENocm9tZSwgbm90IHRoZSBzeXN0ZW0gd2Vidmlld1xuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAgICAgaWYgKGFwaUxldmVsID49IDI0ICYmIGFwaUxldmVsIDw9IDI4ICYmXG4gICAgICAgICAgW1dFQlZJRVdfU0hFTExfQlVORExFX0lELCAuLi5XRUJWSUVXX0JVTkRMRV9JRFNdLmluY2x1ZGVzKHRoaXMuYnVuZGxlSWQpKSB7XG4gICAgICAgIHRoaXMuYnVuZGxlSWQgPSBDSFJPTUVfQlVORExFX0lEO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRyeSBvdXQgd2Vidmlld3Mgd2hlbiBubyBidW5kbGUgaWQgaXMgc2VudCBpblxuICAgIGlmICghdGhpcy5idW5kbGVJZCkge1xuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZ2VuZXJpYyBDaHJvbWUgYnVuZGxlXG4gICAgICB0aGlzLmJ1bmRsZUlkID0gQ0hST01FX0JVTkRMRV9JRDtcblxuICAgICAgLy8gd2UgaGF2ZSBhIHdlYnZpZXcgb2Ygc29tZSBzb3J0LCBzbyB0cnkgdG8gZmluZCB0aGUgYnVuZGxlIHZlcnNpb25cbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgV0VCVklFV19CVU5ETEVfSURTKSB7XG4gICAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCBidW5kbGVJZCk7XG4gICAgICAgIGlmIChjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZG8gbm90IGhhdmUgYSBjaHJvbWUgdmVyc2lvbiwgaXQgbXVzdCBub3QgYmUgYSB3ZWJ2aWV3XG4gICAgaWYgKCFjaHJvbWVWZXJzaW9uKSB7XG4gICAgICBjaHJvbWVWZXJzaW9uID0gYXdhaXQgZ2V0Q2hyb21lVmVyc2lvbih0aGlzLmFkYiwgdGhpcy5idW5kbGVJZCk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIGl0IGlzIHNlbXZlciwgc28gbGF0ZXIgY2hlY2tzIHdvbid0IGZhaWxcbiAgICByZXR1cm4gY2hyb21lVmVyc2lvbiA/IHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbikgOiBudWxsO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRHJpdmVyc01hcHBpbmcgKG5ld01hcHBpbmcpIHtcbiAgICBsZXQgc2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZyA9IHRydWU7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyh0aGlzLm1hcHBpbmdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRoaXMubWFwcGluZ1BhdGgsIEpTT04uc3RyaW5naWZ5KG5ld01hcHBpbmcsIG51bGwsIDIpLCAndXRmOCcpO1xuICAgICAgICBzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3Qgc3RvcmUgdGhlIHVwZGF0ZWQgY2hyb21lZHJpdmVycyBtYXBwaW5nIGludG8gJyR7dGhpcy5tYXBwaW5nUGF0aH0nLiBgICtcbiAgICAgICAgICBgVGhpcyBtYXkgcmVkdWNlIHRoZSBwZXJmb3JtYW5jZSBvZiBmdXJ0aGVyIGV4ZWN1dGlvbnMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFVwZGF0ZVN0YXRpY01hcHBpbmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HLCBuZXdNYXBwaW5nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyICgpIHtcbiAgICBpZiAoIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcHBpbmcgPSBhd2FpdCB0aGlzLmdldERyaXZlcnNNYXBwaW5nKCk7XG4gICAgaWYgKCFfLmlzRW1wdHkobWFwcGluZykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIG1vc3QgcmVjZW50IGtub3duIENocm9tZSB2ZXJzaW9uOiAke18udmFsdWVzKG1hcHBpbmcpWzBdfWApO1xuICAgIH1cblxuICAgIGxldCBkaWRTdG9yYWdlU3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHN5bmNDaHJvbWVkcml2ZXJzID0gYXN5bmMgKGNocm9tZVZlcnNpb24pID0+IHtcbiAgICAgIGRpZFN0b3JhZ2VTeW5jID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJldHJpZXZlZE1hcHBpbmcgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQucmV0cmlldmVNYXBwaW5nKCk7XG4gICAgICBsb2cuZGVidWcoJ0dvdCBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgZnJvbSB0aGUgc3RvcmFnZTogJyArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHJldHJpZXZlZE1hcHBpbmcsIG51bGwsIDIpKTtcbiAgICAgIGNvbnN0IGRyaXZlcktleXMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQuc3luY0RyaXZlcnMoe1xuICAgICAgICBtaW5Ccm93c2VyVmVyc2lvbjogY2hyb21lVmVyc2lvbi5tYWpvcixcbiAgICAgIH0pO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJLZXlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzeW5jaHJvbml6ZWREcml2ZXJzTWFwcGluZyA9IGRyaXZlcktleXMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgY29uc3Qge3ZlcnNpb24sIG1pbkJyb3dzZXJWZXJzaW9ufSA9IHJldHJpZXZlZE1hcHBpbmdbeF07XG4gICAgICAgIGFjY1t2ZXJzaW9uXSA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pO1xuICAgICAgT2JqZWN0LmFzc2lnbihtYXBwaW5nLCBzeW5jaHJvbml6ZWREcml2ZXJzTWFwcGluZyk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZURyaXZlcnNNYXBwaW5nKG1hcHBpbmcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGNkcyA9IGF3YWl0IHRoaXMuZ2V0Q2hyb21lZHJpdmVycyhtYXBwaW5nKTtcblxuICAgICAgY29uc3QgbWlzc2luZ1ZlcnNpb25zID0ge307XG4gICAgICBmb3IgKGNvbnN0IHt2ZXJzaW9uLCBtaW5DaHJvbWVWZXJzaW9ufSBvZiBjZHMpIHtcbiAgICAgICAgaWYgKCFtaW5DaHJvbWVWZXJzaW9uIHx8IG1hcHBpbmdbdmVyc2lvbl0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2VyY2VkVmVyID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uKTtcbiAgICAgICAgaWYgKCFjb2VyY2VkVmVyIHx8IGNvZXJjZWRWZXIubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWlzc2luZ1ZlcnNpb25zW3ZlcnNpb25dID0gbWluQ2hyb21lVmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc0VtcHR5KG1pc3NpbmdWZXJzaW9ucykpIHtcbiAgICAgICAgbG9nLmluZm8oYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ0Nocm9tZWRyaXZlcicsIF8uc2l6ZShtaXNzaW5nVmVyc2lvbnMpLCB0cnVlKX0sIGAgK1xuICAgICAgICAgIGB3aGljaCAke18uc2l6ZShtaXNzaW5nVmVyc2lvbnMpID09PSAxID8gJ2lzJyA6ICdhcmUnfSBtaXNzaW5nIGluIHRoZSBsaXN0IG9mIGtub3duIHZlcnNpb25zOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShtaXNzaW5nVmVyc2lvbnMpKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVEcml2ZXJzTWFwcGluZyhPYmplY3QuYXNzaWduKG1hcHBpbmcsIG1pc3NpbmdWZXJzaW9ucykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlQnVpbGRDaGVjaykge1xuICAgICAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IGlzIHNldCB0byAndHJ1ZSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIGxvZy53YXJuKGBDaHJvbWUgYnVpbGQgY2hlY2sgZGlzYWJsZWQuIFVzaW5nIG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uICgke3ZlcnNpb259LCBhdCAnJHtleGVjdXRhYmxlfScpYCk7XG4gICAgICAgIGxvZy53YXJuKGBJZiB0aGlzIGlzIHdyb25nLCBzZXQgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IHRvICdmYWxzZSdgKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNocm9tZVZlcnNpb24gPSBhd2FpdCB0aGlzLmdldENocm9tZVZlcnNpb24oKTtcbiAgICAgIGlmICghY2hyb21lVmVyc2lvbikge1xuICAgICAgICAvLyB1bmFibGUgdG8gZ2V0IHRoZSBjaHJvbWUgdmVyc2lvblxuICAgICAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgdGhlIGN1cnJlbnQgQ2hyb21lIHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gZGlzY292ZXIgQ2hyb21lIHZlcnNpb24uIFVzaW5nIENocm9tZWRyaXZlciAke3ZlcnNpb259IGF0ICcke2V4ZWN1dGFibGV9J2ApO1xuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgQ2hyb21lIGJ1bmRsZSAnJHt0aGlzLmJ1bmRsZUlkfScgdmVyc2lvbiAnJHtjaHJvbWVWZXJzaW9ufSdgKTtcblxuICAgICAgY29uc3QgbWF0Y2hpbmdEcml2ZXJzID0gY2RzLmZpbHRlcigoe21pbkNocm9tZVZlcnNpb259KSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbkNocm9tZVZlcnNpb25TID0gbWluQ2hyb21lVmVyc2lvbiAmJiBzZW12ZXIuY29lcmNlKG1pbkNocm9tZVZlcnNpb24pO1xuICAgICAgICBpZiAoIW1pbkNocm9tZVZlcnNpb25TKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNocm9tZVZlcnNpb24ubWFqb3IgPiBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTlxuICAgICAgICAgID8gbWluQ2hyb21lVmVyc2lvblMubWFqb3IgPT09IGNocm9tZVZlcnNpb24ubWFqb3JcbiAgICAgICAgICA6IHNlbXZlci5ndGUoY2hyb21lVmVyc2lvbiwgbWluQ2hyb21lVmVyc2lvblMpO1xuICAgICAgfSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KG1hdGNoaW5nRHJpdmVycykpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmFnZUNsaWVudCAmJiAhZGlkU3RvcmFnZVN5bmMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHN5bmNDaHJvbWVkcml2ZXJzKGNocm9tZVZlcnNpb24pKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZy53YXJuKGBDYW5ub3Qgc3luY2hyb25pemUgbG9jYWwgY2hyb21lZHJpdmVycyB3aXRoIHRoZSByZW1vdGUgc3RvcmFnZSBhdCAke0NEX0NETn06IGAgK1xuICAgICAgICAgICAgICBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdXRvZG93bmxvYWRTdWdnZXN0aW9uID1cbiAgICAgICAgICAnWW91IGNvdWxkIGFsc28gdHJ5IHRvIGVuYWJsZSBhdXRvbWF0ZWQgY2hyb21lZHJpdmVycyBkb3dubG9hZCBzZXJ2ZXIgZmVhdHVyZSc7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuIGAgK1xuICAgICAgICAgICghdGhpcy5zdG9yYWdlQ2xpZW50ID8gYCR7YXV0b2Rvd25sb2FkU3VnZ2VzdGlvbn0uIGAgOiAnJykgK1xuICAgICAgICAgIGBTZWUgJHtDSFJPTUVEUklWRVJfVFVUT1JJQUx9IGZvciBtb3JlIGRldGFpbHNgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmluUGF0aCA9IG1hdGNoaW5nRHJpdmVyc1swXS5leGVjdXRhYmxlO1xuICAgICAgbG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgbWF0Y2hpbmdEcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgICBgY2FwYWJsZSBvZiBhdXRvbWF0aW5nIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuXFxuQ2hvb3NpbmcgdGhlIG1vc3QgcmVjZW50LCAnJHtiaW5QYXRofScuYCk7XG4gICAgICBsb2cuZGVidWcoJ0lmIGEgc3BlY2lmaWMgdmVyc2lvbiBpcyByZXF1aXJlZCwgc3BlY2lmeSBpdCB3aXRoIHRoZSBgY2hyb21lZHJpdmVyRXhlY3V0YWJsZWAnICtcbiAgICAgICAgJ2Rlc2lyZWQgY2FwYWJpbGl0eS4nKTtcbiAgICAgIHJldHVybiBiaW5QYXRoO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICB9IHdoaWxlICh0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRDaHJvbWVkcml2ZXJQYXRoICgpIHtcbiAgICBpZiAodGhpcy5leGVjdXRhYmxlVmVyaWZpZWQpIHJldHVybjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyB0aGUgZXhlY3V0YWJsZSBtaWdodCBiZSBzZXQgKGlmIHBhc3NlZCBpbilcbiAgICAvLyBvciB3ZSBtaWdodCB3YW50IHRvIHVzZSB0aGUgYmFzaWMgb25lIGluc3RhbGxlZCB3aXRoIHRoaXMgZHJpdmVyXG4gICAgLy8gb3Igd2Ugd2FudCB0byBmaWd1cmUgb3V0IHRoZSBiZXN0IG9uZVxuICAgIGlmICghdGhpcy5jaHJvbWVkcml2ZXIpIHtcbiAgICAgIHRoaXMuY2hyb21lZHJpdmVyID0gdGhpcy51c2VTeXN0ZW1FeGVjdXRhYmxlXG4gICAgICAgID8gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCgpXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRDb21wYXRpYmxlQ2hyb21lZHJpdmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHModGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byB1c2UgYSBjaHJvbWVkcml2ZXIgYmluYXJ5IGF0IHRoZSBwYXRoIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY2hyb21lZHJpdmVyfSwgYnV0IGl0IGRvZXNuJ3QgZXhpc3QhYCk7XG4gICAgfVxuICAgIHRoaXMuZXhlY3V0YWJsZVZlcmlmaWVkID0gdHJ1ZTtcbiAgICBsb2cuaW5mbyhgU2V0IGNocm9tZWRyaXZlciBiaW5hcnkgYXM6ICR7dGhpcy5jaHJvbWVkcml2ZXJ9YCk7XG4gIH1cblxuICBzeW5jUHJvdG9jb2wgKGNkVmVyc2lvbiA9IG51bGwpIHtcbiAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UoY2RWZXJzaW9uKTtcbiAgICBpZiAoIWNvZXJjZWRWZXJzaW9uIHx8IGNvZXJjZWRWZXJzaW9uLm1ham9yIDwgTUlOX0NEX1ZFUlNJT05fV0lUSF9XM0NfU1VQUE9SVCkge1xuICAgICAgbG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdi4gJHtjZFZlcnNpb259IGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbC4gYCArXG4gICAgICAgIGBEZWZhdWx0aW5nIHRvICR7UFJPVE9DT0xTLk1KU09OV1B9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBnZXRDYXBWYWx1ZSh0aGlzLmNhcGFiaWxpdGllcywgJ2Nocm9tZU9wdGlvbnMnLCB7fSk7XG4gICAgaWYgKGNocm9tZU9wdGlvbnMudzNjID09PSBmYWxzZSkge1xuICAgICAgbG9nLmluZm8oYENocm9tZWRyaXZlciB2LiAke2NkVmVyc2lvbn0gc3VwcG9ydHMgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbCwgYCArXG4gICAgICAgIGBidXQgJHtQUk9UT0NPTFMuTUpTT05XUH0gb25lIGhhcyBiZWVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGVzaXJlZFByb3RvY29sID0gUFJPVE9DT0xTLlczQztcbiAgICAvLyBnaXZlbiBjYXBzIG1pZ2h0IG5vdCBiZSBwcm9wZXJseSBwcmVmaXhlZFxuICAgIC8vIHNvIHdlIHRyeSB0byBmaXggdGhlbSBpbiBvcmRlciB0byBwcm9wZXJseSBpbml0XG4gICAgLy8gdGhlIG5ldyBXM0Mgc2Vzc2lvblxuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gdG9XM2NDYXBOYW1lcyh0aGlzLmNhcGFiaWxpdGllcyk7XG4gIH1cblxuICBhc3luYyBzdGFydCAoY2FwcywgZW1pdFN0YXJ0aW5nU3RhdGUgPSB0cnVlKSB7XG4gICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChjYXBzKTtcblxuICAgIC8vIHNldCB0aGUgbG9nZ2luZyBwcmVmZXJlbmNlcyB0byBBTEwgdGhlIGNvbnNvbGUgbG9nc1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzLmxvZ2dpbmdQcmVmcyA9IF8uY2xvbmVEZWVwKGdldENhcFZhbHVlKGNhcHMsICdsb2dnaW5nUHJlZnMnLCB7fSkpO1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5jYXBhYmlsaXRpZXMubG9nZ2luZ1ByZWZzLmJyb3dzZXIpKSB7XG4gICAgICB0aGlzLmNhcGFiaWxpdGllcy5sb2dnaW5nUHJlZnMuYnJvd3NlciA9ICdBTEwnO1xuICAgIH1cblxuICAgIGlmIChlbWl0U3RhcnRpbmdTdGF0ZSkge1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RBUlRJTkcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3MgPSBbYC0tcG9ydD0ke3RoaXMucHJveHlQb3J0fWBdO1xuICAgIGlmICh0aGlzLmFkYiAmJiB0aGlzLmFkYi5hZGJQb3J0KSB7XG4gICAgICBhcmdzLnB1c2goYC0tYWRiLXBvcnQ9JHt0aGlzLmFkYi5hZGJQb3J0fWApO1xuICAgIH1cbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuY21kQXJncykpIHtcbiAgICAgIGFyZ3MucHVzaCguLi50aGlzLmNtZEFyZ3MpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dQYXRoKSB7XG4gICAgICBhcmdzLnB1c2goYC0tbG9nLXBhdGg9JHt0aGlzLmxvZ1BhdGh9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc2FibGVCdWlsZENoZWNrKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZGlzYWJsZS1idWlsZC1jaGVjaycpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tdmVyYm9zZScpO1xuICAgIC8vIHdoYXQgYXJlIHRoZSBwcm9jZXNzIHN0ZG91dC9zdGRlcnIgY29uZGl0aW9ucyB3aGVyZWluIHdlIGtub3cgdGhhdFxuICAgIC8vIHRoZSBwcm9jZXNzIGhhcyBzdGFydGVkIHRvIG91ciBzYXRpc2ZhY3Rpb24/XG4gICAgY29uc3Qgc3RhcnREZXRlY3RvciA9IChzdGRvdXQpID0+IHN0ZG91dC5zdGFydHNXaXRoKCdTdGFydGluZyAnKTtcblxuICAgIGxldCBwcm9jZXNzSXNBbGl2ZSA9IGZhbHNlO1xuICAgIGxldCB3ZWJ2aWV3VmVyc2lvbjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0Q2hyb21lZHJpdmVyUGF0aCgpO1xuICAgICAgYXdhaXQgdGhpcy5raWxsQWxsKCk7XG5cbiAgICAgIC8vIHNldCB1cCBvdXIgc3VicHJvY2VzcyBvYmplY3RcbiAgICAgIHRoaXMucHJvYyA9IG5ldyBTdWJQcm9jZXNzKHRoaXMuY2hyb21lZHJpdmVyLCBhcmdzKTtcbiAgICAgIHByb2Nlc3NJc0FsaXZlID0gdHJ1ZTtcblxuICAgICAgLy8gaGFuZGxlIGxvZyBvdXRwdXRcbiAgICAgIHRoaXMucHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIC8vIGlmIHRoZSBjZCBvdXRwdXQgaXMgbm90IHByaW50ZWQsIGZpbmQgdGhlIGNocm9tZSB2ZXJzaW9uIGFuZCBwcmludFxuICAgICAgICAvLyB3aWxsIGdldCBhIHJlc3BvbnNlIGxpa2VcbiAgICAgICAgLy8gICBEZXZUb29scyByZXNwb25zZToge1xuICAgICAgICAvLyAgICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNhbXBsZWFwcFwiLFxuICAgICAgICAvLyAgICAgIFwiQnJvd3NlclwiOiBcIkNocm9tZS81NS4wLjI4ODMuOTFcIixcbiAgICAgICAgLy8gICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjJcIixcbiAgICAgICAgLy8gICAgICBcIlVzZXItQWdlbnRcIjogXCIuLi5cIixcbiAgICAgICAgLy8gICAgICBcIldlYktpdC1WZXJzaW9uXCI6IFwiNTM3LjM2XCJcbiAgICAgICAgLy8gICB9XG4gICAgICAgIGNvbnN0IG91dCA9IHN0ZG91dCArIHN0ZGVycjtcbiAgICAgICAgbGV0IG1hdGNoID0gL1wiQnJvd3NlclwiOiBcIiguKilcIi8uZXhlYyhvdXQpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB3ZWJ2aWV3VmVyc2lvbiA9IG1hdGNoWzFdO1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgV2VidmlldyB2ZXJzaW9uOiAnJHt3ZWJ2aWV3VmVyc2lvbn0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbHNvIHByaW50IGNocm9tZWRyaXZlciB2ZXJzaW9uIHRvIGxvZ3NcbiAgICAgICAgLy8gd2lsbCBvdXRwdXQgc29tZXRoaW5nIGxpa2VcbiAgICAgICAgLy8gIFN0YXJ0aW5nIENocm9tZURyaXZlciAyLjMzLjUwNjEwNiAoOGEwNmMzOWM0NTgyZmJmYmFiNjk2NmRiYjFjMzhhOTE3M2JmYjFhMikgb24gcG9ydCA5NTE1XG4gICAgICAgIG1hdGNoID0gL1N0YXJ0aW5nIENocm9tZURyaXZlciAoWy5cXGRdKykvLmV4ZWMob3V0KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdmVyc2lvbjogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgICAgIHRoaXMuc3luY1Byb3RvY29sKG1hdGNoWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmUgdGhlIG91dHB1dCBpZiBpdCBpcyByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgKHN0ZG91dCB8fCAnJykudHJpbSgpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5sZW5ndGgpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgICBsb2cuZGVidWcoYFtTVERPVVRdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsZXQgbGluZSBvZiAoc3RkZXJyIHx8ICcnKS50cmltKCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpLmxlbmd0aCkgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICAgICAgICAgIGxvZy5lcnJvcihgW1NUREVSUl0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGhhbmRsZSBvdXQtb2YtYm91bmQgZXhpdCBieSBzaW1wbHkgZW1pdHRpbmcgYSBzdG9wcGVkIHN0YXRlXG4gICAgICB0aGlzLnByb2Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3NJc0FsaXZlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORykge1xuICAgICAgICAgIGxldCBtc2cgPSBgQ2hyb21lZHJpdmVyIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX0sIGAgK1xuICAgICAgICAgICAgICAgICAgICBgc2lnbmFsICR7c2lnbmFsfWA7XG4gICAgICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nLmluZm8oYFNwYXduaW5nIGNocm9tZWRyaXZlciB3aXRoOiAke3RoaXMuY2hyb21lZHJpdmVyfSBgICtcbiAgICAgICAgICAgICAgIGAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgLy8gc3RhcnQgc3VicHJvYyBhbmQgd2FpdCBmb3Igc3RhcnREZXRlY3RvclxuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0YXJ0KHN0YXJ0RGV0ZWN0b3IpO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yT25saW5lKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0U2Vzc2lvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgIHRoaXMuZW1pdChDaHJvbWVkcml2ZXIuRVZFTlRfRVJST1IsIGUpO1xuICAgICAgLy8ganVzdCBiZWNhdXNlIHdlIGhhZCBhbiBlcnJvciBkb2Vzbid0IG1lYW4gdGhlIGNocm9tZWRyaXZlciBwcm9jZXNzXG4gICAgICAvLyBmaW5pc2hlZDsgd2Ugc2hvdWxkIGNsZWFuIHVwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHByb2Nlc3NJc0FsaXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICAvLyBvZnRlbiB0aGUgdXNlcidzIENocm9tZSB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgQ2hyb21lZHJpdmVyXG4gICAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKCdDaHJvbWUgdmVyc2lvbiBtdXN0IGJlJykpIHtcbiAgICAgICAgbWVzc2FnZSArPSAnVW5hYmxlIHRvIGF1dG9tYXRlIENocm9tZSB2ZXJzaW9uIGJlY2F1c2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YgQ2hyb21lZHJpdmVyLlxcbic7XG4gICAgICAgIGlmICh3ZWJ2aWV3VmVyc2lvbikge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYENocm9tZSB2ZXJzaW9uIG9uIHRoZSBkZXZpY2U6ICR7d2Vidmlld1ZlcnNpb259XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyID0gL0Nocm9tZSB2ZXJzaW9uIG11c3QgYmUgKC4rKS8uZXhlYyhlLm1lc3NhZ2UpPy5bMV0gfHwgJyc7XG4gICAgICAgIGlmICh2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgQ2hyb21lZHJpdmVyIHN1cHBvcnRzIENocm9tZSB2ZXJzaW9uKHMpOiAke3ZlcnNpb25zU3VwcG9ydGVkQnlEcml2ZXJ9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlICs9IGBWaXNpdCAnJHtDSFJPTUVEUklWRVJfVFVUT1JJQUx9JyB0byB0cm91Ymxlc2hvb3QgdGhlIHByb2JsZW0uXFxuYDtcbiAgICAgIH1cblxuICAgICAgbWVzc2FnZSArPSBlLm1lc3NhZ2U7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBzZXNzaW9uSWQgKCkge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3Byb3h5LnNlc3Npb25JZDtcbiAgfVxuXG4gIGFzeW5jIHJlc3RhcnQgKCkge1xuICAgIGxvZy5pbmZvKCdSZXN0YXJ0aW5nIGNocm9tZWRyaXZlcicpO1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXN0YXJ0IHdoZW4gd2UncmUgbm90IG9ubGluZVwiKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORyk7XG4gICAgYXdhaXQgdGhpcy5zdG9wKGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KHRoaXMuY2FwYWJpbGl0aWVzLCBmYWxzZSk7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yT25saW5lICgpIHtcbiAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IENEIGhhc24ndCBjcmFzaGVkXG4gICAgbGV0IGNocm9tZWRyaXZlclN0b3BwZWQgPSBmYWxzZTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKDIwLCAyMDAsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICAvLyB3ZSBhcmUgZWl0aGVyIHN0b3BwZWQgb3Igc3RvcHBpbmcsIHNvIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICAgIGNocm9tZWRyaXZlclN0b3BwZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH0pO1xuICAgIGlmIChjaHJvbWVkcml2ZXJTdG9wcGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nocm9tZURyaXZlciBjcmFzaGVkIGR1cmluZyBzdGFydHVwLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uICgpIHtcbiAgICBjb25zdCBzZXNzaW9uQ2FwcyA9IHRoaXMuZGVzaXJlZFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDXG4gICAgICA/IHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogdGhpcy5jYXBhYmlsaXRpZXN9fVxuICAgICAgOiB7ZGVzaXJlZENhcGFiaWxpdGllczogdGhpcy5jYXBhYmlsaXRpZXN9O1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyAke3RoaXMuZGVzaXJlZFByb3RvY29sfSBDaHJvbWVkcml2ZXIgc2Vzc2lvbiB3aXRoIGNhcGFiaWxpdGllczogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShzZXNzaW9uQ2FwcywgbnVsbCwgMikpO1xuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywgc2Vzc2lvbkNhcHMpO1xuICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX09OTElORSk7XG4gIH1cblxuICBhc3luYyBzdG9wIChlbWl0U3RhdGVzID0gdHJ1ZSkge1xuICAgIGlmIChlbWl0U3RhdGVzKSB7XG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVE9QUElORyk7XG4gICAgfVxuICAgIGNvbnN0IHJ1blNhZmVTdGVwID0gYXN5bmMgKGYpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IHJ1blNhZmVTdGVwKCgpID0+IHRoaXMuandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJykpO1xuICAgIGF3YWl0IHJ1blNhZmVTdGVwKCgpID0+IHRoaXMucHJvYy5zdG9wKCdTSUdURVJNJywgMjAwMDApKTtcbiAgICBpZiAoZW1pdFN0YXRlcykge1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU3RhdGUgKHN0YXRlKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIGxvZy5kZWJ1ZyhgQ2hhbmdlZCBzdGF0ZSB0byAnJHtzdGF0ZX0nYCk7XG4gICAgdGhpcy5lbWl0KENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCB7c3RhdGV9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCh1cmwsIG1ldGhvZCwgYm9keSk7XG4gIH1cblxuICBhc3luYyBwcm94eVJlcSAocmVxLCByZXMpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzKHJlcSwgcmVzKTtcbiAgfVxuXG4gIGFzeW5jIGtpbGxBbGwgKCkge1xuICAgIGxldCBjbWQgPSBzeXN0ZW0uaXNXaW5kb3dzKClcbiAgICAgID8gYHdtaWMgcHJvY2VzcyB3aGVyZSBcImNvbW1hbmRsaW5lIGxpa2UgJyVjaHJvbWVkcml2ZXIuZXhlJS0tcG9ydD0ke3RoaXMucHJveHlQb3J0fSUnXCIgZGVsZXRlYFxuICAgICAgOiBgcGtpbGwgLTE1IC1mIFwiJHt0aGlzLmNocm9tZWRyaXZlcn0uKi0tcG9ydD0ke3RoaXMucHJveHlQb3J0fVwiYDtcbiAgICBsb2cuZGVidWcoYEtpbGxpbmcgYW55IG9sZCBjaHJvbWVkcml2ZXJzLCBydW5uaW5nOiAke2NtZH1gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgKEIucHJvbWlzaWZ5KGNwLmV4ZWMpKShjbWQpO1xuICAgICAgbG9nLmRlYnVnKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCB1cCBvbGQgY2hyb21lZHJpdmVycycpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oJ05vIG9sZCBjaHJvbWVkcml2ZXJzIHNlZW0gdG8gZXhpc3QnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hZGIpIHtcbiAgICAgIGNvbnN0IHVkaWRJbmRleCA9IHRoaXMuYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSAnLXMnKTtcbiAgICAgIGNvbnN0IHVkaWQgPSB1ZGlkSW5kZXggPiAtMSA/IHRoaXMuYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NbdWRpZEluZGV4ICsgMV0gOiBudWxsO1xuXG4gICAgICBpZiAodWRpZCkge1xuICAgICAgICBsb2cuZGVidWcoYENsZWFuaW5nIHRoaXMgZGV2aWNlJ3MgYWRiIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uczogJHt1ZGlkfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKGBDbGVhbmluZyBhbnkgb2xkIGFkYiBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbnNgKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChsZXQgY29ubiBvZiBhd2FpdCB0aGlzLmFkYi5nZXRGb3J3YXJkTGlzdCgpKSB7XG4gICAgICAgICAgLy8gY2hyb21lZHJpdmVyIHdpbGwgYXNrIEFEQiB0byBmb3J3YXJkIGEgcG9ydCBsaWtlIFwiZGV2aWNlSWQgdGNwOnBvcnQgbG9jYWxhYnN0cmFjdDp3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV9wb3J0XCJcbiAgICAgICAgICBpZiAoIShjb25uLmluY2x1ZGVzKCd3ZWJ2aWV3X2RldnRvb2xzJykgJiYgKCF1ZGlkIHx8IGNvbm4uaW5jbHVkZXModWRpZCkpKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHBhcmFtcyA9IGNvbm4uc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHBhcmFtc1sxXS5yZXBsYWNlKC9bXFxEXSovLCAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gY2xlYW4gZm9yd2FyZGVkIHBvcnRzLiBFcnJvcjogJyR7ZXJyLm1lc3NhZ2V9Jy4gQ29udGludWluZy5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBoYXNXb3JraW5nV2VidmlldyAoKSB7XG4gICAgLy8gc29tZXRpbWVzIGNocm9tZWRyaXZlciBzdG9wcyBhdXRvbWF0aW5nIHdlYnZpZXdzLiB0aGlzIG1ldGhvZCBydW5zIGFcbiAgICAvLyBzaW1wbGUgY29tbWFuZCB0byBkZXRlcm1pbmUgb3VyIHN0YXRlLCBhbmQgcmVzcG9uZHMgYWNjb3JkaW5nbHlcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy91cmwnLCAnR0VUJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbkNocm9tZWRyaXZlci5FVkVOVF9FUlJPUiA9ICdjaHJvbWVkcml2ZXJfZXJyb3InO1xuQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQgPSAnc3RhdGVDaGFuZ2VkJztcbkNocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEID0gJ3N0b3BwZWQnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUQVJUSU5HID0gJ3N0YXJ0aW5nJztcbkNocm9tZWRyaXZlci5TVEFURV9PTkxJTkUgPSAnb25saW5lJztcbkNocm9tZWRyaXZlci5TVEFURV9TVE9QUElORyA9ICdzdG9wcGluZyc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORyA9ICdyZXN0YXJ0aW5nJztcblxuZXhwb3J0IHsgQ2hyb21lZHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBDaHJvbWVkcml2ZXI7XG4iXSwiZmlsZSI6ImxpYi9jaHJvbWVkcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -10,7 +10,7 @@ exports.install = install;
10
10
 
11
11
  require("source-map-support/register");
12
12
 
13
- var _appiumSupport = require("appium-support");
13
+ var _support = require("@appium/support");
14
14
 
15
15
  var _storageClient = _interopRequireDefault(require("./storage-client"));
16
16
 
@@ -31,8 +31,8 @@ async function formatCdVersion(ver) {
31
31
  async function prepareChromedriverDir(platformName) {
32
32
  const chromedriverDir = (0, _utils.getChromedriverDir)(platformName);
33
33
 
34
- if (!(await _appiumSupport.fs.exists(chromedriverDir))) {
35
- await (0, _appiumSupport.mkdirp)(chromedriverDir);
34
+ if (!(await _support.fs.exists(chromedriverDir))) {
35
+ await (0, _support.mkdirp)(chromedriverDir);
36
36
  }
37
37
 
38
38
  return chromedriverDir;
@@ -54,4 +54,4 @@ async function doInstall() {
54
54
  }require('source-map-support').install();
55
55
 
56
56
 
57
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbnN0YWxsLmpzIl0sIm5hbWVzIjpbIkRPV05MT0FEX1RJTUVPVVRfTVMiLCJMQVRFU1RfVkVSU0lPTiIsImZvcm1hdENkVmVyc2lvbiIsInZlciIsIkNEX0NETiIsImFjY2VwdCIsInRpbWVvdXQiLCJ0cmltIiwicHJlcGFyZUNocm9tZWRyaXZlckRpciIsInBsYXRmb3JtTmFtZSIsImNocm9tZWRyaXZlckRpciIsImZzIiwiZXhpc3RzIiwiaW5zdGFsbCIsIm9zSW5mbyIsImNsaWVudCIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJuYW1lIiwic3luY0RyaXZlcnMiLCJ2ZXJzaW9ucyIsIkNEX1ZFUiIsImRvSW5zdGFsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBS0EsTUFBTUEsbUJBQW1CLEdBQUcsS0FBSyxJQUFqQztBQUNBLE1BQU1DLGNBQWMsR0FBRyxRQUF2Qjs7QUFFQSxlQUFlQyxlQUFmLENBQWdDQyxHQUFoQyxFQUFxQztBQUNuQyxTQUFPQSxHQUFHLEtBQUtGLGNBQVIsR0FDSCxDQUFDLE1BQU0seUJBQWMsR0FBRUcsYUFBTyxpQkFBdkIsRUFBeUM7QUFDaEQsa0JBQWMsUUFEa0M7QUFFaERDLElBQUFBLE1BQU0sRUFBRTtBQUZ3QyxHQUF6QyxFQUdOO0FBQUVDLElBQUFBLE9BQU8sRUFBRU47QUFBWCxHQUhNLENBQVAsRUFHb0NPLElBSHBDLEVBREcsR0FLSEosR0FMSjtBQU1EOztBQUVELGVBQWVLLHNCQUFmLENBQXVDQyxZQUF2QyxFQUFxRDtBQUNuRCxRQUFNQyxlQUFlLEdBQUcsK0JBQW1CRCxZQUFuQixDQUF4Qjs7QUFDQSxNQUFJLEVBQUMsTUFBTUUsa0JBQUdDLE1BQUgsQ0FBVUYsZUFBVixDQUFQLENBQUosRUFBdUM7QUFDckMsVUFBTSwyQkFBT0EsZUFBUCxDQUFOO0FBQ0Q7O0FBQ0QsU0FBT0EsZUFBUDtBQUNEOztBQUVELGVBQWVHLE9BQWYsR0FBMEI7QUFDeEIsUUFBTUMsTUFBTSxHQUFHLE1BQU0sdUJBQXJCO0FBQ0EsUUFBTUMsTUFBTSxHQUFHLElBQUlDLHNCQUFKLENBQThCO0FBQzNDTixJQUFBQSxlQUFlLEVBQUUsTUFBTUYsc0JBQXNCLENBQUNNLE1BQU0sQ0FBQ0csSUFBUjtBQURGLEdBQTlCLENBQWY7QUFHQSxRQUFNRixNQUFNLENBQUNHLFdBQVAsQ0FBbUI7QUFDdkJKLElBQUFBLE1BRHVCO0FBRXZCSyxJQUFBQSxRQUFRLEVBQUUsQ0FBQyxNQUFNakIsZUFBZSxDQUFDa0IsYUFBRCxDQUF0QjtBQUZhLEdBQW5CLENBQU47QUFJRDs7QUFFRCxlQUFlQyxTQUFmLEdBQTRCO0FBQzFCLFFBQU1SLE9BQU8sRUFBYjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMsIG1rZGlycCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgQ0RfQ0ROLCBDRF9WRVIsIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBnZXRDaHJvbWVkcml2ZXJEaXIsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5cbmNvbnN0IERPV05MT0FEX1RJTUVPVVRfTVMgPSAxNSAqIDEwMDA7XG5jb25zdCBMQVRFU1RfVkVSU0lPTiA9ICdMQVRFU1QnO1xuXG5hc3luYyBmdW5jdGlvbiBmb3JtYXRDZFZlcnNpb24gKHZlcikge1xuICByZXR1cm4gdmVyID09PSBMQVRFU1RfVkVSU0lPTlxuICAgID8gKGF3YWl0IHJldHJpZXZlRGF0YShgJHtDRF9DRE59L0xBVEVTVF9SRUxFQVNFYCwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJyovKicsXG4gICAgfSwgeyB0aW1lb3V0OiBET1dOTE9BRF9USU1FT1VUX01TIH0pKS50cmltKClcbiAgICA6IHZlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNocm9tZWRyaXZlckRpciAocGxhdGZvcm1OYW1lKSB7XG4gIGNvbnN0IGNocm9tZWRyaXZlckRpciA9IGdldENocm9tZWRyaXZlckRpcihwbGF0Zm9ybU5hbWUpO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhjaHJvbWVkcml2ZXJEaXIpKSB7XG4gICAgYXdhaXQgbWtkaXJwKGNocm9tZWRyaXZlckRpcik7XG4gIH1cbiAgcmV0dXJuIGNocm9tZWRyaXZlckRpcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbCAoKSB7XG4gIGNvbnN0IG9zSW5mbyA9IGF3YWl0IGdldE9zSW5mbygpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCh7XG4gICAgY2hyb21lZHJpdmVyRGlyOiBhd2FpdCBwcmVwYXJlQ2hyb21lZHJpdmVyRGlyKG9zSW5mby5uYW1lKSxcbiAgfSk7XG4gIGF3YWl0IGNsaWVudC5zeW5jRHJpdmVycyh7XG4gICAgb3NJbmZvLFxuICAgIHZlcnNpb25zOiBbYXdhaXQgZm9ybWF0Q2RWZXJzaW9uKENEX1ZFUildLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9JbnN0YWxsICgpIHtcbiAgYXdhaXQgaW5zdGFsbCgpO1xufVxuXG5leHBvcnQgeyBpbnN0YWxsLCBkb0luc3RhbGwgfTtcbiJdLCJmaWxlIjoibGliL2luc3RhbGwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
57
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbnN0YWxsLmpzIl0sIm5hbWVzIjpbIkRPV05MT0FEX1RJTUVPVVRfTVMiLCJMQVRFU1RfVkVSU0lPTiIsImZvcm1hdENkVmVyc2lvbiIsInZlciIsIkNEX0NETiIsImFjY2VwdCIsInRpbWVvdXQiLCJ0cmltIiwicHJlcGFyZUNocm9tZWRyaXZlckRpciIsInBsYXRmb3JtTmFtZSIsImNocm9tZWRyaXZlckRpciIsImZzIiwiZXhpc3RzIiwiaW5zdGFsbCIsIm9zSW5mbyIsImNsaWVudCIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJuYW1lIiwic3luY0RyaXZlcnMiLCJ2ZXJzaW9ucyIsIkNEX1ZFUiIsImRvSW5zdGFsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBS0EsTUFBTUEsbUJBQW1CLEdBQUcsS0FBSyxJQUFqQztBQUNBLE1BQU1DLGNBQWMsR0FBRyxRQUF2Qjs7QUFFQSxlQUFlQyxlQUFmLENBQWdDQyxHQUFoQyxFQUFxQztBQUNuQyxTQUFPQSxHQUFHLEtBQUtGLGNBQVIsR0FDSCxDQUFDLE1BQU0seUJBQWMsR0FBRUcsYUFBTyxpQkFBdkIsRUFBeUM7QUFDaEQsa0JBQWMsUUFEa0M7QUFFaERDLElBQUFBLE1BQU0sRUFBRTtBQUZ3QyxHQUF6QyxFQUdOO0FBQUVDLElBQUFBLE9BQU8sRUFBRU47QUFBWCxHQUhNLENBQVAsRUFHb0NPLElBSHBDLEVBREcsR0FLSEosR0FMSjtBQU1EOztBQUVELGVBQWVLLHNCQUFmLENBQXVDQyxZQUF2QyxFQUFxRDtBQUNuRCxRQUFNQyxlQUFlLEdBQUcsK0JBQW1CRCxZQUFuQixDQUF4Qjs7QUFDQSxNQUFJLEVBQUMsTUFBTUUsWUFBR0MsTUFBSCxDQUFVRixlQUFWLENBQVAsQ0FBSixFQUF1QztBQUNyQyxVQUFNLHFCQUFPQSxlQUFQLENBQU47QUFDRDs7QUFDRCxTQUFPQSxlQUFQO0FBQ0Q7O0FBRUQsZUFBZUcsT0FBZixHQUEwQjtBQUN4QixRQUFNQyxNQUFNLEdBQUcsTUFBTSx1QkFBckI7QUFDQSxRQUFNQyxNQUFNLEdBQUcsSUFBSUMsc0JBQUosQ0FBOEI7QUFDM0NOLElBQUFBLGVBQWUsRUFBRSxNQUFNRixzQkFBc0IsQ0FBQ00sTUFBTSxDQUFDRyxJQUFSO0FBREYsR0FBOUIsQ0FBZjtBQUdBLFFBQU1GLE1BQU0sQ0FBQ0csV0FBUCxDQUFtQjtBQUN2QkosSUFBQUEsTUFEdUI7QUFFdkJLLElBQUFBLFFBQVEsRUFBRSxDQUFDLE1BQU1qQixlQUFlLENBQUNrQixhQUFELENBQXRCO0FBRmEsR0FBbkIsQ0FBTjtBQUlEOztBQUVELGVBQWVDLFNBQWYsR0FBNEI7QUFDMUIsUUFBTVIsT0FBTyxFQUFiO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgQ0RfQ0ROLCBDRF9WRVIsIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBnZXRDaHJvbWVkcml2ZXJEaXIsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5cbmNvbnN0IERPV05MT0FEX1RJTUVPVVRfTVMgPSAxNSAqIDEwMDA7XG5jb25zdCBMQVRFU1RfVkVSU0lPTiA9ICdMQVRFU1QnO1xuXG5hc3luYyBmdW5jdGlvbiBmb3JtYXRDZFZlcnNpb24gKHZlcikge1xuICByZXR1cm4gdmVyID09PSBMQVRFU1RfVkVSU0lPTlxuICAgID8gKGF3YWl0IHJldHJpZXZlRGF0YShgJHtDRF9DRE59L0xBVEVTVF9SRUxFQVNFYCwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJyovKicsXG4gICAgfSwgeyB0aW1lb3V0OiBET1dOTE9BRF9USU1FT1VUX01TIH0pKS50cmltKClcbiAgICA6IHZlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNocm9tZWRyaXZlckRpciAocGxhdGZvcm1OYW1lKSB7XG4gIGNvbnN0IGNocm9tZWRyaXZlckRpciA9IGdldENocm9tZWRyaXZlckRpcihwbGF0Zm9ybU5hbWUpO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhjaHJvbWVkcml2ZXJEaXIpKSB7XG4gICAgYXdhaXQgbWtkaXJwKGNocm9tZWRyaXZlckRpcik7XG4gIH1cbiAgcmV0dXJuIGNocm9tZWRyaXZlckRpcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbCAoKSB7XG4gIGNvbnN0IG9zSW5mbyA9IGF3YWl0IGdldE9zSW5mbygpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCh7XG4gICAgY2hyb21lZHJpdmVyRGlyOiBhd2FpdCBwcmVwYXJlQ2hyb21lZHJpdmVyRGlyKG9zSW5mby5uYW1lKSxcbiAgfSk7XG4gIGF3YWl0IGNsaWVudC5zeW5jRHJpdmVycyh7XG4gICAgb3NJbmZvLFxuICAgIHZlcnNpb25zOiBbYXdhaXQgZm9ybWF0Q2RWZXJzaW9uKENEX1ZFUildLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9JbnN0YWxsICgpIHtcbiAgYXdhaXQgaW5zdGFsbCgpO1xufVxuXG5leHBvcnQgeyBpbnN0YWxsLCBkb0luc3RhbGwgfTtcbiJdLCJmaWxlIjoibGliL2luc3RhbGwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -12,12 +12,12 @@ require("source-map-support/register");
12
12
 
13
13
  var _lodash = _interopRequireDefault(require("lodash"));
14
14
 
15
- var _appiumBaseDriver = require("appium-base-driver");
15
+ var _baseDriver = require("@appium/base-driver");
16
16
 
17
17
  const W3C_PREFIX = 'goog:';
18
18
 
19
19
  function toW3cCapName(capName) {
20
- return _lodash.default.isString(capName) && !capName.includes(':') && !(0, _appiumBaseDriver.isStandardCap)(capName) ? `${W3C_PREFIX}${capName}` : capName;
20
+ return _lodash.default.isString(capName) && !capName.includes(':') && !(0, _baseDriver.isStandardCap)(capName) ? `${W3C_PREFIX}${capName}` : capName;
21
21
  }
22
22
 
23
23
  function getCapValue(allCaps = {}, rawCapName, defaultValue) {
@@ -38,4 +38,4 @@ function toW3cCapNames(originalCaps = {}) {
38
38
  }require('source-map-support').install();
39
39
 
40
40
 
41
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbIlczQ19QUkVGSVgiLCJ0b1czY0NhcE5hbWUiLCJjYXBOYW1lIiwiXyIsImlzU3RyaW5nIiwiaW5jbHVkZXMiLCJnZXRDYXBWYWx1ZSIsImFsbENhcHMiLCJyYXdDYXBOYW1lIiwiZGVmYXVsdFZhbHVlIiwiY2FwVmFsdWUiLCJ0b1BhaXJzIiwidG9XM2NDYXBOYW1lcyIsIm9yaWdpbmFsQ2FwcyIsInJlZHVjZSIsImFjYyIsInZhbHVlIiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsT0FBbkI7O0FBRUEsU0FBU0MsWUFBVCxDQUF1QkMsT0FBdkIsRUFBZ0M7QUFDOUIsU0FBUUMsZ0JBQUVDLFFBQUYsQ0FBV0YsT0FBWCxLQUF1QixDQUFDQSxPQUFPLENBQUNHLFFBQVIsQ0FBaUIsR0FBakIsQ0FBeEIsSUFBaUQsQ0FBQyxxQ0FBY0gsT0FBZCxDQUFuRCxHQUNGLEdBQUVGLFVBQVcsR0FBRUUsT0FBUSxFQURyQixHQUVIQSxPQUZKO0FBR0Q7O0FBRUQsU0FBU0ksV0FBVCxDQUFzQkMsT0FBTyxHQUFHLEVBQWhDLEVBQW9DQyxVQUFwQyxFQUFnREMsWUFBaEQsRUFBOEQ7QUFDNUQsT0FBSyxNQUFNLENBQUNQLE9BQUQsRUFBVVEsUUFBVixDQUFYLElBQWtDUCxnQkFBRVEsT0FBRixDQUFVSixPQUFWLENBQWxDLEVBQXNEO0FBQ3BELFFBQUlOLFlBQVksQ0FBQ0MsT0FBRCxDQUFaLEtBQTBCRCxZQUFZLENBQUNPLFVBQUQsQ0FBMUMsRUFBd0Q7QUFDdEQsYUFBT0UsUUFBUDtBQUNEO0FBQ0Y7O0FBQ0QsU0FBT0QsWUFBUDtBQUNEOztBQUVELFNBQVNHLGFBQVQsQ0FBd0JDLFlBQVksR0FBRyxFQUF2QyxFQUEyQztBQUN6QyxTQUFPVixnQkFBRVcsTUFBRixDQUFTRCxZQUFULEVBQXVCLENBQUNFLEdBQUQsRUFBTUMsS0FBTixFQUFhQyxHQUFiLEtBQXFCO0FBQ2pERixJQUFBQSxHQUFHLENBQUNkLFlBQVksQ0FBQ2dCLEdBQUQsQ0FBYixDQUFILEdBQXlCRCxLQUF6QjtBQUNBLFdBQU9ELEdBQVA7QUFDRCxHQUhNLEVBR0osRUFISSxDQUFQO0FBSUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgaXNTdGFuZGFyZENhcCB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5cbmNvbnN0IFczQ19QUkVGSVggPSAnZ29vZzonO1xuXG5mdW5jdGlvbiB0b1czY0NhcE5hbWUgKGNhcE5hbWUpIHtcbiAgcmV0dXJuIChfLmlzU3RyaW5nKGNhcE5hbWUpICYmICFjYXBOYW1lLmluY2x1ZGVzKCc6JykgJiYgIWlzU3RhbmRhcmRDYXAoY2FwTmFtZSkpXG4gICAgPyBgJHtXM0NfUFJFRklYfSR7Y2FwTmFtZX1gXG4gICAgOiBjYXBOYW1lO1xufVxuXG5mdW5jdGlvbiBnZXRDYXBWYWx1ZSAoYWxsQ2FwcyA9IHt9LCByYXdDYXBOYW1lLCBkZWZhdWx0VmFsdWUpIHtcbiAgZm9yIChjb25zdCBbY2FwTmFtZSwgY2FwVmFsdWVdIG9mIF8udG9QYWlycyhhbGxDYXBzKSkge1xuICAgIGlmICh0b1czY0NhcE5hbWUoY2FwTmFtZSkgPT09IHRvVzNjQ2FwTmFtZShyYXdDYXBOYW1lKSkge1xuICAgICAgcmV0dXJuIGNhcFZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdFZhbHVlO1xufVxuXG5mdW5jdGlvbiB0b1czY0NhcE5hbWVzIChvcmlnaW5hbENhcHMgPSB7fSkge1xuICByZXR1cm4gXy5yZWR1Y2Uob3JpZ2luYWxDYXBzLCAoYWNjLCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgYWNjW3RvVzNjQ2FwTmFtZShrZXkpXSA9IHZhbHVlO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IHsgdG9XM2NDYXBOYW1lcywgZ2V0Q2FwVmFsdWUgfTtcbiJdLCJmaWxlIjoibGliL3Byb3RvY29sLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
41
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbIlczQ19QUkVGSVgiLCJ0b1czY0NhcE5hbWUiLCJjYXBOYW1lIiwiXyIsImlzU3RyaW5nIiwiaW5jbHVkZXMiLCJnZXRDYXBWYWx1ZSIsImFsbENhcHMiLCJyYXdDYXBOYW1lIiwiZGVmYXVsdFZhbHVlIiwiY2FwVmFsdWUiLCJ0b1BhaXJzIiwidG9XM2NDYXBOYW1lcyIsIm9yaWdpbmFsQ2FwcyIsInJlZHVjZSIsImFjYyIsInZhbHVlIiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsT0FBbkI7O0FBRUEsU0FBU0MsWUFBVCxDQUF1QkMsT0FBdkIsRUFBZ0M7QUFDOUIsU0FBUUMsZ0JBQUVDLFFBQUYsQ0FBV0YsT0FBWCxLQUF1QixDQUFDQSxPQUFPLENBQUNHLFFBQVIsQ0FBaUIsR0FBakIsQ0FBeEIsSUFBaUQsQ0FBQywrQkFBY0gsT0FBZCxDQUFuRCxHQUNGLEdBQUVGLFVBQVcsR0FBRUUsT0FBUSxFQURyQixHQUVIQSxPQUZKO0FBR0Q7O0FBRUQsU0FBU0ksV0FBVCxDQUFzQkMsT0FBTyxHQUFHLEVBQWhDLEVBQW9DQyxVQUFwQyxFQUFnREMsWUFBaEQsRUFBOEQ7QUFDNUQsT0FBSyxNQUFNLENBQUNQLE9BQUQsRUFBVVEsUUFBVixDQUFYLElBQWtDUCxnQkFBRVEsT0FBRixDQUFVSixPQUFWLENBQWxDLEVBQXNEO0FBQ3BELFFBQUlOLFlBQVksQ0FBQ0MsT0FBRCxDQUFaLEtBQTBCRCxZQUFZLENBQUNPLFVBQUQsQ0FBMUMsRUFBd0Q7QUFDdEQsYUFBT0UsUUFBUDtBQUNEO0FBQ0Y7O0FBQ0QsU0FBT0QsWUFBUDtBQUNEOztBQUVELFNBQVNHLGFBQVQsQ0FBd0JDLFlBQVksR0FBRyxFQUF2QyxFQUEyQztBQUN6QyxTQUFPVixnQkFBRVcsTUFBRixDQUFTRCxZQUFULEVBQXVCLENBQUNFLEdBQUQsRUFBTUMsS0FBTixFQUFhQyxHQUFiLEtBQXFCO0FBQ2pERixJQUFBQSxHQUFHLENBQUNkLFlBQVksQ0FBQ2dCLEdBQUQsQ0FBYixDQUFILEdBQXlCRCxLQUF6QjtBQUNBLFdBQU9ELEdBQVA7QUFDRCxHQUhNLEVBR0osRUFISSxDQUFQO0FBSUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgaXNTdGFuZGFyZENhcCB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuXG5jb25zdCBXM0NfUFJFRklYID0gJ2dvb2c6JztcblxuZnVuY3Rpb24gdG9XM2NDYXBOYW1lIChjYXBOYW1lKSB7XG4gIHJldHVybiAoXy5pc1N0cmluZyhjYXBOYW1lKSAmJiAhY2FwTmFtZS5pbmNsdWRlcygnOicpICYmICFpc1N0YW5kYXJkQ2FwKGNhcE5hbWUpKVxuICAgID8gYCR7VzNDX1BSRUZJWH0ke2NhcE5hbWV9YFxuICAgIDogY2FwTmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2FwVmFsdWUgKGFsbENhcHMgPSB7fSwgcmF3Q2FwTmFtZSwgZGVmYXVsdFZhbHVlKSB7XG4gIGZvciAoY29uc3QgW2NhcE5hbWUsIGNhcFZhbHVlXSBvZiBfLnRvUGFpcnMoYWxsQ2FwcykpIHtcbiAgICBpZiAodG9XM2NDYXBOYW1lKGNhcE5hbWUpID09PSB0b1czY0NhcE5hbWUocmF3Q2FwTmFtZSkpIHtcbiAgICAgIHJldHVybiBjYXBWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdG9XM2NDYXBOYW1lcyAob3JpZ2luYWxDYXBzID0ge30pIHtcbiAgcmV0dXJuIF8ucmVkdWNlKG9yaWdpbmFsQ2FwcywgKGFjYywgdmFsdWUsIGtleSkgPT4ge1xuICAgIGFjY1t0b1czY0NhcE5hbWUoa2V5KV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5cbmV4cG9ydCB7IHRvVzNjQ2FwTmFtZXMsIGdldENhcFZhbHVlIH07XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -21,15 +21,15 @@ var _bluebird = _interopRequireDefault(require("bluebird"));
21
21
 
22
22
  var _path = _interopRequireDefault(require("path"));
23
23
 
24
- var _appiumSupport = require("appium-support");
24
+ var _support = require("@appium/support");
25
25
 
26
26
  const TIMEOUT_MS = 15000;
27
27
  const MAX_PARALLEL_DOWNLOADS = 5;
28
28
 
29
- const log = _appiumSupport.logger.getLogger('ChromedriverStorageClient');
29
+ const log = _support.logger.getLogger('ChromedriverStorageClient');
30
30
 
31
31
  async function isCrcOk(src, checksum) {
32
- const md5 = await _appiumSupport.fs.hash(src, 'md5');
32
+ const md5 = await _support.fs.hash(src, 'md5');
33
33
  return _lodash.default.toLower(md5) === _lodash.default.toLower(checksum);
34
34
  }
35
35
 
@@ -70,7 +70,7 @@ function findChildNode(parent, childName = null, text = null) {
70
70
  }
71
71
 
72
72
  function extractNodeText(node) {
73
- return !node || !node.firstChild || !_appiumSupport.util.hasValue(node.firstChild.nodeValue) ? null : node.firstChild.nodeValue;
73
+ return !node || !node.firstChild || !_support.util.hasValue(node.firstChild.nodeValue) ? null : node.firstChild.nodeValue;
74
74
  }
75
75
 
76
76
  class ChromedriverStorageClient {
@@ -190,22 +190,22 @@ class ChromedriverStorageClient {
190
190
  }
191
191
 
192
192
  async unzipDriver(src, dst) {
193
- const tmpRoot = await _appiumSupport.tempDir.openDir();
193
+ const tmpRoot = await _support.tempDir.openDir();
194
194
 
195
195
  try {
196
- await _appiumSupport.zip.extractAllTo(src, tmpRoot);
197
- const chromedriverPath = await _appiumSupport.fs.walkDir(tmpRoot, true, (itemPath, isDirectory) => !isDirectory && _lodash.default.toLower(_path.default.parse(itemPath).name) === 'chromedriver');
196
+ await _support.zip.extractAllTo(src, tmpRoot);
197
+ const chromedriverPath = await _support.fs.walkDir(tmpRoot, true, (itemPath, isDirectory) => !isDirectory && _lodash.default.toLower(_path.default.parse(itemPath).name) === 'chromedriver');
198
198
 
199
199
  if (!chromedriverPath) {
200
200
  throw new Error('The archive was unzipped properly, but we could not find any chromedriver executable');
201
201
  }
202
202
 
203
203
  log.debug(`Moving the extracted '${_path.default.basename(chromedriverPath)}' to '${dst}'`);
204
- await _appiumSupport.fs.mv(chromedriverPath, dst, {
204
+ await _support.fs.mv(chromedriverPath, dst, {
205
205
  mkdirp: true
206
206
  });
207
207
  } finally {
208
- await _appiumSupport.fs.rimraf(tmpRoot);
208
+ await _support.fs.rimraf(tmpRoot);
209
209
  }
210
210
  }
211
211
 
@@ -220,7 +220,7 @@ class ChromedriverStorageClient {
220
220
  if (!_lodash.default.isEmpty(versions)) {
221
221
  log.debug(`Selecting chromedrivers whose versions match to ${versions}`);
222
222
  driversToSync = driversToSync.filter(cdName => versions.includes(`${this.mapping[cdName].version}`));
223
- log.debug(`Got ${_appiumSupport.util.pluralize('item', driversToSync.length, true)}`);
223
+ log.debug(`Got ${_support.util.pluralize('item', driversToSync.length, true)}`);
224
224
 
225
225
  if (_lodash.default.isEmpty(driversToSync)) {
226
226
  return [];
@@ -241,13 +241,13 @@ class ChromedriverStorageClient {
241
241
  }
242
242
 
243
243
  driversToSync = driversToSync.filter(cdName => `${this.mapping[cdName].minBrowserVersion}` === `${closestMatchedVersionNumber > 0 ? closestMatchedVersionNumber : minBrowserVersionInt}`);
244
- log.debug(`Got ${_appiumSupport.util.pluralize('item', driversToSync.length, true)}`);
244
+ log.debug(`Got ${_support.util.pluralize('item', driversToSync.length, true)}`);
245
245
 
246
246
  if (_lodash.default.isEmpty(driversToSync)) {
247
247
  return [];
248
248
  }
249
249
 
250
- log.debug(`Will select candidate ${_appiumSupport.util.pluralize('driver', driversToSync.length)} ` + `versioned as '${_lodash.default.uniq(driversToSync.map(cdName => this.mapping[cdName].version))}'`);
250
+ log.debug(`Will select candidate ${_support.util.pluralize('driver', driversToSync.length)} ` + `versioned as '${_lodash.default.uniq(driversToSync.map(cdName => this.mapping[cdName].version))}'`);
251
251
  }
252
252
 
253
253
  if (!_lodash.default.isEmpty(osInfo)) {
@@ -268,7 +268,7 @@ class ChromedriverStorageClient {
268
268
  log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);
269
269
  const platformRe = new RegExp(`(\\b|_)${name}${arch}\\b`);
270
270
  driversToSync = driversToSync.filter(cdName => platformRe.test(cdName));
271
- log.debug(`Got ${_appiumSupport.util.pluralize('item', driversToSync.length, true)}`);
271
+ log.debug(`Got ${_support.util.pluralize('item', driversToSync.length, true)}`);
272
272
  }
273
273
 
274
274
  return driversToSync;
@@ -286,7 +286,7 @@ class ChromedriverStorageClient {
286
286
  log.debug(`Retrieving '${url}' to '${archivePath}'`);
287
287
 
288
288
  try {
289
- await _appiumSupport.net.downloadFile(url, archivePath, {
289
+ await _support.net.downloadFile(url, archivePath, {
290
290
  isMetered: false,
291
291
  timeout: TIMEOUT_MS
292
292
  });
@@ -312,13 +312,13 @@ class ChromedriverStorageClient {
312
312
  return false;
313
313
  }
314
314
 
315
- const fileName = `${_path.default.parse(url).name}_v${version}` + (_appiumSupport.system.isWindows() ? '.exe' : '');
315
+ const fileName = `${_path.default.parse(url).name}_v${version}` + (_support.system.isWindows() ? '.exe' : '');
316
316
 
317
317
  const targetPath = _path.default.resolve(this.chromedriverDir, fileName);
318
318
 
319
319
  try {
320
320
  await this.unzipDriver(archivePath, targetPath);
321
- await _appiumSupport.fs.chmod(targetPath, 0o755);
321
+ await _support.fs.chmod(targetPath, 0o755);
322
322
  log.debug(`Permissions of the file '${targetPath}' have been changed to 755`);
323
323
  } catch (e) {
324
324
  if (isStrict) {
@@ -350,10 +350,10 @@ class ChromedriverStorageClient {
350
350
  return [];
351
351
  }
352
352
 
353
- log.debug(`Got ${_appiumSupport.util.pluralize('driver', driversToSync.length, true)} to sync: ` + JSON.stringify(driversToSync, null, 2));
353
+ log.debug(`Got ${_support.util.pluralize('driver', driversToSync.length, true)} to sync: ` + JSON.stringify(driversToSync, null, 2));
354
354
  const synchronizedDrivers = [];
355
355
  const promises = [];
356
- const archivesRoot = await _appiumSupport.tempDir.openDir();
356
+ const archivesRoot = await _support.tempDir.openDir();
357
357
 
358
358
  try {
359
359
  for (const [idx, driverKey] of driversToSync.entries()) {
@@ -370,11 +370,11 @@ class ChromedriverStorageClient {
370
370
 
371
371
  await _bluebird.default.all(promises);
372
372
  } finally {
373
- await _appiumSupport.fs.rimraf(archivesRoot);
373
+ await _support.fs.rimraf(archivesRoot);
374
374
  }
375
375
 
376
376
  if (!_lodash.default.isEmpty(synchronizedDrivers)) {
377
- log.info(`Successfully synchronized ` + `${_appiumSupport.util.pluralize('chromedriver', synchronizedDrivers.length, true)}`);
377
+ log.info(`Successfully synchronized ` + `${_support.util.pluralize('chromedriver', synchronizedDrivers.length, true)}`);
378
378
  } else {
379
379
  log.info(`No chromedrivers were synchronized`);
380
380
  }
@@ -388,4 +388,4 @@ var _default = ChromedriverStorageClient;
388
388
  exports.default = _default;require('source-map-support').install();
389
389
 
390
390
 
391
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFJQTs7QUFDQTs7QUFDQTs7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YSwgZ2V0T3NJbmZvLFxuICBPUywgWDY0LCBYODYsIE0xX0FSQ0hfU1VGRklYLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeHBhdGggZnJvbSAneHBhdGgnO1xuaW1wb3J0IHsgRE9NUGFyc2VyIH0gZnJvbSAnQHhtbGRvbS94bWxkb20nO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHRlbXBEaXIsIHppcCwgdXRpbCwgbmV0IH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuXG5cbmNvbnN0IFRJTUVPVVRfTVMgPSAxNTAwMDtcbmNvbnN0IE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPSA1O1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50Jyk7XG5cblxuYXN5bmMgZnVuY3Rpb24gaXNDcmNPayAoc3JjLCBjaGVja3N1bSkge1xuICBjb25zdCBtZDUgPSBhd2FpdCBmcy5oYXNoKHNyYywgJ21kNScpO1xuICByZXR1cm4gXy50b0xvd2VyKG1kNSkgPT09IF8udG9Mb3dlcihjaGVja3N1bSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRDaGlsZE5vZGUgKHBhcmVudCwgY2hpbGROYW1lID0gbnVsbCwgdGV4dCA9IG51bGwpIHtcbiAgaWYgKCFjaGlsZE5hbWUgJiYgIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAobGV0IGNoaWxkTm9kZUlkeCA9IDA7IGNoaWxkTm9kZUlkeCA8IHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgY2hpbGROb2RlSWR4KyspIHtcbiAgICBjb25zdCBjaGlsZE5vZGUgPSBwYXJlbnQuY2hpbGROb2Rlc1tjaGlsZE5vZGVJZHhdO1xuICAgIGlmIChjaGlsZE5hbWUgJiYgIXRleHQgJiYgY2hpbGROYW1lID09PSBjaGlsZE5vZGUubG9jYWxOYW1lKSB7XG4gICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgIH1cbiAgICBpZiAodGV4dCkge1xuICAgICAgY29uc3QgY2hpbGRUZXh0ID0gZXh0cmFjdE5vZGVUZXh0KGNoaWxkTm9kZSk7XG4gICAgICBpZiAoIWNoaWxkVGV4dCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZE5hbWUgJiYgY2hpbGROYW1lID09PSBjaGlsZE5vZGUubG9jYWxOYW1lICYmIHRleHQgPT09IGNoaWxkVGV4dCkge1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGlsZE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Tm9kZVRleHQgKG5vZGUpIHtcbiAgcmV0dXJuICghbm9kZSB8fCAhbm9kZS5maXJzdENoaWxkIHx8ICF1dGlsLmhhc1ZhbHVlKG5vZGUuZmlyc3RDaGlsZC5ub2RlVmFsdWUpKVxuICAgID8gbnVsbFxuICAgIDogbm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZTtcbn1cblxuXG5jbGFzcyBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNocm9tZWRyaXZlckRpciA9IGdldENocm9tZWRyaXZlckRpcigpLFxuICAgICAgdGltZW91dCA9IFRJTUVPVVRfTVMsXG4gICAgfSA9IGFyZ3M7XG4gICAgdGhpcy5jaHJvbWVkcml2ZXJEaXIgPSBjaHJvbWVkcml2ZXJEaXI7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICB0aGlzLm1hcHBpbmcgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc1xuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IHZlcnNpb24gLSBDaHJvbWVkcml2ZXIgdmVyc2lvblxuICAgKiBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWluQnJvd3NlclZlcnNpb24gLSBUaGUgbWluaW11bSBicm93c2VyIHZlcnNpb25cbiAgICogc3VwcG9ydGVkIGJ5IGNocm9tZWRyaXZlciBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXRzIGFkZGl0aW9uYWwgY2hyb21lZHJpdmVyIGRldGFpbHMgZnJvbSBjaHJvbWVkcml2ZXJcbiAgICogcmVsZWFzZSBub3Rlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFJlbGVhc2Ugbm90ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hyb21lZHJpdmVyXG4gICAqIEByZXR1cm5zIHtBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc31cbiAgICovXG4gIHBhcnNlTm90ZXMgKGNvbnRlbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSAvXlxccypbLV0rQ2hyb21lRHJpdmVyW1xcRF0rKFtcXGQuXSspL2ltLmV4ZWMoY29udGVudCk7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb24gPSB2ZXJzaW9uTWF0Y2hbMV07XG4gICAgfVxuICAgIGNvbnN0IG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2ggPSAvXlxccypTdXBwb3J0cyBDaHJvbWVbXFxEXSsoXFxkKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAobWluQnJvd3NlclZlcnNpb25NYXRjaCkge1xuICAgICAgcmVzdWx0Lm1pbkJyb3dzZXJWZXJzaW9uID0gbWluQnJvd3NlclZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgY2hyb21lZHJpdmVyIHJlbGVhc2Ugbm90ZXMgYW5kIHB1dHMgdGhlbVxuICAgKiBpbnRvIHRoZSBkaWN0aW9uYXJ5IGFyZ3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkcml2ZXJLZXkgLSBEcml2ZXIgdmVyc2lvbiBwbHVzIGFyY2hpdmUgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm90ZXNVcmwgLSBUaGUgVVJMIG9mIGNocm9tZWRyaXZlciBub3Rlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gaW5mb0RpY3QgLSBUaGUgZGljdGlvbmFyeSBjb250YWluaW5nIGRyaXZlciBpbmZvLlxuICAgKiBUaGUgbWV0aG9kIGNhbGwgbXV0YXRlcyBieSBtZXJnaW5nIGBBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc2BcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSByZWxlYXNlIG5vdGVzIGNhbm5vdCBiZSBkb3dubG9hZGVkXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvIChkcml2ZXJLZXksIG5vdGVzVXJsLCBpbmZvRGljdCkge1xuICAgIGNvbnN0IG5vdGVzID0gYXdhaXQgcmV0cmlldmVEYXRhKG5vdGVzVXJsLCB7XG4gICAgICAndXNlci1hZ2VudCc6ICdhcHBpdW0nLFxuICAgICAgYWNjZXB0OiAnKi8qJyxcbiAgICB9LCB7IHRpbWVvdXQ6IHRoaXMudGltZW91dCB9KTtcbiAgICBjb25zdCB7IG1pbkJyb3dzZXJWZXJzaW9uIH0gPSB0aGlzLnBhcnNlTm90ZXMobm90ZXMpO1xuICAgIGlmICghbWluQnJvd3NlclZlcnNpb24pIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIGRyaXZlciAnJHtkcml2ZXJLZXl9JyBkb2VzIG5vdCBjb250YWluIHZhbGlkIHJlbGVhc2Ugbm90ZXMgYXQgJHtub3Rlc1VybH0uIGAgK1xuICAgICAgICBgU2tpcHBpbmcgaXRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5mb0RpY3QubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgY2hyb21lZHJpdmVyIHN0b3JhZ2UgWE1MIGFuZCBzdG9yZXNcbiAgICogdGhlIHBhcnNlZCByZXN1bHRzIGludG8gYHRoaXMubWFwcGluZ2BcbiAgICpcbiAgICogQHBhcmFtIHtET01Eb2N1bWVudH0gZG9jIC0gVGhlIERPTSByZXByZXNlbnRhdGlvblxuICAgKiBvZiB0aGUgY2hyb21lZHJpdmVyIHN0b3JhZ2UgWE1MXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUGFyc2VOb3RlcyBbdHJ1ZV0gLSBJZiBzZXQgdG8gYHRydWVgXG4gICAqIHRoZW4gYWRkaXRpb25hbCBkcml2ZXJzIGluZm9ybWF0aW9uIGlzIGdvaW5nIHRvIGJlIHBhcnNlZFxuICAgKiBhbmQgYXNzaWduZWQgdG8gYHRoaXMubWFwcGluZ2BcbiAgICovXG4gIGFzeW5jIHBhcnNlU3RvcmFnZVhtbCAoZG9jLCBzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGRyaXZlck5vZGVzID0geHBhdGguc2VsZWN0KGAvLypbbG9jYWwtbmFtZSguKT0nQ29udGVudHMnXWAsIGRvYyk7XG4gICAgbG9nLmRlYnVnKGBQYXJzZWQgJHtkcml2ZXJOb2Rlcy5sZW5ndGh9IGVudHJpZXMgZnJvbSBzdG9yYWdlIFhNTGApO1xuICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyTm9kZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRyaXZlck5vZGUgb2YgZHJpdmVyTm9kZXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGV4dHJhY3ROb2RlVGV4dChmaW5kQ2hpbGROb2RlKGRyaXZlck5vZGUsICdLZXknKSk7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoa2V5LCAnL2Nocm9tZWRyaXZlcl8nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXRhZyA9IGV4dHJhY3ROb2RlVGV4dChmaW5kQ2hpbGROb2RlKGRyaXZlck5vZGUsICdFVGFnJykpO1xuICAgICAgaWYgKCFldGFnKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgVGhlIGVudHJ5ICcke2tleX0nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGNoZWNrc3VtLiBTa2lwcGluZyBpdGApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2RJbmZvID0ge1xuICAgICAgICB1cmw6IGAke0NEX0NETn0vJHtrZXl9YCxcbiAgICAgICAgZXRhZzogXy50cmltKGV0YWcsICdcIicpLFxuICAgICAgICB2ZXJzaW9uOiBfLmZpcnN0KGtleS5zcGxpdCgnLycpKSxcbiAgICAgIH07XG4gICAgICB0aGlzLm1hcHBpbmdba2V5XSA9IGNkSW5mbztcblxuICAgICAgY29uc3Qgbm90ZXNQYXRoID0gYCR7Y2RJbmZvLnZlcnNpb259L25vdGVzLnR4dGA7XG4gICAgICBjb25zdCBpc05vdGVzUHJlc2VudCA9ICEhZHJpdmVyTm9kZXNcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBub2RlKSA9PiBhY2MgfHwgZmluZENoaWxkTm9kZShub2RlLCAnS2V5Jywgbm90ZXNQYXRoKSwgZmFsc2UpO1xuICAgICAgaWYgKCFpc05vdGVzUHJlc2VudCkge1xuICAgICAgICBjZEluZm8ubWluQnJvd3NlclZlcnNpb24gPSBudWxsO1xuICAgICAgICBpZiAoc2hvdWxkUGFyc2VOb3Rlcykge1xuICAgICAgICAgIGxvZy5pbmZvKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiBhbnkgbm90ZXMuIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMucmV0cmlldmVBZGRpdGlvbmFsRHJpdmVySW5mbyhrZXksIGAke0NEX0NETn0vJHtub3Rlc1BhdGh9YCwgY2RJbmZvKSk7XG4gICAgICBpZiAocHJvbWlzZXMubGVuZ3RoICUgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9PT0gMCkge1xuICAgICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICBsb2cuaW5mbyhgVGhlIHRvdGFsIGNvdW50IG9mIGVudHJpZXMgaW4gdGhlIG1hcHBpbmc6ICR7Xy5zaXplKHRoaXMubWFwcGluZyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRHJpdmVyRGV0YWlsc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIC0gVGhlIGZ1bGwgdXJsIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRyaXZlciBpblxuICAgKiB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV0YWcgLSBUaGUgQ1JDIG9mIHRoZSBkcml2ZXIgYXJjaGl2ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBDaHJvbWVkcml2ZXJzTWFwcGluZ1xuICAgKiBAcHJvcGVydHkge0RyaXZlckRldGFpbHN9IC0gVGhlIGtleXMgYXJlIHVuaXF1ZSBkcml2ZXIgaWRlbnRpZmllcnNcbiAgICogKHZlcnNpb24vYXJjaGl2ZSBuYW1lKS4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGhhdmUgYERyaXZlckRldGFpbHNgXG4gICAqIGNvbnRhaW5pbmcgY2hyb21lZHJpdmVyIGRldGFpbHNcbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBjaHJvbWVkcml2ZXIgbWFwcGluZyBmcm9tIHRoZSBzdG9yYWdlXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUGFyc2VOb3RlcyBbdHJ1ZV0gLSBpZiBzZXQgdG8gYHRydWVgXG4gICAqIHRoZW4gYWRkaXRpb25hbCBjaHJvbWVkcml2ZXJzIGluZm8gaXMgZ29pbmcgdG8gYmUgcmV0cmlldmVkIGFuZFxuICAgKiBwYXJzZWQgZnJvbSByZWxlYXNlIG5vdGVzXG4gICAqIEByZXR1cm5zIHtDaHJvbWVkcml2ZXJzTWFwcGluZ31cbiAgICovXG4gIGFzeW5jIHJldHJpZXZlTWFwcGluZyAoc2hvdWxkUGFyc2VOb3RlcyA9IHRydWUpIHtcbiAgICBjb25zdCB4bWwgPSBhd2FpdCByZXRyaWV2ZURhdGEoQ0RfQ0ROLCB7XG4gICAgICAndXNlci1hZ2VudCc6ICdhcHBpdW0nLFxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24veG1sLCAqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sKTtcbiAgICBhd2FpdCB0aGlzLnBhcnNlU3RvcmFnZVhtbChkb2MsIHNob3VsZFBhcnNlTm90ZXMpO1xuICAgIHJldHVybiBfLmNsb25lRGVlcCh0aGlzLm1hcHBpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGRvd25sb2FkZWQgY2hyb21lZHJpdmVyIGFyY2hpdmVcbiAgICogaW50byB0aGUgZ2l2ZW4gZGVzdGluYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNyYyAtIFRoZSBzb3VyY2UgYXJjaGl2ZSBwYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkc3QgLSBUaGUgZGVzdGluYXRpb24gY2hyb21lZHJpdmVyIHBhdGhcbiAgICovXG4gIGFzeW5jIHVuemlwRHJpdmVyIChzcmMsIGRzdCkge1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhzcmMsIHRtcFJvb3QpO1xuICAgICAgY29uc3QgY2hyb21lZHJpdmVyUGF0aCA9IGF3YWl0IGZzLndhbGtEaXIodG1wUm9vdCwgdHJ1ZSwgKGl0ZW1QYXRoLCBpc0RpcmVjdG9yeSkgPT5cbiAgICAgICAgIWlzRGlyZWN0b3J5ICYmIF8udG9Mb3dlcihwYXRoLnBhcnNlKGl0ZW1QYXRoKS5uYW1lKSA9PT0gJ2Nocm9tZWRyaXZlcicpO1xuICAgICAgaWYgKCFjaHJvbWVkcml2ZXJQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGFyY2hpdmUgd2FzIHVuemlwcGVkIHByb3Blcmx5LCBidXQgd2UgY291bGQgbm90IGZpbmQgYW55IGNocm9tZWRyaXZlciBleGVjdXRhYmxlJyk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYE1vdmluZyB0aGUgZXh0cmFjdGVkICcke3BhdGguYmFzZW5hbWUoY2hyb21lZHJpdmVyUGF0aCl9JyB0byAnJHtkc3R9J2ApO1xuICAgICAgYXdhaXQgZnMubXYoY2hyb21lZHJpdmVyUGF0aCwgZHN0LCB7XG4gICAgICAgIG1rZGlycDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT1NJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGhvc3QgT1NcbiAgICogQ2FuIGJlIGVpdGhlciBgbWFjYCwgYHdpbmRvd3NgIG9yIGBsaW51eGBcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFyY2ggLSBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBob3N0IE9ELlxuICAgKiBDYW4gYmUgZWl0aGVyIGAzMmAgb3IgYDY0YFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGhhcmR3YXJlTmFtZSAtIFRoZSBvdXRwdXQgb2YgYHVuYW1lIC1tYCBjb21tYW5kXG4gICAqIG9uIGxpbnV4IGFuZCBtYWMgc3lzdGVtcy4gYG51bGxgIG9uIFdpbmRvd3NcbiAgICovXG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYHRoaXMubWFwcGluZ2AgdG8gb25seSBzZWxlY3QgbWF0Y2hpbmdcbiAgICogY2hyb21lZHJpdmVyIGVudHJpZXMgYnkgb3BlcmF0aW5nIHN5c3RlbSBpbmZvcm1hdGlvblxuICAgKiBhbmQvb3IgYWRkaXRpb25hbCBzeW5jaHJvbml6YXRpb24gb3B0aW9ucyAoaWYgcHJvdmlkZWQpXG4gICAqXG4gICAqIEBwYXJhbSB7P09TSW5mb30gb3NJbmZvXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBmaWx0ZXJlZCBjaHJvbWVkcml2ZXJcbiAgICogZW50cnkgbmFtZXMgKHZlcnNpb24vYXJjaGl2ZSBuYW1lKVxuICAgKi9cbiAgc2VsZWN0TWF0Y2hpbmdEcml2ZXJzIChvc0luZm8sIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1pbkJyb3dzZXJWZXJzaW9uLFxuICAgICAgdmVyc2lvbnMgPSBbXSxcbiAgICB9ID0gb3B0cztcbiAgICBsZXQgZHJpdmVyc1RvU3luYyA9IF8ua2V5cyh0aGlzLm1hcHBpbmcpO1xuXG4gICAgaWYgKCFfLmlzRW1wdHkodmVyc2lvbnMpKSB7XG4gICAgICAvLyBIYW5kbGUgb25seSBzZWxlY3RlZCB2ZXJzaW9ucyBpZiByZXF1ZXN0ZWRcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgdmVyc2lvbnMgbWF0Y2ggdG8gJHt2ZXJzaW9uc31gKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jXG4gICAgICAgIC5maWx0ZXIoKGNkTmFtZSkgPT4gdmVyc2lvbnMuaW5jbHVkZXMoYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0udmVyc2lvbn1gKSk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKG1pbkJyb3dzZXJWZXJzaW9uKSkge1xuICAgICAgLy8gT25seSBzZWxlY3QgZHJpdmVycyB0aGF0IHN1cHBvcnQgdGhlIGN1cnJlbnQgYnJvd3NlciB3aG9zZSBtYWpvciB2ZXJzaW9uIG51bWJlciBlcXVhbHMgdG8gYG1pbkJyb3dzZXJWZXJzaW9uYFxuICAgICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25JbnQgPSBwYXJzZUludChtaW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSBtaW5pbXVtIHN1cHBvcnRlZCBicm93c2VyIHZlcnNpb24gbWF0Y2hlcyB0byAke21pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuICAgICAgbGV0IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA9IDA7XG4gICAgICAvLyBTZWxlY3QgdGhlIG5ld2VzdCBhdmFpbGFibGUgYW5kIGNvbXBhdGlibGUgY2hyb21lZHJpdmVyXG4gICAgICBmb3IgKGNvbnN0IGNkTmFtZSBvZiBkcml2ZXJzVG9TeW5jKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA9IHBhcnNlSW50KHRoaXMubWFwcGluZ1tjZE5hbWVdLm1pbkJyb3dzZXJWZXJzaW9uLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKVxuICAgICAgICAgICAgJiYgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uIDw9IG1pbkJyb3dzZXJWZXJzaW9uSW50XG4gICAgICAgICAgICAmJiBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24pIHtcbiAgICAgICAgICBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSBjdXJyZW50TWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBgJHt0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbn1gID09PVxuICAgICAgICBgJHtjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPiAwID8gY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDogbWluQnJvd3NlclZlcnNpb25JbnR9YCk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgV2lsbCBzZWxlY3QgY2FuZGlkYXRlICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoKX0gYCArXG4gICAgICAgIGB2ZXJzaW9uZWQgYXMgJyR7Xy51bmlxKGRyaXZlcnNUb1N5bmMubWFwKChjZE5hbWUpID0+IHRoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb24pKX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRW1wdHkob3NJbmZvKSkge1xuICAgICAgLy8gRmlsdGVyIG91dCBkcml2ZXJzIGZvciB1bnN1cHBvcnRlZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlc1xuICAgICAgbGV0IHtuYW1lLCBhcmNoLCBoYXJkd2FyZU5hbWV9ID0gb3NJbmZvO1xuICAgICAgaWYgKGFyY2ggPT09IFg2NCAmJiAhZHJpdmVyc1RvU3luYy5zb21lKChjZE5hbWUpID0+IGNkTmFtZS5pbmNsdWRlcyhgXyR7bmFtZX0ke1g2NH1gKSkpIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHg4NiBidWlsZCBpZiB4NjQgb25lIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBnaXZlbiBPU1xuICAgICAgICBhcmNoID0gWDg2O1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IE9TLm1hYyAmJiBfLmluY2x1ZGVzKGhhcmR3YXJlTmFtZSwgJ2FybScpXG4gICAgICAgICAgJiYgZHJpdmVyc1RvU3luYy5zb21lKChjZE5hbWUpID0+IGNkTmFtZS5pbmNsdWRlcyhNMV9BUkNIX1NVRkZJWCkpKSB7XG4gICAgICAgIC8vIHByZWZlciBleGVjdXRhYmxlIGZvciBNMSBhcmNoIGlmIHByZXNlbnRcbiAgICAgICAgYXJjaCArPSBNMV9BUkNIX1NVRkZJWDtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgcGxhdGZvcm0gbWF0Y2hlcyB0byAke25hbWV9JHthcmNofWApO1xuICAgICAgY29uc3QgcGxhdGZvcm1SZSA9IG5ldyBSZWdFeHAoYChcXFxcYnxfKSR7bmFtZX0ke2FyY2h9XFxcXGJgKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBwbGF0Zm9ybVJlLnRlc3QoY2ROYW1lKSk7XG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBkcml2ZXJzVG9TeW5jO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gY2hyb21lZHJpdmVyIGZyb20gdGhlIHN0b3JhZ2VcbiAgICogYW5kIHVucGFja3MgaXQgaW50byBgdGhpcy5jaHJvbWVkcml2ZXJEaXJgIGZvbGRlclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgdW5pcXVlIGRyaXZlciBpbmRleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHJpdmVyS2V5IC0gVGhlIGRyaXZlciBrZXkgaW4gYHRoaXMubWFwcGluZ2BcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVzUm9vdCAtIFRoZSB0ZW1wb3JhcnkgZm9sZGVyIHBhdGggdG8gZXh0cmFjdFxuICAgKiBkb3dubG9hZGVkIGFyY2hpdmVzIHRvXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdHJpY3QgW3RydWVdIC0gV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciAoYHRydWVgKVxuICAgKiBvciByZXR1cm4gYSBib29sZWFuIHJlc3VsdCBpZiB0aGUgZHJpdmVyIHJldHJpZXZhbCBwcm9jZXNzIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIGRyaXZlclxuICAgKiBhbmQgYGlzU3RyaWN0YCBpcyBzZXQgdG8gYHRydWVgXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBpZiBgdHJ1ZWAgdGhlbiB0aGUgY2hyb21lZHJpdmVyIGlzIHN1Y2Nlc3NmdWxseVxuICAgKiBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWQuXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZURyaXZlciAoaW5kZXgsIGRyaXZlcktleSwgYXJjaGl2ZXNSb290LCBpc1N0cmljdCA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB1cmwsIGV0YWcsIHZlcnNpb24gfSA9IHRoaXMubWFwcGluZ1tkcml2ZXJLZXldO1xuICAgIGNvbnN0IGFyY2hpdmVQYXRoID0gcGF0aC5yZXNvbHZlKGFyY2hpdmVzUm9vdCwgYCR7aW5kZXh9LnppcGApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyAnJHt1cmx9JyB0byAnJHthcmNoaXZlUGF0aH0nYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldC5kb3dubG9hZEZpbGUodXJsLCBhcmNoaXZlUGF0aCwge1xuICAgICAgICBpc01ldGVyZWQ6IGZhbHNlLFxuICAgICAgICB0aW1lb3V0OiBUSU1FT1VUX01TXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBtc2cgPSBgQ2Fubm90IGRvd25sb2FkIGNocm9tZWRyaXZlciBhcmNoaXZlLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWF3YWl0IGlzQ3JjT2soYXJjaGl2ZVBhdGgsIGV0YWcpKSB7XG4gICAgICBjb25zdCBtc2cgPSBgVGhlIGNoZWNrc3VtIGZvciB0aGUgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgJyR7ZHJpdmVyS2V5fScgZGlkIG5vdCBtYXRjaGA7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IobXNnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWUgPSBgJHtwYXRoLnBhcnNlKHVybCkubmFtZX1fdiR7dmVyc2lvbn1gICtcbiAgICAgIChzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJyk7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmNocm9tZWRyaXZlckRpciwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVuemlwRHJpdmVyKGFyY2hpdmVQYXRoLCB0YXJnZXRQYXRoKTtcbiAgICAgIGF3YWl0IGZzLmNobW9kKHRhcmdldFBhdGgsIDBvNzU1KTtcbiAgICAgIGxvZy5kZWJ1ZyhgUGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgJyR7dGFyZ2V0UGF0aH0nIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDc1NWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFN5bmNPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8U3RyaW5nPn0gdmVyc2lvbnMgLSBUaGUgbGlzdCBvZiBjaHJvbWVkcml2ZXJcbiAgICogdmVyc2lvbnMgdG8gc3luYy4gSWYgZW1wdHkgKHRoZSBkZWZhdWx0IHZhbHVlKSB0aGVuIGFsbCBhdmFpbGFibGVcbiAgICogY2hyb21lZHJpdmVycyBhcmUgZ29pbmcgdG8gYmUgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bWJlcn0gbWluQnJvd3NlclZlcnNpb24gLSBUaGUgbWludW11bSBzdXBwb3J0ZWRcbiAgICogQ2hyb21lIHZlcnNpb24gdGhhdCBkb3dubG9hZGVkIGNocm9tZWRyaXZlcnMgc2hvdWxkIHN1cHBvcnQuIENhbiBtYXRjaFxuICAgKiBtdWx0aXBsZSBkcml2ZXJzLlxuICAgKiBAcHJvcGVydHkgez9PU0luZm99IG9zSW5mbyAtIFN5c3RlbSBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbHRlciBvdXRcbiAgICogdGhlIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBkcml2ZXJzLiBJZiBub3QgcHJvdmlkZWQgdGhlbiB0aGUgc2NyaXB0XG4gICAqIHdpbGwgdHJ5IHRvIHJldHJpZXZlIGl0LlxuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlcnMgZnJvbSB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICogdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gICAqXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdoaWxlIHJldHJpZXZpbmdcbiAgICogdGhlIGRyaXZlcnNcbiAgICogQHJldHVybnMge0FycmF5PFN0cmluZ30gVGhlIGxpc3Qgb2Ygc3VjY2Vzc2Z1bGx5IHN5bmNocm9uaXplZCBkcml2ZXIga2V5c1xuICAgKi9cbiAgYXN5bmMgc3luY0RyaXZlcnMgKG9wdHMgPSB7fSkge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5tYXBwaW5nKSkge1xuICAgICAgYXdhaXQgdGhpcy5yZXRyaWV2ZU1hcHBpbmcoISFvcHRzLm1pbkJyb3dzZXJWZXJzaW9uKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgZnJvbSBHb29nbGUgc3RvcmFnZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyaXZlcnNUb1N5bmMgPSB0aGlzLnNlbGVjdE1hdGNoaW5nRHJpdmVycyhvcHRzLm9zSW5mbyA/PyBhd2FpdCBnZXRPc0luZm8oKSwgb3B0cyk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGVyZSBhcmUgbm8gZHJpdmVycyB0byBzeW5jLiBFeGl0aW5nYCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX0gdG8gc3luYzogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShkcml2ZXJzVG9TeW5jLCBudWxsLCAyKSk7XG5cbiAgICBjb25zdCBzeW5jaHJvbml6ZWREcml2ZXJzID0gW107XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBhcmNoaXZlc1Jvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBbaWR4LCBkcml2ZXJLZXldIG9mIGRyaXZlcnNUb1N5bmMuZW50cmllcygpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5yZXRyaWV2ZURyaXZlcihpZHgsIGRyaXZlcktleSwgYXJjaGl2ZXNSb290LCAhXy5pc0VtcHR5KG9wdHMpKSkge1xuICAgICAgICAgICAgc3luY2hyb25pemVkRHJpdmVycy5wdXNoKGRyaXZlcktleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoICUgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYoYXJjaGl2ZXNSb290KTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkoc3luY2hyb25pemVkRHJpdmVycykpIHtcbiAgICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGAgK1xuICAgICAgICBgJHt1dGlsLnBsdXJhbGl6ZSgnY2hyb21lZHJpdmVyJywgc3luY2hyb25pemVkRHJpdmVycy5sZW5ndGgsIHRydWUpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbyhgTm8gY2hyb21lZHJpdmVycyB3ZXJlIHN5bmNocm9uaXplZGApO1xuICAgIH1cbiAgICByZXR1cm4gc3luY2hyb25pemVkRHJpdmVycztcbiAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQ7XG4iXSwiZmlsZSI6ImxpYi9zdG9yYWdlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
391
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFJQTs7QUFDQTs7QUFDQTs7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TSxDQUFDZ0UsR0FBRCxFQUFNMUcsU0FBTixDQUFYLElBQStCNkQsYUFBYSxDQUFDOEMsT0FBZCxFQUEvQixFQUF3RDtBQUN0RDlGLFFBQUFBLFFBQVEsQ0FBQ2dCLElBQVQsQ0FBYyxDQUFDLFlBQVk7QUFDekIsY0FBSSxNQUFNLEtBQUt1RCxjQUFMLENBQW9Cc0IsR0FBcEIsRUFBeUIxRyxTQUF6QixFQUFvQ3NGLFlBQXBDLEVBQWtELENBQUN4SCxnQkFBRThDLE9BQUYsQ0FBVStDLElBQVYsQ0FBbkQsQ0FBVixFQUErRTtBQUM3RThDLFlBQUFBLG1CQUFtQixDQUFDNUUsSUFBcEIsQ0FBeUI3QixTQUF6QjtBQUNEO0FBQ0YsU0FKYSxHQUFkOztBQU1BLFlBQUlhLFFBQVEsQ0FBQ3RDLE1BQVQsR0FBa0JuQixzQkFBbEIsS0FBNkMsQ0FBakQsRUFBb0Q7QUFDbEQsZ0JBQU0wRSxrQkFBRUMsR0FBRixDQUFNbEIsUUFBTixDQUFOO0FBQ0Q7QUFDRjs7QUFDRCxZQUFNaUIsa0JBQUVDLEdBQUYsQ0FBTWxCLFFBQU4sQ0FBTjtBQUNELEtBYkQsU0FhVTtBQUNSLFlBQU1qRCxZQUFHNEYsTUFBSCxDQUFVOEIsWUFBVixDQUFOO0FBQ0Q7O0FBQ0QsUUFBSSxDQUFDeEgsZ0JBQUU4QyxPQUFGLENBQVU2RixtQkFBVixDQUFMLEVBQXFDO0FBQ25DcEosTUFBQUEsR0FBRyxDQUFDdUUsSUFBSixDQUFVLDRCQUFELEdBQ04sR0FBRTlDLGNBQUttRixTQUFMLENBQWUsY0FBZixFQUErQndDLG1CQUFtQixDQUFDbEksTUFBbkQsRUFBMkQsSUFBM0QsQ0FBaUUsRUFEdEU7QUFFRCxLQUhELE1BR087QUFDTGxCLE1BQUFBLEdBQUcsQ0FBQ3VFLElBQUosQ0FBVSxvQ0FBVjtBQUNEOztBQUNELFdBQU82RSxtQkFBUDtBQUNEOztBQWxZNkI7O2VBc1lqQnhILHlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZ2V0Q2hyb21lZHJpdmVyRGlyLCBDRF9DRE4sIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLFxuICBPUywgWDY0LCBYODYsIE0xX0FSQ0hfU1VGRklYLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeHBhdGggZnJvbSAneHBhdGgnO1xuaW1wb3J0IHsgRE9NUGFyc2VyIH0gZnJvbSAnQHhtbGRvbS94bWxkb20nO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHRlbXBEaXIsIHppcCwgdXRpbCwgbmV0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5jb25zdCBUSU1FT1VUX01TID0gMTUwMDA7XG5jb25zdCBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID0gNTtcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCcpO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIGlzQ3JjT2sgKHNyYywgY2hlY2tzdW0pIHtcbiAgY29uc3QgbWQ1ID0gYXdhaXQgZnMuaGFzaChzcmMsICdtZDUnKTtcbiAgcmV0dXJuIF8udG9Mb3dlcihtZDUpID09PSBfLnRvTG93ZXIoY2hlY2tzdW0pO1xufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGROb2RlIChwYXJlbnQsIGNoaWxkTmFtZSA9IG51bGwsIHRleHQgPSBudWxsKSB7XG4gIGlmICghY2hpbGROYW1lICYmICF0ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFwYXJlbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3IgKGxldCBjaGlsZE5vZGVJZHggPSAwOyBjaGlsZE5vZGVJZHggPCBwYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGNoaWxkTm9kZUlkeCsrKSB7XG4gICAgY29uc3QgY2hpbGROb2RlID0gcGFyZW50LmNoaWxkTm9kZXNbY2hpbGROb2RlSWR4XTtcbiAgICBpZiAoY2hpbGROYW1lICYmICF0ZXh0ICYmIGNoaWxkTmFtZSA9PT0gY2hpbGROb2RlLmxvY2FsTmFtZSkge1xuICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICB9XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGNvbnN0IGNoaWxkVGV4dCA9IGV4dHJhY3ROb2RlVGV4dChjaGlsZE5vZGUpO1xuICAgICAgaWYgKCFjaGlsZFRleHQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGROYW1lICYmIGNoaWxkTmFtZSA9PT0gY2hpbGROb2RlLmxvY2FsTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICAgIGlmICghY2hpbGROYW1lICYmIHRleHQgPT09IGNoaWxkVGV4dCkge1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdE5vZGVUZXh0IChub2RlKSB7XG4gIHJldHVybiAoIW5vZGUgfHwgIW5vZGUuZmlyc3RDaGlsZCB8fCAhdXRpbC5oYXNWYWx1ZShub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlKSlcbiAgICA/IG51bGxcbiAgICA6IG5vZGUuZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG59XG5cblxuY2xhc3MgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCB7XG4gIGNvbnN0cnVjdG9yIChhcmdzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBjaHJvbWVkcml2ZXJEaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIoKSxcbiAgICAgIHRpbWVvdXQgPSBUSU1FT1VUX01TLFxuICAgIH0gPSBhcmdzO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyRGlyID0gY2hyb21lZHJpdmVyRGlyO1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgdGhpcy5tYXBwaW5nID0ge307XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gQWRkaXRpb25hbERyaXZlckRldGFpbHNcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICogb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbkJyb3dzZXJWZXJzaW9uIC0gVGhlIG1pbmltdW0gYnJvd3NlciB2ZXJzaW9uXG4gICAqIHN1cHBvcnRlZCBieSBjaHJvbWVkcml2ZXIgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogR2V0cyBhZGRpdGlvbmFsIGNocm9tZWRyaXZlciBkZXRhaWxzIGZyb20gY2hyb21lZHJpdmVyXG4gICAqIHJlbGVhc2Ugbm90ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBSZWxlYXNlIG5vdGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNocm9tZWRyaXZlclxuICAgKiBAcmV0dXJucyB7QWRkaXRpb25hbERyaXZlckRldGFpbHN9XG4gICAqL1xuICBwYXJzZU5vdGVzIChjb250ZW50KSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gL15cXHMqWy1dK0Nocm9tZURyaXZlcltcXERdKyhbXFxkLl0rKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIHJlc3VsdC52ZXJzaW9uID0gdmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICBjb25zdCBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoID0gL15cXHMqU3VwcG9ydHMgQ2hyb21lW1xcRF0rKFxcZCspL2ltLmV4ZWMoY29udGVudCk7XG4gICAgaWYgKG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2gpIHtcbiAgICAgIHJlc3VsdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2hbMV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWRzIGNocm9tZWRyaXZlciByZWxlYXNlIG5vdGVzIGFuZCBwdXRzIHRoZW1cbiAgICogaW50byB0aGUgZGljdGlvbmFyeSBhcmd1bWVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHJpdmVyS2V5IC0gRHJpdmVyIHZlcnNpb24gcGx1cyBhcmNoaXZlIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vdGVzVXJsIC0gVGhlIFVSTCBvZiBjaHJvbWVkcml2ZXIgbm90ZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IGluZm9EaWN0IC0gVGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyBkcml2ZXIgaW5mby5cbiAgICogVGhlIG1ldGhvZCBjYWxsIG11dGF0ZXMgYnkgbWVyZ2luZyBgQWRkaXRpb25hbERyaXZlckRldGFpbHNgXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgcmVsZWFzZSBub3RlcyBjYW5ub3QgYmUgZG93bmxvYWRlZFxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVBZGRpdGlvbmFsRHJpdmVySW5mbyAoZHJpdmVyS2V5LCBub3Rlc1VybCwgaW5mb0RpY3QpIHtcbiAgICBjb25zdCBub3RlcyA9IGF3YWl0IHJldHJpZXZlRGF0YShub3Rlc1VybCwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJyovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgeyBtaW5Ccm93c2VyVmVyc2lvbiB9ID0gdGhpcy5wYXJzZU5vdGVzKG5vdGVzKTtcbiAgICBpZiAoIW1pbkJyb3dzZXJWZXJzaW9uKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZSBkcml2ZXIgJyR7ZHJpdmVyS2V5fScgZG9lcyBub3QgY29udGFpbiB2YWxpZCByZWxlYXNlIG5vdGVzIGF0ICR7bm90ZXNVcmx9LiBgICtcbiAgICAgICAgYFNraXBwaW5nIGl0YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluZm9EaWN0Lm1pbkJyb3dzZXJWZXJzaW9uID0gbWluQnJvd3NlclZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGNocm9tZWRyaXZlciBzdG9yYWdlIFhNTCBhbmQgc3RvcmVzXG4gICAqIHRoZSBwYXJzZWQgcmVzdWx0cyBpbnRvIGB0aGlzLm1hcHBpbmdgXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRG9jdW1lbnR9IGRvYyAtIFRoZSBET00gcmVwcmVzZW50YXRpb25cbiAgICogb2YgdGhlIGNocm9tZWRyaXZlciBzdG9yYWdlIFhNTFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFBhcnNlTm90ZXMgW3RydWVdIC0gSWYgc2V0IHRvIGB0cnVlYFxuICAgKiB0aGVuIGFkZGl0aW9uYWwgZHJpdmVycyBpbmZvcm1hdGlvbiBpcyBnb2luZyB0byBiZSBwYXJzZWRcbiAgICogYW5kIGFzc2lnbmVkIHRvIGB0aGlzLm1hcHBpbmdgXG4gICAqL1xuICBhc3luYyBwYXJzZVN0b3JhZ2VYbWwgKGRvYywgc2hvdWxkUGFyc2VOb3RlcyA9IHRydWUpIHtcbiAgICBjb25zdCBkcml2ZXJOb2RlcyA9IHhwYXRoLnNlbGVjdChgLy8qW2xvY2FsLW5hbWUoLik9J0NvbnRlbnRzJ11gLCBkb2MpO1xuICAgIGxvZy5kZWJ1ZyhgUGFyc2VkICR7ZHJpdmVyTm9kZXMubGVuZ3RofSBlbnRyaWVzIGZyb20gc3RvcmFnZSBYTUxgKTtcbiAgICBpZiAoXy5pc0VtcHR5KGRyaXZlck5vZGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCBkcml2ZXJOb2RlIG9mIGRyaXZlck5vZGVzKSB7XG4gICAgICBjb25zdCBrZXkgPSBleHRyYWN0Tm9kZVRleHQoZmluZENoaWxkTm9kZShkcml2ZXJOb2RlLCAnS2V5JykpO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGtleSwgJy9jaHJvbWVkcml2ZXJfJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV0YWcgPSBleHRyYWN0Tm9kZVRleHQoZmluZENoaWxkTm9kZShkcml2ZXJOb2RlLCAnRVRhZycpKTtcbiAgICAgIGlmICghZXRhZykge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIHRoZSBjaGVja3N1bS4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNkSW5mbyA9IHtcbiAgICAgICAgdXJsOiBgJHtDRF9DRE59LyR7a2V5fWAsXG4gICAgICAgIGV0YWc6IF8udHJpbShldGFnLCAnXCInKSxcbiAgICAgICAgdmVyc2lvbjogXy5maXJzdChrZXkuc3BsaXQoJy8nKSksXG4gICAgICB9O1xuICAgICAgdGhpcy5tYXBwaW5nW2tleV0gPSBjZEluZm87XG5cbiAgICAgIGNvbnN0IG5vdGVzUGF0aCA9IGAke2NkSW5mby52ZXJzaW9ufS9ub3Rlcy50eHRgO1xuICAgICAgY29uc3QgaXNOb3Rlc1ByZXNlbnQgPSAhIWRyaXZlck5vZGVzXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgbm9kZSkgPT4gYWNjIHx8IGZpbmRDaGlsZE5vZGUobm9kZSwgJ0tleScsIG5vdGVzUGF0aCksIGZhbHNlKTtcbiAgICAgIGlmICghaXNOb3Rlc1ByZXNlbnQpIHtcbiAgICAgICAgY2RJbmZvLm1pbkJyb3dzZXJWZXJzaW9uID0gbnVsbDtcbiAgICAgICAgaWYgKHNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgVGhlIGVudHJ5ICcke2tleX0nIGRvZXMgbm90IGNvbnRhaW4gYW55IG5vdGVzLiBTa2lwcGluZyBpdGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICghc2hvdWxkUGFyc2VOb3Rlcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8oa2V5LCBgJHtDRF9DRE59LyR7bm90ZXNQYXRofWAsIGNkSW5mbykpO1xuICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCAlIE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPT09IDApIHtcbiAgICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgbG9nLmluZm8oYFRoZSB0b3RhbCBjb3VudCBvZiBlbnRyaWVzIGluIHRoZSBtYXBwaW5nOiAke18uc2l6ZSh0aGlzLm1hcHBpbmcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IERyaXZlckRldGFpbHNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCAtIFRoZSBmdWxsIHVybCB0byB0aGUgY29ycmVzcG9uZGluZyBkcml2ZXIgaW5cbiAgICogdGhlIHJlbW90ZSBzdG9yYWdlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldGFnIC0gVGhlIENSQyBvZiB0aGUgZHJpdmVyIGFyY2hpdmVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBDaHJvbWVkcml2ZXIgdmVyc2lvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gQ2hyb21lZHJpdmVyc01hcHBpbmdcbiAgICogQHByb3BlcnR5IHtEcml2ZXJEZXRhaWxzfSAtIFRoZSBrZXlzIGFyZSB1bmlxdWUgZHJpdmVyIGlkZW50aWZpZXJzXG4gICAqICh2ZXJzaW9uL2FyY2hpdmUgbmFtZSkuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBoYXZlIGBEcml2ZXJEZXRhaWxzYFxuICAgKiBjb250YWluaW5nIGNocm9tZWRyaXZlciBkZXRhaWxzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY2hyb21lZHJpdmVyIG1hcHBpbmcgZnJvbSB0aGUgc3RvcmFnZVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFBhcnNlTm90ZXMgW3RydWVdIC0gaWYgc2V0IHRvIGB0cnVlYFxuICAgKiB0aGVuIGFkZGl0aW9uYWwgY2hyb21lZHJpdmVycyBpbmZvIGlzIGdvaW5nIHRvIGJlIHJldHJpZXZlZCBhbmRcbiAgICogcGFyc2VkIGZyb20gcmVsZWFzZSBub3Rlc1xuICAgKiBAcmV0dXJucyB7Q2hyb21lZHJpdmVyc01hcHBpbmd9XG4gICAqL1xuICBhc3luYyByZXRyaWV2ZU1hcHBpbmcgKHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgeG1sID0gYXdhaXQgcmV0cmlldmVEYXRhKENEX0NETiwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL3htbCwgKi8qJyxcbiAgICB9LCB7IHRpbWVvdXQ6IHRoaXMudGltZW91dCB9KTtcbiAgICBjb25zdCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhtbCk7XG4gICAgYXdhaXQgdGhpcy5wYXJzZVN0b3JhZ2VYbWwoZG9jLCBzaG91bGRQYXJzZU5vdGVzKTtcbiAgICByZXR1cm4gXy5jbG9uZURlZXAodGhpcy5tYXBwaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBkb3dubG9hZGVkIGNocm9tZWRyaXZlciBhcmNoaXZlXG4gICAqIGludG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgLSBUaGUgc291cmNlIGFyY2hpdmUgcGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHN0IC0gVGhlIGRlc3RpbmF0aW9uIGNocm9tZWRyaXZlciBwYXRoXG4gICAqL1xuICBhc3luYyB1bnppcERyaXZlciAoc3JjLCBkc3QpIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oc3JjLCB0bXBSb290KTtcbiAgICAgIGNvbnN0IGNocm9tZWRyaXZlclBhdGggPSBhd2FpdCBmcy53YWxrRGlyKHRtcFJvb3QsIHRydWUsIChpdGVtUGF0aCwgaXNEaXJlY3RvcnkpID0+XG4gICAgICAgICFpc0RpcmVjdG9yeSAmJiBfLnRvTG93ZXIocGF0aC5wYXJzZShpdGVtUGF0aCkubmFtZSkgPT09ICdjaHJvbWVkcml2ZXInKTtcbiAgICAgIGlmICghY2hyb21lZHJpdmVyUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhcmNoaXZlIHdhcyB1bnppcHBlZCBwcm9wZXJseSwgYnV0IHdlIGNvdWxkIG5vdCBmaW5kIGFueSBjaHJvbWVkcml2ZXIgZXhlY3V0YWJsZScpO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBNb3ZpbmcgdGhlIGV4dHJhY3RlZCAnJHtwYXRoLmJhc2VuYW1lKGNocm9tZWRyaXZlclBhdGgpfScgdG8gJyR7ZHN0fSdgKTtcbiAgICAgIGF3YWl0IGZzLm12KGNocm9tZWRyaXZlclBhdGgsIGRzdCwge1xuICAgICAgICBta2RpcnA6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9TSW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBob3N0IE9TXG4gICAqIENhbiBiZSBlaXRoZXIgYG1hY2AsIGB3aW5kb3dzYCBvciBgbGludXhgXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcmNoIC0gVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgaG9zdCBPRC5cbiAgICogQ2FuIGJlIGVpdGhlciBgMzJgIG9yIGA2NGBcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBoYXJkd2FyZU5hbWUgLSBUaGUgb3V0cHV0IG9mIGB1bmFtZSAtbWAgY29tbWFuZFxuICAgKiBvbiBsaW51eCBhbmQgbWFjIHN5c3RlbXMuIGBudWxsYCBvbiBXaW5kb3dzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGB0aGlzLm1hcHBpbmdgIHRvIG9ubHkgc2VsZWN0IG1hdGNoaW5nXG4gICAqIGNocm9tZWRyaXZlciBlbnRyaWVzIGJ5IG9wZXJhdGluZyBzeXN0ZW0gaW5mb3JtYXRpb25cbiAgICogYW5kL29yIGFkZGl0aW9uYWwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMgKGlmIHByb3ZpZGVkKVxuICAgKlxuICAgKiBAcGFyYW0gez9PU0luZm99IG9zSW5mb1xuICAgKiBAcGFyYW0gez9TeW5jT3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZmlsdGVyZWQgY2hyb21lZHJpdmVyXG4gICAqIGVudHJ5IG5hbWVzICh2ZXJzaW9uL2FyY2hpdmUgbmFtZSlcbiAgICovXG4gIHNlbGVjdE1hdGNoaW5nRHJpdmVycyAob3NJbmZvLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBtaW5Ccm93c2VyVmVyc2lvbixcbiAgICAgIHZlcnNpb25zID0gW10sXG4gICAgfSA9IG9wdHM7XG4gICAgbGV0IGRyaXZlcnNUb1N5bmMgPSBfLmtleXModGhpcy5tYXBwaW5nKTtcblxuICAgIGlmICghXy5pc0VtcHR5KHZlcnNpb25zKSkge1xuICAgICAgLy8gSGFuZGxlIG9ubHkgc2VsZWN0ZWQgdmVyc2lvbnMgaWYgcmVxdWVzdGVkXG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHZlcnNpb25zIG1hdGNoIHRvICR7dmVyc2lvbnN9YCk7XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luY1xuICAgICAgICAuZmlsdGVyKChjZE5hbWUpID0+IHZlcnNpb25zLmluY2x1ZGVzKGAke3RoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb259YCkpO1xuXG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihtaW5Ccm93c2VyVmVyc2lvbikpIHtcbiAgICAgIC8vIE9ubHkgc2VsZWN0IGRyaXZlcnMgdGhhdCBzdXBwb3J0IHRoZSBjdXJyZW50IGJyb3dzZXIgd2hvc2UgbWFqb3IgdmVyc2lvbiBudW1iZXIgZXF1YWxzIHRvIGBtaW5Ccm93c2VyVmVyc2lvbmBcbiAgICAgIGNvbnN0IG1pbkJyb3dzZXJWZXJzaW9uSW50ID0gcGFyc2VJbnQobWluQnJvd3NlclZlcnNpb24sIDEwKTtcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgbWluaW11bSBzdXBwb3J0ZWQgYnJvd3NlciB2ZXJzaW9uIG1hdGNoZXMgdG8gJHttaW5Ccm93c2VyVmVyc2lvbkludH1gKTtcbiAgICAgIGxldCBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSAwO1xuICAgICAgLy8gU2VsZWN0IHRoZSBuZXdlc3QgYXZhaWxhYmxlIGFuZCBjb21wYXRpYmxlIGNocm9tZWRyaXZlclxuICAgICAgZm9yIChjb25zdCBjZE5hbWUgb2YgZHJpdmVyc1RvU3luYykge1xuICAgICAgICBjb25zdCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24gPSBwYXJzZUludCh0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbilcbiAgICAgICAgICAgICYmIGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA8PSBtaW5Ccm93c2VyVmVyc2lvbkludFxuICAgICAgICAgICAgJiYgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDwgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKSB7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID0gY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luYy5maWx0ZXIoKGNkTmFtZSkgPT4gYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0ubWluQnJvd3NlclZlcnNpb259YCA9PT1cbiAgICAgICAgYCR7Y2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID4gMCA/IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA6IG1pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuXG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFdpbGwgc2VsZWN0IGNhbmRpZGF0ZSAke3V0aWwucGx1cmFsaXplKCdkcml2ZXInLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCl9IGAgK1xuICAgICAgICBgdmVyc2lvbmVkIGFzICcke18udW5pcShkcml2ZXJzVG9TeW5jLm1hcCgoY2ROYW1lKSA9PiB0aGlzLm1hcHBpbmdbY2ROYW1lXS52ZXJzaW9uKSl9J2ApO1xuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KG9zSW5mbykpIHtcbiAgICAgIC8vIEZpbHRlciBvdXQgZHJpdmVycyBmb3IgdW5zdXBwb3J0ZWQgc3lzdGVtIGFyY2hpdGVjdHVyZXNcbiAgICAgIGxldCB7bmFtZSwgYXJjaCwgaGFyZHdhcmVOYW1lfSA9IG9zSW5mbztcbiAgICAgIGlmIChhcmNoID09PSBYNjQgJiYgIWRyaXZlcnNUb1N5bmMuc29tZSgoY2ROYW1lKSA9PiBjZE5hbWUuaW5jbHVkZXMoYF8ke25hbWV9JHtYNjR9YCkpKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB4ODYgYnVpbGQgaWYgeDY0IG9uZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gT1NcbiAgICAgICAgYXJjaCA9IFg4NjtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBPUy5tYWMgJiYgXy5pbmNsdWRlcyhoYXJkd2FyZU5hbWUsICdhcm0nKVxuICAgICAgICAgICYmIGRyaXZlcnNUb1N5bmMuc29tZSgoY2ROYW1lKSA9PiBjZE5hbWUuaW5jbHVkZXMoTTFfQVJDSF9TVUZGSVgpKSkge1xuICAgICAgICAvLyBwcmVmZXIgZXhlY3V0YWJsZSBmb3IgTTEgYXJjaCBpZiBwcmVzZW50XG4gICAgICAgIGFyY2ggKz0gTTFfQVJDSF9TVUZGSVg7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHBsYXRmb3JtIG1hdGNoZXMgdG8gJHtuYW1lfSR7YXJjaH1gKTtcbiAgICAgIGNvbnN0IHBsYXRmb3JtUmUgPSBuZXcgUmVnRXhwKGAoXFxcXGJ8Xykke25hbWV9JHthcmNofVxcXFxiYCk7XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luYy5maWx0ZXIoKGNkTmFtZSkgPT4gcGxhdGZvcm1SZS50ZXN0KGNkTmFtZSkpO1xuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZHJpdmVyc1RvU3luYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGdpdmVuIGNocm9tZWRyaXZlciBmcm9tIHRoZSBzdG9yYWdlXG4gICAqIGFuZCB1bnBhY2tzIGl0IGludG8gYHRoaXMuY2hyb21lZHJpdmVyRGlyYCBmb2xkZXJcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHVuaXF1ZSBkcml2ZXIgaW5kZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIFRoZSBkcml2ZXIga2V5IGluIGB0aGlzLm1hcHBpbmdgXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlc1Jvb3QgLSBUaGUgdGVtcG9yYXJ5IGZvbGRlciBwYXRoIHRvIGV4dHJhY3RcbiAgICogZG93bmxvYWRlZCBhcmNoaXZlcyB0b1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3RyaWN0IFt0cnVlXSAtIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgKGB0cnVlYClcbiAgICogb3IgcmV0dXJuIGEgYm9vbGVhbiByZXN1bHQgaWYgdGhlIGRyaXZlciByZXRyaWV2YWwgcHJvY2VzcyBmYWlsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSBkcml2ZXJcbiAgICogYW5kIGBpc1N0cmljdGAgaXMgc2V0IHRvIGB0cnVlYFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgYHRydWVgIHRoZW4gdGhlIGNocm9tZWRyaXZlciBpcyBzdWNjZXNzZnVsbHlcbiAgICogZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkLlxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVEcml2ZXIgKGluZGV4LCBkcml2ZXJLZXksIGFyY2hpdmVzUm9vdCwgaXNTdHJpY3QgPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdXJsLCBldGFnLCB2ZXJzaW9uIH0gPSB0aGlzLm1hcHBpbmdbZHJpdmVyS2V5XTtcbiAgICBjb25zdCBhcmNoaXZlUGF0aCA9IHBhdGgucmVzb2x2ZShhcmNoaXZlc1Jvb3QsIGAke2luZGV4fS56aXBgKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgJyR7dXJsfScgdG8gJyR7YXJjaGl2ZVBhdGh9J2ApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXQuZG93bmxvYWRGaWxlKHVybCwgYXJjaGl2ZVBhdGgsIHtcbiAgICAgICAgaXNNZXRlcmVkOiBmYWxzZSxcbiAgICAgICAgdGltZW91dDogVElNRU9VVF9NU1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbXNnID0gYENhbm5vdCBkb3dubG9hZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWA7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IobXNnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFhd2FpdCBpc0NyY09rKGFyY2hpdmVQYXRoLCBldGFnKSkge1xuICAgICAgY29uc3QgbXNnID0gYFRoZSBjaGVja3N1bSBmb3IgdGhlIGRvd25sb2FkZWQgY2hyb21lZHJpdmVyICcke2RyaXZlcktleX0nIGRpZCBub3QgbWF0Y2hgO1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7cGF0aC5wYXJzZSh1cmwpLm5hbWV9X3Yke3ZlcnNpb259YCArXG4gICAgICAoc3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJycpO1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5jaHJvbWVkcml2ZXJEaXIsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51bnppcERyaXZlcihhcmNoaXZlUGF0aCwgdGFyZ2V0UGF0aCk7XG4gICAgICBhd2FpdCBmcy5jaG1vZCh0YXJnZXRQYXRoLCAwbzc1NSk7XG4gICAgICBsb2cuZGVidWcoYFBlcm1pc3Npb25zIG9mIHRoZSBmaWxlICcke3RhcmdldFBhdGh9JyBoYXZlIGJlZW4gY2hhbmdlZCB0byA3NTVgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBTeW5jT3B0aW9uc1xuICAgKiBAcHJvcGVydHkge0FycmF5PFN0cmluZz59IHZlcnNpb25zIC0gVGhlIGxpc3Qgb2YgY2hyb21lZHJpdmVyXG4gICAqIHZlcnNpb25zIHRvIHN5bmMuIElmIGVtcHR5ICh0aGUgZGVmYXVsdCB2YWx1ZSkgdGhlbiBhbGwgYXZhaWxhYmxlXG4gICAqIGNocm9tZWRyaXZlcnMgYXJlIGdvaW5nIHRvIGJlIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZFxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IG1pbkJyb3dzZXJWZXJzaW9uIC0gVGhlIG1pbnVtdW0gc3VwcG9ydGVkXG4gICAqIENocm9tZSB2ZXJzaW9uIHRoYXQgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXJzIHNob3VsZCBzdXBwb3J0LiBDYW4gbWF0Y2hcbiAgICogbXVsdGlwbGUgZHJpdmVycy5cbiAgICogQHByb3BlcnR5IHs/T1NJbmZvfSBvc0luZm8gLSBTeXN0ZW0gaW5mb3JtYXRpb24gdXNlZCB0byBmaWx0ZXIgb3V0XG4gICAqIHRoZSBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgZHJpdmVycy4gSWYgbm90IHByb3ZpZGVkIHRoZW4gdGhlIHNjcmlwdFxuICAgKiB3aWxsIHRyeSB0byByZXRyaWV2ZSBpdC5cbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBjaHJvbWVkcml2ZXJzIGZyb20gdGhlIHJlbW90ZSBzdG9yYWdlXG4gICAqIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbVxuICAgKlxuICAgKiBAcGFyYW0gez9TeW5jT3B0aW9uc30gb3B0c1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aGlsZSByZXRyaWV2aW5nXG4gICAqIHRoZSBkcml2ZXJzXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmd9IFRoZSBsaXN0IG9mIHN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQgZHJpdmVyIGtleXNcbiAgICovXG4gIGFzeW5jIHN5bmNEcml2ZXJzIChvcHRzID0ge30pIHtcbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMubWFwcGluZykpIHtcbiAgICAgIGF3YWl0IHRoaXMucmV0cmlldmVNYXBwaW5nKCEhb3B0cy5taW5Ccm93c2VyVmVyc2lvbik7XG4gICAgfVxuICAgIGlmIChfLmlzRW1wdHkodGhpcy5tYXBwaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmV0cmlldmUgY2hyb21lZHJpdmVycyBtYXBwaW5nIGZyb20gR29vZ2xlIHN0b3JhZ2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkcml2ZXJzVG9TeW5jID0gdGhpcy5zZWxlY3RNYXRjaGluZ0RyaXZlcnMob3B0cy5vc0luZm8gPz8gYXdhaXQgZ2V0T3NJbmZvKCksIG9wdHMpO1xuICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlcmUgYXJlIG5vIGRyaXZlcnMgdG8gc3luYy4gRXhpdGluZ2ApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdkcml2ZXInLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9IHRvIHN5bmM6IGAgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkoZHJpdmVyc1RvU3luYywgbnVsbCwgMikpO1xuXG4gICAgY29uc3Qgc3luY2hyb25pemVkRHJpdmVycyA9IFtdO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgY29uc3QgYXJjaGl2ZXNSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgW2lkeCwgZHJpdmVyS2V5XSBvZiBkcml2ZXJzVG9TeW5jLmVudHJpZXMoKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKGF3YWl0IHRoaXMucmV0cmlldmVEcml2ZXIoaWR4LCBkcml2ZXJLZXksIGFyY2hpdmVzUm9vdCwgIV8uaXNFbXB0eShvcHRzKSkpIHtcbiAgICAgICAgICAgIHN5bmNocm9uaXplZERyaXZlcnMucHVzaChkcml2ZXJLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKSk7XG5cbiAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCAlIE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPT09IDApIHtcbiAgICAgICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKGFyY2hpdmVzUm9vdCk7XG4gICAgfVxuICAgIGlmICghXy5pc0VtcHR5KHN5bmNocm9uaXplZERyaXZlcnMpKSB7XG4gICAgICBsb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHN5bmNocm9uaXplZCBgICtcbiAgICAgICAgYCR7dXRpbC5wbHVyYWxpemUoJ2Nocm9tZWRyaXZlcicsIHN5bmNocm9uaXplZERyaXZlcnMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oYE5vIGNocm9tZWRyaXZlcnMgd2VyZSBzeW5jaHJvbml6ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN5bmNocm9uaXplZERyaXZlcnM7XG4gIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50O1xuIl0sImZpbGUiOiJsaWIvc3RvcmFnZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -17,7 +17,7 @@ require("source-map-support/register");
17
17
 
18
18
  var _lodash = _interopRequireDefault(require("lodash"));
19
19
 
20
- var _appiumSupport = require("appium-support");
20
+ var _support = require("@appium/support");
21
21
 
22
22
  var _path = _interopRequireDefault(require("path"));
23
23
 
@@ -76,7 +76,7 @@ function getChromedriverDir(osName = getOsName()) {
76
76
  async function getChromedriverBinaryPath(osName = getOsName()) {
77
77
  const rootDir = getChromedriverDir(osName);
78
78
  const pathSuffix = osName === OS.windows ? '.exe' : '';
79
- const paths = await _appiumSupport.fs.glob(`${CD_EXECUTABLE_PREFIX}*${pathSuffix}`, {
79
+ const paths = await _support.fs.glob(`${CD_EXECUTABLE_PREFIX}*${pathSuffix}`, {
80
80
  cwd: rootDir,
81
81
  absolute: true,
82
82
  nocase: true,
@@ -100,11 +100,11 @@ async function retrieveData(url, headers, opts = {}) {
100
100
  }
101
101
 
102
102
  const getOsName = _lodash.default.memoize(function getOsName() {
103
- if (_appiumSupport.system.isWindows()) {
103
+ if (_support.system.isWindows()) {
104
104
  return OS.windows;
105
105
  }
106
106
 
107
- if (_appiumSupport.system.isMac()) {
107
+ if (_support.system.isMac()) {
108
108
  return OS.mac;
109
109
  }
110
110
 
@@ -116,12 +116,12 @@ exports.getOsName = getOsName;
116
116
  const getOsInfo = _lodash.default.memoize(async function getOsInfo() {
117
117
  return {
118
118
  name: getOsName(),
119
- arch: await _appiumSupport.system.arch(),
120
- hardwareName: _appiumSupport.system.isWindows() ? null : _lodash.default.trim(await (0, _teen_process.exec)('uname', ['-m']))
119
+ arch: await _support.system.arch(),
120
+ hardwareName: _support.system.isWindows() ? null : _lodash.default.trim(await (0, _teen_process.exec)('uname', ['-m']))
121
121
  };
122
122
  });
123
123
 
124
124
  exports.getOsInfo = getOsInfo;require('source-map-support').install();
125
125
 
126
126
 
127
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJyb290RGlyIiwicGF0aCIsImJhc2VuYW1lIiwiX19kaXJuYW1lIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJOT19QUkVDT01QSUxFIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwicmVxdWlyZSIsIkNEX1ZFUiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb24iLCJDSFJPTUVEUklWRVJfVkVSU0lPTiIsImdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIiLCJDRF9CQVNFX0RJUiIsIkNEX0NETiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX2NkbnVybCIsIkNIUk9NRURSSVZFUl9DRE5VUkwiLCJPUyIsImxpbnV4Iiwid2luZG93cyIsIm1hYyIsIlg2NCIsIlg4NiIsIk0xX0FSQ0hfU1VGRklYIiwiQ0RfRVhFQ1VUQUJMRV9QUkVGSVgiLCJtYXBwaW5nIiwiXyIsImlzRW1wdHkiLCJFcnJvciIsImxhc3QiLCJrZXlzIiwic29ydCIsImNvbXBhcmVWZXJzaW9ucyIsImdldENocm9tZVZlcnNpb24iLCJhZGIiLCJidW5kbGVJZCIsInZlcnNpb25OYW1lIiwiZ2V0UGFja2FnZUluZm8iLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJvc05hbWUiLCJnZXRPc05hbWUiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwicGF0aFN1ZmZpeCIsInBhdGhzIiwiZnMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJub2Nhc2UiLCJub2RpciIsInN0cmljdCIsImZpcnN0IiwicmV0cmlldmVEYXRhIiwidXJsIiwiaGVhZGVycyIsIm9wdHMiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwiZGF0YSIsIm1lbW9pemUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJpc01hYyIsImdldE9zSW5mbyIsIm5hbWUiLCJhcmNoIiwiaGFyZHdhcmVOYW1lIiwidHJpbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7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b3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHN5c3RlbSwgZnMgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBjb21wYXJlVmVyc2lvbnMgZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5cblxuY29uc3Qgcm9vdERpciA9IHBhdGguYmFzZW5hbWUoX19kaXJuYW1lKSA9PT0gJ2xpYidcbiAgPyBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBwcm9jZXNzLmVudi5OT19QUkVDT01QSUxFID8gJy4uJyA6ICcuLi8uLicpXG4gIDogX19kaXJuYW1lO1xuLy8gQ2hyb21lZHJpdmVyIHZlcnNpb246IG1pbmltdW0gQ2hyb21lIHZlcnNpb25cbmNvbnN0IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyA9IHJlcXVpcmUocGF0aC5yZXNvbHZlKHJvb3REaXIsICdjb25maWcnLCAnbWFwcGluZy5qc29uJykpO1xuXG5jb25zdCBDRF9WRVIgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2Nocm9tZWRyaXZlcl92ZXJzaW9uXG4gIHx8IHByb2Nlc3MuZW52LkNIUk9NRURSSVZFUl9WRVJTSU9OXG4gIHx8IGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIoKTtcbmNvbnN0IENEX0JBU0VfRElSID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ2Nocm9tZWRyaXZlcicpO1xuY29uc3QgQ0RfQ0ROID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfY2RudXJsXG4gIHx8IHByb2Nlc3MuZW52LkNIUk9NRURSSVZFUl9DRE5VUkxcbiAgfHwgJ2h0dHBzOi8vY2hyb21lZHJpdmVyLnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20nO1xuY29uc3QgT1MgPSB7XG4gIGxpbnV4OiAnbGludXgnLFxuICB3aW5kb3dzOiAnd2luJyxcbiAgbWFjOiAnbWFjJ1xufTtcbmNvbnN0IFg2NCA9ICc2NCc7XG5jb25zdCBYODYgPSAnMzInO1xuY29uc3QgTTFfQVJDSF9TVUZGSVggPSAnX20xJztcbmNvbnN0IENEX0VYRUNVVEFCTEVfUFJFRklYID0gJ2Nocm9tZWRyaXZlcic7XG5cblxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlciAobWFwcGluZyA9IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORykge1xuICBpZiAoXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uIGZyb20gZW1wdHkgbWFwcGluZycpO1xuICB9XG4gIHJldHVybiBfLmxhc3QoXy5rZXlzKG1hcHBpbmcpLnNvcnQoY29tcGFyZVZlcnNpb25zKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZVZlcnNpb24gKGFkYiwgYnVuZGxlSWQpIHtcbiAgY29uc3Qge3ZlcnNpb25OYW1lfSA9IGF3YWl0IGFkYi5nZXRQYWNrYWdlSW5mbyhidW5kbGVJZCk7XG4gIHJldHVybiB2ZXJzaW9uTmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyRGlyIChvc05hbWUgPSBnZXRPc05hbWUoKSkge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKENEX0JBU0VfRElSLCBvc05hbWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIChvc05hbWUgPSBnZXRPc05hbWUoKSkge1xuICBjb25zdCByb290RGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKG9zTmFtZSk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSBvc05hbWUgPT09IE9TLndpbmRvd3MgPyAnLmV4ZScgOiAnJztcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBmcy5nbG9iKGAke0NEX0VYRUNVVEFCTEVfUFJFRklYfSoke3BhdGhTdWZmaXh9YCwge1xuICAgIGN3ZDogcm9vdERpcixcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICBub2Nhc2U6IHRydWUsXG4gICAgbm9kaXI6IHRydWUsXG4gICAgc3RyaWN0OiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiBfLmlzRW1wdHkocGF0aHMpXG4gICAgPyBwYXRoLnJlc29sdmUocm9vdERpciwgYCR7Q0RfRVhFQ1VUQUJMRV9QUkVGSVh9JHtwYXRoU3VmZml4fWApXG4gICAgOiBfLmZpcnN0KHBhdGhzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVEYXRhICh1cmwsIGhlYWRlcnMsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdGltZW91dCA9IDUwMDAsXG4gICAgcmVzcG9uc2VUeXBlID0gJ3RleHQnLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsLFxuICAgIGhlYWRlcnMsXG4gICAgdGltZW91dCxcbiAgICByZXNwb25zZVR5cGUsXG4gIH0pKS5kYXRhO1xufVxuXG5jb25zdCBnZXRPc05hbWUgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0T3NOYW1lICgpIHtcbiAgaWYgKHN5c3RlbS5pc1dpbmRvd3MoKSkge1xuICAgIHJldHVybiBPUy53aW5kb3dzO1xuICB9XG4gIGlmIChzeXN0ZW0uaXNNYWMoKSkge1xuICAgIHJldHVybiBPUy5tYWM7XG4gIH1cbiAgcmV0dXJuIE9TLmxpbnV4O1xufSk7XG5cbmNvbnN0IGdldE9zSW5mbyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRPc0luZm8gKCkge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGdldE9zTmFtZSgpLFxuICAgIGFyY2g6IGF3YWl0IHN5c3RlbS5hcmNoKCksXG4gICAgaGFyZHdhcmVOYW1lOiBzeXN0ZW0uaXNXaW5kb3dzKCkgPyBudWxsIDogXy50cmltKGF3YWl0IGV4ZWMoJ3VuYW1lJywgWyctbSddKSksXG4gIH07XG59KTtcblxuXG5leHBvcnQge1xuICBnZXRDaHJvbWVWZXJzaW9uLCBnZXRDaHJvbWVkcml2ZXJEaXIsIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIGdldE9zTmFtZSxcbiAgQ0RfQkFTRV9ESVIsIENEX0NETiwgQ0RfVkVSLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsIGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIsXG4gIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBPUywgWDY0LCBYODYsIE0xX0FSQ0hfU1VGRklYLFxufTtcbiJdLCJmaWxlIjoibGliL3V0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
127
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJyb290RGlyIiwicGF0aCIsImJhc2VuYW1lIiwiX19kaXJuYW1lIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJOT19QUkVDT01QSUxFIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwicmVxdWlyZSIsIkNEX1ZFUiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb24iLCJDSFJPTUVEUklWRVJfVkVSU0lPTiIsImdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIiLCJDRF9CQVNFX0RJUiIsIkNEX0NETiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX2NkbnVybCIsIkNIUk9NRURSSVZFUl9DRE5VUkwiLCJPUyIsImxpbnV4Iiwid2luZG93cyIsIm1hYyIsIlg2NCIsIlg4NiIsIk0xX0FSQ0hfU1VGRklYIiwiQ0RfRVhFQ1VUQUJMRV9QUkVGSVgiLCJtYXBwaW5nIiwiXyIsImlzRW1wdHkiLCJFcnJvciIsImxhc3QiLCJrZXlzIiwic29ydCIsImNvbXBhcmVWZXJzaW9ucyIsImdldENocm9tZVZlcnNpb24iLCJhZGIiLCJidW5kbGVJZCIsInZlcnNpb25OYW1lIiwiZ2V0UGFja2FnZUluZm8iLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJvc05hbWUiLCJnZXRPc05hbWUiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwicGF0aFN1ZmZpeCIsInBhdGhzIiwiZnMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJub2Nhc2UiLCJub2RpciIsInN0cmljdCIsImZpcnN0IiwicmV0cmlldmVEYXRhIiwidXJsIiwiaGVhZGVycyIsIm9wdHMiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwiZGF0YSIsIm1lbW9pemUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJpc01hYyIsImdldE9zSW5mbyIsIm5hbWUiLCJhcmNoIiwiaGFyZHdhcmVOYW1lIiwidHJpbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7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cnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBjb21wYXJlVmVyc2lvbnMgZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5cblxuY29uc3Qgcm9vdERpciA9IHBhdGguYmFzZW5hbWUoX19kaXJuYW1lKSA9PT0gJ2xpYidcbiAgPyBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBwcm9jZXNzLmVudi5OT19QUkVDT01QSUxFID8gJy4uJyA6ICcuLi8uLicpXG4gIDogX19kaXJuYW1lO1xuLy8gQ2hyb21lZHJpdmVyIHZlcnNpb246IG1pbmltdW0gQ2hyb21lIHZlcnNpb25cbmNvbnN0IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyA9IHJlcXVpcmUocGF0aC5yZXNvbHZlKHJvb3REaXIsICdjb25maWcnLCAnbWFwcGluZy5qc29uJykpO1xuXG5jb25zdCBDRF9WRVIgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2Nocm9tZWRyaXZlcl92ZXJzaW9uXG4gIHx8IHByb2Nlc3MuZW52LkNIUk9NRURSSVZFUl9WRVJTSU9OXG4gIHx8IGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIoKTtcbmNvbnN0IENEX0JBU0VfRElSID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ2Nocm9tZWRyaXZlcicpO1xuY29uc3QgQ0RfQ0ROID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfY2RudXJsXG4gIHx8IHByb2Nlc3MuZW52LkNIUk9NRURSSVZFUl9DRE5VUkxcbiAgfHwgJ2h0dHBzOi8vY2hyb21lZHJpdmVyLnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20nO1xuY29uc3QgT1MgPSB7XG4gIGxpbnV4OiAnbGludXgnLFxuICB3aW5kb3dzOiAnd2luJyxcbiAgbWFjOiAnbWFjJ1xufTtcbmNvbnN0IFg2NCA9ICc2NCc7XG5jb25zdCBYODYgPSAnMzInO1xuY29uc3QgTTFfQVJDSF9TVUZGSVggPSAnX20xJztcbmNvbnN0IENEX0VYRUNVVEFCTEVfUFJFRklYID0gJ2Nocm9tZWRyaXZlcic7XG5cblxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlciAobWFwcGluZyA9IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORykge1xuICBpZiAoXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uIGZyb20gZW1wdHkgbWFwcGluZycpO1xuICB9XG4gIHJldHVybiBfLmxhc3QoXy5rZXlzKG1hcHBpbmcpLnNvcnQoY29tcGFyZVZlcnNpb25zKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZVZlcnNpb24gKGFkYiwgYnVuZGxlSWQpIHtcbiAgY29uc3Qge3ZlcnNpb25OYW1lfSA9IGF3YWl0IGFkYi5nZXRQYWNrYWdlSW5mbyhidW5kbGVJZCk7XG4gIHJldHVybiB2ZXJzaW9uTmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyRGlyIChvc05hbWUgPSBnZXRPc05hbWUoKSkge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKENEX0JBU0VfRElSLCBvc05hbWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIChvc05hbWUgPSBnZXRPc05hbWUoKSkge1xuICBjb25zdCByb290RGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKG9zTmFtZSk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSBvc05hbWUgPT09IE9TLndpbmRvd3MgPyAnLmV4ZScgOiAnJztcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBmcy5nbG9iKGAke0NEX0VYRUNVVEFCTEVfUFJFRklYfSoke3BhdGhTdWZmaXh9YCwge1xuICAgIGN3ZDogcm9vdERpcixcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICBub2Nhc2U6IHRydWUsXG4gICAgbm9kaXI6IHRydWUsXG4gICAgc3RyaWN0OiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiBfLmlzRW1wdHkocGF0aHMpXG4gICAgPyBwYXRoLnJlc29sdmUocm9vdERpciwgYCR7Q0RfRVhFQ1VUQUJMRV9QUkVGSVh9JHtwYXRoU3VmZml4fWApXG4gICAgOiBfLmZpcnN0KHBhdGhzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVEYXRhICh1cmwsIGhlYWRlcnMsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdGltZW91dCA9IDUwMDAsXG4gICAgcmVzcG9uc2VUeXBlID0gJ3RleHQnLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsLFxuICAgIGhlYWRlcnMsXG4gICAgdGltZW91dCxcbiAgICByZXNwb25zZVR5cGUsXG4gIH0pKS5kYXRhO1xufVxuXG5jb25zdCBnZXRPc05hbWUgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0T3NOYW1lICgpIHtcbiAgaWYgKHN5c3RlbS5pc1dpbmRvd3MoKSkge1xuICAgIHJldHVybiBPUy53aW5kb3dzO1xuICB9XG4gIGlmIChzeXN0ZW0uaXNNYWMoKSkge1xuICAgIHJldHVybiBPUy5tYWM7XG4gIH1cbiAgcmV0dXJuIE9TLmxpbnV4O1xufSk7XG5cbmNvbnN0IGdldE9zSW5mbyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRPc0luZm8gKCkge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGdldE9zTmFtZSgpLFxuICAgIGFyY2g6IGF3YWl0IHN5c3RlbS5hcmNoKCksXG4gICAgaGFyZHdhcmVOYW1lOiBzeXN0ZW0uaXNXaW5kb3dzKCkgPyBudWxsIDogXy50cmltKGF3YWl0IGV4ZWMoJ3VuYW1lJywgWyctbSddKSksXG4gIH07XG59KTtcblxuXG5leHBvcnQge1xuICBnZXRDaHJvbWVWZXJzaW9uLCBnZXRDaHJvbWVkcml2ZXJEaXIsIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIGdldE9zTmFtZSxcbiAgQ0RfQkFTRV9ESVIsIENEX0NETiwgQ0RfVkVSLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsIGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIsXG4gIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBPUywgWDY0LCBYODYsIE0xX0FSQ0hfU1VGRklYLFxufTtcbiJdLCJmaWxlIjoibGliL3V0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -1,4 +1,9 @@
1
1
  {
2
+ "100.0.4896.60": "100.0.4896.60",
3
+ "99.0.4844.51": "99.0.4844.51",
4
+ "98.0.4758.102": "98.0.4758.102",
5
+ "98.0.4758.80": "98.0.4758.80",
6
+ "97.0.4692.71": "97.0.4692.71",
2
7
  "96.0.4664.45": "96.0.4664.45",
3
8
  "95.0.4638.69": "95.0.4638.69",
4
9
  "95.0.4638.54": "95.0.4638.54",
@@ -1,9 +1,9 @@
1
1
  // transpile:main
2
2
 
3
3
  import events from 'events';
4
- import { JWProxy, PROTOCOLS } from 'appium-base-driver';
4
+ import { JWProxy, PROTOCOLS } from '@appium/base-driver';
5
5
  import cp from 'child_process';
6
- import { system, fs, logger, util } from 'appium-support';
6
+ import { system, fs, logger, util } from '@appium/support';
7
7
  import { retryInterval, asyncmap } from 'asyncbox';
8
8
  import { SubProcess, exec } from 'teen_process';
9
9
  import B from 'bluebird';
@@ -69,7 +69,10 @@ class Chromedriver extends events.EventEmitter {
69
69
  this.bundleId = bundleId;
70
70
  this.executableVerified = false;
71
71
  this.state = Chromedriver.STATE_STOPPED;
72
- this.jwproxy = new JWProxy({server: this.proxyHost, port: this.proxyPort});
72
+ this.jwproxy = new JWProxy({
73
+ server: this.proxyHost,
74
+ port: this.proxyPort
75
+ });
73
76
  this.verbose = verbose;
74
77
  this.logPath = logPath;
75
78
  this.disableBuildCheck = !!disableBuildCheck;
@@ -432,7 +435,7 @@ class Chromedriver extends events.EventEmitter {
432
435
  this.changeState(Chromedriver.STATE_STARTING);
433
436
  }
434
437
 
435
- const args = ['--url-base=wd/hub', `--port=${this.proxyPort}`];
438
+ const args = [`--port=${this.proxyPort}`];
436
439
  if (this.adb && this.adb.adbPort) {
437
440
  args.push(`--adb-port=${this.adb.adbPort}`);
438
441
  }
@@ -598,14 +601,18 @@ class Chromedriver extends events.EventEmitter {
598
601
  if (emitStates) {
599
602
  this.changeState(Chromedriver.STATE_STOPPING);
600
603
  }
601
- try {
602
- await this.jwproxy.command('', 'DELETE');
603
- await this.proc.stop('SIGTERM', 20000);
604
- if (emitStates) {
605
- this.changeState(Chromedriver.STATE_STOPPED);
604
+ const runSafeStep = async (f) => {
605
+ try {
606
+ return await f();
607
+ } catch (e) {
608
+ log.warn(e.message);
609
+ log.debug(e.stack);
606
610
  }
607
- } catch (e) {
608
- log.error(e);
611
+ };
612
+ await runSafeStep(() => this.jwproxy.command('', 'DELETE'));
613
+ await runSafeStep(() => this.proc.stop('SIGTERM', 20000));
614
+ if (emitStates) {
615
+ this.changeState(Chromedriver.STATE_STOPPED);
609
616
  }
610
617
  }
611
618
 
package/lib/install.js CHANGED
@@ -1,4 +1,4 @@
1
- import { fs, mkdirp } from 'appium-support';
1
+ import { fs, mkdirp } from '@appium/support';
2
2
  import ChromedriverStorageClient from './storage-client';
3
3
  import {
4
4
  CD_CDN, CD_VER, retrieveData, getOsInfo, getChromedriverDir,
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { isStandardCap } from 'appium-base-driver';
2
+ import { isStandardCap } from '@appium/base-driver';
3
3
 
4
4
  const W3C_PREFIX = 'goog:';
5
5
 
@@ -7,7 +7,7 @@ import xpath from 'xpath';
7
7
  import { DOMParser } from '@xmldom/xmldom';
8
8
  import B from 'bluebird';
9
9
  import path from 'path';
10
- import { system, fs, logger, tempDir, zip, util, net } from 'appium-support';
10
+ import { system, fs, logger, tempDir, zip, util, net } from '@appium/support';
11
11
 
12
12
 
13
13
  const TIMEOUT_MS = 15000;
package/lib/utils.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { system, fs } from 'appium-support';
2
+ import { system, fs } from '@appium/support';
3
3
  import path from 'path';
4
4
  import compareVersions from 'compare-versions';
5
5
  import axios from 'axios';
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "chrome",
7
7
  "android"
8
8
  ],
9
- "version": "4.28.0",
9
+ "version": "5.0.2",
10
10
  "author": "appium",
11
11
  "license": "Apache-2.0",
12
12
  "repository": {
@@ -35,15 +35,15 @@
35
35
  "config/mapping.json"
36
36
  ],
37
37
  "dependencies": {
38
+ "@appium/base-driver": "^8.0.0",
39
+ "@appium/support": "^2.55.3",
38
40
  "@babel/runtime": "^7.0.0",
39
41
  "@xmldom/xmldom": "^0.x",
40
- "appium-base-driver": "^7.1.0",
41
- "appium-support": "^2.46.0",
42
42
  "asyncbox": "^2.0.2",
43
43
  "axios": "^0.x",
44
44
  "bluebird": "^3.5.1",
45
45
  "compare-versions": "^3.4.0",
46
- "fancy-log": "^1.3.2",
46
+ "fancy-log": "^2.0.0",
47
47
  "lodash": "^4.17.4",
48
48
  "semver": "^7.0.0",
49
49
  "source-map-support": "^0.x",
@@ -71,13 +71,16 @@
71
71
  "lint:fix": "gulp lint --fix"
72
72
  },
73
73
  "devDependencies": {
74
- "appium-gulp-plugins": "^5.4.0",
74
+ "@appium/gulp-plugins": "^6.0.0",
75
+ "@appium/eslint-config-appium": "^5.0.0",
76
+ "@appium/test-support": "^1.0.0",
77
+ "@babel/core": "^7.16.0",
78
+ "@babel/eslint-parser": "^7.16.3",
75
79
  "chai": "^4.1.2",
76
80
  "chai-as-promised": "^7.1.1",
77
- "eslint-config-appium": "^4.0.1",
78
81
  "gulp": "^4.0.0",
79
82
  "mocha": "^9.0.0",
80
83
  "pre-commit": "^1.1.3",
81
- "sinon": "^12.0.0"
84
+ "sinon": "^13.0.0"
82
85
  }
83
86
  }
@@ -1,82 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
-
4
- require("source-map-support/register");
5
-
6
- const fs = require('fs');
7
-
8
- const path = require('path');
9
-
10
- const log = require('fancy-log');
11
-
12
- const _ = require('lodash');
13
-
14
- const BUILD_RETRIES = 200;
15
- const BUILD_RETRY_INTERVAL = 1000;
16
- const BUILD_PATH = path.join(__dirname, 'build', 'lib', 'install.js');
17
-
18
- function waitForDeps(cb) {
19
- let i = 0;
20
-
21
- function check() {
22
- i++;
23
-
24
- try {
25
- require(BUILD_PATH);
26
-
27
- cb();
28
- } catch (err) {
29
- if (err.message.includes(`Cannot find module '${BUILD_PATH}'`)) {
30
- log.warn(`Project does not appear to be built yet. Please run 'npm run chromedriver' first.`);
31
- return cb(new Error(`Could not install module: ${err.message}`));
32
- }
33
-
34
- log.warn(`Error trying to install Chromedriver binary. Waiting ${BUILD_RETRY_INTERVAL}ms and trying again: ${err.message}`);
35
-
36
- if (i <= BUILD_RETRIES) {
37
- setTimeout(check, BUILD_RETRY_INTERVAL);
38
- } else {
39
- cb(new Error(`Could not import installation module: ${err.message}`));
40
- }
41
- }
42
- }
43
-
44
- check();
45
- }
46
-
47
- function main() {
48
- if (!_.isEmpty(process.env.APPIUM_SKIP_CHROMEDRIVER_INSTALL) || !_.isEmpty(process.env.npm_config_chromedriver_skip_install)) {
49
- log.warn(`'APPIUM_SKIP_CHROMEDRIVER_INSTALL' environment variable set, or '--chromedriver-skip-install' flag set.`);
50
- log.warn(`Skipping Chromedriver installation. Android web/hybrid testing will not be possible`);
51
- return;
52
- }
53
-
54
- waitForDeps(function wait(err) {
55
- if (err) {
56
- log.warn(`Unable to import install script: ${err.message}`);
57
- log.warn(`Re-run 'npm run chromedriver' manually.`);
58
- return;
59
- }
60
-
61
- fs.stat(BUILD_PATH, function installScriptExists(err) {
62
- if (err) {
63
- log.warn(`NOTE: Run 'npx gulp transpile' before using`);
64
- return;
65
- }
66
-
67
- require(BUILD_PATH).doInstall().catch(function installError(err) {
68
- log.error(`Error installing Chromedriver: ${err.message}`);
69
- log.error(err.stack ? err.stack : err);
70
- log.error(`Downloading Chromedriver can be skipped by using the ` + `'--chromedriver-skip-install' flag or ` + `setting the 'APPIUM_SKIP_CHROMEDRIVER_INSTALL' environment ` + `variable.`);
71
- process.exit(1);
72
- });
73
- });
74
- });
75
- }
76
-
77
- if (require.main === module) {
78
- main();
79
- }require('source-map-support').install();
80
-
81
-
82
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc3RhbGwtbnBtLmpzIl0sIm5hbWVzIjpbImZzIiwicmVxdWlyZSIsInBhdGgiLCJsb2ciLCJfIiwiQlVJTERfUkVUUklFUyIsIkJVSUxEX1JFVFJZX0lOVEVSVkFMIiwiQlVJTERfUEFUSCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJ3YWl0Rm9yRGVwcyIsImNiIiwiaSIsImNoZWNrIiwiZXJyIiwibWVzc2FnZSIsImluY2x1ZGVzIiwid2FybiIsIkVycm9yIiwic2V0VGltZW91dCIsIm1haW4iLCJpc0VtcHR5IiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9TS0lQX0NIUk9NRURSSVZFUl9JTlNUQUxMIiwibnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfc2tpcF9pbnN0YWxsIiwid2FpdCIsInN0YXQiLCJpbnN0YWxsU2NyaXB0RXhpc3RzIiwiZG9JbnN0YWxsIiwiY2F0Y2giLCJpbnN0YWxsRXJyb3IiLCJlcnJvciIsInN0YWNrIiwiZXhpdCIsIm1vZHVsZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBR0EsTUFBTUEsRUFBRSxHQUFHQyxPQUFPLENBQUMsSUFBRCxDQUFsQjs7QUFDQSxNQUFNQyxJQUFJLEdBQUdELE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBLE1BQU1FLEdBQUcsR0FBR0YsT0FBTyxDQUFDLFdBQUQsQ0FBbkI7O0FBQ0EsTUFBTUcsQ0FBQyxHQUFHSCxPQUFPLENBQUMsUUFBRCxDQUFqQjs7QUFVQSxNQUFNSSxhQUFhLEdBQUcsR0FBdEI7QUFDQSxNQUFNQyxvQkFBb0IsR0FBRyxJQUE3QjtBQUVBLE1BQU1DLFVBQVUsR0FBR0wsSUFBSSxDQUFDTSxJQUFMLENBQVVDLFNBQVYsRUFBcUIsT0FBckIsRUFBOEIsS0FBOUIsRUFBcUMsWUFBckMsQ0FBbkI7O0FBRUEsU0FBU0MsV0FBVCxDQUFzQkMsRUFBdEIsRUFBMEI7QUFHeEIsTUFBSUMsQ0FBQyxHQUFHLENBQVI7O0FBQ0EsV0FBU0MsS0FBVCxHQUFrQjtBQUNoQkQsSUFBQUEsQ0FBQzs7QUFDRCxRQUFJO0FBQ0ZYLE1BQUFBLE9BQU8sQ0FBQ00sVUFBRCxDQUFQOztBQUNBSSxNQUFBQSxFQUFFO0FBQ0gsS0FIRCxDQUdFLE9BQU9HLEdBQVAsRUFBWTtBQUNaLFVBQUlBLEdBQUcsQ0FBQ0MsT0FBSixDQUFZQyxRQUFaLENBQXNCLHVCQUFzQlQsVUFBVyxHQUF2RCxDQUFKLEVBQWdFO0FBQzlESixRQUFBQSxHQUFHLENBQUNjLElBQUosQ0FBVSxtRkFBVjtBQUNBLGVBQU9OLEVBQUUsQ0FBQyxJQUFJTyxLQUFKLENBQVcsNkJBQTRCSixHQUFHLENBQUNDLE9BQVEsRUFBbkQsQ0FBRCxDQUFUO0FBQ0Q7O0FBQ0RaLE1BQUFBLEdBQUcsQ0FBQ2MsSUFBSixDQUFVLHdEQUF1RFgsb0JBQXFCLHdCQUF1QlEsR0FBRyxDQUFDQyxPQUFRLEVBQXpIOztBQUNBLFVBQUlILENBQUMsSUFBSVAsYUFBVCxFQUF3QjtBQUN0QmMsUUFBQUEsVUFBVSxDQUFDTixLQUFELEVBQVFQLG9CQUFSLENBQVY7QUFDRCxPQUZELE1BRU87QUFDTEssUUFBQUEsRUFBRSxDQUFDLElBQUlPLEtBQUosQ0FBVyx5Q0FBd0NKLEdBQUcsQ0FBQ0MsT0FBUSxFQUEvRCxDQUFELENBQUY7QUFDRDtBQUNGO0FBQ0Y7O0FBQ0RGLEVBQUFBLEtBQUs7QUFDTjs7QUFFRCxTQUFTTyxJQUFULEdBQWlCO0FBRWYsTUFBSSxDQUFDaEIsQ0FBQyxDQUFDaUIsT0FBRixDQUFVQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsZ0NBQXRCLENBQUQsSUFBNEQsQ0FBQ3BCLENBQUMsQ0FBQ2lCLE9BQUYsQ0FBVUMsT0FBTyxDQUFDQyxHQUFSLENBQVlFLG9DQUF0QixDQUFqRSxFQUE4SDtBQUM1SHRCLElBQUFBLEdBQUcsQ0FBQ2MsSUFBSixDQUFVLHlHQUFWO0FBQ0FkLElBQUFBLEdBQUcsQ0FBQ2MsSUFBSixDQUFVLHFGQUFWO0FBQ0E7QUFDRDs7QUFHRFAsRUFBQUEsV0FBVyxDQUFDLFNBQVNnQixJQUFULENBQWVaLEdBQWYsRUFBb0I7QUFDOUIsUUFBSUEsR0FBSixFQUFTO0FBRVBYLE1BQUFBLEdBQUcsQ0FBQ2MsSUFBSixDQUFVLG9DQUFtQ0gsR0FBRyxDQUFDQyxPQUFRLEVBQXpEO0FBQ0FaLE1BQUFBLEdBQUcsQ0FBQ2MsSUFBSixDQUFVLHlDQUFWO0FBQ0E7QUFDRDs7QUFDRGpCLElBQUFBLEVBQUUsQ0FBQzJCLElBQUgsQ0FBUXBCLFVBQVIsRUFBb0IsU0FBU3FCLG1CQUFULENBQThCZCxHQUE5QixFQUFtQztBQUNyRCxVQUFJQSxHQUFKLEVBQVM7QUFFUFgsUUFBQUEsR0FBRyxDQUFDYyxJQUFKLENBQVUsNkNBQVY7QUFDQTtBQUNEOztBQUNEaEIsTUFBQUEsT0FBTyxDQUFDTSxVQUFELENBQVAsQ0FBb0JzQixTQUFwQixHQUFnQ0MsS0FBaEMsQ0FBc0MsU0FBU0MsWUFBVCxDQUF1QmpCLEdBQXZCLEVBQTRCO0FBQ2hFWCxRQUFBQSxHQUFHLENBQUM2QixLQUFKLENBQVcsa0NBQWlDbEIsR0FBRyxDQUFDQyxPQUFRLEVBQXhEO0FBQ0FaLFFBQUFBLEdBQUcsQ0FBQzZCLEtBQUosQ0FBVWxCLEdBQUcsQ0FBQ21CLEtBQUosR0FBWW5CLEdBQUcsQ0FBQ21CLEtBQWhCLEdBQXdCbkIsR0FBbEM7QUFDQVgsUUFBQUEsR0FBRyxDQUFDNkIsS0FBSixDQUFXLHVEQUFELEdBQ0Msd0NBREQsR0FFQyw2REFGRCxHQUdDLFdBSFg7QUFJQVYsUUFBQUEsT0FBTyxDQUFDWSxJQUFSLENBQWEsQ0FBYjtBQUNELE9BUkQ7QUFTRCxLQWZEO0FBZ0JELEdBdkJVLENBQVg7QUF3QkQ7O0FBRUQsSUFBSWpDLE9BQU8sQ0FBQ21CLElBQVIsS0FBaUJlLE1BQXJCLEVBQTZCO0FBQzNCZixFQUFBQSxJQUFJO0FBQ0wiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKiBlc2xpbnQtZGlzYWJsZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3MgKi9cblxuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGxvZyA9IHJlcXVpcmUoJ2ZhbmN5LWxvZycpO1xuY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuXG5cbi8qKlxuICogQmVjYXVzZSBvZiB0aGUgd2F5IG5wbSBsaWZlY3ljbGUgc2NyaXB0cyB3b3JrLCBvbiBhIGxvY2FsIGluc3RhbGwsIHdoZW4gdGhlXG4gKiBjb2RlIGhhcyBub3QgYmVlbiB0cmFucGlsZWQgeWV0IChpLmUuLCB0aGUgZmlyc3QgdGltZSwgb3IgYWZ0ZXIgdGhlICdidWlsZCdcbiAqIGRpcmVjdG9yeSBoYXMgYmVlbiBkZWxldGVkKSB0aGUgZG93bmxvYWQgKip3aWxsKiogZmFpbCwgYW5kICducG0gcnVuIGNocm9tZWRyaXZlcidcbiAqIHdpbGwgbmVlZCB0byBiZSBydW4uXG4gKi9cblxuY29uc3QgQlVJTERfUkVUUklFUyA9IDIwMDtcbmNvbnN0IEJVSUxEX1JFVFJZX0lOVEVSVkFMID0gMTAwMDtcblxuY29uc3QgQlVJTERfUEFUSCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdidWlsZCcsICdsaWInLCAnaW5zdGFsbC5qcycpO1xuXG5mdW5jdGlvbiB3YWl0Rm9yRGVwcyAoY2IpIHtcbiAgLy8gc2VlIGlmIHdlIGNhbiBpbXBvcnQgdGhlIG5lY2Vzc2FyeSBjb2RlXG4gIC8vIHRyeSBpdCBhIHJpZGljdWxvdXMgKGJ1dCBmaW5pdGUpIG51bWJlciBvZiB0aW1lc1xuICBsZXQgaSA9IDA7XG4gIGZ1bmN0aW9uIGNoZWNrICgpIHtcbiAgICBpKys7XG4gICAgdHJ5IHtcbiAgICAgIHJlcXVpcmUoQlVJTERfUEFUSCk7XG4gICAgICBjYigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKGBDYW5ub3QgZmluZCBtb2R1bGUgJyR7QlVJTERfUEFUSH0nYCkpIHtcbiAgICAgICAgbG9nLndhcm4oYFByb2plY3QgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGJ1aWx0IHlldC4gUGxlYXNlIHJ1biAnbnBtIHJ1biBjaHJvbWVkcml2ZXInIGZpcnN0LmApO1xuICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKGBDb3VsZCBub3QgaW5zdGFsbCBtb2R1bGU6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgfVxuICAgICAgbG9nLndhcm4oYEVycm9yIHRyeWluZyB0byBpbnN0YWxsIENocm9tZWRyaXZlciBiaW5hcnkuIFdhaXRpbmcgJHtCVUlMRF9SRVRSWV9JTlRFUlZBTH1tcyBhbmQgdHJ5aW5nIGFnYWluOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgaWYgKGkgPD0gQlVJTERfUkVUUklFUykge1xuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCBCVUlMRF9SRVRSWV9JTlRFUlZBTCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYihuZXcgRXJyb3IoYENvdWxkIG5vdCBpbXBvcnQgaW5zdGFsbGF0aW9uIG1vZHVsZTogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNoZWNrKCk7XG59XG5cbmZ1bmN0aW9uIG1haW4gKCkge1xuICAvLyBjaGVjayBpZiB3ZSBzaG91bGQgc2tpcCBpbnN0YWxsXG4gIGlmICghXy5pc0VtcHR5KHByb2Nlc3MuZW52LkFQUElVTV9TS0lQX0NIUk9NRURSSVZFUl9JTlNUQUxMKSB8fCAhXy5pc0VtcHR5KHByb2Nlc3MuZW52Lm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3NraXBfaW5zdGFsbCkpIHtcbiAgICBsb2cud2FybihgJ0FQUElVTV9TS0lQX0NIUk9NRURSSVZFUl9JTlNUQUxMJyBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQsIG9yICctLWNocm9tZWRyaXZlci1za2lwLWluc3RhbGwnIGZsYWcgc2V0LmApO1xuICAgIGxvZy53YXJuKGBTa2lwcGluZyBDaHJvbWVkcml2ZXIgaW5zdGFsbGF0aW9uLiBBbmRyb2lkIHdlYi9oeWJyaWQgdGVzdGluZyB3aWxsIG5vdCBiZSBwb3NzaWJsZWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGNoZWNrIGlmIHRoZSBjb2RlIGhhcyBiZWVuIHRyYW5zcGlsZWRcbiAgd2FpdEZvckRlcHMoZnVuY3Rpb24gd2FpdCAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgLy8gdGhpcyBzaG91bGQgb25seSBoYXBwZW4gb24gbG9jYWwgaW5zdGFsbCAoaS5lLiwgbnBtIGluc3RhbGwgaW4gdGhpcyBkaXJlY3RvcnkpXG4gICAgICBsb2cud2FybihgVW5hYmxlIHRvIGltcG9ydCBpbnN0YWxsIHNjcmlwdDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy53YXJuKGBSZS1ydW4gJ25wbSBydW4gY2hyb21lZHJpdmVyJyBtYW51YWxseS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZnMuc3RhdChCVUlMRF9QQVRILCBmdW5jdGlvbiBpbnN0YWxsU2NyaXB0RXhpc3RzIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gdGhpcyBzaG91bGQgb25seSBoYXBwZW4gb24gbG9jYWwgaW5zdGFsbFxuICAgICAgICBsb2cud2FybihgTk9URTogUnVuICducHggZ3VscCB0cmFuc3BpbGUnIGJlZm9yZSB1c2luZ2ApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXF1aXJlKEJVSUxEX1BBVEgpLmRvSW5zdGFsbCgpLmNhdGNoKGZ1bmN0aW9uIGluc3RhbGxFcnJvciAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRXJyb3IgaW5zdGFsbGluZyBDaHJvbWVkcml2ZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIGxvZy5lcnJvcihlcnIuc3RhY2sgPyBlcnIuc3RhY2sgOiBlcnIpO1xuICAgICAgICBsb2cuZXJyb3IoYERvd25sb2FkaW5nIENocm9tZWRyaXZlciBjYW4gYmUgc2tpcHBlZCBieSB1c2luZyB0aGUgYCArXG4gICAgICAgICAgICAgICAgICBgJy0tY2hyb21lZHJpdmVyLXNraXAtaW5zdGFsbCcgZmxhZyBvciBgICtcbiAgICAgICAgICAgICAgICAgIGBzZXR0aW5nIHRoZSAnQVBQSVVNX1NLSVBfQ0hST01FRFJJVkVSX0lOU1RBTEwnIGVudmlyb25tZW50IGAgK1xuICAgICAgICAgICAgICAgICAgYHZhcmlhYmxlLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBtYWluKCk7XG59XG4iXSwiZmlsZSI6Imluc3RhbGwtbnBtLmpzIiwic291cmNlUm9vdCI6Ii4uIn0=