appium-android-driver 5.2.8 → 5.2.11

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.
@@ -40,6 +40,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
40
40
 
41
41
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
42
42
 
43
+ const MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';
43
44
  const PACKAGE_INSTALL_TIMEOUT = 90000;
44
45
  const CHROME_BROWSER_PACKAGE_ACTIVITY = {
45
46
  chrome: {
@@ -188,7 +189,7 @@ helpers.prepareEmulator = async function prepareEmulator(adb, opts) {
188
189
  }
189
190
 
190
191
  const avdName = avd.replace('@', '');
191
- const runningAVD = await adb.getRunningAVD(avdName);
192
+ const runningAVD = await adb.getRunningAVDWithRetry(avdName);
192
193
  const args = prepareAvdArgs(adb, opts);
193
194
 
194
195
  if (runningAVD) {
@@ -568,6 +569,75 @@ helpers.setMockLocationApp = async function setMockLocationApp(adb, app) {
568
569
  }
569
570
  } catch (err) {
570
571
  _logger.default.warn(`Unable to set mock location for app '${app}': ${err.message}`);
572
+
573
+ return;
574
+ }
575
+
576
+ try {
577
+ let pkgIds = [];
578
+
579
+ if (await adb.fileExists(MOCK_APP_IDS_STORE)) {
580
+ try {
581
+ pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));
582
+ } catch (ign) {}
583
+ }
584
+
585
+ if (pkgIds.includes(app)) {
586
+ return;
587
+ }
588
+
589
+ pkgIds.push(app);
590
+ const tmpRoot = await _support.tempDir.openDir();
591
+
592
+ const srcPath = _path.default.posix.join(tmpRoot, _path.default.posix.basename(MOCK_APP_IDS_STORE));
593
+
594
+ try {
595
+ await _support.fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');
596
+ await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);
597
+ } finally {
598
+ await _support.fs.rimraf(tmpRoot);
599
+ }
600
+ } catch (e) {
601
+ _logger.default.warn(`Unable to persist mock location app id '${app}': ${e.message}`);
602
+ }
603
+ };
604
+
605
+ helpers.resetMockLocation = async function resetMockLocation(adb) {
606
+ try {
607
+ if ((await adb.getApiLevel()) < 23) {
608
+ await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);
609
+ return;
610
+ }
611
+
612
+ const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);
613
+ let pkgIds = [];
614
+
615
+ if (await adb.fileExists(MOCK_APP_IDS_STORE)) {
616
+ try {
617
+ pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));
618
+ } catch (ign) {}
619
+ }
620
+
621
+ const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;
622
+
623
+ const resultPkgs = _lodash.default.intersection(pkgIds, thirdPartyPkgIds);
624
+
625
+ if (_lodash.default.size(resultPkgs) <= 1) {
626
+ var _resultPkgs$;
627
+
628
+ await adb.shell(['appops', 'set', (_resultPkgs$ = resultPkgs[0]) !== null && _resultPkgs$ !== void 0 ? _resultPkgs$ : SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);
629
+ return;
630
+ }
631
+
632
+ _logger.default.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);
633
+
634
+ await _bluebird.default.all(resultPkgs.map(pkgId => (async () => {
635
+ try {
636
+ await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);
637
+ } catch (ign) {}
638
+ })()));
639
+ } catch (err) {
640
+ _logger.default.warn(`Unable to reset mock location: ${err.message}`);
571
641
  }
572
642
  };
573
643
 
@@ -778,8 +848,12 @@ helpers.initDevice = async function initDevice(adb, opts) {
778
848
  await helpers.pushSettingsApp(adb, shouldThrowError, opts);
779
849
  }
780
850
 
781
- if (!helpers.isEmulator(adb, opts) && (mockLocationApp || _lodash.default.isUndefined(mockLocationApp))) {
782
- await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);
851
+ if (!helpers.isEmulator(adb, opts)) {
852
+ if (mockLocationApp || _lodash.default.isUndefined(mockLocationApp)) {
853
+ await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);
854
+ } else {
855
+ await helpers.resetMockLocation(adb);
856
+ }
783
857
  }
784
858
 
785
859
  if (language || locale) {
@@ -913,4 +987,4 @@ var _default = helpers;
913
987
  exports.default = _default;require('source-map-support').install();
914
988
 
915
989
 
916
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2FuZHJvaWQtaGVscGVycy5qcyIsIm5hbWVzIjpbIlBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUIiwiQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSIsImNocm9tZSIsInBrZyIsImFjdGl2aXR5IiwiY2hyb21pdW0iLCJjaHJvbWViZXRhIiwiYnJvd3NlciIsImRlZmF1bHQiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWSIsIkVNVUxBVE9SX1BBVFRFUk4iLCJBUFBfU1RBVEUiLCJPYmplY3QiLCJmcmVlemUiLCJOT1RfSU5TVEFMTEVEIiwiTk9UX1JVTk5JTkciLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJhZGIiLCJuZXR3b3JrU3BlZWQiLCJfIiwidmFsdWVzIiwiTkVUV09SS19TUEVFRCIsImluY2x1ZGVzIiwibG9nZ2VyIiwid2FybiIsIkZVTEwiLCJwcmVwYXJlQXZkQXJncyIsIm9wdHMiLCJpc0hlYWRsZXNzIiwiYXZkQXJncyIsInJlc3VsdCIsImlzQXJyYXkiLCJwdXNoIiwidXRpbCIsInNoZWxsUGFyc2UiLCJ0b0NyZWRlbnRpYWxUeXBlIiwidW5sb2NrVHlwZSIsIlBJTl9VTkxPQ0siLCJQSU5fVU5MT0NLX0tFWV9FVkVOVCIsIlBBU1NXT1JEX1VOTE9DSyIsIlBBVFRFUk5fVU5MT0NLIiwiRXJyb3IiLCJoZWxwZXJzIiwiY3JlYXRlQmFzZUFEQiIsImFkYlBvcnQiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInJlbW90ZUFwcHNDYWNoZUxpbWl0IiwiYnVpbGRUb29sc1ZlcnNpb24iLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiYWxsb3dEZWxheUFkYiIsIkFEQiIsImNyZWF0ZUFEQiIsInByZXBhcmVFbXVsYXRvciIsImF2ZCIsImF2ZEVudiIsImVudiIsImxhbmd1YWdlIiwibG9jYWxlIiwiY291bnRyeSIsImF2ZExhdW5jaFRpbWVvdXQiLCJsYXVuY2hUaW1lb3V0IiwiYXZkUmVhZHlUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwiYXZkTmFtZSIsInJlcGxhY2UiLCJydW5uaW5nQVZEIiwiZ2V0UnVubmluZ0FWRCIsImFyZ3MiLCJkZWJ1ZyIsImtpbGxFbXVsYXRvciIsImxhdW5jaEFWRCIsImVuc3VyZURldmljZUxvY2FsZSIsInNjcmlwdCIsImlzU3RyaW5nIiwic2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IiwiZW5zdXJlQ3VycmVudExvY2FsZSIsIm1lc3NhZ2UiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJ1ZGlkIiwiZW1Qb3J0IiwiY3VyRGV2aWNlSWQiLCJlbXVsYXRvclBvcnQiLCJpbmZvIiwiZGV2aWNlcyIsImdldERldmljZXNXaXRoUmV0cnkiLCJtYXAiLCJlcnJvckFuZFRocm93IiwiZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyIsInBsYXRmb3JtVmVyc2lvbiIsInRyaW0iLCJzZW12ZXIiLCJjb2VyY2UiLCJhdmFpbERldmljZXMiLCJwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUiLCJkZXZpY2UiLCJzZXREZXZpY2VJZCIsInJhd0RldmljZU9TIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlT1MiLCJib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQiLCJ2YWxpZCIsImJvdGhWZXJzaW9uc0FyZVN0cmluZ3MiLCJ2ZXJzaW9uIiwidG9Mb3dlciIsIm1ham9yIiwibWlub3IiLCJndCIsImtleXMiLCJqb2luIiwic2V0RW11bGF0b3JQb3J0IiwidmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyIsImtleSIsIm5hbWUiLCJtYXRjaCIsImV4ZWMiLCJpbmRleCIsInN1YnN0cmluZyIsImdldExhdW5jaEluZm8iLCJhcHAiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXRBY3Rpdml0eSIsImFwa1BhY2thZ2UiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInJlc2V0QXBwIiwiZmFzdFJlc2V0IiwiZnVsbFJlc2V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiYXV0b0dyYW50UGVybWlzc2lvbnMiLCJhbGxvd1Rlc3RQYWNrYWdlcyIsImlzSW5zdGFsbGVkIiwiaXNBcHBJbnN0YWxsZWQiLCJmb3JjZVN0b3AiLCJpZ24iLCJvdXRwdXQiLCJjbGVhciIsInRvTG93ZXJDYXNlIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImVycm9yIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbCIsImdyYW50UGVybWlzc2lvbnMiLCJ0aW1lb3V0IiwiaW5zdGFsbEFwayIsImVuZm9yY2VBcHBJbnN0YWxsIiwiYXBwU3RhdGUiLCJ3YXNVbmluc3RhbGxlZCIsImluc3RhbGxPclVwZ3JhZGUiLCJlbmZvcmNlQ3VycmVudEJ1aWxkIiwiaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAiLCJBUFBfSU5TVEFMTF9TVEFURSIsImluc3RhbGxPdGhlckFwa3MiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwib3RoZXJBcHAiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYXBwUGFja2FnZXMiLCJmaWx0ZXJQYWNrYWdlcyIsImdldFRoaXJkUGFydHlQYWNrYWdlcyIsInBhY2thZ2VzU3RyaW5nIiwic2hlbGwiLCJhcHBQYWNrYWdlc0FycmF5Iiwic3BsaXQiLCJFT0wiLCJkaWZmZXJlbmNlIiwiZXJyIiwiaW5pdFVuaWNvZGVLZXlib2FyZCIsImRlZmF1bHRJTUUiLCJhcHBpdW1JTUUiLCJlbmFibGVJTUUiLCJzZXRJTUUiLCJzZXRNb2NrTG9jYXRpb25BcHAiLCJnZXRBcGlMZXZlbCIsImluc3RhbGxIZWxwZXJBcHAiLCJhcGtQYXRoIiwicGFja2FnZUlkIiwicmV0cnkiLCJyZXRyeUluc3RhbGxIZWxwZXJBcHAiLCJwdXNoU2V0dGluZ3NBcHAiLCJ0aHJvd0Vycm9yIiwic2V0dGluZ3NBcGtQYXRoIiwicHJvY2Vzc0V4aXN0cyIsImFwaUxldmVsIiwicGVybXMiLCJ4IiwicmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCIsImlzRW11bGF0b3IiLCJwdXNoU3RyaW5ncyIsInJlbW90ZURpciIsInN0cmluZ3NKc29uIiwicmVtb3RlRmlsZSIsInBhdGgiLCJwb3NpeCIsInJlc29sdmUiLCJyaW1yYWYiLCJwdWxsQXBrIiwidG1wRGlyIiwiaXNFbXB0eSIsImZzIiwiZXhpc3RzIiwic3RyaW5nc1RtcERpciIsImFwa1N0cmluZ3MiLCJsb2NhbFBhdGgiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJ1bmxvY2tXaXRoSGVscGVyQXBwIiwiZmlyc3RSdW4iLCJsYXVuY2hIZWxwZXIiLCJpc1NjcmVlbkxvY2tlZCIsImUiLCJkZWxheSIsInVubG9jayIsImRyaXZlciIsImNhcGFiaWxpdGllcyIsInVubG9ja0tleSIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiLCJ1bmxvY2tlciIsInZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIiwiRklOR0VSUFJJTlRfVU5MT0NLIiwiaXNOaWwiLCJpc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkIiwiZmFzdFVubG9jayIsImNyZWRlbnRpYWwiLCJjcmVkZW50aWFsVHlwZSIsInVubG9ja01ldGhvZCIsInBpblVubG9jayIsInBpblVubG9ja1dpdGhLZXlFdmVudCIsInBhc3N3b3JkVW5sb2NrIiwicGF0dGVyblVubG9jayIsImZpbmdlcnByaW50VW5sb2NrIiwidmVyaWZ5VW5sb2NrIiwidGltZW91dE1zIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJpbml0RGV2aWNlIiwic2tpcERldmljZUluaXRpYWxpemF0aW9uIiwibG9jYWxlU2NyaXB0IiwidW5pY29kZUtleWJvYXJkIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInNraXBVbmxvY2siLCJtb2NrTG9jYXRpb25BcHAiLCJza2lwTG9nY2F0Q2FwdHVyZSIsImxvZ2NhdEZvcm1hdCIsImxvZ2NhdEZpbHRlclNwZWNzIiwid2FpdEZvckRldmljZSIsInNob3VsZFRocm93RXJyb3IiLCJpc1VuZGVmaW5lZCIsInN0YXJ0TG9nY2F0IiwiZm9ybWF0IiwiZmlsdGVyU3BlY3MiLCJyZW1vdmVOdWxsUHJvcGVydGllcyIsIm9iaiIsImlzTnVsbCIsInRydW5jYXRlRGVjaW1hbHMiLCJudW1iZXIiLCJkaWdpdHMiLCJtdWx0aXBsaWVyIiwiTWF0aCIsInBvdyIsImFkanVzdGVkTnVtIiwidHJ1bmNhdGVkTnVtIiwiaXNDaHJvbWVCcm93c2VyIiwiZ2V0Q2hyb21lUGtnIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwic2Vzc2lvbklkIiwiaXNGdW5jdGlvbiIsImdldFdlYlNvY2tldEhhbmRsZXJzIiwiYWN0aXZlSGFuZGxlcnMiLCJwYXRobmFtZSIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJwYXJzZUFycmF5IiwiY2FwIiwicGFyc2VkQ2FwcyIsIkpTT04iLCJwYXJzZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiYnJvd3Nlck5hbWUiLCJhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMiLCJzdHJpbmdpZnkiLCJwb3NzaWJsZU5hbWVzIiwic29tZSIsInRlc3QiLCJib290c3RyYXAiLCJCb290c3RyYXAiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvYW5kcm9pZC1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJldHJ5LCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmcywgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHBhdGggYXMgc2V0dGluZ3NBcGtQYXRoIH0gZnJvbSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmltcG9ydCBCb290c3RyYXAgZnJvbSAnLi9ib290c3RyYXAnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IEFEQiBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgdW5sb2NrZXIsIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULFxuICBQQVNTV09SRF9VTkxPQ0ssIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbn0gZnJvbSAnLi91bmxvY2staGVscGVycyc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmNvbnN0IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUID0gOTAwMDA7IC8vIG1pbGxpc2Vjb25kc1xuLy8gaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG5jb25zdCBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZID0ge1xuICBjaHJvbWU6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBjaHJvbWl1bToge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnLkNocm9tZVNoZWxsQWN0aXZpdHknLFxuICB9LFxuICBjaHJvbWViZXRhOiB7XG4gICAgcGtnOiAnY29tLmNocm9tZS5iZXRhJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgYnJvd3Nlcjoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmJyb3dzZXInLFxuICAgIGFjdGl2aXR5OiAnY29tLmFuZHJvaWQuYnJvd3Nlci5Ccm93c2VyQWN0aXZpdHknLFxuICB9LFxuICAnY2hyb21pdW0tYnJvd3Nlcic6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgJ2Nocm9taXVtLXdlYnZpZXcnOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwuV2ViVmlld0Jyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gIGRlZmF1bHQ6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxufTtcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgPSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFkgPSAnLlVubG9jayc7XG5jb25zdCBFTVVMQVRPUl9QQVRURVJOID0gL1xcYmVtdWxhdG9yXFxiL2k7XG4vLyBUaGVzZSBjb25zdGFudHMgYXJlIGluIHN5bmMgd2l0aFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWlhcHBsaWNhdGlvbnN0YXRlL3hjdWlhcHBsaWNhdGlvbnN0YXRlcnVubmluZ2JhY2tncm91bmQ/bGFuZ3VhZ2U9b2JqY1xuY29uc3QgQVBQX1NUQVRFID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5PVF9JTlNUQUxMRUQ6IDAsXG4gIE5PVF9SVU5OSU5HOiAxLFxuICBSVU5OSU5HX0lOX0JBQ0tHUk9VTkQ6IDMsXG4gIFJVTk5JTkdfSU5fRk9SRUdST1VORDogNFxufSk7XG5cblxuZnVuY3Rpb24gZW5zdXJlTmV0d29ya1NwZWVkIChhZGIsIG5ldHdvcmtTcGVlZCkge1xuICBpZiAoXy52YWx1ZXMoYWRiLk5FVFdPUktfU1BFRUQpLmluY2x1ZGVzKG5ldHdvcmtTcGVlZCkpIHtcbiAgICByZXR1cm4gbmV0d29ya1NwZWVkO1xuICB9XG4gIGxvZ2dlci53YXJuKGBXcm9uZyBuZXR3b3JrIHNwZWVkIHBhcmFtICcke25ldHdvcmtTcGVlZH0nLCB1c2luZyBkZWZhdWx0OiAke2FkYi5ORVRXT1JLX1NQRUVELkZVTEx9LiBgICtcbiAgICBgU3VwcG9ydGVkIHZhbHVlczogJHtfLnZhbHVlcyhhZGIuTkVUV09SS19TUEVFRCl9YCk7XG4gIHJldHVybiBhZGIuTkVUV09SS19TUEVFRC5GVUxMO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlQXZkQXJncyAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBuZXR3b3JrU3BlZWQsXG4gICAgaXNIZWFkbGVzcyxcbiAgICBhdmRBcmdzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGlmIChhdmRBcmdzKSB7XG4gICAgaWYgKF8uaXNBcnJheShhdmRBcmdzKSkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uYXZkQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLih1dGlsLnNoZWxsUGFyc2UoYCR7YXZkQXJnc31gKSkpO1xuICAgIH1cbiAgfVxuICBpZiAobmV0d29ya1NwZWVkKSB7XG4gICAgcmVzdWx0LnB1c2goJy1uZXRzcGVlZCcsIGVuc3VyZU5ldHdvcmtTcGVlZChhZGIsIG5ldHdvcmtTcGVlZCkpO1xuICB9XG4gIGlmIChpc0hlYWRsZXNzKSB7XG4gICAgcmVzdWx0LnB1c2goJy1uby13aW5kb3cnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB0b0NyZWRlbnRpYWxUeXBlICh1bmxvY2tUeXBlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBbUElOX1VOTE9DS106ICdwaW4nLFxuICAgIFtQSU5fVU5MT0NLX0tFWV9FVkVOVF06ICdwaW4nLFxuICAgIFtQQVNTV09SRF9VTkxPQ0tdOiAncGFzc3dvcmQnLFxuICAgIFtQQVRURVJOX1VOTE9DS106ICdwYXR0ZXJuJyxcbiAgfVt1bmxvY2tUeXBlXTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScgaXMgbm90IGtub3duYCk7XG59XG5cblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5oZWxwZXJzLmNyZWF0ZUJhc2VBREIgPSBhc3luYyBmdW5jdGlvbiBjcmVhdGVCYXNlQURCIChvcHRzID0ge30pIHtcbiAgLy8gZmlsdGVyIG91dCBhbnkgdW53YW50ZWQgb3B0aW9ucyBzZW50IGluXG4gIC8vIHRoaXMgbGlzdCBzaG91bGQgYmUgdXBkYXRlZCBhcyBBREIgdGFrZXMgbW9yZSBhcmd1bWVudHNcbiAgY29uc3Qge1xuICAgIGFkYlBvcnQsXG4gICAgc3VwcHJlc3NLaWxsU2VydmVyLFxuICAgIHJlbW90ZUFkYkhvc3QsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICBhZGJFeGVjVGltZW91dCxcbiAgICB1c2VLZXlzdG9yZSxcbiAgICBrZXlzdG9yZVBhdGgsXG4gICAga2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZCxcbiAgICByZW1vdGVBcHBzQ2FjaGVMaW1pdCxcbiAgICBidWlsZFRvb2xzVmVyc2lvbixcbiAgICBhbGxvd09mZmxpbmVEZXZpY2VzLFxuICAgIGFsbG93RGVsYXlBZGIsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgQURCLmNyZWF0ZUFEQih7XG4gICAgYWRiUG9ydCxcbiAgICBzdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgcmVtb3RlQWRiSG9zdCxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgIGFkYkV4ZWNUaW1lb3V0LFxuICAgIHVzZUtleXN0b3JlLFxuICAgIGtleXN0b3JlUGF0aCxcbiAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkLFxuICAgIHJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIGJ1aWxkVG9vbHNWZXJzaW9uLFxuICAgIGFsbG93T2ZmbGluZURldmljZXMsXG4gICAgYWxsb3dEZWxheUFkYixcbiAgfSk7XG59O1xuXG5oZWxwZXJzLnByZXBhcmVFbXVsYXRvciA9IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBhdmQsXG4gICAgYXZkRW52OiBlbnYsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbG9jYWxlOiBjb3VudHJ5LFxuICAgIGF2ZExhdW5jaFRpbWVvdXQ6IGxhdW5jaFRpbWVvdXQsXG4gICAgYXZkUmVhZHlUaW1lb3V0OiByZWFkeVRpbWVvdXQsXG4gIH0gPSBvcHRzO1xuICBpZiAoIWF2ZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxhdW5jaCBBVkQgd2l0aG91dCBBVkQgbmFtZScpO1xuICB9XG5cbiAgY29uc3QgYXZkTmFtZSA9IGF2ZC5yZXBsYWNlKCdAJywgJycpO1xuICBjb25zdCBydW5uaW5nQVZEID0gYXdhaXQgYWRiLmdldFJ1bm5pbmdBVkQoYXZkTmFtZSk7XG4gIGNvbnN0IGFyZ3MgPSBwcmVwYXJlQXZkQXJncyhhZGIsIG9wdHMpO1xuICBpZiAocnVubmluZ0FWRCkge1xuICAgIGlmIChhcmdzLmluY2x1ZGVzKCctd2lwZS1kYXRhJykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgS2lsbGluZyAnJHthdmROYW1lfScgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSB3aXBlZCBhdCBzdGFydC5gKTtcbiAgICAgIGF3YWl0IGFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTm90IGxhdW5jaGluZyBBVkQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGF3YWl0IGFkYi5sYXVuY2hBVkQoYXZkLCB7XG4gICAgYXJncyxcbiAgICBlbnYsXG4gICAgbGFuZ3VhZ2UsXG4gICAgY291bnRyeSxcbiAgICBsYXVuY2hUaW1lb3V0LFxuICAgIHJlYWR5VGltZW91dCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFNldCBhbmQgZW5zdXJlIHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UuIFRoZSBsYW5ndWFnZSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIGxvd2VyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezIsOH0uIGUuZy4gZW4sIGphIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgY291bnRyeSAocmVnaW9uKSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHVwcGVyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezJ9IHwgWzAtOV17M30uIGUuZy4gVVMsIEpQIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezR9LiBlLmcuIEhhbnMgaW4gemgtSGFucy1DTiA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gc2V0IGxvY2FsZSBwcm9wZXJseVxuICovXG5oZWxwZXJzLmVuc3VyZURldmljZUxvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUxvY2FsZSAoYWRiLCBsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0ID0gbnVsbCkge1xuICBpZiAoIV8uaXNTdHJpbmcobGFuZ3VhZ2UpICYmICFfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgbG9nZ2VyLndhcm4oYHNldERldmljZUxhbmd1YWdlQ291bnRyeSByZXF1aXJlcyBsYW5ndWFnZSBvciBjb3VudHJ5LmApO1xuICAgIGxvZ2dlci53YXJuKGBHb3QgbGFuZ3VhZ2U6ICcke2xhbmd1YWdlfScgYW5kIGNvdW50cnk6ICcke2NvdW50cnl9J2ApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5zZXREZXZpY2VMYW5ndWFnZUNvdW50cnkobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCk7XG5cbiAgaWYgKCFhd2FpdCBhZGIuZW5zdXJlQ3VycmVudExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBzY3JpcHQgPyBgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2V9LCBjb3VudHJ5OiAke2NvdW50cnl9IGFuZCBzY3JpcHQ6ICR7c2NyaXB0fWAgOiBgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2V9IGFuZCBjb3VudHJ5OiAke2NvdW50cnl9YDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzZXQgJHttZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2FwcyA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUluZm9Gcm9tQ2FwcyAob3B0cyA9IHt9KSB7XG4gIC8vIHdlIGNhbiBjcmVhdGUgYSB0aHJvd2F3YXkgQURCIGluc3RhbmNlIGhlcmUsIHNvIHRoZXJlIGlzIG5vIGRlcGVuZGVuY3lcbiAgLy8gb24gaW5zdGFudGlhdGluZyBvbiBlYXJsaWVyIChhdCB0aGlzIHBvaW50LCB3ZSBoYXZlIG5vIHVkaWQpXG4gIC8vIHdlIGNhbiBvbmx5IHVzZSB0aGlzIEFEQiBvYmplY3QgZm9yIGNvbW1hbmRzIHRoYXQgd291bGQgbm90IGJlIGNvbmZ1c2VkXG4gIC8vIGlmIG11bHRpcGxlIGRldmljZXMgYXJlIGNvbm5lY3RlZFxuICBjb25zdCBhZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUJhc2VBREIob3B0cyk7XG4gIGxldCB1ZGlkID0gb3B0cy51ZGlkO1xuICBsZXQgZW1Qb3J0ID0gbnVsbDtcblxuICAvLyBhIHNwZWNpZmljIGF2ZCBuYW1lIHdhcyBnaXZlbi4gdHJ5IHRvIGluaXRpYWxpemUgd2l0aCB0aGF0XG4gIGlmIChvcHRzLmF2ZCkge1xuICAgIGF3YWl0IGhlbHBlcnMucHJlcGFyZUVtdWxhdG9yKGFkYiwgb3B0cyk7XG4gICAgdWRpZCA9IGFkYi5jdXJEZXZpY2VJZDtcbiAgICBlbVBvcnQgPSBhZGIuZW11bGF0b3JQb3J0O1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIGF2ZCBnaXZlbi4gbGV0cyB0cnkgd2hhdGV2ZXIncyBwbHVnZ2VkIGluIGRldmljZXMvZW11bGF0b3JzXG4gICAgbG9nZ2VyLmluZm8oJ1JldHJpZXZpbmcgZGV2aWNlIGxpc3QnKTtcbiAgICBsZXQgZGV2aWNlcyA9IGF3YWl0IGFkYi5nZXREZXZpY2VzV2l0aFJldHJ5KCk7XG5cbiAgICAvLyB1ZGlkIHdhcyBnaXZlbiwgbGV0cyB0cnkgdG8gaW5pdCB3aXRoIHRoYXQgZGV2aWNlXG4gICAgaWYgKHVkaWQpIHtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhfLm1hcChkZXZpY2VzLCAndWRpZCcpLCB1ZGlkKSkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgRGV2aWNlICR7dWRpZH0gd2FzIG5vdCBpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgZGV2aWNlc2ApO1xuICAgICAgfVxuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfSBlbHNlIGlmIChvcHRzLnBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgb3B0cy5wbGF0Zm9ybVZlcnNpb24gPSBgJHtvcHRzLnBsYXRmb3JtVmVyc2lvbn1gLnRyaW0oKTtcblxuICAgICAgLy8gYSBwbGF0Zm9ybSB2ZXJzaW9uIHdhcyBnaXZlbi4gbGV0cyB0cnkgdG8gZmluZCBhIGRldmljZSB3aXRoIHRoZSBzYW1lIG9zXG4gICAgICBjb25zdCBwbGF0Zm9ybVZlcnNpb24gPSBzZW12ZXIuY29lcmNlKG9wdHMucGxhdGZvcm1WZXJzaW9uKSB8fCBvcHRzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICAgIGxvZ2dlci5pbmZvKGBMb29raW5nIGZvciBhIGRldmljZSB3aXRoIEFuZHJvaWQgJyR7cGxhdGZvcm1WZXJzaW9ufSdgKTtcblxuICAgICAgLy8gaW4gY2FzZSB3ZSBmYWlsIHRvIGZpbmQgc29tZXRoaW5nLCBnaXZlIHRoZSB1c2VyIGEgdXNlZnVsIGxvZyB0aGF0IGhhc1xuICAgICAgLy8gdGhlIGRldmljZSB1ZGlkcyBhbmQgb3MgdmVyc2lvbnMgc28gdGhleSBrbm93IHdoYXQncyBhdmFpbGFibGVcbiAgICAgIGNvbnN0IGF2YWlsRGV2aWNlcyA9IFtdO1xuICAgICAgbGV0IHBhcnRpYWxNYXRjaENhbmRpZGF0ZSA9IG51bGw7XG4gICAgICAvLyBmaXJzdCB0cnkgc3RhcnRlZCBkZXZpY2VzL2VtdWxhdG9yc1xuICAgICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgZGV2aWNlcykge1xuICAgICAgICAvLyBkaXJlY3QgYWRiIGNhbGxzIHRvIHRoZSBzcGVjaWZpYyBkZXZpY2VcbiAgICAgICAgYXdhaXQgYWRiLnNldERldmljZUlkKGRldmljZS51ZGlkKTtcbiAgICAgICAgY29uc3QgcmF3RGV2aWNlT1MgPSBhd2FpdCBhZGIuZ2V0UGxhdGZvcm1WZXJzaW9uKCk7XG4gICAgICAgIC8vIFRoZSBkZXZpY2UgT1MgY291bGQgZWl0aGVyIGJlIGEgbnVtYmVyLCBsaWtlIGA2LjBgXG4gICAgICAgIC8vIG9yIGFuIGFiYnJldmlhdGlvbiwgbGlrZSBgUmBcbiAgICAgICAgYXZhaWxEZXZpY2VzLnB1c2goYCR7ZGV2aWNlLnVkaWR9ICgke3Jhd0RldmljZU9TfSlgKTtcbiAgICAgICAgY29uc3QgZGV2aWNlT1MgPSBzZW12ZXIuY29lcmNlKHJhd0RldmljZU9TKSB8fCByYXdEZXZpY2VPUztcbiAgICAgICAgaWYgKCFkZXZpY2VPUykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkID0gc2VtdmVyLnZhbGlkKGRldmljZU9TKSAmJiBzZW12ZXIudmFsaWQocGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgICAgY29uc3QgYm90aFZlcnNpb25zQXJlU3RyaW5ncyA9IF8uaXNTdHJpbmcoZGV2aWNlT1MpICYmIF8uaXNTdHJpbmcocGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgICAgaWYgKGJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCAmJiBkZXZpY2VPUy52ZXJzaW9uID09PSBwbGF0Zm9ybVZlcnNpb24udmVyc2lvblxuICAgICAgICAgICAgfHwgYm90aFZlcnNpb25zQXJlU3RyaW5ncyAmJiBfLnRvTG93ZXIoZGV2aWNlT1MpID09PSBfLnRvTG93ZXIocGxhdGZvcm1WZXJzaW9uKSkge1xuICAgICAgICAgIC8vIEdvdCBhbiBleGFjdCBtYXRjaCAtIHByb2NlZWQgaW1tZWRpYXRlbHlcbiAgICAgICAgICB1ZGlkID0gZGV2aWNlLnVkaWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoIWJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCkge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGNoZWNrIGZvciBwYXJ0aWFsIG1hdGNoIGlmIGVpdGhlciBvZiB2ZXJzaW9uIG51bWJlcnMgaXMgbm90IGNvZXJjaWJsZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCghXy5pbmNsdWRlcyhvcHRzLnBsYXRmb3JtVmVyc2lvbiwgJy4nKSAmJiBwbGF0Zm9ybVZlcnNpb24ubWFqb3IgPT09IGRldmljZU9TLm1ham9yXG4gICAgICAgICAgICB8fCBwbGF0Zm9ybVZlcnNpb24ubWFqb3IgPT09IGRldmljZU9TLm1ham9yICYmIHBsYXRmb3JtVmVyc2lvbi5taW5vciA9PT0gZGV2aWNlT1MubWlub3IpXG4gICAgICAgICAgICAvLyBHb3QgYSBwYXJ0aWFsIG1hdGNoIC0gbWFrZSBzdXJlIHdlIGNvbnNpZGVyIHRoZSBtb3N0IHJlY2VudFxuICAgICAgICAgICAgLy8gZGV2aWNlIHZlcnNpb24gYXZhaWxhYmxlIG9uIHRoZSBob3N0IHN5c3RlbVxuICAgICAgICAgICAgJiYgKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSAmJiBzZW12ZXIuZ3QoZGV2aWNlT1MsIF8udmFsdWVzKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSlbMF0pXG4gICAgICAgICAgICAgICAgfHwgIXBhcnRpYWxNYXRjaENhbmRpZGF0ZSkpIHtcbiAgICAgICAgICBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgPSB7W2RldmljZS51ZGlkXTogZGV2aWNlT1N9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXVkaWQgJiYgcGFydGlhbE1hdGNoQ2FuZGlkYXRlKSB7XG4gICAgICAgIHVkaWQgPSBfLmtleXMocGFydGlhbE1hdGNoQ2FuZGlkYXRlKVswXTtcbiAgICAgICAgYXdhaXQgYWRiLnNldERldmljZUlkKHVkaWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVkaWQpIHtcbiAgICAgICAgLy8gd2UgY291bGRuJ3QgZmluZCBhbnl0aGluZyEgcXVpdFxuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgVW5hYmxlIHRvIGZpbmQgYW4gYWN0aXZlIGRldmljZSBvciBlbXVsYXRvciBgICtcbiAgICAgICAgICBgd2l0aCBPUyAke29wdHMucGxhdGZvcm1WZXJzaW9ufS4gVGhlIGZvbGxvd2luZyBhcmUgYXZhaWxhYmxlOiBgICtcbiAgICAgICAgICBhdmFpbERldmljZXMuam9pbignLCAnKSk7XG4gICAgICB9XG5cbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhIHVkaWQgd2FzIG5vdCBnaXZlbiwgZ3JhYiB0aGUgZmlyc3QgZGV2aWNlIHdlIHNlZVxuICAgICAgdWRpZCA9IGRldmljZXNbMF0udWRpZDtcbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGBVc2luZyBkZXZpY2U6ICR7dWRpZH1gKTtcbiAgcmV0dXJuIHt1ZGlkLCBlbVBvcnR9O1xufTtcblxuLy8gcmV0dXJucyBhIG5ldyBhZGIgaW5zdGFuY2Ugd2l0aCBkZXZpY2VJZCBzZXRcbmhlbHBlcnMuY3JlYXRlQURCID0gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQURCIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3VkaWQsIGVtUG9ydH0gPSBvcHRzO1xuICBjb25zdCBhZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUJhc2VBREIob3B0cyk7XG4gIGFkYi5zZXREZXZpY2VJZCh1ZGlkKTtcbiAgaWYgKGVtUG9ydCkge1xuICAgIGFkYi5zZXRFbXVsYXRvclBvcnQoZW1Qb3J0KTtcbiAgfVxuXG4gIHJldHVybiBhZGI7XG59O1xuXG5oZWxwZXJzLnZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzIChvcHRzKSB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnYXBwUGFja2FnZScsICdhcHBBY3Rpdml0eScsICdhcHBXYWl0UGFja2FnZScsICdhcHBXYWl0QWN0aXZpdHknXSkge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRzW2tleV07XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IC8oW15cXHcuKixdKSsvLmV4ZWMobmFtZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYENhcGFiaWxpdHkgJyR7a2V5fScgaXMgZXhwZWN0ZWQgdG8gb25seSBpbmNsdWRlIGxhdGluIGxldHRlcnMsIGRpZ2l0cywgdW5kZXJzY29yZSwgZG90LCBjb21tYSBhbmQgYXN0ZXJpc2sgY2hhcmFjdGVycy5gKTtcbiAgICBsb2dnZXIud2FybihgQ3VycmVudCB2YWx1ZSAnJHtuYW1lfScgaGFzIG5vbi1tYXRjaGluZyBjaGFyYWN0ZXIgYXQgaW5kZXggJHttYXRjaC5pbmRleH06ICcke25hbWUuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4ICsgMSl9J2ApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldExhdW5jaEluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRMYXVuY2hJbmZvIChhZGIsIG9wdHMpIHtcbiAgbGV0IHthcHAsIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5fSA9IG9wdHM7XG4gIGlmICghYXBwKSB7XG4gICAgbG9nZ2VyLndhcm4oJ05vIGFwcCBzZW50IGluLCBub3QgcGFyc2luZyBwYWNrYWdlL2FjdGl2aXR5Jyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy52YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzKG9wdHMpO1xuXG4gIGlmIChhcHBQYWNrYWdlICYmIGFwcEFjdGl2aXR5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQYXJzaW5nIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGZyb20gYXBwIG1hbmlmZXN0Jyk7XG4gIGxldCB7YXBrUGFja2FnZSwgYXBrQWN0aXZpdHl9ID1cbiAgICBhd2FpdCBhZGIucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0KGFwcCk7XG4gIGlmIChhcGtQYWNrYWdlICYmICFhcHBQYWNrYWdlKSB7XG4gICAgYXBwUGFja2FnZSA9IGFwa1BhY2thZ2U7XG4gIH1cbiAgaWYgKCFhcHBXYWl0UGFja2FnZSkge1xuICAgIGFwcFdhaXRQYWNrYWdlID0gYXBwUGFja2FnZTtcbiAgfVxuICBpZiAoYXBrQWN0aXZpdHkgJiYgIWFwcEFjdGl2aXR5KSB7XG4gICAgYXBwQWN0aXZpdHkgPSBhcGtBY3Rpdml0eTtcbiAgfVxuICBpZiAoIWFwcFdhaXRBY3Rpdml0eSkge1xuICAgIGFwcFdhaXRBY3Rpdml0eSA9IGFwcEFjdGl2aXR5O1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGFyZTogJHthcGtQYWNrYWdlfS8ke2Fwa0FjdGl2aXR5fWApO1xuICByZXR1cm4ge2FwcFBhY2thZ2UsIGFwcFdhaXRQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdEFjdGl2aXR5fTtcbn07XG5cbmhlbHBlcnMucmVzZXRBcHAgPSBhc3luYyBmdW5jdGlvbiByZXNldEFwcCAoYWRiLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhcHBQYWNrYWdlLFxuICAgIGZhc3RSZXNldCxcbiAgICBmdWxsUmVzZXQsXG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXNcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFhcHBQYWNrYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcFBhY2thZ2UnIG9wdGlvbiBpcyByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IGlzSW5zdGFsbGVkID0gYXdhaXQgYWRiLmlzQXBwSW5zdGFsbGVkKGFwcFBhY2thZ2UpO1xuXG4gIGlmIChpc0luc3RhbGxlZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuZm9yY2VTdG9wKGFwcFBhY2thZ2UpO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAvLyBmdWxsUmVzZXQgaGFzIHByaW9yaXR5IG92ZXIgZmFzdFJlc2V0XG4gICAgaWYgKCFmdWxsUmVzZXQgJiYgZmFzdFJlc2V0KSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBhZGIuY2xlYXIoYXBwUGFja2FnZSk7XG4gICAgICBpZiAoXy5pc1N0cmluZyhvdXRwdXQpICYmIG91dHB1dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmYWlsZWQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciB0aGUgYXBwbGljYXRpb24gZGF0YSBvZiAnJHthcHBQYWNrYWdlfScuIE9yaWdpbmFsIGVycm9yOiAke291dHB1dH1gKTtcbiAgICAgIH1cbiAgICAgIC8vIGV4ZWN1dGluZyBgc2hlbGwgcG0gY2xlYXJgIHJlc2V0cyBwcmV2aW91c2x5IGFzc2lnbmVkIGFwcGxpY2F0aW9uIHBlcm1pc3Npb25zIGFzIHdlbGxcbiAgICAgIGlmIChhdXRvR3JhbnRQZXJtaXNzaW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFkYi5ncmFudEFsbFBlcm1pc3Npb25zKGFwcFBhY2thZ2UpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgVW5hYmxlIHRvIGdyYW50IHBlcm1pc3Npb25zIHJlcXVlc3RlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nZ2VyLmRlYnVnKGBQZXJmb3JtZWQgZmFzdCByZXNldCBvbiB0aGUgaW5zdGFsbGVkICcke2FwcFBhY2thZ2V9JyBhcHBsaWNhdGlvbiAoc3RvcCBhbmQgY2xlYXIpYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFhcHApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwJyBvcHRpb24gaXMgcmVxdWlyZWQgZm9yIHJlaW5zdGFsbFwiKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhgUnVubmluZyBmdWxsIHJlc2V0IG9uICcke2FwcFBhY2thZ2V9JyAocmVpbnN0YWxsKWApO1xuICBpZiAoaXNJbnN0YWxsZWQpIHtcbiAgICBhd2FpdCBhZGIudW5pbnN0YWxsQXBrKGFwcFBhY2thZ2UpO1xuICB9XG4gIGF3YWl0IGFkYi5pbnN0YWxsKGFwcCwge1xuICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmluc3RhbGxBcGsgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQXBrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGFwcFBhY2thZ2UsXG4gICAgZmFzdFJlc2V0LFxuICAgIGZ1bGxSZXNldCxcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICBlbmZvcmNlQXBwSW5zdGFsbCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFhcHAgfHwgIWFwcFBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwJyBhbmQgJ2FwcFBhY2thZ2UnIG9wdGlvbnMgYXJlIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKGZ1bGxSZXNldCkge1xuICAgIGF3YWl0IHRoaXMucmVzZXRBcHAoYWRiLCBvcHRzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgYXBwU3RhdGUsXG4gICAgd2FzVW5pbnN0YWxsZWRcbiAgfSA9IGF3YWl0IGFkYi5pbnN0YWxsT3JVcGdyYWRlKGFwcCwgYXBwUGFja2FnZSwge1xuICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICBlbmZvcmNlQ3VycmVudEJ1aWxkOiBlbmZvcmNlQXBwSW5zdGFsbCxcbiAgfSk7XG5cbiAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCB0aGUgbmV3bHkgaW5zdGFsbGVkIGFwcFxuICBjb25zdCBpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCA9ICF3YXNVbmluc3RhbGxlZFxuICAgICYmIGFwcFN0YXRlICE9PSBhZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRDtcbiAgaWYgKGZhc3RSZXNldCAmJiBpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCkge1xuICAgIGxvZ2dlci5pbmZvKGBQZXJmb3JtaW5nIGZhc3QgcmVzZXQgb24gJyR7YXBwUGFja2FnZX0nYCk7XG4gICAgYXdhaXQgdGhpcy5yZXNldEFwcChhZGIsIG9wdHMpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RhbGxzIGFuIGFycmF5IG9mIGFwa3NcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdHMgZGVmaW5lZCBpbiBkcml2ZXIuanNcbiAqL1xuaGVscGVycy5pbnN0YWxsT3RoZXJBcGtzID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE90aGVyQXBrcyAob3RoZXJBcHBzLCBhZGIsIG9wdHMpIHtcbiAgbGV0IHtcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlc1xuICB9ID0gb3B0cztcblxuICAvLyBJbnN0YWxsIGFsbCBvZiB0aGUgQVBLJ3MgYXN5bmNocm9ub3VzbHlcbiAgYXdhaXQgQi5hbGwob3RoZXJBcHBzLm1hcCgob3RoZXJBcHApID0+IHtcbiAgICBsb2dnZXIuZGVidWcoYEluc3RhbGxpbmcgYXBwOiAke290aGVyQXBwfWApO1xuICAgIHJldHVybiBhZGIuaW5zdGFsbE9yVXBncmFkZShvdGhlckFwcCwgbnVsbCwge1xuICAgICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICB9KTtcbiAgfSkpO1xufTtcblxuLyoqXG4gKiBVbmluc3RhbGwgYW4gYXJyYXkgb2YgcGFja2FnZXNcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYXBwUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZSBuYW1lcyB0byB1bmluc3RhbGwuIElmIHRoaXMgaW5jbHVkZXMgYCcqJ2AsIHVuaW5zdGFsbCBhbGwgb2YgM3JkIHBhcnR5IGFwcHNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZXMgZG9lcyBub3QgdW5pbnN0YWxsIHdoZW4gYCpgIGlzIHByb3ZpZGVkIGFzIGBhcHBQYWNrYWdlc2BcbiAqL1xuaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzID0gYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyAoYWRiLCBhcHBQYWNrYWdlcywgZmlsdGVyUGFja2FnZXMgPSBbXSkge1xuICBpZiAoYXBwUGFja2FnZXMuaW5jbHVkZXMoJyonKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnVW5pbnN0YWxsIHRoaXJkIHBhcnR5IHBhY2thZ2VzJyk7XG4gICAgYXBwUGFja2FnZXMgPSBhd2FpdCB0aGlzLmdldFRoaXJkUGFydHlQYWNrYWdlcyhhZGIsIGZpbHRlclBhY2thZ2VzKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhgVW5pbnN0YWxsaW5nIHBhY2thZ2VzOiAke2FwcFBhY2thZ2VzfWApO1xuICBhd2FpdCBCLmFsbChhcHBQYWNrYWdlcy5tYXAoKGFwcFBhY2thZ2UpID0+IGFkYi51bmluc3RhbGxBcGsoYXBwUGFja2FnZSkpKTtcbn07XG5cbi8qKlxuICogR2V0IHRoaXJkIHBhcnR5IHBhY2thZ2VzIGZpbHRlcmVkIHdpdGggYGZpbHRlclBhY2thZ2VzYFxuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlcyBkb2VzIG5vdCB1bmluc3RhbGwgd2hlbiBgKmAgaXMgcHJvdmlkZWQgYXMgYGFwcFBhY2thZ2VzYFxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IEFuIGFycmF5IG9mIGluc3RhbGxlZCB0aGlyZCBwYXJ5IHBhY2thZ2VzXG4gKi9cbmhlbHBlcnMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzIChhZGIsIGZpbHRlclBhY2thZ2VzID0gW10pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlc1N0cmluZyA9IGF3YWl0IGFkYi5zaGVsbChbJ3BtJywgJ2xpc3QnLCAncGFja2FnZXMnLCAnLTMnXSk7XG4gICAgY29uc3QgYXBwUGFja2FnZXNBcnJheSA9IHBhY2thZ2VzU3RyaW5nLnRyaW0oKS5yZXBsYWNlKC9wYWNrYWdlOi9nLCAnJykuc3BsaXQoRU9MKTtcbiAgICBsb2dnZXIuZGVidWcoYCcke2FwcFBhY2thZ2VzQXJyYXl9JyBmaWx0ZXJlZCB3aXRoICcke2ZpbHRlclBhY2thZ2VzfSdgKTtcbiAgICByZXR1cm4gXy5kaWZmZXJlbmNlKGFwcFBhY2thZ2VzQXJyYXksIGZpbHRlclBhY2thZ2VzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBnZXQgcGFja2FnZXMgd2l0aCAnYWRiIHNoZWxsIHBtIGxpc3QgcGFja2FnZXMgLTMnOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuaGVscGVycy5pbml0VW5pY29kZUtleWJvYXJkID0gYXN5bmMgZnVuY3Rpb24gaW5pdFVuaWNvZGVLZXlib2FyZCAoYWRiKSB7XG4gIGxvZ2dlci5kZWJ1ZygnRW5hYmxpbmcgVW5pY29kZSBrZXlib2FyZCBzdXBwb3J0Jyk7XG5cbiAgLy8gZ2V0IHRoZSBkZWZhdWx0IElNRSBzbyB3ZSBjYW4gcmV0dXJuIGJhY2sgdG8gaXQgbGF0ZXIgaWYgd2Ugd2FudFxuICBsZXQgZGVmYXVsdElNRSA9IGF3YWl0IGFkYi5kZWZhdWx0SU1FKCk7XG5cbiAgbG9nZ2VyLmRlYnVnKGBVbnNldHRpbmcgcHJldmlvdXMgSU1FICR7ZGVmYXVsdElNRX1gKTtcbiAgY29uc3QgYXBwaXVtSU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vLlVuaWNvZGVJTUVgO1xuICBsb2dnZXIuZGVidWcoYFNldHRpbmcgSU1FIHRvICcke2FwcGl1bUlNRX0nYCk7XG4gIGF3YWl0IGFkYi5lbmFibGVJTUUoYXBwaXVtSU1FKTtcbiAgYXdhaXQgYWRiLnNldElNRShhcHBpdW1JTUUpO1xuICByZXR1cm4gZGVmYXVsdElNRTtcbn07XG5cbmhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwID0gYXN5bmMgZnVuY3Rpb24gc2V0TW9ja0xvY2F0aW9uQXBwIChhZGIsIGFwcCkge1xuICB0cnkge1xuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCAnc2VjdXJlJywgJ21vY2tfbG9jYXRpb24nLCAnMSddKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIGFwcCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdhbGxvdyddKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gc2V0IG1vY2sgbG9jYXRpb24gZm9yIGFwcCAnJHthcHB9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5pbnN0YWxsSGVscGVyQXBwID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEhlbHBlckFwcCAoYWRiLCBhcGtQYXRoLCBwYWNrYWdlSWQpIHtcbiAgLy8gU29tZXRpbWVzIGFkYiBwdXNoIG9yIGFkYiBpbnN0YWwgdGFrZSBtb3JlIHRpbWUgdGhhbiBleHBlY3RlZCB0byBpbnN0YWxsIGFuIGFwcFxuICAvLyBlLmcuIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vaW8uYXBwaXVtLnNldHRpbmdzL2lzc3Vlcy80MCNpc3N1ZWNvbW1lbnQtNDc2NTkzMTc0XG4gIGF3YWl0IHJldHJ5KDIsIGFzeW5jIGZ1bmN0aW9uIHJldHJ5SW5zdGFsbEhlbHBlckFwcCAoKSB7XG4gICAgYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBrUGF0aCwgcGFja2FnZUlkLCB7Z3JhbnRQZXJtaXNzaW9uczogdHJ1ZX0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogUHVzaGVzIGFuZCBpbnN0YWxscyBpby5hcHBpdW0uc2V0dGluZ3MgYXBwLlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzZXR0aW5nIGFwcCBpcyByZXF1aXJlZFxuICpcbiAqIEBwYXJhbSB7QWRifSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gRHJpdmVyIG9wdGlvbnMgZGljdGlvbmFyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdGhyb3dFcnJvciBbZmFsc2VdIC0gV2hldGhlciB0aHJvdyBhbiBlcnJvciBpZiBTZXR0aW5ncyBhcHAgZmFpbHMgdG8gc3RhcnRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aHJvd0Vycm9yIGlzIHRydWUgYW5kIHNvbWV0aGluZyBoYXBwZW5zIGluIGluc3RhbGxhdGlvbiBzdGVwXG4gKi9cbmhlbHBlcnMucHVzaFNldHRpbmdzQXBwID0gYXN5bmMgZnVuY3Rpb24gcHVzaFNldHRpbmdzQXBwIChhZGIsIHRocm93RXJyb3IgPSBmYWxzZSwgb3B0cyA9IHt9KSB7XG4gIGxvZ2dlci5kZWJ1ZygnUHVzaGluZyBzZXR0aW5ncyBhcGsgdG8gZGV2aWNlLi4uJyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAoYWRiLCBzZXR0aW5nc0Fwa1BhdGgsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHRocm93RXJyb3IpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGBJZ25vcmVkIGVycm9yIHdoaWxlIGluc3RhbGxpbmcgJyR7c2V0dGluZ3NBcGtQYXRofSc6IGAgK1xuICAgICAgICAgICAgICAgIGAnJHtlcnIubWVzc2FnZX0nLiBGZWF0dXJlcyB0aGF0IHJlbHkgb24gdGhpcyBoZWxwZXIgYCArXG4gICAgICAgICAgICAgICAgJ3JlcXVpcmUgdGhlIGFwayBzdWNoIGFzIHRvZ2dsZSBXaUZpIGFuZCBnZXR0aW5nIGxvY2F0aW9uICcgK1xuICAgICAgICAgICAgICAgICd3aWxsIHJhaXNlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gdXNlIHRoZW0uJyk7XG4gIH1cblxuICAvLyBSZWluc3RhbGwgd291bGQgc3RvcCB0aGUgc2V0dGluZ3MgaGVscGVyIHByb2Nlc3MgYW55d2F5LCBzb1xuICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBzdGlsbCBydW5uaW5nXG4gIGlmIChhd2FpdCBhZGIucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfUEtHX0lEKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfSBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRzIHBlcm1pc3Npb25zLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmIChhcGlMZXZlbCA+PSAyOSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vaW8uYXBwaXVtLnNldHRpbmdzI2ludGVybmFsLWF1ZGlvLS12aWRlby1yZWNvcmRpbmdcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdQUk9KRUNUX01FRElBJywgJ2FsbG93J10pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgfVxuICB9XG4gIGlmIChhcGlMZXZlbCA8PSAyMykgeyAvLyBBbmRyb2lkIDYtIGRldmljZXMgc2hvdWxkIGhhdmUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3B1bGwvMTE2NDAjaXNzdWVjb21tZW50LTQzODI2MDQ3N1xuICAgIGNvbnN0IHBlcm1zID0gWydTRVRfQU5JTUFUSU9OX1NDQUxFJywgJ0NIQU5HRV9DT05GSUdVUkFUSU9OJywgJ0FDQ0VTU19GSU5FX0xPQ0FUSU9OJ107XG4gICAgbG9nZ2VyLmluZm8oYEdyYW50aW5nIHBlcm1pc3Npb25zICR7cGVybXN9IHRvICcke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9J2ApO1xuICAgIGF3YWl0IGFkYi5ncmFudFBlcm1pc3Npb25zKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHBlcm1zLm1hcCgoeCkgPT4gYGFuZHJvaWQucGVybWlzc2lvbi4ke3h9YCkpO1xuICB9XG5cbiAgLy8gbGF1bmNoIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAgZHVlIHRvIHNldHRpbmdzIGZhaWxpbmcgdG8gYmUgc2V0XG4gIC8vIGlmIHRoZSBhcHAgaXMgbm90IGxhdW5jaGVkIHByaW9yIHRvIHN0YXJ0IHRoZSBzZXNzaW9uIG9uIGFuZHJvaWQgNytcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy84OTU3XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLnJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAoe1xuICAgICAgdGltZW91dDogaGVscGVycy5pc0VtdWxhdG9yKGFkYiwgb3B0cykgPyAzMDAwMCA6IDUwMDBcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgc3RyaW5nLnhtbCBhbmQgY29udmVydHMgaXQgdG8gc3RyaW5nLmpzb24gYW5kIHB1c2hlc1xuICogaXQgdG8gL2RhdGEvbG9jYWwvdG1wL3N0cmluZy5qc29uIG9uIGZvciB1c2Ugb2YgYm9vdHN0cmFwXG4gKiBJZiBhcHAgaXMgbm90IHByZXNlbnQgdG8gZXh0cmFjdCBzdHJpbmcueG1sIGl0IGRlbGV0ZXMgcmVtb3RlIHN0cmluZ3MuanNvblxuICogSWYgYXBwIGRvZXMgbm90IGhhdmUgc3RyaW5ncy54bWwgd2UgcHVzaCBhbiBlbXB0eSBqc29uIG9iamVjdCB0byByZW1vdGVcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UgYWJicmV2aWF0aW9uLCBmb3IgZXhhbXBsZSAnZnInLiBUaGUgZGVmYXVsdCBsYW5ndWFnZVxuICogaXMgdXNlZCBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkLlxuICogQHBhcmFtIHtPYmplY3R9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHJldHVybnMge09iamVjdH0gVGhlIGRpY3Rpb25hcnksIHdoZXJlIHN0cmluZyByZXNvdXJjZSBpZGVudGlmaWVycyBhcmUga2V5c1xuICogYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIG9yIGFuIGVtcHR5IG9iamVjdFxuICogaWYgbm8gbWF0Y2hpbmcgcmVzb3VyY2VzIHdlcmUgZXh0cmFjdGVkLlxuICovXG5oZWxwZXJzLnB1c2hTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gcHVzaFN0cmluZ3MgKGxhbmd1YWdlLCBhZGIsIG9wdHMpIHtcbiAgY29uc3QgcmVtb3RlRGlyID0gJy9kYXRhL2xvY2FsL3RtcCc7XG4gIGNvbnN0IHN0cmluZ3NKc29uID0gJ3N0cmluZ3MuanNvbic7XG4gIGNvbnN0IHJlbW90ZUZpbGUgPSBwYXRoLnBvc2l4LnJlc29sdmUocmVtb3RlRGlyLCBzdHJpbmdzSnNvbik7XG5cbiAgLy8gY2xlYW4gdXAgcmVtb3RlIHN0cmluZy5qc29uIGlmIHByZXNlbnRcbiAgYXdhaXQgYWRiLnJpbXJhZihyZW1vdGVGaWxlKTtcblxuICBsZXQgYXBwO1xuICB0cnkge1xuICAgIGFwcCA9IG9wdHMuYXBwIHx8IGF3YWl0IGFkYi5wdWxsQXBrKG9wdHMuYXBwUGFja2FnZSwgb3B0cy50bXBEaXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuaW5mbyhgRmFpbGVkIHRvIHB1bGwgYW4gYXBrIGZyb20gJyR7b3B0cy5hcHBQYWNrYWdlfScgdG8gJyR7b3B0cy50bXBEaXJ9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KG9wdHMuYXBwUGFja2FnZSkgfHwgIShhd2FpdCBmcy5leGlzdHMoYXBwKSkpIHtcbiAgICBsb2dnZXIuZGVidWcoYE5vIGFwcCBvciBwYWNrYWdlIHNwZWNpZmllZC4gUmV0dXJuaW5nIGVtcHR5IHN0cmluZ3NgKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBzdHJpbmdzVG1wRGlyID0gcGF0aC5yZXNvbHZlKG9wdHMudG1wRGlyLCBvcHRzLmFwcFBhY2thZ2UpO1xuICB0cnkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRXh0cmFjdGluZyBzdHJpbmdzIGZyb20gYXBrJywgYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgY29uc3Qge2Fwa1N0cmluZ3MsIGxvY2FsUGF0aH0gPSBhd2FpdCBhZGIuZXh0cmFjdFN0cmluZ3NGcm9tQXBrKGFwcCwgbGFuZ3VhZ2UsIHN0cmluZ3NUbXBEaXIpO1xuICAgIGF3YWl0IGFkYi5wdXNoKGxvY2FsUGF0aCwgcmVtb3RlRGlyKTtcbiAgICByZXR1cm4gYXBrU3RyaW5ncztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYENvdWxkIG5vdCBnZXQgc3RyaW5ncywgY29udGludWluZyBhbnl3YXkuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGF3YWl0IGFkYi5zaGVsbCgnZWNobycsIFtgJ3t9JyA+ICR7cmVtb3RlRmlsZX1gXSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHN0cmluZ3NUbXBEaXIpO1xuICB9XG4gIHJldHVybiB7fTtcbn07XG5cbmhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcCA9IGFzeW5jIGZ1bmN0aW9uIHVubG9ja1dpdGhIZWxwZXJBcHAgKGFkYikge1xuICBsb2dnZXIuaW5mbygnVW5sb2NraW5nIHNjcmVlbicpO1xuXG4gIC8vIFVubG9jayBzdWNjZWVkIHdpdGggYSBjb3VwbGUgb2YgcmV0cmllcy5cbiAgbGV0IGZpcnN0UnVuID0gdHJ1ZTtcbiAgYXdhaXQgcmV0cnkoMywgYXN5bmMgZnVuY3Rpb24gbGF1bmNoSGVscGVyICgpIHtcbiAgICAvLyBUbyByZWR1Y2UgYSB0aW1lIHRvIGNhbGwgYWRiLmlzU2NyZWVuTG9ja2VkKCkgc2luY2UgYGFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd2AgaXMgZWFzeSB0byBoYW5nIGFkYiBjb21tYW5kc1xuICAgIGlmIChmaXJzdFJ1bikge1xuICAgICAgZmlyc3RSdW4gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFcnJvciBpbiBpc1NjcmVlbkxvY2tlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdcImFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd1wiIGNvbW1hbmQgaGFzIHRpbWVkIG91dC4nKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1RoZSByZWFzb24gb2YgdGhpcyB0aW1lb3V0IGlzIHRoZSBkZWxheWVkIGFkYiByZXNwb25zZS4gUmVzZXR0aW5nIGFkYiBzZXJ2ZXIgY2FuIGltcHJvdmUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYExhdW5jaGluZyAke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8ke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCxcbiAgICAgICctYycsICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgJy1mJywgJzB4MTAyMDAwMDAnLFxuICAgIF0pO1xuICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gIH0pO1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZygnU2NyZWVuIGlzIGxvY2tlZCwgdHJ5aW5nIHRvIHVubG9jaycpO1xuXG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIud2FybignVXNpbmcgYXBwIHVubG9jaywgdGhpcyBpcyBnb2luZyB0byBiZSBkZXByZWNhdGVkIScpO1xuICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcChhZGIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLndhaXRGb3JEZXZpY2UoKTtcbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvciwgb3B0cyk7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpICYmIChtb2NrTG9jYXRpb25BcHAgfHwgXy5pc1VuZGVmaW5lZChtb2NrTG9jYXRpb25BcHApKSkge1xuICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7Ozs7O0FBRUEsTUFBTUEsdUJBQXVCLEdBQUcsS0FBaEM7QUFFQSxNQUFNQywrQkFBK0IsR0FBRztFQUN0Q0MsTUFBTSxFQUFFO0lBQ05DLEdBQUcsRUFBRSxvQkFEQztJQUVOQyxRQUFRLEVBQUU7RUFGSixDQUQ4QjtFQUt0Q0MsUUFBUSxFQUFFO0lBQ1JGLEdBQUcsRUFBRSwyQkFERztJQUVSQyxRQUFRLEVBQUU7RUFGRixDQUw0QjtFQVN0Q0UsVUFBVSxFQUFFO0lBQ1ZILEdBQUcsRUFBRSxpQkFESztJQUVWQyxRQUFRLEVBQUU7RUFGQSxDQVQwQjtFQWF0Q0csT0FBTyxFQUFFO0lBQ1BKLEdBQUcsRUFBRSxxQkFERTtJQUVQQyxRQUFRLEVBQUU7RUFGSCxDQWI2QjtFQWlCdEMsb0JBQW9CO0lBQ2xCRCxHQUFHLEVBQUUscUJBRGE7SUFFbEJDLFFBQVEsRUFBRTtFQUZRLENBakJrQjtFQXFCdEMsb0JBQW9CO0lBQ2xCRCxHQUFHLEVBQUUsNEJBRGE7SUFFbEJDLFFBQVEsRUFBRTtFQUZRLENBckJrQjtFQXlCdENJLE9BQU8sRUFBRTtJQUNQTCxHQUFHLEVBQUUsb0JBREU7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
990
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2FuZHJvaWQtaGVscGVycy5qcyIsIm5hbWVzIjpbIk1PQ0tfQVBQX0lEU19TVE9SRSIsIlBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUIiwiQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSIsImNocm9tZSIsInBrZyIsImFjdGl2aXR5IiwiY2hyb21pdW0iLCJjaHJvbWViZXRhIiwiYnJvd3NlciIsImRlZmF1bHQiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWSIsIkVNVUxBVE9SX1BBVFRFUk4iLCJBUFBfU1RBVEUiLCJPYmplY3QiLCJmcmVlemUiLCJOT1RfSU5TVEFMTEVEIiwiTk9UX1JVTk5JTkciLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJhZGIiLCJuZXR3b3JrU3BlZWQiLCJfIiwidmFsdWVzIiwiTkVUV09SS19TUEVFRCIsImluY2x1ZGVzIiwibG9nZ2VyIiwid2FybiIsIkZVTEwiLCJwcmVwYXJlQXZkQXJncyIsIm9wdHMiLCJpc0hlYWRsZXNzIiwiYXZkQXJncyIsInJlc3VsdCIsImlzQXJyYXkiLCJwdXNoIiwidXRpbCIsInNoZWxsUGFyc2UiLCJ0b0NyZWRlbnRpYWxUeXBlIiwidW5sb2NrVHlwZSIsIlBJTl9VTkxPQ0siLCJQSU5fVU5MT0NLX0tFWV9FVkVOVCIsIlBBU1NXT1JEX1VOTE9DSyIsIlBBVFRFUk5fVU5MT0NLIiwiRXJyb3IiLCJoZWxwZXJzIiwiY3JlYXRlQmFzZUFEQiIsImFkYlBvcnQiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInJlbW90ZUFwcHNDYWNoZUxpbWl0IiwiYnVpbGRUb29sc1ZlcnNpb24iLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiYWxsb3dEZWxheUFkYiIsIkFEQiIsImNyZWF0ZUFEQiIsInByZXBhcmVFbXVsYXRvciIsImF2ZCIsImF2ZEVudiIsImVudiIsImxhbmd1YWdlIiwibG9jYWxlIiwiY291bnRyeSIsImF2ZExhdW5jaFRpbWVvdXQiLCJsYXVuY2hUaW1lb3V0IiwiYXZkUmVhZHlUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwiYXZkTmFtZSIsInJlcGxhY2UiLCJydW5uaW5nQVZEIiwiZ2V0UnVubmluZ0FWRFdpdGhSZXRyeSIsImFyZ3MiLCJkZWJ1ZyIsImtpbGxFbXVsYXRvciIsImxhdW5jaEFWRCIsImVuc3VyZURldmljZUxvY2FsZSIsInNjcmlwdCIsImlzU3RyaW5nIiwic2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IiwiZW5zdXJlQ3VycmVudExvY2FsZSIsIm1lc3NhZ2UiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJ1ZGlkIiwiZW1Qb3J0IiwiY3VyRGV2aWNlSWQiLCJlbXVsYXRvclBvcnQiLCJpbmZvIiwiZGV2aWNlcyIsImdldERldmljZXNXaXRoUmV0cnkiLCJtYXAiLCJlcnJvckFuZFRocm93IiwiZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyIsInBsYXRmb3JtVmVyc2lvbiIsInRyaW0iLCJzZW12ZXIiLCJjb2VyY2UiLCJhdmFpbERldmljZXMiLCJwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUiLCJkZXZpY2UiLCJzZXREZXZpY2VJZCIsInJhd0RldmljZU9TIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlT1MiLCJib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQiLCJ2YWxpZCIsImJvdGhWZXJzaW9uc0FyZVN0cmluZ3MiLCJ2ZXJzaW9uIiwidG9Mb3dlciIsIm1ham9yIiwibWlub3IiLCJndCIsImtleXMiLCJqb2luIiwic2V0RW11bGF0b3JQb3J0IiwidmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyIsImtleSIsIm5hbWUiLCJtYXRjaCIsImV4ZWMiLCJpbmRleCIsInN1YnN0cmluZyIsImdldExhdW5jaEluZm8iLCJhcHAiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXRBY3Rpdml0eSIsImFwa1BhY2thZ2UiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInJlc2V0QXBwIiwiZmFzdFJlc2V0IiwiZnVsbFJlc2V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiYXV0b0dyYW50UGVybWlzc2lvbnMiLCJhbGxvd1Rlc3RQYWNrYWdlcyIsImlzSW5zdGFsbGVkIiwiaXNBcHBJbnN0YWxsZWQiLCJmb3JjZVN0b3AiLCJpZ24iLCJvdXRwdXQiLCJjbGVhciIsInRvTG93ZXJDYXNlIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImVycm9yIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbCIsImdyYW50UGVybWlzc2lvbnMiLCJ0aW1lb3V0IiwiaW5zdGFsbEFwayIsImVuZm9yY2VBcHBJbnN0YWxsIiwiYXBwU3RhdGUiLCJ3YXNVbmluc3RhbGxlZCIsImluc3RhbGxPclVwZ3JhZGUiLCJlbmZvcmNlQ3VycmVudEJ1aWxkIiwiaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAiLCJBUFBfSU5TVEFMTF9TVEFURSIsImluc3RhbGxPdGhlckFwa3MiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwib3RoZXJBcHAiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYXBwUGFja2FnZXMiLCJmaWx0ZXJQYWNrYWdlcyIsImdldFRoaXJkUGFydHlQYWNrYWdlcyIsInBhY2thZ2VzU3RyaW5nIiwic2hlbGwiLCJhcHBQYWNrYWdlc0FycmF5Iiwic3BsaXQiLCJFT0wiLCJkaWZmZXJlbmNlIiwiZXJyIiwiaW5pdFVuaWNvZGVLZXlib2FyZCIsImRlZmF1bHRJTUUiLCJhcHBpdW1JTUUiLCJlbmFibGVJTUUiLCJzZXRJTUUiLCJzZXRNb2NrTG9jYXRpb25BcHAiLCJnZXRBcGlMZXZlbCIsInBrZ0lkcyIsImZpbGVFeGlzdHMiLCJKU09OIiwicGFyc2UiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJzcmNQYXRoIiwicGF0aCIsInBvc2l4IiwiYmFzZW5hbWUiLCJmcyIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsInB1c2hGaWxlIiwicmltcmFmIiwiZSIsInJlc2V0TW9ja0xvY2F0aW9uIiwidGhpcmRQYXJ0eVBrZ0lkc1Byb21pc2UiLCJ0aGlyZFBhcnR5UGtnSWRzIiwicmVzdWx0UGtncyIsImludGVyc2VjdGlvbiIsInNpemUiLCJwa2dJZCIsImluc3RhbGxIZWxwZXJBcHAiLCJhcGtQYXRoIiwicGFja2FnZUlkIiwicmV0cnkiLCJyZXRyeUluc3RhbGxIZWxwZXJBcHAiLCJwdXNoU2V0dGluZ3NBcHAiLCJ0aHJvd0Vycm9yIiwic2V0dGluZ3NBcGtQYXRoIiwicHJvY2Vzc0V4aXN0cyIsImFwaUxldmVsIiwicGVybXMiLCJ4IiwicmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCIsImlzRW11bGF0b3IiLCJwdXNoU3RyaW5ncyIsInJlbW90ZURpciIsInN0cmluZ3NKc29uIiwicmVtb3RlRmlsZSIsInJlc29sdmUiLCJwdWxsQXBrIiwidG1wRGlyIiwiaXNFbXB0eSIsImV4aXN0cyIsInN0cmluZ3NUbXBEaXIiLCJhcGtTdHJpbmdzIiwibG9jYWxQYXRoIiwiZXh0cmFjdFN0cmluZ3NGcm9tQXBrIiwidW5sb2NrV2l0aEhlbHBlckFwcCIsImZpcnN0UnVuIiwibGF1bmNoSGVscGVyIiwiaXNTY3JlZW5Mb2NrZWQiLCJkZWxheSIsInVubG9jayIsImRyaXZlciIsImNhcGFiaWxpdGllcyIsInVubG9ja0tleSIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiLCJ1bmxvY2tlciIsInZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIiwiRklOR0VSUFJJTlRfVU5MT0NLIiwiaXNOaWwiLCJpc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkIiwiZmFzdFVubG9jayIsImNyZWRlbnRpYWwiLCJjcmVkZW50aWFsVHlwZSIsInVubG9ja01ldGhvZCIsInBpblVubG9jayIsInBpblVubG9ja1dpdGhLZXlFdmVudCIsInBhc3N3b3JkVW5sb2NrIiwicGF0dGVyblVubG9jayIsImZpbmdlcnByaW50VW5sb2NrIiwidmVyaWZ5VW5sb2NrIiwidGltZW91dE1zIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJpbml0RGV2aWNlIiwic2tpcERldmljZUluaXRpYWxpemF0aW9uIiwibG9jYWxlU2NyaXB0IiwidW5pY29kZUtleWJvYXJkIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInNraXBVbmxvY2siLCJtb2NrTG9jYXRpb25BcHAiLCJza2lwTG9nY2F0Q2FwdHVyZSIsImxvZ2NhdEZvcm1hdCIsImxvZ2NhdEZpbHRlclNwZWNzIiwid2FpdEZvckRldmljZSIsInNob3VsZFRocm93RXJyb3IiLCJpc1VuZGVmaW5lZCIsInN0YXJ0TG9nY2F0IiwiZm9ybWF0IiwiZmlsdGVyU3BlY3MiLCJyZW1vdmVOdWxsUHJvcGVydGllcyIsIm9iaiIsImlzTnVsbCIsInRydW5jYXRlRGVjaW1hbHMiLCJudW1iZXIiLCJkaWdpdHMiLCJtdWx0aXBsaWVyIiwiTWF0aCIsInBvdyIsImFkanVzdGVkTnVtIiwidHJ1bmNhdGVkTnVtIiwiaXNDaHJvbWVCcm93c2VyIiwiZ2V0Q2hyb21lUGtnIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwic2Vzc2lvbklkIiwiaXNGdW5jdGlvbiIsImdldFdlYlNvY2tldEhhbmRsZXJzIiwiYWN0aXZlSGFuZGxlcnMiLCJwYXRobmFtZSIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJwYXJzZUFycmF5IiwiY2FwIiwicGFyc2VkQ2FwcyIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiYnJvd3Nlck5hbWUiLCJhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMiLCJwb3NzaWJsZU5hbWVzIiwic29tZSIsInRlc3QiLCJib290c3RyYXAiLCJCb290c3RyYXAiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvYW5kcm9pZC1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJldHJ5LCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGVtcERpciB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHBhdGggYXMgc2V0dGluZ3NBcGtQYXRoIH0gZnJvbSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmltcG9ydCBCb290c3RyYXAgZnJvbSAnLi9ib290c3RyYXAnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IEFEQiBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgdW5sb2NrZXIsIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULFxuICBQQVNTV09SRF9VTkxPQ0ssIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbn0gZnJvbSAnLi91bmxvY2staGVscGVycyc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmNvbnN0IE1PQ0tfQVBQX0lEU19TVE9SRSA9ICcvZGF0YS9sb2NhbC90bXAvbW9ja19hcHBzLmpzb24nO1xuY29uc3QgUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQgPSA5MDAwMDsgLy8gbWlsbGlzZWNvbmRzXG4vLyBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2aWNlL2FuZHJvaWRfZGV2aWNlX2luZm9fcXVlcnkuY2NcbmNvbnN0IENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkgPSB7XG4gIGNocm9tZToge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gIGNocm9taXVtOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLmNocm9tZS5zaGVsbCcsXG4gICAgYWN0aXZpdHk6ICcuQ2hyb21lU2hlbGxBY3Rpdml0eScsXG4gIH0sXG4gIGNocm9tZWJldGE6IHtcbiAgICBwa2c6ICdjb20uY2hyb21lLmJldGEnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBicm93c2VyOiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuYnJvd3NlcicsXG4gICAgYWN0aXZpdHk6ICdjb20uYW5kcm9pZC5icm93c2VyLkJyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gICdjaHJvbWl1bS1icm93c2VyJzoge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICAnY2hyb21pdW0td2Vidmlldyc6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbCcsXG4gICAgYWN0aXZpdHk6ICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbC5XZWJWaWV3QnJvd3NlckFjdGl2aXR5JyxcbiAgfSxcbiAgZGVmYXVsdDoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG59O1xuY29uc3QgU0VUVElOR1NfSEVMUEVSX1BLR19JRCA9ICdpby5hcHBpdW0uc2V0dGluZ3MnO1xuY29uc3QgU0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWSA9ICcuVW5sb2NrJztcbmNvbnN0IEVNVUxBVE9SX1BBVFRFUk4gPSAvXFxiZW11bGF0b3JcXGIvaTtcbi8vIFRoZXNlIGNvbnN0YW50cyBhcmUgaW4gc3luYyB3aXRoXG4vLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWFwcGxpY2F0aW9uc3RhdGUveGN1aWFwcGxpY2F0aW9uc3RhdGVydW5uaW5nYmFja2dyb3VuZD9sYW5ndWFnZT1vYmpjXG5jb25zdCBBUFBfU1RBVEUgPSBPYmplY3QuZnJlZXplKHtcbiAgTk9UX0lOU1RBTExFRDogMCxcbiAgTk9UX1JVTk5JTkc6IDEsXG4gIFJVTk5JTkdfSU5fQkFDS0dST1VORDogMyxcbiAgUlVOTklOR19JTl9GT1JFR1JPVU5EOiA0XG59KTtcblxuXG5mdW5jdGlvbiBlbnN1cmVOZXR3b3JrU3BlZWQgKGFkYiwgbmV0d29ya1NwZWVkKSB7XG4gIGlmIChfLnZhbHVlcyhhZGIuTkVUV09SS19TUEVFRCkuaW5jbHVkZXMobmV0d29ya1NwZWVkKSkge1xuICAgIHJldHVybiBuZXR3b3JrU3BlZWQ7XG4gIH1cbiAgbG9nZ2VyLndhcm4oYFdyb25nIG5ldHdvcmsgc3BlZWQgcGFyYW0gJyR7bmV0d29ya1NwZWVkfScsIHVzaW5nIGRlZmF1bHQ6ICR7YWRiLk5FVFdPUktfU1BFRUQuRlVMTH0uIGAgK1xuICAgIGBTdXBwb3J0ZWQgdmFsdWVzOiAke18udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKX1gKTtcbiAgcmV0dXJuIGFkYi5ORVRXT1JLX1NQRUVELkZVTEw7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBdmRBcmdzIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIG5ldHdvcmtTcGVlZCxcbiAgICBpc0hlYWRsZXNzLFxuICAgIGF2ZEFyZ3MsXG4gIH0gPSBvcHRzO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaWYgKGF2ZEFyZ3MpIHtcbiAgICBpZiAoXy5pc0FycmF5KGF2ZEFyZ3MpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5hdmRBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goLi4uKHV0aWwuc2hlbGxQYXJzZShgJHthdmRBcmdzfWApKSk7XG4gICAgfVxuICB9XG4gIGlmIChuZXR3b3JrU3BlZWQpIHtcbiAgICByZXN1bHQucHVzaCgnLW5ldHNwZWVkJywgZW5zdXJlTmV0d29ya1NwZWVkKGFkYiwgbmV0d29ya1NwZWVkKSk7XG4gIH1cbiAgaWYgKGlzSGVhZGxlc3MpIHtcbiAgICByZXN1bHQucHVzaCgnLW5vLXdpbmRvdycpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRvQ3JlZGVudGlhbFR5cGUgKHVubG9ja1R5cGUpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIFtQSU5fVU5MT0NLXTogJ3BpbicsXG4gICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogJ3BpbicsXG4gICAgW1BBU1NXT1JEX1VOTE9DS106ICdwYXNzd29yZCcsXG4gICAgW1BBVFRFUk5fVU5MT0NLXTogJ3BhdHRlcm4nLFxuICB9W3VubG9ja1R5cGVdO1xuICBpZiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayB0eXBlICcke3VubG9ja1R5cGV9JyBpcyBub3Qga25vd25gKTtcbn1cblxuXG5jb25zdCBoZWxwZXJzID0ge307XG5cbmhlbHBlcnMuY3JlYXRlQmFzZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJhc2VBREIgKG9wdHMgPSB7fSkge1xuICAvLyBmaWx0ZXIgb3V0IGFueSB1bndhbnRlZCBvcHRpb25zIHNlbnQgaW5cbiAgLy8gdGhpcyBsaXN0IHNob3VsZCBiZSB1cGRhdGVkIGFzIEFEQiB0YWtlcyBtb3JlIGFyZ3VtZW50c1xuICBjb25zdCB7XG4gICAgYWRiUG9ydCxcbiAgICBzdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgcmVtb3RlQWRiSG9zdCxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgIGFkYkV4ZWNUaW1lb3V0LFxuICAgIHVzZUtleXN0b3JlLFxuICAgIGtleXN0b3JlUGF0aCxcbiAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkLFxuICAgIHJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIGJ1aWxkVG9vbHNWZXJzaW9uLFxuICAgIGFsbG93T2ZmbGluZURldmljZXMsXG4gICAgYWxsb3dEZWxheUFkYixcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCBBREIuY3JlYXRlQURCKHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9KTtcbn07XG5cbmhlbHBlcnMucHJlcGFyZUVtdWxhdG9yID0gYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUVtdWxhdG9yIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIGF2ZCxcbiAgICBhdmRFbnY6IGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBsb2NhbGU6IGNvdW50cnksXG4gICAgYXZkTGF1bmNoVGltZW91dDogbGF1bmNoVGltZW91dCxcbiAgICBhdmRSZWFkeVRpbWVvdXQ6IHJlYWR5VGltZW91dCxcbiAgfSA9IG9wdHM7XG4gIGlmICghYXZkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbGF1bmNoIEFWRCB3aXRob3V0IEFWRCBuYW1lJyk7XG4gIH1cblxuICBjb25zdCBhdmROYW1lID0gYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gIGNvbnN0IHJ1bm5pbmdBVkQgPSBhd2FpdCBhZGIuZ2V0UnVubmluZ0FWRFdpdGhSZXRyeShhdmROYW1lKTtcbiAgY29uc3QgYXJncyA9IHByZXBhcmVBdmRBcmdzKGFkYiwgb3B0cyk7XG4gIGlmIChydW5uaW5nQVZEKSB7XG4gICAgaWYgKGFyZ3MuaW5jbHVkZXMoJy13aXBlLWRhdGEnKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBLaWxsaW5nICcke2F2ZE5hbWV9JyBiZWNhdXNlIGl0IG5lZWRzIHRvIGJlIHdpcGVkIGF0IHN0YXJ0LmApO1xuICAgICAgYXdhaXQgYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOb3QgbGF1bmNoaW5nIEFWRCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgYXdhaXQgYWRiLmxhdW5jaEFWRChhdmQsIHtcbiAgICBhcmdzLFxuICAgIGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBjb3VudHJ5LFxuICAgIGxhdW5jaFRpbWVvdXQsXG4gICAgcmVhZHlUaW1lb3V0LFxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IGFuZCBlbnN1cmUgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZS4gVGhlIGxhbmd1YWdlIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gbG93ZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Miw4fS4gZS5nLiBlbiwgamEgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeSAtIENvdW50cnkuIFRoZSBjb3VudHJ5IChyZWdpb24pIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdXBwZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Mn0gfCBbMC05XXszfS4gZS5nLiBVUywgSlAgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0gez9zdHJpbmd9IHNjcmlwdCAtIFNjcmlwdC4gVGhlIHNjcmlwdCBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdGl0bGUgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17NH0uIGUuZy4gSGFucyBpbiB6aC1IYW5zLUNOIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxlZCB0byBzZXQgbG9jYWxlIHByb3Blcmx5XG4gKi9cbmhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGV2aWNlTG9jYWxlIChhZGIsIGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGlmICghXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgIV8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICBsb2dnZXIud2Fybihgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IHJlcXVpcmVzIGxhbmd1YWdlIG9yIGNvdW50cnkuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEdvdCBsYW5ndWFnZTogJyR7bGFuZ3VhZ2V9JyBhbmQgY291bnRyeTogJyR7Y291bnRyeX0nYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgYWRiLnNldERldmljZUxhbmd1YWdlQ291bnRyeShsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KTtcblxuICBpZiAoIWF3YWl0IGFkYi5lbnN1cmVDdXJyZW50TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHNjcmlwdCA/IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0sIGNvdW50cnk6ICR7Y291bnRyeX0gYW5kIHNjcmlwdDogJHtzY3JpcHR9YCA6IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0gYW5kIGNvdW50cnk6ICR7Y291bnRyeX1gO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNldCAke21lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIChvcHRzID0ge30pIHtcbiAgLy8gd2UgY2FuIGNyZWF0ZSBhIHRocm93YXdheSBBREIgaW5zdGFuY2UgaGVyZSwgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jeVxuICAvLyBvbiBpbnN0YW50aWF0aW5nIG9uIGVhcmxpZXIgKGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbm8gdWRpZClcbiAgLy8gd2UgY2FuIG9ubHkgdXNlIHRoaXMgQURCIG9iamVjdCBmb3IgY29tbWFuZHMgdGhhdCB3b3VsZCBub3QgYmUgY29uZnVzZWRcbiAgLy8gaWYgbXVsdGlwbGUgZGV2aWNlcyBhcmUgY29ubmVjdGVkXG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgbGV0IHVkaWQgPSBvcHRzLnVkaWQ7XG4gIGxldCBlbVBvcnQgPSBudWxsO1xuXG4gIC8vIGEgc3BlY2lmaWMgYXZkIG5hbWUgd2FzIGdpdmVuLiB0cnkgdG8gaW5pdGlhbGl6ZSB3aXRoIHRoYXRcbiAgaWYgKG9wdHMuYXZkKSB7XG4gICAgYXdhaXQgaGVscGVycy5wcmVwYXJlRW11bGF0b3IoYWRiLCBvcHRzKTtcbiAgICB1ZGlkID0gYWRiLmN1ckRldmljZUlkO1xuICAgIGVtUG9ydCA9IGFkYi5lbXVsYXRvclBvcnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gYXZkIGdpdmVuLiBsZXRzIHRyeSB3aGF0ZXZlcidzIHBsdWdnZWQgaW4gZGV2aWNlcy9lbXVsYXRvcnNcbiAgICBsb2dnZXIuaW5mbygnUmV0cmlldmluZyBkZXZpY2UgbGlzdCcpO1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgYWRiLmdldERldmljZXNXaXRoUmV0cnkoKTtcblxuICAgIC8vIHVkaWQgd2FzIGdpdmVuLCBsZXRzIHRyeSB0byBpbml0IHdpdGggdGhhdCBkZXZpY2VcbiAgICBpZiAodWRpZCkge1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKF8ubWFwKGRldmljZXMsICd1ZGlkJyksIHVkaWQpKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBEZXZpY2UgJHt1ZGlkfSB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBkZXZpY2VzYCk7XG4gICAgICB9XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2UgaWYgKG9wdHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICBvcHRzLnBsYXRmb3JtVmVyc2lvbiA9IGAke29wdHMucGxhdGZvcm1WZXJzaW9ufWAudHJpbSgpO1xuXG4gICAgICAvLyBhIHBsYXRmb3JtIHZlcnNpb24gd2FzIGdpdmVuLiBsZXRzIHRyeSB0byBmaW5kIGEgZGV2aWNlIHdpdGggdGhlIHNhbWUgb3NcbiAgICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbiA9IHNlbXZlci5jb2VyY2Uob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHx8IG9wdHMucGxhdGZvcm1WZXJzaW9uO1xuICAgICAgbG9nZ2VyLmluZm8oYExvb2tpbmcgZm9yIGEgZGV2aWNlIHdpdGggQW5kcm9pZCAnJHtwbGF0Zm9ybVZlcnNpb259J2ApO1xuXG4gICAgICAvLyBpbiBjYXNlIHdlIGZhaWwgdG8gZmluZCBzb21ldGhpbmcsIGdpdmUgdGhlIHVzZXIgYSB1c2VmdWwgbG9nIHRoYXQgaGFzXG4gICAgICAvLyB0aGUgZGV2aWNlIHVkaWRzIGFuZCBvcyB2ZXJzaW9ucyBzbyB0aGV5IGtub3cgd2hhdCdzIGF2YWlsYWJsZVxuICAgICAgY29uc3QgYXZhaWxEZXZpY2VzID0gW107XG4gICAgICBsZXQgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0gbnVsbDtcbiAgICAgIC8vIGZpcnN0IHRyeSBzdGFydGVkIGRldmljZXMvZW11bGF0b3JzXG4gICAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICAgIC8vIGRpcmVjdCBhZGIgY2FsbHMgdG8gdGhlIHNwZWNpZmljIGRldmljZVxuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQoZGV2aWNlLnVkaWQpO1xuICAgICAgICBjb25zdCByYXdEZXZpY2VPUyA9IGF3YWl0IGFkYi5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICAgICAgLy8gVGhlIGRldmljZSBPUyBjb3VsZCBlaXRoZXIgYmUgYSBudW1iZXIsIGxpa2UgYDYuMGBcbiAgICAgICAgLy8gb3IgYW4gYWJicmV2aWF0aW9uLCBsaWtlIGBSYFxuICAgICAgICBhdmFpbERldmljZXMucHVzaChgJHtkZXZpY2UudWRpZH0gKCR7cmF3RGV2aWNlT1N9KWApO1xuICAgICAgICBjb25zdCBkZXZpY2VPUyA9IHNlbXZlci5jb2VyY2UocmF3RGV2aWNlT1MpIHx8IHJhd0RldmljZU9TO1xuICAgICAgICBpZiAoIWRldmljZU9TKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgPSBzZW12ZXIudmFsaWQoZGV2aWNlT1MpICYmIHNlbXZlci52YWxpZChwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzID0gXy5pc1N0cmluZyhkZXZpY2VPUykgJiYgXy5pc1N0cmluZyhwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBpZiAoYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkICYmIGRldmljZU9TLnZlcnNpb24gPT09IHBsYXRmb3JtVmVyc2lvbi52ZXJzaW9uXG4gICAgICAgICAgICB8fCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzICYmIF8udG9Mb3dlcihkZXZpY2VPUykgPT09IF8udG9Mb3dlcihwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgICAgICAgLy8gR290IGFuIGV4YWN0IG1hdGNoIC0gcHJvY2VlZCBpbW1lZGlhdGVseVxuICAgICAgICAgIHVkaWQgPSBkZXZpY2UudWRpZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICghYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8gY2hlY2sgZm9yIHBhcnRpYWwgbWF0Y2ggaWYgZWl0aGVyIG9mIHZlcnNpb24gbnVtYmVycyBpcyBub3QgY29lcmNpYmxlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCFfLmluY2x1ZGVzKG9wdHMucGxhdGZvcm1WZXJzaW9uLCAnLicpICYmIHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3JcbiAgICAgICAgICAgIHx8IHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3IgJiYgcGxhdGZvcm1WZXJzaW9uLm1pbm9yID09PSBkZXZpY2VPUy5taW5vcilcbiAgICAgICAgICAgIC8vIEdvdCBhIHBhcnRpYWwgbWF0Y2ggLSBtYWtlIHN1cmUgd2UgY29uc2lkZXIgdGhlIG1vc3QgcmVjZW50XG4gICAgICAgICAgICAvLyBkZXZpY2UgdmVyc2lvbiBhdmFpbGFibGUgb24gdGhlIGhvc3Qgc3lzdGVtXG4gICAgICAgICAgICAmJiAocGFydGlhbE1hdGNoQ2FuZGlkYXRlICYmIHNlbXZlci5ndChkZXZpY2VPUywgXy52YWx1ZXMocGFydGlhbE1hdGNoQ2FuZGlkYXRlKVswXSlcbiAgICAgICAgICAgICAgICB8fCAhcGFydGlhbE1hdGNoQ2FuZGlkYXRlKSkge1xuICAgICAgICAgIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSA9IHtbZGV2aWNlLnVkaWRdOiBkZXZpY2VPU307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdWRpZCAmJiBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpIHtcbiAgICAgICAgdWRpZCA9IF8ua2V5cyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdO1xuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdWRpZCkge1xuICAgICAgICAvLyB3ZSBjb3VsZG4ndCBmaW5kIGFueXRoaW5nISBxdWl0XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBVbmFibGUgdG8gZmluZCBhbiBhY3RpdmUgZGV2aWNlIG9yIGVtdWxhdG9yIGAgK1xuICAgICAgICAgIGB3aXRoIE9TICR7b3B0cy5wbGF0Zm9ybVZlcnNpb259LiBUaGUgZm9sbG93aW5nIGFyZSBhdmFpbGFibGU6IGAgK1xuICAgICAgICAgIGF2YWlsRGV2aWNlcy5qb2luKCcsICcpKTtcbiAgICAgIH1cblxuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGEgdWRpZCB3YXMgbm90IGdpdmVuLCBncmFiIHRoZSBmaXJzdCBkZXZpY2Ugd2Ugc2VlXG4gICAgICB1ZGlkID0gZGV2aWNlc1swXS51ZGlkO1xuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmluZm8oYFVzaW5nIGRldmljZTogJHt1ZGlkfWApO1xuICByZXR1cm4ge3VkaWQsIGVtUG9ydH07XG59O1xuXG4vLyByZXR1cm5zIGEgbmV3IGFkYiBpbnN0YW5jZSB3aXRoIGRldmljZUlkIHNldFxuaGVscGVycy5jcmVhdGVBREIgPSBhc3luYyBmdW5jdGlvbiBjcmVhdGVBREIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7dWRpZCwgZW1Qb3J0fSA9IG9wdHM7XG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgYWRiLnNldERldmljZUlkKHVkaWQpO1xuICBpZiAoZW1Qb3J0KSB7XG4gICAgYWRiLnNldEVtdWxhdG9yUG9ydChlbVBvcnQpO1xuICB9XG5cbiAgcmV0dXJuIGFkYjtcbn07XG5cbmhlbHBlcnMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMgKG9wdHMpIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydhcHBQYWNrYWdlJywgJ2FwcEFjdGl2aXR5JywgJ2FwcFdhaXRQYWNrYWdlJywgJ2FwcFdhaXRBY3Rpdml0eSddKSB7XG4gICAgY29uc3QgbmFtZSA9IG9wdHNba2V5XTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gLyhbXlxcdy4qLF0pKy8uZXhlYyhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybihgQ2FwYWJpbGl0eSAnJHtrZXl9JyBpcyBleHBlY3RlZCB0byBvbmx5IGluY2x1ZGUgbGF0aW4gbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlLCBkb3QsIGNvbW1hIGFuZCBhc3RlcmlzayBjaGFyYWN0ZXJzLmApO1xuICAgIGxvZ2dlci53YXJuKGBDdXJyZW50IHZhbHVlICcke25hbWV9JyBoYXMgbm9uLW1hdGNoaW5nIGNoYXJhY3RlciBhdCBpbmRleCAke21hdGNoLmluZGV4fTogJyR7bmFtZS5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXggKyAxKX0nYCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0TGF1bmNoSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldExhdW5jaEluZm8gKGFkYiwgb3B0cykge1xuICBsZXQge2FwcCwgYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHl9ID0gb3B0cztcbiAgaWYgKCFhcHApIHtcbiAgICBsb2dnZXIud2FybignTm8gYXBwIHNlbnQgaW4sIG5vdCBwYXJzaW5nIHBhY2thZ2UvYWN0aXZpdHknKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMob3B0cyk7XG5cbiAgaWYgKGFwcFBhY2thZ2UgJiYgYXBwQWN0aXZpdHkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1BhcnNpbmcgcGFja2FnZSBhbmQgYWN0aXZpdHkgZnJvbSBhcHAgbWFuaWZlc3QnKTtcbiAgbGV0IHthcGtQYWNrYWdlLCBhcGtBY3Rpdml0eX0gPVxuICAgIGF3YWl0IGFkYi5wYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QoYXBwKTtcbiAgaWYgKGFwa1BhY2thZ2UgJiYgIWFwcFBhY2thZ2UpIHtcbiAgICBhcHBQYWNrYWdlID0gYXBrUGFja2FnZTtcbiAgfVxuICBpZiAoIWFwcFdhaXRQYWNrYWdlKSB7XG4gICAgYXBwV2FpdFBhY2thZ2UgPSBhcHBQYWNrYWdlO1xuICB9XG4gIGlmIChhcGtBY3Rpdml0eSAmJiAhYXBwQWN0aXZpdHkpIHtcbiAgICBhcHBBY3Rpdml0eSA9IGFwa0FjdGl2aXR5O1xuICB9XG4gIGlmICghYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgYXBwV2FpdEFjdGl2aXR5ID0gYXBwQWN0aXZpdHk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlOiAke2Fwa1BhY2thZ2V9LyR7YXBrQWN0aXZpdHl9YCk7XG4gIHJldHVybiB7YXBwUGFja2FnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0QWN0aXZpdHl9O1xufTtcblxuaGVscGVycy5yZXNldEFwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0QXBwIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGFwcFBhY2thZ2UsXG4gICAgZmFzdFJlc2V0LFxuICAgIGZ1bGxSZXNldCxcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlc1xuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcFBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwUGFja2FnZScgb3B0aW9uIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgY29uc3QgaXNJbnN0YWxsZWQgPSBhd2FpdCBhZGIuaXNBcHBJbnN0YWxsZWQoYXBwUGFja2FnZSk7XG5cbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFkYi5mb3JjZVN0b3AoYXBwUGFja2FnZSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIC8vIGZ1bGxSZXNldCBoYXMgcHJpb3JpdHkgb3ZlciBmYXN0UmVzZXRcbiAgICBpZiAoIWZ1bGxSZXNldCAmJiBmYXN0UmVzZXQpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5jbGVhcihhcHBQYWNrYWdlKTtcbiAgICAgIGlmIChfLmlzU3RyaW5nKG91dHB1dCkgJiYgb3V0cHV0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZhaWxlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNsZWFyIHRoZSBhcHBsaWNhdGlvbiBkYXRhIG9mICcke2FwcFBhY2thZ2V9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7b3V0cHV0fWApO1xuICAgICAgfVxuICAgICAgLy8gZXhlY3V0aW5nIGBzaGVsbCBwbSBjbGVhcmAgcmVzZXRzIHByZXZpb3VzbHkgYXNzaWduZWQgYXBwbGljYXRpb24gcGVybWlzc2lvbnMgYXMgd2VsbFxuICAgICAgaWYgKGF1dG9HcmFudFBlcm1pc3Npb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYWRiLmdyYW50QWxsUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBVbmFibGUgdG8gZ3JhbnQgcGVybWlzc2lvbnMgcmVxdWVzdGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoYFBlcmZvcm1lZCBmYXN0IHJlc2V0IG9uIHRoZSBpbnN0YWxsZWQgJyR7YXBwUGFja2FnZX0nIGFwcGxpY2F0aW9uIChzdG9wIGFuZCBjbGVhcilgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWFwcCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHAnIG9wdGlvbiBpcyByZXF1aXJlZCBmb3IgcmVpbnN0YWxsXCIpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBSdW5uaW5nIGZ1bGwgcmVzZXQgb24gJyR7YXBwUGFja2FnZX0nIChyZWluc3RhbGwpYCk7XG4gIGlmIChpc0luc3RhbGxlZCkge1xuICAgIGF3YWl0IGFkYi51bmluc3RhbGxBcGsoYXBwUGFja2FnZSk7XG4gIH1cbiAgYXdhaXQgYWRiLmluc3RhbGwoYXBwLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICB9KTtcbn07XG5cbmhlbHBlcnMuaW5zdGFsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGsgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcCB8fCAhYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHAnIGFuZCAnYXBwUGFja2FnZScgb3B0aW9ucyBhcmUgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoZnVsbFJlc2V0KSB7XG4gICAgYXdhaXQgdGhpcy5yZXNldEFwcChhZGIsIG9wdHMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBhcHBTdGF0ZSxcbiAgICB3YXNVbmluc3RhbGxlZFxuICB9ID0gYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBwLCBhcHBQYWNrYWdlLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VDdXJyZW50QnVpbGQ6IGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9KTtcblxuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IHRoZSBuZXdseSBpbnN0YWxsZWQgYXBwXG4gIGNvbnN0IGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwID0gIXdhc1VuaW5zdGFsbGVkXG4gICAgJiYgYXBwU3RhdGUgIT09IGFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICBpZiAoZmFzdFJlc2V0ICYmIGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwKSB7XG4gICAgbG9nZ2VyLmluZm8oYFBlcmZvcm1pbmcgZmFzdCByZXNldCBvbiAnJHthcHBQYWNrYWdlfSdgKTtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdGFsbHMgYW4gYXJyYXkgb2YgYXBrc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0cyBkZWZpbmVkIGluIGRyaXZlci5qc1xuICovXG5oZWxwZXJzLmluc3RhbGxPdGhlckFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsT3RoZXJBcGtzIChvdGhlckFwcHMsIGFkYiwgb3B0cykge1xuICBsZXQge1xuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIC8vIEluc3RhbGwgYWxsIG9mIHRoZSBBUEsncyBhc3luY2hyb25vdXNseVxuICBhd2FpdCBCLmFsbChvdGhlckFwcHMubWFwKChvdGhlckFwcCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgSW5zdGFsbGluZyBhcHA6ICR7b3RoZXJBcHB9YCk7XG4gICAgcmV0dXJuIGFkYi5pbnN0YWxsT3JVcGdyYWRlKG90aGVyQXBwLCBudWxsLCB7XG4gICAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIH0pO1xuICB9KSk7XG59O1xuXG4vKipcbiAqIFVuaW5zdGFsbCBhbiBhcnJheSBvZiBwYWNrYWdlc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcHBQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlIG5hbWVzIHRvIHVuaW5zdGFsbC4gSWYgdGhpcyBpbmNsdWRlcyBgJyonYCwgdW5pbnN0YWxsIGFsbCBvZiAzcmQgcGFydHkgYXBwc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlcyBkb2VzIG5vdCB1bmluc3RhbGwgd2hlbiBgKmAgaXMgcHJvdmlkZWQgYXMgYGFwcFBhY2thZ2VzYFxuICovXG5oZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGxPdGhlclBhY2thZ2VzIChhZGIsIGFwcFBhY2thZ2VzLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIGlmIChhcHBQYWNrYWdlcy5pbmNsdWRlcygnKicpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdVbmluc3RhbGwgdGhpcmQgcGFydHkgcGFja2FnZXMnKTtcbiAgICBhcHBQYWNrYWdlcyA9IGF3YWl0IHRoaXMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzKGFkYiwgZmlsdGVyUGFja2FnZXMpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBVbmluc3RhbGxpbmcgcGFja2FnZXM6ICR7YXBwUGFja2FnZXN9YCk7XG4gIGF3YWl0IEIuYWxsKGFwcFBhY2thZ2VzLm1hcCgoYXBwUGFja2FnZSkgPT4gYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKSkpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhpcmQgcGFydHkgcGFja2FnZXMgZmlsdGVyZWQgd2l0aCBgZmlsdGVyUGFja2FnZXNgXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXkgb2YgaW5zdGFsbGVkIHRoaXJkIHBhcnkgcGFja2FnZXNcbiAqL1xuaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRUaGlyZFBhcnR5UGFja2FnZXMgKGFkYiwgZmlsdGVyUGFja2FnZXMgPSBbXSkge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VzU3RyaW5nID0gYXdhaXQgYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsICctMyddKTtcbiAgICBjb25zdCBhcHBQYWNrYWdlc0FycmF5ID0gcGFja2FnZXNTdHJpbmcudHJpbSgpLnJlcGxhY2UoL3BhY2thZ2U6L2csICcnKS5zcGxpdChFT0wpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJyR7YXBwUGFja2FnZXNBcnJheX0nIGZpbHRlcmVkIHdpdGggJyR7ZmlsdGVyUGFja2FnZXN9J2ApO1xuICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXBwUGFja2FnZXNBcnJheSwgZmlsdGVyUGFja2FnZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIGdldCBwYWNrYWdlcyB3aXRoICdhZGIgc2hlbGwgcG0gbGlzdCBwYWNrYWdlcyAtMyc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5oZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBpbml0VW5pY29kZUtleWJvYXJkIChhZGIpIHtcbiAgbG9nZ2VyLmRlYnVnKCdFbmFibGluZyBVbmljb2RlIGtleWJvYXJkIHN1cHBvcnQnKTtcblxuICAvLyBnZXQgdGhlIGRlZmF1bHQgSU1FIHNvIHdlIGNhbiByZXR1cm4gYmFjayB0byBpdCBsYXRlciBpZiB3ZSB3YW50XG4gIGxldCBkZWZhdWx0SU1FID0gYXdhaXQgYWRiLmRlZmF1bHRJTUUoKTtcblxuICBsb2dnZXIuZGVidWcoYFVuc2V0dGluZyBwcmV2aW91cyBJTUUgJHtkZWZhdWx0SU1FfWApO1xuICBjb25zdCBhcHBpdW1JTUUgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8uVW5pY29kZUlNRWA7XG4gIGxvZ2dlci5kZWJ1ZyhgU2V0dGluZyBJTUUgdG8gJyR7YXBwaXVtSU1FfSdgKTtcbiAgYXdhaXQgYWRiLmVuYWJsZUlNRShhcHBpdW1JTUUpO1xuICBhd2FpdCBhZGIuc2V0SU1FKGFwcGl1bUlNRSk7XG4gIHJldHVybiBkZWZhdWx0SU1FO1xufTtcblxuaGVscGVycy5zZXRNb2NrTG9jYXRpb25BcHAgPSBhc3luYyBmdW5jdGlvbiBzZXRNb2NrTG9jYXRpb25BcHAgKGFkYiwgYXBwKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcxJ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgYXBwLCAnYW5kcm9pZDptb2NrX2xvY2F0aW9uJywgJ2FsbG93J10pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzZXQgbW9jayBsb2NhdGlvbiBmb3IgYXBwICcke2FwcH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGxldCBwa2dJZHMgPSBbXTtcbiAgICBpZiAoYXdhaXQgYWRiLmZpbGVFeGlzdHMoTU9DS19BUFBfSURTX1NUT1JFKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGtnSWRzID0gSlNPTi5wYXJzZShhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCBNT0NLX0FQUF9JRFNfU1RPUkVdKSk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIGlmIChwa2dJZHMuaW5jbHVkZXMoYXBwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwa2dJZHMucHVzaChhcHApO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5wb3NpeC5qb2luKHRtcFJvb3QsIHBhdGgucG9zaXguYmFzZW5hbWUoTU9DS19BUFBfSURTX1NUT1JFKSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShzcmNQYXRoLCBKU09OLnN0cmluZ2lmeShwa2dJZHMpLCAndXRmOCcpO1xuICAgICAgYXdhaXQgYWRiLnB1c2hGaWxlKHNyY1BhdGgsIE1PQ0tfQVBQX0lEU19TVE9SRSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHBlcnNpc3QgbW9jayBsb2NhdGlvbiBhcHAgaWQgJyR7YXBwfSc6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLnJlc2V0TW9ja0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gcmVzZXRNb2NrTG9jYXRpb24gKGFkYikge1xuICB0cnkge1xuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCAnc2VjdXJlJywgJ21vY2tfbG9jYXRpb24nLCAnMCddKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZSA9IGhlbHBlcnMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzKGFkYik7XG4gICAgbGV0IHBrZ0lkcyA9IFtdO1xuICAgIGlmIChhd2FpdCBhZGIuZmlsZUV4aXN0cyhNT0NLX0FQUF9JRFNfU1RPUkUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwa2dJZHMgPSBKU09OLnBhcnNlKGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsIE1PQ0tfQVBQX0lEU19TVE9SRV0pKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgY29uc3QgdGhpcmRQYXJ0eVBrZ0lkcyA9IGF3YWl0IHRoaXJkUGFydHlQa2dJZHNQcm9taXNlO1xuICAgIC8vIE9ubHkgaW5jbHVkZSBjdXJyZW50bHkgaW5zdGFsbGVkIHBhY2thZ2VzXG4gICAgY29uc3QgcmVzdWx0UGtncyA9IF8uaW50ZXJzZWN0aW9uKHBrZ0lkcywgdGhpcmRQYXJ0eVBrZ0lkcyk7XG4gICAgaWYgKF8uc2l6ZShyZXN1bHRQa2dzKSA8PSAxKSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgcmVzdWx0UGtnc1swXSA/PyBTRVRUSU5HU19IRUxQRVJfUEtHX0lELCAnYW5kcm9pZDptb2NrX2xvY2F0aW9uJywgJ2RlbnknXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgbW9ja19sb2NhdGlvbiBwZXJtaXNzaW9uIGZvciB0aGUgZm9sbG93aW5nIGFwcHM6ICR7cmVzdWx0UGtnc31gKTtcbiAgICBhd2FpdCBCLmFsbChyZXN1bHRQa2dzLm1hcCgocGtnSWQpID0+IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgcGtnSWQsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnZGVueSddKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9KSgpKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcmVzZXQgbW9jayBsb2NhdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5pbnN0YWxsSGVscGVyQXBwID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEhlbHBlckFwcCAoYWRiLCBhcGtQYXRoLCBwYWNrYWdlSWQpIHtcbiAgLy8gU29tZXRpbWVzIGFkYiBwdXNoIG9yIGFkYiBpbnN0YWwgdGFrZSBtb3JlIHRpbWUgdGhhbiBleHBlY3RlZCB0byBpbnN0YWxsIGFuIGFwcFxuICAvLyBlLmcuIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vaW8uYXBwaXVtLnNldHRpbmdzL2lzc3Vlcy80MCNpc3N1ZWNvbW1lbnQtNDc2NTkzMTc0XG4gIGF3YWl0IHJldHJ5KDIsIGFzeW5jIGZ1bmN0aW9uIHJldHJ5SW5zdGFsbEhlbHBlckFwcCAoKSB7XG4gICAgYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBrUGF0aCwgcGFja2FnZUlkLCB7Z3JhbnRQZXJtaXNzaW9uczogdHJ1ZX0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogUHVzaGVzIGFuZCBpbnN0YWxscyBpby5hcHBpdW0uc2V0dGluZ3MgYXBwLlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzZXR0aW5nIGFwcCBpcyByZXF1aXJlZFxuICpcbiAqIEBwYXJhbSB7QWRifSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gRHJpdmVyIG9wdGlvbnMgZGljdGlvbmFyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdGhyb3dFcnJvciBbZmFsc2VdIC0gV2hldGhlciB0aHJvdyBhbiBlcnJvciBpZiBTZXR0aW5ncyBhcHAgZmFpbHMgdG8gc3RhcnRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aHJvd0Vycm9yIGlzIHRydWUgYW5kIHNvbWV0aGluZyBoYXBwZW5zIGluIGluc3RhbGxhdGlvbiBzdGVwXG4gKi9cbmhlbHBlcnMucHVzaFNldHRpbmdzQXBwID0gYXN5bmMgZnVuY3Rpb24gcHVzaFNldHRpbmdzQXBwIChhZGIsIHRocm93RXJyb3IgPSBmYWxzZSwgb3B0cyA9IHt9KSB7XG4gIGxvZ2dlci5kZWJ1ZygnUHVzaGluZyBzZXR0aW5ncyBhcGsgdG8gZGV2aWNlLi4uJyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAoYWRiLCBzZXR0aW5nc0Fwa1BhdGgsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHRocm93RXJyb3IpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGBJZ25vcmVkIGVycm9yIHdoaWxlIGluc3RhbGxpbmcgJyR7c2V0dGluZ3NBcGtQYXRofSc6IGAgK1xuICAgICAgICAgICAgICAgIGAnJHtlcnIubWVzc2FnZX0nLiBGZWF0dXJlcyB0aGF0IHJlbHkgb24gdGhpcyBoZWxwZXIgYCArXG4gICAgICAgICAgICAgICAgJ3JlcXVpcmUgdGhlIGFwayBzdWNoIGFzIHRvZ2dsZSBXaUZpIGFuZCBnZXR0aW5nIGxvY2F0aW9uICcgK1xuICAgICAgICAgICAgICAgICd3aWxsIHJhaXNlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gdXNlIHRoZW0uJyk7XG4gIH1cblxuICAvLyBSZWluc3RhbGwgd291bGQgc3RvcCB0aGUgc2V0dGluZ3MgaGVscGVyIHByb2Nlc3MgYW55d2F5LCBzb1xuICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBzdGlsbCBydW5uaW5nXG4gIGlmIChhd2FpdCBhZGIucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfUEtHX0lEKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfSBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRzIHBlcm1pc3Npb25zLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmIChhcGlMZXZlbCA+PSAyOSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vaW8uYXBwaXVtLnNldHRpbmdzI2ludGVybmFsLWF1ZGlvLS12aWRlby1yZWNvcmRpbmdcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdQUk9KRUNUX01FRElBJywgJ2FsbG93J10pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgfVxuICB9XG4gIGlmIChhcGlMZXZlbCA8PSAyMykgeyAvLyBBbmRyb2lkIDYtIGRldmljZXMgc2hvdWxkIGhhdmUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3B1bGwvMTE2NDAjaXNzdWVjb21tZW50LTQzODI2MDQ3N1xuICAgIGNvbnN0IHBlcm1zID0gWydTRVRfQU5JTUFUSU9OX1NDQUxFJywgJ0NIQU5HRV9DT05GSUdVUkFUSU9OJywgJ0FDQ0VTU19GSU5FX0xPQ0FUSU9OJ107XG4gICAgbG9nZ2VyLmluZm8oYEdyYW50aW5nIHBlcm1pc3Npb25zICR7cGVybXN9IHRvICcke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9J2ApO1xuICAgIGF3YWl0IGFkYi5ncmFudFBlcm1pc3Npb25zKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHBlcm1zLm1hcCgoeCkgPT4gYGFuZHJvaWQucGVybWlzc2lvbi4ke3h9YCkpO1xuICB9XG5cbiAgLy8gbGF1bmNoIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAgZHVlIHRvIHNldHRpbmdzIGZhaWxpbmcgdG8gYmUgc2V0XG4gIC8vIGlmIHRoZSBhcHAgaXMgbm90IGxhdW5jaGVkIHByaW9yIHRvIHN0YXJ0IHRoZSBzZXNzaW9uIG9uIGFuZHJvaWQgNytcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy84OTU3XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLnJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAoe1xuICAgICAgdGltZW91dDogaGVscGVycy5pc0VtdWxhdG9yKGFkYiwgb3B0cykgPyAzMDAwMCA6IDUwMDBcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgc3RyaW5nLnhtbCBhbmQgY29udmVydHMgaXQgdG8gc3RyaW5nLmpzb24gYW5kIHB1c2hlc1xuICogaXQgdG8gL2RhdGEvbG9jYWwvdG1wL3N0cmluZy5qc29uIG9uIGZvciB1c2Ugb2YgYm9vdHN0cmFwXG4gKiBJZiBhcHAgaXMgbm90IHByZXNlbnQgdG8gZXh0cmFjdCBzdHJpbmcueG1sIGl0IGRlbGV0ZXMgcmVtb3RlIHN0cmluZ3MuanNvblxuICogSWYgYXBwIGRvZXMgbm90IGhhdmUgc3RyaW5ncy54bWwgd2UgcHVzaCBhbiBlbXB0eSBqc29uIG9iamVjdCB0byByZW1vdGVcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UgYWJicmV2aWF0aW9uLCBmb3IgZXhhbXBsZSAnZnInLiBUaGUgZGVmYXVsdCBsYW5ndWFnZVxuICogaXMgdXNlZCBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkLlxuICogQHBhcmFtIHtPYmplY3R9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHJldHVybnMge09iamVjdH0gVGhlIGRpY3Rpb25hcnksIHdoZXJlIHN0cmluZyByZXNvdXJjZSBpZGVudGlmaWVycyBhcmUga2V5c1xuICogYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIG9yIGFuIGVtcHR5IG9iamVjdFxuICogaWYgbm8gbWF0Y2hpbmcgcmVzb3VyY2VzIHdlcmUgZXh0cmFjdGVkLlxuICovXG5oZWxwZXJzLnB1c2hTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gcHVzaFN0cmluZ3MgKGxhbmd1YWdlLCBhZGIsIG9wdHMpIHtcbiAgY29uc3QgcmVtb3RlRGlyID0gJy9kYXRhL2xvY2FsL3RtcCc7XG4gIGNvbnN0IHN0cmluZ3NKc29uID0gJ3N0cmluZ3MuanNvbic7XG4gIGNvbnN0IHJlbW90ZUZpbGUgPSBwYXRoLnBvc2l4LnJlc29sdmUocmVtb3RlRGlyLCBzdHJpbmdzSnNvbik7XG5cbiAgLy8gY2xlYW4gdXAgcmVtb3RlIHN0cmluZy5qc29uIGlmIHByZXNlbnRcbiAgYXdhaXQgYWRiLnJpbXJhZihyZW1vdGVGaWxlKTtcblxuICBsZXQgYXBwO1xuICB0cnkge1xuICAgIGFwcCA9IG9wdHMuYXBwIHx8IGF3YWl0IGFkYi5wdWxsQXBrKG9wdHMuYXBwUGFja2FnZSwgb3B0cy50bXBEaXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuaW5mbyhgRmFpbGVkIHRvIHB1bGwgYW4gYXBrIGZyb20gJyR7b3B0cy5hcHBQYWNrYWdlfScgdG8gJyR7b3B0cy50bXBEaXJ9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KG9wdHMuYXBwUGFja2FnZSkgfHwgIShhd2FpdCBmcy5leGlzdHMoYXBwKSkpIHtcbiAgICBsb2dnZXIuZGVidWcoYE5vIGFwcCBvciBwYWNrYWdlIHNwZWNpZmllZC4gUmV0dXJuaW5nIGVtcHR5IHN0cmluZ3NgKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBzdHJpbmdzVG1wRGlyID0gcGF0aC5yZXNvbHZlKG9wdHMudG1wRGlyLCBvcHRzLmFwcFBhY2thZ2UpO1xuICB0cnkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRXh0cmFjdGluZyBzdHJpbmdzIGZyb20gYXBrJywgYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgY29uc3Qge2Fwa1N0cmluZ3MsIGxvY2FsUGF0aH0gPSBhd2FpdCBhZGIuZXh0cmFjdFN0cmluZ3NGcm9tQXBrKGFwcCwgbGFuZ3VhZ2UsIHN0cmluZ3NUbXBEaXIpO1xuICAgIGF3YWl0IGFkYi5wdXNoKGxvY2FsUGF0aCwgcmVtb3RlRGlyKTtcbiAgICByZXR1cm4gYXBrU3RyaW5ncztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYENvdWxkIG5vdCBnZXQgc3RyaW5ncywgY29udGludWluZyBhbnl3YXkuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGF3YWl0IGFkYi5zaGVsbCgnZWNobycsIFtgJ3t9JyA+ICR7cmVtb3RlRmlsZX1gXSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHN0cmluZ3NUbXBEaXIpO1xuICB9XG4gIHJldHVybiB7fTtcbn07XG5cbmhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcCA9IGFzeW5jIGZ1bmN0aW9uIHVubG9ja1dpdGhIZWxwZXJBcHAgKGFkYikge1xuICBsb2dnZXIuaW5mbygnVW5sb2NraW5nIHNjcmVlbicpO1xuXG4gIC8vIFVubG9jayBzdWNjZWVkIHdpdGggYSBjb3VwbGUgb2YgcmV0cmllcy5cbiAgbGV0IGZpcnN0UnVuID0gdHJ1ZTtcbiAgYXdhaXQgcmV0cnkoMywgYXN5bmMgZnVuY3Rpb24gbGF1bmNoSGVscGVyICgpIHtcbiAgICAvLyBUbyByZWR1Y2UgYSB0aW1lIHRvIGNhbGwgYWRiLmlzU2NyZWVuTG9ja2VkKCkgc2luY2UgYGFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd2AgaXMgZWFzeSB0byBoYW5nIGFkYiBjb21tYW5kc1xuICAgIGlmIChmaXJzdFJ1bikge1xuICAgICAgZmlyc3RSdW4gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFcnJvciBpbiBpc1NjcmVlbkxvY2tlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdcImFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd1wiIGNvbW1hbmQgaGFzIHRpbWVkIG91dC4nKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1RoZSByZWFzb24gb2YgdGhpcyB0aW1lb3V0IGlzIHRoZSBkZWxheWVkIGFkYiByZXNwb25zZS4gUmVzZXR0aW5nIGFkYiBzZXJ2ZXIgY2FuIGltcHJvdmUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYExhdW5jaGluZyAke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8ke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCxcbiAgICAgICctYycsICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgJy1mJywgJzB4MTAyMDAwMDAnLFxuICAgIF0pO1xuICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gIH0pO1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZygnU2NyZWVuIGlzIGxvY2tlZCwgdHJ5aW5nIHRvIHVubG9jaycpO1xuXG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIud2FybignVXNpbmcgYXBwIHVubG9jaywgdGhpcyBpcyBnb2luZyB0byBiZSBkZXByZWNhdGVkIScpO1xuICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcChhZGIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLndhaXRGb3JEZXZpY2UoKTtcbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvciwgb3B0cyk7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpKSB7XG4gICAgaWYgKG1vY2tMb2NhdGlvbkFwcCB8fCBfLmlzVW5kZWZpbmVkKG1vY2tMb2NhdGlvbkFwcCkpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0TW9ja0xvY2F0aW9uKGFkYik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFD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
@@ -14,8 +14,9 @@ require("source-map-support/register");
14
14
  var _lodash = _interopRequireDefault(require("lodash"));
15
15
 
16
16
  const WINDOW_TITLE_PATTERN = /^\s+Window\s#\d+\sWindow\{[0-9a-f]+\s\w+\s([\w-]+)\}:$/;
17
- const FRAME_PATTERN = /^\s+mFrame=\[([0-9.-]+),([0-9.-]+)\]\[([0-9.-]+),([0-9.-]+)\]/m;
18
- const SURFACE_PATTERN = /^\s+Surface:\sshown=(true|false)/m;
17
+ const FRAME_PATTERN = /\bm?[Ff]rame=\[([0-9.-]+),([0-9.-]+)\]\[([0-9.-]+),([0-9.-]+)\]/;
18
+ const VIEW_VISIBILITY_PATTERN = /\bmViewVisibility=(0x[0-9a-fA-F]+)/;
19
+ const VIEW_VISIBLE = 0x0;
19
20
  const STATUS_BAR_WINDOW_NAME_PREFIX = 'StatusBar';
20
21
  const NAVIGATION_BAR_WINDOW_NAME_PREFIX = 'NavigationBar';
21
22
  const DEFAULT_WINDOW_PROPERTIES = {
@@ -42,51 +43,38 @@ function parseWindowProperties(name, props, log = null) {
42
43
  result.y = parseFloat(frameMatch[2]);
43
44
  result.width = parseFloat(frameMatch[3]) - result.x;
44
45
  result.height = parseFloat(frameMatch[4]) - result.y;
45
- const visibilityMatch = SURFACE_PATTERN.exec(propLines);
46
+ const visibilityMatch = VIEW_VISIBILITY_PATTERN.exec(propLines);
46
47
 
47
48
  if (!visibilityMatch) {
48
49
  log === null || log === void 0 ? void 0 : log.debug(propLines);
49
50
  throw new Error(`Cannot parse the visibility value from '${name}' window properties`);
50
51
  }
51
52
 
52
- result.visible = visibilityMatch[1] === 'true';
53
+ result.visible = parseInt(visibilityMatch[1], 16) === VIEW_VISIBLE;
53
54
  return result;
54
55
  }
55
56
 
56
57
  function parseWindows(lines, log = null) {
57
58
  const windows = {};
58
59
  let currentWindowName = null;
59
- let windowNameRowIndent = null;
60
60
 
61
61
  for (const line of lines.split('\n').map(_lodash.default.trimEnd)) {
62
- const currentIndent = line.length - _lodash.default.trimStart(line).length;
63
-
64
- if (_lodash.default.isNil(windowNameRowIndent) || currentIndent <= windowNameRowIndent) {
65
- const match = WINDOW_TITLE_PATTERN.exec(line);
66
-
67
- if (!match) {
68
- currentWindowName = null;
69
- continue;
70
- }
62
+ const match = WINDOW_TITLE_PATTERN.exec(line);
71
63
 
64
+ if (match) {
72
65
  currentWindowName = match[1];
73
-
74
- if (_lodash.default.isNil(windowNameRowIndent)) {
75
- windowNameRowIndent = currentIndent;
76
- }
77
-
66
+ windows[currentWindowName] = [];
78
67
  continue;
79
68
  }
80
69
 
81
- if (!currentWindowName || currentIndent <= windowNameRowIndent) {
70
+ if (_lodash.default.trim(line).length === 0) {
71
+ currentWindowName = null;
82
72
  continue;
83
73
  }
84
74
 
85
- if (!_lodash.default.isArray(windows[currentWindowName])) {
86
- windows[currentWindowName] = [];
75
+ if (currentWindowName && _lodash.default.isArray(windows[currentWindowName])) {
76
+ windows[currentWindowName].push(line);
87
77
  }
88
-
89
- windows[currentWindowName].push(line);
90
78
  }
91
79
 
92
80
  if (_lodash.default.isEmpty(windows)) {
@@ -133,4 +121,4 @@ var _default = commands;
133
121
  exports.default = _default;require('source-map-support').install();
134
122
 
135
123
 
136
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL3N5c3RlbS1iYXJzLmpzIiwibmFtZXMiOlsiV0lORE9XX1RJVExFX1BBVFRFUk4iLCJGUkFNRV9QQVRURVJOIiwiU1VSRkFDRV9QQVRURVJOIiwiU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVgiLCJOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVgiLCJERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTIiwidmlzaWJsZSIsIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJjb21tYW5kcyIsInBhcnNlV2luZG93UHJvcGVydGllcyIsIm5hbWUiLCJwcm9wcyIsImxvZyIsInJlc3VsdCIsIl8iLCJjbG9uZURlZXAiLCJwcm9wTGluZXMiLCJqb2luIiwiZnJhbWVNYXRjaCIsImV4ZWMiLCJkZWJ1ZyIsIkVycm9yIiwicGFyc2VGbG9hdCIsInZpc2liaWxpdHlNYXRjaCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwid2luZG93cyIsImN1cnJlbnRXaW5kb3dOYW1lIiwid2luZG93TmFtZVJvd0luZGVudCIsImxpbmUiLCJzcGxpdCIsIm1hcCIsInRyaW1FbmQiLCJjdXJyZW50SW5kZW50IiwibGVuZ3RoIiwidHJpbVN0YXJ0IiwiaXNOaWwiLCJtYXRjaCIsImlzQXJyYXkiLCJwdXNoIiwiaXNFbXB0eSIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJ0b1BhaXJzIiwic3RhcnRzV2l0aCIsInVubWF0Y2hlZFdpbmRvd3MiLCJmaWx0ZXIiLCJ3aW5kb3ciLCJuYW1lUHJlZml4IiwiaW5mbyIsImtleXMiLCJnZXRTeXN0ZW1CYXJzIiwic3Rkb3V0IiwiYWRiIiwic2hlbGwiLCJlIiwibWVzc2FnZSJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zeXN0ZW0tYmFycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCBXSU5ET1dfVElUTEVfUEFUVEVSTiA9IC9eXFxzK1dpbmRvd1xccyNcXGQrXFxzV2luZG93XFx7WzAtOWEtZl0rXFxzXFx3K1xccyhbXFx3LV0rKVxcfTokLztcbmNvbnN0IEZSQU1FX1BBVFRFUk4gPSAvXlxccyttRnJhbWU9XFxbKFswLTkuLV0rKSwoWzAtOS4tXSspXFxdXFxbKFswLTkuLV0rKSwoWzAtOS4tXSspXFxdL207XG5jb25zdCBTVVJGQUNFX1BBVFRFUk4gPSAvXlxccytTdXJmYWNlOlxcc3Nob3duPSh0cnVlfGZhbHNlKS9tO1xuY29uc3QgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnU3RhdHVzQmFyJztcbmNvbnN0IE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCA9ICdOYXZpZ2F0aW9uQmFyJztcbmNvbnN0IERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMgPSB7XG4gIHZpc2libGU6IGZhbHNlLFxuICB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxufTtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXaW5kb3dQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpc2libGUgV2hldGhlciB0aGUgd2luZG93IGlzIHZpc2libGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IFdpbmRvdyB4IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5IFdpbmRvdyB5IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBXaW5kb3cgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgV2luZG93IGhlaWdodFxuICovXG5cbi8qKlxuICogUGFyc2VzIHdpbmRvdyBwcm9wZXJ0aWVzIGZyb20gYWRiIGR1bXBzeXMgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBwYXJzZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvcHMgVGhlIGxpc3Qgb2YgcGFydGljdWxhciB3aW5kb3cgcHJvcGVydHkgbGluZXMuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHJldHVybnMge1dpbmRvd1Byb3BlcnRpZXN9IFBhcnNlZCBwcm9wZXJ0aWVzIG9iamVjdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBpc3N1ZSB3aGlsZSBwYXJzaW5nIHRoZSBwcm9wZXJ0aWVzIHN0cmluZ1xuICovXG5mdW5jdGlvbiBwYXJzZVdpbmRvd1Byb3BlcnRpZXMgKG5hbWUsIHByb3BzLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IHJlc3VsdCA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICBjb25zdCBwcm9wTGluZXMgPSBwcm9wcy5qb2luKCdcXG4nKTtcbiAgY29uc3QgZnJhbWVNYXRjaCA9IEZSQU1FX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIWZyYW1lTWF0Y2gpIHtcbiAgICBsb2c/LmRlYnVnKHByb3BMaW5lcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGZyYW1lIHNpemUgZnJvbSAnJHtuYW1lfScgd2luZG93IHByb3BlcnRpZXNgKTtcbiAgfVxuICByZXN1bHQueCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsxXSk7XG4gIHJlc3VsdC55ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzJdKTtcbiAgcmVzdWx0LndpZHRoID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzNdKSAtIHJlc3VsdC54O1xuICByZXN1bHQuaGVpZ2h0ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzRdKSAtIHJlc3VsdC55O1xuICBjb25zdCB2aXNpYmlsaXR5TWF0Y2ggPSBTVVJGQUNFX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIXZpc2liaWxpdHlNYXRjaCkge1xuICAgIGxvZz8uZGVidWcocHJvcExpbmVzKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgdmlzaWJpbGl0eSB2YWx1ZSBmcm9tICcke25hbWV9JyB3aW5kb3cgcHJvcGVydGllc2ApO1xuICB9XG4gIHJlc3VsdC52aXNpYmxlID0gdmlzaWJpbGl0eU1hdGNoWzFdID09PSAndHJ1ZSc7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgc3RhdHVzIGFuZCBuYXZpZ2F0aW9uIGJhciBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3aW5kb3cgbWFuYWdlciBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBsaW5lcyBPdXRwdXQgZnJvbSBkdW1wc3lzIGNvbW1hbmQuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0d28gaXRlbXMgd2hlcmUga2V5cyBhcmUgc3RhdHVzQmFyIGFuZCBuYXZpZ2F0aW9uQmFyLFxuICogYW5kIHZhbHVlcyBhcmUgY29ycmVzcG9uZGluZyBXaW5kb3dQcm9wZXJ0aWVzIG9iamVjdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyB3aW5kb3cgcHJvcGVydGllcyBjb3VsZCBiZSBwYXJzZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VXaW5kb3dzIChsaW5lcywgbG9nID0gbnVsbCkge1xuICBjb25zdCB3aW5kb3dzID0ge307XG4gIGxldCBjdXJyZW50V2luZG93TmFtZSA9IG51bGw7XG4gIGxldCB3aW5kb3dOYW1lUm93SW5kZW50ID0gbnVsbDtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLmxlbmd0aCAtIF8udHJpbVN0YXJ0KGxpbmUpLmxlbmd0aDtcbiAgICBpZiAoXy5pc05pbCh3aW5kb3dOYW1lUm93SW5kZW50KSB8fCBjdXJyZW50SW5kZW50IDw9IHdpbmRvd05hbWVSb3dJbmRlbnQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gV0lORE9XX1RJVExFX1BBVFRFUk4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY3VycmVudFdpbmRvd05hbWUgPSBudWxsO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbWF0Y2hbMV07XG4gICAgICBpZiAoXy5pc05pbCh3aW5kb3dOYW1lUm93SW5kZW50KSkge1xuICAgICAgICB3aW5kb3dOYW1lUm93SW5kZW50ID0gY3VycmVudEluZGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRXaW5kb3dOYW1lIHx8IGN1cnJlbnRJbmRlbnQgPD0gd2luZG93TmFtZVJvd0luZGVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzQXJyYXkod2luZG93c1tjdXJyZW50V2luZG93TmFtZV0pKSB7XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXSA9IFtdO1xuICAgIH1cbiAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXS5wdXNoKGxpbmUpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkod2luZG93cykpIHtcbiAgICBsb2c/LmRlYnVnKGxpbmVzLmpvaW4oJ1xcbicpKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwYXJzZSBhbnkgd2luZG93IGluZm9ybWF0aW9uIGZyb20gdGhlIGR1bXBzeXMgb3V0cHV0Jyk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7c3RhdHVzQmFyOiBudWxsLCBuYXZpZ2F0aW9uQmFyOiBudWxsfTtcbiAgZm9yIChjb25zdCBbbmFtZSwgcHJvcHNdIG9mIF8udG9QYWlycyh3aW5kb3dzKSkge1xuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVgpKSB7XG4gICAgICByZXN1bHQuc3RhdHVzQmFyID0gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzKG5hbWUsIHByb3BzLCBsb2cpO1xuICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHJlc3VsdC5uYXZpZ2F0aW9uQmFyID0gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzKG5hbWUsIHByb3BzLCBsb2cpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1bm1hdGNoZWRXaW5kb3dzID0gW1xuICAgIFsnc3RhdHVzQmFyJywgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVhdLFxuICAgIFsnbmF2aWdhdGlvbkJhcicsIE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWF1cbiAgXS5maWx0ZXIoKFtuYW1lXSkgPT4gXy5pc05pbChyZXN1bHRbbmFtZV0pKTtcbiAgZm9yIChjb25zdCBbd2luZG93LCBuYW1lUHJlZml4XSBvZiB1bm1hdGNoZWRXaW5kb3dzKSB7XG4gICAgbG9nPy5pbmZvKGBObyB3aW5kb3dzIGhhdmUgYmVlbiBmb3VuZCB3aG9zZSB0aXRsZSBtYXRjaGVzIHRvIGAgK1xuICAgICAgYCcke25hbWVQcmVmaXh9Jy4gQXNzdW1pbmcgaXQgaXMgaW52aXNpYmxlLiBgICtcbiAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgd2luZG93cyBhcmUgYXZhaWxhYmxlOiAke18ua2V5cyh3aW5kb3dzKX1gKTtcbiAgICByZXN1bHRbd2luZG93XSA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbW1hbmRzLmdldFN5c3RlbUJhcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRTeXN0ZW1CYXJzICgpIHtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnd2luZG93JywgJ3dpbmRvd3MnXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSBzeXN0ZW0gYmFycyBkZXRhaWxzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlV2luZG93cyhzdGRvdXQsIHRoaXMubG9nKTtcbn07XG5cbi8vIGZvciB1bml0IHRlc3RzXG5leHBvcnQgeyBwYXJzZVdpbmRvd3MsIHBhcnNlV2luZG93UHJvcGVydGllcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxvQkFBb0IsR0FBRyx3REFBN0I7QUFDQSxNQUFNQyxhQUFhLEdBQUcsZ0VBQXRCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLG1DQUF4QjtBQUNBLE1BQU1DLDZCQUE2QixHQUFHLFdBQXRDO0FBQ0EsTUFBTUMsaUNBQWlDLEdBQUcsZUFBMUM7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRztFQUNoQ0MsT0FBTyxFQUFFLEtBRHVCO0VBRWhDQyxDQUFDLEVBQUUsQ0FGNkI7RUFFMUJDLENBQUMsRUFBRSxDQUZ1QjtFQUVwQkMsS0FBSyxFQUFFLENBRmE7RUFFVkMsTUFBTSxFQUFFO0FBRkUsQ0FBbEM7QUFLQSxNQUFNQyxRQUFRLEdBQUcsRUFBakI7O0FBcUJBLFNBQVNDLHFCQUFULENBQWdDQyxJQUFoQyxFQUFzQ0MsS0FBdEMsRUFBNkNDLEdBQUcsR0FBRyxJQUFuRCxFQUF5RDtFQUN2RCxNQUFNQyxNQUFNLEdBQUdDLGVBQUEsQ0FBRUMsU0FBRixDQUFZ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
124
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL3N5c3RlbS1iYXJzLmpzIiwibmFtZXMiOlsiV0lORE9XX1RJVExFX1BBVFRFUk4iLCJGUkFNRV9QQVRURVJOIiwiVklFV19WSVNJQklMSVRZX1BBVFRFUk4iLCJWSUVXX1ZJU0lCTEUiLCJTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWCIsIk5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCIsIkRFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMiLCJ2aXNpYmxlIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImNvbW1hbmRzIiwicGFyc2VXaW5kb3dQcm9wZXJ0aWVzIiwibmFtZSIsInByb3BzIiwibG9nIiwicmVzdWx0IiwiXyIsImNsb25lRGVlcCIsInByb3BMaW5lcyIsImpvaW4iLCJmcmFtZU1hdGNoIiwiZXhlYyIsImRlYnVnIiwiRXJyb3IiLCJwYXJzZUZsb2F0IiwidmlzaWJpbGl0eU1hdGNoIiwicGFyc2VJbnQiLCJwYXJzZVdpbmRvd3MiLCJsaW5lcyIsIndpbmRvd3MiLCJjdXJyZW50V2luZG93TmFtZSIsImxpbmUiLCJzcGxpdCIsIm1hcCIsInRyaW1FbmQiLCJtYXRjaCIsInRyaW0iLCJsZW5ndGgiLCJpc0FycmF5IiwicHVzaCIsImlzRW1wdHkiLCJzdGF0dXNCYXIiLCJuYXZpZ2F0aW9uQmFyIiwidG9QYWlycyIsInN0YXJ0c1dpdGgiLCJ1bm1hdGNoZWRXaW5kb3dzIiwiZmlsdGVyIiwiaXNOaWwiLCJ3aW5kb3ciLCJuYW1lUHJlZml4IiwiaW5mbyIsImtleXMiLCJnZXRTeXN0ZW1CYXJzIiwic3Rkb3V0IiwiYWRiIiwic2hlbGwiLCJlIiwibWVzc2FnZSJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zeXN0ZW0tYmFycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCBXSU5ET1dfVElUTEVfUEFUVEVSTiA9IC9eXFxzK1dpbmRvd1xccyNcXGQrXFxzV2luZG93XFx7WzAtOWEtZl0rXFxzXFx3K1xccyhbXFx3LV0rKVxcfTokLztcbmNvbnN0IEZSQU1FX1BBVFRFUk4gPSAvXFxibT9bRmZdcmFtZT1cXFsoWzAtOS4tXSspLChbMC05Li1dKylcXF1cXFsoWzAtOS4tXSspLChbMC05Li1dKylcXF0vO1xuY29uc3QgVklFV19WSVNJQklMSVRZX1BBVFRFUk4gPSAvXFxibVZpZXdWaXNpYmlsaXR5PSgweFswLTlhLWZBLUZdKykvO1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9WaWV3I1ZJU0lCTEVcbmNvbnN0IFZJRVdfVklTSUJMRSA9IDB4MDtcbmNvbnN0IFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYID0gJ1N0YXR1c0Jhcic7XG5jb25zdCBOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnTmF2aWdhdGlvbkJhcic7XG5jb25zdCBERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTID0ge1xuICB2aXNpYmxlOiBmYWxzZSxcbiAgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCxcbn07XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2luZG93UHJvcGVydGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSB2aXNpYmxlIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyB2aXNpYmxlXG4gKiBAcHJvcGVydHkge251bWJlcn0geCBXaW5kb3cgeCBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0geSBXaW5kb3cgeSBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggV2luZG93IHdpZHRoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IFdpbmRvdyBoZWlnaHRcbiAqL1xuXG4vKipcbiAqIFBhcnNlcyB3aW5kb3cgcHJvcGVydGllcyBmcm9tIGFkYiBkdW1wc3lzIG91dHB1dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgcGFyc2VkXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHByb3BzIFRoZSBsaXN0IG9mIHBhcnRpY3VsYXIgd2luZG93IHByb3BlcnR5IGxpbmVzLlxuICogQ2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgdW5pdCB0ZXN0cyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbnB1dCBmb3JtYXQuXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtXaW5kb3dQcm9wZXJ0aWVzfSBQYXJzZWQgcHJvcGVydGllcyBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gaXNzdWUgd2hpbGUgcGFyc2luZyB0aGUgcHJvcGVydGllcyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzIChuYW1lLCBwcm9wcywgbG9nID0gbnVsbCkge1xuICBjb25zdCByZXN1bHQgPSBfLmNsb25lRGVlcChERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTKTtcbiAgY29uc3QgcHJvcExpbmVzID0gcHJvcHMuam9pbignXFxuJyk7XG4gIGNvbnN0IGZyYW1lTWF0Y2ggPSBGUkFNRV9QQVRURVJOLmV4ZWMocHJvcExpbmVzKTtcbiAgaWYgKCFmcmFtZU1hdGNoKSB7XG4gICAgbG9nPy5kZWJ1Zyhwcm9wTGluZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBmcmFtZSBzaXplIGZyb20gJyR7bmFtZX0nIHdpbmRvdyBwcm9wZXJ0aWVzYCk7XG4gIH1cbiAgcmVzdWx0LnggPSBwYXJzZUZsb2F0KGZyYW1lTWF0Y2hbMV0pO1xuICByZXN1bHQueSA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsyXSk7XG4gIHJlc3VsdC53aWR0aCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFszXSkgLSByZXN1bHQueDtcbiAgcmVzdWx0LmhlaWdodCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFs0XSkgLSByZXN1bHQueTtcbiAgY29uc3QgdmlzaWJpbGl0eU1hdGNoID0gVklFV19WSVNJQklMSVRZX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIXZpc2liaWxpdHlNYXRjaCkge1xuICAgIGxvZz8uZGVidWcocHJvcExpbmVzKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgdmlzaWJpbGl0eSB2YWx1ZSBmcm9tICcke25hbWV9JyB3aW5kb3cgcHJvcGVydGllc2ApO1xuICB9XG4gIHJlc3VsdC52aXNpYmxlID0gcGFyc2VJbnQodmlzaWJpbGl0eU1hdGNoWzFdLCAxNikgPT09IFZJRVdfVklTSUJMRTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBzdGF0dXMgYW5kIG5hdmlnYXRpb24gYmFyIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpbmRvdyBtYW5hZ2VyIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGxpbmVzIE91dHB1dCBmcm9tIGR1bXBzeXMgY29tbWFuZC5cbiAqIENoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHVuaXQgdGVzdHMgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW5wdXQgZm9ybWF0LlxuICogQHBhcmFtIHtPYmplY3Q/fSBsb2cgTG9nZ2VyIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHR3byBpdGVtcyB3aGVyZSBrZXlzIGFyZSBzdGF0dXNCYXIgYW5kIG5hdmlnYXRpb25CYXIsXG4gKiBhbmQgdmFsdWVzIGFyZSBjb3JyZXNwb25kaW5nIFdpbmRvd1Byb3BlcnRpZXMgb2JqZWN0c1xuICogQHRocm93cyB7RXJyb3J9IElmIG5vIHdpbmRvdyBwcm9wZXJ0aWVzIGNvdWxkIGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZVdpbmRvd3MgKGxpbmVzLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IHdpbmRvd3MgPSB7fTtcbiAgbGV0IGN1cnJlbnRXaW5kb3dOYW1lID0gbnVsbDtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IG1hdGNoID0gV0lORE9XX1RJVExFX1BBVFRFUk4uZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbWF0Y2hbMV07XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXSA9IFtdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChfLnRyaW0obGluZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjdXJyZW50V2luZG93TmFtZSA9IG51bGw7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFdpbmRvd05hbWUgJiYgXy5pc0FycmF5KHdpbmRvd3NbY3VycmVudFdpbmRvd05hbWVdKSkge1xuICAgICAgd2luZG93c1tjdXJyZW50V2luZG93TmFtZV0ucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgaWYgKF8uaXNFbXB0eSh3aW5kb3dzKSkge1xuICAgIGxvZz8uZGVidWcobGluZXMuam9pbignXFxuJykpO1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIGFueSB3aW5kb3cgaW5mb3JtYXRpb24gZnJvbSB0aGUgZHVtcHN5cyBvdXRwdXQnKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHtzdGF0dXNCYXI6IG51bGwsIG5hdmlnYXRpb25CYXI6IG51bGx9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wc10gb2YgXy50b1BhaXJzKHdpbmRvd3MpKSB7XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHJlc3VsdC5zdGF0dXNCYXIgPSBwYXJzZVdpbmRvd1Byb3BlcnRpZXMobmFtZSwgcHJvcHMsIGxvZyk7XG4gICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoTkFWSUdBVElPTl9CQVJfV0lORE9XX05BTUVfUFJFRklYKSkge1xuICAgICAgcmVzdWx0Lm5hdmlnYXRpb25CYXIgPSBwYXJzZVdpbmRvd1Byb3BlcnRpZXMobmFtZSwgcHJvcHMsIGxvZyk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHVubWF0Y2hlZFdpbmRvd3MgPSBbXG4gICAgWydzdGF0dXNCYXInLCBTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWF0sXG4gICAgWyduYXZpZ2F0aW9uQmFyJywgTkFWSUdBVElPTl9CQVJfV0lORE9XX05BTUVfUFJFRklYXVxuICBdLmZpbHRlcigoW25hbWVdKSA9PiBfLmlzTmlsKHJlc3VsdFtuYW1lXSkpO1xuICBmb3IgKGNvbnN0IFt3aW5kb3csIG5hbWVQcmVmaXhdIG9mIHVubWF0Y2hlZFdpbmRvd3MpIHtcbiAgICBsb2c/LmluZm8oYE5vIHdpbmRvd3MgaGF2ZSBiZWVuIGZvdW5kIHdob3NlIHRpdGxlIG1hdGNoZXMgdG8gYCArXG4gICAgICBgJyR7bmFtZVByZWZpeH0nLiBBc3N1bWluZyBpdCBpcyBpbnZpc2libGUuIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB3aW5kb3dzIGFyZSBhdmFpbGFibGU6ICR7Xy5rZXlzKHdpbmRvd3MpfWApO1xuICAgIHJlc3VsdFt3aW5kb3ddID0gXy5jbG9uZURlZXAoREVGQVVMVF9XSU5ET1dfUFJPUEVSVElFUyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29tbWFuZHMuZ2V0U3lzdGVtQmFycyA9IGFzeW5jIGZ1bmN0aW9uIGdldFN5c3RlbUJhcnMgKCkge1xuICBsZXQgc3Rkb3V0O1xuICB0cnkge1xuICAgIHN0ZG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZHVtcHN5cycsICd3aW5kb3cnLCAnd2luZG93cyddKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJldHJpZXZlIHN5c3RlbSBiYXJzIGRldGFpbHMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VXaW5kb3dzKHN0ZG91dCwgdGhpcy5sb2cpO1xufTtcblxuLy8gZm9yIHVuaXQgdGVzdHNcbmV4cG9ydCB7IHBhcnNlV2luZG93cywgcGFyc2VXaW5kb3dQcm9wZXJ0aWVzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLHdEQUE3QjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxpRUFBdEI7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxvQ0FBaEM7QUFFQSxNQUFNQyxZQUFZLEdBQUcsR0FBckI7QUFDQSxNQUFNQyw2QkFBNkIsR0FBRyxXQUF0QztBQUNBLE1BQU1DLGlDQUFpQyxHQUFHLGVBQTFDO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUc7RUFDaENDLE9BQU8sRUFBRSxLQUR1QjtFQUVoQ0MsQ0FBQyxFQUFFLENBRjZCO0VBRTFCQyxDQUFDLEVBQUUsQ0FGdUI7RUFFcEJDLEtBQUssRUFBRSxDQUZhO0VBRVZDLE1BQU0sRUFBRTtBQUZFLENBQWxDO0FBS0EsTUFBTUMsUUFBUSxHQUFHLEVBQWpCOztBQXFCQSxTQUFTQyxxQkFBVCxDQUFnQ0MsSUFBaEMsRUFBc0NDLEtBQXRDLEVBQTZDQyxHQUFHLEdBQUcsSUFBbkQsRUFBeUQ7RUFDdkQsTUFBTUMsTUFBTSxHQUFHQyxlQUFBLENBQUVDLFNBQUYsQ0FBWWIseUJBQVosQ0FBZjs7RUFDQSxNQUFNYyxTQUFTLEdBQUdMLEtBQUssQ0FBQ00sSUFBTixDQUFXLElBQVgsQ0FBbEI7RUFDQSxNQUFNQyxVQUFVLEdBQUdyQixhQUFhLENBQUNzQixJQUFkLENBQW1CSCxTQUFuQixDQUFuQjs7RUFDQSxJQUFJLENBQUNFLFVBQUwsRUFBaUI7SUFDZk4sR0FBRyxTQUFILElB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
@@ -2,7 +2,7 @@ import _ from 'lodash';
2
2
  import path from 'path';
3
3
  import { retry, waitForCondition } from 'asyncbox';
4
4
  import logger from './logger';
5
- import { fs, util } from 'appium/support';
5
+ import { fs, util, tempDir } from 'appium/support';
6
6
  import { path as settingsApkPath } from 'io.appium.settings';
7
7
  import Bootstrap from './bootstrap';
8
8
  import B from 'bluebird';
@@ -14,6 +14,7 @@ import {
14
14
  import { EOL } from 'os';
15
15
  import semver from 'semver';
16
16
 
17
+ const MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';
17
18
  const PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds
18
19
  // https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc
19
20
  const CHROME_BROWSER_PACKAGE_ACTIVITY = {
@@ -158,7 +159,7 @@ helpers.prepareEmulator = async function prepareEmulator (adb, opts) {
158
159
  }
159
160
 
160
161
  const avdName = avd.replace('@', '');
161
- const runningAVD = await adb.getRunningAVD(avdName);
162
+ const runningAVD = await adb.getRunningAVDWithRetry(avdName);
162
163
  const args = prepareAvdArgs(adb, opts);
163
164
  if (runningAVD) {
164
165
  if (args.includes('-wipe-data')) {
@@ -536,6 +537,62 @@ helpers.setMockLocationApp = async function setMockLocationApp (adb, app) {
536
537
  }
537
538
  } catch (err) {
538
539
  logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);
540
+ return;
541
+ }
542
+ try {
543
+ let pkgIds = [];
544
+ if (await adb.fileExists(MOCK_APP_IDS_STORE)) {
545
+ try {
546
+ pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));
547
+ } catch (ign) {}
548
+ }
549
+ if (pkgIds.includes(app)) {
550
+ return;
551
+ }
552
+ pkgIds.push(app);
553
+ const tmpRoot = await tempDir.openDir();
554
+ const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));
555
+ try {
556
+ await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');
557
+ await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);
558
+ } finally {
559
+ await fs.rimraf(tmpRoot);
560
+ }
561
+ } catch (e) {
562
+ logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);
563
+ }
564
+ };
565
+
566
+ helpers.resetMockLocation = async function resetMockLocation (adb) {
567
+ try {
568
+ if (await adb.getApiLevel() < 23) {
569
+ await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);
570
+ return;
571
+ }
572
+
573
+ const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);
574
+ let pkgIds = [];
575
+ if (await adb.fileExists(MOCK_APP_IDS_STORE)) {
576
+ try {
577
+ pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));
578
+ } catch (ign) {}
579
+ }
580
+ const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;
581
+ // Only include currently installed packages
582
+ const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);
583
+ if (_.size(resultPkgs) <= 1) {
584
+ await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);
585
+ return;
586
+ }
587
+
588
+ logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);
589
+ await B.all(resultPkgs.map((pkgId) => (async () => {
590
+ try {
591
+ await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);
592
+ } catch (ign) {}
593
+ })()));
594
+ } catch (err) {
595
+ logger.warn(`Unable to reset mock location: ${err.message}`);
539
596
  }
540
597
  };
541
598
 
@@ -777,8 +834,12 @@ helpers.initDevice = async function initDevice (adb, opts) {
777
834
  await helpers.pushSettingsApp(adb, shouldThrowError, opts);
778
835
  }
779
836
 
780
- if (!helpers.isEmulator(adb, opts) && (mockLocationApp || _.isUndefined(mockLocationApp))) {
781
- await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);
837
+ if (!helpers.isEmulator(adb, opts)) {
838
+ if (mockLocationApp || _.isUndefined(mockLocationApp)) {
839
+ await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);
840
+ } else {
841
+ await helpers.resetMockLocation(adb);
842
+ }
782
843
  }
783
844
 
784
845
  if (language || locale) {
@@ -1,8 +1,10 @@
1
1
  import _ from 'lodash';
2
2
 
3
3
  const WINDOW_TITLE_PATTERN = /^\s+Window\s#\d+\sWindow\{[0-9a-f]+\s\w+\s([\w-]+)\}:$/;
4
- const FRAME_PATTERN = /^\s+mFrame=\[([0-9.-]+),([0-9.-]+)\]\[([0-9.-]+),([0-9.-]+)\]/m;
5
- const SURFACE_PATTERN = /^\s+Surface:\sshown=(true|false)/m;
4
+ const FRAME_PATTERN = /\bm?[Ff]rame=\[([0-9.-]+),([0-9.-]+)\]\[([0-9.-]+),([0-9.-]+)\]/;
5
+ const VIEW_VISIBILITY_PATTERN = /\bmViewVisibility=(0x[0-9a-fA-F]+)/;
6
+ // https://developer.android.com/reference/android/view/View#VISIBLE
7
+ const VIEW_VISIBLE = 0x0;
6
8
  const STATUS_BAR_WINDOW_NAME_PREFIX = 'StatusBar';
7
9
  const NAVIGATION_BAR_WINDOW_NAME_PREFIX = 'NavigationBar';
8
10
  const DEFAULT_WINDOW_PROPERTIES = {
@@ -43,12 +45,12 @@ function parseWindowProperties (name, props, log = null) {
43
45
  result.y = parseFloat(frameMatch[2]);
44
46
  result.width = parseFloat(frameMatch[3]) - result.x;
45
47
  result.height = parseFloat(frameMatch[4]) - result.y;
46
- const visibilityMatch = SURFACE_PATTERN.exec(propLines);
48
+ const visibilityMatch = VIEW_VISIBILITY_PATTERN.exec(propLines);
47
49
  if (!visibilityMatch) {
48
50
  log?.debug(propLines);
49
51
  throw new Error(`Cannot parse the visibility value from '${name}' window properties`);
50
52
  }
51
- result.visible = visibilityMatch[1] === 'true';
53
+ result.visible = parseInt(visibilityMatch[1], 16) === VIEW_VISIBLE;
52
54
  return result;
53
55
  }
54
56
 
@@ -65,29 +67,21 @@ function parseWindowProperties (name, props, log = null) {
65
67
  function parseWindows (lines, log = null) {
66
68
  const windows = {};
67
69
  let currentWindowName = null;
68
- let windowNameRowIndent = null;
69
70
  for (const line of lines.split('\n').map(_.trimEnd)) {
70
- const currentIndent = line.length - _.trimStart(line).length;
71
- if (_.isNil(windowNameRowIndent) || currentIndent <= windowNameRowIndent) {
72
- const match = WINDOW_TITLE_PATTERN.exec(line);
73
- if (!match) {
74
- currentWindowName = null;
75
- continue;
76
- }
71
+ const match = WINDOW_TITLE_PATTERN.exec(line);
72
+ if (match) {
77
73
  currentWindowName = match[1];
78
- if (_.isNil(windowNameRowIndent)) {
79
- windowNameRowIndent = currentIndent;
80
- }
74
+ windows[currentWindowName] = [];
81
75
  continue;
82
76
  }
83
- if (!currentWindowName || currentIndent <= windowNameRowIndent) {
77
+ if (_.trim(line).length === 0) {
78
+ currentWindowName = null;
84
79
  continue;
85
80
  }
86
81
 
87
- if (!_.isArray(windows[currentWindowName])) {
88
- windows[currentWindowName] = [];
82
+ if (currentWindowName && _.isArray(windows[currentWindowName])) {
83
+ windows[currentWindowName].push(line);
89
84
  }
90
- windows[currentWindowName].push(line);
91
85
  }
92
86
  if (_.isEmpty(windows)) {
93
87
  log?.debug(lines.join('\n'));
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "5.2.8",
12
+ "version": "5.2.11",
13
13
  "author": "appium",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {
@@ -85,7 +85,7 @@
85
85
  "@babel/eslint-parser": "^7.16.3",
86
86
  "@semantic-release/git": "^10.0.1",
87
87
  "@xmldom/xmldom": "^0.x",
88
- "android-apidemos": "^4.0.0",
88
+ "android-apidemos": "^4.1.0",
89
89
  "chai": "^4.1.2",
90
90
  "chai-as-promised": "^7.1.1",
91
91
  "eslint-config-prettier": "^8.5.0",