appium-android-driver 5.9.0 → 5.9.1
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.
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [5.9.1](https://github.com/appium/appium-android-driver/compare/v5.9.0...v5.9.1) (2023-04-11)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Performance Improvements
|
|
5
|
+
|
|
6
|
+
* check the device state via waitForDevice only for a emulator ([#796](https://github.com/appium/appium-android-driver/issues/796)) ([e3248e8](https://github.com/appium/appium-android-driver/commit/e3248e894c398029b1aadf3b1cffcd85148269da))
|
|
7
|
+
|
|
1
8
|
## [5.9.0](https://github.com/appium/appium-android-driver/compare/v5.8.12...v5.9.0) (2023-04-03)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -651,7 +651,9 @@ helpers.initDevice = async function initDevice(adb, opts) {
|
|
|
651
651
|
if (skipDeviceInitialization) {
|
|
652
652
|
_logger.default.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);
|
|
653
653
|
} else {
|
|
654
|
-
|
|
654
|
+
if (helpers.isEmulator(adb, opts)) {
|
|
655
|
+
await adb.waitForDevice();
|
|
656
|
+
}
|
|
655
657
|
const shouldThrowError = language || locale || localeScript || unicodeKeyboard || disableWindowAnimation || !skipUnlock;
|
|
656
658
|
await helpers.pushSettingsApp(adb, shouldThrowError, opts);
|
|
657
659
|
}
|
|
@@ -763,4 +765,4 @@ helpers.bootstrap = _bootstrap.default;
|
|
|
763
765
|
helpers.unlocker = _unlockHelpers.default;
|
|
764
766
|
var _default = helpers;
|
|
765
767
|
exports.default = _default;
|
|
766
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl9hc3luY2JveCIsIl9sb2dnZXIiLCJfc3VwcG9ydCIsIl9pb0FwcGl1bSIsIl9ib290c3RyYXAiLCJfYmx1ZWJpcmQiLCJfYXBwaXVtQWRiIiwiX3VubG9ja0hlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9vcyIsIl9zZW12ZXIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiTU9DS19BUFBfSURTX1NUT1JFIiwiUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVRfTVMiLCJIRUxQRVJfQVBQX0lOU1RBTExfUkVUUklFUyIsIkhFTFBFUl9BUFBfSU5TVEFMTF9SRVRSWV9ERUxBWV9NUyIsIkNIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkiLCJjaHJvbWUiLCJwa2ciLCJhY3Rpdml0eSIsImNocm9taXVtIiwiY2hyb21lYmV0YSIsImJyb3dzZXIiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiZXhwb3J0cyIsIkVNVUxBVE9SX1BBVFRFUk4iLCJBUFBfU1RBVEUiLCJmcmVlemUiLCJOT1RfSU5TVEFMTEVEIiwiTk9UX1JVTk5JTkciLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJhZGIiLCJuZXR3b3JrU3BlZWQiLCJfIiwidmFsdWVzIiwiTkVUV09SS19TUEVFRCIsImluY2x1ZGVzIiwibG9nZ2VyIiwid2FybiIsIkZVTEwiLCJwcmVwYXJlQXZkQXJncyIsIm9wdHMiLCJpc0hlYWRsZXNzIiwiYXZkQXJncyIsInJlc3VsdCIsImlzQXJyYXkiLCJwdXNoIiwidXRpbCIsInNoZWxsUGFyc2UiLCJ0b0NyZWRlbnRpYWxUeXBlIiwidW5sb2NrVHlwZSIsIlBJTl9VTkxPQ0siLCJQSU5fVU5MT0NLX0tFWV9FVkVOVCIsIlBBU1NXT1JEX1VOTE9DSyIsIlBBVFRFUk5fVU5MT0NLIiwiRXJyb3IiLCJoZWxwZXJzIiwiY3JlYXRlQmFzZUFEQiIsImFkYlBvcnQiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInJlbW90ZUFwcHNDYWNoZUxpbWl0IiwiYnVpbGRUb29sc1ZlcnNpb24iLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiYWxsb3dEZWxheUFkYiIsIkFEQiIsImNyZWF0ZUFEQiIsInByZXBhcmVFbXVsYXRvciIsImF2ZCIsImF2ZEVudiIsImVudiIsImxhbmd1YWdlIiwibG9jYWxlIiwiY291bnRyeSIsImF2ZExhdW5jaFRpbWVvdXQiLCJsYXVuY2hUaW1lb3V0IiwiYXZkUmVhZHlUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwiYXZkTmFtZSIsInJlcGxhY2UiLCJpc0VtdWxhdG9yUnVubmluZyIsImdldFJ1bm5pbmdBVkRXaXRoUmV0cnkiLCJlIiwiZGVidWciLCJtZXNzYWdlIiwiYXJncyIsImtpbGxFbXVsYXRvciIsImxhdW5jaEFWRCIsImVuc3VyZURldmljZUxvY2FsZSIsInNjcmlwdCIsImlzU3RyaW5nIiwic2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IiwiZW5zdXJlQ3VycmVudExvY2FsZSIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsInVkaWQiLCJlbVBvcnQiLCJjdXJEZXZpY2VJZCIsImVtdWxhdG9yUG9ydCIsImluZm8iLCJkZXZpY2VzIiwiZ2V0RGV2aWNlc1dpdGhSZXRyeSIsIm1hcCIsImVycm9yQW5kVGhyb3ciLCJnZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nIiwicGxhdGZvcm1WZXJzaW9uIiwidHJpbSIsInNlbXZlciIsImNvZXJjZSIsImF2YWlsRGV2aWNlcyIsInBhcnRpYWxNYXRjaENhbmRpZGF0ZSIsImRldmljZSIsInNldERldmljZUlkIiwicmF3RGV2aWNlT1MiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VPUyIsImJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCIsInZhbGlkIiwiYm90aFZlcnNpb25zQXJlU3RyaW5ncyIsInZlcnNpb24iLCJ0b0xvd2VyIiwibWFqb3IiLCJtaW5vciIsImd0Iiwia2V5cyIsImpvaW4iLCJzZXRFbXVsYXRvclBvcnQiLCJ2YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzIiwibmFtZSIsIm1hdGNoIiwiZXhlYyIsImluZGV4Iiwic3Vic3RyaW5nIiwiZ2V0TGF1bmNoSW5mbyIsImFwcCIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYXBrUGFja2FnZSIsImFwa0FjdGl2aXR5IiwicGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0IiwicmVzZXRBcHAiLCJmYXN0UmVzZXQiLCJmdWxsUmVzZXQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJhdXRvR3JhbnRQZXJtaXNzaW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwiaXNJbnN0YWxsZWQiLCJpc0FwcEluc3RhbGxlZCIsImZvcmNlU3RvcCIsImlnbiIsIm91dHB1dCIsImNsZWFyIiwidG9Mb3dlckNhc2UiLCJncmFudEFsbFBlcm1pc3Npb25zIiwiZXJyb3IiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInRpbWVvdXQiLCJpbnN0YWxsQXBrIiwiZW5mb3JjZUFwcEluc3RhbGwiLCJhcHBTdGF0ZSIsIndhc1VuaW5zdGFsbGVkIiwiaW5zdGFsbE9yVXBncmFkZSIsImVuZm9yY2VDdXJyZW50QnVpbGQiLCJpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiaW5zdGFsbE90aGVyQXBrcyIsIm90aGVyQXBwcyIsIkIiLCJhbGwiLCJvdGhlckFwcCIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJhcHBQYWNrYWdlcyIsImZpbHRlclBhY2thZ2VzIiwiZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzIiwicGFja2FnZXNTdHJpbmciLCJzaGVsbCIsImFwcFBhY2thZ2VzQXJyYXkiLCJzcGxpdCIsIkVPTCIsImRpZmZlcmVuY2UiLCJlcnIiLCJpbml0VW5pY29kZUtleWJvYXJkIiwiZGVmYXVsdElNRSIsImFwcGl1bUlNRSIsImVuYWJsZUlNRSIsInNldElNRSIsInNldE1vY2tMb2NhdGlvbkFwcCIsImdldEFwaUxldmVsIiwicGtnSWRzIiwiZmlsZUV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInNyY1BhdGgiLCJwYXRoIiwicG9zaXgiLCJiYXNlbmFtZSIsImZzIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwicmltcmFmIiwicmVzZXRNb2NrTG9jYXRpb24iLCJ0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZSIsInRoaXJkUGFydHlQa2dJZHMiLCJyZXN1bHRQa2dzIiwiaW50ZXJzZWN0aW9uIiwic2l6ZSIsInBrZ0lkIiwiaW5zdGFsbEhlbHBlckFwcCIsImFwa1BhdGgiLCJwYWNrYWdlSWQiLCJyZXRyeUludGVydmFsIiwicmV0cnlJbnN0YWxsSGVscGVyQXBwIiwicHVzaFNldHRpbmdzQXBwIiwidGhyb3dFcnJvciIsInNldHRpbmdzQXBrUGF0aCIsInByb2Nlc3NFeGlzdHMiLCJhcGlMZXZlbCIsInBlcm1zIiwieCIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJpc0VtdWxhdG9yIiwicHVzaFN0cmluZ3MiLCJyZW1vdGVEaXIiLCJzdHJpbmdzSnNvbiIsInJlbW90ZUZpbGUiLCJyZXNvbHZlIiwicHVsbEFwayIsInRtcERpciIsImlzRW1wdHkiLCJleGlzdHMiLCJzdHJpbmdzVG1wRGlyIiwiYXBrU3RyaW5ncyIsImxvY2FsUGF0aCIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsInVubG9jayIsImRyaXZlciIsImNhcGFiaWxpdGllcyIsImlzU2NyZWVuTG9ja2VkIiwidW5sb2NrS2V5IiwiZGlzbWlzc0tleWd1YXJkIiwidW5sb2NrU3RyYXRlZ3kiLCJ1bmxvY2tTdWNjZXNzVGltZW91dCIsInVubG9ja2VyIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJpc05pbCIsImlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQiLCJmYXN0VW5sb2NrIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwidW5sb2NrTWV0aG9kIiwicGluVW5sb2NrIiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGFzc3dvcmRVbmxvY2siLCJwYXR0ZXJuVW5sb2NrIiwiZmluZ2VycHJpbnRVbmxvY2siLCJ2ZXJpZnlVbmxvY2siLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluaXREZXZpY2UiLCJza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24iLCJsb2NhbGVTY3JpcHQiLCJ1bmljb2RlS2V5Ym9hcmQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic2tpcFVubG9jayIsIm1vY2tMb2NhdGlvbkFwcCIsInNraXBMb2djYXRDYXB0dXJlIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJ3YWl0Rm9yRGV2aWNlIiwic2hvdWxkVGhyb3dFcnJvciIsImlzVW5kZWZpbmVkIiwic3RhcnRMb2djYXQiLCJmb3JtYXQiLCJmaWx0ZXJTcGVjcyIsInJlbW92ZU51bGxQcm9wZXJ0aWVzIiwiaXNOdWxsIiwidHJ1bmNhdGVEZWNpbWFscyIsIm51bWJlciIsImRpZ2l0cyIsIm11bHRpcGxpZXIiLCJNYXRoIiwicG93IiwiYWRqdXN0ZWROdW0iLCJ0cnVuY2F0ZWROdW0iLCJpc0Nocm9tZUJyb3dzZXIiLCJnZXRDaHJvbWVQa2ciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzZXNzaW9uSWQiLCJpc0Z1bmN0aW9uIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJhY3RpdmVIYW5kbGVycyIsInBhdGhuYW1lIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsInBhcnNlQXJyYXkiLCJjYXAiLCJwYXJzZWRDYXBzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJicm93c2VyTmFtZSIsImFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyIsInBvc3NpYmxlTmFtZXMiLCJzb21lIiwidGVzdCIsImJvb3RzdHJhcCIsIkJvb3RzdHJhcCIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2FuZHJvaWQtaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBwYXRoIGFzIHNldHRpbmdzQXBrUGF0aCB9IGZyb20gJ2lvLmFwcGl1bS5zZXR0aW5ncyc7XG5pbXBvcnQgQm9vdHN0cmFwIGZyb20gJy4vYm9vdHN0cmFwJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBBREIgZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQge1xuICBkZWZhdWx0IGFzIHVubG9ja2VyLCBQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCxcbiAgUEFTU1dPUkRfVU5MT0NLLCBQQVRURVJOX1VOTE9DSywgRklOR0VSUFJJTlRfVU5MT0NLXG59IGZyb20gJy4vdW5sb2NrLWhlbHBlcnMnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5jb25zdCBNT0NLX0FQUF9JRFNfU1RPUkUgPSAnL2RhdGEvbG9jYWwvdG1wL21vY2tfYXBwcy5qc29uJztcbmNvbnN0IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUX01TID0gOTAwMDA7XG5jb25zdCBIRUxQRVJfQVBQX0lOU1RBTExfUkVUUklFUyA9IDM7XG5jb25zdCBIRUxQRVJfQVBQX0lOU1RBTExfUkVUUllfREVMQVlfTVMgPSA1MDAwO1xuLy8gaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG5jb25zdCBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZID0ge1xuICBjaHJvbWU6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBjaHJvbWl1bToge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnLkNocm9tZVNoZWxsQWN0aXZpdHknLFxuICB9LFxuICBjaHJvbWViZXRhOiB7XG4gICAgcGtnOiAnY29tLmNocm9tZS5iZXRhJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgYnJvd3Nlcjoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmJyb3dzZXInLFxuICAgIGFjdGl2aXR5OiAnY29tLmFuZHJvaWQuYnJvd3Nlci5Ccm93c2VyQWN0aXZpdHknLFxuICB9LFxuICAnY2hyb21pdW0tYnJvd3Nlcic6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgJ2Nocm9taXVtLXdlYnZpZXcnOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwuV2ViVmlld0Jyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gIGRlZmF1bHQ6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxufTtcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgPSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmNvbnN0IEVNVUxBVE9SX1BBVFRFUk4gPSAvXFxiZW11bGF0b3JcXGIvaTtcbi8vIFRoZXNlIGNvbnN0YW50cyBhcmUgaW4gc3luYyB3aXRoXG4vLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWFwcGxpY2F0aW9uc3RhdGUveGN1aWFwcGxpY2F0aW9uc3RhdGVydW5uaW5nYmFja2dyb3VuZD9sYW5ndWFnZT1vYmpjXG5jb25zdCBBUFBfU1RBVEUgPSBPYmplY3QuZnJlZXplKHtcbiAgTk9UX0lOU1RBTExFRDogMCxcbiAgTk9UX1JVTk5JTkc6IDEsXG4gIFJVTk5JTkdfSU5fQkFDS0dST1VORDogMyxcbiAgUlVOTklOR19JTl9GT1JFR1JPVU5EOiA0XG59KTtcblxuXG5mdW5jdGlvbiBlbnN1cmVOZXR3b3JrU3BlZWQgKGFkYiwgbmV0d29ya1NwZWVkKSB7XG4gIGlmIChfLnZhbHVlcyhhZGIuTkVUV09SS19TUEVFRCkuaW5jbHVkZXMobmV0d29ya1NwZWVkKSkge1xuICAgIHJldHVybiBuZXR3b3JrU3BlZWQ7XG4gIH1cbiAgbG9nZ2VyLndhcm4oYFdyb25nIG5ldHdvcmsgc3BlZWQgcGFyYW0gJyR7bmV0d29ya1NwZWVkfScsIHVzaW5nIGRlZmF1bHQ6ICR7YWRiLk5FVFdPUktfU1BFRUQuRlVMTH0uIGAgK1xuICAgIGBTdXBwb3J0ZWQgdmFsdWVzOiAke18udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKX1gKTtcbiAgcmV0dXJuIGFkYi5ORVRXT1JLX1NQRUVELkZVTEw7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBdmRBcmdzIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIG5ldHdvcmtTcGVlZCxcbiAgICBpc0hlYWRsZXNzLFxuICAgIGF2ZEFyZ3MsXG4gIH0gPSBvcHRzO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaWYgKGF2ZEFyZ3MpIHtcbiAgICBpZiAoXy5pc0FycmF5KGF2ZEFyZ3MpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5hdmRBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goLi4uKHV0aWwuc2hlbGxQYXJzZShgJHthdmRBcmdzfWApKSk7XG4gICAgfVxuICB9XG4gIGlmIChuZXR3b3JrU3BlZWQpIHtcbiAgICByZXN1bHQucHVzaCgnLW5ldHNwZWVkJywgZW5zdXJlTmV0d29ya1NwZWVkKGFkYiwgbmV0d29ya1NwZWVkKSk7XG4gIH1cbiAgaWYgKGlzSGVhZGxlc3MpIHtcbiAgICByZXN1bHQucHVzaCgnLW5vLXdpbmRvdycpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRvQ3JlZGVudGlhbFR5cGUgKHVubG9ja1R5cGUpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIFtQSU5fVU5MT0NLXTogJ3BpbicsXG4gICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogJ3BpbicsXG4gICAgW1BBU1NXT1JEX1VOTE9DS106ICdwYXNzd29yZCcsXG4gICAgW1BBVFRFUk5fVU5MT0NLXTogJ3BhdHRlcm4nLFxuICB9W3VubG9ja1R5cGVdO1xuICBpZiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayB0eXBlICcke3VubG9ja1R5cGV9JyBpcyBub3Qga25vd25gKTtcbn1cblxuXG5jb25zdCBoZWxwZXJzID0ge307XG5cbmhlbHBlcnMuY3JlYXRlQmFzZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJhc2VBREIgKG9wdHMgPSB7fSkge1xuICAvLyBmaWx0ZXIgb3V0IGFueSB1bndhbnRlZCBvcHRpb25zIHNlbnQgaW5cbiAgLy8gdGhpcyBsaXN0IHNob3VsZCBiZSB1cGRhdGVkIGFzIEFEQiB0YWtlcyBtb3JlIGFyZ3VtZW50c1xuICBjb25zdCB7XG4gICAgYWRiUG9ydCxcbiAgICBzdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgcmVtb3RlQWRiSG9zdCxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgIGFkYkV4ZWNUaW1lb3V0LFxuICAgIHVzZUtleXN0b3JlLFxuICAgIGtleXN0b3JlUGF0aCxcbiAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkLFxuICAgIHJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIGJ1aWxkVG9vbHNWZXJzaW9uLFxuICAgIGFsbG93T2ZmbGluZURldmljZXMsXG4gICAgYWxsb3dEZWxheUFkYixcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCBBREIuY3JlYXRlQURCKHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9KTtcbn07XG5cbmhlbHBlcnMucHJlcGFyZUVtdWxhdG9yID0gYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUVtdWxhdG9yIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIGF2ZCxcbiAgICBhdmRFbnY6IGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBsb2NhbGU6IGNvdW50cnksXG4gICAgYXZkTGF1bmNoVGltZW91dDogbGF1bmNoVGltZW91dCxcbiAgICBhdmRSZWFkeVRpbWVvdXQ6IHJlYWR5VGltZW91dCxcbiAgfSA9IG9wdHM7XG4gIGlmICghYXZkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbGF1bmNoIEFWRCB3aXRob3V0IEFWRCBuYW1lJyk7XG4gIH1cblxuICBjb25zdCBhdmROYW1lID0gYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gIGxldCBpc0VtdWxhdG9yUnVubmluZyA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLmdldFJ1bm5pbmdBVkRXaXRoUmV0cnkoYXZkTmFtZSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZGVidWcoYEVtdWxhdG9yICcke2F2ZE5hbWV9JyBpcyBub3QgcnVubmluZzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgaXNFbXVsYXRvclJ1bm5pbmcgPSBmYWxzZTtcbiAgfVxuICBjb25zdCBhcmdzID0gcHJlcGFyZUF2ZEFyZ3MoYWRiLCBvcHRzKTtcbiAgaWYgKGlzRW11bGF0b3JSdW5uaW5nKSB7XG4gICAgaWYgKGFyZ3MuaW5jbHVkZXMoJy13aXBlLWRhdGEnKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBLaWxsaW5nICcke2F2ZE5hbWV9JyBiZWNhdXNlIGl0IG5lZWRzIHRvIGJlIHdpcGVkIGF0IHN0YXJ0LmApO1xuICAgICAgYXdhaXQgYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOb3QgbGF1bmNoaW5nIEFWRCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgYXdhaXQgYWRiLmxhdW5jaEFWRChhdmQsIHtcbiAgICBhcmdzLFxuICAgIGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBjb3VudHJ5LFxuICAgIGxhdW5jaFRpbWVvdXQsXG4gICAgcmVhZHlUaW1lb3V0LFxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IGFuZCBlbnN1cmUgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZS4gVGhlIGxhbmd1YWdlIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gbG93ZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Miw4fS4gZS5nLiBlbiwgamEgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeSAtIENvdW50cnkuIFRoZSBjb3VudHJ5IChyZWdpb24pIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdXBwZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Mn0gfCBbMC05XXszfS4gZS5nLiBVUywgSlAgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0gez9zdHJpbmd9IHNjcmlwdCAtIFNjcmlwdC4gVGhlIHNjcmlwdCBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdGl0bGUgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17NH0uIGUuZy4gSGFucyBpbiB6aC1IYW5zLUNOIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxlZCB0byBzZXQgbG9jYWxlIHByb3Blcmx5XG4gKi9cbmhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGV2aWNlTG9jYWxlIChhZGIsIGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGlmICghXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgIV8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICBsb2dnZXIud2Fybihgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IHJlcXVpcmVzIGxhbmd1YWdlIG9yIGNvdW50cnkuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEdvdCBsYW5ndWFnZTogJyR7bGFuZ3VhZ2V9JyBhbmQgY291bnRyeTogJyR7Y291bnRyeX0nYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgYWRiLnNldERldmljZUxhbmd1YWdlQ291bnRyeShsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KTtcblxuICBpZiAoIWF3YWl0IGFkYi5lbnN1cmVDdXJyZW50TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHNjcmlwdCA/IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0sIGNvdW50cnk6ICR7Y291bnRyeX0gYW5kIHNjcmlwdDogJHtzY3JpcHR9YCA6IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0gYW5kIGNvdW50cnk6ICR7Y291bnRyeX1gO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNldCAke21lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIChvcHRzID0ge30pIHtcbiAgLy8gd2UgY2FuIGNyZWF0ZSBhIHRocm93YXdheSBBREIgaW5zdGFuY2UgaGVyZSwgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jeVxuICAvLyBvbiBpbnN0YW50aWF0aW5nIG9uIGVhcmxpZXIgKGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbm8gdWRpZClcbiAgLy8gd2UgY2FuIG9ubHkgdXNlIHRoaXMgQURCIG9iamVjdCBmb3IgY29tbWFuZHMgdGhhdCB3b3VsZCBub3QgYmUgY29uZnVzZWRcbiAgLy8gaWYgbXVsdGlwbGUgZGV2aWNlcyBhcmUgY29ubmVjdGVkXG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgbGV0IHVkaWQgPSBvcHRzLnVkaWQ7XG4gIGxldCBlbVBvcnQgPSBudWxsO1xuXG4gIC8vIGEgc3BlY2lmaWMgYXZkIG5hbWUgd2FzIGdpdmVuLiB0cnkgdG8gaW5pdGlhbGl6ZSB3aXRoIHRoYXRcbiAgaWYgKG9wdHMuYXZkKSB7XG4gICAgYXdhaXQgaGVscGVycy5wcmVwYXJlRW11bGF0b3IoYWRiLCBvcHRzKTtcbiAgICB1ZGlkID0gYWRiLmN1ckRldmljZUlkO1xuICAgIGVtUG9ydCA9IGFkYi5lbXVsYXRvclBvcnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gYXZkIGdpdmVuLiBsZXRzIHRyeSB3aGF0ZXZlcidzIHBsdWdnZWQgaW4gZGV2aWNlcy9lbXVsYXRvcnNcbiAgICBsb2dnZXIuaW5mbygnUmV0cmlldmluZyBkZXZpY2UgbGlzdCcpO1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgYWRiLmdldERldmljZXNXaXRoUmV0cnkoKTtcblxuICAgIC8vIHVkaWQgd2FzIGdpdmVuLCBsZXRzIHRyeSB0byBpbml0IHdpdGggdGhhdCBkZXZpY2VcbiAgICBpZiAodWRpZCkge1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKF8ubWFwKGRldmljZXMsICd1ZGlkJyksIHVkaWQpKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBEZXZpY2UgJHt1ZGlkfSB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBkZXZpY2VzYCk7XG4gICAgICB9XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2UgaWYgKG9wdHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICBvcHRzLnBsYXRmb3JtVmVyc2lvbiA9IGAke29wdHMucGxhdGZvcm1WZXJzaW9ufWAudHJpbSgpO1xuXG4gICAgICAvLyBhIHBsYXRmb3JtIHZlcnNpb24gd2FzIGdpdmVuLiBsZXRzIHRyeSB0byBmaW5kIGEgZGV2aWNlIHdpdGggdGhlIHNhbWUgb3NcbiAgICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbiA9IHNlbXZlci5jb2VyY2Uob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHx8IG9wdHMucGxhdGZvcm1WZXJzaW9uO1xuICAgICAgbG9nZ2VyLmluZm8oYExvb2tpbmcgZm9yIGEgZGV2aWNlIHdpdGggQW5kcm9pZCAnJHtwbGF0Zm9ybVZlcnNpb259J2ApO1xuXG4gICAgICAvLyBpbiBjYXNlIHdlIGZhaWwgdG8gZmluZCBzb21ldGhpbmcsIGdpdmUgdGhlIHVzZXIgYSB1c2VmdWwgbG9nIHRoYXQgaGFzXG4gICAgICAvLyB0aGUgZGV2aWNlIHVkaWRzIGFuZCBvcyB2ZXJzaW9ucyBzbyB0aGV5IGtub3cgd2hhdCdzIGF2YWlsYWJsZVxuICAgICAgY29uc3QgYXZhaWxEZXZpY2VzID0gW107XG4gICAgICBsZXQgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0gbnVsbDtcbiAgICAgIC8vIGZpcnN0IHRyeSBzdGFydGVkIGRldmljZXMvZW11bGF0b3JzXG4gICAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICAgIC8vIGRpcmVjdCBhZGIgY2FsbHMgdG8gdGhlIHNwZWNpZmljIGRldmljZVxuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQoZGV2aWNlLnVkaWQpO1xuICAgICAgICBjb25zdCByYXdEZXZpY2VPUyA9IGF3YWl0IGFkYi5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICAgICAgLy8gVGhlIGRldmljZSBPUyBjb3VsZCBlaXRoZXIgYmUgYSBudW1iZXIsIGxpa2UgYDYuMGBcbiAgICAgICAgLy8gb3IgYW4gYWJicmV2aWF0aW9uLCBsaWtlIGBSYFxuICAgICAgICBhdmFpbERldmljZXMucHVzaChgJHtkZXZpY2UudWRpZH0gKCR7cmF3RGV2aWNlT1N9KWApO1xuICAgICAgICBjb25zdCBkZXZpY2VPUyA9IHNlbXZlci5jb2VyY2UocmF3RGV2aWNlT1MpIHx8IHJhd0RldmljZU9TO1xuICAgICAgICBpZiAoIWRldmljZU9TKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgPSBzZW12ZXIudmFsaWQoZGV2aWNlT1MpICYmIHNlbXZlci52YWxpZChwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzID0gXy5pc1N0cmluZyhkZXZpY2VPUykgJiYgXy5pc1N0cmluZyhwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBpZiAoYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkICYmIGRldmljZU9TLnZlcnNpb24gPT09IHBsYXRmb3JtVmVyc2lvbi52ZXJzaW9uXG4gICAgICAgICAgICB8fCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzICYmIF8udG9Mb3dlcihkZXZpY2VPUykgPT09IF8udG9Mb3dlcihwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgICAgICAgLy8gR290IGFuIGV4YWN0IG1hdGNoIC0gcHJvY2VlZCBpbW1lZGlhdGVseVxuICAgICAgICAgIHVkaWQgPSBkZXZpY2UudWRpZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICghYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8gY2hlY2sgZm9yIHBhcnRpYWwgbWF0Y2ggaWYgZWl0aGVyIG9mIHZlcnNpb24gbnVtYmVycyBpcyBub3QgY29lcmNpYmxlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCFfLmluY2x1ZGVzKG9wdHMucGxhdGZvcm1WZXJzaW9uLCAnLicpICYmIHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3JcbiAgICAgICAgICAgIHx8IHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3IgJiYgcGxhdGZvcm1WZXJzaW9uLm1pbm9yID09PSBkZXZpY2VPUy5taW5vcilcbiAgICAgICAgICAgIC8vIEdvdCBhIHBhcnRpYWwgbWF0Y2ggLSBtYWtlIHN1cmUgd2UgY29uc2lkZXIgdGhlIG1vc3QgcmVjZW50XG4gICAgICAgICAgICAvLyBkZXZpY2UgdmVyc2lvbiBhdmFpbGFibGUgb24gdGhlIGhvc3Qgc3lzdGVtXG4gICAgICAgICAgICAmJiAocGFydGlhbE1hdGNoQ2FuZGlkYXRlICYmIHNlbXZlci5ndChkZXZpY2VPUywgXy52YWx1ZXMocGFydGlhbE1hdGNoQ2FuZGlkYXRlKVswXSlcbiAgICAgICAgICAgICAgICB8fCAhcGFydGlhbE1hdGNoQ2FuZGlkYXRlKSkge1xuICAgICAgICAgIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSA9IHtbZGV2aWNlLnVkaWRdOiBkZXZpY2VPU307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdWRpZCAmJiBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpIHtcbiAgICAgICAgdWRpZCA9IF8ua2V5cyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdO1xuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdWRpZCkge1xuICAgICAgICAvLyB3ZSBjb3VsZG4ndCBmaW5kIGFueXRoaW5nISBxdWl0XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBVbmFibGUgdG8gZmluZCBhbiBhY3RpdmUgZGV2aWNlIG9yIGVtdWxhdG9yIGAgK1xuICAgICAgICAgIGB3aXRoIE9TICR7b3B0cy5wbGF0Zm9ybVZlcnNpb259LiBUaGUgZm9sbG93aW5nIGFyZSBhdmFpbGFibGU6IGAgK1xuICAgICAgICAgIGF2YWlsRGV2aWNlcy5qb2luKCcsICcpKTtcbiAgICAgIH1cblxuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGEgdWRpZCB3YXMgbm90IGdpdmVuLCBncmFiIHRoZSBmaXJzdCBkZXZpY2Ugd2Ugc2VlXG4gICAgICB1ZGlkID0gZGV2aWNlc1swXS51ZGlkO1xuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmluZm8oYFVzaW5nIGRldmljZTogJHt1ZGlkfWApO1xuICByZXR1cm4ge3VkaWQsIGVtUG9ydH07XG59O1xuXG4vLyByZXR1cm5zIGEgbmV3IGFkYiBpbnN0YW5jZSB3aXRoIGRldmljZUlkIHNldFxuaGVscGVycy5jcmVhdGVBREIgPSBhc3luYyBmdW5jdGlvbiBjcmVhdGVBREIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7dWRpZCwgZW1Qb3J0fSA9IG9wdHM7XG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgYWRiLnNldERldmljZUlkKHVkaWQpO1xuICBpZiAoZW1Qb3J0KSB7XG4gICAgYWRiLnNldEVtdWxhdG9yUG9ydChlbVBvcnQpO1xuICB9XG5cbiAgcmV0dXJuIGFkYjtcbn07XG5cbmhlbHBlcnMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMgKG9wdHMpIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydhcHBQYWNrYWdlJywgJ2FwcEFjdGl2aXR5JywgJ2FwcFdhaXRQYWNrYWdlJywgJ2FwcFdhaXRBY3Rpdml0eSddKSB7XG4gICAgY29uc3QgbmFtZSA9IG9wdHNba2V5XTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gLyhbXlxcdy4qLF0pKy8uZXhlYyhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybihgQ2FwYWJpbGl0eSAnJHtrZXl9JyBpcyBleHBlY3RlZCB0byBvbmx5IGluY2x1ZGUgbGF0aW4gbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlLCBkb3QsIGNvbW1hIGFuZCBhc3RlcmlzayBjaGFyYWN0ZXJzLmApO1xuICAgIGxvZ2dlci53YXJuKGBDdXJyZW50IHZhbHVlICcke25hbWV9JyBoYXMgbm9uLW1hdGNoaW5nIGNoYXJhY3RlciBhdCBpbmRleCAke21hdGNoLmluZGV4fTogJyR7bmFtZS5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXggKyAxKX0nYCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0TGF1bmNoSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldExhdW5jaEluZm8gKGFkYiwgb3B0cykge1xuICBsZXQge2FwcCwgYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHl9ID0gb3B0cztcbiAgaWYgKCFhcHApIHtcbiAgICBsb2dnZXIud2FybignTm8gYXBwIHNlbnQgaW4sIG5vdCBwYXJzaW5nIHBhY2thZ2UvYWN0aXZpdHknKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMob3B0cyk7XG5cbiAgaWYgKGFwcFBhY2thZ2UgJiYgYXBwQWN0aXZpdHkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1BhcnNpbmcgcGFja2FnZSBhbmQgYWN0aXZpdHkgZnJvbSBhcHAgbWFuaWZlc3QnKTtcbiAgbGV0IHthcGtQYWNrYWdlLCBhcGtBY3Rpdml0eX0gPVxuICAgIGF3YWl0IGFkYi5wYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QoYXBwKTtcbiAgaWYgKGFwa1BhY2thZ2UgJiYgIWFwcFBhY2thZ2UpIHtcbiAgICBhcHBQYWNrYWdlID0gYXBrUGFja2FnZTtcbiAgfVxuICBpZiAoIWFwcFdhaXRQYWNrYWdlKSB7XG4gICAgYXBwV2FpdFBhY2thZ2UgPSBhcHBQYWNrYWdlO1xuICB9XG4gIGlmIChhcGtBY3Rpdml0eSAmJiAhYXBwQWN0aXZpdHkpIHtcbiAgICBhcHBBY3Rpdml0eSA9IGFwa0FjdGl2aXR5O1xuICB9XG4gIGlmICghYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgYXBwV2FpdEFjdGl2aXR5ID0gYXBwQWN0aXZpdHk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlOiAke2Fwa1BhY2thZ2V9LyR7YXBrQWN0aXZpdHl9YCk7XG4gIHJldHVybiB7YXBwUGFja2FnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0QWN0aXZpdHl9O1xufTtcblxuaGVscGVycy5yZXNldEFwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0QXBwIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGFwcFBhY2thZ2UsXG4gICAgZmFzdFJlc2V0LFxuICAgIGZ1bGxSZXNldCxcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVF9NUyxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlc1xuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcFBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwUGFja2FnZScgb3B0aW9uIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgY29uc3QgaXNJbnN0YWxsZWQgPSBhd2FpdCBhZGIuaXNBcHBJbnN0YWxsZWQoYXBwUGFja2FnZSk7XG5cbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFkYi5mb3JjZVN0b3AoYXBwUGFja2FnZSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIC8vIGZ1bGxSZXNldCBoYXMgcHJpb3JpdHkgb3ZlciBmYXN0UmVzZXRcbiAgICBpZiAoIWZ1bGxSZXNldCAmJiBmYXN0UmVzZXQpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5jbGVhcihhcHBQYWNrYWdlKTtcbiAgICAgIGlmIChfLmlzU3RyaW5nKG91dHB1dCkgJiYgb3V0cHV0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZhaWxlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNsZWFyIHRoZSBhcHBsaWNhdGlvbiBkYXRhIG9mICcke2FwcFBhY2thZ2V9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7b3V0cHV0fWApO1xuICAgICAgfVxuICAgICAgLy8gZXhlY3V0aW5nIGBzaGVsbCBwbSBjbGVhcmAgcmVzZXRzIHByZXZpb3VzbHkgYXNzaWduZWQgYXBwbGljYXRpb24gcGVybWlzc2lvbnMgYXMgd2VsbFxuICAgICAgaWYgKGF1dG9HcmFudFBlcm1pc3Npb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYWRiLmdyYW50QWxsUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBVbmFibGUgdG8gZ3JhbnQgcGVybWlzc2lvbnMgcmVxdWVzdGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoYFBlcmZvcm1lZCBmYXN0IHJlc2V0IG9uIHRoZSBpbnN0YWxsZWQgJyR7YXBwUGFja2FnZX0nIGFwcGxpY2F0aW9uIChzdG9wIGFuZCBjbGVhcilgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWFwcCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWl0aGVyIHByb3ZpZGUgJ2FwcCcgb3B0aW9uIHRvIGluc3RhbGwgJyR7YXBwUGFja2FnZX0nIG9yIGAgK1xuICAgICAgYGNvbnNpZGVyIHNldHRpbmcgJ25vUmVzZXQnIHRvICd0cnVlJyBpZiAnJHthcHBQYWNrYWdlfScgaXMgc3VwcG9zZWQgdG8gYmUgcHJlaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBSdW5uaW5nIGZ1bGwgcmVzZXQgb24gJyR7YXBwUGFja2FnZX0nIChyZWluc3RhbGwpYCk7XG4gIGlmIChpc0luc3RhbGxlZCkge1xuICAgIGF3YWl0IGFkYi51bmluc3RhbGxBcGsoYXBwUGFja2FnZSk7XG4gIH1cbiAgYXdhaXQgYWRiLmluc3RhbGwoYXBwLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICB9KTtcbn07XG5cbmhlbHBlcnMuaW5zdGFsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGsgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUX01TLFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcCB8fCAhYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHAnIGFuZCAnYXBwUGFja2FnZScgb3B0aW9ucyBhcmUgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoZnVsbFJlc2V0KSB7XG4gICAgYXdhaXQgdGhpcy5yZXNldEFwcChhZGIsIG9wdHMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBhcHBTdGF0ZSxcbiAgICB3YXNVbmluc3RhbGxlZFxuICB9ID0gYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBwLCBhcHBQYWNrYWdlLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VDdXJyZW50QnVpbGQ6IGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9KTtcblxuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IHRoZSBuZXdseSBpbnN0YWxsZWQgYXBwXG4gIGNvbnN0IGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwID0gIXdhc1VuaW5zdGFsbGVkXG4gICAgJiYgYXBwU3RhdGUgIT09IGFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICBpZiAoZmFzdFJlc2V0ICYmIGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwKSB7XG4gICAgbG9nZ2VyLmluZm8oYFBlcmZvcm1pbmcgZmFzdCByZXNldCBvbiAnJHthcHBQYWNrYWdlfSdgKTtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdGFsbHMgYW4gYXJyYXkgb2YgYXBrc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0cyBkZWZpbmVkIGluIGRyaXZlci5qc1xuICovXG5oZWxwZXJzLmluc3RhbGxPdGhlckFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsT3RoZXJBcGtzIChvdGhlckFwcHMsIGFkYiwgb3B0cykge1xuICBsZXQge1xuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUX01TLFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIC8vIEluc3RhbGwgYWxsIG9mIHRoZSBBUEsncyBhc3luY2hyb25vdXNseVxuICBhd2FpdCBCLmFsbChvdGhlckFwcHMubWFwKChvdGhlckFwcCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgSW5zdGFsbGluZyBhcHA6ICR7b3RoZXJBcHB9YCk7XG4gICAgcmV0dXJuIGFkYi5pbnN0YWxsT3JVcGdyYWRlKG90aGVyQXBwLCBudWxsLCB7XG4gICAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIH0pO1xuICB9KSk7XG59O1xuXG4vKipcbiAqIFVuaW5zdGFsbCBhbiBhcnJheSBvZiBwYWNrYWdlc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcHBQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlIG5hbWVzIHRvIHVuaW5zdGFsbC4gSWYgdGhpcyBpbmNsdWRlcyBgJyonYCwgdW5pbnN0YWxsIGFsbCBvZiAzcmQgcGFydHkgYXBwc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlcyBkb2VzIG5vdCB1bmluc3RhbGwgd2hlbiBgKmAgaXMgcHJvdmlkZWQgYXMgYGFwcFBhY2thZ2VzYFxuICovXG5oZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGxPdGhlclBhY2thZ2VzIChhZGIsIGFwcFBhY2thZ2VzLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIGlmIChhcHBQYWNrYWdlcy5pbmNsdWRlcygnKicpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdVbmluc3RhbGwgdGhpcmQgcGFydHkgcGFja2FnZXMnKTtcbiAgICBhcHBQYWNrYWdlcyA9IGF3YWl0IHRoaXMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzKGFkYiwgZmlsdGVyUGFja2FnZXMpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBVbmluc3RhbGxpbmcgcGFja2FnZXM6ICR7YXBwUGFja2FnZXN9YCk7XG4gIGF3YWl0IEIuYWxsKGFwcFBhY2thZ2VzLm1hcCgoYXBwUGFja2FnZSkgPT4gYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKSkpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhpcmQgcGFydHkgcGFja2FnZXMgZmlsdGVyZWQgd2l0aCBgZmlsdGVyUGFja2FnZXNgXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXkgb2YgaW5zdGFsbGVkIHRoaXJkIHBhcnkgcGFja2FnZXNcbiAqL1xuaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRUaGlyZFBhcnR5UGFja2FnZXMgKGFkYiwgZmlsdGVyUGFja2FnZXMgPSBbXSkge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VzU3RyaW5nID0gYXdhaXQgYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsICctMyddKTtcbiAgICBjb25zdCBhcHBQYWNrYWdlc0FycmF5ID0gcGFja2FnZXNTdHJpbmcudHJpbSgpLnJlcGxhY2UoL3BhY2thZ2U6L2csICcnKS5zcGxpdChFT0wpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJyR7YXBwUGFja2FnZXNBcnJheX0nIGZpbHRlcmVkIHdpdGggJyR7ZmlsdGVyUGFja2FnZXN9J2ApO1xuICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXBwUGFja2FnZXNBcnJheSwgZmlsdGVyUGFja2FnZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIGdldCBwYWNrYWdlcyB3aXRoICdhZGIgc2hlbGwgcG0gbGlzdCBwYWNrYWdlcyAtMyc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5oZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBpbml0VW5pY29kZUtleWJvYXJkIChhZGIpIHtcbiAgbG9nZ2VyLmRlYnVnKCdFbmFibGluZyBVbmljb2RlIGtleWJvYXJkIHN1cHBvcnQnKTtcblxuICAvLyBnZXQgdGhlIGRlZmF1bHQgSU1FIHNvIHdlIGNhbiByZXR1cm4gYmFjayB0byBpdCBsYXRlciBpZiB3ZSB3YW50XG4gIGxldCBkZWZhdWx0SU1FID0gYXdhaXQgYWRiLmRlZmF1bHRJTUUoKTtcblxuICBsb2dnZXIuZGVidWcoYFVuc2V0dGluZyBwcmV2aW91cyBJTUUgJHtkZWZhdWx0SU1FfWApO1xuICBjb25zdCBhcHBpdW1JTUUgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8uVW5pY29kZUlNRWA7XG4gIGxvZ2dlci5kZWJ1ZyhgU2V0dGluZyBJTUUgdG8gJyR7YXBwaXVtSU1FfSdgKTtcbiAgYXdhaXQgYWRiLmVuYWJsZUlNRShhcHBpdW1JTUUpO1xuICBhd2FpdCBhZGIuc2V0SU1FKGFwcGl1bUlNRSk7XG4gIHJldHVybiBkZWZhdWx0SU1FO1xufTtcblxuaGVscGVycy5zZXRNb2NrTG9jYXRpb25BcHAgPSBhc3luYyBmdW5jdGlvbiBzZXRNb2NrTG9jYXRpb25BcHAgKGFkYiwgYXBwKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcxJ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgYXBwLCAnYW5kcm9pZDptb2NrX2xvY2F0aW9uJywgJ2FsbG93J10pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzZXQgbW9jayBsb2NhdGlvbiBmb3IgYXBwICcke2FwcH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGxldCBwa2dJZHMgPSBbXTtcbiAgICBpZiAoYXdhaXQgYWRiLmZpbGVFeGlzdHMoTU9DS19BUFBfSURTX1NUT1JFKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGtnSWRzID0gSlNPTi5wYXJzZShhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCBNT0NLX0FQUF9JRFNfU1RPUkVdKSk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIGlmIChwa2dJZHMuaW5jbHVkZXMoYXBwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwa2dJZHMucHVzaChhcHApO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5wb3NpeC5qb2luKHRtcFJvb3QsIHBhdGgucG9zaXguYmFzZW5hbWUoTU9DS19BUFBfSURTX1NUT1JFKSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShzcmNQYXRoLCBKU09OLnN0cmluZ2lmeShwa2dJZHMpLCAndXRmOCcpO1xuICAgICAgYXdhaXQgYWRiLnB1c2goc3JjUGF0aCwgTU9DS19BUFBfSURTX1NUT1JFKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcGVyc2lzdCBtb2NrIGxvY2F0aW9uIGFwcCBpZCAnJHthcHB9JzogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMucmVzZXRNb2NrTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiByZXNldE1vY2tMb2NhdGlvbiAoYWRiKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcwJ10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRoaXJkUGFydHlQa2dJZHNQcm9taXNlID0gaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiKTtcbiAgICBsZXQgcGtnSWRzID0gW107XG4gICAgaWYgKGF3YWl0IGFkYi5maWxlRXhpc3RzKE1PQ0tfQVBQX0lEU19TVE9SRSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBrZ0lkcyA9IEpTT04ucGFyc2UoYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgTU9DS19BUFBfSURTX1NUT1JFXSkpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICBjb25zdCB0aGlyZFBhcnR5UGtnSWRzID0gYXdhaXQgdGhpcmRQYXJ0eVBrZ0lkc1Byb21pc2U7XG4gICAgLy8gT25seSBpbmNsdWRlIGN1cnJlbnRseSBpbnN0YWxsZWQgcGFja2FnZXNcbiAgICBjb25zdCByZXN1bHRQa2dzID0gXy5pbnRlcnNlY3Rpb24ocGtnSWRzLCB0aGlyZFBhcnR5UGtnSWRzKTtcbiAgICBpZiAoXy5zaXplKHJlc3VsdFBrZ3MpIDw9IDEpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCByZXN1bHRQa2dzWzBdID8/IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnZGVueSddKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFJlc2V0dGluZyBtb2NrX2xvY2F0aW9uIHBlcm1pc3Npb24gZm9yIHRoZSBmb2xsb3dpbmcgYXBwczogJHtyZXN1bHRQa2dzfWApO1xuICAgIGF3YWl0IEIuYWxsKHJlc3VsdFBrZ3MubWFwKChwa2dJZCkgPT4gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBwa2dJZCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdkZW55J10pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH0pKCkpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZXNldCBtb2NrIGxvY2F0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSGVscGVyQXBwIChhZGIsIGFwa1BhdGgsIHBhY2thZ2VJZCkge1xuICAvLyBTb21ldGltZXMgYWRiIHB1c2ggb3IgYWRiIGluc3RhbCB0YWtlIG1vcmUgdGltZSB0aGFuIGV4cGVjdGVkIHRvIGluc3RhbGwgYW4gYXBwXG4gIC8vIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MvaXNzdWVzLzQwI2lzc3VlY29tbWVudC00NzY1OTMxNzRcbiAgYXdhaXQgcmV0cnlJbnRlcnZhbChIRUxQRVJfQVBQX0lOU1RBTExfUkVUUklFUywgSEVMUEVSX0FQUF9JTlNUQUxMX1JFVFJZX0RFTEFZX01TLFxuICAgIGFzeW5jIGZ1bmN0aW9uIHJldHJ5SW5zdGFsbEhlbHBlckFwcCAoKSB7XG4gICAgICBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcGtQYXRoLCBwYWNrYWdlSWQsIHtncmFudFBlcm1pc3Npb25zOiB0cnVlfSk7XG4gICAgfVxuICApO1xufTtcblxuLyoqXG4gKiBQdXNoZXMgYW5kIGluc3RhbGxzIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNldHRpbmcgYXBwIGlzIHJlcXVpcmVkXG4gKlxuICogQHBhcmFtIHtBZGJ9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHBhcmFtIHtib29sZWFufSB0aHJvd0Vycm9yIFtmYWxzZV0gLSBXaGV0aGVyIHRocm93IGFuIGVycm9yIGlmIFNldHRpbmdzIGFwcCBmYWlscyB0byBzdGFydFxuICogQHRocm93cyB7RXJyb3J9IElmIHRocm93RXJyb3IgaXMgdHJ1ZSBhbmQgc29tZXRoaW5nIGhhcHBlbnMgaW4gaW5zdGFsbGF0aW9uIHN0ZXBcbiAqL1xuaGVscGVycy5wdXNoU2V0dGluZ3NBcHAgPSBhc3luYyBmdW5jdGlvbiBwdXNoU2V0dGluZ3NBcHAgKGFkYiwgdGhyb3dFcnJvciA9IGZhbHNlLCBvcHRzID0ge30pIHtcbiAgbG9nZ2VyLmRlYnVnKCdQdXNoaW5nIHNldHRpbmdzIGFwayB0byBkZXZpY2UuLi4nKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEhlbHBlckFwcChhZGIsIHNldHRpbmdzQXBrUGF0aCwgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgdGhyb3dFcnJvcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0aHJvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYElnbm9yZWQgZXJyb3Igd2hpbGUgaW5zdGFsbGluZyAnJHtzZXR0aW5nc0Fwa1BhdGh9JzogYCArXG4gICAgICAgICAgICAgICAgYCcke2Vyci5tZXNzYWdlfScuIEZlYXR1cmVzIHRoYXQgcmVseSBvbiB0aGlzIGhlbHBlciBgICtcbiAgICAgICAgICAgICAgICAncmVxdWlyZSB0aGUgYXBrIHN1Y2ggYXMgdG9nZ2xlIFdpRmkgYW5kIGdldHRpbmcgbG9jYXRpb24gJyArXG4gICAgICAgICAgICAgICAgJ3dpbGwgcmFpc2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byB1c2UgdGhlbS4nKTtcbiAgfVxuXG4gIC8vIFJlaW5zdGFsbCB3b3VsZCBzdG9wIHRoZSBzZXR0aW5ncyBoZWxwZXIgcHJvY2VzcyBhbnl3YXksIHNvXG4gIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHJ1bm5pbmdcbiAgaWYgKGF3YWl0IGFkYi5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9IGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdHMgcGVybWlzc2lvbnMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsID49IDI5KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MjaW50ZXJuYWwtYXVkaW8tLXZpZGVvLXJlY29yZGluZ1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgJ1BST0pFQ1RfTUVESUEnLCAnYWxsb3cnXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDw9IDIzKSB7IC8vIEFuZHJvaWQgNi0gZGV2aWNlcyBzaG91bGQgaGF2ZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgY29uc3QgcGVybXMgPSBbJ1NFVF9BTklNQVRJT05fU0NBTEUnLCAnQ0hBTkdFX0NPTkZJR1VSQVRJT04nLCAnQUNDRVNTX0ZJTkVfTE9DQVRJT04nXTtcbiAgICBsb2dnZXIuaW5mbyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtwZXJtc30gdG8gJyR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0nYCk7XG4gICAgYXdhaXQgYWRiLmdyYW50UGVybWlzc2lvbnMoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgcGVybXMubWFwKCh4KSA9PiBgYW5kcm9pZC5wZXJtaXNzaW9uLiR7eH1gKSk7XG4gIH1cblxuICAvLyBsYXVuY2ggaW8uYXBwaXVtLnNldHRpbmdzIGFwcCBkdWUgdG8gc2V0dGluZ3MgZmFpbGluZyB0byBiZSBzZXRcbiAgLy8gaWYgdGhlIGFwcCBpcyBub3QgbGF1bmNoZWQgcHJpb3IgdG8gc3RhcnQgdGhlIHNlc3Npb24gb24gYW5kcm9pZCA3K1xuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzg5NTdcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCh7XG4gICAgICB0aW1lb3V0OiBoZWxwZXJzLmlzRW11bGF0b3IoYWRiLCBvcHRzKSA/IDMwMDAwIDogNTAwMFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBzdHJpbmcueG1sIGFuZCBjb252ZXJ0cyBpdCB0byBzdHJpbmcuanNvbiBhbmQgcHVzaGVzXG4gKiBpdCB0byAvZGF0YS9sb2NhbC90bXAvc3RyaW5nLmpzb24gb24gZm9yIHVzZSBvZiBib290c3RyYXBcbiAqIElmIGFwcCBpcyBub3QgcHJlc2VudCB0byBleHRyYWN0IHN0cmluZy54bWwgaXQgZGVsZXRlcyByZW1vdGUgc3RyaW5ncy5qc29uXG4gKiBJZiBhcHAgZG9lcyBub3QgaGF2ZSBzdHJpbmdzLnhtbCB3ZSBwdXNoIGFuIGVtcHR5IGpzb24gb2JqZWN0IHRvIHJlbW90ZVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZSBhYmJyZXZpYXRpb24sIGZvciBleGFtcGxlICdmcicuIFRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gKiBpcyB1c2VkIGlmIHRoaXMgYXJndW1lbnQgaXMgbm90IGRlZmluZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIERyaXZlciBvcHRpb25zIGRpY3Rpb25hcnkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGljdGlvbmFyeSwgd2hlcmUgc3RyaW5nIHJlc291cmNlIGlkZW50aWZpZXJzIGFyZSBrZXlzXG4gKiBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2Ugb3IgYW4gZW1wdHkgb2JqZWN0XG4gKiBpZiBubyBtYXRjaGluZyByZXNvdXJjZXMgd2VyZSBleHRyYWN0ZWQuXG4gKi9cbmhlbHBlcnMucHVzaFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBwdXNoU3RyaW5ncyAobGFuZ3VhZ2UsIGFkYiwgb3B0cykge1xuICBjb25zdCByZW1vdGVEaXIgPSAnL2RhdGEvbG9jYWwvdG1wJztcbiAgY29uc3Qgc3RyaW5nc0pzb24gPSAnc3RyaW5ncy5qc29uJztcbiAgY29uc3QgcmVtb3RlRmlsZSA9IHBhdGgucG9zaXgucmVzb2x2ZShyZW1vdGVEaXIsIHN0cmluZ3NKc29uKTtcblxuICAvLyBjbGVhbiB1cCByZW1vdGUgc3RyaW5nLmpzb24gaWYgcHJlc2VudFxuICBhd2FpdCBhZGIucmltcmFmKHJlbW90ZUZpbGUpO1xuXG4gIGxldCBhcHA7XG4gIHRyeSB7XG4gICAgYXBwID0gb3B0cy5hcHAgfHwgYXdhaXQgYWRiLnB1bGxBcGsob3B0cy5hcHBQYWNrYWdlLCBvcHRzLnRtcERpcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5pbmZvKGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHtvcHRzLmFwcFBhY2thZ2V9JyB0byAnJHtvcHRzLnRtcERpcn0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkob3B0cy5hcHBQYWNrYWdlKSB8fCAhKGF3YWl0IGZzLmV4aXN0cyhhcHApKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgTm8gYXBwIG9yIHBhY2thZ2Ugc3BlY2lmaWVkLiBSZXR1cm5pbmcgZW1wdHkgc3RyaW5nc2ApO1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ3NUbXBEaXIgPSBwYXRoLnJlc29sdmUob3B0cy50bXBEaXIsIG9wdHMuYXBwUGFja2FnZSk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBhcGsnLCBhcHAsIGxhbmd1YWdlLCBzdHJpbmdzVG1wRGlyKTtcbiAgICBjb25zdCB7YXBrU3RyaW5ncywgbG9jYWxQYXRofSA9IGF3YWl0IGFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgYXdhaXQgYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVEaXIpO1xuICAgIHJldHVybiBhcGtTdHJpbmdzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgQ291bGQgbm90IGdldCBzdHJpbmdzLCBjb250aW51aW5nIGFueXdheS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKCdlY2hvJywgW2Ane30nID4gJHtyZW1vdGVGaWxlfWBdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoc3RyaW5nc1RtcERpcik7XG4gIH1cbiAgcmV0dXJuIHt9O1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdTY3JlZW4gaXMgbG9ja2VkLCB0cnlpbmcgdG8gdW5sb2NrJyk7XG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIuaW5mbyhgTmVpdGhlciAndW5sb2NrVHlwZScgbm9yICd1bmxvY2tLZXknIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQuIGAgK1xuICAgICAgYEFzc3VtaW5nIHRoZSBkZXZpY2UgaXMgbG9ja2VkIHdpdGggYSBzaW1wbGUgbG9jayBzY3JlZW4uYCk7XG4gICAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLndhaXRGb3JEZXZpY2UoKTtcbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvciwgb3B0cyk7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpKSB7XG4gICAgaWYgKG1vY2tMb2NhdGlvbkFwcCB8fCBfLmlzVW5kZWZpbmVkKG1vY2tMb2NhdGlvbkFwcCkpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0TW9ja0xvY2F0aW9uKGFkYik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxVQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxTQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxV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
|
|
768
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl9hc3luY2JveCIsIl9sb2dnZXIiLCJfc3VwcG9ydCIsIl9pb0FwcGl1bSIsIl9ib290c3RyYXAiLCJfYmx1ZWJpcmQiLCJfYXBwaXVtQWRiIiwiX3VubG9ja0hlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9vcyIsIl9zZW12ZXIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiTU9DS19BUFBfSURTX1NUT1JFIiwiUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVRfTVMiLCJIRUxQRVJfQVBQX0lOU1RBTExfUkVUUklFUyIsIkhFTFBFUl9BUFBfSU5TVEFMTF9SRVRSWV9ERUxBWV9NUyIsIkNIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkiLCJjaHJvbWUiLCJwa2ciLCJhY3Rpdml0eSIsImNocm9taXVtIiwiY2hyb21lYmV0YSIsImJyb3dzZXIiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiZXhwb3J0cyIsIkVNVUxBVE9SX1BBVFRFUk4iLCJBUFBfU1RBVEUiLCJmcmVlemUiLCJOT1RfSU5TVEFMTEVEIiwiTk9UX1JVTk5JTkciLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJhZGIiLCJuZXR3b3JrU3BlZWQiLCJfIiwidmFsdWVzIiwiTkVUV09SS19TUEVFRCIsImluY2x1ZGVzIiwibG9nZ2VyIiwid2FybiIsIkZVTEwiLCJwcmVwYXJlQXZkQXJncyIsIm9wdHMiLCJpc0hlYWRsZXNzIiwiYXZkQXJncyIsInJlc3VsdCIsImlzQXJyYXkiLCJwdXNoIiwidXRpbCIsInNoZWxsUGFyc2UiLCJ0b0NyZWRlbnRpYWxUeXBlIiwidW5sb2NrVHlwZSIsIlBJTl9VTkxPQ0siLCJQSU5fVU5MT0NLX0tFWV9FVkVOVCIsIlBBU1NXT1JEX1VOTE9DSyIsIlBBVFRFUk5fVU5MT0NLIiwiRXJyb3IiLCJoZWxwZXJzIiwiY3JlYXRlQmFzZUFEQiIsImFkYlBvcnQiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInJlbW90ZUFwcHNDYWNoZUxpbWl0IiwiYnVpbGRUb29sc1ZlcnNpb24iLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiYWxsb3dEZWxheUFkYiIsIkFEQiIsImNyZWF0ZUFEQiIsInByZXBhcmVFbXVsYXRvciIsImF2ZCIsImF2ZEVudiIsImVudiIsImxhbmd1YWdlIiwibG9jYWxlIiwiY291bnRyeSIsImF2ZExhdW5jaFRpbWVvdXQiLCJsYXVuY2hUaW1lb3V0IiwiYXZkUmVhZHlUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwiYXZkTmFtZSIsInJlcGxhY2UiLCJpc0VtdWxhdG9yUnVubmluZyIsImdldFJ1bm5pbmdBVkRXaXRoUmV0cnkiLCJlIiwiZGVidWciLCJtZXNzYWdlIiwiYXJncyIsImtpbGxFbXVsYXRvciIsImxhdW5jaEFWRCIsImVuc3VyZURldmljZUxvY2FsZSIsInNjcmlwdCIsImlzU3RyaW5nIiwic2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IiwiZW5zdXJlQ3VycmVudExvY2FsZSIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsInVkaWQiLCJlbVBvcnQiLCJjdXJEZXZpY2VJZCIsImVtdWxhdG9yUG9ydCIsImluZm8iLCJkZXZpY2VzIiwiZ2V0RGV2aWNlc1dpdGhSZXRyeSIsIm1hcCIsImVycm9yQW5kVGhyb3ciLCJnZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nIiwicGxhdGZvcm1WZXJzaW9uIiwidHJpbSIsInNlbXZlciIsImNvZXJjZSIsImF2YWlsRGV2aWNlcyIsInBhcnRpYWxNYXRjaENhbmRpZGF0ZSIsImRldmljZSIsInNldERldmljZUlkIiwicmF3RGV2aWNlT1MiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VPUyIsImJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCIsInZhbGlkIiwiYm90aFZlcnNpb25zQXJlU3RyaW5ncyIsInZlcnNpb24iLCJ0b0xvd2VyIiwibWFqb3IiLCJtaW5vciIsImd0Iiwia2V5cyIsImpvaW4iLCJzZXRFbXVsYXRvclBvcnQiLCJ2YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzIiwibmFtZSIsIm1hdGNoIiwiZXhlYyIsImluZGV4Iiwic3Vic3RyaW5nIiwiZ2V0TGF1bmNoSW5mbyIsImFwcCIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYXBrUGFja2FnZSIsImFwa0FjdGl2aXR5IiwicGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0IiwicmVzZXRBcHAiLCJmYXN0UmVzZXQiLCJmdWxsUmVzZXQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJhdXRvR3JhbnRQZXJtaXNzaW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwiaXNJbnN0YWxsZWQiLCJpc0FwcEluc3RhbGxlZCIsImZvcmNlU3RvcCIsImlnbiIsIm91dHB1dCIsImNsZWFyIiwidG9Mb3dlckNhc2UiLCJncmFudEFsbFBlcm1pc3Npb25zIiwiZXJyb3IiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInRpbWVvdXQiLCJpbnN0YWxsQXBrIiwiZW5mb3JjZUFwcEluc3RhbGwiLCJhcHBTdGF0ZSIsIndhc1VuaW5zdGFsbGVkIiwiaW5zdGFsbE9yVXBncmFkZSIsImVuZm9yY2VDdXJyZW50QnVpbGQiLCJpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiaW5zdGFsbE90aGVyQXBrcyIsIm90aGVyQXBwcyIsIkIiLCJhbGwiLCJvdGhlckFwcCIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJhcHBQYWNrYWdlcyIsImZpbHRlclBhY2thZ2VzIiwiZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzIiwicGFja2FnZXNTdHJpbmciLCJzaGVsbCIsImFwcFBhY2thZ2VzQXJyYXkiLCJzcGxpdCIsIkVPTCIsImRpZmZlcmVuY2UiLCJlcnIiLCJpbml0VW5pY29kZUtleWJvYXJkIiwiZGVmYXVsdElNRSIsImFwcGl1bUlNRSIsImVuYWJsZUlNRSIsInNldElNRSIsInNldE1vY2tMb2NhdGlvbkFwcCIsImdldEFwaUxldmVsIiwicGtnSWRzIiwiZmlsZUV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInNyY1BhdGgiLCJwYXRoIiwicG9zaXgiLCJiYXNlbmFtZSIsImZzIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwicmltcmFmIiwicmVzZXRNb2NrTG9jYXRpb24iLCJ0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZSIsInRoaXJkUGFydHlQa2dJZHMiLCJyZXN1bHRQa2dzIiwiaW50ZXJzZWN0aW9uIiwic2l6ZSIsInBrZ0lkIiwiaW5zdGFsbEhlbHBlckFwcCIsImFwa1BhdGgiLCJwYWNrYWdlSWQiLCJyZXRyeUludGVydmFsIiwicmV0cnlJbnN0YWxsSGVscGVyQXBwIiwicHVzaFNldHRpbmdzQXBwIiwidGhyb3dFcnJvciIsInNldHRpbmdzQXBrUGF0aCIsInByb2Nlc3NFeGlzdHMiLCJhcGlMZXZlbCIsInBlcm1zIiwieCIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJpc0VtdWxhdG9yIiwicHVzaFN0cmluZ3MiLCJyZW1vdGVEaXIiLCJzdHJpbmdzSnNvbiIsInJlbW90ZUZpbGUiLCJyZXNvbHZlIiwicHVsbEFwayIsInRtcERpciIsImlzRW1wdHkiLCJleGlzdHMiLCJzdHJpbmdzVG1wRGlyIiwiYXBrU3RyaW5ncyIsImxvY2FsUGF0aCIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsInVubG9jayIsImRyaXZlciIsImNhcGFiaWxpdGllcyIsImlzU2NyZWVuTG9ja2VkIiwidW5sb2NrS2V5IiwiZGlzbWlzc0tleWd1YXJkIiwidW5sb2NrU3RyYXRlZ3kiLCJ1bmxvY2tTdWNjZXNzVGltZW91dCIsInVubG9ja2VyIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJpc05pbCIsImlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQiLCJmYXN0VW5sb2NrIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwidW5sb2NrTWV0aG9kIiwicGluVW5sb2NrIiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGFzc3dvcmRVbmxvY2siLCJwYXR0ZXJuVW5sb2NrIiwiZmluZ2VycHJpbnRVbmxvY2siLCJ2ZXJpZnlVbmxvY2siLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluaXREZXZpY2UiLCJza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24iLCJsb2NhbGVTY3JpcHQiLCJ1bmljb2RlS2V5Ym9hcmQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic2tpcFVubG9jayIsIm1vY2tMb2NhdGlvbkFwcCIsInNraXBMb2djYXRDYXB0dXJlIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJ3YWl0Rm9yRGV2aWNlIiwic2hvdWxkVGhyb3dFcnJvciIsImlzVW5kZWZpbmVkIiwic3RhcnRMb2djYXQiLCJmb3JtYXQiLCJmaWx0ZXJTcGVjcyIsInJlbW92ZU51bGxQcm9wZXJ0aWVzIiwiaXNOdWxsIiwidHJ1bmNhdGVEZWNpbWFscyIsIm51bWJlciIsImRpZ2l0cyIsIm11bHRpcGxpZXIiLCJNYXRoIiwicG93IiwiYWRqdXN0ZWROdW0iLCJ0cnVuY2F0ZWROdW0iLCJpc0Nocm9tZUJyb3dzZXIiLCJnZXRDaHJvbWVQa2ciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzZXNzaW9uSWQiLCJpc0Z1bmN0aW9uIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJhY3RpdmVIYW5kbGVycyIsInBhdGhuYW1lIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsInBhcnNlQXJyYXkiLCJjYXAiLCJwYXJzZWRDYXBzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJicm93c2VyTmFtZSIsImFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyIsInBvc3NpYmxlTmFtZXMiLCJzb21lIiwidGVzdCIsImJvb3RzdHJhcCIsIkJvb3RzdHJhcCIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2FuZHJvaWQtaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBwYXRoIGFzIHNldHRpbmdzQXBrUGF0aCB9IGZyb20gJ2lvLmFwcGl1bS5zZXR0aW5ncyc7XG5pbXBvcnQgQm9vdHN0cmFwIGZyb20gJy4vYm9vdHN0cmFwJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBBREIgZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQge1xuICBkZWZhdWx0IGFzIHVubG9ja2VyLCBQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCxcbiAgUEFTU1dPUkRfVU5MT0NLLCBQQVRURVJOX1VOTE9DSywgRklOR0VSUFJJTlRfVU5MT0NLXG59IGZyb20gJy4vdW5sb2NrLWhlbHBlcnMnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5jb25zdCBNT0NLX0FQUF9JRFNfU1RPUkUgPSAnL2RhdGEvbG9jYWwvdG1wL21vY2tfYXBwcy5qc29uJztcbmNvbnN0IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUX01TID0gOTAwMDA7XG5jb25zdCBIRUxQRVJfQVBQX0lOU1RBTExfUkVUUklFUyA9IDM7XG5jb25zdCBIRUxQRVJfQVBQX0lOU1RBTExfUkVUUllfREVMQVlfTVMgPSA1MDAwO1xuLy8gaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG5jb25zdCBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZID0ge1xuICBjaHJvbWU6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBjaHJvbWl1bToge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnLkNocm9tZVNoZWxsQWN0aXZpdHknLFxuICB9LFxuICBjaHJvbWViZXRhOiB7XG4gICAgcGtnOiAnY29tLmNocm9tZS5iZXRhJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgYnJvd3Nlcjoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmJyb3dzZXInLFxuICAgIGFjdGl2aXR5OiAnY29tLmFuZHJvaWQuYnJvd3Nlci5Ccm93c2VyQWN0aXZpdHknLFxuICB9LFxuICAnY2hyb21pdW0tYnJvd3Nlcic6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgJ2Nocm9taXVtLXdlYnZpZXcnOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwuV2ViVmlld0Jyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gIGRlZmF1bHQ6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxufTtcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgPSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmNvbnN0IEVNVUxBVE9SX1BBVFRFUk4gPSAvXFxiZW11bGF0b3JcXGIvaTtcbi8vIFRoZXNlIGNvbnN0YW50cyBhcmUgaW4gc3luYyB3aXRoXG4vLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWFwcGxpY2F0aW9uc3RhdGUveGN1aWFwcGxpY2F0aW9uc3RhdGVydW5uaW5nYmFja2dyb3VuZD9sYW5ndWFnZT1vYmpjXG5jb25zdCBBUFBfU1RBVEUgPSBPYmplY3QuZnJlZXplKHtcbiAgTk9UX0lOU1RBTExFRDogMCxcbiAgTk9UX1JVTk5JTkc6IDEsXG4gIFJVTk5JTkdfSU5fQkFDS0dST1VORDogMyxcbiAgUlVOTklOR19JTl9GT1JFR1JPVU5EOiA0XG59KTtcblxuXG5mdW5jdGlvbiBlbnN1cmVOZXR3b3JrU3BlZWQgKGFkYiwgbmV0d29ya1NwZWVkKSB7XG4gIGlmIChfLnZhbHVlcyhhZGIuTkVUV09SS19TUEVFRCkuaW5jbHVkZXMobmV0d29ya1NwZWVkKSkge1xuICAgIHJldHVybiBuZXR3b3JrU3BlZWQ7XG4gIH1cbiAgbG9nZ2VyLndhcm4oYFdyb25nIG5ldHdvcmsgc3BlZWQgcGFyYW0gJyR7bmV0d29ya1NwZWVkfScsIHVzaW5nIGRlZmF1bHQ6ICR7YWRiLk5FVFdPUktfU1BFRUQuRlVMTH0uIGAgK1xuICAgIGBTdXBwb3J0ZWQgdmFsdWVzOiAke18udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKX1gKTtcbiAgcmV0dXJuIGFkYi5ORVRXT1JLX1NQRUVELkZVTEw7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBdmRBcmdzIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIG5ldHdvcmtTcGVlZCxcbiAgICBpc0hlYWRsZXNzLFxuICAgIGF2ZEFyZ3MsXG4gIH0gPSBvcHRzO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaWYgKGF2ZEFyZ3MpIHtcbiAgICBpZiAoXy5pc0FycmF5KGF2ZEFyZ3MpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5hdmRBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goLi4uKHV0aWwuc2hlbGxQYXJzZShgJHthdmRBcmdzfWApKSk7XG4gICAgfVxuICB9XG4gIGlmIChuZXR3b3JrU3BlZWQpIHtcbiAgICByZXN1bHQucHVzaCgnLW5ldHNwZWVkJywgZW5zdXJlTmV0d29ya1NwZWVkKGFkYiwgbmV0d29ya1NwZWVkKSk7XG4gIH1cbiAgaWYgKGlzSGVhZGxlc3MpIHtcbiAgICByZXN1bHQucHVzaCgnLW5vLXdpbmRvdycpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRvQ3JlZGVudGlhbFR5cGUgKHVubG9ja1R5cGUpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIFtQSU5fVU5MT0NLXTogJ3BpbicsXG4gICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogJ3BpbicsXG4gICAgW1BBU1NXT1JEX1VOTE9DS106ICdwYXNzd29yZCcsXG4gICAgW1BBVFRFUk5fVU5MT0NLXTogJ3BhdHRlcm4nLFxuICB9W3VubG9ja1R5cGVdO1xuICBpZiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayB0eXBlICcke3VubG9ja1R5cGV9JyBpcyBub3Qga25vd25gKTtcbn1cblxuXG5jb25zdCBoZWxwZXJzID0ge307XG5cbmhlbHBlcnMuY3JlYXRlQmFzZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJhc2VBREIgKG9wdHMgPSB7fSkge1xuICAvLyBmaWx0ZXIgb3V0IGFueSB1bndhbnRlZCBvcHRpb25zIHNlbnQgaW5cbiAgLy8gdGhpcyBsaXN0IHNob3VsZCBiZSB1cGRhdGVkIGFzIEFEQiB0YWtlcyBtb3JlIGFyZ3VtZW50c1xuICBjb25zdCB7XG4gICAgYWRiUG9ydCxcbiAgICBzdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgcmVtb3RlQWRiSG9zdCxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgIGFkYkV4ZWNUaW1lb3V0LFxuICAgIHVzZUtleXN0b3JlLFxuICAgIGtleXN0b3JlUGF0aCxcbiAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkLFxuICAgIHJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIGJ1aWxkVG9vbHNWZXJzaW9uLFxuICAgIGFsbG93T2ZmbGluZURldmljZXMsXG4gICAgYWxsb3dEZWxheUFkYixcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCBBREIuY3JlYXRlQURCKHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9KTtcbn07XG5cbmhlbHBlcnMucHJlcGFyZUVtdWxhdG9yID0gYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUVtdWxhdG9yIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIGF2ZCxcbiAgICBhdmRFbnY6IGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBsb2NhbGU6IGNvdW50cnksXG4gICAgYXZkTGF1bmNoVGltZW91dDogbGF1bmNoVGltZW91dCxcbiAgICBhdmRSZWFkeVRpbWVvdXQ6IHJlYWR5VGltZW91dCxcbiAgfSA9IG9wdHM7XG4gIGlmICghYXZkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbGF1bmNoIEFWRCB3aXRob3V0IEFWRCBuYW1lJyk7XG4gIH1cblxuICBjb25zdCBhdmROYW1lID0gYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gIGxldCBpc0VtdWxhdG9yUnVubmluZyA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLmdldFJ1bm5pbmdBVkRXaXRoUmV0cnkoYXZkTmFtZSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZGVidWcoYEVtdWxhdG9yICcke2F2ZE5hbWV9JyBpcyBub3QgcnVubmluZzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgaXNFbXVsYXRvclJ1bm5pbmcgPSBmYWxzZTtcbiAgfVxuICBjb25zdCBhcmdzID0gcHJlcGFyZUF2ZEFyZ3MoYWRiLCBvcHRzKTtcbiAgaWYgKGlzRW11bGF0b3JSdW5uaW5nKSB7XG4gICAgaWYgKGFyZ3MuaW5jbHVkZXMoJy13aXBlLWRhdGEnKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBLaWxsaW5nICcke2F2ZE5hbWV9JyBiZWNhdXNlIGl0IG5lZWRzIHRvIGJlIHdpcGVkIGF0IHN0YXJ0LmApO1xuICAgICAgYXdhaXQgYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOb3QgbGF1bmNoaW5nIEFWRCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgYXdhaXQgYWRiLmxhdW5jaEFWRChhdmQsIHtcbiAgICBhcmdzLFxuICAgIGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBjb3VudHJ5LFxuICAgIGxhdW5jaFRpbWVvdXQsXG4gICAgcmVhZHlUaW1lb3V0LFxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IGFuZCBlbnN1cmUgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZS4gVGhlIGxhbmd1YWdlIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gbG93ZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Miw4fS4gZS5nLiBlbiwgamEgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeSAtIENvdW50cnkuIFRoZSBjb3VudHJ5IChyZWdpb24pIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdXBwZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Mn0gfCBbMC05XXszfS4gZS5nLiBVUywgSlAgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0gez9zdHJpbmd9IHNjcmlwdCAtIFNjcmlwdC4gVGhlIHNjcmlwdCBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdGl0bGUgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17NH0uIGUuZy4gSGFucyBpbiB6aC1IYW5zLUNOIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxlZCB0byBzZXQgbG9jYWxlIHByb3Blcmx5XG4gKi9cbmhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGV2aWNlTG9jYWxlIChhZGIsIGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGlmICghXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgIV8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICBsb2dnZXIud2Fybihgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IHJlcXVpcmVzIGxhbmd1YWdlIG9yIGNvdW50cnkuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEdvdCBsYW5ndWFnZTogJyR7bGFuZ3VhZ2V9JyBhbmQgY291bnRyeTogJyR7Y291bnRyeX0nYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgYWRiLnNldERldmljZUxhbmd1YWdlQ291bnRyeShsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KTtcblxuICBpZiAoIWF3YWl0IGFkYi5lbnN1cmVDdXJyZW50TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHNjcmlwdCA/IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0sIGNvdW50cnk6ICR7Y291bnRyeX0gYW5kIHNjcmlwdDogJHtzY3JpcHR9YCA6IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0gYW5kIGNvdW50cnk6ICR7Y291bnRyeX1gO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNldCAke21lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIChvcHRzID0ge30pIHtcbiAgLy8gd2UgY2FuIGNyZWF0ZSBhIHRocm93YXdheSBBREIgaW5zdGFuY2UgaGVyZSwgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jeVxuICAvLyBvbiBpbnN0YW50aWF0aW5nIG9uIGVhcmxpZXIgKGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbm8gdWRpZClcbiAgLy8gd2UgY2FuIG9ubHkgdXNlIHRoaXMgQURCIG9iamVjdCBmb3IgY29tbWFuZHMgdGhhdCB3b3VsZCBub3QgYmUgY29uZnVzZWRcbiAgLy8gaWYgbXVsdGlwbGUgZGV2aWNlcyBhcmUgY29ubmVjdGVkXG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgbGV0IHVkaWQgPSBvcHRzLnVkaWQ7XG4gIGxldCBlbVBvcnQgPSBudWxsO1xuXG4gIC8vIGEgc3BlY2lmaWMgYXZkIG5hbWUgd2FzIGdpdmVuLiB0cnkgdG8gaW5pdGlhbGl6ZSB3aXRoIHRoYXRcbiAgaWYgKG9wdHMuYXZkKSB7XG4gICAgYXdhaXQgaGVscGVycy5wcmVwYXJlRW11bGF0b3IoYWRiLCBvcHRzKTtcbiAgICB1ZGlkID0gYWRiLmN1ckRldmljZUlkO1xuICAgIGVtUG9ydCA9IGFkYi5lbXVsYXRvclBvcnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gYXZkIGdpdmVuLiBsZXRzIHRyeSB3aGF0ZXZlcidzIHBsdWdnZWQgaW4gZGV2aWNlcy9lbXVsYXRvcnNcbiAgICBsb2dnZXIuaW5mbygnUmV0cmlldmluZyBkZXZpY2UgbGlzdCcpO1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgYWRiLmdldERldmljZXNXaXRoUmV0cnkoKTtcblxuICAgIC8vIHVkaWQgd2FzIGdpdmVuLCBsZXRzIHRyeSB0byBpbml0IHdpdGggdGhhdCBkZXZpY2VcbiAgICBpZiAodWRpZCkge1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKF8ubWFwKGRldmljZXMsICd1ZGlkJyksIHVkaWQpKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBEZXZpY2UgJHt1ZGlkfSB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBkZXZpY2VzYCk7XG4gICAgICB9XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2UgaWYgKG9wdHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICBvcHRzLnBsYXRmb3JtVmVyc2lvbiA9IGAke29wdHMucGxhdGZvcm1WZXJzaW9ufWAudHJpbSgpO1xuXG4gICAgICAvLyBhIHBsYXRmb3JtIHZlcnNpb24gd2FzIGdpdmVuLiBsZXRzIHRyeSB0byBmaW5kIGEgZGV2aWNlIHdpdGggdGhlIHNhbWUgb3NcbiAgICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbiA9IHNlbXZlci5jb2VyY2Uob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHx8IG9wdHMucGxhdGZvcm1WZXJzaW9uO1xuICAgICAgbG9nZ2VyLmluZm8oYExvb2tpbmcgZm9yIGEgZGV2aWNlIHdpdGggQW5kcm9pZCAnJHtwbGF0Zm9ybVZlcnNpb259J2ApO1xuXG4gICAgICAvLyBpbiBjYXNlIHdlIGZhaWwgdG8gZmluZCBzb21ldGhpbmcsIGdpdmUgdGhlIHVzZXIgYSB1c2VmdWwgbG9nIHRoYXQgaGFzXG4gICAgICAvLyB0aGUgZGV2aWNlIHVkaWRzIGFuZCBvcyB2ZXJzaW9ucyBzbyB0aGV5IGtub3cgd2hhdCdzIGF2YWlsYWJsZVxuICAgICAgY29uc3QgYXZhaWxEZXZpY2VzID0gW107XG4gICAgICBsZXQgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0gbnVsbDtcbiAgICAgIC8vIGZpcnN0IHRyeSBzdGFydGVkIGRldmljZXMvZW11bGF0b3JzXG4gICAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICAgIC8vIGRpcmVjdCBhZGIgY2FsbHMgdG8gdGhlIHNwZWNpZmljIGRldmljZVxuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQoZGV2aWNlLnVkaWQpO1xuICAgICAgICBjb25zdCByYXdEZXZpY2VPUyA9IGF3YWl0IGFkYi5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICAgICAgLy8gVGhlIGRldmljZSBPUyBjb3VsZCBlaXRoZXIgYmUgYSBudW1iZXIsIGxpa2UgYDYuMGBcbiAgICAgICAgLy8gb3IgYW4gYWJicmV2aWF0aW9uLCBsaWtlIGBSYFxuICAgICAgICBhdmFpbERldmljZXMucHVzaChgJHtkZXZpY2UudWRpZH0gKCR7cmF3RGV2aWNlT1N9KWApO1xuICAgICAgICBjb25zdCBkZXZpY2VPUyA9IHNlbXZlci5jb2VyY2UocmF3RGV2aWNlT1MpIHx8IHJhd0RldmljZU9TO1xuICAgICAgICBpZiAoIWRldmljZU9TKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgPSBzZW12ZXIudmFsaWQoZGV2aWNlT1MpICYmIHNlbXZlci52YWxpZChwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzID0gXy5pc1N0cmluZyhkZXZpY2VPUykgJiYgXy5pc1N0cmluZyhwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBpZiAoYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkICYmIGRldmljZU9TLnZlcnNpb24gPT09IHBsYXRmb3JtVmVyc2lvbi52ZXJzaW9uXG4gICAgICAgICAgICB8fCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzICYmIF8udG9Mb3dlcihkZXZpY2VPUykgPT09IF8udG9Mb3dlcihwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgICAgICAgLy8gR290IGFuIGV4YWN0IG1hdGNoIC0gcHJvY2VlZCBpbW1lZGlhdGVseVxuICAgICAgICAgIHVkaWQgPSBkZXZpY2UudWRpZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICghYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8gY2hlY2sgZm9yIHBhcnRpYWwgbWF0Y2ggaWYgZWl0aGVyIG9mIHZlcnNpb24gbnVtYmVycyBpcyBub3QgY29lcmNpYmxlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCFfLmluY2x1ZGVzKG9wdHMucGxhdGZvcm1WZXJzaW9uLCAnLicpICYmIHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3JcbiAgICAgICAgICAgIHx8IHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3IgJiYgcGxhdGZvcm1WZXJzaW9uLm1pbm9yID09PSBkZXZpY2VPUy5taW5vcilcbiAgICAgICAgICAgIC8vIEdvdCBhIHBhcnRpYWwgbWF0Y2ggLSBtYWtlIHN1cmUgd2UgY29uc2lkZXIgdGhlIG1vc3QgcmVjZW50XG4gICAgICAgICAgICAvLyBkZXZpY2UgdmVyc2lvbiBhdmFpbGFibGUgb24gdGhlIGhvc3Qgc3lzdGVtXG4gICAgICAgICAgICAmJiAocGFydGlhbE1hdGNoQ2FuZGlkYXRlICYmIHNlbXZlci5ndChkZXZpY2VPUywgXy52YWx1ZXMocGFydGlhbE1hdGNoQ2FuZGlkYXRlKVswXSlcbiAgICAgICAgICAgICAgICB8fCAhcGFydGlhbE1hdGNoQ2FuZGlkYXRlKSkge1xuICAgICAgICAgIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSA9IHtbZGV2aWNlLnVkaWRdOiBkZXZpY2VPU307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdWRpZCAmJiBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpIHtcbiAgICAgICAgdWRpZCA9IF8ua2V5cyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdO1xuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdWRpZCkge1xuICAgICAgICAvLyB3ZSBjb3VsZG4ndCBmaW5kIGFueXRoaW5nISBxdWl0XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBVbmFibGUgdG8gZmluZCBhbiBhY3RpdmUgZGV2aWNlIG9yIGVtdWxhdG9yIGAgK1xuICAgICAgICAgIGB3aXRoIE9TICR7b3B0cy5wbGF0Zm9ybVZlcnNpb259LiBUaGUgZm9sbG93aW5nIGFyZSBhdmFpbGFibGU6IGAgK1xuICAgICAgICAgIGF2YWlsRGV2aWNlcy5qb2luKCcsICcpKTtcbiAgICAgIH1cblxuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGEgdWRpZCB3YXMgbm90IGdpdmVuLCBncmFiIHRoZSBmaXJzdCBkZXZpY2Ugd2Ugc2VlXG4gICAgICB1ZGlkID0gZGV2aWNlc1swXS51ZGlkO1xuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmluZm8oYFVzaW5nIGRldmljZTogJHt1ZGlkfWApO1xuICByZXR1cm4ge3VkaWQsIGVtUG9ydH07XG59O1xuXG4vLyByZXR1cm5zIGEgbmV3IGFkYiBpbnN0YW5jZSB3aXRoIGRldmljZUlkIHNldFxuaGVscGVycy5jcmVhdGVBREIgPSBhc3luYyBmdW5jdGlvbiBjcmVhdGVBREIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7dWRpZCwgZW1Qb3J0fSA9IG9wdHM7XG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgYWRiLnNldERldmljZUlkKHVkaWQpO1xuICBpZiAoZW1Qb3J0KSB7XG4gICAgYWRiLnNldEVtdWxhdG9yUG9ydChlbVBvcnQpO1xuICB9XG5cbiAgcmV0dXJuIGFkYjtcbn07XG5cbmhlbHBlcnMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMgKG9wdHMpIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydhcHBQYWNrYWdlJywgJ2FwcEFjdGl2aXR5JywgJ2FwcFdhaXRQYWNrYWdlJywgJ2FwcFdhaXRBY3Rpdml0eSddKSB7XG4gICAgY29uc3QgbmFtZSA9IG9wdHNba2V5XTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gLyhbXlxcdy4qLF0pKy8uZXhlYyhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybihgQ2FwYWJpbGl0eSAnJHtrZXl9JyBpcyBleHBlY3RlZCB0byBvbmx5IGluY2x1ZGUgbGF0aW4gbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlLCBkb3QsIGNvbW1hIGFuZCBhc3RlcmlzayBjaGFyYWN0ZXJzLmApO1xuICAgIGxvZ2dlci53YXJuKGBDdXJyZW50IHZhbHVlICcke25hbWV9JyBoYXMgbm9uLW1hdGNoaW5nIGNoYXJhY3RlciBhdCBpbmRleCAke21hdGNoLmluZGV4fTogJyR7bmFtZS5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXggKyAxKX0nYCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0TGF1bmNoSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldExhdW5jaEluZm8gKGFkYiwgb3B0cykge1xuICBsZXQge2FwcCwgYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHl9ID0gb3B0cztcbiAgaWYgKCFhcHApIHtcbiAgICBsb2dnZXIud2FybignTm8gYXBwIHNlbnQgaW4sIG5vdCBwYXJzaW5nIHBhY2thZ2UvYWN0aXZpdHknKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMob3B0cyk7XG5cbiAgaWYgKGFwcFBhY2thZ2UgJiYgYXBwQWN0aXZpdHkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1BhcnNpbmcgcGFja2FnZSBhbmQgYWN0aXZpdHkgZnJvbSBhcHAgbWFuaWZlc3QnKTtcbiAgbGV0IHthcGtQYWNrYWdlLCBhcGtBY3Rpdml0eX0gPVxuICAgIGF3YWl0IGFkYi5wYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QoYXBwKTtcbiAgaWYgKGFwa1BhY2thZ2UgJiYgIWFwcFBhY2thZ2UpIHtcbiAgICBhcHBQYWNrYWdlID0gYXBrUGFja2FnZTtcbiAgfVxuICBpZiAoIWFwcFdhaXRQYWNrYWdlKSB7XG4gICAgYXBwV2FpdFBhY2thZ2UgPSBhcHBQYWNrYWdlO1xuICB9XG4gIGlmIChhcGtBY3Rpdml0eSAmJiAhYXBwQWN0aXZpdHkpIHtcbiAgICBhcHBBY3Rpdml0eSA9IGFwa0FjdGl2aXR5O1xuICB9XG4gIGlmICghYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgYXBwV2FpdEFjdGl2aXR5ID0gYXBwQWN0aXZpdHk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlOiAke2Fwa1BhY2thZ2V9LyR7YXBrQWN0aXZpdHl9YCk7XG4gIHJldHVybiB7YXBwUGFja2FnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0QWN0aXZpdHl9O1xufTtcblxuaGVscGVycy5yZXNldEFwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0QXBwIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGFwcFBhY2thZ2UsXG4gICAgZmFzdFJlc2V0LFxuICAgIGZ1bGxSZXNldCxcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVF9NUyxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlc1xuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcFBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwUGFja2FnZScgb3B0aW9uIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgY29uc3QgaXNJbnN0YWxsZWQgPSBhd2FpdCBhZGIuaXNBcHBJbnN0YWxsZWQoYXBwUGFja2FnZSk7XG5cbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFkYi5mb3JjZVN0b3AoYXBwUGFja2FnZSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIC8vIGZ1bGxSZXNldCBoYXMgcHJpb3JpdHkgb3ZlciBmYXN0UmVzZXRcbiAgICBpZiAoIWZ1bGxSZXNldCAmJiBmYXN0UmVzZXQpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5jbGVhcihhcHBQYWNrYWdlKTtcbiAgICAgIGlmIChfLmlzU3RyaW5nKG91dHB1dCkgJiYgb3V0cHV0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZhaWxlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNsZWFyIHRoZSBhcHBsaWNhdGlvbiBkYXRhIG9mICcke2FwcFBhY2thZ2V9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7b3V0cHV0fWApO1xuICAgICAgfVxuICAgICAgLy8gZXhlY3V0aW5nIGBzaGVsbCBwbSBjbGVhcmAgcmVzZXRzIHByZXZpb3VzbHkgYXNzaWduZWQgYXBwbGljYXRpb24gcGVybWlzc2lvbnMgYXMgd2VsbFxuICAgICAgaWYgKGF1dG9HcmFudFBlcm1pc3Npb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYWRiLmdyYW50QWxsUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBVbmFibGUgdG8gZ3JhbnQgcGVybWlzc2lvbnMgcmVxdWVzdGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoYFBlcmZvcm1lZCBmYXN0IHJlc2V0IG9uIHRoZSBpbnN0YWxsZWQgJyR7YXBwUGFja2FnZX0nIGFwcGxpY2F0aW9uIChzdG9wIGFuZCBjbGVhcilgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWFwcCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWl0aGVyIHByb3ZpZGUgJ2FwcCcgb3B0aW9uIHRvIGluc3RhbGwgJyR7YXBwUGFja2FnZX0nIG9yIGAgK1xuICAgICAgYGNvbnNpZGVyIHNldHRpbmcgJ25vUmVzZXQnIHRvICd0cnVlJyBpZiAnJHthcHBQYWNrYWdlfScgaXMgc3VwcG9zZWQgdG8gYmUgcHJlaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBSdW5uaW5nIGZ1bGwgcmVzZXQgb24gJyR7YXBwUGFja2FnZX0nIChyZWluc3RhbGwpYCk7XG4gIGlmIChpc0luc3RhbGxlZCkge1xuICAgIGF3YWl0IGFkYi51bmluc3RhbGxBcGsoYXBwUGFja2FnZSk7XG4gIH1cbiAgYXdhaXQgYWRiLmluc3RhbGwoYXBwLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICB9KTtcbn07XG5cbmhlbHBlcnMuaW5zdGFsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGsgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUX01TLFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcCB8fCAhYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHAnIGFuZCAnYXBwUGFja2FnZScgb3B0aW9ucyBhcmUgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoZnVsbFJlc2V0KSB7XG4gICAgYXdhaXQgdGhpcy5yZXNldEFwcChhZGIsIG9wdHMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBhcHBTdGF0ZSxcbiAgICB3YXNVbmluc3RhbGxlZFxuICB9ID0gYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBwLCBhcHBQYWNrYWdlLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VDdXJyZW50QnVpbGQ6IGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9KTtcblxuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IHRoZSBuZXdseSBpbnN0YWxsZWQgYXBwXG4gIGNvbnN0IGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwID0gIXdhc1VuaW5zdGFsbGVkXG4gICAgJiYgYXBwU3RhdGUgIT09IGFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICBpZiAoZmFzdFJlc2V0ICYmIGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwKSB7XG4gICAgbG9nZ2VyLmluZm8oYFBlcmZvcm1pbmcgZmFzdCByZXNldCBvbiAnJHthcHBQYWNrYWdlfSdgKTtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdGFsbHMgYW4gYXJyYXkgb2YgYXBrc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0cyBkZWZpbmVkIGluIGRyaXZlci5qc1xuICovXG5oZWxwZXJzLmluc3RhbGxPdGhlckFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsT3RoZXJBcGtzIChvdGhlckFwcHMsIGFkYiwgb3B0cykge1xuICBsZXQge1xuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUX01TLFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIC8vIEluc3RhbGwgYWxsIG9mIHRoZSBBUEsncyBhc3luY2hyb25vdXNseVxuICBhd2FpdCBCLmFsbChvdGhlckFwcHMubWFwKChvdGhlckFwcCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgSW5zdGFsbGluZyBhcHA6ICR7b3RoZXJBcHB9YCk7XG4gICAgcmV0dXJuIGFkYi5pbnN0YWxsT3JVcGdyYWRlKG90aGVyQXBwLCBudWxsLCB7XG4gICAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIH0pO1xuICB9KSk7XG59O1xuXG4vKipcbiAqIFVuaW5zdGFsbCBhbiBhcnJheSBvZiBwYWNrYWdlc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcHBQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlIG5hbWVzIHRvIHVuaW5zdGFsbC4gSWYgdGhpcyBpbmNsdWRlcyBgJyonYCwgdW5pbnN0YWxsIGFsbCBvZiAzcmQgcGFydHkgYXBwc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlcyBkb2VzIG5vdCB1bmluc3RhbGwgd2hlbiBgKmAgaXMgcHJvdmlkZWQgYXMgYGFwcFBhY2thZ2VzYFxuICovXG5oZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGxPdGhlclBhY2thZ2VzIChhZGIsIGFwcFBhY2thZ2VzLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIGlmIChhcHBQYWNrYWdlcy5pbmNsdWRlcygnKicpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdVbmluc3RhbGwgdGhpcmQgcGFydHkgcGFja2FnZXMnKTtcbiAgICBhcHBQYWNrYWdlcyA9IGF3YWl0IHRoaXMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzKGFkYiwgZmlsdGVyUGFja2FnZXMpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBVbmluc3RhbGxpbmcgcGFja2FnZXM6ICR7YXBwUGFja2FnZXN9YCk7XG4gIGF3YWl0IEIuYWxsKGFwcFBhY2thZ2VzLm1hcCgoYXBwUGFja2FnZSkgPT4gYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKSkpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhpcmQgcGFydHkgcGFja2FnZXMgZmlsdGVyZWQgd2l0aCBgZmlsdGVyUGFja2FnZXNgXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXkgb2YgaW5zdGFsbGVkIHRoaXJkIHBhcnkgcGFja2FnZXNcbiAqL1xuaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRUaGlyZFBhcnR5UGFja2FnZXMgKGFkYiwgZmlsdGVyUGFja2FnZXMgPSBbXSkge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VzU3RyaW5nID0gYXdhaXQgYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsICctMyddKTtcbiAgICBjb25zdCBhcHBQYWNrYWdlc0FycmF5ID0gcGFja2FnZXNTdHJpbmcudHJpbSgpLnJlcGxhY2UoL3BhY2thZ2U6L2csICcnKS5zcGxpdChFT0wpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJyR7YXBwUGFja2FnZXNBcnJheX0nIGZpbHRlcmVkIHdpdGggJyR7ZmlsdGVyUGFja2FnZXN9J2ApO1xuICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXBwUGFja2FnZXNBcnJheSwgZmlsdGVyUGFja2FnZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIGdldCBwYWNrYWdlcyB3aXRoICdhZGIgc2hlbGwgcG0gbGlzdCBwYWNrYWdlcyAtMyc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5oZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBpbml0VW5pY29kZUtleWJvYXJkIChhZGIpIHtcbiAgbG9nZ2VyLmRlYnVnKCdFbmFibGluZyBVbmljb2RlIGtleWJvYXJkIHN1cHBvcnQnKTtcblxuICAvLyBnZXQgdGhlIGRlZmF1bHQgSU1FIHNvIHdlIGNhbiByZXR1cm4gYmFjayB0byBpdCBsYXRlciBpZiB3ZSB3YW50XG4gIGxldCBkZWZhdWx0SU1FID0gYXdhaXQgYWRiLmRlZmF1bHRJTUUoKTtcblxuICBsb2dnZXIuZGVidWcoYFVuc2V0dGluZyBwcmV2aW91cyBJTUUgJHtkZWZhdWx0SU1FfWApO1xuICBjb25zdCBhcHBpdW1JTUUgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8uVW5pY29kZUlNRWA7XG4gIGxvZ2dlci5kZWJ1ZyhgU2V0dGluZyBJTUUgdG8gJyR7YXBwaXVtSU1FfSdgKTtcbiAgYXdhaXQgYWRiLmVuYWJsZUlNRShhcHBpdW1JTUUpO1xuICBhd2FpdCBhZGIuc2V0SU1FKGFwcGl1bUlNRSk7XG4gIHJldHVybiBkZWZhdWx0SU1FO1xufTtcblxuaGVscGVycy5zZXRNb2NrTG9jYXRpb25BcHAgPSBhc3luYyBmdW5jdGlvbiBzZXRNb2NrTG9jYXRpb25BcHAgKGFkYiwgYXBwKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcxJ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgYXBwLCAnYW5kcm9pZDptb2NrX2xvY2F0aW9uJywgJ2FsbG93J10pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzZXQgbW9jayBsb2NhdGlvbiBmb3IgYXBwICcke2FwcH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGxldCBwa2dJZHMgPSBbXTtcbiAgICBpZiAoYXdhaXQgYWRiLmZpbGVFeGlzdHMoTU9DS19BUFBfSURTX1NUT1JFKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGtnSWRzID0gSlNPTi5wYXJzZShhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCBNT0NLX0FQUF9JRFNfU1RPUkVdKSk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIGlmIChwa2dJZHMuaW5jbHVkZXMoYXBwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwa2dJZHMucHVzaChhcHApO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5wb3NpeC5qb2luKHRtcFJvb3QsIHBhdGgucG9zaXguYmFzZW5hbWUoTU9DS19BUFBfSURTX1NUT1JFKSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShzcmNQYXRoLCBKU09OLnN0cmluZ2lmeShwa2dJZHMpLCAndXRmOCcpO1xuICAgICAgYXdhaXQgYWRiLnB1c2goc3JjUGF0aCwgTU9DS19BUFBfSURTX1NUT1JFKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcGVyc2lzdCBtb2NrIGxvY2F0aW9uIGFwcCBpZCAnJHthcHB9JzogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMucmVzZXRNb2NrTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiByZXNldE1vY2tMb2NhdGlvbiAoYWRiKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcwJ10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRoaXJkUGFydHlQa2dJZHNQcm9taXNlID0gaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiKTtcbiAgICBsZXQgcGtnSWRzID0gW107XG4gICAgaWYgKGF3YWl0IGFkYi5maWxlRXhpc3RzKE1PQ0tfQVBQX0lEU19TVE9SRSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBrZ0lkcyA9IEpTT04ucGFyc2UoYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgTU9DS19BUFBfSURTX1NUT1JFXSkpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICBjb25zdCB0aGlyZFBhcnR5UGtnSWRzID0gYXdhaXQgdGhpcmRQYXJ0eVBrZ0lkc1Byb21pc2U7XG4gICAgLy8gT25seSBpbmNsdWRlIGN1cnJlbnRseSBpbnN0YWxsZWQgcGFja2FnZXNcbiAgICBjb25zdCByZXN1bHRQa2dzID0gXy5pbnRlcnNlY3Rpb24ocGtnSWRzLCB0aGlyZFBhcnR5UGtnSWRzKTtcbiAgICBpZiAoXy5zaXplKHJlc3VsdFBrZ3MpIDw9IDEpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCByZXN1bHRQa2dzWzBdID8/IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnZGVueSddKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFJlc2V0dGluZyBtb2NrX2xvY2F0aW9uIHBlcm1pc3Npb24gZm9yIHRoZSBmb2xsb3dpbmcgYXBwczogJHtyZXN1bHRQa2dzfWApO1xuICAgIGF3YWl0IEIuYWxsKHJlc3VsdFBrZ3MubWFwKChwa2dJZCkgPT4gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBwa2dJZCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdkZW55J10pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH0pKCkpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZXNldCBtb2NrIGxvY2F0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSGVscGVyQXBwIChhZGIsIGFwa1BhdGgsIHBhY2thZ2VJZCkge1xuICAvLyBTb21ldGltZXMgYWRiIHB1c2ggb3IgYWRiIGluc3RhbCB0YWtlIG1vcmUgdGltZSB0aGFuIGV4cGVjdGVkIHRvIGluc3RhbGwgYW4gYXBwXG4gIC8vIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MvaXNzdWVzLzQwI2lzc3VlY29tbWVudC00NzY1OTMxNzRcbiAgYXdhaXQgcmV0cnlJbnRlcnZhbChIRUxQRVJfQVBQX0lOU1RBTExfUkVUUklFUywgSEVMUEVSX0FQUF9JTlNUQUxMX1JFVFJZX0RFTEFZX01TLFxuICAgIGFzeW5jIGZ1bmN0aW9uIHJldHJ5SW5zdGFsbEhlbHBlckFwcCAoKSB7XG4gICAgICBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcGtQYXRoLCBwYWNrYWdlSWQsIHtncmFudFBlcm1pc3Npb25zOiB0cnVlfSk7XG4gICAgfVxuICApO1xufTtcblxuLyoqXG4gKiBQdXNoZXMgYW5kIGluc3RhbGxzIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNldHRpbmcgYXBwIGlzIHJlcXVpcmVkXG4gKlxuICogQHBhcmFtIHtBZGJ9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHBhcmFtIHtib29sZWFufSB0aHJvd0Vycm9yIFtmYWxzZV0gLSBXaGV0aGVyIHRocm93IGFuIGVycm9yIGlmIFNldHRpbmdzIGFwcCBmYWlscyB0byBzdGFydFxuICogQHRocm93cyB7RXJyb3J9IElmIHRocm93RXJyb3IgaXMgdHJ1ZSBhbmQgc29tZXRoaW5nIGhhcHBlbnMgaW4gaW5zdGFsbGF0aW9uIHN0ZXBcbiAqL1xuaGVscGVycy5wdXNoU2V0dGluZ3NBcHAgPSBhc3luYyBmdW5jdGlvbiBwdXNoU2V0dGluZ3NBcHAgKGFkYiwgdGhyb3dFcnJvciA9IGZhbHNlLCBvcHRzID0ge30pIHtcbiAgbG9nZ2VyLmRlYnVnKCdQdXNoaW5nIHNldHRpbmdzIGFwayB0byBkZXZpY2UuLi4nKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEhlbHBlckFwcChhZGIsIHNldHRpbmdzQXBrUGF0aCwgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgdGhyb3dFcnJvcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0aHJvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYElnbm9yZWQgZXJyb3Igd2hpbGUgaW5zdGFsbGluZyAnJHtzZXR0aW5nc0Fwa1BhdGh9JzogYCArXG4gICAgICAgICAgICAgICAgYCcke2Vyci5tZXNzYWdlfScuIEZlYXR1cmVzIHRoYXQgcmVseSBvbiB0aGlzIGhlbHBlciBgICtcbiAgICAgICAgICAgICAgICAncmVxdWlyZSB0aGUgYXBrIHN1Y2ggYXMgdG9nZ2xlIFdpRmkgYW5kIGdldHRpbmcgbG9jYXRpb24gJyArXG4gICAgICAgICAgICAgICAgJ3dpbGwgcmFpc2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byB1c2UgdGhlbS4nKTtcbiAgfVxuXG4gIC8vIFJlaW5zdGFsbCB3b3VsZCBzdG9wIHRoZSBzZXR0aW5ncyBoZWxwZXIgcHJvY2VzcyBhbnl3YXksIHNvXG4gIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHJ1bm5pbmdcbiAgaWYgKGF3YWl0IGFkYi5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9IGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdHMgcGVybWlzc2lvbnMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsID49IDI5KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MjaW50ZXJuYWwtYXVkaW8tLXZpZGVvLXJlY29yZGluZ1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgJ1BST0pFQ1RfTUVESUEnLCAnYWxsb3cnXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDw9IDIzKSB7IC8vIEFuZHJvaWQgNi0gZGV2aWNlcyBzaG91bGQgaGF2ZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgY29uc3QgcGVybXMgPSBbJ1NFVF9BTklNQVRJT05fU0NBTEUnLCAnQ0hBTkdFX0NPTkZJR1VSQVRJT04nLCAnQUNDRVNTX0ZJTkVfTE9DQVRJT04nXTtcbiAgICBsb2dnZXIuaW5mbyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtwZXJtc30gdG8gJyR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0nYCk7XG4gICAgYXdhaXQgYWRiLmdyYW50UGVybWlzc2lvbnMoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgcGVybXMubWFwKCh4KSA9PiBgYW5kcm9pZC5wZXJtaXNzaW9uLiR7eH1gKSk7XG4gIH1cblxuICAvLyBsYXVuY2ggaW8uYXBwaXVtLnNldHRpbmdzIGFwcCBkdWUgdG8gc2V0dGluZ3MgZmFpbGluZyB0byBiZSBzZXRcbiAgLy8gaWYgdGhlIGFwcCBpcyBub3QgbGF1bmNoZWQgcHJpb3IgdG8gc3RhcnQgdGhlIHNlc3Npb24gb24gYW5kcm9pZCA3K1xuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzg5NTdcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCh7XG4gICAgICB0aW1lb3V0OiBoZWxwZXJzLmlzRW11bGF0b3IoYWRiLCBvcHRzKSA/IDMwMDAwIDogNTAwMFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBzdHJpbmcueG1sIGFuZCBjb252ZXJ0cyBpdCB0byBzdHJpbmcuanNvbiBhbmQgcHVzaGVzXG4gKiBpdCB0byAvZGF0YS9sb2NhbC90bXAvc3RyaW5nLmpzb24gb24gZm9yIHVzZSBvZiBib290c3RyYXBcbiAqIElmIGFwcCBpcyBub3QgcHJlc2VudCB0byBleHRyYWN0IHN0cmluZy54bWwgaXQgZGVsZXRlcyByZW1vdGUgc3RyaW5ncy5qc29uXG4gKiBJZiBhcHAgZG9lcyBub3QgaGF2ZSBzdHJpbmdzLnhtbCB3ZSBwdXNoIGFuIGVtcHR5IGpzb24gb2JqZWN0IHRvIHJlbW90ZVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZSBhYmJyZXZpYXRpb24sIGZvciBleGFtcGxlICdmcicuIFRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gKiBpcyB1c2VkIGlmIHRoaXMgYXJndW1lbnQgaXMgbm90IGRlZmluZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIERyaXZlciBvcHRpb25zIGRpY3Rpb25hcnkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGljdGlvbmFyeSwgd2hlcmUgc3RyaW5nIHJlc291cmNlIGlkZW50aWZpZXJzIGFyZSBrZXlzXG4gKiBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2Ugb3IgYW4gZW1wdHkgb2JqZWN0XG4gKiBpZiBubyBtYXRjaGluZyByZXNvdXJjZXMgd2VyZSBleHRyYWN0ZWQuXG4gKi9cbmhlbHBlcnMucHVzaFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBwdXNoU3RyaW5ncyAobGFuZ3VhZ2UsIGFkYiwgb3B0cykge1xuICBjb25zdCByZW1vdGVEaXIgPSAnL2RhdGEvbG9jYWwvdG1wJztcbiAgY29uc3Qgc3RyaW5nc0pzb24gPSAnc3RyaW5ncy5qc29uJztcbiAgY29uc3QgcmVtb3RlRmlsZSA9IHBhdGgucG9zaXgucmVzb2x2ZShyZW1vdGVEaXIsIHN0cmluZ3NKc29uKTtcblxuICAvLyBjbGVhbiB1cCByZW1vdGUgc3RyaW5nLmpzb24gaWYgcHJlc2VudFxuICBhd2FpdCBhZGIucmltcmFmKHJlbW90ZUZpbGUpO1xuXG4gIGxldCBhcHA7XG4gIHRyeSB7XG4gICAgYXBwID0gb3B0cy5hcHAgfHwgYXdhaXQgYWRiLnB1bGxBcGsob3B0cy5hcHBQYWNrYWdlLCBvcHRzLnRtcERpcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5pbmZvKGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHtvcHRzLmFwcFBhY2thZ2V9JyB0byAnJHtvcHRzLnRtcERpcn0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkob3B0cy5hcHBQYWNrYWdlKSB8fCAhKGF3YWl0IGZzLmV4aXN0cyhhcHApKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgTm8gYXBwIG9yIHBhY2thZ2Ugc3BlY2lmaWVkLiBSZXR1cm5pbmcgZW1wdHkgc3RyaW5nc2ApO1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ3NUbXBEaXIgPSBwYXRoLnJlc29sdmUob3B0cy50bXBEaXIsIG9wdHMuYXBwUGFja2FnZSk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBhcGsnLCBhcHAsIGxhbmd1YWdlLCBzdHJpbmdzVG1wRGlyKTtcbiAgICBjb25zdCB7YXBrU3RyaW5ncywgbG9jYWxQYXRofSA9IGF3YWl0IGFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgYXdhaXQgYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVEaXIpO1xuICAgIHJldHVybiBhcGtTdHJpbmdzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgQ291bGQgbm90IGdldCBzdHJpbmdzLCBjb250aW51aW5nIGFueXdheS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKCdlY2hvJywgW2Ane30nID4gJHtyZW1vdGVGaWxlfWBdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoc3RyaW5nc1RtcERpcik7XG4gIH1cbiAgcmV0dXJuIHt9O1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdTY3JlZW4gaXMgbG9ja2VkLCB0cnlpbmcgdG8gdW5sb2NrJyk7XG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIuaW5mbyhgTmVpdGhlciAndW5sb2NrVHlwZScgbm9yICd1bmxvY2tLZXknIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQuIGAgK1xuICAgICAgYEFzc3VtaW5nIHRoZSBkZXZpY2UgaXMgbG9ja2VkIHdpdGggYSBzaW1wbGUgbG9jayBzY3JlZW4uYCk7XG4gICAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZGV2aWNlIHdha2UgdXAgb25seSBmb3IgYW4gZW11bGF0b3IuXG4gICAgICAvLyBJdCB0YWtlcyAxIHNlY29uZCBvciBzbyBldmVuIHdoZW4gdGhlIGRldmljZSBpcyBhbHJlYWR5IGF3YWtlIGluIGEgcmVhbCBkZXZpY2UuXG4gICAgICBhd2FpdCBhZGIud2FpdEZvckRldmljZSgpO1xuICAgIH1cbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvciwgb3B0cyk7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpKSB7XG4gICAgaWYgKG1vY2tMb2NhdGlvbkFwcCB8fCBfLmlzVW5kZWZpbmVkKG1vY2tMb2NhdGlvbkFwcCkpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0TW9ja0xvY2F0aW9uKGFkYik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android-helpers.js","names":["_lodash","_interopRequireDefault","require","_path","_asyncbox","_logger","_support","_ioAppium","_bootstrap","_bluebird","_appiumAdb","_unlockHelpers","_interopRequireWildcard","_os","_semver","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT_MS","HELPER_APP_INSTALL_RETRIES","HELPER_APP_INSTALL_RETRY_DELAY_MS","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","SETTINGS_HELPER_PKG_ID","exports","EMULATOR_PATTERN","APP_STATE","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retryInterval","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlock","driver","capabilities","isScreenLocked","unlockKey","dismissKeyguard","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap","_default"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retryInterval, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from '@appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT_MS = 90000;\nconst HELPER_APP_INSTALL_RETRIES = 3;\nconst HELPER_APP_INSTALL_RETRY_DELAY_MS = 5000;\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT_MS,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(`Either provide 'app' option to install '${appPackage}' or ` +\n `consider setting 'noReset' to 'true' if '${appPackage}' is supposed to be preinstalled.`);\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT_MS,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT_MS,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.push(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retryInterval(HELPER_APP_INSTALL_RETRIES, HELPER_APP_INSTALL_RETRY_DELAY_MS,\n async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n }\n );\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n\n logger.debug('Screen is locked, trying to unlock');\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.info(`Neither 'unlockType' nor 'unlockKey' capability is provided. ` +\n `Assuming the device is locked with a simple lock screen.`);\n await adb.dismissKeyguard();\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n await adb.waitForDevice();\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"android-helpers.js","names":["_lodash","_interopRequireDefault","require","_path","_asyncbox","_logger","_support","_ioAppium","_bootstrap","_bluebird","_appiumAdb","_unlockHelpers","_interopRequireWildcard","_os","_semver","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT_MS","HELPER_APP_INSTALL_RETRIES","HELPER_APP_INSTALL_RETRY_DELAY_MS","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","SETTINGS_HELPER_PKG_ID","exports","EMULATOR_PATTERN","APP_STATE","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retryInterval","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlock","driver","capabilities","isScreenLocked","unlockKey","dismissKeyguard","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap","_default"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retryInterval, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from '@appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT_MS = 90000;\nconst HELPER_APP_INSTALL_RETRIES = 3;\nconst HELPER_APP_INSTALL_RETRY_DELAY_MS = 5000;\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT_MS,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(`Either provide 'app' option to install '${appPackage}' or ` +\n `consider setting 'noReset' to 'true' if '${appPackage}' is supposed to be preinstalled.`);\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT_MS,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT_MS,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.push(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retryInterval(HELPER_APP_INSTALL_RETRIES, HELPER_APP_INSTALL_RETRY_DELAY_MS,\n async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n }\n );\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n\n logger.debug('Screen is locked, trying to unlock');\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.info(`Neither 'unlockType' nor 'unlockKey' capability is provided. ` +\n `Assuming the device is locked with a simple lock screen.`);\n await adb.dismissKeyguard();\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n if (helpers.isEmulator(adb, opts)) {\n // Check if the device wake up only for an emulator.\n // It takes 1 second or so even when the device is already awake in a real device.\n await adb.waitForDevice();\n }\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":"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"}
|
package/lib/android-helpers.js
CHANGED
|
@@ -797,7 +797,11 @@ helpers.initDevice = async function initDevice (adb, opts) {
|
|
|
797
797
|
if (skipDeviceInitialization) {
|
|
798
798
|
logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);
|
|
799
799
|
} else {
|
|
800
|
-
|
|
800
|
+
if (helpers.isEmulator(adb, opts)) {
|
|
801
|
+
// Check if the device wake up only for an emulator.
|
|
802
|
+
// It takes 1 second or so even when the device is already awake in a real device.
|
|
803
|
+
await adb.waitForDevice();
|
|
804
|
+
}
|
|
801
805
|
// pushSettingsApp required before calling ensureDeviceLocale for API Level 24+
|
|
802
806
|
|
|
803
807
|
// Some feature such as location/wifi are not necessary for all users,
|