appium-uiautomator2-driver 2.1.2 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,13 +11,13 @@ require("source-map-support/register");
11
11
 
12
12
  var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
- var _baseDriver = require("@appium/base-driver");
14
+ var _driver = require("appium/driver");
15
15
 
16
16
  var _asyncbox = require("asyncbox");
17
17
 
18
18
  var _appiumUiautomator2Server = require("appium-uiautomator2-server");
19
19
 
20
- var _support = require("@appium/support");
20
+ var _support = require("appium/support");
21
21
 
22
22
  var _bluebird = _interopRequireDefault(require("bluebird"));
23
23
 
@@ -40,10 +40,10 @@ exports.INSTRUMENTATION_TARGET = INSTRUMENTATION_TARGET;
40
40
 
41
41
  const instrumentationLogger = _support.logger.getLogger('Instrumentation');
42
42
 
43
- class UIA2Proxy extends _baseDriver.JWProxy {
43
+ class UIA2Proxy extends _driver.JWProxy {
44
44
  async proxyCommand(url, method, body = null) {
45
45
  if (this.didInstrumentationExit) {
46
- throw new _baseDriver.errors.InvalidContextError(`'${method} ${url}' cannot be proxied to UiAutomator2 server because ` + 'the instrumentation process is not running (probably crashed). ' + 'Check the server log and/or the logcat output for more details');
46
+ throw new _driver.errors.InvalidContextError(`'${method} ${url}' cannot be proxied to UiAutomator2 server because ` + 'the instrumentation process is not running (probably crashed). ' + 'Check the server log and/or the logcat output for more details');
47
47
  }
48
48
 
49
49
  return await super.proxyCommand(url, method, body);
@@ -378,4 +378,4 @@ var _default = UiAutomator2Server;
378
378
  exports.default = _default;require('source-map-support').install();
379
379
 
380
380
 
381
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3VpYXV0b21hdG9yMi5qcyIsIm5hbWVzIjpbIlJFUURfUEFSQU1TIiwiU0VSVkVSX0xBVU5DSF9USU1FT1VUIiwiU0VSVkVSX0lOU1RBTExfUkVUUklFUyIsIlNFUlZJQ0VTX0xBVU5DSF9USU1FT1VUIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIiwiSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCIsImluc3RydW1lbnRhdGlvbkxvZ2dlciIsImxvZ2dlciIsImdldExvZ2dlciIsIlVJQTJQcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCIsImVycm9ycyIsIkludmFsaWRDb250ZXh0RXJyb3IiLCJVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJjb25zdHJ1Y3RvciIsImxvZyIsIm9wdHMiLCJyZXEiLCJ1dGlsIiwiaGFzVmFsdWUiLCJFcnJvciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlPcHRzIiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJzeXN0ZW1Qb3J0Iiwia2VlcEFsaXZlIiwicmVhZFRpbWVvdXQiLCJ0aW1lb3V0Iiwiandwcm94eSIsInByb3h5UmVxUmVzIiwiYmluZCIsImNvbW1hbmQiLCJpbnN0YWxsU2VydmVyQXBrIiwiaW5zdGFsbFRpbWVvdXQiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJwYWNrYWdlSW5mb3NNYXBwZXIiLCJhcHBQYXRoIiwiYXBwSWQiLCJoZWxwZXJzIiwiaXNXcml0ZWFibGUiLCJpbmZvIiwiZHN0UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiYmFzZW5hbWUiLCJmcyIsImNvcHlGaWxlIiwicGFja2FnZXNJbmZvIiwiQiIsImFsbCIsIm1hcCIsImFwa1BhdGgiLCJ0ZXN0QXBrUGF0aCIsInNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIiwic2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzIiwiaXNBcHBJbnN0YWxsZWQiLCJhZGIiLCJjaGVja0Fwa0NlcnQiLCJzaWduQXBwIiwiYXBwU3RhdGUiLCJnZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZSIsImRlYnVnIiwiQVBQX0lOU1RBTExfU1RBVEUiLCJPTERFUl9WRVJTSU9OX0lOU1RBTExFRCIsIk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVEIiwiaW5jbHVkZXMiLCJOT1RfSU5TVEFMTEVEIiwidW5pbnN0YWxsQXBrIiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJpbnN0YWxsIiwibm9JbmNyZW1lbnRhbCIsInJlcGxhY2UiLCJ0aW1lb3V0Q2FwTmFtZSIsInJpbXJhZiIsInZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5IiwiaXNQbVNlcnZpY2VBdmFpbGFibGUiLCJwbU91dHB1dCIsInBtRXJyb3IiLCJzaGVsbCIsImUiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiZXJyb3IiLCJsaW5lIiwic3BsaXQiLCJzdGFydFNlc3Npb24iLCJjYXBzIiwiY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnMiLCJza2lwU2VydmVySW5zdGFsbGF0aW9uIiwic2VydmVyVmVyc2lvbiIsInVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJyZXRyaWVzIiwibWF4UmV0cmllcyIsImRlbGF5QmV0d2VlblJldHJpZXMiLCJzdGFydEluc3RydW1lbnRhdGlvblByb2Nlc3MiLCJlcnJvckFuZFRocm93IiwiZGVsYXkiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsImNhcGFiaWxpdGllcyIsImZpcnN0TWF0Y2giLCJhbHdheXNNYXRjaCIsImNtZCIsImRpc2FibGVXaW5kb3dBbmltYXRpb24iLCJwdXNoIiwiXyIsImlzQm9vbGVhbiIsImluc3RydW1lbnRhdGlvblByb2Nlc3MiLCJjcmVhdGVTdWJQcm9jZXNzIiwib24iLCJzdGRvdXQiLCJzdGRlcnIiLCJvdXRwdXQiLCJ0cmltIiwiY29kZSIsImRlbGV0ZVNlc3Npb24iLCJzdHJpY3RDbGVhbnVwIiwidmFsdWUiLCJkYXRhIiwiYWN0aXZlU2Vzc2lvbklkcyIsImlkIiwiZmlsdGVyIiwiQm9vbGVhbiIsImxlbmd0aCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwbHVyYWxpemUiLCJheGlvcyIsImRlbGV0ZSIsImZvcmNlU3RvcCIsImlnbm9yZSIsImtpbGxQcm9jZXNzZXNCeU5hbWUiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvdWlhdXRvbWF0b3IyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBKV1Byb3h5LCBlcnJvcnMgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQge1xuICBTRVJWRVJfQVBLX1BBVEggYXMgYXBrUGF0aCxcbiAgVEVTVF9BUEtfUEFUSCBhcyB0ZXN0QXBrUGF0aCxcbiAgdmVyc2lvbiBhcyBzZXJ2ZXJWZXJzaW9uXG59IGZyb20gJ2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyJztcbmltcG9ydCB7XG4gIHV0aWwsIGxvZ2dlciwgdGVtcERpciwgZnMsIHRpbWluZ1xufSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgUkVRRF9QQVJBTVMgPSBbJ2FkYicsICd0bXBEaXInLCAnaG9zdCcsICdzeXN0ZW1Qb3J0JywgJ2RldmljZVBvcnQnLCAnZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiddO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9SRVRSSUVTID0gMjA7XG5jb25zdCBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX1BBQ0tBR0VfSUQgPSAnaW8uYXBwaXVtLnVpYXV0b21hdG9yMi5zZXJ2ZXInO1xuY29uc3QgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCA9IGAke1NFUlZFUl9QQUNLQUdFX0lEfS50ZXN0YDtcbmNvbnN0IElOU1RSVU1FTlRBVElPTl9UQVJHRVQgPSBgJHtTRVJWRVJfVEVTVF9QQUNLQUdFX0lEfS9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJgO1xuY29uc3QgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyID0gbG9nZ2VyLmdldExvZ2dlcignSW5zdHJ1bWVudGF0aW9uJyk7XG5cbmNsYXNzIFVJQTJQcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihcbiAgICAgICAgYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBVaUF1dG9tYXRvcjIgc2VydmVyIGJlY2F1c2UgYCArXG4gICAgICAgICd0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcgKHByb2JhYmx5IGNyYXNoZWQpLiAnICtcbiAgICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGFuZC9vciB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdXBlci5wcm94eUNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG59XG5cbmNsYXNzIFVpQXV0b21hdG9yMlNlcnZlciB7XG4gIGNvbnN0cnVjdG9yIChsb2csIG9wdHMgPSB7fSkge1xuICAgIGZvciAobGV0IHJlcSBvZiBSRVFEX1BBUkFNUykge1xuICAgICAgaWYgKCFvcHRzIHx8ICF1dGlsLmhhc1ZhbHVlKG9wdHNbcmVxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gJyR7cmVxfScgaXMgcmVxdWlyZWQhYCk7XG4gICAgICB9XG4gICAgICB0aGlzW3JlcV0gPSBvcHRzW3JlcV07XG4gICAgfVxuICAgIHRoaXMubG9nID0gbG9nO1xuICAgIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UgPSBvcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlO1xuICAgIGNvbnN0IHByb3h5T3B0cyA9IHtcbiAgICAgIGxvZyxcbiAgICAgIHNlcnZlcjogdGhpcy5ob3N0LFxuICAgICAgcG9ydDogdGhpcy5zeXN0ZW1Qb3J0LFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgIH07XG4gICAgaWYgKG9wdHMucmVhZFRpbWVvdXQgJiYgb3B0cy5yZWFkVGltZW91dCA+IDApIHtcbiAgICAgIHByb3h5T3B0cy50aW1lb3V0ID0gb3B0cy5yZWFkVGltZW91dDtcbiAgICB9XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IFVJQTJQcm94eShwcm94eU9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGFwa3Mgb24gdG8gdGhlIGRldmljZSBvciBlbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbGxUaW1lb3V0IC0gSW5zdGFsbGF0aW9uIHRpbWVvdXRcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXJBcGsgKGluc3RhbGxUaW1lb3V0ID0gU0VSVkVSX0lOU1RBTExfUkVUUklFUyAqIDEwMDApIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgY29uc3QgcGFja2FnZUluZm9zTWFwcGVyID0gYXN5bmMgKHthcHBQYXRoLCBhcHBJZH0pID0+IHtcbiAgICAgIGlmIChhd2FpdCBoZWxwZXJzLmlzV3JpdGVhYmxlKGFwcFBhdGgpKSB7XG4gICAgICAgIHJldHVybiB7IGFwcFBhdGgsIGFwcElkIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYFNlcnZlciBwYWNrYWdlIGF0ICcke2FwcFBhdGh9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgICAgYFdpbGwgY29weSBpdCBpbnRvIHRoZSB0ZW1wb3JhcnkgbG9jYXRpb24gYXQgJyR7dG1wUm9vdH0nIGFzIGEgd29ya2Fyb3VuZC4gYCArXG4gICAgICAgIGBDb25zaWRlciBtYWtpbmcgdGhpcyBmaWxlIHdyaXRlYWJsZSBtYW51YWxseSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiBzZXNzaW9uIHN0YXJ0dXAuYCk7XG4gICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBwUGF0aCkpO1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUoYXBwUGF0aCwgZHN0UGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBQYXRoOiBkc3RQYXRoLFxuICAgICAgICBhcHBJZCxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYWNrYWdlc0luZm8gPSBhd2FpdCBCLmFsbChCLm1hcChbXG4gICAgICAgIHtcbiAgICAgICAgICBhcHBQYXRoOiBhcGtQYXRoLFxuICAgICAgICAgIGFwcElkOiBTRVJWRVJfUEFDS0FHRV9JRCxcbiAgICAgICAgfSwge1xuICAgICAgICAgIGFwcFBhdGg6IHRlc3RBcGtQYXRoLFxuICAgICAgICAgIGFwcElkOiBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICB9LFxuICAgICAgXSwgcGFja2FnZUluZm9zTWFwcGVyKSk7XG5cbiAgICAgIGxldCBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IGZhbHNlO1xuICAgICAgbGV0IHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCB7YXBwSWQsIGFwcFBhdGh9IG9mIHBhY2thZ2VzSW5mbykge1xuICAgICAgICBpZiAoYXBwSWQgPT09IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQpIHtcbiAgICAgICAgICBjb25zdCBpc0FwcEluc3RhbGxlZCA9IGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcblxuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IGluIGdldHRpbmcgdGhlIHN0YXRlIGZvciB0ZXN0IHNlcnZlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2VzIG5vdCBjb250YWluIHZlcnNpb24gaW5mb1xuICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCBhcHBQYXRoKTtcbiAgICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgaXNBcHBJbnN0YWxsZWQ7XG4gICAgICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaXNBcHBJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZShhcHBQYXRoLCBhcHBJZCk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGAke2FwcElkfSBpbnN0YWxsYXRpb24gc3RhdGU6ICR7YXBwU3RhdGV9YCk7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwUGF0aCwgYXBwSWQpKSB7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBbXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRCxcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVELFxuICAgICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgYXBwUGF0aCk7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCAhW1xuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgW1xuICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQsXG4gICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2VydmVyIHBhY2thZ2VzIGFyZSAke3Nob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA/ICcnIDogJ25vdCAnfWdvaW5nIHRvIGJlIChyZSlpbnN0YWxsZWRgKTtcbiAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgJiYgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRnVsbCBwYWNrYWdlcyByZWluc3RhbGwgaXMgZ29pbmcgdG8gYmUgcGVyZm9ybWVkJyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHthcHBJZCwgYXBwUGF0aH0gb2YgcGFja2FnZXNJbmZvKSB7XG4gICAgICAgIGlmIChzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsoYXBwSWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybihgRXJyb3IgdW5pbnN0YWxsaW5nICcke2FwcElkfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKGFwcFBhdGgsIHtcbiAgICAgICAgICAgIG5vSW5jcmVtZW50YWw6IHRydWUsXG4gICAgICAgICAgICByZXBsYWNlOiB0cnVlLFxuICAgICAgICAgICAgdGltZW91dDogaW5zdGFsbFRpbWVvdXQsXG4gICAgICAgICAgICB0aW1lb3V0Q2FwTmFtZTogJ3VpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5KCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHtTRVJWSUNFU19MQVVOQ0hfVElNRU9VVH1tcyBmb3Igc2VydmljZXMgdG8gYmUgYXZhaWxhYmxlYCk7XG4gICAgbGV0IGlzUG1TZXJ2aWNlQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgbGV0IHBtT3V0cHV0ID0gJyc7XG4gICAgbGV0IHBtRXJyb3IgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1BtU2VydmljZUF2YWlsYWJsZSkge1xuICAgICAgICAgIHBtRXJyb3IgPSBudWxsO1xuICAgICAgICAgIHBtT3V0cHV0ID0gJyc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydwbScsICdsaXN0JywgJ2luc3RydW1lbnRhdGlvbiddKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBtT3V0cHV0LmluY2x1ZGVzKCdDb3VsZCBub3QgYWNjZXNzIHRoZSBQYWNrYWdlIE1hbmFnZXInKSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IG5ldyBFcnJvcihgUHJvYmxlbSBydW5uaW5nIFBhY2thZ2UgTWFuYWdlcjogJHtwbU91dHB1dH1gKTtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgfSBlbHNlIGlmIChwbU91dHB1dC5pbmNsdWRlcyhJTlNUUlVNRU5UQVRJT05fVEFSR0VUKSkge1xuICAgICAgICAgICAgcG1PdXRwdXQgPSAnJzsgLy8gcmVtb3ZlIG91dHB1dCwgc28gaXQgaXMgbm90IHByaW50ZWQgYmVsb3dcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBJbnN0cnVtZW50YXRpb24gdGFyZ2V0ICcke0lOU1RSVU1FTlRBVElPTl9UQVJHRVR9JyBpcyBhdmFpbGFibGVgKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzXG4gICAgICAgICAgICBpc1BtU2VydmljZUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICghcG1FcnJvcikge1xuICAgICAgICAgICAgcG1FcnJvciA9IG5ldyBFcnJvcignVGhlIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgaXMgbm90IGxpc3RlZCBieSBQYWNrYWdlIE1hbmFnZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzUG1TZXJ2aWNlQXZhaWxhYmxlO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IFNFUlZJQ0VTX0xBVU5DSF9USU1FT1VULFxuICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgVW5hYmxlIHRvIGZpbmQgaW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfSc6ICR7KHBtRXJyb3IgfHwge30pLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAocG1PdXRwdXQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ0F2YWlsYWJsZSB0YXJnZXRzOicpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcG1PdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYCAgICAke2xpbmUucmVwbGFjZSgnaW5zdHJ1bWVudGF0aW9uOicsICcnKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2Vzc2lvbiAoY2Fwcykge1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnMoKTtcbiAgICBpZiAoY2Fwcy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBBdHRlbXB0aW5nIHRvIHVzZSBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gdGhlIGRldmljZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyBVSUF1dG9tYXRvcjIgc2VydmVyICR7c2VydmVyVmVyc2lvbn1gKTtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgZnJvbSAnJHthcGtQYXRofScgYW5kIHRlc3QgZnJvbSAnJHt0ZXN0QXBrUGF0aH0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZW91dCA9IGNhcHMudWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCB8fCBTRVJWRVJfTEFVTkNIX1RJTUVPVVQ7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IDI7XG4gICAgY29uc3QgZGVsYXlCZXR3ZWVuUmV0cmllcyA9IDMwMDA7XG4gICAgd2hpbGUgKHJldHJpZXMgPCBtYXhSZXRyaWVzKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBXYWl0aW5nIHVwIHRvICR7dGltZW91dH1tcyBmb3IgVWlBdXRvbWF0b3IyIHRvIGJlIG9ubGluZS4uLmApO1xuICAgICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzKCk7XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gc2hvcnQgY2lyY3VpdCB0byByZXRyeSBvciBmYWlsIGZhc3RcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXRNczogdGltZW91dCxcbiAgICAgICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aGluICR7dGltZW91dH1tcyB0aW1lb3V0LiBgXG4gICAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LiAnXG4gICAgICAgICAgICArIGBZb3UgY291bGQgYWxzbyB0cnkgdG8gaW5jcmVhc2UgdGhlIHZhbHVlIG9mICd1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHJpZXMrKztcbiAgICAgIGlmIChyZXRyaWVzID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGNhbm5vdCBiZSBpbml0aWFsaXplZC4gJ1xuICAgICAgICAgICsgJ01ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBkb2VzIG5vdCBjcmFzaCBhbmQgaW52ZXN0aWdhdGUgdGhlIGxvZ2NhdCBvdXRwdXQuJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy53YXJuKGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaGFzIGJlZW4gdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQuIGBcbiAgICAgICAgKyBgUmV0cnlpbmcgVWlBdXRvbWF0b3IyIHN0YXJ0dXAgKCMke3JldHJpZXN9IG9mICR7bWF4UmV0cmllcyAtIDF9KWApO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyh0cnVlKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoZGVsYXlCZXR3ZWVuUmV0cmllcyk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuZGVidWcoYFRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgdG9vayBgXG4gICAgICArIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFtjYXBzXSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHt9LFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzICgpIHtcbiAgICBjb25zdCBjbWQgPSBbJ2FtJywgJ2luc3RydW1lbnQnLCAnLXcnXTtcbiAgICBpZiAodGhpcy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBjbWQucHVzaCgnLS1uby13aW5kb3ctYW5pbWF0aW9uJyk7XG4gICAgfVxuICAgIGlmIChfLmlzQm9vbGVhbih0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKSkge1xuICAgICAgY21kLnB1c2goJy1lJywgJ0RJU0FCTEVfU1VQUFJFU1NfQUNDRVNTSUJJTElUWV9TRVJWSUNFUycsIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIEdvb2dsZSBhbmFseXRpY3MgdG8gcHJldmVudCBwb3NzaWJsZSBmYXRhbCBleGNlcHRpb25cbiAgICBjbWQucHVzaCgnLWUnLCAnZGlzYWJsZUFuYWx5dGljcycsIHRydWUpO1xuICAgIGNtZC5wdXNoKElOU1RSVU1FTlRBVElPTl9UQVJHRVQpO1xuICAgIGNvbnN0IGluc3RydW1lbnRhdGlvblByb2Nlc3MgPSB0aGlzLmFkYi5jcmVhdGVTdWJQcm9jZXNzKFsnc2hlbGwnLCAuLi5jbWRdKTtcbiAgICBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IF8udHJpbShzdGRvdXQgfHwgc3RkZXJyKTtcbiAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKG91dHB1dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICBpbnN0cnVtZW50YXRpb25Mb2dnZXIuZGVidWcoYFRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhd2FpdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLnN0YXJ0KDApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIFVpQXV0b21hdG9yMiBzZXJ2ZXIgc2Vzc2lvbicpO1xuICAgIC8vIHJlbHkgb24gandwcm94eSdzIGludGVsbGlnZW5jZSB0byBrbm93IHdoYXQgd2UncmUgdGFsa2luZyBhYm91dCBhbmRcbiAgICAvLyBkZWxldGUgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnLycsICdERUxFVEUnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYERpZCBub3QgZ2V0IGNvbmZpcm1hdGlvbiBVaUF1dG9tYXRvcjIgZGVsZXRlU2Vzc2lvbiB3b3JrZWQ7IGAgK1xuICAgICAgICAgIGBFcnJvciB3YXM6ICR7ZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIChzdHJpY3RDbGVhbnVwID0gZmFsc2UpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGVyZm9ybWluZyAke3N0cmljdENsZWFudXAgPyAnc3RyaWN0JyA6ICdzaGFsbG93J30gY2xlYW51cCBvZiBhdXRvbWF0aW9uIGxlZnRvdmVyc2ApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHt2YWx1ZX0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS9zZXNzaW9uc2AsXG4gICAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICAgIH0pKS5kYXRhO1xuICAgICAgY29uc3QgYWN0aXZlU2Vzc2lvbklkcyA9IHZhbHVlLm1hcCgoe2lkfSkgPT4gaWQpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGlmIChhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBvYnNvbGV0ZSBzZXNzaW9ucyBhcmUgc3RpbGwgcnVubmluZzogJHtKU09OLnN0cmluZ2lmeShhY3RpdmVTZXNzaW9uSWRzKX1gKTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ29ic29sZXRlIHNlc3Npb24nLCBhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICAgIGF3YWl0IEIuYWxsKGFjdGl2ZVNlc3Npb25JZHNcbiAgICAgICAgICAubWFwKChpZCkgPT4gYXhpb3MuZGVsZXRlKGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS9zZXNzaW9uLyR7aWR9YCkpXG4gICAgICAgICk7XG4gICAgICAgIC8vIExldCBhbGwgc2Vzc2lvbnMgdG8gYmUgcHJvcGVybHkgdGVybWluYXRlZCBiZWZvcmUgY29udGludWluZ1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDEwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQpO1xuICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICBpZiAoIXN0cmljdENsZWFudXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEwNzQ5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxQcm9jZXNzZXNCeU5hbWUoJ3VpYXV0b21hdG9yJyk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICB9XG59XG5cbmV4cG9ydCB7IFVpQXV0b21hdG9yMlNlcnZlciwgSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgfTtcbmV4cG9ydCBkZWZhdWx0IFVpQXV0b21hdG9yMlNlcnZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxnQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMsbUJBQXhCLENBQWdDO0VBQ1osTUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0lBQzVDLElBQUksS0FBS0Msc0JBQVQsRUFBaUM7TUFDL0IsTUFBTSxJQUFJQyxtQkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdB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
381
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3VpYXV0b21hdG9yMi5qcyIsIm5hbWVzIjpbIlJFUURfUEFSQU1TIiwiU0VSVkVSX0xBVU5DSF9USU1FT1VUIiwiU0VSVkVSX0lOU1RBTExfUkVUUklFUyIsIlNFUlZJQ0VTX0xBVU5DSF9USU1FT1VUIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIiwiSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCIsImluc3RydW1lbnRhdGlvbkxvZ2dlciIsImxvZ2dlciIsImdldExvZ2dlciIsIlVJQTJQcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCIsImVycm9ycyIsIkludmFsaWRDb250ZXh0RXJyb3IiLCJVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJjb25zdHJ1Y3RvciIsImxvZyIsIm9wdHMiLCJyZXEiLCJ1dGlsIiwiaGFzVmFsdWUiLCJFcnJvciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlPcHRzIiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJzeXN0ZW1Qb3J0Iiwia2VlcEFsaXZlIiwicmVhZFRpbWVvdXQiLCJ0aW1lb3V0Iiwiandwcm94eSIsInByb3h5UmVxUmVzIiwiYmluZCIsImNvbW1hbmQiLCJpbnN0YWxsU2VydmVyQXBrIiwiaW5zdGFsbFRpbWVvdXQiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJwYWNrYWdlSW5mb3NNYXBwZXIiLCJhcHBQYXRoIiwiYXBwSWQiLCJoZWxwZXJzIiwiaXNXcml0ZWFibGUiLCJpbmZvIiwiZHN0UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiYmFzZW5hbWUiLCJmcyIsImNvcHlGaWxlIiwicGFja2FnZXNJbmZvIiwiQiIsImFsbCIsIm1hcCIsImFwa1BhdGgiLCJ0ZXN0QXBrUGF0aCIsInNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIiwic2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzIiwiaXNBcHBJbnN0YWxsZWQiLCJhZGIiLCJjaGVja0Fwa0NlcnQiLCJzaWduQXBwIiwiYXBwU3RhdGUiLCJnZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZSIsImRlYnVnIiwiQVBQX0lOU1RBTExfU1RBVEUiLCJPTERFUl9WRVJTSU9OX0lOU1RBTExFRCIsIk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVEIiwiaW5jbHVkZXMiLCJOT1RfSU5TVEFMTEVEIiwidW5pbnN0YWxsQXBrIiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJpbnN0YWxsIiwibm9JbmNyZW1lbnRhbCIsInJlcGxhY2UiLCJ0aW1lb3V0Q2FwTmFtZSIsInJpbXJhZiIsInZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5IiwiaXNQbVNlcnZpY2VBdmFpbGFibGUiLCJwbU91dHB1dCIsInBtRXJyb3IiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwic2hlbGwiLCJlIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yIiwibGluZSIsInNwbGl0Iiwic3RhcnRTZXNzaW9uIiwiY2FwcyIsImNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInNlcnZlclZlcnNpb24iLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwicmV0cmllcyIsIm1heFJldHJpZXMiLCJkZWxheUJldHdlZW5SZXRyaWVzIiwic3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiZXJyb3JBbmRUaHJvdyIsImRlbGF5IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJjYXBhYmlsaXRpZXMiLCJmaXJzdE1hdGNoIiwiYWx3YXlzTWF0Y2giLCJjbWQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwicHVzaCIsIl8iLCJpc0Jvb2xlYW4iLCJpbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiY3JlYXRlU3ViUHJvY2VzcyIsIm9uIiwic3Rkb3V0Iiwic3RkZXJyIiwib3V0cHV0IiwidHJpbSIsImNvZGUiLCJkZWxldGVTZXNzaW9uIiwic3RyaWN0Q2xlYW51cCIsInZhbHVlIiwiYXhpb3MiLCJkYXRhIiwiYWN0aXZlU2Vzc2lvbklkcyIsImlkIiwiZmlsdGVyIiwiQm9vbGVhbiIsImxlbmd0aCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwbHVyYWxpemUiLCJkZWxldGUiLCJmb3JjZVN0b3AiLCJpZ25vcmUiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIl0sInNvdXJjZVJvb3QiOiIuLi8uLiIsInNvdXJjZXMiOlsibGliL3VpYXV0b21hdG9yMi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHtcbiAgU0VSVkVSX0FQS19QQVRIIGFzIGFwa1BhdGgsXG4gIFRFU1RfQVBLX1BBVEggYXMgdGVzdEFwa1BhdGgsXG4gIHZlcnNpb24gYXMgc2VydmVyVmVyc2lvblxufSBmcm9tICdhcHBpdW0tdWlhdXRvbWF0b3IyLXNlcnZlcic7XG5pbXBvcnQge1xuICB1dGlsLCBsb2dnZXIsIHRlbXBEaXIsIGZzLCB0aW1pbmdcbn0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgUkVRRF9QQVJBTVMgPSBbJ2FkYicsICd0bXBEaXInLCAnaG9zdCcsICdzeXN0ZW1Qb3J0JywgJ2RldmljZVBvcnQnLCAnZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiddO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9SRVRSSUVTID0gMjA7XG5jb25zdCBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX1BBQ0tBR0VfSUQgPSAnaW8uYXBwaXVtLnVpYXV0b21hdG9yMi5zZXJ2ZXInO1xuY29uc3QgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCA9IGAke1NFUlZFUl9QQUNLQUdFX0lEfS50ZXN0YDtcbmNvbnN0IElOU1RSVU1FTlRBVElPTl9UQVJHRVQgPSBgJHtTRVJWRVJfVEVTVF9QQUNLQUdFX0lEfS9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJgO1xuY29uc3QgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyID0gbG9nZ2VyLmdldExvZ2dlcignSW5zdHJ1bWVudGF0aW9uJyk7XG5cbmNsYXNzIFVJQTJQcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihcbiAgICAgICAgYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBVaUF1dG9tYXRvcjIgc2VydmVyIGJlY2F1c2UgYCArXG4gICAgICAgICd0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcgKHByb2JhYmx5IGNyYXNoZWQpLiAnICtcbiAgICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGFuZC9vciB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdXBlci5wcm94eUNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG59XG5cbmNsYXNzIFVpQXV0b21hdG9yMlNlcnZlciB7XG4gIGNvbnN0cnVjdG9yIChsb2csIG9wdHMgPSB7fSkge1xuICAgIGZvciAobGV0IHJlcSBvZiBSRVFEX1BBUkFNUykge1xuICAgICAgaWYgKCFvcHRzIHx8ICF1dGlsLmhhc1ZhbHVlKG9wdHNbcmVxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gJyR7cmVxfScgaXMgcmVxdWlyZWQhYCk7XG4gICAgICB9XG4gICAgICB0aGlzW3JlcV0gPSBvcHRzW3JlcV07XG4gICAgfVxuICAgIHRoaXMubG9nID0gbG9nO1xuICAgIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UgPSBvcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlO1xuICAgIGNvbnN0IHByb3h5T3B0cyA9IHtcbiAgICAgIGxvZyxcbiAgICAgIHNlcnZlcjogdGhpcy5ob3N0LFxuICAgICAgcG9ydDogdGhpcy5zeXN0ZW1Qb3J0LFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgIH07XG4gICAgaWYgKG9wdHMucmVhZFRpbWVvdXQgJiYgb3B0cy5yZWFkVGltZW91dCA+IDApIHtcbiAgICAgIHByb3h5T3B0cy50aW1lb3V0ID0gb3B0cy5yZWFkVGltZW91dDtcbiAgICB9XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IFVJQTJQcm94eShwcm94eU9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGFwa3Mgb24gdG8gdGhlIGRldmljZSBvciBlbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbGxUaW1lb3V0IC0gSW5zdGFsbGF0aW9uIHRpbWVvdXRcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXJBcGsgKGluc3RhbGxUaW1lb3V0ID0gU0VSVkVSX0lOU1RBTExfUkVUUklFUyAqIDEwMDApIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgY29uc3QgcGFja2FnZUluZm9zTWFwcGVyID0gYXN5bmMgKHthcHBQYXRoLCBhcHBJZH0pID0+IHtcbiAgICAgIGlmIChhd2FpdCBoZWxwZXJzLmlzV3JpdGVhYmxlKGFwcFBhdGgpKSB7XG4gICAgICAgIHJldHVybiB7IGFwcFBhdGgsIGFwcElkIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYFNlcnZlciBwYWNrYWdlIGF0ICcke2FwcFBhdGh9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgICAgYFdpbGwgY29weSBpdCBpbnRvIHRoZSB0ZW1wb3JhcnkgbG9jYXRpb24gYXQgJyR7dG1wUm9vdH0nIGFzIGEgd29ya2Fyb3VuZC4gYCArXG4gICAgICAgIGBDb25zaWRlciBtYWtpbmcgdGhpcyBmaWxlIHdyaXRlYWJsZSBtYW51YWxseSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiBzZXNzaW9uIHN0YXJ0dXAuYCk7XG4gICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBwUGF0aCkpO1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUoYXBwUGF0aCwgZHN0UGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBQYXRoOiBkc3RQYXRoLFxuICAgICAgICBhcHBJZCxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYWNrYWdlc0luZm8gPSBhd2FpdCBCLmFsbChCLm1hcChbXG4gICAgICAgIHtcbiAgICAgICAgICBhcHBQYXRoOiBhcGtQYXRoLFxuICAgICAgICAgIGFwcElkOiBTRVJWRVJfUEFDS0FHRV9JRCxcbiAgICAgICAgfSwge1xuICAgICAgICAgIGFwcFBhdGg6IHRlc3RBcGtQYXRoLFxuICAgICAgICAgIGFwcElkOiBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICB9LFxuICAgICAgXSwgcGFja2FnZUluZm9zTWFwcGVyKSk7XG5cbiAgICAgIGxldCBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IGZhbHNlO1xuICAgICAgbGV0IHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCB7YXBwSWQsIGFwcFBhdGh9IG9mIHBhY2thZ2VzSW5mbykge1xuICAgICAgICBpZiAoYXBwSWQgPT09IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQpIHtcbiAgICAgICAgICBjb25zdCBpc0FwcEluc3RhbGxlZCA9IGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcblxuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IGluIGdldHRpbmcgdGhlIHN0YXRlIGZvciB0ZXN0IHNlcnZlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2VzIG5vdCBjb250YWluIHZlcnNpb24gaW5mb1xuICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCBhcHBQYXRoKTtcbiAgICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgaXNBcHBJbnN0YWxsZWQ7XG4gICAgICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaXNBcHBJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZShhcHBQYXRoLCBhcHBJZCk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGAke2FwcElkfSBpbnN0YWxsYXRpb24gc3RhdGU6ICR7YXBwU3RhdGV9YCk7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwUGF0aCwgYXBwSWQpKSB7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBbXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRCxcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVELFxuICAgICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgYXBwUGF0aCk7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCAhW1xuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgW1xuICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQsXG4gICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2VydmVyIHBhY2thZ2VzIGFyZSAke3Nob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA/ICcnIDogJ25vdCAnfWdvaW5nIHRvIGJlIChyZSlpbnN0YWxsZWRgKTtcbiAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgJiYgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRnVsbCBwYWNrYWdlcyByZWluc3RhbGwgaXMgZ29pbmcgdG8gYmUgcGVyZm9ybWVkJyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHthcHBJZCwgYXBwUGF0aH0gb2YgcGFja2FnZXNJbmZvKSB7XG4gICAgICAgIGlmIChzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsoYXBwSWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybihgRXJyb3IgdW5pbnN0YWxsaW5nICcke2FwcElkfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKGFwcFBhdGgsIHtcbiAgICAgICAgICAgIG5vSW5jcmVtZW50YWw6IHRydWUsXG4gICAgICAgICAgICByZXBsYWNlOiB0cnVlLFxuICAgICAgICAgICAgdGltZW91dDogaW5zdGFsbFRpbWVvdXQsXG4gICAgICAgICAgICB0aW1lb3V0Q2FwTmFtZTogJ3VpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5KCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHtTRVJWSUNFU19MQVVOQ0hfVElNRU9VVH1tcyBmb3Igc2VydmljZXMgdG8gYmUgYXZhaWxhYmxlYCk7XG4gICAgbGV0IGlzUG1TZXJ2aWNlQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgbGV0IHBtT3V0cHV0ID0gJyc7XG4gICAgbGV0IHBtRXJyb3IgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1BtU2VydmljZUF2YWlsYWJsZSkge1xuICAgICAgICAgIHBtRXJyb3IgPSBudWxsO1xuICAgICAgICAgIHBtT3V0cHV0ID0gJyc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydwbScsICdsaXN0JywgJ2luc3RydW1lbnRhdGlvbiddKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBtT3V0cHV0LmluY2x1ZGVzKCdDb3VsZCBub3QgYWNjZXNzIHRoZSBQYWNrYWdlIE1hbmFnZXInKSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IG5ldyBFcnJvcihgUHJvYmxlbSBydW5uaW5nIFBhY2thZ2UgTWFuYWdlcjogJHtwbU91dHB1dH1gKTtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgfSBlbHNlIGlmIChwbU91dHB1dC5pbmNsdWRlcyhJTlNUUlVNRU5UQVRJT05fVEFSR0VUKSkge1xuICAgICAgICAgICAgcG1PdXRwdXQgPSAnJzsgLy8gcmVtb3ZlIG91dHB1dCwgc28gaXQgaXMgbm90IHByaW50ZWQgYmVsb3dcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBJbnN0cnVtZW50YXRpb24gdGFyZ2V0ICcke0lOU1RSVU1FTlRBVElPTl9UQVJHRVR9JyBpcyBhdmFpbGFibGVgKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzXG4gICAgICAgICAgICBpc1BtU2VydmljZUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICghcG1FcnJvcikge1xuICAgICAgICAgICAgcG1FcnJvciA9IG5ldyBFcnJvcignVGhlIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgaXMgbm90IGxpc3RlZCBieSBQYWNrYWdlIE1hbmFnZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzUG1TZXJ2aWNlQXZhaWxhYmxlO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IFNFUlZJQ0VTX0xBVU5DSF9USU1FT1VULFxuICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgVW5hYmxlIHRvIGZpbmQgaW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfSc6ICR7KHBtRXJyb3IgfHwge30pLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAocG1PdXRwdXQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ0F2YWlsYWJsZSB0YXJnZXRzOicpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcG1PdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYCAgICAke2xpbmUucmVwbGFjZSgnaW5zdHJ1bWVudGF0aW9uOicsICcnKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2Vzc2lvbiAoY2Fwcykge1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnMoKTtcbiAgICBpZiAoY2Fwcy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBBdHRlbXB0aW5nIHRvIHVzZSBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gdGhlIGRldmljZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyBVSUF1dG9tYXRvcjIgc2VydmVyICR7c2VydmVyVmVyc2lvbn1gKTtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgZnJvbSAnJHthcGtQYXRofScgYW5kIHRlc3QgZnJvbSAnJHt0ZXN0QXBrUGF0aH0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZW91dCA9IGNhcHMudWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCB8fCBTRVJWRVJfTEFVTkNIX1RJTUVPVVQ7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IDI7XG4gICAgY29uc3QgZGVsYXlCZXR3ZWVuUmV0cmllcyA9IDMwMDA7XG4gICAgd2hpbGUgKHJldHJpZXMgPCBtYXhSZXRyaWVzKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBXYWl0aW5nIHVwIHRvICR7dGltZW91dH1tcyBmb3IgVWlBdXRvbWF0b3IyIHRvIGJlIG9ubGluZS4uLmApO1xuICAgICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzKCk7XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gc2hvcnQgY2lyY3VpdCB0byByZXRyeSBvciBmYWlsIGZhc3RcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXRNczogdGltZW91dCxcbiAgICAgICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aGluICR7dGltZW91dH1tcyB0aW1lb3V0LiBgXG4gICAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LiAnXG4gICAgICAgICAgICArIGBZb3UgY291bGQgYWxzbyB0cnkgdG8gaW5jcmVhc2UgdGhlIHZhbHVlIG9mICd1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHJpZXMrKztcbiAgICAgIGlmIChyZXRyaWVzID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGNhbm5vdCBiZSBpbml0aWFsaXplZC4gJ1xuICAgICAgICAgICsgJ01ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBkb2VzIG5vdCBjcmFzaCBhbmQgaW52ZXN0aWdhdGUgdGhlIGxvZ2NhdCBvdXRwdXQuJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy53YXJuKGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaGFzIGJlZW4gdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQuIGBcbiAgICAgICAgKyBgUmV0cnlpbmcgVWlBdXRvbWF0b3IyIHN0YXJ0dXAgKCMke3JldHJpZXN9IG9mICR7bWF4UmV0cmllcyAtIDF9KWApO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyh0cnVlKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoZGVsYXlCZXR3ZWVuUmV0cmllcyk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuZGVidWcoYFRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgdG9vayBgXG4gICAgICArIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFtjYXBzXSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHt9LFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzICgpIHtcbiAgICBjb25zdCBjbWQgPSBbJ2FtJywgJ2luc3RydW1lbnQnLCAnLXcnXTtcbiAgICBpZiAodGhpcy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBjbWQucHVzaCgnLS1uby13aW5kb3ctYW5pbWF0aW9uJyk7XG4gICAgfVxuICAgIGlmIChfLmlzQm9vbGVhbih0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKSkge1xuICAgICAgY21kLnB1c2goJy1lJywgJ0RJU0FCTEVfU1VQUFJFU1NfQUNDRVNTSUJJTElUWV9TRVJWSUNFUycsIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIEdvb2dsZSBhbmFseXRpY3MgdG8gcHJldmVudCBwb3NzaWJsZSBmYXRhbCBleGNlcHRpb25cbiAgICBjbWQucHVzaCgnLWUnLCAnZGlzYWJsZUFuYWx5dGljcycsIHRydWUpO1xuICAgIGNtZC5wdXNoKElOU1RSVU1FTlRBVElPTl9UQVJHRVQpO1xuICAgIGNvbnN0IGluc3RydW1lbnRhdGlvblByb2Nlc3MgPSB0aGlzLmFkYi5jcmVhdGVTdWJQcm9jZXNzKFsnc2hlbGwnLCAuLi5jbWRdKTtcbiAgICBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IF8udHJpbShzdGRvdXQgfHwgc3RkZXJyKTtcbiAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKG91dHB1dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICBpbnN0cnVtZW50YXRpb25Mb2dnZXIuZGVidWcoYFRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhd2FpdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLnN0YXJ0KDApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIFVpQXV0b21hdG9yMiBzZXJ2ZXIgc2Vzc2lvbicpO1xuICAgIC8vIHJlbHkgb24gandwcm94eSdzIGludGVsbGlnZW5jZSB0byBrbm93IHdoYXQgd2UncmUgdGFsa2luZyBhYm91dCBhbmRcbiAgICAvLyBkZWxldGUgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnLycsICdERUxFVEUnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYERpZCBub3QgZ2V0IGNvbmZpcm1hdGlvbiBVaUF1dG9tYXRvcjIgZGVsZXRlU2Vzc2lvbiB3b3JrZWQ7IGAgK1xuICAgICAgICAgIGBFcnJvciB3YXM6ICR7ZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIChzdHJpY3RDbGVhbnVwID0gZmFsc2UpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGVyZm9ybWluZyAke3N0cmljdENsZWFudXAgPyAnc3RyaWN0JyA6ICdzaGFsbG93J30gY2xlYW51cCBvZiBhdXRvbWF0aW9uIGxlZnRvdmVyc2ApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHt2YWx1ZX0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS9zZXNzaW9uc2AsXG4gICAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICAgIH0pKS5kYXRhO1xuICAgICAgY29uc3QgYWN0aXZlU2Vzc2lvbklkcyA9IHZhbHVlLm1hcCgoe2lkfSkgPT4gaWQpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGlmIChhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBvYnNvbGV0ZSBzZXNzaW9ucyBhcmUgc3RpbGwgcnVubmluZzogJHtKU09OLnN0cmluZ2lmeShhY3RpdmVTZXNzaW9uSWRzKX1gKTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ29ic29sZXRlIHNlc3Npb24nLCBhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICAgIGF3YWl0IEIuYWxsKGFjdGl2ZVNlc3Npb25JZHNcbiAgICAgICAgICAubWFwKChpZCkgPT4gYXhpb3MuZGVsZXRlKGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS9zZXNzaW9uLyR7aWR9YCkpXG4gICAgICAgICk7XG4gICAgICAgIC8vIExldCBhbGwgc2Vzc2lvbnMgdG8gYmUgcHJvcGVybHkgdGVybWluYXRlZCBiZWZvcmUgY29udGludWluZ1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDEwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQpO1xuICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICBpZiAoIXN0cmljdENsZWFudXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEwNzQ5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxQcm9jZXNzZXNCeU5hbWUoJ3VpYXV0b21hdG9yJyk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICB9XG59XG5cbmV4cG9ydCB7IFVpQXV0b21hdG9yMlNlcnZlciwgSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgfTtcbmV4cG9ydCBkZWZhdWx0IFVpQXV0b21hdG9yMlNlcnZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxlQUFBLENBQU9DLFNBQVAsQ0FBaUIsaUJBQWpCLENBQTlCOztBQUVBLE1BQU1DLFNBQU4sU0FBd0JDLGVBQXhCLENBQWdDO0VBQ1osTUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0lBQzVDLElBQUksS0FBS0Msc0JBQVQsRUFBaUM7TUFDL0IsTUFBTSxJQUFJQyxjQUFBLENBQU9DLG1CQUFYLENBQ0gsSUFBR0osTUFBTyxJ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
package/index.js CHANGED
@@ -1,29 +1,6 @@
1
1
  // transpile:main
2
2
 
3
- import { asyncify } from 'asyncbox';
4
- import * as driver from './lib/driver';
5
- import * as server from './lib/server';
3
+ import { AndroidUiautomator2Driver } from './lib/driver';
6
4
 
7
-
8
- const { AndroidUiautomator2Driver } = driver;
9
- const { startServer } = server;
10
-
11
- export const DEFAULT_HOST = 'localhost';
12
- export const DEFAULT_PORT = 4884;
13
-
14
- async function main () {
15
- const getArgValue = (argName) => {
16
- const argIndex = process.argv.indexOf(argName);
17
- return argIndex > 0 ? process.argv[argIndex + 1] : null;
18
- };
19
- const port = parseInt(getArgValue('--port'), 10) || DEFAULT_PORT;
20
- const host = getArgValue('--host') || DEFAULT_HOST;
21
- return await startServer(port, host);
22
- }
23
-
24
- if (require.main === module) {
25
- asyncify(main);
26
- }
27
-
28
- export { AndroidUiautomator2Driver, startServer };
5
+ export { AndroidUiautomator2Driver };
29
6
  export default AndroidUiautomator2Driver;
@@ -1,6 +1,6 @@
1
1
  import _ from 'lodash';
2
- import { util } from '@appium/support';
3
- import { PROTOCOLS, W3C_ELEMENT_KEY } from '@appium/base-driver';
2
+ import { util } from 'appium/support';
3
+ import { PROTOCOLS, W3C_ELEMENT_KEY } from 'appium/driver';
4
4
 
5
5
  let commands = {}, helpers = {}, extensions = {};
6
6
 
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash';
2
2
  import B from 'bluebird';
3
- import { errors } from '@appium/base-driver';
4
- import { fs, tempDir } from '@appium/support';
3
+ import { errors } from 'appium/driver';
4
+ import { fs, tempDir } from 'appium/support';
5
5
  import { APK_EXTENSION } from '../extensions';
6
6
 
7
7
  let extensions = {},
@@ -1,6 +1,6 @@
1
- import { util } from '@appium/support';
1
+ import { util } from 'appium/support';
2
2
  import _ from 'lodash';
3
- import { errors } from '@appium/base-driver';
3
+ import { errors } from 'appium/driver';
4
4
 
5
5
  const commands = {};
6
6
 
@@ -1,4 +1,4 @@
1
- import { imageUtil } from '@appium/support';
1
+ import { imageUtil } from 'appium/support';
2
2
 
3
3
 
4
4
  let extensions = {}, commands = {};
@@ -1,6 +1,6 @@
1
1
  import { CssSelectorParser } from 'css-selector-parser';
2
2
  import { escapeRegExp } from 'lodash';
3
- import { errors } from '@appium/base-driver';
3
+ import { errors } from 'appium/driver';
4
4
 
5
5
  const parser = new CssSelectorParser();
6
6
  parser.registerSelectorPseudos('has');
package/lib/driver.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import _ from 'lodash';
2
- import { BaseDriver, DeviceSettings } from '@appium/base-driver';
2
+ import { BaseDriver, DeviceSettings } from 'appium/driver';
3
3
  import {
4
4
  UiAutomator2Server, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID
5
5
  } from './uiautomator2';
6
- import { fs, util, mjpeg } from '@appium/support';
6
+ import { fs, util, mjpeg } from 'appium/support';
7
7
  import { retryInterval } from 'asyncbox';
8
8
  import B from 'bluebird';
9
9
  import commands from './commands/index';
@@ -579,9 +579,9 @@ class AndroidUiautomator2Driver extends BaseDriver {
579
579
  await this.adb.startApp({
580
580
  pkg: this.opts.appPackage,
581
581
  activity: this.opts.appActivity,
582
- action: this.opts.intentAction,
583
- category: this.opts.intentCategory,
584
- flags: this.opts.intentFlags,
582
+ action: this.opts.intentAction || 'android.intent.action.MAIN',
583
+ category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',
584
+ flags: this.opts.intentFlags || '0x10200000', // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
585
585
  waitPkg: this.opts.appWaitPackage,
586
586
  waitActivity: this.opts.appWaitActivity,
587
587
  waitForLaunch: this.opts.appWaitForLaunch,
package/lib/helpers.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import path from 'path';
2
- import { fs, system } from '@appium/support';
2
+ import { fs, system } from 'appium/support';
3
3
 
4
4
 
5
5
  let helpers = {};
package/lib/logger.js CHANGED
@@ -1,4 +1,4 @@
1
- import { logger } from '@appium/support';
1
+ import { logger } from 'appium/support';
2
2
 
3
3
 
4
4
  const log = logger.getLogger('UiAutomator2');
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { JWProxy, errors } from '@appium/base-driver';
2
+ import { JWProxy, errors } from 'appium/driver';
3
3
  import { waitForCondition } from 'asyncbox';
4
4
  import {
5
5
  SERVER_APK_PATH as apkPath,
@@ -8,7 +8,7 @@ import {
8
8
  } from 'appium-uiautomator2-server';
9
9
  import {
10
10
  util, logger, tempDir, fs, timing
11
- } from '@appium/support';
11
+ } from 'appium/support';
12
12
  import B from 'bluebird';
13
13
  import helpers from './helpers';
14
14
  import axios from 'axios';
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "2.1.2",
10
+ "version": "2.3.0",
11
11
  "author": "appium",
12
12
  "license": "Apache-2.0",
13
13
  "repository": {
@@ -40,11 +40,9 @@
40
40
  "build/lib"
41
41
  ],
42
42
  "dependencies": {
43
- "@appium/base-driver": "^8.5.2",
44
- "@appium/support": "^2.55.3",
45
43
  "@babel/runtime": "^7.0.0",
46
44
  "appium-adb": "^9.0.0",
47
- "appium-android-driver": "^5.0.9",
45
+ "appium-android-driver": "^5.0.15",
48
46
  "appium-chromedriver": "^5.0.2",
49
47
  "appium-uiautomator2-server": "^5.6.0",
50
48
  "asyncbox": "^2.3.1",
@@ -80,6 +78,9 @@
80
78
  "precommit-msg",
81
79
  "test"
82
80
  ],
81
+ "peerDependencies": {
82
+ "appium": "^2.0.0-beta.40"
83
+ },
83
84
  "devDependencies": {
84
85
  "@appium/gulp-plugins": "^7.0.0",
85
86
  "@appium/eslint-config-appium": "^6.0.0",
@@ -87,6 +88,8 @@
87
88
  "@babel/core": "^7.16.0",
88
89
  "@semantic-release/git": "^10.0.1",
89
90
  "@xmldom/xmldom": "^0.x",
91
+ "appium": "^2.0.0-beta.40",
92
+ "appium-uiautomator2-driver": "file:.",
90
93
  "android-apidemos": "^4.0.0",
91
94
  "chai": "^4.1.0",
92
95
  "chai-as-promised": "^7.1.1",
@@ -1,41 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = void 0;
9
- exports.startServer = startServer;
10
-
11
- require("source-map-support/register");
12
-
13
- var _logger = _interopRequireDefault(require("./logger"));
14
-
15
- var _baseDriver = require("@appium/base-driver");
16
-
17
- var _driver = _interopRequireDefault(require("./driver"));
18
-
19
- async function startServer(port = 4884, host = 'localhost') {
20
- let d = new _driver.default({
21
- port,
22
- host
23
- });
24
- let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(d);
25
- let server = (0, _baseDriver.server)({
26
- routeConfiguringFunction,
27
- port,
28
- hostname: host
29
- });
30
-
31
- _logger.default.info(`Android Uiautomator2 server listening on http://${host}:${port}`);
32
-
33
- d.server = server;
34
- return await server;
35
- }
36
-
37
- var _default = startServer;
38
- exports.default = _default;require('source-map-support').install();
39
-
40
-
41
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3NlcnZlci5qcyIsIm5hbWVzIjpbInN0YXJ0U2VydmVyIiwicG9ydCIsImhvc3QiLCJkIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlcnZlciIsImhvc3RuYW1lIiwibG9nIiwiaW5mbyJdLCJzb3VyY2VSb290IjoiLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBzZXJ2ZXIgYXMgYmFzZVNlcnZlciwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIGFzIG1ha2VSb3V0ZXIgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIGZyb20gJy4vZHJpdmVyJztcblxuXG5hc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlciAocG9ydCA9IDQ4ODQsIGhvc3QgPSAnbG9jYWxob3N0Jykge1xuICBsZXQgZCA9IG5ldyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyKHtwb3J0LCBob3N0fSk7XG4gIGxldCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gPSBtYWtlUm91dGVyKGQpO1xuICBsZXQgc2VydmVyID0gYmFzZVNlcnZlcih7cm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBwb3J0LCBob3N0bmFtZTogaG9zdH0pO1xuICBsb2cuaW5mbyhgQW5kcm9pZCBVaWF1dG9tYXRvcjIgc2VydmVyIGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gIGQuc2VydmVyID0gc2VydmVyO1xuICByZXR1cm4gYXdhaXQgc2VydmVyO1xufVxuXG5leHBvcnQgeyBzdGFydFNlcnZlciB9O1xuZXhwb3J0IGRlZmF1bHQgc3RhcnRTZXJ2ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBLGVBQWVBLFdBQWYsQ0FBNEJDLElBQUksR0FBRyxJQUFuQyxFQUF5Q0MsSUFBSSxHQUFHLFdBQWhELEVBQTZEO0VBQzNELElBQUlDLENBQUMsR0FBRyxJQUFJQyxlQUFKLENBQThCO0lBQUNILElBQUQ7SUFBT0M7RUFBUCxDQUE5QixDQUFSO0VBQ0EsSUFBSUcsd0JBQXdCLEdBQUcsMENBQVdGLENBQVgsQ0FBL0I7RUFDQSxJQUFJRyxNQUFNLEdBQUcsd0JBQVc7SUFBQ0Qsd0JBQUQ7SUFBMkJKLElBQTNCO0lBQWlDTSxRQUFRLEVBQUVMO0VBQTNDLENBQVgsQ0FBYjs7RUFDQU0sZ0JBQUlDLElBQUosQ0FBVSxtREFBa0RQLElBQUssSUFBR0QsSUFBSyxFQUF6RTs7RUFDQUUsQ0FBQyxDQUFDRyxNQUFGLEdBQVdBLE1BQVg7RUFDQSxPQUFPLE1BQU1BLE1BQWI7QUFDRDs7ZUFHY04sVyJ9
package/lib/server.js DELETED
@@ -1,16 +0,0 @@
1
- import log from './logger';
2
- import { server as baseServer, routeConfiguringFunction as makeRouter } from '@appium/base-driver';
3
- import AndroidUiautomator2Driver from './driver';
4
-
5
-
6
- async function startServer (port = 4884, host = 'localhost') {
7
- let d = new AndroidUiautomator2Driver({port, host});
8
- let routeConfiguringFunction = makeRouter(d);
9
- let server = baseServer({routeConfiguringFunction, port, hostname: host});
10
- log.info(`Android Uiautomator2 server listening on http://${host}:${port}`);
11
- d.server = server;
12
- return await server;
13
- }
14
-
15
- export { startServer };
16
- export default startServer;