appium-android-driver 5.7.1 → 5.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/lib/android-helpers.js +2 -2
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +2 -2
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +2 -2
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/app-management.js +2 -2
  9. package/build/lib/commands/app-management.js.map +1 -1
  10. package/build/lib/commands/context.js +2 -2
  11. package/build/lib/commands/context.js.map +1 -1
  12. package/build/lib/commands/element.js +2 -2
  13. package/build/lib/commands/element.js.map +1 -1
  14. package/build/lib/commands/file-actions.js +2 -2
  15. package/build/lib/commands/file-actions.js.map +1 -1
  16. package/build/lib/commands/general.js +2 -2
  17. package/build/lib/commands/general.js.map +1 -1
  18. package/build/lib/commands/media-projection.js +2 -2
  19. package/build/lib/commands/media-projection.js.map +1 -1
  20. package/build/lib/commands/recordscreen.js +2 -2
  21. package/build/lib/commands/recordscreen.js.map +1 -1
  22. package/build/lib/commands/shell.js +2 -2
  23. package/build/lib/commands/shell.js.map +1 -1
  24. package/build/lib/commands/streamscreen.js +2 -2
  25. package/build/lib/commands/streamscreen.js.map +1 -1
  26. package/build/lib/commands/touch.js +2 -2
  27. package/build/lib/commands/touch.js.map +1 -1
  28. package/build/lib/desired-caps.js +2 -1
  29. package/build/lib/desired-caps.js.map +1 -1
  30. package/build/lib/driver.js +2 -2
  31. package/build/lib/driver.js.map +1 -1
  32. package/build/lib/logger.js +2 -2
  33. package/build/lib/logger.js.map +1 -1
  34. package/build/lib/uiautomator.js +2 -2
  35. package/build/lib/uiautomator.js.map +1 -1
  36. package/build/lib/unlock-helpers.js +2 -2
  37. package/build/lib/unlock-helpers.js.map +1 -1
  38. package/build/lib/webview-helpers.js +2 -2
  39. package/build/lib/webview-helpers.js.map +1 -1
  40. package/lib/android-helpers.js +1 -1
  41. package/lib/bootstrap.js +1 -1
  42. package/lib/commands/actions.js +1 -1
  43. package/lib/commands/app-management.js +1 -1
  44. package/lib/commands/context.js +1 -1
  45. package/lib/commands/element.js +1 -1
  46. package/lib/commands/file-actions.js +1 -1
  47. package/lib/commands/general.js +1 -1
  48. package/lib/commands/media-projection.js +1 -1
  49. package/lib/commands/recordscreen.js +1 -1
  50. package/lib/commands/shell.js +1 -1
  51. package/lib/commands/streamscreen.js +1 -1
  52. package/lib/commands/touch.js +1 -1
  53. package/lib/driver.js +1 -1
  54. package/lib/logger.js +1 -1
  55. package/lib/uiautomator.js +1 -1
  56. package/lib/unlock-helpers.js +1 -1
  57. package/lib/webview-helpers.js +1 -1
  58. package/package.json +2 -1
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = exports.commands = void 0;
8
8
  require("source-map-support/register");
9
9
  var _lodash = _interopRequireDefault(require("lodash"));
10
- var _support = require("appium/support");
10
+ var _support = require("@appium/support");
11
11
  var _path = _interopRequireDefault(require("path"));
12
12
  var _driver = require("appium/driver");
13
13
  var _utils = require("../utils");
@@ -216,4 +216,4 @@ commands.mobileDeleteFile = async function mobileDeleteFile(opts = {}) {
216
216
  };
217
217
  var _default = commands;
218
218
  exports.default = _default;
219
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT05UQUlORVJfUEFUSF9NQVJLRVIiLCJDT05UQUlORVJfUEFUSF9QQVRURVJOIiwiUmVnRXhwIiwiQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UIiwiY29tbWFuZHMiLCJwYXJzZUNvbnRhaW5lclBhdGgiLCJyZW1vdGVQYXRoIiwibWF0Y2giLCJleGVjIiwiRXJyb3IiLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwibG9nIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwidG1wRGVzdGluYXRpb24iLCJzdGFydHNXaXRoIiwicGFja2FnZUlkIiwicGF0aEluQ29udGFpbmVyIiwiYmFzZW5hbWUiLCJlcnJvckFuZFRocm93IiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJtb2JpbGVQdWxsRmlsZSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsIl8iLCJpc0FycmF5IiwiQnVmZmVyIiwiZnJvbSIsImNvbnRlbnQiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwicHVzaCIsIm1vYmlsZVB1c2hGaWxlIiwicGF5bG9hZCIsInB1bGxGb2xkZXIiLCJ0bXBSb290Iiwib3BlbkRpciIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInJpbXJhZiIsIm1vYmlsZVB1bGxGb2xkZXIiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJtb2JpbGVEZWxldGVGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ZpbGUtYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHppcCwgdGVtcERpciB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyByZXF1aXJlQXJncyB9IGZyb20gJy4uL3V0aWxzJztcblxuXG5jb25zdCBDT05UQUlORVJfUEFUSF9NQVJLRVIgPSAnQCc7XG4vLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL1BMZEIwRy8yXG5jb25zdCBDT05UQUlORVJfUEFUSF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7Q09OVEFJTkVSX1BBVEhfTUFSS0VSfShbXi9dKykvKC4rKWApO1xuY29uc3QgQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UID0gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9TQ0FOTkVSX1NDQU5fRklMRSc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBQYXJzZXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGZyb20gdGhlIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIHByZWZvcm1hdHRlZCByZW1vdGUgcGF0aCwgd2hpY2ggbG9va3MgbGlrZVxuICogYEBteS5hcHAuaWQvbXkvcGF0aGBcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSwgd2hlcmUgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHBhcnNlZCBwYWNrYWdlXG4gKiBpZGVudGlmaWVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uIHBhdGggaW5zaWRlIHRoZSBwYWNrYWdlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRhaW5lclBhdGggKHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgbWF0Y2ggPSBDT05UQUlORVJfUEFUSF9QQVRURVJOLmV4ZWMocmVtb3RlUGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcGFja2FnZSBpZGVudGlmaWVyIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSByZWxhdGl2ZSBwYXRoIHdpdGggYSBzaW5nbGUgc2xhc2guIGAgK1xuICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIFttYXRjaFsxXSwgcGF0aC5wb3NpeC5yZXNvbHZlKGAvZGF0YS9kYXRhLyR7bWF0Y2hbMV19YCwgbWF0Y2hbMl0pXTtcbn1cblxuLyoqXG4gKiBTY2FucyB0aGUgZ2l2ZW4gZmlsZS9mb2xkZXIgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqIGFuZCBhZGRzIG1hdGNoaW5nIGl0ZW1zIHRvIHRoZSBkZXZpY2UncyBtZWRpYSBsaWJyYXJ5LlxuICogRXhjZXB0aW9ucyBhcmUgaWdub3JlZCBhbmQgd3JpdHRlbiBpbnRvIHRoZSBsb2cuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZpbGUvZm9sZGVyIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2Nhbk1lZGlhIChhZGIsIHJlbW90ZVBhdGgsIGxvZyA9IG51bGwpIHtcbiAgbG9nPy5kZWJ1ZyhgUGVyZm9ybWluZyBtZWRpYSBzY2FuIG9mICcke3JlbW90ZVBhdGh9J2ApO1xuICB0cnkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNjE4NFxuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOSkge1xuICAgICAgYXdhaXQgYWRiLnNjYW5NZWRpYShyZW1vdGVQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAgICctYScsIEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCxcbiAgICAgICAgJy1kJywgYGZpbGU6Ly8ke3JlbW90ZVBhdGh9YFxuICAgICAgXSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nPy53YXJuKGBJZ25vcmluZyBhbiB1bmV4cGVjdGVkIGVycm9yIHVwb24gbWVkaWEgc2Nhbm5pbmcgb2YgJyR7cmVtb3RlUGF0aH0nOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc21hbGwgaGVscGVyLCB3aGljaCBlc2NhcGVzIHNpbmdsZSBxdW90ZXMgaW4gcGF0aHMsXG4gKiBzbyB0aGV5IGFyZSBzYWZlIHRvIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgb2Ygc2hlbGwgY29tbWFuZHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcCBUaGUgaW5pdGlhbCByZW1vdGUgcGF0aFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVzY2FwZWQgcGF0aCB2YWx1ZVxuICovXG5mdW5jdGlvbiBlc2NhcGVQYXRoIChwKSB7XG4gIHJldHVybiBwLnJlcGxhY2UoLycvZywgYFxcXFwnYCk7XG59XG5cbi8qKlxuICogUHVsbHMgYSByZW1vdGUgZmlsZSBmcm9tIHRoZSBkZXZpY2UuXG4gKiBJdCBpcyByZXF1aXJlZCwgdGhhdCBhIHBhY2thZ2UgaGFzIGRlYnVnZ2luZyBmbGFnIGVuYWJsZWRcbiAqIGluIG9yZGVyIHRvIGFjY2VzcyBpdHMgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYXBwIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IGVuY29kZWQgY29udGVudCBvZiB0aGUgcHVsbGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHVsbCBvcGVyYXRpb24gZmFpbGVkXG4gKi9cbmNvbW1hbmRzLnB1bGxGaWxlID0gYXN5bmMgZnVuY3Rpb24gcHVsbEZpbGUgKHJlbW90ZVBhdGgpIHtcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGlkZW50aWZpZXIgJyR7cGFja2FnZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofScuIFdpbGwgZ2V0IHRoZSBkYXRhIGZyb20gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICdydW4tYXMnLCBwYWNrYWdlSWQsXG4gICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9JyAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nYFxuICAgICAgXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbCh0bXBEZXN0aW5hdGlvbiB8fCByZW1vdGVQYXRoLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsRmlsZSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2NhbEZpbGUpKSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxGaWxlKTtcbiAgICB9XG4gICAgaWYgKHRtcERlc3RpbmF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3JtJywgJy1mJywgdG1wRGVzdGluYXRpb25dKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHVsbEZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhbiBhcHAgYnVuZGxlLFxuICogZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvbXkvcGF0aGAuIEl0IGlzIG1hbmRhdG9yeSBmb3IgdGhlIGFwcCBidW5kbGUgdG8gaGF2ZVxuICogZGVidWdnaW5nIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBsYXR0ZXIgcmVtb3RlUGF0aCBmb3JtYXQuXG4gKi9cblxuLyoqXG4gKiBQdWxscyBhIHJlbW90ZSBmaWxlIGZyb20gdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGaWxlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgYHB1bGxGaWxlYFxuICovXG5jb21tYW5kcy5tb2JpbGVQdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRmlsZShyZW1vdGVQYXRoKTtcbn07XG5cbi8qKlxuICogUHVzaGVzIHRoZSBnaXZlbiBkYXRhIHRvIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICogQWZ0ZXIgYSBmaWxlIGlzIHB1c2hlZCBpdCBnZXRzIGF1dG9tYXRpY2FsbHkgc2Nhbm5lZCBmb3IgcG9zc2libGVcbiAqIG1lZGlhIG9jY3VycmVuY2VzLiBJZiB0aGUgc2NhbiBzdWNjZWVkcyB0aGVuIHRoZSBmaWxlIGlzIGFkZGVkIHRvIHRoZVxuICogbWVkaWEgbGlicmFyeS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZSBvclxuICogYSBmaWxlIGluc2lkZSBhIHBhY2thZ2UgYnVuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0RGF0YSBCYXNlNjQgZW5jb2RlZCBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlXG4gKiByZW1vdGUgZmlsZS4gVGhlIHJlbW90ZSBmaWxlIHdpbGwgYmUgc2lsZW50bHkgb3ZlcnJpZGRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcHVzaGluZyB0aGUgZGF0YVxuICovXG5jb21tYW5kcy5wdXNoRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIHB1c2hGaWxlIChyZW1vdGVQYXRoLCBiYXNlNjREYXRhKSB7XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGBcbiAgICApO1xuICB9XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnRtcCd9KTtcbiAgaWYgKF8uaXNBcnJheShiYXNlNjREYXRhKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cyAoYWhlbSkgamF2YSwgc2VuZCBhIGJ5dGUgYXJyYXkgZW5jb2RpbmcgdXRmOCBjaGFyYWN0ZXJzXG4gICAgLy8gaW5zdGVhZCBvZiBhIHN0cmluZywgd2hpY2ggd291bGQgYmUgaW5maW5pdGVseSBiZXR0ZXIhXG4gICAgYmFzZTY0RGF0YSA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEpLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgY29uc3QgY29udGVudCA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsICdiYXNlNjQnKTtcbiAgbGV0IHRtcERlc3RpbmF0aW9uID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxGaWxlLCBjb250ZW50LnRvU3RyaW5nKCdiaW5hcnknKSwgJ2JpbmFyeScpO1xuICAgIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBgICtcbiAgICAgICAgYFdpbGwgcHV0IHRoZSBkYXRhIGludG8gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICAgIHRtcERlc3RpbmF0aW9uID0gYC9kYXRhL2xvY2FsL3RtcC8ke3BhdGgucG9zaXguYmFzZW5hbWUocGF0aEluQ29udGFpbmVyKX1gO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoXG4gICAgICAgICAgWydydW4tYXMnLCBwYWNrYWdlSWQsIGBta2RpciAtcCAnJHtlc2NhcGVQYXRoKHBhdGgucG9zaXguZGlybmFtZShwYXRoSW5Db250YWluZXIpKX0nYF1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGB0b3VjaCAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BdKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCB0bXBEZXN0aW5hdGlvbik7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYFxuICAgICAgICBdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYWRiIHB1c2ggY3JlYXRlcyBmb2xkZXJzIGFuZCBvdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzLlxuICAgICAgYXdhaXQgdGhpcy5hZGIucHVzaChsb2NhbEZpbGUsIHJlbW90ZVBhdGgpO1xuXG4gICAgICAvLyBpZiB3ZSBoYXZlIHB1c2hlZCBhIGZpbGUsIGl0IG1pZ2h0IGJlIGEgbWVkaWEgZmlsZSwgc28gZW5zdXJlIHRoYXRcbiAgICAgIC8vIGFwcHMga25vdyBhYm91dCBpdFxuICAgICAgYXdhaXQgc2Nhbk1lZGlhKHRoaXMuYWRiLCByZW1vdGVQYXRoLCB0aGlzLmxvZyk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICAgIGlmICh0bXBEZXN0aW5hdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydybScsICctZicsIHRtcERlc3RpbmF0aW9uXSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1c2hGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYW4gYXBwIGJ1bmRsZSxcbiAqIGZvciBleGFtcGxlIGBAbXkuYXBwLmlkL215L3BhdGhgLiBJdCBpcyBtYW5kYXRvcnkgZm9yIHRoZSBhcHAgYnVuZGxlIHRvIGhhdmVcbiAqIGRlYnVnZ2luZyBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSB0aGUgbGF0dGVyIHJlbW90ZVBhdGggZm9ybWF0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBheWxvYWQgQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgZmlsZSB0byBiZSBwdXNoZWQuXG4gKi9cblxuLyoqXG4gKiBQdXNoZXMgdGhlIGdpdmVuIGRhdGEgdG8gYSBmaWxlIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7UHVzaEZpbGVPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVB1c2hGaWxlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUHVzaEZpbGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHJlbW90ZVBhdGgsIHBheWxvYWQgfSA9IHJlcXVpcmVBcmdzKFsncmVtb3RlUGF0aCcsICdwYXlsb2FkJ10sIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdXNoRmlsZShyZW1vdGVQYXRoLCBwYXlsb2FkKTtcbn07XG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byBhIGZvbGRlciBvbiB0aGVcbiAqIHJlbW90ZSBkZXZpY2Ugb3IgYSBmb2xkZXIgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgYW5kIHppcHBlZCBjb250ZW50IG9mIHRoZSBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGdldHRpbmcgdGhlIGZvbGRlciBjb250ZW50XG4gKi9cbmNvbW1hbmRzLnB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBwdWxsRm9sZGVyIChyZW1vdGVQYXRoKSB7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKHJlbW90ZVBhdGgsIHRtcFJvb3QpO1xuICAgIHJldHVybiAoYXdhaXQgemlwLnRvSW5NZW1vcnlaaXAodG1wUm9vdCwge1xuICAgICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gICAgfSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1bGxGb2xkZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyLlxuICovXG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGb2xkZXJPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2FtZSBhcyBgcHVsbEZvbGRlcmBcbiAqL1xuY29tbWFuZHMubW9iaWxlUHVsbEZvbGRlciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGb2xkZXIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHJlbW90ZVBhdGggfSA9IHJlcXVpcmVBcmdzKCdyZW1vdGVQYXRoJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnB1bGxGb2xkZXIocmVtb3RlUGF0aCk7XG59O1xuXG4vKipcbiAqIERlbGV0ZXMgdGhlIGdpdmVuIGZvbGRlciBvciBmaWxlIGZyb20gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyXG4gKiBvciBmaWxlIChmb2xkZXIgbmFtZXMgbXVzdCBlbmQgd2l0aCBhIHNpbmdsZSBzbGFzaClcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgcmVtb3RlIHBhdGggaXMgaW52YWxpZCBvclxuICogdGhlIHBhY2thZ2UgY29udGVudCBjYW5ub3QgYmUgYWNjZXNzZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlbW90ZSBpdGVtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLlxuICogSWYgdGhlIHJlbW90ZSBwYXRoIGlzIHZhbGlkLCBidXQgdGhlIHJlbW90ZSBwYXRoIGRvZXMgbm90IGV4aXN0XG4gKiB0aGlzIGZ1bmN0aW9uIHJldHVybiBgZmFsc2VgLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGaWxlT3JGb2xkZXIgKGFkYiwgcmVtb3RlUGF0aCkge1xuICBjb25zdCBwZXJmb3JtUmVtb3RlRnNDaGVjayA9IGFzeW5jIChwLCBvcCwgcnVuQXMgPSBudWxsKSA9PiB7XG4gICAgY29uc3QgcGFzc0ZsYWcgPSAnX19QQVNTX18nO1xuICAgIGNvbnN0IGNoZWNrQ21kID0gYFsgLSR7b3B9ICcke2VzY2FwZVBhdGgocCl9JyBdICYmIGVjaG8gJHtwYXNzRmxhZ31gO1xuICAgIGNvbnN0IGZ1bGxDbWQgPSBydW5BcyA/IGBydW4tYXMgJHtydW5Bc30gJHtjaGVja0NtZH1gIDogY2hlY2tDbWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBfLmluY2x1ZGVzKGF3YWl0IGFkYi5zaGVsbChbZnVsbENtZF0pLCBwYXNzRmxhZyk7XG4gICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc0ZpbGUgPSBhc3luYyAocCwgcnVuQXMgPSBudWxsKSA9PiBhd2FpdCBwZXJmb3JtUmVtb3RlRnNDaGVjayhwLCAnZicsIHJ1bkFzKTtcbiAgY29uc3QgaXNEaXIgPSBhc3luYyAocCwgcnVuQXMgPSBudWxsKSA9PiBhd2FpdCBwZXJmb3JtUmVtb3RlRnNDaGVjayhwLCAnZCcsIHJ1bkFzKTtcbiAgY29uc3QgaXNQcmVzZW50ID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2UnLCBydW5Bcyk7XG5cbiAgbGV0IGRzdFBhdGggPSByZW1vdGVQYXRoO1xuICBsZXQgcGtnSWQgPSBudWxsO1xuICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nYCk7XG4gICAgZHN0UGF0aCA9IHBhdGhJbkNvbnRhaW5lcjtcbiAgICBwa2dJZCA9IHBhY2thZ2VJZDtcbiAgfVxuXG4gIGlmIChwa2dJZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydydW4tYXMnLCBwa2dJZCwgJ2xzJ10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwa2dJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgZG9lcyBub3QgZXhpc3QuIFBlcmhhcHMsIGFscmVhZHkgZGVsZXRlZD9gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBleHBlY3RzRmlsZSA9ICFyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJyk7XG4gIGlmIChleHBlY3RzRmlsZSAmJiAhYXdhaXQgaXNGaWxlKGRzdFBhdGgsIHBrZ0lkKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBpdGVtIGF0ICcke2RzdFBhdGh9JyBpcyBub3QgYSBmaWxlYCk7XG4gIH0gZWxzZSBpZiAoIWV4cGVjdHNGaWxlICYmICFhd2FpdCBpc0Rpcihkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZm9sZGVyYCk7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoXG4gICAgICBbJ3J1bi1hcycsIHBrZ0lkLCBgcm0gLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9ICcke2VzY2FwZVBhdGgoZHN0UGF0aCl9J2BdKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoWydybScsIGAtZiR7ZXhwZWN0c0ZpbGUgPyAnJyA6ICdyJ31gLCBkc3RQYXRoXSk7XG4gIH1cbiAgaWYgKGF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgc3RpbGwgZXhpc3RzIGFmdGVyIGJlaW5nIGRlbGV0ZWQuIGAgK1xuICAgICAgYElzIGl0IHdyaXRhYmxlP2ApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlbGV0ZUZpbGVPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgZmlsZSBpbnNpZGUgYW4gYXBwbGljYXRpb24gYnVuZGxlIChmb3IgZXhhbXBsZSBgQG15LmFwcC5pZC9wYXRoL2luL2J1bmRsZWApXG4gKi9cblxuLyoqXG4gKiBEZWxldGVzIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7RGVsZXRlRmlsZU9wdHN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlbW90ZSBmaWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLlxuICogSWYgdGhlIHBhdGggdG8gYSByZW1vdGUgZmlsZSBpcyB2YWxpZCwgYnV0IHRoZSBmaWxlIGl0c2VsZiBkb2VzIG5vdCBleGlzdFxuICogdGhlbiBgZmFsc2VgIGlzIHJldHVybmVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBhcmd1bWVudCBpcyBpbnZhbGlkIG9yIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZVxuICogZGVsZXRpbmcgdGhlIGZpbGVcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVsZXRlRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURlbGV0ZUZpbGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7cmVtb3RlUGF0aH0gPSBvcHRzO1xuICBpZiAoIXJlbW90ZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ3JlbW90ZVBhdGgnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZm9sZGVyIGFuZCBub3QgdG8gYSBmaWxlLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGBcbiAgICApO1xuICB9XG4gIHJldHVybiBhd2FpdCBkZWxldGVGaWxlT3JGb2xkZXIodGhpcy5hZGIsIHJlbW90ZVBhdGgpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQSxNQUFNQSxxQkFBcUIsR0FBRyxHQUFHO0FBRWpDLE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLE1BQU0sQ0FBRSxJQUFHRixxQkFBc0IsY0FBYSxDQUFDO0FBQ2xGLE1BQU1HLDJCQUEyQixHQUFHLCtDQUErQztBQUduRixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxDQUFDOztBQUFDO0FBV3BCLFNBQVNDLGtCQUFrQixDQUFFQyxVQUFVLEVBQUU7RUFDdkMsTUFBTUMsS0FB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
219
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT05UQUlORVJfUEFUSF9NQVJLRVIiLCJDT05UQUlORVJfUEFUSF9QQVRURVJOIiwiUmVnRXhwIiwiQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UIiwiY29tbWFuZHMiLCJwYXJzZUNvbnRhaW5lclBhdGgiLCJyZW1vdGVQYXRoIiwibWF0Y2giLCJleGVjIiwiRXJyb3IiLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwibG9nIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwidG1wRGVzdGluYXRpb24iLCJzdGFydHNXaXRoIiwicGFja2FnZUlkIiwicGF0aEluQ29udGFpbmVyIiwiYmFzZW5hbWUiLCJlcnJvckFuZFRocm93IiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJtb2JpbGVQdWxsRmlsZSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsIl8iLCJpc0FycmF5IiwiQnVmZmVyIiwiZnJvbSIsImNvbnRlbnQiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwicHVzaCIsIm1vYmlsZVB1c2hGaWxlIiwicGF5bG9hZCIsInB1bGxGb2xkZXIiLCJ0bXBSb290Iiwib3BlbkRpciIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInJpbXJhZiIsIm1vYmlsZVB1bGxGb2xkZXIiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJtb2JpbGVEZWxldGVGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ZpbGUtYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHppcCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgcmVxdWlyZUFyZ3MgfSBmcm9tICcuLi91dGlscyc7XG5cblxuY29uc3QgQ09OVEFJTkVSX1BBVEhfTUFSS0VSID0gJ0AnO1xuLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci9QTGRCMEcvMlxuY29uc3QgQ09OVEFJTkVSX1BBVEhfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke0NPTlRBSU5FUl9QQVRIX01BUktFUn0oW14vXSspLyguKylgKTtcbmNvbnN0IEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUVESUFfU0NBTk5FUl9TQ0FOX0ZJTEUnO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogUGFyc2VzIHRoZSBhY3R1YWwgZGVzdGluYXRpb24gcGF0aCBmcm9tIHRoZSBnaXZlbiB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBwcmVmb3JtYXR0ZWQgcmVtb3RlIHBhdGgsIHdoaWNoIGxvb2tzIGxpa2VcbiAqIGBAbXkuYXBwLmlkL215L3BhdGhgXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXksIHdoZXJlIHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBwYXJzZWQgcGFja2FnZVxuICogaWRlbnRpZmllciBhbmQgdGhlIHNlY29uZCBvbmUgaXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGluc2lkZSB0aGUgcGFja2FnZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gc3RyaW5nIGNhbm5vdCBiZSBwYXJzZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250YWluZXJQYXRoIChyZW1vdGVQYXRoKSB7XG4gIGNvbnN0IG1hdGNoID0gQ09OVEFJTkVSX1BBVEhfUEFUVEVSTi5leGVjKHJlbW90ZVBhdGgpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJdCBpcyBleHBlY3RlZCB0aGF0IHBhY2thZ2UgaWRlbnRpZmllciBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgcmVsYXRpdmUgcGF0aCB3aXRoIGEgc2luZ2xlIHNsYXNoLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiBbbWF0Y2hbMV0sIHBhdGgucG9zaXgucmVzb2x2ZShgL2RhdGEvZGF0YS8ke21hdGNoWzFdfWAsIG1hdGNoWzJdKV07XG59XG5cbi8qKlxuICogU2NhbnMgdGhlIGdpdmVuIGZpbGUvZm9sZGVyIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKiBhbmQgYWRkcyBtYXRjaGluZyBpdGVtcyB0byB0aGUgZGV2aWNlJ3MgbWVkaWEgbGlicmFyeS5cbiAqIEV4Y2VwdGlvbnMgYXJlIGlnbm9yZWQgYW5kIHdyaXR0ZW4gaW50byB0aGUgbG9nLlxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmaWxlL2ZvbGRlciBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5NZWRpYSAoYWRiLCByZW1vdGVQYXRoLCBsb2cgPSBudWxsKSB7XG4gIGxvZz8uZGVidWcoYFBlcmZvcm1pbmcgbWVkaWEgc2NhbiBvZiAnJHtyZW1vdGVQYXRofSdgKTtcbiAgdHJ5IHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTYxODRcbiAgICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjkpIHtcbiAgICAgIGF3YWl0IGFkYi5zY2FuTWVkaWEocmVtb3RlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbXG4gICAgICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICAgICAnLWEnLCBBTkRST0lEX01FRElBX1JFU0NBTl9JTlRFTlQsXG4gICAgICAgICctZCcsIGBmaWxlOi8vJHtyZW1vdGVQYXRofWBcbiAgICAgIF0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZz8ud2FybihgSWdub3JpbmcgYW4gdW5leHBlY3RlZCBlcnJvciB1cG9uIG1lZGlhIHNjYW5uaW5nIG9mICcke3JlbW90ZVBhdGh9JzogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNtYWxsIGhlbHBlciwgd2hpY2ggZXNjYXBlcyBzaW5nbGUgcXVvdGVzIGluIHBhdGhzLFxuICogc28gdGhleSBhcmUgc2FmZSB0byBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIG9mIHNoZWxsIGNvbW1hbmRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgVGhlIGluaXRpYWwgcmVtb3RlIHBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlc2NhcGVkIHBhdGggdmFsdWVcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUGF0aCAocCkge1xuICByZXR1cm4gcC5yZXBsYWNlKC8nL2csIGBcXFxcJ2ApO1xufVxuXG4vKipcbiAqIFB1bGxzIGEgcmVtb3RlIGZpbGUgZnJvbSB0aGUgZGV2aWNlLlxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGFuIGl0ZW0gaW5zaWRlIGFwcCBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHB1bGxlZCBmaWxlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHB1bGwgb3BlcmF0aW9uIGZhaWxlZFxuICovXG5jb21tYW5kcy5wdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxGaWxlIChyZW1vdGVQYXRoKSB7XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZpbGUgYW5kIG5vdCB0byBhIGZvbGRlci4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBsZXQgdG1wRGVzdGluYXRpb24gPSBudWxsO1xuICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBXaWxsIGdldCB0aGUgZGF0YSBmcm9tICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgdG1wRGVzdGluYXRpb24gPSBgL2RhdGEvbG9jYWwvdG1wLyR7cGF0aC5wb3NpeC5iYXNlbmFtZShwYXRoSW5Db250YWluZXIpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfScgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9J2BcbiAgICAgIF0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwYWNrYWdlSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgSXMgdGhlIGFwcGxpY2F0aW9uIGluc3RhbGxlZCBhbmQgaGFzICdkZWJ1Z2dhYmxlJyBidWlsZCBvcHRpb24gc2V0IHRvIHRydWU/IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbG9jYWxGaWxlID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nLCBzdWZmaXg6ICcudG1wJ30pO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1bGwodG1wRGVzdGluYXRpb24gfHwgcmVtb3RlUGF0aCwgbG9jYWxGaWxlKTtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICAgIGlmICh0bXBEZXN0aW5hdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydybScsICctZicsIHRtcERlc3RpbmF0aW9uXSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1bGxGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYW4gYXBwIGJ1bmRsZSxcbiAqIGZvciBleGFtcGxlIGBAbXkuYXBwLmlkL215L3BhdGhgLiBJdCBpcyBtYW5kYXRvcnkgZm9yIHRoZSBhcHAgYnVuZGxlIHRvIGhhdmVcbiAqIGRlYnVnZ2luZyBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSB0aGUgbGF0dGVyIHJlbW90ZVBhdGggZm9ybWF0LlxuICovXG5cbi8qKlxuICogUHVsbHMgYSByZW1vdGUgZmlsZSBmcm9tIHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtQdWxsRmlsZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzYW1lIGFzIGBwdWxsRmlsZWBcbiAqL1xuY29tbWFuZHMubW9iaWxlUHVsbEZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQdWxsRmlsZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcmVtb3RlUGF0aCB9ID0gcmVxdWlyZUFyZ3MoJ3JlbW90ZVBhdGgnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHVsbEZpbGUocmVtb3RlUGF0aCk7XG59O1xuXG4vKipcbiAqIFB1c2hlcyB0aGUgZ2l2ZW4gZGF0YSB0byBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqIEl0IGlzIHJlcXVpcmVkLCB0aGF0IGEgcGFja2FnZSBoYXMgZGVidWdnaW5nIGZsYWcgZW5hYmxlZFxuICogaW4gb3JkZXIgdG8gYWNjZXNzIGl0cyBmaWxlcy5cbiAqIEFmdGVyIGEgZmlsZSBpcyBwdXNoZWQgaXQgZ2V0cyBhdXRvbWF0aWNhbGx5IHNjYW5uZWQgZm9yIHBvc3NpYmxlXG4gKiBtZWRpYSBvY2N1cnJlbmNlcy4gSWYgdGhlIHNjYW4gc3VjY2VlZHMgdGhlbiB0aGUgZmlsZSBpcyBhZGRlZCB0byB0aGVcbiAqIG1lZGlhIGxpYnJhcnkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGUgb3JcbiAqIGEgZmlsZSBpbnNpZGUgYSBwYWNrYWdlIGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgQmFzZTY0IGVuY29kZWQgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZVxuICogcmVtb3RlIGZpbGUuIFRoZSByZW1vdGUgZmlsZSB3aWxsIGJlIHNpbGVudGx5IG92ZXJyaWRkZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHB1c2hpbmcgdGhlIGRhdGFcbiAqL1xuY29tbWFuZHMucHVzaEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdXNoRmlsZSAocmVtb3RlUGF0aCwgYmFzZTY0RGF0YSkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZpbGUgYW5kIG5vdCB0byBhIGZvbGRlci4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgXG4gICAgKTtcbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIGlmIChfLmlzQXJyYXkoYmFzZTY0RGF0YSkpIHtcbiAgICAvLyBzb21lIGNsaWVudHMgKGFoZW0pIGphdmEsIHNlbmQgYSBieXRlIGFycmF5IGVuY29kaW5nIHV0ZjggY2hhcmFjdGVyc1xuICAgIC8vIGluc3RlYWQgb2YgYSBzdHJpbmcsIHdoaWNoIHdvdWxkIGJlIGluZmluaXRlbHkgYmV0dGVyIVxuICAgIGJhc2U2NERhdGEgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhKS50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhLCAnYmFzZTY0Jyk7XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvY2FsRmlsZSwgY29udGVudC50b1N0cmluZygnYmluYXJ5JyksICdiaW5hcnknKTtcbiAgICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9Jy4gYCArXG4gICAgICAgIGBXaWxsIHB1dCB0aGUgZGF0YSBpbnRvICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFxuICAgICAgICAgIFsncnVuLWFzJywgcGFja2FnZUlkLCBgbWtkaXIgLXAgJyR7ZXNjYXBlUGF0aChwYXRoLnBvc2l4LmRpcm5hbWUocGF0aEluQ29udGFpbmVyKSl9J2BdXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgdG91Y2ggJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5wdXNoKGxvY2FsRmlsZSwgdG1wRGVzdGluYXRpb24pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICAgJ3J1bi1hcycsIHBhY2thZ2VJZCxcbiAgICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9JyAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BcbiAgICAgICAgXSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwYWNrYWdlSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkYiBwdXNoIGNyZWF0ZXMgZm9sZGVycyBhbmQgb3ZlcndyaXRlcyBleGlzdGluZyBmaWxlcy5cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCByZW1vdGVQYXRoKTtcblxuICAgICAgLy8gaWYgd2UgaGF2ZSBwdXNoZWQgYSBmaWxlLCBpdCBtaWdodCBiZSBhIG1lZGlhIGZpbGUsIHNvIGVuc3VyZSB0aGF0XG4gICAgICAvLyBhcHBzIGtub3cgYWJvdXQgaXRcbiAgICAgIGF3YWl0IHNjYW5NZWRpYSh0aGlzLmFkYiwgcmVtb3RlUGF0aCwgdGhpcy5sb2cpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgICBpZiAodG1wRGVzdGluYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncm0nLCAnLWYnLCB0bXBEZXN0aW5hdGlvbl0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdXNoRmlsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGFuIGl0ZW0gaW5zaWRlIGFuIGFwcCBidW5kbGUsXG4gKiBmb3IgZXhhbXBsZSBgQG15LmFwcC5pZC9teS9wYXRoYC4gSXQgaXMgbWFuZGF0b3J5IGZvciB0aGUgYXBwIGJ1bmRsZSB0byBoYXZlXG4gKiBkZWJ1Z2dpbmcgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlIGxhdHRlciByZW1vdGVQYXRoIGZvcm1hdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXlsb2FkIEJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gYmUgcHVzaGVkLlxuICovXG5cbi8qKlxuICogUHVzaGVzIHRoZSBnaXZlbiBkYXRhIHRvIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge1B1c2hGaWxlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQdXNoRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1c2hGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoLCBwYXlsb2FkIH0gPSByZXF1aXJlQXJncyhbJ3JlbW90ZVBhdGgnLCAncGF5bG9hZCddLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHVzaEZpbGUocmVtb3RlUGF0aCwgcGF5bG9hZCk7XG59O1xuXG4vKipcbiAqIFB1bGxzIHRoZSB3aG9sZSBmb2xkZXIgZnJvbSB0aGUgcmVtb3RlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gYSBmb2xkZXIgb24gdGhlXG4gKiByZW1vdGUgZGV2aWNlIG9yIGEgZm9sZGVyIGluc2lkZSBhbiBhcHBsaWNhdGlvbiBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NC1lbmNvZGVkIGFuZCB6aXBwZWQgY29udGVudCBvZiB0aGUgZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBnZXR0aW5nIHRoZSBmb2xkZXIgY29udGVudFxuICovXG5jb21tYW5kcy5wdWxsRm9sZGVyID0gYXN5bmMgZnVuY3Rpb24gcHVsbEZvbGRlciAocmVtb3RlUGF0aCkge1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbChyZW1vdGVQYXRoLCB0bXBSb290KTtcbiAgICByZXR1cm4gKGF3YWl0IHppcC50b0luTWVtb3J5WmlwKHRtcFJvb3QsIHtcbiAgICAgIGVuY29kZVRvQmFzZTY0OiB0cnVlLFxuICAgIH0pKS50b1N0cmluZygpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdWxsRm9sZGVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlci5cbiAqL1xuXG4vKipcbiAqIFB1bGxzIHRoZSB3aG9sZSBmb2xkZXIgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtQdWxsRm9sZGVyT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgYHB1bGxGb2xkZXJgXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQdWxsRm9sZGVyIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRm9sZGVyKHJlbW90ZVBhdGgpO1xufTtcblxuLyoqXG4gKiBEZWxldGVzIHRoZSBnaXZlbiBmb2xkZXIgb3IgZmlsZSBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlclxuICogb3IgZmlsZSAoZm9sZGVyIG5hbWVzIG11c3QgZW5kIHdpdGggYSBzaW5nbGUgc2xhc2gpXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIHJlbW90ZSBwYXRoIGlzIGludmFsaWQgb3JcbiAqIHRoZSBwYWNrYWdlIGNvbnRlbnQgY2Fubm90IGJlIGFjY2Vzc2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgaXRlbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSByZW1vdGUgcGF0aCBpcyB2YWxpZCwgYnV0IHRoZSByZW1vdGUgcGF0aCBkb2VzIG5vdCBleGlzdFxuICogdGhpcyBmdW5jdGlvbiByZXR1cm4gYGZhbHNlYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRmlsZU9yRm9sZGVyIChhZGIsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgcGVyZm9ybVJlbW90ZUZzQ2hlY2sgPSBhc3luYyAocCwgb3AsIHJ1bkFzID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhc3NGbGFnID0gJ19fUEFTU19fJztcbiAgICBjb25zdCBjaGVja0NtZCA9IGBbIC0ke29wfSAnJHtlc2NhcGVQYXRoKHApfScgXSAmJiBlY2hvICR7cGFzc0ZsYWd9YDtcbiAgICBjb25zdCBmdWxsQ21kID0gcnVuQXMgPyBgcnVuLWFzICR7cnVuQXN9ICR7Y2hlY2tDbWR9YCA6IGNoZWNrQ21kO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlcyhhd2FpdCBhZGIuc2hlbGwoW2Z1bGxDbWRdKSwgcGFzc0ZsYWcpO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNGaWxlID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2YnLCBydW5Bcyk7XG4gIGNvbnN0IGlzRGlyID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2QnLCBydW5Bcyk7XG4gIGNvbnN0IGlzUHJlc2VudCA9IGFzeW5jIChwLCBydW5BcyA9IG51bGwpID0+IGF3YWl0IHBlcmZvcm1SZW1vdGVGc0NoZWNrKHAsICdlJywgcnVuQXMpO1xuXG4gIGxldCBkc3RQYXRoID0gcmVtb3RlUGF0aDtcbiAgbGV0IHBrZ0lkID0gbnVsbDtcbiAgaWYgKHJlbW90ZVBhdGguc3RhcnRzV2l0aChDT05UQUlORVJfUEFUSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIGRzdFBhdGggPSBwYXRoSW5Db250YWluZXI7XG4gICAgcGtnSWQgPSBwYWNrYWdlSWQ7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsncnVuLWFzJywgcGtnSWQsICdscyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWNjZXNzIHRoZSBjb250YWluZXIgb2YgJyR7cGtnSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFhd2FpdCBpc1ByZXNlbnQoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGRvZXMgbm90IGV4aXN0LiBQZXJoYXBzLCBhbHJlYWR5IGRlbGV0ZWQ/YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXhwZWN0c0ZpbGUgPSAhcmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpO1xuICBpZiAoZXhwZWN0c0ZpbGUgJiYgIWF3YWl0IGlzRmlsZShkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZmlsZWApO1xuICB9IGVsc2UgaWYgKCFleHBlY3RzRmlsZSAmJiAhYXdhaXQgaXNEaXIoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGlzIG5vdCBhIGZvbGRlcmApO1xuICB9XG5cbiAgaWYgKHBrZ0lkKSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFxuICAgICAgWydydW4tYXMnLCBwa2dJZCwgYHJtIC1mJHtleHBlY3RzRmlsZSA/ICcnIDogJ3InfSAnJHtlc2NhcGVQYXRoKGRzdFBhdGgpfSdgXSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFsncm0nLCBgLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9YCwgZHN0UGF0aF0pO1xuICB9XG4gIGlmIChhd2FpdCBpc1ByZXNlbnQoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIHN0aWxsIGV4aXN0cyBhZnRlciBiZWluZyBkZWxldGVkLiBgICtcbiAgICAgIGBJcyBpdCB3cml0YWJsZT9gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWxldGVGaWxlT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIGZpbGUgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZSAoZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvcGF0aC9pbi9idW5kbGVgKVxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0RlbGV0ZUZpbGVPcHRzfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgZmlsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSBwYXRoIHRvIGEgcmVtb3RlIGZpbGUgaXMgdmFsaWQsIGJ1dCB0aGUgZmlsZSBpdHNlbGYgZG9lcyBub3QgZXhpc3RcbiAqIHRoZW4gYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXJndW1lbnQgaXMgaW52YWxpZCBvciB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGVcbiAqIGRlbGV0aW5nIHRoZSBmaWxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlbGV0ZUZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEZWxldGVGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3JlbW90ZVBhdGh9ID0gb3B0cztcbiAgaWYgKCFyZW1vdGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVGhlICdyZW1vdGVQYXRoJyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZvbGRlciBhbmQgbm90IHRvIGEgZmlsZS4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgZGVsZXRlRmlsZU9yRm9sZGVyKHRoaXMuYWRiLCByZW1vdGVQYXRoKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEscUJBQXFCLEdBQUcsR0FBRztBQUVqQyxNQUFNQyxzQkFBc0IsR0FBRyxJQUFJQyxNQUFNLENBQUUsSUFBR0YscUJBQXNCLGNBQWEsQ0FBQztBQUNsRixNQUFNRywyQkFBMkIsR0FBRywrQ0FBK0M7QUFHbkYsTUFBTUMsUUFBUSxHQUFHLENBQUMsQ0FBQzs7QUFBQztBQVdwQixTQUFTQyxrQkFBa0IsQ0FBRUMsVUFBVSxFQUFFO0VBQ3ZDLE1BQU1DLEtB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
@@ -1 +1 @@
1
- {"version":3,"file":"file-actions.js","names":["CONTAINER_PATH_MARKER","CONTAINER_PATH_PATTERN","RegExp","ANDROID_MEDIA_RESCAN_INTENT","commands","parseContainerPath","remotePath","match","exec","Error","path","posix","resolve","scanMedia","adb","log","debug","getApiLevel","shell","e","warn","stderr","message","escapePath","p","replace","pullFile","endsWith","errors","InvalidArgumentError","tmpDestination","startsWith","packageId","pathInContainer","basename","errorAndThrow","localFile","tempDir","prefix","suffix","pull","util","toInMemoryBase64","toString","fs","exists","unlink","mobilePullFile","opts","requireArgs","pushFile","base64Data","_","isArray","Buffer","from","content","writeFile","dirname","push","mobilePushFile","payload","pullFolder","tmpRoot","openDir","zip","toInMemoryZip","encodeToBase64","rimraf","mobilePullFolder","deleteFileOrFolder","performRemoteFsCheck","op","runAs","passFlag","checkCmd","fullCmd","includes","ign","isFile","isDir","isPresent","dstPath","pkgId","info","expectsFile","mobileDeleteFile"],"sources":["../../../lib/commands/file-actions.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, util, zip, tempDir } from 'appium/support';\nimport path from 'path';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\n\nconst CONTAINER_PATH_MARKER = '@';\n// https://regex101.com/r/PLdB0G/2\nconst CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.+)`);\nconst ANDROID_MEDIA_RESCAN_INTENT = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE';\n\n\nconst commands = {};\n\n/**\n * Parses the actual destination path from the given value\n *\n * @param {string} remotePath The preformatted remote path, which looks like\n * `@my.app.id/my/path`\n * @returns {Array<string>} An array, where the first item is the parsed package\n * identifier and the second one is the actual destination path inside the package.\n * @throws {Error} If the given string cannot be parsed\n */\nfunction parseContainerPath (remotePath) {\n const match = CONTAINER_PATH_PATTERN.exec(remotePath);\n if (!match) {\n throw new Error(`It is expected that package identifier is separated from the relative path with a single slash. ` +\n `'${remotePath}' is given instead`);\n }\n return [match[1], path.posix.resolve(`/data/data/${match[1]}`, match[2])];\n}\n\n/**\n * Scans the given file/folder on the remote device\n * and adds matching items to the device's media library.\n * Exceptions are ignored and written into the log.\n *\n * @param {ADB} adb ADB instance\n * @param {Object?} log Logger instance\n * @param {string} remotePath The file/folder path on the remote device\n */\nasync function scanMedia (adb, remotePath, log = null) {\n log?.debug(`Performing media scan of '${remotePath}'`);\n try {\n // https://github.com/appium/appium/issues/16184\n if (await adb.getApiLevel() >= 29) {\n await adb.scanMedia(remotePath);\n } else {\n await adb.shell([\n 'am', 'broadcast',\n '-a', ANDROID_MEDIA_RESCAN_INTENT,\n '-d', `file://${remotePath}`\n ]);\n }\n } catch (e) {\n log?.warn(`Ignoring an unexpected error upon media scanning of '${remotePath}': ${e.stderr || e.message}`);\n }\n}\n\n/**\n * A small helper, which escapes single quotes in paths,\n * so they are safe to be passed as arguments of shell commands\n *\n * @param {string} p The initial remote path\n * @returns {string} The escaped path value\n */\nfunction escapePath (p) {\n return p.replace(/'/g, `\\\\'`);\n}\n\n/**\n * Pulls a remote file from the device.\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n *\n * @param {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside app bundle\n * @returns {string} Base64 encoded content of the pulled file\n * @throws {Error} If the pull operation failed\n */\ncommands.pullFile = async function pullFile (remotePath) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`);\n }\n let tmpDestination = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. Will get the data from '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(pathInContainer)}' '${escapePath(tmpDestination)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n try {\n await this.adb.pull(tmpDestination || remotePath, localFile);\n return (await util.toInMemoryBase64(localFile)).toString();\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PullFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n */\n\n/**\n * Pulls a remote file from the device.\n *\n * @param {PullFileOptions} opts\n * @returns {string} The same as `pullFile`\n */\ncommands.mobilePullFile = async function mobilePullFile (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFile(remotePath);\n};\n\n/**\n * Pushes the given data to a file on the remote device\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n * After a file is pushed it gets automatically scanned for possible\n * media occurrences. If the scan succeeds then the file is added to the\n * media library.\n *\n * @param {string} remotePath The full path to the remote file or\n * a file inside a package bundle\n * @param {string} base64Data Base64 encoded data to be written to the\n * remote file. The remote file will be silently overridden if it already exists.\n * @throws {Error} If there was an error while pushing the data\n */\ncommands.pushFile = async function pushFile (remotePath, base64Data) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`\n );\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n if (_.isArray(base64Data)) {\n // some clients (ahem) java, send a byte array encoding utf8 characters\n // instead of a string, which would be infinitely better!\n base64Data = Buffer.from(base64Data).toString('utf8');\n }\n const content = Buffer.from(base64Data, 'base64');\n let tmpDestination = null;\n try {\n await fs.writeFile(localFile, content.toString('binary'), 'binary');\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. ` +\n `Will put the data into '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(\n ['run-as', packageId, `mkdir -p '${escapePath(path.posix.dirname(pathInContainer))}'`]\n );\n await this.adb.shell(['run-as', packageId, `touch '${escapePath(pathInContainer)}'`]);\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.push(localFile, tmpDestination);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(tmpDestination)}' '${escapePath(pathInContainer)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n } else {\n // adb push creates folders and overwrites existing files.\n await this.adb.push(localFile, remotePath);\n\n // if we have pushed a file, it might be a media file, so ensure that\n // apps know about it\n await scanMedia(this.adb, remotePath, this.log);\n }\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PushFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n * @property {string} payload Base64-encoded content of the file to be pushed.\n */\n\n/**\n * Pushes the given data to a file on the remote device.\n *\n * @param {PushFileOptions} opts\n */\ncommands.mobilePushFile = async function mobilePushFile (opts = {}) {\n const { remotePath, payload } = requireArgs(['remotePath', 'payload'], opts);\n return await this.pushFile(remotePath, payload);\n};\n\n/**\n * Pulls the whole folder from the remote device\n *\n * @param {string} remotePath The full path to a folder on the\n * remote device or a folder inside an application bundle\n * @returns {string} Base64-encoded and zipped content of the folder\n * @throws {Error} If there was a failure while getting the folder content\n */\ncommands.pullFolder = async function pullFolder (remotePath) {\n const tmpRoot = await tempDir.openDir();\n try {\n await this.adb.pull(remotePath, tmpRoot);\n return (await zip.toInMemoryZip(tmpRoot, {\n encodeToBase64: true,\n })).toString();\n } finally {\n await fs.rimraf(tmpRoot);\n }\n};\n\n/**\n * @typedef {Object} PullFolderOptions\n * @property {string} remotePath The full path to the remote folder.\n */\n\n/**\n * Pulls the whole folder from the device under test.\n *\n * @param {PullFolderOptions} opts\n * @returns {string} The same as `pullFolder`\n */\ncommands.mobilePullFolder = async function mobilePullFolder (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFolder(remotePath);\n};\n\n/**\n * Deletes the given folder or file from the remote device\n *\n * @param {ADB} adb\n * @param {string} remotePath The full path to the remote folder\n * or file (folder names must end with a single slash)\n * @throws {Error} If the provided remote path is invalid or\n * the package content cannot be accessed\n * @returns {boolean} `true` if the remote item has been successfully deleted.\n * If the remote path is valid, but the remote path does not exist\n * this function return `false`.\n */\nasync function deleteFileOrFolder (adb, remotePath) {\n const performRemoteFsCheck = async (p, op, runAs = null) => {\n const passFlag = '__PASS__';\n const checkCmd = `[ -${op} '${escapePath(p)}' ] && echo ${passFlag}`;\n const fullCmd = runAs ? `run-as ${runAs} ${checkCmd}` : checkCmd;\n try {\n return _.includes(await adb.shell([fullCmd]), passFlag);\n } catch (ign) {\n return false;\n }\n };\n const isFile = async (p, runAs = null) => await performRemoteFsCheck(p, 'f', runAs);\n const isDir = async (p, runAs = null) => await performRemoteFsCheck(p, 'd', runAs);\n const isPresent = async (p, runAs = null) => await performRemoteFsCheck(p, 'e', runAs);\n\n let dstPath = remotePath;\n let pkgId = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'`);\n dstPath = pathInContainer;\n pkgId = packageId;\n }\n\n if (pkgId) {\n try {\n await adb.shell(['run-as', pkgId, 'ls']);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${pkgId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n\n if (!await isPresent(dstPath, pkgId)) {\n this.log.info(`The item at '${dstPath}' does not exist. Perhaps, already deleted?`);\n return false;\n }\n\n const expectsFile = !remotePath.endsWith('/');\n if (expectsFile && !await isFile(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a file`);\n } else if (!expectsFile && !await isDir(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a folder`);\n }\n\n if (pkgId) {\n await adb.shell(\n ['run-as', pkgId, `rm -f${expectsFile ? '' : 'r'} '${escapePath(dstPath)}'`]);\n } else {\n await adb.shell(['rm', `-f${expectsFile ? '' : 'r'}`, dstPath]);\n }\n if (await isPresent(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' still exists after being deleted. ` +\n `Is it writable?`);\n }\n return true;\n}\n\n/**\n * @typedef {Object} DeleteFileOpts\n * @property {!string} remotePath The full path to the remote file\n * or a file inside an application bundle (for example `@my.app.id/path/in/bundle`)\n */\n\n/**\n * Deletes a file on the remote device\n *\n * @param {DeleteFileOpts} opts\n * @returns {boolean} `true` if the remote file has been successfully deleted.\n * If the path to a remote file is valid, but the file itself does not exist\n * then `false` is returned.\n * @throws {Error} If the argument is invalid or there was an error while\n * deleting the file\n */\ncommands.mobileDeleteFile = async function mobileDeleteFile (opts = {}) {\n const {remotePath} = opts;\n if (!remotePath) {\n throw new errors.InvalidArgumentError(`The 'remotePath' argument is mandatory`);\n }\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a folder and not to a file. ` +\n `'${remotePath}' is given instead`\n );\n }\n return await deleteFileOrFolder(this.adb, remotePath);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AAGA,MAAMA,qBAAqB,GAAG,GAAG;AAEjC,MAAMC,sBAAsB,GAAG,IAAIC,MAAM,CAAE,IAAGF,qBAAsB,cAAa,CAAC;AAClF,MAAMG,2BAA2B,GAAG,+CAA+C;AAGnF,MAAMC,QAAQ,GAAG,CAAC,CAAC;;AAAC;AAWpB,SAASC,kBAAkB,CAAEC,UAAU,EAAE;EACvC,MAAMC,KAAK,GAAGN,sBAAsB,CAACO,IAAI,CAACF,UAAU,CAAC;EACrD,IAAI,CAACC,KAAK,EAAE;IACV,MAAM,IAAIE,KAAK,CAAE,kGAAiG,GAC/G,IAAGH,UAAW,oBAAmB,CAAC;EACvC;EACA,OAAO,CAACC,KAAK,CAAC,CAAC,CAAC,EAAEG,aAAI,CAACC,KAAK,CAACC,OAAO,CAAE,cAAaL,KAAK,CAAC,CAAC,CAAE,EAAC,EAAEA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E;;AAWA,eAAeM,SAAS,CAAEC,GAAG,EAAER,UAAU,EAAES,GAAG,GAAG,IAAI,EAAE;EACrDA,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEC,KAAK,CAAE,6BAA4BV,UAAW,GAAE,CAAC;EACtD,IAAI;IAEF,IAAI,OAAMQ,GAAG,CAACG,WAAW,EAAE,KAAI,EAAE,EAAE;MACjC,MAAMH,GAAG,CAACD,SAAS,CAACP,UAAU,CAAC;IACjC,CAAC,MAAM;MACL,MAAMQ,GAAG,CAACI,KAAK,CAAC,CACd,IAAI,EAAE,WAAW,EACjB,IAAI,EAAEf,2BAA2B,EACjC,IAAI,EAAG,UAASG,UAAW,EAAC,CAC7B,CAAC;IACJ;EACF,CAAC,CAAC,OAAOa,CAAC,EAAE;IACVJ,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEK,IAAI,CAAE,wDAAuDd,UAAW,MAAKa,CAAC,CAACE,MAAM,IAAIF,CAAC,CAACG,OAAQ,EAAC,CAAC;EAC5G;AACF;;AASA,SAASC,UAAU,CAAEC,CAAC,EAAE;EACtB,OAAOA,CAAC,CAACC,OAAO,CAAC,IAAI,EAAG,KAAI,CAAC;AAC/B;;AAYArB,QAAQ,CAACsB,QAAQ,GAAG,eAAeA,QAAQ,CAAEpB,UAAU,EAAE;EACvD,IAAIA,UAAU,CAACqB,QAAQ,CAAC,GAAG,CAAC,EAAE;IAC5B,MAAM,IAAIC,cAAM,CAACC,oBAAoB,CAAE,wEAAuE,GAC3G,IAAGvB,UAAW,oBAAmB,CAAC;EACvC;EACA,IAAIwB,cAAc,GAAG,IAAI;EACzB,IAAIxB,UAAU,CAACyB,UAAU,CAAC/B,qBAAqB,CAAC,EAAE;IAChD,MAAM,CAACgC,SAAS,EAAEC,eAAe,CAAC,GAAG5B,kBAAkB,CAACC,UAAU,CAAC;IACnE,IAAI,CAACS,GAAG,CAACC,KAAK,CAAE,8BAA6BgB,SAAU,WAAU1B,UAAW,8BAA6B2B,eAAgB,GAAE,CAAC;IAC5HH,cAAc,GAAI,mBAAkBpB,aAAI,CAACC,KAAK,CAACuB,QAAQ,CAACD,eAAe,CAAE,EAAC;IAC1E,IAAI;MACF,MAAM,IAAI,CAACnB,GAAG,CAACI,KAAK,CAAC,CAAC,QAAQ,EAAEc,SAAS,EAAG,cAAaT,UAAU,CAACU,eAAe,CAAE,GAAE,CAAC,CAAC;MACzF,MAAM,IAAI,CAACnB,GAAG,CAACI,KAAK,CAAC,CACnB,QAAQ,EAAEc,SAAS,EAClB,UAAST,UAAU,CAACU,eAAe,CAAE,MAAKV,UAAU,CAACO,cAAc,CAAE,GAAE,CACzE,CAAC;IACJ,CAAC,CAAC,OAAOX,CAAC,EAAE;MACV,IAAI,CAACJ,GAAG,CAACoB,aAAa,CAAE,mCAAkCH,SAAU,iBAAgB,GACjE,8EAA6E,GAC7E,mBAAkBb,CAAC,CAACG,OAAQ,EAAC,CAAC;IACnD;EACF;EACA,MAAMc,SAAS,GAAG,MAAMC,gBAAO,CAAC3B,IAAI,CAAC;IAAC4B,MAAM,EAAE,QAAQ;IAAEC,MAAM,EAAE;EAAM,CAAC,CAAC;EACxE,IAAI;IACF,MAAM,IAAI,CAACzB,GAAG,CAAC0B,IAAI,CAACV,cAAc,IAAIxB,UAAU,EAAE8B,SAAS,CAAC;IAC5D,OAAO,CAAC,MAAMK,aAAI,CAACC,gBAAgB,CAACN,SAAS,CAAC,EAAEO,QAAQ,EAAE;EAC5D,CAAC,SAAS;IACR,IAAI,MAAMC,WAAE,CAACC,MAAM,CAACT,SAAS,CAAC,EAAE;MAC9B,MAAMQ,WAAE,CAACE,MAAM,CAACV,SAAS,CAAC;IAC5B;IACA,IAAIN,cAAc,EAAE;MAClB,MAAM,IAAI,CAAChB,GAAG,CAACI,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,EAAEY,cAAc,CAAC,CAAC;IACpD;EACF;AACF,CAAC;;AAgBD1B,QAAQ,CAAC2C,cAAc,GAAG,eAAeA,cAAc,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAClE,MAAM;IAAE1C;EAAW,CAAC,GAAG,IAAA2C,kBAAW,EAAC,YAAY,EAAED,IAAI,CAAC;EACtD,OAAO,MAAM,IAAI,CAACtB,QAAQ,CAACpB,UAAU,CAAC;AACxC,CAAC;;AAgBDF,QAAQ,CAAC8C,QAAQ,GAAG,eAAeA,QAAQ,CAAE5C,UAAU,EAAE6C,UAAU,EAAE;EACnE,IAAI7C,UAAU,CAACqB,QAAQ,CAAC,GAAG,CAAC,EAAE;IAC5B,MAAM,IAAIC,cAAM,CAACC,oBAAoB,CAClC,wEAAuE,GACvE,IAAGvB,UAAW,oBAAmB,CACnC;EACH;EACA,MAAM8B,SAAS,GAAG,MAAMC,gBAAO,CAAC3B,IAAI,CAAC;IAAC4B,MAAM,EAAE,QAAQ;IAAEC,MAAM,EAAE;EAAM,CAAC,CAAC;EACxE,IAAIa,eAAC,CAACC,OAAO,CAACF,UAAU,CAAC,EAAE;IAGzBA,UAAU,GAAGG,MAAM,CAACC,IAAI,CAACJ,UAAU,CAAC,CAACR,QAAQ,CAAC,MAAM,CAAC;EACvD;EACA,MAAMa,OAAO,GAAGF,MAAM,CAACC,IAAI,CAACJ,UAAU,EAAE,QAAQ,CAAC;EACjD,IAAIrB,cAAc,GAAG,IAAI;EACzB,IAAI;IACF,MAAMc,WAAE,CAACa,SAAS,CAACrB,SAAS,EAAEoB,OAAO,CAACb,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACnE,IAAIrC,UAAU,CAACyB,UAAU,CAAC/B,qBAAqB,CAAC,EAAE;MAChD,MAAM,CAACgC,SAAS,EAAEC,eAAe,CAAC,GAAG5B,kBAAkB,CAACC,UAAU,CAAC;MACnE,IAAI,CAACS,GAAG,CAACC,KAAK,CAAE,8BAA6BgB,SAAU,WAAU1B,UAAW,KAAI,GAC7E,2BAA0B2B,eAAgB,GAAE,CAAC;MAChDH,cAAc,GAAI,mBAAkBpB,aAAI,CAACC,KAAK,CAACuB,QAAQ,CAACD,eAAe,CAAE,EAAC;MAC1E,IAAI;QACF,MAAM,IAAI,CAACnB,GAAG,CAACI,KAAK,CAClB,CAAC,QAAQ,EAAEc,SAAS,EAAG,aAAYT,UAAU,CAACb,aAAI,CAACC,KAAK,CAAC+C,OAAO,CAACzB,eAAe,CAAC,CAAE,GAAE,CAAC,CACvF;QACD,MAAM,IAAI,CAACnB,GAAG,CAACI,KAAK,CAAC,CAAC,QAAQ,EAAEc,SAAS,EAAG,UAAST,UAAU,CAACU,eAAe,CAAE,GAAE,CAAC,CAAC;QACrF,MAAM,IAAI,CAACnB,GAAG,CAACI,KAAK,CAAC,CAAC,QAAQ,EAAEc,SAAS,EAAG,cAAaT,UAAU,CAACU,eAAe,CAAE,GAAE,CAAC,CAAC;QACzF,MAAM,IAAI,CAACnB,GAAG,CAAC6C,IAAI,CAACvB,SAAS,EAAEN,cAAc,CAAC;QAC9C,MAAM,IAAI,CAAChB,GAAG,CAACI,KAAK,CAAC,CACnB,QAAQ,EAAEc,SAAS,EAClB,UAAST,UAAU,CAACO,cAAc,CAAE,MAAKP,UAAU,CAACU,eAAe,CAAE,GAAE,CACzE,CAAC;MACJ,CAAC,CAAC,OAAOd,CAAC,EAAE;QACV,IAAI,CAACJ,GAAG,CAACoB,aAAa,CAAE,mCAAkCH,SAAU,iBAAgB,GACjE,8EAA6E,GAC7E,mBAAkBb,CAAC,CAACG,OAAQ,EAAC,CAAC;MACnD;IACF,CAAC,MAAM;MAEL,MAAM,IAAI,CAACR,GAAG,CAAC6C,IAAI,CAACvB,SAAS,EAAE9B,UAAU,CAAC;;MAI1C,MAAMO,SAAS,CAAC,IAAI,CAACC,GAAG,EAAER,UAAU,EAAE,IAAI,CAACS,GAAG,CAAC;IACjD;EACF,CAAC,SAAS;IACR,IAAI,MAAM6B,WAAE,CAACC,MAAM,CAACT,SAAS,CAAC,EAAE;MAC9B,MAAMQ,WAAE,CAACE,MAAM,CAACV,SAAS,CAAC;IAC5B;IACA,IAAIN,cAAc,EAAE;MAClB,MAAM,IAAI,CAAChB,GAAG,CAACI,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,EAAEY,cAAc,CAAC,CAAC;IACpD;EACF;AACF,CAAC;;AAgBD1B,QAAQ,CAACwD,cAAc,GAAG,eAAeA,cAAc,CAAEZ,IAAI,GAAG,CAAC,CAAC,EAAE;EAClE,MAAM;IAAE1C,UAAU;IAAEuD;EAAQ,CAAC,GAAG,IAAAZ,kBAAW,EAAC,CAAC,YAAY,EAAE,SAAS,CAAC,EAAED,IAAI,CAAC;EAC5E,OAAO,MAAM,IAAI,CAACE,QAAQ,CAAC5C,UAAU,EAAEuD,OAAO,CAAC;AACjD,CAAC;;AAUDzD,QAAQ,CAAC0D,UAAU,GAAG,eAAeA,UAAU,CAAExD,UAAU,EAAE;EAC3D,MAAMyD,OAAO,GAAG,MAAM1B,gBAAO,CAAC2B,OAAO,EAAE;EACvC,IAAI;IACF,MAAM,IAAI,CAAClD,GAAG,CAAC0B,IAAI,CAAClC,UAAU,EAAEyD,OAAO,CAAC;IACxC,OAAO,CAAC,MAAME,YAAG,CAACC,aAAa,CAACH,OAAO,EAAE;MACvCI,cAAc,EAAE;IAClB,CAAC,CAAC,EAAExB,QAAQ,EAAE;EAChB,CAAC,SAAS;IACR,MAAMC,WAAE,CAACwB,MAAM,CAACL,OAAO,CAAC;EAC1B;AACF,CAAC;;AAaD3D,QAAQ,CAACiE,gBAAgB,GAAG,eAAeA,gBAAgB,CAAErB,IAAI,GAAG,CAAC,CAAC,EAAE;EACtE,MAAM;IAAE1C;EAAW,CAAC,GAAG,IAAA2C,kBAAW,EAAC,YAAY,EAAED,IAAI,CAAC;EACtD,OAAO,MAAM,IAAI,CAACc,UAAU,CAACxD,UAAU,CAAC;AAC1C,CAAC;;AAcD,eAAegE,kBAAkB,CAAExD,GAAG,EAAER,UAAU,EAAE;EAClD,MAAMiE,oBAAoB,GAAG,OAAO/C,CAAC,EAAEgD,EAAE,EAAEC,KAAK,GAAG,IAAI,KAAK;IAC1D,MAAMC,QAAQ,GAAG,UAAU;IAC3B,MAAMC,QAAQ,GAAI,MAAKH,EAAG,KAAIjD,UAAU,CAACC,CAAC,CAAE,eAAckD,QAAS,EAAC;IACpE,MAAME,OAAO,GAAGH,KAAK,GAAI,UAASA,KAAM,IAAGE,QAAS,EAAC,GAAGA,QAAQ;IAChE,IAAI;MACF,OAAOvB,eAAC,CAACyB,QAAQ,CAAC,MAAM/D,GAAG,CAACI,KAAK,CAAC,CAAC0D,OAAO,CAAC,CAAC,EAAEF,QAAQ,CAAC;IACzD,CAAC,CAAC,OAAOI,GAAG,EAAE;MACZ,OAAO,KAAK;IACd;EACF,CAAC;EACD,MAAMC,MAAM,GAAG,OAAOvD,CAAC,EAAEiD,KAAK,GAAG,IAAI,KAAK,MAAMF,oBAAoB,CAAC/C,CAAC,EAAE,GAAG,EAAEiD,KAAK,CAAC;EACnF,MAAMO,KAAK,GAAG,OAAOxD,CAAC,EAAEiD,KAAK,GAAG,IAAI,KAAK,MAAMF,oBAAoB,CAAC/C,CAAC,EAAE,GAAG,EAAEiD,KAAK,CAAC;EAClF,MAAMQ,SAAS,GAAG,OAAOzD,CAAC,EAAEiD,KAAK,GAAG,IAAI,KAAK,MAAMF,oBAAoB,CAAC/C,CAAC,EAAE,GAAG,EAAEiD,KAAK,CAAC;EAEtF,IAAIS,OAAO,GAAG5E,UAAU;EACxB,IAAI6E,KAAK,GAAG,IAAI;EAChB,IAAI7E,UAAU,CAACyB,UAAU,CAAC/B,qBAAqB,CAAC,EAAE;IAChD,MAAM,CAACgC,SAAS,EAAEC,eAAe,CAAC,GAAG5B,kBAAkB,CAACC,UAAU,CAAC;IACnE,IAAI,CAACS,GAAG,CAACC,KAAK,CAAE,8BAA6BgB,SAAU,WAAU1B,UAAW,GAAE,CAAC;IAC/E4E,OAAO,GAAGjD,eAAe;IACzBkD,KAAK,GAAGnD,SAAS;EACnB;EAEA,IAAImD,KAAK,EAAE;IACT,IAAI;MACF,MAAMrE,GAAG,CAACI,KAAK,CAAC,CAAC,QAAQ,EAAEiE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,OAAOhE,CAAC,EAAE;MACV,IAAI,CAACJ,GAAG,CAACoB,aAAa,CAAE,mCAAkCgD,KAAM,iBAAgB,GAC7E,8EAA6E,GAC7E,mBAAkBhE,CAAC,CAACG,OAAQ,EAAC,CAAC;IACnC;EACF;EAEA,IAAI,EAAC,MAAM2D,SAAS,CAACC,OAAO,EAAEC,KAAK,CAAC,GAAE;IACpC,IAAI,CAACpE,GAAG,CAACqE,IAAI,CAAE,gBAAeF,OAAQ,6CAA4C,CAAC;IACnF,OAAO,KAAK;EACd;EAEA,MAAMG,WAAW,GAAG,CAAC/E,UAAU,CAACqB,QAAQ,CAAC,GAAG,CAAC;EAC7C,IAAI0D,WAAW,IAAI,EAAC,MAAMN,MAAM,CAACG,OAAO,EAAEC,KAAK,CAAC,GAAE;IAChD,IAAI,CAACpE,GAAG,CAACoB,aAAa,CAAE,gBAAe+C,OAAQ,iBAAgB,CAAC;EAClE,CAAC,MAAM,IAAI,CAACG,WAAW,IAAI,EAAC,MAAML,KAAK,CAACE,OAAO,EAAEC,KAAK,CAAC,GAAE;IACvD,IAAI,CAACpE,GAAG,CAACoB,aAAa,CAAE,gBAAe+C,OAAQ,mBAAkB,CAAC;EACpE;EAEA,IAAIC,KAAK,EAAE;IACT,MAAMrE,GAAG,CAACI,KAAK,CACb,CAAC,QAAQ,EAAEiE,KAAK,EAAG,QAAOE,WAAW,GAAG,EAAE,GAAG,GAAI,KAAI9D,UAAU,CAAC2D,OAAO,CAAE,GAAE,CAAC,CAAC;EACjF,CAAC,MAAM;IACL,MAAMpE,GAAG,CAACI,KAAK,CAAC,CAAC,IAAI,EAAG,KAAImE,WAAW,GAAG,EAAE,GAAG,GAAI,EAAC,EAAEH,OAAO,CAAC,CAAC;EACjE;EACA,IAAI,MAAMD,SAAS,CAACC,OAAO,EAAEC,KAAK,CAAC,EAAE;IACnC,IAAI,CAACpE,GAAG,CAACoB,aAAa,CAAE,gBAAe+C,OAAQ,sCAAqC,GACjF,iBAAgB,CAAC;EACtB;EACA,OAAO,IAAI;AACb;;AAkBA9E,QAAQ,CAACkF,gBAAgB,GAAG,eAAeA,gBAAgB,CAAEtC,IAAI,GAAG,CAAC,CAAC,EAAE;EACtE,MAAM;IAAC1C;EAAU,CAAC,GAAG0C,IAAI;EACzB,IAAI,CAAC1C,UAAU,EAAE;IACf,MAAM,IAAIsB,cAAM,CAACC,oBAAoB,CAAE,wCAAuC,CAAC;EACjF;EACA,IAAIvB,UAAU,CAACqB,QAAQ,CAAC,GAAG,CAAC,EAAE;IAC5B,MAAM,IAAIC,cAAM,CAACC,oBAAoB,CAClC,wEAAuE,GACvE,IAAGvB,UAAW,oBAAmB,CACnC;EACH;EACA,OAAO,MAAMgE,kBAAkB,CAAC,IAAI,CAACxD,GAAG,EAAER,UAAU,CAAC;AACvD,CAAC;AAAC,eAGaF,QAAQ;AAAA"}
1
+ {"version":3,"file":"file-actions.js","names":["CONTAINER_PATH_MARKER","CONTAINER_PATH_PATTERN","RegExp","ANDROID_MEDIA_RESCAN_INTENT","commands","parseContainerPath","remotePath","match","exec","Error","path","posix","resolve","scanMedia","adb","log","debug","getApiLevel","shell","e","warn","stderr","message","escapePath","p","replace","pullFile","endsWith","errors","InvalidArgumentError","tmpDestination","startsWith","packageId","pathInContainer","basename","errorAndThrow","localFile","tempDir","prefix","suffix","pull","util","toInMemoryBase64","toString","fs","exists","unlink","mobilePullFile","opts","requireArgs","pushFile","base64Data","_","isArray","Buffer","from","content","writeFile","dirname","push","mobilePushFile","payload","pullFolder","tmpRoot","openDir","zip","toInMemoryZip","encodeToBase64","rimraf","mobilePullFolder","deleteFileOrFolder","performRemoteFsCheck","op","runAs","passFlag","checkCmd","fullCmd","includes","ign","isFile","isDir","isPresent","dstPath","pkgId","info","expectsFile","mobileDeleteFile"],"sources":["../../../lib/commands/file-actions.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, util, zip, tempDir } from '@appium/support';\nimport path from 'path';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\n\nconst CONTAINER_PATH_MARKER = '@';\n// https://regex101.com/r/PLdB0G/2\nconst CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.+)`);\nconst ANDROID_MEDIA_RESCAN_INTENT = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE';\n\n\nconst commands = {};\n\n/**\n * Parses the actual destination path from the given value\n *\n * @param {string} remotePath The preformatted remote path, which looks like\n * `@my.app.id/my/path`\n * @returns {Array<string>} An array, where the first item is the parsed package\n * identifier and the second one is the actual destination path inside the package.\n * @throws {Error} If the given string cannot be parsed\n */\nfunction parseContainerPath (remotePath) {\n const match = CONTAINER_PATH_PATTERN.exec(remotePath);\n if (!match) {\n throw new Error(`It is expected that package identifier is separated from the relative path with a single slash. ` +\n `'${remotePath}' is given instead`);\n }\n return [match[1], path.posix.resolve(`/data/data/${match[1]}`, match[2])];\n}\n\n/**\n * Scans the given file/folder on the remote device\n * and adds matching items to the device's media library.\n * Exceptions are ignored and written into the log.\n *\n * @param {ADB} adb ADB instance\n * @param {Object?} log Logger instance\n * @param {string} remotePath The file/folder path on the remote device\n */\nasync function scanMedia (adb, remotePath, log = null) {\n log?.debug(`Performing media scan of '${remotePath}'`);\n try {\n // https://github.com/appium/appium/issues/16184\n if (await adb.getApiLevel() >= 29) {\n await adb.scanMedia(remotePath);\n } else {\n await adb.shell([\n 'am', 'broadcast',\n '-a', ANDROID_MEDIA_RESCAN_INTENT,\n '-d', `file://${remotePath}`\n ]);\n }\n } catch (e) {\n log?.warn(`Ignoring an unexpected error upon media scanning of '${remotePath}': ${e.stderr || e.message}`);\n }\n}\n\n/**\n * A small helper, which escapes single quotes in paths,\n * so they are safe to be passed as arguments of shell commands\n *\n * @param {string} p The initial remote path\n * @returns {string} The escaped path value\n */\nfunction escapePath (p) {\n return p.replace(/'/g, `\\\\'`);\n}\n\n/**\n * Pulls a remote file from the device.\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n *\n * @param {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside app bundle\n * @returns {string} Base64 encoded content of the pulled file\n * @throws {Error} If the pull operation failed\n */\ncommands.pullFile = async function pullFile (remotePath) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`);\n }\n let tmpDestination = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. Will get the data from '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(pathInContainer)}' '${escapePath(tmpDestination)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n try {\n await this.adb.pull(tmpDestination || remotePath, localFile);\n return (await util.toInMemoryBase64(localFile)).toString();\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PullFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n */\n\n/**\n * Pulls a remote file from the device.\n *\n * @param {PullFileOptions} opts\n * @returns {string} The same as `pullFile`\n */\ncommands.mobilePullFile = async function mobilePullFile (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFile(remotePath);\n};\n\n/**\n * Pushes the given data to a file on the remote device\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n * After a file is pushed it gets automatically scanned for possible\n * media occurrences. If the scan succeeds then the file is added to the\n * media library.\n *\n * @param {string} remotePath The full path to the remote file or\n * a file inside a package bundle\n * @param {string} base64Data Base64 encoded data to be written to the\n * remote file. The remote file will be silently overridden if it already exists.\n * @throws {Error} If there was an error while pushing the data\n */\ncommands.pushFile = async function pushFile (remotePath, base64Data) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`\n );\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n if (_.isArray(base64Data)) {\n // some clients (ahem) java, send a byte array encoding utf8 characters\n // instead of a string, which would be infinitely better!\n base64Data = Buffer.from(base64Data).toString('utf8');\n }\n const content = Buffer.from(base64Data, 'base64');\n let tmpDestination = null;\n try {\n await fs.writeFile(localFile, content.toString('binary'), 'binary');\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. ` +\n `Will put the data into '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(\n ['run-as', packageId, `mkdir -p '${escapePath(path.posix.dirname(pathInContainer))}'`]\n );\n await this.adb.shell(['run-as', packageId, `touch '${escapePath(pathInContainer)}'`]);\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.push(localFile, tmpDestination);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(tmpDestination)}' '${escapePath(pathInContainer)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n } else {\n // adb push creates folders and overwrites existing files.\n await this.adb.push(localFile, remotePath);\n\n // if we have pushed a file, it might be a media file, so ensure that\n // apps know about it\n await scanMedia(this.adb, remotePath, this.log);\n }\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PushFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n * @property {string} payload Base64-encoded content of the file to be pushed.\n */\n\n/**\n * Pushes the given data to a file on the remote device.\n *\n * @param {PushFileOptions} opts\n */\ncommands.mobilePushFile = async function mobilePushFile (opts = {}) {\n const { remotePath, payload } = requireArgs(['remotePath', 'payload'], opts);\n return await this.pushFile(remotePath, payload);\n};\n\n/**\n * Pulls the whole folder from the remote device\n *\n * @param {string} remotePath The full path to a folder on the\n * remote device or a folder inside an application bundle\n * @returns {string} Base64-encoded and zipped content of the folder\n * @throws {Error} If there was a failure while getting the folder content\n */\ncommands.pullFolder = async function pullFolder (remotePath) {\n const tmpRoot = await tempDir.openDir();\n try {\n await this.adb.pull(remotePath, tmpRoot);\n return (await zip.toInMemoryZip(tmpRoot, {\n encodeToBase64: true,\n })).toString();\n } finally {\n await fs.rimraf(tmpRoot);\n }\n};\n\n/**\n * @typedef {Object} PullFolderOptions\n * @property {string} remotePath The full path to the remote folder.\n */\n\n/**\n * Pulls the whole folder from the device under test.\n *\n * @param {PullFolderOptions} opts\n * @returns {string} The same as `pullFolder`\n */\ncommands.mobilePullFolder = async function mobilePullFolder (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFolder(remotePath);\n};\n\n/**\n * Deletes the given folder or file from the remote device\n *\n * @param {ADB} adb\n * @param {string} remotePath The full path to the remote folder\n * or file (folder names must end with a single slash)\n * @throws {Error} If the provided remote path is invalid or\n * the package content cannot be accessed\n * @returns {boolean} `true` if the remote item has been successfully deleted.\n * If the remote path is valid, but the remote path does not exist\n * this function return `false`.\n */\nasync function deleteFileOrFolder (adb, remotePath) {\n const performRemoteFsCheck = async (p, op, runAs = null) => {\n const passFlag = '__PASS__';\n const checkCmd = `[ -${op} '${escapePath(p)}' ] && echo ${passFlag}`;\n const fullCmd = runAs ? `run-as ${runAs} ${checkCmd}` : checkCmd;\n try {\n return _.includes(await adb.shell([fullCmd]), passFlag);\n } catch (ign) {\n return false;\n }\n };\n const isFile = async (p, runAs = null) => await performRemoteFsCheck(p, 'f', runAs);\n const isDir = async (p, runAs = null) => await performRemoteFsCheck(p, 'd', runAs);\n const isPresent = async (p, runAs = null) => await performRemoteFsCheck(p, 'e', runAs);\n\n let dstPath = remotePath;\n let pkgId = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'`);\n dstPath = pathInContainer;\n pkgId = packageId;\n }\n\n if (pkgId) {\n try {\n await adb.shell(['run-as', pkgId, 'ls']);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${pkgId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n\n if (!await isPresent(dstPath, pkgId)) {\n this.log.info(`The item at '${dstPath}' does not exist. Perhaps, already deleted?`);\n return false;\n }\n\n const expectsFile = !remotePath.endsWith('/');\n if (expectsFile && !await isFile(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a file`);\n } else if (!expectsFile && !await isDir(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a folder`);\n }\n\n if (pkgId) {\n await adb.shell(\n ['run-as', pkgId, `rm -f${expectsFile ? '' : 'r'} '${escapePath(dstPath)}'`]);\n } else {\n await adb.shell(['rm', `-f${expectsFile ? '' : 'r'}`, dstPath]);\n }\n if (await isPresent(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' still exists after being deleted. ` +\n `Is it writable?`);\n }\n return true;\n}\n\n/**\n * @typedef {Object} DeleteFileOpts\n * @property {!string} remotePath The full path to the remote file\n * or a file inside an application bundle (for example `@my.app.id/path/in/bundle`)\n */\n\n/**\n * Deletes a file on the remote device\n *\n * @param {DeleteFileOpts} opts\n * @returns {boolean} `true` if the remote file has been successfully deleted.\n * If the path to a remote file is valid, but the file itself does not exist\n * then `false` is returned.\n * @throws {Error} If the argument is invalid or there was an error while\n * deleting the file\n */\ncommands.mobileDeleteFile = async function mobileDeleteFile (opts = {}) {\n const {remotePath} = opts;\n if (!remotePath) {\n throw new errors.InvalidArgumentError(`The 'remotePath' argument is mandatory`);\n }\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a folder and not to a file. ` +\n `'${remotePath}' is given instead`\n );\n }\n return await deleteFileOrFolder(this.adb, remotePath);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
@@ -8,7 +8,7 @@ exports.helpers = exports.default = exports.commands = void 0;
8
8
  require("source-map-support/register");
9
9
  var _lodash = _interopRequireDefault(require("lodash"));
10
10
  var _androidHelpers = _interopRequireDefault(require("../android-helpers"));
11
- var _support = require("appium/support");
11
+ var _support = require("@appium/support");
12
12
  var _moment = _interopRequireDefault(require("moment"));
13
13
  var _asyncbox = require("asyncbox");
14
14
  var _driver = require("appium/driver");
@@ -358,4 +358,4 @@ commands.mobileUnlock = async function mobileUnlock(opts = {}) {
358
358
  Object.assign(extensions, commands, helpers);
359
359
  var _default = extensions;
360
360
  exports.default = _default;
361
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT01FTlRfRk9STUFUX0lTTzg2MDEiLCJBTExfUEVSTUlTU0lPTlNfTUFHSUMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwia2V5cyIsIl8iLCJpc0FycmF5Iiwiam9pbiIsInBhcmFtcyIsInRleHQiLCJyZXBsYWNlIiwib3B0cyIsInVuaWNvZGVLZXlib2FyZCIsImRvU2VuZEtleXMiLCJib290c3RyYXAiLCJzZW5kQWN0aW9uIiwiZ2V0RGV2aWNlVGltZSIsImZvcm1hdCIsImxvZyIsImRlYnVnIiwiZGV2aWNlVGltZXN0YW1wIiwiYWRiIiwic2hlbGwiLCJ0cmltIiwicGFyc2VkVGltZXN0YW1wIiwibW9tZW50IiwidXRjIiwiaXNWYWxpZCIsIndhcm4iLCJ1dGNPZmZzZXQiLCJfdHptIiwibW9iaWxlR2V0RGV2aWNlVGltZSIsImdldFBhZ2VTb3VyY2UiLCJiYWNrIiwiaXNLZXlib2FyZFNob3duIiwiaXNTb2Z0S2V5Ym9hcmRQcmVzZW50IiwiaGlkZUtleWJvYXJkIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJzZXR0aW5nIiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImdldEN1cnJlbnRQYWNrYWdlIiwiYmFja2dyb3VuZCIsInNlY29uZHMiLCJnb1RvSG9tZSIsInNsZWVwTXMiLCJ0aHJlc2hvbGRNcyIsImludGVydmFsTXMiLCJtaW4iLCJwYXJzZUludCIsInByb2dyZXNzQ2IiLCJlbGFwc2VkTXMiLCJwcm9ncmVzcyIsIndhaXRTZWNzIiwidG9GaXhlZCIsInByb2dyZXNzUGN0IiwibG9uZ1NsZWVwIiwiYXJncyIsIl9jYWNoZWRBY3Rpdml0eUFyZ3MiLCJhY3RpdmF0ZUFwcCIsImlnbiIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5Iiwic3BsaXQiLCJpbmNsdWRlcyIsInBrZyIsImFjdGl2aXR5IiwiYWN0aW9uIiwiaW50ZW50QWN0aW9uIiwiY2F0ZWdvcnkiLCJpbnRlbnRDYXRlZ29yeSIsImZsYWdzIiwiaW50ZW50RmxhZ3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5Iiwid2FpdEZvckxhdW5jaCIsImFwcFdhaXRGb3JMYXVuY2giLCJ3YWl0RHVyYXRpb24iLCJhcHBXYWl0RHVyYXRpb24iLCJvcHRpb25hbEludGVudEFyZ3VtZW50cyIsInN0b3BBcHAiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJ1dGlsIiwiZmlsdGVyT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0QXBwIiwiZ2V0U3RyaW5ncyIsImxhbmd1YWdlIiwiZ2V0RGV2aWNlTGFuZ3VhZ2UiLCJpbmZvIiwicHJlcHJvY2Vzc1N0cmluZ3NNYXAiLCJtYXBwaW5nIiwicmVzdWx0Iiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJhcGtTdHJpbmdzIiwiYW5kcm9pZEhlbHBlcnMiLCJwdXNoU3RyaW5ncyIsImxhdW5jaEFwcCIsImluaXRBVVQiLCJzdGFydEFVVCIsInN0YXJ0QWN0aXZpdHkiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJoYXNWYWx1ZSIsInJlc2V0IiwicmVzZXRBcHAiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0UmVzZXQiLCJzZXRDb250ZXh0IiwiaXNDaHJvbWVTZXNzaW9uIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic2V0VXJsIiwidXJpIiwic3RhcnRVcmkiLCJjbG9zZUFwcCIsImZvcmNlU3RvcCIsImdldERpc3BsYXlEZW5zaXR5Iiwib3V0IiwidmFsIiwiaXNOYU4iLCJlcnJvckFuZFRocm93IiwibW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsIlBFUk1JU1NJT05fQUNUSU9OIiwiR1JBTlQiLCJSRVZPS0UiLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiaXNOaWwiLCJpc0VtcHR5IiwibG93ZXJBY3Rpb24iLCJ0b0xvd2VyIiwidmFsdWVzIiwiYWZmZWN0ZWRQZXJtaXNzaW9ucyIsImR1bXBzeXMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJyZXFQZXJtaXNzb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsIkIiLCJhbGwiLCJtYXAiLCJuYW1lIiwicmV2b2tlUGVybWlzc2lvbiIsIlBFUk1JU1NJT05TX1RZUEUiLCJERU5JRUQiLCJHUkFOVEVEIiwiUkVRVUVTVEVEIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiYWN0aW9uRnVuYyIsImdldERlbmllZFBlcm1pc3Npb25zIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInN0cmF0ZWd5IiwidGltZW91dE1zIiwidW5sb2NrIiwidW5sb2NrS2V5IiwidW5sb2NrVHlwZSIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZ2VuZXJhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFuZHJvaWRIZWxwZXJzIGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgbG9uZ1NsZWVwIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5cbmNvbnN0IE1PTUVOVF9GT1JNQVRfSVNPODYwMSA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWic7XG5jb25zdCBBTExfUEVSTUlTU0lPTlNfTUFHSUMgPSAnYWxsJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICAvLyBQcm90b2NvbCBzZW5kcyBhbiBhcnJheTsgcmV0aGluayBhcHByb2FjaFxuICBrZXlzID0gXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXM7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgdGV4dDoga2V5cyxcbiAgICByZXBsYWNlOiBmYWxzZVxuICB9O1xuICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCkge1xuICAgIHBhcmFtcy51bmljb2RlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIGF3YWl0IHRoaXMuZG9TZW5kS2V5cyhwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGRvU2VuZEtleXMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc2V0VGV4dCcsIHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UncyB0aW1lc3RhbXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBzZXQgb2YgZm9ybWF0IHNwZWNpZmllcnMuIFJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZSBmb3JtYXQgc3BlY2lmaWVycy4gVGhlIGRlZmF1bHQgZm9ybWF0IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYFlZWVktTU0tRERUSEg6bW06c3NaYCwgd2hpY2ggY29tcGxpZXMgdG8gSVNPLTg2MDFcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMuZ2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVRpbWUgKGZvcm1hdCA9IE1PTUVOVF9GT1JNQVRfSVNPODYwMSkge1xuICB0aGlzLmxvZy5kZWJ1ZygnQXR0ZW1wdGluZyB0byBjYXB0dXJlIGFuZHJvaWQgZGV2aWNlIGRhdGUgYW5kIHRpbWUuICcgK1xuICAgIGBUaGUgZm9ybWF0IHNwZWNpZmllciBpcyAnJHtmb3JtYXR9J2ApO1xuICBjb25zdCBkZXZpY2VUaW1lc3RhbXAgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkYXRlJywgJyslWS0lbS0lZFQlVCV6J10pKS50cmltKCk7XG4gIHRoaXMubG9nLmRlYnVnKGBHb3QgZGV2aWNlIHRpbWVzdGFtcDogJHtkZXZpY2VUaW1lc3RhbXB9YCk7XG4gIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IG1vbWVudC51dGMoZGV2aWNlVGltZXN0YW1wLCAnWVlZWS1NTS1ERFRISDptbTpzc1paJyk7XG4gIGlmICghcGFyc2VkVGltZXN0YW1wLmlzVmFsaWQoKSkge1xuICAgIHRoaXMubG9nLndhcm4oJ0Nhbm5vdCBwYXJzZSB0aGUgcmV0dXJuZWQgdGltZXN0YW1wLiBSZXR1cm5pbmcgYXMgaXMnKTtcbiAgICByZXR1cm4gZGV2aWNlVGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBwYXJzZWRUaW1lc3RhbXAudXRjT2Zmc2V0KHBhcnNlZFRpbWVzdGFtcC5fdHptIHx8IDApLmZvcm1hdChmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VUaW1lT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBbWVlZWS1NTS1ERFRISDptbTpzc1pdIC0gU2VlIGdldERldmljZVRpbWUjZm9ybWF0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0RldmljZVRpbWVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VUaW1lIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlVGltZShvcHRzLmZvcm1hdCk7XG59O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzb3VyY2UnKTtcbn07XG5cbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzQmFjaycpO1xufTtcblxuY29tbWFuZHMuaXNLZXlib2FyZFNob3duID0gYXN5bmMgZnVuY3Rpb24gaXNLZXlib2FyZFNob3duICgpIHtcbiAgY29uc3Qge2lzS2V5Ym9hcmRTaG93bn0gPSBhd2FpdCB0aGlzLmFkYi5pc1NvZnRLZXlib2FyZFByZXNlbnQoKTtcbiAgcmV0dXJuIGlzS2V5Ym9hcmRTaG93bjtcbn07XG5cbmNvbW1hbmRzLmhpZGVLZXlib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGhpZGVLZXlib2FyZCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5oaWRlS2V5Ym9hcmQoKTtcbn07XG5cbmNvbW1hbmRzLm9wZW5TZXR0aW5nc0FjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzQWN0aXZpdHkgKHNldHRpbmcpIHtcbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnYW0nLCAnc3RhcnQnLCAnLWEnLCBgYW5kcm9pZC5zZXR0aW5ncy4ke3NldHRpbmd9YF0pO1xuICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xufTtcblxuY29tbWFuZHMuZ2V0V2luZG93U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd1NpemUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZ2V0RGV2aWNlU2l6ZScpO1xufTtcblxuLy8gRm9yIFczQ1xuY29tbWFuZHMuZ2V0V2luZG93UmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd1JlY3QgKCkge1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbn07XG5cbmNvbW1hbmRzLmdldEN1cnJlbnRBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRBY3Rpdml0eSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBBY3Rpdml0eTtcbn07XG5cbmNvbW1hbmRzLmdldEN1cnJlbnRQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudFBhY2thZ2UgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSkuYXBwUGFja2FnZTtcbn07XG5cbmNvbW1hbmRzLmJhY2tncm91bmQgPSBhc3luYyBmdW5jdGlvbiBiYWNrZ3JvdW5kIChzZWNvbmRzKSB7XG4gIGlmIChzZWNvbmRzIDwgMCkge1xuICAgIC8vIGlmIHVzZXIgcGFzc2VzIGluIGEgbmVnYXRpdmUgc2Vjb25kcyB2YWx1ZSwgaW50ZXJwcmV0IHRoYXQgYXMgdGhlIGluc3RydWN0aW9uXG4gICAgLy8gdG8gbm90IGJyaW5nIHRoZSBhcHAgYmFjayBhdCBhbGxcbiAgICBhd2FpdCB0aGlzLmFkYi5nb1RvSG9tZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuICBhd2FpdCB0aGlzLmFkYi5nb1RvSG9tZSgpO1xuXG4gIC8vIHBlb3BsZSBjYW4gd2FpdCBmb3IgYSBsb25nIHRpbWUsIHNvIHRvIGJlIHNhZmUgbGV0J3MgdXNlIHRoZSBsb25nU2xlZXAgZnVuY3Rpb24gYW5kIGxvZ1xuICAvLyBwcm9ncmVzcyBwZXJpb2RpY2FsbHkuXG4gIGNvbnN0IHNsZWVwTXMgPSBzZWNvbmRzICogMTAwMDtcbiAgY29uc3QgdGhyZXNob2xkTXMgPSAzMCAqIDEwMDA7IC8vIHVzZSB0aGUgc3Bpbi13YWl0IGZvciBhbnl0aGluZyBvdmVyIHRoaXMgdGhyZXNob2xkXG4gIC8vIGZvciBvdXIgc3BpbiBpbnRlcnZhbCwgdXNlIDElIG9mIHRoZSB0b3RhbCB3YWl0IHRpbWUsIGJ1dCBub3RoaW5nIGJpZ2dlciB0aGFuIDMwc1xuICBjb25zdCBpbnRlcnZhbE1zID0gXy5taW4oWzMwICogMTAwMCwgcGFyc2VJbnQoc2xlZXBNcyAvIDEwMCwgMTApXSk7XG4gIGNvbnN0IHByb2dyZXNzQ2IgPSAoe2VsYXBzZWRNcywgcHJvZ3Jlc3N9KSA9PiB7XG4gICAgY29uc3Qgd2FpdFNlY3MgPSAoZWxhcHNlZE1zIC8gMTAwMCkudG9GaXhlZCgwKTtcbiAgICBjb25zdCBwcm9ncmVzc1BjdCA9IChwcm9ncmVzcyAqIDEwMCkudG9GaXhlZCgyKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV2FpdGVkICR7d2FpdFNlY3N9cyBzbyBmYXIgKCR7cHJvZ3Jlc3NQY3R9JSlgKTtcbiAgfTtcbiAgYXdhaXQgbG9uZ1NsZWVwKHNsZWVwTXMsIHt0aHJlc2hvbGRNcywgaW50ZXJ2YWxNcywgcHJvZ3Jlc3NDYn0pO1xuXG4gIGxldCBhcmdzO1xuICBpZiAodGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzICYmIHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJnc1tgJHthcHBQYWNrYWdlfS8ke2FwcEFjdGl2aXR5fWBdKSB7XG4gICAgLy8gdGhlIGFjdGl2aXR5IHdhcyBzdGFydGVkIHdpdGggYHN0YXJ0QWN0aXZpdHlgLCBzbyB1c2UgdGhvc2UgYXJncyB0byByZXN0YXJ0XG4gICAgYXJncyA9IHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJnc1tgJHthcHBQYWNrYWdlfS8ke2FwcEFjdGl2aXR5fWBdO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQWN0aXZhdGluZyBhcHAgJyR7YXBwUGFja2FnZX0nIGluIG9yZGVyIHRvIHJlc3RvcmUgaXRgKTtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVBcHAoYXBwUGFja2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgYXJncyA9ICgoYXBwUGFja2FnZSA9PT0gdGhpcy5vcHRzLmFwcFBhY2thZ2UgJiYgYXBwQWN0aXZpdHkgPT09IHRoaXMub3B0cy5hcHBBY3Rpdml0eSkgfHxcbiAgICAgICAgICAgIChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UgJiYgKHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgJycpLnNwbGl0KCcsJykuaW5jbHVkZXMoYXBwQWN0aXZpdHkpKSlcbiAgICAgID8gey8vIHRoZSBhY3Rpdml0eSBpcyB0aGUgb3JpZ2luYWwgc2Vzc2lvbiBhY3Rpdml0eSwgc28gdXNlIHRoZSBvcmlnaW5hbCBhcmdzXG4gICAgICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSxcbiAgICAgICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICAgICAgd2FpdFBrZzogdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgICAgICB3YWl0RHVyYXRpb246IHRoaXMub3B0cy5hcHBXYWl0RHVyYXRpb24sXG4gICAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgICAgIHN0b3BBcHA6IGZhbHNlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGV9XG4gICAgICA6IHsvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgc29tZSBvdGhlciB3YXksIHNvIHVzZSBkZWZhdWx0c1xuICAgICAgICBwa2c6IGFwcFBhY2thZ2UsXG4gICAgICAgIGFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICAgICAgd2FpdFBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgd2FpdEFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICAgICAgc3RvcEFwcDogZmFsc2V9O1xuICB9XG4gIGFyZ3MgPSBhd2FpdCB1dGlsLmZpbHRlck9iamVjdChhcmdzKTtcbiAgdGhpcy5sb2cuZGVidWcoYEJyaW5naW5nIGFwcGxpY2F0aW9uIGJhY2sgdG8gZm9yZWdyb3VuZCB3aXRoIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKGFyZ3MpO1xufTtcblxuY29tbWFuZHMuZ2V0U3RyaW5ncyA9IGFzeW5jIGZ1bmN0aW9uIGdldFN0cmluZ3MgKGxhbmd1YWdlKSB7XG4gIGlmICghbGFuZ3VhZ2UpIHtcbiAgICBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuYWRiLmdldERldmljZUxhbmd1YWdlKCk7XG4gICAgdGhpcy5sb2cuaW5mbyhgTm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkLCByZXR1cm5pbmcgc3RyaW5ncyBmb3I6ICR7bGFuZ3VhZ2V9YCk7XG4gIH1cblxuICAvLyBDbGllbnRzIHJlcXVpcmUgdGhlIHJlc3VsdGluZyBtYXBwaW5nIHRvIGhhdmUgYm90aCBrZXlzXG4gIC8vIGFuZCB2YWx1ZXMgb2YgdHlwZSBzdHJpbmdcbiAgY29uc3QgcHJlcHJvY2Vzc1N0cmluZ3NNYXAgPSAobWFwcGluZykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhtYXBwaW5nKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGlmICh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBzdHJpbmdzXG4gICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xuICB9XG5cbiAgdGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLnB1c2hTdHJpbmdzKGxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgaWYgKHRoaXMuYm9vdHN0cmFwKSB7XG4gICAgLy8gVE9ETzogVGhpcyBpcyBtdXRhdGluZyB0aGUgY3VycmVudCBsYW5ndWFnZSwgYnV0IGl0J3MgaG93IGFwcGl1bSBjdXJyZW50bHkgd29ya3NcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCd1cGRhdGVTdHJpbmdzJyk7XG4gIH1cblxuICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG59O1xuXG5jb21tYW5kcy5sYXVuY2hBcHAgPSBhc3luYyBmdW5jdGlvbiBsYXVuY2hBcHAgKCkge1xuICBhd2FpdCB0aGlzLmluaXRBVVQoKTtcbiAgYXdhaXQgdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0QWN0aXZpdHkgKGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LFxuICBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5LCBpbnRlbnRBY3Rpb24sIGludGVudENhdGVnb3J5LCBpbnRlbnRGbGFncyxcbiAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsIGRvbnRTdG9wQXBwT25SZXNldCkge1xuICB0aGlzLmxvZy5kZWJ1ZyhgU3RhcnRpbmcgcGFja2FnZSAnJHthcHBQYWNrYWdlfScgYW5kIGFjdGl2aXR5ICcke2FwcEFjdGl2aXR5fSdgKTtcblxuICAvLyBkb250U3RvcEFwcE9uUmVzZXQgaXMgYm90aCBhbiBhcmd1bWVudCBoZXJlLCBhbmQgYSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAgLy8gaWYgdGhlIGFyZ3VtZW50IGlzIHNldCwgdXNlIGl0LCBvdGhlcndpc2UgdXNlIHRoZSBjYXBcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKGRvbnRTdG9wQXBwT25SZXNldCkpIHtcbiAgICBkb250U3RvcEFwcE9uUmVzZXQgPSAhIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQ7XG4gIH1cblxuICBsZXQgYXJncyA9IHtcbiAgICBwa2c6IGFwcFBhY2thZ2UsXG4gICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgIHdhaXRQa2c6IGFwcFdhaXRQYWNrYWdlIHx8IGFwcFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiBhcHBXYWl0QWN0aXZpdHkgfHwgYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiBpbnRlbnRBY3Rpb24sXG4gICAgY2F0ZWdvcnk6IGludGVudENhdGVnb3J5LFxuICAgIGZsYWdzOiBpbnRlbnRGbGFncyxcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICBzdG9wQXBwOiAhZG9udFN0b3BBcHBPblJlc2V0XG4gIH07XG4gIHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyA9IHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyB8fCB7fTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FyZ3Mud2FpdFBrZ30vJHthcmdzLndhaXRBY3Rpdml0eX1gXSA9IGFyZ3M7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKGFyZ3MpO1xufTtcblxuY29tbWFuZHMucmVzZXQgPSBhc3luYyBmdW5jdGlvbiByZXNldCAoKSB7XG4gIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIHtmYXN0UmVzZXQ6IHRydWV9KSk7XG4gIC8vIHJlc2V0IGNvbnRleHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb24gY29udGV4dCB3ZSB3aWxsIGVuZCB1cCBhZnRlciBhcHAgbGF1bmNoLlxuICBhd2FpdCB0aGlzLnNldENvbnRleHQoKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuaXNDaHJvbWVTZXNzaW9uID8gdGhpcy5zdGFydENocm9tZVNlc3Npb24oKSA6IHRoaXMuc3RhcnRBVVQoKTtcbn07XG5cbmNvbW1hbmRzLnN0YXJ0QVVUID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBVVQgKCkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgIGZsYWdzOiB0aGlzLm9wdHMuaW50ZW50RmxhZ3MsXG4gICAgd2FpdFBrZzogdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlLFxuICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICB3YWl0RHVyYXRpb246IHRoaXMub3B0cy5hcHBXYWl0RHVyYXRpb24sXG4gICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICBzdG9wQXBwOiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCxcbiAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gIH0pO1xufTtcblxuLy8gd2Ugb3ZlcnJpZGUgc2V0VXJsIHRvIHRha2UgYW4gYW5kcm9pZCBVUkkgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRlZXAtbGlua2luZ1xuLy8gaW5zaWRlIGFuIGFwcCwgc2ltaWxhciB0byBzdGFydGluZyBhbiBpbnRlbnRcbmNvbW1hbmRzLnNldFVybCA9IGFzeW5jIGZ1bmN0aW9uIHNldFVybCAodXJpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0VXJpKHVyaSwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xufTtcblxuLy8gY2xvc2luZyBhcHAgdXNpbmcgZm9yY2Ugc3RvcFxuY29tbWFuZHMuY2xvc2VBcHAgPSBhc3luYyBmdW5jdGlvbiBjbG9zZUFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIC8vIHJlc2V0IGNvbnRleHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb24gY29udGV4dCB3ZSB3aWxsIGVuZCB1cCBhZnRlciBhcHAgbGF1bmNoLlxuICBhd2FpdCB0aGlzLnNldENvbnRleHQoKTtcbn07XG5cbmNvbW1hbmRzLmdldERpc3BsYXlEZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcGxheURlbnNpdHkgKCkge1xuICAvLyBmaXJzdCB0cnkgdGhlIHByb3BlcnR5IGZvciBkZXZpY2VzXG4gIGxldCBvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2dldHByb3AnLCAncm8uc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgLy8gaWYgdGhlIHZhbHVlIGlzIE5hTiwgdHJ5IGdldHRpbmcgdGhlIGVtdWxhdG9yIHByb3BlcnR5XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGZhbGxiYWNrIHRvIHRyeWluZyBwcm9wZXJ0eSBmb3IgZW11bGF0b3JzXG4gIG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdxZW11LnNmLmxjZF9kZW5zaXR5J10pO1xuICBpZiAob3V0KSB7XG4gICAgbGV0IHZhbCA9IHBhcnNlSW50KG91dCwgMTApO1xuICAgIGlmICghaXNOYU4odmFsKSkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBkZW5zaXR5IHZhbHVlIHdhcyBOYU46IFwiJHtvdXR9XCJgKTtcbiAgfVxuICAvLyBjb3VsZG4ndCBnZXQgYW55dGhpbmcsIHNvIGVycm9yIG91dFxuICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGYWlsZWQgdG8gZ2V0IGRpc3BsYXkgZGVuc2l0eSBwcm9wZXJ0eS4nKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2FjdGlvbn0gPSBvcHRzO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdhY3Rpb24nIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cblxuICBhd2FpdCB0aGlzLmFkYi5wZXJmb3JtRWRpdG9yQWN0aW9uKGFjdGlvbik7XG59O1xuXG5jb25zdCBQRVJNSVNTSU9OX0FDVElPTiA9IHtcbiAgR1JBTlQ6ICdncmFudCcsXG4gIFJFVk9LRTogJ3Jldm9rZScsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYW5nZVBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfEFycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBjaGFuZ2VkXG4gKiBvciBhIGxpc3Qgb2YgcGVybWlzc2lvbnMuIENoZWNrIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL01hbmlmZXN0LnBlcm1pc3Npb25cbiAqIHRvIGdldCB0aGUgZnVsbCBsaXN0IG9mIHN0YW5kYXJkIEFuZHJvaWQgcGVybXNzaW9uIG5hbWVzLiBNYW5kYXRvcnkgYXJndW1lbnQuXG4gKiBJZiAnYWxsJyBtYWdpYyBzdHJpbmcgaXMgcGFzc2VkIHRoZW4gdGhlIGNob3NlbiBhY3Rpb24gaXMgZ29pbmcgdG8gYmUgYXBwbGllZCB0byBhbGxcbiAqIHBlcm1pc2lzb25zIHJlcXVlc3RlZC9ncmFudGVkIGJ5ICdhcHBQYWNrYWdlJy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYWNrYWdlIFt0aGlzLm9wdHMuYXBwUGFja2FnZV0gLSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBbZ3JhbnRdIC0gT25lIG9mIGBQRVJNSVNTSU9OX0FDVElPTmAgdmFsdWVzXG4gKi9cblxuLyoqXG4gKiBDaGFuZ2VzIHBhY2thZ2UgcGVybWlzc2lvbnMgaW4gcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gez9DaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnNcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBwZXJtaXNzaW9ucyxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aW9uID0gUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQsXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc05pbChwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IG11c3Qgbm90IGJlIGVtcHR5YCk7XG4gIH1cbiAgY29uc3QgbG93ZXJBY3Rpb24gPSBfLnRvTG93ZXIoYWN0aW9uKTtcbiAgaWYgKCFbUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQsIFBFUk1JU1NJT05fQUNUSU9OLlJFVk9LRV0uaW5jbHVkZXMobG93ZXJBY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBhY3Rpb24gJyR7YWN0aW9ufScuIGAgK1xuICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OX0FDVElPTikpfSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuXG4gIGxldCBhZmZlY3RlZFBlcm1pc3Npb25zID0gXy5pc0FycmF5KHBlcm1pc3Npb25zKSA/IHBlcm1pc3Npb25zIDogW3Blcm1pc3Npb25zXTtcbiAgaWYgKF8udG9Mb3dlcihwZXJtaXNzaW9ucykgPT09IEFMTF9QRVJNSVNTSU9OU19NQUdJQykge1xuICAgIGNvbnN0IGR1bXBzeXMgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIGFwcFBhY2thZ2VdKTtcbiAgICBjb25zdCBncmFudGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRHcmFudGVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSwgZHVtcHN5cyk7XG4gICAgaWYgKGxvd2VyQWN0aW9uID09PSBQRVJNSVNTSU9OX0FDVElPTi5HUkFOVCkge1xuICAgICAgY29uc3QgcmVxUGVybWlzc29ucyA9IGF3YWl0IHRoaXMuYWRiLmdldFJlcVBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uZGlmZmVyZW5jZShyZXFQZXJtaXNzb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZmZlY3RlZFBlcm1pc3Npb25zID0gZ3JhbnRlZFBlcm1pc3Npb25zO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGFmZmVjdGVkUGVybWlzc2lvbnMpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnJHthcHBQYWNrYWdlfScgY29udGFpbnMgbm8gcGVybWlzc2lvbnMgdG8gJHtsb3dlckFjdGlvbn1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAobG93ZXJBY3Rpb24gPT09IFBFUk1JU1NJT05fQUNUSU9OLkdSQU5UKSB7XG4gICAgYXdhaXQgdGhpcy5hZGIuZ3JhbnRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBhZmZlY3RlZFBlcm1pc3Npb25zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBCLmFsbChhZmZlY3RlZFBlcm1pc3Npb25zLm1hcCgobmFtZSkgPT4gdGhpcy5hZGIucmV2b2tlUGVybWlzc2lvbihhcHBQYWNrYWdlLCBuYW1lKSkpO1xuICB9XG59O1xuXG5jb25zdCBQRVJNSVNTSU9OU19UWVBFID0ge1xuICBERU5JRUQ6ICdkZW5pZWQnLFxuICBHUkFOVEVEOiAnZ3JhbnRlZCcsXG4gIFJFUVVFU1RFRDogJ3JlcXVlc3RlZCcsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgW3JlcXVlc3RlZF0gLSBPbmUgb2YgcG9zc2libGUgcGVybWlzc2lvbiB0eXBlcyB0byBnZXQuXG4gKiBDYW4gYmUgYW55IG9mIGBQRVJNSVNTSU9OU19UWVBFYCB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIC0gVGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gc2V0IGNoYW5nZVxuICogcGVybWlzc2lvbnMgb24uIERlZmF1bHRzIHRvIHRoZSBwYWNrYWdlIG5hbWUgdW5kZXIgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEdldHMgcnVudGltZSBwZXJtaXNzaW9ucyBsaXN0IGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0dldFBlcm1pc3Npb25zT3B0aW9uc30gb3B0cyAtIEF2YWlsYWJsZSBvcHRpb25zIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmV0cmlldmVkIHBlcm1pc3Npb25zIGZvciB0aGUgZ2l2ZW4gdHlwZVxuICogKGNhbiBhbHNvIGJlIGVtcHR5KS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyBwZXJtaXNzaW9ucy5cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlID0gUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICB9ID0gb3B0cztcblxuICBsZXQgYWN0aW9uRnVuYztcbiAgc3dpdGNoIChfLnRvTG93ZXIodHlwZSkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXRSZXFQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5HUkFOVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXRHcmFudGVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuREVOSUVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXREZW5pZWRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBVbmtub3duIHBlcm1pc3Npb25zIHR5cGUgJyR7dHlwZX0nLiBgICtcbiAgICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OU19UWVBFKSl9IHR5cGVzIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgYWN0aW9uRnVuYyhhcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IFRoZSB1bmxvY2sga2V5LiBUaGUgdmFsdWUgb2YgdGhpcyBrZXkgZGVwZW5kc1xuICogb24gdGhlIGFjdHVhbCB1bmxvY2sgdHlwZSBhbmQgY291bGQgYmUgYSBwaW4vcGFzc3dvcmQvcGF0dGVybiB2YWx1ZSBvclxuICogYSBiaW9tZXRyaWMgZmluZ2VyIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIHVubG9jayB0eXBlLiBUaGUgZm9sbG93aW5nIHVubG9jayB0eXBlc1xuICogYXJlIHN1cHBvcnRlZDogYHBpbmAsIGBwaW5XaXRoS2V5RXZlbnRgLCBgcGFzc3dvcmRgLCBgcGF0dGVybmAgYW5kIGBmaW5nZXJwcmludGAuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHN0cmF0ZWd5IEVpdGhlciAnbG9ja3NldHRpbmdzJyAoZGVmYXVsdCkgb3IgJ3VpYXV0b21hdG9yJy5cbiAqIFNldHRpbmcgaXQgdG8gJ3VpYXV0b21hdG9yJyB3aWxsIGVuZm9yY2UgdGhlIGRyaXZlciB0byBhdm9pZCB1c2luZyBzcGVjaWFsXG4gKiBBREIgc2hvcnRjdXRzIGluIG9yZGVyIHRvIHNwZWVkIHVwIHRoZSB1bmxvY2sgcHJvY2VkdXJlLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDBdIFRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiB0byB3YWl0IHVudGlsIHRoZSBzY3JlZW4gZ2V0cyB1bmxvY2tlZFxuICovXG5cbi8qKlxuICogVW5sb2NrcyB0aGUgZGV2aWNlIGlmIGl0IGlzIGxvY2tlZC4gTm9vcCBpZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGlzIG5vdCBsb2NrZWQuXG4gKlxuICogQHBhcmFtIHs/VW5sb2NrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHVubG9jayBvcGVyYXRpb24gZmFpbHMgb3IgdGhlIHByb3ZpZGVkXG4gKiBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVbmxvY2sgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGtleSwgdHlwZSwgc3RyYXRlZ3ksIHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB7XG4gICAgdW5sb2NrS2V5OiBrZXksXG4gICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICB1bmxvY2tTdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgdW5sb2NrU3VjY2Vzc1RpbWVvdXQ6IHRpbWVvdXRNcyxcbiAgfSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEscUJBQXFCLEdBQUcsc0JBQXNCO0FBQ3BELE1BQU1DLHFCQUFxQixHQUFHLEtBQUs7QUFFbkMsSUFBSUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpERixRQUFRLENBQUNHLElBQUksR0FBRyxlQUFlQSxJQUFJLENBQUVBLElBQUksRUFBRTtFQUV6Q0EsSUFBSSxHQUFHQyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0YsSUFBSSxDQUFDLEdBQUdBLElBQUksQ0FBQ0csSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHSCxJQUFJO0VBQzdDLElBQUlJLE1BQU0sR0FBRztJQUNYQyxJQUFJLEVBQUVMLElB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
361
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT01FTlRfRk9STUFUX0lTTzg2MDEiLCJBTExfUEVSTUlTU0lPTlNfTUFHSUMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwia2V5cyIsIl8iLCJpc0FycmF5Iiwiam9pbiIsInBhcmFtcyIsInRleHQiLCJyZXBsYWNlIiwib3B0cyIsInVuaWNvZGVLZXlib2FyZCIsImRvU2VuZEtleXMiLCJib290c3RyYXAiLCJzZW5kQWN0aW9uIiwiZ2V0RGV2aWNlVGltZSIsImZvcm1hdCIsImxvZyIsImRlYnVnIiwiZGV2aWNlVGltZXN0YW1wIiwiYWRiIiwic2hlbGwiLCJ0cmltIiwicGFyc2VkVGltZXN0YW1wIiwibW9tZW50IiwidXRjIiwiaXNWYWxpZCIsIndhcm4iLCJ1dGNPZmZzZXQiLCJfdHptIiwibW9iaWxlR2V0RGV2aWNlVGltZSIsImdldFBhZ2VTb3VyY2UiLCJiYWNrIiwiaXNLZXlib2FyZFNob3duIiwiaXNTb2Z0S2V5Ym9hcmRQcmVzZW50IiwiaGlkZUtleWJvYXJkIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJzZXR0aW5nIiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImdldEN1cnJlbnRQYWNrYWdlIiwiYmFja2dyb3VuZCIsInNlY29uZHMiLCJnb1RvSG9tZSIsInNsZWVwTXMiLCJ0aHJlc2hvbGRNcyIsImludGVydmFsTXMiLCJtaW4iLCJwYXJzZUludCIsInByb2dyZXNzQ2IiLCJlbGFwc2VkTXMiLCJwcm9ncmVzcyIsIndhaXRTZWNzIiwidG9GaXhlZCIsInByb2dyZXNzUGN0IiwibG9uZ1NsZWVwIiwiYXJncyIsIl9jYWNoZWRBY3Rpdml0eUFyZ3MiLCJhY3RpdmF0ZUFwcCIsImlnbiIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5Iiwic3BsaXQiLCJpbmNsdWRlcyIsInBrZyIsImFjdGl2aXR5IiwiYWN0aW9uIiwiaW50ZW50QWN0aW9uIiwiY2F0ZWdvcnkiLCJpbnRlbnRDYXRlZ29yeSIsImZsYWdzIiwiaW50ZW50RmxhZ3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5Iiwid2FpdEZvckxhdW5jaCIsImFwcFdhaXRGb3JMYXVuY2giLCJ3YWl0RHVyYXRpb24iLCJhcHBXYWl0RHVyYXRpb24iLCJvcHRpb25hbEludGVudEFyZ3VtZW50cyIsInN0b3BBcHAiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJ1dGlsIiwiZmlsdGVyT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0QXBwIiwiZ2V0U3RyaW5ncyIsImxhbmd1YWdlIiwiZ2V0RGV2aWNlTGFuZ3VhZ2UiLCJpbmZvIiwicHJlcHJvY2Vzc1N0cmluZ3NNYXAiLCJtYXBwaW5nIiwicmVzdWx0Iiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJhcGtTdHJpbmdzIiwiYW5kcm9pZEhlbHBlcnMiLCJwdXNoU3RyaW5ncyIsImxhdW5jaEFwcCIsImluaXRBVVQiLCJzdGFydEFVVCIsInN0YXJ0QWN0aXZpdHkiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJoYXNWYWx1ZSIsInJlc2V0IiwicmVzZXRBcHAiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0UmVzZXQiLCJzZXRDb250ZXh0IiwiaXNDaHJvbWVTZXNzaW9uIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic2V0VXJsIiwidXJpIiwic3RhcnRVcmkiLCJjbG9zZUFwcCIsImZvcmNlU3RvcCIsImdldERpc3BsYXlEZW5zaXR5Iiwib3V0IiwidmFsIiwiaXNOYU4iLCJlcnJvckFuZFRocm93IiwibW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsIlBFUk1JU1NJT05fQUNUSU9OIiwiR1JBTlQiLCJSRVZPS0UiLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiaXNOaWwiLCJpc0VtcHR5IiwibG93ZXJBY3Rpb24iLCJ0b0xvd2VyIiwidmFsdWVzIiwiYWZmZWN0ZWRQZXJtaXNzaW9ucyIsImR1bXBzeXMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJyZXFQZXJtaXNzb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsIkIiLCJhbGwiLCJtYXAiLCJuYW1lIiwicmV2b2tlUGVybWlzc2lvbiIsIlBFUk1JU1NJT05TX1RZUEUiLCJERU5JRUQiLCJHUkFOVEVEIiwiUkVRVUVTVEVEIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiYWN0aW9uRnVuYyIsImdldERlbmllZFBlcm1pc3Npb25zIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInN0cmF0ZWd5IiwidGltZW91dE1zIiwidW5sb2NrIiwidW5sb2NrS2V5IiwidW5sb2NrVHlwZSIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZ2VuZXJhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFuZHJvaWRIZWxwZXJzIGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IGxvbmdTbGVlcCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNT01FTlRfRk9STUFUX0lTTzg2MDEgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuY29uc3QgQUxMX1BFUk1JU1NJT05TX01BR0lDID0gJ2FsbCc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMua2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGtleXMgKGtleXMpIHtcbiAgLy8gUHJvdG9jb2wgc2VuZHMgYW4gYXJyYXk7IHJldGhpbmsgYXBwcm9hY2hcbiAga2V5cyA9IF8uaXNBcnJheShrZXlzKSA/IGtleXMuam9pbignJykgOiBrZXlzO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIHRleHQ6IGtleXMsXG4gICAgcmVwbGFjZTogZmFsc2VcbiAgfTtcbiAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQpIHtcbiAgICBwYXJhbXMudW5pY29kZUtleWJvYXJkID0gdHJ1ZTtcbiAgfVxuICBhd2FpdCB0aGlzLmRvU2VuZEtleXMocGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmRvU2VuZEtleXMgPSBhc3luYyBmdW5jdGlvbiBkb1NlbmRLZXlzIChwYXJhbXMpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3NldFRleHQnLCBwYXJhbXMpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3MgdGltZXN0YW1wLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgc2V0IG9mIGZvcm1hdCBzcGVjaWZpZXJzLiBSZWFkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9tb21lbnRqcy5jb20vZG9jcy8gdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWUgZm9ybWF0IHNwZWNpZmllcnMuIFRoZSBkZWZhdWx0IGZvcm1hdCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAsIHdoaWNoIGNvbXBsaWVzIHRvIElTTy04NjAxXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLmdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VUaW1lIChmb3JtYXQgPSBNT01FTlRfRk9STUFUX0lTTzg2MDEpIHtcbiAgdGhpcy5sb2cuZGVidWcoJ0F0dGVtcHRpbmcgdG8gY2FwdHVyZSBhbmRyb2lkIGRldmljZSBkYXRlIGFuZCB0aW1lLiAnICtcbiAgICBgVGhlIGZvcm1hdCBzcGVjaWZpZXIgaXMgJyR7Zm9ybWF0fSdgKTtcbiAgY29uc3QgZGV2aWNlVGltZXN0YW1wID0gKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZGF0ZScsICcrJVktJW0tJWRUJVQleiddKSkudHJpbSgpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRldmljZSB0aW1lc3RhbXA6ICR7ZGV2aWNlVGltZXN0YW1wfWApO1xuICBjb25zdCBwYXJzZWRUaW1lc3RhbXAgPSBtb21lbnQudXRjKGRldmljZVRpbWVzdGFtcCwgJ1lZWVktTU0tRERUSEg6bW06c3NaWicpO1xuICBpZiAoIXBhcnNlZFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHtcbiAgICB0aGlzLmxvZy53YXJuKCdDYW5ub3QgcGFyc2UgdGhlIHJldHVybmVkIHRpbWVzdGFtcC4gUmV0dXJuaW5nIGFzIGlzJyk7XG4gICAgcmV0dXJuIGRldmljZVRpbWVzdGFtcDtcbiAgfVxuICByZXR1cm4gcGFyc2VkVGltZXN0YW1wLnV0Y09mZnNldChwYXJzZWRUaW1lc3RhbXAuX3R6bSB8fCAwKS5mb3JtYXQoZm9ybWF0KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlVGltZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtYXQgW1lZWVktTU0tRERUSEg6bW06c3NaXSAtIFNlZSBnZXREZXZpY2VUaW1lI2Zvcm1hdFxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGRldmljZSB0aW1lXG4gKlxuICogQHBhcmFtIHtEZXZpY2VUaW1lT3B0aW9uc30gb3B0c1xuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgZGF0ZXRpbWUgc3RyaW5nIG9yIHRoZSByYXcgY29tbWFuZCBvdXRwdXQgaWYgZm9ybWF0dGluZyBmYWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXREZXZpY2VUaW1lID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0RGV2aWNlVGltZSAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVRpbWUob3B0cy5mb3JtYXQpO1xufTtcblxuY29tbWFuZHMuZ2V0UGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VTb3VyY2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc291cmNlJyk7XG59O1xuXG5jb21tYW5kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwcmVzc0JhY2snKTtcbn07XG5cbmNvbW1hbmRzLmlzS2V5Ym9hcmRTaG93biA9IGFzeW5jIGZ1bmN0aW9uIGlzS2V5Ym9hcmRTaG93biAoKSB7XG4gIGNvbnN0IHtpc0tleWJvYXJkU2hvd259ID0gYXdhaXQgdGhpcy5hZGIuaXNTb2Z0S2V5Ym9hcmRQcmVzZW50KCk7XG4gIHJldHVybiBpc0tleWJvYXJkU2hvd247XG59O1xuXG5jb21tYW5kcy5oaWRlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBoaWRlS2V5Ym9hcmQgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaGlkZUtleWJvYXJkKCk7XG59O1xuXG5jb21tYW5kcy5vcGVuU2V0dGluZ3NBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc0FjdGl2aXR5IChzZXR0aW5nKSB7XG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2FtJywgJ3N0YXJ0JywgJy1hJywgYGFuZHJvaWQuc2V0dGluZ3MuJHtzZXR0aW5nfWBdKTtcbiAgYXdhaXQgdGhpcy5hZGIud2FpdEZvck5vdEFjdGl2aXR5KGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCA1MDAwKTtcbn07XG5cbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dTaXplICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2dldERldmljZVNpemUnKTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dSZWN0ICgpIHtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBhd2FpdCB0aGlzLmdldFdpbmRvd1NpemUoKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG59O1xuXG5jb21tYW5kcy5nZXRDdXJyZW50QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50QWN0aXZpdHkgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSkuYXBwQWN0aXZpdHk7XG59O1xuXG5jb21tYW5kcy5nZXRDdXJyZW50UGFja2FnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRQYWNrYWdlICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcFBhY2thZ2U7XG59O1xuXG5jb21tYW5kcy5iYWNrZ3JvdW5kID0gYXN5bmMgZnVuY3Rpb24gYmFja2dyb3VuZCAoc2Vjb25kcykge1xuICBpZiAoc2Vjb25kcyA8IDApIHtcbiAgICAvLyBpZiB1c2VyIHBhc3NlcyBpbiBhIG5lZ2F0aXZlIHNlY29uZHMgdmFsdWUsIGludGVycHJldCB0aGF0IGFzIHRoZSBpbnN0cnVjdGlvblxuICAgIC8vIHRvIG5vdCBicmluZyB0aGUgYXBwIGJhY2sgYXQgYWxsXG4gICAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcblxuICAvLyBwZW9wbGUgY2FuIHdhaXQgZm9yIGEgbG9uZyB0aW1lLCBzbyB0byBiZSBzYWZlIGxldCdzIHVzZSB0aGUgbG9uZ1NsZWVwIGZ1bmN0aW9uIGFuZCBsb2dcbiAgLy8gcHJvZ3Jlc3MgcGVyaW9kaWNhbGx5LlxuICBjb25zdCBzbGVlcE1zID0gc2Vjb25kcyAqIDEwMDA7XG4gIGNvbnN0IHRocmVzaG9sZE1zID0gMzAgKiAxMDAwOyAvLyB1c2UgdGhlIHNwaW4td2FpdCBmb3IgYW55dGhpbmcgb3ZlciB0aGlzIHRocmVzaG9sZFxuICAvLyBmb3Igb3VyIHNwaW4gaW50ZXJ2YWwsIHVzZSAxJSBvZiB0aGUgdG90YWwgd2FpdCB0aW1lLCBidXQgbm90aGluZyBiaWdnZXIgdGhhbiAzMHNcbiAgY29uc3QgaW50ZXJ2YWxNcyA9IF8ubWluKFszMCAqIDEwMDAsIHBhcnNlSW50KHNsZWVwTXMgLyAxMDAsIDEwKV0pO1xuICBjb25zdCBwcm9ncmVzc0NiID0gKHtlbGFwc2VkTXMsIHByb2dyZXNzfSkgPT4ge1xuICAgIGNvbnN0IHdhaXRTZWNzID0gKGVsYXBzZWRNcyAvIDEwMDApLnRvRml4ZWQoMCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NQY3QgPSAocHJvZ3Jlc3MgKiAxMDApLnRvRml4ZWQoMik7XG4gICAgdGhpcy5sb2cuZGVidWcoYFdhaXRlZCAke3dhaXRTZWNzfXMgc28gZmFyICgke3Byb2dyZXNzUGN0fSUpYCk7XG4gIH07XG4gIGF3YWl0IGxvbmdTbGVlcChzbGVlcE1zLCB7dGhyZXNob2xkTXMsIGludGVydmFsTXMsIHByb2dyZXNzQ2J9KTtcblxuICBsZXQgYXJncztcbiAgaWYgKHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyAmJiB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXBwUGFja2FnZX0vJHthcHBBY3Rpdml0eX1gXSkge1xuICAgIC8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCB3aXRoIGBzdGFydEFjdGl2aXR5YCwgc28gdXNlIHRob3NlIGFyZ3MgdG8gcmVzdGFydFxuICAgIGFyZ3MgPSB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXBwUGFja2FnZX0vJHthcHBBY3Rpdml0eX1gXTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEFjdGl2YXRpbmcgYXBwICcke2FwcFBhY2thZ2V9JyBpbiBvcmRlciB0byByZXN0b3JlIGl0YCk7XG4gICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlQXBwKGFwcFBhY2thZ2UpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGFyZ3MgPSAoKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBQYWNrYWdlICYmIGFwcEFjdGl2aXR5ID09PSB0aGlzLm9wdHMuYXBwQWN0aXZpdHkpIHx8XG4gICAgICAgICAgICAoYXBwUGFja2FnZSA9PT0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlICYmICh0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5IHx8ICcnKS5zcGxpdCgnLCcpLmluY2x1ZGVzKGFwcEFjdGl2aXR5KSkpXG4gICAgICA/IHsvLyB0aGUgYWN0aXZpdHkgaXMgdGhlIG9yaWdpbmFsIHNlc3Npb24gYWN0aXZpdHksIHNvIHVzZSB0aGUgb3JpZ2luYWwgYXJnc1xuICAgICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgICBhY3Rpb246IHRoaXMub3B0cy5pbnRlbnRBY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgICAgIGZsYWdzOiB0aGlzLm9wdHMuaW50ZW50RmxhZ3MsXG4gICAgICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICAgICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgICAgICBzdG9wQXBwOiBmYWxzZSxcbiAgICAgICAgdXNlcjogdGhpcy5vcHRzLnVzZXJQcm9maWxlfVxuICAgICAgOiB7Ly8gdGhlIGFjdGl2aXR5IHdhcyBzdGFydGVkIHNvbWUgb3RoZXIgd2F5LCBzbyB1c2UgZGVmYXVsdHNcbiAgICAgICAgcGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgICAgIHdhaXRQa2c6IGFwcFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgICAgIHN0b3BBcHA6IGZhbHNlfTtcbiAgfVxuICBhcmdzID0gYXdhaXQgdXRpbC5maWx0ZXJPYmplY3QoYXJncyk7XG4gIHRoaXMubG9nLmRlYnVnKGBCcmluZ2luZyBhcHBsaWNhdGlvbiBiYWNrIHRvIGZvcmVncm91bmQgd2l0aCBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcChhcmdzKTtcbn07XG5cbmNvbW1hbmRzLmdldFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBnZXRTdHJpbmdzIChsYW5ndWFnZSkge1xuICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgbGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLmFkYi5nZXREZXZpY2VMYW5ndWFnZSgpO1xuICAgIHRoaXMubG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gKG1hcHBpbmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhsYW5ndWFnZSwgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIGlmICh0aGlzLmJvb3RzdHJhcCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgbXV0YXRpbmcgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UsIGJ1dCBpdCdzIGhvdyBhcHBpdW0gY3VycmVudGx5IHdvcmtzXG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbigndXBkYXRlU3RyaW5ncycpO1xuICB9XG5cbiAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xufTtcblxuY29tbWFuZHMubGF1bmNoQXBwID0gYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG4gIGF3YWl0IHRoaXMuc3RhcnRBVVQoKTtcbn07XG5cbmNvbW1hbmRzLnN0YXJ0QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFjdGl2aXR5IChhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSxcbiAgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSwgaW50ZW50QWN0aW9uLCBpbnRlbnRDYXRlZ29yeSwgaW50ZW50RmxhZ3MsXG4gIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLCBkb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgdGhpcy5sb2cuZGVidWcoYFN0YXJ0aW5nIHBhY2thZ2UgJyR7YXBwUGFja2FnZX0nIGFuZCBhY3Rpdml0eSAnJHthcHBBY3Rpdml0eX0nYCk7XG5cbiAgLy8gZG9udFN0b3BBcHBPblJlc2V0IGlzIGJvdGggYW4gYXJndW1lbnQgaGVyZSwgYW5kIGEgZGVzaXJlZCBjYXBhYmlsaXR5XG4gIC8vIGlmIHRoZSBhcmd1bWVudCBpcyBzZXQsIHVzZSBpdCwgb3RoZXJ3aXNlIHVzZSB0aGUgY2FwXG4gIGlmICghdXRpbC5oYXNWYWx1ZShkb250U3RvcEFwcE9uUmVzZXQpKSB7XG4gICAgZG9udFN0b3BBcHBPblJlc2V0ID0gISF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0O1xuICB9XG5cbiAgbGV0IGFyZ3MgPSB7XG4gICAgcGtnOiBhcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICB3YWl0UGtnOiBhcHBXYWl0UGFja2FnZSB8fCBhcHBQYWNrYWdlLFxuICAgIHdhaXRBY3Rpdml0eTogYXBwV2FpdEFjdGl2aXR5IHx8IGFwcEFjdGl2aXR5LFxuICAgIGFjdGlvbjogaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiBpbnRlbnRDYXRlZ29yeSxcbiAgICBmbGFnczogaW50ZW50RmxhZ3MsXG4gICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgc3RvcEFwcDogIWRvbnRTdG9wQXBwT25SZXNldFxuICB9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgPSB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgfHwge307XG4gIHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJnc1tgJHthcmdzLndhaXRQa2d9LyR7YXJncy53YWl0QWN0aXZpdHl9YF0gPSBhcmdzO1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcChhcmdzKTtcbn07XG5cbmNvbW1hbmRzLnJlc2V0ID0gYXN5bmMgZnVuY3Rpb24gcmVzZXQgKCkge1xuICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCB7ZmFzdFJlc2V0OiB0cnVlfSkpO1xuICAvLyByZXNldCBjb250ZXh0IHNpbmNlIHdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9uIGNvbnRleHQgd2Ugd2lsbCBlbmQgdXAgYWZ0ZXIgYXBwIGxhdW5jaC5cbiAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmlzQ2hyb21lU2Vzc2lvbiA/IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCkgOiB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFVVCA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0QVVUICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoe1xuICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IHRoaXMub3B0cy5pbnRlbnRBY3Rpb24sXG4gICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSxcbiAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgdXNlcjogdGhpcy5vcHRzLnVzZXJQcm9maWxlLFxuICB9KTtcbn07XG5cbi8vIHdlIG92ZXJyaWRlIHNldFVybCB0byB0YWtlIGFuIGFuZHJvaWQgVVJJIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBkZWVwLWxpbmtpbmdcbi8vIGluc2lkZSBhbiBhcHAsIHNpbWlsYXIgdG8gc3RhcnRpbmcgYW4gaW50ZW50XG5jb21tYW5kcy5zZXRVcmwgPSBhc3luYyBmdW5jdGlvbiBzZXRVcmwgKHVyaSkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmksIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbi8vIGNsb3NpbmcgYXBwIHVzaW5nIGZvcmNlIHN0b3BcbmNvbW1hbmRzLmNsb3NlQXBwID0gYXN5bmMgZnVuY3Rpb24gY2xvc2VBcHAgKCkge1xuICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAvLyByZXNldCBjb250ZXh0IHNpbmNlIHdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9uIGNvbnRleHQgd2Ugd2lsbCBlbmQgdXAgYWZ0ZXIgYXBwIGxhdW5jaC5cbiAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KCk7XG59O1xuXG5jb21tYW5kcy5nZXREaXNwbGF5RGVuc2l0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERpc3BsYXlEZW5zaXR5ICgpIHtcbiAgLy8gZmlyc3QgdHJ5IHRoZSBwcm9wZXJ0eSBmb3IgZGV2aWNlc1xuICBsZXQgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3JvLnNmLmxjZF9kZW5zaXR5J10pO1xuICBpZiAob3V0KSB7XG4gICAgbGV0IHZhbCA9IHBhcnNlSW50KG91dCwgMTApO1xuICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBOYU4sIHRyeSBnZXR0aW5nIHRoZSBlbXVsYXRvciBwcm9wZXJ0eVxuICAgIGlmICghaXNOYU4odmFsKSkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBkZW5zaXR5IHZhbHVlIHdhcyBOYU46IFwiJHtvdXR9XCJgKTtcbiAgfVxuICAvLyBmYWxsYmFjayB0byB0cnlpbmcgcHJvcGVydHkgZm9yIGVtdWxhdG9yc1xuICBvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2dldHByb3AnLCAncWVtdS5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gY291bGRuJ3QgZ2V0IGFueXRoaW5nLCBzbyBlcnJvciBvdXRcbiAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnRmFpbGVkIHRvIGdldCBkaXNwbGF5IGRlbnNpdHkgcHJvcGVydHkuJyk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHthY3Rpb259ID0gb3B0cztcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKGFjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAnYWN0aW9uJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5hZGIucGVyZm9ybUVkaXRvckFjdGlvbihhY3Rpb24pO1xufTtcblxuY29uc3QgUEVSTUlTU0lPTl9BQ1RJT04gPSB7XG4gIEdSQU5UOiAnZ3JhbnQnLFxuICBSRVZPS0U6ICdyZXZva2UnLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ3xBcnJheTxzdHJpbmc+fSBwZXJtaXNzaW9ucyAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgY2hhbmdlZFxuICogb3IgYSBsaXN0IG9mIHBlcm1pc3Npb25zLiBDaGVjayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9NYW5pZmVzdC5wZXJtaXNzaW9uXG4gKiB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdGFuZGFyZCBBbmRyb2lkIHBlcm1zc2lvbiBuYW1lcy4gTWFuZGF0b3J5IGFyZ3VtZW50LlxuICogSWYgJ2FsbCcgbWFnaWMgc3RyaW5nIGlzIHBhc3NlZCB0aGVuIHRoZSBjaG9zZW4gYWN0aW9uIGlzIGdvaW5nIHRvIGJlIGFwcGxpZWQgdG8gYWxsXG4gKiBwZXJtaXNpc29ucyByZXF1ZXN0ZWQvZ3JhbnRlZCBieSAnYXBwUGFja2FnZScuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIC0gVGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gc2V0IGNoYW5nZVxuICogcGVybWlzc2lvbnMgb24uIERlZmF1bHRzIHRvIHRoZSBwYWNrYWdlIG5hbWUgdW5kZXIgdGVzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gW2dyYW50XSAtIE9uZSBvZiBgUEVSTUlTU0lPTl9BQ1RJT05gIHZhbHVlc1xuICovXG5cbi8qKlxuICogQ2hhbmdlcyBwYWNrYWdlIHBlcm1pc3Npb25zIGluIHJ1bnRpbWUuXG4gKlxuICogQHBhcmFtIHs/Q2hhbmdlUGVybWlzc2lvbnNPcHRpb25zfSBvcHRzIC0gQXZhaWxhYmxlIG9wdGlvbnMgbWFwcGluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNoYW5nZVBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgcGVybWlzc2lvbnMsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGlvbiA9IFBFUk1JU1NJT05fQUNUSU9OLkdSQU5ULFxuICB9ID0gb3B0cztcbiAgaWYgKF8uaXNOaWwocGVybWlzc2lvbnMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ3Blcm1pc3Npb25zJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGlmIChfLmlzRW1wdHkocGVybWlzc2lvbnMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ3Blcm1pc3Npb25zJyBhcmd1bWVudCBtdXN0IG5vdCBiZSBlbXB0eWApO1xuICB9XG4gIGNvbnN0IGxvd2VyQWN0aW9uID0gXy50b0xvd2VyKGFjdGlvbik7XG4gIGlmICghW1BFUk1JU1NJT05fQUNUSU9OLkdSQU5ULCBQRVJNSVNTSU9OX0FDVElPTi5SRVZPS0VdLmluY2x1ZGVzKGxvd2VyQWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUEVSTUlTU0lPTl9BQ1RJT04pKX0gYWN0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBsZXQgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uaXNBcnJheShwZXJtaXNzaW9ucykgPyBwZXJtaXNzaW9ucyA6IFtwZXJtaXNzaW9uc107XG4gIGlmIChfLnRvTG93ZXIocGVybWlzc2lvbnMpID09PSBBTExfUEVSTUlTU0lPTlNfTUFHSUMpIHtcbiAgICBjb25zdCBkdW1wc3lzID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBhcHBQYWNrYWdlXSk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5hZGIuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgIGlmIChsb3dlckFjdGlvbiA9PT0gUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQpIHtcbiAgICAgIGNvbnN0IHJlcVBlcm1pc3NvbnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRSZXFQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBkdW1wc3lzKTtcbiAgICAgIGFmZmVjdGVkUGVybWlzc2lvbnMgPSBfLmRpZmZlcmVuY2UocmVxUGVybWlzc29ucywgZ3JhbnRlZFBlcm1pc3Npb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IGdyYW50ZWRQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShhZmZlY3RlZFBlcm1pc3Npb25zKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwUGFja2FnZX0nIGNvbnRhaW5zIG5vIHBlcm1pc3Npb25zIHRvICR7bG93ZXJBY3Rpb259YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGxvd2VyQWN0aW9uID09PSBQRVJNSVNTSU9OX0FDVElPTi5HUkFOVCkge1xuICAgIGF3YWl0IHRoaXMuYWRiLmdyYW50UGVybWlzc2lvbnMoYXBwUGFja2FnZSwgYWZmZWN0ZWRQZXJtaXNzaW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgQi5hbGwoYWZmZWN0ZWRQZXJtaXNzaW9ucy5tYXAoKG5hbWUpID0+IHRoaXMuYWRiLnJldm9rZVBlcm1pc3Npb24oYXBwUGFja2FnZSwgbmFtZSkpKTtcbiAgfVxufTtcblxuY29uc3QgUEVSTUlTU0lPTlNfVFlQRSA9IHtcbiAgREVOSUVEOiAnZGVuaWVkJyxcbiAgR1JBTlRFRDogJ2dyYW50ZWQnLFxuICBSRVFVRVNURUQ6ICdyZXF1ZXN0ZWQnLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRQZXJtaXNzaW9uc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFtyZXF1ZXN0ZWRdIC0gT25lIG9mIHBvc3NpYmxlIHBlcm1pc3Npb24gdHlwZXMgdG8gZ2V0LlxuICogQ2FuIGJlIGFueSBvZiBgUEVSTUlTU0lPTlNfVFlQRWAgdmFsdWVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFBhY2thZ2UgW3RoaXMub3B0cy5hcHBQYWNrYWdlXSAtIFRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIHNldCBjaGFuZ2VcbiAqIHBlcm1pc3Npb25zIG9uLiBEZWZhdWx0cyB0byB0aGUgcGFja2FnZSBuYW1lIHVuZGVyIHRlc3QuXG4gKi9cblxuLyoqXG4gKiBHZXRzIHJ1bnRpbWUgcGVybWlzc2lvbnMgbGlzdCBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtHZXRQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIHJldHJpZXZlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIGdpdmVuIHR5cGVcbiAqIChjYW4gYWxzbyBiZSBlbXB0eSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgcGVybWlzc2lvbnMuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0UGVybWlzc2lvbnMgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdHlwZSA9IFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVELFxuICAgIGFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgfSA9IG9wdHM7XG5cbiAgbGV0IGFjdGlvbkZ1bmM7XG4gIHN3aXRjaCAoXy50b0xvd2VyKHR5cGUpKSB7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLlJFUVVFU1RFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0UmVxUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuR1JBTlRFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKGFwcFBhY2thZ2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLkRFTklFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0RGVuaWVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBwZXJtaXNzaW9ucyB0eXBlICcke3R5cGV9Jy4gYCArXG4gICAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUEVSTUlTU0lPTlNfVFlQRSkpfSB0eXBlcyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IGFjdGlvbkZ1bmMoYXBwUGFja2FnZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgc3lzdGVtIG5vdGlmaWNhdGlvbnMuXG4gKlxuICogQHJldHVybnMge09iamVjdH0gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGBhZGIuZ2V0Tm90aWZpY2F0aW9uc2AgZm9yXG4gKiBtb3JlIGRldGFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Tm90aWZpY2F0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldE5vdGlmaWNhdGlvbnMgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuZ2V0Tm90aWZpY2F0aW9ucygpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTbXNMaXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heCBbMTAwXSAtIFRoZSBtYXhpbXVtIGNvdW50IG9mIHJlY2VudCBTTVMgbWVzc2FnZXNcbiAqIHRvIHJldHJpZXZlXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcmVjZW50IFNNUyBtZXNzYWdlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtTbXNMaXN0T3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge09iamVjdH0gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGBhZGIuZ2V0U21zTGlzdGAgZm9yXG4gKiBtb3JlIGRldGFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlTGlzdFNtcyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUxpc3RTbXMgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuZ2V0U21zTGlzdChvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVW5sb2NrT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleSBUaGUgdW5sb2NrIGtleS4gVGhlIHZhbHVlIG9mIHRoaXMga2V5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgdW5sb2NrIHR5cGUgYW5kIGNvdWxkIGJlIGEgcGluL3Bhc3N3b3JkL3BhdHRlcm4gdmFsdWUgb3JcbiAqIGEgYmlvbWV0cmljIGZpbmdlciBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSB1bmxvY2sgdHlwZS4gVGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXNcbiAqIGFyZSBzdXBwb3J0ZWQ6IGBwaW5gLCBgcGluV2l0aEtleUV2ZW50YCwgYHBhc3N3b3JkYCwgYHBhdHRlcm5gIGFuZCBgZmluZ2VycHJpbnRgLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBzdHJhdGVneSBFaXRoZXIgJ2xvY2tzZXR0aW5ncycgKGRlZmF1bHQpIG9yICd1aWF1dG9tYXRvcicuXG4gKiBTZXR0aW5nIGl0IHRvICd1aWF1dG9tYXRvcicgd2lsbCBlbmZvcmNlIHRoZSBkcml2ZXIgdG8gYXZvaWQgdXNpbmcgc3BlY2lhbFxuICogQURCIHNob3J0Y3V0cyBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgdW5sb2NrIHByb2NlZHVyZS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGltZW91dE1zIFsyMDAwXSBUaGUgbWF4aW11bSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogdG8gd2FpdCB1bnRpbCB0aGUgc2NyZWVuIGdldHMgdW5sb2NrZWRcbiAqL1xuXG4vKipcbiAqIFVubG9ja3MgdGhlIGRldmljZSBpZiBpdCBpcyBsb2NrZWQuIE5vb3AgaWYgdGhlIGRldmljZSdzIHNjcmVlbiBpcyBub3QgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSB7P1VubG9ja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB1bmxvY2sgb3BlcmF0aW9uIGZhaWxzIG9yIHRoZSBwcm92aWRlZFxuICogYXJndW1lbnRzIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVW5sb2NrIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBrZXksIHR5cGUsIHN0cmF0ZWd5LCB0aW1lb3V0TXMgfSA9IG9wdHM7XG4gIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwge1xuICAgIHVubG9ja0tleToga2V5LFxuICAgIHVubG9ja1R5cGU6IHR5cGUsXG4gICAgdW5sb2NrU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0OiB0aW1lb3V0TXMsXG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLHFCQUFxQixHQUFHLHNCQUFzQjtBQUNwRCxNQUFNQyxxQkFBcUIsR0FBRyxLQUFLO0FBRW5DLElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUM7QUFBQTtBQUVqREYsUUFBUSxDQUFDRyxJQUFJLEdBQUcsZUFBZUEsSUFBSSxDQUFFQSxJQUFJLEVBQUU7RUFFekNBLElBQUksR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUNGLElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUNHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBR0gsSUFBSTtFQUM3QyxJQUFJSSxNQUFNLEdBQUc7SUFDWEMsSUFBSSxFQUFFTCxJQUFJO0lBQ1ZNLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFDRCxJQUFJLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxlQUFlLEVBQUU7SUFDN0JKLE1BQU0sQ0FBQ0ksZUFBZSxHQUFHLElBQUk7RUFDL0I7RUFDQSxNQUFNLElBQUksQ0FBQ0MsVUFBVSxDQUFDTCxNQUFNLENBQUM7QUFDL0IsQ0FBQztBQUVEUCxRQUFRLENBQUNZLFVBQVUsR0FBRyxlQUFlQSxVQUFVLENBQUVMLE1BQU0sRUFBRTtFQUN2RCxPQUFPLE1BQU0sSUFBSSxDQUFDTSxTQUFTLENBQUNDLFVBQVUsQ0FBQyxTQUFTLEVBQUVQLE1BQU0sQ0FBQztBQUMzRCxDQUFDOztBQVdEUCxRQUFRLENBQUNlLGFBQWEsR0FBRyxlQUFlQSxhQUFhLENBQUVDLE1BQU0sR0FBR2xCLHFCQUFxQixFQUFFO0VBQ3JGLElBQUksQ0FBQ21CLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLHNEQUFzRCxHQUNsRSw0QkFBMkJGLE1BQU8sR0FBRSxDQUFDO0VBQ3hDLE1BQU1HLGVBQWUsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUVDLElBQUksRUFBRTtFQUNqRixJQUFJLENBQUNMLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLHlCQUF3QkMsZUFBZ0IsRUFBQyxDQUFDO0VBQzFELE1BQU1JLGVBQWUsR0FBR0MsZUFBTSxDQUFDQyxHQUFHLENBQUNOLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQztFQUM1RSxJQUFJLENBQUNJLGVBQWUsQ0FBQ0csT0FBTyxFQUFFLEVBQUU7SUFDOUIsSUFBSSxDQUFDVCxHQUFHLENBQUNVLElBQUksQ0FBQyxzREFBc0QsQ0FBQztJQUNyRSxPQUFPUixlQUFlO0VBQ3hCO0VBQ0EsT0FBT0ksZUFBZSxDQUFDSyxTQUFTLENBQUNMLGVBQWUsQ0FBQ00sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDYixNQUFNLENBQUNBLE1BQU0sQ0FBQztBQUM1RSxDQUFDOztBQWFEaEIsUUFBUSxDQUFDOEIsbUJBQW1CLEdBQUcsZUFBZUEsbUJBQW1CLENBQUVwQixJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDNUUsT0FBTyxNQUFNLElBQUksQ0FBQ0ssYUFBYSxDQUFDTCxJQUFJLENBQUNNLE1BQU0sQ0FBQztBQUM5QyxDQUFDO0FBRURoQixRQUFRLENBQUMrQixhQUFhLEdBQUcsZUFBZUEsYUFBYSxHQUFJO0VBQ3ZELE9BQU8sTUFBTSxJQUFJLENBQUNsQixTQUFTLENBQUNDLFVBQVUsQ0FBQyxRQUFRLENBQUM7QUFDbEQsQ0FBQztBQUVEZCxRQUFRLENBQUNnQyxJQUFJLEdBQUcsZUFBZUEsSUFBSSxHQUFJO0VBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUNuQixTQUFTLENBQUNDLFVBQVUsQ0FBQyxXQUFXLENBQUM7QUFDckQsQ0FBQztBQUVEZCxRQUFRLENBQUNpQyxlQUFlLEdBQUcsZUFBZUEsZUFBZSxHQUFJO0VBQzNELE1BQU07SUFBQ0E7RUFBZSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUNiLEdBQUcsQ0FBQ2MscUJBQXFCLEVBQUU7RUFDaEUsT0FBT0QsZUFBZTtBQUN4QixDQUFDO0FBRURqQyxRQUFRLENBQUNtQyxZQUFZLEdBQUcsZUFBZUEsWUFBWSxHQUFJO0VBQ3JELE9BQU8sTUFBTSxJQUFJLENBQUNmLEdBQUcsQ0FBQ2UsWUFBWSxFQUFFO0FBQ3RDLENBQUM7QUFFRG5DLFFBQVEsQ0FBQ29DLG9CQUFvQixHQUFHLGVBQWVBLG9CQUFvQixDQUFFQyxPQUFPLEVBQUU7RUFDNUUsSUFBSTtJQUFDQyxVQUFVO0lBQUVDO0VBQVcsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDbkIsR0FBRyxDQUFDb0IsNEJBQTRCLEVBQUU7RUFDN0UsTUFBTSxJQUFJLENBQUNwQixHQUFHLENBQUNDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFHLG9CQUFtQmdCLE9BQVEsRUFBQyxDQUFDLENBQUM7RUFDMUUsTUFBTSxJQUFJLENBQUNqQixHQUFHLENBQUNxQixrQkFBa0IsQ0FBQ0gsVUFBVSxFQUFFQyxXQUFXLEVBQUUsSUFBSSxDQUFDO0FBQ2xFLENBQUM7QUFFRHZDLFFBQVEsQ0FBQzBDLGFBQWEsR0FBRyxlQUFlQSxhQUFhLEdBQUk7RUFDdkQsT0FBTyxNQUFNLElBQUksQ0FBQzdCLFNBQVMsQ0FBQ0MsVUFBVSxDQUFDLGVBQWUsQ0FBQztBQUN6RCxDQUFDOztBQUdEZCxRQUFRLENBQUMyQyxhQUFhLEdBQUcsZUFBZUEsYUFBYSxHQUFJO0VBQ3ZELE1BQU07SUFBRUMsS0FBSztJQUFFQztFQUFPLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQ0gsYUFBYSxFQUFFO0VBQ3BELE9BQU87SUFDTEUsS0FBSztJQUNMQyxNQUFNO0lBQ05DLENBQUMsRUFBRSxDQUFDO0lBQ0pDLENBQUMsRUFBRTtFQUNMLENBQUM7QUFDSCxDQUFDO0FBRUQvQyxRQUFRLENBQUNnRCxrQkFBa0IsR0FBRyxlQUFlQSxrQkFBa0IsR0FBSTtFQUNqRSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUM1QixHQUFHLENBQUNvQiw0QkFBNEIsRUFBRSxFQUFFRCxXQUFXO0FBQ3BFLENBQUM7QUFFRHZDLFFBQVEsQ0FBQ2lELGlCQUFpQixHQUFHLGVBQWVBLGlCQUFpQixHQUFJO0VBQy9ELE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQzdCLEdBQUcsQ0FBQ29CLDRCQUE0QixFQUFFLEVBQUVGLFVBQVU7QUFDbkUsQ0FBQztBQUVEdEMsUUFBUSxDQUFDa0QsVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRUMsT0FBTyxFQUFFO0VBQ3hELElBQUlBLE9BQU8sR0FBRyxDQUFDLEVBQUU7SUFHZixNQUFNLElBQUksQ0FBQy9CLEdBQUcsQ0FBQ2dDLFFBQVEsRUFBRTtJQUN6QixPQUFPLElBQUk7RUFDYjtFQUNBLElBQUk7SUFBQ2QsVUFBVTtJQUFFQztFQUFXLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQ25CLEdBQUcsQ0FBQ29CLDRCQUE0QixFQUFFO0VBQzdFLE1BQU0sSUFBSSxDQUFDcEIsR0FBRyxDQUFDZ0MsUUFBUSxFQUFFOztFQUl6QixNQUFNQyxPQUFPLEdBQUdGLE9BQU8sR0FBRyxJQUFJO0VBQzlCLE1BQU1HLFdBQVcsR0FBRyxFQUFFLEdBQUcsSUFBSTtFQUU3QixNQUFNQyxVQUFVLEdBQUduRCxlQUFDLENBQUNvRCxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFQyxRQUFRLENBQUNKLE9BQU8sR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUNsRSxNQUFNSyxVQUFVLEdBQUcsQ0FBQztJQUFDQyxTQUFTO0lBQUVDO0VBQVEsQ0FBQyxLQUFLO0lBQzVDLE1BQU1DLFFBQVEsR0FBRyxDQUFDRixTQUFTLEdBQUcsSUFBSSxFQUFFRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU1DLFdBQVcsR0FBRyxDQUFDSCxRQUFRLEdBQUcsR0FBRyxFQUFFRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQzdDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLFVBQVMyQyxRQUFTLGFBQVlFLFdBQVksSUFBRyxDQUFDO0VBQ2hFLENBQUM7RUFDRCxNQUFNLElBQUFDLG1CQUFTLEVBQUNYLE9BQU8sRUFBRTtJQUFDQyxXQUFXO0lBQUVDLFVBQVU7SUFBRUc7RUFBVSxDQUFDLENBQUM7RUFFL0QsSUFBSU8sSUFBSTtFQUNSLElBQUksSUFBSSxDQUFDQyxtQkFBbUIsSUFBSSxJQUFJLENBQUNBLG1CQUFtQixDQUFFLEdBQUU1QixVQUFXLElBQUdDLFdBQVksRUFBQyxDQUFDLEVBQUU7SUFFeEYwQixJQUFJLEdBQUcsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBRSxHQUFFNUIsVUFBVyxJQUFHQyxXQUFZLEVBQUMsQ0FBQztFQUNqRSxDQUFDLE1BQU07SUFDTCxJQUFJO01BQ0YsSUFBSSxDQUFDdEIsR0FBRyxDQUFDQyxLQUFLLENBQUUsbUJBQWtCb0IsVUFBVywwQkFBeUIsQ0FBQztNQUN2RSxNQUFNLElBQUksQ0FBQzZCLFdBQVcsQ0FBQzdCLFVBQVUsQ0FBQztNQUNsQyxPQUFPLElBQUk7SUFDYixDQUFDLENBQUMsT0FBTzhCLEdBQUcsRUFBRSxDQUFDO0lBQ2ZILElBQUksR0FBSzNCLFVBQVUsS0FBSyxJQUFJLENBQUM1QixJQUFJLENBQUM0QixVQUFVLElBQUlDLFdBQVcsS0FBSyxJQUFJLENBQUM3QixJQUFJLENBQUM2QixXQUFXLElBQzVFRCxVQUFVLEtBQUssSUFBSSxDQUFDNUIsSUFBSSxDQUFDMkQsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDM0QsSUFBSSxDQUFDNEQsZUFBZSxJQUFJLEVBQUUsRUFBRUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDQyxRQUFRLENBQUNqQyxXQUFXLENBQUUsR0FDbkg7TUFDQWtDLEdBQUcsRUFBRSxJQUFJLENBQUMvRCxJQUFJLENBQUM0QixVQUFVO01BQ3pCb0MsUUFBUSxFQUFFLElBQUksQ0FBQ2hFLElBQUksQ0FBQzZCLFdBQVc7TUFDL0JvQyxNQUFNLEVBQUUsSUFBSSxDQUFDakUsSUFBSSxDQUFDa0UsWUFBWTtNQUM5QkMsUUFBUSxFQUFFLElBQUksQ0FBQ25FLElBQUksQ0FBQ29FLGNBQWM7TUFDbENDLEtBQUssRUFBRSxJQUFJLENBQUNyRSxJQUFJLENBQUNzRSxXQUFXO01BQzVCQyxPQUFPLEVBQUUsSUFBSSxDQUFDdkUsSUFBSSxDQUFDMkQsY0FBYztNQUNqQ2EsWUFBWSxFQUFFLElBQUksQ0FBQ3hFLElBQUksQ0FBQzRELGVBQWU7TUFDdkNhLGFBQWEsRUFBRSxJQUFJLENBQUN6RSxJQUFJLENBQUMwRSxnQkFBZ0I7TUFDekNDLFlBQVksRUFBRSxJQUFJLENBQUMzRSxJQUFJLENBQUM0RSxlQUFlO01BQ3ZDQyx1QkFBdUIsRUFBRSxJQUFJLENBQUM3RSxJQUFJLENBQUM2RSx1QkFBdUI7TUFDMURDLE9BQU8sRUFBRSxLQUFLO01BQ2RDLElBQUksRUFBRSxJQUFJLENBQUMvRSxJQUFJLENBQUNnRjtJQUFXLENBQUMsR0FDNUI7TUFDQWpCLEdBQUcsRUFBRW5DLFVBQVU7TUFDZm9DLFFBQVEsRUFBRW5DLFdBQVc7TUFDckIwQyxPQUFPLEVBQUUzQyxVQUFVO01BQ25CNEMsWUFBWSxFQUFFM0MsV0FBVztNQUN6QmlELE9BQU8sRUFBRTtJQUFLLENBQUM7RUFDckI7RUFDQXZCLElBQUksR0FBRyxNQUFNMEIsYUFBSSxDQUFDQyxZQUFZLENBQUMzQixJQUFJLENBQUM7RUFDcEMsSUFBSSxDQUFDaEQsR0FBRyxDQUFDQyxLQUFLLENBQUUsMkRBQTBEMkUsSUFBSSxDQUFDQyxTQUFTLENBQUM3QixJQUFJLENBQUUsRUFBQyxDQUFDO0VBQ2pHLE9BQU8sTUFBTSxJQUFJLENBQUM3QyxHQUFHLENBQUMyRSxRQUFRLENBQUM5QixJQUFJLENBQUM7QUFDdEMsQ0FBQztBQUVEakUsUUFBUSxDQUFDZ0csVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRUMsUUFBUSxFQUFFO0VBQ3pELElBQUksQ0FBQ0EsUUFBUSxFQUFFO0lBQ2JBLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQzdFLEdBQUcsQ0FBQzhFLGlCQUFpQixFQUFFO0lBQzdDLElBQUksQ0FBQ2pGLEdBQUcsQ0FBQ2tGLElBQUksQ0FBRSxpREFBZ0RGLFFBQVMsRUFBQyxDQUFDO0VBQzVFOztFQUlBLE1BQU1HLG9CQUFvQixHQUFJQyxPQUFPLElBQUs7SUFDeEMsTUFBTUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNqQixLQUFLLE1BQU0sQ0FBQ0MsR0FBRyxFQUFFQyxLQUFLLENBQUMsSUFBSXBHLGVBQUMsQ0FBQ3FHLE9BQU8sQ0FBQ0osT0FBTyxDQUFDLEVBQUU7TUFDN0NDLE1BQU0sQ0FBQ0MsR0FBRyxDQUFDLEdBQUduRyxlQUFDLENBQUNzRyxRQUFRLENBQUNGLEtBQUssQ0FBQyxHQUFHQSxLQUFLLEdBQUdYLElBQUksQ0FBQ0MsU0FBUyxDQUFDVSxLQUFLLENBQUM7SUFDakU7SUFDQSxPQUFPRixNQUFNO0VBQ2YsQ0FBQztFQUVELElBQUksSUFBSSxDQUFDSyxVQUFVLENBQUNWLFFBQVEsQ0FBQyxFQUFFO0lBRTdCLE9BQU9HLG9CQUFvQixDQUFDLElBQUksQ0FBQ08sVUFBVSxDQUFDVixRQUFRLENBQUMsQ0FBQztFQUN4RDtFQUVBLElBQUksQ0FBQ1UsVUFBVSxDQUFDVixRQUFRLENBQUMsR0FBRyxNQUFNVyx1QkFBYyxDQUFDQyxXQUFXLENBQUNaLFFBQVEsRUFBRSxJQUFJLENBQUM3RSxHQUFHLEVBQUUsSUFBSSxDQUFDVixJQUFJLENBQUM7RUFDM0YsSUFBSSxJQUFJLENBQUNHLFNBQVMsRUFBRTtJQUVsQixNQUFNLElBQUksQ0FBQ0EsU0FBUyxDQUFDQyxVQUFVLENBQUMsZUFBZSxDQUFDO0VBQ2xEO0VBRUEsT0FBT3NGLG9CQUFvQixDQUFDLElBQUksQ0FBQ08sVUFBVSxDQUFDVixRQUFRLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRURqRyxRQUFRLENBQUM4RyxTQUFTLEdBQUcsZUFBZUEsU0FBUyxHQUFJO0VBQy9DLE1BQU0sSUFBSSxDQUFDQyxPQUFPLEVBQUU7RUFDcEIsTUFBTSxJQUFJLENBQUNDLFFBQVEsRUFBRTtBQUN2QixDQUFDO0FBRURoSCxRQUFRLENBQUNpSCxhQUFhLEdBQUcsZUFBZUEsYUFBYSxDQUFFM0UsVUFBVSxFQUFFQyxXQUFXLEVBQzVFOEIsY0FBYyxFQUFFQyxlQUFlLEVBQUVNLFlBQVksRUFBRUUsY0FBYyxFQUFFRSxXQUFXLEVBQzFFTyx1QkFBdUIsRUFBRTJCLGtCQUFrQixFQUFFO0VBQzdDLElBQUksQ0FBQ2pHLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLHFCQUFvQm9CLFVBQVcsbUJBQWtCQyxXQUFZLEdBQUUsQ0FBQzs7RUFJaEYsSUFBSSxDQUFDb0QsYUFBSSxDQUFDd0IsUUFBUSxDQUFDRCxrQkFBa0IsQ0FBQyxFQUFFO0lBQ3RDQSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDeEcsSUFBSSxDQUFDd0csa0JBQWtCO0VBQ3JEO0VBRUEsSUFBSWpELElBQUksR0FBRztJQUNUUSxHQUFHLEVBQUVuQyxVQUFVO0lBQ2ZvQyxRQUFRLEVBQUVuQyxXQUFXO0lBQ3JCMEMsT0FBTyxFQUFFWixjQUFjLElBQUkvQixVQUFVO0lBQ3JDNEMsWUFBWSxFQUFFWixlQUFlLElBQUkvQixXQUFXO0lBQzVDb0MsTUFBTSxFQUFFQyxZQUFZO0lBQ3BCQyxRQUFRLEVBQUVDLGNBQWM7SUFDeEJDLEtBQUssRUFBRUMsV0FBVztJQUNsQk8sdUJBQXVCO0lBQ3ZCQyxPQUFPLEVBQUUsQ0FBQzBCO0VBQ1osQ0FBQztFQUNELElBQUksQ0FBQ2hELG1CQUFtQixHQUFHLElBQUksQ0FBQ0EsbUJBQW1CLElBQUksQ0FBQyxDQUFDO0VBQ3pELElBQUksQ0FBQ0EsbUJBQW1CLENBQUUsR0FBRUQsSUFBSSxDQUFDZ0IsT0FBUSxJQUFHaEIsSUFBSSxDQUFDaUIsWUFBYSxFQUFDLENBQUMsR0FBR2pCLElBQUk7RUFDdkUsTUFBTSxJQUFJLENBQUM3QyxHQUFHLENBQUMyRSxRQUFRLENBQUM5QixJQUFJLENBQUM7QUFDL0IsQ0FBQztBQUVEakUsUUFBUSxDQUFDb0gsS0FBSyxHQUFHLGVBQWVBLEtBQUssR0FBSTtFQUN2QyxNQUFNUix1QkFBYyxDQUFDUyxRQUFRLENBQUMsSUFBSSxDQUFDakcsR0FBRyxFQUFFa0csTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDN0csSUFBSSxFQUFFO0lBQUM4RyxTQUFTLEVBQUU7RUFBSSxDQUFDLENBQUMsQ0FBQztFQUV4RixNQUFNLElBQUksQ0FBQ0MsVUFBVSxFQUFFO0VBQ3ZCLE9BQU8sT0FBTSxJQUFJLENBQUNDLGVBQWUsSUFBRyxJQUFJLENBQUNDLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDWCxRQUFRLEVBQUU7QUFDakYsQ0FBQztBQUVEaEgsUUFBUSxDQUFDZ0gsUUFBUSxHQUFHLGVBQWVBLFFBQVEsR0FBSTtFQUM3QyxNQUFNLElBQUksQ0FBQzVGLEdBQUcsQ0FBQzJFLFFBQVEsQ0FBQztJQUN0QnRCLEdBQUcsRUFBRSxJQUFJLENBQUMvRCxJQUFJLENBQUM0QixVQUFVO0lBQ3pCb0MsUUFBUSxFQUFFLElBQUksQ0FBQ2hFLElBQUksQ0FBQzZCLFdBQVc7SUFDL0JvQyxNQUFNLEVBQUUsSUFBSSxDQUFDakUsSUFBSSxDQUFDa0UsWUFBWTtJQUM5QkMsUUFBUSxFQUFFLElBQUksQ0FBQ25FLElBQUksQ0FBQ29FLGNBQWM7SUFDbENDLEtBQUssRUFBRSxJQUFJLENBQUNyRSxJQUFJLENBQUNzRSxXQUFXO0lBQzVCQyxPQUFPLEVBQUUsSUFBSSxDQUFDdkUsSUFBSSxDQUFDMkQsY0FBYztJQUNqQ2EsWUFBWSxFQUFFLElBQUksQ0FBQ3hFLElBQUksQ0FBQzRELGVBQWU7SUFDdkNhLGFBQWEsRUFBRSxJQUFJLENBQUN6RSxJQUFJLENBQUMwRSxnQkFBZ0I7SUFDekNDLFlBQVksRUFBRSxJQUFJLENBQUMzRSxJQUFJLENBQUM0RSxlQUFlO0lBQ3ZDQyx1QkFBdUIsRUFBRSxJQUFJLENBQUM3RSxJQUFJLENBQUM2RSx1QkFBdUI7SUFDMURDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQzlFLElBQUksQ0FBQ3dHLGtCQUFrQjtJQUN0Q3pCLElBQUksRUFBRSxJQUFJLENBQUMvRSxJQUFJLENBQUNnRjtFQUNsQixDQUFDLENBQUM7QUFDSixDQUFDOztBQUlEMUYsUUFBUSxDQUFDNEgsTUFBTSxHQUFHLGVBQWVBLE1BQU0sQ0FBRUMsR0FBRyxFQUFFO0VBQzVDLE1BQU0sSUFBSSxDQUFDekcsR0FBRyxDQUFDMEcsUUFBUSxDQUFDRCxHQUFHLEVBQUUsSUFBSSxDQUFDbkgsSUFBSSxDQUFDNEIsVUFBVSxDQUFDO0FBQ3BELENBQUM7O0FBR0R0QyxRQUFRLENBQUMrSCxRQUFRLEdBQUcsZUFBZUEsUUFBUSxHQUFJO0VBQzdDLE1BQU0sSUFBSSxDQUFDM0csR0FBRyxDQUFDNEcsU0FBUyxDQUFDLElBQUksQ0FBQ3RILElBQUksQ0FBQzRCLFVBQVUsQ0FBQztFQUU5QyxNQUFNLElBQUksQ0FBQ21GLFVBQVUsRUFBRTtBQUN6QixDQUFDO0FBRUR6SCxRQUFRLENBQUNpSSxpQkFBaUIsR0FBRyxlQUFlQSxpQkFBaUIsR0FBSTtFQUUvRCxJQUFJQyxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUM5RyxHQUFHLENBQUNDLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0VBQ2hFLElBQUk2RyxHQUFHLEVBQUU7SUFDUCxJQUFJQyxHQUFHLEdBQUcxRSxRQUFRLENBQUN5RSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBRTNCLElBQUksQ0FBQ0UsS0FBSyxDQUFDRCxHQUFHLENBQUMsRUFBRTtNQUNmLE9BQU9BLEdBQUc7SUFDWjtJQUNBLElBQUksQ0FBQ2xILEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLGtDQUFpQ2dILEdBQUksR0FBRSxDQUFDO0VBQzFEO0VBRUFBLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQzlHLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7RUFDOUQsSUFBSTZHLEdBQUcsRUFBRTtJQUNQLElBQUlDLEdBQUcsR0FBRzFFLFFBQVEsQ0FBQ3lFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDM0IsSUFBSSxDQUFDRSxLQUFLLENBQUNELEdBQUcsQ0FBQyxFQUFFO01BQ2YsT0FBT0EsR0FBRztJQUNaO0lBQ0EsSUFBSSxDQUFDbEgsR0FBRyxDQUFDQyxLQUFLLENBQUUsa0NBQWlDZ0gsR0FBSSxHQUFFLENBQUM7RUFDMUQ7RUFFQSxJQUFJLENBQUNqSCxHQUFHLENBQUNvSCxhQUFhLENBQUMseUNBQXlDLENBQUM7QUFDbkUsQ0FBQztBQUVEckksUUFBUSxDQUFDc0kseUJBQXlCLEdBQUcsZUFBZUEseUJBQXlCLENBQUU1SCxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDeEYsTUFBTTtJQUFDaUU7RUFBTSxDQUFDLEdBQUdqRSxJQUFJO0VBQ3JCLElBQUksQ0FBQ2lGLGFBQUksQ0FBQ3dCLFFBQVEsQ0FBQ3hDLE1BQU0sQ0FBQyxFQUFFO0lBQzFCLE1BQU0sSUFBSTRELGNBQU0sQ0FBQ0Msb0JBQW9CLENBQUUsK0JBQThCLENBQUM7RUFDeEU7RUFFQSxNQUFNLElBQUksQ0FBQ3BILEdBQUcsQ0FBQ3FILG1CQUFtQixDQUFDOUQsTUFBTSxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNK0QsaUJBQWlCLEdBQUc7RUFDeEJDLEtBQUssRUFBRSxPQUFPO0VBQ2RDLE1BQU0sRUFBRTtBQUNWLENBQUM7O0FBb0JENUksUUFBUSxDQUFDNkksdUJBQXVCLEdBQUcsZUFBZUEsdUJBQXVCLENBQUVuSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDcEYsTUFBTTtJQUNKb0ksV0FBVztJQUNYeEcsVUFBVSxHQUFHLElBQUksQ0FBQzVCLElBQUksQ0FBQzRCLFVBQVU7SUFDakNxQyxNQUFNLEdBQUcrRCxpQkFBaUIsQ0FBQ0M7RUFDN0IsQ0FBQyxHQUFHakksSUFBSTtFQUNSLElBQUlOLGVBQUMsQ0FBQzJJLEtBQUssQ0FBQ0QsV0FBVyxDQUFDLEVBQUU7SUFDeEIsTUFBTSxJQUFJUCxjQUFNLENBQUNDLG9CQUFvQixDQUFFLG9DQUFtQyxDQUFDO0VBQzdFO0VBQ0EsSUFBSXBJLGVBQUMsQ0FBQzRJLE9BQU8sQ0FBQ0YsV0FBVyxDQUFDLEVBQUU7SUFDMUIsTUFBTSxJQUFJUCxjQUFNLENBQUNDLG9CQUFvQixDQUFFLDBDQUF5QyxDQUFDO0VBQ25GO0VBQ0EsTUFBTVMsV0FBVyxHQUFHN0ksZUFBQyxDQUFDOEksT0FBTyxDQUFDdkUsTUFBTSxDQUFDO0VBQ3JDLElBQUksQ0FBQyxDQUFDK0QsaUJBQWlCLENBQUNDLEtBQUssRUFBRUQsaUJBQWlCLENBQUNFLE1BQU0sQ0FBQyxDQUFDcEUsUUFBUSxDQUFDeUUsV0FBVyxDQUFDLEVBQUU7SUFDOUUsTUFBTSxJQUFJVixjQUFNLENBQUNDLG9CQUFvQixDQUFFLG1CQUFrQjdELE1BQU8sS0FBSSxHQUNqRSxRQUFPa0IsSUFBSSxDQUFDQyxTQUFTLENBQUMxRixlQUFDLENBQUMrSSxNQUFNLENBQUNULGlCQUFpQixDQUFDLENBQUUsd0JBQXVCLENBQUM7RUFDaEY7RUFFQSxJQUFJVSxtQkFBbUIsR0FBR2hKLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDeUksV0FBVyxDQUFDLEdBQUdBLFdBQVcsR0FBRyxDQUFDQSxXQUFXLENBQUM7RUFDOUUsSUFBSTFJLGVBQUMsQ0FBQzhJLE9BQU8sQ0FBQ0osV0FBVyxDQUFDLEtBQUsvSSxxQkFBcUIsRUFBRTtJQUNwRCxNQUFNc0osT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDakksR0FBRyxDQUFDQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFaUIsVUFBVSxDQUFDLENBQUM7SUFDeEUsTUFBTWdILGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDbEksR0FBRyxDQUFDbUkscUJBQXFCLENBQUNqSCxVQUFVLEVBQUUrRyxPQUFPLENBQUM7SUFDcEYsSUFBSUosV0FBVyxLQUFLUCxpQkFBaUIsQ0FBQ0MsS0FBSyxFQUFFO01BQzNDLE1BQU1hLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQ3BJLEdBQUcsQ0FBQ3FJLGlCQUFpQixDQUFDbkgsVUFBVSxFQUFFK0csT0FBTyxDQUFDO01BQzNFRCxtQkFBbUIsR0FBR2hKLGVBQUMsQ0FBQ3NKLFVBQVUsQ0FBQ0YsYUFBYSxFQUFFRixrQkFBa0IsQ0FBQztJQUN2RSxDQUFDLE1BQU07TUFDTEYsbUJBQW1CLEdBQUdFLGtCQUFrQjtJQUMxQztJQUNBLElBQUlsSixlQUFDLENBQUM0SSxPQUFPLENBQUNJLG1CQUFtQixDQUFDLEVBQUU7TUFDbEMsSUFBSSxDQUFDbkksR0FBRyxDQUFDa0YsSUFBSSxDQUFFLElBQUc3RCxVQUFXLGdDQUErQjJHLFdBQVksRUFBQyxDQUFDO01BQzFFO0lBQ0Y7RUFDRjtFQUVBLElBQUlBLFdBQVcsS0FBS1AsaUJBQWlCLENBQUNDLEtBQUssRUFBRTtJQUMzQyxNQUFNLElBQUksQ0FBQ3ZILEdBQUcsQ0FBQ3VJLGdCQUFnQixDQUFDckgsVUFBVSxFQUFFOEcsbUJBQW1CLENBQUM7RUFDbEUsQ0FBQyxNQUFNO0lBQ0wsTUFBTVEsaUJBQUMsQ0FBQ0MsR0FBRyxDQUFDVCxtQkFBbUIsQ0FBQ1UsR0FBRyxDQUFFQyxJQUFJLElBQUssSUFBSSxDQUFDM0ksR0FBRyxDQUFDNEksZ0JBQWdCLENBQUMxSCxVQUFVLEVBQUV5SCxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQzdGO0FBQ0YsQ0FBQztBQUVELE1BQU1FLGdCQUFnQixHQUFHO0VBQ3ZCQyxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsT0FBTyxFQUFFLFNBQVM7RUFDbEJDLFNBQVMsRUFBRTtBQUNiLENBQUM7O0FBa0JEcEssUUFBUSxDQUFDcUssb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CLENBQUUzSixJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDOUUsTUFBTTtJQUNKNEosSUFBSSxHQUFHTCxnQkFBZ0IsQ0FBQ0csU0FBUztJQUNqQzlILFVBQVUsR0FBRyxJQUFJLENBQUM1QixJQUFJLENBQUM0QjtFQUN6QixDQUFDLEdBQUc1QixJQUFJO0VBRVIsSUFBSTZKLFVBQVU7RUFDZCxRQUFRbkssZUFBQyxDQUFDOEksT0FBTyxDQUFDb0IsSUFBSSxDQUFDO0lBQ3JCLEtBQUtMLGdCQUFnQixDQUFDRyxTQUFTO01BQzdCRyxVQUFVLEdBQUlqSSxVQUFVLElBQUssSUFBSSxDQUFDbEIsR0FBRyxDQUFDcUksaUJBQWlCLENBQUNuSCxVQUFVLENBQUM7TUFDbkU7SUFDRixLQUFLMkgsZ0JBQWdCLENBQUNFLE9BQU87TUFDM0JJLFVBQVUsR0FBSWpJLFVBQVUsSUFBSyxJQUFJLENBQUNsQixHQUFHLENBQUNtSSxxQkFBcUIsQ0FBQ2pILFVBQVUsQ0FBQztNQUN2RTtJQUNGLEtBQUsySCxnQkFBZ0IsQ0FBQ0MsTUFBTTtNQUMxQkssVUFBVSxHQUFJakksVUFBVSxJQUFLLElBQUksQ0FBQ2xCLEdBQUcsQ0FBQ29KLG9CQUFvQixDQUFDbEksVUFBVSxDQUFDO01BQ3RFO0lBQ0Y7TUFDRSxNQUFNLElBQUlpRyxjQUFNLENBQUNDLG9CQUFvQixDQUFFLDZCQUE0QjhCLElBQUssS0FBSSxHQUN6RSxRQUFPekUsSUFBSSxDQUFDQyxTQUFTLENBQUMxRixlQUFDLENBQUMrSSxNQUFNLENBQUNjLGdCQUFnQixDQUFDLENBQUUsc0JBQXFCLENBQUM7RUFBQztFQUVoRixPQUFPLE1BQU1NLFVBQVUsQ0FBQ2pJLFVBQVUsQ0FBQztBQUNyQyxDQUFDOztBQVFEdEMsUUFBUSxDQUFDeUssc0JBQXNCLEdBQUcsZUFBZUEsc0JBQXNCLEdBQUk7RUFDekUsT0FBTyxNQUFNLElBQUksQ0FBQ3JKLEdBQUcsQ0FBQ3NKLGdCQUFnQixFQUFFO0FBQzFDLENBQUM7O0FBZUQxSyxRQUFRLENBQUMySyxhQUFhLEdBQUcsZUFBZUEsYUFBYSxDQUFFakssSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2hFLE9BQU8sTUFBTSxJQUFJLENBQUNVLEdBQUcsQ0FBQ3dKLFVBQVUsQ0FBQ2xLLElBQUksQ0FBQztBQUN4QyxDQUFDOztBQXVCRFYsUUFBUSxDQUFDNkssWUFBWSxHQUFHLGVBQWVBLFlBQVksQ0FBRW5LLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUM5RCxNQUFNO0lBQUU2RixHQUFHO0lBQUUrRCxJQUFJO0lBQUVRLFFBQVE7SUFBRUM7RUFBVSxDQUFDLEdBQUdySyxJQUFJO0VBQy9DLE1BQU1rRyx1QkFBYyxDQUFDb0UsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM1SixHQUFHLEVBQUU7SUFDMUM2SixTQUFTLEVBQUUxRSxHQUFHO0lBQ2QyRSxVQUFVLEVBQUVaLElBQUk7SUFDaEJhLGNBQWMsRUFBRUwsUUFBUTtJQUN4Qk0sb0JBQW9CLEVBQUVMO0VBQ3hCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRHpELE1BQU0sQ0FBQ0MsTUFBTSxDQUFDckgsVUFBVSxFQUFFRixRQUFRLEVBQUVDLE9BQU8sQ0FBQztBQUFDLGVBRTlCQyxVQUFVO0FBQUEifQ==