appium-chromedriver 4.26.4 → 4.27.3

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.
@@ -28,21 +28,6 @@ const MAX_PARALLEL_DOWNLOADS = 5;
28
28
 
29
29
  const log = _appiumSupport.logger.getLogger('ChromedriverStorageClient');
30
30
 
31
- async function getOsInfo() {
32
- let name = 'linux';
33
-
34
- if (_appiumSupport.system.isWindows()) {
35
- name = 'win';
36
- } else if (_appiumSupport.system.isMac()) {
37
- name = 'mac';
38
- }
39
-
40
- return {
41
- name,
42
- arch: await _appiumSupport.system.arch()
43
- };
44
- }
45
-
46
31
  async function isCrcOk(src, checksum) {
47
32
  const md5 = await _appiumSupport.fs.hash(src, 'md5');
48
33
  return _lodash.default.toLower(md5) === _lodash.default.toLower(checksum);
@@ -153,7 +138,6 @@ class ChromedriverStorageClient {
153
138
  continue;
154
139
  }
155
140
 
156
- log.debug(`Processing chromedriver entry '${key}'`);
157
141
  const etag = extractNodeText(findChildNode(driverNode, 'ETag'));
158
142
 
159
143
  if (!etag) {
@@ -269,15 +253,21 @@ class ChromedriverStorageClient {
269
253
  if (!_lodash.default.isEmpty(osInfo)) {
270
254
  let {
271
255
  name,
272
- arch
256
+ arch,
257
+ hardwareName
273
258
  } = osInfo;
274
259
 
275
- if (arch === '64' && !driversToSync.some(cdName => cdName.includes(`_${name}64`))) {
276
- arch = '32';
260
+ if (arch === _utils.X64 && !driversToSync.some(cdName => cdName.includes(`_${name}${_utils.X64}`))) {
261
+ arch = _utils.X86;
262
+ }
263
+
264
+ if (name === _utils.OS.mac && _lodash.default.includes(hardwareName, 'arm') && driversToSync.some(cdName => cdName.includes(_utils.M1_ARCH_SUFFIX))) {
265
+ arch += _utils.M1_ARCH_SUFFIX;
277
266
  }
278
267
 
279
268
  log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);
280
- driversToSync = driversToSync.filter(cdName => cdName.includes(`_${name}${arch}`));
269
+ const platformRe = new RegExp(`(\\b|_)${name}${arch}\\b`);
270
+ driversToSync = driversToSync.filter(cdName => platformRe.test(cdName));
281
271
  log.debug(`Got ${_appiumSupport.util.pluralize('item', driversToSync.length, true)}`);
282
272
  }
283
273
 
@@ -343,6 +333,8 @@ class ChromedriverStorageClient {
343
333
  }
344
334
 
345
335
  async syncDrivers(opts = {}) {
336
+ var _opts$osInfo;
337
+
346
338
  if (_lodash.default.isEmpty(this.mapping)) {
347
339
  await this.retrieveMapping(!!opts.minBrowserVersion);
348
340
  }
@@ -351,7 +343,7 @@ class ChromedriverStorageClient {
351
343
  throw new Error('Cannot retrieve chromedrivers mapping from Google storage');
352
344
  }
353
345
 
354
- const driversToSync = this.selectMatchingDrivers(await getOsInfo(), opts);
346
+ const driversToSync = this.selectMatchingDrivers((_opts$osInfo = opts.osInfo) !== null && _opts$osInfo !== void 0 ? _opts$osInfo : await (0, _utils.getOsInfo)(), opts);
355
347
 
356
348
  if (_lodash.default.isEmpty(driversToSync)) {
357
349
  log.debug(`There are no drivers to sync. Exiting`);
@@ -396,4 +388,4 @@ var _default = ChromedriverStorageClient;
396
388
  exports.default = _default;require('source-map-support').install();
397
389
 
398
390
 
399
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImdldE9zSW5mbyIsIm5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJpc01hYyIsImFyY2giLCJpc0NyY09rIiwic3JjIiwiY2hlY2tzdW0iLCJtZDUiLCJmcyIsImhhc2giLCJfIiwidG9Mb3dlciIsImZpbmRDaGlsZE5vZGUiLCJwYXJlbnQiLCJjaGlsZE5hbWUiLCJ0ZXh0IiwiaGFzQ2hpbGROb2RlcyIsImNoaWxkTm9kZUlkeCIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJjaGlsZE5vZGUiLCJsb2NhbE5hbWUiLCJjaGlsZFRleHQiLCJleHRyYWN0Tm9kZVRleHQiLCJub2RlIiwiZmlyc3RDaGlsZCIsInV0aWwiLCJoYXNWYWx1ZSIsIm5vZGVWYWx1ZSIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJjaHJvbWVkcml2ZXJEaXIiLCJ0aW1lb3V0IiwibWFwcGluZyIsInBhcnNlTm90ZXMiLCJjb250ZW50IiwicmVzdWx0IiwidmVyc2lvbk1hdGNoIiwiZXhlYyIsInZlcnNpb24iLCJtaW5Ccm93c2VyVmVyc2lvbk1hdGNoIiwibWluQnJvd3NlclZlcnNpb24iLCJyZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvIiwiZHJpdmVyS2V5Iiwibm90ZXNVcmwiLCJpbmZvRGljdCIsIm5vdGVzIiwiYWNjZXB0IiwiZGVidWciLCJwYXJzZVN0b3JhZ2VYbWwiLCJkb2MiLCJzaG91bGRQYXJzZU5vdGVzIiwiZHJpdmVyTm9kZXMiLCJ4cGF0aCIsInNlbGVjdCIsImlzRW1wdHkiLCJwcm9taXNlcyIsImRyaXZlck5vZGUiLCJrZXkiLCJpbmNsdWRlcyIsImV0YWciLCJjZEluZm8iLCJ1cmwiLCJDRF9DRE4iLCJ0cmltIiwiZmlyc3QiLCJzcGxpdCIsIm5vdGVzUGF0aCIsImlzTm90ZXNQcmVzZW50IiwicmVkdWNlIiwiYWNjIiwiaW5mbyIsInB1c2giLCJCIiwiYWxsIiwic2l6ZSIsInJldHJpZXZlTWFwcGluZyIsInhtbCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImNsb25lRGVlcCIsInVuemlwRHJpdmVyIiwiZHN0IiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiemlwIiwiZXh0cmFjdEFsbFRvIiwiY2hyb21lZHJpdmVyUGF0aCIsIndhbGtEaXIiLCJpdGVtUGF0aCIsImlzRGlyZWN0b3J5IiwicGF0aCIsInBhcnNlIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwic29tZSIsInJldHJpZXZlRHJpdmVyIiwiaW5kZXgiLCJhcmNoaXZlc1Jvb3QiLCJpc1N0cmljdCIsImFyY2hpdmVQYXRoIiwicmVzb2x2ZSIsIm5ldCIsImRvd25sb2FkRmlsZSIsImlzTWV0ZXJlZCIsImUiLCJtc2ciLCJtZXNzYWdlIiwiZXJyb3IiLCJmaWxlTmFtZSIsInRhcmdldFBhdGgiLCJjaG1vZCIsInN5bmNEcml2ZXJzIiwiSlNPTiIsInN0cmluZ2lmeSIsInN5bmNocm9uaXplZERyaXZlcnMiLCJpZHgiLCJlbnRyaWVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFVBQVUsR0FBRyxLQUFuQjtBQUNBLE1BQU1DLHNCQUFzQixH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QUErQjRELGFBQWEsQ0FBQ2tDLE9BQWQsRUFBL0IsRUFBd0Q7QUFDdERqRixRQUFBQSxRQUFRLENBQUNnQixJQUFULENBQWMsQ0FBQyxZQUFZO0FBQ3pCLGNBQUksTUFBTSxLQUFLNEMsY0FBTCxDQUFvQm9CLEdBQXBCLEVBQXlCN0YsU0FBekIsRUFBb0MyRSxZQUFwQyxFQUFrRCxDQUFDN0csZ0JBQUU4QyxPQUFGLENBQVU4QyxJQUFWLENBQW5ELENBQVYsRUFBK0U7QUFDN0VrQyxZQUFBQSxtQkFBbUIsQ0FBQy9ELElBQXBCLENBQXlCN0IsU0FBekI7QUFDRDtBQUNGLFNBSmEsR0FBZDs7QUFNQSxZQUFJYSxRQUFRLENBQUN0QyxNQUFULEdBQWtCekIsc0JBQWxCLEtBQTZDLENBQWpELEVBQW9EO0FBQ2xELGdCQUFNZ0Ysa0JBQUVDLEdBQUYsQ0FBTWxCLFFBQU4sQ0FBTjtBQUNEO0FBQ0Y7O0FBQ0QsWUFBTWlCLGtCQUFFQyxHQUFGLENBQU1sQixRQUFOLENBQU47QUFDRCxLQWJELFNBYVU7QUFDUixZQUFNakQsa0JBQUcyRixNQUFILENBQVVvQixZQUFWLENBQU47QUFDRDs7QUFDRCxRQUFJLENBQUM3RyxnQkFBRThDLE9BQUYsQ0FBVWdGLG1CQUFWLENBQUwsRUFBcUM7QUFDbkM3SSxNQUFBQSxHQUFHLENBQUM2RSxJQUFKLENBQVUsNEJBQUQsR0FDTixHQUFFOUMsb0JBQUtrRixTQUFMLENBQWUsY0FBZixFQUErQjRCLG1CQUFtQixDQUFDckgsTUFBbkQsRUFBMkQsSUFBM0QsQ0FBaUUsRUFEdEU7QUFFRCxLQUhELE1BR087QUFDTHhCLE1BQUFBLEdBQUcsQ0FBQzZFLElBQUosQ0FBVSxvQ0FBVjtBQUNEOztBQUNELFdBQU9nRSxtQkFBUDtBQUNEOztBQXhYNkI7O2VBNFhqQjNHLHlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Q2hyb21lZHJpdmVyRGlyLCBDRF9DRE4sIHJldHJpZXZlRGF0YSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB4cGF0aCBmcm9tICd4cGF0aCc7XG5pbXBvcnQgeyBET01QYXJzZXIgfSBmcm9tICd4bWxkb20nO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHRlbXBEaXIsIHppcCwgdXRpbCwgbmV0IH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuXG5cbmNvbnN0IFRJTUVPVVRfTVMgPSAxNTAwMDtcbmNvbnN0IE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPSA1O1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50Jyk7XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3NJbmZvICgpIHtcbiAgbGV0IG5hbWUgPSAnbGludXgnO1xuICBpZiAoc3lzdGVtLmlzV2luZG93cygpKSB7XG4gICAgbmFtZSA9ICd3aW4nO1xuICB9IGVsc2UgaWYgKHN5c3RlbS5pc01hYygpKSB7XG4gICAgbmFtZSA9ICdtYWMnO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBhcmNoOiBhd2FpdCBzeXN0ZW0uYXJjaCgpLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc0NyY09rIChzcmMsIGNoZWNrc3VtKSB7XG4gIGNvbnN0IG1kNSA9IGF3YWl0IGZzLmhhc2goc3JjLCAnbWQ1Jyk7XG4gIHJldHVybiBfLnRvTG93ZXIobWQ1KSA9PT0gXy50b0xvd2VyKGNoZWNrc3VtKTtcbn1cblxuZnVuY3Rpb24gZmluZENoaWxkTm9kZSAocGFyZW50LCBjaGlsZE5hbWUgPSBudWxsLCB0ZXh0ID0gbnVsbCkge1xuICBpZiAoIWNoaWxkTmFtZSAmJiAhdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgY2hpbGROb2RlSWR4ID0gMDsgY2hpbGROb2RlSWR4IDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBjaGlsZE5vZGVJZHgrKykge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW2NoaWxkTm9kZUlkeF07XG4gICAgaWYgKGNoaWxkTmFtZSAmJiAhdGV4dCAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUpIHtcbiAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgfVxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBleHRyYWN0Tm9kZVRleHQoY2hpbGROb2RlKTtcbiAgICAgIGlmICghY2hpbGRUZXh0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkTmFtZSAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgICBpZiAoIWNoaWxkTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3ROb2RlVGV4dCAobm9kZSkge1xuICByZXR1cm4gKCFub2RlIHx8ICFub2RlLmZpcnN0Q2hpbGQgfHwgIXV0aWwuaGFzVmFsdWUobm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZSkpXG4gICAgPyBudWxsXG4gICAgOiBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlO1xufVxuXG5cbmNsYXNzIENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hyb21lZHJpdmVyRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICB0aW1lb3V0ID0gVElNRU9VVF9NUyxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLmNocm9tZWRyaXZlckRpciA9IGNocm9tZWRyaXZlckRpcjtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHRoaXMubWFwcGluZyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW5pbXVtIGJyb3dzZXIgdmVyc2lvblxuICAgKiBzdXBwb3J0ZWQgYnkgY2hyb21lZHJpdmVyIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldHMgYWRkaXRpb25hbCBjaHJvbWVkcml2ZXIgZGV0YWlscyBmcm9tIGNocm9tZWRyaXZlclxuICAgKiByZWxlYXNlIG5vdGVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gUmVsZWFzZSBub3RlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaHJvbWVkcml2ZXJcbiAgICogQHJldHVybnMge0FkZGl0aW9uYWxEcml2ZXJEZXRhaWxzfVxuICAgKi9cbiAgcGFyc2VOb3RlcyAoY29udGVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IC9eXFxzKlstXStDaHJvbWVEcml2ZXJbXFxEXSsoW1xcZC5dKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25NYXRjaCA9IC9eXFxzKlN1cHBvcnRzIENocm9tZVtcXERdKyhcXGQrKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmIChtaW5Ccm93c2VyVmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkcyBjaHJvbWVkcml2ZXIgcmVsZWFzZSBub3RlcyBhbmQgcHV0cyB0aGVtXG4gICAqIGludG8gdGhlIGRpY3Rpb25hcnkgYXJndW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIERyaXZlciB2ZXJzaW9uIHBsdXMgYXJjaGl2ZSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBub3Rlc1VybCAtIFRoZSBVUkwgb2YgY2hyb21lZHJpdmVyIG5vdGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvRGljdCAtIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgZHJpdmVyIGluZm8uXG4gICAqIFRoZSBtZXRob2QgY2FsbCBtdXRhdGVzIGJ5IG1lcmdpbmcgYEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHJlbGVhc2Ugbm90ZXMgY2Fubm90IGJlIGRvd25sb2FkZWRcbiAgICovXG4gIGFzeW5jIHJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8gKGRyaXZlcktleSwgbm90ZXNVcmwsIGluZm9EaWN0KSB7XG4gICAgY29uc3Qgbm90ZXMgPSBhd2FpdCByZXRyaWV2ZURhdGEobm90ZXNVcmwsIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICcqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IHsgbWluQnJvd3NlclZlcnNpb24gfSA9IHRoaXMucGFyc2VOb3Rlcyhub3Rlcyk7XG4gICAgaWYgKCFtaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgZHJpdmVyICcke2RyaXZlcktleX0nIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgcmVsZWFzZSBub3RlcyBhdCAke25vdGVzVXJsfS4gYCArXG4gICAgICAgIGBTa2lwcGluZyBpdGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbmZvRGljdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUwgYW5kIHN0b3Jlc1xuICAgKiB0aGUgcGFyc2VkIHJlc3VsdHMgaW50byBgdGhpcy5tYXBwaW5nYFxuICAgKlxuICAgKiBAcGFyYW0ge0RPTURvY3VtZW50fSBkb2MgLSBUaGUgRE9NIHJlcHJlc2VudGF0aW9uXG4gICAqIG9mIHRoZSBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUxcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIElmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGRyaXZlcnMgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgcGFyc2VkXG4gICAqIGFuZCBhc3NpZ25lZCB0byBgdGhpcy5tYXBwaW5nYFxuICAgKi9cbiAgYXN5bmMgcGFyc2VTdG9yYWdlWG1sIChkb2MsIHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgZHJpdmVyTm9kZXMgPSB4cGF0aC5zZWxlY3QoYC8vKltsb2NhbC1uYW1lKC4pPSdDb250ZW50cyddYCwgZG9jKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCAke2RyaXZlck5vZGVzLmxlbmd0aH0gZW50cmllcyBmcm9tIHN0b3JhZ2UgWE1MYCk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJOb2RlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZHJpdmVyTm9kZSBvZiBkcml2ZXJOb2Rlcykge1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0tleScpKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhrZXksICcvY2hyb21lZHJpdmVyXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsb2cuZGVidWcoYFByb2Nlc3NpbmcgY2hyb21lZHJpdmVyIGVudHJ5ICcke2tleX0nYCk7XG4gICAgICBjb25zdCBldGFnID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0VUYWcnKSk7XG4gICAgICBpZiAoIWV0YWcpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiB0aGUgY2hlY2tzdW0uIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZEluZm8gPSB7XG4gICAgICAgIHVybDogYCR7Q0RfQ0ROfS8ke2tleX1gLFxuICAgICAgICBldGFnOiBfLnRyaW0oZXRhZywgJ1wiJyksXG4gICAgICAgIHZlcnNpb246IF8uZmlyc3Qoa2V5LnNwbGl0KCcvJykpLFxuICAgICAgfTtcbiAgICAgIHRoaXMubWFwcGluZ1trZXldID0gY2RJbmZvO1xuXG4gICAgICBjb25zdCBub3Rlc1BhdGggPSBgJHtjZEluZm8udmVyc2lvbn0vbm90ZXMudHh0YDtcbiAgICAgIGNvbnN0IGlzTm90ZXNQcmVzZW50ID0gISFkcml2ZXJOb2Rlc1xuICAgICAgICAucmVkdWNlKChhY2MsIG5vZGUpID0+IGFjYyB8fCBmaW5kQ2hpbGROb2RlKG5vZGUsICdLZXknLCBub3Rlc1BhdGgpLCBmYWxzZSk7XG4gICAgICBpZiAoIWlzTm90ZXNQcmVzZW50KSB7XG4gICAgICAgIGNkSW5mby5taW5Ccm93c2VyVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIGlmIChzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIGFueSBub3Rlcy4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5yZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvKGtleSwgYCR7Q0RfQ0ROfS8ke25vdGVzUGF0aH1gLCBjZEluZm8pKTtcbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIGxvZy5pbmZvKGBUaGUgdG90YWwgY291bnQgb2YgZW50cmllcyBpbiB0aGUgbWFwcGluZzogJHtfLnNpemUodGhpcy5tYXBwaW5nKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgLSBUaGUgZnVsbCB1cmwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIGluXG4gICAqIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXRhZyAtIFRoZSBDUkMgb2YgdGhlIGRyaXZlciBhcmNoaXZlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENocm9tZWRyaXZlcnNNYXBwaW5nXG4gICAqIEBwcm9wZXJ0eSB7RHJpdmVyRGV0YWlsc30gLSBUaGUga2V5cyBhcmUgdW5pcXVlIGRyaXZlciBpZGVudGlmaWVyc1xuICAgKiAodmVyc2lvbi9hcmNoaXZlIG5hbWUpLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaGF2ZSBgRHJpdmVyRGV0YWlsc2BcbiAgICogY29udGFpbmluZyBjaHJvbWVkcml2ZXIgZGV0YWlsc1xuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlciBtYXBwaW5nIGZyb20gdGhlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIGlmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGNocm9tZWRyaXZlcnMgaW5mbyBpcyBnb2luZyB0byBiZSByZXRyaWV2ZWQgYW5kXG4gICAqIHBhcnNlZCBmcm9tIHJlbGVhc2Ugbm90ZXNcbiAgICogQHJldHVybnMge0Nocm9tZWRyaXZlcnNNYXBwaW5nfVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVNYXBwaW5nIChzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHhtbCA9IGF3YWl0IHJldHJpZXZlRGF0YShDRF9DRE4sIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi94bWwsICovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwpO1xuICAgIGF3YWl0IHRoaXMucGFyc2VTdG9yYWdlWG1sKGRvYywgc2hvdWxkUGFyc2VOb3Rlcyk7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKHRoaXMubWFwcGluZyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZVxuICAgKiBpbnRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIHNvdXJjZSBhcmNoaXZlIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRzdCAtIFRoZSBkZXN0aW5hdGlvbiBjaHJvbWVkcml2ZXIgcGF0aFxuICAgKi9cbiAgYXN5bmMgdW56aXBEcml2ZXIgKHNyYywgZHN0KSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHNyYywgdG1wUm9vdCk7XG4gICAgICBjb25zdCBjaHJvbWVkcml2ZXJQYXRoID0gYXdhaXQgZnMud2Fsa0Rpcih0bXBSb290LCB0cnVlLCAoaXRlbVBhdGgsIGlzRGlyZWN0b3J5KSA9PlxuICAgICAgICAhaXNEaXJlY3RvcnkgJiYgXy50b0xvd2VyKHBhdGgucGFyc2UoaXRlbVBhdGgpLm5hbWUpID09PSAnY2hyb21lZHJpdmVyJyk7XG4gICAgICBpZiAoIWNocm9tZWRyaXZlclBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXJjaGl2ZSB3YXMgdW56aXBwZWQgcHJvcGVybHksIGJ1dCB3ZSBjb3VsZCBub3QgZmluZCBhbnkgY2hyb21lZHJpdmVyIGV4ZWN1dGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgTW92aW5nIHRoZSBleHRyYWN0ZWQgJyR7cGF0aC5iYXNlbmFtZShjaHJvbWVkcml2ZXJQYXRoKX0nIHRvICcke2RzdH0nYCk7XG4gICAgICBhd2FpdCBmcy5tdihjaHJvbWVkcml2ZXJQYXRoLCBkc3QsIHtcbiAgICAgICAgbWtkaXJwOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPU0luZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaG9zdCBPU1xuICAgKiBDYW4gYmUgZWl0aGVyIGBtYWNgLCBgd2luZG93c2Agb3IgYGxpbnV4YFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXJjaCAtIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGhvc3QgT0QuXG4gICAqIENhbiBiZSBlaXRoZXIgYDMyYCBvciBgNjRgXG4gICAqL1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGB0aGlzLm1hcHBpbmdgIHRvIG9ubHkgc2VsZWN0IG1hdGNoaW5nXG4gICAqIGNocm9tZWRyaXZlciBlbnRyaWVzIGJ5IG9wZXJhdGluZyBzeXN0ZW0gaW5mb3JtYXRpb25cbiAgICogYW5kL29yIGFkZGl0aW9uYWwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMgKGlmIHByb3ZpZGVkKVxuICAgKlxuICAgKiBAcGFyYW0ge09TSW5mb30gb3NJbmZvXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBmaWx0ZXJlZCBjaHJvbWVkcml2ZXJcbiAgICogZW50cnkgbmFtZXMgKHZlcnNpb24vYXJjaGl2ZSBuYW1lKVxuICAgKi9cbiAgc2VsZWN0TWF0Y2hpbmdEcml2ZXJzIChvc0luZm8sIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1pbkJyb3dzZXJWZXJzaW9uLFxuICAgICAgdmVyc2lvbnMgPSBbXSxcbiAgICB9ID0gb3B0cztcbiAgICBsZXQgZHJpdmVyc1RvU3luYyA9IF8ua2V5cyh0aGlzLm1hcHBpbmcpO1xuXG4gICAgaWYgKCFfLmlzRW1wdHkodmVyc2lvbnMpKSB7XG4gICAgICAvLyBIYW5kbGUgb25seSBzZWxlY3RlZCB2ZXJzaW9ucyBpZiByZXF1ZXN0ZWRcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgdmVyc2lvbnMgbWF0Y2ggdG8gJHt2ZXJzaW9uc31gKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jXG4gICAgICAgIC5maWx0ZXIoKGNkTmFtZSkgPT4gdmVyc2lvbnMuaW5jbHVkZXMoYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0udmVyc2lvbn1gKSk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKG1pbkJyb3dzZXJWZXJzaW9uKSkge1xuICAgICAgLy8gT25seSBzZWxlY3QgZHJpdmVycyB0aGF0IHN1cHBvcnQgdGhlIGN1cnJlbnQgYnJvd3NlciB3aG9zZSBtYWpvciB2ZXJzaW9uIG51bWJlciBlcXVhbHMgdG8gYG1pbkJyb3dzZXJWZXJzaW9uYFxuICAgICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25JbnQgPSBwYXJzZUludChtaW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSBtaW5pbXVtIHN1cHBvcnRlZCBicm93c2VyIHZlcnNpb24gbWF0Y2hlcyB0byAke21pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuICAgICAgbGV0IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA9IDA7XG4gICAgICAvLyBTZWxlY3QgdGhlIG5ld2VzdCBhdmFpbGFibGUgYW5kIGNvbXBhdGlibGUgY2hyb21lZHJpdmVyXG4gICAgICBmb3IgKGNvbnN0IGNkTmFtZSBvZiBkcml2ZXJzVG9TeW5jKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA9IHBhcnNlSW50KHRoaXMubWFwcGluZ1tjZE5hbWVdLm1pbkJyb3dzZXJWZXJzaW9uLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKVxuICAgICAgICAgICAgJiYgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uIDw9IG1pbkJyb3dzZXJWZXJzaW9uSW50XG4gICAgICAgICAgICAmJiBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24pIHtcbiAgICAgICAgICBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSBjdXJyZW50TWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBgJHt0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbn1gID09PVxuICAgICAgICBgJHtjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPiAwID8gY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDogbWluQnJvd3NlclZlcnNpb25JbnR9YCk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgV2lsbCBzZWxlY3QgY2FuZGlkYXRlICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoKX0gYCArXG4gICAgICAgIGB2ZXJzaW9uZWQgYXMgJyR7Xy51bmlxKGRyaXZlcnNUb1N5bmMubWFwKChjZE5hbWUpID0+IHRoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb24pKX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRW1wdHkob3NJbmZvKSkge1xuICAgICAgLy8gRmlsdGVyIG91dCBkcml2ZXJzIGZvciB1bnN1cHBvcnRlZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlc1xuICAgICAgbGV0IHtuYW1lLCBhcmNofSA9IG9zSW5mbztcbiAgICAgIGlmIChhcmNoID09PSAnNjQnICYmICFkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKGBfJHtuYW1lfTY0YCkpKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB4ODYgYnVpbGQgaWYgeDY0IG9uZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gT1NcbiAgICAgICAgYXJjaCA9ICczMic7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHBsYXRmb3JtIG1hdGNoZXMgdG8gJHtuYW1lfSR7YXJjaH1gKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBjZE5hbWUuaW5jbHVkZXMoYF8ke25hbWV9JHthcmNofWApKTtcbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyaXZlcnNUb1N5bmM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBjaHJvbWVkcml2ZXIgZnJvbSB0aGUgc3RvcmFnZVxuICAgKiBhbmQgdW5wYWNrcyBpdCBpbnRvIGB0aGlzLmNocm9tZWRyaXZlckRpcmAgZm9sZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSB1bmlxdWUgZHJpdmVyIGluZGV4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkcml2ZXJLZXkgLSBUaGUgZHJpdmVyIGtleSBpbiBgdGhpcy5tYXBwaW5nYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZXNSb290IC0gVGhlIHRlbXBvcmFyeSBmb2xkZXIgcGF0aCB0byBleHRyYWN0XG4gICAqIGRvd25sb2FkZWQgYXJjaGl2ZXMgdG9cbiAgICogQHBhcmFtIHtib29sZWFufSBpc1N0cmljdCBbdHJ1ZV0gLSBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIChgdHJ1ZWApXG4gICAqIG9yIHJldHVybiBhIGJvb2xlYW4gcmVzdWx0IGlmIHRoZSBkcml2ZXIgcmV0cmlldmFsIHByb2Nlc3MgZmFpbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgZHJpdmVyXG4gICAqIGFuZCBgaXNTdHJpY3RgIGlzIHNldCB0byBgdHJ1ZWBcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIGB0cnVlYCB0aGVuIHRoZSBjaHJvbWVkcml2ZXIgaXMgc3VjY2Vzc2Z1bGx5XG4gICAqIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZC5cbiAgICovXG4gIGFzeW5jIHJldHJpZXZlRHJpdmVyIChpbmRleCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsIGlzU3RyaWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHVybCwgZXRhZywgdmVyc2lvbiB9ID0gdGhpcy5tYXBwaW5nW2RyaXZlcktleV07XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLnJlc29sdmUoYXJjaGl2ZXNSb290LCBgJHtpbmRleH0uemlwYCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nICcke3VybH0nIHRvICcke2FyY2hpdmVQYXRofSdgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV0LmRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCB7XG4gICAgICAgIGlzTWV0ZXJlZDogZmFsc2UsXG4gICAgICAgIHRpbWVvdXQ6IFRJTUVPVVRfTVNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBDYW5ub3QgZG93bmxvYWQgY2hyb21lZHJpdmVyIGFyY2hpdmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXdhaXQgaXNDcmNPayhhcmNoaXZlUGF0aCwgZXRhZykpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBUaGUgY2hlY2tzdW0gZm9yIHRoZSBkb3dubG9hZGVkIGNocm9tZWRyaXZlciAnJHtkcml2ZXJLZXl9JyBkaWQgbm90IG1hdGNoYDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlTmFtZSA9IGAke3BhdGgucGFyc2UodXJsKS5uYW1lfV92JHt2ZXJzaW9ufWAgK1xuICAgICAgKHN5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnKTtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY2hyb21lZHJpdmVyRGlyLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudW56aXBEcml2ZXIoYXJjaGl2ZVBhdGgsIHRhcmdldFBhdGgpO1xuICAgICAgYXdhaXQgZnMuY2htb2QodGFyZ2V0UGF0aCwgMG83NTUpO1xuICAgICAgbG9nLmRlYnVnKGBQZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSAnJHt0YXJnZXRQYXRofScgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gNzU1YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gU3luY09wdGlvbnNcbiAgICogQHByb3BlcnR5IHtBcnJheTxTdHJpbmc+fSB2ZXJzaW9ucyAtIFRoZSBsaXN0IG9mIGNocm9tZWRyaXZlclxuICAgKiB2ZXJzaW9ucyB0byBzeW5jLiBJZiBlbXB0eSAodGhlIGRlZmF1bHQgdmFsdWUpIHRoZW4gYWxsIGF2YWlsYWJsZVxuICAgKiBjaHJvbWVkcml2ZXJzIGFyZSBnb2luZyB0byBiZSBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW51bXVtIHN1cHBvcnRlZFxuICAgKiBDaHJvbWUgdmVyc2lvbiB0aGF0IGRvd25sb2FkZWQgY2hyb21lZHJpdmVycyBzaG91bGQgc3VwcG9ydC4gQ2FuIG1hdGNoXG4gICAqIG11bHRpcGxlIGRyaXZlcnMuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY2hyb21lZHJpdmVycyBmcm9tIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW1cbiAgICpcbiAgICogQHBhcmFtIHs/U3luY09wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgcmV0cmlldmluZ1xuICAgKiB0aGUgZHJpdmVyc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nfSBUaGUgbGlzdCBvZiBzdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGRyaXZlciBrZXlzXG4gICAqL1xuICBhc3luYyBzeW5jRHJpdmVycyAob3B0cyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJldHJpZXZlTWFwcGluZyghIW9wdHMubWluQnJvd3NlclZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMubWFwcGluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJldHJpZXZlIGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIEdvb2dsZSBzdG9yYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHJpdmVyc1RvU3luYyA9IHRoaXMuc2VsZWN0TWF0Y2hpbmdEcml2ZXJzKGF3YWl0IGdldE9zSW5mbygpLCBvcHRzKTtcbiAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGFyZSBubyBkcml2ZXJzIHRvIHN5bmMuIEV4aXRpbmdgKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnZHJpdmVyJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfSB0byBzeW5jOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRyaXZlcnNUb1N5bmMsIG51bGwsIDIpKTtcblxuICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnMgPSBbXTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGNvbnN0IGFyY2hpdmVzUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IFtpZHgsIGRyaXZlcktleV0gb2YgZHJpdmVyc1RvU3luYy5lbnRyaWVzKCkpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLnJldHJpZXZlRHJpdmVyKGlkeCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsICFfLmlzRW1wdHkob3B0cykpKSB7XG4gICAgICAgICAgICBzeW5jaHJvbml6ZWREcml2ZXJzLnB1c2goZHJpdmVyS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlc1Jvb3QpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShzeW5jaHJvbml6ZWREcml2ZXJzKSkge1xuICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQgYCArXG4gICAgICAgIGAke3V0aWwucGx1cmFsaXplKCdjaHJvbWVkcml2ZXInLCBzeW5jaHJvbml6ZWREcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGBObyBjaHJvbWVkcml2ZXJzIHdlcmUgc3luY2hyb25pemVkYCk7XG4gICAgfVxuICAgIHJldHVybiBzeW5jaHJvbml6ZWREcml2ZXJzO1xuICB9XG59XG5cblxuZXhwb3J0IGRlZmF1bHQgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudDtcbiJdLCJmaWxlIjoibGliL3N0b3JhZ2UtY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
391
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFJQTs7QUFDQTs7QUFDQTs7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YSwgZ2V0T3NJbmZvLFxuICBPUywgWDY0LCBYODYsIE0xX0FSQ0hfU1VGRklYLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeHBhdGggZnJvbSAneHBhdGgnO1xuaW1wb3J0IHsgRE9NUGFyc2VyIH0gZnJvbSAneG1sZG9tJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgbG9nZ2VyLCB0ZW1wRGlyLCB6aXAsIHV0aWwsIG5ldCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcblxuXG5jb25zdCBUSU1FT1VUX01TID0gMTUwMDA7XG5jb25zdCBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID0gNTtcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCcpO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIGlzQ3JjT2sgKHNyYywgY2hlY2tzdW0pIHtcbiAgY29uc3QgbWQ1ID0gYXdhaXQgZnMuaGFzaChzcmMsICdtZDUnKTtcbiAgcmV0dXJuIF8udG9Mb3dlcihtZDUpID09PSBfLnRvTG93ZXIoY2hlY2tzdW0pO1xufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGROb2RlIChwYXJlbnQsIGNoaWxkTmFtZSA9IG51bGwsIHRleHQgPSBudWxsKSB7XG4gIGlmICghY2hpbGROYW1lICYmICF0ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFwYXJlbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3IgKGxldCBjaGlsZE5vZGVJZHggPSAwOyBjaGlsZE5vZGVJZHggPCBwYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGNoaWxkTm9kZUlkeCsrKSB7XG4gICAgY29uc3QgY2hpbGROb2RlID0gcGFyZW50LmNoaWxkTm9kZXNbY2hpbGROb2RlSWR4XTtcbiAgICBpZiAoY2hpbGROYW1lICYmICF0ZXh0ICYmIGNoaWxkTmFtZSA9PT0gY2hpbGROb2RlLmxvY2FsTmFtZSkge1xuICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICB9XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGNvbnN0IGNoaWxkVGV4dCA9IGV4dHJhY3ROb2RlVGV4dChjaGlsZE5vZGUpO1xuICAgICAgaWYgKCFjaGlsZFRleHQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGROYW1lICYmIGNoaWxkTmFtZSA9PT0gY2hpbGROb2RlLmxvY2FsTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICAgIGlmICghY2hpbGROYW1lICYmIHRleHQgPT09IGNoaWxkVGV4dCkge1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdE5vZGVUZXh0IChub2RlKSB7XG4gIHJldHVybiAoIW5vZGUgfHwgIW5vZGUuZmlyc3RDaGlsZCB8fCAhdXRpbC5oYXNWYWx1ZShub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlKSlcbiAgICA/IG51bGxcbiAgICA6IG5vZGUuZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG59XG5cblxuY2xhc3MgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCB7XG4gIGNvbnN0cnVjdG9yIChhcmdzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBjaHJvbWVkcml2ZXJEaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIoKSxcbiAgICAgIHRpbWVvdXQgPSBUSU1FT1VUX01TLFxuICAgIH0gPSBhcmdzO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyRGlyID0gY2hyb21lZHJpdmVyRGlyO1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgdGhpcy5tYXBwaW5nID0ge307XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gQWRkaXRpb25hbERyaXZlckRldGFpbHNcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICogb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbkJyb3dzZXJWZXJzaW9uIC0gVGhlIG1pbmltdW0gYnJvd3NlciB2ZXJzaW9uXG4gICAqIHN1cHBvcnRlZCBieSBjaHJvbWVkcml2ZXIgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogR2V0cyBhZGRpdGlvbmFsIGNocm9tZWRyaXZlciBkZXRhaWxzIGZyb20gY2hyb21lZHJpdmVyXG4gICAqIHJlbGVhc2Ugbm90ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBSZWxlYXNlIG5vdGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNocm9tZWRyaXZlclxuICAgKiBAcmV0dXJucyB7QWRkaXRpb25hbERyaXZlckRldGFpbHN9XG4gICAqL1xuICBwYXJzZU5vdGVzIChjb250ZW50KSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gL15cXHMqWy1dK0Nocm9tZURyaXZlcltcXERdKyhbXFxkLl0rKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIHJlc3VsdC52ZXJzaW9uID0gdmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICBjb25zdCBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoID0gL15cXHMqU3VwcG9ydHMgQ2hyb21lW1xcRF0rKFxcZCspL2ltLmV4ZWMoY29udGVudCk7XG4gICAgaWYgKG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2gpIHtcbiAgICAgIHJlc3VsdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2hbMV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWRzIGNocm9tZWRyaXZlciByZWxlYXNlIG5vdGVzIGFuZCBwdXRzIHRoZW1cbiAgICogaW50byB0aGUgZGljdGlvbmFyeSBhcmd1bWVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHJpdmVyS2V5IC0gRHJpdmVyIHZlcnNpb24gcGx1cyBhcmNoaXZlIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vdGVzVXJsIC0gVGhlIFVSTCBvZiBjaHJvbWVkcml2ZXIgbm90ZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IGluZm9EaWN0IC0gVGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyBkcml2ZXIgaW5mby5cbiAgICogVGhlIG1ldGhvZCBjYWxsIG11dGF0ZXMgYnkgbWVyZ2luZyBgQWRkaXRpb25hbERyaXZlckRldGFpbHNgXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgcmVsZWFzZSBub3RlcyBjYW5ub3QgYmUgZG93bmxvYWRlZFxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVBZGRpdGlvbmFsRHJpdmVySW5mbyAoZHJpdmVyS2V5LCBub3Rlc1VybCwgaW5mb0RpY3QpIHtcbiAgICBjb25zdCBub3RlcyA9IGF3YWl0IHJldHJpZXZlRGF0YShub3Rlc1VybCwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJyovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgeyBtaW5Ccm93c2VyVmVyc2lvbiB9ID0gdGhpcy5wYXJzZU5vdGVzKG5vdGVzKTtcbiAgICBpZiAoIW1pbkJyb3dzZXJWZXJzaW9uKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZSBkcml2ZXIgJyR7ZHJpdmVyS2V5fScgZG9lcyBub3QgY29udGFpbiB2YWxpZCByZWxlYXNlIG5vdGVzIGF0ICR7bm90ZXNVcmx9LiBgICtcbiAgICAgICAgYFNraXBwaW5nIGl0YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluZm9EaWN0Lm1pbkJyb3dzZXJWZXJzaW9uID0gbWluQnJvd3NlclZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGNocm9tZWRyaXZlciBzdG9yYWdlIFhNTCBhbmQgc3RvcmVzXG4gICAqIHRoZSBwYXJzZWQgcmVzdWx0cyBpbnRvIGB0aGlzLm1hcHBpbmdgXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRG9jdW1lbnR9IGRvYyAtIFRoZSBET00gcmVwcmVzZW50YXRpb25cbiAgICogb2YgdGhlIGNocm9tZWRyaXZlciBzdG9yYWdlIFhNTFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFBhcnNlTm90ZXMgW3RydWVdIC0gSWYgc2V0IHRvIGB0cnVlYFxuICAgKiB0aGVuIGFkZGl0aW9uYWwgZHJpdmVycyBpbmZvcm1hdGlvbiBpcyBnb2luZyB0byBiZSBwYXJzZWRcbiAgICogYW5kIGFzc2lnbmVkIHRvIGB0aGlzLm1hcHBpbmdgXG4gICAqL1xuICBhc3luYyBwYXJzZVN0b3JhZ2VYbWwgKGRvYywgc2hvdWxkUGFyc2VOb3RlcyA9IHRydWUpIHtcbiAgICBjb25zdCBkcml2ZXJOb2RlcyA9IHhwYXRoLnNlbGVjdChgLy8qW2xvY2FsLW5hbWUoLik9J0NvbnRlbnRzJ11gLCBkb2MpO1xuICAgIGxvZy5kZWJ1ZyhgUGFyc2VkICR7ZHJpdmVyTm9kZXMubGVuZ3RofSBlbnRyaWVzIGZyb20gc3RvcmFnZSBYTUxgKTtcbiAgICBpZiAoXy5pc0VtcHR5KGRyaXZlck5vZGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCBkcml2ZXJOb2RlIG9mIGRyaXZlck5vZGVzKSB7XG4gICAgICBjb25zdCBrZXkgPSBleHRyYWN0Tm9kZVRleHQoZmluZENoaWxkTm9kZShkcml2ZXJOb2RlLCAnS2V5JykpO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGtleSwgJy9jaHJvbWVkcml2ZXJfJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV0YWcgPSBleHRyYWN0Tm9kZVRleHQoZmluZENoaWxkTm9kZShkcml2ZXJOb2RlLCAnRVRhZycpKTtcbiAgICAgIGlmICghZXRhZykge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIHRoZSBjaGVja3N1bS4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNkSW5mbyA9IHtcbiAgICAgICAgdXJsOiBgJHtDRF9DRE59LyR7a2V5fWAsXG4gICAgICAgIGV0YWc6IF8udHJpbShldGFnLCAnXCInKSxcbiAgICAgICAgdmVyc2lvbjogXy5maXJzdChrZXkuc3BsaXQoJy8nKSksXG4gICAgICB9O1xuICAgICAgdGhpcy5tYXBwaW5nW2tleV0gPSBjZEluZm87XG5cbiAgICAgIGNvbnN0IG5vdGVzUGF0aCA9IGAke2NkSW5mby52ZXJzaW9ufS9ub3Rlcy50eHRgO1xuICAgICAgY29uc3QgaXNOb3Rlc1ByZXNlbnQgPSAhIWRyaXZlck5vZGVzXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgbm9kZSkgPT4gYWNjIHx8IGZpbmRDaGlsZE5vZGUobm9kZSwgJ0tleScsIG5vdGVzUGF0aCksIGZhbHNlKTtcbiAgICAgIGlmICghaXNOb3Rlc1ByZXNlbnQpIHtcbiAgICAgICAgY2RJbmZvLm1pbkJyb3dzZXJWZXJzaW9uID0gbnVsbDtcbiAgICAgICAgaWYgKHNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgVGhlIGVudHJ5ICcke2tleX0nIGRvZXMgbm90IGNvbnRhaW4gYW55IG5vdGVzLiBTa2lwcGluZyBpdGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICghc2hvdWxkUGFyc2VOb3Rlcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8oa2V5LCBgJHtDRF9DRE59LyR7bm90ZXNQYXRofWAsIGNkSW5mbykpO1xuICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCAlIE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPT09IDApIHtcbiAgICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgbG9nLmluZm8oYFRoZSB0b3RhbCBjb3VudCBvZiBlbnRyaWVzIGluIHRoZSBtYXBwaW5nOiAke18uc2l6ZSh0aGlzLm1hcHBpbmcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IERyaXZlckRldGFpbHNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCAtIFRoZSBmdWxsIHVybCB0byB0aGUgY29ycmVzcG9uZGluZyBkcml2ZXIgaW5cbiAgICogdGhlIHJlbW90ZSBzdG9yYWdlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldGFnIC0gVGhlIENSQyBvZiB0aGUgZHJpdmVyIGFyY2hpdmVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBDaHJvbWVkcml2ZXIgdmVyc2lvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gQ2hyb21lZHJpdmVyc01hcHBpbmdcbiAgICogQHByb3BlcnR5IHtEcml2ZXJEZXRhaWxzfSAtIFRoZSBrZXlzIGFyZSB1bmlxdWUgZHJpdmVyIGlkZW50aWZpZXJzXG4gICAqICh2ZXJzaW9uL2FyY2hpdmUgbmFtZSkuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBoYXZlIGBEcml2ZXJEZXRhaWxzYFxuICAgKiBjb250YWluaW5nIGNocm9tZWRyaXZlciBkZXRhaWxzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY2hyb21lZHJpdmVyIG1hcHBpbmcgZnJvbSB0aGUgc3RvcmFnZVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFBhcnNlTm90ZXMgW3RydWVdIC0gaWYgc2V0IHRvIGB0cnVlYFxuICAgKiB0aGVuIGFkZGl0aW9uYWwgY2hyb21lZHJpdmVycyBpbmZvIGlzIGdvaW5nIHRvIGJlIHJldHJpZXZlZCBhbmRcbiAgICogcGFyc2VkIGZyb20gcmVsZWFzZSBub3Rlc1xuICAgKiBAcmV0dXJucyB7Q2hyb21lZHJpdmVyc01hcHBpbmd9XG4gICAqL1xuICBhc3luYyByZXRyaWV2ZU1hcHBpbmcgKHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgeG1sID0gYXdhaXQgcmV0cmlldmVEYXRhKENEX0NETiwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL3htbCwgKi8qJyxcbiAgICB9LCB7IHRpbWVvdXQ6IHRoaXMudGltZW91dCB9KTtcbiAgICBjb25zdCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhtbCk7XG4gICAgYXdhaXQgdGhpcy5wYXJzZVN0b3JhZ2VYbWwoZG9jLCBzaG91bGRQYXJzZU5vdGVzKTtcbiAgICByZXR1cm4gXy5jbG9uZURlZXAodGhpcy5tYXBwaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBkb3dubG9hZGVkIGNocm9tZWRyaXZlciBhcmNoaXZlXG4gICAqIGludG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgLSBUaGUgc291cmNlIGFyY2hpdmUgcGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHN0IC0gVGhlIGRlc3RpbmF0aW9uIGNocm9tZWRyaXZlciBwYXRoXG4gICAqL1xuICBhc3luYyB1bnppcERyaXZlciAoc3JjLCBkc3QpIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oc3JjLCB0bXBSb290KTtcbiAgICAgIGNvbnN0IGNocm9tZWRyaXZlclBhdGggPSBhd2FpdCBmcy53YWxrRGlyKHRtcFJvb3QsIHRydWUsIChpdGVtUGF0aCwgaXNEaXJlY3RvcnkpID0+XG4gICAgICAgICFpc0RpcmVjdG9yeSAmJiBfLnRvTG93ZXIocGF0aC5wYXJzZShpdGVtUGF0aCkubmFtZSkgPT09ICdjaHJvbWVkcml2ZXInKTtcbiAgICAgIGlmICghY2hyb21lZHJpdmVyUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhcmNoaXZlIHdhcyB1bnppcHBlZCBwcm9wZXJseSwgYnV0IHdlIGNvdWxkIG5vdCBmaW5kIGFueSBjaHJvbWVkcml2ZXIgZXhlY3V0YWJsZScpO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBNb3ZpbmcgdGhlIGV4dHJhY3RlZCAnJHtwYXRoLmJhc2VuYW1lKGNocm9tZWRyaXZlclBhdGgpfScgdG8gJyR7ZHN0fSdgKTtcbiAgICAgIGF3YWl0IGZzLm12KGNocm9tZWRyaXZlclBhdGgsIGRzdCwge1xuICAgICAgICBta2RpcnA6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9TSW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBob3N0IE9TXG4gICAqIENhbiBiZSBlaXRoZXIgYG1hY2AsIGB3aW5kb3dzYCBvciBgbGludXhgXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcmNoIC0gVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgaG9zdCBPRC5cbiAgICogQ2FuIGJlIGVpdGhlciBgMzJgIG9yIGA2NGBcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBoYXJkd2FyZU5hbWUgLSBUaGUgb3V0cHV0IG9mIGB1bmFtZSAtbWAgY29tbWFuZFxuICAgKiBvbiBsaW51eCBhbmQgbWFjIHN5c3RlbXMuIGBudWxsYCBvbiBXaW5kb3dzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGB0aGlzLm1hcHBpbmdgIHRvIG9ubHkgc2VsZWN0IG1hdGNoaW5nXG4gICAqIGNocm9tZWRyaXZlciBlbnRyaWVzIGJ5IG9wZXJhdGluZyBzeXN0ZW0gaW5mb3JtYXRpb25cbiAgICogYW5kL29yIGFkZGl0aW9uYWwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMgKGlmIHByb3ZpZGVkKVxuICAgKlxuICAgKiBAcGFyYW0gez9PU0luZm99IG9zSW5mb1xuICAgKiBAcGFyYW0gez9TeW5jT3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZmlsdGVyZWQgY2hyb21lZHJpdmVyXG4gICAqIGVudHJ5IG5hbWVzICh2ZXJzaW9uL2FyY2hpdmUgbmFtZSlcbiAgICovXG4gIHNlbGVjdE1hdGNoaW5nRHJpdmVycyAob3NJbmZvLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBtaW5Ccm93c2VyVmVyc2lvbixcbiAgICAgIHZlcnNpb25zID0gW10sXG4gICAgfSA9IG9wdHM7XG4gICAgbGV0IGRyaXZlcnNUb1N5bmMgPSBfLmtleXModGhpcy5tYXBwaW5nKTtcblxuICAgIGlmICghXy5pc0VtcHR5KHZlcnNpb25zKSkge1xuICAgICAgLy8gSGFuZGxlIG9ubHkgc2VsZWN0ZWQgdmVyc2lvbnMgaWYgcmVxdWVzdGVkXG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHZlcnNpb25zIG1hdGNoIHRvICR7dmVyc2lvbnN9YCk7XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luY1xuICAgICAgICAuZmlsdGVyKChjZE5hbWUpID0+IHZlcnNpb25zLmluY2x1ZGVzKGAke3RoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb259YCkpO1xuXG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihtaW5Ccm93c2VyVmVyc2lvbikpIHtcbiAgICAgIC8vIE9ubHkgc2VsZWN0IGRyaXZlcnMgdGhhdCBzdXBwb3J0IHRoZSBjdXJyZW50IGJyb3dzZXIgd2hvc2UgbWFqb3IgdmVyc2lvbiBudW1iZXIgZXF1YWxzIHRvIGBtaW5Ccm93c2VyVmVyc2lvbmBcbiAgICAgIGNvbnN0IG1pbkJyb3dzZXJWZXJzaW9uSW50ID0gcGFyc2VJbnQobWluQnJvd3NlclZlcnNpb24sIDEwKTtcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgbWluaW11bSBzdXBwb3J0ZWQgYnJvd3NlciB2ZXJzaW9uIG1hdGNoZXMgdG8gJHttaW5Ccm93c2VyVmVyc2lvbkludH1gKTtcbiAgICAgIGxldCBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSAwO1xuICAgICAgLy8gU2VsZWN0IHRoZSBuZXdlc3QgYXZhaWxhYmxlIGFuZCBjb21wYXRpYmxlIGNocm9tZWRyaXZlclxuICAgICAgZm9yIChjb25zdCBjZE5hbWUgb2YgZHJpdmVyc1RvU3luYykge1xuICAgICAgICBjb25zdCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24gPSBwYXJzZUludCh0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbilcbiAgICAgICAgICAgICYmIGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA8PSBtaW5Ccm93c2VyVmVyc2lvbkludFxuICAgICAgICAgICAgJiYgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDwgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKSB7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID0gY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luYy5maWx0ZXIoKGNkTmFtZSkgPT4gYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0ubWluQnJvd3NlclZlcnNpb259YCA9PT1cbiAgICAgICAgYCR7Y2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID4gMCA/IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA6IG1pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuXG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFdpbGwgc2VsZWN0IGNhbmRpZGF0ZSAke3V0aWwucGx1cmFsaXplKCdkcml2ZXInLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCl9IGAgK1xuICAgICAgICBgdmVyc2lvbmVkIGFzICcke18udW5pcShkcml2ZXJzVG9TeW5jLm1hcCgoY2ROYW1lKSA9PiB0aGlzLm1hcHBpbmdbY2ROYW1lXS52ZXJzaW9uKSl9J2ApO1xuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KG9zSW5mbykpIHtcbiAgICAgIC8vIEZpbHRlciBvdXQgZHJpdmVycyBmb3IgdW5zdXBwb3J0ZWQgc3lzdGVtIGFyY2hpdGVjdHVyZXNcbiAgICAgIGxldCB7bmFtZSwgYXJjaCwgaGFyZHdhcmVOYW1lfSA9IG9zSW5mbztcbiAgICAgIGlmIChhcmNoID09PSBYNjQgJiYgIWRyaXZlcnNUb1N5bmMuc29tZSgoY2ROYW1lKSA9PiBjZE5hbWUuaW5jbHVkZXMoYF8ke25hbWV9JHtYNjR9YCkpKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB4ODYgYnVpbGQgaWYgeDY0IG9uZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gT1NcbiAgICAgICAgYXJjaCA9IFg4NjtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBPUy5tYWMgJiYgXy5pbmNsdWRlcyhoYXJkd2FyZU5hbWUsICdhcm0nKVxuICAgICAgICAgICYmIGRyaXZlcnNUb1N5bmMuc29tZSgoY2ROYW1lKSA9PiBjZE5hbWUuaW5jbHVkZXMoTTFfQVJDSF9TVUZGSVgpKSkge1xuICAgICAgICAvLyBwcmVmZXIgZXhlY3V0YWJsZSBmb3IgTTEgYXJjaCBpZiBwcmVzZW50XG4gICAgICAgIGFyY2ggKz0gTTFfQVJDSF9TVUZGSVg7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHBsYXRmb3JtIG1hdGNoZXMgdG8gJHtuYW1lfSR7YXJjaH1gKTtcbiAgICAgIGNvbnN0IHBsYXRmb3JtUmUgPSBuZXcgUmVnRXhwKGAoXFxcXGJ8Xykke25hbWV9JHthcmNofVxcXFxiYCk7XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luYy5maWx0ZXIoKGNkTmFtZSkgPT4gcGxhdGZvcm1SZS50ZXN0KGNkTmFtZSkpO1xuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZHJpdmVyc1RvU3luYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGdpdmVuIGNocm9tZWRyaXZlciBmcm9tIHRoZSBzdG9yYWdlXG4gICAqIGFuZCB1bnBhY2tzIGl0IGludG8gYHRoaXMuY2hyb21lZHJpdmVyRGlyYCBmb2xkZXJcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHVuaXF1ZSBkcml2ZXIgaW5kZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIFRoZSBkcml2ZXIga2V5IGluIGB0aGlzLm1hcHBpbmdgXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlc1Jvb3QgLSBUaGUgdGVtcG9yYXJ5IGZvbGRlciBwYXRoIHRvIGV4dHJhY3RcbiAgICogZG93bmxvYWRlZCBhcmNoaXZlcyB0b1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3RyaWN0IFt0cnVlXSAtIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgKGB0cnVlYClcbiAgICogb3IgcmV0dXJuIGEgYm9vbGVhbiByZXN1bHQgaWYgdGhlIGRyaXZlciByZXRyaWV2YWwgcHJvY2VzcyBmYWlsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSBkcml2ZXJcbiAgICogYW5kIGBpc1N0cmljdGAgaXMgc2V0IHRvIGB0cnVlYFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgYHRydWVgIHRoZW4gdGhlIGNocm9tZWRyaXZlciBpcyBzdWNjZXNzZnVsbHlcbiAgICogZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkLlxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVEcml2ZXIgKGluZGV4LCBkcml2ZXJLZXksIGFyY2hpdmVzUm9vdCwgaXNTdHJpY3QgPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdXJsLCBldGFnLCB2ZXJzaW9uIH0gPSB0aGlzLm1hcHBpbmdbZHJpdmVyS2V5XTtcbiAgICBjb25zdCBhcmNoaXZlUGF0aCA9IHBhdGgucmVzb2x2ZShhcmNoaXZlc1Jvb3QsIGAke2luZGV4fS56aXBgKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgJyR7dXJsfScgdG8gJyR7YXJjaGl2ZVBhdGh9J2ApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXQuZG93bmxvYWRGaWxlKHVybCwgYXJjaGl2ZVBhdGgsIHtcbiAgICAgICAgaXNNZXRlcmVkOiBmYWxzZSxcbiAgICAgICAgdGltZW91dDogVElNRU9VVF9NU1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbXNnID0gYENhbm5vdCBkb3dubG9hZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWA7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IobXNnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFhd2FpdCBpc0NyY09rKGFyY2hpdmVQYXRoLCBldGFnKSkge1xuICAgICAgY29uc3QgbXNnID0gYFRoZSBjaGVja3N1bSBmb3IgdGhlIGRvd25sb2FkZWQgY2hyb21lZHJpdmVyICcke2RyaXZlcktleX0nIGRpZCBub3QgbWF0Y2hgO1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7cGF0aC5wYXJzZSh1cmwpLm5hbWV9X3Yke3ZlcnNpb259YCArXG4gICAgICAoc3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJycpO1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5jaHJvbWVkcml2ZXJEaXIsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51bnppcERyaXZlcihhcmNoaXZlUGF0aCwgdGFyZ2V0UGF0aCk7XG4gICAgICBhd2FpdCBmcy5jaG1vZCh0YXJnZXRQYXRoLCAwbzc1NSk7XG4gICAgICBsb2cuZGVidWcoYFBlcm1pc3Npb25zIG9mIHRoZSBmaWxlICcke3RhcmdldFBhdGh9JyBoYXZlIGJlZW4gY2hhbmdlZCB0byA3NTVgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBTeW5jT3B0aW9uc1xuICAgKiBAcHJvcGVydHkge0FycmF5PFN0cmluZz59IHZlcnNpb25zIC0gVGhlIGxpc3Qgb2YgY2hyb21lZHJpdmVyXG4gICAqIHZlcnNpb25zIHRvIHN5bmMuIElmIGVtcHR5ICh0aGUgZGVmYXVsdCB2YWx1ZSkgdGhlbiBhbGwgYXZhaWxhYmxlXG4gICAqIGNocm9tZWRyaXZlcnMgYXJlIGdvaW5nIHRvIGJlIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZFxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IG1pbkJyb3dzZXJWZXJzaW9uIC0gVGhlIG1pbnVtdW0gc3VwcG9ydGVkXG4gICAqIENocm9tZSB2ZXJzaW9uIHRoYXQgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXJzIHNob3VsZCBzdXBwb3J0LiBDYW4gbWF0Y2hcbiAgICogbXVsdGlwbGUgZHJpdmVycy5cbiAgICogQHByb3BlcnR5IHs/T1NJbmZvfSBvc0luZm8gLSBTeXN0ZW0gaW5mb3JtYXRpb24gdXNlZCB0byBmaWx0ZXIgb3V0XG4gICAqIHRoZSBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgZHJpdmVycy4gSWYgbm90IHByb3ZpZGVkIHRoZW4gdGhlIHNjcmlwdFxuICAgKiB3aWxsIHRyeSB0byByZXRyaWV2ZSBpdC5cbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBjaHJvbWVkcml2ZXJzIGZyb20gdGhlIHJlbW90ZSBzdG9yYWdlXG4gICAqIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbVxuICAgKlxuICAgKiBAcGFyYW0gez9TeW5jT3B0aW9uc30gb3B0c1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aGlsZSByZXRyaWV2aW5nXG4gICAqIHRoZSBkcml2ZXJzXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmd9IFRoZSBsaXN0IG9mIHN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQgZHJpdmVyIGtleXNcbiAgICovXG4gIGFzeW5jIHN5bmNEcml2ZXJzIChvcHRzID0ge30pIHtcbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMubWFwcGluZykpIHtcbiAgICAgIGF3YWl0IHRoaXMucmV0cmlldmVNYXBwaW5nKCEhb3B0cy5taW5Ccm93c2VyVmVyc2lvbik7XG4gICAgfVxuICAgIGlmIChfLmlzRW1wdHkodGhpcy5tYXBwaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmV0cmlldmUgY2hyb21lZHJpdmVycyBtYXBwaW5nIGZyb20gR29vZ2xlIHN0b3JhZ2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkcml2ZXJzVG9TeW5jID0gdGhpcy5zZWxlY3RNYXRjaGluZ0RyaXZlcnMob3B0cy5vc0luZm8gPz8gYXdhaXQgZ2V0T3NJbmZvKCksIG9wdHMpO1xuICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlcmUgYXJlIG5vIGRyaXZlcnMgdG8gc3luYy4gRXhpdGluZ2ApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdkcml2ZXInLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9IHRvIHN5bmM6IGAgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkoZHJpdmVyc1RvU3luYywgbnVsbCwgMikpO1xuXG4gICAgY29uc3Qgc3luY2hyb25pemVkRHJpdmVycyA9IFtdO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgY29uc3QgYXJjaGl2ZXNSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgW2lkeCwgZHJpdmVyS2V5XSBvZiBkcml2ZXJzVG9TeW5jLmVudHJpZXMoKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKGF3YWl0IHRoaXMucmV0cmlldmVEcml2ZXIoaWR4LCBkcml2ZXJLZXksIGFyY2hpdmVzUm9vdCwgIV8uaXNFbXB0eShvcHRzKSkpIHtcbiAgICAgICAgICAgIHN5bmNocm9uaXplZERyaXZlcnMucHVzaChkcml2ZXJLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKSk7XG5cbiAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCAlIE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPT09IDApIHtcbiAgICAgICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKGFyY2hpdmVzUm9vdCk7XG4gICAgfVxuICAgIGlmICghXy5pc0VtcHR5KHN5bmNocm9uaXplZERyaXZlcnMpKSB7XG4gICAgICBsb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHN5bmNocm9uaXplZCBgICtcbiAgICAgICAgYCR7dXRpbC5wbHVyYWxpemUoJ2Nocm9tZWRyaXZlcicsIHN5bmNocm9uaXplZERyaXZlcnMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oYE5vIGNocm9tZWRyaXZlcnMgd2VyZSBzeW5jaHJvbml6ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN5bmNocm9uaXplZERyaXZlcnM7XG4gIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50O1xuIl0sImZpbGUiOiJsaWIvc3RvcmFnZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -8,11 +8,9 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.getChromeVersion = getChromeVersion;
9
9
  exports.getChromedriverDir = getChromedriverDir;
10
10
  exports.getChromedriverBinaryPath = getChromedriverBinaryPath;
11
- exports.getCurPlatform = getCurPlatform;
12
- exports.getPlatforms = getPlatforms;
13
11
  exports.getMostRecentChromedriver = getMostRecentChromedriver;
14
12
  exports.retrieveData = retrieveData;
15
- exports.CHROMEDRIVER_CHROME_MAPPING = exports.CD_VER = exports.CD_CDN = exports.LINUX_32_ONLY = exports.MAC_32_ONLY = exports.CD_BASE_DIR = void 0;
13
+ exports.M1_ARCH_SUFFIX = exports.X86 = exports.X64 = exports.OS = exports.getOsInfo = exports.CHROMEDRIVER_CHROME_MAPPING = exports.CD_VER = exports.CD_CDN = exports.CD_BASE_DIR = exports.getOsName = void 0;
16
14
 
17
15
  require("source-map-support/register");
18
16
 
@@ -22,12 +20,12 @@ var _appiumSupport = require("appium-support");
22
20
 
23
21
  var _path = _interopRequireDefault(require("path"));
24
22
 
25
- var _semver = _interopRequireDefault(require("semver"));
26
-
27
23
  var _compareVersions = _interopRequireDefault(require("compare-versions"));
28
24
 
29
25
  var _axios = _interopRequireDefault(require("axios"));
30
26
 
27
+ var _teen_process = require("teen_process");
28
+
31
29
  const rootDir = _path.default.basename(__dirname) === 'lib' ? _path.default.resolve(__dirname, process.env.NO_PRECOMPILE ? '..' : '../..') : __dirname;
32
30
 
33
31
  const CHROMEDRIVER_CHROME_MAPPING = require(_path.default.resolve(rootDir, 'config', 'mapping.json'));
@@ -41,10 +39,19 @@ const CD_BASE_DIR = _path.default.resolve(__dirname, '..', '..', 'chromedriver')
41
39
  exports.CD_BASE_DIR = CD_BASE_DIR;
42
40
  const CD_CDN = process.env.npm_config_chromedriver_cdnurl || process.env.CHROMEDRIVER_CDNURL || 'https://chromedriver.storage.googleapis.com';
43
41
  exports.CD_CDN = CD_CDN;
44
- const MAC_32_ONLY = '2.23.0';
45
- exports.MAC_32_ONLY = MAC_32_ONLY;
46
- const LINUX_32_ONLY = '2.34.0';
47
- exports.LINUX_32_ONLY = LINUX_32_ONLY;
42
+ const OS = {
43
+ linux: 'linux',
44
+ windows: 'win',
45
+ mac: 'mac'
46
+ };
47
+ exports.OS = OS;
48
+ const X64 = '64';
49
+ exports.X64 = X64;
50
+ const X86 = '32';
51
+ exports.X86 = X86;
52
+ const M1_ARCH_SUFFIX = '_m1';
53
+ exports.M1_ARCH_SUFFIX = M1_ARCH_SUFFIX;
54
+ const CD_EXECUTABLE_PREFIX = 'chromedriver';
48
55
 
49
56
  function getMostRecentChromedriver(mapping = CHROMEDRIVER_CHROME_MAPPING) {
50
57
  if (_lodash.default.isEmpty(mapping)) {
@@ -61,39 +68,21 @@ async function getChromeVersion(adb, bundleId) {
61
68
  return versionName;
62
69
  }
63
70
 
64
- function getChromedriverDir(platform = getCurPlatform()) {
65
- return _path.default.resolve(CD_BASE_DIR, platform);
66
- }
67
-
68
- async function getChromedriverBinaryPath(platform = getCurPlatform(), arch = null) {
69
- const baseDir = getChromedriverDir(platform);
70
- let ext = '';
71
-
72
- if (platform === 'win') {
73
- ext = '.exe';
74
- } else if (platform === 'linux') {
75
- ext = `_${arch || (await _appiumSupport.system.arch())}`;
76
- }
77
-
78
- return _path.default.resolve(baseDir, `chromedriver${ext}`);
71
+ function getChromedriverDir(osName = getOsName()) {
72
+ return _path.default.resolve(CD_BASE_DIR, osName);
79
73
  }
80
74
 
81
- function getCurPlatform() {
82
- return _appiumSupport.system.isWindows() ? 'win' : _appiumSupport.system.isMac() ? 'mac' : 'linux';
83
- }
84
-
85
- function getPlatforms() {
86
- let plats = [['win', '32'], ['linux', '64']];
87
-
88
- const cdVer = _semver.default.coerce(CD_VER);
89
-
90
- plats.push(_semver.default.lt(cdVer, MAC_32_ONLY) ? ['mac', '32'] : ['mac', '64']);
91
-
92
- if (_semver.default.lt(cdVer, LINUX_32_ONLY)) {
93
- plats.push(['linux', '32']);
94
- }
95
-
96
- return plats;
75
+ async function getChromedriverBinaryPath(osName = getOsName()) {
76
+ const rootDir = getChromedriverDir(osName);
77
+ const pathSuffix = osName === OS.windows ? '.exe' : '';
78
+ const paths = await _appiumSupport.fs.glob(`${CD_EXECUTABLE_PREFIX}*${pathSuffix}`, {
79
+ cwd: rootDir,
80
+ absolute: true,
81
+ nocase: true,
82
+ nodir: true,
83
+ strict: false
84
+ });
85
+ return _lodash.default.isEmpty(paths) ? _path.default.resolve(rootDir, `${CD_EXECUTABLE_PREFIX}${pathSuffix}`) : _lodash.default.first(paths);
97
86
  }
98
87
 
99
88
  async function retrieveData(url, headers, opts = {}) {
@@ -107,7 +96,31 @@ async function retrieveData(url, headers, opts = {}) {
107
96
  timeout,
108
97
  responseType
109
98
  })).data;
110
- }require('source-map-support').install();
99
+ }
100
+
101
+ const getOsName = _lodash.default.memoize(function getOsName() {
102
+ if (_appiumSupport.system.isWindows()) {
103
+ return OS.windows;
104
+ }
105
+
106
+ if (_appiumSupport.system.isMac()) {
107
+ return OS.mac;
108
+ }
109
+
110
+ return OS.linux;
111
+ });
112
+
113
+ exports.getOsName = getOsName;
114
+
115
+ const getOsInfo = _lodash.default.memoize(async function getOsInfo() {
116
+ return {
117
+ name: getOsName(),
118
+ arch: await _appiumSupport.system.arch(),
119
+ hardwareName: _appiumSupport.system.isWindows() ? null : _lodash.default.trim(await (0, _teen_process.exec)('uname', ['-m']))
120
+ };
121
+ });
122
+
123
+ exports.getOsInfo = getOsInfo;require('source-map-support').install();
111
124
 
112
125
 
113
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJyb290RGlyIiwicGF0aCIsImJhc2VuYW1lIiwiX19kaXJuYW1lIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJOT19QUkVDT01QSUxFIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwicmVxdWlyZSIsIkNEX1ZFUiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb24iLCJDSFJPTUVEUklWRVJfVkVSU0lPTiIsImdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIiLCJDRF9CQVNFX0RJUiIsIkNEX0NETiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX2NkbnVybCIsIkNIUk9NRURSSVZFUl9DRE5VUkwiLCJNQUNfMzJfT05MWSIsIkxJTlVYXzMyX09OTFkiLCJtYXBwaW5nIiwiXyIsImlzRW1wdHkiLCJFcnJvciIsImxhc3QiLCJrZXlzIiwic29ydCIsImNvbXBhcmVWZXJzaW9ucyIsImdldENocm9tZVZlcnNpb24iLCJhZGIiLCJidW5kbGVJZCIsInZlcnNpb25OYW1lIiwiZ2V0UGFja2FnZUluZm8iLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJwbGF0Zm9ybSIsImdldEN1clBsYXRmb3JtIiwiZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCIsImFyY2giLCJiYXNlRGlyIiwiZXh0Iiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiaXNNYWMiLCJnZXRQbGF0Zm9ybXMiLCJwbGF0cyIsImNkVmVyIiwic2VtdmVyIiwiY29lcmNlIiwicHVzaCIsImx0IiwicmV0cmlldmVEYXRhIiwidXJsIiwiaGVhZGVycyIsIm9wdHMiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwiZGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsT0FBTyxHQUFHQyxjQUFLQyxRQUFMLENBQWNDLFNBQWQsTUFBNkIsS0FBN0IsR0FDWkYs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aEMsR0FBZ0QsQ0FBQyxLQUFELEVBQVEsSUFBUixDQUEzRDs7QUFFQSxNQUFJNEIsZ0JBQU9HLEVBQVAsQ0FBVUosS0FBVixFQUFpQjFCLGFBQWpCLENBQUosRUFBcUM7QUFDbkN5QixJQUFBQSxLQUFLLENBQUNJLElBQU4sQ0FBVyxDQUFDLE9BQUQsRUFBVSxJQUFWLENBQVg7QUFDRDs7QUFDRCxTQUFPSixLQUFQO0FBQ0Q7O0FBRUQsZUFBZU0sWUFBZixDQUE2QkMsR0FBN0IsRUFBa0NDLE9BQWxDLEVBQTJDQyxJQUFJLEdBQUcsRUFBbEQsRUFBc0Q7QUFDcEQsUUFBTTtBQUNKQyxJQUFBQSxPQUFPLEdBQUcsSUFETjtBQUVKQyxJQUFBQSxZQUFZLEdBQUc7QUFGWCxNQUdGRixJQUhKO0FBSUEsU0FBTyxDQUFDLE1BQU0sb0JBQU07QUFDbEJGLElBQUFBLEdBRGtCO0FBRWxCQyxJQUFBQSxPQUZrQjtBQUdsQkUsSUFBQUEsT0FIa0I7QUFJbEJDLElBQUFBO0FBSmtCLEdBQU4sQ0FBUCxFQUtIQyxJQUxKO0FBTUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc3lzdGVtIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgY29tcGFyZVZlcnNpb25zIGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuXG5jb25zdCByb290RGlyID0gcGF0aC5iYXNlbmFtZShfX2Rpcm5hbWUpID09PSAnbGliJ1xuICA/IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIHByb2Nlc3MuZW52Lk5PX1BSRUNPTVBJTEUgPyAnLi4nIDogJy4uLy4uJylcbiAgOiBfX2Rpcm5hbWU7XG4vLyBDaHJvbWVkcml2ZXIgdmVyc2lvbjogbWluaW11bSBDaHJvbWUgdmVyc2lvblxuY29uc3QgQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HID0gcmVxdWlyZShwYXRoLnJlc29sdmUocm9vdERpciwgJ2NvbmZpZycsICdtYXBwaW5nLmpzb24nKSk7XG5cbmNvbnN0IENEX1ZFUiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb25cbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX1ZFUlNJT05cbiAgfHwgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcigpO1xuY29uc3QgQ0RfQkFTRV9ESVIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnY2hyb21lZHJpdmVyJyk7XG5jb25zdCBDRF9DRE4gPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2Nocm9tZWRyaXZlcl9jZG51cmxcbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX0NETlVSTFxuICB8fCAnaHR0cHM6Ly9jaHJvbWVkcml2ZXIuc3RvcmFnZS5nb29nbGVhcGlzLmNvbSc7XG5cbmNvbnN0IE1BQ18zMl9PTkxZID0gJzIuMjMuMCc7XG5jb25zdCBMSU5VWF8zMl9PTkxZID0gJzIuMzQuMCc7XG5cblxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlciAobWFwcGluZyA9IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORykge1xuICBpZiAoXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uIGZyb20gZW1wdHkgbWFwcGluZycpO1xuICB9XG4gIHJldHVybiBfLmxhc3QoXy5rZXlzKG1hcHBpbmcpLnNvcnQoY29tcGFyZVZlcnNpb25zKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZVZlcnNpb24gKGFkYiwgYnVuZGxlSWQpIHtcbiAgY29uc3Qge3ZlcnNpb25OYW1lfSA9IGF3YWl0IGFkYi5nZXRQYWNrYWdlSW5mbyhidW5kbGVJZCk7XG4gIHJldHVybiB2ZXJzaW9uTmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyRGlyIChwbGF0Zm9ybSA9IGdldEN1clBsYXRmb3JtKCkpIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShDRF9CQVNFX0RJUiwgcGxhdGZvcm0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIChwbGF0Zm9ybSA9IGdldEN1clBsYXRmb3JtKCksIGFyY2ggPSBudWxsKSB7XG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIocGxhdGZvcm0pO1xuICBsZXQgZXh0ID0gJyc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbicpIHtcbiAgICBleHQgPSAnLmV4ZSc7XG4gIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgICBleHQgPSBgXyR7YXJjaCB8fCBhd2FpdCBzeXN0ZW0uYXJjaCgpfWA7XG4gIH1cblxuICByZXR1cm4gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIGBjaHJvbWVkcml2ZXIke2V4dH1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VyUGxhdGZvcm0gKCkge1xuICByZXR1cm4gc3lzdGVtLmlzV2luZG93cygpID8gJ3dpbicgOiAoc3lzdGVtLmlzTWFjKCkgPyAnbWFjJyA6ICdsaW51eCcpO1xufVxuXG5mdW5jdGlvbiBnZXRQbGF0Zm9ybXMgKCkge1xuICBsZXQgcGxhdHMgPSBbXG4gICAgWyd3aW4nLCAnMzInXSxcbiAgICBbJ2xpbnV4JywgJzY0J10sXG4gIF07XG4gIGNvbnN0IGNkVmVyID0gc2VtdmVyLmNvZXJjZShDRF9WRVIpO1xuICAvLyBiZWZvcmUgMi4yMyBNYWMgdmVyc2lvbiB3YXMgMzIgYml0LiBBZnRlciBpdCBpcyA2NC5cbiAgcGxhdHMucHVzaChzZW12ZXIubHQoY2RWZXIsIE1BQ18zMl9PTkxZKSA/IFsnbWFjJywgJzMyJ10gOiBbJ21hYycsICc2NCddKTtcbiAgLy8gMi4zNCBhbmQgYWJvdmUgbGludXggaXMgb25seSBzdXBwb3J0aW5nIDY0IGJpdFxuICBpZiAoc2VtdmVyLmx0KGNkVmVyLCBMSU5VWF8zMl9PTkxZKSkge1xuICAgIHBsYXRzLnB1c2goWydsaW51eCcsICczMiddKTtcbiAgfVxuICByZXR1cm4gcGxhdHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlRGF0YSAodXJsLCBoZWFkZXJzLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSA1MDAwLFxuICAgIHJlc3BvbnNlVHlwZSA9ICd0ZXh0JyxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybCxcbiAgICBoZWFkZXJzLFxuICAgIHRpbWVvdXQsXG4gICAgcmVzcG9uc2VUeXBlLFxuICB9KSkuZGF0YTtcbn1cblxuXG5leHBvcnQge1xuICBnZXRDaHJvbWVWZXJzaW9uLCBnZXRDaHJvbWVkcml2ZXJEaXIsIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsXG4gIGdldEN1clBsYXRmb3JtLCBnZXRQbGF0Zm9ybXMsIENEX0JBU0VfRElSLCBNQUNfMzJfT05MWSwgTElOVVhfMzJfT05MWSxcbiAgQ0RfQ0ROLCBDRF9WRVIsIENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORywgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcixcbiAgcmV0cmlldmVEYXRhLFxufTtcbiJdLCJmaWxlIjoibGliL3V0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
126
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJyb290RGlyIiwicGF0aCIsImJhc2VuYW1lIiwiX19kaXJuYW1lIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJOT19QUkVDT01QSUxFIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwicmVxdWlyZSIsIkNEX1ZFUiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb24iLCJDSFJPTUVEUklWRVJfVkVSU0lPTiIsImdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIiLCJDRF9CQVNFX0RJUiIsIkNEX0NETiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX2NkbnVybCIsIkNIUk9NRURSSVZFUl9DRE5VUkwiLCJPUyIsImxpbnV4Iiwid2luZG93cyIsIm1hYyIsIlg2NCIsIlg4NiIsIk0xX0FSQ0hfU1VGRklYIiwiQ0RfRVhFQ1VUQUJMRV9QUkVGSVgiLCJtYXBwaW5nIiwiXyIsImlzRW1wdHkiLCJFcnJvciIsImxhc3QiLCJrZXlzIiwic29ydCIsImNvbXBhcmVWZXJzaW9ucyIsImdldENocm9tZVZlcnNpb24iLCJhZGIiLCJidW5kbGVJZCIsInZlcnNpb25OYW1lIiwiZ2V0UGFja2FnZUluZm8iLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJvc05hbWUiLCJnZXRPc05hbWUiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwicGF0aFN1ZmZpeCIsInBhdGhzIiwiZnMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJub2Nhc2UiLCJub2RpciIsInN0cmljdCIsImZpcnN0IiwicmV0cmlldmVEYXRhIiwidXJsIiwiaGVhZGVycyIsIm9wdHMiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwiZGF0YSIsIm1lbW9pemUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJpc01hYyIsImdldE9zSW5mbyIsIm5hbWUiLCJhcmNoIiwiaGFyZHdhcmVOYW1lIiwidHJpbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLE9BQU8sR0FBR0MsY0FBS0MsUUFBTCxDQUFjQyxTQUFkLE1BQTZCLEtBQTdCLEdBQ1pGLGNBQUtHLE9BQUwsQ0FBYUQsU0FBYixFQUF3QkUsT0FBTyxDQUFDQyxHQUFSLENBQVlDLGFBQVosR0FBNEIsSUFBNUIsR0FBbUMsT0FBM0QsQ0FEWSxHQUVaSixTQUZKOztBQUlBLE1BQU1LLDJCQUEyQixHQUFHQyxPQUFPLENBQUNSLGNBQUtHLE9BQUwsQ0FBYUosT0FBYixFQUFzQixRQUF0QixFQUFnQyxjQUFoQyxDQUFELENBQTNDOzs7QUFFQSxNQUFNVSxNQUFNLEdBQUdMLE9BQU8sQ0FBQ0MsR0FBUixDQUFZSywrQkFBWixJQUNWTixPQUFPLENBQUNDLEdBQVIsQ0FBWU0sb0JBREYsSUFFVkMseUJBQXlCLEVBRjlCOzs7QUFHQSxNQUFNQyxXQUFXLEdBQUdiLGNBQUtHLE9BQUwsQ0FBYUQsU0FBYixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxjQUFwQyxDQUFwQjs7O0FBQ0EsTUFBTVksTUFBTSxHQUFHVixPQUFPLENBQUNDLEdBQVIsQ0FBWVUsOEJBQVosSUFDVlgsT0FBTyxDQUFDQyxHQUFSLENBQVlXLG1CQURGLElBRVYsNkNBRkw7O0FBR0EsTUFBTUMsRUFBRSxHQUFHO0FBQ1RDLEVBQUFBLEtBQUssRUFBRSxPQURFO0FBRVRDLEVBQUFBLE9BQU8sRUFBRSxLQUZBO0FBR1RDLEVBQUFBLEdBQUcsRUFBRTtBQUhJLENBQVg7O0FBS0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHLEtBQXZCOztBQUNBLE1BQU1DLG9CQUFvQixHQUFHLGNBQTdCOztBQUdBLFNBQVNaLHlCQUFULENBQW9DYSxPQUFPLEdBQUdsQiwyQkFBOUMsRUFBMkU7QUFDekUsTUFBSW1CLGdCQUFFQyxPQUFGLENBQVVGLE9BQVYsQ0FBSixFQUF3QjtBQUN0QixVQUFNLElBQUlHLEtBQUosQ0FBVSxtRUFBVixDQUFOO0FBQ0Q7O0FBQ0QsU0FBT0YsZ0JBQUVHLElBQUYsQ0FBT0gsZ0JBQUVJLElBQUYsQ0FBT0wsT0FBUCxFQUFnQk0sSUFBaEIsQ0FBcUJDLHdCQUFyQixDQUFQLENBQVA7QUFDRDs7QUFFRCxlQUFlQyxnQkFBZixDQUFpQ0MsR0FBakMsRUFBc0NDLFFBQXRDLEVBQWdEO0FBQzlDLFFBQU07QUFBQ0MsSUFBQUE7QUFBRCxNQUFnQixNQUFNRixHQUFHLENBQUNHLGNBQUosQ0FBbUJGLFFBQW5CLENBQTVCO0FBQ0EsU0FBT0MsV0FBUDtBQUNEOztBQUVELFNBQVNFLGtCQUFULENBQTZCQyxNQUFNLEdBQUdDLFNBQVMsRUFBL0MsRUFBbUQ7QUFDakQsU0FBT3hDLGNBQUtHLE9BQUwsQ0FBYVUsV0FBYixFQUEwQjBCLE1BQTFCLENBQVA7QUFDRDs7QUFFRCxlQUFlRSx5QkFBZixDQUEwQ0YsTUFBTSxHQUFHQyxTQUFTLEVBQTVELEVBQWdFO0FBQzlELFFBQU16QyxPQUFPLEdBQUd1QyxrQkFBa0IsQ0FBQ0MsTUFBRCxDQUFsQztBQUNBLFFBQU1HLFVBQVUsR0FBR0gsTUFBTSxLQUFLdEIsRUFBRSxDQUFDRSxPQUFkLEdBQXdCLE1BQXhCLEdBQWlDLEVBQXBEO0FBQ0EsUUFBTXdCLEtBQUssR0FBRyxNQUFNQyxrQkFBR0MsSUFBSCxDQUFTLEdBQUVyQixvQkFBcUIsSUFBR2tCLFVBQVcsRUFBOUMsRUFBaUQ7QUFDbkVJLElBQUFBLEdBQUcsRUFBRS9DLE9BRDhEO0FBRW5FZ0QsSUFBQUEsUUFBUSxFQUFFLElBRnlEO0FBR25FQyxJQUFBQSxNQUFNLEVBQUUsSUFIMkQ7QUFJbkVDLElBQUFBLEtBQUssRUFBRSxJQUo0RDtBQUtuRUMsSUFBQUEsTUFBTSxFQUFFO0FBTDJELEdBQWpELENBQXBCO0FBT0EsU0FBT3hCLGdCQUFFQyxPQUFGLENBQVVnQixLQUFWLElBQ0gzQyxjQUFLRyxPQUFMLENBQWFKLE9BQWIsRUFBdUIsR0FBRXlCLG9CQUFxQixHQUFFa0IsVUFBVyxFQUEzRCxDQURHLEdBRUhoQixnQkFBRXlCLEtBQUYsQ0FBUVIsS0FBUixDQUZKO0FBR0Q7O0FBRUQsZUFBZVMsWUFBZixDQUE2QkMsR0FBN0IsRUFBa0NDLE9BQWxDLEVBQTJDQyxJQUFJLEdBQUcsRUFBbEQsRUFBc0Q7QUFDcEQsUUFBTTtBQUNKQyxJQUFBQSxPQUFPLEdBQUcsSUFETjtBQUVKQyxJQUFBQSxZQUFZLEdBQUc7QUFGWCxNQUdGRixJQUhKO0FBSUEsU0FBTyxDQUFDLE1BQU0sb0JBQU07QUFDbEJGLElBQUFBLEdBRGtCO0FBRWxCQyxJQUFBQSxPQUZrQjtBQUdsQkUsSUFBQUEsT0FIa0I7QUFJbEJDLElBQUFBO0FBSmtCLEdBQU4sQ0FBUCxFQUtIQyxJQUxKO0FBTUQ7O0FBRUQsTUFBTWxCLFNBQVMsR0FBR2QsZ0JBQUVpQyxPQUFGLENBQVUsU0FBU25CLFNBQVQsR0FBc0I7QUFDaEQsTUFBSW9CLHNCQUFPQyxTQUFQLEVBQUosRUFBd0I7QUFDdEIsV0FBTzVDLEVBQUUsQ0FBQ0UsT0FBVjtBQUNEOztBQUNELE1BQUl5QyxzQkFBT0UsS0FBUCxFQUFKLEVBQW9CO0FBQ2xCLFdBQU83QyxFQUFFLENBQUNHLEdBQVY7QUFDRDs7QUFDRCxTQUFPSCxFQUFFLENBQUNDLEtBQVY7QUFDRCxDQVJpQixDQUFsQjs7OztBQVVBLE1BQU02QyxTQUFTLEdBQUdyQyxnQkFBRWlDLE9BQUYsQ0FBVSxlQUFlSSxTQUFmLEdBQTRCO0FBQ3RELFNBQU87QUFDTEMsSUFBQUEsSUFBSSxFQUFFeEIsU0FBUyxFQURWO0FBRUx5QixJQUFBQSxJQUFJLEVBQUUsTUFBTUwsc0JBQU9LLElBQVAsRUFGUDtBQUdMQyxJQUFBQSxZQUFZLEVBQUVOLHNCQUFPQyxTQUFQLEtBQXFCLElBQXJCLEdBQTRCbkMsZ0JBQUV5QyxJQUFGLENBQU8sTUFBTSx3QkFBSyxPQUFMLEVBQWMsQ0FBQyxJQUFELENBQWQsQ0FBYjtBQUhyQyxHQUFQO0FBS0QsQ0FOaUIsQ0FBbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNvbXBhcmVWZXJzaW9ucyBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcblxuXG5jb25zdCByb290RGlyID0gcGF0aC5iYXNlbmFtZShfX2Rpcm5hbWUpID09PSAnbGliJ1xuICA/IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIHByb2Nlc3MuZW52Lk5PX1BSRUNPTVBJTEUgPyAnLi4nIDogJy4uLy4uJylcbiAgOiBfX2Rpcm5hbWU7XG4vLyBDaHJvbWVkcml2ZXIgdmVyc2lvbjogbWluaW11bSBDaHJvbWUgdmVyc2lvblxuY29uc3QgQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HID0gcmVxdWlyZShwYXRoLnJlc29sdmUocm9vdERpciwgJ2NvbmZpZycsICdtYXBwaW5nLmpzb24nKSk7XG5cbmNvbnN0IENEX1ZFUiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb25cbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX1ZFUlNJT05cbiAgfHwgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcigpO1xuY29uc3QgQ0RfQkFTRV9ESVIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnY2hyb21lZHJpdmVyJyk7XG5jb25zdCBDRF9DRE4gPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2Nocm9tZWRyaXZlcl9jZG51cmxcbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX0NETlVSTFxuICB8fCAnaHR0cHM6Ly9jaHJvbWVkcml2ZXIuc3RvcmFnZS5nb29nbGVhcGlzLmNvbSc7XG5jb25zdCBPUyA9IHtcbiAgbGludXg6ICdsaW51eCcsXG4gIHdpbmRvd3M6ICd3aW4nLFxuICBtYWM6ICdtYWMnXG59O1xuY29uc3QgWDY0ID0gJzY0JztcbmNvbnN0IFg4NiA9ICczMic7XG5jb25zdCBNMV9BUkNIX1NVRkZJWCA9ICdfbTEnO1xuY29uc3QgQ0RfRVhFQ1VUQUJMRV9QUkVGSVggPSAnY2hyb21lZHJpdmVyJztcblxuXG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50Q2hyb21lZHJpdmVyIChtYXBwaW5nID0gQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HKSB7XG4gIGlmIChfLmlzRW1wdHkobWFwcGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgbW9zdCByZWNlbnQgQ2hyb21lZHJpdmVyIHZlcnNpb24gZnJvbSBlbXB0eSBtYXBwaW5nJyk7XG4gIH1cbiAgcmV0dXJuIF8ubGFzdChfLmtleXMobWFwcGluZykuc29ydChjb21wYXJlVmVyc2lvbnMpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lVmVyc2lvbiAoYWRiLCBidW5kbGVJZCkge1xuICBjb25zdCB7dmVyc2lvbk5hbWV9ID0gYXdhaXQgYWRiLmdldFBhY2thZ2VJbmZvKGJ1bmRsZUlkKTtcbiAgcmV0dXJuIHZlcnNpb25OYW1lO1xufVxuXG5mdW5jdGlvbiBnZXRDaHJvbWVkcml2ZXJEaXIgKG9zTmFtZSA9IGdldE9zTmFtZSgpKSB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUoQ0RfQkFTRV9ESVIsIG9zTmFtZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGggKG9zTmFtZSA9IGdldE9zTmFtZSgpKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIob3NOYW1lKTtcbiAgY29uc3QgcGF0aFN1ZmZpeCA9IG9zTmFtZSA9PT0gT1Mud2luZG93cyA/ICcuZXhlJyA6ICcnO1xuICBjb25zdCBwYXRocyA9IGF3YWl0IGZzLmdsb2IoYCR7Q0RfRVhFQ1VUQUJMRV9QUkVGSVh9KiR7cGF0aFN1ZmZpeH1gLCB7XG4gICAgY3dkOiByb290RGlyLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIG5vY2FzZTogdHJ1ZSxcbiAgICBub2RpcjogdHJ1ZSxcbiAgICBzdHJpY3Q6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIF8uaXNFbXB0eShwYXRocylcbiAgICA/IHBhdGgucmVzb2x2ZShyb290RGlyLCBgJHtDRF9FWEVDVVRBQkxFX1BSRUZJWH0ke3BhdGhTdWZmaXh9YClcbiAgICA6IF8uZmlyc3QocGF0aHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZURhdGEgKHVybCwgaGVhZGVycywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0aW1lb3V0ID0gNTAwMCxcbiAgICByZXNwb25zZVR5cGUgPSAndGV4dCcsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmwsXG4gICAgaGVhZGVycyxcbiAgICB0aW1lb3V0LFxuICAgIHJlc3BvbnNlVHlwZSxcbiAgfSkpLmRhdGE7XG59XG5cbmNvbnN0IGdldE9zTmFtZSA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRPc05hbWUgKCkge1xuICBpZiAoc3lzdGVtLmlzV2luZG93cygpKSB7XG4gICAgcmV0dXJuIE9TLndpbmRvd3M7XG4gIH1cbiAgaWYgKHN5c3RlbS5pc01hYygpKSB7XG4gICAgcmV0dXJuIE9TLm1hYztcbiAgfVxuICByZXR1cm4gT1MubGludXg7XG59KTtcblxuY29uc3QgZ2V0T3NJbmZvID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldE9zSW5mbyAoKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogZ2V0T3NOYW1lKCksXG4gICAgYXJjaDogYXdhaXQgc3lzdGVtLmFyY2goKSxcbiAgICBoYXJkd2FyZU5hbWU6IHN5c3RlbS5pc1dpbmRvd3MoKSA/IG51bGwgOiBfLnRyaW0oYXdhaXQgZXhlYygndW5hbWUnLCBbJy1tJ10pKSxcbiAgfTtcbn0pO1xuXG5cbmV4cG9ydCB7XG4gIGdldENocm9tZVZlcnNpb24sIGdldENocm9tZWRyaXZlckRpciwgZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCwgZ2V0T3NOYW1lLFxuICBDRF9CQVNFX0RJUiwgQ0RfQ0ROLCBDRF9WRVIsIENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORywgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcixcbiAgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sIE9TLCBYNjQsIFg4NiwgTTFfQVJDSF9TVUZGSVgsXG59O1xuIl0sImZpbGUiOiJsaWIvdXRpbHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -1,4 +1,8 @@
1
1
  {
2
+ "91.0.4472.101": "91.0.4472.101",
3
+ "91.0.4472.19": "91.0.4472.19",
4
+ "90.0.4430.24": "90.0.4430.24",
5
+ "89.0.4389.23": "89.0.4389.23",
2
6
  "88.0.4324.96": "88.0.4324.96",
3
7
  "87.0.4280.88": "87.0.4280.88",
4
8
  "87.0.4280.20": "87.0.4280.20",
package/lib/install.js CHANGED
@@ -1,135 +1,43 @@
1
- import _ from 'lodash';
2
- import path from 'path';
3
- import { parallel as ll } from 'asyncbox';
4
- import { system, tempDir, fs, zip, mkdirp, net } from 'appium-support';
1
+ import { fs, mkdirp } from 'appium-support';
2
+ import ChromedriverStorageClient from './storage-client';
5
3
  import {
6
- CD_CDN, CD_VER, CD_BASE_DIR, getChromedriverBinaryPath,
7
- getCurPlatform, getPlatforms, MAC_32_ONLY, retrieveData,
4
+ CD_CDN, CD_VER, retrieveData, getOsInfo, getChromedriverDir,
8
5
  } from './utils';
9
- import logger from 'fancy-log';
10
- import semver from 'semver';
11
6
 
12
7
 
13
- function log (line) {
14
- logger(`[Chromedriver Install] ${line}`);
15
- }
16
-
17
- const CD_PLATS = ['linux', 'win', 'mac'];
18
- const CD_ARCHS = ['32', '64'];
19
8
  const DOWNLOAD_TIMEOUT_MS = 15 * 1000;
9
+ const LATEST_VERSION = 'LATEST';
20
10
 
21
- async function getArchAndPlatform () {
22
- let arch = await system.arch();
23
- let platform = getCurPlatform();
24
- if (platform !== 'linux' && platform !== 'mac') {
25
- arch = '32';
26
- }
27
-
28
- const cdVer = semver.coerce(CD_VER);
29
- if (platform === 'mac' && semver.lt(cdVer, MAC_32_ONLY)) {
30
- arch = '32';
31
- }
32
- return {arch, platform};
33
- }
34
-
35
- function getDownloadUrl (version, platform, arch) {
36
- return `${CD_CDN}/${version}/chromedriver_${platform}${arch}.zip`;
37
- }
38
-
39
- function validatePlatform (platform, arch) {
40
- if (!_.includes(CD_PLATS, platform)) {
41
- throw new Error(`Invalid platform: ${platform}`);
42
- }
43
- if (!_.includes(CD_ARCHS, arch)) {
44
- throw new Error(`Invalid arch: ${arch}`);
45
- }
46
- if (arch === '64' && platform !== 'linux' && platform !== 'mac') {
47
- throw new Error('Only linux has a 64-bit version of Chromedriver');
48
- }
49
- }
50
-
51
- async function installForPlatform (version, platform, arch) {
52
- if (version === 'LATEST') {
53
- version = (await retrieveData(`${CD_CDN}/LATEST_RELEASE`, {
11
+ async function formatCdVersion (ver) {
12
+ return ver === LATEST_VERSION
13
+ ? (await retrieveData(`${CD_CDN}/LATEST_RELEASE`, {
54
14
  'user-agent': 'appium',
55
15
  accept: '*/*',
56
- }, { timeout: DOWNLOAD_TIMEOUT_MS })).trim();
57
- }
58
- validatePlatform(platform, arch);
59
-
60
- const url = getDownloadUrl(version, platform, arch);
61
-
62
- log(`Installing Chromedriver version '${version}' for platform '${platform}' and architecture '${arch}'`);
63
-
64
- // set up a temp file to download the chromedriver zipfile to
65
- const binarySpec = `chromedriver_${platform}${arch}`;
66
- log(`Opening temp file to write '${binarySpec}' to...`);
67
- const tempFile = await tempDir.open({
68
- prefix: binarySpec,
69
- suffix: '.zip'
70
- });
71
- log(`Opened temp file '${tempFile.path}'`);
72
-
73
- // actually download the zipfile and write it with appropriate perms
74
- log(`Downloading ${url} to '${tempFile.path}'`);
75
- await net.downloadFile(url, tempFile.path, {timeout: DOWNLOAD_TIMEOUT_MS});
76
- await fs.chmod(tempFile.path, 0o0644);
77
-
78
- // extract downloaded zipfile to tempdir
79
- const tempUnzipped = path.resolve(path.dirname(tempFile.path), binarySpec);
80
- log(`Extracting ${tempFile.path} to ${tempUnzipped}`);
81
- await mkdirp(tempUnzipped);
82
- await zip.extractAllTo(tempFile.path, tempUnzipped);
83
- let extractedBin = path.resolve(tempUnzipped, 'chromedriver');
84
- if (platform === 'win') {
85
- extractedBin += '.exe';
86
- }
87
-
88
- // make build dirs that will hold the chromedriver binary
89
- log(`Creating ${path.resolve(CD_BASE_DIR, platform)}...`);
90
- await mkdirp(path.resolve(CD_BASE_DIR, platform));
91
-
92
- // copy the extracted binary to the correct build dir
93
- const newBin = await getChromedriverBinaryPath(platform, arch);
94
- log(`Copying unzipped binary, reading from ${extractedBin}...`);
95
- const binContents = await fs.readFile(extractedBin, {encoding: 'binary'});
96
- log(`Writing to ${newBin}...`);
97
- await fs.writeFile(newBin, binContents, {encoding: 'binary', mode: 0o755});
98
- log(`${newBin} successfully put in place`);
16
+ }, { timeout: DOWNLOAD_TIMEOUT_MS })).trim()
17
+ : ver;
99
18
  }
100
19
 
101
- async function install () {
102
- const {arch, platform} = await getArchAndPlatform();
103
- await installForPlatform(CD_VER, platform, arch);
104
- }
105
-
106
- async function conditionalInstall () {
107
- const {arch, platform} = await getArchAndPlatform();
108
- const binPath = await getChromedriverBinaryPath(platform, arch);
109
- if (!await fs.exists(binPath)) {
110
- await installForPlatform(CD_VER, platform, arch);
111
- } else {
112
- log(`No need to install chromedriver, ${binPath} exists`);
20
+ async function prepareChromedriverDir (platformName) {
21
+ const chromedriverDir = getChromedriverDir(platformName);
22
+ if (!await fs.exists(chromedriverDir)) {
23
+ await mkdirp(chromedriverDir);
113
24
  }
25
+ return chromedriverDir;
114
26
  }
115
27
 
116
- async function installAll () {
117
- let downloads = [];
118
- for (let [platform, arch] of getPlatforms()) {
119
- downloads.push(installForPlatform(CD_VER, platform, arch));
120
- }
121
- await ll(downloads);
28
+ async function install () {
29
+ const osInfo = await getOsInfo();
30
+ const client = new ChromedriverStorageClient({
31
+ chromedriverDir: await prepareChromedriverDir(osInfo.name),
32
+ });
33
+ await client.syncDrivers({
34
+ osInfo,
35
+ versions: [await formatCdVersion(CD_VER)],
36
+ });
122
37
  }
123
38
 
124
39
  async function doInstall () {
125
- if (_.includes(process.argv, '--all') ||
126
- process.env.npm_config_chromedriver_install_all) {
127
- await installAll();
128
- } else if (_.includes(process.argv, '--conditional')) {
129
- await conditionalInstall();
130
- } else {
131
- await install();
132
- }
40
+ await install();
133
41
  }
134
42
 
135
- export { install, installAll, conditionalInstall, doInstall };
43
+ export { install, doInstall };